use std::sync::Arc;
use std::time::Duration;
use tokio::time::interval;
use crate::acp::supervisor::AcpSupervisor;
pub const IDLE_RECYCLE_SECS: u64 = 300;
pub const REQUIRES_ACTION_RECYCLE_SECS: u64 = 1800;
const TICK_SECS: u64 = 30;
pub async fn run_reaper(supervisor: AcpSupervisor) {
let mut ticker = interval(Duration::from_secs(TICK_SECS));
loop {
ticker.tick().await;
let mut to_reap: Vec<(String, bool /*perm_stale*/)> = Vec::new();
for (sid, client) in supervisor.snapshot().await {
if client.is_idle_stale(IDLE_RECYCLE_SECS).await {
to_reap.push((sid, false));
} else if client.is_permission_stale(REQUIRES_ACTION_RECYCLE_SECS).await {
to_reap.push((sid, true));
}
}
for (sid, perm_stale) in to_reap {
if let Some(client) = supervisor.dispose(&sid).await {
if perm_stale {
let _ = client.cancel();
}
if let Ok(c) = Arc::try_unwrap(client) {
c.disconnect().await;
}
}
}
}
}