Skip to main content

macp_storage/storage/
compaction.rs

1use crate::log_store::{EntryKind, LogEntry};
2use crate::registry::PersistedSession;
3use macp_core::session::Session;
4use std::io;
5
6use super::StorageBackend;
7
8/// Compact a session's log into a single checkpoint entry.
9///
10/// This replaces all existing log entries with a single `Checkpoint` entry
11/// containing the serialized session state. Should only be called on sessions
12/// in terminal state (Resolved/Expired/Cancelled).
13pub async fn compact_session_log(
14    storage: &dyn StorageBackend,
15    session_id: &str,
16    session: &Session,
17) -> io::Result<()> {
18    let persisted = PersistedSession::from(session);
19    let raw_payload = serde_json::to_vec(&persisted)
20        .map_err(|e| io::Error::new(io::ErrorKind::InvalidData, e))?;
21
22    let now = chrono::Utc::now().timestamp_millis();
23    let checkpoint = LogEntry {
24        message_id: String::new(),
25        received_at_ms: now,
26        sender: "_runtime".into(),
27        message_type: "Checkpoint".into(),
28        raw_payload,
29        entry_kind: EntryKind::Checkpoint,
30        session_id: session_id.into(),
31        mode: session.mode.clone(),
32        macp_version: String::new(),
33        timestamp_unix_ms: now,
34    };
35
36    storage.replace_log(session_id, &[checkpoint]).await
37}