@@ -48,7 +48,7 @@ use crate::prelude::*;
4848/// # use lightning::chain::keysinterface::{InMemorySigner, KeysManager}; 
4949/// # use lightning::ln::msgs::DecodeError; 
5050/// # use lightning::ln::peer_handler::IgnoringMessageHandler; 
51- /// # use lightning::onion_message::{BlindedPath, CustomOnionMessageContents, Destination, OnionMessageContents, OnionMessenger}; 
51+ /// # use lightning::onion_message::{BlindedPath, CustomOnionMessageContents, Destination, MessageRouter,  OnionMessageContents, OnionMessenger}; 
5252/// # use lightning::util::logger::{Logger, Record}; 
5353/// # use lightning::util::ser::{Writeable, Writer}; 
5454/// # use lightning::io; 
@@ -57,6 +57,12 @@ use crate::prelude::*;
5757/// # impl Logger for FakeLogger { 
5858/// #     fn log(&self, record: &Record) { unimplemented!() } 
5959/// # } 
60+ /// # struct FakeMessageRouter {} 
61+ /// # impl MessageRouter for FakeMessageRouter { 
62+ /// #     fn find_route(&self, sender: &PublicKey, destination: &Destination) -> Vec<PublicKey> { 
63+ /// #         unimplemented!() 
64+ /// #     } 
65+ /// # } 
6066/// # let seed = [42u8; 32]; 
6167/// # let time = Duration::from_secs(123456); 
6268/// # let keys_manager = KeysManager::new(&seed, time.as_secs(), time.subsec_nanos()); 
@@ -66,11 +72,14 @@ use crate::prelude::*;
6672/// # let hop_node_id1 = PublicKey::from_secret_key(&secp_ctx, &node_secret); 
6773/// # let (hop_node_id2, hop_node_id3, hop_node_id4) = (hop_node_id1, hop_node_id1, hop_node_id1); 
6874/// # let destination_node_id = hop_node_id1; 
75+ /// # let message_router = Arc::new(FakeMessageRouter {}); 
6976/// # let custom_message_handler = IgnoringMessageHandler {}; 
7077/// # let offers_message_handler = IgnoringMessageHandler {}; 
7178/// // Create the onion messenger. This must use the same `keys_manager` as is passed to your 
7279/// // ChannelManager. 
73- /// let onion_messenger = OnionMessenger::new(&keys_manager, &keys_manager, logger, offers_message_handler, custom_message_handler); 
80+ /// let onion_messenger = OnionMessenger::new( 
81+ ///     &keys_manager, &keys_manager, logger, message_router, offers_message_handler, custom_message_handler 
82+ /// ); 
7483/// 
7584/// # struct YourCustomMessage {} 
7685/// impl Writeable for YourCustomMessage { 
@@ -107,11 +116,12 @@ use crate::prelude::*;
107116/// 
108117/// [offers]: <https://github.com/lightning/bolts/pull/798> 
109118/// [`OnionMessenger`]: crate::onion_message::OnionMessenger 
110- pub  struct  OnionMessenger < ES :  Deref ,  NS :  Deref ,  L :  Deref ,  OMH :  Deref ,  CMH :  Deref > 
119+ pub  struct  OnionMessenger < ES :  Deref ,  NS :  Deref ,  L :  Deref ,  MR :   Deref ,   OMH :  Deref ,  CMH :  Deref > 
111120where 
112121	ES :: Target :  EntropySource , 
113122	NS :: Target :  NodeSigner , 
114123	L :: Target :  Logger , 
124+ 	MR :: Target :  MessageRouter , 
115125	OMH :: Target :  OffersMessageHandler , 
116126	CMH ::  Target :  CustomOnionMessageHandler , 
117127{ 
@@ -120,10 +130,19 @@ where
120130	logger :  L , 
121131	pending_messages :  Mutex < HashMap < PublicKey ,  VecDeque < msgs:: OnionMessage > > > , 
122132	secp_ctx :  Secp256k1 < secp256k1:: All > , 
133+ 	message_router :  MR , 
123134	offers_handler :  OMH , 
124135	custom_handler :  CMH , 
125136} 
126137
138+ /// A trait defining behavior for routing an [`OnionMessage`]. 
139+ pub  trait  MessageRouter  { 
140+ 	/// Returns a route for sending an [`OnionMessage`] to the given [`Destination`]. 
141+  	/// 
142+  	/// [`OnionMessage`]: msgs::OnionMessage 
143+  	fn  find_route ( & self ,  sender :  & PublicKey ,  destination :  & Destination )  -> Vec < PublicKey > ; 
144+ } 
145+ 
127146/// The destination of an onion message. 
128147pub  enum  Destination  { 
129148	/// We're sending this onion message to a node. 
@@ -192,18 +211,21 @@ pub trait CustomOnionMessageHandler {
192211 	fn  read_custom_message < R :  io:: Read > ( & self ,  message_type :  u64 ,  buffer :  & mut  R )  -> Result < Option < Self :: CustomMessage > ,  msgs:: DecodeError > ; 
193212} 
194213
195- impl < ES :  Deref ,  NS :  Deref ,  L :  Deref ,  OMH :  Deref ,  CMH :  Deref >  OnionMessenger < ES ,  NS ,  L ,  OMH ,  CMH > 
214+ impl < ES :  Deref ,  NS :  Deref ,  L :  Deref ,  MR :  Deref ,  OMH :  Deref ,  CMH :  Deref > 
215+ OnionMessenger < ES ,  NS ,  L ,  MR ,  OMH ,  CMH > 
196216where 
197217	ES :: Target :  EntropySource , 
198218	NS :: Target :  NodeSigner , 
199219	L :: Target :  Logger , 
220+ 	MR :: Target :  MessageRouter , 
200221	OMH :: Target :  OffersMessageHandler , 
201222	CMH :: Target :  CustomOnionMessageHandler , 
202223{ 
203224	/// Constructs a new `OnionMessenger` to send, forward, and delegate received onion messages to 
204225 	/// their respective handlers. 
205226 	pub  fn  new ( 
206- 		entropy_source :  ES ,  node_signer :  NS ,  logger :  L ,  offers_handler :  OMH ,  custom_handler :  CMH 
227+ 		entropy_source :  ES ,  node_signer :  NS ,  logger :  L ,  message_router :  MR ,  offers_handler :  OMH , 
228+ 		custom_handler :  CMH 
207229	)  -> Self  { 
208230		let  mut  secp_ctx = Secp256k1 :: new ( ) ; 
209231		secp_ctx. seeded_randomize ( & entropy_source. get_secure_random_bytes ( ) ) ; 
@@ -213,6 +235,7 @@ where
213235			pending_messages :  Mutex :: new ( HashMap :: new ( ) ) , 
214236			secp_ctx, 
215237			logger, 
238+ 			message_router, 
216239			offers_handler, 
217240			custom_handler, 
218241		} 
@@ -308,12 +331,13 @@ fn outbound_buffer_full(peer_node_id: &PublicKey, buffer: &HashMap<PublicKey, Ve
308331	false 
309332} 
310333
311- impl < ES :  Deref ,  NS :  Deref ,  L :  Deref ,  OMH :  Deref ,  CMH :  Deref >  OnionMessageHandler 
312- for  OnionMessenger < ES ,  NS ,  L ,  OMH ,  CMH > 
334+ impl < ES :  Deref ,  NS :  Deref ,  L :  Deref ,  MR :   Deref ,   OMH :  Deref ,  CMH :  Deref >  OnionMessageHandler 
335+ for  OnionMessenger < ES ,  NS ,  L ,  MR ,   OMH ,  CMH > 
313336where 
314337	ES :: Target :  EntropySource , 
315338	NS :: Target :  NodeSigner , 
316339	L :: Target :  Logger , 
340+ 	MR :: Target :  MessageRouter , 
317341	OMH :: Target :  OffersMessageHandler , 
318342	CMH :: Target :  CustomOnionMessageHandler  + Sized , 
319343{ 
@@ -457,12 +481,13 @@ where
457481	} 
458482} 
459483
460- impl < ES :  Deref ,  NS :  Deref ,  L :  Deref ,  OMH :  Deref ,  CMH :  Deref >  OnionMessageProvider 
461- for  OnionMessenger < ES ,  NS ,  L ,  OMH ,  CMH > 
484+ impl < ES :  Deref ,  NS :  Deref ,  L :  Deref ,  MR :   Deref ,   OMH :  Deref ,  CMH :  Deref >  OnionMessageProvider 
485+ for  OnionMessenger < ES ,  NS ,  L ,  MR ,   OMH ,  CMH > 
462486where 
463487	ES :: Target :  EntropySource , 
464488	NS :: Target :  NodeSigner , 
465489	L :: Target :  Logger , 
490+ 	MR :: Target :  MessageRouter , 
466491	OMH :: Target :  OffersMessageHandler , 
467492	CMH :: Target :  CustomOnionMessageHandler , 
468493{ 
@@ -484,10 +509,11 @@ where
484509/// 
485510/// [`SimpleArcChannelManager`]: crate::ln::channelmanager::SimpleArcChannelManager 
486511/// [`SimpleArcPeerManager`]: crate::ln::peer_handler::SimpleArcPeerManager 
487- pub  type  SimpleArcOnionMessenger < M ,  T ,  F ,  L >  = OnionMessenger < 
512+ pub  type  SimpleArcOnionMessenger < M ,  T ,  F ,  L ,   R >  = OnionMessenger < 
488513	Arc < KeysManager > , 
489514	Arc < KeysManager > , 
490515	Arc < L > , 
516+ 	Arc < R > , 
491517	Arc < SimpleArcChannelManager < M ,  T ,  F ,  L > > , 
492518	IgnoringMessageHandler 
493519> ; 
@@ -499,11 +525,12 @@ pub type SimpleArcOnionMessenger<M, T, F, L> = OnionMessenger<
499525/// 
500526/// [`SimpleRefChannelManager`]: crate::ln::channelmanager::SimpleRefChannelManager 
501527/// [`SimpleRefPeerManager`]: crate::ln::peer_handler::SimpleRefPeerManager 
502- pub  type  SimpleRefOnionMessenger < ' a ,  ' b ,  ' c ,  ' d ,  ' e ,  ' f ,  ' g ,  ' h ,  ' i ,  M ,  T ,  F ,  L >  = OnionMessenger < 
528+ pub  type  SimpleRefOnionMessenger < ' a ,  ' b ,  ' c ,  ' d ,  ' e ,  ' f ,  ' g ,  ' h ,  ' i ,  ' j ,   M ,  T ,  F ,  L ,   R >  = OnionMessenger < 
503529	& ' c  KeysManager , 
504530	& ' c  KeysManager , 
505531	& ' g  L , 
506- 	& ' i  SimpleRefChannelManager < ' a ,  ' b ,  ' c ,  ' d ,  ' e ,  ' f ,  ' g ,  ' h ,  M ,  T ,  F ,  L > , 
532+ 	& ' i  R , 
533+ 	& ' j  SimpleRefChannelManager < ' a ,  ' b ,  ' c ,  ' d ,  ' e ,  ' f ,  ' g ,  ' h ,  M ,  T ,  F ,  L > , 
507534	IgnoringMessageHandler 
508535> ; 
509536
0 commit comments