UNPKG

touchdesigner-mcp-server

Version:
93 lines (92 loc) 3.23 kB
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js"; import type { JSONRPCMessage } from "@modelcontextprotocol/sdk/types.js"; import type { ILogger } from "../core/logger.js"; import type { Result } from "../core/result.js"; import type { StreamableHttpTransportConfig } from "./config.js"; import type { ISessionManager } from "./sessionManager.js"; /** * Transport Registry * * Manages per-session transport and server instances for Streamable HTTP transport. * Each session gets its own isolated transport and server to maintain independent MCP protocol state. * * Key Responsibilities: * - Create new transport + server instances for new sessions * - Reuse existing transport for requests with valid session IDs * - Clean up sessions on close or expiration * - Track active session count for health checks * * @example * ```typescript * const registry = new TransportRegistry(config, sessionManager, logger); * * // In HTTP request handler * const transport = await registry.getOrCreate( * sessionId, * requestBody, * () => createTouchDesignerServer() * ); * * if (transport) { * await transport.handleRequest(req, res, requestBody); * } * * // On shutdown * await registry.cleanup(); * ``` */ export declare class TransportRegistry { private readonly sessions; private readonly config; private readonly sessionManager; private readonly logger; constructor(config: StreamableHttpTransportConfig, sessionManager: ISessionManager | null, logger: ILogger); /** * Get or create transport for a session * * Logic: * 1. If sessionId exists and valid → return existing transport * 2. If no sessionId and request is initialize → create new transport + server * 3. Otherwise → return null (invalid session) * * @param sessionId - Session ID from mcp-session-id header (undefined for new sessions) * @param requestBody - JSON-RPC request body * @param serverFactory - Factory function to create new Server instances * @returns Transport instance or null if session is invalid */ getOrCreate(sessionId: string | undefined, requestBody: JSONRPCMessage, serverFactory: () => McpServer): Promise<StreamableHTTPServerTransport | null>; /** * Create a new session with transport and server instances * * @param serverFactory - Factory function to create new Server instances * @returns Transport instance for the new session */ private createSession; /** * Remove session from registry * * @param sessionId - Session ID to remove */ remove(sessionId: string): void; /** * Get number of active sessions * * @returns Active session count */ getCount(): number; /** * Get all session IDs * * @returns Array of session IDs */ getSessionIds(): string[]; /** * Cleanup all sessions * * Called during graceful shutdown to close all active sessions * * @returns Result indicating success or failure */ cleanup(): Promise<Result<void, Error>>; }