@@ -83,13 +83,16 @@ mod schema {
83
83
}
84
84
85
85
/// Peer action.
86
- #[ derive( Debug ) ]
86
+ #[ derive( Debug , Clone ) ]
87
87
enum PeerAction {
88
88
/// Send `FIND_NODE` message to peer.
89
89
SendFindNode ( QueryId ) ,
90
90
91
91
/// Send `PUT_VALUE` message to peer.
92
92
SendPutValue ( Bytes ) ,
93
+
94
+ /// Send `ADD_PROVIDER` message to peer.
95
+ SendAddProvider ( Bytes ) ,
93
96
}
94
97
95
98
/// Peer context.
@@ -335,7 +338,12 @@ impl Kademlia {
335
338
}
336
339
}
337
340
Some ( PeerAction :: SendPutValue ( message) ) => {
338
- tracing:: trace!( target: LOG_TARGET , ?peer, "send `PUT_VALUE` response" ) ;
341
+ tracing:: trace!( target: LOG_TARGET , ?peer, "send `PUT_VALUE` message" ) ;
342
+
343
+ self . executor . send_message ( peer, message, substream) ;
344
+ }
345
+ Some ( PeerAction :: SendAddProvider ( message) ) => {
346
+ tracing:: trace!( target: LOG_TARGET , ?peer, "send `ADD_PROVIDER` message" ) ;
339
347
340
348
self . executor . send_message ( peer, message, substream) ;
341
349
}
@@ -758,6 +766,35 @@ impl Kademlia {
758
766
759
767
Ok ( ( ) )
760
768
}
769
+ QueryAction :: AddProviderToFoundNodes { provider, peers } => {
770
+ tracing:: trace!(
771
+ target: LOG_TARGET ,
772
+ provided_key = ?provider. key,
773
+ num_peers = ?peers. len( ) ,
774
+ "add provider record to found peers" ,
775
+ ) ;
776
+
777
+ let provided_key = provider. key . clone ( ) ;
778
+ let message = KademliaMessage :: add_provider ( provider) ;
779
+
780
+ for peer in peers {
781
+ if let Err ( error) = self . open_substream_or_dial (
782
+ peer. peer ,
783
+ PeerAction :: SendAddProvider ( message. clone ( ) ) ,
784
+ None ,
785
+ ) {
786
+ tracing:: debug!(
787
+ target: LOG_TARGET ,
788
+ ?peer,
789
+ ?provided_key,
790
+ ?error,
791
+ "failed to add provider record to peer" ,
792
+ )
793
+ }
794
+ }
795
+
796
+ Ok ( ( ) )
797
+ }
761
798
QueryAction :: GetRecordQueryDone { query_id, records } => {
762
799
let _ = self
763
800
. event_tx
@@ -794,7 +831,11 @@ impl Kademlia {
794
831
event = self . service. next( ) => match event {
795
832
Some ( TransportEvent :: ConnectionEstablished { peer, .. } ) => {
796
833
if let Err ( error) = self . on_connection_established( peer) {
797
- tracing:: debug!( target: LOG_TARGET , ?error, "failed to handle established connection" ) ;
834
+ tracing:: debug!(
835
+ target: LOG_TARGET ,
836
+ ?error,
837
+ "failed to handle established connection" ,
838
+ ) ;
798
839
}
799
840
}
800
841
Some ( TransportEvent :: ConnectionClosed { peer } ) => {
@@ -804,7 +845,10 @@ impl Kademlia {
804
845
match direction {
805
846
Direction :: Inbound => self . on_inbound_substream( peer, substream) . await ,
806
847
Direction :: Outbound ( substream_id) => {
807
- if let Err ( error) = self . on_outbound_substream( peer, substream_id, substream) . await {
848
+ if let Err ( error) = self
849
+ . on_outbound_substream( peer, substream_id, substream)
850
+ . await
851
+ {
808
852
tracing:: debug!(
809
853
target: LOG_TARGET ,
810
854
?peer,
@@ -819,22 +863,41 @@ impl Kademlia {
819
863
Some ( TransportEvent :: SubstreamOpenFailure { substream, error } ) => {
820
864
self . on_substream_open_failure( substream, error) . await ;
821
865
}
822
- Some ( TransportEvent :: DialFailure { peer, address, .. } ) => self . on_dial_failure( peer, address) ,
866
+ Some ( TransportEvent :: DialFailure { peer, address, .. } ) =>
867
+ self . on_dial_failure( peer, address) ,
823
868
None => return Err ( Error :: EssentialTaskClosed ) ,
824
869
} ,
825
870
context = self . executor. next( ) => {
826
871
let QueryContext { peer, query_id, result } = context. unwrap( ) ;
827
872
828
873
match result {
829
874
QueryResult :: SendSuccess { substream } => {
830
- tracing:: trace!( target: LOG_TARGET , ?peer, query = ?query_id, "message sent to peer" ) ;
875
+ tracing:: trace!(
876
+ target: LOG_TARGET ,
877
+ ?peer,
878
+ query = ?query_id,
879
+ "message sent to peer" ,
880
+ ) ;
831
881
let _ = substream. close( ) . await ;
832
882
}
833
883
QueryResult :: ReadSuccess { substream, message } => {
834
- tracing:: trace!( target: LOG_TARGET , ?peer, query = ?query_id, "message read from peer" ) ;
884
+ tracing:: trace!( target: LOG_TARGET ,
885
+ ?peer,
886
+ query = ?query_id,
887
+ "message read from peer" ,
888
+ ) ;
835
889
836
- if let Err ( error) = self . on_message_received( peer, query_id, message, substream) . await {
837
- tracing:: debug!( target: LOG_TARGET , ?peer, ?error, "failed to process message" ) ;
890
+ if let Err ( error) = self . on_message_received(
891
+ peer,
892
+ query_id,
893
+ message,
894
+ substream
895
+ ) . await {
896
+ tracing:: debug!( target: LOG_TARGET ,
897
+ ?peer,
898
+ ?error,
899
+ "failed to process message" ,
900
+ ) ;
838
901
}
839
902
}
840
903
QueryResult :: SubstreamClosed | QueryResult :: Timeout => {
@@ -853,22 +916,36 @@ impl Kademlia {
853
916
command = self . cmd_rx. recv( ) => {
854
917
match command {
855
918
Some ( KademliaCommand :: FindNode { peer, query_id } ) => {
856
- tracing:: debug!( target: LOG_TARGET , ?peer, query = ?query_id, "starting `FIND_NODE` query" ) ;
919
+ tracing:: debug!(
920
+ target: LOG_TARGET ,
921
+ ?peer,
922
+ query = ?query_id,
923
+ "starting `FIND_NODE` query" ,
924
+ ) ;
857
925
858
926
self . engine. start_find_node(
859
927
query_id,
860
928
peer,
861
- self . routing_table. closest( Key :: from( peer) , self . replication_factor) . into( )
929
+ self . routing_table
930
+ . closest( Key :: from( peer) , self . replication_factor)
931
+ . into( )
862
932
) ;
863
933
}
864
934
Some ( KademliaCommand :: PutRecord { mut record, query_id } ) => {
865
- tracing:: debug!( target: LOG_TARGET , query = ?query_id, key = ?record. key, "store record to DHT" ) ;
935
+ tracing:: debug!(
936
+ target: LOG_TARGET ,
937
+ query = ?query_id,
938
+ key = ?record. key,
939
+ "store record to DHT" ,
940
+ ) ;
866
941
867
942
// For `PUT_VALUE` requests originating locally we are always the publisher.
868
943
record. publisher = Some ( self . local_key. clone( ) . into_preimage( ) ) ;
869
944
870
945
// Make sure TTL is set.
871
- record. expires = record. expires. or_else( || Some ( Instant :: now( ) + self . record_ttl) ) ;
946
+ record. expires = record
947
+ . expires
948
+ . or_else( || Some ( Instant :: now( ) + self . record_ttl) ) ;
872
949
873
950
let key = Key :: new( record. key. clone( ) ) ;
874
951
@@ -880,11 +957,23 @@ impl Kademlia {
880
957
self . routing_table. closest( key, self . replication_factor) . into( ) ,
881
958
) ;
882
959
}
883
- Some ( KademliaCommand :: PutRecordToPeers { mut record, query_id, peers, update_local_store } ) => {
884
- tracing:: debug!( target: LOG_TARGET , query = ?query_id, key = ?record. key, "store record to DHT to specified peers" ) ;
960
+ Some ( KademliaCommand :: PutRecordToPeers {
961
+ mut record,
962
+ query_id,
963
+ peers,
964
+ update_local_store,
965
+ } ) => {
966
+ tracing:: debug!(
967
+ target: LOG_TARGET ,
968
+ query = ?query_id,
969
+ key = ?record. key,
970
+ "store record to DHT to specified peers" ,
971
+ ) ;
885
972
886
973
// Make sure TTL is set.
887
- record. expires = record. expires. or_else( || Some ( Instant :: now( ) + self . record_ttl) ) ;
974
+ record. expires = record
975
+ . expires
976
+ . or_else( || Some ( Instant :: now( ) + self . record_ttl) ) ;
888
977
889
978
if update_local_store {
890
979
self . store. put( record. clone( ) ) ;
@@ -898,7 +987,8 @@ impl Kademlia {
898
987
899
988
match self . routing_table. entry( Key :: from( peer) ) {
900
989
KBucketEntry :: Occupied ( entry) => Some ( entry. clone( ) ) ,
901
- KBucketEntry :: Vacant ( entry) if !entry. addresses. is_empty( ) => Some ( entry. clone( ) ) ,
990
+ KBucketEntry :: Vacant ( entry) if !entry. addresses. is_empty( ) =>
991
+ Some ( entry. clone( ) ) ,
902
992
_ => None ,
903
993
}
904
994
} ) . collect( ) ;
@@ -909,6 +999,36 @@ impl Kademlia {
909
999
peers,
910
1000
) ;
911
1001
}
1002
+ Some ( KademliaCommand :: StartProviding {
1003
+ key,
1004
+ public_addresses,
1005
+ query_id
1006
+ } ) => {
1007
+ tracing:: debug!(
1008
+ target: LOG_TARGET ,
1009
+ query = ?query_id,
1010
+ ?key,
1011
+ ?public_addresses,
1012
+ "register as content provider"
1013
+ ) ;
1014
+
1015
+ let provider = ProviderRecord {
1016
+ key: key. clone( ) ,
1017
+ provider: self . service. local_peer_id( ) ,
1018
+ addresses: public_addresses,
1019
+ expires: Instant :: now( ) + self . provider_ttl,
1020
+ } ;
1021
+
1022
+ self . store. put_provider( provider. clone( ) ) ;
1023
+
1024
+ self . engine. start_add_provider(
1025
+ query_id,
1026
+ provider,
1027
+ self . routing_table
1028
+ . closest( Key :: new( key) , self . replication_factor)
1029
+ . into( ) ,
1030
+ ) ;
1031
+ }
912
1032
Some ( KademliaCommand :: GetRecord { key, quorum, query_id } ) => {
913
1033
tracing:: debug!( target: LOG_TARGET , ?key, "get record from DHT" ) ;
914
1034
0 commit comments