@@ -19,7 +19,9 @@ use chain::keysinterface::{InMemorySigner, KeysInterface, KeysManager, Recipient
19
19
use ln:: features:: { InitFeatures , NodeFeatures } ;
20
20
use ln:: msgs:: { self , OnionMessageHandler } ;
21
21
use ln:: onion_utils;
22
+ use ln:: peer_handler:: IgnoringMessageHandler ;
22
23
use super :: blinded_route:: { BlindedRoute , ForwardTlvs , ReceiveTlvs } ;
24
+ pub use super :: packet:: CustomOnionMessageContents ;
23
25
use super :: packet:: { BIG_PACKET_HOP_DATA_LEN , ForwardControlTlvs , Packet , Payload , ReceiveControlTlvs , SMALL_PACKET_HOP_DATA_LEN } ;
24
26
use super :: utils;
25
27
use util:: events:: OnionMessageProvider ;
@@ -41,8 +43,12 @@ use prelude::*;
41
43
/// # use bitcoin::hashes::_export::_core::time::Duration;
42
44
/// # use bitcoin::secp256k1::{PublicKey, Secp256k1, SecretKey};
43
45
/// # 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};
45
49
/// # use lightning::util::logger::{Logger, Record};
50
+ /// # use lightning::util::ser::{MaybeReadableArgs, Writeable, Writer};
51
+ /// # use lightning::io;
46
52
/// # use std::sync::Arc;
47
53
/// # struct FakeLogger {};
48
54
/// # impl Logger for FakeLogger {
@@ -58,12 +64,31 @@ use prelude::*;
58
64
/// # let (hop_node_id2, hop_node_id3, hop_node_id4) = (hop_node_id1, hop_node_id1,
59
65
/// hop_node_id1);
60
66
/// # let destination_node_id = hop_node_id1;
61
- /// #
67
+ /// # let your_custom_message_handler = IgnoringMessageHandler {};
62
68
/// // Create the onion messenger. This must use the same `keys_manager` as is passed to your
63
69
/// // ChannelManager.
64
- /// let onion_messenger = OnionMessenger::new(&keys_manager, logger);
70
+ /// let onion_messenger = OnionMessenger::new(&keys_manager, logger, your_custom_message_handler );
65
71
///
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
+ /// }
67
92
/// let intermediate_hops = [hop_node_id1, hop_node_id2];
68
93
/// let reply_path = None;
69
94
/// onion_messenger.send_onion_message(&intermediate_hops, Destination::Node(destination_node_id), reply_path);
@@ -81,17 +106,18 @@ use prelude::*;
81
106
///
82
107
/// [offers]: <https://github.com/lightning/bolts/pull/798>
83
108
/// [`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 >
85
110
where K :: Target : KeysInterface < Signer = Signer > ,
86
111
L :: Target : Logger ,
112
+ CMH :: Target : CustomOnionMessageHandler ,
87
113
{
88
114
keys_manager : K ,
89
115
logger : L ,
90
116
pending_messages : Mutex < HashMap < PublicKey , VecDeque < msgs:: OnionMessage > > > ,
91
117
secp_ctx : Secp256k1 < secp256k1:: All > ,
118
+ custom_handler : CMH ,
92
119
// Coming soon:
93
120
// invoice_handler: InvoiceHandler,
94
- // custom_handler: CustomHandler, // handles custom onion messages
95
121
}
96
122
97
123
/// The destination of an onion message.
@@ -130,20 +156,40 @@ pub enum SendError {
130
156
BufferFull ,
131
157
}
132
158
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 >
134
178
where K :: Target : KeysInterface < Signer = Signer > ,
135
179
L :: Target : Logger ,
180
+ CMH :: Target : CustomOnionMessageHandler ,
136
181
{
137
182
/// Constructs a new `OnionMessenger` to send, forward, and delegate received onion messages to
138
183
/// 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 {
140
185
let mut secp_ctx = Secp256k1 :: new ( ) ;
141
186
secp_ctx. seeded_randomize ( & keys_manager. get_secure_random_bytes ( ) ) ;
142
187
OnionMessenger {
143
188
keys_manager,
144
189
pending_messages : Mutex :: new ( HashMap :: new ( ) ) ,
145
190
secp_ctx,
146
191
logger,
192
+ custom_handler,
147
193
}
148
194
}
149
195
@@ -221,9 +267,10 @@ fn outbound_buffer_full(peer_node_id: &PublicKey, buffer: &HashMap<PublicKey, Ve
221
267
false
222
268
}
223
269
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 >
225
271
where K :: Target : KeysInterface < Signer = Signer > ,
226
272
L :: Target : Logger ,
273
+ CMH :: Target : CustomOnionMessageHandler ,
227
274
{
228
275
/// Handle an incoming onion message. Currently, if a message was destined for us we will log, but
229
276
/// 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
361
408
}
362
409
}
363
410
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 >
365
412
where K :: Target : KeysInterface < Signer = Signer > ,
366
413
L :: Target : Logger ,
414
+ CMH :: Target : CustomOnionMessageHandler ,
367
415
{
368
416
fn next_onion_message_for_peer ( & self , peer_node_id : PublicKey ) -> Option < msgs:: OnionMessage > {
369
417
let mut pending_msgs = self . pending_messages . lock ( ) . unwrap ( ) ;
@@ -383,15 +431,15 @@ impl<Signer: Sign, K: Deref, L: Deref> OnionMessageProvider for OnionMessenger<S
383
431
///
384
432
/// [`SimpleArcChannelManager`]: crate::ln::channelmanager::SimpleArcChannelManager
385
433
/// [`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 > ;
387
435
/// Useful for simplifying the parameters of [`SimpleRefChannelManager`] and
388
436
/// [`SimpleRefPeerManager`]. See their docs for more details.
389
437
///
390
438
/// (C-not exported) as general type aliases don't make sense in bindings.
391
439
///
392
440
/// [`SimpleRefChannelManager`]: crate::ln::channelmanager::SimpleRefChannelManager
393
441
/// [`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 > ;
395
443
396
444
/// Construct onion packet payloads and keys for sending an onion message along the given
397
445
/// `unblinded_path` to the given `destination`.
0 commit comments