atm_core/boundary/
runtime.rs1use crate::error::{AtmError, AtmErrorCode};
2use crate::protocol::RequestEnvelope;
3use crate::types::{AgentName, IsoTimestamp, TeamName};
4use serde::{Deserialize, Serialize};
5use std::net::SocketAddr;
6
7use super::{MessageKey, sealed};
8
9#[derive(Debug, Clone, Serialize, Deserialize)]
10pub struct RemoteReplayStateRecord {
11 pub team: TeamName,
12 pub agent: AgentName,
13 pub message_key: MessageKey,
14 pub peer_addr: SocketAddr,
15 pub request: RequestEnvelope,
16 pub recorded_at: IsoTimestamp,
17 pub expires_at: IsoTimestamp,
18 #[serde(default)]
19 pub attempt_count: u32,
20 #[serde(default, skip_serializing_if = "Option::is_none")]
21 pub last_attempt_at: Option<IsoTimestamp>,
22 #[serde(default, skip_serializing_if = "Option::is_none")]
23 pub last_error: Option<AtmErrorCode>,
24}
25
26pub trait RemoteReplayStore: sealed::Sealed + Send + Sync {
28 fn enqueue(&self, record: RemoteReplayStateRecord) -> Result<(), AtmError>;
33
34 fn load_all(&self) -> Result<Vec<RemoteReplayStateRecord>, AtmError>;
39
40 fn delete(
45 &self,
46 team: &TeamName,
47 agent: &AgentName,
48 message_key: &MessageKey,
49 ) -> Result<(), AtmError>;
50
51 fn purge_expired(&self, now: IsoTimestamp) -> Result<usize, AtmError>;
56}
57
58pub trait RuntimeStorageFinalizer: sealed::Sealed + Send + Sync {
60 fn finalize_storage_shutdown(&self) -> Result<(), AtmError>;
65}