@@ -31,24 +31,29 @@ internal DhtApi(IpfsClient ipfs)
31
31
32
32
public async Task < IEnumerable < Peer > > FindProvidersAsync ( Cid id , CancellationToken cancel = default ( CancellationToken ) )
33
33
{
34
- var stream = await ipfs . PostDownloadAsync ( "dht/findprovs" , cancel , id ) ;
35
- return ProviderFromStream ( stream ) ;
34
+ int limit = 20 ; // TODO: should be an argument
35
+ var stream = await ipfs . PostDownloadAsync ( "dht/findprovs" , cancel , id , $ "num-providers={ limit } ") ;
36
+ return ProviderFromStream ( stream , limit ) ;
36
37
}
37
38
38
- IEnumerable < Peer > ProviderFromStream ( Stream stream )
39
+ IEnumerable < Peer > ProviderFromStream ( Stream stream , int limit = int . MaxValue )
39
40
{
40
41
using ( var sr = new StreamReader ( stream ) )
41
42
{
42
- while ( ! sr . EndOfStream )
43
+ var n = 0 ;
44
+ while ( ! sr . EndOfStream && n < limit )
43
45
{
44
46
var json = sr . ReadLine ( ) ;
45
47
if ( log . IsDebugEnabled )
46
48
log . DebugFormat ( "Provider {0}" , json ) ;
47
49
48
50
var r = JObject . Parse ( json ) ;
49
51
var id = ( string ) r [ "ID" ] ;
50
- if ( id != String . Empty )
51
- yield return new Peer { Id = new MultiHash ( id ) } ;
52
+ if ( id != String . Empty )
53
+ {
54
+ ++ n ;
55
+ yield return new Peer { Id = new MultiHash ( id ) } ;
56
+ }
52
57
else
53
58
{
54
59
var responses = ( JArray ) r [ "Responses" ] ;
@@ -57,8 +62,11 @@ IEnumerable<Peer> ProviderFromStream(Stream stream)
57
62
foreach ( var response in responses )
58
63
{
59
64
var rid = ( string ) response [ "ID" ] ;
60
- if ( rid != String . Empty )
61
- yield return new Peer { Id = new MultiHash ( rid ) } ;
65
+ if ( rid != String . Empty )
66
+ {
67
+ ++ n ;
68
+ yield return new Peer { Id = new MultiHash ( rid ) } ;
69
+ }
62
70
}
63
71
}
64
72
}
0 commit comments