@@ -16,12 +16,14 @@ use bitcoin::hashes::sha256::Hash as Sha256;
1616use bitcoin:: secp256k1:: { self , PublicKey , Scalar , Secp256k1 , SecretKey } ;
1717
1818use crate :: chain:: keysinterface:: { EntropySource , KeysManager , NodeSigner , Recipient } ;
19+ use crate :: ln:: channelmanager:: { SimpleArcChannelManager , SimpleRefChannelManager } ;
1920use crate :: ln:: features:: { InitFeatures , NodeFeatures } ;
2021use crate :: ln:: msgs:: { self , OnionMessageHandler } ;
2122use crate :: ln:: onion_utils;
2223use crate :: ln:: peer_handler:: IgnoringMessageHandler ;
2324use super :: blinded_path:: { BlindedPath , ForwardTlvs , ReceiveTlvs } ;
2425pub use super :: packet:: { CustomOnionMessageContents , OnionMessageContents } ;
26+ use super :: offers:: OffersMessageHandler ;
2527use super :: packet:: { BIG_PACKET_HOP_DATA_LEN , ForwardControlTlvs , Packet , Payload , ReceiveControlTlvs , SMALL_PACKET_HOP_DATA_LEN } ;
2628use super :: utils;
2729use crate :: util:: events:: OnionMessageProvider ;
@@ -64,10 +66,11 @@ use crate::prelude::*;
6466/// # let hop_node_id1 = PublicKey::from_secret_key(&secp_ctx, &node_secret);
6567/// # let (hop_node_id2, hop_node_id3, hop_node_id4) = (hop_node_id1, hop_node_id1, hop_node_id1);
6668/// # let destination_node_id = hop_node_id1;
67- /// # let your_custom_message_handler = IgnoringMessageHandler {};
69+ /// # let custom_message_handler = IgnoringMessageHandler {};
70+ /// # let offers_message_handler = IgnoringMessageHandler {};
6871/// // Create the onion messenger. This must use the same `keys_manager` as is passed to your
6972/// // ChannelManager.
70- /// let onion_messenger = OnionMessenger::new(&keys_manager, &keys_manager, logger, your_custom_message_handler );
73+ /// let onion_messenger = OnionMessenger::new(&keys_manager, &keys_manager, logger, offers_message_handler, custom_message_handler );
7174///
7275/// # struct YourCustomMessage {}
7376/// impl Writeable for YourCustomMessage {
@@ -104,20 +107,21 @@ use crate::prelude::*;
104107///
105108/// [offers]: <https://github.com/lightning/bolts/pull/798>
106109/// [`OnionMessenger`]: crate::onion_message::OnionMessenger
107- pub struct OnionMessenger < ES : Deref , NS : Deref , L : Deref , CMH : Deref >
108- where ES :: Target : EntropySource ,
109- NS :: Target : NodeSigner ,
110- L :: Target : Logger ,
111- CMH :: Target : CustomOnionMessageHandler ,
110+ pub struct OnionMessenger < ES : Deref , NS : Deref , L : Deref , OMH : Deref , CMH : Deref >
111+ where
112+ ES :: Target : EntropySource ,
113+ NS :: Target : NodeSigner ,
114+ L :: Target : Logger ,
115+ OMH :: Target : OffersMessageHandler ,
116+ CMH :: Target : CustomOnionMessageHandler ,
112117{
113118 entropy_source : ES ,
114119 node_signer : NS ,
115120 logger : L ,
116121 pending_messages : Mutex < HashMap < PublicKey , VecDeque < msgs:: OnionMessage > > > ,
117122 secp_ctx : Secp256k1 < secp256k1:: All > ,
123+ offers_handler : OMH ,
118124 custom_handler : CMH ,
119- // Coming soon:
120- // invoice_handler: InvoiceHandler,
121125}
122126
123127/// The destination of an onion message.
@@ -188,15 +192,19 @@ pub trait CustomOnionMessageHandler {
188192 fn read_custom_message < R : io:: Read > ( & self , message_type : u64 , buffer : & mut R ) -> Result < Option < Self :: CustomMessage > , msgs:: DecodeError > ;
189193}
190194
191- impl < ES : Deref , NS : Deref , L : Deref , CMH : Deref > OnionMessenger < ES , NS , L , CMH >
192- where ES :: Target : EntropySource ,
193- NS :: Target : NodeSigner ,
194- L :: Target : Logger ,
195- CMH :: Target : CustomOnionMessageHandler ,
195+ impl < ES : Deref , NS : Deref , L : Deref , OMH : Deref , CMH : Deref > OnionMessenger < ES , NS , L , OMH , CMH >
196+ where
197+ ES :: Target : EntropySource ,
198+ NS :: Target : NodeSigner ,
199+ L :: Target : Logger ,
200+ OMH :: Target : OffersMessageHandler ,
201+ CMH :: Target : CustomOnionMessageHandler ,
196202{
197203 /// Constructs a new `OnionMessenger` to send, forward, and delegate received onion messages to
198204 /// their respective handlers.
199- pub fn new ( entropy_source : ES , node_signer : NS , logger : L , custom_handler : CMH ) -> Self {
205+ pub fn new (
206+ entropy_source : ES , node_signer : NS , logger : L , offers_handler : OMH , custom_handler : CMH
207+ ) -> Self {
200208 let mut secp_ctx = Secp256k1 :: new ( ) ;
201209 secp_ctx. seeded_randomize ( & entropy_source. get_secure_random_bytes ( ) ) ;
202210 OnionMessenger {
@@ -205,6 +213,7 @@ impl<ES: Deref, NS: Deref, L: Deref, CMH: Deref> OnionMessenger<ES, NS, L, CMH>
205213 pending_messages : Mutex :: new ( HashMap :: new ( ) ) ,
206214 secp_ctx,
207215 logger,
216+ offers_handler,
208217 custom_handler,
209218 }
210219 }
@@ -299,11 +308,14 @@ fn outbound_buffer_full(peer_node_id: &PublicKey, buffer: &HashMap<PublicKey, Ve
299308 false
300309}
301310
302- impl < ES : Deref , NS : Deref , L : Deref , CMH : Deref > OnionMessageHandler for OnionMessenger < ES , NS , L , CMH >
303- where ES :: Target : EntropySource ,
304- NS :: Target : NodeSigner ,
305- L :: Target : Logger ,
306- CMH :: Target : CustomOnionMessageHandler + Sized ,
311+ impl < ES : Deref , NS : Deref , L : Deref , OMH : Deref , CMH : Deref > OnionMessageHandler
312+ for OnionMessenger < ES , NS , L , OMH , CMH >
313+ where
314+ ES :: Target : EntropySource ,
315+ NS :: Target : NodeSigner ,
316+ L :: Target : Logger ,
317+ OMH :: Target : OffersMessageHandler ,
318+ CMH :: Target : CustomOnionMessageHandler + Sized ,
307319{
308320 /// Handle an incoming onion message. Currently, if a message was destined for us we will log, but
309321 /// soon we'll delegate the onion message to a handler that can generate invoices or send
@@ -342,7 +354,7 @@ impl<ES: Deref, NS: Deref, L: Deref, CMH: Deref> OnionMessageHandler for OnionMe
342354 "Received an onion message with path_id {:02x?} and {} reply_path" ,
343355 path_id, if reply_path. is_some ( ) { "a" } else { "no" } ) ;
344356 match message {
345- OnionMessageContents :: Offers ( _msg ) => todo ! ( ) ,
357+ OnionMessageContents :: Offers ( msg ) => self . offers_handler . handle_message ( msg ) ,
346358 OnionMessageContents :: Custom ( msg) => self . custom_handler . handle_custom_message ( msg) ,
347359 }
348360 } ,
@@ -445,11 +457,14 @@ impl<ES: Deref, NS: Deref, L: Deref, CMH: Deref> OnionMessageHandler for OnionMe
445457 }
446458}
447459
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 ,
460+ impl < ES : Deref , NS : Deref , L : Deref , OMH : Deref , CMH : Deref > OnionMessageProvider
461+ for OnionMessenger < ES , NS , L , OMH , CMH >
462+ where
463+ ES :: Target : EntropySource ,
464+ NS :: Target : NodeSigner ,
465+ L :: Target : Logger ,
466+ OMH :: Target : OffersMessageHandler ,
467+ CMH :: Target : CustomOnionMessageHandler ,
453468{
454469 fn next_onion_message_for_peer ( & self , peer_node_id : PublicKey ) -> Option < msgs:: OnionMessage > {
455470 let mut pending_msgs = self . pending_messages . lock ( ) . unwrap ( ) ;
@@ -469,15 +484,28 @@ impl<ES: Deref, NS: Deref, L: Deref, CMH: Deref> OnionMessageProvider for OnionM
469484///
470485/// [`SimpleArcChannelManager`]: crate::ln::channelmanager::SimpleArcChannelManager
471486/// [`SimpleArcPeerManager`]: crate::ln::peer_handler::SimpleArcPeerManager
472- pub type SimpleArcOnionMessenger < L > = OnionMessenger < Arc < KeysManager > , Arc < KeysManager > , Arc < L > , IgnoringMessageHandler > ;
487+ pub type SimpleArcOnionMessenger < M , T , F , L > = OnionMessenger <
488+ Arc < KeysManager > ,
489+ Arc < KeysManager > ,
490+ Arc < L > ,
491+ Arc < SimpleArcChannelManager < M , T , F , L > > ,
492+ IgnoringMessageHandler
493+ > ;
494+
473495/// Useful for simplifying the parameters of [`SimpleRefChannelManager`] and
474496/// [`SimpleRefPeerManager`]. See their docs for more details.
475497///
476498/// (C-not exported) as general type aliases don't make sense in bindings.
477499///
478500/// [`SimpleRefChannelManager`]: crate::ln::channelmanager::SimpleRefChannelManager
479501/// [`SimpleRefPeerManager`]: crate::ln::peer_handler::SimpleRefPeerManager
480- pub type SimpleRefOnionMessenger < ' a , ' b , L > = OnionMessenger < & ' a KeysManager , & ' a KeysManager , & ' b L , IgnoringMessageHandler > ;
502+ pub type SimpleRefOnionMessenger < ' a , ' b , ' c , ' d , ' e , ' f , ' g , ' h , ' i , M , T , F , L > = OnionMessenger <
503+ & ' c KeysManager ,
504+ & ' c KeysManager ,
505+ & ' g L ,
506+ & ' i SimpleRefChannelManager < ' a , ' b , ' c , ' d , ' e , ' f , ' g , ' h , M , T , F , L > ,
507+ IgnoringMessageHandler
508+ > ;
481509
482510/// Construct onion packet payloads and keys for sending an onion message along the given
483511/// `unblinded_path` to the given `destination`.
0 commit comments