@j0hanz/superfetch 2.2.1 → 2.2.2

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 (66) hide show
  1. package/README.md +363 -614
  2. package/dist/cache.d.ts +2 -2
  3. package/dist/cache.d.ts.map +1 -1
  4. package/dist/cache.js +47 -225
  5. package/dist/cache.js.map +1 -1
  6. package/dist/config.d.ts +6 -0
  7. package/dist/config.d.ts.map +1 -1
  8. package/dist/config.js +20 -27
  9. package/dist/config.js.map +1 -1
  10. package/dist/dom-noise-removal.d.ts +6 -0
  11. package/dist/dom-noise-removal.d.ts.map +1 -0
  12. package/dist/dom-noise-removal.js +482 -0
  13. package/dist/dom-noise-removal.js.map +1 -0
  14. package/dist/errors.d.ts.map +1 -1
  15. package/dist/errors.js +8 -5
  16. package/dist/errors.js.map +1 -1
  17. package/dist/fetch.d.ts.map +1 -1
  18. package/dist/fetch.js +26 -32
  19. package/dist/fetch.js.map +1 -1
  20. package/dist/http-native.d.ts +6 -0
  21. package/dist/http-native.d.ts.map +1 -0
  22. package/dist/http-native.js +645 -0
  23. package/dist/http-native.js.map +1 -0
  24. package/dist/http-utils.d.ts +61 -0
  25. package/dist/http-utils.d.ts.map +1 -0
  26. package/dist/http-utils.js +252 -0
  27. package/dist/http-utils.js.map +1 -0
  28. package/dist/index.js +1 -1
  29. package/dist/index.js.map +1 -1
  30. package/dist/instructions.md +41 -39
  31. package/dist/json.d.ts +2 -0
  32. package/dist/json.d.ts.map +1 -0
  33. package/dist/json.js +30 -0
  34. package/dist/json.js.map +1 -0
  35. package/dist/language-detection.d.ts +13 -0
  36. package/dist/language-detection.d.ts.map +1 -0
  37. package/dist/language-detection.js +283 -0
  38. package/dist/language-detection.js.map +1 -0
  39. package/dist/markdown-cleanup.d.ts +19 -0
  40. package/dist/markdown-cleanup.d.ts.map +1 -0
  41. package/dist/markdown-cleanup.js +283 -0
  42. package/dist/markdown-cleanup.js.map +1 -0
  43. package/dist/observability.d.ts +1 -0
  44. package/dist/observability.d.ts.map +1 -1
  45. package/dist/observability.js +10 -0
  46. package/dist/observability.js.map +1 -1
  47. package/dist/tools.js +4 -4
  48. package/dist/transform-types.d.ts +81 -0
  49. package/dist/transform-types.d.ts.map +1 -0
  50. package/dist/transform-types.js +6 -0
  51. package/dist/transform-types.js.map +1 -0
  52. package/dist/transform.d.ts +7 -52
  53. package/dist/transform.d.ts.map +1 -1
  54. package/dist/transform.js +411 -839
  55. package/dist/transform.js.map +1 -1
  56. package/dist/type-guards.d.ts +1 -1
  57. package/dist/type-guards.d.ts.map +1 -1
  58. package/dist/type-guards.js +1 -1
  59. package/dist/type-guards.js.map +1 -1
  60. package/dist/workers/transform-worker.js +23 -24
  61. package/dist/workers/transform-worker.js.map +1 -1
  62. package/package.json +85 -86
  63. package/dist/http.d.ts +0 -90
  64. package/dist/http.d.ts.map +0 -1
  65. package/dist/http.js +0 -1576
  66. package/dist/http.js.map +0 -1
