/** * MULTI_INSTANCE 接收端 HTTP server(2026-08-10 行225:补全 verifyApiToken 闭环)。 * * 此前 MULTI_INSTANCE 是「发送端 only」——sendToInstance / dynamicSender 用 fetch POST + * buildAuthHeaders(HMAC 签名)发请求到 127.0.0.1:/api/,但 TS server 从不启动 * HTTP 接收端,verifyApiToken 零生产调用。本模块补全接收端: * * POST /api/ → verifyApiToken(instanceId, token) → dispatcher.handleCall * ↑ HMAC 签名验证失败 = 401 ↑ 复用 GodotServer 同一个 ToolDispatcher * * 安全模型: * - 仅 127.0.0.1(localhost,对齐 instance-api-auth.ts 的安全模型) * - HMAC 签名含 instance.id + timestamp + nonce,防重放(verifyApiToken 内置) * - toolName 严格校验 ^[a-zA-Z_][a-zA-Z0-9_]*$(防路径注入,对齐 sendToInstance 同款校验) * - 仅 POST(GET/其他方法 405) * * 限制(srvCtx=undefined 的代价): * - confirm_and_execute 双轮 MRTR 交互失效(多实例转发场景不需要 MRTR,可接受) * - logLevel / per-request log 失效(普通工具不受影响) * * 2026-08-11 可靠性加固(P2-2R/P2-3R/P3-1R): * - readBody/handleCall 加超时(对齐 sender 30s AbortSignal,收发对称防孤儿请求/slowloris) * - stop() 强制关连接(Node 18.2+ closeAllConnections,防 in-flight 长请求致 close() 挂起) * - forwardTimeoutMs 可注入(测试用小值避免等 30s,提升可测试性) */ import type { ToolDispatcher } from './ToolDispatcher.js'; export interface InstanceHttpServerOptions { /** 监听端口。 */ port: number; /** 本实例 id(verifyApiToken 用此 id 验签)。 */ instanceId: string; /** 工具调度器(复用 GodotServer 的 dispatcher)。 */ dispatcher: ToolDispatcher; /** * 工具转发超时(毫秒),默认 30s(对齐 sender)。测试可注入小值(如 200)避免等 30s。 * P2-2R/P3-1R(2026-08-11 可靠性审查)。 */ forwardTimeoutMs?: number; } export declare class InstanceHttpServer { private server; private readonly opts; private readonly forwardTimeoutMs; constructor(opts: InstanceHttpServerOptions); /** 启动 HTTP server 监听 127.0.0.1:。 */ start(): Promise; /** 停止 HTTP server。best-effort,不 throw。 */ stop(): Promise; /** 是否正在监听。 */ isListening(): boolean; /** 核心请求处理:验签 → 解析 → 转发 dispatcher。 */ private handleRequest; /** 读取请求 body(有上限防内存耗尽)。 */ private readBody; }