fix: raise and configure per-user gateway session capacity

This commit is contained in:
2026-10-28 03:40:04 +00:00
parent 2213ce7570
commit 267a65305e
7 changed files with 58 additions and 7 deletions
+4 -4
View File
@@ -6,24 +6,24 @@ import { SSEServerTransport } from "@modelcontextprotocol/sdk/server/sse.js";
import { isInitializeRequest } from "@modelcontextprotocol/sdk/types.js";
import type { AuthenticatedDingTalkUser } from "./xft.js";
import { McpSessionLifecycle } from "./mcp-session-lifecycle.js";
import { DEFAULT_MCP_SESSION_MAX_PER_USER, MCP_SESSION_MAX_TOTAL } from "./config.js";
type TransportEntry =
| { kind: "streamable"; transport: StreamableHTTPServerTransport; userId: string; lifecycle: McpSessionLifecycle }
| { kind: "sse"; transport: SSEServerTransport; userId: string; lifecycle: McpSessionLifecycle };
const MCP_SESSION_MAX_PER_USER = 8;
const MCP_SESSION_MAX_TOTAL = 1000;
interface McpTransportOptions {
authenticate?: RequestHandler;
// Production always resolves this from verified OAuth, never request parameters.
requestUser: (req: Request) => AuthenticatedDingTalkUser;
createServer: (user: AuthenticatedDingTalkUser, lifecycle: McpSessionLifecycle) => McpServer;
now?: () => number;
maxSessionsPerUser?: number;
}
export function installMcpTransports(app: Express, options: McpTransportOptions) {
const now = options.now ?? Date.now;
const maxSessionsPerUser = options.maxSessionsPerUser ?? DEFAULT_MCP_SESSION_MAX_PER_USER;
const transports = new Map<string, TransportEntry>();
let pendingTransportSessions = 0;
const pendingTransportSessionsByUser = new Map<string, number>();
@@ -40,7 +40,7 @@ export function installMcpTransports(app: Express, options: McpTransportOptions)
};
const sessionCapacityAvailable = (userId: string) => transports.size + pendingTransportSessions < MCP_SESSION_MAX_TOTAL
&& [...transports.values()].filter((entry) => entry.userId === userId).length
+ (pendingTransportSessionsByUser.get(userId) ?? 0) < MCP_SESSION_MAX_PER_USER;
+ (pendingTransportSessionsByUser.get(userId) ?? 0) < maxSessionsPerUser;
const reserveSession = (userId: string) => {
pendingTransportSessions += 1;
pendingTransportSessionsByUser.set(userId, (pendingTransportSessionsByUser.get(userId) ?? 0) + 1);