use crate::{
broadcast_strategy::{BroadcastClosestRequest, BroadcastStrategy},
envelope::{DhtMessageFlags, DhtMessageHeader, NodeDestination},
outbound::OutboundEncryption,
proto::envelope::DhtMessageType,
};
use std::{fmt, fmt::Display};
use tari_comms::{peer_manager::NodeId, types::CommsPublicKey};
#[derive(Debug, Clone)]
pub struct SendMessageParams {
params: Option<FinalSendMessageParams>,
}
impl Default for SendMessageParams {
fn default() -> Self {
Self {
params: Some(Default::default()),
}
}
}
#[derive(Debug, Clone)]
pub struct FinalSendMessageParams {
pub broadcast_strategy: BroadcastStrategy,
pub destination: NodeDestination,
pub encryption: OutboundEncryption,
pub is_discovery_enabled: bool,
pub force_origin: bool,
pub dht_message_type: DhtMessageType,
pub dht_message_flags: DhtMessageFlags,
pub dht_header: Option<DhtMessageHeader>,
}
impl Default for FinalSendMessageParams {
fn default() -> Self {
Self {
broadcast_strategy: BroadcastStrategy::Flood(Default::default()),
destination: Default::default(),
encryption: Default::default(),
dht_message_type: Default::default(),
dht_message_flags: Default::default(),
force_origin: false,
is_discovery_enabled: false,
dht_header: None,
}
}
}
impl Display for FinalSendMessageParams {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> Result<(), fmt::Error> {
write!(
f,
"BroadcastStrategy: {}, Destination: {}",
self.broadcast_strategy, self.destination
)
}
}
impl SendMessageParams {
pub fn new() -> Self {
Default::default()
}
pub fn direct_public_key(&mut self, public_key: CommsPublicKey) -> &mut Self {
self.params_mut().broadcast_strategy = BroadcastStrategy::DirectPublicKey(Box::new(public_key));
self
}
pub fn direct_node_id(&mut self, node_id: NodeId) -> &mut Self {
self.params_mut().broadcast_strategy = BroadcastStrategy::DirectNodeId(Box::new(node_id));
self
}
pub fn closest(&mut self, node_id: NodeId, excluded_peers: Vec<NodeId>) -> &mut Self {
self.params_mut().broadcast_strategy = BroadcastStrategy::Closest(Box::new(BroadcastClosestRequest {
excluded_peers,
node_id,
connected_only: false,
}));
self
}
pub fn closest_connected(&mut self, node_id: NodeId, excluded_peers: Vec<NodeId>) -> &mut Self {
self.params_mut().broadcast_strategy = BroadcastStrategy::Closest(Box::new(BroadcastClosestRequest {
excluded_peers,
node_id,
connected_only: true,
}));
self
}
pub fn broadcast(&mut self, excluded_peers: Vec<NodeId>) -> &mut Self {
self.params_mut().broadcast_strategy = BroadcastStrategy::Broadcast(excluded_peers);
self
}
pub fn propagate(&mut self, destination: NodeDestination, excluded_peers: Vec<NodeId>) -> &mut Self {
self.params_mut().broadcast_strategy = BroadcastStrategy::Propagate(destination, excluded_peers);
self
}
pub fn flood(&mut self, excluded: Vec<NodeId>) -> &mut Self {
self.params_mut().broadcast_strategy = BroadcastStrategy::Flood(excluded);
self
}
pub fn random(&mut self, n: usize) -> &mut Self {
self.params_mut().broadcast_strategy = BroadcastStrategy::Random(n, vec![]);
self
}
pub fn with_destination(&mut self, destination: NodeDestination) -> &mut Self {
self.params_mut().destination = destination;
self
}
pub fn with_encryption(&mut self, encryption: OutboundEncryption) -> &mut Self {
self.params_mut().encryption = encryption;
self
}
pub fn with_discovery(&mut self, is_enabled: bool) -> &mut Self {
self.params_mut().is_discovery_enabled = is_enabled;
self
}
pub fn with_dht_message_type(&mut self, message_type: DhtMessageType) -> &mut Self {
self.params_mut().dht_message_type = message_type;
self
}
pub fn add_message_flag(&mut self, flag: DhtMessageFlags) -> &mut Self {
self.params_mut().dht_message_flags |= flag;
self
}
pub fn with_dht_header(&mut self, dht_header: DhtMessageHeader) -> &mut Self {
self.params_mut().dht_header = Some(dht_header);
self
}
pub fn force_origin(&mut self) -> &mut Self {
self.params_mut().force_origin = true;
self
}
pub fn finish(&mut self) -> FinalSendMessageParams {
self.params.take().expect("cannot be None")
}
fn params_mut(&mut self) -> &mut FinalSendMessageParams {
self.params.as_mut().expect("cannot be None")
}
}