@darkiceinteractive/mcp-conductor 1.1.0 → 2.0.0-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/dist/bridge/http-server.d.ts +39 -1
  2. package/dist/bridge/http-server.d.ts.map +1 -1
  3. package/dist/bridge/http-server.js +162 -5
  4. package/dist/bridge/http-server.js.map +1 -1
  5. package/dist/bridge/session-registry.d.ts +64 -0
  6. package/dist/bridge/session-registry.d.ts.map +1 -0
  7. package/dist/bridge/session-registry.js +124 -0
  8. package/dist/bridge/session-registry.js.map +1 -0
  9. package/dist/config/defaults.d.ts +10 -0
  10. package/dist/config/defaults.d.ts.map +1 -1
  11. package/dist/config/defaults.js +10 -0
  12. package/dist/config/defaults.js.map +1 -1
  13. package/dist/index.js +12 -0
  14. package/dist/index.js.map +1 -1
  15. package/dist/runtime/executor.d.ts +12 -0
  16. package/dist/runtime/executor.d.ts.map +1 -1
  17. package/dist/runtime/executor.js +70 -3
  18. package/dist/runtime/executor.js.map +1 -1
  19. package/dist/server/mcp-server.d.ts +5 -0
  20. package/dist/server/mcp-server.d.ts.map +1 -1
  21. package/dist/server/mcp-server.js +187 -43
  22. package/dist/server/mcp-server.js.map +1 -1
  23. package/dist/utils/index.d.ts +2 -0
  24. package/dist/utils/index.d.ts.map +1 -1
  25. package/dist/utils/index.js +2 -0
  26. package/dist/utils/index.js.map +1 -1
  27. package/dist/utils/logger.d.ts.map +1 -1
  28. package/dist/utils/logger.js +5 -1
  29. package/dist/utils/logger.js.map +1 -1
  30. package/dist/utils/orphan-watch.d.ts +34 -0
  31. package/dist/utils/orphan-watch.d.ts.map +1 -0
  32. package/dist/utils/orphan-watch.js +54 -0
  33. package/dist/utils/orphan-watch.js.map +1 -0
  34. package/dist/utils/redact.d.ts +15 -0
  35. package/dist/utils/redact.d.ts.map +1 -0
  36. package/dist/utils/redact.js +48 -0
  37. package/dist/utils/redact.js.map +1 -0
  38. package/dist/version.d.ts +3 -3
  39. package/dist/version.d.ts.map +1 -1
  40. package/dist/version.js +3 -3
  41. package/dist/version.js.map +1 -1
  42. package/package.json +2 -2
@@ -7,6 +7,7 @@
7
7
  */
8
8
  import type { BridgeConfig } from '../config/index.js';
9
9
  import { type ExecutionStream } from '../streaming/index.js';
