use domain::{ClientRegistry, ConnectedClient}; use std::net::SocketAddr; use std::sync::Mutex; use std::time::SystemTime; #[derive(Default)] pub struct ClientTracker { clients: Mutex>, } impl ClientTracker { pub fn new() -> Self { Self::default() } pub fn add(&self, addr: SocketAddr) { let info = ConnectedClient { addr: addr.to_string(), connected_at: SystemTime::now() .duration_since(SystemTime::UNIX_EPOCH) .unwrap_or_default() .as_secs(), }; self.clients.lock().unwrap().push(info); } pub fn remove(&self, addr: SocketAddr) { let addr_str = addr.to_string(); self.clients.lock().unwrap().retain(|c| c.addr != addr_str); } } impl ClientRegistry for ClientTracker { fn add_client(&self, addr: &str, connected_at: u64) { self.clients.lock().unwrap().push(ConnectedClient { addr: addr.to_string(), connected_at, }); } fn remove_client(&self, addr: &str) { self.clients.lock().unwrap().retain(|c| c.addr != addr); } fn list_clients(&self) -> Vec { self.clients.lock().unwrap().clone() } }