mirror of
https://github.com/lightningdevkit/rust-lightning.git
synced 2025-01-19 05:43:55 +01:00
Provide features in CustomMessageHandler
CustomMessageHandler implementations may need to advertise support for features. Add methods to CustomMessageHandler to provide these and combine them with features from other message handlers.
This commit is contained in:
parent
687e587a73
commit
415973eaa3
@ -20,6 +20,7 @@
|
||||
//! # use bitcoin::secp256k1::PublicKey;
|
||||
//! # use lightning::io;
|
||||
//! # use lightning::ln::msgs::{DecodeError, LightningError};
|
||||
//! # use lightning::ln::features::{InitFeatures, NodeFeatures};
|
||||
//! use lightning::ln::peer_handler::CustomMessageHandler;
|
||||
//! use lightning::ln::wire::{CustomMessageReader, self};
|
||||
//! use lightning::util::ser::Writeable;
|
||||
@ -66,6 +67,12 @@
|
||||
//! # fn get_and_clear_pending_msg(&self) -> Vec<(PublicKey, Self::CustomMessage)> {
|
||||
//! # unimplemented!()
|
||||
//! # }
|
||||
//! # fn provided_node_features(&self) -> NodeFeatures {
|
||||
//! # unimplemented!()
|
||||
//! # }
|
||||
//! # fn provided_init_features(&self, _their_node_id: &PublicKey) -> InitFeatures {
|
||||
//! # unimplemented!()
|
||||
//! # }
|
||||
//! }
|
||||
//!
|
||||
//! #[derive(Debug)]
|
||||
@ -106,6 +113,12 @@
|
||||
//! # fn get_and_clear_pending_msg(&self) -> Vec<(PublicKey, Self::CustomMessage)> {
|
||||
//! # unimplemented!()
|
||||
//! # }
|
||||
//! # fn provided_node_features(&self) -> NodeFeatures {
|
||||
//! # unimplemented!()
|
||||
//! # }
|
||||
//! # fn provided_init_features(&self, _their_node_id: &PublicKey) -> InitFeatures {
|
||||
//! # unimplemented!()
|
||||
//! # }
|
||||
//! }
|
||||
//!
|
||||
//! #[derive(Debug)]
|
||||
@ -146,6 +159,12 @@
|
||||
//! # fn get_and_clear_pending_msg(&self) -> Vec<(PublicKey, Self::CustomMessage)> {
|
||||
//! # unimplemented!()
|
||||
//! # }
|
||||
//! # fn provided_node_features(&self) -> NodeFeatures {
|
||||
//! # unimplemented!()
|
||||
//! # }
|
||||
//! # fn provided_init_features(&self, _their_node_id: &PublicKey) -> InitFeatures {
|
||||
//! # unimplemented!()
|
||||
//! # }
|
||||
//! }
|
||||
//!
|
||||
//! # fn main() {
|
||||
@ -268,6 +287,22 @@ macro_rules! composite_custom_message_handler {
|
||||
)*
|
||||
.collect()
|
||||
}
|
||||
|
||||
fn provided_node_features(&self) -> $crate::lightning::ln::features::NodeFeatures {
|
||||
$crate::lightning::ln::features::NodeFeatures::empty()
|
||||
$(
|
||||
| self.$field.provided_node_features()
|
||||
)*
|
||||
}
|
||||
|
||||
fn provided_init_features(
|
||||
&self, their_node_id: &$crate::bitcoin::secp256k1::PublicKey
|
||||
) -> $crate::lightning::ln::features::InitFeatures {
|
||||
$crate::lightning::ln::features::InitFeatures::empty()
|
||||
$(
|
||||
| self.$field.provided_init_features(their_node_id)
|
||||
)*
|
||||
}
|
||||
}
|
||||
|
||||
impl $crate::lightning::ln::wire::CustomMessageReader for $handler {
|
||||
|
@ -64,6 +64,20 @@ pub trait CustomMessageHandler: wire::CustomMessageReader {
|
||||
/// in the process. Each message is paired with the node id of the intended recipient. If no
|
||||
/// connection to the node exists, then the message is simply not sent.
|
||||
fn get_and_clear_pending_msg(&self) -> Vec<(PublicKey, Self::CustomMessage)>;
|
||||
|
||||
/// Gets the node feature flags which this handler itself supports. All available handlers are
|
||||
/// queried similarly and their feature flags are OR'd together to form the [`NodeFeatures`]
|
||||
/// which are broadcasted in our [`NodeAnnouncement`] message.
|
||||
///
|
||||
/// [`NodeAnnouncement`]: crate::ln::msgs::NodeAnnouncement
|
||||
fn provided_node_features(&self) -> NodeFeatures;
|
||||
|
||||
/// Gets the init feature flags which should be sent to the given peer. All available handlers
|
||||
/// are queried similarly and their feature flags are OR'd together to form the [`InitFeatures`]
|
||||
/// which are sent in our [`Init`] message.
|
||||
///
|
||||
/// [`Init`]: crate::ln::msgs::Init
|
||||
fn provided_init_features(&self, their_node_id: &PublicKey) -> InitFeatures;
|
||||
}
|
||||
|
||||
/// A dummy struct which implements `RoutingMessageHandler` without storing any routing information
|
||||
@ -149,6 +163,12 @@ impl CustomMessageHandler for IgnoringMessageHandler {
|
||||
}
|
||||
|
||||
fn get_and_clear_pending_msg(&self) -> Vec<(PublicKey, Self::CustomMessage)> { Vec::new() }
|
||||
|
||||
fn provided_node_features(&self) -> NodeFeatures { NodeFeatures::empty() }
|
||||
|
||||
fn provided_init_features(&self, _their_node_id: &PublicKey) -> InitFeatures {
|
||||
InitFeatures::empty()
|
||||
}
|
||||
}
|
||||
|
||||
/// A dummy struct which implements `ChannelMessageHandler` without having any channels.
|
||||
@ -1247,7 +1267,8 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, OM: Deref, L: Deref, CM
|
||||
insert_node_id!();
|
||||
let features = self.message_handler.chan_handler.provided_init_features(&their_node_id)
|
||||
| self.message_handler.route_handler.provided_init_features(&their_node_id)
|
||||
| self.message_handler.onion_message_handler.provided_init_features(&their_node_id);
|
||||
| self.message_handler.onion_message_handler.provided_init_features(&their_node_id)
|
||||
| self.message_handler.custom_message_handler.provided_init_features(&their_node_id);
|
||||
let resp = msgs::Init { features, remote_network_address: filter_addresses(peer.their_net_address.clone()) };
|
||||
self.enqueue_message(peer, &resp);
|
||||
peer.awaiting_pong_timer_tick_intervals = 0;
|
||||
@ -1261,7 +1282,8 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, OM: Deref, L: Deref, CM
|
||||
insert_node_id!();
|
||||
let features = self.message_handler.chan_handler.provided_init_features(&their_node_id)
|
||||
| self.message_handler.route_handler.provided_init_features(&their_node_id)
|
||||
| self.message_handler.onion_message_handler.provided_init_features(&their_node_id);
|
||||
| self.message_handler.onion_message_handler.provided_init_features(&their_node_id)
|
||||
| self.message_handler.custom_message_handler.provided_init_features(&their_node_id);
|
||||
let resp = msgs::Init { features, remote_network_address: filter_addresses(peer.their_net_address.clone()) };
|
||||
self.enqueue_message(peer, &resp);
|
||||
peer.awaiting_pong_timer_tick_intervals = 0;
|
||||
@ -2203,7 +2225,8 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, OM: Deref, L: Deref, CM
|
||||
|
||||
let features = self.message_handler.chan_handler.provided_node_features()
|
||||
| self.message_handler.route_handler.provided_node_features()
|
||||
| self.message_handler.onion_message_handler.provided_node_features();
|
||||
| self.message_handler.onion_message_handler.provided_node_features()
|
||||
| self.message_handler.custom_message_handler.provided_node_features();
|
||||
let announcement = msgs::UnsignedNodeAnnouncement {
|
||||
features,
|
||||
timestamp: self.last_node_announcement_serial.fetch_add(1, Ordering::AcqRel),
|
||||
|
Loading…
Reference in New Issue
Block a user