use crate::messaging::system::SectionAuth;
use crate::messaging::{
system::{DkgFailureSigSet, KeyedSig, NodeState, SystemMsg},
DstLocation, MessageId, NodeMsgAuthority, WireMsg,
};
use crate::routing::{
core::Proposal,
network_knowledge::{NetworkKnowledge, SectionAuthorityProvider, SectionKeyShare},
node::Node,
Peer, UnnamedPeer, XorName,
};
use bls::PublicKey as BlsPublicKey;
use bytes::Bytes;
use custom_debug::Debug;
use std::{
fmt,
sync::atomic::{AtomicU64, Ordering},
time::Duration,
};
#[allow(clippy::large_enum_variant)]
#[derive(Debug, Clone)]
pub(crate) enum Command {
HandleMessage {
sender: UnnamedPeer,
wire_msg: WireMsg,
#[debug(skip)]
original_bytes: Option<Bytes>,
},
HandleSystemMessage {
sender: Peer,
msg_id: MessageId,
msg: SystemMsg,
msg_authority: NodeMsgAuthority,
dst_location: DstLocation,
#[debug(skip)]
payload: Bytes,
#[debug(skip)]
known_keys: Vec<BlsPublicKey>,
},
HandleTimeout(u64),
HandlePeerLost(Peer),
HandleAgreement { proposal: Proposal, sig: KeyedSig },
HandleNewNodeOnline(SectionAuth<NodeState>),
HandleElderAgreement { proposal: Proposal, sig: KeyedSig },
HandleDkgOutcome {
section_auth: SectionAuthorityProvider,
outcome: SectionKeyShare,
},
HandleDkgFailure(DkgFailureSigSet),
SendMessage {
recipients: Vec<Peer>,
wire_msg: WireMsg,
},
ParseAndSendWireMsg(WireMsg),
PrepareNodeMsgToSend { msg: SystemMsg, dst: DstLocation },
SendMessageDeliveryGroup {
recipients: Vec<Peer>,
delivery_group_size: usize,
wire_msg: WireMsg,
},
ScheduleTimeout { duration: Duration, token: u64 },
HandleRelocationComplete {
node: Node,
section: NetworkKnowledge,
},
SetJoinsAllowed(bool),
SendAcceptedOnlineShare {
peer: Peer,
previous_name: Option<XorName>,
},
ProposeOffline(XorName),
StartConnectivityTest(XorName),
TestConnectivity(XorName),
}
impl fmt::Display for Command {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Command::HandleTimeout(_) => write!(f, "HandleTimeout"),
Command::ScheduleTimeout { .. } => write!(f, "ScheduleTimeout"),
Command::HandleSystemMessage { msg_id, .. } => {
write!(f, "HandleSystemMessage {:?}", msg_id)
}
Command::HandleMessage { wire_msg, .. } => {
write!(f, "HandleMessage {:?}", wire_msg.msg_id())
}
Command::HandlePeerLost(peer) => write!(f, "HandlePeerLost({:?})", peer.name()),
Command::HandleAgreement { .. } => write!(f, "HandleAgreement"),
Command::HandleElderAgreement { .. } => write!(f, "HandleElderAgreement"),
Command::HandleNewNodeOnline(_) => write!(f, "HandleNewNodeOnline"),
Command::HandleDkgOutcome { .. } => write!(f, "HandleDkgOutcome"),
Command::HandleDkgFailure(_) => write!(f, "HandleDkgFailure"),
#[cfg(not(feature = "unstable-wiremsg-debuginfo"))]
Command::SendMessage { wire_msg, .. } => {
write!(f, "SendMessage {:?}", wire_msg.msg_id())
}
#[cfg(feature = "unstable-wiremsg-debuginfo")]
Command::SendMessage { wire_msg, .. } => {
write!(
f,
"SendMessage {:?} {:?}",
wire_msg.msg_id(),
wire_msg.payload_debug
)
}
Command::ParseAndSendWireMsg(wire_msg) => {
write!(f, "ParseAndSendWireMsg {:?}", wire_msg.msg_id())
}
Command::PrepareNodeMsgToSend { .. } => write!(f, "PrepareNodeMsgToSend"),
Command::SendMessageDeliveryGroup { wire_msg, .. } => {
write!(f, "SendMessageDeliveryGroup {:?}", wire_msg.msg_id())
}
Command::HandleRelocationComplete { .. } => {
write!(f, "HandleRelocationComplete")
}
Command::SetJoinsAllowed(_) => write!(f, "SetJoinsAllowed"),
Command::SendAcceptedOnlineShare { .. } => write!(f, "SendAcceptedOnlineShare"),
Command::ProposeOffline(_) => write!(f, "ProposeOffline"),
Command::StartConnectivityTest(_) => write!(f, "StartConnectivityTest"),
Command::TestConnectivity(_) => write!(f, "TestConnectivity"),
}
}
}
pub(crate) fn next_timer_token() -> u64 {
static NEXT: AtomicU64 = AtomicU64::new(0);
NEXT.fetch_add(1, Ordering::Relaxed)
}