@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
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
import { ErrorCode, McpError } from '@modelcontextprotocol/sdk/types.js';
|
|
2
|
+
import { logError, logWarn } from '../core.js';
|
|
3
|
+
import { FetchError, isAbortError, isSystemError } from './classes.js';
|
|
4
|
+
import { ErrorCategory, SystemErrors } from './codes.js';
|
|
5
|
+
import { createToolErrorResponse, sanitizeToolErrorDetails, stripMcpErrorPrefix, } from './payload.js';
|
|
6
|
+
function toToolErrorResponse(payload) {
|
|
7
|
+
return createToolErrorResponse(payload.error, payload.url, payload);
|
|
8
|
+
}
|
|
9
|
+
function isValidationError(error) {
|
|
10
|
+
return (error instanceof Error &&
|
|
11
|
+
isSystemError(error) &&
|
|
12
|
+
error.code === SystemErrors.VALIDATION_ERROR);
|
|
13
|
+
}
|
|
14
|
+
function buildUpstreamHttpMessage(error) {
|
|
15
|
+
const { statusCode } = error;
|
|
16
|
+
if (statusCode === 404) {
|
|
17
|
+
return `We couldn't find the resource at the target URL.`;
|
|
18
|
+
}
|
|
19
|
+
return `An error occurred when communicating with the target URL.`;
|
|
20
|
+
}
|
|
21
|
+
function mapFetchToolError(error, fallbackUrl) {
|
|
22
|
+
const { code: detailsCode, reason } = error.details;
|
|
23
|
+
let { code } = error;
|
|
24
|
+
if (typeof detailsCode === 'string') {
|
|
25
|
+
code = detailsCode;
|
|
26
|
+
}
|
|
27
|
+
else if (reason === SystemErrors.QUEUE_FULL) {
|
|
28
|
+
code = SystemErrors.QUEUE_FULL;
|
|
29
|
+
}
|
|
30
|
+
const url = error.url || fallbackUrl;
|
|
31
|
+
const details = sanitizeToolErrorDetails(error.details);
|
|
32
|
+
if (reason === 'timeout') {
|
|
33
|
+
return {
|
|
34
|
+
error: 'The request to the target timed out.',
|
|
35
|
+
url,
|
|
36
|
+
category: ErrorCategory.UPSTREAM_TIMEOUT,
|
|
37
|
+
code,
|
|
38
|
+
statusCode: error.statusCode,
|
|
39
|
+
upstreamMessage: error.message,
|
|
40
|
+
...(details ? { details } : {}),
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
if (reason === 'aborted') {
|
|
44
|
+
return {
|
|
45
|
+
error: 'The request to the target was cancelled.',
|
|
46
|
+
url,
|
|
47
|
+
category: ErrorCategory.UPSTREAM_ABORTED,
|
|
48
|
+
code,
|
|
49
|
+
statusCode: error.statusCode,
|
|
50
|
+
upstreamMessage: error.message,
|
|
51
|
+
...(details ? { details } : {}),
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
if (reason === SystemErrors.QUEUE_FULL) {
|
|
55
|
+
return {
|
|
56
|
+
error: error.message,
|
|
57
|
+
url,
|
|
58
|
+
category: ErrorCategory.QUEUE_FULL,
|
|
59
|
+
code,
|
|
60
|
+
statusCode: error.statusCode,
|
|
61
|
+
...(details ? { details } : {}),
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
const isRealHttpError = typeof error.details['httpStatus'] === 'number';
|
|
65
|
+
if (isRealHttpError && error.statusCode >= 400) {
|
|
66
|
+
return {
|
|
67
|
+
error: buildUpstreamHttpMessage(error),
|
|
68
|
+
url,
|
|
69
|
+
category: error.statusCode === 429
|
|
70
|
+
? ErrorCategory.UPSTREAM_RATE_LIMITED
|
|
71
|
+
: ErrorCategory.UPSTREAM_HTTP_ERROR,
|
|
72
|
+
code,
|
|
73
|
+
statusCode: error.statusCode,
|
|
74
|
+
upstreamMessage: error.message,
|
|
75
|
+
...(details ? { details } : {}),
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
return {
|
|
79
|
+
error: error.message,
|
|
80
|
+
url,
|
|
81
|
+
category: ErrorCategory.FETCH_ERROR,
|
|
82
|
+
code,
|
|
83
|
+
statusCode: error.statusCode,
|
|
84
|
+
...(details ? { details } : {}),
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
function mapGenericToolError(error, url, fallbackMessage) {
|
|
88
|
+
if (isValidationError(error)) {
|
|
89
|
+
return {
|
|
90
|
+
error: error.message,
|
|
91
|
+
url,
|
|
92
|
+
category: ErrorCategory.VALIDATION_ERROR,
|
|
93
|
+
code: SystemErrors.VALIDATION_ERROR,
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
const isAborted = isAbortError(error);
|
|
97
|
+
return {
|
|
98
|
+
error: error instanceof Error
|
|
99
|
+
? error.message
|
|
100
|
+
: `${fallbackMessage}: unknown error`,
|
|
101
|
+
url,
|
|
102
|
+
category: isAborted
|
|
103
|
+
? ErrorCategory.UPSTREAM_ABORTED
|
|
104
|
+
: ErrorCategory.FETCH_ERROR,
|
|
105
|
+
code: isAborted ? SystemErrors.ABORTED : SystemErrors.FETCH_ERROR,
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
function mapMcpToolError(error, url) {
|
|
109
|
+
return {
|
|
110
|
+
error: stripMcpErrorPrefix(error.message),
|
|
111
|
+
url,
|
|
112
|
+
category: ErrorCategory.MCP_ERROR,
|
|
113
|
+
code: error.code,
|
|
114
|
+
statusCode: error.code,
|
|
115
|
+
...(error.data !== undefined ? { data: error.data } : {}),
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
function resolveToolErrorPayload(error, url, fallbackMessage) {
|
|
119
|
+
if (error instanceof FetchError) {
|
|
120
|
+
return mapFetchToolError(error, url);
|
|
121
|
+
}
|
|
122
|
+
if (error instanceof McpError) {
|
|
123
|
+
return mapMcpToolError(error, url);
|
|
124
|
+
}
|
|
125
|
+
return mapGenericToolError(error, url, fallbackMessage);
|
|
126
|
+
}
|
|
127
|
+
export function handleToolError(error, url, fallbackMessage = 'Operation failed') {
|
|
128
|
+
return toToolErrorResponse(resolveToolErrorPayload(error, url, fallbackMessage));
|
|
129
|
+
}
|
|
130
|
+
export function classifyAndLogToolError(error, meta, loggerName, toolName, fallbackMessage) {
|
|
131
|
+
if (error instanceof McpError) {
|
|
132
|
+
if (error.code === ErrorCode.MethodNotFound) {
|
|
133
|
+
logError(`${toolName} tool protocol error`, { url: meta.url, durationMs: meta.durationMs, error }, loggerName);
|
|
134
|
+
throw error;
|
|
135
|
+
}
|
|
136
|
+
logWarn(`${toolName} tool error`, { url: meta.url, durationMs: meta.durationMs, error }, loggerName);
|
|
137
|
+
return handleToolError(error, meta.url, fallbackMessage);
|
|
138
|
+
}
|
|
139
|
+
if (error instanceof FetchError || isAbortError(error)) {
|
|
140
|
+
logWarn(`${toolName} request failed`, {
|
|
141
|
+
url: meta.url,
|
|
142
|
+
error: error instanceof Error ? error.message : String(error),
|
|
143
|
+
durationMs: meta.durationMs,
|
|
144
|
+
}, loggerName);
|
|
145
|
+
}
|
|
146
|
+
else {
|
|
147
|
+
logError(`${toolName} request failed unexpectedly`, {
|
|
148
|
+
url: meta.url,
|
|
149
|
+
error: error instanceof Error ? error.message : String(error),
|
|
150
|
+
durationMs: meta.durationMs,
|
|
151
|
+
}, loggerName);
|
|
152
|
+
}
|
|
153
|
+
return handleToolError(error, meta.url, fallbackMessage);
|
|
154
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export declare const SystemErrors: {
|
|
2
|
+
readonly EBLOCKED: "EBLOCKED";
|
|
3
|
+
readonly ETIMEOUT: "ETIMEOUT";
|
|
4
|
+
readonly EINVAL: "EINVAL";
|
|
5
|
+
readonly ENODATA: "ENODATA";
|
|
6
|
+
readonly EBADREDIRECT: "EBADREDIRECT";
|
|
7
|
+
readonly EUNSUPPORTEDPROTOCOL: "EUNSUPPORTEDPROTOCOL";
|
|
8
|
+
readonly FETCH_ERROR: "FETCH_ERROR";
|
|
9
|
+
readonly ABORTED: "ABORTED";
|
|
10
|
+
readonly QUEUE_FULL: "queue_full";
|
|
11
|
+
readonly VALIDATION_ERROR: "VALIDATION_ERROR";
|
|
12
|
+
};
|
|
13
|
+
export declare const ErrorCategory: {
|
|
14
|
+
readonly UPSTREAM_TIMEOUT: "upstream_timeout";
|
|
15
|
+
readonly UPSTREAM_ABORTED: "upstream_aborted";
|
|
16
|
+
readonly UPSTREAM_RATE_LIMITED: "upstream_rate_limited";
|
|
17
|
+
readonly UPSTREAM_HTTP_ERROR: "upstream_http_error";
|
|
18
|
+
readonly QUEUE_FULL: "queue_full";
|
|
19
|
+
readonly FETCH_ERROR: "fetch_error";
|
|
20
|
+
readonly VALIDATION_ERROR: "validation_error";
|
|
21
|
+
readonly MCP_ERROR: "mcp_error";
|
|
22
|
+
};
|
|
23
|
+
//# sourceMappingURL=codes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codes.d.ts","sourceRoot":"","sources":["../../../src/lib/error/codes.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,YAAY;;;;;;;;;;;CAWf,CAAC;AAEX,eAAO,MAAM,aAAa;;;;;;;;;CAShB,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export const SystemErrors = {
|
|
2
|
+
EBLOCKED: 'EBLOCKED',
|
|
3
|
+
ETIMEOUT: 'ETIMEOUT',
|
|
4
|
+
EINVAL: 'EINVAL',
|
|
5
|
+
ENODATA: 'ENODATA',
|
|
6
|
+
EBADREDIRECT: 'EBADREDIRECT',
|
|
7
|
+
EUNSUPPORTEDPROTOCOL: 'EUNSUPPORTEDPROTOCOL',
|
|
8
|
+
FETCH_ERROR: 'FETCH_ERROR',
|
|
9
|
+
ABORTED: 'ABORTED',
|
|
10
|
+
QUEUE_FULL: 'queue_full',
|
|
11
|
+
VALIDATION_ERROR: 'VALIDATION_ERROR',
|
|
12
|
+
};
|
|
13
|
+
export const ErrorCategory = {
|
|
14
|
+
UPSTREAM_TIMEOUT: 'upstream_timeout',
|
|
15
|
+
UPSTREAM_ABORTED: 'upstream_aborted',
|
|
16
|
+
UPSTREAM_RATE_LIMITED: 'upstream_rate_limited',
|
|
17
|
+
UPSTREAM_HTTP_ERROR: 'upstream_http_error',
|
|
18
|
+
QUEUE_FULL: 'queue_full',
|
|
19
|
+
FETCH_ERROR: 'fetch_error',
|
|
20
|
+
VALIDATION_ERROR: 'validation_error',
|
|
21
|
+
MCP_ERROR: 'mcp_error',
|
|
22
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/error/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { CodedError } from './
|
|
1
|
+
import { CodedError } from './classes.js';
|
|
2
2
|
export declare function blockedIpError(target: string, reason: 'cloud-metadata' | 'private'): CodedError;
|
|
3
3
|
export declare function blockedHostError(hostname: string): CodedError;
|
|
4
4
|
export declare function blockedCnameError(hostname: string, cname: string): CodedError;
|
|
@@ -10,4 +10,4 @@ export declare function invalidUrlError(): CodedError;
|
|
|
10
10
|
export declare function invalidRedirectError(): CodedError;
|
|
11
11
|
export declare function redirectCredentialsError(): CodedError;
|
|
12
12
|
export declare function unsupportedProtocolError(protocol: string): CodedError;
|
|
13
|
-
//# sourceMappingURL=
|
|
13
|
+
//# sourceMappingURL=messages.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../../../src/lib/error/messages.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAK1C,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,CAMjD;AAED,wBAAgB,eAAe,IAAI,UAAU,CAG5C;AAID,wBAAgB,oBAAoB,IAAI,UAAU,CAMjD;AAED,wBAAgB,wBAAwB,IAAI,UAAU,CAMrD;AAED,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,MAAM,GAAG,UAAU,CAMrE"}
|
|
@@ -1,51 +1,51 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { CodedError } from './classes.js';
|
|
2
|
+
import { SystemErrors } from './codes.js';
|
|
3
3
|
// ── DNS / Network ──────────────────────────────────────────────────
|
|
4
4
|
export function blockedIpError(target, reason) {
|
|
5
5
|
const detail = reason === 'cloud-metadata'
|
|
6
6
|
? 'Cloud metadata endpoints are not allowed'
|
|
7
7
|
: 'Private IPs are not allowed';
|
|
8
|
-
const error = new CodedError(`Blocked IP range: ${target}. ${detail}`, EBLOCKED);
|
|
8
|
+
const error = new CodedError(`Blocked IP range: ${target}. ${detail}`, SystemErrors.EBLOCKED);
|
|
9
9
|
return error;
|
|
10
10
|
}
|
|
11
11
|
export function blockedHostError(hostname) {
|
|
12
|
-
const error = new CodedError(`Blocked host: ${hostname}. Internal hosts are not allowed`, EBLOCKED);
|
|
12
|
+
const error = new CodedError(`Blocked host: ${hostname}. Internal hosts are not allowed`, SystemErrors.EBLOCKED);
|
|
13
13
|
return error;
|
|
14
14
|
}
|
|
15
15
|
export function blockedCnameError(hostname, cname) {
|
|
16
|
-
const error = new CodedError(`Blocked DNS CNAME detected for ${hostname}: ${cname}`, EBLOCKED);
|
|
16
|
+
const error = new CodedError(`Blocked DNS CNAME detected for ${hostname}: ${cname}`, SystemErrors.EBLOCKED);
|
|
17
17
|
return error;
|
|
18
18
|
}
|
|
19
19
|
export function dnsTimeoutError(hostname) {
|
|
20
|
-
const error = new CodedError(`DNS lookup timed out for ${hostname}`, ETIMEOUT);
|
|
20
|
+
const error = new CodedError(`DNS lookup timed out for ${hostname}`, SystemErrors.ETIMEOUT);
|
|
21
21
|
return error;
|
|
22
22
|
}
|
|
23
23
|
export function dnsNoResultsError(hostname) {
|
|
24
|
-
const error = new CodedError(`No DNS results returned for ${hostname}`, ENODATA);
|
|
24
|
+
const error = new CodedError(`No DNS results returned for ${hostname}`, SystemErrors.ENODATA);
|
|
25
25
|
return error;
|
|
26
26
|
}
|
|
27
27
|
export function invalidAddressFamilyError(hostname) {
|
|
28
|
-
const error = new CodedError(`Invalid address family returned for ${hostname}`, EINVAL);
|
|
28
|
+
const error = new CodedError(`Invalid address family returned for ${hostname}`, SystemErrors.EINVAL);
|
|
29
29
|
return error;
|
|
30
30
|
}
|
|
31
31
|
export function invalidHostnameError() {
|
|
32
|
-
const error = new CodedError('Invalid hostname provided', EINVAL);
|
|
32
|
+
const error = new CodedError('Invalid hostname provided', SystemErrors.EINVAL);
|
|
33
33
|
return error;
|
|
34
34
|
}
|
|
35
35
|
export function invalidUrlError() {
|
|
36
|
-
const error = new CodedError('Invalid URL', EINVAL);
|
|
36
|
+
const error = new CodedError('Invalid URL', SystemErrors.EINVAL);
|
|
37
37
|
return error;
|
|
38
38
|
}
|
|
39
39
|
// ── HTTP Redirect ──────────────────────────────────────────────────
|
|
40
40
|
export function invalidRedirectError() {
|
|
41
|
-
const error = new CodedError('Invalid redirect target', EBADREDIRECT);
|
|
41
|
+
const error = new CodedError('Invalid redirect target', SystemErrors.EBADREDIRECT);
|
|
42
42
|
return error;
|
|
43
43
|
}
|
|
44
44
|
export function redirectCredentialsError() {
|
|
45
|
-
const error = new CodedError('Redirect target includes credentials', EBADREDIRECT);
|
|
45
|
+
const error = new CodedError('Redirect target includes credentials', SystemErrors.EBADREDIRECT);
|
|
46
46
|
return error;
|
|
47
47
|
}
|
|
48
48
|
export function unsupportedProtocolError(protocol) {
|
|
49
|
-
const error = new CodedError(`Unsupported redirect protocol: ${protocol}`, EUNSUPPORTEDPROTOCOL);
|
|
49
|
+
const error = new CodedError(`Unsupported redirect protocol: ${protocol}`, SystemErrors.EUNSUPPORTEDPROTOCOL);
|
|
50
50
|
return error;
|
|
51
51
|
}
|
|
@@ -16,24 +16,18 @@ export interface ToolErrorPayload extends Record<string, unknown> {
|
|
|
16
16
|
details?: Record<string, unknown>;
|
|
17
17
|
data?: unknown;
|
|
18
18
|
}
|
|
19
|
-
export
|
|
19
|
+
export interface ToolErrorExtra {
|
|
20
20
|
category?: string;
|
|
21
21
|
code?: string | number;
|
|
22
22
|
statusCode?: number;
|
|
23
23
|
upstreamMessage?: string;
|
|
24
24
|
details?: Record<string, unknown>;
|
|
25
25
|
data?: unknown;
|
|
26
|
-
}
|
|
27
|
-
export declare function
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
statusCode?: number;
|
|
31
|
-
upstreamMessage?: string;
|
|
32
|
-
details?: Record<string, unknown>;
|
|
33
|
-
data?: unknown;
|
|
34
|
-
}): ToolErrorPayload;
|
|
26
|
+
}
|
|
27
|
+
export declare function sanitizeToolErrorDetails(details: Readonly<Record<string, unknown>>): Record<string, unknown> | undefined;
|
|
28
|
+
export declare function createToolErrorResponse(message: string, url: string, extra?: ToolErrorExtra): ToolErrorResponse;
|
|
29
|
+
export declare function createToolErrorPayload(message: string, url: string, extra?: ToolErrorExtra): ToolErrorPayload;
|
|
35
30
|
export declare function tryReadToolErrorPayload(value: unknown): ToolErrorPayload | undefined;
|
|
36
31
|
export declare function tryReadToolErrorMessage(value: unknown): string | undefined;
|
|
37
|
-
export declare function
|
|
38
|
-
|
|
39
|
-
//# sourceMappingURL=tool-errors.d.ts.map
|
|
32
|
+
export declare function stripMcpErrorPrefix(message: string): string;
|
|
33
|
+
//# sourceMappingURL=payload.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"payload.d.ts","sourceRoot":"","sources":["../../../src/lib/error/payload.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAOzE,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;AAED,MAAM,WAAW,cAAc;IAC7B,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;AAmBD,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GACzC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAqBrC;AAED,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,MAAM,EACX,KAAK,CAAC,EAAE,cAAc,GACrB,iBAAiB,CAOnB;AAED,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,MAAM,EACX,KAAK,CAAC,EAAE,cAAc,GACrB,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;AAID,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAE3D"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import {} from '@modelcontextprotocol/sdk/types.js';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import { isObject } from '../utils.js';
|
|
4
|
+
import { SystemErrors } from './codes.js';
|
|
5
|
+
const toolErrorPayloadSchema = z.strictObject({
|
|
6
|
+
error: z.string(),
|
|
7
|
+
url: z.string(),
|
|
8
|
+
category: z.string().optional(),
|
|
9
|
+
code: z.union([z.string(), z.number()]).optional(),
|
|
10
|
+
statusCode: z.number().int().optional(),
|
|
11
|
+
upstreamMessage: z.string().optional(),
|
|
12
|
+
details: z.record(z.string(), z.unknown()).optional(),
|
|
13
|
+
data: z.unknown().optional(),
|
|
14
|
+
});
|
|
15
|
+
const PUBLIC_ERROR_REASONS = new Set([
|
|
16
|
+
'aborted',
|
|
17
|
+
SystemErrors.QUEUE_FULL,
|
|
18
|
+
'timeout',
|
|
19
|
+
]);
|
|
20
|
+
export function sanitizeToolErrorDetails(details) {
|
|
21
|
+
const sanitized = {};
|
|
22
|
+
const { retryAfter, timeout, reason } = details;
|
|
23
|
+
if (typeof retryAfter === 'number' ||
|
|
24
|
+
typeof retryAfter === 'string' ||
|
|
25
|
+
retryAfter === null) {
|
|
26
|
+
sanitized['retryAfter'] = retryAfter;
|
|
27
|
+
}
|
|
28
|
+
if (typeof timeout === 'number' && Number.isFinite(timeout) && timeout >= 0) {
|
|
29
|
+
sanitized['timeout'] = timeout;
|
|
30
|
+
}
|
|
31
|
+
if (typeof reason === 'string' && PUBLIC_ERROR_REASONS.has(reason)) {
|
|
32
|
+
sanitized['reason'] = reason;
|
|
33
|
+
}
|
|
34
|
+
return Object.keys(sanitized).length > 0 ? sanitized : undefined;
|
|
35
|
+
}
|
|
36
|
+
export function createToolErrorResponse(message, url, extra) {
|
|
37
|
+
const errorContent = createToolErrorPayload(message, url, extra);
|
|
38
|
+
return {
|
|
39
|
+
content: [{ type: 'text', text: JSON.stringify(errorContent) }],
|
|
40
|
+
isError: true,
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
export function createToolErrorPayload(message, url, extra) {
|
|
44
|
+
const payload = {
|
|
45
|
+
error: message,
|
|
46
|
+
url,
|
|
47
|
+
};
|
|
48
|
+
if (extra?.category !== undefined)
|
|
49
|
+
payload.category = extra.category;
|
|
50
|
+
if (extra?.code !== undefined)
|
|
51
|
+
payload.code = extra.code;
|
|
52
|
+
if (extra?.statusCode !== undefined)
|
|
53
|
+
payload.statusCode = extra.statusCode;
|
|
54
|
+
if (extra?.upstreamMessage !== undefined) {
|
|
55
|
+
payload.upstreamMessage = extra.upstreamMessage;
|
|
56
|
+
}
|
|
57
|
+
if (extra?.details)
|
|
58
|
+
payload.details = extra.details;
|
|
59
|
+
if (extra?.data !== undefined)
|
|
60
|
+
payload.data = extra.data;
|
|
61
|
+
return payload;
|
|
62
|
+
}
|
|
63
|
+
function normalizeToolErrorPayload(value) {
|
|
64
|
+
return createToolErrorPayload(value.error, value.url, {
|
|
65
|
+
...(value.category !== undefined ? { category: value.category } : {}),
|
|
66
|
+
...(value.code !== undefined ? { code: value.code } : {}),
|
|
67
|
+
...(value.statusCode !== undefined ? { statusCode: value.statusCode } : {}),
|
|
68
|
+
...(value.upstreamMessage !== undefined
|
|
69
|
+
? { upstreamMessage: value.upstreamMessage }
|
|
70
|
+
: {}),
|
|
71
|
+
...(value.details ? { details: value.details } : {}),
|
|
72
|
+
...(value.data !== undefined ? { data: value.data } : {}),
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
export function tryReadToolErrorPayload(value) {
|
|
76
|
+
if (!isObject(value))
|
|
77
|
+
return undefined;
|
|
78
|
+
const structuredContent = toolErrorPayloadSchema.safeParse(value['structuredContent']);
|
|
79
|
+
if (structuredContent.success) {
|
|
80
|
+
return normalizeToolErrorPayload(structuredContent.data);
|
|
81
|
+
}
|
|
82
|
+
const { content } = value;
|
|
83
|
+
if (!Array.isArray(content) || content.length === 0)
|
|
84
|
+
return undefined;
|
|
85
|
+
const firstBlock = content[0];
|
|
86
|
+
if (!isObject(firstBlock))
|
|
87
|
+
return undefined;
|
|
88
|
+
if (firstBlock['type'] !== 'text')
|
|
89
|
+
return undefined;
|
|
90
|
+
if (typeof firstBlock['text'] !== 'string')
|
|
91
|
+
return undefined;
|
|
92
|
+
try {
|
|
93
|
+
const payload = toolErrorPayloadSchema.safeParse(JSON.parse(firstBlock['text']));
|
|
94
|
+
return payload.success
|
|
95
|
+
? normalizeToolErrorPayload(payload.data)
|
|
96
|
+
: undefined;
|
|
97
|
+
}
|
|
98
|
+
catch {
|
|
99
|
+
return undefined;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
export function tryReadToolErrorMessage(value) {
|
|
103
|
+
return tryReadToolErrorPayload(value)?.error;
|
|
104
|
+
}
|
|
105
|
+
const mcpErrorPrefixPattern = /^MCP error -?\d+:\s*/;
|
|
106
|
+
export function stripMcpErrorPrefix(message) {
|
|
107
|
+
return message.replace(mcpErrorPrefixPattern, '');
|
|
108
|
+
}
|
|
@@ -111,5 +111,6 @@ export interface ProgressReporter {
|
|
|
111
111
|
report: (progress: number, message: string, total?: number) => void;
|
|
112
112
|
}
|
|
113
113
|
export declare const createProgressReporter: (extra?: ToolHandlerExtra) => ProgressReporter;
|
|
114
|
+
export declare function validateOrThrow<T>(schema: z.ZodType<T>, data: unknown, errorCode: number, msg: string, logger: string): T;
|
|
114
115
|
export {};
|
|
115
116
|
//# sourceMappingURL=mcp-interop.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-interop.d.ts","sourceRoot":"","sources":["../../src/lib/mcp-interop.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"mcp-interop.d.ts","sourceRoot":"","sources":["../../src/lib/mcp-interop.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/mcp-interop.js
CHANGED
|
@@ -1,10 +1,9 @@
|
|
|
1
|
+
import { ListToolsRequestSchema, ListToolsResultSchema, McpError, } from '@modelcontextprotocol/sdk/types.js';
|
|
1
2
|
import { setTimeout as setTimeoutPromise } from 'node:timers/promises';
|
|
2
|
-
import { ListToolsRequestSchema, ListToolsResultSchema, } from '@modelcontextprotocol/sdk/types.js';
|
|
3
|
-
import { McpError } from '@modelcontextprotocol/sdk/types.js';
|
|
4
3
|
import { z } from 'zod';
|
|
5
|
-
import { logError, logWarn } from './core.js';
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
4
|
+
import { logError, Loggers, logWarn } from './core.js';
|
|
5
|
+
import { getErrorMessage } from './error/index.js';
|
|
6
|
+
import { formatZodError, isObject } from './utils.js';
|
|
8
7
|
export function createMcpError(code, message, data) {
|
|
9
8
|
const error = new McpError(code, message, data);
|
|
10
9
|
error.message = message;
|
|
@@ -98,7 +97,7 @@ function drainServerCleanupCallbacks(server) {
|
|
|
98
97
|
callback();
|
|
99
98
|
}
|
|
100
99
|
catch (error) {
|
|
101
|
-
logWarn('Server cleanup callback failed', { error }, LOG_MCP);
|
|
100
|
+
logWarn('Server cleanup callback failed', { error }, Loggers.LOG_MCP);
|
|
102
101
|
}
|
|
103
102
|
}
|
|
104
103
|
}
|
|
@@ -274,7 +273,7 @@ class ToolProgressReporter {
|
|
|
274
273
|
error: getErrorMessage(error),
|
|
275
274
|
progress: effectiveProgress,
|
|
276
275
|
message,
|
|
277
|
-
}, LOG_MCP);
|
|
276
|
+
}, Loggers.LOG_MCP);
|
|
278
277
|
}
|
|
279
278
|
}
|
|
280
279
|
if (!isIncreasing || this.token === null || !this.handlers.send)
|
|
@@ -336,7 +335,7 @@ class ToolProgressReporter {
|
|
|
336
335
|
logWarn('Progress notification timed out', {
|
|
337
336
|
progress: notification.params.progress,
|
|
338
337
|
message: notification.params.message,
|
|
339
|
-
}, LOG_MCP);
|
|
338
|
+
}, Loggers.LOG_MCP);
|
|
340
339
|
}
|
|
341
340
|
}
|
|
342
341
|
catch (error) {
|
|
@@ -344,7 +343,7 @@ class ToolProgressReporter {
|
|
|
344
343
|
error: getErrorMessage(error),
|
|
345
344
|
progress: notification.params.progress,
|
|
346
345
|
message: notification.params.message,
|
|
347
|
-
}, LOG_MCP);
|
|
346
|
+
}, Loggers.LOG_MCP);
|
|
348
347
|
}
|
|
349
348
|
}
|
|
350
349
|
createProgressNotification(params) {
|
|
@@ -365,3 +364,12 @@ class ToolProgressReporter {
|
|
|
365
364
|
}
|
|
366
365
|
}
|
|
367
366
|
export const createProgressReporter = (extra) => ToolProgressReporter.create(extra);
|
|
367
|
+
export function validateOrThrow(schema, data, errorCode, msg, logger) {
|
|
368
|
+
const result = schema.safeParse(data);
|
|
369
|
+
if (!result.success) {
|
|
370
|
+
const issues = formatZodError(result.error);
|
|
371
|
+
logWarn(`Zod validation failed: ${msg}`, { issues }, logger);
|
|
372
|
+
throw createMcpError(errorCode, msg, { issues });
|
|
373
|
+
}
|
|
374
|
+
return result.data;
|
|
375
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../../src/lib/net/http.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,KAAK,EAAmB,MAAM,QAAQ,CAAC;AAwBhD,OAAO,EAQL,KAAK,eAAe,EAErB,MAAM,UAAU,CAAC;AAywClB,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"}
|
|
@@ -7,13 +7,10 @@ import {} from 'node:stream/web';
|
|
|
7
7
|
import tls from 'node:tls';
|
|
8
8
|
import { createBrotliDecompress, createGunzip, createInflate } from 'node:zlib';
|
|
9
9
|
import { Agent } from 'undici';
|
|
10
|
-
import { config, getOperationId, getRequestId, logDebug, logError, logWarn, redactUrl, } from '
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
14
|
-
import { isIP } from './url.js';
|
|
15
|
-
import { BLOCKED_HOST_SUFFIXES, createDnsPreflight, IpBlocker, RawUrlTransformer, SafeDnsResolver, UrlNormalizer, } from './url.js';
|
|
16
|
-
import { composeAbortSignal, FetchError, isAbortError, isError, isObject, isSystemError, toError, } from './utils.js';
|
|
10
|
+
import { config, getOperationId, getRequestId, logDebug, logError, Loggers, logWarn, redactUrl, } from '../core.js';
|
|
11
|
+
import { FetchError, invalidRedirectError, isAbortError, isError, isSystemError, redirectCredentialsError, SystemErrors, toError, unsupportedProtocolError, } from '../error/index.js';
|
|
12
|
+
import { composeAbortSignal, isObject } from '../utils.js';
|
|
13
|
+
import { BLOCKED_HOST_SUFFIXES, createDnsPreflight, IpBlocker, isIP, RawUrlTransformer, SafeDnsResolver, UrlNormalizer, } from './url.js';
|
|
17
14
|
// ═══════════════════════════════════════════════════════════════════
|
|
18
15
|
// ENCODING DETECTION
|
|
19
16
|
// ═══════════════════════════════════════════════════════════════════
|
|
@@ -325,11 +322,11 @@ function resolveErrorUrl(error, fallback) {
|
|
|
325
322
|
return typeof requestUrl === 'string' ? requestUrl : fallback;
|
|
326
323
|
}
|
|
327
324
|
const CLIENT_ERROR_CODES = new Set([
|
|
328
|
-
VALIDATION_ERROR,
|
|
329
|
-
EBADREDIRECT,
|
|
330
|
-
EBLOCKED,
|
|
331
|
-
ENODATA,
|
|
332
|
-
EINVAL,
|
|
325
|
+
SystemErrors.VALIDATION_ERROR,
|
|
326
|
+
SystemErrors.EBADREDIRECT,
|
|
327
|
+
SystemErrors.EBLOCKED,
|
|
328
|
+
SystemErrors.ENODATA,
|
|
329
|
+
SystemErrors.EINVAL,
|
|
333
330
|
]);
|
|
334
331
|
function mapAbortError(error, timeoutMs, url) {
|
|
335
332
|
return isTimeoutError(error)
|
|
@@ -338,7 +335,7 @@ function mapAbortError(error, timeoutMs, url) {
|
|
|
338
335
|
}
|
|
339
336
|
function mapSystemError(error, url) {
|
|
340
337
|
const { code, message } = error;
|
|
341
|
-
if (code ===
|
|
338
|
+
if (code === SystemErrors.ETIMEOUT) {
|
|
342
339
|
const fetchError = new FetchError(message, url, 504, { code });
|
|
343
340
|
return fetchError;
|
|
344
341
|
}
|
|
@@ -567,7 +564,7 @@ function assertSupportedContentType(contentType, url) {
|
|
|
567
564
|
if (!mediaType) {
|
|
568
565
|
logDebug('No Content-Type header; relying on binary-content detection', {
|
|
569
566
|
url: redactUrl(url),
|
|
570
|
-
}, LOG_FETCH);
|
|
567
|
+
}, Loggers.LOG_FETCH);
|
|
571
568
|
return;
|
|
572
569
|
}
|
|
573
570
|
if (!isTextLikeMediaType(mediaType)) {
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/net/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,cAAc,UAAU,CAAC;AACzB,cAAc,eAAe,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { type MarkdownTransformResult } from '
|
|
2
|
-
import { withSignal } from '
|
|
1
|
+
import { type MarkdownTransformResult } from '../../transform/index.js';
|
|
2
|
+
import { withSignal } from '../utils.js';
|
|
3
3
|
export { withSignal };
|
|
4
4
|
export interface InlineContentResult {
|
|
5
5
|
content?: string;
|
|
@@ -46,4 +46,4 @@ export declare function performSharedFetch(options: MarkdownFetchOptions, deps?:
|
|
|
46
46
|
pipeline: PipelineResult<MarkdownPipelineResult>;
|
|
47
47
|
inlineResult: InlineContentResult;
|
|
48
48
|
}>;
|
|
49
|
-
//# sourceMappingURL=
|
|
49
|
+
//# sourceMappingURL=pipeline.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pipeline.d.ts","sourceRoot":"","sources":["../../../src/lib/net/pipeline.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,uBAAuB,EAE7B,MAAM,0BAA0B,CAAC;AAElC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAOzC,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,CAqD5B;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"}
|