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