use crate::session::{SessionManager, SessionStore};
use mcpkit_core::capability::ServerInfo;
use std::sync::Arc;
#[derive(Clone)]
pub struct McpState<H> {
pub handler: Arc<H>,
pub server_info: ServerInfo,
pub sessions: Arc<SessionStore>,
pub sse_sessions: Arc<SessionManager>,
}
impl<H> McpState<H> {
pub fn new(handler: H) -> Self
where
H: HasServerInfo,
{
let server_info = handler.server_info();
Self {
handler: Arc::new(handler),
server_info,
sessions: Arc::new(SessionStore::with_default_timeout()),
sse_sessions: Arc::new(SessionManager::new()),
}
}
pub fn with_sessions(handler: H, sessions: SessionStore, sse_sessions: SessionManager) -> Self
where
H: HasServerInfo,
{
let server_info = handler.server_info();
Self {
handler: Arc::new(handler),
server_info,
sessions: Arc::new(sessions),
sse_sessions: Arc::new(sse_sessions),
}
}
}
pub trait HasServerInfo {
fn server_info(&self) -> ServerInfo;
}
impl<T> HasServerInfo for T
where
T: mcpkit_server::ServerHandler,
{
fn server_info(&self) -> ServerInfo {
<T as mcpkit_server::ServerHandler>::server_info(self)
}
}