feat: init
This commit is contained in:
@@ -0,0 +1,52 @@
|
||||
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;
|
||||
});
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user