@@ -47,7 +47,7 @@ use crate::prelude::*;
4747/// # use lightning::blinded_path::BlindedPath;
4848/// # use lightning::sign::KeysManager;
4949/// # use lightning::ln::peer_handler::IgnoringMessageHandler;
50- /// # use lightning::onion_message::{CustomOnionMessageContents, Destination, OnionMessageContents, OnionMessenger};
50+ /// # use lightning::onion_message::{CustomOnionMessageContents, Destination, MessageRouter, OnionMessageContents, OnionMessenger};
5151/// # use lightning::util::logger::{Logger, Record};
5252/// # use lightning::util::ser::{Writeable, Writer};
5353/// # use lightning::io;
@@ -56,6 +56,12 @@ use crate::prelude::*;
5656/// # impl Logger for FakeLogger {
5757/// # fn log(&self, record: &Record) { unimplemented!() }
5858/// # }
59+ /// # struct FakeMessageRouter {}
60+ /// # impl MessageRouter for FakeMessageRouter {
61+ /// # fn find_route(&self, sender: &PublicKey, destination: &Destination) -> Vec<PublicKey> {
62+ /// # unimplemented!()
63+ /// # }
64+ /// # }
5965/// # let seed = [42u8; 32];
6066/// # let time = Duration::from_secs(123456);
6167/// # let keys_manager = KeysManager::new(&seed, time.as_secs(), time.subsec_nanos());
@@ -65,11 +71,15 @@ use crate::prelude::*;
6571/// # let hop_node_id1 = PublicKey::from_secret_key(&secp_ctx, &node_secret);
6672/// # let (hop_node_id2, hop_node_id3, hop_node_id4) = (hop_node_id1, hop_node_id1, hop_node_id1);
6773/// # let destination_node_id = hop_node_id1;
74+ /// # let message_router = Arc::new(FakeMessageRouter {});
6875/// # let custom_message_handler = IgnoringMessageHandler {};
6976/// # let offers_message_handler = IgnoringMessageHandler {};
7077/// // Create the onion messenger. This must use the same `keys_manager` as is passed to your
7178/// // ChannelManager.
72- /// let onion_messenger = OnionMessenger::new(&keys_manager, &keys_manager, logger, &offers_message_handler, &custom_message_handler);
79+ /// let onion_messenger = OnionMessenger::new(
80+ /// &keys_manager, &keys_manager, logger, message_router, &offers_message_handler,
81+ /// &custom_message_handler
82+ /// );
7383///
7484/// # struct YourCustomMessage {}
7585/// impl Writeable for YourCustomMessage {
@@ -106,11 +116,12 @@ use crate::prelude::*;
106116///
107117/// [offers]: <https://github.com/lightning/bolts/pull/798>
108118/// [`OnionMessenger`]: crate::onion_message::OnionMessenger
109- 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 >
110120where
111121 ES :: Target : EntropySource ,
112122 NS :: Target : NodeSigner ,
113123 L :: Target : Logger ,
124+ MR :: Target : MessageRouter ,
114125 OMH :: Target : OffersMessageHandler ,
115126 CMH :: Target : CustomOnionMessageHandler ,
116127{
@@ -119,10 +130,21 @@ where
119130 logger : L ,
120131 pending_messages : Mutex < HashMap < PublicKey , VecDeque < msgs:: OnionMessage > > > ,
121132 secp_ctx : Secp256k1 < secp256k1:: All > ,
133+ message_router : MR ,
122134 offers_handler : OMH ,
123135 custom_handler : CMH ,
124136}
125137
138+ /// A trait defining behavior for routing an [`OnionMessage`].
139+ ///
140+ /// [`OnionMessage`]: msgs::OnionMessage
141+ pub trait MessageRouter {
142+ /// Returns a route for sending an [`OnionMessage`] to the given [`Destination`].
143+ ///
144+ /// [`OnionMessage`]: msgs::OnionMessage
145+ fn find_route ( & self , sender : & PublicKey , destination : & Destination ) -> Vec < PublicKey > ;
146+ }
147+
126148/// The destination of an onion message.
127149pub enum Destination {
128150 /// We're sending this onion message to a node.
@@ -191,18 +213,21 @@ pub trait CustomOnionMessageHandler {
191213 fn read_custom_message < R : io:: Read > ( & self , message_type : u64 , buffer : & mut R ) -> Result < Option < Self :: CustomMessage > , msgs:: DecodeError > ;
192214}
193215
194- impl < ES : Deref , NS : Deref , L : Deref , OMH : Deref , CMH : Deref > OnionMessenger < ES , NS , L , OMH , CMH >
216+ impl < ES : Deref , NS : Deref , L : Deref , MR : Deref , OMH : Deref , CMH : Deref >
217+ OnionMessenger < ES , NS , L , MR , OMH , CMH >
195218where
196219 ES :: Target : EntropySource ,
197220 NS :: Target : NodeSigner ,
198221 L :: Target : Logger ,
222+ MR :: Target : MessageRouter ,
199223 OMH :: Target : OffersMessageHandler ,
200224 CMH :: Target : CustomOnionMessageHandler ,
201225{
202226 /// Constructs a new `OnionMessenger` to send, forward, and delegate received onion messages to
203227 /// their respective handlers.
204228 pub fn new (
205- entropy_source : ES , node_signer : NS , logger : L , offers_handler : OMH , custom_handler : CMH
229+ entropy_source : ES , node_signer : NS , logger : L , message_router : MR , offers_handler : OMH ,
230+ custom_handler : CMH
206231 ) -> Self {
207232 let mut secp_ctx = Secp256k1 :: new ( ) ;
208233 secp_ctx. seeded_randomize ( & entropy_source. get_secure_random_bytes ( ) ) ;
@@ -212,6 +237,7 @@ where
212237 pending_messages : Mutex :: new ( HashMap :: new ( ) ) ,
213238 secp_ctx,
214239 logger,
240+ message_router,
215241 offers_handler,
216242 custom_handler,
217243 }
@@ -307,12 +333,13 @@ fn outbound_buffer_full(peer_node_id: &PublicKey, buffer: &HashMap<PublicKey, Ve
307333 false
308334}
309335
310- impl < ES : Deref , NS : Deref , L : Deref , OMH : Deref , CMH : Deref > OnionMessageHandler
311- for OnionMessenger < ES , NS , L , OMH , CMH >
336+ impl < ES : Deref , NS : Deref , L : Deref , MR : Deref , OMH : Deref , CMH : Deref > OnionMessageHandler
337+ for OnionMessenger < ES , NS , L , MR , OMH , CMH >
312338where
313339 ES :: Target : EntropySource ,
314340 NS :: Target : NodeSigner ,
315341 L :: Target : Logger ,
342+ MR :: Target : MessageRouter ,
316343 OMH :: Target : OffersMessageHandler ,
317344 CMH :: Target : CustomOnionMessageHandler + Sized ,
318345{
@@ -456,12 +483,13 @@ where
456483 }
457484}
458485
459- impl < ES : Deref , NS : Deref , L : Deref , OMH : Deref , CMH : Deref > OnionMessageProvider
460- for OnionMessenger < ES , NS , L , OMH , CMH >
486+ impl < ES : Deref , NS : Deref , L : Deref , MR : Deref , OMH : Deref , CMH : Deref > OnionMessageProvider
487+ for OnionMessenger < ES , NS , L , MR , OMH , CMH >
461488where
462489 ES :: Target : EntropySource ,
463490 NS :: Target : NodeSigner ,
464491 L :: Target : Logger ,
492+ MR :: Target : MessageRouter ,
465493 OMH :: Target : OffersMessageHandler ,
466494 CMH :: Target : CustomOnionMessageHandler ,
467495{
@@ -483,10 +511,11 @@ where
483511///
484512/// [`SimpleArcChannelManager`]: crate::ln::channelmanager::SimpleArcChannelManager
485513/// [`SimpleArcPeerManager`]: crate::ln::peer_handler::SimpleArcPeerManager
486- pub type SimpleArcOnionMessenger < M , T , F , L > = OnionMessenger <
514+ pub type SimpleArcOnionMessenger < M , T , F , L , R > = OnionMessenger <
487515 Arc < KeysManager > ,
488516 Arc < KeysManager > ,
489517 Arc < L > ,
518+ Arc < R > ,
490519 Arc < SimpleArcChannelManager < M , T , F , L > > ,
491520 IgnoringMessageHandler
492521> ;
@@ -498,11 +527,12 @@ pub type SimpleArcOnionMessenger<M, T, F, L> = OnionMessenger<
498527///
499528/// [`SimpleRefChannelManager`]: crate::ln::channelmanager::SimpleRefChannelManager
500529/// [`SimpleRefPeerManager`]: crate::ln::peer_handler::SimpleRefPeerManager
501- pub type SimpleRefOnionMessenger < ' a , ' b , ' c , ' d , ' e , ' f , ' g , ' h , ' i , M , T , F , L > = OnionMessenger <
530+ pub type SimpleRefOnionMessenger < ' a , ' b , ' c , ' d , ' e , ' f , ' g , ' h , ' i , ' j , M , T , F , L , R > = OnionMessenger <
502531 & ' c KeysManager ,
503532 & ' c KeysManager ,
504533 & ' g L ,
505- & ' i SimpleRefChannelManager < ' a , ' b , ' c , ' d , ' e , ' f , ' g , ' h , M , T , F , L > ,
534+ & ' i R ,
535+ & ' j SimpleRefChannelManager < ' a , ' b , ' c , ' d , ' e , ' f , ' g , ' h , M , T , F , L > ,
506536 IgnoringMessageHandler
507537> ;
508538
0 commit comments