Skip to content

Commit 3f89998

Browse files
Support generating events when an OM for an offline peer is received.
Docs will be added in upcoming commits.
1 parent 5e41425 commit 3f89998

File tree

2 files changed

+63
-0
lines changed

2 files changed

+63
-0
lines changed

lightning/src/events/mod.rs

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1036,6 +1036,13 @@ pub enum Event {
10361036
///
10371037
/// [`ChannelHandshakeConfig::negotiate_anchors_zero_fee_htlc_tx`]: crate::util::config::ChannelHandshakeConfig::negotiate_anchors_zero_fee_htlc_tx
10381038
BumpTransaction(BumpTransactionEvent),
1039+
///
1040+
OnionMessageForOfflinePeer {
1041+
/// The node id of the offline peer.
1042+
peer_node_id: PublicKey,
1043+
/// The onion message intended to be forwarded to `peer_node_id`.
1044+
message: msgs::OnionMessage,
1045+
},
10391046
}
10401047

10411048
impl Writeable for Event {
@@ -1281,6 +1288,13 @@ impl Writeable for Event {
12811288
35u8.write(writer)?;
12821289
// Never write ConnectionNeeded events as buffered onion messages aren't serialized.
12831290
},
1291+
&Event::OnionMessageForOfflinePeer { ref peer_node_id, ref message } => {
1292+
37u8.write(writer)?;
1293+
write_tlv_fields!(writer, {
1294+
(0, peer_node_id, required),
1295+
(2, message, required),
1296+
});
1297+
}
12841298
// Note that, going forward, all new events must only write data inside of
12851299
// `write_tlv_fields`. Versions 0.0.101+ will ignore odd-numbered events that write
12861300
// data via `write_tlv_fields`.
@@ -1692,6 +1706,18 @@ impl MaybeReadable for Event {
16921706
},
16931707
// Note that we do not write a length-prefixed TLV for ConnectionNeeded events.
16941708
35u8 => Ok(None),
1709+
37u8 => {
1710+
let f = || {
1711+
_init_and_read_len_prefixed_tlv_fields!(reader, {
1712+
(0, peer_node_id, required),
1713+
(2, message, required),
1714+
});
1715+
Ok(Some(Event::OnionMessageForOfflinePeer {
1716+
peer_node_id: peer_node_id.0.unwrap(), message: message.0.unwrap()
1717+
}))
1718+
};
1719+
f()
1720+
},
16951721
// Versions prior to 0.0.100 did not ignore odd types, instead returning InvalidValue.
16961722
// Version 0.0.100 failed to properly ignore odd types, possibly resulting in corrupt
16971723
// reads.

lightning/src/onion_message/messenger.rs

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,8 @@ where
172172
message_router: MR,
173173
offers_handler: OMH,
174174
custom_handler: CMH,
175+
intercept_oms_for_offline_peers: bool,
176+
pending_events: Mutex<Vec<Event>>,
175177
}
176178

177179
/// [`OnionMessage`]s buffered to be sent.
@@ -713,6 +715,27 @@ where
713715
pub fn new(
714716
entropy_source: ES, node_signer: NS, logger: L, message_router: MR, offers_handler: OMH,
715717
custom_handler: CMH
718+
) -> Self {
719+
Self::new_inner(
720+
entropy_source, node_signer, logger, message_router, offers_handler,
721+
custom_handler, false
722+
)
723+
}
724+
725+
///
726+
pub fn new_with_offline_peer_interception(
727+
entropy_source: ES, node_signer: NS, logger: L, message_router: MR, offers_handler: OMH,
728+
custom_handler: CMH
729+
) -> Self {
730+
Self::new_inner(
731+
entropy_source, node_signer, logger, message_router, offers_handler,
732+
custom_handler, true
733+
)
734+
}
735+
736+
fn new_inner(
737+
entropy_source: ES, node_signer: NS, logger: L, message_router: MR, offers_handler: OMH,
738+
custom_handler: CMH, intercept_oms_for_offline_peers: bool
716739
) -> Self {
717740
let mut secp_ctx = Secp256k1::new();
718741
secp_ctx.seeded_randomize(&entropy_source.get_secure_random_bytes());
@@ -725,6 +748,8 @@ where
725748
message_router,
726749
offers_handler,
727750
custom_handler,
751+
intercept_oms_for_offline_peers,
752+
pending_events: Mutex::new(Vec::new()),
728753
}
729754
}
730755

@@ -918,6 +943,11 @@ where
918943
}
919944
}
920945
}
946+
let mut events = Vec::new();
947+
core::mem::swap(&mut *self.pending_events.lock().unwrap(), &mut events);
948+
for ev in events {
949+
handler.handle_event(ev);
950+
}
921951
}
922952
}
923953

@@ -983,6 +1013,13 @@ where
9831013
e.get_mut().enqueue_message(onion_message);
9841014
log_trace!(logger, "Forwarding an onion message to peer {}", next_node_id);
9851015
},
1016+
_ if self.intercept_oms_for_offline_peers => {
1017+
self.pending_events.lock().unwrap().push(
1018+
Event::OnionMessageForOfflinePeer {
1019+
peer_node_id: next_node_id, message: onion_message
1020+
}
1021+
);
1022+
},
9861023
_ => {
9871024
log_trace!(
9881025
logger,

0 commit comments

Comments
 (0)