Skip to main content

comet/server/
universe.rs

1use lazy_static::lazy_static;
2use std::{collections::HashMap, sync::Arc};
3use tokio::sync::RwLock;
4
5use super::client::Client;
6
7lazy_static! {
8    pub static ref UNIVERSE: Universe = Universe::default();
9}
10
11pub type Universe = Arc<RwLock<UniverseInner>>;
12
13#[derive(Clone, Debug, Default)]
14pub struct UniverseInner {
15    next_session_id: usize,
16    clients: HashMap<usize, Client>, // session_id -> Client
17}
18
19impl UniverseInner {
20    pub fn get_next_session_id(&mut self) -> usize {
21        let id = self.next_session_id;
22
23        self.next_session_id += 1;
24
25        id
26    }
27
28    pub fn new_client(&mut self, mut client: Client) -> usize {
29        let session_id = self.get_next_session_id();
30
31        client.set_session_id(session_id);
32
33        self.clients.insert(session_id, client);
34
35        session_id
36    }
37
38    pub fn get_client(&self, session_id: usize) -> Client {
39        self.clients.get(&session_id).unwrap().clone()
40    }
41
42    pub async fn remove_client(&mut self, session_id: usize) {
43        let client = self.clients.remove(&session_id).unwrap();
44
45        client.abort_queries().await;
46    }
47}