/** * connectRetry —— 远端 MCP client 建连的有限重试 + 失败清理工具。 * * 背景:底层 `SSEClientTransport` 用的 eventsource v3 在建连失败后会由 `scheduleReconnect` * 无限重连(默认每 3s,无次数上限),且 SDK 的 `_startOrAuth` `onerror` 只 reject Promise、 * 不 close EventSource。若 `connectOne` / `runMcpProxyFromProcess` 在 `client.connect` 抛错后 * 不清理 transport,半开的 EventSource 会泄漏在后台无限重连,每次重连都经 `createSigningFetch` * 打 linkquegw 签名服务,把服务端打爆。本 helper 统一处理: * - 有限次重试(默认 3,指数退避封顶 8s),全部失败抛聚合错误; * - 每次失败立即 `safeClose` 半开 transport + client,堵住 EventSource 后台重连; * - 成功则把已连上的 `{transport, client}` 交还调用方(close 归调用方负责)。 * * 与 provider/代理语义解耦:经 `factories` 注入 transport/client 构造,供 `connectOne` 与 * `runMcpProxyFromProcess` 共用,避免逻辑漂移与横向依赖。 */ import type { Client } from '@modelcontextprotocol/sdk/client'; import type { SSEClientTransport } from '@modelcontextprotocol/sdk/client/sse.js'; import type { IMcpProxyConfig } from './types.js'; /** 默认建连最大尝试次数(含首次)。 */ export declare const DEFAULT_MAX_CONNECT_ATTEMPTS = 3; /** 默认重试退避基准毫秒。 */ export declare const DEFAULT_RECONNECT_BACKOFF_MS = 1000; /** {@link connectMcpClientWithRetry} 的 transport/client 构造工厂(调用方注入,便于复用与测试桩)。 */ export interface IConnectMcpClientFactories { /** 每次尝试新建一个 SSE transport(调用方负责把签名器装进去)。 */ createTransport: () => SSEClientTransport; /** 每次尝试新建一个 MCP client。 */ createClient: () => Client; } /** * 有限重试 + 失败清理地建立一个 MCP client(连远端 SSE 网关)。 * * 每次尝试:新建 transport + client → `await client.connect(transport)`。成功返回 `{transport, client}`; * 失败:先 `safeClose(transport, client)`(关 EventSource、清重连 timer、清 Protocol 状态)堵住后台重连, * 再按指数退避等待后重试。全部尝试失败时抛聚合 `Error(已尝试 N 次: )`(`cause` 串最后一次原始错误)。 * * @param config 提供 `maxConnectAttempts` / `reconnectBackoffMs`(缺省走默认);其余字段不被本函数消费。 * @param factories transport/client 构造工厂(每次重试都会调一次,确保失败实例被丢弃、不复用)。 * @returns 已连上的 `{transport, client}`;close 归调用方负责。 */ export declare function connectMcpClientWithRetry(config: IMcpProxyConfig, factories: IConnectMcpClientFactories): Promise<{ transport: SSEClientTransport; client: Client; }>;