Skip to main content

atm_core/boundary/
runtime.rs

1use 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
26/// BOUNDARY-RemoteReplayStore — see docs/atm-core/boundaries.md.
27pub trait RemoteReplayStore: sealed::Sealed + Send + Sync {
28    /// # Errors
29    ///
30    /// Returns `AtmError` when replay persistence cannot record a bounded
31    /// remote-delivery retry state.
32    fn enqueue(&self, record: RemoteReplayStateRecord) -> Result<(), AtmError>;
33
34    /// # Errors
35    ///
36    /// Returns `AtmError` when the bounded retained replay set cannot be
37    /// loaded for resume or inspection.
38    fn load_all(&self) -> Result<Vec<RemoteReplayStateRecord>, AtmError>;
39
40    /// # Errors
41    ///
42    /// Returns `AtmError` when one bounded retained replay record cannot be
43    /// deleted after successful delivery.
44    fn delete(
45        &self,
46        team: &TeamName,
47        agent: &AgentName,
48        message_key: &MessageKey,
49    ) -> Result<(), AtmError>;
50
51    /// # Errors
52    ///
53    /// Returns `AtmError` when expired bounded replay records cannot be
54    /// purged safely.
55    fn purge_expired(&self, now: IsoTimestamp) -> Result<usize, AtmError>;
56}
57
58/// BOUNDARY-RuntimeStorageFinalizer — see docs/atm-core/boundaries.md.
59pub trait RuntimeStorageFinalizer: sealed::Sealed + Send + Sync {
60    /// # Errors
61    ///
62    /// Returns `AtmError` when runtime-owned storage cannot finalize its
63    /// bounded shutdown maintenance.
64    fn finalize_storage_shutdown(&self) -> Result<(), AtmError>;
65}