@@ -211,14 +211,15 @@ mod network {
211
211
use libp2p:: identity;
212
212
use libp2p:: identity:: ed25519;
213
213
use libp2p:: kad:: record:: store:: MemoryStore ;
214
- use libp2p:: kad:: { GetProvidersOk , Kademlia , KademliaEvent , QueryId , QueryResult } ;
214
+ use libp2p:: kad:: { Kademlia , KademliaEvent , QueryId , QueryResult } ;
215
215
use libp2p:: multiaddr:: Protocol ;
216
216
use libp2p:: request_response:: {
217
217
ProtocolSupport , RequestId , RequestResponse , RequestResponseCodec , RequestResponseEvent ,
218
218
RequestResponseMessage , ResponseChannel ,
219
219
} ;
220
220
use libp2p:: swarm:: { ConnectionHandlerUpgrErr , SwarmBuilder , SwarmEvent } ;
221
221
use libp2p:: { NetworkBehaviour , Swarm } ;
222
+ use libp2p_kad:: { GetProvidersProgress , QueryProgress } ;
222
223
use std:: collections:: { HashMap , HashSet } ;
223
224
use std:: iter;
224
225
@@ -324,12 +325,12 @@ mod network {
324
325
325
326
/// Find the providers for the given file on the DHT.
326
327
pub async fn get_providers ( & mut self , file_name : String ) -> HashSet < PeerId > {
327
- let ( sender, receiver) = oneshot :: channel ( ) ;
328
+ let ( sender, receiver) = mpsc :: channel ( 0 ) ;
328
329
self . sender
329
330
. send ( Command :: GetProviders { file_name, sender } )
330
331
. await
331
332
. expect ( "Command receiver not to be dropped." ) ;
332
- receiver. await . expect ( "Sender not to be dropped." )
333
+ receiver. collect ( ) . await
333
334
}
334
335
335
336
/// Request the content of the given file from the given peer.
@@ -365,7 +366,7 @@ mod network {
365
366
event_sender : mpsc:: Sender < Event > ,
366
367
pending_dial : HashMap < PeerId , oneshot:: Sender < Result < ( ) , Box < dyn Error + Send > > > > ,
367
368
pending_start_providing : HashMap < QueryId , oneshot:: Sender < ( ) > > ,
368
- pending_get_providers : HashMap < QueryId , oneshot :: Sender < HashSet < PeerId > > > ,
369
+ pending_get_providers : HashMap < QueryId , mpsc :: Sender < PeerId > > ,
369
370
pending_request_file :
370
371
HashMap < RequestId , oneshot:: Sender < Result < String , Box < dyn Error + Send > > > > ,
371
372
}
@@ -421,18 +422,31 @@ mod network {
421
422
. expect ( "Completed query to be previously pending." ) ;
422
423
let _ = sender. send ( ( ) ) ;
423
424
}
425
+ SwarmEvent :: Behaviour ( ComposedEvent :: Kademlia (
426
+ KademliaEvent :: OutboundQueryProgressed {
427
+ id,
428
+ result : QueryProgress :: GetProviders ( GetProvidersProgress { provider, .. } ) ,
429
+ ..
430
+ } ,
431
+ ) ) => {
432
+ let _ = self
433
+ . pending_get_providers
434
+ . get_mut ( & id)
435
+ . expect ( "Completed query to be previously pending." )
436
+ . send ( provider) ;
437
+ }
424
438
SwarmEvent :: Behaviour ( ComposedEvent :: Kademlia (
425
439
KademliaEvent :: OutboundQueryCompleted {
426
440
id,
427
- result : QueryResult :: GetProviders ( Ok ( GetProvidersOk { providers , .. } ) ) ,
441
+ result : QueryResult :: GetProviders ( .. ) ,
428
442
..
429
443
} ,
430
444
) ) => {
445
+ // Drop channel to signal query is complete.
431
446
let _ = self
432
447
. pending_get_providers
433
448
. remove ( & id)
434
- . expect ( "Completed query to be previously pending." )
435
- . send ( providers) ;
449
+ . expect ( "Completed query to be previously pending." ) ;
436
450
}
437
451
SwarmEvent :: Behaviour ( ComposedEvent :: Kademlia ( _) ) => { }
438
452
SwarmEvent :: Behaviour ( ComposedEvent :: RequestResponse (
@@ -620,7 +634,7 @@ mod network {
620
634
} ,
621
635
GetProviders {
622
636
file_name : String ,
623
- sender : oneshot :: Sender < HashSet < PeerId > > ,
637
+ sender : mpsc :: Sender < PeerId > ,
624
638
} ,
625
639
RequestFile {
626
640
file_name : String ,
0 commit comments