use dashmap::DashMap;
use std::sync::Arc;
use uuid::Uuid;
use crate::types::ChatMessage;
#[derive(Clone)]
pub struct SessionStore {
inner: Arc<DashMap<String, Vec<ChatMessage>>>,
reasoning: Arc<DashMap<String, String>>,
}
impl SessionStore {
pub fn new() -> Self {
Self {
inner: Arc::new(DashMap::new()),
reasoning: Arc::new(DashMap::new()),
}
}
pub fn store_reasoning(&self, call_id: String, reasoning: String) {
if !reasoning.is_empty() {
self.reasoning.insert(call_id, reasoning);
}
}
pub fn get_reasoning(&self, call_id: &str) -> Option<String> {
self.reasoning.get(call_id).map(|v| v.clone())
}
pub fn get_history(&self, response_id: &str) -> Vec<ChatMessage> {
self.inner
.get(response_id)
.map(|v| v.clone())
.unwrap_or_default()
}
pub fn new_id(&self) -> String {
format!("resp_{}", Uuid::new_v4().simple())
}
pub fn save_with_id(&self, id: String, messages: Vec<ChatMessage>) {
self.inner.insert(id, messages);
}
pub fn save(&self, messages: Vec<ChatMessage>) -> String {
let id = self.new_id();
self.inner.insert(id.clone(), messages);
id
}
}