volli-core 0.1.11

Shared types for volli
Documentation
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 {
    /// Insert or update a peer.  
    /// Returns `true` if this is a newly-seen `id`.
    fn upsert(&mut self, meta: PeerEntry) -> bool;

    /// Mark an existing peer alive (update timestamp).
    fn mark_alive(&mut self, id: &str);

    /// List all known peer metadata.
    fn all_known(&self) -> Vec<PeerEntry>;

    /// Remove peers not seen since `cutoff`.
    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);
    }
}