@@ -46,7 +46,7 @@ use crate::prelude::*;
4646/// # use lightning::blinded_path::BlindedPath;
4747/// # use lightning::sign::KeysManager;
4848/// # use lightning::ln::peer_handler::IgnoringMessageHandler;
49- /// # use lightning::onion_message::{CustomOnionMessageContents, Destination, OnionMessageContents, OnionMessagePath, OnionMessenger};
49+ /// # use lightning::onion_message::{CustomOnionMessageContents, Destination, MessageRouter, OnionMessageContents, OnionMessagePath, OnionMessenger};
5050/// # use lightning::util::logger::{Logger, Record};
5151/// # use lightning::util::ser::{Writeable, Writer};
5252/// # use lightning::io;
@@ -55,6 +55,12 @@ use crate::prelude::*;
5555/// # impl Logger for FakeLogger {
5656/// # fn log(&self, record: &Record) { unimplemented!() }
5757/// # }
58+ /// # struct FakeMessageRouter {}
59+ /// # impl MessageRouter for FakeMessageRouter {
60+ /// # fn find_path(&self, sender: PublicKey, peers: Vec<PublicKey>, destination: Destination) -> Result<OnionMessagePath, ()> {
61+ /// # unimplemented!()
62+ /// # }
63+ /// # }
5864/// # let seed = [42u8; 32];
5965/// # let time = Duration::from_secs(123456);
6066/// # let keys_manager = KeysManager::new(&seed, time.as_secs(), time.subsec_nanos());
@@ -64,11 +70,15 @@ use crate::prelude::*;
6470/// # let hop_node_id1 = PublicKey::from_secret_key(&secp_ctx, &node_secret);
6571/// # let (hop_node_id2, hop_node_id3, hop_node_id4) = (hop_node_id1, hop_node_id1, hop_node_id1);
6672/// # let destination_node_id = hop_node_id1;
73+ /// # let message_router = Arc::new(FakeMessageRouter {});
6774/// # let custom_message_handler = IgnoringMessageHandler {};
6875/// # let offers_message_handler = IgnoringMessageHandler {};
6976/// // Create the onion messenger. This must use the same `keys_manager` as is passed to your
7077/// // ChannelManager.
71- /// let onion_messenger = OnionMessenger::new(&keys_manager, &keys_manager, logger, &offers_message_handler, &custom_message_handler);
78+ /// let onion_messenger = OnionMessenger::new(
79+ /// &keys_manager, &keys_manager, logger, message_router, &offers_message_handler,
80+ /// &custom_message_handler
81+ /// );
7282///
7383/// # struct YourCustomMessage {}
7484/// impl Writeable for YourCustomMessage {
@@ -111,11 +121,12 @@ use crate::prelude::*;
111121///
112122/// [offers]: <https://github.com/lightning/bolts/pull/798>
113123/// [`OnionMessenger`]: crate::onion_message::OnionMessenger
114- pub struct OnionMessenger < ES : Deref , NS : Deref , L : Deref , OMH : Deref , CMH : Deref >
124+ pub struct OnionMessenger < ES : Deref , NS : Deref , L : Deref , MR : Deref , OMH : Deref , CMH : Deref >
115125where
116126 ES :: Target : EntropySource ,
117127 NS :: Target : NodeSigner ,
118128 L :: Target : Logger ,
129+ MR :: Target : MessageRouter ,
119130 OMH :: Target : OffersMessageHandler ,
120131 CMH :: Target : CustomOnionMessageHandler ,
121132{
@@ -124,10 +135,23 @@ where
124135 logger : L ,
125136 pending_messages : Mutex < HashMap < PublicKey , VecDeque < msgs:: OnionMessage > > > ,
126137 secp_ctx : Secp256k1 < secp256k1:: All > ,
138+ message_router : MR ,
127139 offers_handler : OMH ,
128140 custom_handler : CMH ,
129141}
130142
143+ /// A trait defining behavior for routing an [`OnionMessage`].
144+ ///
145+ /// [`OnionMessage`]: msgs::OnionMessage
146+ pub trait MessageRouter {
147+ /// Returns a route for sending an [`OnionMessage`] to the given [`Destination`].
148+ ///
149+ /// [`OnionMessage`]: msgs::OnionMessage
150+ fn find_path (
151+ & self , sender : PublicKey , peers : Vec < PublicKey > , destination : Destination
152+ ) -> Result < OnionMessagePath , ( ) > ;
153+ }
154+
131155/// A path for sending an [`msgs::OnionMessage`].
132156#[ derive( Clone ) ]
133157pub struct OnionMessagePath {
@@ -207,18 +231,21 @@ pub trait CustomOnionMessageHandler {
207231 fn read_custom_message < R : io:: Read > ( & self , message_type : u64 , buffer : & mut R ) -> Result < Option < Self :: CustomMessage > , msgs:: DecodeError > ;
208232}
209233
210- impl < ES : Deref , NS : Deref , L : Deref , OMH : Deref , CMH : Deref > OnionMessenger < ES , NS , L , OMH , CMH >
234+ impl < ES : Deref , NS : Deref , L : Deref , MR : Deref , OMH : Deref , CMH : Deref >
235+ OnionMessenger < ES , NS , L , MR , OMH , CMH >
211236where
212237 ES :: Target : EntropySource ,
213238 NS :: Target : NodeSigner ,
214239 L :: Target : Logger ,
240+ MR :: Target : MessageRouter ,
215241 OMH :: Target : OffersMessageHandler ,
216242 CMH :: Target : CustomOnionMessageHandler ,
217243{
218244 /// Constructs a new `OnionMessenger` to send, forward, and delegate received onion messages to
219245 /// their respective handlers.
220246 pub fn new (
221- entropy_source : ES , node_signer : NS , logger : L , offers_handler : OMH , custom_handler : CMH
247+ entropy_source : ES , node_signer : NS , logger : L , message_router : MR , offers_handler : OMH ,
248+ custom_handler : CMH
222249 ) -> Self {
223250 let mut secp_ctx = Secp256k1 :: new ( ) ;
224251 secp_ctx. seeded_randomize ( & entropy_source. get_secure_random_bytes ( ) ) ;
@@ -228,6 +255,7 @@ where
228255 pending_messages : Mutex :: new ( HashMap :: new ( ) ) ,
229256 secp_ctx,
230257 logger,
258+ message_router,
231259 offers_handler,
232260 custom_handler,
233261 }
@@ -328,12 +356,13 @@ fn outbound_buffer_full(peer_node_id: &PublicKey, buffer: &HashMap<PublicKey, Ve
328356 false
329357}
330358
331- impl < ES : Deref , NS : Deref , L : Deref , OMH : Deref , CMH : Deref > OnionMessageHandler
332- for OnionMessenger < ES , NS , L , OMH , CMH >
359+ impl < ES : Deref , NS : Deref , L : Deref , MR : Deref , OMH : Deref , CMH : Deref > OnionMessageHandler
360+ for OnionMessenger < ES , NS , L , MR , OMH , CMH >
333361where
334362 ES :: Target : EntropySource ,
335363 NS :: Target : NodeSigner ,
336364 L :: Target : Logger ,
365+ MR :: Target : MessageRouter ,
337366 OMH :: Target : OffersMessageHandler ,
338367 CMH :: Target : CustomOnionMessageHandler + Sized ,
339368{
@@ -478,12 +507,13 @@ where
478507 }
479508}
480509
481- impl < ES : Deref , NS : Deref , L : Deref , OMH : Deref , CMH : Deref > OnionMessageProvider
482- for OnionMessenger < ES , NS , L , OMH , CMH >
510+ impl < ES : Deref , NS : Deref , L : Deref , MR : Deref , OMH : Deref , CMH : Deref > OnionMessageProvider
511+ for OnionMessenger < ES , NS , L , MR , OMH , CMH >
483512where
484513 ES :: Target : EntropySource ,
485514 NS :: Target : NodeSigner ,
486515 L :: Target : Logger ,
516+ MR :: Target : MessageRouter ,
487517 OMH :: Target : OffersMessageHandler ,
488518 CMH :: Target : CustomOnionMessageHandler ,
489519{
@@ -505,10 +535,11 @@ where
505535///
506536/// [`SimpleArcChannelManager`]: crate::ln::channelmanager::SimpleArcChannelManager
507537/// [`SimpleArcPeerManager`]: crate::ln::peer_handler::SimpleArcPeerManager
508- pub type SimpleArcOnionMessenger < L > = OnionMessenger <
538+ pub type SimpleArcOnionMessenger < L , R > = OnionMessenger <
509539 Arc < KeysManager > ,
510540 Arc < KeysManager > ,
511541 Arc < L > ,
542+ Arc < R > ,
512543 IgnoringMessageHandler ,
513544 IgnoringMessageHandler
514545> ;
@@ -520,10 +551,11 @@ pub type SimpleArcOnionMessenger<L> = OnionMessenger<
520551///
521552/// [`SimpleRefChannelManager`]: crate::ln::channelmanager::SimpleRefChannelManager
522553/// [`SimpleRefPeerManager`]: crate::ln::peer_handler::SimpleRefPeerManager
523- pub type SimpleRefOnionMessenger < ' a , ' b , L > = OnionMessenger <
554+ pub type SimpleRefOnionMessenger < ' a , ' b , ' c , L , R > = OnionMessenger <
524555 & ' a KeysManager ,
525556 & ' a KeysManager ,
526557 & ' b L ,
558+ & ' c R ,
527559 IgnoringMessageHandler ,
528560 IgnoringMessageHandler
529561> ;
0 commit comments