@@ -47,7 +47,7 @@ use crate::prelude::*;
4747/// # use bitcoin::secp256k1::{PublicKey, Secp256k1, SecretKey};
4848/// # use lightning::chain::keysinterface::KeysManager;
4949/// # use lightning::ln::peer_handler::IgnoringMessageHandler;
50- /// # use lightning::onion_message::{BlindedPath, CustomOnionMessageContents, Destination, OnionMessageContents, OnionMessenger};
50+ /// # use lightning::onion_message::{BlindedPath, 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,19 @@ 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+ 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+
126146/// The destination of an onion message.
127147pub enum Destination {
128148 /// We're sending this onion message to a node.
@@ -191,18 +211,21 @@ pub trait CustomOnionMessageHandler {
191211 fn read_custom_message < R : io:: Read > ( & self , message_type : u64 , buffer : & mut R ) -> Result < Option < Self :: CustomMessage > , msgs:: DecodeError > ;
192212}
193213
194- 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 >
195216where
196217 ES :: Target : EntropySource ,
197218 NS :: Target : NodeSigner ,
198219 L :: Target : Logger ,
220+ MR :: Target : MessageRouter ,
199221 OMH :: Target : OffersMessageHandler ,
200222 CMH :: Target : CustomOnionMessageHandler ,
201223{
202224 /// Constructs a new `OnionMessenger` to send, forward, and delegate received onion messages to
203225 /// their respective handlers.
204226 pub fn new (
205- 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
206229 ) -> Self {
207230 let mut secp_ctx = Secp256k1 :: new ( ) ;
208231 secp_ctx. seeded_randomize ( & entropy_source. get_secure_random_bytes ( ) ) ;
@@ -212,6 +235,7 @@ where
212235 pending_messages : Mutex :: new ( HashMap :: new ( ) ) ,
213236 secp_ctx,
214237 logger,
238+ message_router,
215239 offers_handler,
216240 custom_handler,
217241 }
@@ -307,12 +331,13 @@ fn outbound_buffer_full(peer_node_id: &PublicKey, buffer: &HashMap<PublicKey, Ve
307331 false
308332}
309333
310- impl < ES : Deref , NS : Deref , L : Deref , OMH : Deref , CMH : Deref > OnionMessageHandler
311- 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 >
312336where
313337 ES :: Target : EntropySource ,
314338 NS :: Target : NodeSigner ,
315339 L :: Target : Logger ,
340+ MR :: Target : MessageRouter ,
316341 OMH :: Target : OffersMessageHandler ,
317342 CMH :: Target : CustomOnionMessageHandler + Sized ,
318343{
@@ -456,12 +481,13 @@ where
456481 }
457482}
458483
459- impl < ES : Deref , NS : Deref , L : Deref , OMH : Deref , CMH : Deref > OnionMessageProvider
460- 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 >
461486where
462487 ES :: Target : EntropySource ,
463488 NS :: Target : NodeSigner ,
464489 L :: Target : Logger ,
490+ MR :: Target : MessageRouter ,
465491 OMH :: Target : OffersMessageHandler ,
466492 CMH :: Target : CustomOnionMessageHandler ,
467493{
@@ -483,10 +509,11 @@ where
483509///
484510/// [`SimpleArcChannelManager`]: crate::ln::channelmanager::SimpleArcChannelManager
485511/// [`SimpleArcPeerManager`]: crate::ln::peer_handler::SimpleArcPeerManager
486- pub type SimpleArcOnionMessenger < M , T , F , L > = OnionMessenger <
512+ pub type SimpleArcOnionMessenger < M , T , F , L , R > = OnionMessenger <
487513 Arc < KeysManager > ,
488514 Arc < KeysManager > ,
489515 Arc < L > ,
516+ Arc < R > ,
490517 Arc < SimpleArcChannelManager < M , T , F , L > > ,
491518 IgnoringMessageHandler
492519> ;
@@ -498,11 +525,12 @@ pub type SimpleArcOnionMessenger<M, T, F, L> = OnionMessenger<
498525///
499526/// [`SimpleRefChannelManager`]: crate::ln::channelmanager::SimpleRefChannelManager
500527/// [`SimpleRefPeerManager`]: crate::ln::peer_handler::SimpleRefPeerManager
501- 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 <
502529 & ' c KeysManager ,
503530 & ' c KeysManager ,
504531 & ' g L ,
505- & ' 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 > ,
506534 IgnoringMessageHandler
507535> ;
508536
0 commit comments