use std::sync::Arc; use uuid::Uuid; use crate::queue::NatsQueue; use super::{NatsWsBridge, WsReceiver, WsSender, WsSessionManager, WsSinkManager}; #[derive(Clone)] pub struct WsRuntime { sessions: Arc, sinks: Arc, bridge: NatsWsBridge, } impl WsRuntime { pub fn new(queue: Arc, sessions: Arc) -> Self { let sinks = Arc::new(WsSinkManager::new()); let bridge = NatsWsBridge::new(queue, sessions.clone(), sinks.clone()); Self { sessions, sinks, bridge, } } pub fn sinks(&self) -> Arc { self.sinks.clone() } pub fn sessions(&self) -> Arc { self.sessions.clone() } pub fn attach(&self, connection_id: Uuid) -> WsReceiver { let (tx, rx): (WsSender, WsReceiver) = WsSinkManager::channel(); self.sinks.attach(connection_id, tx); rx } pub fn detach(&self, connection_id: Uuid) { self.sinks.detach(connection_id); self.sessions.unsubscribe_all(connection_id); } pub fn start_nats_bridge(&self) { let bridge = self.bridge.clone(); tokio::spawn(async move { bridge.run_ephemeral("im.>").await; }); } }