Skip to content

Commit d53fadd

Browse files
committed
Introduce the Fn Trait for Message Responders:
1. Enables using custom handler functions tailored to specific cases. 2. Enhances further generalisation by removing the constraint of bounding responders based on the `OnionMessageHandler` trait. 3. Also, separate `path_id` from Responder to induce symmetry between `ReceivedOnionMessage` variants.
1 parent bbb7541 commit d53fadd

File tree

6 files changed

+87
-39
lines changed

6 files changed

+87
-39
lines changed

fuzz/src/onion_message.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ impl MessageRouter for TestMessageRouter {
9696
struct TestOffersMessageHandler {}
9797

9898
impl OffersMessageHandler for TestOffersMessageHandler {
99-
fn handle_message<OMH: OnionMessageHandler>(&self, _message: &ReceivedOnionMessage<OMH, OffersMessage>) {}
99+
fn handle_message<F: Fn(OffersMessage, BlindedPath)>(&self, _message: &ReceivedOnionMessage<OMH, OffersMessage>) {}
100100
}
101101

102102
#[derive(Debug)]
@@ -121,7 +121,7 @@ struct TestCustomMessageHandler {}
121121

122122
impl CustomOnionMessageHandler for TestCustomMessageHandler {
123123
type CustomMessage = TestCustomMessage;
124-
fn handle_custom_message<OMH: OnionMessageHandler, T: OnionMessageContents>(&self, message: &ReceivedOnionMessage<OMH, T>) {
124+
fn handle_custom_message<F: Fn(Self::CustomMessage, BlindedPath), T: OnionMessageContents>(&self, message: &ReceivedOnionMessage<F, T>) {
125125
if let ReceivedOnionMessage::WithReplyPath({_, responder}) = message {
126126
responder.respond(TestCustomMessage {})
127127
}

lightning/src/ln/channelmanager.rs

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,6 @@ use crate::util::string::UntrustedString;
7575
use crate::util::ser::{BigSize, FixedLengthReader, Readable, ReadableArgs, MaybeReadable, Writeable, Writer, VecWriter};
7676
use crate::util::logger::{Level, Logger, WithContext};
7777
use crate::util::errors::APIError;
78-
use super::msgs::OnionMessageHandler;
7978

8079
#[cfg(not(c_bindings))]
8180
use {
@@ -9263,23 +9262,23 @@ where
92639262
}
92649263
}
92659264

9266-
impl<M: Deref, BI: Deref, ES: Deref, NS: Deref, SP: Deref, F: Deref, R: Deref, L: Deref>
9267-
OffersMessageHandler for ChannelManager<M, BI, ES, NS, SP, F, R, L>
9265+
impl<M: Deref, BI: Deref, ES: Deref, NS: Deref, SP: Deref, FE: Deref, R: Deref, L: Deref>
9266+
OffersMessageHandler for ChannelManager<M, BI, ES, NS, SP, FE, R, L>
92689267
where
92699268
M::Target: chain::Watch<<SP::Target as SignerProvider>::EcdsaSigner>,
92709269
BI::Target: BroadcasterInterface,
92719270
ES::Target: EntropySource,
92729271
NS::Target: NodeSigner,
92739272
SP::Target: SignerProvider,
9274-
F::Target: FeeEstimator,
9273+
FE::Target: FeeEstimator,
92759274
R::Target: Router,
92769275
L::Target: Logger,
92779276
{
9278-
fn handle_message<OMH: OnionMessageHandler>(&self, message: &ReceivedOnionMessage<OMH, OffersMessage>) {
9277+
fn handle_message<F: Fn(OffersMessage, BlindedPath)>(&self, message: &ReceivedOnionMessage<F, OffersMessage>) {
92799278
let secp_ctx = &self.secp_ctx;
92809279
let expanded_key = &self.inbound_payment_key;
92819280

9282-
if let ReceivedOnionMessage::WithReplyPath{message, responder} = message {
9281+
if let ReceivedOnionMessage::WithReplyPath{responder, message, path_id: _} = message {
92839282
let response_option = match &message {
92849283
OffersMessage::InvoiceRequest(invoice_request) => {
92859284
let amount_msats = match InvoiceBuilder::<DerivedSigningPubkey>::amount_msats(

lightning/src/ln/peer_handler.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -136,11 +136,11 @@ impl OnionMessageHandler for IgnoringMessageHandler {
136136
}
137137

138138
impl OffersMessageHandler for IgnoringMessageHandler {
139-
fn handle_message<OMH: OnionMessageHandler>(&self, _message: &ReceivedOnionMessage<OMH, OffersMessage>) {}
139+
fn handle_message<F: Fn(OffersMessage, BlindedPath)>(&self, _message: &ReceivedOnionMessage<F, OffersMessage>) {}
140140
}
141141
impl CustomOnionMessageHandler for IgnoringMessageHandler {
142142
type CustomMessage = Infallible;
143-
fn handle_custom_message<OMH: OnionMessageHandler>(&self, _message: &ReceivedOnionMessage<OMH, Self::CustomMessage>) {
143+
fn handle_custom_message<F: Fn(Self::CustomMessage, BlindedPath)>(&self, _message: &ReceivedOnionMessage<F, Self::CustomMessage>) {
144144
// Since we always return `None` in the read the handle method should never be called.
145145
unreachable!();
146146
}

lightning/src/onion_message/functional_tests.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ impl MessageRouter for TestMessageRouter {
7070
struct TestOffersMessageHandler {}
7171

7272
impl OffersMessageHandler for TestOffersMessageHandler {
73-
fn handle_message<OMH: OnionMessageHandler>(&self, _message: &ReceivedOnionMessage<OMH, OffersMessage>) {}
73+
fn handle_message<F: Fn(OffersMessage, BlindedPath)>(&self, _message: &ReceivedOnionMessage<F, OffersMessage>) {}
7474
}
7575

7676
#[derive(Clone, Debug, PartialEq)]
@@ -132,8 +132,8 @@ impl Drop for TestCustomMessageHandler {
132132

133133
impl CustomOnionMessageHandler for TestCustomMessageHandler {
134134
type CustomMessage = TestCustomMessage;
135-
fn handle_custom_message<OMH: OnionMessageHandler>(&self, message: &ReceivedOnionMessage<OMH, Self::CustomMessage>) {
136-
if let ReceivedOnionMessage::WithReplyPath{message, responder} = message {
135+
fn handle_custom_message<F: Fn(Self::CustomMessage, BlindedPath)>(&self, message: &ReceivedOnionMessage<F, Self::CustomMessage>) {
136+
if let ReceivedOnionMessage::WithReplyPath{responder, message, path_id: _} = message {
137137
match self.expected_messages.lock().unwrap().pop_front() {
138138
Some(expected_msg) => assert_eq!(expected_msg, *message),
139139
None => panic!("Unexpected message: {:?}", message),

lightning/src/onion_message/messenger.rs

Lines changed: 73 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ use crate::util::logger::Logger;
3232
use crate::util::ser::Writeable;
3333

3434
use core::fmt;
35+
use core::marker::PhantomData;
3536
use core::ops::Deref;
3637
use crate::io;
3738
use crate::sync::Mutex;
@@ -243,56 +244,79 @@ impl OnionMessageRecipient {
243244
}
244245
}
245246

247+
pub trait RespondFunction<T: OnionMessageContents>{
248+
fn respond(&self, response: T, reply_path: BlindedPath);
249+
}
250+
251+
impl<F, T> RespondFunction<T> for F
252+
where
253+
T: OnionMessageContents,
254+
F: Fn(T, BlindedPath)
255+
{
256+
fn respond(&self, response: T, reply_path: BlindedPath) {
257+
self(response, reply_path)
258+
}
259+
}
260+
246261
/// A struct handling response to an [`OnionMessage`]
247-
pub struct Responder<'a, OMH: OnionMessageHandler, T: OnionMessageContents> {
248-
messenger: &'a OMH,
262+
pub struct Responder<R, T>
263+
where
264+
R: RespondFunction<T>,
265+
T: OnionMessageContents
266+
{
267+
messenger_function: R,
249268
pub reply_path: BlindedPath,
250-
pub path_id: Option<[u8; 32]>,
251269
// This phantom Data is used to ensure that we use T in the struct definition
252270
// This allow us to ensure at compile time that the received message type and response type will be same
253-
_phantom: core::marker::PhantomData<T>
271+
_phantom: PhantomData<T>
254272
}
255273

256-
impl<'a, OMH: OnionMessageHandler, T: OnionMessageContents> Responder<'a, OMH, T> {
274+
impl<R, T> Responder<R, T>
275+
where
276+
R: RespondFunction<T>,
277+
T: OnionMessageContents
278+
{
257279
pub fn respond(&self, response: T) {
258280
// Utilising the fact that we ensure at compile time that
259281
// received message type, and response type will be same
260-
let message_type = T::msg_type(&response);
261-
self.messenger.handle_onion_message_response(
262-
response, self.reply_path.clone(), format_args!(
263-
"when responding to {} onion message with path_id {:02x?}",
264-
message_type,
265-
self.path_id
266-
)
267-
);
268-
}
282+
self.messenger_function.respond(response, self.reply_path.clone())
283+
}
269284
}
270285

271286
/// A enum to handle received [`OnionMessage`]
272-
pub enum ReceivedOnionMessage<'a, OMH: OnionMessageHandler, T: OnionMessageContents> {
287+
pub enum ReceivedOnionMessage<R, T>
288+
where
289+
R: RespondFunction<T>,
290+
T: OnionMessageContents
291+
{
273292
WithReplyPath {
293+
responder: Responder<R, T>,
274294
message: T,
275-
responder: Responder<'a, OMH, T>,
295+
path_id: Option<[u8; 32]>
276296
},
277297
WithoutReplyPath {
278298
message: T,
279299
path_id: Option<[u8; 32]>,
280300
},
281301
}
282302

283-
impl<'a, OMH: OnionMessageHandler, T: OnionMessageContents> ReceivedOnionMessage<'a, OMH, T> {
284-
fn new(messenger: &'a OMH, message: T, reply_path_option: Option<BlindedPath>, path_id: Option<[u8; 32]> ) -> Self {
303+
impl<R, T> ReceivedOnionMessage<R, T>
304+
where
305+
R: RespondFunction<T>,
306+
T: OnionMessageContents
307+
{
308+
fn new(messenger_function: R, message: T, reply_path_option: Option<BlindedPath>, path_id: Option<[u8; 32]> ) -> Self {
285309
match reply_path_option {
286310
Some(reply_path) => {
287311
let responder = Responder {
288-
messenger,
312+
messenger_function,
289313
reply_path,
290-
path_id,
291-
_phantom: std::marker::PhantomData
314+
_phantom: PhantomData
292315
};
293316
ReceivedOnionMessage::WithReplyPath {
317+
responder,
294318
message,
295-
responder
319+
path_id
296320
}
297321
}
298322
None => ReceivedOnionMessage::WithoutReplyPath {
@@ -560,7 +584,7 @@ pub trait CustomOnionMessageHandler {
560584
/// Called with the custom message that was received, returning a response to send, if any.
561585
///
562586
/// The returned [`Self::CustomMessage`], if any, is enqueued to be sent by [`OnionMessenger`].
563-
fn handle_custom_message<OMH: OnionMessageHandler>(&self, message: &ReceivedOnionMessage<OMH, Self::CustomMessage>);
587+
fn handle_custom_message<F: Fn(Self::CustomMessage, BlindedPath)>(&self, message: &ReceivedOnionMessage<F, Self::CustomMessage>);
564588

565589
/// Read a custom message of type `message_type` from `buffer`, returning `Ok(None)` if the
566590
/// message type is unknown.
@@ -965,11 +989,35 @@ where
965989

966990
match message {
967991
ParsedOnionMessageContents::Offers(msg) => {
968-
let message = ReceivedOnionMessage::new(self, msg, reply_path, path_id);
992+
// message_type is defined outside of closure to avoid burrowing
993+
// issues when using msg for creating ReceivedOnionMessage::New()
994+
let message_type = msg.msg_type();
995+
let closure = |response, reply_path: BlindedPath| {
996+
self.handle_onion_message_response(
997+
response, reply_path, format_args!(
998+
"when responding to {} onion message with path_id {:02x?}",
999+
message_type,
1000+
path_id
1001+
)
1002+
);
1003+
};
1004+
let message = ReceivedOnionMessage::new(closure, msg, reply_path, path_id);
9691005
self.offers_handler.handle_message(&message);
9701006
},
9711007
ParsedOnionMessageContents::Custom(msg) => {
972-
let message = ReceivedOnionMessage::new(self, msg, reply_path, path_id);
1008+
// message_type is defined outside of closure to avoid burrowing
1009+
// issues when using msg for creating ReceivedOnionMessage::New()
1010+
let message_type = msg.msg_type();
1011+
let closure = |response, reply_path: BlindedPath| {
1012+
self.handle_onion_message_response(
1013+
response, reply_path, format_args!(
1014+
"when responding to {} onion message with path_id {:02x?}",
1015+
message_type,
1016+
path_id
1017+
)
1018+
);
1019+
};
1020+
let message = ReceivedOnionMessage::new(closure, msg, reply_path, path_id);
9731021
self.custom_handler.handle_custom_message(&message);
9741022
},
9751023
}

lightning/src/onion_message/offers.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
1212
use core::convert::TryFrom;
1313
use core::fmt;
14+
use crate::blinded_path::BlindedPath;
1415
use crate::io::{self, Read};
1516
use crate::ln::msgs::{DecodeError, OnionMessageHandler};
1617
use crate::offers::invoice_error::InvoiceError;
@@ -42,7 +43,7 @@ pub trait OffersMessageHandler {
4243
/// The returned [`OffersMessage`], if any, is enqueued to be sent by [`OnionMessenger`].
4344
///
4445
/// [`OnionMessenger`]: crate::onion_message::messenger::OnionMessenger
45-
fn handle_message<OMH: OnionMessageHandler>(&self, message: &ReceivedOnionMessage<OMH, OffersMessage>);
46+
fn handle_message<F: Fn(OffersMessage, BlindedPath)>(&self, message: &ReceivedOnionMessage<F, OffersMessage>);
4647

4748
/// Releases any [`OffersMessage`]s that need to be sent.
4849
///

0 commit comments

Comments
 (0)