@@ -19,7 +19,9 @@ use chain::keysinterface::{InMemorySigner, KeysInterface, KeysManager, Recipient
1919use ln:: features:: { InitFeatures , NodeFeatures } ;
2020use ln:: msgs:: { self , OnionMessageHandler } ;
2121use ln:: onion_utils;
22+ use ln:: peer_handler:: IgnoringMessageHandler ;
2223use super :: blinded_route:: { BlindedRoute , ForwardTlvs , ReceiveTlvs } ;
24+ pub use super :: packet:: CustomOnionMessageContents ;
2325use super :: packet:: { BIG_PACKET_HOP_DATA_LEN , ForwardControlTlvs , Packet , Payload , ReceiveControlTlvs , SMALL_PACKET_HOP_DATA_LEN } ;
2426use super :: utils;
2527use util:: events:: OnionMessageProvider ;
@@ -41,8 +43,12 @@ use prelude::*;
4143/// # use bitcoin::hashes::_export::_core::time::Duration;
4244/// # use bitcoin::secp256k1::{PublicKey, Secp256k1, SecretKey};
4345/// # use lightning::chain::keysinterface::{InMemorySigner, KeysManager, KeysInterface};
44- /// # use lightning::onion_message::{BlindedRoute, Destination, OnionMessenger};
46+ /// # use lightning::ln::msgs::DecodeError;
47+ /// # use lightning::ln::peer_handler::IgnoringMessageHandler;
48+ /// # use lightning::onion_message::{BlindedRoute, CustomOnionMessageContents, Destination, OnionMessenger};
4549/// # use lightning::util::logger::{Logger, Record};
50+ /// # use lightning::util::ser::{MaybeReadableArgs, Writeable, Writer};
51+ /// # use lightning::io;
4652/// # use std::sync::Arc;
4753/// # struct FakeLogger {};
4854/// # impl Logger for FakeLogger {
@@ -58,12 +64,31 @@ use prelude::*;
5864/// # let (hop_node_id2, hop_node_id3, hop_node_id4) = (hop_node_id1, hop_node_id1,
5965/// hop_node_id1);
6066/// # let destination_node_id = hop_node_id1;
61- /// #
67+ /// # let your_custom_message_handler = IgnoringMessageHandler {};
6268/// // Create the onion messenger. This must use the same `keys_manager` as is passed to your
6369/// // ChannelManager.
64- /// let onion_messenger = OnionMessenger::new(&keys_manager, logger);
70+ /// let onion_messenger = OnionMessenger::new(&keys_manager, logger, your_custom_message_handler );
6571///
66- /// // Send an empty onion message to a node id.
72+ /// # struct YourCustomMessage {}
73+ /// impl Writeable for YourCustomMessage {
74+ /// fn write<W: Writer>(&self, w: &mut W) -> Result<(), io::Error> {
75+ /// # Ok(())
76+ /// // Write your custom onion message to `w`
77+ /// }
78+ /// }
79+ /// impl CustomOnionMessageContents for YourCustomMessage {
80+ /// fn tlv_type(&self) -> u64 {
81+ /// # let your_custom_message_type = 42;
82+ /// your_custom_message_type
83+ /// }
84+ /// }
85+ /// impl MaybeReadableArgs<u64> for YourCustomMessage {
86+ /// fn read<R: io::Read>(r: &mut R, message_type: u64) -> Result<Option<Self>, DecodeError> {
87+ /// # unreachable!()
88+ /// // Read your custom onion message of type `message_type` from `r`, or return `None`
89+ /// // if the message type is unknown
90+ /// }
91+ /// }
6792/// let intermediate_hops = [hop_node_id1, hop_node_id2];
6893/// let reply_path = None;
6994/// onion_messenger.send_onion_message(&intermediate_hops, Destination::Node(destination_node_id), reply_path);
@@ -81,17 +106,18 @@ use prelude::*;
81106///
82107/// [offers]: <https://github.com/lightning/bolts/pull/798>
83108/// [`OnionMessenger`]: crate::onion_message::OnionMessenger
84- pub struct OnionMessenger < Signer : Sign , K : Deref , L : Deref >
109+ pub struct OnionMessenger < Signer : Sign , K : Deref , L : Deref , CMH : Deref >
85110 where K :: Target : KeysInterface < Signer = Signer > ,
86111 L :: Target : Logger ,
112+ CMH :: Target : CustomOnionMessageHandler ,
87113{
88114 keys_manager : K ,
89115 logger : L ,
90116 pending_messages : Mutex < HashMap < PublicKey , VecDeque < msgs:: OnionMessage > > > ,
91117 secp_ctx : Secp256k1 < secp256k1:: All > ,
118+ custom_handler : CMH ,
92119 // Coming soon:
93120 // invoice_handler: InvoiceHandler,
94- // custom_handler: CustomHandler, // handles custom onion messages
95121}
96122
97123/// The destination of an onion message.
@@ -130,20 +156,40 @@ pub enum SendError {
130156 BufferFull ,
131157}
132158
133- impl < Signer : Sign , K : Deref , L : Deref > OnionMessenger < Signer , K , L >
159+ /// Handler for custom onion messages. If you are using [`SimpleArcOnionMessenger`],
160+ /// [`SimpleRefOnionMessenger`], or prefer to ignore inbound custom onion messages,
161+ /// [`IgnoringMessageHandler`] must be provided to [`OnionMessenger::new`]. Otherwise, a custom
162+ /// implementation of this trait must be provided, with [`CustomMessage`] specifying the supported
163+ /// message types.
164+ ///
165+ /// See [`OnionMessenger`] for example usage.
166+ ///
167+ /// [`IgnoringMessageHandler`]: crate::ln::peer_handler::IgnoringMessageHandler
168+ /// [`CustomMessage`]: Self::CustomMessage
169+ pub trait CustomOnionMessageHandler {
170+ /// The message known to the handler. To support multiple message types, you may want to make this
171+ /// an enum with a variant for each supported message.
172+ type CustomMessage : CustomOnionMessageContents ;
173+ /// Called with the custom message that was received.
174+ fn handle_custom_message ( & self , msg : Self :: CustomMessage ) ;
175+ }
176+
177+ impl < Signer : Sign , K : Deref , L : Deref , CMH : Deref > OnionMessenger < Signer , K , L , CMH >
134178 where K :: Target : KeysInterface < Signer = Signer > ,
135179 L :: Target : Logger ,
180+ CMH :: Target : CustomOnionMessageHandler ,
136181{
137182 /// Constructs a new `OnionMessenger` to send, forward, and delegate received onion messages to
138183 /// their respective handlers.
139- pub fn new ( keys_manager : K , logger : L ) -> Self {
184+ pub fn new ( keys_manager : K , logger : L , custom_handler : CMH ) -> Self {
140185 let mut secp_ctx = Secp256k1 :: new ( ) ;
141186 secp_ctx. seeded_randomize ( & keys_manager. get_secure_random_bytes ( ) ) ;
142187 OnionMessenger {
143188 keys_manager,
144189 pending_messages : Mutex :: new ( HashMap :: new ( ) ) ,
145190 secp_ctx,
146191 logger,
192+ custom_handler,
147193 }
148194 }
149195
@@ -221,9 +267,10 @@ fn outbound_buffer_full(peer_node_id: &PublicKey, buffer: &HashMap<PublicKey, Ve
221267 false
222268}
223269
224- impl < Signer : Sign , K : Deref , L : Deref > OnionMessageHandler for OnionMessenger < Signer , K , L >
270+ impl < Signer : Sign , K : Deref , L : Deref , CMH : Deref > OnionMessageHandler for OnionMessenger < Signer , K , L , CMH >
225271 where K :: Target : KeysInterface < Signer = Signer > ,
226272 L :: Target : Logger ,
273+ CMH :: Target : CustomOnionMessageHandler ,
227274{
228275 /// Handle an incoming onion message. Currently, if a message was destined for us we will log, but
229276 /// soon we'll delegate the onion message to a handler that can generate invoices or send
@@ -361,9 +408,10 @@ impl<Signer: Sign, K: Deref, L: Deref> OnionMessageHandler for OnionMessenger<Si
361408 }
362409}
363410
364- impl < Signer : Sign , K : Deref , L : Deref > OnionMessageProvider for OnionMessenger < Signer , K , L >
411+ impl < Signer : Sign , K : Deref , L : Deref , CMH : Deref > OnionMessageProvider for OnionMessenger < Signer , K , L , CMH >
365412 where K :: Target : KeysInterface < Signer = Signer > ,
366413 L :: Target : Logger ,
414+ CMH :: Target : CustomOnionMessageHandler ,
367415{
368416 fn next_onion_message_for_peer ( & self , peer_node_id : PublicKey ) -> Option < msgs:: OnionMessage > {
369417 let mut pending_msgs = self . pending_messages . lock ( ) . unwrap ( ) ;
@@ -383,15 +431,15 @@ impl<Signer: Sign, K: Deref, L: Deref> OnionMessageProvider for OnionMessenger<S
383431///
384432/// [`SimpleArcChannelManager`]: crate::ln::channelmanager::SimpleArcChannelManager
385433/// [`SimpleArcPeerManager`]: crate::ln::peer_handler::SimpleArcPeerManager
386- pub type SimpleArcOnionMessenger < L > = OnionMessenger < InMemorySigner , Arc < KeysManager > , Arc < L > > ;
434+ pub type SimpleArcOnionMessenger < L > = OnionMessenger < InMemorySigner , Arc < KeysManager > , Arc < L > , IgnoringMessageHandler > ;
387435/// Useful for simplifying the parameters of [`SimpleRefChannelManager`] and
388436/// [`SimpleRefPeerManager`]. See their docs for more details.
389437///
390438/// (C-not exported) as general type aliases don't make sense in bindings.
391439///
392440/// [`SimpleRefChannelManager`]: crate::ln::channelmanager::SimpleRefChannelManager
393441/// [`SimpleRefPeerManager`]: crate::ln::peer_handler::SimpleRefPeerManager
394- pub type SimpleRefOnionMessenger < ' a , ' b , L > = OnionMessenger < InMemorySigner , & ' a KeysManager , & ' b L > ;
442+ pub type SimpleRefOnionMessenger < ' a , ' b , L > = OnionMessenger < InMemorySigner , & ' a KeysManager , & ' b L , IgnoringMessageHandler > ;
395443
396444/// Construct onion packet payloads and keys for sending an onion message along the given
397445/// `unblinded_path` to the given `destination`.
0 commit comments