10
+ import { SessionRegistry } from './session-registry.js';
10
11
  export interface ToolCallRequest {
11
12
  server: string;
12
13
  tool: string;
@@ -72,7 +73,12 @@ export declare class HttpBridge {
72
73
  private handlers;
73
74
  private startTime;
74
75
  private actualPort;
75
- constructor(config: BridgeConfig);
76
+ private sessions;
77
+ constructor(config: BridgeConfig, sessions?: SessionRegistry);
78
+ /**
79
+ * Exposed for tests that need to assert registry state directly.
80
+ */
81
+ getSessionRegistry(): SessionRegistry;
76
82
  /**
77
83
  * Set the handlers for bridge operations
78
84
  */
@@ -93,6 +99,38 @@ export declare class HttpBridge {
93
99
  * Get the actual port the server is listening on
94
100
  */
95
101
  getPort(): number;
102
+ /**
103
+ * Return true if a bare hostname (no brackets, no port) is loopback.
104
+ * Hostnames are case-insensitive per RFC 1035 §2.3.3 — `Localhost` and
105
+ * `LOCALHOST` are valid Host header values, so compare lowercased.
106
+ */
107
+ private static isLoopbackHostname;
108
+ /**
109
+ * Extract the bare hostname from a `Host` header (`host[:port]` or
110
+ * `[ipv6]:port`). Returns undefined for malformed values.
111
+ */
112
+ private static extractHostHeaderName;
113
+ /**
114
+ * Extract hostname from an `Origin` header (a full URL like
115
+ * `http://example.com:8080`). Returns undefined for malformed values.
116
+ *
117
+ * Node's WHATWG URL keeps IPv6 addresses in bracketed form (`[::1]`) on
118
+ * the `hostname` property, so strip the brackets for comparison.
119
+ */
120
+ private static extractOriginHostname;
121
+ /**
122
+ * Internal sandbox-only routes that should bypass MCP session middleware.
123
+ * The Deno sandbox is not an MCP client; tracking a session per call
124
+ * inflates the registry without any reconnection benefit and forces the
125
+ * 1000-entry LRU evictor into the hot path.
126
+ */
127
+ private static isSandboxInternalPath;
128
+ /**
129
+ * Normalise the Mcp-Session-Id header. Node surfaces duplicates as string[],
130
+ * so take the first value and trim. Reject obvious garbage so bad clients
131
+ * don't get stored in the registry.
132
+ */
133
+ private readSessionHeader;
96
134
  /**
97
135
  * Handle incoming HTTP request
98
136
  */
@@ -1 +1 @@
1
- {"version":3,"file":"http-server.d.ts","sourceRoot":"","sources":["../../src/bridge/http-server.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAoB,KAAK,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAE/E,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjC;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE;QACN,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;IACF,OAAO,CAAC,EAAE;QACR,UAAU,EAAE,MAAM,CAAC;QACnB,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;CACH;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,WAAW,GAAG,cAAc,GAAG,OAAO,CAAC;CAChD;AAED,MAAM,MAAM,eAAe,GAAG,CAC5B,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAC5B,OAAO,CAAC,OAAO,CAAC,CAAC;AAEtB,MAAM,MAAM,kBAAkB,GAAG,MAAM,UAAU,EAAE,CAAC;AAEpD,MAAM,MAAM,gBAAgB,GAAG,CAAC,UAAU,EAAE,MAAM,KAAK,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAEpG,MAAM,MAAM,kBAAkB,GAAG,CAAC,KAAK,EAAE,MAAM,KAAK,KAAK,CAAC;IACxD,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC,CAAC;AAEH,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,eAAe,CAAC;IAC1B,WAAW,EAAE,kBAAkB,CAAC;IAChC,SAAS,EAAE,gBAAgB,CAAC;IAC5B,WAAW,EAAE,kBAAkB,CAAC;CACjC;AAED,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,UAAU;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC;CAC7C;AAED,MAAM,WAAW,gBAAgB;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,SAAS,GAAG,WAAW,GAAG,OAAO,CAAC;IAC1C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,QAAQ,CAA+B;IAC/C,OAAO,CAAC,SAAS,CAAsB;IACvC,OAAO,CAAC,UAAU,CAAa;gBAEnB,MAAM,EAAE,YAAY;IAIhC;;OAEG;IACH,WAAW,CAAC,QAAQ,EAAE,cAAc,GAAG,IAAI;IAI3C;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAkC5B;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAe3B;;OAEG;IACH,MAAM,IAAI,MAAM;IAMhB;;OAEG;IACH,OAAO,IAAI,MAAM;IAIjB;;OAEG;YACW,aAAa;IAwD3B;;OAEG;YACW,YAAY;IAY1B;;OAEG;YACW,iBAAiB;IAU/B;;OAEG;YACW,eAAe;IAU7B;;OAEG;YACW,cAAc;IA0D5B;;OAEG;YACW,YAAY;IAU1B;;OAEG;YACW,mBAAmB;IAejC;;OAEG;YACW,cAAc;IAmB5B;;OAEG;YACW,SAAS;IAmBvB;;OAEG;YACW,eAAe;IAmB7B;;OAEG;YACW,iBAAiB;IAgB/B;;OAEG;IACH,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,eAAe;IAKlD;;OAEG;IACH,SAAS,CAAC,WAAW,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS;IAK3D;;OAEG;IACH,OAAO,CAAC,QAAQ;IAuBhB;;OAEG;IACH,OAAO,CAAC,QAAQ;IAKhB;;OAEG;IACH,OAAO,CAAC,SAAS;CAGlB"}
1
+ {"version":3,"file":"http-server.d.ts","sourceRoot":"","sources":["../../src/bridge/http-server.ts"],"names":[],"mappings":"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"}
@@ -8,6 +8,12 @@
8
8
  import { createServer } from 'node:http';
9
9
  import { logger } from '../utils/index.js';
10
10
  import { getStreamManager } from '../streaming/index.js';
11
+ import { SessionRegistry } from './session-registry.js';
12
+ /**
13
+ * Header name per MCP spec 2025-03-26 Streamable HTTP transport. Case-
14
+ * insensitive on the wire, but Node lowercases incoming header keys.
15
+ */
16
+ const MCP_SESSION_ID_HEADER = 'mcp-session-id';
11
17
  /**
12
18
  * HTTP Bridge Server class
13
19
  */
@@ -17,8 +23,16 @@ export class HttpBridge {
17
23
  handlers = null;
18
24
  startTime = Date.now();
19
25
  actualPort = 0; // The actual port after binding (for dynamic port allocation)
20
- constructor(config) {
26
+ sessions;
27
+ constructor(config, sessions) {
21
28
  this.config = config;
29
+ this.sessions = sessions ?? new SessionRegistry();
30
+ }
31
+ /**
32
+ * Exposed for tests that need to assert registry state directly.
33
+ */
34
+ getSessionRegistry() {
35
+ return this.sessions;
22
36
  }
23
37
  /**
24
38
  * Set the handlers for bridge operations
@@ -34,6 +48,7 @@ export class HttpBridge {
34
48
  throw new Error('Bridge server already running');
35
49
  }
36
50
  this.startTime = Date.now();
51
+ this.sessions.start();
37
52
  return new Promise((resolve, reject) => {
38
53
  this.server = createServer((req, res) => {
39
54
  this.handleRequest(req, res).catch((error) => {
@@ -71,6 +86,7 @@ export class HttpBridge {
71
86
  logger.info('HTTP bridge stopped');
72
87
  this.server = null;
73
88
  this.actualPort = 0; // Reset actual port on stop
89
+ this.sessions.stop();
74
90
  resolve();
75
91
  });
76
92
  });
@@ -89,22 +105,156 @@ export class HttpBridge {
89
105
  getPort() {
90
106
  return this.actualPort || this.config.port;
91
107
  }
108
+ /**
109
+ * Return true if a bare hostname (no brackets, no port) is loopback.
110
+ * Hostnames are case-insensitive per RFC 1035 §2.3.3 — `Localhost` and
111
+ * `LOCALHOST` are valid Host header values, so compare lowercased.
112
+ */
113
+ static isLoopbackHostname(hostname) {
114
+ if (!hostname)
115
+ return false;
116
+ const h = hostname.toLowerCase();
117
+ return h === 'localhost' || h === '127.0.0.1' || h === '::1';
118
+ }
119
+ /**
120
+ * Extract the bare hostname from a `Host` header (`host[:port]` or
121
+ * `[ipv6]:port`). Returns undefined for malformed values.
122
+ */
123
+ static extractHostHeaderName(header) {
124
+ if (!header)
125
+ return undefined;
126
+ if (header.startsWith('[')) {
127
+ // IPv6 bracketed form: `[::1]:PORT`
128
+ const close = header.indexOf(']');
129
+ return close > 0 ? header.substring(1, close) : undefined;
130
+ }
131
+ // IPv4 or DNS hostname — strip any single :port suffix.
132
+ return header.split(':')[0];
133
+ }
134
+ /**
135
+ * Extract hostname from an `Origin` header (a full URL like
136
+ * `http://example.com:8080`). Returns undefined for malformed values.
137
+ *
138
+ * Node's WHATWG URL keeps IPv6 addresses in bracketed form (`[::1]`) on
139
+ * the `hostname` property, so strip the brackets for comparison.
140
+ */
141
+ static extractOriginHostname(header) {
142
+ if (!header)
143
+ return undefined;
144
+ try {
145
+ const raw = new URL(header).hostname;
146
+ return raw.startsWith('[') && raw.endsWith(']') ? raw.slice(1, -1) : raw;
147
+ }
148
+ catch {
149
+ return undefined;
150
+ }
151
+ }
152
+ /**
153
+ * Internal sandbox-only routes that should bypass MCP session middleware.
154
+ * The Deno sandbox is not an MCP client; tracking a session per call
155
+ * inflates the registry without any reconnection benefit and forces the
156
+ * 1000-entry LRU evictor into the hot path.
157
+ */
158
+ static isSandboxInternalPath(path) {
159
+ return (path === '/call' ||
160
+ path === '/log' ||
161
+ path === '/progress' ||
162
+ path === '/tool-event' ||
163
+ path === '/search' ||
164
+ path === '/servers' ||
165
+ path === '/streams' ||
166
+ path === '/health' ||
167
+ path.startsWith('/servers/') ||
168
+ path.startsWith('/stream/'));
169
+ }
170
+ /**
171
+ * Normalise the Mcp-Session-Id header. Node surfaces duplicates as string[],
172
+ * so take the first value and trim. Reject obvious garbage so bad clients
173
+ * don't get stored in the registry.
174
+ */
175
+ readSessionHeader(value) {
176
+ if (!value)
177
+ return undefined;
178
+ const raw = Array.isArray(value) ? value[0] : value;
179
+ if (!raw)
180
+ return undefined;
181
+ const trimmed = raw.trim();
182
+ if (!trimmed || trimmed.length > 128)
183
+ return undefined;
184
+ // MCP spec requires IDs be "globally unique and cryptographically secure".
185
+ // We generate UUIDs, but clients may pass other printable ASCII schemes;
186
+ // accept any printable ASCII and let the registry do the real validation.
187
+ if (!/^[\x21-\x7e]+$/.test(trimmed))
188
+ return undefined;
189
+ return trimmed;
190
+ }
92
191
  /**
93
192
  * Handle incoming HTTP request
94
193
  */
95
194
  async handleRequest(req, res) {
195
+ // DNS-rebinding guard: reject requests whose Host or Origin claims a
196
+ // non-localhost origin. Per MCP spec 2025-03-26 transport requirements.
197
+ // A page on evil.com can make a browser issue requests to our bridge by
198
+ // resolving the attacker's hostname to 127.0.0.1, but the Host/Origin
199
+ // headers still carry evil.com — so we must validate those, not just the
200
+ // socket address.
201
+ const hostHeader = req.headers.host;
202
+ const originHeader = req.headers.origin;
203
+ if (!HttpBridge.isLoopbackHostname(HttpBridge.extractHostHeaderName(hostHeader))) {
204
+ logger.warn('Rejecting bridge request with non-localhost Host', { host: hostHeader });
205
+ res.writeHead(403, { 'Content-Type': 'application/json' });
206
+ res.end(JSON.stringify({ error: 'Host header not allowed' }));
207
+ return;
208
+ }
209
+ if (originHeader) {
210
+ if (!HttpBridge.isLoopbackHostname(HttpBridge.extractOriginHostname(originHeader))) {
211
+ logger.warn('Rejecting bridge request with non-localhost Origin', { origin: originHeader });
212
+ res.writeHead(403, { 'Content-Type': 'application/json' });
213
+ res.end(JSON.stringify({ error: 'Origin not allowed' }));
214
+ return;
215
+ }
216
+ }
96
217
  const url = new URL(req.url || '/', `http://${req.headers.host}`);
97
218
  const method = req.method || 'GET';
98
- // Enable CORS for local requests
99
- res.setHeader('Access-Control-Allow-Origin', '*');
100
- res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS');
101
- res.setHeader('Access-Control-Allow-Headers', 'Content-Type');
219
+ // CORS: echo a localhost Origin back exactly, or set a benign default.
220
+ // Never answer `*` because that would pair with the loopback-only Host
221
+ // guard above to still leak bridge output to browser contexts on the
222
+ // same machine that we didn't verify.
223
+ res.setHeader('Access-Control-Allow-Origin', originHeader ?? `http://${hostHeader ?? '127.0.0.1'}`);
224
+ res.setHeader('Vary', 'Origin');
225
+ res.setHeader('Access-Control-Allow-Methods', 'GET, POST, DELETE, OPTIONS');
226
+ res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Mcp-Session-Id');
227
+ res.setHeader('Access-Control-Expose-Headers', 'Mcp-Session-Id');
102
228
  if (method === 'OPTIONS') {
103
229
  res.writeHead(204);
104
230
  res.end();
105
231
  return;
106
232
  }
107
233
  const path = url.pathname;
234
+ // Session handling (MCP spec 2025-03-26 Streamable HTTP). Only applied
235
+ // to MCP-protocol surfaces. The Deno sandbox makes many short-lived
236
+ // fetches per execution against the internal endpoints below; tracking
237
+ // a session per fetch would saturate the registry and force the LRU
238
+ // evictor onto the hot path. We therefore short-circuit those routes.
239
+ let sessionId;
240
+ if (!HttpBridge.isSandboxInternalPath(path)) {
241
+ const incomingSessionId = this.readSessionHeader(req.headers[MCP_SESSION_ID_HEADER]);
242
+ if (incomingSessionId) {
243
+ const known = this.sessions.touch(incomingSessionId);
244
+ if (!known) {
245
+ logger.warn('Rejecting bridge request with unknown Mcp-Session-Id', {
246
+ session: incomingSessionId,
247
+ });
248
+ this.sendError(res, 404, 'Session not found or expired');
249
+ return;
250
+ }
251
+ sessionId = known.id;
252
+ }
253
+ else {
254
+ sessionId = this.sessions.create();
255
+ }
256
+ res.setHeader('Mcp-Session-Id', sessionId);
257
+ }
108
258
  try {
109
259
  // Route handling
110
260
  if (method === 'GET' && path === '/health') {
@@ -145,6 +295,13 @@ export class HttpBridge {
145
295
  // List active streams
146
296
  await this.handleListStreams(res);
147
297
  }
298
+ else if (method === 'DELETE' && path === '/session') {
299
+ // Explicit session termination. Caller's session id is already
300
+ // validated by the middleware above; sessionId is guaranteed set.
301
+ this.sessions.terminate(sessionId);
302
+ res.writeHead(204);
303
+ res.end();
304
+ }
148
305
  else {
149
306
  this.sendError(res, 404, 'Not found');
150
307
  }
@@ -1 +1 @@
1
- {"version":3,"file":"http-server.js","sourceRoot":"","sources":["../../src/bridge/http-server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"http-server.js","sourceRoot":"","sources":["../../src/bridge/http-server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Bridge Session Registry
3
+ *
4
+ * Tracks `Mcp-Session-Id` values issued by the HTTP bridge. Sessions are
5
+ * generated on first request (or when a client presents an unknown id) and
6
+ * expire after a period of inactivity. Bounded to prevent unbounded growth
7
+ * if a misbehaving client rotates IDs.
8
+ *
9
+ * Per MCP spec 2025-03-26 Streamable HTTP transport:
10
+ * - session IDs MUST be globally unique and cryptographically secure
11
+ * - requests carrying a terminated / unknown id should return 404
12
+ * - servers MAY assign a new id on any request
13
+ */
14
+ interface SessionRecord {
15
+ id: string;
16
+ createdAt: number;
17
+ lastSeenAt: number;
18
+ }
19
+ export declare class SessionRegistry {
20
+ private readonly sessions;
21
+ private cleanupTimer;
22
+ private readonly ttlMs;
23
+ private readonly cleanupIntervalMs;
24
+ private readonly maxSessions;
25
+ constructor(opts?: {
26
+ ttlMs?: number;
27
+ cleanupIntervalMs?: number;
28
+ maxSessions?: number;
29
+ });
30
+ /**
31
+ * Begin periodic cleanup. Called by HttpBridge.start().
32
+ */
33
+ start(): void;
34
+ /**
35
+ * Stop the cleanup timer and drop all sessions. Called by HttpBridge.stop().
36
+ */
37
+ stop(): void;
38
+ /**
39
+ * Create a new session and return its id.
40
+ */
41
+ create(): string;
42
+ /**
43
+ * Look up a session. Returns undefined if the id is unknown or expired.
44
+ * Expired sessions are purged lazily here even if the sweep hasn't run yet.
45
+ */
46
+ touch(id: string): SessionRecord | undefined;
47
+ /**
48
+ * Explicit termination (e.g. DELETE /session).
49
+ * Returns true if a session was removed.
50
+ */
51
+ terminate(id: string): boolean;
52
+ size(): number;
53
+ /**
54
+ * Purge sessions older than ttlMs. Exposed for tests.
55
+ */
56
+ sweep(): number;
57
+ /**
58
+ * If we're at capacity, drop the oldest (by lastSeenAt) record to make room.
59
+ * Prevents unbounded growth under ID rotation.
60
+ */
61
+ private evictIfFull;
62
+ }
63
+ export {};
64
+ //# sourceMappingURL=session-registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-registry.d.ts","sourceRoot":"","sources":["../../src/bridge/session-registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAMH,UAAU,aAAa;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAoC;IAC7D,OAAO,CAAC,YAAY,CAA+B;IACnD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAS;IAC3C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;gBAEzB,IAAI,CAAC,EAAE;QACjB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAC3B,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB;IAOD;;OAEG;IACH,KAAK,IAAI,IAAI;IAQb;;OAEG;IACH,IAAI,IAAI,IAAI;IAQZ;;OAEG;IACH,MAAM,IAAI,MAAM;IAQhB;;;OAGG;IACH,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS;IAY5C;;;OAGG;IACH,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAI9B,IAAI,IAAI,MAAM;IAId;;OAEG;IACH,KAAK,IAAI,MAAM;IAef;;;OAGG;IACH,OAAO,CAAC,WAAW;CAepB"}
@@ -0,0 +1,124 @@
1
+ /**
2
+ * Bridge Session Registry
3
+ *
4
+ * Tracks `Mcp-Session-Id` values issued by the HTTP bridge. Sessions are
5
+ * generated on first request (or when a client presents an unknown id) and
6
+ * expire after a period of inactivity. Bounded to prevent unbounded growth
7
+ * if a misbehaving client rotates IDs.
8
+ *
9
+ * Per MCP spec 2025-03-26 Streamable HTTP transport:
10
+ * - session IDs MUST be globally unique and cryptographically secure
11
+ * - requests carrying a terminated / unknown id should return 404
12
+ * - servers MAY assign a new id on any request
13
+ */
14
+ import { randomUUID } from 'node:crypto';
15
+ import { logger } from '../utils/index.js';
16
+ import { LIFECYCLE_TIMEOUTS, MAX_BRIDGE_SESSIONS } from '../config/defaults.js';
17
+ export class SessionRegistry {
18
+ sessions = new Map();
19
+ cleanupTimer = null;
20
+ ttlMs;
21
+ cleanupIntervalMs;
22
+ maxSessions;
23
+ constructor(opts) {
24
+ this.ttlMs = opts?.ttlMs ?? LIFECYCLE_TIMEOUTS.BRIDGE_SESSION_TTL_MS;
25
+ this.cleanupIntervalMs =
26
+ opts?.cleanupIntervalMs ?? LIFECYCLE_TIMEOUTS.BRIDGE_SESSION_CLEANUP_INTERVAL_MS;
27
+ this.maxSessions = opts?.maxSessions ?? MAX_BRIDGE_SESSIONS;
28
+ }
29
+ /**
30
+ * Begin periodic cleanup. Called by HttpBridge.start().
31
+ */
32
+ start() {
33
+ if (this.cleanupTimer)
34
+ return;
35
+ this.cleanupTimer = setInterval(() => {
36
+ this.sweep();
37
+ }, this.cleanupIntervalMs);
38
+ this.cleanupTimer.unref?.();
39
+ }
40
+ /**
41
+ * Stop the cleanup timer and drop all sessions. Called by HttpBridge.stop().
42
+ */
43
+ stop() {
44
+ if (this.cleanupTimer) {
45
+ clearInterval(this.cleanupTimer);
46
+ this.cleanupTimer = null;
47
+ }
48
+ this.sessions.clear();
49
+ }
50
+ /**
51
+ * Create a new session and return its id.
52
+ */
53
+ create() {
54
+ this.evictIfFull();
55
+ const id = randomUUID();
56
+ const now = Date.now();
57
+ this.sessions.set(id, { id, createdAt: now, lastSeenAt: now });
58
+ return id;
59
+ }
60
+ /**
61
+ * Look up a session. Returns undefined if the id is unknown or expired.
62
+ * Expired sessions are purged lazily here even if the sweep hasn't run yet.
63
+ */
64
+ touch(id) {
65
+ const record = this.sessions.get(id);
66
+ if (!record)
67
+ return undefined;
68
+ const now = Date.now();
69
+ if (now - record.lastSeenAt > this.ttlMs) {
70
+ this.sessions.delete(id);
71
+ return undefined;
72
+ }
73
+ record.lastSeenAt = now;
74
+ return record;
75
+ }
76
+ /**
77
+ * Explicit termination (e.g. DELETE /session).
78
+ * Returns true if a session was removed.
79
+ */
80
+ terminate(id) {
81
+ return this.sessions.delete(id);
82
+ }
83
+ size() {
84
+ return this.sessions.size;
85
+ }
86
+ /**
87
+ * Purge sessions older than ttlMs. Exposed for tests.
88
+ */
89
+ sweep() {
90
+ const now = Date.now();
91
+ let removed = 0;
92
+ for (const [id, record] of this.sessions) {
93
+ if (now - record.lastSeenAt > this.ttlMs) {
94
+ this.sessions.delete(id);
95
+ removed++;
96
+ }
97
+ }
98
+ if (removed > 0) {
99
+ logger.debug('Bridge session sweep', { removed, remaining: this.sessions.size });
100
+ }
101
+ return removed;
102
+ }
103
+ /**
104
+ * If we're at capacity, drop the oldest (by lastSeenAt) record to make room.
105
+ * Prevents unbounded growth under ID rotation.
106
+ */
107
+ evictIfFull() {
108
+ if (this.sessions.size < this.maxSessions)
109
+ return;
110
+ let oldestId;
111
+ let oldestSeen = Number.POSITIVE_INFINITY;
112
+ for (const [id, record] of this.sessions) {
113
+ if (record.lastSeenAt < oldestSeen) {
114
+ oldestSeen = record.lastSeenAt;
115
+ oldestId = id;
116
+ }
117
+ }
118
+ if (oldestId) {
119
+ this.sessions.delete(oldestId);
120
+ logger.warn('Bridge session registry full, evicted oldest', { maxSessions: this.maxSessions });
121
+ }
122
+ }
123
+ }
124
+ //# sourceMappingURL=session-registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-registry.js","sourceRoot":"","sources":["../../src/bridge/session-registry.ts"],"names":[],"mappings":"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"}
@@ -62,6 +62,8 @@ export declare const DEFAULT_CONDUCTOR_CONFIG: {
62
62
  * - `STREAM_STUCK_TTL_MS` — `StreamManager` cleanup for hung running streams
63
63
  * - `STREAM_CLEANUP_INTERVAL_MS` — `StreamManager` tick rate for the sweep
64
64
  * - `MEMORY_LOG_INTERVAL_MS` — periodic heap/RSS log from the main entry point
65
+ * - `BRIDGE_SESSION_TTL_MS` — HTTP bridge session idle expiry (Mcp-Session-Id)
66
+ * - `BRIDGE_SESSION_CLEANUP_INTERVAL_MS` — sweep cadence for expired sessions
65
67
  */
66
68
  export declare const LIFECYCLE_TIMEOUTS: {
67
69
  readonly SHUTDOWN_TIMEOUT_MS: 10000;
@@ -71,5 +73,13 @@ export declare const LIFECYCLE_TIMEOUTS: {
71
73
  readonly STREAM_STUCK_TTL_MS: number;
72
74
  readonly STREAM_CLEANUP_INTERVAL_MS: 60000;
73
75
  readonly MEMORY_LOG_INTERVAL_MS: 60000;
76
+ readonly BRIDGE_SESSION_TTL_MS: number;
77
+ readonly BRIDGE_SESSION_CLEANUP_INTERVAL_MS: number;
78
+ readonly ORPHAN_CHECK_INTERVAL_MS: 10000;
74
79
  };
80
+ /**
81
+ * Cap on simultaneously tracked bridge sessions. Bounded to prevent the
82
+ * session registry from growing unbounded if a client keeps rotating IDs.
83
+ */
84
+ export declare const MAX_BRIDGE_SESSIONS = 1000;
75
85
  //# sourceMappingURL=defaults.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"defaults.d.ts","sourceRoot":"","sources":["../../src/config/defaults.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAErD;;;;;;;GAOG;AACH,eAAO,MAAM,cAAc,EAAE,iBAkC5B,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;CAeX,CAAC;AAEX;;;;;GAKG;AACH,eAAO,MAAM,wBAAwB;;;CAGpC,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,kBAAkB;;;;;;;;CAQrB,CAAC"}
1
+ {"version":3,"file":"defaults.d.ts","sourceRoot":"","sources":["../../src/config/defaults.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAErD;;;;;;;GAOG;AACH,eAAO,MAAM,cAAc,EAAE,iBAkC5B,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;CAeX,CAAC;AAEX;;;;;GAKG;AACH,eAAO,MAAM,wBAAwB;;;CAGpC,CAAC;AAEF;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,kBAAkB;;;;;;;;;;;CAWrB,CAAC;AAEX;;;GAGG;AACH,eAAO,MAAM,mBAAmB,OAAO,CAAC"}
@@ -95,6 +95,8 @@ export const DEFAULT_CONDUCTOR_CONFIG = {
95
95
  * - `STREAM_STUCK_TTL_MS` — `StreamManager` cleanup for hung running streams
96
96
  * - `STREAM_CLEANUP_INTERVAL_MS` — `StreamManager` tick rate for the sweep
97
97
  * - `MEMORY_LOG_INTERVAL_MS` — periodic heap/RSS log from the main entry point
98
+ * - `BRIDGE_SESSION_TTL_MS` — HTTP bridge session idle expiry (Mcp-Session-Id)
99
+ * - `BRIDGE_SESSION_CLEANUP_INTERVAL_MS` — sweep cadence for expired sessions
98
100
  */
99
101
  export const LIFECYCLE_TIMEOUTS = {
100
102
  SHUTDOWN_TIMEOUT_MS: 10_000,
@@ -104,5 +106,13 @@ export const LIFECYCLE_TIMEOUTS = {
104
106
  STREAM_STUCK_TTL_MS: 15 * 60_000,
105
107
  STREAM_CLEANUP_INTERVAL_MS: 60_000,
106
108
  MEMORY_LOG_INTERVAL_MS: 60_000,
109
+ BRIDGE_SESSION_TTL_MS: 30 * 60_000,
110
+ BRIDGE_SESSION_CLEANUP_INTERVAL_MS: 5 * 60_000,
111
+ ORPHAN_CHECK_INTERVAL_MS: 10_000,
107
112
  };
113
+ /**
114
+ * Cap on simultaneously tracked bridge sessions. Bounded to prevent the
115
+ * session registry from growing unbounded if a client keeps rotating IDs.
116
+ */
117
+ export const MAX_BRIDGE_SESSIONS = 1000;
108
118
  //# sourceMappingURL=defaults.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"defaults.js","sourceRoot":"","sources":["../../src/config/defaults.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,cAAc,GAAsB;IAC/C,MAAM,EAAE;QACN,IAAI,EAAE,CAAC,EAAE,2DAA2D;QACpE,IAAI,EAAE,WAAW;KAClB;IACD,SAAS,EAAE;QACT,IAAI,EAAE,WAAW;QACjB,gBAAgB,EAAE,KAAK;QACvB,YAAY,EAAE,MAAM;QACpB,gBAAgB,EAAE,IAAI;KACvB;IACD,OAAO,EAAE;QACP,WAAW,EAAE,GAAG;QAChB,eAAe,EAAE,CAAC,WAAW,CAAC;QAC9B,sBAAsB,EAAE,CAAC;QACzB,cAAc,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI,EAAE,OAAO;KAC1C;IACD,MAAM,EAAE;QACN,IAAI,EAAE,IAAI;QACV,eAAe,EAAE,IAAI;KACtB;IACD,SAAS,EAAE;QACT,OAAO,EAAE,IAAI;QACb,UAAU,EAAE,GAAG;KAChB;IACD,OAAO,EAAE;QACP,OAAO,EAAE,IAAI;QACb,SAAS,EAAE,KAAK;QAChB,OAAO,EAAE,IAAI;KACd;IACD,OAAO,EAAE;QACP,SAAS,EAAE,CAAC,GAAG,CAAC;QAChB,QAAQ,EAAE,EAAE;KACb;CACF,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG;IACtB,IAAI,EAAE,mBAAmB;IACzB,IAAI,EAAE,mBAAmB;IACzB,OAAO,EAAE,sBAAsB;IAC/B,WAAW,EAAE,0BAA0B;IACvC,SAAS,EAAE,wBAAwB;IACnC,MAAM,EAAE,qBAAqB;IAC7B,aAAa,EAAE,4BAA4B;IAC3C,gBAAgB,EAAE,sBAAsB;IACxC,WAAW,EAAE,0BAA0B;IACvC,YAAY,EAAE,2BAA2B;IACzC,YAAY,EAAE,2BAA2B;IACzC,cAAc,EAAE,6BAA6B;IAC7C,eAAe,EAAE,8BAA8B;IAC/C,aAAa,EAAE,4BAA4B;CACnC,CAAC;AAEX;;;;;GAKG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG;IACtC,SAAS,EAAE,IAAI;IACf,OAAO,EAAE,EAAE;CACZ,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,mBAAmB,EAAE,MAAM;IAC3B,qBAAqB,EAAE,KAAK;IAC5B,mBAAmB,EAAE,CAAC,GAAG,MAAM;IAC/B,uBAAuB,EAAE,EAAE,GAAG,MAAM;IACpC,mBAAmB,EAAE,EAAE,GAAG,MAAM;IAChC,0BAA0B,EAAE,MAAM;IAClC,sBAAsB,EAAE,MAAM;CACtB,CAAC"}
1
+ {"version":3,"file":"defaults.js","sourceRoot":"","sources":["../../src/config/defaults.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,cAAc,GAAsB;IAC/C,MAAM,EAAE;QACN,IAAI,EAAE,CAAC,EAAE,2DAA2D;QACpE,IAAI,EAAE,WAAW;KAClB;IACD,SAAS,EAAE;QACT,IAAI,EAAE,WAAW;QACjB,gBAAgB,EAAE,KAAK;QACvB,YAAY,EAAE,MAAM;QACpB,gBAAgB,EAAE,IAAI;KACvB;IACD,OAAO,EAAE;QACP,WAAW,EAAE,GAAG;QAChB,eAAe,EAAE,CAAC,WAAW,CAAC;QAC9B,sBAAsB,EAAE,CAAC;QACzB,cAAc,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI,EAAE,OAAO;KAC1C;IACD,MAAM,EAAE;QACN,IAAI,EAAE,IAAI;QACV,eAAe,EAAE,IAAI;KACtB;IACD,SAAS,EAAE;QACT,OAAO,EAAE,IAAI;QACb,UAAU,EAAE,GAAG;KAChB;IACD,OAAO,EAAE;QACP,OAAO,EAAE,IAAI;QACb,SAAS,EAAE,KAAK;QAChB,OAAO,EAAE,IAAI;KACd;IACD,OAAO,EAAE;QACP,SAAS,EAAE,CAAC,GAAG,CAAC;QAChB,QAAQ,EAAE,EAAE;KACb;CACF,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG;IACtB,IAAI,EAAE,mBAAmB;IACzB,IAAI,EAAE,mBAAmB;IACzB,OAAO,EAAE,sBAAsB;IAC/B,WAAW,EAAE,0BAA0B;IACvC,SAAS,EAAE,wBAAwB;IACnC,MAAM,EAAE,qBAAqB;IAC7B,aAAa,EAAE,4BAA4B;IAC3C,gBAAgB,EAAE,sBAAsB;IACxC,WAAW,EAAE,0BAA0B;IACvC,YAAY,EAAE,2BAA2B;IACzC,YAAY,EAAE,2BAA2B;IACzC,cAAc,EAAE,6BAA6B;IAC7C,eAAe,EAAE,8BAA8B;IAC/C,aAAa,EAAE,4BAA4B;CACnC,CAAC;AAEX;;;;;GAKG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG;IACtC,SAAS,EAAE,IAAI;IACf,OAAO,EAAE,EAAE;CACZ,CAAC;AAEF;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,mBAAmB,EAAE,MAAM;IAC3B,qBAAqB,EAAE,KAAK;IAC5B,mBAAmB,EAAE,CAAC,GAAG,MAAM;IAC/B,uBAAuB,EAAE,EAAE,GAAG,MAAM;IACpC,mBAAmB,EAAE,EAAE,GAAG,MAAM;IAChC,0BAA0B,EAAE,MAAM;IAClC,sBAAsB,EAAE,MAAM;IAC9B,qBAAqB,EAAE,EAAE,GAAG,MAAM;IAClC,kCAAkC,EAAE,CAAC,GAAG,MAAM;IAC9C,wBAAwB,EAAE,MAAM;CACxB,CAAC;AAEX;;;GAGG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,IAAI,CAAC"}