use crate::node::{core::Proposal, XorName};
use sn_interface::messaging::{
system::{DkgFailureSigSet, KeyedSig, NodeState, SectionAuth, SystemMsg},
DstLocation, WireMsg,
};
use sn_interface::network_knowledge::{SectionAuthorityProvider, SectionKeyShare};
use sn_interface::types::Peer;
use bytes::Bytes;
use custom_debug::Debug;
use std::{
collections::BTreeSet,
fmt,
sync::atomic::{AtomicU64, Ordering},
time::Duration,
};
#[allow(clippy::large_enum_variant)]
#[derive(Debug, Clone)]
pub(crate) enum Cmd {
CleanupPeerLinks,
HandleMsg {
sender: Peer,
wire_msg: WireMsg,
#[debug(skip)]
original_bytes: Option<Bytes>,
},
HandleTimeout(u64),
HandlePeerLost(Peer),
HandleAgreement { proposal: Proposal, sig: KeyedSig },
HandleNewNodeOnline(SectionAuth<NodeState>),
HandleNewEldersAgreement { proposal: Proposal, sig: KeyedSig },
HandleDkgOutcome {
section_auth: SectionAuthorityProvider,
outcome: SectionKeyShare,
},
HandleDkgFailure(DkgFailureSigSet),
SendMsg {
recipients: Vec<Peer>,
wire_msg: WireMsg,
},
ThrottledSendBatchMsgs {
throttle_duration: Duration,
recipients: Vec<Peer>,
wire_msgs: Vec<WireMsg>,
},
SignOutgoingSystemMsg { msg: SystemMsg, dst: DstLocation },
SendMsgDeliveryGroup {
recipients: Vec<Peer>,
delivery_group_size: usize,
wire_msg: WireMsg,
},
ScheduleTimeout { duration: Duration, token: u64 },
SendAcceptedOnlineShare {
peer: Peer,
previous_name: Option<XorName>,
},
ProposeOffline(BTreeSet<XorName>),
StartConnectivityTest(XorName),
TestConnectivity(XorName),
}
impl fmt::Display for Cmd {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Cmd::CleanupPeerLinks => {
write!(f, "CleanupPeerLinks")
}
Cmd::HandleTimeout(_) => write!(f, "HandleTimeout"),
Cmd::ScheduleTimeout { .. } => write!(f, "ScheduleTimeout"),
Cmd::HandleMsg { wire_msg, .. } => {
write!(f, "HandleMsg {:?}", wire_msg.msg_id())
}
Cmd::HandlePeerLost(peer) => write!(f, "HandlePeerLost({:?})", peer.name()),
Cmd::HandleAgreement { .. } => write!(f, "HandleAgreement"),
Cmd::HandleNewEldersAgreement { .. } => write!(f, "HandleNewEldersAgreement"),
Cmd::HandleNewNodeOnline(_) => write!(f, "HandleNewNodeOnline"),
Cmd::HandleDkgOutcome { .. } => write!(f, "HandleDkgOutcome"),
Cmd::HandleDkgFailure(_) => write!(f, "HandleDkgFailure"),
#[cfg(not(feature = "test-utils"))]
Cmd::SendMsg { wire_msg, .. } => {
write!(f, "SendMsg {:?}", wire_msg.msg_id())
}
#[cfg(feature = "test-utils")]
Cmd::SendMsg { wire_msg, .. } => {
write!(
f,
"SendMsg {:?} {:?}",
wire_msg.msg_id(),
wire_msg.payload_debug
)
}
Cmd::SignOutgoingSystemMsg { .. } => write!(f, "SignOutgoingSystemMsg"),
Cmd::ThrottledSendBatchMsgs { .. } => write!(f, "ThrottledSendBatchMsgs"),
Cmd::SendMsgDeliveryGroup { wire_msg, .. } => {
write!(f, "SendMsgDeliveryGroup {:?}", wire_msg.msg_id())
}
Cmd::SendAcceptedOnlineShare { .. } => write!(f, "SendAcceptedOnlineShare"),
Cmd::ProposeOffline(_) => write!(f, "ProposeOffline"),
Cmd::StartConnectivityTest(_) => write!(f, "StartConnectivityTest"),
Cmd::TestConnectivity(_) => write!(f, "TestConnectivity"),
}
}
}
pub(crate) fn next_timer_token() -> u64 {
static NEXT: AtomicU64 = AtomicU64::new(0);
NEXT.fetch_add(1, Ordering::Relaxed)
}