Skip to main content

sh_layer2/session_manager/
mod.rs

1//! # Session Manager
2//!
3//! 会话管理模块,提供并发安全的会话存储和生命周期管理。
4//!
5//! ## 模块结构
6//! - `manager`: ConcurrentSessionManager 实现
7//! - `session`: Session 和 ExecutionContext 定义
8//! - `lock`: ReadWriteLock 实现
9//! - `context`: 执行上下文
10
11mod context;
12mod lock;
13mod manager;
14mod session;
15
16pub use context::ExecutionContext;
17pub use lock::ReadWriteLock;
18pub use manager::ConcurrentSessionManager;
19pub use session::{Session, SessionConfig};
20
21use async_trait::async_trait;
22
23use crate::types::{AgentState, Layer2Result, Message, SessionId, SessionMeta};
24
25/// 会话管理器接口
26///
27/// 定义会话生命周期的核心操作。
28#[async_trait]
29pub trait SessionManagerTrait: Send + Sync {
30    /// 创建新会话
31    ///
32    /// # Arguments
33    /// * `config` - 会话配置
34    ///
35    /// # Returns
36    /// 新创建的会话 ID
37    async fn create(&self, config: SessionConfig) -> Layer2Result<SessionId>;
38
39    /// 获取会话
40    ///
41    /// # Arguments
42    /// * `id` - 会话 ID
43    ///
44    /// # Returns
45    /// 会话对象(只读)
46    async fn get(&self, id: &SessionId) -> Layer2Result<Option<Session>>;
47
48    /// 获取或创建会话
49    ///
50    /// 如果会话存在则返回,否则创建新会话。
51    ///
52    /// # Arguments
53    /// * `id` - 会话 ID(可选)
54    /// * `config` - 创建新会话时的配置
55    async fn get_or_create(
56        &self,
57        id: Option<&SessionId>,
58        config: SessionConfig,
59    ) -> Layer2Result<SessionId>;
60
61    /// 保存会话状态
62    ///
63    /// # Arguments
64    /// * `session` - 会话对象
65    async fn save(&self, session: &Session) -> Layer2Result<()>;
66
67    /// 删除会话
68    ///
69    /// # Arguments
70    /// * `id` - 会话 ID
71    async fn delete(&self, id: &SessionId) -> Layer2Result<bool>;
72
73    /// 列出所有会话
74    ///
75    /// # Returns
76    /// 会话元数据列表
77    async fn list(&self) -> Layer2Result<Vec<SessionMeta>>;
78
79    /// 更新会话状态(带写锁)
80    ///
81    /// # Arguments
82    /// * `id` - 会话 ID
83    /// * `update_fn` - 更新函数
84    async fn update<F>(&self, id: &SessionId, update_fn: F) -> Layer2Result<bool>
85    where
86        F: FnOnce(&mut Session) + Send;
87
88    /// 读取会话状态(带读锁)
89    ///
90    /// # Arguments
91    /// * `id` - 会话 ID
92    /// * `read_fn` - 读取函数
93    async fn read<F, T>(&self, id: &SessionId, read_fn: F) -> Layer2Result<Option<T>>
94    where
95        F: FnOnce(&Session) -> T + Send,
96        T: Send;
97
98    /// 获取会话状态
99    async fn get_state(&self, id: &SessionId) -> Layer2Result<Option<AgentState>>;
100
101    /// 设置会话状态
102    async fn set_state(&self, id: &SessionId, state: AgentState) -> Layer2Result<bool>;
103
104    /// 添加消息到会话
105    async fn add_message(&self, id: &SessionId, message: Message) -> Layer2Result<bool>;
106
107    /// 获取会话消息列表
108    async fn get_messages(&self, id: &SessionId) -> Layer2Result<Option<Vec<Message>>>;
109
110    /// 获取统计信息
111    fn stats(&self) -> SessionStats;
112}
113
114/// 会话统计信息
115#[derive(Debug, Clone, Default)]
116pub struct SessionStats {
117    pub total_sessions: usize,
118    pub max_sessions: usize,
119    pub active_sessions: usize,
120}
121
122/// 简化版状态锁接口(当读写分离不是瓶颈时使用)
123pub trait StateLockTrait: Send + Sync {
124    /// 获取读锁
125    fn read_lock<F, T>(&self, f: F) -> T
126    where
127        F: FnOnce() -> T;
128
129    /// 获取写锁
130    fn write_lock<F, T>(&self, f: F) -> T
131    where
132        F: FnOnce() -> T;
133}
134
135#[cfg(test)]
136mod tests {
137    use super::*;
138
139    #[test]
140    fn test_session_stats_default() {
141        let stats = SessionStats::default();
142        assert_eq!(stats.total_sessions, 0);
143        assert_eq!(stats.active_sessions, 0);
144    }
145}