use std::collections::HashMap;
use std::time::Instant;
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct PeerEntry {
pub coord_id: String,
pub last_seen: Instant,
}
pub trait PeerStore {
fn upsert(&mut self, meta: PeerEntry) -> bool;
fn mark_alive(&mut self, id: &str);
fn all_known(&self) -> Vec<PeerEntry>;
fn expire_old(&mut self, cutoff: Instant);
}
#[derive(Default)]
pub struct InMemoryPeerStore {
peers: HashMap<String, PeerEntry>,
}
impl InMemoryPeerStore {
pub fn new() -> Self {
Self {
peers: HashMap::new(),
}
}
}
impl PeerStore for InMemoryPeerStore {
fn upsert(&mut self, meta: PeerEntry) -> bool {
self.peers.insert(meta.coord_id.clone(), meta).is_none()
}
fn mark_alive(&mut self, id: &str) {
if let Some(entry) = self.peers.get_mut(id) {
entry.last_seen = Instant::now();
}
}
fn all_known(&self) -> Vec<PeerEntry> {
self.peers.values().cloned().collect()
}
fn expire_old(&mut self, cutoff: Instant) {
self.peers.retain(|_, e| e.last_seen >= cutoff);
}
}