use crate::session::{SessionManager, SessionStore};
use mcpkit_core::auth::ProtectedResourceMetadata;
use mcpkit_core::capability::ServerInfo;
use std::fmt;
use std::sync::Arc;
pub struct McpState<H> {
pub handler: Arc<H>,
pub server_info: ServerInfo,
pub sessions: Arc<SessionStore>,
pub sse_sessions: Arc<SessionManager>,
}
impl<H> Clone for McpState<H> {
fn clone(&self) -> Self {
Self {
handler: Arc::clone(&self.handler),
server_info: self.server_info.clone(),
sessions: Arc::clone(&self.sessions),
sse_sessions: Arc::clone(&self.sse_sessions),
}
}
}
impl<H> fmt::Debug for McpState<H> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("McpState")
.field("handler", &format_args!("Arc<H>"))
.field("server_info", &self.server_info)
.field("sessions", &self.sessions)
.field("sse_sessions", &format_args!("Arc<SessionManager>"))
.finish()
}
}
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)
}
}
#[derive(Clone, Debug)]
pub struct OAuthState {
pub metadata: ProtectedResourceMetadata,
}
impl OAuthState {
#[must_use]
pub const fn new(metadata: ProtectedResourceMetadata) -> Self {
Self { metadata }
}
}