diff --git a/core/commands/name/ipns.go b/core/commands/name/ipns.go index d12608315..8df592a03 100644 --- a/core/commands/name/ipns.go +++ b/core/commands/name/ipns.go @@ -127,7 +127,7 @@ Resolve the value of a dnslink: recursive, _ := req.Options[recursiveOptionName].(bool) rc, rcok := req.Options[dhtRecordCountOptionName].(int) dhtt, dhttok := req.Options[dhtTimeoutOptionName].(string) - + stream, _ := req.Options[streamOptionName].(bool) var ropts []nsopts.ResolveOpt if !recursive { ropts = append(ropts, nsopts.Depth(1)) @@ -150,13 +150,27 @@ Resolve the value of a dnslink: name = "/ipns/" + name } - output, err := resolver.Resolve(req.Context, name, ropts...) - if err != nil { - return err - } - // TODO: better errors (in the case of not finding the name, we get "failed to find any peer in table") - return cmds.EmitOnce(res, &ResolvedPath{output}) + + if !stream { + output, err := resolver.Resolve(req.Context, name, ropts...) + if err != nil { + return err + } + + return cmds.EmitOnce(res, &ResolvedPath{output}) + } else { + output := resolver.ResolveAsync(req.Context, name, ropts...) + for v := range output { + if v.Err != nil { + return err + } + if err := res.Emit(&ResolvedPath{v.Path}); err != nil { + return err + } + } + } + return nil }, Encoders: cmds.EncoderMap{ cmds.Text: cmds.MakeEncoder(func(req *cmds.Request, w io.Writer, v interface{}) error { diff --git a/namesys/namesys_test.go b/namesys/namesys_test.go index 09d5cf81e..301c98a5f 100644 --- a/namesys/namesys_test.go +++ b/namesys/namesys_test.go @@ -7,14 +7,14 @@ import ( opts "github.com/ipfs/go-ipfs/namesys/opts" - "gx/ipfs/QmU4x3742bvgfxJsByEDpBnifJqjJdV6x528co4hwKCn46/go-unixfs" - path "gx/ipfs/QmcjwUb36Z16NJkvDX6ccXPqsFswo6AsRXynyXcLLCphV2/go-path" ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" offroute "gx/ipfs/QmScZySgru9jaoDa12sSfvh21sWbqF5eXkieTmJzAHJXkQ/go-ipfs-routing/offline" + "gx/ipfs/QmU4x3742bvgfxJsByEDpBnifJqjJdV6x528co4hwKCn46/go-unixfs" ds "gx/ipfs/QmUyz7JTJzgegC6tiJrfby3mPhzcdswVtG4x58TQ6pq8jV/go-datastore" dssync "gx/ipfs/QmUyz7JTJzgegC6tiJrfby3mPhzcdswVtG4x58TQ6pq8jV/go-datastore/sync" ipns "gx/ipfs/QmZrmn2BPZbSviQAWeyY2iXkCukmJHv9n7zrLgWU5KgbTb/go-ipns" peer "gx/ipfs/QmbNepETomvmXfz1X5pHNFD2QuPqnqi47dTd94QJWSorQ3/go-libp2p-peer" + path "gx/ipfs/QmcjwUb36Z16NJkvDX6ccXPqsFswo6AsRXynyXcLLCphV2/go-path" pstoremem "gx/ipfs/QmfAQMFpgDU2U4BXG64qVr8HSiictfWvkSBz7Y2oDj65st/go-libp2p-peerstore/pstoremem" )