1use async_trait::async_trait;
4use dashmap::DashMap;
5
6use super::{Session, SessionError, SessionId, SessionService};
7use crate::events::Event;
8
9pub struct InMemorySessionService {
14 sessions: DashMap<String, Session>,
15 events: DashMap<String, Vec<Event>>,
16}
17
18impl InMemorySessionService {
19 pub fn new() -> Self {
21 Self {
22 sessions: DashMap::new(),
23 events: DashMap::new(),
24 }
25 }
26}
27
28impl Default for InMemorySessionService {
29 fn default() -> Self {
30 Self::new()
31 }
32}
33
34#[async_trait]
35impl SessionService for InMemorySessionService {
36 async fn create_session(&self, app_name: &str, user_id: &str) -> Result<Session, SessionError> {
37 let session = Session::new(app_name, user_id);
38 let id = session.id.as_str().to_string();
39 self.sessions.insert(id.clone(), session.clone());
40 self.events.insert(id, Vec::new());
41 Ok(session)
42 }
43
44 async fn get_session(&self, id: &SessionId) -> Result<Option<Session>, SessionError> {
45 Ok(self.sessions.get(id.as_str()).map(|r| r.clone()))
46 }
47
48 async fn list_sessions(
49 &self,
50 app_name: &str,
51 user_id: &str,
52 ) -> Result<Vec<Session>, SessionError> {
53 let result: Vec<Session> = self
54 .sessions
55 .iter()
56 .filter(|r| r.app_name == app_name && r.user_id == user_id)
57 .map(|r| r.clone())
58 .collect();
59 Ok(result)
60 }
61
62 async fn delete_session(&self, id: &SessionId) -> Result<(), SessionError> {
63 self.sessions.remove(id.as_str());
64 self.events.remove(id.as_str());
65 Ok(())
66 }
67
68 async fn append_event(&self, id: &SessionId, event: Event) -> Result<(), SessionError> {
69 let mut events = self
70 .events
71 .get_mut(id.as_str())
72 .ok_or_else(|| SessionError::NotFound(id.clone()))?;
73 events.push(event);
74 Ok(())
75 }
76
77 async fn get_events(&self, id: &SessionId) -> Result<Vec<Event>, SessionError> {
78 let events = self
79 .events
80 .get(id.as_str())
81 .ok_or_else(|| SessionError::NotFound(id.clone()))?;
82 Ok(events.clone())
83 }
84}