@@ -68,6 +68,16 @@ pub trait CustomMessageHandler: wire::CustomMessageReader {
68
68
/// connection to the node exists, then the message is simply not sent.
69
69
fn get_and_clear_pending_msg ( & self ) -> Vec < ( PublicKey , Self :: CustomMessage ) > ;
70
70
71
+ /// Indicates a connection to the peer failed/an existing connection was lost.
72
+ fn peer_disconnected ( & self , their_node_id : & PublicKey ) ;
73
+
74
+ /// Handle a peer reconnecting, possibly generating `channel_reestablish` message(s).
75
+ ///
76
+ /// May return an `Err(())` if the features the peer supports are not sufficient to communicate
77
+ /// with us. Implementors should be somewhat conservative about doing so, however, as other
78
+ /// message handlers may still wish to communicate with this peer.
79
+ fn peer_connected ( & self , their_node_id : & PublicKey , msg : & msgs:: Init , inbound : bool ) -> Result < ( ) , ( ) > ;
80
+
71
81
/// Gets the node feature flags which this handler itself supports. All available handlers are
72
82
/// queried similarly and their feature flags are OR'd together to form the [`NodeFeatures`]
73
83
/// which are broadcasted in our [`NodeAnnouncement`] message.
@@ -170,6 +180,10 @@ impl CustomMessageHandler for IgnoringMessageHandler {
170
180
171
181
fn get_and_clear_pending_msg ( & self ) -> Vec < ( PublicKey , Self :: CustomMessage ) > { Vec :: new ( ) }
172
182
183
+ fn peer_disconnected ( & self , _: & PublicKey ) { }
184
+
185
+ fn peer_connected ( & self , _: & PublicKey , _: & msgs:: Init , _: bool ) -> Result < ( ) , ( ) > { Ok ( ( ) ) }
186
+
173
187
fn provided_node_features ( & self ) -> NodeFeatures { NodeFeatures :: empty ( ) }
174
188
175
189
fn provided_init_features ( & self , _their_node_id : & PublicKey ) -> InitFeatures {
@@ -1549,6 +1563,10 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, OM: Deref, L: Deref, CM
1549
1563
log_debug ! ( self . logger, "Onion Message Handler decided we couldn't communicate with peer {}" , log_pubkey!( their_node_id) ) ;
1550
1564
return Err ( PeerHandleError { } . into ( ) ) ;
1551
1565
}
1566
+ if let Err ( ( ) ) = self . message_handler . custom_message_handler . peer_connected ( & their_node_id, & msg, peer_lock. inbound_connection ) {
1567
+ log_debug ! ( self . logger, "Custom Message Handler decided we couldn't communicate with peer {}" , log_pubkey!( their_node_id) ) ;
1568
+ return Err ( PeerHandleError { } . into ( ) ) ;
1569
+ }
1552
1570
1553
1571
peer_lock. their_features = Some ( msg. features ) ;
1554
1572
return Ok ( None ) ;
@@ -2237,6 +2255,7 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, OM: Deref, L: Deref, CM
2237
2255
log_trace ! ( self . logger, "Disconnecting peer with id {} due to {}" , node_id, reason) ;
2238
2256
self . message_handler . chan_handler . peer_disconnected ( & node_id) ;
2239
2257
self . message_handler . onion_message_handler . peer_disconnected ( & node_id) ;
2258
+ self . message_handler . custom_message_handler . peer_disconnected ( & node_id) ;
2240
2259
}
2241
2260
descriptor. disconnect_socket ( ) ;
2242
2261
}
@@ -2259,6 +2278,7 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, OM: Deref, L: Deref, CM
2259
2278
if !peer. handshake_complete ( ) { return ; }
2260
2279
self . message_handler . chan_handler . peer_disconnected ( & node_id) ;
2261
2280
self . message_handler . onion_message_handler . peer_disconnected ( & node_id) ;
2281
+ self . message_handler . custom_message_handler . peer_disconnected ( & node_id) ;
2262
2282
}
2263
2283
}
2264
2284
} ;
@@ -2553,6 +2573,9 @@ mod tests {
2553
2573
2554
2574
fn get_and_clear_pending_msg ( & self ) -> Vec < ( PublicKey , Self :: CustomMessage ) > { Vec :: new ( ) }
2555
2575
2576
+ fn peer_disconnected ( & self , _: & PublicKey ) { }
2577
+ fn peer_connected ( & self , _: & PublicKey , _: & msgs:: Init , _: bool ) -> Result < ( ) , ( ) > { Ok ( ( ) ) }
2578
+
2556
2579
fn provided_node_features ( & self ) -> NodeFeatures { NodeFeatures :: empty ( ) }
2557
2580
2558
2581
fn provided_init_features ( & self , _: & PublicKey ) -> InitFeatures {
0 commit comments