@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.
Files changed (146) hide show
  1. package/dist/http/auth.d.ts +2 -2
  2. package/dist/http/auth.d.ts.map +1 -1
  3. package/dist/http/auth.js +15 -16
  4. package/dist/http/index.d.ts +6 -0
  5. package/dist/http/index.d.ts.map +1 -0
  6. package/dist/http/index.js +5 -0
  7. package/dist/http/native.d.ts +73 -0
  8. package/dist/http/native.d.ts.map +1 -1
  9. package/dist/http/native.js +585 -62
  10. package/dist/http/rate-limit.d.ts +1 -1
  11. package/dist/http/rate-limit.d.ts.map +1 -1
  12. package/dist/http/rate-limit.js +5 -6
  13. package/dist/index.d.ts +17 -0
  14. package/dist/index.d.ts.map +1 -1
  15. package/dist/index.js +69 -8
  16. package/dist/lib/config.js +2 -2
  17. package/dist/lib/core.d.ts +56 -4
  18. package/dist/lib/core.d.ts.map +1 -1
  19. package/dist/lib/core.js +162 -11
  20. package/dist/lib/error/classes.d.ts +19 -0
  21. package/dist/lib/error/classes.d.ts.map +1 -0
  22. package/dist/lib/error/classes.js +107 -0
  23. package/dist/lib/error/classify.d.ts +4 -0
  24. package/dist/lib/error/classify.d.ts.map +1 -0
  25. package/dist/lib/error/classify.js +154 -0
  26. package/dist/lib/error/codes.d.ts +23 -0
  27. package/dist/lib/error/codes.d.ts.map +1 -0
  28. package/dist/lib/error/codes.js +22 -0
  29. package/dist/lib/error/index.d.ts +6 -0
  30. package/dist/lib/error/index.d.ts.map +1 -0
  31. package/dist/lib/error/index.js +5 -0
  32. package/dist/lib/{error-messages.d.ts → error/messages.d.ts} +2 -2
  33. package/dist/lib/error/messages.d.ts.map +1 -0
  34. package/dist/lib/{error-messages.js → error/messages.js} +13 -13
  35. package/dist/lib/{tool-errors.d.ts → error/payload.d.ts} +7 -13
  36. package/dist/lib/error/payload.d.ts.map +1 -0
  37. package/dist/lib/error/payload.js +108 -0
  38. package/dist/lib/mcp-interop.d.ts +1 -0
  39. package/dist/lib/mcp-interop.d.ts.map +1 -1
  40. package/dist/lib/mcp-interop.js +17 -9
  41. package/dist/lib/net/http.d.ts.map +1 -0
  42. package/dist/lib/{http.js → net/http.js} +11 -14
  43. package/dist/lib/net/index.d.ts +4 -0
  44. package/dist/lib/net/index.d.ts.map +1 -0
  45. package/dist/lib/net/index.js +3 -0
  46. package/dist/lib/{fetch-pipeline.d.ts → net/pipeline.d.ts} +3 -3
  47. package/dist/lib/net/pipeline.d.ts.map +1 -0
  48. package/dist/lib/{fetch-pipeline.js → net/pipeline.js} +7 -9
  49. package/dist/lib/{url.d.ts → net/url.d.ts} +2 -2
  50. package/dist/lib/net/url.d.ts.map +1 -0
  51. package/dist/lib/{url.js → net/url.js} +6 -8
  52. package/dist/lib/utils.d.ts +3 -18
  53. package/dist/lib/utils.d.ts.map +1 -1
  54. package/dist/lib/utils.js +33 -105
  55. package/dist/resources/index.d.ts.map +1 -1
  56. package/dist/resources/index.js +6 -3
  57. package/dist/schemas.d.ts +1 -1
  58. package/dist/server.d.ts.map +1 -1
  59. package/dist/server.js +12 -14
  60. package/dist/tasks/index.d.ts +2 -0
  61. package/dist/tasks/index.d.ts.map +1 -0
  62. package/dist/tasks/index.js +1 -0
  63. package/dist/tasks/manager.d.ts +123 -1
  64. package/dist/tasks/manager.d.ts.map +1 -1
  65. package/dist/tasks/manager.js +753 -18
  66. package/dist/tools/{fetch-url.d.ts → index.d.ts} +4 -5
  67. package/dist/tools/index.d.ts.map +1 -0
  68. package/dist/tools/{fetch-url.js → index.js} +14 -31
  69. package/dist/transform/index.d.ts +279 -0
  70. package/dist/transform/index.d.ts.map +1 -0
  71. package/dist/transform/index.js +5234 -0
  72. package/package.json +2 -2
  73. package/dist/cli.d.ts +0 -19
  74. package/dist/cli.d.ts.map +0 -1
  75. package/dist/cli.js +0 -65
  76. package/dist/http/health.d.ts +0 -8
  77. package/dist/http/health.d.ts.map +0 -1
  78. package/dist/http/health.js +0 -152
  79. package/dist/http/helpers.d.ts +0 -68
  80. package/dist/http/helpers.d.ts.map +0 -1
  81. package/dist/http/helpers.js +0 -404
  82. package/dist/lib/error-codes.d.ts +0 -11
  83. package/dist/lib/error-codes.d.ts.map +0 -1
  84. package/dist/lib/error-codes.js +0 -15
  85. package/dist/lib/error-messages.d.ts.map +0 -1
  86. package/dist/lib/fetch-pipeline.d.ts.map +0 -1
  87. package/dist/lib/http.d.ts.map +0 -1
  88. package/dist/lib/logger-names.d.ts +0 -14
  89. package/dist/lib/logger-names.d.ts.map +0 -1
  90. package/dist/lib/logger-names.js +0 -13
  91. package/dist/lib/session.d.ts +0 -44
  92. package/dist/lib/session.d.ts.map +0 -1
  93. package/dist/lib/session.js +0 -137
  94. package/dist/lib/tool-errors.d.ts.map +0 -1
  95. package/dist/lib/tool-errors.js +0 -252
  96. package/dist/lib/url.d.ts.map +0 -1
  97. package/dist/lib/zod.d.ts +0 -3
  98. package/dist/lib/zod.d.ts.map +0 -1
  99. package/dist/lib/zod.js +0 -27
  100. package/dist/tasks/call-contract.d.ts +0 -25
  101. package/dist/tasks/call-contract.d.ts.map +0 -1
  102. package/dist/tasks/call-contract.js +0 -59
  103. package/dist/tasks/execution.d.ts +0 -16
  104. package/dist/tasks/execution.d.ts.map +0 -1
  105. package/dist/tasks/execution.js +0 -241
  106. package/dist/tasks/handlers.d.ts +0 -11
  107. package/dist/tasks/handlers.d.ts.map +0 -1
  108. package/dist/tasks/handlers.js +0 -157
  109. package/dist/tasks/owner.d.ts +0 -43
  110. package/dist/tasks/owner.d.ts.map +0 -1
  111. package/dist/tasks/owner.js +0 -144
  112. package/dist/tasks/registry.d.ts +0 -20
  113. package/dist/tasks/registry.d.ts.map +0 -1
  114. package/dist/tasks/registry.js +0 -40
  115. package/dist/tasks/waiters.d.ts +0 -27
  116. package/dist/tasks/waiters.d.ts.map +0 -1
  117. package/dist/tasks/waiters.js +0 -114
  118. package/dist/tools/fetch-url.d.ts.map +0 -1
  119. package/dist/transform/dom-prep.d.ts +0 -16
  120. package/dist/transform/dom-prep.d.ts.map +0 -1
  121. package/dist/transform/dom-prep.js +0 -1287
  122. package/dist/transform/html-translators.d.ts +0 -5
  123. package/dist/transform/html-translators.d.ts.map +0 -1
  124. package/dist/transform/html-translators.js +0 -697
  125. package/dist/transform/markdown-cleanup.d.ts +0 -10
  126. package/dist/transform/markdown-cleanup.d.ts.map +0 -1
  127. package/dist/transform/markdown-cleanup.js +0 -542
  128. package/dist/transform/metadata.d.ts +0 -18
  129. package/dist/transform/metadata.d.ts.map +0 -1
  130. package/dist/transform/metadata.js +0 -462
  131. package/dist/transform/next-flight.d.ts +0 -2
  132. package/dist/transform/next-flight.d.ts.map +0 -1
  133. package/dist/transform/next-flight.js +0 -374
  134. package/dist/transform/shared.d.ts +0 -8
  135. package/dist/transform/shared.d.ts.map +0 -1
  136. package/dist/transform/shared.js +0 -137
  137. package/dist/transform/transform.d.ts +0 -38
  138. package/dist/transform/transform.d.ts.map +0 -1
  139. package/dist/transform/transform.js +0 -1041
  140. package/dist/transform/types.d.ts +0 -124
  141. package/dist/transform/types.d.ts.map +0 -1
  142. package/dist/transform/types.js +0 -5
  143. package/dist/transform/worker-pool.d.ts +0 -76
  144. package/dist/transform/worker-pool.d.ts.map +0 -1
  145. package/dist/transform/worker-pool.js +0 -725
  146. /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,6 @@