@@ -0,0 +1,645 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import { createServer, } from 'node:http';
3
+ import { setInterval as setIntervalPromise } from 'node:timers/promises';
4
+ import { URL, URLSearchParams } from 'node:url';
5
+ import { InvalidTokenError, ServerError, } from '@modelcontextprotocol/sdk/server/auth/errors.js';
6
+ import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
7
+ import { isInitializeRequest } from '@modelcontextprotocol/sdk/types.js';
8
+ import { handleDownload } from './cache.js';
9
+ import { config, enableHttpMode } from './config.js';
10
+ import { timingSafeEqualUtf8 } from './crypto.js';
11
+ import { acceptsEventStream, applyHttpServerTuning, composeCloseHandlers, createSessionStore, createSlotTracker, drainConnectionsOnShutdown, ensureSessionCapacity, isJsonRpcBatchRequest, isMcpRequestBody, normalizeHost, reserveSessionSlot, startSessionCleanupLoop, } from './http-utils.js';
12
+ import { createMcpServer } from './mcp.js';
13
+ import { logError, logInfo, logWarn } from './observability.js';
14
+ import { isObject } from './type-guards.js';
15
+ function shimResponse(res) {
16
+ const shim = res;
17
+ shim.status = function (code) {
18
+ this.statusCode = code;
19
+ return this;
20
+ };
21
+ shim.json = function (body) {
22
+ this.setHeader('Content-Type', 'application/json');
23
+ this.end(JSON.stringify(body));
24
+ return this;
25
+ };
26
+ shim.send = function (body) {
27
+ this.end(body);
28
+ return this;
29
+ };
30
+ shim.sendStatus = function (code) {
31
+ this.statusCode = code;
32
+ this.end();
33
+ return this;
34
+ };
35
+ return shim;
36
+ }
37
+ // --- Body Parsing ---
38
+ async function readJsonBody(req, limit = 1024 * 1024) {
39
+ const contentType = req.headers['content-type'];
40
+ if (!contentType?.includes('application/json'))
41
+ return undefined;
42
+ return new Promise((resolve, reject) => {
43
+ let size = 0;
44
+ const chunks = [];
45
+ req.on('data', (chunk) => {
46
+ size += chunk.length;
47
+ if (size > limit) {
48
+ req.destroy();
49
+ reject(new Error('Payload too large'));
50
+ return;
51
+ }
52
+ chunks.push(chunk);
53
+ });
54
+ req.on('end', () => {
55
+ try {
56
+ const body = Buffer.concat(chunks).toString();
57
+ if (!body) {
58
+ resolve(undefined);
59
+ return;
60
+ }
61
+ resolve(JSON.parse(body));
62
+ }
63
+ catch (err) {
64
+ reject(err instanceof Error ? err : new Error(String(err)));
65
+ }
66
+ });
67
+ req.on('error', (err) => {
68
+ reject(err instanceof Error ? err : new Error(String(err)));
69
+ });
70
+ });
71
+ }
72
+ function parseQuery(url) {
73
+ const query = {};
74
+ for (const [key, value] of url.searchParams) {
75
+ const existing = query[key];
76
+ if (existing) {
77
+ if (Array.isArray(existing)) {
78
+ existing.push(value);
79
+ }
80
+ else {
81
+ query[key] = [existing, value];
82
+ }
83
+ }
84
+ else {
85
+ query[key] = value;
86
+ }
87
+ }
88
+ return query;
89
+ }
90
+ // --- CORS & Headers ---
91
+ function handleCors(req, res) {
92
+ res.setHeader('Access-Control-Allow-Origin', '*');
93
+ res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, DELETE');
94
+ res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization, X-API-Key, MCP-Protocol-Version, X-MCP-Session-ID');
95
+ if (req.method === 'OPTIONS') {
96
+ res.writeHead(204);
97
+ res.end();
98
+ return true;
99
+ }
100
+ return false;
101
+ }
102
+ function getHeaderValue(req, name) {
103
+ const val = req.headers[name.toLowerCase()];
104
+ if (!val)
105
+ return null;
106
+ if (Array.isArray(val))
107
+ return val[0] ?? null;
108
+ return val;
109
+ }
110
+ const LOOPBACK_HOSTS = new Set(['localhost', '127.0.0.1', '::1']);
111
+ const WILDCARD_HOSTS = new Set(['0.0.0.0', '::']);
112
+ function isWildcardHost(host) {
113
+ return WILDCARD_HOSTS.has(host);
114
+ }
115
+ function buildAllowedHosts() {
116
+ const allowed = new Set(LOOPBACK_HOSTS);
117
+ const configuredHost = normalizeHost(config.server.host);
118
+ if (configuredHost && !isWildcardHost(configuredHost)) {
119
+ allowed.add(configuredHost);
120
+ }
121
+ for (const host of config.security.allowedHosts) {
122
+ const normalized = normalizeHost(host);
123
+ if (normalized) {
124
+ allowed.add(normalized);
125
+ }
126
+ }
127
+ return allowed;
128
+ }
129
+ const ALLOWED_HOSTS = buildAllowedHosts();
130
+ function resolveHostHeader(req) {
131
+ const host = getHeaderValue(req, 'host');
132
+ if (!host)
133
+ return null;
134
+ return normalizeHost(host);
135
+ }
136
+ function resolveOriginHost(origin) {
137
+ if (origin === 'null')
138
+ return null;
139
+ try {
140
+ const parsed = new URL(origin);
141
+ return normalizeHost(parsed.host);
142
+ }
143
+ catch {
144
+ return null;
145
+ }
146
+ }
147
+ function validateHostAndOrigin(req, res) {
148
+ const host = resolveHostHeader(req);
149
+ if (!host) {
150
+ res.status(400).json({ error: 'Missing or invalid Host header' });
151
+ return false;
152
+ }
153
+ if (!ALLOWED_HOSTS.has(host)) {
154
+ res.status(403).json({ error: 'Host not allowed' });
155
+ return false;
156
+ }
157
+ const originHeader = getHeaderValue(req, 'origin');
158
+ if (originHeader) {
159
+ const originHost = resolveOriginHost(originHeader);
160
+ if (!originHost) {
161
+ res.status(403).json({ error: 'Invalid Origin header' });
162
+ return false;
163
+ }
164
+ if (!ALLOWED_HOSTS.has(originHost)) {
165
+ res.status(403).json({ error: 'Origin not allowed' });
166
+ return false;
167
+ }
168
+ }
169
+ return true;
170
+ }
171
+ function assertHttpModeConfiguration() {
172
+ const configuredHost = normalizeHost(config.server.host);
173
+ const isLoopback = configuredHost !== null && LOOPBACK_HOSTS.has(configuredHost);
174
+ const isRemoteBinding = !isLoopback;
175
+ if (isRemoteBinding && !config.security.allowRemote) {
176
+ throw new Error('ALLOW_REMOTE must be true to bind to non-loopback interfaces');
177
+ }
178
+ if (isRemoteBinding && config.auth.mode !== 'oauth') {
179
+ throw new Error('OAuth authentication is required for remote bindings');
180
+ }
181
+ if (config.auth.mode === 'static' && config.auth.staticTokens.length === 0) {
182
+ throw new Error('Static auth requires ACCESS_TOKENS or API_KEY to be configured');
183
+ }
184
+ }
185
+ function isAbortError(error) {
186
+ return error instanceof Error && error.name === 'AbortError';
187
+ }
188
+ function createRateLimitManagerImpl(options) {
189
+ const store = new Map();
190
+ const cleanup = new AbortController();
191
+ const interval = setIntervalPromise(options.cleanupIntervalMs, Date.now, {
192
+ signal: cleanup.signal,
193
+ ref: false,
194
+ });
195
+ void (async () => {
196
+ try {
197
+ for await (const getNow of interval) {
198
+ const now = getNow();
199
+ for (const [key, entry] of store.entries()) {
200
+ if (now - entry.lastAccessed > options.windowMs * 2) {
201
+ store.delete(key);
202
+ }
203
+ }
204
+ }
205
+ }
206
+ catch (err) {
207
+ if (!isAbortError(err))
208
+ logWarn('Rate limit cleanup failed', { error: err });
209
+ }
210
+ })();
211
+ return {
212
+ check: (req, res) => {
213
+ if (!options.enabled || req.method === 'OPTIONS')
214
+ return true;
215
+ const key = req.ip ?? 'unknown';
216
+ const now = Date.now();
217
+ let entry = store.get(key);
218
+ if (!entry || now > entry.resetTime) {
219
+ entry = {
220
+ count: 1,
221
+ resetTime: now + options.windowMs,
222
+ lastAccessed: now,
223
+ };
224
+ store.set(key, entry);
225
+ }
226
+ else {
227
+ entry.count++;
228
+ entry.lastAccessed = now;
229
+ }
230
+ if (entry.count > options.maxRequests) {
231
+ const retryAfter = Math.max(1, Math.ceil((entry.resetTime - now) / 1000));
232
+ res.setHeader('Retry-After', String(retryAfter));
233
+ res.status(429).json({ error: 'Rate limit exceeded', retryAfter });
234
+ return false;
235
+ }
236
+ return true;
237
+ },
238
+ stop: () => {
239
+ cleanup.abort();
240
+ },
241
+ };
242
+ }
243
+ // --- Auth ---
244
+ const STATIC_TOKEN_TTL_SECONDS = 60 * 60 * 24;
245
+ function buildStaticAuthInfo(token) {
246
+ return {
247
+ token,
248
+ clientId: 'static-token',
249
+ scopes: config.auth.requiredScopes,
250
+ expiresAt: Math.floor(Date.now() / 1000) + STATIC_TOKEN_TTL_SECONDS,
251
+ resource: config.auth.resourceUrl,
252
+ };
253
+ }
254
+ function verifyStaticToken(token) {
255
+ if (config.auth.staticTokens.length === 0) {
256
+ throw new InvalidTokenError('No static tokens configured');
257
+ }
258
+ const matched = config.auth.staticTokens.some((candidate) => timingSafeEqualUtf8(candidate, token));
259
+ if (!matched)
260
+ throw new InvalidTokenError('Invalid token');
261
+ return buildStaticAuthInfo(token);
262
+ }
263
+ function stripHash(url) {
264
+ const clean = new URL(url);
265
+ clean.hash = '';
266
+ return clean.href;
267
+ }
268
+ function buildBasicAuthHeader(clientId, clientSecret) {
269
+ const credentials = `${clientId}:${clientSecret ?? ''}`;
270
+ return `Basic ${Buffer.from(credentials).toString('base64')}`;
271
+ }
272
+ function buildIntrospectionRequest(token, resourceUrl, clientId, clientSecret) {
273
+ const body = new URLSearchParams({
274
+ token,
275
+ token_type_hint: 'access_token',
276
+ resource: stripHash(resourceUrl),
277
+ }).toString();
278
+ const headers = {
279
+ 'content-type': 'application/x-www-form-urlencoded',
280
+ };
281
+ if (clientId)
282
+ headers.authorization = buildBasicAuthHeader(clientId, clientSecret);
283
+ return { body, headers };
284
+ }
285
+ async function requestIntrospection(url, request, timeoutMs) {
286
+ const response = await fetch(url, {
287
+ method: 'POST',
288
+ headers: request.headers,
289
+ body: request.body,
290
+ signal: AbortSignal.timeout(timeoutMs),
291
+ });
292
+ if (!response.ok) {
293
+ await response.body?.cancel();
294
+ throw new ServerError(`Token introspection failed: ${response.status}`);
295
+ }
296
+ return response.json();
297
+ }
298
+ function buildIntrospectionAuthInfo(token, payload) {
299
+ const expiresAt = typeof payload.exp === 'number' ? payload.exp : undefined;
300
+ const clientId = typeof payload.client_id === 'string' ? payload.client_id : 'unknown';
301
+ const info = {
302
+ token,
303
+ clientId,
304
+ scopes: typeof payload.scope === 'string' ? payload.scope.split(' ') : [],
305
+ resource: config.auth.resourceUrl,
306
+ };
307
+ if (expiresAt !== undefined) {
308
+ info.expiresAt = expiresAt;
309
+ }
310
+ return info;
311
+ }
312
+ async function verifyWithIntrospection(token) {
313
+ if (!config.auth.introspectionUrl)
314
+ throw new ServerError('Introspection not configured');
315
+ const req = buildIntrospectionRequest(token, config.auth.resourceUrl, config.auth.clientId, config.auth.clientSecret);
316
+ const payload = await requestIntrospection(config.auth.introspectionUrl, req, config.auth.introspectionTimeoutMs);
317
+ if (!isObject(payload) || payload.active !== true)
318
+ throw new InvalidTokenError('Token is inactive');
319
+ return buildIntrospectionAuthInfo(token, payload);
320
+ }
321
+ async function authenticate(req) {
322
+ const authHeader = req.headers.authorization;
323
+ if (!authHeader) {
324
+ const apiKey = getHeaderValue(req, 'x-api-key');
325
+ if (apiKey && config.auth.mode === 'static') {
326
+ return verifyStaticToken(apiKey);
327
+ }
328
+ if (apiKey && config.auth.mode === 'oauth') {
329
+ throw new InvalidTokenError('X-API-Key not supported for OAuth');
330
+ }
331
+ throw new InvalidTokenError('Missing Authorization header');
332
+ }
333
+ const [type, token] = authHeader.split(' ');
334
+ if (type !== 'Bearer' || !token)
335
+ throw new InvalidTokenError('Invalid Authorization header format');
336
+ if (config.auth.mode === 'oauth')
337
+ return verifyWithIntrospection(token);
338
+ return verifyStaticToken(token);
339
+ }
340
+ // --- MCP Routes ---
341
+ function sendError(res, code, message, status = 400, id = null) {
342
+ res.status(status).json({
343
+ jsonrpc: '2.0',
344
+ error: { code, message },
345
+ id,
346
+ });
347
+ }
348
+ function ensureMcpProtocolVersion(req, res) {
349
+ const version = getHeaderValue(req, 'mcp-protocol-version');
350
+ if (!version) {
351
+ sendError(res, -32600, 'Missing MCP-Protocol-Version header');
352
+ return false;
353
+ }
354
+ if (version !== '2025-11-25') {
355
+ sendError(res, -32600, `Unsupported MCP-Protocol-Version: ${version}`);
356
+ return false;
357
+ }
358
+ return true;
359
+ }
360
+ async function createNewSession(store, mcpServer, res, requestId) {
361
+ const allowed = ensureSessionCapacity({
362
+ store,
363
+ maxSessions: config.server.maxSessions,
364
+ evictOldest: (s) => {
365
+ const evicted = s.evictOldest();
366
+ if (evicted) {
367
+ void evicted.transport.close().catch(() => { });
368
+ return true;
369
+ }
370
+ return false;
371
+ },
372
+ });
373
+ if (!allowed) {
374
+ sendError(res, -32000, 'Server busy', 503, requestId);
375
+ return null;
376
+ }
377
+ if (!reserveSessionSlot(store, config.server.maxSessions)) {
378
+ sendError(res, -32000, 'Server busy', 503, requestId);
379
+ return null;
380
+ }
381
+ const tracker = createSlotTracker(store);
382
+ const transportImpl = new StreamableHTTPServerTransport({
383
+ sessionIdGenerator: () => randomUUID(),
384
+ });
385
+ const initTimeout = setTimeout(() => {
386
+ if (!tracker.isInitialized()) {
387
+ tracker.releaseSlot();
388
+ void transportImpl.close().catch(() => { });
389
+ }
390
+ }, config.server.sessionInitTimeoutMs);
391
+ transportImpl.onclose = () => {
392
+ clearTimeout(initTimeout);
393
+ if (!tracker.isInitialized())
394
+ tracker.releaseSlot();
395
+ };
396
+ try {
397
+ await mcpServer.connect(transportImpl);
398
+ }
399
+ catch (err) {
400
+ clearTimeout(initTimeout);
401
+ tracker.releaseSlot();
402
+ void transportImpl.close().catch(() => { });
403
+ throw err;
404
+ }
405
+ const newSessionId = transportImpl.sessionId;
406
+ if (!newSessionId) {
407
+ throw new ServerError('Failed to generate session ID');
408
+ }
409
+ tracker.markInitialized();
410
+ tracker.releaseSlot();
411
+ store.set(newSessionId, {
412
+ transport: transportImpl,
413
+ createdAt: Date.now(),
414
+ lastSeen: Date.now(),
415
+ protocolInitialized: false,
416
+ });
417
+ transportImpl.onclose = composeCloseHandlers(transportImpl.onclose, () => {
418
+ store.remove(newSessionId);
419
+ });
420
+ return transportImpl;
421
+ }
422
+ async function getOrCreateTransport(req, res, store, mcpServer, requestId) {
423
+ const sessionId = getHeaderValue(req, 'mcp-session-id');
424
+ if (sessionId) {
425
+ const session = store.get(sessionId);
426
+ if (!session) {
427
+ sendError(res, -32600, 'Session not found', 404, requestId);
428
+ return null;
429
+ }
430
+ store.touch(sessionId);
431
+ return session.transport;
432
+ }
433
+ if (!isInitializeRequest(req.body)) {
434
+ sendError(res, -32600, 'Missing session ID', 400, requestId);
435
+ return null;
436
+ }
437
+ return createNewSession(store, mcpServer, res, requestId);
438
+ }
439
+ async function handleMcpPost(req, res, store, mcpServer) {
440
+ if (!ensureMcpProtocolVersion(req, res))
441
+ return;
442
+ const { body } = req;
443
+ if (isJsonRpcBatchRequest(body)) {
444
+ sendError(res, -32600, 'Batch requests not supported');
445
+ return;
446
+ }
447
+ if (!isMcpRequestBody(body)) {
448
+ sendError(res, -32600, 'Invalid request body');
449
+ return;
450
+ }
451
+ const requestId = body.id ?? null;
452
+ logInfo('[MCP POST]', {
453
+ method: body.method,
454
+ id: body.id,
455
+ sessionId: getHeaderValue(req, 'mcp-session-id'),
456
+ });
457
+ const transport = await getOrCreateTransport(req, res, store, mcpServer, requestId);
458
+ if (!transport)
459
+ return;
460
+ await transport.handleRequest(req, res, body);
461
+ }
462
+ async function handleMcpGet(req, res, store) {
463
+ if (!ensureMcpProtocolVersion(req, res))
464
+ return;
465
+ const sessionId = getHeaderValue(req, 'mcp-session-id');
466
+ if (!sessionId) {
467
+ sendError(res, -32600, 'Missing session ID');
468
+ return;
469
+ }
470
+ const session = store.get(sessionId);
471
+ if (!session) {
472
+ sendError(res, -32600, 'Session not found', 404);
473
+ return;
474
+ }
475
+ const acceptHeader = getHeaderValue(req, 'accept');
476
+ if (!acceptsEventStream(acceptHeader)) {
477
+ res.status(406).json({ error: 'Not Acceptable' });
478
+ return;
479
+ }
480
+ store.touch(sessionId);
481
+ await session.transport.handleRequest(req, res);
482
+ }
483
+ async function handleMcpDelete(req, res, store) {
484
+ if (!ensureMcpProtocolVersion(req, res))
485
+ return;
486
+ const sessionId = getHeaderValue(req, 'mcp-session-id');
487
+ if (!sessionId) {
488
+ sendError(res, -32600, 'Missing session ID');
489
+ return;
490
+ }
491
+ const session = store.get(sessionId);
492
+ if (session) {
493
+ await session.transport.close();
494
+ store.remove(sessionId);
495
+ }
496
+ res.status(200).send('Session closed');
497
+ }
498
+ // --- Dispatch ---
499
+ async function routeMcpRequest(req, res, url, ctx) {
500
+ const { pathname: path } = url;
501
+ const { method } = req;
502
+ if (path !== '/mcp')
503
+ return false;
504
+ if (method === 'POST') {
505
+ await handleMcpPost(req, res, ctx.store, ctx.mcpServer);
506
+ return true;
507
+ }
508
+ if (method === 'GET') {
509
+ await handleMcpGet(req, res, ctx.store);
510
+ return true;
511
+ }
512
+ if (method === 'DELETE') {
513
+ await handleMcpDelete(req, res, ctx.store);
514
+ return true;
515
+ }
516
+ return false;
517
+ }
518
+ function checkDownloadRoute(path) {
519
+ const downloadMatch = /^\/mcp\/downloads\/([^/]+)\/([^/]+)$/.exec(path);
520
+ if (downloadMatch) {
521
+ const namespace = downloadMatch[1];
522
+ const hash = downloadMatch[2];
523
+ if (namespace && hash) {
524
+ return { namespace, hash };
525
+ }
526
+ }
527
+ return null;
528
+ }
529
+ async function dispatchRequest(req, res, url, ctx) {
530
+ const { pathname: path } = url;
531
+ const { method } = req;
532
+ try {
533
+ if (method === 'GET' && path === '/health') {
534
+ res.status(200).json({ status: 'ok' });
535
+ return;
536
+ }
537
+ if (!(await authenticateRequest(req, res))) {
538
+ return;
539
+ }
540
+ if (method === 'GET') {
541
+ const download = checkDownloadRoute(path);
542
+ if (download) {
543
+ handleDownload(res, download.namespace, download.hash);
544
+ return;
545
+ }
546
+ }
547
+ if (await routeMcpRequest(req, res, url, ctx))
548
+ return;
549
+ res.status(404).json({ error: 'Not Found' });
550
+ }
551
+ catch (err) {
552
+ logError('Request failed', err instanceof Error ? err : new Error(String(err)));
553
+ if (!res.writableEnded) {
554
+ res.status(500).json({ error: 'Internal Server Error' });
555
+ }
556
+ }
557
+ }
558
+ async function authenticateRequest(req, res) {
559
+ try {
560
+ req.auth = await authenticate(req);
561
+ return true;
562
+ }
563
+ catch (err) {
564
+ res
565
+ .status(401)
566
+ .json({ error: err instanceof Error ? err.message : 'Unauthorized' });
567
+ return false;
568
+ }
569
+ }
570
+ // --- Main ---
571
+ export async function startHttpServer() {
572
+ assertHttpModeConfiguration();
573
+ enableHttpMode();
574
+ const mcpServer = createMcpServer();
575
+ const rateLimiter = createRateLimitManagerImpl(config.rateLimit);
576
+ const sessionStore = createSessionStore(config.server.sessionTtlMs);
577
+ const sessionCleanup = startSessionCleanupLoop(sessionStore, config.server.sessionTtlMs);
578
+ const server = createServer((req, res) => {
579
+ void handleRequest(req, res, rateLimiter, {
580
+ store: sessionStore,
581
+ mcpServer,
582
+ });
583
+ });
584
+ applyHttpServerTuning(server);
585
+ await new Promise((resolve, reject) => {
586
+ server.listen(config.server.port, config.server.host, () => {
587
+ resolve();
588
+ });
589
+ server.on('error', reject);
590
+ });
591
+ const addr = server.address();
592
+ const port = typeof addr === 'object' && addr ? addr.port : config.server.port;
593
+ logInfo(`HTTP server listening on port ${port}`);
594
+ return {
595
+ port,
596
+ host: config.server.host,
597
+ shutdown: async (signal) => {
598
+ logInfo(`Stopping HTTP server (${signal})...`);
599
+ rateLimiter.stop();
600
+ sessionCleanup.abort();
601
+ drainConnectionsOnShutdown(server);
602
+ const sessions = sessionStore.clear();
603
+ await Promise.all(sessions.map(async (s) => {
604
+ try {
605
+ await s.transport.close();
606
+ }
607
+ catch {
608
+ /* ignore */
609
+ }
610
+ }));
611
+ server.close();
612
+ await mcpServer.close();
613
+ },
614
+ };
615
+ }
616
+ async function handleRequest(rawReq, rawRes, rateLimiter, ctx) {
617
+ const res = shimResponse(rawRes);
618
+ const req = rawReq;
619
+ // 1. Basic Setup
620
+ const url = new URL(req.url ?? '', 'http://localhost');
621
+ req.query = parseQuery(url);
622
+ if (req.socket.remoteAddress) {
623
+ req.ip = req.socket.remoteAddress;
624
+ }
625
+ req.params = {};
626
+ // 2. CORS
627
+ if (!validateHostAndOrigin(req, res))
628
+ return;
629
+ if (handleCors(req, res))
630
+ return;
631
+ // 3. Body Parsing
632
+ try {
633
+ req.body = await readJsonBody(req);
634
+ }
635
+ catch {
636
+ res.status(400).json({ error: 'Invalid JSON or Payload too large' });
637
+ return;
638
+ }
639
+ // 4. Rate Limit
640
+ if (!rateLimiter.check(req, res))
641
+ return;
642
+ // 5. Routing
643
+ await dispatchRequest(req, res, url, ctx);
644
+ }
645
+ //# sourceMappingURL=http-native.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-native.js","sourceRoot":"","sources":["../src/http-native.ts"],"names":[],"mappings":"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"}