@@ -23,6 +23,7 @@ use crate::ln::msgs::{self, OnionMessageHandler};
2323use crate :: ln:: onion_utils;
2424use crate :: ln:: peer_handler:: IgnoringMessageHandler ;
2525pub use super :: packet:: { CustomOnionMessageContents , OnionMessageContents } ;
26+ use super :: offers:: OffersMessageHandler ;
2627use super :: packet:: { BIG_PACKET_HOP_DATA_LEN , ForwardControlTlvs , Packet , Payload , ReceiveControlTlvs , SMALL_PACKET_HOP_DATA_LEN } ;
2728use crate :: util:: logger:: Logger ;
2829use crate :: util:: ser:: Writeable ;
@@ -63,10 +64,11 @@ use crate::prelude::*;
6364/// # let hop_node_id1 = PublicKey::from_secret_key(&secp_ctx, &node_secret);
6465/// # let (hop_node_id2, hop_node_id3, hop_node_id4) = (hop_node_id1, hop_node_id1, hop_node_id1);
6566/// # let destination_node_id = hop_node_id1;
66- /// # let your_custom_message_handler = IgnoringMessageHandler {};
67+ /// # let custom_message_handler = IgnoringMessageHandler {};
68+ /// # let offers_message_handler = IgnoringMessageHandler {};
6769/// // Create the onion messenger. This must use the same `keys_manager` as is passed to your
6870/// // ChannelManager.
69- /// let onion_messenger = OnionMessenger::new(&keys_manager, &keys_manager, logger, &your_custom_message_handler );
71+ /// let onion_messenger = OnionMessenger::new(&keys_manager, &keys_manager, logger, &offers_message_handler, &custom_message_handler );
7072///
7173/// # struct YourCustomMessage {}
7274/// impl Writeable for YourCustomMessage {
@@ -103,20 +105,21 @@ use crate::prelude::*;
103105///
104106/// [offers]: <https://github.com/lightning/bolts/pull/798>
105107/// [`OnionMessenger`]: crate::onion_message::OnionMessenger
106- pub struct OnionMessenger < ES : Deref , NS : Deref , L : Deref , CMH : Deref >
107- where ES :: Target : EntropySource ,
108- NS :: Target : NodeSigner ,
109- L :: Target : Logger ,
110- CMH :: Target : CustomOnionMessageHandler ,
108+ pub struct OnionMessenger < ES : Deref , NS : Deref , L : Deref , OMH : Deref , CMH : Deref >
109+ where
110+ ES :: Target : EntropySource ,
111+ NS :: Target : NodeSigner ,
112+ L :: Target : Logger ,
113+ OMH :: Target : OffersMessageHandler ,
114+ CMH :: Target : CustomOnionMessageHandler ,
111115{
112116 entropy_source : ES ,
113117 node_signer : NS ,
114118 logger : L ,
115119 pending_messages : Mutex < HashMap < PublicKey , VecDeque < msgs:: OnionMessage > > > ,
116120 secp_ctx : Secp256k1 < secp256k1:: All > ,
121+ offers_handler : OMH ,
117122 custom_handler : CMH ,
118- // Coming soon:
119- // invoice_handler: InvoiceHandler,
120123}
121124
122125/// The destination of an onion message.
@@ -187,15 +190,19 @@ pub trait CustomOnionMessageHandler {
187190 fn read_custom_message < R : io:: Read > ( & self , message_type : u64 , buffer : & mut R ) -> Result < Option < Self :: CustomMessage > , msgs:: DecodeError > ;
188191}
189192
190- impl < ES : Deref , NS : Deref , L : Deref , CMH : Deref > OnionMessenger < ES , NS , L , CMH >
191- where ES :: Target : EntropySource ,
192- NS :: Target : NodeSigner ,
193- L :: Target : Logger ,
194- CMH :: Target : CustomOnionMessageHandler ,
193+ impl < ES : Deref , NS : Deref , L : Deref , OMH : Deref , CMH : Deref > OnionMessenger < ES , NS , L , OMH , CMH >
194+ where
195+ ES :: Target : EntropySource ,
196+ NS :: Target : NodeSigner ,
197+ L :: Target : Logger ,
198+ OMH :: Target : OffersMessageHandler ,
199+ CMH :: Target : CustomOnionMessageHandler ,
195200{
196201 /// Constructs a new `OnionMessenger` to send, forward, and delegate received onion messages to
197202 /// their respective handlers.
198- pub fn new ( entropy_source : ES , node_signer : NS , logger : L , custom_handler : CMH ) -> Self {
203+ pub fn new (
204+ entropy_source : ES , node_signer : NS , logger : L , offers_handler : OMH , custom_handler : CMH
205+ ) -> Self {
199206 let mut secp_ctx = Secp256k1 :: new ( ) ;
200207 secp_ctx. seeded_randomize ( & entropy_source. get_secure_random_bytes ( ) ) ;
201208 OnionMessenger {
@@ -204,6 +211,7 @@ impl<ES: Deref, NS: Deref, L: Deref, CMH: Deref> OnionMessenger<ES, NS, L, CMH>
204211 pending_messages : Mutex :: new ( HashMap :: new ( ) ) ,
205212 secp_ctx,
206213 logger,
214+ offers_handler,
207215 custom_handler,
208216 }
209217 }
@@ -298,11 +306,14 @@ fn outbound_buffer_full(peer_node_id: &PublicKey, buffer: &HashMap<PublicKey, Ve
298306 false
299307}
300308
301- impl < ES : Deref , NS : Deref , L : Deref , CMH : Deref > OnionMessageHandler for OnionMessenger < ES , NS , L , CMH >
302- where ES :: Target : EntropySource ,
303- NS :: Target : NodeSigner ,
304- L :: Target : Logger + Sized ,
305- CMH :: Target : CustomOnionMessageHandler + Sized ,
309+ impl < ES : Deref , NS : Deref , L : Deref , OMH : Deref , CMH : Deref > OnionMessageHandler
310+ for OnionMessenger < ES , NS , L , OMH , CMH >
311+ where
312+ ES :: Target : EntropySource ,
313+ NS :: Target : NodeSigner ,
314+ L :: Target : Logger ,
315+ OMH :: Target : OffersMessageHandler ,
316+ CMH :: Target : CustomOnionMessageHandler + Sized ,
306317{
307318 /// Handle an incoming onion message. Currently, if a message was destined for us we will log, but
308319 /// soon we'll delegate the onion message to a handler that can generate invoices or send
@@ -342,7 +353,7 @@ impl<ES: Deref, NS: Deref, L: Deref, CMH: Deref> OnionMessageHandler for OnionMe
342353 "Received an onion message with path_id {:02x?} and {} reply_path" ,
343354 path_id, if reply_path. is_some ( ) { "a" } else { "no" } ) ;
344355 match message {
345- OnionMessageContents :: Offers ( _msg ) => todo ! ( ) ,
356+ OnionMessageContents :: Offers ( msg ) => self . offers_handler . handle_message ( msg ) ,
346357 OnionMessageContents :: Custom ( msg) => self . custom_handler . handle_custom_message ( msg) ,
347358 }
348359 } ,
@@ -445,11 +456,14 @@ impl<ES: Deref, NS: Deref, L: Deref, CMH: Deref> OnionMessageHandler for OnionMe
445456 }
446457}
447458
448- impl < ES : Deref , NS : Deref , L : Deref , CMH : Deref > OnionMessageProvider for OnionMessenger < ES , NS , L , CMH >
449- where ES :: Target : EntropySource ,
450- NS :: Target : NodeSigner ,
451- L :: Target : Logger ,
452- CMH :: Target : CustomOnionMessageHandler ,
459+ impl < ES : Deref , NS : Deref , L : Deref , OMH : Deref , CMH : Deref > OnionMessageProvider
460+ for OnionMessenger < ES , NS , L , OMH , CMH >
461+ where
462+ ES :: Target : EntropySource ,
463+ NS :: Target : NodeSigner ,
464+ L :: Target : Logger ,
465+ OMH :: Target : OffersMessageHandler ,
466+ CMH :: Target : CustomOnionMessageHandler ,
453467{
454468 fn next_onion_message_for_peer ( & self , peer_node_id : PublicKey ) -> Option < msgs:: OnionMessage > {
455469 let mut pending_msgs = self . pending_messages . lock ( ) . unwrap ( ) ;
@@ -469,15 +483,28 @@ impl<ES: Deref, NS: Deref, L: Deref, CMH: Deref> OnionMessageProvider for OnionM
469483///
470484/// [`SimpleArcChannelManager`]: crate::ln::channelmanager::SimpleArcChannelManager
471485/// [`SimpleArcPeerManager`]: crate::ln::peer_handler::SimpleArcPeerManager
472- pub type SimpleArcOnionMessenger < L > = OnionMessenger < Arc < KeysManager > , Arc < KeysManager > , Arc < L > , IgnoringMessageHandler > ;
486+ pub type SimpleArcOnionMessenger < L > = OnionMessenger <
487+ Arc < KeysManager > ,
488+ Arc < KeysManager > ,
489+ Arc < L > ,
490+ IgnoringMessageHandler ,
491+ IgnoringMessageHandler
492+ > ;
493+
473494/// Useful for simplifying the parameters of [`SimpleRefChannelManager`] and
474495/// [`SimpleRefPeerManager`]. See their docs for more details.
475496///
476497/// This is not exported to bindings users as general type aliases don't make sense in bindings.
477498///
478499/// [`SimpleRefChannelManager`]: crate::ln::channelmanager::SimpleRefChannelManager
479500/// [`SimpleRefPeerManager`]: crate::ln::peer_handler::SimpleRefPeerManager
480- pub type SimpleRefOnionMessenger < ' a , ' b , L > = OnionMessenger < & ' a KeysManager , & ' a KeysManager , & ' b L , IgnoringMessageHandler > ;
501+ pub type SimpleRefOnionMessenger < ' a , ' b , L > = OnionMessenger <
502+ & ' a KeysManager ,
503+ & ' a KeysManager ,
504+ & ' b L ,
505+ IgnoringMessageHandler ,
506+ IgnoringMessageHandler
507+ > ;
481508
482509/// Construct onion packet payloads and keys for sending an onion message along the given
483510/// `unblinded_path` to the given `destination`.
0 commit comments