This repository was archived by the owner on Feb 7, 2024. It is now read-only.
File tree Expand file tree Collapse file tree 1 file changed +40
-0
lines changed Expand file tree Collapse file tree 1 file changed +40
-0
lines changed Original file line number Diff line number Diff line change 2
2
package shell
3
3
4
4
import (
5
+ "bufio"
5
6
"bytes"
7
+ "context"
6
8
"encoding/json"
7
9
"errors"
8
10
"fmt"
@@ -13,6 +15,8 @@ import (
13
15
"strings"
14
16
"time"
15
17
18
+ pstore "github.com/libp2p/go-libp2p-peerstore"
19
+ notif "github.com/libp2p/go-libp2p-routing/notifications"
16
20
ma "github.com/multiformats/go-multiaddr"
17
21
manet "github.com/multiformats/go-multiaddr-net"
18
22
files "github.com/whyrusleeping/go-multipart-files"
@@ -371,6 +375,42 @@ func (s *Shell) FindPeer(peer string) (*PeerInfo, error) {
371
375
return & str .Responses [0 ], nil
372
376
}
373
377
378
+ func (s * Shell ) FindProvs (ctx context.Context , cid string ) (<- chan pstore.PeerInfo , error ) {
379
+ ctx , cancel := context .WithCancel (ctx )
380
+
381
+ resp , err := s .newRequest ("dht/findprovs" , cid ).Send (s .httpcli )
382
+ if err != nil {
383
+ return nil , err
384
+ }
385
+
386
+ if resp .Error != nil {
387
+ return nil , resp .Error
388
+ }
389
+
390
+ outchan := make (chan pstore.PeerInfo , 4 )
391
+
392
+ go func () {
393
+ var n notif.QueryEvent
394
+ scanner := bufio .NewScanner (resp .Output )
395
+ for scanner .Scan () {
396
+ json .Unmarshal (scanner .Bytes (), & n )
397
+ if n .Type == notif .Provider {
398
+ for _ , p := range n .Responses {
399
+ outchan <- * p
400
+ }
401
+ }
402
+ }
403
+ cancel ()
404
+ }()
405
+
406
+ go func () {
407
+ <- ctx .Done ()
408
+ resp .Close ()
409
+ }()
410
+
411
+ return outchan , nil
412
+ }
413
+
374
414
func (s * Shell ) Refs (hash string , recursive bool ) (<- chan string , error ) {
375
415
req := s .newRequest ("refs" , hash )
376
416
if recursive {
You can’t perform that action at this time.
0 commit comments