use crate::client::{CmdError, Error, Result};
use crate::{
client::{
BlobRead, BlobWrite, ClientSigned, DataCmd as NodeDataCmd, DataExchange,
DataQuery as NodeDataQuery,
},
EndUser, MessageId, MessageType, WireMsg,
};
use bytes::Bytes;
use serde::{Deserialize, Serialize};
use sn_data_types::{
ActorHistory, Blob, BlobAddress, CreditAgreementProof, NodeAge, PublicKey, ReplicaEvent,
SectionElders, Signature,
};
use std::collections::BTreeMap;
use threshold_crypto::PublicKey as BlsPublicKey;
use xor_name::XorName;
#[allow(clippy::large_enum_variant)]
#[derive(Debug, Eq, PartialEq, Clone, Serialize, Deserialize)]
pub enum NodeMsg {
NodeCmd {
cmd: NodeCmd,
id: MessageId,
},
NodeCmdError {
error: NodeCmdError,
id: MessageId,
correlation_id: MessageId,
},
NodeEvent {
event: NodeEvent,
id: MessageId,
correlation_id: MessageId,
},
NodeQuery {
query: NodeQuery,
id: MessageId,
},
NodeQueryResponse {
response: NodeQueryResponse,
id: MessageId,
correlation_id: MessageId,
},
NodeMsgError {
error: Error,
id: MessageId,
correlation_id: MessageId,
},
}
impl NodeMsg {
pub fn id(&self) -> MessageId {
match self {
Self::NodeCmd { id, .. }
| Self::NodeQuery { id, .. }
| Self::NodeEvent { id, .. }
| Self::NodeQueryResponse { id, .. }
| Self::NodeCmdError { id, .. }
| Self::NodeMsgError { id, .. } => *id,
}
}
pub fn from(bytes: Bytes) -> crate::Result<Self> {
let deserialized = WireMsg::deserialize(bytes)?;
if let MessageType::Node { msg, .. } = deserialized {
Ok(msg)
} else {
Err(crate::Error::FailedToParse(
"bytes as a node command message".to_string(),
))
}
}
pub fn serialize(
&self,
dest: XorName,
dest_section_pk: BlsPublicKey,
src_section_pk: Option<BlsPublicKey>,
) -> crate::Result<Bytes> {
WireMsg::serialize_node_msg(self, dest, dest_section_pk, src_section_pk)
}
}
#[allow(clippy::large_enum_variant)]
#[derive(Debug, Eq, PartialEq, Clone, Serialize, Deserialize)]
pub enum NodeCmd {
Metadata {
cmd: NodeDataCmd,
client_signed: ClientSigned,
origin: EndUser,
},
Chunks {
cmd: BlobWrite,
client_signed: ClientSigned,
origin: EndUser,
},
Transfers(NodeTransferCmd),
System(NodeSystemCmd),
}
#[allow(clippy::large_enum_variant)]
#[derive(Debug, Eq, PartialEq, Clone, Serialize, Deserialize)]
pub enum NodeSystemCmd {
RegisterWallet(PublicKey),
StorageFull {
node_id: PublicKey,
section: XorName,
},
ReplicateChunk(Blob),
RepublishChunk(Blob),
ProposeRewardPayout(sn_data_types::RewardProposal),
AccumulateRewardPayout(sn_data_types::RewardAccumulation),
ReceiveExistingData {
node_rewards: BTreeMap<XorName, (NodeAge, PublicKey)>,
user_wallets: BTreeMap<PublicKey, ActorHistory>,
metadata: DataExchange,
},
}
#[allow(clippy::large_enum_variant)]
#[derive(Debug, Eq, PartialEq, Clone, Serialize, Deserialize)]
pub enum NodeTransferCmd {
PropagateTransfer(CreditAgreementProof),
}
#[allow(clippy::large_enum_variant)]
#[derive(Debug, Eq, PartialEq, Clone, Serialize, Deserialize)]
pub enum NodeEvent {
ReplicationCompleted {
chunk: BlobAddress,
proof: Signature,
},
ChunkWriteHandled(Result<(), CmdError>),
}
#[derive(Debug, Eq, PartialEq, Clone, Serialize, Deserialize)]
pub enum NodeQuery {
Metadata {
query: NodeDataQuery,
client_signed: ClientSigned,
origin: EndUser,
},
Chunks { query: BlobRead, origin: EndUser },
Rewards(NodeRewardQuery),
Transfers(NodeTransferQuery),
System(NodeSystemQuery),
}
#[allow(clippy::large_enum_variant)]
#[derive(Debug, Eq, PartialEq, Clone, Serialize, Deserialize)]
pub enum NodeRewardQuery {
GetNodeWalletKey(XorName),
GetSectionWalletHistory,
}
#[derive(Debug, Eq, PartialEq, Clone, Serialize, Deserialize)]
pub enum NodeTransferQuery {
GetReplicaEvents,
}
#[derive(Debug, Eq, PartialEq, Clone, Serialize, Deserialize)]
pub enum NodeSystemQuery {
GetSectionElders,
GetChunk(BlobAddress),
}
#[derive(Debug, Eq, PartialEq, Clone, Serialize, Deserialize)]
pub enum NodeSystemQueryResponse {
GetSectionElders(SectionElders),
GetChunk(Blob),
}
#[allow(clippy::large_enum_variant)]
#[derive(Debug, Eq, PartialEq, Clone, Serialize, Deserialize)]
pub enum NodeQueryResponse {
Data(NodeDataQueryResponse),
Transfers(NodeTransferQueryResponse),
System(NodeSystemQueryResponse),
}
#[allow(clippy::large_enum_variant)]
#[derive(Debug, Eq, PartialEq, Clone, Serialize, Deserialize)]
pub enum NodeTransferQueryResponse {
GetReplicaEvents(Result<Vec<ReplicaEvent>>),
}
#[allow(clippy::large_enum_variant)]
#[derive(Debug, Hash, Eq, PartialEq, Clone, Serialize, Deserialize)]
pub enum NodeDataQueryResponse {
GetChunk(Result<Blob>),
}
#[allow(clippy::large_enum_variant)]
#[derive(Debug, Hash, Eq, PartialEq, Clone, Serialize, Deserialize)]
pub enum NodeCmdError {
Data(NodeDataError),
Transfers(NodeTransferError),
}
#[derive(Debug, Hash, Eq, PartialEq, Clone, Serialize, Deserialize)]
pub enum NodeDataError {
ChunkReplication {
address: BlobAddress,
error: Error,
},
}
#[derive(Debug, Hash, Eq, PartialEq, Clone, Serialize, Deserialize)]
pub enum NodeTransferError {
TransferPropagation(Error),
}