50 lines
1.4 KiB
Rust
50 lines
1.4 KiB
Rust
use std::sync::Arc;
|
|
|
|
use tokio::sync::Mutex;
|
|
|
|
use crate::agent::AgentError;
|
|
|
|
use super::session::Session;
|
|
use super::session_factory::SessionFactory;
|
|
use super::session_pool::SessionPool;
|
|
|
|
#[derive(Clone)]
|
|
pub(crate) struct SessionLifecycleService {
|
|
session_pool: SessionPool,
|
|
}
|
|
|
|
impl SessionLifecycleService {
|
|
pub(crate) fn new(session_factory: SessionFactory, session_ttl_hours: Option<u64>) -> Self {
|
|
Self {
|
|
session_pool: SessionPool::new(session_factory, session_ttl_hours),
|
|
}
|
|
}
|
|
|
|
pub(crate) async fn ensure_session(&self, channel_name: &str) -> Result<(), AgentError> {
|
|
self.session_pool.ensure_session(channel_name).await
|
|
}
|
|
|
|
pub(crate) async fn get(&self, channel_name: &str) -> Option<Arc<Mutex<Session>>> {
|
|
self.session_pool.get(channel_name).await
|
|
}
|
|
|
|
pub(crate) async fn touch(&self, channel_name: &str) {
|
|
self.session_pool.touch(channel_name).await;
|
|
}
|
|
|
|
pub(crate) async fn active_session(
|
|
&self,
|
|
channel_name: &str,
|
|
) -> Result<Arc<Mutex<Session>>, AgentError> {
|
|
self.ensure_session(channel_name).await?;
|
|
self.touch(channel_name).await;
|
|
self.get(channel_name)
|
|
.await
|
|
.ok_or_else(|| AgentError::Other("Session not found".to_string()))
|
|
}
|
|
|
|
pub(crate) async fn cleanup_expired_sessions(&self) -> usize {
|
|
self.session_pool.cleanup_expired_sessions().await
|
|
}
|
|
}
|