Skip to main content

rs_adk/session/
memory.rs

1//! In-memory session service using DashMap.
2
3use async_trait::async_trait;
4use dashmap::DashMap;
5
6use super::{Session, SessionError, SessionId, SessionService};
7use crate::events::Event;
8
9/// In-memory session service backed by [`DashMap`] for lock-free concurrent access.
10///
11/// Suitable for testing, prototyping, and single-process deployments.
12/// Sessions are lost on process restart.
13pub struct InMemorySessionService {
14    sessions: DashMap<String, Session>,
15    events: DashMap<String, Vec<Event>>,
16}
17
18impl InMemorySessionService {
19    /// Create a new in-memory session service.
20    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}