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>, }
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}