53 lines
1.3 KiB
Rust
53 lines
1.3 KiB
Rust
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<WsSessionManager>,
|
|
sinks: Arc<WsSinkManager>,
|
|
bridge: NatsWsBridge,
|
|
}
|
|
|
|
impl WsRuntime {
|
|
pub fn new(queue: Arc<NatsQueue>, sessions: Arc<WsSessionManager>) -> 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<WsSinkManager> {
|
|
self.sinks.clone()
|
|
}
|
|
|
|
pub fn sessions(&self) -> Arc<WsSessionManager> {
|
|
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;
|
|
});
|
|
}
|
|
}
|