#[cfg(feature = "runtime-metrics")]
use super::metrics::AnnounceOrigin;
use crate::engine::InstantMillis;
use crate::engine::{CommandId, LinkEstablished, Settlement};
use crate::identity::IdentityHash;
use crate::interfaces::{InterfaceId, InterfaceKind};
use crate::routing::announce::held::HeldDropCause;
use crate::routing::announce::{AnnounceObservation, AnnounceRateAccounting};
use crate::routing::delivery::Delivery;
use crate::routing::links::channel::MessageType;
use crate::routing::links::request::RequestId;
use crate::routing::links::resources::{ResourceFailureCause, ResourceHash};
use crate::routing::links::LinkId;
use crate::routing::request_handlers::RequestPathHash;
use crate::routing::RouteRemovalCause;
use crate::units::RttMillis;
use crate::wire::DestinationHash;
#[repr(C)]
pub enum EngineReaction<'a> {
Journaled(Journaled<'a>),
Directive(Directive<'a>),
}
#[repr(C)]
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum PersistenceFlushCause {
Startup,
Interval,
RouteChange,
RatchetRotation,
Shutdown,
}
impl PersistenceFlushCause {
#[must_use]
pub const fn name(self) -> &'static str {
match self {
Self::Startup => "startup",
Self::Interval => "interval",
Self::RouteChange => "route_change",
Self::RatchetRotation => "ratchet_rotation",
Self::Shutdown => "shutdown",
}
}
}
#[repr(C)]
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum PersistenceFlushTarget {
RoutingState,
Ratchets,
}
impl PersistenceFlushTarget {
#[must_use]
pub const fn name(self) -> &'static str {
match self {
Self::RoutingState => "routing_state",
Self::Ratchets => "ratchets",
}
}
}
pub enum Journaled<'a> {
AnnounceHeard {
observation: AnnounceObservation<'a>,
rate_accounting: AnnounceRateAccounting,
},
SelfRatchetRotated {
destination: DestinationHash,
},
PersistenceFlushed {
cause: PersistenceFlushCause,
target: PersistenceFlushTarget,
},
PersistenceFlushFailed {
cause: PersistenceFlushCause,
target: PersistenceFlushTarget,
},
AnnounceHeldDropped {
destination: DestinationHash,
source_interface: InterfaceId,
cause: HeldDropCause,
},
Delivered(Delivery<'a>),
CommandSettled {
id: CommandId,
settlement: Settlement,
},
LinkEstablished(LinkEstablished),
PeerIdentified {
link_id: LinkId,
identity: IdentityHash,
},
RequestReceived {
destination: DestinationHash,
link_id: LinkId,
request_id: RequestId,
requester: Option<IdentityHash>,
path_hash: RequestPathHash,
requested_at: InstantMillis,
rtt: RttMillis,
data: &'a [u8],
},
ResponseReceived {
command_id: CommandId,
link_id: LinkId,
request_id: RequestId,
data: &'a [u8],
},
ResponseSegmentReceived {
command_id: CommandId,
link_id: LinkId,
request_id: RequestId,
segment_index: u64,
total_segments: u64,
data: &'a [u8],
},
ChannelMessageReceived {
link_id: LinkId,
message_type: MessageType,
data: &'a [u8],
},
LinkClosed {
link_id: LinkId,
reason: LinkClosedReason,
},
LinkInterfaceMismatch {
link_id: LinkId,
attached_interface: InterfaceId,
arrived_on: InterfaceId,
},
ResourceReceived {
link_id: LinkId,
hash: ResourceHash,
metadata: Option<&'a [u8]>,
data: &'a [u8],
},
ResourceFailed {
link_id: LinkId,
hash: ResourceHash,
cause: ResourceFailureCause,
},
ResourceNeedsDecompression {
link_id: LinkId,
hash: ResourceHash,
stream: &'a [u8],
uncompressed_data_bytes: u64,
},
ResourceSegmentReceived {
link_id: LinkId,
original_hash: ResourceHash,
segment_index: u64,
total_segments: u64,
metadata: Option<&'a [u8]>,
data: &'a [u8],
},
ResourceAssembled {
link_id: LinkId,
original_hash: ResourceHash,
total_size_bytes: u64,
},
RouteRemoved {
destination: DestinationHash,
cause: RouteRemovalCause,
},
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum LinkClosedReason {
Timeout,
PeerClosed,
MalformedRtt,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum FanTarget {
All,
Only(InterfaceId),
AllExcept(InterfaceId),
}
#[repr(C)]
pub enum Directive<'a> {
Send {
target: InterfaceId,
bytes: &'a [u8],
},
SendIfOnline {
target: InterfaceId,
bytes: &'a [u8],
on_send: &'a mut dyn FnMut(),
},
SendAnnounce {
target: InterfaceId,
bytes: &'a [u8],
hops: u8,
#[cfg(feature = "runtime-metrics")]
origin: AnnounceOrigin,
},
SendToFleet {
supervisor: InterfaceKind,
fan: FanTarget,
bytes: &'a [u8],
},
SendAnnounceToFleet {
supervisor: InterfaceKind,
fan: FanTarget,
bytes: &'a [u8],
hops: u8,
#[cfg(feature = "runtime-metrics")]
origin: AnnounceOrigin,
},
EmitFrame {
target: InterfaceId,
size_hint: usize,
fill: &'a mut dyn FnMut(&mut [u8]) -> Option<usize>,
},
#[cfg(feature = "runtime-metrics")]
SendMeasuredLocalAnnounce {
target: InterfaceId,
bytes: &'a [u8],
},
#[cfg(feature = "runtime-metrics")]
SendMeasuredLocalAnnounceToFleet {
supervisor: InterfaceKind,
fan: FanTarget,
bytes: &'a [u8],
},
}