@@ -27,6 +27,20 @@ use tokio::sync::mpsc::{channel, Sender};
27
27
use tokio:: sync:: oneshot;
28
28
use tracing:: { debug, info, trace} ;
29
29
30
+ use async_trait:: async_trait;
31
+ use iroh_bitswap:: Block ;
32
+ use iroh_rpc_client:: Lookup ;
33
+ use iroh_rpc_types:: p2p:: {
34
+ BitswapRequest , BitswapResponse , ConnectByPeerIdRequest , ConnectRequest , DhtGetRequest ,
35
+ DisconnectRequest , GetListeningAddrsResponse , GetPeersResponse , GossipsubAllPeersResponse ,
36
+ GossipsubPeerAndTopics , GossipsubPeerIdMsg , GossipsubPeersResponse , GossipsubPublishRequest ,
37
+ GossipsubPublishResponse , GossipsubSubscribeResponse , GossipsubTopicHashMsg ,
38
+ GossipsubTopicsResponse , Key as ProviderKey , LookupRequest , Multiaddrs ,
39
+ NotifyNewBlocksBitswapRequest , P2p as RpcP2p , P2pServerAddr , PeerIdResponse , PeerInfo ,
40
+ Providers , StopSessionBitswapRequest , VersionResponse ,
41
+ } ;
42
+ use libp2p:: kad:: PeerRecord ;
43
+
30
44
use super :: node:: DEFAULT_PROVIDER_LIMIT ;
31
45
use crate :: VERSION ;
32
46
@@ -231,6 +245,24 @@ impl P2p {
231
245
Ok ( stream)
232
246
}
233
247
248
+ #[ tracing:: instrument( skip( self , req) ) ]
249
+ async fn dht_get (
250
+ & self ,
251
+ req : DhtGetRequest ,
252
+ ) -> Result < Pin < Box < dyn Stream < Item = Result < iroh_rpc_types:: p2p:: PeerRecord > > + Send > > > {
253
+ // ToDo: parametrize size of channel in a proper way
254
+ let ( sender, receiver) = channel ( 64 ) ;
255
+ let msg = RpcMessage :: DhtGet {
256
+ key : Key :: from ( req. key . unwrap ( ) . key ) ,
257
+ response_channel : sender,
258
+ } ;
259
+ self . sender . send ( msg) . await ?;
260
+ let receiver = tokio_stream:: wrappers:: ReceiverStream :: new ( receiver)
261
+ . map ( |peer_record| peer_record. map ( |peer_record| peer_record. into ( ) ) ) ;
262
+
263
+ Ok ( Box :: pin ( receiver) )
264
+ }
265
+
234
266
#[ tracing:: instrument( skip( self , req) ) ]
235
267
async fn start_providing ( self , req : StartProvidingRequest ) -> Result < ( ) > {
236
268
trace ! ( "received StartProviding request: {:?}" , req. key) ;
@@ -620,6 +652,10 @@ pub enum RpcMessage {
620
652
ExternalAddrs ( oneshot:: Sender < Vec < Multiaddr > > ) ,
621
653
Listeners ( oneshot:: Sender < Vec < Multiaddr > > ) ,
622
654
LocalPeerId ( oneshot:: Sender < PeerId > ) ,
655
+ DhtGet {
656
+ key : Key ,
657
+ response_channel : Sender < Result < PeerRecord > > ,
658
+ } ,
623
659
BitswapRequest {
624
660
ctx : u64 ,
625
661
cids : Vec < Cid > ,
0 commit comments