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, ¬if.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, ¬if.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, ¬if.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, ¬if.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,