pub mod path;
pub mod room;
pub use path::interpolate_path;
pub use room::{EmitTarget, RoomCmd, RoomHandle, SessionGuard, StateOp};
use std::collections::HashMap;
use std::sync::{Arc, Mutex};
#[derive(Clone)]
pub struct WsHub {
rooms: Arc<Mutex<HashMap<String, Arc<RoomHandle>>>>,
}
impl WsHub {
pub fn new() -> Self {
Self {
rooms: Arc::new(Mutex::new(HashMap::new())),
}
}
pub fn get_or_create_room(&self, room_key: &str) -> Arc<RoomHandle> {
let mut rooms = self.rooms.lock().unwrap_or_else(|e| e.into_inner());
if let Some(room) = rooms.get(room_key) {
return room.clone();
}
let room = RoomHandle::spawn();
rooms.insert(room_key.to_string(), room.clone());
room
}
pub fn get_room(&self, room_key: &str) -> Option<Arc<RoomHandle>> {
self.rooms
.lock()
.unwrap_or_else(|e| e.into_inner())
.get(room_key)
.cloned()
}
pub fn list_rooms(&self) -> Vec<String> {
self.rooms
.lock()
.unwrap_or_else(|e| e.into_inner())
.keys()
.cloned()
.collect()
}
pub fn remove_room(&self, room_key: &str) {
let mut rooms = self.rooms.lock().unwrap_or_else(|e| e.into_inner());
if let Some(room) = rooms.get(room_key) {
if room.session_count() == 0 {
room.send_cmd(RoomCmd::Shutdown);
rooms.remove(room_key);
}
}
}
}
impl Default for WsHub {
fn default() -> Self {
Self::new()
}
}