Skip to content

Commit 780cbe9

Browse files
committed
Replace EventsProvider on OnionMessageHandler with a single fn
`OnionMessageHandler`s are expected to regularly release a set of nodes which we need to directly connect to to deliver onion messages. In order to do so, they currently extend `EventsProvider`, returning that set as `Event::ConnectionNeeded`s. While this works fine in Rust, the `EventsProvider` interface doesn't map well in bindings due to it taking a flexible trait impl as a method argument. Instead, here, we convert `OnionMessageHandler` to include a single function which returns nodes in the form of a `node_id` and `Vec<SocketAddress>`. This is a bit simpler, if less flexible, API, and while largely equivalent, is easier to map in bindings.
1 parent 9b338cc commit 780cbe9

File tree

4 files changed

+28
-34
lines changed

4 files changed

+28
-34
lines changed

lightning-background-processor/src/lib.rs

Lines changed: 12 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -694,7 +694,10 @@ where
694694
persister, chain_monitor,
695695
chain_monitor.process_pending_events_async(async_event_handler).await,
696696
channel_manager, channel_manager.process_pending_events_async(async_event_handler).await,
697-
peer_manager, process_onion_message_handler_events_async(&peer_manager, async_event_handler).await,
697+
peer_manager,
698+
for event in onion_message_handler_events(peer_manager) {
699+
handler(event).await
700+
},
698701
gossip_sync, logger, scorer, should_break, {
699702
let fut = Selector {
700703
a: channel_manager.get_event_or_persistence_needed_future(),
@@ -719,23 +722,11 @@ where
719722
)
720723
}
721724

722-
#[cfg(feature = "futures")]
723-
async fn process_onion_message_handler_events_async<
724-
EventHandlerFuture: core::future::Future<Output = ()>,
725-
EventHandler: Fn(Event) -> EventHandlerFuture,
726-
PM: 'static + Deref + Send + Sync,
727-
>(
728-
peer_manager: &PM, handler: EventHandler
729-
)
730-
where
731-
PM::Target: APeerManager + Send + Sync,
732-
{
733-
let events = core::cell::RefCell::new(Vec::new());
734-
peer_manager.onion_message_handler().process_pending_events(&|e| events.borrow_mut().push(e));
735-
736-
for event in events.into_inner() {
737-
handler(event).await
738-
}
725+
fn onion_message_handler_events<PM: 'static + Deref + Send + Sync>(
726+
peer_manager: &PM
727+
) -> impl Iterator<Item=Event> where PM::Target: APeerManager + Send + Sync {
728+
peer_manager.onion_message_handler().get_and_clear_connections_needed()
729+
.into_iter().map(|(node_id, addresses)| Event::ConnectionNeeded { node_id, addresses })
739730
}
740731

