use super::*;
#[derive(Debug, Clone)]
pub(in crate::rpc_processor) struct RPCMessageHeaderDetailDirect {
pub envelope: Envelope,
pub sender_noderef: FilteredNodeRef,
pub flow: Flow,
pub routing_domain: RoutingDomain,
}
#[derive(Debug, Clone)]
pub(in crate::rpc_processor) struct RPCMessageHeaderDetailSafetyRouted {
pub direct: RPCMessageHeaderDetailDirect,
pub remote_safety_route: PublicKey,
pub sequencing: Sequencing,
pub route_op_id: OperationId,
}
#[derive(Debug, Clone)]
pub(in crate::rpc_processor) struct RPCMessageHeaderDetailPrivateRouted {
pub direct: RPCMessageHeaderDetailDirect,
pub remote_safety_route: PublicKey,
pub private_route: PublicKey,
pub safety_spec: SafetySpec,
pub route_op_id: OperationId,
}
#[derive(Debug, Clone)]
pub(in crate::rpc_processor) enum RPCMessageHeaderDetail {
Direct(RPCMessageHeaderDetailDirect),
SafetyRouted(RPCMessageHeaderDetailSafetyRouted),
PrivateRouted(RPCMessageHeaderDetailPrivateRouted),
}
#[derive(Debug, Clone)]
pub(in crate::rpc_processor) struct MessageHeader {
pub timestamp: Timestamp,
pub body_len: ByteCount,
pub detail: RPCMessageHeaderDetail,
}
impl MessageHeader {
pub fn crypto_kind(&self) -> CryptoKind {
match &self.detail {
RPCMessageHeaderDetail::Direct(d) => d.envelope.get_crypto_kind(),
RPCMessageHeaderDetail::SafetyRouted(s) => s.direct.envelope.get_crypto_kind(),
RPCMessageHeaderDetail::PrivateRouted(p) => p.direct.envelope.get_crypto_kind(),
}
}
pub fn routing_domain(&self) -> RoutingDomain {
match &self.detail {
RPCMessageHeaderDetail::Direct(d) => d.routing_domain,
RPCMessageHeaderDetail::SafetyRouted(s) => s.direct.routing_domain,
RPCMessageHeaderDetail::PrivateRouted(p) => p.direct.routing_domain,
}
}
pub fn is_private_routed(&self) -> bool {
match &self.detail {
RPCMessageHeaderDetail::Direct(_) => false,
RPCMessageHeaderDetail::SafetyRouted(_) => false,
RPCMessageHeaderDetail::PrivateRouted(_) => true,
}
}
#[expect(dead_code)]
pub fn is_direct(&self) -> bool {
match &self.detail {
RPCMessageHeaderDetail::Direct(_) => true,
RPCMessageHeaderDetail::SafetyRouted(_) => false,
RPCMessageHeaderDetail::PrivateRouted(_) => false,
}
}
pub fn direct_sender_node_id(&self) -> NodeId {
match &self.detail {
RPCMessageHeaderDetail::Direct(d) => d.envelope.get_sender_id(),
RPCMessageHeaderDetail::SafetyRouted(s) => s.direct.envelope.get_sender_id(),
RPCMessageHeaderDetail::PrivateRouted(p) => p.direct.envelope.get_sender_id(),
}
}
#[expect(dead_code)]
pub fn direct_sender_public_key(&self) -> PublicKey {
match &self.detail {
RPCMessageHeaderDetail::Direct(d) => d
.sender_noderef
.public_keys(d.routing_domain)
.get(d.envelope.get_crypto_kind())
.unwrap_or_log(),
RPCMessageHeaderDetail::SafetyRouted(s) => s
.direct
.sender_noderef
.public_keys(s.direct.routing_domain)
.get(s.direct.envelope.get_crypto_kind())
.unwrap_or_log(),
RPCMessageHeaderDetail::PrivateRouted(p) => p
.direct
.sender_noderef
.public_keys(p.direct.routing_domain)
.get(p.direct.envelope.get_crypto_kind())
.unwrap_or_log(),
}
}
pub fn get_private_route_public_key(&self) -> Option<PublicKey> {
match &self.detail {
RPCMessageHeaderDetail::Direct(_) | RPCMessageHeaderDetail::SafetyRouted(_) => None,
RPCMessageHeaderDetail::PrivateRouted(p) => Some(p.private_route.clone()),
}
}
#[expect(dead_code)]
pub fn get_safety_route_public_key(&self) -> Option<PublicKey> {
match &self.detail {
RPCMessageHeaderDetail::Direct(_) => None,
RPCMessageHeaderDetail::SafetyRouted(s) => Some(s.remote_safety_route.clone()),
RPCMessageHeaderDetail::PrivateRouted(p) => Some(p.remote_safety_route.clone()),
}
}
}