use crate::events;
use crate::paths::Paths;
use crate::session;
use crate::util;
use std::fs;
pub fn reap_stale_claims(paths: &Paths) {
let dir = paths.claims_dir();
if !dir.is_dir() {
return;
}
let alive: Vec<String> = session::list(paths)
.into_iter()
.filter(|s| s.alive)
.map(|s| s.id)
.collect();
for entry in fs::read_dir(&dir).into_iter().flatten().flatten() {
let cf = entry.path();
if cf.extension().map(|e| e != "json").unwrap_or(true) {
continue;
}
let sess = fs::read_to_string(&cf)
.ok()
.and_then(|s| serde_json::from_str::<serde_json::Value>(&s).ok())
.and_then(|v| v.get("session").and_then(|x| x.as_str()).map(str::to_owned))
.unwrap_or_default();
if sess.is_empty() || !alive.iter().any(|a| a == &sess) {
let _ = fs::remove_file(&cf);
let name = cf
.file_name()
.unwrap_or_default()
.to_string_lossy()
.to_string();
util::event(
util::Level::Info,
"claim.reaped",
&format!(
"reaped stale claim {name} (session '{}' not alive)",
if sess.is_empty() { "?" } else { &sess }
),
&[
("claim", serde_json::json!(name)),
("session", serde_json::json!(sess)),
],
);
events::emit(
paths,
"claim_reaped",
serde_json::json!({ "claim": name, "session": sess }),
);
}
}
}