use crate::error::{AtmError, AtmErrorCode};
use crate::protocol::RequestEnvelope;
use crate::types::{AgentName, IsoTimestamp, TeamName};
use serde::{Deserialize, Serialize};
use std::net::SocketAddr;
use super::{MessageKey, sealed};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RemoteReplayStateRecord {
pub team: TeamName,
pub agent: AgentName,
pub message_key: MessageKey,
pub peer_addr: SocketAddr,
pub request: RequestEnvelope,
pub recorded_at: IsoTimestamp,
pub expires_at: IsoTimestamp,
#[serde(default)]
pub attempt_count: u32,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub last_attempt_at: Option<IsoTimestamp>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub last_error: Option<AtmErrorCode>,
}
pub trait RemoteReplayStore: sealed::Sealed + Send + Sync {
fn enqueue(&self, record: RemoteReplayStateRecord) -> Result<(), AtmError>;
fn load_all(&self) -> Result<Vec<RemoteReplayStateRecord>, AtmError>;
fn delete(
&self,
team: &TeamName,
agent: &AgentName,
message_key: &MessageKey,
) -> Result<(), AtmError>;
fn purge_expired(&self, now: IsoTimestamp) -> Result<usize, AtmError>;
}
pub trait RuntimeStorageFinalizer: sealed::Sealed + Send + Sync {
fn finalize_storage_shutdown(&self) -> Result<(), AtmError>;
}