@@ -19,6 +19,8 @@ use tokio_util::sync::CancellationToken;
19
19
use tracing:: { debug, info, info_span, trace, warn, Instrument } ;
20
20
21
21
use crate :: {
22
+ discovery:: pkarr_relay_publish:: DEFAULT_PKARR_TTL ,
23
+ dns:: node_info:: NodeInfo ,
22
24
key:: { PublicKey , PUBLIC_KEY_LENGTH } ,
23
25
relay:: { self , http:: ClientError , ReceivedMessage , RelayUrl , MAX_PACKET_SIZE } ,
24
26
} ;
@@ -38,11 +40,9 @@ pub(super) enum RelayActorMessage {
38
40
contents : RelayContents ,
39
41
peer : PublicKey ,
40
42
} ,
41
- Connect {
43
+ ConnectAsHomeRelay {
42
44
url : RelayUrl ,
43
- peer : Option < PublicKey > ,
44
45
} ,
45
- NotePreferred ( RelayUrl ) ,
46
46
MaybeCloseRelaysOnRebind ( Vec < IpAddr > ) ,
47
47
}
48
48
@@ -79,6 +79,7 @@ enum ActiveRelayMessage {
79
79
GetPeerRoute ( PublicKey , oneshot:: Sender < Option < relay:: http:: Client > > ) ,
80
80
GetClient ( oneshot:: Sender < relay:: http:: Client > ) ,
81
81
NotePreferred ( bool ) ,
82
+ PkarrPublish ( pkarr:: SignedPacket ) ,
82
83
Shutdown ,
83
84
}
84
85
@@ -133,6 +134,9 @@ impl ActiveRelay {
133
134
ActiveRelayMessage :: NotePreferred ( is_preferred) => {
134
135
self . relay_client. note_preferred( is_preferred) . await ;
135
136
}
137
+ ActiveRelayMessage :: PkarrPublish ( packet) => {
138
+ self . relay_client. pkarr_publish( packet) . await ;
139
+ }
136
140
ActiveRelayMessage :: GetPeerRoute ( peer, r) => {
137
141
let res = if self . relay_routes. contains( & peer) {
138
142
Some ( self . relay_client. clone( ) )
@@ -349,11 +353,8 @@ impl RelayActor {
349
353
} => {
350
354
self . send_relay ( & url, contents, peer) . await ;
351
355
}
352
- RelayActorMessage :: Connect { url, peer } => {
353
- self . connect_relay ( & url, peer. as_ref ( ) ) . await ;
354
- }
355
- RelayActorMessage :: NotePreferred ( my_relay) => {
356
- self . note_preferred ( & my_relay) . await ;
356
+ RelayActorMessage :: ConnectAsHomeRelay { url } => {
357
+ self . connect_relay_as_home ( & url) . await ;
357
358
}
358
359
RelayActorMessage :: MaybeCloseRelaysOnRebind ( ifs) => {
359
360
self . maybe_close_relays_on_rebind ( & ifs) . await ;
@@ -420,6 +421,29 @@ impl RelayActor {
420
421
}
421
422
422
423
/// Connect to the given relay node.
424
+ async fn connect_relay_as_home ( & mut self , url : & RelayUrl ) {
425
+ self . connect_relay ( url, None ) . await ;
426
+ self . note_preferred ( url) . await ;
427
+ if let Err ( err) = self . pkarr_announce_to_relay ( url) . await {
428
+ warn ! ( ?err, %url, "failed to send pkarr self-announce to home derper" ) ;
429
+ }
430
+ }
431
+
432
+ async fn pkarr_announce_to_relay ( & self , my_relay : & RelayUrl ) -> anyhow:: Result < ( ) > {
433
+ if self . conn . pkarr_announce {
434
+ let s = self
435
+ . active_relay
436
+ . iter ( )
437
+ . find_map ( |( relay_url, ( s, _) ) | ( relay_url == my_relay) . then_some ( s) )
438
+ . context ( "home derp not in list of active derps" ) ?;
439
+ let info = NodeInfo :: new ( self . conn . secret_key . public ( ) , Some ( my_relay. clone ( ) ) ) ;
440
+ let packet = info. to_pkarr_signed_packet ( & self . conn . secret_key , DEFAULT_PKARR_TTL ) ?;
441
+ s. send ( ActiveRelayMessage :: PkarrPublish ( packet) ) . await ?;
442
+ }
443
+ Ok ( ( ) )
444
+ }
445
+
446
+ /// Connect to the given derp node.
423
447
async fn connect_relay (
424
448
& mut self ,
425
449
url : & RelayUrl ,
@@ -583,7 +607,7 @@ impl RelayActor {
583
607
async fn close_or_reconnect_relay ( & mut self , url : & RelayUrl , why : & ' static str ) {
584
608
self . close_relay ( url, why) . await ;
585
609
if self . conn . my_relay ( ) . as_ref ( ) == Some ( url) {
586
- self . connect_relay ( url, None ) . await ;
610
+ self . connect_relay_as_home ( url) . await ;
587
611
}
588
612
}
589
613
0 commit comments