mirror of
https://github.com/lightningdevkit/rust-lightning.git
synced 2025-02-24 15:02:20 +01:00
AsyncPaymentsMessageHandler trait for OnionMessenger
Add a trait for handling async payments messages to OnionMessenger. This allows users to either provide their own custom handling for async payments messages or rely on a version provided by LDK.
This commit is contained in:
parent
445ec8d508
commit
e8f154dd3c
7 changed files with 136 additions and 25 deletions
|
@ -12,6 +12,9 @@ use lightning::ln::msgs::{self, DecodeError, OnionMessageHandler};
|
|||
use lightning::ln::script::ShutdownScript;
|
||||
use lightning::offers::invoice::UnsignedBolt12Invoice;
|
||||
use lightning::offers::invoice_request::UnsignedInvoiceRequest;
|
||||
use lightning::onion_message::async_payments::{
|
||||
AsyncPaymentsMessage, AsyncPaymentsMessageHandler, HeldHtlcAvailable, ReleaseHeldHtlc,
|
||||
};
|
||||
use lightning::onion_message::messenger::{
|
||||
CustomOnionMessageHandler, Destination, MessageRouter, OnionMessagePath, OnionMessenger,
|
||||
PendingOnionMessage, Responder, ResponseInstruction,
|
||||
|
@ -39,6 +42,7 @@ pub fn do_test<L: Logger>(data: &[u8], logger: &L) {
|
|||
let node_id_lookup = EmptyNodeIdLookUp {};
|
||||
let message_router = TestMessageRouter {};
|
||||
let offers_msg_handler = TestOffersMessageHandler {};
|
||||
let async_payments_msg_handler = TestAsyncPaymentsMessageHandler {};
|
||||
let custom_msg_handler = TestCustomMessageHandler {};
|
||||
let onion_messenger = OnionMessenger::new(
|
||||
&keys_manager,
|
||||
|
@ -47,6 +51,7 @@ pub fn do_test<L: Logger>(data: &[u8], logger: &L) {
|
|||
&node_id_lookup,
|
||||
&message_router,
|
||||
&offers_msg_handler,
|
||||
&async_payments_msg_handler,
|
||||
&custom_msg_handler,
|
||||
);
|
||||
|
||||
|
@ -105,6 +110,17 @@ impl OffersMessageHandler for TestOffersMessageHandler {
|
|||
}
|
||||
}
|
||||
|
||||
struct TestAsyncPaymentsMessageHandler {}
|
||||
|
||||
impl AsyncPaymentsMessageHandler for TestAsyncPaymentsMessageHandler {
|
||||
fn held_htlc_available(
|
||||
&self, _message: HeldHtlcAvailable, _responder: Option<Responder>,
|
||||
) -> ResponseInstruction<ReleaseHeldHtlc> {
|
||||
ResponseInstruction::NoResponse
|
||||
}
|
||||
fn release_held_htlc(&self, _message: ReleaseHeldHtlc) {}
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
struct TestCustomMessage {}
|
||||
|
||||
|
|
|
@ -568,7 +568,7 @@ use core::task;
|
|||
/// # type NetworkGraph = lightning::routing::gossip::NetworkGraph<Arc<Logger>>;
|
||||
/// # type P2PGossipSync<UL> = lightning::routing::gossip::P2PGossipSync<Arc<NetworkGraph>, Arc<UL>, Arc<Logger>>;
|
||||
/// # type ChannelManager<B, F, FE> = lightning::ln::channelmanager::SimpleArcChannelManager<ChainMonitor<B, F, FE>, B, FE, Logger>;
|
||||
/// # type OnionMessenger<B, F, FE> = lightning::onion_message::messenger::OnionMessenger<Arc<lightning::sign::KeysManager>, Arc<lightning::sign::KeysManager>, Arc<Logger>, Arc<ChannelManager<B, F, FE>>, Arc<lightning::onion_message::messenger::DefaultMessageRouter<Arc<NetworkGraph>, Arc<Logger>, Arc<lightning::sign::KeysManager>>>, Arc<ChannelManager<B, F, FE>>, lightning::ln::peer_handler::IgnoringMessageHandler>;
|
||||
/// # type OnionMessenger<B, F, FE> = lightning::onion_message::messenger::OnionMessenger<Arc<lightning::sign::KeysManager>, Arc<lightning::sign::KeysManager>, Arc<Logger>, Arc<ChannelManager<B, F, FE>>, Arc<lightning::onion_message::messenger::DefaultMessageRouter<Arc<NetworkGraph>, Arc<Logger>, Arc<lightning::sign::KeysManager>>>, Arc<ChannelManager<B, F, FE>>, lightning::ln::peer_handler::IgnoringMessageHandler, lightning::ln::peer_handler::IgnoringMessageHandler>;
|
||||
/// # type Scorer = RwLock<lightning::routing::scoring::ProbabilisticScorer<Arc<NetworkGraph>, Arc<Logger>>>;
|
||||
/// # type PeerManager<B, F, FE, UL> = lightning::ln::peer_handler::SimpleArcPeerManager<SocketDescriptor, ChainMonitor<B, F, FE>, B, FE, Arc<UL>, Logger>;
|
||||
/// #
|
||||
|
@ -996,7 +996,7 @@ mod tests {
|
|||
type PGS = Arc<P2PGossipSync<Arc<NetworkGraph<Arc<test_utils::TestLogger>>>, Arc<test_utils::TestChainSource>, Arc<test_utils::TestLogger>>>;
|
||||
type RGS = Arc<RapidGossipSync<Arc<NetworkGraph<Arc<test_utils::TestLogger>>>, Arc<test_utils::TestLogger>>>;
|
||||
|
||||
type OM = OnionMessenger<Arc<KeysManager>, Arc<KeysManager>, Arc<test_utils::TestLogger>, Arc<ChannelManager>, Arc<DefaultMessageRouter<Arc<NetworkGraph<Arc<test_utils::TestLogger>>>, Arc<test_utils::TestLogger>, Arc<KeysManager>>>, IgnoringMessageHandler, IgnoringMessageHandler>;
|
||||
type OM = OnionMessenger<Arc<KeysManager>, Arc<KeysManager>, Arc<test_utils::TestLogger>, Arc<ChannelManager>, Arc<DefaultMessageRouter<Arc<NetworkGraph<Arc<test_utils::TestLogger>>>, Arc<test_utils::TestLogger>, Arc<KeysManager>>>, IgnoringMessageHandler, IgnoringMessageHandler, IgnoringMessageHandler>;
|
||||
|
||||
struct Node {
|
||||
node: Arc<ChannelManager>,
|
||||
|
@ -1291,7 +1291,7 @@ mod tests {
|
|||
let best_block = BestBlock::from_network(network);
|
||||
let params = ChainParameters { network, best_block };
|
||||
let manager = Arc::new(ChannelManager::new(fee_estimator.clone(), chain_monitor.clone(), tx_broadcaster.clone(), router.clone(), logger.clone(), keys_manager.clone(), keys_manager.clone(), keys_manager.clone(), UserConfig::default(), params, genesis_block.header.time));
|
||||
let messenger = Arc::new(OnionMessenger::new(keys_manager.clone(), keys_manager.clone(), logger.clone(), manager.clone(), msg_router.clone(), IgnoringMessageHandler {}, IgnoringMessageHandler {}));
|
||||
let messenger = Arc::new(OnionMessenger::new(keys_manager.clone(), keys_manager.clone(), logger.clone(), manager.clone(), msg_router.clone(), IgnoringMessageHandler {}, IgnoringMessageHandler {}, IgnoringMessageHandler {}));
|
||||
let wallet = Arc::new(TestWallet {});
|
||||
let sweeper = Arc::new(OutputSweeper::new(best_block, Arc::clone(&tx_broadcaster), Arc::clone(&fee_estimator),
|
||||
None::<Arc<dyn Filter + Sync + Send>>, Arc::clone(&keys_manager), wallet, Arc::clone(&kv_store), Arc::clone(&logger)));
|
||||
|
|
|
@ -421,6 +421,7 @@ type TestOnionMessenger<'chan_man, 'node_cfg, 'chan_mon_cfg> = OnionMessenger<
|
|||
&'node_cfg test_utils::TestMessageRouter<'chan_mon_cfg>,
|
||||
&'chan_man TestChannelManager<'node_cfg, 'chan_mon_cfg>,
|
||||
IgnoringMessageHandler,
|
||||
IgnoringMessageHandler,
|
||||
>;
|
||||
|
||||
/// For use with [`OnionMessenger`] otherwise `test_restored_packages_retry` will fail. This is
|
||||
|
@ -3228,7 +3229,7 @@ pub fn create_network<'a, 'b: 'a, 'c: 'b>(node_count: usize, cfgs: &'b Vec<NodeC
|
|||
let dedicated_entropy = DedicatedEntropy(RandomBytes::new([i as u8; 32]));
|
||||
let onion_messenger = OnionMessenger::new(
|
||||
dedicated_entropy, cfgs[i].keys_manager, cfgs[i].logger, &chan_mgrs[i],
|
||||
&cfgs[i].message_router, &chan_mgrs[i], IgnoringMessageHandler {},
|
||||
&cfgs[i].message_router, &chan_mgrs[i], IgnoringMessageHandler {}, IgnoringMessageHandler {},
|
||||
);
|
||||
let gossip_sync = P2PGossipSync::new(cfgs[i].network_graph.as_ref(), None, cfgs[i].logger);
|
||||
let wallet_source = Arc::new(test_utils::TestWalletSource::new(SecretKey::from_slice(&[i as u8 + 1; 32]).unwrap()));
|
||||
|
|
|
@ -28,6 +28,7 @@ use crate::util::ser::{VecWriter, Writeable, Writer};
|
|||
use crate::ln::peer_channel_encryptor::{PeerChannelEncryptor, NextNoiseStep, MessageBuf, MSG_BUF_ALLOC_SIZE};
|
||||
use crate::ln::wire;
|
||||
use crate::ln::wire::{Encode, Type};
|
||||
use crate::onion_message::async_payments::{AsyncPaymentsMessageHandler, HeldHtlcAvailable, ReleaseHeldHtlc};
|
||||
use crate::onion_message::messenger::{CustomOnionMessageHandler, PendingOnionMessage, Responder, ResponseInstruction};
|
||||
use crate::onion_message::offers::{OffersMessage, OffersMessageHandler};
|
||||
use crate::onion_message::packet::OnionMessageContents;
|
||||
|
@ -148,6 +149,14 @@ impl OffersMessageHandler for IgnoringMessageHandler {
|
|||
ResponseInstruction::NoResponse
|
||||
}
|
||||
}
|
||||
impl AsyncPaymentsMessageHandler for IgnoringMessageHandler {
|
||||
fn held_htlc_available(
|
||||
&self, _message: HeldHtlcAvailable, _responder: Option<Responder>,
|
||||
) -> ResponseInstruction<ReleaseHeldHtlc> {
|
||||
ResponseInstruction::NoResponse
|
||||
}
|
||||
fn release_held_htlc(&self, _message: ReleaseHeldHtlc) {}
|
||||
}
|
||||
impl CustomOnionMessageHandler for IgnoringMessageHandler {
|
||||
type CustomMessage = Infallible;
|
||||
fn handle_custom_message(&self, _message: Self::CustomMessage, _responder: Option<Responder>) -> ResponseInstruction<Self::CustomMessage> {
|
||||
|
|
|
@ -11,13 +11,55 @@
|
|||
|
||||
use crate::io;
|
||||
use crate::ln::msgs::DecodeError;
|
||||
use crate::onion_message::messenger::PendingOnionMessage;
|
||||
use crate::onion_message::messenger::{Responder, ResponseInstruction};
|
||||
use crate::onion_message::packet::OnionMessageContents;
|
||||
use crate::prelude::*;
|
||||
use crate::util::ser::{Readable, ReadableArgs, Writeable, Writer};
|
||||
|
||||
// TLV record types for the `onionmsg_tlv` TLV stream as defined in BOLT 4.
|
||||
const HELD_HTLC_AVAILABLE_TLV_TYPE: u64 = 72;
|
||||
const RELEASE_HELD_HTLC_TLV_TYPE: u64 = 74;
|
||||
|
||||
/// A handler for an [`OnionMessage`] containing an async payments message as its payload.
|
||||
///
|
||||
/// [`OnionMessage`]: crate::ln::msgs::OnionMessage
|
||||
pub trait AsyncPaymentsMessageHandler {
|
||||
/// Handle a [`HeldHtlcAvailable`] message. A [`ReleaseHeldHtlc`] should be returned to release
|
||||
/// the held funds.
|
||||
fn held_htlc_available(
|
||||
&self, message: HeldHtlcAvailable, responder: Option<Responder>,
|
||||
) -> ResponseInstruction<ReleaseHeldHtlc>;
|
||||
|
||||
/// Handle a [`ReleaseHeldHtlc`] message. If authentication of the message succeeds, an HTLC
|
||||
/// should be released to the corresponding payee.
|
||||
fn release_held_htlc(&self, message: ReleaseHeldHtlc);
|
||||
|
||||
/// Release any [`AsyncPaymentsMessage`]s that need to be sent.
|
||||
///
|
||||
/// Typically, this is used for messages initiating an async payment flow rather than in response
|
||||
/// to another message.
|
||||
#[cfg(not(c_bindings))]
|
||||
fn release_pending_messages(&self) -> Vec<PendingOnionMessage<AsyncPaymentsMessage>> {
|
||||
vec![]
|
||||
}
|
||||
|
||||
/// Release any [`AsyncPaymentsMessage`]s that need to be sent.
|
||||
///
|
||||
/// Typically, this is used for messages initiating a payment flow rather than in response to
|
||||
/// another message.
|
||||
#[cfg(c_bindings)]
|
||||
fn release_pending_messages(
|
||||
&self,
|
||||
) -> Vec<(
|
||||
AsyncPaymentsMessage,
|
||||
crate::onion_message::messenger::Destination,
|
||||
Option<crate::blinded_path::BlindedPath>,
|
||||
)> {
|
||||
vec![]
|
||||
}
|
||||
}
|
||||
|
||||
/// Possible async payment messages sent and received via an [`OnionMessage`].
|
||||
///
|
||||
/// [`OnionMessage`]: crate::ln::msgs::OnionMessage
|
||||
|
|
|
@ -19,6 +19,7 @@ use crate::routing::test_utils::{add_channel, add_or_update_node};
|
|||
use crate::sign::{NodeSigner, Recipient};
|
||||
use crate::util::ser::{FixedLengthReader, LengthReadable, Writeable, Writer};
|
||||
use crate::util::test_utils;
|
||||
use super::async_payments::{AsyncPaymentsMessageHandler, HeldHtlcAvailable, ReleaseHeldHtlc};
|
||||
use super::messenger::{CustomOnionMessageHandler, DefaultMessageRouter, Destination, OnionMessagePath, OnionMessenger, PendingOnionMessage, Responder, ResponseInstruction, SendError, SendSuccess};
|
||||
use super::offers::{OffersMessage, OffersMessageHandler};
|
||||
use super::packet::{OnionMessageContents, Packet};
|
||||
|
@ -50,6 +51,7 @@ struct MessengerNode {
|
|||
Arc<test_utils::TestKeysInterface>
|
||||
>>,
|
||||
Arc<TestOffersMessageHandler>,
|
||||
Arc<TestAsyncPaymentsMessageHandler>,
|
||||
Arc<TestCustomMessageHandler>
|
||||
>,
|
||||
custom_message_handler: Arc<TestCustomMessageHandler>,
|
||||
|
@ -79,6 +81,17 @@ impl OffersMessageHandler for TestOffersMessageHandler {
|
|||
}
|
||||
}
|
||||
|
||||
struct TestAsyncPaymentsMessageHandler {}
|
||||
|
||||
impl AsyncPaymentsMessageHandler for TestAsyncPaymentsMessageHandler {
|
||||
fn held_htlc_available(
|
||||
&self, _message: HeldHtlcAvailable, _responder: Option<Responder>,
|
||||
) -> ResponseInstruction<ReleaseHeldHtlc> {
|
||||
ResponseInstruction::NoResponse
|
||||
}
|
||||
fn release_held_htlc(&self, _message: ReleaseHeldHtlc) {}
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug, PartialEq)]
|
||||
enum TestCustomMessage {
|
||||
Ping,
|
||||
|
@ -249,18 +262,19 @@ fn create_nodes_using_cfgs(cfgs: Vec<MessengerCfg>) -> Vec<MessengerNode> {
|
|||
DefaultMessageRouter::new(network_graph.clone(), entropy_source.clone())
|
||||
);
|
||||
let offers_message_handler = Arc::new(TestOffersMessageHandler {});
|
||||
let async_payments_message_handler = Arc::new(TestAsyncPaymentsMessageHandler {});
|
||||
let custom_message_handler = Arc::new(TestCustomMessageHandler::new());
|
||||
let messenger = if cfg.intercept_offline_peer_oms {
|
||||
OnionMessenger::new_with_offline_peer_interception(
|
||||
entropy_source.clone(), node_signer.clone(), logger.clone(),
|
||||
node_id_lookup, message_router, offers_message_handler,
|
||||
custom_message_handler.clone()
|
||||
async_payments_message_handler, custom_message_handler.clone()
|
||||
)
|
||||
} else {
|
||||
OnionMessenger::new(
|
||||
entropy_source.clone(), node_signer.clone(), logger.clone(),
|
||||
node_id_lookup, message_router, offers_message_handler,
|
||||
custom_message_handler.clone()
|
||||
async_payments_message_handler, custom_message_handler.clone()
|
||||
)
|
||||
};
|
||||
nodes.push(MessengerNode {
|
||||
|
|
|
@ -24,6 +24,7 @@ use crate::ln::features::{InitFeatures, NodeFeatures};
|
|||
use crate::ln::msgs::{self, OnionMessage, OnionMessageHandler, SocketAddress};
|
||||
use crate::ln::onion_utils;
|
||||
use crate::routing::gossip::{NetworkGraph, NodeId, ReadOnlyNetworkGraph};
|
||||
use super::async_payments::{AsyncPaymentsMessage, AsyncPaymentsMessageHandler};
|
||||
use super::packet::OnionMessageContents;
|
||||
use super::packet::ParsedOnionMessageContents;
|
||||
use super::offers::OffersMessageHandler;
|
||||
|
@ -76,22 +77,27 @@ pub trait AOnionMessenger {
|
|||
type OffersMessageHandler: OffersMessageHandler + ?Sized;
|
||||
/// A type that may be dereferenced to [`Self::OffersMessageHandler`]
|
||||
type OMH: Deref<Target = Self::OffersMessageHandler>;
|
||||
/// A type implementing [`AsyncPaymentsMessageHandler`]
|
||||
type AsyncPaymentsMessageHandler: AsyncPaymentsMessageHandler + ?Sized;
|
||||
/// A type that may be dereferenced to [`Self::AsyncPaymentsMessageHandler`]
|
||||
type APH: Deref<Target = Self::AsyncPaymentsMessageHandler>;
|
||||
/// A type implementing [`CustomOnionMessageHandler`]
|
||||
type CustomOnionMessageHandler: CustomOnionMessageHandler + ?Sized;
|
||||
/// A type that may be dereferenced to [`Self::CustomOnionMessageHandler`]
|
||||
type CMH: Deref<Target = Self::CustomOnionMessageHandler>;
|
||||
/// Returns a reference to the actual [`OnionMessenger`] object.
|
||||
fn get_om(&self) -> &OnionMessenger<Self::ES, Self::NS, Self::L, Self::NL, Self::MR, Self::OMH, Self::CMH>;
|
||||
fn get_om(&self) -> &OnionMessenger<Self::ES, Self::NS, Self::L, Self::NL, Self::MR, Self::OMH, Self::APH, Self::CMH>;
|
||||
}
|
||||
|
||||
impl<ES: Deref, NS: Deref, L: Deref, NL: Deref, MR: Deref, OMH: Deref, CMH: Deref> AOnionMessenger
|
||||
for OnionMessenger<ES, NS, L, NL, MR, OMH, CMH> where
|
||||
impl<ES: Deref, NS: Deref, L: Deref, NL: Deref, MR: Deref, OMH: Deref, APH: Deref, CMH: Deref> AOnionMessenger
|
||||
for OnionMessenger<ES, NS, L, NL, MR, OMH, APH, CMH> where
|
||||
ES::Target: EntropySource,
|
||||
NS::Target: NodeSigner,
|
||||
L::Target: Logger,
|
||||
NL::Target: NodeIdLookUp,
|
||||
MR::Target: MessageRouter,
|
||||
OMH::Target: OffersMessageHandler,
|
||||
APH:: Target: AsyncPaymentsMessageHandler,
|
||||
CMH::Target: CustomOnionMessageHandler,
|
||||
{
|
||||
type EntropySource = ES::Target;
|
||||
|
@ -106,9 +112,11 @@ for OnionMessenger<ES, NS, L, NL, MR, OMH, CMH> where
|
|||
type MR = MR;
|
||||
type OffersMessageHandler = OMH::Target;
|
||||
type OMH = OMH;
|
||||
type AsyncPaymentsMessageHandler = APH::Target;
|
||||
type APH = APH;
|
||||
type CustomOnionMessageHandler = CMH::Target;
|
||||
type CMH = CMH;
|
||||
fn get_om(&self) -> &OnionMessenger<ES, NS, L, NL, MR, OMH, CMH> { self }
|
||||
fn get_om(&self) -> &OnionMessenger<ES, NS, L, NL, MR, OMH, APH, CMH> { self }
|
||||
}
|
||||
|
||||
/// A sender, receiver and forwarder of [`OnionMessage`]s.
|
||||
|
@ -180,11 +188,12 @@ for OnionMessenger<ES, NS, L, NL, MR, OMH, CMH> where
|
|||
/// # let message_router = Arc::new(FakeMessageRouter {});
|
||||
/// # let custom_message_handler = IgnoringMessageHandler {};
|
||||
/// # let offers_message_handler = IgnoringMessageHandler {};
|
||||
/// # let async_payments_message_handler = IgnoringMessageHandler {};
|
||||
/// // 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, &custom_message_handler
|
||||
/// &offers_message_handler, &async_payments_message_handler, &custom_message_handler
|
||||
/// );
|
||||
|
||||
/// # #[derive(Debug)]
|
||||
|
@ -225,14 +234,16 @@ for OnionMessenger<ES, NS, L, NL, MR, OMH, CMH> where
|
|||
///
|
||||
/// [`InvoiceRequest`]: crate::offers::invoice_request::InvoiceRequest
|
||||
/// [`Bolt12Invoice`]: crate::offers::invoice::Bolt12Invoice
|
||||
pub struct OnionMessenger<ES: Deref, NS: Deref, L: Deref, NL: Deref, MR: Deref, OMH: Deref, CMH: Deref>
|
||||
where
|
||||
pub struct OnionMessenger<
|
||||
ES: Deref, NS: Deref, L: Deref, NL: Deref, MR: Deref, OMH: Deref, APH: 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,
|
||||
CMH::Target: CustomOnionMessageHandler,
|
||||
{
|
||||
entropy_source: ES,
|
||||
|
@ -243,6 +254,7 @@ where
|
|||
node_id_lookup: NL,
|
||||
message_router: MR,
|
||||
offers_handler: OMH,
|
||||
async_payments_handler: APH,
|
||||
custom_handler: CMH,
|
||||
intercept_messages_for_offline_peers: bool,
|
||||
pending_events: Mutex<PendingEvents>,
|
||||
|
@ -986,8 +998,8 @@ where
|
|||
}
|
||||
}
|
||||
|
||||
impl<ES: Deref, NS: Deref, L: Deref, NL: Deref, MR: Deref, OMH: Deref, CMH: Deref>
|
||||
OnionMessenger<ES, NS, L, NL, MR, OMH, CMH>
|
||||
impl<ES: Deref, NS: Deref, L: Deref, NL: Deref, MR: Deref, OMH: Deref, APH: Deref, CMH: Deref>
|
||||
OnionMessenger<ES, NS, L, NL, MR, OMH, APH, CMH>
|
||||
where
|
||||
ES::Target: EntropySource,
|
||||
NS::Target: NodeSigner,
|
||||
|
@ -995,17 +1007,18 @@ where
|
|||
NL::Target: NodeIdLookUp,
|
||||
MR::Target: MessageRouter,
|
||||
OMH::Target: OffersMessageHandler,
|
||||
APH::Target: AsyncPaymentsMessageHandler,
|
||||
CMH::Target: CustomOnionMessageHandler,
|
||||
{
|
||||
/// Constructs a new `OnionMessenger` to send, forward, and delegate received onion messages to
|
||||
/// their respective handlers.
|
||||
pub fn new(
|
||||
entropy_source: ES, node_signer: NS, logger: L, node_id_lookup: NL, message_router: MR,
|
||||
offers_handler: OMH, custom_handler: CMH
|
||||
offers_handler: OMH, async_payments_handler: APH, custom_handler: CMH
|
||||
) -> Self {
|
||||
Self::new_inner(
|
||||
entropy_source, node_signer, logger, node_id_lookup, message_router,
|
||||
offers_handler, custom_handler, false
|
||||
offers_handler, async_payments_handler, custom_handler, false
|
||||
)
|
||||
}
|
||||
|
||||
|
@ -1032,17 +1045,17 @@ where
|
|||
/// peers.
|
||||
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, custom_handler: CMH
|
||||
message_router: MR, offers_handler: OMH, async_payments_handler: APH, custom_handler: CMH
|
||||
) -> Self {
|
||||
Self::new_inner(
|
||||
entropy_source, node_signer, logger, node_id_lookup, message_router,
|
||||
offers_handler, custom_handler, true
|
||||
offers_handler, async_payments_handler, custom_handler, true
|
||||
)
|
||||
}
|
||||
|
||||
fn new_inner(
|
||||
entropy_source: ES, node_signer: NS, logger: L, node_id_lookup: NL,
|
||||
message_router: MR, offers_handler: OMH, custom_handler: CMH,
|
||||
message_router: MR, offers_handler: OMH, async_payments_handler: APH, custom_handler: CMH,
|
||||
intercept_messages_for_offline_peers: bool
|
||||
) -> Self {
|
||||
let mut secp_ctx = Secp256k1::new();
|
||||
|
@ -1056,6 +1069,7 @@ where
|
|||
node_id_lookup,
|
||||
message_router,
|
||||
offers_handler,
|
||||
async_payments_handler,
|
||||
custom_handler,
|
||||
intercept_messages_for_offline_peers,
|
||||
pending_events: Mutex::new(PendingEvents {
|
||||
|
@ -1360,8 +1374,8 @@ fn outbound_buffer_full(peer_node_id: &PublicKey, buffer: &HashMap<PublicKey, On
|
|||
false
|
||||
}
|
||||
|
||||
impl<ES: Deref, NS: Deref, L: Deref, NL: Deref, MR: Deref, OMH: Deref, CMH: Deref> EventsProvider
|
||||
for OnionMessenger<ES, NS, L, NL, MR, OMH, CMH>
|
||||
impl<ES: Deref, NS: Deref, L: Deref, NL: Deref, MR: Deref, OMH: Deref, APH: Deref, CMH: Deref> EventsProvider
|
||||
for OnionMessenger<ES, NS, L, NL, MR, OMH, APH, CMH>
|
||||
where
|
||||
ES::Target: EntropySource,
|
||||
NS::Target: NodeSigner,
|
||||
|
@ -1369,6 +1383,7 @@ where
|
|||
NL::Target: NodeIdLookUp,
|
||||
MR::Target: MessageRouter,
|
||||
OMH::Target: OffersMessageHandler,
|
||||
APH::Target: AsyncPaymentsMessageHandler,
|
||||
CMH::Target: CustomOnionMessageHandler,
|
||||
{
|
||||
fn process_pending_events<H: Deref>(&self, handler: H) where H::Target: EventHandler {
|
||||
|
@ -1400,8 +1415,8 @@ where
|
|||
}
|
||||
}
|
||||
|
||||
impl<ES: Deref, NS: Deref, L: Deref, NL: Deref, MR: Deref, OMH: Deref, CMH: Deref> OnionMessageHandler
|
||||
for OnionMessenger<ES, NS, L, NL, MR, OMH, CMH>
|
||||
impl<ES: Deref, NS: Deref, L: Deref, NL: Deref, MR: Deref, OMH: Deref, APH: Deref, CMH: Deref> OnionMessageHandler
|
||||
for OnionMessenger<ES, NS, L, NL, MR, OMH, APH, CMH>
|
||||
where
|
||||
ES::Target: EntropySource,
|
||||
NS::Target: NodeSigner,
|
||||
|
@ -1409,6 +1424,7 @@ where
|
|||
NL::Target: NodeIdLookUp,
|
||||
MR::Target: MessageRouter,
|
||||
OMH::Target: OffersMessageHandler,
|
||||
APH::Target: AsyncPaymentsMessageHandler,
|
||||
CMH::Target: CustomOnionMessageHandler,
|
||||
{
|
||||
fn handle_onion_message(&self, peer_node_id: &PublicKey, msg: &OnionMessage) {
|
||||
|
@ -1428,7 +1444,18 @@ where
|
|||
let response_instructions = self.offers_handler.handle_message(msg, responder);
|
||||
let _ = self.handle_onion_message_response(response_instructions);
|
||||
},
|
||||
ParsedOnionMessageContents::AsyncPayments(_msg) => todo!(),
|
||||
ParsedOnionMessageContents::AsyncPayments(AsyncPaymentsMessage::HeldHtlcAvailable(msg)) => {
|
||||
let responder = reply_path.map(
|
||||
|reply_path| Responder::new(reply_path, path_id)
|
||||
);
|
||||
let response_instructions = self.async_payments_handler.held_htlc_available(
|
||||
msg, responder
|
||||
);
|
||||
let _ = self.handle_onion_message_response(response_instructions);
|
||||
},
|
||||
ParsedOnionMessageContents::AsyncPayments(AsyncPaymentsMessage::ReleaseHeldHtlc(msg)) => {
|
||||
self.async_payments_handler.release_held_htlc(msg);
|
||||
},
|
||||
ParsedOnionMessageContents::Custom(msg) => {
|
||||
let responder = reply_path.map(
|
||||
|reply_path| Responder::new(reply_path, path_id)
|
||||
|
@ -1600,6 +1627,7 @@ pub type SimpleArcOnionMessenger<M, T, F, L> = OnionMessenger<
|
|||
Arc<SimpleArcChannelManager<M, T, F, L>>,
|
||||
Arc<DefaultMessageRouter<Arc<NetworkGraph<Arc<L>>>, Arc<L>, Arc<KeysManager>>>,
|
||||
Arc<SimpleArcChannelManager<M, T, F, L>>,
|
||||
IgnoringMessageHandler,
|
||||
IgnoringMessageHandler
|
||||
>;
|
||||
|
||||
|
@ -1620,6 +1648,7 @@ pub type SimpleRefOnionMessenger<
|
|||
&'i SimpleRefChannelManager<'a, 'b, 'c, 'd, 'e, 'f, 'g, 'h, M, T, F, L>,
|
||||
&'j DefaultMessageRouter<&'g NetworkGraph<&'b L>, &'b L, &'a KeysManager>,
|
||||
&'i SimpleRefChannelManager<'a, 'b, 'c, 'd, 'e, 'f, 'g, 'h, M, T, F, L>,
|
||||
IgnoringMessageHandler,
|
||||
IgnoringMessageHandler
|
||||
>;
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue