@@ -23,6 +23,7 @@ use crate::ln::msgs::{self, OnionMessageHandler};
23
23
use crate :: ln:: onion_utils;
24
24
use crate :: ln:: peer_handler:: IgnoringMessageHandler ;
25
25
pub use super :: packet:: { CustomOnionMessageContents , OnionMessageContents } ;
26
+ use super :: offers:: OffersMessageHandler ;
26
27
use super :: packet:: { BIG_PACKET_HOP_DATA_LEN , ForwardControlTlvs , Packet , Payload , ReceiveControlTlvs , SMALL_PACKET_HOP_DATA_LEN } ;
27
28
use crate :: util:: logger:: Logger ;
28
29
use crate :: util:: ser:: Writeable ;
@@ -63,10 +64,11 @@ use crate::prelude::*;
63
64
/// # let hop_node_id1 = PublicKey::from_secret_key(&secp_ctx, &node_secret);
64
65
/// # let (hop_node_id2, hop_node_id3, hop_node_id4) = (hop_node_id1, hop_node_id1, hop_node_id1);
65
66
/// # 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 {};
67
69
/// // Create the onion messenger. This must use the same `keys_manager` as is passed to your
68
70
/// // 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 );
70
72
///
71
73
/// # struct YourCustomMessage {}
72
74
/// impl Writeable for YourCustomMessage {
@@ -103,20 +105,21 @@ use crate::prelude::*;
103
105
///
104
106
/// [offers]: <https://github.com/lightning/bolts/pull/798>
105
107
/// [`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 ,
111
115
{
112
116
entropy_source : ES ,
113
117
node_signer : NS ,
114
118
logger : L ,
115
119
pending_messages : Mutex < HashMap < PublicKey , VecDeque < msgs:: OnionMessage > > > ,
116
120
secp_ctx : Secp256k1 < secp256k1:: All > ,
121
+ offers_handler : OMH ,
117
122
custom_handler : CMH ,
118
- // Coming soon:
119
- // invoice_handler: InvoiceHandler,
120
123
}
121
124
122
125
/// The destination of an onion message.
@@ -187,15 +190,19 @@ pub trait CustomOnionMessageHandler {
187
190
fn read_custom_message < R : io:: Read > ( & self , message_type : u64 , buffer : & mut R ) -> Result < Option < Self :: CustomMessage > , msgs:: DecodeError > ;
188
191
}
189
192
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 ,
195
200
{
196
201
/// Constructs a new `OnionMessenger` to send, forward, and delegate received onion messages to
197
202
/// 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 {
199
206
let mut secp_ctx = Secp256k1 :: new ( ) ;
200
207
secp_ctx. seeded_randomize ( & entropy_source. get_secure_random_bytes ( ) ) ;
201
208
OnionMessenger {
@@ -204,6 +211,7 @@ impl<ES: Deref, NS: Deref, L: Deref, CMH: Deref> OnionMessenger<ES, NS, L, CMH>
204
211
pending_messages : Mutex :: new ( HashMap :: new ( ) ) ,
205
212
secp_ctx,
206
213
logger,
214
+ offers_handler,
207
215
custom_handler,
208
216
}
209
217
}
@@ -298,11 +306,14 @@ fn outbound_buffer_full(peer_node_id: &PublicKey, buffer: &HashMap<PublicKey, Ve
298
306
false
299
307
}
300
308
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 ,
306
317
{
307
318
/// Handle an incoming onion message. Currently, if a message was destined for us we will log, but
308
319
/// 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
342
353
"Received an onion message with path_id {:02x?} and {} reply_path" ,
343
354
path_id, if reply_path. is_some ( ) { "a" } else { "no" } ) ;
344
355
match message {
345
- OnionMessageContents :: Offers ( _msg ) => todo ! ( ) ,
356
+ OnionMessageContents :: Offers ( msg ) => self . offers_handler . handle_message ( msg ) ,
346
357
OnionMessageContents :: Custom ( msg) => self . custom_handler . handle_custom_message ( msg) ,
347
358
}
348
359
} ,
@@ -445,11 +456,14 @@ impl<ES: Deref, NS: Deref, L: Deref, CMH: Deref> OnionMessageHandler for OnionMe
445
456
}
446
457
}
447
458
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 ,
453
467
{
454
468
fn next_onion_message_for_peer ( & self , peer_node_id : PublicKey ) -> Option < msgs:: OnionMessage > {
455
469
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
469
483
///
470
484
/// [`SimpleArcChannelManager`]: crate::ln::channelmanager::SimpleArcChannelManager
471
485
/// [`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
+
473
494
/// Useful for simplifying the parameters of [`SimpleRefChannelManager`] and
474
495
/// [`SimpleRefPeerManager`]. See their docs for more details.
475
496
///
476
497
/// This is not exported to bindings users as general type aliases don't make sense in bindings.
477
498
///
478
499
/// [`SimpleRefChannelManager`]: crate::ln::channelmanager::SimpleRefChannelManager
479
500
/// [`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
+ > ;
481
508
482
509
/// Construct onion packet payloads and keys for sending an onion message along the given
483
510
/// `unblinded_path` to the given `destination`.
0 commit comments