@j0hanz/fetch-url-mcp 1.12.6 → 1.12.8
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.
- package/dist/http/auth.d.ts +2 -2
- package/dist/http/auth.d.ts.map +1 -1
- package/dist/http/auth.js +15 -16
- package/dist/http/index.d.ts +6 -0
- package/dist/http/index.d.ts.map +1 -0
- package/dist/http/index.js +5 -0
- package/dist/http/native.d.ts +73 -0
- package/dist/http/native.d.ts.map +1 -1
- package/dist/http/native.js +585 -62
- package/dist/http/rate-limit.d.ts +1 -1
- package/dist/http/rate-limit.d.ts.map +1 -1
- package/dist/http/rate-limit.js +5 -6
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +69 -8
- package/dist/lib/config.js +2 -2
- package/dist/lib/core.d.ts +56 -4
- package/dist/lib/core.d.ts.map +1 -1
- package/dist/lib/core.js +162 -11
- package/dist/lib/error/classes.d.ts +19 -0
- package/dist/lib/error/classes.d.ts.map +1 -0
- package/dist/lib/error/classes.js +107 -0
- package/dist/lib/error/classify.d.ts +4 -0
- package/dist/lib/error/classify.d.ts.map +1 -0
- package/dist/lib/error/classify.js +154 -0
- package/dist/lib/error/codes.d.ts +23 -0
- package/dist/lib/error/codes.d.ts.map +1 -0
- package/dist/lib/error/codes.js +22 -0
- package/dist/lib/error/index.d.ts +6 -0
- package/dist/lib/error/index.d.ts.map +1 -0
- package/dist/lib/error/index.js +5 -0
- package/dist/lib/{error-messages.d.ts → error/messages.d.ts} +2 -2
- package/dist/lib/error/messages.d.ts.map +1 -0
- package/dist/lib/{error-messages.js → error/messages.js} +13 -13
- package/dist/lib/{tool-errors.d.ts → error/payload.d.ts} +7 -13
- package/dist/lib/error/payload.d.ts.map +1 -0
- package/dist/lib/error/payload.js +108 -0
- package/dist/lib/mcp-interop.d.ts +1 -0
- package/dist/lib/mcp-interop.d.ts.map +1 -1
- package/dist/lib/mcp-interop.js +17 -9
- package/dist/lib/net/http.d.ts.map +1 -0
- package/dist/lib/{http.js → net/http.js} +11 -14
- package/dist/lib/net/index.d.ts +4 -0
- package/dist/lib/net/index.d.ts.map +1 -0
- package/dist/lib/net/index.js +3 -0
- package/dist/lib/{fetch-pipeline.d.ts → net/pipeline.d.ts} +3 -3
- package/dist/lib/net/pipeline.d.ts.map +1 -0
- package/dist/lib/{fetch-pipeline.js → net/pipeline.js} +7 -9
- package/dist/lib/{url.d.ts → net/url.d.ts} +2 -2
- package/dist/lib/net/url.d.ts.map +1 -0
- package/dist/lib/{url.js → net/url.js} +6 -8
- package/dist/lib/utils.d.ts +3 -18
- package/dist/lib/utils.d.ts.map +1 -1
- package/dist/lib/utils.js +33 -105
- package/dist/resources/index.d.ts.map +1 -1
- package/dist/resources/index.js +6 -3
- package/dist/schemas.d.ts +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +12 -14
- package/dist/tasks/index.d.ts +2 -0
- package/dist/tasks/index.d.ts.map +1 -0
- package/dist/tasks/index.js +1 -0
- package/dist/tasks/manager.d.ts +123 -1
- package/dist/tasks/manager.d.ts.map +1 -1
- package/dist/tasks/manager.js +753 -18
- package/dist/tools/{fetch-url.d.ts → index.d.ts} +4 -5
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/{fetch-url.js → index.js} +14 -31
- package/dist/transform/index.d.ts +279 -0
- package/dist/transform/index.d.ts.map +1 -0
- package/dist/transform/index.js +5234 -0
- package/package.json +2 -2
- package/dist/cli.d.ts +0 -19
- package/dist/cli.d.ts.map +0 -1
- package/dist/cli.js +0 -65
- package/dist/http/health.d.ts +0 -8
- package/dist/http/health.d.ts.map +0 -1
- package/dist/http/health.js +0 -152
- package/dist/http/helpers.d.ts +0 -68
- package/dist/http/helpers.d.ts.map +0 -1
- package/dist/http/helpers.js +0 -404
- package/dist/lib/error-codes.d.ts +0 -11
- package/dist/lib/error-codes.d.ts.map +0 -1
- package/dist/lib/error-codes.js +0 -15
- package/dist/lib/error-messages.d.ts.map +0 -1
- package/dist/lib/fetch-pipeline.d.ts.map +0 -1
- package/dist/lib/http.d.ts.map +0 -1
- package/dist/lib/logger-names.d.ts +0 -14
- package/dist/lib/logger-names.d.ts.map +0 -1
- package/dist/lib/logger-names.js +0 -13
- package/dist/lib/session.d.ts +0 -44
- package/dist/lib/session.d.ts.map +0 -1
- package/dist/lib/session.js +0 -137
- package/dist/lib/tool-errors.d.ts.map +0 -1
- package/dist/lib/tool-errors.js +0 -252
- package/dist/lib/url.d.ts.map +0 -1
- package/dist/lib/zod.d.ts +0 -3
- package/dist/lib/zod.d.ts.map +0 -1
- package/dist/lib/zod.js +0 -27
- package/dist/tasks/call-contract.d.ts +0 -25
- package/dist/tasks/call-contract.d.ts.map +0 -1
- package/dist/tasks/call-contract.js +0 -59
- package/dist/tasks/execution.d.ts +0 -16
- package/dist/tasks/execution.d.ts.map +0 -1
- package/dist/tasks/execution.js +0 -241
- package/dist/tasks/handlers.d.ts +0 -11
- package/dist/tasks/handlers.d.ts.map +0 -1
- package/dist/tasks/handlers.js +0 -157
- package/dist/tasks/owner.d.ts +0 -43
- package/dist/tasks/owner.d.ts.map +0 -1
- package/dist/tasks/owner.js +0 -144
- package/dist/tasks/registry.d.ts +0 -20
- package/dist/tasks/registry.d.ts.map +0 -1
- package/dist/tasks/registry.js +0 -40
- package/dist/tasks/waiters.d.ts +0 -27
- package/dist/tasks/waiters.d.ts.map +0 -1
- package/dist/tasks/waiters.js +0 -114
- package/dist/tools/fetch-url.d.ts.map +0 -1
- package/dist/transform/dom-prep.d.ts +0 -16
- package/dist/transform/dom-prep.d.ts.map +0 -1
- package/dist/transform/dom-prep.js +0 -1287
- package/dist/transform/html-translators.d.ts +0 -5
- package/dist/transform/html-translators.d.ts.map +0 -1
- package/dist/transform/html-translators.js +0 -697
- package/dist/transform/markdown-cleanup.d.ts +0 -10
- package/dist/transform/markdown-cleanup.d.ts.map +0 -1
- package/dist/transform/markdown-cleanup.js +0 -542
- package/dist/transform/metadata.d.ts +0 -18
- package/dist/transform/metadata.d.ts.map +0 -1
- package/dist/transform/metadata.js +0 -462
- package/dist/transform/next-flight.d.ts +0 -2
- package/dist/transform/next-flight.d.ts.map +0 -1
- package/dist/transform/next-flight.js +0 -374
- package/dist/transform/shared.d.ts +0 -8
- package/dist/transform/shared.d.ts.map +0 -1
- package/dist/transform/shared.js +0 -137
- package/dist/transform/transform.d.ts +0 -38
- package/dist/transform/transform.d.ts.map +0 -1
- package/dist/transform/transform.js +0 -1041
- package/dist/transform/types.d.ts +0 -124
- package/dist/transform/types.d.ts.map +0 -1
- package/dist/transform/types.js +0 -5
- package/dist/transform/worker-pool.d.ts +0 -76
- package/dist/transform/worker-pool.d.ts.map +0 -1
- package/dist/transform/worker-pool.js +0 -725
- /package/dist/lib/{http.d.ts → net/http.d.ts} +0 -0
package/dist/http/helpers.js
DELETED
|
@@ -1,404 +0,0 @@
|
|
|
1
|
-
import { Writable } from 'node:stream';
|
|
2
|
-
import { pipeline } from 'node:stream/promises';
|
|
3
|
-
import { composeCloseHandlers, config, logWarn } from '../lib/core.js';
|
|
4
|
-
import { resolveMcpSessionIdByServer, unregisterMcpSessionServer, unregisterMcpSessionServerByServer, } from '../lib/core.js';
|
|
5
|
-
import { LOG_HTTP } from '../lib/logger-names.js';
|
|
6
|
-
import { createDefaultBlockList, normalizeIpForBlockList } from '../lib/url.js';
|
|
7
|
-
import { getErrorMessage, toError } from '../lib/utils.js';
|
|
8
|
-
function abortControllerBestEffort(controller) {
|
|
9
|
-
if (!controller.signal.aborted)
|
|
10
|
-
controller.abort();
|
|
11
|
-
}
|
|
12
|
-
function destroyRequestBestEffort(req) {
|
|
13
|
-
try {
|
|
14
|
-
req.destroy();
|
|
15
|
-
}
|
|
16
|
-
catch {
|
|
17
|
-
// Best-effort only.
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
// ---------------------------------------------------------------------------
|
|
21
|
-
// Response helpers
|
|
22
|
-
// ---------------------------------------------------------------------------
|
|
23
|
-
function setNoStoreHeaders(res) {
|
|
24
|
-
res.setHeader('X-Content-Type-Options', 'nosniff');
|
|
25
|
-
res.setHeader('Cache-Control', 'no-store');
|
|
26
|
-
}
|
|
27
|
-
export function sendJson(res, status, body) {
|
|
28
|
-
res.statusCode = status;
|
|
29
|
-
res.setHeader('Content-Type', 'application/json; charset=utf-8');
|
|
30
|
-
setNoStoreHeaders(res);
|
|
31
|
-
res.end(JSON.stringify(body));
|
|
32
|
-
}
|
|
33
|
-
export function sendEmpty(res, status) {
|
|
34
|
-
res.statusCode = status;
|
|
35
|
-
res.setHeader('Content-Length', '0');
|
|
36
|
-
res.end();
|
|
37
|
-
}
|
|
38
|
-
export function sendError(res, code, message, status = 400, id = null) {
|
|
39
|
-
sendJson(res, status, {
|
|
40
|
-
jsonrpc: '2.0',
|
|
41
|
-
error: { code, message },
|
|
42
|
-
id,
|
|
43
|
-
});
|
|
44
|
-
}
|
|
45
|
-
// ---------------------------------------------------------------------------
|
|
46
|
-
// Request helpers
|
|
47
|
-
// ---------------------------------------------------------------------------
|
|
48
|
-
export function getHeaderValue(req, name) {
|
|
49
|
-
const val = req.headers[name];
|
|
50
|
-
if (!val)
|
|
51
|
-
return null;
|
|
52
|
-
return Array.isArray(val) ? (val[0] ?? null) : val;
|
|
53
|
-
}
|
|
54
|
-
export function getMcpSessionId(req) {
|
|
55
|
-
return (getHeaderValue(req, 'mcp-session-id') ??
|
|
56
|
-
getHeaderValue(req, 'x-mcp-session-id'));
|
|
57
|
-
}
|
|
58
|
-
const SINGLE_VALUE_HEADER_NAMES = [
|
|
59
|
-
'authorization',
|
|
60
|
-
'x-api-key',
|
|
61
|
-
'host',
|
|
62
|
-
'origin',
|
|
63
|
-
'content-length',
|
|
64
|
-
'mcp-protocol-version',
|
|
65
|
-
'mcp-session-id',
|
|
66
|
-
'x-mcp-session-id',
|
|
67
|
-
];
|
|
68
|
-
function hasDuplicateHeader(req, name) {
|
|
69
|
-
const values = req.headersDistinct[name];
|
|
70
|
-
return Array.isArray(values) && values.length > 1;
|
|
71
|
-
}
|
|
72
|
-
export function findDuplicateSingleValueHeader(req) {
|
|
73
|
-
for (const name of SINGLE_VALUE_HEADER_NAMES) {
|
|
74
|
-
if (hasDuplicateHeader(req, name))
|
|
75
|
-
return name;
|
|
76
|
-
}
|
|
77
|
-
return null;
|
|
78
|
-
}
|
|
79
|
-
export function drainRequest(req) {
|
|
80
|
-
if (req.readableEnded)
|
|
81
|
-
return;
|
|
82
|
-
try {
|
|
83
|
-
req.resume();
|
|
84
|
-
}
|
|
85
|
-
catch {
|
|
86
|
-
// Best-effort only.
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
// ---------------------------------------------------------------------------
|
|
90
|
-
// Request abort signal
|
|
91
|
-
// ---------------------------------------------------------------------------
|
|
92
|
-
export function createRequestAbortSignal(req) {
|
|
93
|
-
const controller = new AbortController();
|
|
94
|
-
let cleanedUp = false;
|
|
95
|
-
const abortRequest = () => {
|
|
96
|
-
if (cleanedUp)
|
|
97
|
-
return;
|
|
98
|
-
abortControllerBestEffort(controller);
|
|
99
|
-
};
|
|
100
|
-
if (req.destroyed) {
|
|
101
|
-
abortRequest();
|
|
102
|
-
return {
|
|
103
|
-
signal: controller.signal,
|
|
104
|
-
cleanup: () => {
|
|
105
|
-
cleanedUp = true;
|
|
106
|
-
},
|
|
107
|
-
};
|
|
108
|
-
}
|
|
109
|
-
const onClose = () => {
|
|
110
|
-
// A normal close after a complete body should not be treated as cancellation.
|
|
111
|
-
if (req.complete)
|
|
112
|
-
return;
|
|
113
|
-
abortRequest();
|
|
114
|
-
};
|
|
115
|
-
const onError = () => {
|
|
116
|
-
abortRequest();
|
|
117
|
-
};
|
|
118
|
-
req.once('close', onClose);
|
|
119
|
-
req.once('error', onError);
|
|
120
|
-
return {
|
|
121
|
-
signal: controller.signal,
|
|
122
|
-
cleanup: () => {
|
|
123
|
-
cleanedUp = true;
|
|
124
|
-
req.removeListener('close', onClose);
|
|
125
|
-
req.removeListener('error', onError);
|
|
126
|
-
},
|
|
127
|
-
};
|
|
128
|
-
}
|
|
129
|
-
// ---------------------------------------------------------------------------
|
|
130
|
-
// IP & connection helpers
|
|
131
|
-
// ---------------------------------------------------------------------------
|
|
132
|
-
function normalizeRemoteAddress(address) {
|
|
133
|
-
if (!address)
|
|
134
|
-
return null;
|
|
135
|
-
const trimmed = address.trim();
|
|
136
|
-
if (!trimmed)
|
|
137
|
-
return null;
|
|
138
|
-
const normalized = normalizeIpForBlockList(trimmed);
|
|
139
|
-
if (normalized)
|
|
140
|
-
return normalized.ip;
|
|
141
|
-
return trimmed;
|
|
142
|
-
}
|
|
143
|
-
export function registerInboundBlockList(server) {
|
|
144
|
-
if (!config.server.http.blockPrivateConnections)
|
|
145
|
-
return;
|
|
146
|
-
const blockList = createDefaultBlockList();
|
|
147
|
-
server.on('connection', (socket) => {
|
|
148
|
-
const raw = socket.remoteAddress?.trim();
|
|
149
|
-
if (!raw)
|
|
150
|
-
return;
|
|
151
|
-
const normalized = normalizeIpForBlockList(raw);
|
|
152
|
-
if (!normalized)
|
|
153
|
-
return;
|
|
154
|
-
if (blockList.check(normalized.ip, normalized.family)) {
|
|
155
|
-
logWarn('Blocked inbound connection', {
|
|
156
|
-
remoteAddress: normalized.ip,
|
|
157
|
-
family: normalized.family,
|
|
158
|
-
}, LOG_HTTP);
|
|
159
|
-
socket.destroy();
|
|
160
|
-
}
|
|
161
|
-
});
|
|
162
|
-
}
|
|
163
|
-
// ---------------------------------------------------------------------------
|
|
164
|
-
// Request context builder
|
|
165
|
-
// ---------------------------------------------------------------------------
|
|
166
|
-
export function buildRequestContext(req, res, signal) {
|
|
167
|
-
const url = URL.parse(req.url ?? '', 'http://localhost');
|
|
168
|
-
if (!url) {
|
|
169
|
-
sendJson(res, 400, { error: 'Invalid request URL' });
|
|
170
|
-
return null;
|
|
171
|
-
}
|
|
172
|
-
return {
|
|
173
|
-
req,
|
|
174
|
-
res,
|
|
175
|
-
url,
|
|
176
|
-
method: req.method,
|
|
177
|
-
ip: normalizeRemoteAddress(req.socket.remoteAddress),
|
|
178
|
-
body: undefined,
|
|
179
|
-
...(signal ? { signal } : {}),
|
|
180
|
-
};
|
|
181
|
-
}
|
|
182
|
-
// ---------------------------------------------------------------------------
|
|
183
|
-
// Transport / MCP helpers
|
|
184
|
-
// ---------------------------------------------------------------------------
|
|
185
|
-
export async function closeTransportBestEffort(transport, context) {
|
|
186
|
-
try {
|
|
187
|
-
await transport.close();
|
|
188
|
-
}
|
|
189
|
-
catch (error) {
|
|
190
|
-
logWarn('Transport close failed', { context, error }, LOG_HTTP);
|
|
191
|
-
}
|
|
192
|
-
}
|
|
193
|
-
export async function closeMcpServerBestEffort(server, context) {
|
|
194
|
-
try {
|
|
195
|
-
await server.close();
|
|
196
|
-
}
|
|
197
|
-
catch (error) {
|
|
198
|
-
logWarn('MCP server close failed', { context, error }, LOG_HTTP);
|
|
199
|
-
}
|
|
200
|
-
}
|
|
201
|
-
export function createTransportAdapter(transportImpl) {
|
|
202
|
-
const noopOnClose = () => { };
|
|
203
|
-
const noopOnError = () => { };
|
|
204
|
-
const noopOnMessage = () => { };
|
|
205
|
-
const baseOnClose = transportImpl.onclose;
|
|
206
|
-
let oncloseHandler = noopOnClose;
|
|
207
|
-
let onerrorHandler = noopOnError;
|
|
208
|
-
let onmessageHandler = noopOnMessage;
|
|
209
|
-
return {
|
|
210
|
-
start: () => transportImpl.start(),
|
|
211
|
-
send: (message, options) => transportImpl.send(message, options),
|
|
212
|
-
close: () => transportImpl.close(),
|
|
213
|
-
get onclose() {
|
|
214
|
-
return oncloseHandler;
|
|
215
|
-
},
|
|
216
|
-
set onclose(handler) {
|
|
217
|
-
oncloseHandler = handler;
|
|
218
|
-
transportImpl.onclose = composeCloseHandlers(baseOnClose, handler);
|
|
219
|
-
},
|
|
220
|
-
get onerror() {
|
|
221
|
-
return onerrorHandler;
|
|
222
|
-
},
|
|
223
|
-
set onerror(handler) {
|
|
224
|
-
onerrorHandler = handler;
|
|
225
|
-
transportImpl.onerror = handler;
|
|
226
|
-
},
|
|
227
|
-
get onmessage() {
|
|
228
|
-
return onmessageHandler;
|
|
229
|
-
},
|
|
230
|
-
set onmessage(handler) {
|
|
231
|
-
onmessageHandler = handler;
|
|
232
|
-
transportImpl.onmessage = handler;
|
|
233
|
-
},
|
|
234
|
-
};
|
|
235
|
-
}
|
|
236
|
-
export class JsonBodyError extends Error {
|
|
237
|
-
kind;
|
|
238
|
-
constructor(kind, message) {
|
|
239
|
-
super(message);
|
|
240
|
-
this.name = 'JsonBodyError';
|
|
241
|
-
this.kind = kind;
|
|
242
|
-
}
|
|
243
|
-
}
|
|
244
|
-
export function isJsonBodyError(error) {
|
|
245
|
-
return error instanceof JsonBodyError;
|
|
246
|
-
}
|
|
247
|
-
export const DEFAULT_BODY_LIMIT_BYTES = 1024 * 1024;
|
|
248
|
-
function isRequestReadAborted(req) {
|
|
249
|
-
return req.destroyed && !req.complete;
|
|
250
|
-
}
|
|
251
|
-
class JsonBodyReader {
|
|
252
|
-
async read(req, limit = DEFAULT_BODY_LIMIT_BYTES, signal) {
|
|
253
|
-
const contentType = getHeaderValue(req, 'content-type');
|
|
254
|
-
if (!contentType?.includes('application/json'))
|
|
255
|
-
return undefined;
|
|
256
|
-
const contentLengthHeader = getHeaderValue(req, 'content-length');
|
|
257
|
-
if (contentLengthHeader) {
|
|
258
|
-
const contentLength = Number.parseInt(contentLengthHeader, 10);
|
|
259
|
-
if (Number.isFinite(contentLength) && contentLength > limit) {
|
|
260
|
-
const error = new JsonBodyError('payload-too-large', 'Payload too large');
|
|
261
|
-
throw error;
|
|
262
|
-
}
|
|
263
|
-
}
|
|
264
|
-
if (signal?.aborted || isRequestReadAborted(req)) {
|
|
265
|
-
const error = new JsonBodyError('read-failed', 'Request aborted');
|
|
266
|
-
throw error;
|
|
267
|
-
}
|
|
268
|
-
const body = await this.readBody(req, limit, signal);
|
|
269
|
-
if (!body)
|
|
270
|
-
return undefined;
|
|
271
|
-
try {
|
|
272
|
-
return JSON.parse(body);
|
|
273
|
-
}
|
|
274
|
-
catch (err) {
|
|
275
|
-
const error = new JsonBodyError('invalid-json', getErrorMessage(err));
|
|
276
|
-
throw error;
|
|
277
|
-
}
|
|
278
|
-
}
|
|
279
|
-
async readBody(req, limit, signal) {
|
|
280
|
-
const abortListener = signal != null
|
|
281
|
-
? () => {
|
|
282
|
-
destroyRequestBestEffort(req);
|
|
283
|
-
}
|
|
284
|
-
: null;
|
|
285
|
-
if (signal != null && abortListener) {
|
|
286
|
-
if (signal.aborted) {
|
|
287
|
-
abortListener();
|
|
288
|
-
}
|
|
289
|
-
else {
|
|
290
|
-
signal.addEventListener('abort', abortListener, { once: true });
|
|
291
|
-
}
|
|
292
|
-
}
|
|
293
|
-
try {
|
|
294
|
-
const { chunks, size } = await this.collectChunks(req, limit, signal);
|
|
295
|
-
if (chunks.length === 0)
|
|
296
|
-
return undefined;
|
|
297
|
-
const combined = new Uint8Array(size);
|
|
298
|
-
let offset = 0;
|
|
299
|
-
for (const chunk of chunks) {
|
|
300
|
-
combined.set(chunk, offset);
|
|
301
|
-
offset += chunk.byteLength;
|
|
302
|
-
}
|
|
303
|
-
const text = new TextDecoder().decode(combined);
|
|
304
|
-
return text;
|
|
305
|
-
}
|
|
306
|
-
finally {
|
|
307
|
-
if (signal && abortListener) {
|
|
308
|
-
try {
|
|
309
|
-
signal.removeEventListener('abort', abortListener);
|
|
310
|
-
}
|
|
311
|
-
catch {
|
|
312
|
-
// Best-effort cleanup.
|
|
313
|
-
}
|
|
314
|
-
}
|
|
315
|
-
}
|
|
316
|
-
}
|
|
317
|
-
async collectChunks(req, limit, signal) {
|
|
318
|
-
let size = 0;
|
|
319
|
-
const chunks = [];
|
|
320
|
-
const sink = new Writable({
|
|
321
|
-
write: (chunk, _encoding, callback) => {
|
|
322
|
-
try {
|
|
323
|
-
if (signal?.aborted || isRequestReadAborted(req)) {
|
|
324
|
-
callback(new JsonBodyError('read-failed', 'Request aborted'));
|
|
325
|
-
return;
|
|
326
|
-
}
|
|
327
|
-
const buf = this.normalizeChunk(chunk);
|
|
328
|
-
size += buf.byteLength;
|
|
329
|
-
if (size > limit) {
|
|
330
|
-
callback(new JsonBodyError('payload-too-large', 'Payload too large'));
|
|
331
|
-
return;
|
|
332
|
-
}
|
|
333
|
-
chunks.push(buf);
|
|
334
|
-
callback();
|
|
335
|
-
}
|
|
336
|
-
catch (err) {
|
|
337
|
-
callback(toError(err));
|
|
338
|
-
}
|
|
339
|
-
},
|
|
340
|
-
});
|
|
341
|
-
try {
|
|
342
|
-
if (signal?.aborted || isRequestReadAborted(req)) {
|
|
343
|
-
const error = new JsonBodyError('read-failed', 'Request aborted');
|
|
344
|
-
throw error;
|
|
345
|
-
}
|
|
346
|
-
await pipeline(req, sink, signal ? { signal } : undefined);
|
|
347
|
-
return { chunks, size };
|
|
348
|
-
}
|
|
349
|
-
catch (err) {
|
|
350
|
-
if (err instanceof JsonBodyError)
|
|
351
|
-
throw err;
|
|
352
|
-
if (signal?.aborted || isRequestReadAborted(req)) {
|
|
353
|
-
const error = new JsonBodyError('read-failed', 'Request aborted');
|
|
354
|
-
throw error;
|
|
355
|
-
}
|
|
356
|
-
const error = new JsonBodyError('read-failed', getErrorMessage(err));
|
|
357
|
-
throw error;
|
|
358
|
-
}
|
|
359
|
-
}
|
|
360
|
-
normalizeChunk(chunk) {
|
|
361
|
-
if (typeof chunk === 'string') {
|
|
362
|
-
const encoded = new TextEncoder().encode(chunk);
|
|
363
|
-
return encoded;
|
|
364
|
-
}
|
|
365
|
-
return chunk;
|
|
366
|
-
}
|
|
367
|
-
}
|
|
368
|
-
export const jsonBodyReader = new JsonBodyReader();
|
|
369
|
-
function unregisterSessionTaskScope(server) {
|
|
370
|
-
const sessionId = resolveMcpSessionIdByServer(server);
|
|
371
|
-
if (!sessionId)
|
|
372
|
-
return null;
|
|
373
|
-
unregisterMcpSessionServer(sessionId);
|
|
374
|
-
return sessionId;
|
|
375
|
-
}
|
|
376
|
-
async function closeSessionResources(session, options) {
|
|
377
|
-
const closeTasks = [];
|
|
378
|
-
if (options.closeTransportReason) {
|
|
379
|
-
closeTasks.push(closeTransportBestEffort(session.transport, options.closeTransportReason));
|
|
380
|
-
}
|
|
381
|
-
if (options.closeServerReason) {
|
|
382
|
-
closeTasks.push(closeMcpServerBestEffort(session.server, options.closeServerReason));
|
|
383
|
-
}
|
|
384
|
-
if (options.awaitClose && closeTasks.length > 0) {
|
|
385
|
-
await Promise.all(closeTasks);
|
|
386
|
-
}
|
|
387
|
-
}
|
|
388
|
-
export async function teardownSessionResources(session, options) {
|
|
389
|
-
unregisterSessionTaskScope(session.server);
|
|
390
|
-
if (options.unregisterByServer) {
|
|
391
|
-
unregisterMcpSessionServerByServer(session.server);
|
|
392
|
-
}
|
|
393
|
-
await closeSessionResources(session, options);
|
|
394
|
-
}
|
|
395
|
-
export async function teardownUnregisteredSessionResources(session, context) {
|
|
396
|
-
await closeSessionResources(session, {
|
|
397
|
-
closeTransportReason: context,
|
|
398
|
-
closeServerReason: context,
|
|
399
|
-
awaitClose: true,
|
|
400
|
-
});
|
|
401
|
-
}
|
|
402
|
-
export function teardownSessionRegistration(server) {
|
|
403
|
-
unregisterSessionTaskScope(server);
|
|
404
|
-
}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
export declare const EBLOCKED = "EBLOCKED";
|
|
2
|
-
export declare const ETIMEOUT = "ETIMEOUT";
|
|
3
|
-
export declare const EINVAL = "EINVAL";
|
|
4
|
-
export declare const ENODATA = "ENODATA";
|
|
5
|
-
export declare const EBADREDIRECT = "EBADREDIRECT";
|
|
6
|
-
export declare const EUNSUPPORTEDPROTOCOL = "EUNSUPPORTEDPROTOCOL";
|
|
7
|
-
export declare const FETCH_ERROR = "FETCH_ERROR";
|
|
8
|
-
export declare const ABORTED = "ABORTED";
|
|
9
|
-
export declare const QUEUE_FULL = "queue_full";
|
|
10
|
-
export declare const VALIDATION_ERROR = "VALIDATION_ERROR";
|
|
11
|
-
//# sourceMappingURL=error-codes.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"error-codes.d.ts","sourceRoot":"","sources":["../../src/lib/error-codes.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,QAAQ,aAAa,CAAC;AACnC,eAAO,MAAM,QAAQ,aAAa,CAAC;AACnC,eAAO,MAAM,MAAM,WAAW,CAAC;AAC/B,eAAO,MAAM,OAAO,YAAY,CAAC;AAGjC,eAAO,MAAM,YAAY,iBAAiB,CAAC;AAC3C,eAAO,MAAM,oBAAoB,yBAAyB,CAAC;AAG3D,eAAO,MAAM,WAAW,gBAAgB,CAAC;AACzC,eAAO,MAAM,OAAO,YAAY,CAAC;AACjC,eAAO,MAAM,UAAU,eAAe,CAAC;AAGvC,eAAO,MAAM,gBAAgB,qBAAqB,CAAC"}
|
package/dist/lib/error-codes.js
DELETED
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
// ── Error codes ────────────────────────────────
|
|
2
|
-
// DNS / network resolution
|
|
3
|
-
export const EBLOCKED = 'EBLOCKED';
|
|
4
|
-
export const ETIMEOUT = 'ETIMEOUT';
|
|
5
|
-
export const EINVAL = 'EINVAL';
|
|
6
|
-
export const ENODATA = 'ENODATA';
|
|
7
|
-
// HTTP redirect
|
|
8
|
-
export const EBADREDIRECT = 'EBADREDIRECT';
|
|
9
|
-
export const EUNSUPPORTEDPROTOCOL = 'EUNSUPPORTEDPROTOCOL';
|
|
10
|
-
// Fetch pipeline
|
|
11
|
-
export const FETCH_ERROR = 'FETCH_ERROR';
|
|
12
|
-
export const ABORTED = 'ABORTED';
|
|
13
|
-
export const QUEUE_FULL = 'queue_full';
|
|
14
|
-
// Validation
|
|
15
|
-
export const VALIDATION_ERROR = 'VALIDATION_ERROR';
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"error-messages.d.ts","sourceRoot":"","sources":["../../src/lib/error-messages.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAIxC,wBAAgB,cAAc,CAC5B,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,gBAAgB,GAAG,SAAS,GACnC,UAAU,CAUZ;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,UAAU,CAM7D;AAED,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,UAAU,CAM7E;AAED,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,UAAU,CAM5D;AAED,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,UAAU,CAM9D;AAED,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,MAAM,GAAG,UAAU,CAMtE;AAED,wBAAgB,oBAAoB,IAAI,UAAU,CAGjD;AAED,wBAAgB,eAAe,IAAI,UAAU,CAG5C;AAID,wBAAgB,oBAAoB,IAAI,UAAU,CAGjD;AAED,wBAAgB,wBAAwB,IAAI,UAAU,CAMrD;AAED,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,MAAM,GAAG,UAAU,CAMrE"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"fetch-pipeline.d.ts","sourceRoot":"","sources":["../../src/lib/fetch-pipeline.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAQrE,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAExC,OAAO,EAAE,UAAU,EAAE,CAAC;AAGtB,MAAM,WAAW,mBAAmB;IAClC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AACD,UAAU,mBAAmB;IAC3B,MAAM,EAAE,UAAU,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAmGD,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,OAAO,GAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAO,GAClC,MAAM,GAAG,SAAS,CAQpB;AAyBD,UAAU,oBAAoB,CAAC,CAAC;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,IAAI,CAAC;IAC5C,SAAS,EAAE,CAAC,KAAK,EAAE,mBAAmB,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;CACxE;AACD,MAAM,WAAW,cAAc,CAAC,CAAC;IAC/B,IAAI,EAAE,CAAC,CAAC;IACR,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AACD,MAAM,MAAM,gBAAgB,GACxB,aAAa,GACb,cAAc,GACd,gBAAgB,GAChB,iBAAiB,GACjB,gBAAgB,GAChB,iBAAiB,CAAC;AAmBtB,wBAAsB,oBAAoB,CAAC,CAAC,EAC1C,OAAO,EAAE,oBAAoB,CAAC,CAAC,CAAC,GAC/B,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAiD5B;AAED,MAAM,MAAM,sBAAsB,GAAG,uBAAuB,GAAG;IAC7D,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B,CAAC;AAwBF,eAAO,MAAM,iBAAiB,GAC5B,OAAO,mBAAmB,EAC1B,KAAK,MAAM,EACX,SAAS,WAAW,KACnB,OAAO,CAAC,sBAAsB,CAchC,CAAC;AAEF,UAAU,oBAAoB;IAC5B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;IAC9B,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,IAAI,CAAC;IACrD,QAAQ,CAAC,SAAS,EAAE,CAClB,KAAK,EAAE,mBAAmB,EAC1B,aAAa,EAAE,MAAM,KAClB,sBAAsB,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAAC;CAC/D;AACD,UAAU,eAAe;IACvB,QAAQ,CAAC,oBAAoB,CAAC,EAAE,OAAO,oBAAoB,CAAC;CAC7D;AAMD,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,oBAAoB,EAC7B,IAAI,GAAE,eAAoB,GACzB,OAAO,CAAC;IACT,QAAQ,EAAE,cAAc,CAAC,sBAAsB,CAAC,CAAC;IACjD,YAAY,EAAE,mBAAmB,CAAC;CACnC,CAAC,CAyBD"}
|
package/dist/lib/http.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/lib/http.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,KAAK,EAAmB,MAAM,QAAQ,CAAC;AAyBhD,OAAO,EAOL,KAAK,eAAe,EAErB,MAAM,UAAU,CAAC;AAkxClB,UAAU,qBAAqB;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAoKD,UAAU,YAAY;IACpB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AA6ND,wBAAgB,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAE/C;AACD,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG;IAC/C,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;CAClB,CAEA;AACD,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAEjE;AACD,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,eAAe,CAE9D;AACD,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAExD;AACD,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,GACb,qBAAqB,CAEvB;AACD,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,qBAAqB,EAC9B,QAAQ,EAAE,QAAQ,EAClB,WAAW,CAAC,EAAE,MAAM,GACnB,IAAI,CAEN;AACD,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,qBAAqB,EAC9B,KAAK,EAAE,OAAO,EACd,MAAM,CAAC,EAAE,MAAM,GACd,IAAI,CAEN;AACD,wBAAsB,kBAAkB,CACtC,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,WAAW,EACjB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC;IAAE,QAAQ,EAAE,QAAQ,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,KAAK,CAAA;CAAE,CAAC,CAE7D;AACD,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,QAAQ,EAClB,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,EAChB,MAAM,CAAC,EAAE,WAAW,EACpB,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CASzC;AACD,wBAAsB,kBAAkB,CACtC,aAAa,EAAE,MAAM,EACrB,OAAO,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC,MAAM,CAAC,CAEjB;AACD,wBAAsB,wBAAwB,CAC5C,aAAa,EAAE,MAAM,EACrB,OAAO,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC;IACT,MAAM,EAAE,UAAU,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC,CAED"}
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Logger names for different components of the application.
|
|
3
|
-
*/
|
|
4
|
-
export declare const LOG_AUTH = "auth";
|
|
5
|
-
export declare const LOG_HTTP = "http";
|
|
6
|
-
export declare const LOG_SESSION = "session";
|
|
7
|
-
export declare const LOG_SERVER = "server";
|
|
8
|
-
export declare const LOG_FETCH = "fetch";
|
|
9
|
-
export declare const LOG_TRANSFORM = "transform";
|
|
10
|
-
export declare const LOG_TASKS = "tasks";
|
|
11
|
-
export declare const LOG_RATE_LIMIT = "rate-limit";
|
|
12
|
-
export declare const LOG_MCP = "mcp";
|
|
13
|
-
export declare const LOG_FETCH_URL = "fetch-url";
|
|
14
|
-
//# sourceMappingURL=logger-names.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"logger-names.d.ts","sourceRoot":"","sources":["../../src/lib/logger-names.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,eAAO,MAAM,QAAQ,SAAS,CAAC;AAC/B,eAAO,MAAM,QAAQ,SAAS,CAAC;AAC/B,eAAO,MAAM,WAAW,YAAY,CAAC;AACrC,eAAO,MAAM,UAAU,WAAW,CAAC;AACnC,eAAO,MAAM,SAAS,UAAU,CAAC;AACjC,eAAO,MAAM,aAAa,cAAc,CAAC;AACzC,eAAO,MAAM,SAAS,UAAU,CAAC;AACjC,eAAO,MAAM,cAAc,eAAe,CAAC;AAC3C,eAAO,MAAM,OAAO,QAAQ,CAAC;AAC7B,eAAO,MAAM,aAAa,cAAc,CAAC"}
|
package/dist/lib/logger-names.js
DELETED
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Logger names for different components of the application.
|
|
3
|
-
*/
|
|
4
|
-
export const LOG_AUTH = 'auth';
|
|
5
|
-
export const LOG_HTTP = 'http';
|
|
6
|
-
export const LOG_SESSION = 'session';
|
|
7
|
-
export const LOG_SERVER = 'server';
|
|
8
|
-
export const LOG_FETCH = 'fetch';
|
|
9
|
-
export const LOG_TRANSFORM = 'transform';
|
|
10
|
-
export const LOG_TASKS = 'tasks';
|
|
11
|
-
export const LOG_RATE_LIMIT = 'rate-limit';
|
|
12
|
-
export const LOG_MCP = 'mcp';
|
|
13
|
-
export const LOG_FETCH_URL = 'fetch-url';
|
package/dist/lib/session.d.ts
DELETED
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
-
import type { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
|
|
3
|
-
export interface SessionEntry {
|
|
4
|
-
readonly server: McpServer;
|
|
5
|
-
readonly transport: StreamableHTTPServerTransport;
|
|
6
|
-
createdAt: number;
|
|
7
|
-
lastSeen: number;
|
|
8
|
-
protocolInitialized: boolean;
|
|
9
|
-
negotiatedProtocolVersion: string;
|
|
10
|
-
authFingerprint: string;
|
|
11
|
-
}
|
|
12
|
-
export interface SessionStore {
|
|
13
|
-
get: (sessionId: string) => SessionEntry | undefined;
|
|
14
|
-
touch: (sessionId: string) => void;
|
|
15
|
-
set: (sessionId: string, entry: SessionEntry) => void;
|
|
16
|
-
remove: (sessionId: string) => SessionEntry | undefined;
|
|
17
|
-
size: () => number;
|
|
18
|
-
inFlight: () => number;
|
|
19
|
-
incrementInFlight: () => void;
|
|
20
|
-
decrementInFlight: () => void;
|
|
21
|
-
clear: () => SessionEntry[];
|
|
22
|
-
evictExpired: () => {
|
|
23
|
-
id: string;
|
|
24
|
-
entry: SessionEntry;
|
|
25
|
-
}[];
|
|
26
|
-
evictOldest: () => SessionEntry | undefined;
|
|
27
|
-
}
|
|
28
|
-
interface SlotTracker {
|
|
29
|
-
readonly releaseSlot: () => void;
|
|
30
|
-
readonly markInitialized: () => void;
|
|
31
|
-
readonly isInitialized: () => boolean;
|
|
32
|
-
}
|
|
33
|
-
type CloseHandler = (() => void) | undefined;
|
|
34
|
-
export declare function composeCloseHandlers(first: CloseHandler, second: CloseHandler): CloseHandler;
|
|
35
|
-
export declare function createSessionStore(sessionTtlMs: number): SessionStore;
|
|
36
|
-
export declare function createSlotTracker(store: SessionStore): SlotTracker;
|
|
37
|
-
export declare function reserveSessionSlot(store: SessionStore, maxSessions: number): boolean;
|
|
38
|
-
export declare function ensureSessionCapacity({ store, maxSessions, evictOldest, }: {
|
|
39
|
-
store: SessionStore;
|
|
40
|
-
maxSessions: number;
|
|
41
|
-
evictOldest: (store: SessionStore) => boolean;
|
|
42
|
-
}): boolean;
|
|
43
|
-
export {};
|
|
44
|
-
//# sourceMappingURL=session.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/lib/session.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,oDAAoD,CAAC;AAMxG,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,6BAA6B,CAAC;IAClD,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,mBAAmB,EAAE,OAAO,CAAC;IAC7B,yBAAyB,EAAE,MAAM,CAAC;IAClC,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,YAAY,GAAG,SAAS,CAAC;IACrD,KAAK,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,GAAG,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,KAAK,IAAI,CAAC;IACtD,MAAM,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,YAAY,GAAG,SAAS,CAAC;IACxD,IAAI,EAAE,MAAM,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,MAAM,CAAC;IACvB,iBAAiB,EAAE,MAAM,IAAI,CAAC;IAC9B,iBAAiB,EAAE,MAAM,IAAI,CAAC;IAC9B,KAAK,EAAE,MAAM,YAAY,EAAE,CAAC;IAC5B,YAAY,EAAE,MAAM;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,YAAY,CAAA;KAAE,EAAE,CAAC;IAC1D,WAAW,EAAE,MAAM,YAAY,GAAG,SAAS,CAAC;CAC7C;AAED,UAAU,WAAW;IACnB,QAAQ,CAAC,WAAW,EAAE,MAAM,IAAI,CAAC;IACjC,QAAQ,CAAC,eAAe,EAAE,MAAM,IAAI,CAAC;IACrC,QAAQ,CAAC,aAAa,EAAE,MAAM,OAAO,CAAC;CACvC;AAMD,KAAK,YAAY,GAAG,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,CAAC;AAE7C,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,YAAY,EACnB,MAAM,EAAE,YAAY,GACnB,YAAY,CAWd;AA0FD,wBAAgB,kBAAkB,CAAC,YAAY,EAAE,MAAM,GAAG,YAAY,CAGrE;AAMD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,YAAY,GAAG,WAAW,CAiBlE;AAED,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,YAAY,EACnB,WAAW,EAAE,MAAM,GAClB,OAAO,CAMT;AAED,wBAAgB,qBAAqB,CAAC,EACpC,KAAK,EACL,WAAW,EACX,WAAW,GACZ,EAAE;IACD,KAAK,EAAE,YAAY,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,OAAO,CAAC;CAC/C,GAAG,OAAO,CAUV"}
|
package/dist/lib/session.js
DELETED
|
@@ -1,137 +0,0 @@
|
|
|
1
|
-
export function composeCloseHandlers(first, second) {
|
|
2
|
-
if (!first)
|
|
3
|
-
return second;
|
|
4
|
-
if (!second)
|
|
5
|
-
return first;
|
|
6
|
-
return () => {
|
|
7
|
-
try {
|
|
8
|
-
first();
|
|
9
|
-
}
|
|
10
|
-
finally {
|
|
11
|
-
second();
|
|
12
|
-
}
|
|
13
|
-
};
|
|
14
|
-
}
|
|
15
|
-
/* -------------------------------------------------------------------------------------------------
|
|
16
|
-
* In-memory session store
|
|
17
|
-
* ------------------------------------------------------------------------------------------------- */
|
|
18
|
-
class InMemorySessionStore {
|
|
19
|
-
sessionTtlMs;
|
|
20
|
-
sessions = new Map();
|
|
21
|
-
inflight = 0;
|
|
22
|
-
constructor(sessionTtlMs) {
|
|
23
|
-
this.sessionTtlMs = sessionTtlMs;
|
|
24
|
-
}
|
|
25
|
-
get(sessionId) {
|
|
26
|
-
if (sessionId.length === 0)
|
|
27
|
-
return undefined;
|
|
28
|
-
return this.sessions.get(sessionId);
|
|
29
|
-
}
|
|
30
|
-
touch(sessionId) {
|
|
31
|
-
if (sessionId.length === 0)
|
|
32
|
-
return;
|
|
33
|
-
const session = this.sessions.get(sessionId);
|
|
34
|
-
if (!session)
|
|
35
|
-
return;
|
|
36
|
-
session.lastSeen = Date.now();
|
|
37
|
-
this.sessions.delete(sessionId);
|
|
38
|
-
this.sessions.set(sessionId, session);
|
|
39
|
-
}
|
|
40
|
-
set(sessionId, entry) {
|
|
41
|
-
if (sessionId.length === 0)
|
|
42
|
-
return;
|
|
43
|
-
this.sessions.delete(sessionId);
|
|
44
|
-
this.sessions.set(sessionId, entry);
|
|
45
|
-
}
|
|
46
|
-
remove(sessionId) {
|
|
47
|
-
if (sessionId.length === 0)
|
|
48
|
-
return undefined;
|
|
49
|
-
const session = this.sessions.get(sessionId);
|
|
50
|
-
this.sessions.delete(sessionId);
|
|
51
|
-
return session;
|
|
52
|
-
}
|
|
53
|
-
size() {
|
|
54
|
-
return this.sessions.size;
|
|
55
|
-
}
|
|
56
|
-
inFlight() {
|
|
57
|
-
return this.inflight;
|
|
58
|
-
}
|
|
59
|
-
incrementInFlight() {
|
|
60
|
-
this.inflight += 1;
|
|
61
|
-
}
|
|
62
|
-
decrementInFlight() {
|
|
63
|
-
if (this.inflight === 0)
|
|
64
|
-
return;
|
|
65
|
-
this.inflight -= 1;
|
|
66
|
-
}
|
|
67
|
-
clear() {
|
|
68
|
-
const entries = [...this.sessions.values()];
|
|
69
|
-
this.sessions.clear();
|
|
70
|
-
return entries;
|
|
71
|
-
}
|
|
72
|
-
evictExpired() {
|
|
73
|
-
const now = Date.now();
|
|
74
|
-
const evicted = [];
|
|
75
|
-
for (const [id, session] of this.sessions.entries()) {
|
|
76
|
-
if (this.sessionTtlMs > 0 && now - session.lastSeen > this.sessionTtlMs) {
|
|
77
|
-
this.sessions.delete(id);
|
|
78
|
-
evicted.push({ id, entry: session });
|
|
79
|
-
}
|
|
80
|
-
else {
|
|
81
|
-
break;
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
return evicted;
|
|
85
|
-
}
|
|
86
|
-
evictOldest() {
|
|
87
|
-
const oldest = this.sessions.keys().next();
|
|
88
|
-
if (oldest.done)
|
|
89
|
-
return undefined;
|
|
90
|
-
const session = this.sessions.get(oldest.value);
|
|
91
|
-
this.sessions.delete(oldest.value);
|
|
92
|
-
return session;
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
export function createSessionStore(sessionTtlMs) {
|
|
96
|
-
const store = new InMemorySessionStore(sessionTtlMs);
|
|
97
|
-
return store;
|
|
98
|
-
}
|
|
99
|
-
/* -------------------------------------------------------------------------------------------------
|
|
100
|
-
* Slot tracking and capacity
|
|
101
|
-
* ------------------------------------------------------------------------------------------------- */
|
|
102
|
-
export function createSlotTracker(store) {
|
|
103
|
-
let slotReleased = false;
|
|
104
|
-
let initialized = false;
|
|
105
|
-
return {
|
|
106
|
-
releaseSlot() {
|
|
107
|
-
if (slotReleased)
|
|
108
|
-
return;
|
|
109
|
-
slotReleased = true;
|
|
110
|
-
store.decrementInFlight();
|
|
111
|
-
},
|
|
112
|
-
markInitialized() {
|
|
113
|
-
initialized = true;
|
|
114
|
-
},
|
|
115
|
-
isInitialized() {
|
|
116
|
-
return initialized;
|
|
117
|
-
},
|
|
118
|
-
};
|
|
119
|
-
}
|
|
120
|
-
export function reserveSessionSlot(store, maxSessions) {
|
|
121
|
-
if (maxSessions <= 0)
|
|
122
|
-
return false;
|
|
123
|
-
if (store.size() + store.inFlight() >= maxSessions)
|
|
124
|
-
return false;
|
|
125
|
-
store.incrementInFlight();
|
|
126
|
-
return true;
|
|
127
|
-
}
|
|
128
|
-
export function ensureSessionCapacity({ store, maxSessions, evictOldest, }) {
|
|
129
|
-
if (maxSessions <= 0)
|
|
130
|
-
return false;
|
|
131
|
-
if (store.size() + store.inFlight() < maxSessions)
|
|
132
|
-
return true;
|
|
133
|
-
if (store.size() > 0 && evictOldest(store)) {
|
|
134
|
-
return store.size() + store.inFlight() < maxSessions;
|
|
135
|
-
}
|
|
136
|
-
return false;
|
|
137
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"tool-errors.d.ts","sourceRoot":"","sources":["../../src/lib/tool-errors.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,cAAc,EAEpB,MAAM,oCAAoC,CAAC;AAY5C,MAAM,MAAM,iBAAiB,GAAG,cAAc,GAAG;IAC/C,OAAO,EAAE,IAAI,CAAC;CACf,CAAC;AAEF,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,gBAAiB,SAAQ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAC/D,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAmDD,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,MAAM,EACX,KAAK,CAAC,EAAE;IACN,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB,GACA,iBAAiB,CAOnB;AAED,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,MAAM,EACX,KAAK,CAAC,EAAE;IACN,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB,GACA,gBAAgB,CAgBlB;AAiBD,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,OAAO,GACb,gBAAgB,GAAG,SAAS,CA2B9B;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAE1E;AAkKD,wBAAgB,eAAe,CAC7B,KAAK,EAAE,OAAO,EACd,GAAG,EAAE,MAAM,EACX,eAAe,SAAqB,GACnC,iBAAiB,CAInB;AAED,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,OAAO,EACd,IAAI,EAAE,gBAAgB,EACtB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,eAAe,EAAE,MAAM,GACtB,iBAAiB,CA+BnB"}
|