@@ -18,11 +18,13 @@ use bitcoin::secp256k1::{self, PublicKey, Scalar, Secp256k1, SecretKey};
1818use crate :: blinded_path:: { BlindedPath , ForwardTlvs , ReceiveTlvs , utils} ;
1919use crate :: sign:: { EntropySource , KeysManager , NodeSigner , Recipient } ;
2020use crate :: events:: OnionMessageProvider ;
21+ use crate :: ln:: channelmanager:: { SimpleArcChannelManager , SimpleRefChannelManager } ;
2122use crate :: ln:: features:: { InitFeatures , NodeFeatures } ;
2223use crate :: ln:: msgs:: { self , OnionMessageHandler } ;
2324use crate :: ln:: onion_utils;
2425use crate :: ln:: peer_handler:: IgnoringMessageHandler ;
2526pub use super :: packet:: { CustomOnionMessageContents , OnionMessageContents } ;
27+ use super :: offers:: OffersMessageHandler ;
2628use super :: packet:: { BIG_PACKET_HOP_DATA_LEN , ForwardControlTlvs , Packet , Payload , ReceiveControlTlvs , SMALL_PACKET_HOP_DATA_LEN } ;
2729use crate :: util:: logger:: Logger ;
2830use crate :: util:: ser:: Writeable ;
@@ -63,10 +65,11 @@ use crate::prelude::*;
6365/// # let hop_node_id1 = PublicKey::from_secret_key(&secp_ctx, &node_secret);
6466/// # let (hop_node_id2, hop_node_id3, hop_node_id4) = (hop_node_id1, hop_node_id1, hop_node_id1);
6567/// # let destination_node_id = hop_node_id1;
66- /// # let your_custom_message_handler = IgnoringMessageHandler {};
68+ /// # let custom_message_handler = IgnoringMessageHandler {};
69+ /// # let offers_message_handler = IgnoringMessageHandler {};
6770/// // Create the onion messenger. This must use the same `keys_manager` as is passed to your
6871/// // ChannelManager.
69- /// let onion_messenger = OnionMessenger::new(&keys_manager, &keys_manager, logger, &your_custom_message_handler );
72+ /// let onion_messenger = OnionMessenger::new(&keys_manager, &keys_manager, logger, &offers_message_handler, &custom_message_handler );
7073///
7174/// # struct YourCustomMessage {}
7275/// impl Writeable for YourCustomMessage {
@@ -103,20 +106,21 @@ use crate::prelude::*;
103106///
104107/// [offers]: <https://github.com/lightning/bolts/pull/798>
105108/// [`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 ,
109+ pub struct OnionMessenger < ES : Deref , NS : Deref , L : Deref , OMH : Deref , CMH : Deref >
110+ where
111+ ES :: Target : EntropySource ,
112+ NS :: Target : NodeSigner ,
113+ L :: Target : Logger ,
114+ OMH :: Target : OffersMessageHandler ,
115+ CMH :: Target : CustomOnionMessageHandler ,
111116{
112117 entropy_source : ES ,
113118 node_signer : NS ,
114119 logger : L ,
115120 pending_messages : Mutex < HashMap < PublicKey , VecDeque < msgs:: OnionMessage > > > ,
116121 secp_ctx : Secp256k1 < secp256k1:: All > ,
122+ offers_handler : OMH ,
117123 custom_handler : CMH ,
118- // Coming soon:
119- // invoice_handler: InvoiceHandler,
120124}
121125
122126/// The destination of an onion message.
@@ -187,15 +191,19 @@ pub trait CustomOnionMessageHandler {
187191 fn read_custom_message < R : io:: Read > ( & self , message_type : u64 , buffer : & mut R ) -> Result < Option < Self :: CustomMessage > , msgs:: DecodeError > ;
188192}
189193
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 ,
194+ impl < ES : Deref , NS : Deref , L : Deref , OMH : Deref , CMH : Deref > OnionMessenger < ES , NS , L , OMH , CMH >
195+ where
196+ ES :: Target : EntropySource ,
197+ NS :: Target : NodeSigner ,
198+ L :: Target : Logger ,
199+ OMH :: Target : OffersMessageHandler ,
200+ CMH :: Target : CustomOnionMessageHandler ,
195201{
196202 /// Constructs a new `OnionMessenger` to send, forward, and delegate received onion messages to
197203 /// their respective handlers.
198- pub fn new ( entropy_source : ES , node_signer : NS , logger : L , custom_handler : CMH ) -> Self {
204+ pub fn new (
205+ entropy_source : ES , node_signer : NS , logger : L , offers_handler : OMH , custom_handler : CMH
206+ ) -> Self {
199207 let mut secp_ctx = Secp256k1 :: new ( ) ;
200208 secp_ctx. seeded_randomize ( & entropy_source. get_secure_random_bytes ( ) ) ;
201209 OnionMessenger {
@@ -204,6 +212,7 @@ impl<ES: Deref, NS: Deref, L: Deref, CMH: Deref> OnionMessenger<ES, NS, L, CMH>
204212 pending_messages : Mutex :: new ( HashMap :: new ( ) ) ,
205213 secp_ctx,
206214 logger,
215+ offers_handler,
207216 custom_handler,
208217 }
209218 }
@@ -298,11 +307,14 @@ fn outbound_buffer_full(peer_node_id: &PublicKey, buffer: &HashMap<PublicKey, Ve
298307 false
299308}
300309
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 ,
305- CMH :: Target : CustomOnionMessageHandler + Sized ,
310+ impl < ES : Deref , NS : Deref , L : Deref , OMH : Deref , CMH : Deref > OnionMessageHandler
311+ for OnionMessenger < ES , NS , L , OMH , CMH >
312+ where
313+ ES :: Target : EntropySource ,
314+ NS :: Target : NodeSigner ,
315+ L :: Target : Logger ,
316+ OMH :: Target : OffersMessageHandler ,
317+ CMH :: Target : CustomOnionMessageHandler + Sized ,
306318{
307319 /// Handle an incoming onion message. Currently, if a message was destined for us we will log, but
308320 /// soon we'll delegate the onion message to a handler that can generate invoices or send
@@ -341,7 +353,7 @@ impl<ES: Deref, NS: Deref, L: Deref, CMH: Deref> OnionMessageHandler for OnionMe
341353 "Received an onion message with path_id {:02x?} and {} reply_path" ,
342354 path_id, if reply_path. is_some ( ) { "a" } else { "no" } ) ;
343355 match message {
344- OnionMessageContents :: Offers ( _msg ) => todo ! ( ) ,
356+ OnionMessageContents :: Offers ( msg ) => self . offers_handler . handle_message ( msg ) ,
345357 OnionMessageContents :: Custom ( msg) => self . custom_handler . handle_custom_message ( msg) ,
346358 }
347359 } ,
@@ -444,11 +456,14 @@ impl<ES: Deref, NS: Deref, L: Deref, CMH: Deref> OnionMessageHandler for OnionMe
444456 }
445457}
446458
447- impl < ES : Deref , NS : Deref , L : Deref , CMH : Deref > OnionMessageProvider for OnionMessenger < ES , NS , L , CMH >
448- where ES :: Target : EntropySource ,
449- NS :: Target : NodeSigner ,
450- L :: Target : Logger ,
451- 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 ,
452467{
453468 fn next_onion_message_for_peer ( & self , peer_node_id : PublicKey ) -> Option < msgs:: OnionMessage > {
454469 let mut pending_msgs = self . pending_messages . lock ( ) . unwrap ( ) ;
@@ -468,15 +483,28 @@ impl<ES: Deref, NS: Deref, L: Deref, CMH: Deref> OnionMessageProvider for OnionM
468483///
469484/// [`SimpleArcChannelManager`]: crate::ln::channelmanager::SimpleArcChannelManager
470485/// [`SimpleArcPeerManager`]: crate::ln::peer_handler::SimpleArcPeerManager
471- pub type SimpleArcOnionMessenger < L > = OnionMessenger < Arc < KeysManager > , Arc < KeysManager > , Arc < L > , IgnoringMessageHandler > ;
486+ pub type SimpleArcOnionMessenger < M , T , F , L > = OnionMessenger <
487+ Arc < KeysManager > ,
488+ Arc < KeysManager > ,
489+ Arc < L > ,
490+ Arc < SimpleArcChannelManager < M , T , F , L > > ,
491+ IgnoringMessageHandler
492+ > ;
493+
472494/// Useful for simplifying the parameters of [`SimpleRefChannelManager`] and
473495/// [`SimpleRefPeerManager`]. See their docs for more details.
474496///
475497/// This is not exported to bindings users as general type aliases don't make sense in bindings.
476498///
477499/// [`SimpleRefChannelManager`]: crate::ln::channelmanager::SimpleRefChannelManager
478500/// [`SimpleRefPeerManager`]: crate::ln::peer_handler::SimpleRefPeerManager
479- pub type SimpleRefOnionMessenger < ' a , ' b , L > = OnionMessenger < & ' a KeysManager , & ' a KeysManager , & ' b L , IgnoringMessageHandler > ;
501+ pub type SimpleRefOnionMessenger < ' a , ' b , ' c , ' d , ' e , ' f , ' g , ' h , ' i , M , T , F , L > = OnionMessenger <
502+ & ' c KeysManager ,
503+ & ' c KeysManager ,
504+ & ' g L ,
505+ & ' i SimpleRefChannelManager < ' a , ' b , ' c , ' d , ' e , ' f , ' g , ' h , M , T , F , L > ,
506+ IgnoringMessageHandler
507+ > ;
480508
481509/// Construct onion packet payloads and keys for sending an onion message along the given
482510/// `unblinded_path` to the given `destination`.
0 commit comments