1
+ export * from './codes.js';
2
+ export * from './classes.js';
3
+ export * from './payload.js';
4
+ export * from './messages.js';
5
+ export * from './classify.js';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -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"}
@@ -0,0 +1,5 @@
1
+ export * from './codes.js';
2
+ export * from './classes.js';
3
+ export * from './payload.js';
4
+ export * from './messages.js';
5
+ export * from './classify.js';
@@ -1,4 +1,4 @@
1
- import { CodedError } from './utils.js';
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=error-messages.d.ts.map
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 { EBADREDIRECT, EBLOCKED, EINVAL, ENODATA, ETIMEOUT, EUNSUPPORTEDPROTOCOL, } from './error-codes.js';
2
- import { CodedError } from './utils.js';
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 declare function createToolErrorResponse(message: string, url: string, extra?: {
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
- }): ToolErrorResponse;
27
- export declare function createToolErrorPayload(message: string, url: string, extra?: {
28
- category?: string;
29
- code?: string | number;
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 handleToolError(error: unknown, url: string, fallbackMessage?: string): ToolErrorResponse;
38
- export declare function classifyAndLogToolError(error: unknown, meta: ToolErrorLogMeta, loggerName: string, toolName: string, fallbackMessage: string): ToolErrorResponse;
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":"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"}
1
+ {"version":3,"file":"mcp-interop.d.ts","sourceRoot":"","sources":["../../src/lib/mcp-interop.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,EAGL,QAAQ,EACT,MAAM,oCAAoC,CAAC;AAI5C,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAMxB,wBAAgB,cAAc,CAC5B,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,IAAI,CAAC,EAAE,OAAO,GACb,QAAQ,CAIV;AAMD,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;AAK/C,QAAA,MAAM,oBAAoB;;;;;;;kBAKxB,CAAC;AAeH,QAAA,MAAM,qBAAqB;;;;;;;;;;;;oBAGzB,CAAC;AACH,QAAA,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;sBAGxB,CAAC;AACH,KAAK,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAC3D,KAAK,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AACjE,KAAK,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAC/D,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAE5D;AACD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,IAAI,cAAc,CAEtE;AACD,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,OAAO,GACZ,IAAI,IAAI,mBAAmB,CAE7B;AACD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,IAAI,kBAAkB,CAE1E;AAUD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAG7E;AACD,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAChC,OAAO,CAUT;AAMD,KAAK,eAAe,GAAG,MAAM,IAAI,CAAC;AAClC,KAAK,gBAAgB,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;AAChF,UAAU,gBAAgB;IACxB,KAAK,CAAC,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,EAAE,CAAC;CAChE;AAsDD,wBAAgB,8BAA8B,CAC5C,MAAM,EAAE,SAAS,EACjB,QAAQ,EAAE,eAAe,GACxB,IAAI,CAGN;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,SAAS,GAChB,gBAAgB,GAAG,IAAI,CAMzB;AAUD;;;;;GAKG;AACH,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,SAAS,EACjB,OAAO,EAAE,OAAO,GACf,IAAI,CAgBN;AAyDD,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,SAAS,EACjB,IAAI,EAAE,MAAM,EACZ,YAAY,EAAE,gBAAgB,GAC7B,IAAI,CAGN;AAMD,KAAK,aAAa,GAAG,MAAM,GAAG,MAAM,CAAC;AAErC,UAAU,WAAW;IACnB,aAAa,CAAC,EAAE,aAAa,GAAG,SAAS,CAAC;IAC1C,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,0BAA0B;IACzC,aAAa,EAAE,aAAa,CAAC;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjC;AAED,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,wBAAwB,CAAC;IACjC,MAAM,EAAE,0BAA0B,CAAC;CACpC;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC5B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,aAAa,CAAC,EAAE;QAAE,MAAM,EAAE,OAAO,CAAA;KAAE,CAAC;IACpC,gBAAgB,CAAC,EAAE,CAAC,YAAY,EAAE,oBAAoB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACzE,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACzE,iBAAiB,CAAC,EAAE,MAAM,OAAO,CAAC;CACnC;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;CACrE;AAiND,eAAO,MAAM,sBAAsB,GACjC,QAAQ,gBAAgB,KACvB,gBAAsD,CAAC;AAE1D,wBAAgB,eAAe,CAAC,CAAC,EAC/B,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EACpB,IAAI,EAAE,OAAO,EACb,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,GACb,CAAC,CAQH"}
@@ -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 { LOG_MCP } from './logger-names.js';
7
- import { getErrorMessage, isObject } from './utils.js';
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 './core.js';
11
- import { EBADREDIRECT, EBLOCKED, EINVAL, ENODATA, VALIDATION_ERROR, } from './error-codes.js';
12
- import { invalidRedirectError, redirectCredentialsError, unsupportedProtocolError, } from './error-messages.js';
13
- import { LOG_FETCH } from './logger-names.js';
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 === 'ETIMEOUT') {
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,4 @@
1
+ export * from './http.js';
2
+ export * from './url.js';
3
+ export * from './pipeline.js';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -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"}
@@ -0,0 +1,3 @@
1
+ export * from './http.js';
2
+ export * from './url.js';
3
+ export * from './pipeline.js';
@@ -1,5 +1,5 @@
1
- import { type MarkdownTransformResult } from '../transform/types.js';
2
- import { withSignal } from './utils.js';
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=fetch-pipeline.d.ts.map
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"}