pub struct StreamProxyHandler { /* private fields */ }Expand description
A proxy handler that forwards requests to a client based on the server’s capabilities 使用 ArcSwap 实现后端热替换,支持断开时立即返回错误
增强功能:
- 后端版本控制:每次 swap_backend 都会递增版本号
- 支持 Session 版本跟踪:配合 ProxyAwareSessionManager 使用
Implementations§
Source§impl ProxyHandler
impl ProxyHandler
Sourcepub fn new_disconnected(
mcp_id: String,
tool_filter: ToolFilter,
default_info: InitializeResult,
) -> ProxyHandler
pub fn new_disconnected( mcp_id: String, tool_filter: ToolFilter, default_info: InitializeResult, ) -> ProxyHandler
创建断开状态的 handler(用于初始化) 后续通过 swap_backend() 注入实际的后端连接
pub fn new( client: RunningService<RoleClient, InitializeRequestParams>, ) -> ProxyHandler
pub fn with_mcp_id( client: RunningService<RoleClient, InitializeRequestParams>, mcp_id: String, ) -> ProxyHandler
Sourcepub fn with_tool_filter(
client: RunningService<RoleClient, InitializeRequestParams>,
mcp_id: String,
tool_filter: ToolFilter,
) -> ProxyHandler
pub fn with_tool_filter( client: RunningService<RoleClient, InitializeRequestParams>, mcp_id: String, tool_filter: ToolFilter, ) -> ProxyHandler
创建带工具过滤器的 ProxyHandler(带初始后端连接)
Sourcepub fn swap_backend(
&self,
new_client: Option<RunningService<RoleClient, InitializeRequestParams>>,
)
pub fn swap_backend( &self, new_client: Option<RunningService<RoleClient, InitializeRequestParams>>, )
原子性替换后端连接
- Some(client): 设置新的后端连接
- None: 标记后端断开
版本控制:每次调用都会递增 backend_version,使旧 session 失效
Sourcepub fn is_backend_available(&self) -> bool
pub fn is_backend_available(&self) -> bool
检查后端是否可用(快速检查,不发送请求)
Sourcepub async fn is_mcp_server_ready(&self) -> bool
pub async fn is_mcp_server_ready(&self) -> bool
检查 mcp 服务是否正常(异步版本,会发送验证请求)
Sourcepub fn is_terminated(&self) -> bool
pub fn is_terminated(&self) -> bool
检查后端连接是否已关闭(同步版本,仅检查 transport 状态)
Sourcepub async fn is_terminated_async(&self) -> bool
pub async fn is_terminated_async(&self) -> bool
异步检查后端连接是否已断开(会发送验证请求)
Sourcepub fn get_backend_version(&self) -> u64
pub fn get_backend_version(&self) -> u64
获取当前后端版本号
版本号用于跟踪后端连接变化:
- 0: 断开状态
- 1+: 已连接,每次 swap_backend 递增
用途:配合 ProxyAwareSessionManager 实现 session 版本控制
Sourcepub fn swap_backend_from_connection(&self, conn: Option<StreamClientConnection>)
pub fn swap_backend_from_connection(&self, conn: Option<StreamClientConnection>)
Update backend from a StreamClientConnection
This method allows updating the backend connection using the high-level
StreamClientConnection type, which is more convenient than the raw
RunningService type.
§Arguments
conn- Some(connection) to set new backend, None to mark disconnected
Trait Implementations§
Source§impl Clone for ProxyHandler
impl Clone for ProxyHandler
Source§fn clone(&self) -> ProxyHandler
fn clone(&self) -> ProxyHandler
Returns a duplicate of the value. Read more
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
Performs copy-assignment from
source. Read moreSource§impl Debug for ProxyHandler
impl Debug for ProxyHandler
Source§impl From<ProxyHandler> for McpHandler
impl From<ProxyHandler> for McpHandler
Source§fn from(handler: StreamProxyHandler) -> Self
fn from(handler: StreamProxyHandler) -> Self
Converts to this type from the input type.
Source§impl ServerHandler for ProxyHandler
impl ServerHandler for ProxyHandler
fn get_info(&self) -> InitializeResult
async fn list_tools( &self, request: Option<PaginatedRequestParams>, context: RequestContext<RoleServer>, ) -> Result<ListToolsResult, ErrorData>
async fn call_tool( &self, request: CallToolRequestParams, context: RequestContext<RoleServer>, ) -> Result<CallToolResult, ErrorData>
async fn list_resources( &self, request: Option<PaginatedRequestParams>, context: RequestContext<RoleServer>, ) -> Result<ListResourcesResult, ErrorData>
async fn read_resource( &self, request: ReadResourceRequestParams, context: RequestContext<RoleServer>, ) -> Result<ReadResourceResult, ErrorData>
async fn list_resource_templates( &self, request: Option<PaginatedRequestParams>, context: RequestContext<RoleServer>, ) -> Result<ListResourceTemplatesResult, ErrorData>
async fn list_prompts( &self, request: Option<PaginatedRequestParams>, context: RequestContext<RoleServer>, ) -> Result<ListPromptsResult, ErrorData>
async fn get_prompt( &self, request: GetPromptRequestParams, context: RequestContext<RoleServer>, ) -> Result<GetPromptResult, ErrorData>
async fn complete( &self, request: CompleteRequestParams, context: RequestContext<RoleServer>, ) -> Result<CompleteResult, ErrorData>
async fn on_progress( &self, notification: ProgressNotificationParam, _context: NotificationContext<RoleServer>, )
async fn on_cancelled( &self, notification: CancelledNotificationParam, _context: NotificationContext<RoleServer>, )
fn enqueue_task( &self, _request: CallToolRequestParams, _context: RequestContext<RoleServer>, ) -> impl Future<Output = Result<CreateTaskResult, ErrorData>> + Send
fn ping( &self, context: RequestContext<RoleServer>, ) -> impl Future<Output = Result<(), ErrorData>> + Send
fn initialize( &self, request: InitializeRequestParams, context: RequestContext<RoleServer>, ) -> impl Future<Output = Result<InitializeResult, ErrorData>> + Send
fn set_level( &self, request: SetLevelRequestParams, context: RequestContext<RoleServer>, ) -> impl Future<Output = Result<(), ErrorData>> + Send
fn subscribe( &self, request: SubscribeRequestParams, context: RequestContext<RoleServer>, ) -> impl Future<Output = Result<(), ErrorData>> + Send
fn unsubscribe( &self, request: UnsubscribeRequestParams, context: RequestContext<RoleServer>, ) -> impl Future<Output = Result<(), ErrorData>> + Send
fn on_custom_request( &self, request: CustomRequest, context: RequestContext<RoleServer>, ) -> impl Future<Output = Result<CustomResult, ErrorData>> + Send
fn on_initialized( &self, context: NotificationContext<RoleServer>, ) -> impl Future<Output = ()> + Send
fn on_roots_list_changed( &self, context: NotificationContext<RoleServer>, ) -> impl Future<Output = ()> + Send
fn on_custom_notification( &self, notification: CustomNotification, context: NotificationContext<RoleServer>, ) -> impl Future<Output = ()> + Send
fn list_tasks( &self, request: Option<PaginatedRequestParams>, context: RequestContext<RoleServer>, ) -> impl Future<Output = Result<ListTasksResult, ErrorData>> + Send
fn get_task_info( &self, request: GetTaskInfoParams, context: RequestContext<RoleServer>, ) -> impl Future<Output = Result<GetTaskResult, ErrorData>> + Send
fn get_task_result( &self, request: GetTaskResultParams, context: RequestContext<RoleServer>, ) -> impl Future<Output = Result<GetTaskPayloadResult, ErrorData>> + Send
fn cancel_task( &self, request: CancelTaskParams, context: RequestContext<RoleServer>, ) -> impl Future<Output = Result<CancelTaskResult, ErrorData>> + Send
Auto Trait Implementations§
impl Freeze for ProxyHandler
impl !RefUnwindSafe for ProxyHandler
impl Send for ProxyHandler
impl Sync for ProxyHandler
impl Unpin for ProxyHandler
impl UnsafeUnpin for ProxyHandler
impl !UnwindSafe for ProxyHandler
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<R, S> DynService<R> for Swhere
R: ServiceRole,
S: Service<R>,
impl<R, S> DynService<R> for Swhere
R: ServiceRole,
S: Service<R>,
fn handle_request( &self, request: <R as ServiceRole>::PeerReq, context: RequestContext<R>, ) -> Pin<Box<dyn Future<Output = Result<<R as ServiceRole>::Resp, ErrorData>> + Send + '_>>
fn handle_notification( &self, notification: <R as ServiceRole>::PeerNot, context: NotificationContext<R>, ) -> Pin<Box<dyn Future<Output = Result<(), ErrorData>> + Send + '_>>
fn get_info(&self) -> <R as ServiceRole>::Info
Source§impl<T> FutureExt for T
impl<T> FutureExt for T
Source§fn with_context(self, otel_cx: Context) -> WithContext<Self>
fn with_context(self, otel_cx: Context) -> WithContext<Self>
Source§fn with_current_context(self) -> WithContext<Self>
fn with_current_context(self) -> WithContext<Self>
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoRequest<T> for T
impl<T> IntoRequest<T> for T
Source§fn into_request(self) -> Request<T>
fn into_request(self) -> Request<T>
Wrap the input message
T in a tonic::RequestSource§impl<T> Pointable for T
impl<T> Pointable for T
Source§impl<T> PolicyExt for Twhere
T: ?Sized,
impl<T> PolicyExt for Twhere
T: ?Sized,
Source§impl<H> Service<RoleServer> for Hwhere
H: ServerHandler,
impl<H> Service<RoleServer> for Hwhere
H: ServerHandler,
async fn handle_request( &self, request: <RoleServer as ServiceRole>::PeerReq, context: RequestContext<RoleServer>, ) -> Result<<RoleServer as ServiceRole>::Resp, ErrorData>
async fn handle_notification( &self, notification: <RoleServer as ServiceRole>::PeerNot, context: NotificationContext<RoleServer>, ) -> Result<(), ErrorData>
fn get_info(&self) -> <RoleServer as ServiceRole>::Info
Source§impl<S> ServiceExt<RoleServer> for Swhere
S: Service<RoleServer>,
impl<S> ServiceExt<RoleServer> for Swhere
S: Service<RoleServer>,
fn serve_with_ct<T, E, A>( self, transport: T, ct: CancellationToken, ) -> impl Future<Output = Result<RunningService<RoleServer, S>, ServerInitializeError>> + Send
Source§fn into_dyn(self) -> Box<dyn DynService<R>>
fn into_dyn(self) -> Box<dyn DynService<R>>
Convert this service to a dynamic boxed service Read more