use std::sync::Arc;
use ahash::{HashMap, HashMapExt};
use parking_lot::RwLock;
use tokio::sync::mpsc::{UnboundedReceiver, UnboundedSender, unbounded_channel};
use crate::{server::memory_pool::Buffer, service::session::Identifier};
pub type ExchangerSender = UnboundedSender<Buffer>;
#[derive(Clone)]
pub struct Exchanger(Arc<RwLock<HashMap<Identifier, ExchangerSender>>>);
impl Default for Exchanger {
fn default() -> Self {
Self(Arc::new(RwLock::new(HashMap::with_capacity(1024))))
}
}
impl Exchanger {
pub fn get_receiver(&self, id: Identifier) -> UnboundedReceiver<Buffer> {
let (sender, receiver) = unbounded_channel();
self.0.write().insert(id, sender);
receiver
}
pub fn send(&self, id: &Identifier, bytes: Buffer) {
let mut is_destroy = false;
{
if let Some(sender) = self.0.read().get(id)
&& sender.send(bytes).is_err()
{
is_destroy = true;
}
}
if is_destroy {
self.remove(id);
}
}
pub fn remove(&self, id: &Identifier) {
drop(self.0.write().remove(id))
}
}