-
Notifications
You must be signed in to change notification settings - Fork 479
Description
Describe the bug
SessionManager seems to be fixed to LocalSessionManager for SteamableHttpService, at least for the new function.
To Reproduce
Steps to reproduce the behavior:
let ns = NeverSessionManager{};
let service: StreamableHttpService<MyServerHandler> = StreamableHttpService::new(
move || {
Ok(MyServerHandler {})
},
ns.into(),//LocalSessionManager::default().into(),
StreamableHttpServerConfig::default(),
);
Expected behavior
It seems that new for StreamableHttpService defines an M only bound by SessionManager trait
impl<S, M> StreamableHttpService<S, M>
where
S: crate::Service<RoleServer> + Send + 'static,
M: SessionManager,
{
pub fn new(
service_factory: impl Fn() -> Result<S, std::io::Error> + Send + Sync + 'static,
session_manager: Arc<M>,
config: StreamableHttpServerConfig,
) -> Self {
Self {
config,
session_manager,
service_factory: Arc::new(service_factory),
}
}
...
However, the struct definition for StreamableHttpService fixes M to LocalSessionManager:
pub struct StreamableHttpService<S, M = super::session::local::LocalSessionManager> {
pub config: StreamableHttpServerConfig,
session_manager: Arc<M>,
service_factory: Arc<dyn Fn() -> Result<S, std::io::Error> + Send + Sync>,
}
Effectively making new only able to accept session_manager: Arc.
I wonder if this is a bug or if this was an explicit choice to lock out StreamableHttpService until more implementations of the trait are
available. I question how the SessionManager trait is used if this is not a bug. This BTW was encountered implementing a RedisSessionManager in lieu of an SDK based one being discussed here
Logs
Error from the "To Reproduce" section:
error[E0277]: the trait bound `Arc<LocalSessionManager>: From<NeverSessionManager>` is not satisfied
--> mcp.rs:30:12
|
308 | ns.into(),//LocalSessionManager::default().into(),
| ^^^^ unsatisfied trait bound
|
= help: the trait `std::convert::From<rmcp::transport::streamable_http_server::session::never::NeverSessionManager>` is not implemented for `std::sync::Arc<rmcp::transport::streamable_http_server::session::local::LocalSessionManager>`
= help: the following other types implement trait `std::convert::From<T>`:
`std::sync::Arc<B>` implements `std::convert::From<std::borrow::Cow<'_, B>>`
`std::sync::Arc<T, A>` implements `std::convert::From<std::boxed::Box<T, A>>`
`std::sync::Arc<T>` implements `std::convert::From<T>`
`std::sync::Arc<[T], A>` implements `std::convert::From<std::vec::Vec<T, A>>`
`std::sync::Arc<[T]>` implements `std::convert::From<&[T]>`
`std::sync::Arc<[T]>` implements `std::convert::From<&mut [T]>`
`std::sync::Arc<[T]>` implements `std::convert::From<[T; N]>`
`std::sync::Arc<[u8]>` implements `std::convert::From<std::sync::Arc<std::bstr::ByteStr>>`
and 22 others
= note: required for `rmcp::transport::streamable_http_server::session::never::NeverSessionManager` to implement `Into<Arc<LocalSessionManager>>`
= note: consider using `--verbose` to print the full type name to the console