1use crate::{Cache, Peer, Subs};
2use log::info;
3use nanoid::nanoid;
4use std::sync::{Arc, RwLock, Weak};
5
6#[derive(Debug)]
10pub struct Session {
11 id: String,
12 client_id: String,
13 peer: RwLock<Weak<Peer>>,
14 subs: RwLock<Subs>,
15}
16
17impl Session {
18 pub fn new(client_id: &str, peer: Arc<Peer>, cache: Arc<Cache>) -> Self {
20 let id = format!("session_{}", nanoid!(10));
21 info!("New session: Unique ID:{:?}, Client ID:{:?}", id, client_id);
22
23 Session {
24 id,
25 client_id: client_id.into(),
26 peer: RwLock::new(Arc::downgrade(&peer)),
27 subs: RwLock::new(Subs::new(cache)),
28 }
29 }
30
31 pub fn id(&self) -> &str {
36 &self.id
37 }
38
39 pub fn client_id(&self) -> &str {
41 &self.client_id
42 }
43
44 pub fn bind(&self, peer: Arc<Peer>) {
46 *(self.peer.write().unwrap()) = Arc::downgrade(&peer);
47 }
48
49 pub fn peer(&self) -> Option<Arc<Peer>> {
51 self.peer.read().unwrap().upgrade()
52 }
53
54 pub fn subs(&self) -> &RwLock<Subs> {
56 &self.subs
57 }
58}