pea2pea 0.7.0

a simple P2P library
Documentation
use bytes::Bytes;
use parking_lot::RwLock;
use tokio::sync::mpsc::Sender;

use crate::connection::Connection;

use fxhash::FxHashMap;
use std::net::SocketAddr;

#[derive(Default)]
pub(crate) struct Connections(RwLock<FxHashMap<SocketAddr, Connection>>);

impl Connections {
    pub(crate) fn sender(&self, addr: SocketAddr) -> Option<Sender<Bytes>> {
        self.0
            .read()
            .get(&addr)
            .map(|conn| conn.message_sender.clone())
    }

    pub(crate) fn add(&self, conn: Connection) {
        self.0.write().insert(conn.addr, conn);
    }

    pub(crate) fn senders(&self) -> Vec<Sender<Bytes>> {
        self.0
            .read()
            .values()
            .map(|conn| conn.message_sender.clone())
            .collect()
    }

    pub(crate) fn is_connected(&self, addr: SocketAddr) -> bool {
        self.0.read().contains_key(&addr)
    }

    pub(crate) fn disconnect(&self, addr: SocketAddr) -> bool {
        self.0.write().remove(&addr).is_some()
    }

    pub(crate) fn num_connected(&self) -> usize {
        self.0.read().len()
    }

    pub(crate) fn addrs(&self) -> Vec<SocketAddr> {
        self.0.read().keys().copied().collect()
    }
}