741732
#[cfg(feature = "std")]
@@ -851,7 +842,9 @@ impl BackgroundProcessor {
851842
persister, chain_monitor, chain_monitor.process_pending_events(&event_handler),
852843
channel_manager, channel_manager.process_pending_events(&event_handler),
853844
peer_manager,
854-
peer_manager.onion_message_handler().process_pending_events(&event_handler),
845+
for event in onion_message_handler_events(&peer_manager) {
846+
event_handler.handle_event(event);
847+
},
855848
gossip_sync, logger, scorer, stop_thread.load(Ordering::Acquire),
856849
{ Sleeper::from_two_futures(
857850
channel_manager.get_event_or_persistence_needed_future(),

lightning/src/ln/msgs.rs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1632,7 +1632,16 @@ pub trait RoutingMessageHandler : MessageSendEventsProvider {
16321632
}
16331633

16341634
/// A handler for received [`OnionMessage`]s and for providing generated ones to send.
1635-
pub trait OnionMessageHandler: EventsProvider {
1635+
pub trait OnionMessageHandler {
1636+
/// Because much of the lightning network does not yet support forwarding onion messages, we
1637+
/// may need to directly connect to a node which will forward a message for us. In such a case,
1638+
/// this method will return the set of nodes which need connection by node_id and the
1639+
/// corresponding socket addresses where they may accept incoming connections.
1640+
///
1641+
/// Thus, this method should be polled regularly to detect messages await such a direct
1642+
/// connection.
1643+
fn get_and_clear_connections_needed(&self) -> Vec<(PublicKey, Vec<SocketAddress>)>;
1644+
16361645
/// Handle an incoming `onion_message` message from the given peer.
16371646
fn handle_onion_message(&self, peer_node_id: &PublicKey, msg: &OnionMessage);
16381647

lightning/src/ln/peer_handler.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,7 @@ impl RoutingMessageHandler for IgnoringMessageHandler {
123123
fn processing_queue_high(&self) -> bool { false }
124124
}
125125
impl OnionMessageHandler for IgnoringMessageHandler {
126+
fn get_and_clear_connections_needed(&self) -> Vec<(PublicKey, Vec<SocketAddress>)> { Vec::new() }
126127
fn handle_onion_message(&self, _their_node_id: &PublicKey, _msg: &msgs::OnionMessage) {}
127128
fn next_onion_message_for_peer(&self, _peer_node_id: PublicKey) -> Option<msgs::OnionMessage> { None }
128129
fn peer_connected(&self, _their_node_id: &PublicKey, _init: &msgs::Init, _inbound: bool) -> Result<(), ()> { Ok(()) }

lightning/src/onion_message/messenger.rs

Lines changed: 5 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -890,7 +890,7 @@ fn outbound_buffer_full(peer_node_id: &PublicKey, buffer: &HashMap<PublicKey, On
890890
false
891891
}
892892

893-
impl<ES: Deref, NS: Deref, L: Deref, MR: Deref, OMH: Deref, CMH: Deref> EventsProvider
893+
impl<ES: Deref, NS: Deref, L: Deref, MR: Deref, OMH: Deref, CMH: Deref> OnionMessageHandler
894894
for OnionMessenger<ES, NS, L, MR, OMH, CMH>
895895
where
896896
ES::Target: EntropySource,
@@ -900,27 +900,18 @@ where
900900
OMH::Target: OffersMessageHandler,
901901
CMH::Target: CustomOnionMessageHandler,
902902
{
903-
fn process_pending_events<H: Deref>(&self, handler: H) where H::Target: EventHandler {
903+
fn get_and_clear_connections_needed(&self) -> Vec<(PublicKey, Vec<SocketAddress>)> {
904+
let mut res = Vec::new();
904905
for (node_id, recipient) in self.message_recipients.lock().unwrap().iter_mut() {
905906
if let OnionMessageRecipient::PendingConnection(_, addresses, _) = recipient {
906907
if let Some(addresses) = addresses.take() {
907-
handler.handle_event(Event::ConnectionNeeded { node_id: *node_id, addresses });
908+
res.push((*node_id, addresses));
908909
}
909910
}
910911
}
912+
res
911913
}
912-
}
913914

914-
impl<ES: Deref, NS: Deref, L: Deref, MR: Deref, OMH: Deref, CMH: Deref> OnionMessageHandler
915-
for OnionMessenger<ES, NS, L, MR, OMH, CMH>
916-
where
917-
ES::Target: EntropySource,
918-
NS::Target: NodeSigner,
919-
L::Target: Logger,
920-
MR::Target: MessageRouter,
921-
OMH::Target: OffersMessageHandler,
922-
CMH::Target: CustomOnionMessageHandler,
923-
{
924915
fn handle_onion_message(&self, _peer_node_id: &PublicKey, msg: &OnionMessage) {
925916
match peel_onion_message(
926917
msg, &self.secp_ctx, &*self.node_signer, &*self.logger, &*self.custom_handler

0 commit comments

Comments
 (0)