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