use std::collections::HashMap;
use serde::{Deserialize, Serialize};
#[derive(Clone, Debug, Default, Serialize, Deserialize)]
pub struct TransientSnapshot {
pub frontier: Vec<(u64, u64)>,
pub slot_table: HashMap<(u64, u64), Option<Vec<u8>>>,
pub pending_async: HashMap<u64, PendingAsyncSnapshot>,
pub execution_state: HashMap<u64, ExecutionStateSnapshot>,
pub framework: FrameworkSnapshot,
pub bus: TypedBusSnapshot,
pub ingress: Vec<IngressEventSnapshot>,
pub wire_states: HashMap<u32, Vec<u8>>,
pub pending_completions: Vec<PendingCompletionSnapshot>,
}
#[derive(Clone, Debug, Default, Serialize, Deserialize)]
pub struct FrameworkSnapshot {
pub counters: HashMap<String, u64>,
pub fired_phases: Vec<String>,
pub address_book: Vec<AddressBookEntrySnapshot>,
#[serde(default)]
pub peer_governor: PeerGovernorSnapshot,
#[serde(default)]
pub backoff_table: Vec<BackoffEntry>,
#[serde(default)]
pub pending_outbound: Vec<PendingOutboundEntry>,
#[serde(default)]
pub peer_id_bytes: Vec<u8>,
#[serde(default)]
pub next_command_id: u64,
#[serde(default)]
pub next_exec_id: u64,
#[serde(default = "default_spec_version")]
pub spec_version: u32,
}
fn default_spec_version() -> u32 {
CURRENT_SNAPSHOT_SPEC_VERSION
}
pub const CURRENT_SNAPSHOT_SPEC_VERSION: u32 = 1;
#[derive(Clone, Debug, Default, Serialize, Deserialize)]
pub struct AddressBookEntrySnapshot {
pub peer_id: Vec<u8>,
pub addresses: Vec<Vec<u8>>,
pub ref_count: u64,
}
#[derive(Clone, Debug, Default, Serialize, Deserialize)]
pub struct PeerGovernorSnapshot {
pub blocklist: Vec<Vec<u8>>,
pub allowlist: Option<Vec<Vec<u8>>>,
pub health: Vec<(Vec<u8>, u32, u64, bool)>,
pub failure_threshold: u32,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct BackoffEntry {
pub peer: Vec<u8>,
pub attempts: u32,
pub last_attempt_ns: u64,
pub next_retry_ns: u64,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct PendingOutboundEntry {
pub envelope_bytes: Vec<u8>,
pub redelivered: bool,
}
#[derive(Clone, Debug, Default, Serialize, Deserialize)]
pub struct TypedBusSnapshot {
pub event_subscriptions: HashMap<String, Vec<u64>>,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct PendingCompletionSnapshot {
pub cmd_id: u64,
pub results: Vec<(String, Vec<u8>)>,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct PendingAsyncSnapshot {
pub op_ref: u64,
pub exec_id: u64,
pub output_sites: Vec<u64>,
#[serde(default)]
pub deadline_ns: Option<u64>,
}
#[derive(Clone, Debug, Default, Serialize, Deserialize)]
pub struct ExecutionStateSnapshot {
pub outputs_written: u32,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub enum IngressEventSnapshot {
Envelope(Vec<u8>),
AppEvent {
module_name: String,
input_name: String,
value_bytes: Vec<u8>,
},
Invoke {
module_name: String,
inputs: Vec<(String, Vec<u8>)>,
},
TimerMatured {
at_ns: u64,
},
Completion {
cmd_id: u64,
results: Vec<Vec<u8>>,
},
}