@cryptotaxi247 / kubo / commits / 7e7a04e21

commands/dht: use new cmds lib

License: MIT Signed-off-by: Overbool <overbool.xu@gmail.com>

Overbool committed Oct 27, 2018 at 10:57 UTC 7e7a04e21ffbb03a356f85d7d53e881672741134
2 files changed +122 -217
core/commands/dht.go
+121 -216
@@ -1,15 +1,13 @@
1 package commands
2
3 import (
4 - "bytes"
4 "context"
5 "errors"
6 "fmt"
7 "io"
8 "time"
9
11 - cmds "github.com/ipfs/go-ipfs/commands"
12 - e "github.com/ipfs/go-ipfs/core/commands/e"
10 + cmdenv "github.com/ipfs/go-ipfs/core/commands/cmdenv"
11 dag "gx/ipfs/QmSei8kFMfqdJq7Q68d2LMnHbTWKKg2daA29ezUYFAUNgc/go-merkledag"
12 path "gx/ipfs/QmT3rzed1ppXefourpmoZ7tyVQfsGPQZ1pHDngLmCvXxd3/go-path"
13
@@ -21,6 +19,7 @@ import (
19 routing "gx/ipfs/QmcQ81jSyWCp1jpkQ8CMbtpXT3jK7Wg6ZtYmoyWFgBoF9c/go-libp2p-routing"
20 notif "gx/ipfs/QmcQ81jSyWCp1jpkQ8CMbtpXT3jK7Wg6ZtYmoyWFgBoF9c/go-libp2p-routing/notifications"
21 "gx/ipfs/Qmde5VP1qUkyQXKCfmEUA7bP64V2HAptbJ7phuPp7jXWwg/go-ipfs-cmdkit"
22 + cmds "gx/ipfs/QmSXUokcP4TJpFfqozT69AVAYRtzXVMUjzQVkYX41R9Svs/go-ipfs-cmds"
23 )
24
25 var ErrNotDHT = errors.New("routing service is not a DHT")
@@ -60,32 +59,28 @@ var queryDhtCmd = &cmds.Command{
59 Options: []cmdkit.Option{
60 cmdkit.BoolOption("verbose", dhtVerboseOptionName, "Print extra information."),
61 },
63 - Run: func(req cmds.Request, res cmds.Response) {
64 - n, err := req.InvocContext().GetNode()
62 + Run: func(req *cmds.Request, res cmds.ResponseEmitter, env cmds.Environment) error {
63 + nd, err := cmdenv.GetNode(env)
64 if err != nil {
66 - res.SetError(err, cmdkit.ErrNormal)
67 - return
65 + return err
66 }
67
70 - if n.DHT == nil {
71 - res.SetError(ErrNotDHT, cmdkit.ErrNormal)
72 - return
68 + if nd.DHT == nil {
69 + return ErrNotDHT
70 }
71
75 - id, err := peer.IDB58Decode(req.Arguments()[0])
72 + id, err := peer.IDB58Decode(req.Arguments[0])
73 if err != nil {
77 - res.SetError(cmds.ClientError("invalid peer ID"), cmdkit.ErrClient)
78 - return
74 + return cmds.ClientError("invalid peer ID")
75 }
76
81 - ctx, cancel := context.WithCancel(req.Context())
77 + ctx, cancel := context.WithCancel(req.Context)
78 ctx, events := notif.RegisterForQueryEvents(ctx)
79
84 - closestPeers, err := n.DHT.GetClosestPeers(ctx, string(id))
80 + closestPeers, err := nd.DHT.GetClosestPeers(ctx, string(id))
81 if err != nil {
82 cancel()
87 - res.SetError(err, cmdkit.ErrNormal)
88 - return
83 + return err
84 }
85
86 go func() {
@@ -99,21 +94,23 @@ var queryDhtCmd = &cmds.Command{
94 }()
95
96 outChan := make(chan interface{})
102 - res.SetOutput((<-chan interface{})(outChan))
97
98 go func() {
99 defer close(outChan)
100 for e := range events {
101 select {
102 case outChan <- e:
109 - case <-req.Context().Done():
103 + case <-req.Context.Done():
104 return
105 }
106 }
107 }()
108 +
109 + return res.Emit(outChan)
110 +
111 },
115 - Marshalers: cmds.MarshalerMap{
116 - cmds.Text: func() cmds.Marshaler {
112 + Encoders: cmds.EncoderMap{
113 + cmds.Text: cmds.MakeTypedEncoder(func(req *cmds.Request, w io.Writer, out *notif.QueryEvent) error {
114 pfm := pfuncMap{
115 notif.PeerResponse: func(obj *notif.QueryEvent, out io.Writer, verbose bool) {
116 for _, p := range obj.Responses {
@@ -121,25 +118,10 @@ var queryDhtCmd = &cmds.Command{
118 }
119 },
120 }
124 -
125 - return func(res cmds.Response) (io.Reader, error) {
126 - v, err := unwrapOutput(res.Output())
127 - if err != nil {
128 - return nil, err
129 - }
130 -
131 - obj, ok := v.(*notif.QueryEvent)
132 - if !ok {
133 - return nil, e.TypeErr(obj, v)
134 - }
135 -
136 - verbose, _, _ := res.Request().Option(dhtVerboseOptionName).Bool()
137 -
138 - buf := new(bytes.Buffer)
139 - printEvent(obj, buf, verbose, pfm)
140 - return buf, nil
141 - }
142 - }(),
121 + verbose, _ := req.Options[dhtVerboseOptionName].(bool)
122 + printEvent(out, w, verbose, pfm)
123 + return nil
124 + }),
125 },
126 Type: notif.QueryEvent{},
127 }
@@ -161,39 +143,33 @@ var findProvidersDhtCmd = &cmds.Command{
143 cmdkit.BoolOption("verbose", dhtVerboseOptionName, "Print extra information."),
144 cmdkit.IntOption(numProvidersOptionName, "n", "The number of providers to find.").WithDefault(20),
145 },
164 - Run: func(req cmds.Request, res cmds.Response) {
165 - n, err := req.InvocContext().GetNode()
146 + Run: func(req *cmds.Request, res cmds.ResponseEmitter, env cmds.Environment) error {
147 + n, err := cmdenv.GetNode(env)
148 if err != nil {
167 - res.SetError(err, cmdkit.ErrNormal)
168 - return
149 + return err
150 }
151
152 if n.Routing == nil {
172 - res.SetError(ErrNotOnline, cmdkit.ErrNormal)
173 - return
153 + return ErrNotOnline
154 }
155
176 - numProviders, _, err := res.Request().Option(numProvidersOptionName).Int()
156 + numProviders, _ := req.Options[numProvidersOptionName].(int)
157 if err != nil {
178 - res.SetError(err, cmdkit.ErrNormal)
179 - return
158 + return err
159 }
160 if numProviders < 1 {
182 - res.SetError(fmt.Errorf("number of providers must be greater than 0"), cmdkit.ErrNormal)
183 - return
161 + return fmt.Errorf("number of providers must be greater than 0")
162 }
163
186 - c, err := cid.Parse(req.Arguments()[0])
164 + c, err := cid.Parse(req.Arguments[0])
165
166 if err != nil {
189 - res.SetError(err, cmdkit.ErrNormal)
190 - return
167 + return err
168 }
169
170 outChan := make(chan interface{})
194 - res.SetOutput((<-chan interface{})(outChan))
171
196 - ctx, cancel := context.WithCancel(req.Context())
172 + ctx, cancel := context.WithCancel(req.Context)
173 ctx, events := notif.RegisterForQueryEvents(ctx)
174
175 pchan := n.Routing.FindProvidersAsync(ctx, c, numProviders)
@@ -202,7 +178,7 @@ var findProvidersDhtCmd = &cmds.Command{
178 for e := range events {
179 select {
180 case outChan <- e:
205 - case <-req.Context().Done():
181 + case <-req.Context.Done():
182 return
183 }
184 }
@@ -218,9 +194,11 @@ var findProvidersDhtCmd = &cmds.Command{
194 })
195 }
196 }()
197 +
198 + return res.Emit(outChan)
199 },
222 - Marshalers: cmds.MarshalerMap{
223 - cmds.Text: func() func(cmds.Response) (io.Reader, error) {
200 + Encoders: cmds.EncoderMap{
201 + cmds.Text: cmds.MakeTypedEncoder(func(req *cmds.Request, w io.Writer, out *notif.QueryEvent) error {
202 pfm := pfuncMap{
203 notif.FinalPeer: func(obj *notif.QueryEvent, out io.Writer, verbose bool) {
204 if verbose {
@@ -241,23 +219,11 @@ var findProvidersDhtCmd = &cmds.Command{
219 },
220 }
221
244 - return func(res cmds.Response) (io.Reader, error) {
245 - verbose, _, _ := res.Request().Option(dhtVerboseOptionName).Bool()
246 - v, err := unwrapOutput(res.Output())
247 - if err != nil {
248 - return nil, err
249 - }
250 -
251 - obj, ok := v.(*notif.QueryEvent)
252 - if !ok {
253 - return nil, e.TypeErr(obj, v)
254 - }
222 + verbose, _ := req.Options[dhtVerboseOptionName].(bool)
223 + printEvent(out, w, verbose, pfm)
224
256 - buf := new(bytes.Buffer)
257 - printEvent(obj, buf, verbose, pfm)
258 - return buf, nil
259 - }
260 - }(),
225 + return nil
226 + }),
227 },
228 Type: notif.QueryEvent{},
229 }
@@ -278,51 +244,44 @@ var provideRefDhtCmd = &cmds.Command{
244 cmdkit.BoolOption("verbose", dhtVerboseOptionName, "Print extra information."),
245 cmdkit.BoolOption(recursiveOptionName, "r", "Recursively provide entire graph."),
246 },
281 - Run: func(req cmds.Request, res cmds.Response) {
282 - n, err := req.InvocContext().GetNode()
247 + Run: func(req *cmds.Request, res cmds.ResponseEmitter, env cmds.Environment) error {
248 + nd, err := cmdenv.GetNode(env)
249 if err != nil {
284 - res.SetError(err, cmdkit.ErrNormal)
285 - return
250 + return err
251 }
252
288 - if n.Routing == nil {
289 - res.SetError(ErrNotOnline, cmdkit.ErrNormal)
290 - return
253 + if nd.Routing == nil {
254 + return ErrNotOnline
255 }
256
293 - if len(n.PeerHost.Network().Conns()) == 0 {
294 - res.SetError(errors.New("cannot provide, no connected peers"), cmdkit.ErrNormal)
295 - return
257 + if len(nd.PeerHost.Network().Conns()) == 0 {
258 + return errors.New("cannot provide, no connected peers")
259 }
260
298 - rec, _, _ := req.Option(recursiveOptionName).Bool()
261 + rec, _ := req.Options[recursiveOptionName].(bool)
262
263 var cids []cid.Cid
301 - for _, arg := range req.Arguments() {
264 + for _, arg := range req.Arguments {
265 c, err := cid.Decode(arg)
266 if err != nil {
304 - res.SetError(err, cmdkit.ErrNormal)
305 - return
267 + return err
268 }
269
308 - has, err := n.Blockstore.Has(c)
270 + has, err := nd.Blockstore.Has(c)
271 if err != nil {
310 - res.SetError(err, cmdkit.ErrNormal)
311 - return
272 + return err
273 }
274
275 if !has {
315 - res.SetError(fmt.Errorf("block %s not found locally, cannot provide", c), cmdkit.ErrNormal)
316 - return
276 + return fmt.Errorf("block %s not found locally, cannot provide", c)
277 }
278
279 cids = append(cids, c)
280 }
281
282 outChan := make(chan interface{})
323 - res.SetOutput((<-chan interface{})(outChan))
283
325 - ctx, cancel := context.WithCancel(req.Context())
284 + ctx, cancel := context.WithCancel(req.Context)
285 ctx, events := notif.RegisterForQueryEvents(ctx)
286
287 go func() {
@@ -330,7 +289,7 @@ var provideRefDhtCmd = &cmds.Command{
289 for e := range events {
290 select {
291 case outChan <- e:
333 - case <-req.Context().Done():
292 + case <-req.Context.Done():
293 return
294 }
295 }
@@ -340,9 +299,9 @@ var provideRefDhtCmd = &cmds.Command{
299 defer cancel()
300 var err error
301 if rec {
343 - err = provideKeysRec(ctx, n.Routing, n.DAG, cids)
302 + err = provideKeysRec(ctx, nd.Routing, nd.DAG, cids)
303 } else {
345 - err = provideKeys(ctx, n.Routing, cids)
304 + err = provideKeys(ctx, nd.Routing, cids)
305 }
306 if err != nil {
307 notif.PublishQueryEvent(ctx, &notif.QueryEvent{
@@ -351,9 +310,11 @@ var provideRefDhtCmd = &cmds.Command{
310 })
311 }
312 }()
313 +
314 + return res.Emit(outChan)
315 },
355 - Marshalers: cmds.MarshalerMap{
356 - cmds.Text: func() func(res cmds.Response) (io.Reader, error) {
316 + Encoders: cmds.EncoderMap{
317 + cmds.Text: cmds.MakeTypedEncoder(func(req *cmds.Request, w io.Writer, out *notif.QueryEvent) error {
318 pfm := pfuncMap{
319 notif.FinalPeer: func(obj *notif.QueryEvent, out io.Writer, verbose bool) {
320 if verbose {
@@ -362,22 +323,11 @@ var provideRefDhtCmd = &cmds.Command{
323 },
324 }
325
365 - return func(res cmds.Response) (io.Reader, error) {
366 - verbose, _, _ := res.Request().Option(dhtVerboseOptionName).Bool()
367 - v, err := unwrapOutput(res.Output())
368 - if err != nil {
369 - return nil, err
370 - }
371 - obj, ok := v.(*notif.QueryEvent)
372 - if !ok {
373 - return nil, e.TypeErr(obj, v)
374 - }
326 + verbose, _ := req.Options[dhtVerboseOptionName].(bool)
327 + printEvent(out, w, verbose, pfm)
328
376 - buf := new(bytes.Buffer)
377 - printEvent(obj, buf, verbose, pfm)
378 - return buf, nil
379 - }
380 - }(),
329 + return nil
330 + }),
331 },
332 Type: notif.QueryEvent{},
333 }
@@ -430,28 +380,24 @@ var findPeerDhtCmd = &cmds.Command{
380 Options: []cmdkit.Option{
381 cmdkit.BoolOption("verbose", dhtVerboseOptionName, "Print extra information."),
382 },
433 - Run: func(req cmds.Request, res cmds.Response) {
434 - n, err := req.InvocContext().GetNode()
383 + Run: func(req *cmds.Request, res cmds.ResponseEmitter, env cmds.Environment) error {
384 + nd, err := cmdenv.GetNode(env)
385 if err != nil {
436 - res.SetError(err, cmdkit.ErrNormal)
437 - return
386 + return err
387 }
388
440 - if n.Routing == nil {
441 - res.SetError(ErrNotOnline, cmdkit.ErrNormal)
442 - return
389 + if nd.Routing == nil {
390 + return ErrNotOnline
391 }
392
445 - pid, err := peer.IDB58Decode(req.Arguments()[0])
393 + pid, err := peer.IDB58Decode(req.Arguments[0])
394 if err != nil {
447 - res.SetError(err, cmdkit.ErrNormal)
448 - return
395 + return err
396 }
397
398 outChan := make(chan interface{})
452 - res.SetOutput((<-chan interface{})(outChan))
399
454 - ctx, cancel := context.WithCancel(req.Context())
400 + ctx, cancel := context.WithCancel(req.Context)
401 ctx, events := notif.RegisterForQueryEvents(ctx)
402
403 go func() {
@@ -459,7 +405,7 @@ var findPeerDhtCmd = &cmds.Command{
405 for v := range events {
406 select {
407 case outChan <- v:
462 - case <-req.Context().Done():
408 + case <-req.Context.Done():
409 }
410
411 }
@@ -467,7 +413,7 @@ var findPeerDhtCmd = &cmds.Command{
413
414 go func() {
415 defer cancel()
470 - pi, err := n.Routing.FindPeer(ctx, pid)
416 + pi, err := nd.Routing.FindPeer(ctx, pid)
417 if err != nil {
418 notif.PublishQueryEvent(ctx, &notif.QueryEvent{
419 Type: notif.QueryError,
@@ -481,9 +427,11 @@ var findPeerDhtCmd = &cmds.Command{
427 Responses: []*pstore.PeerInfo{&pi},
428 })
429 }()
430 +
431 + return res.Emit(outChan)
432 },
485 - Marshalers: cmds.MarshalerMap{
486 - cmds.Text: func() func(cmds.Response) (io.Reader, error) {
433 + Encoders: cmds.EncoderMap{
434 + cmds.Text: cmds.MakeTypedEncoder(func(req *cmds.Request, w io.Writer, out *notif.QueryEvent) error {
435 pfm := pfuncMap{
436 notif.FinalPeer: func(obj *notif.QueryEvent, out io.Writer, verbose bool) {
437 pi := obj.Responses[0]
@@ -493,24 +441,10 @@ var findPeerDhtCmd = &cmds.Command{
441 },
442 }
443
496 - return func(res cmds.Response) (io.Reader, error) {
497 - verbose, _, _ := res.Request().Option(dhtVerboseOptionName).Bool()
498 - v, err := unwrapOutput(res.Output())
499 - if err != nil {
500 - return nil, err
501 - }
502 -
503 - obj, ok := v.(*notif.QueryEvent)
504 - if !ok {
505 - return nil, e.TypeErr(obj, v)
506 - }
507 -
508 - buf := new(bytes.Buffer)
509 - printEvent(obj, buf, verbose, pfm)
510 -
511 - return buf, nil
512 - }
513 - }(),
444 + verbose, _ := req.Options[dhtVerboseOptionName].(bool)
445 + printEvent(out, w, verbose, pfm)
446 + return nil
447 + }),
448 },
449 Type: notif.QueryEvent{},
450 }
@@ -535,28 +469,24 @@ Different key types can specify other 'best' rules.
469 Options: []cmdkit.Option{
470 cmdkit.BoolOption("verbose", dhtVerboseOptionName, "Print extra information."),
471 },
538 - Run: func(req cmds.Request, res cmds.Response) {
539 - n, err := req.InvocContext().GetNode()
472 + Run: func(req *cmds.Request, res cmds.ResponseEmitter, env cmds.Environment) error {
473 + nd, err := cmdenv.GetNode(env)
474 if err != nil {
541 - res.SetError(err, cmdkit.ErrNormal)
542 - return
475 + return err
476 }
477
545 - if n.Routing == nil {
546 - res.SetError(ErrNotOnline, cmdkit.ErrNormal)
547 - return
478 + if nd.Routing == nil {
479 + return ErrNotOnline
480 }
481
550 - dhtkey, err := escapeDhtKey(req.Arguments()[0])
482 + dhtkey, err := escapeDhtKey(req.Arguments[0])
483 if err != nil {
552 - res.SetError(err, cmdkit.ErrNormal)
553 - return
484 + return err
485 }
486
487 outChan := make(chan interface{})
557 - res.SetOutput((<-chan interface{})(outChan))
488
559 - ctx, cancel := context.WithCancel(req.Context())
489 + ctx, cancel := context.WithCancel(req.Context)
490 ctx, events := notif.RegisterForQueryEvents(ctx)
491
492 go func() {
@@ -564,14 +494,14 @@ Different key types can specify other 'best' rules.
494 for e := range events {
495 select {
496 case outChan <- e:
567 - case <-req.Context().Done():
497 + case <-req.Context.Done():
498 }
499 }
500 }()
501
502 go func() {
503 defer cancel()
574 - val, err := n.Routing.GetValue(ctx, dhtkey)
504 + val, err := nd.Routing.GetValue(ctx, dhtkey)
505 if err != nil {
506 notif.PublishQueryEvent(ctx, &notif.QueryEvent{
507 Type: notif.QueryError,
@@ -584,9 +514,11 @@ Different key types can specify other 'best' rules.
514 })
515 }
516 }()
517 +
518 + return res.Emit(outChan)
519 },
588 - Marshalers: cmds.MarshalerMap{
589 - cmds.Text: func() func(cmds.Response) (io.Reader, error) {
520 + Encoders: cmds.EncoderMap{
521 + cmds.Text: cmds.MakeTypedEncoder(func(req *cmds.Request, w io.Writer, out *notif.QueryEvent) error {
522 pfm := pfuncMap{
523 notif.Value: func(obj *notif.QueryEvent, out io.Writer, verbose bool) {
524 if verbose {
@@ -597,25 +529,11 @@ Different key types can specify other 'best' rules.
529 },
530 }
531
600 - return func(res cmds.Response) (io.Reader, error) {
601 - verbose, _, _ := res.Request().Option(dhtVerboseOptionName).Bool()
602 - v, err := unwrapOutput(res.Output())
603 - if err != nil {
604 - return nil, err
605 - }
606 -
607 - obj, ok := v.(*notif.QueryEvent)
608 - if !ok {
609 - return nil, e.TypeErr(obj, v)
610 - }
611 -
612 - buf := new(bytes.Buffer)
613 -
614 - printEvent(obj, buf, verbose, pfm)
532 + verbose, _ := req.Options[dhtVerboseOptionName].(bool)
533 + printEvent(out, w, verbose, pfm)
534
616 - return buf, nil
617 - }
618 - }(),
535 + return nil
536 + }),
537 },
538 Type: notif.QueryEvent{},
539 }
@@ -649,30 +567,26 @@ NOTE: A value may not exceed 2048 bytes.
567 Options: []cmdkit.Option{
568 cmdkit.BoolOption("verbose", dhtVerboseOptionName, "Print extra information."),
569 },
652 - Run: func(req cmds.Request, res cmds.Response) {
653 - n, err := req.InvocContext().GetNode()
570 + Run: func(req *cmds.Request, res cmds.ResponseEmitter, env cmds.Environment) error {
571 + nd, err := cmdenv.GetNode(env)
572 if err != nil {
655 - res.SetError(err, cmdkit.ErrNormal)
656 - return
573 + return err
574 }
575
659 - if n.Routing == nil {
660 - res.SetError(ErrNotOnline, cmdkit.ErrNormal)
661 - return
576 + if nd.Routing == nil {
577 + return ErrNotOnline
578 }
579
664 - key, err := escapeDhtKey(req.Arguments()[0])
580 + key, err := escapeDhtKey(req.Arguments[0])
581 if err != nil {
666 - res.SetError(err, cmdkit.ErrNormal)
667 - return
582 + return err
583 }
584
585 outChan := make(chan interface{})
671 - res.SetOutput((<-chan interface{})(outChan))
586
673 - data := req.Arguments()[1]
587 + data := req.Arguments[1]
588
675 - ctx, cancel := context.WithCancel(req.Context())
589 + ctx, cancel := context.WithCancel(req.Context)
590 ctx, events := notif.RegisterForQueryEvents(ctx)
591
592 go func() {
@@ -680,7 +594,7 @@ NOTE: A value may not exceed 2048 bytes.
594 for e := range events {
595 select {
596 case outChan <- e:
683 - case <-req.Context().Done():
597 + case <-req.Context.Done():
598 return
599 }
600 }
@@ -688,7 +602,7 @@ NOTE: A value may not exceed 2048 bytes.
602
603 go func() {
604 defer cancel()
691 - err := n.Routing.PutValue(ctx, key, []byte(data))
605 + err := nd.Routing.PutValue(ctx, key, []byte(data))
606 if err != nil {
607 notif.PublishQueryEvent(ctx, &notif.QueryEvent{
608 Type: notif.QueryError,
@@ -696,9 +610,11 @@ NOTE: A value may not exceed 2048 bytes.
610 })
611 }
612 }()
613 +
614 + return res.Emit(outChan)
615 },
700 - Marshalers: cmds.MarshalerMap{
701 - cmds.Text: func() func(cmds.Response) (io.Reader, error) {
616 + Encoders: cmds.EncoderMap{
617 + cmds.Text: cmds.MakeTypedEncoder(func(req *cmds.Request, w io.Writer, out *notif.QueryEvent) error {
618 pfm := pfuncMap{
619 notif.FinalPeer: func(obj *notif.QueryEvent, out io.Writer, verbose bool) {
620 if verbose {
@@ -710,23 +626,12 @@ NOTE: A value may not exceed 2048 bytes.
626 },
627 }
628
713 - return func(res cmds.Response) (io.Reader, error) {
714 - verbose, _, _ := res.Request().Option(dhtVerboseOptionName).Bool()
715 - v, err := unwrapOutput(res.Output())
716 - if err != nil {
717 - return nil, err
718 - }
719 - obj, ok := v.(*notif.QueryEvent)
720 - if !ok {
721 - return nil, e.TypeErr(obj, v)
722 - }
629 + verbose, _ := req.Options[dhtVerboseOptionName].(bool)
630
724 - buf := new(bytes.Buffer)
725 - printEvent(obj, buf, verbose, pfm)
631 + printEvent(out, w, verbose, pfm)
632
727 - return buf, nil
728 - }
729 - }(),
633 + return nil
634 + }),
635 },
636 Type: notif.QueryEvent{},
637 }
core/commands/root.go
+1 -1
@@ -125,7 +125,7 @@ var rootSubcommands = map[string]*cmds.Command{
125 "bootstrap": lgc.NewCommand(BootstrapCmd),
126 "config": lgc.NewCommand(ConfigCmd),
127 "dag": dag.DagCmd,
128 - "dht": lgc.NewCommand(DhtCmd),
128 + "dht": DhtCmd,
129 "diag": lgc.NewCommand(DiagCmd),
130 "dns": DNSCmd,
131 "id": IDCmd,