pub struct OnionMessenger<ES: Deref, NS: Deref, L: Deref, NL: Deref, MR: Deref, OMH: Deref, APH: Deref, DRH: Deref, CMH: Deref>where
ES::Target: EntropySource,
NS::Target: NodeSigner,
L::Target: Logger,
NL::Target: NodeIdLookUp,
MR::Target: MessageRouter,
OMH::Target: OffersMessageHandler,
APH::Target: AsyncPaymentsMessageHandler,
DRH::Target: DNSResolverMessageHandler,
CMH::Target: CustomOnionMessageHandler,{ /* private fields */ }Expand description
A sender, receiver and forwarder of OnionMessages.
§Handling Messages
OnionMessenger implements OnionMessageHandler, making it responsible for either forwarding
messages to peers or delegating to the appropriate handler for the message type. Currently, the
available handlers are:
OffersMessageHandler, for responding toInvoiceRequests and payingBolt12InvoicesCustomOnionMessageHandler, for handling user-defined message types
§Sending Messages
OnionMessages are sent initially using OnionMessenger::send_onion_message. When handling
a message, the matched handler may return a response message which OnionMessenger will send
on its behalf.
§Example
// Create the onion messenger. This must use the same `keys_manager` as is passed to your
// ChannelManager.
let onion_messenger = OnionMessenger::new(
&keys_manager, &keys_manager, logger, &node_id_lookup, message_router,
&offers_message_handler, &async_payments_message_handler, &dns_resolution_message_handler,
&custom_message_handler,
);
impl Writeable for YourCustomMessage {
fn write<W: Writer>(&self, w: &mut W) -> Result<(), io::Error> {
// Write your custom onion message to `w`
}
}
impl OnionMessageContents for YourCustomMessage {
fn tlv_type(&self) -> u64 {
your_custom_message_type
}
fn msg_type(&self) -> &'static str { "YourCustomMessageType" }
}
// Send a custom onion message to a node id.
let destination = Destination::Node(destination_node_id);
let instructions = MessageSendInstructions::WithoutReplyPath { destination };
onion_messenger.send_onion_message(message, instructions);
// Create a blinded path to yourself, for someone to send an onion message to.
let hops = [
MessageForwardNode { node_id: hop_node_id3, short_channel_id: None },
MessageForwardNode { node_id: hop_node_id4, short_channel_id: None },
];
let context = MessageContext::Custom(Vec::new());
let blinded_path = BlindedMessagePath::new(&hops, your_node_id, context, &keys_manager, &secp_ctx).unwrap();
// Send a custom onion message to a blinded path.
let destination = Destination::BlindedPath(blinded_path);
let instructions = MessageSendInstructions::WithoutReplyPath { destination };
onion_messenger.send_onion_message(message, instructions);Implementations§
Source§impl<ES: Deref, NS: Deref, L: Deref, NL: Deref, MR: Deref, OMH: Deref, APH: Deref, DRH: Deref, CMH: Deref> OnionMessenger<ES, NS, L, NL, MR, OMH, APH, DRH, CMH>where
ES::Target: EntropySource,
NS::Target: NodeSigner,
L::Target: Logger,
NL::Target: NodeIdLookUp,
MR::Target: MessageRouter,
OMH::Target: OffersMessageHandler,
APH::Target: AsyncPaymentsMessageHandler,
DRH::Target: DNSResolverMessageHandler,
CMH::Target: CustomOnionMessageHandler,
impl<ES: Deref, NS: Deref, L: Deref, NL: Deref, MR: Deref, OMH: Deref, APH: Deref, DRH: Deref, CMH: Deref> OnionMessenger<ES, NS, L, NL, MR, OMH, APH, DRH, CMH>where
ES::Target: EntropySource,
NS::Target: NodeSigner,
L::Target: Logger,
NL::Target: NodeIdLookUp,
MR::Target: MessageRouter,
OMH::Target: OffersMessageHandler,
APH::Target: AsyncPaymentsMessageHandler,
DRH::Target: DNSResolverMessageHandler,
CMH::Target: CustomOnionMessageHandler,
Sourcepub fn new(
entropy_source: ES,
node_signer: NS,
logger: L,
node_id_lookup: NL,
message_router: MR,
offers_handler: OMH,
async_payments_handler: APH,
dns_resolver: DRH,
custom_handler: CMH,
) -> Self
pub fn new( entropy_source: ES, node_signer: NS, logger: L, node_id_lookup: NL, message_router: MR, offers_handler: OMH, async_payments_handler: APH, dns_resolver: DRH, custom_handler: CMH, ) -> Self
Constructs a new OnionMessenger to send, forward, and delegate received onion messages to
their respective handlers.
Sourcepub fn new_with_offline_peer_interception(
entropy_source: ES,
node_signer: NS,
logger: L,
node_id_lookup: NL,
message_router: MR,
offers_handler: OMH,
async_payments_handler: APH,
dns_resolver: DRH,
custom_handler: CMH,
) -> Self
pub fn new_with_offline_peer_interception( entropy_source: ES, node_signer: NS, logger: L, node_id_lookup: NL, message_router: MR, offers_handler: OMH, async_payments_handler: APH, dns_resolver: DRH, custom_handler: CMH, ) -> Self
Similar to Self::new, but rather than dropping onion messages that are
intended to be forwarded to offline peers, we will intercept them for
later forwarding.
Interception flow:
- If an onion message for an offline peer is received,
OnionMessengerwill generate anEvent::OnionMessageIntercepted. Event handlers can then choose to persist this onion message for later forwarding, or drop it. - When the offline peer later comes back online,
OnionMessengerwill generate anEvent::OnionMessagePeerConnected. Event handlers will then fetch all previously intercepted onion messages for this peer. - Once the stored onion messages are fetched, they can finally be
forwarded to the now-online peer via
Self::forward_onion_message.
§Note
LDK will not rate limit how many Event::OnionMessageIntercepteds
are generated, so it is the caller’s responsibility to limit how many
onion messages are persisted and only persist onion messages for relevant
peers.
Sourcepub fn send_onion_message<T: OnionMessageContents>(
&self,
contents: T,
instructions: MessageSendInstructions,
) -> Result<SendSuccess, SendError>
pub fn send_onion_message<T: OnionMessageContents>( &self, contents: T, instructions: MessageSendInstructions, ) -> Result<SendSuccess, SendError>
Sends an OnionMessage based on its MessageSendInstructions.
Sourcepub fn forward_onion_message(
&self,
message: OnionMessage,
peer_node_id: &PublicKey,
) -> Result<(), SendError>
pub fn forward_onion_message( &self, message: OnionMessage, peer_node_id: &PublicKey, ) -> Result<(), SendError>
Forwards an OnionMessage to peer_node_id. Useful if we initialized
the OnionMessenger with Self::new_with_offline_peer_interception
and want to forward a previously intercepted onion message to a peer that
has just come online.
Sourcepub fn handle_onion_message_response<T: OnionMessageContents>(
&self,
response: T,
instructions: ResponseInstruction,
) -> Result<SendSuccess, SendError>
pub fn handle_onion_message_response<T: OnionMessageContents>( &self, response: T, instructions: ResponseInstruction, ) -> Result<SendSuccess, SendError>
Handles the response to an OnionMessage based on its ResponseInstruction,
enqueueing any response for sending.
This function is useful for asynchronous handling of OnionMessages.
Handlers have the option to return None, indicating that no immediate response should be
sent. Then, they can transfer the associated Responder to another task responsible for
generating the response asynchronously. Subsequently, when the response is prepared and
ready for sending, that task can invoke this method to enqueue the response for delivery.
Sourcepub fn get_update_future(&self) -> Future ⓘ
pub fn get_update_future(&self) -> Future ⓘ
Gets a Future that completes when an event is available via
EventsProvider::process_pending_events or Self::process_pending_events_async.
Note that callbacks registered on the Future MUST NOT call back into this
OnionMessenger and should instead register actions to be taken later.
Sourcepub async fn process_pending_events_async<Future: Future<Output = Result<(), ReplayEvent>> + Unpin, H: Fn(Event) -> Future>(
&self,
handler: H,
)
pub async fn process_pending_events_async<Future: Future<Output = Result<(), ReplayEvent>> + Unpin, H: Fn(Event) -> Future>( &self, handler: H, )
Processes any events asynchronously using the given handler.
Note that the event handler is called in the order each event was generated, however futures are polled in parallel for some events to allow for parallelism where events do not have an ordering requirement.
See the trait-level documentation of EventsProvider for requirements.
Trait Implementations§
Source§impl<ES: Deref, NS: Deref, L: Deref, NL: Deref, MR: Deref, OMH: Deref, APH: Deref, DRH: Deref, CMH: Deref> AOnionMessenger for OnionMessenger<ES, NS, L, NL, MR, OMH, APH, DRH, CMH>where
ES::Target: EntropySource,
NS::Target: NodeSigner,
L::Target: Logger,
NL::Target: NodeIdLookUp,
MR::Target: MessageRouter,
OMH::Target: OffersMessageHandler,
APH::Target: AsyncPaymentsMessageHandler,
DRH::Target: DNSResolverMessageHandler,
CMH::Target: CustomOnionMessageHandler,
impl<ES: Deref, NS: Deref, L: Deref, NL: Deref, MR: Deref, OMH: Deref, APH: Deref, DRH: Deref, CMH: Deref> AOnionMessenger for OnionMessenger<ES, NS, L, NL, MR, OMH, APH, DRH, CMH>where
ES::Target: EntropySource,
NS::Target: NodeSigner,
L::Target: Logger,
NL::Target: NodeIdLookUp,
MR::Target: MessageRouter,
OMH::Target: OffersMessageHandler,
APH::Target: AsyncPaymentsMessageHandler,
DRH::Target: DNSResolverMessageHandler,
CMH::Target: CustomOnionMessageHandler,
Source§type EntropySource = <ES as Deref>::Target
type EntropySource = <ES as Deref>::Target
EntropySourceSource§type ES = ES
type ES = ES
Self::EntropySourceSource§type NodeSigner = <NS as Deref>::Target
type NodeSigner = <NS as Deref>::Target
NodeSignerSource§type NS = NS
type NS = NS
Self::NodeSignerSource§type L = L
type L = L
Self::LoggerSource§type NodeIdLookUp = <NL as Deref>::Target
type NodeIdLookUp = <NL as Deref>::Target
NodeIdLookUpSource§type NL = NL
type NL = NL
Self::NodeIdLookUpSource§type MessageRouter = <MR as Deref>::Target
type MessageRouter = <MR as Deref>::Target
MessageRouterSource§type MR = MR
type MR = MR
Self::MessageRouterSource§type OffersMessageHandler = <OMH as Deref>::Target
type OffersMessageHandler = <OMH as Deref>::Target
OffersMessageHandlerSource§type OMH = OMH
type OMH = OMH
Self::OffersMessageHandlerSource§type AsyncPaymentsMessageHandler = <APH as Deref>::Target
type AsyncPaymentsMessageHandler = <APH as Deref>::Target
AsyncPaymentsMessageHandlerSource§type APH = APH
type APH = APH
Self::AsyncPaymentsMessageHandlerSource§type DNSResolverMessageHandler = <DRH as Deref>::Target
type DNSResolverMessageHandler = <DRH as Deref>::Target
DNSResolverMessageHandlerSource§type DRH = DRH
type DRH = DRH
Self::DNSResolverMessageHandlerSource§type CustomOnionMessageHandler = <CMH as Deref>::Target
type CustomOnionMessageHandler = <CMH as Deref>::Target
CustomOnionMessageHandlerSource§type CMH = CMH
type CMH = CMH
Self::CustomOnionMessageHandlerSource§fn get_om(&self) -> &OnionMessenger<ES, NS, L, NL, MR, OMH, APH, DRH, CMH>
fn get_om(&self) -> &OnionMessenger<ES, NS, L, NL, MR, OMH, APH, DRH, CMH>
OnionMessenger object.Source§impl<ES: Deref, NS: Deref, L: Deref, NL: Deref, MR: Deref, OMH: Deref, APH: Deref, DRH: Deref, CMH: Deref> EventsProvider for OnionMessenger<ES, NS, L, NL, MR, OMH, APH, DRH, CMH>where
ES::Target: EntropySource,
NS::Target: NodeSigner,
L::Target: Logger,
NL::Target: NodeIdLookUp,
MR::Target: MessageRouter,
OMH::Target: OffersMessageHandler,
APH::Target: AsyncPaymentsMessageHandler,
DRH::Target: DNSResolverMessageHandler,
CMH::Target: CustomOnionMessageHandler,
impl<ES: Deref, NS: Deref, L: Deref, NL: Deref, MR: Deref, OMH: Deref, APH: Deref, DRH: Deref, CMH: Deref> EventsProvider for OnionMessenger<ES, NS, L, NL, MR, OMH, APH, DRH, CMH>where
ES::Target: EntropySource,
NS::Target: NodeSigner,
L::Target: Logger,
NL::Target: NodeIdLookUp,
MR::Target: MessageRouter,
OMH::Target: OffersMessageHandler,
APH::Target: AsyncPaymentsMessageHandler,
DRH::Target: DNSResolverMessageHandler,
CMH::Target: CustomOnionMessageHandler,
Source§fn process_pending_events<H: Deref>(&self, handler: H)where
H::Target: EventHandler,
fn process_pending_events<H: Deref>(&self, handler: H)where
H::Target: EventHandler,
Source§impl<ES: Deref, NS: Deref, L: Deref, NL: Deref, MR: Deref, OMH: Deref, APH: Deref, DRH: Deref, CMH: Deref> OnionMessageHandler for OnionMessenger<ES, NS, L, NL, MR, OMH, APH, DRH, CMH>where
ES::Target: EntropySource,
NS::Target: NodeSigner,
L::Target: Logger,
NL::Target: NodeIdLookUp,
MR::Target: MessageRouter,
OMH::Target: OffersMessageHandler,
APH::Target: AsyncPaymentsMessageHandler,
DRH::Target: DNSResolverMessageHandler,
CMH::Target: CustomOnionMessageHandler,
impl<ES: Deref, NS: Deref, L: Deref, NL: Deref, MR: Deref, OMH: Deref, APH: Deref, DRH: Deref, CMH: Deref> OnionMessageHandler for OnionMessenger<ES, NS, L, NL, MR, OMH, APH, DRH, CMH>where
ES::Target: EntropySource,
NS::Target: NodeSigner,
L::Target: Logger,
NL::Target: NodeIdLookUp,
MR::Target: MessageRouter,
OMH::Target: OffersMessageHandler,
APH::Target: AsyncPaymentsMessageHandler,
DRH::Target: DNSResolverMessageHandler,
CMH::Target: CustomOnionMessageHandler,
Source§fn handle_onion_message(&self, peer_node_id: PublicKey, msg: &OnionMessage)
fn handle_onion_message(&self, peer_node_id: PublicKey, msg: &OnionMessage)
onion_message message from the given peer.Source§fn peer_connected(
&self,
their_node_id: PublicKey,
init: &Init,
_inbound: bool,
) -> Result<(), ()>
fn peer_connected( &self, their_node_id: PublicKey, init: &Init, _inbound: bool, ) -> Result<(), ()>
Source§fn peer_disconnected(&self, their_node_id: PublicKey)
fn peer_disconnected(&self, their_node_id: PublicKey)
Source§fn timer_tick_occurred(&self)
fn timer_tick_occurred(&self)
Source§fn provided_node_features(&self) -> NodeFeatures
fn provided_node_features(&self) -> NodeFeatures
NodeFeatures
which are broadcasted in our NodeAnnouncement message.Source§fn provided_init_features(&self, _their_node_id: PublicKey) -> InitFeatures
fn provided_init_features(&self, _their_node_id: PublicKey) -> InitFeatures
InitFeatures
which are sent in our Init message. Read more