Skip to main content

edgechain_memory/
session.rs

1use std::collections::HashMap;
2use std::sync::RwLock;
3use async_trait::async_trait;
4use chrono::Utc;
5use crate::{
6    error::MemoryError,
7    store::{MemoryEntry, MemoryStore},
8};
9
10/// In-process session memory. Cleared when the session ends.
11/// Thread-safe via RwLock.
12pub struct SessionMemory {
13    store: RwLock<HashMap<String, MemoryEntry>>,
14}
15
16impl SessionMemory {
17    pub fn new() -> Self {
18        Self {
19            store: RwLock::new(HashMap::new()),
20        }
21    }
22
23    pub fn clear(&self) {
24        self.store.write().unwrap().clear();
25    }
26
27    pub fn len(&self) -> usize {
28        self.store.read().unwrap().len()
29    }
30
31    pub fn is_empty(&self) -> bool {
32        self.len() == 0
33    }
34}
35
36impl Default for SessionMemory {
37    fn default() -> Self {
38        Self::new()
39    }
40}
41
42#[async_trait]
43impl MemoryStore for SessionMemory {
44    async fn set(&self, key: &str, value: serde_json::Value) -> Result<(), MemoryError> {
45        let mut store = self.store.write().unwrap();
46        let entry = store.entry(key.to_string()).or_insert_with(|| MemoryEntry::new(key, value.clone()));
47        entry.value = value;
48        entry.updated_at = Utc::now();
49        Ok(())
50    }
51
52    async fn get(&self, key: &str) -> Result<Option<MemoryEntry>, MemoryError> {
53        Ok(self.store.read().unwrap().get(key).cloned())
54    }
55
56    async fn delete(&self, key: &str) -> Result<(), MemoryError> {
57        self.store.write().unwrap().remove(key);
58        Ok(())
59    }
60
61    async fn list_keys(&self, prefix: Option<&str>) -> Result<Vec<String>, MemoryError> {
62        let store = self.store.read().unwrap();
63        let keys = store
64            .keys()
65            .filter(|k| prefix.is_none_or(|p| k.starts_with(p)))
66            .cloned()
67            .collect();
68        Ok(keys)
69    }
70
71    async fn search_by_tag(&self, tag: &str) -> Result<Vec<MemoryEntry>, MemoryError> {
72        let store = self.store.read().unwrap();
73        let results = store
74            .values()
75            .filter(|e| e.tags.iter().any(|t| t == tag))
76            .cloned()
77            .collect();
78        Ok(results)
79    }
80
81    async fn set_tagged(
82        &self,
83        key: &str,
84        value: serde_json::Value,
85        tags: Vec<String>,
86    ) -> Result<(), MemoryError> {
87        let mut store = self.store.write().unwrap();
88        let entry = store.entry(key.to_string()).or_insert_with(|| MemoryEntry::new(key, value.clone()));
89        entry.value = value;
90        entry.tags = tags;
91        entry.updated_at = Utc::now();
92        Ok(())
93    }
94}