@zimic/interceptor 0.14.0-canary.23 → 0.14.0-canary.25
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/{chunk-BJLJWEVE.js → chunk-3623PRKE.js} +20 -20
- package/dist/chunk-3623PRKE.js.map +1 -0
- package/dist/{chunk-QSY6YMZ7.mjs → chunk-FEGMEAEO.mjs} +20 -20
- package/dist/chunk-FEGMEAEO.mjs.map +1 -0
- package/dist/cli.js +16 -16
- package/dist/cli.js.map +1 -1
- package/dist/cli.mjs +11 -11
- package/dist/cli.mjs.map +1 -1
- package/dist/http.d.ts +14 -2
- package/dist/http.js +35 -31
- package/dist/http.js.map +1 -1
- package/dist/http.mjs +35 -31
- package/dist/http.mjs.map +1 -1
- package/dist/server.js +5 -5
- package/dist/server.mjs +1 -1
- package/package.json +9 -9
- package/src/http/interceptorWorker/LocalHttpInterceptorWorker.ts +3 -3
- package/src/http/interceptorWorker/RemoteHttpInterceptorWorker.ts +3 -6
- package/src/utils/environment.ts +5 -1
- package/dist/chunk-BJLJWEVE.js.map +0 -1
- package/dist/chunk-QSY6YMZ7.mjs.map +0 -1
|
@@ -16,12 +16,12 @@ var ClientSocket__default = /*#__PURE__*/_interopDefault(ClientSocket);
|
|
|
16
16
|
var __defProp = Object.defineProperty;
|
|
17
17
|
var __name2 = /* @__PURE__ */ chunkWCQVDF3K_js.__name((target, value) => __defProp(target, "name", { value, configurable: true }), "__name");
|
|
18
18
|
|
|
19
|
-
// ../zimic-utils/dist/chunk-
|
|
19
|
+
// ../zimic-utils/dist/chunk-RIVHLEFF.mjs
|
|
20
20
|
var URL_PATH_PARAM_REGEX = /\/:([^/]+)/g;
|
|
21
21
|
function createRegExpFromURL(url) {
|
|
22
22
|
URL_PATH_PARAM_REGEX.lastIndex = 0;
|
|
23
|
-
const urlWithReplacedPathParams = encodeURI(url).replace(/([.()*?+$\\])/g, "\\$1").replace(URL_PATH_PARAM_REGEX, "/(?<$1>[^/]+)").replace(
|
|
24
|
-
return new RegExp(
|
|
23
|
+
const urlWithReplacedPathParams = encodeURI(url).replace(/([.()*?+$\\])/g, "\\$1").replace(URL_PATH_PARAM_REGEX, "/(?<$1>[^/]+)").replace(/^(\/)|(\/)$/g, "");
|
|
24
|
+
return new RegExp(`^(?:/)?${urlWithReplacedPathParams}(?:/)?$`);
|
|
25
25
|
}
|
|
26
26
|
chunkWCQVDF3K_js.__name(createRegExpFromURL, "createRegExpFromURL");
|
|
27
27
|
__name2(createRegExpFromURL, "createRegExpFromURL");
|
|
@@ -41,7 +41,7 @@ var excludeURLParams_default = excludeURLParams;
|
|
|
41
41
|
|
|
42
42
|
// ../zimic-utils/dist/chunk-3O5CS47X.mjs
|
|
43
43
|
function isDefined(value) {
|
|
44
|
-
return value !==
|
|
44
|
+
return value !== void 0 && value !== null;
|
|
45
45
|
}
|
|
46
46
|
chunkWCQVDF3K_js.__name(isDefined, "isDefined");
|
|
47
47
|
__name2(isDefined, "isDefined");
|
|
@@ -65,7 +65,7 @@ chunkWCQVDF3K_js.__name(removeArrayElement, "removeArrayElement");
|
|
|
65
65
|
function createCachedDynamicImport(importModuleDynamically) {
|
|
66
66
|
let cachedImportResult;
|
|
67
67
|
return /* @__PURE__ */ __name2(/* @__PURE__ */ chunkWCQVDF3K_js.__name(async function importModuleDynamicallyWithCache() {
|
|
68
|
-
if (cachedImportResult ===
|
|
68
|
+
if (cachedImportResult === void 0) {
|
|
69
69
|
cachedImportResult = await importModuleDynamically();
|
|
70
70
|
}
|
|
71
71
|
return cachedImportResult;
|
|
@@ -77,7 +77,7 @@ var createCachedDynamicImport_default = createCachedDynamicImport;
|
|
|
77
77
|
|
|
78
78
|
// src/utils/environment.ts
|
|
79
79
|
function isClientSide() {
|
|
80
|
-
return typeof window !== "undefined";
|
|
80
|
+
return typeof window !== "undefined" && typeof document !== "undefined";
|
|
81
81
|
}
|
|
82
82
|
chunkWCQVDF3K_js.__name(isClientSide, "isClientSide");
|
|
83
83
|
|
|
@@ -186,7 +186,7 @@ chunkWCQVDF3K_js.__name(stopHttpServer, "stopHttpServer");
|
|
|
186
186
|
function getHttpServerPort(server) {
|
|
187
187
|
const address = server.address();
|
|
188
188
|
if (typeof address === "string") {
|
|
189
|
-
return
|
|
189
|
+
return void 0;
|
|
190
190
|
} else {
|
|
191
191
|
return address?.port;
|
|
192
192
|
}
|
|
@@ -329,7 +329,7 @@ var HttpInterceptorWorker = class _HttpInterceptorWorker {
|
|
|
329
329
|
this.stoppingPromise = stoppingResult;
|
|
330
330
|
await this.stoppingPromise;
|
|
331
331
|
}
|
|
332
|
-
this.stoppingPromise =
|
|
332
|
+
this.stoppingPromise = void 0;
|
|
333
333
|
}
|
|
334
334
|
async logUnhandledRequestIfNecessary(request, strategy) {
|
|
335
335
|
if (strategy?.log) {
|
|
@@ -414,7 +414,7 @@ var HttpInterceptorWorker = class _HttpInterceptorWorker {
|
|
|
414
414
|
if (!canHaveBody) {
|
|
415
415
|
return new Response(null, { headers, status });
|
|
416
416
|
}
|
|
417
|
-
if (typeof declaration.body === "string" || declaration.body ===
|
|
417
|
+
if (typeof declaration.body === "string" || declaration.body === void 0 || declaration.body instanceof FormData || declaration.body instanceof URLSearchParams || declaration.body instanceof Blob || declaration.body instanceof ArrayBuffer) {
|
|
418
418
|
return new Response(declaration.body ?? null, { headers, status });
|
|
419
419
|
}
|
|
420
420
|
return Response.json(declaration.body, { headers, status });
|
|
@@ -441,7 +441,7 @@ var HttpInterceptorWorker = class _HttpInterceptorWorker {
|
|
|
441
441
|
},
|
|
442
442
|
get(target, property) {
|
|
443
443
|
if (_HttpInterceptorWorker.isHiddenRequestProperty(property)) {
|
|
444
|
-
return
|
|
444
|
+
return void 0;
|
|
445
445
|
}
|
|
446
446
|
return Reflect.get(target, property, target);
|
|
447
447
|
}
|
|
@@ -495,7 +495,7 @@ var HttpInterceptorWorker = class _HttpInterceptorWorker {
|
|
|
495
495
|
},
|
|
496
496
|
get(target, property) {
|
|
497
497
|
if (_HttpInterceptorWorker.isHiddenResponseProperty(property)) {
|
|
498
|
-
return
|
|
498
|
+
return void 0;
|
|
499
499
|
}
|
|
500
500
|
return Reflect.get(target, property, target);
|
|
501
501
|
}
|
|
@@ -1101,7 +1101,7 @@ var WebSocketServer = class extends WebSocketHandler_default {
|
|
|
1101
1101
|
this.httpServer = options.httpServer;
|
|
1102
1102
|
}
|
|
1103
1103
|
isRunning() {
|
|
1104
|
-
return this.webSocketServer !==
|
|
1104
|
+
return this.webSocketServer !== void 0;
|
|
1105
1105
|
}
|
|
1106
1106
|
start() {
|
|
1107
1107
|
if (this.isRunning()) {
|
|
@@ -1129,7 +1129,7 @@ var WebSocketServer = class extends WebSocketHandler_default {
|
|
|
1129
1129
|
await super.closeClientSockets();
|
|
1130
1130
|
await closeServerSocket(this.webSocketServer, { timeout: this.socketTimeout() });
|
|
1131
1131
|
this.webSocketServer.removeAllListeners();
|
|
1132
|
-
this.webSocketServer =
|
|
1132
|
+
this.webSocketServer = void 0;
|
|
1133
1133
|
}
|
|
1134
1134
|
};
|
|
1135
1135
|
var WebSocketServer_default = WebSocketServer;
|
|
@@ -1219,8 +1219,8 @@ var InterceptorServer = class {
|
|
|
1219
1219
|
return this._logUnhandledRequests;
|
|
1220
1220
|
}
|
|
1221
1221
|
httpURL() {
|
|
1222
|
-
if (this._port ===
|
|
1223
|
-
return
|
|
1222
|
+
if (this._port === void 0) {
|
|
1223
|
+
return void 0;
|
|
1224
1224
|
}
|
|
1225
1225
|
return `http://${this._hostname}:${this._port}`;
|
|
1226
1226
|
}
|
|
@@ -1277,7 +1277,7 @@ var InterceptorServer = class {
|
|
|
1277
1277
|
resetWorker = /* @__PURE__ */ chunkWCQVDF3K_js.__name((message, socket) => {
|
|
1278
1278
|
this.removeHttpHandlersBySocket(socket);
|
|
1279
1279
|
const handlersToResetTo = message.data;
|
|
1280
|
-
const isWorkerNoLongerCommitted = handlersToResetTo ===
|
|
1280
|
+
const isWorkerNoLongerCommitted = handlersToResetTo === void 0;
|
|
1281
1281
|
if (isWorkerNoLongerCommitted) {
|
|
1282
1282
|
this.webSocketServer().abortSocketMessages([socket]);
|
|
1283
1283
|
} else {
|
|
@@ -1328,14 +1328,14 @@ var InterceptorServer = class {
|
|
|
1328
1328
|
const httpServer = this.httpServer();
|
|
1329
1329
|
await stopHttpServer(httpServer);
|
|
1330
1330
|
httpServer.removeAllListeners();
|
|
1331
|
-
this._httpServer =
|
|
1331
|
+
this._httpServer = void 0;
|
|
1332
1332
|
}
|
|
1333
1333
|
async stopWebSocketServer() {
|
|
1334
1334
|
const webSocketServer = this.webSocketServer();
|
|
1335
1335
|
webSocketServer.offEvent("interceptors/workers/use/commit", this.commitWorker);
|
|
1336
1336
|
webSocketServer.offEvent("interceptors/workers/use/reset", this.resetWorker);
|
|
1337
1337
|
await webSocketServer.stop();
|
|
1338
|
-
this._webSocketServer =
|
|
1338
|
+
this._webSocketServer = void 0;
|
|
1339
1339
|
}
|
|
1340
1340
|
handleHttpRequest = /* @__PURE__ */ chunkWCQVDF3K_js.__name(async (nodeRequest, nodeResponse) => {
|
|
1341
1341
|
const request = server.normalizeNodeRequest(nodeRequest, await getFetchAPI());
|
|
@@ -1494,5 +1494,5 @@ exports.NotStartedInterceptorServerError_default = NotStartedInterceptorServerEr
|
|
|
1494
1494
|
exports.createCachedDynamicImport_default = createCachedDynamicImport_default;
|
|
1495
1495
|
exports.interceptorServer = interceptorServer;
|
|
1496
1496
|
exports.logWithPrefix = logWithPrefix;
|
|
1497
|
-
//# sourceMappingURL=chunk-
|
|
1498
|
-
//# sourceMappingURL=chunk-
|
|
1497
|
+
//# sourceMappingURL=chunk-3623PRKE.js.map
|
|
1498
|
+
//# sourceMappingURL=chunk-3623PRKE.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../zimic-utils/dist/chunk-PAWJFY3S.mjs","../../zimic-utils/src/url/createRegExpFromURL.ts","../../zimic-utils/src/url/excludeURLParams.ts","../../zimic-utils/src/data/isDefined.ts","../src/utils/arrays.ts","../../zimic-utils/src/import/createCachedDynamicImport.ts","../src/utils/environment.ts","../src/utils/files.ts","../src/utils/console.ts","../src/utils/http.ts","../src/http/requestHandler/types/requests.ts","../src/http/interceptorWorker/constants.ts","../src/http/interceptorWorker/errors/InvalidFormDataError.ts","../src/http/interceptorWorker/errors/InvalidJSONError.ts","../src/http/interceptorWorker/HttpInterceptorWorkerStore.ts","../src/http/interceptorWorker/HttpInterceptorWorker.ts","../src/utils/data.ts","../src/utils/fetch.ts","../src/utils/webSocket.ts","../src/utils/crypto.ts","../src/webSocket/errors/InvalidWebSocketMessage.ts","../src/webSocket/errors/NotStartedWebSocketHandlerError.ts","../src/webSocket/WebSocketHandler.ts","../src/webSocket/WebSocketServer.ts","../src/server/constants.ts","../src/server/errors/NotStartedInterceptorServerError.ts","../src/server/utils/fetch.ts","../src/server/InterceptorServer.ts","../src/server/factory.ts","../src/server/namespace/InterceptorServerNamespace.ts","../src/server/index.ts"],"names":["__name","chalk","HTTP_METHODS_WITH_RESPONSE_BODY","interceptor","HttpHeaders","HttpSearchParams","HttpFormData","ClientSocket","HTTP_METHODS","createServer","normalizeNodeRequest","sendNodeResponse","handler"],"mappings":"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","file":"chunk-3623PRKE.js","sourcesContent":["var __defProp = Object.defineProperty;\nvar __name = (target, value) => __defProp(target, \"name\", { value, configurable: true });\n\nexport { __name };\n//# sourceMappingURL=chunk-PAWJFY3S.mjs.map\n//# sourceMappingURL=chunk-PAWJFY3S.mjs.map","export const URL_PATH_PARAM_REGEX = /\\/:([^/]+)/g;\n\nfunction createRegExpFromURL(url: string) {\n URL_PATH_PARAM_REGEX.lastIndex = 0;\n\n const urlWithReplacedPathParams = encodeURI(url)\n .replace(/([.()*?+$\\\\])/g, '\\\\$1')\n .replace(URL_PATH_PARAM_REGEX, '/(?<$1>[^/]+)')\n .replace(/^(\\/)|(\\/)$/g, '');\n\n return new RegExp(`^(?:/)?${urlWithReplacedPathParams}(?:/)?$`);\n}\n\nexport default createRegExpFromURL;\n","function excludeURLParams(url: URL) {\n url.hash = '';\n url.search = '';\n url.username = '';\n url.password = '';\n return url;\n}\n\nexport default excludeURLParams;\n","function isDefined<Value>(value: Value): value is NonNullable<Value> {\n return value !== undefined && value !== null;\n}\n\nexport default isDefined;\n","export function removeArrayIndex<Item>(array: Item[], index: number) {\n if (index >= 0 && index < array.length) {\n array.splice(index, 1);\n }\n return array;\n}\n\nexport function removeArrayElement<Item>(array: Item[], element: Item) {\n const index = array.indexOf(element);\n return removeArrayIndex(array, index);\n}\n","function createCachedDynamicImport<ImportType>(\n importModuleDynamically: () => Promise<ImportType>,\n): () => Promise<ImportType> {\n let cachedImportResult: ImportType | undefined;\n\n return async function importModuleDynamicallyWithCache() {\n if (cachedImportResult === undefined) {\n cachedImportResult = await importModuleDynamically();\n }\n return cachedImportResult;\n };\n}\n\nexport default createCachedDynamicImport;\n","export function isServerSide() {\n return typeof process !== 'undefined' && typeof process.versions !== 'undefined';\n}\n\nexport function isClientSide() {\n return typeof window !== 'undefined' && typeof document !== 'undefined';\n}\n","import createCachedDynamicImport from '@zimic/utils/import/createCachedDynamicImport';\n\nexport const importFile = createCachedDynamicImport(\n /* istanbul ignore next -- @preserve\n * Ignoring as Node.js >=20 provides a global File and the import fallback won't run. */\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n async () => globalThis.File ?? (await import('buffer')).File,\n);\n\nexport function isGlobalFileAvailable() {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n return globalThis.File !== undefined;\n}\n","import { HttpFormData, HttpHeaders, HttpSearchParams } from '@zimic/http';\nimport createCachedDynamicImport from '@zimic/utils/import/createCachedDynamicImport';\nimport chalk from 'chalk';\n\nimport { isClientSide } from './environment';\nimport { isGlobalFileAvailable } from './files';\n\nfunction stringifyJSONToLog(value: unknown): string {\n return JSON.stringify(\n value,\n (_key, value) => {\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n return stringifyValueToLog(value, {\n fallback: (value) => value as string,\n });\n },\n 2,\n )\n .replace(/\\n\\s*/g, ' ')\n .replace(/\"(File { name: '.*?', type: '.*?', size: \\d*? })\"/g, '$1')\n .replace(/\"(Blob { type: '.*?', size: \\d*? })\"/g, '$1');\n}\n\nexport function stringifyValueToLog(\n value: unknown,\n options: {\n fallback?: (value: unknown) => string;\n includeClassName?: { searchParams?: boolean };\n } = {},\n): string {\n const { fallback = stringifyJSONToLog, includeClassName } = options;\n\n if (value === null || value === undefined || typeof value !== 'object') {\n return String(value);\n }\n\n if (value instanceof HttpHeaders) {\n return stringifyValueToLog(value.toObject());\n }\n\n if (value instanceof HttpHeaders || value instanceof HttpSearchParams) {\n const prefix = (includeClassName?.searchParams ?? false) ? 'URLSearchParams ' : '';\n return `${prefix}${stringifyValueToLog(value.toObject())}`;\n }\n\n if (value instanceof HttpFormData) {\n return `FormData ${stringifyValueToLog(value.toObject())}`;\n }\n\n if (isGlobalFileAvailable() && value instanceof File) {\n return `File { name: '${value.name}', type: '${value.type}', size: ${value.size} }`;\n }\n\n if (value instanceof Blob) {\n return `Blob { type: '${value.type}', size: ${value.size} }`;\n }\n\n return fallback(value);\n}\n\nconst importUtil = createCachedDynamicImport(() => import('util'));\n\nexport async function formatValueToLog(value: unknown, options: { colors?: boolean } = {}) {\n if (isClientSide()) {\n return value;\n }\n\n const { colors = true } = options;\n\n const util = await importUtil();\n\n return util.inspect(value, {\n colors,\n compact: true,\n depth: Infinity,\n maxArrayLength: Infinity,\n maxStringLength: Infinity,\n breakLength: Infinity,\n sorted: true,\n });\n}\n\nexport function logWithPrefix(messageOrMessages: unknown, options: { method?: 'log' | 'warn' | 'error' } = {}) {\n const { method = 'log' } = options;\n\n const messages = Array.isArray(messageOrMessages) ? messageOrMessages : [messageOrMessages];\n console[method](chalk.cyan('[@zimic/interceptor]'), ...messages);\n}\n","import {\n HTTP_METHODS_WITH_REQUEST_BODY,\n HTTP_METHODS_WITH_RESPONSE_BODY,\n HttpMethod,\n HttpMethodWithRequestBody,\n HttpMethodWithResponseBody,\n} from '@zimic/http';\nimport { Server as HttpServer } from 'http';\n\nclass HttpServerTimeoutError extends Error {}\n\nexport class HttpServerStartTimeoutError extends HttpServerTimeoutError {\n constructor(reachedTimeout: number) {\n super(`HTTP server start timed out after ${reachedTimeout}ms.`);\n this.name = 'HttpServerStartTimeout';\n }\n}\n\nexport class HttpServerStopTimeoutError extends HttpServerTimeoutError {\n constructor(reachedTimeout: number) {\n super(`HTTP server stop timed out after ${reachedTimeout}ms.`);\n this.name = 'HttpServerStopTimeout';\n }\n}\n\nexport const DEFAULT_HTTP_SERVER_LIFECYCLE_TIMEOUT = 60 * 1000;\n\nexport async function startHttpServer(\n server: HttpServer,\n options: {\n hostname?: string;\n port?: number;\n timeout?: number;\n } = {},\n) {\n const { hostname, port, timeout: timeoutDuration = DEFAULT_HTTP_SERVER_LIFECYCLE_TIMEOUT } = options;\n\n await new Promise<void>((resolve, reject) => {\n function handleStartError(error: unknown) {\n server.off('listening', handleStartSuccess); // eslint-disable-line @typescript-eslint/no-use-before-define\n reject(error);\n }\n\n const startTimeout = setTimeout(() => {\n const timeoutError = new HttpServerStartTimeoutError(timeoutDuration);\n handleStartError(timeoutError);\n }, timeoutDuration);\n\n function handleStartSuccess() {\n server.off('error', handleStartError);\n clearTimeout(startTimeout);\n resolve();\n }\n\n server.once('error', handleStartError);\n server.listen(port, hostname, handleStartSuccess);\n });\n}\n\nexport async function stopHttpServer(server: HttpServer, options: { timeout?: number } = {}) {\n const { timeout: timeoutDuration = DEFAULT_HTTP_SERVER_LIFECYCLE_TIMEOUT } = options;\n\n if (!server.listening) {\n return;\n }\n\n await new Promise<void>((resolve, reject) => {\n const stopTimeout = setTimeout(() => {\n const timeoutError = new HttpServerStopTimeoutError(timeoutDuration);\n reject(timeoutError);\n }, timeoutDuration);\n\n server.close((error) => {\n clearTimeout(stopTimeout);\n\n /* istanbul ignore if -- @preserve\n * This is expected not to happen since the servers are not stopped unless they are running. */\n if (error) {\n reject(error);\n } else {\n resolve();\n }\n });\n\n server.closeAllConnections();\n });\n}\n\nexport function getHttpServerPort(server: HttpServer) {\n const address = server.address();\n\n /* istanbul ignore if -- @preserve\n * The address is expected to be an object because the server does not listen on a pipe or Unix domain socket. */\n if (typeof address === 'string') {\n return undefined;\n } else {\n return address?.port;\n }\n}\n\nexport function methodCanHaveRequestBody(method: HttpMethod): method is HttpMethodWithRequestBody {\n const methodsToCompare: readonly string[] = HTTP_METHODS_WITH_REQUEST_BODY;\n return methodsToCompare.includes(method);\n}\n\nexport function methodCanHaveResponseBody(method: HttpMethod): method is HttpMethodWithResponseBody {\n const methodsToCompare: readonly string[] = HTTP_METHODS_WITH_RESPONSE_BODY;\n return methodsToCompare.includes(method);\n}\n","import {\n HttpHeaders,\n HttpHeadersInit,\n HttpMethodSchema,\n HttpRequest,\n HttpRequestBodySchema,\n HttpRequestHeadersSchema,\n HttpRequestSearchParamsSchema,\n HttpResponse,\n HttpResponseBodySchema,\n HttpResponseHeadersSchema,\n HttpResponseSchema,\n HttpSearchParams,\n HttpStatusCode,\n InferPathParams,\n} from '@zimic/http';\nimport { Default, PartialByKey, PossiblePromise, ReplaceBy } from '@zimic/utils/types';\n\nexport type HttpRequestHandlerResponseWithBody<ResponseSchema extends HttpResponseSchema> =\n unknown extends ResponseSchema['body']\n ? { body?: null }\n : undefined extends ResponseSchema['body']\n ? { body?: ReplaceBy<ReplaceBy<ResponseSchema['body'], undefined, null>, ArrayBuffer, Blob> }\n : { body: ReplaceBy<ResponseSchema['body'], ArrayBuffer, Blob> };\n\ntype HttpRequestHandlerResponseHeaders<ResponseSchema extends HttpResponseSchema> = HttpHeadersInit<\n PartialByKey<Default<ResponseSchema['headers']>, 'content-type'>\n>;\n\nexport type HttpRequestHandlerResponseWithHeaders<ResponseSchema extends HttpResponseSchema> =\n undefined extends ResponseSchema['headers']\n ? { headers?: HttpRequestHandlerResponseHeaders<ResponseSchema> }\n : keyof ResponseSchema['headers'] extends 'content-type'\n ? { headers?: HttpRequestHandlerResponseHeaders<ResponseSchema> }\n : { headers: HttpRequestHandlerResponseHeaders<ResponseSchema> };\n\n/** A declaration of an HTTP response for an intercepted request. */\nexport type HttpRequestHandlerResponseDeclaration<\n MethodSchema extends HttpMethodSchema = HttpMethodSchema,\n StatusCode extends HttpStatusCode = HttpStatusCode,\n> = StatusCode extends StatusCode\n ? {\n status: StatusCode;\n } & HttpRequestHandlerResponseWithBody<Default<Default<MethodSchema['response']>[StatusCode]>> &\n HttpRequestHandlerResponseWithHeaders<Default<Default<MethodSchema['response']>[StatusCode]>>\n : never;\n\n/**\n * A factory to create {@link HttpRequestHandlerResponseDeclaration} objects.\n *\n * @param request The intercepted request.\n * @returns The response declaration.\n */\nexport type HttpRequestHandlerResponseDeclarationFactory<\n Path extends string,\n MethodSchema extends HttpMethodSchema,\n StatusCode extends HttpStatusCode = HttpStatusCode,\n> = (\n request: Omit<HttpInterceptorRequest<Path, MethodSchema>, 'response'>,\n) => PossiblePromise<HttpRequestHandlerResponseDeclaration<MethodSchema, StatusCode>>;\n\n/**\n * A strict representation of an intercepted HTTP request. The body, search params and path params are already parsed by\n * default.\n */\nexport interface HttpInterceptorRequest<Path extends string, MethodSchema extends HttpMethodSchema>\n extends Omit<HttpRequest, keyof Body | 'headers' | 'clone'> {\n /** The headers of the request. */\n headers: HttpHeaders<HttpRequestHeadersSchema<MethodSchema>>;\n /** The path parameters of the request. They are parsed from the path string when using dynamic paths. */\n pathParams: InferPathParams<Path>;\n /** The search parameters of the request. */\n searchParams: HttpSearchParams<HttpRequestSearchParamsSchema<MethodSchema>>;\n /** The body of the request. It is already parsed by default. */\n body: ReplaceBy<HttpRequestBodySchema<MethodSchema>, ArrayBuffer, Blob>;\n /** The raw request object. */\n raw: HttpRequest<HttpRequestBodySchema<MethodSchema>>;\n}\n\n/**\n * A strict representation of an intercepted HTTP response. The body, search params and path params are already parsed\n * by default.\n */\nexport interface HttpInterceptorResponse<MethodSchema extends HttpMethodSchema, StatusCode extends HttpStatusCode>\n extends Omit<HttpResponse, keyof Body | 'headers' | 'clone'> {\n /** The headers of the response. */\n headers: HttpHeaders<HttpResponseHeadersSchema<MethodSchema, StatusCode>>;\n /** The status code of the response. */\n status: StatusCode;\n /** The body of the response. It is already parsed by default. */\n body: HttpResponseBodySchema<MethodSchema, StatusCode>;\n /** The raw response object. */\n raw: HttpResponse<HttpResponseBodySchema<MethodSchema, StatusCode>, StatusCode>;\n}\n\nexport const HTTP_INTERCEPTOR_REQUEST_HIDDEN_PROPERTIES = Object.freeze(\n new Set<Exclude<keyof HttpRequest, keyof HttpInterceptorRequest<string, never>>>([\n 'bodyUsed',\n 'arrayBuffer',\n 'blob',\n 'formData',\n 'json',\n 'text',\n 'clone',\n ]),\n);\n\nexport const HTTP_INTERCEPTOR_RESPONSE_HIDDEN_PROPERTIES = Object.freeze(\n new Set<Exclude<keyof HttpResponse, keyof HttpInterceptorResponse<never, never>>>(\n HTTP_INTERCEPTOR_REQUEST_HIDDEN_PROPERTIES,\n ),\n);\n\n/**\n * A strict representation of an intercepted HTTP request, along with its response. The body, search params and path\n * params are already parsed by default.\n */\nexport interface TrackedHttpInterceptorRequest<\n Path extends string,\n MethodSchema extends HttpMethodSchema,\n StatusCode extends HttpStatusCode = never,\n> extends HttpInterceptorRequest<Path, MethodSchema> {\n /** The response that was returned for the intercepted request. */\n response: StatusCode extends [never] ? never : HttpInterceptorResponse<MethodSchema, StatusCode>;\n}\n","import { HttpInterceptorType, UnhandledRequestStrategy } from '../interceptor/types/options';\n\nexport const DEFAULT_UNHANDLED_REQUEST_STRATEGY = Object.freeze({\n local: Object.freeze<UnhandledRequestStrategy.LocalDeclaration>({\n action: 'reject',\n log: true,\n }),\n remote: Object.freeze<UnhandledRequestStrategy.RemoteDeclaration>({\n action: 'reject',\n log: true,\n }),\n} satisfies Record<HttpInterceptorType, Readonly<UnhandledRequestStrategy.Declaration>>);\n","/**\n * Error thrown when a value is not valid {@link https://developer.mozilla.org/docs/Web/API/FormData FormData}. HTTP\n * interceptors might throw this error when trying to parse the body of a request or response with the header\n * `'content-type': 'multipart/form-data'`, if the content cannot be parsed to form data.\n */\nclass InvalidFormDataError extends SyntaxError {\n constructor(value: string) {\n super(`Failed to parse value as form data: ${value}`);\n this.name = 'InvalidFormDataError';\n }\n}\n\nexport default InvalidFormDataError;\n","/**\n * Error thrown when a value is not valid JSON. HTTP interceptors might throw this error when trying to parse the body\n * of a request or response with the header `'content-type': 'application/json'`, if the content cannot be parsed to\n * JSON.\n */\nclass InvalidJSONError extends SyntaxError {\n constructor(value: string) {\n super(`Failed to parse value as JSON: ${value}`);\n this.name = 'InvalidJSONError';\n }\n}\n\nexport default InvalidJSONError;\n","import { HttpInterceptorType, UnhandledRequestStrategy } from '../interceptor/types/options';\nimport { DEFAULT_UNHANDLED_REQUEST_STRATEGY } from './constants';\n\nclass HttpInterceptorWorkerStore {\n private static _defaultOnUnhandledRequest: {\n local: UnhandledRequestStrategy.Local;\n remote: UnhandledRequestStrategy.Remote;\n } = {\n local: { ...DEFAULT_UNHANDLED_REQUEST_STRATEGY.local },\n remote: { ...DEFAULT_UNHANDLED_REQUEST_STRATEGY.remote },\n };\n\n private class = HttpInterceptorWorkerStore;\n\n defaultOnUnhandledRequest(interceptorType: 'local'): UnhandledRequestStrategy.Local;\n defaultOnUnhandledRequest(interceptorType: 'remote'): UnhandledRequestStrategy.Remote;\n defaultOnUnhandledRequest(interceptorType: HttpInterceptorType): UnhandledRequestStrategy;\n defaultOnUnhandledRequest(interceptorType: HttpInterceptorType) {\n return this.class._defaultOnUnhandledRequest[interceptorType];\n }\n\n setDefaultOnUnhandledRequest(interceptorType: 'local', strategy: UnhandledRequestStrategy.Local): void;\n setDefaultOnUnhandledRequest(interceptorType: 'remote', strategy: UnhandledRequestStrategy.Remote): void;\n setDefaultOnUnhandledRequest(interceptorType: HttpInterceptorType, strategy: UnhandledRequestStrategy): void;\n setDefaultOnUnhandledRequest(interceptorType: HttpInterceptorType, strategy: UnhandledRequestStrategy) {\n if (interceptorType === 'local') {\n this.class._defaultOnUnhandledRequest[interceptorType] = strategy as UnhandledRequestStrategy.Local;\n } else {\n this.class._defaultOnUnhandledRequest[interceptorType] = strategy as UnhandledRequestStrategy.Remote;\n }\n }\n}\n\nexport default HttpInterceptorWorkerStore;\n","import {\n HttpHeadersInit,\n HttpHeaders,\n HttpBody,\n HttpResponse,\n HttpMethod,\n HttpMethodSchema,\n HttpSchema,\n HttpStatusCode,\n InferPathParams,\n HttpFormData,\n HttpSearchParams,\n} from '@zimic/http';\nimport isDefined from '@zimic/utils/data/isDefined';\nimport { Default, PossiblePromise } from '@zimic/utils/types';\nimport chalk from 'chalk';\n\nimport { removeArrayElement } from '@/utils/arrays';\nimport { formatValueToLog, logWithPrefix } from '@/utils/console';\nimport { isClientSide } from '@/utils/environment';\nimport { methodCanHaveResponseBody } from '@/utils/http';\n\nimport HttpInterceptorClient, { AnyHttpInterceptorClient } from '../interceptor/HttpInterceptorClient';\nimport { HttpInterceptorPlatform, HttpInterceptorType, UnhandledRequestStrategy } from '../interceptor/types/options';\nimport {\n UnhandledHttpInterceptorRequestPath,\n UnhandledHttpInterceptorRequestMethodSchema,\n} from '../interceptor/types/requests';\nimport {\n HTTP_INTERCEPTOR_REQUEST_HIDDEN_PROPERTIES,\n HTTP_INTERCEPTOR_RESPONSE_HIDDEN_PROPERTIES,\n HttpInterceptorRequest,\n HttpInterceptorResponse,\n} from '../requestHandler/types/requests';\nimport { DEFAULT_UNHANDLED_REQUEST_STRATEGY } from './constants';\nimport InvalidFormDataError from './errors/InvalidFormDataError';\nimport InvalidJSONError from './errors/InvalidJSONError';\nimport HttpInterceptorWorkerStore from './HttpInterceptorWorkerStore';\nimport { HttpResponseFactory } from './types/requests';\n\nabstract class HttpInterceptorWorker {\n abstract readonly type: 'local' | 'remote';\n\n private _platform: HttpInterceptorPlatform | null = null;\n private _isRunning = false;\n private startingPromise?: Promise<void>;\n private stoppingPromise?: Promise<void>;\n\n private store = new HttpInterceptorWorkerStore();\n\n private runningInterceptors: AnyHttpInterceptorClient[] = [];\n\n platform() {\n return this._platform;\n }\n\n protected setPlatform(platform: HttpInterceptorPlatform) {\n this._platform = platform;\n }\n\n isRunning() {\n return this._isRunning;\n }\n\n protected setIsRunning(isRunning: boolean) {\n this._isRunning = isRunning;\n }\n\n abstract start(): Promise<void>;\n\n protected async sharedStart(internalStart: () => Promise<void>) {\n if (this.isRunning()) {\n return;\n }\n\n if (this.startingPromise) {\n return this.startingPromise;\n }\n\n try {\n this.startingPromise = internalStart();\n await this.startingPromise;\n\n this.startingPromise = undefined;\n } catch (error) {\n // In server side (e.g. Node.js), we need to manually log the error because this will be treated as an unhandled\n // promise rejection. If we don't log it, the output won't contain details about the error. In the browser,\n // uncaught promise rejections are automatically logged.\n if (!isClientSide()) {\n console.error(error);\n }\n\n await this.stop();\n throw error;\n }\n }\n\n abstract stop(): Promise<void>;\n\n protected async sharedStop(internalStop: () => PossiblePromise<void>) {\n if (!this.isRunning()) {\n return;\n }\n if (this.stoppingPromise) {\n return this.stoppingPromise;\n }\n\n const stoppingResult = internalStop();\n\n if (stoppingResult instanceof Promise) {\n this.stoppingPromise = stoppingResult;\n await this.stoppingPromise;\n }\n\n this.stoppingPromise = undefined;\n }\n\n abstract use<Schema extends HttpSchema>(\n interceptor: HttpInterceptorClient<Schema>,\n method: HttpMethod,\n url: string,\n createResponse: HttpResponseFactory,\n ): PossiblePromise<void>;\n\n protected async logUnhandledRequestIfNecessary(\n request: Request,\n strategy: UnhandledRequestStrategy.Declaration | null,\n ) {\n if (strategy?.log) {\n await HttpInterceptorWorker.logUnhandledRequestWarning(request, strategy.action);\n return { wasLogged: true };\n }\n return { wasLogged: false };\n }\n\n protected async getUnhandledRequestStrategy(request: Request, interceptorType: HttpInterceptorType) {\n const candidates = await this.getUnhandledRequestStrategyCandidates(request, interceptorType);\n const strategy = this.reduceUnhandledRequestStrategyCandidates(candidates);\n return strategy;\n }\n\n private reduceUnhandledRequestStrategyCandidates(candidateStrategies: UnhandledRequestStrategy.Declaration[]) {\n if (candidateStrategies.length === 0) {\n return null;\n }\n\n // Prefer strategies from first to last, overriding undefined values with the next candidate.\n return candidateStrategies.reduce(\n (accumulatedStrategy, candidateStrategy): UnhandledRequestStrategy.Declaration => ({\n action: accumulatedStrategy.action,\n log: accumulatedStrategy.log ?? candidateStrategy.log,\n }),\n );\n }\n\n private async getUnhandledRequestStrategyCandidates(\n request: Request,\n interceptorType: HttpInterceptorType,\n ): Promise<UnhandledRequestStrategy.Declaration[]> {\n const globalDefaultStrategy = this.getGlobalDefaultUnhandledRequestStrategy(interceptorType);\n\n try {\n const interceptor = this.findInterceptorByRequestBaseURL(request);\n\n if (!interceptor) {\n return [];\n }\n\n const requestClone = request.clone();\n\n const [defaultStrategy, interceptorStrategy] = await Promise.all([\n this.getDefaultUnhandledRequestStrategy(request, interceptorType),\n this.getInterceptorUnhandledRequestStrategy(requestClone, interceptor),\n ]);\n\n const candidatesOrPromises = [interceptorStrategy, defaultStrategy, globalDefaultStrategy];\n const candidateStrategies = await Promise.all(candidatesOrPromises.filter(isDefined));\n return candidateStrategies;\n } catch (error) {\n console.error(error);\n\n const candidateStrategies = [globalDefaultStrategy];\n return candidateStrategies;\n }\n }\n\n registerRunningInterceptor(interceptor: AnyHttpInterceptorClient) {\n this.runningInterceptors.push(interceptor);\n }\n\n unregisterRunningInterceptor(interceptor: AnyHttpInterceptorClient) {\n removeArrayElement(this.runningInterceptors, interceptor);\n }\n\n private findInterceptorByRequestBaseURL(request: Request) {\n const interceptor = this.runningInterceptors.findLast((interceptor) => {\n const baseURL = interceptor.baseURL();\n return request.url.startsWith(baseURL);\n });\n\n return interceptor;\n }\n\n private getGlobalDefaultUnhandledRequestStrategy(interceptorType: HttpInterceptorType) {\n return DEFAULT_UNHANDLED_REQUEST_STRATEGY[interceptorType];\n }\n\n private async getDefaultUnhandledRequestStrategy(request: Request, interceptorType: HttpInterceptorType) {\n const defaultStrategyOrFactory = this.store.defaultOnUnhandledRequest(interceptorType);\n\n if (typeof defaultStrategyOrFactory === 'function') {\n const parsedRequest = await HttpInterceptorWorker.parseRawUnhandledRequest(request);\n return defaultStrategyOrFactory(parsedRequest);\n }\n\n return defaultStrategyOrFactory;\n }\n\n private async getInterceptorUnhandledRequestStrategy(request: Request, interceptor: AnyHttpInterceptorClient) {\n const interceptorStrategyOrFactory = interceptor.onUnhandledRequest();\n\n if (typeof interceptorStrategyOrFactory === 'function') {\n const parsedRequest = await HttpInterceptorWorker.parseRawUnhandledRequest(request);\n return interceptorStrategyOrFactory(parsedRequest);\n }\n\n return interceptorStrategyOrFactory;\n }\n\n abstract clearHandlers(): PossiblePromise<void>;\n\n abstract clearInterceptorHandlers<Schema extends HttpSchema>(\n interceptor: HttpInterceptorClient<Schema>,\n ): PossiblePromise<void>;\n\n abstract interceptorsWithHandlers(): AnyHttpInterceptorClient[];\n\n static createResponseFromDeclaration(\n request: Request,\n declaration: { status: number; headers?: HttpHeadersInit; body?: HttpBody },\n ): HttpResponse {\n const headers = new HttpHeaders(declaration.headers);\n const status = declaration.status;\n\n const canHaveBody = methodCanHaveResponseBody(request.method as HttpMethod) && status !== 204;\n\n if (!canHaveBody) {\n return new Response(null, { headers, status }) as HttpResponse;\n }\n\n if (\n typeof declaration.body === 'string' ||\n declaration.body === undefined ||\n declaration.body instanceof FormData ||\n declaration.body instanceof URLSearchParams ||\n declaration.body instanceof Blob ||\n declaration.body instanceof ArrayBuffer\n ) {\n return new Response(declaration.body ?? null, { headers, status }) as HttpResponse;\n }\n\n return Response.json(declaration.body, { headers, status }) as HttpResponse;\n }\n\n static async parseRawUnhandledRequest(request: Request) {\n return this.parseRawRequest<UnhandledHttpInterceptorRequestPath, UnhandledHttpInterceptorRequestMethodSchema>(\n request,\n );\n }\n\n static async parseRawRequest<Path extends string, MethodSchema extends HttpMethodSchema>(\n originalRawRequest: Request,\n options: { urlRegex?: RegExp } = {},\n ): Promise<HttpInterceptorRequest<Path, MethodSchema>> {\n const rawRequest = originalRawRequest.clone();\n const rawRequestClone = rawRequest.clone();\n\n type BodySchema = Default<Default<MethodSchema['request']>['body']>;\n const parsedBody = await this.parseRawBody<BodySchema>(rawRequest);\n\n type HeadersSchema = Default<Default<MethodSchema['request']>['headers']>;\n const headers = new HttpHeaders<HeadersSchema>(rawRequest.headers);\n\n const pathParams = options.urlRegex ? this.parseRawPathParams<Path>(options.urlRegex, rawRequest) : {};\n\n const parsedURL = new URL(rawRequest.url);\n type SearchParamsSchema = Default<Default<MethodSchema['request']>['searchParams']>;\n const searchParams = new HttpSearchParams<SearchParamsSchema>(parsedURL.searchParams);\n\n const parsedRequest = new Proxy(rawRequest as unknown as HttpInterceptorRequest<Path, MethodSchema>, {\n has(target, property: keyof HttpInterceptorRequest<Path, MethodSchema>) {\n if (HttpInterceptorWorker.isHiddenRequestProperty(property)) {\n return false;\n }\n return Reflect.has(target, property);\n },\n\n get(target, property: keyof HttpInterceptorRequest<Path, MethodSchema>) {\n if (HttpInterceptorWorker.isHiddenRequestProperty(property)) {\n return undefined;\n }\n return Reflect.get(target, property, target) as unknown;\n },\n });\n\n Object.defineProperty(parsedRequest, 'body', {\n value: parsedBody,\n enumerable: true,\n configurable: false,\n writable: false,\n });\n\n Object.defineProperty(parsedRequest, 'headers', {\n value: headers,\n enumerable: true,\n configurable: false,\n writable: false,\n });\n\n Object.defineProperty(parsedRequest, 'pathParams', {\n value: pathParams,\n enumerable: true,\n configurable: false,\n writable: false,\n });\n\n Object.defineProperty(parsedRequest, 'searchParams', {\n value: searchParams,\n enumerable: true,\n configurable: false,\n writable: false,\n });\n\n Object.defineProperty(parsedRequest, 'raw', {\n value: rawRequestClone,\n enumerable: true,\n configurable: false,\n writable: false,\n });\n\n return parsedRequest;\n }\n\n private static isHiddenRequestProperty(property: string) {\n return HTTP_INTERCEPTOR_REQUEST_HIDDEN_PROPERTIES.has(property as never);\n }\n\n static async parseRawResponse<MethodSchema extends HttpMethodSchema, StatusCode extends HttpStatusCode>(\n originalRawResponse: Response,\n ): Promise<HttpInterceptorResponse<MethodSchema, StatusCode>> {\n const rawResponse = originalRawResponse.clone();\n const rawResponseClone = rawResponse.clone();\n\n type BodySchema = Default<Default<Default<MethodSchema['response']>[StatusCode]>['body']>;\n const parsedBody = await this.parseRawBody<BodySchema>(rawResponse);\n\n type HeadersSchema = Default<Default<Default<MethodSchema['response']>[StatusCode]>['headers']>;\n const headers = new HttpHeaders<HeadersSchema>(rawResponse.headers);\n\n const parsedRequest = new Proxy(rawResponse as unknown as HttpInterceptorResponse<MethodSchema, StatusCode>, {\n has(target, property: keyof HttpInterceptorResponse<MethodSchema, StatusCode>) {\n if (HttpInterceptorWorker.isHiddenResponseProperty(property)) {\n return false;\n }\n return Reflect.has(target, property);\n },\n\n get(target, property: keyof HttpInterceptorResponse<MethodSchema, StatusCode>) {\n if (HttpInterceptorWorker.isHiddenResponseProperty(property)) {\n return undefined;\n }\n return Reflect.get(target, property, target) as unknown;\n },\n });\n\n Object.defineProperty(parsedRequest, 'body', {\n value: parsedBody,\n enumerable: true,\n configurable: false,\n writable: false,\n });\n\n Object.defineProperty(parsedRequest, 'headers', {\n value: headers,\n enumerable: true,\n configurable: false,\n writable: false,\n });\n\n Object.defineProperty(parsedRequest, 'raw', {\n value: rawResponseClone,\n enumerable: true,\n configurable: false,\n writable: false,\n });\n\n return parsedRequest;\n }\n\n private static isHiddenResponseProperty(property: string) {\n return HTTP_INTERCEPTOR_RESPONSE_HIDDEN_PROPERTIES.has(property as never);\n }\n\n static parseRawPathParams<Path extends string>(matchedURLRegex: RegExp, request: Request): InferPathParams<Path> {\n const match = request.url.match(matchedURLRegex);\n const pathParams = { ...match?.groups };\n return pathParams as InferPathParams<Path>;\n }\n\n static async parseRawBody<Body extends HttpBody>(resource: Request | Response) {\n const contentType = resource.headers.get('content-type');\n\n try {\n if (contentType) {\n if (contentType.startsWith('application/json')) {\n return await this.parseRawBodyAsJSON<Body>(resource);\n }\n if (contentType.startsWith('multipart/form-data')) {\n return await this.parseRawBodyAsFormData<Body>(resource);\n }\n if (contentType.startsWith('application/x-www-form-urlencoded')) {\n return await this.parseRawBodyAsSearchParams<Body>(resource);\n }\n if (contentType.startsWith('text/') || contentType.startsWith('application/xml')) {\n return await this.parseRawBodyAsText<Body>(resource);\n }\n if (\n contentType.startsWith('application/') ||\n contentType.startsWith('image/') ||\n contentType.startsWith('audio/') ||\n contentType.startsWith('font/') ||\n contentType.startsWith('video/') ||\n contentType.startsWith('multipart/')\n ) {\n return await this.parseRawBodyAsBlob<Body>(resource);\n }\n }\n\n const resourceClone = resource.clone();\n\n try {\n return await this.parseRawBodyAsJSON<Body>(resource);\n } catch {\n return await this.parseRawBodyAsText<Body>(resourceClone);\n }\n } catch (error) {\n console.error(error);\n return null;\n }\n }\n\n private static async parseRawBodyAsJSON<Body extends HttpBody>(resource: Request | Response) {\n const bodyAsText = await resource.text();\n\n if (!bodyAsText.trim()) {\n return null;\n }\n\n try {\n const bodyAsJSON = JSON.parse(bodyAsText) as Body;\n return bodyAsJSON;\n } catch {\n throw new InvalidJSONError(bodyAsText);\n }\n }\n\n private static async parseRawBodyAsSearchParams<Body extends HttpBody>(resource: Request | Response) {\n const bodyAsText = await resource.text();\n\n if (!bodyAsText.trim()) {\n return null;\n }\n\n const bodyAsSearchParams = new HttpSearchParams(bodyAsText);\n return bodyAsSearchParams as Body;\n }\n\n private static async parseRawBodyAsFormData<Body extends HttpBody>(resource: Request | Response) {\n const resourceClone = resource.clone();\n\n try {\n const bodyAsRawFormData = await resource.formData();\n\n const bodyAsFormData = new HttpFormData();\n for (const [key, value] of bodyAsRawFormData) {\n bodyAsFormData.append(key, value as string);\n }\n\n return bodyAsFormData as Body;\n } catch {\n const bodyAsText = await resourceClone.text();\n\n if (!bodyAsText.trim()) {\n return null;\n }\n\n throw new InvalidFormDataError(bodyAsText);\n }\n }\n\n private static async parseRawBodyAsBlob<Body extends HttpBody>(resource: Request | Response) {\n const bodyAsBlob = await resource.blob();\n return bodyAsBlob as Body;\n }\n\n private static async parseRawBodyAsText<Body extends HttpBody>(resource: Request | Response) {\n const bodyAsText = await resource.text();\n return (bodyAsText || null) as Body;\n }\n\n static async logUnhandledRequestWarning(rawRequest: Request, action: UnhandledRequestStrategy.Action) {\n const request = await this.parseRawRequest(rawRequest);\n\n const [formattedHeaders, formattedSearchParams, formattedBody] = await Promise.all([\n formatValueToLog(request.headers.toObject()),\n formatValueToLog(request.searchParams.toObject()),\n formatValueToLog(request.body),\n ]);\n\n logWithPrefix(\n [\n `${action === 'bypass' ? 'Warning:' : 'Error:'} Request was not handled and was ` +\n `${action === 'bypass' ? chalk.yellow('bypassed') : chalk.red('rejected')}.\\n\\n `,\n `${request.method} ${request.url}`,\n '\\n Headers:',\n formattedHeaders,\n '\\n Search params:',\n formattedSearchParams,\n '\\n Body:',\n formattedBody,\n '\\n\\nLearn more: https://github.com/zimicjs/zimic/wiki/api‐zimic‐interceptor‐http#unhandled-requests',\n ],\n { method: action === 'bypass' ? 'warn' : 'error' },\n );\n }\n}\n\nexport default HttpInterceptorWorker;\n","import { isClientSide } from './environment';\n\nexport function convertArrayBufferToBase64(buffer: ArrayBuffer) {\n if (isClientSide()) {\n const bufferBytes = new Uint8Array(buffer);\n\n const bufferAsStringArray = [];\n for (const byte of bufferBytes) {\n const byteCode = String.fromCharCode(byte);\n bufferAsStringArray.push(byteCode);\n }\n const bufferAsString = bufferAsStringArray.join('');\n\n return btoa(bufferAsString);\n } else {\n return Buffer.from(buffer).toString('base64');\n }\n}\n\nexport function convertBase64ToArrayBuffer(base64Value: string) {\n if (isClientSide()) {\n const bufferAsString = atob(base64Value);\n const array = Uint8Array.from(bufferAsString, (character) => character.charCodeAt(0));\n return array.buffer;\n } else {\n return Buffer.from(base64Value, 'base64');\n }\n}\n","import { JSONValue } from '@zimic/http';\n\nimport { convertArrayBufferToBase64, convertBase64ToArrayBuffer } from './data';\n\nexport type SerializedHttpRequest = JSONValue<{\n url: string;\n method: string;\n mode: RequestMode;\n headers: Record<string, string>;\n cache: RequestCache;\n credentials: RequestCredentials;\n integrity: string;\n keepalive: boolean;\n redirect: RequestRedirect;\n referrer: string;\n referrerPolicy: ReferrerPolicy;\n body: string | null;\n}>;\n\nexport async function serializeRequest(request: Request): Promise<SerializedHttpRequest> {\n const requestClone = request.clone();\n const serializedBody = requestClone.body ? convertArrayBufferToBase64(await requestClone.arrayBuffer()) : null;\n\n return {\n url: request.url,\n method: request.method,\n mode: request.mode,\n headers: Object.fromEntries(request.headers),\n cache: request.cache,\n credentials: request.credentials,\n integrity: request.integrity,\n keepalive: request.keepalive,\n redirect: request.redirect,\n referrer: request.referrer,\n referrerPolicy: request.referrerPolicy,\n body: serializedBody,\n };\n}\n\nexport function deserializeRequest(serializedRequest: SerializedHttpRequest): Request {\n const deserializedBody = serializedRequest.body ? convertBase64ToArrayBuffer(serializedRequest.body) : null;\n\n return new Request(serializedRequest.url, {\n method: serializedRequest.method,\n mode: serializedRequest.mode,\n headers: new Headers(serializedRequest.headers),\n cache: serializedRequest.cache,\n credentials: serializedRequest.credentials,\n integrity: serializedRequest.integrity,\n keepalive: serializedRequest.keepalive,\n redirect: serializedRequest.redirect,\n referrer: serializedRequest.referrer,\n referrerPolicy: serializedRequest.referrerPolicy,\n body: deserializedBody,\n });\n}\n\nexport type SerializedResponse = JSONValue<{\n status: number;\n statusText: string;\n headers: Record<string, string>;\n body: string | null;\n}>;\n\nexport async function serializeResponse(response: Response): Promise<SerializedResponse> {\n const responseClone = response.clone();\n const serializedBody = responseClone.body ? convertArrayBufferToBase64(await responseClone.arrayBuffer()) : null;\n\n return {\n status: response.status,\n statusText: response.statusText,\n headers: Object.fromEntries(response.headers),\n body: serializedBody,\n };\n}\n\nexport function deserializeResponse(serializedResponse: SerializedResponse): Response {\n const deserializedBody = serializedResponse.body ? convertBase64ToArrayBuffer(serializedResponse.body) : null;\n\n return new Response(deserializedBody, {\n status: serializedResponse.status,\n statusText: serializedResponse.statusText,\n headers: new Headers(serializedResponse.headers),\n });\n}\n","import ClientSocket, { type WebSocketServer as ServerSocket } from 'isomorphic-ws';\n\nclass WebSocketTimeoutError extends Error {}\n\nexport class WebSocketOpenTimeoutError extends WebSocketTimeoutError {\n constructor(reachedTimeout: number) {\n super(`Web socket open timed out after ${reachedTimeout}ms.`);\n this.name = 'WebSocketOpenTimeout';\n }\n}\n\nexport class WebSocketMessageTimeoutError extends WebSocketTimeoutError {\n constructor(reachedTimeout: number) {\n super(`Web socket message timed out after ${reachedTimeout}ms.`);\n this.name = 'WebSocketMessageTimeout';\n }\n}\n\nexport class WebSocketMessageAbortError extends WebSocketTimeoutError {\n constructor() {\n super('Web socket message was aborted.');\n this.name = 'WebSocketMessageAbortError';\n }\n}\n\nexport class WebSocketCloseTimeoutError extends WebSocketTimeoutError {\n constructor(reachedTimeout: number) {\n super(`Web socket close timed out after ${reachedTimeout}ms.`);\n this.name = 'WebSocketCloseTimeout';\n }\n}\n\nexport const DEFAULT_WEB_SOCKET_LIFECYCLE_TIMEOUT = 60 * 1000;\nexport const DEFAULT_WEB_SOCKET_MESSAGE_TIMEOUT = 3 * 60 * 1000;\n\nexport async function waitForOpenClientSocket(\n socket: ClientSocket,\n options: {\n timeout?: number;\n } = {},\n) {\n const { timeout: timeoutDuration = DEFAULT_WEB_SOCKET_LIFECYCLE_TIMEOUT } = options;\n\n const isAlreadyOpen = socket.readyState === socket.OPEN;\n\n if (isAlreadyOpen) {\n return;\n }\n\n await new Promise<void>((resolve, reject) => {\n function handleOpenError(error: unknown) {\n socket.removeEventListener('open', handleOpenSuccess); // eslint-disable-line @typescript-eslint/no-use-before-define\n reject(error);\n }\n\n const openTimeout = setTimeout(() => {\n const timeoutError = new WebSocketOpenTimeoutError(timeoutDuration);\n handleOpenError(timeoutError);\n }, timeoutDuration);\n\n function handleOpenSuccess() {\n socket.removeEventListener('error', handleOpenError);\n clearTimeout(openTimeout);\n resolve();\n }\n\n socket.addEventListener('open', handleOpenSuccess);\n socket.addEventListener('error', handleOpenError);\n });\n}\n\nexport async function closeClientSocket(socket: ClientSocket, options: { timeout?: number } = {}) {\n const { timeout: timeoutDuration = DEFAULT_WEB_SOCKET_LIFECYCLE_TIMEOUT } = options;\n\n const isAlreadyClosed = socket.readyState === socket.CLOSED;\n if (isAlreadyClosed) {\n return;\n }\n\n await new Promise<void>((resolve, reject) => {\n function handleCloseError(error: unknown) {\n socket.removeEventListener('close', handleCloseSuccess); // eslint-disable-line @typescript-eslint/no-use-before-define\n reject(error);\n }\n\n const closeTimeout = setTimeout(() => {\n const timeoutError = new WebSocketCloseTimeoutError(timeoutDuration);\n handleCloseError(timeoutError);\n }, timeoutDuration);\n\n function handleCloseSuccess() {\n socket.removeEventListener('error', handleCloseError);\n clearTimeout(closeTimeout);\n resolve();\n }\n\n socket.addEventListener('error', handleCloseError);\n socket.addEventListener('close', handleCloseSuccess);\n socket.close();\n });\n}\n\nexport async function closeServerSocket(socket: InstanceType<typeof ServerSocket>, options: { timeout?: number } = {}) {\n const { timeout: timeoutDuration = DEFAULT_WEB_SOCKET_LIFECYCLE_TIMEOUT } = options;\n\n await new Promise<void>((resolve, reject) => {\n const closeTimeout = setTimeout(() => {\n const timeoutError = new WebSocketCloseTimeoutError(timeoutDuration);\n reject(timeoutError);\n }, timeoutDuration);\n\n for (const client of socket.clients) {\n client.terminate();\n }\n\n socket.close((error) => {\n clearTimeout(closeTimeout);\n\n /* istanbul ignore if -- @preserve\n * This is not expected since the server is not stopped unless it is running. */\n if (error) {\n reject(error);\n } else {\n resolve();\n }\n });\n });\n}\n","import createCachedDynamicImport from '@zimic/utils/import/createCachedDynamicImport';\n\nexport type IsomorphicCrypto = Crypto | typeof import('crypto');\n\nexport const importCrypto = createCachedDynamicImport<IsomorphicCrypto>(async () => {\n const globalCrypto = globalThis.crypto as typeof globalThis.crypto | undefined;\n /* istanbul ignore next -- @preserve\n * Ignoring as Node.js >=20 provides a global crypto and the import fallback won't run. */\n return globalCrypto ?? (await import('crypto'));\n});\n","class InvalidWebSocketMessage extends Error {\n constructor(message: unknown) {\n super(`Web socket message is invalid and could not be parsed: ${message}`);\n this.name = 'InvalidWebSocketMessage';\n }\n}\n\nexport default InvalidWebSocketMessage;\n","class NotStartedWebSocketHandlerError extends Error {\n constructor() {\n super('Web socket handler is not running.');\n this.name = 'NotStartedWebSocketHandlerError';\n }\n}\n\nexport default NotStartedWebSocketHandlerError;\n","import { Collection } from '@zimic/utils/types';\nimport ClientSocket from 'isomorphic-ws';\n\nimport { importCrypto } from '@/utils/crypto';\nimport {\n DEFAULT_WEB_SOCKET_LIFECYCLE_TIMEOUT,\n DEFAULT_WEB_SOCKET_MESSAGE_TIMEOUT,\n WebSocketMessageAbortError,\n WebSocketMessageTimeoutError,\n closeClientSocket,\n waitForOpenClientSocket,\n} from '@/utils/webSocket';\n\nimport InvalidWebSocketMessage from './errors/InvalidWebSocketMessage';\nimport NotStartedWebSocketHandlerError from './errors/NotStartedWebSocketHandlerError';\nimport { WebSocket } from './types';\n\nabstract class WebSocketHandler<Schema extends WebSocket.ServiceSchema> {\n private sockets = new Set<ClientSocket>();\n\n private _socketTimeout: number;\n private _messageTimeout: number;\n\n private channelListeners: {\n [Channel in WebSocket.ServiceChannel<Schema>]?: {\n event: Set<WebSocket.EventMessageListener<Schema, Channel>>;\n reply: Set<WebSocket.ReplyMessageListener<Schema, Channel>>;\n };\n } = {};\n\n private socketListeners = {\n messageAbort: new Map<ClientSocket, Set<(error: unknown) => void>>(),\n };\n\n protected constructor(options: { socketTimeout?: number; messageTimeout?: number }) {\n this._socketTimeout = options.socketTimeout ?? DEFAULT_WEB_SOCKET_LIFECYCLE_TIMEOUT;\n this._messageTimeout = options.messageTimeout ?? DEFAULT_WEB_SOCKET_MESSAGE_TIMEOUT;\n }\n\n abstract isRunning(): boolean;\n\n socketTimeout() {\n return this._socketTimeout;\n }\n\n messageTimeout() {\n return this._messageTimeout;\n }\n\n protected async registerSocket(socket: ClientSocket) {\n const openPromise = waitForOpenClientSocket(socket, { timeout: this._socketTimeout });\n\n const handleSocketMessage = async (rawMessage: ClientSocket.MessageEvent) => {\n await this.handleSocketMessage(socket, rawMessage);\n };\n socket.addEventListener('message', handleSocketMessage);\n\n await openPromise;\n\n /* istanbul ignore next -- @preserve\n * It is difficult to reliably simulate socket errors in tests. */\n function handleSocketError(error: ClientSocket.ErrorEvent) {\n console.error(error);\n }\n socket.addEventListener('error', handleSocketError);\n\n const handleSocketClose = () => {\n socket.removeEventListener('message', handleSocketMessage);\n socket.removeEventListener('error', handleSocketError);\n socket.removeEventListener('close', handleSocketClose);\n this.removeSocket(socket);\n };\n socket.addEventListener('close', handleSocketClose);\n\n this.sockets.add(socket);\n }\n\n private handleSocketMessage = async (socket: ClientSocket, rawMessage: ClientSocket.MessageEvent) => {\n try {\n const stringifiedMessageData = this.readRawMessageData(rawMessage.data);\n const parsedMessageData = this.parseMessage(stringifiedMessageData);\n await this.notifyListeners(parsedMessageData, socket);\n } catch (error) {\n console.error(error);\n }\n };\n\n private readRawMessageData(data: ClientSocket.Data) {\n /* istanbul ignore else -- @preserve\n * All supported websocket messages should be encoded as strings. */\n if (typeof data === 'string') {\n return data;\n } else {\n throw new InvalidWebSocketMessage(data);\n }\n }\n\n private parseMessage(stringifiedMessage: string): WebSocket.ServiceMessage<Schema> {\n let parsedMessage: unknown;\n\n try {\n parsedMessage = JSON.parse(stringifiedMessage) as unknown;\n } catch {\n throw new InvalidWebSocketMessage(stringifiedMessage);\n }\n\n if (!this.isValidMessage(parsedMessage)) {\n throw new InvalidWebSocketMessage(stringifiedMessage);\n }\n\n if (this.isReplyMessage(parsedMessage)) {\n return {\n id: parsedMessage.id,\n channel: parsedMessage.channel,\n requestId: parsedMessage.requestId,\n data: parsedMessage.data,\n };\n }\n\n return {\n id: parsedMessage.id,\n channel: parsedMessage.channel,\n data: parsedMessage.data,\n };\n }\n\n private isValidMessage(message: unknown): message is WebSocket.ServiceMessage<Schema> {\n return (\n typeof message === 'object' &&\n message !== null &&\n 'id' in message &&\n typeof message.id === 'string' &&\n 'channel' in message &&\n typeof message.channel === 'string' &&\n (!('requestId' in message) || typeof message.requestId === 'string')\n );\n }\n\n private async notifyListeners(message: WebSocket.ServiceMessage<Schema>, socket: ClientSocket) {\n if (this.isReplyMessage(message)) {\n await this.notifyReplyListeners(message, socket);\n } else {\n await this.notifyEventListeners(message, socket);\n }\n }\n\n private async notifyReplyListeners(message: WebSocket.ServiceReplyMessage<Schema>, socket: ClientSocket) {\n /* istanbul ignore next -- @preserve\n * Reply listeners are always present when notified in normal conditions. If they were not present, the request\n * would reach a timeout and not be responded. The empty set serves as a fallback. */\n const listeners = this.channelListeners[message.channel]?.reply ?? new Set();\n\n const listenerPromises = Array.from(listeners, async (listener) => {\n await listener(message, socket);\n });\n\n await Promise.all(listenerPromises);\n }\n\n private async notifyEventListeners(\n message: WebSocket.ServiceMessage<Schema, WebSocket.ServiceChannel<Schema>>,\n socket: ClientSocket,\n ) {\n const listeners = this.channelListeners[message.channel]?.event ?? new Set();\n\n const listenerPromises = Array.from(listeners, async (listener) => {\n const replyData = await listener(message, socket);\n await this.reply(message, replyData, { sockets: [socket] });\n });\n\n await Promise.all(listenerPromises);\n }\n\n protected async closeClientSockets(sockets: Collection<ClientSocket> = this.sockets) {\n const closingPromises = Array.from(sockets, async (socket) => {\n await closeClientSocket(socket, { timeout: this._socketTimeout });\n });\n await Promise.all(closingPromises);\n }\n\n private removeSocket(socket: ClientSocket) {\n this.abortSocketMessages([socket]);\n this.sockets.delete(socket);\n }\n\n private async createEventMessage<Channel extends WebSocket.ServiceChannel<Schema>>(\n channel: Channel,\n eventData: WebSocket.ServiceEventMessage<Schema, Channel>['data'],\n ) {\n const crypto = await importCrypto();\n\n const eventMessage: WebSocket.ServiceEventMessage<Schema, Channel> = {\n id: crypto.randomUUID(),\n channel,\n data: eventData,\n };\n return eventMessage;\n }\n\n async send<Channel extends WebSocket.EventWithNoReplyServiceChannel<Schema>>(\n channel: Channel,\n eventData: WebSocket.ServiceEventMessage<Schema, Channel>['data'],\n options: {\n sockets?: Collection<ClientSocket>;\n } = {},\n ) {\n const event = await this.createEventMessage(channel, eventData);\n this.sendMessage(event, options.sockets);\n }\n\n async request<Channel extends WebSocket.EventWithReplyServiceChannel<Schema>>(\n channel: Channel,\n requestData: WebSocket.ServiceEventMessage<Schema, Channel>['data'],\n options: {\n sockets?: Collection<ClientSocket>;\n } = {},\n ) {\n const request = await this.createEventMessage(channel, requestData);\n this.sendMessage(request, options.sockets);\n\n const response = await this.waitForReply(channel, request.id, options.sockets);\n return response.data;\n }\n\n async waitForReply<Channel extends WebSocket.EventWithReplyServiceChannel<Schema>>(\n channel: Channel,\n requestId: WebSocket.ServiceEventMessage<Schema, Channel>['id'],\n sockets: Collection<ClientSocket> = this.sockets,\n ) {\n return new Promise<WebSocket.ServiceReplyMessage<Schema, Channel>>((resolve, reject) => {\n const replyTimeout = setTimeout(() => {\n this.offReply(channel, replyListener); // eslint-disable-line @typescript-eslint/no-use-before-define\n this.offAbortSocketMessages(sockets, abortListener); // eslint-disable-line @typescript-eslint/no-use-before-define\n\n const timeoutError = new WebSocketMessageTimeoutError(this._messageTimeout);\n reject(timeoutError);\n }, this._messageTimeout);\n\n const abortListener = this.onAbortSocketMessages(sockets, (error) => {\n clearTimeout(replyTimeout);\n\n this.offReply(channel, replyListener); // eslint-disable-line @typescript-eslint/no-use-before-define\n this.offAbortSocketMessages(sockets, abortListener);\n\n reject(error);\n });\n\n const replyListener = this.onReply(channel, (message) => {\n if (message.requestId === requestId) {\n clearTimeout(replyTimeout);\n\n this.offReply(channel, replyListener);\n this.offAbortSocketMessages(sockets, abortListener);\n\n resolve(message);\n }\n });\n });\n }\n\n private isReplyMessage<Channel extends WebSocket.EventWithReplyServiceChannel<Schema>>(\n message: WebSocket.ServiceMessage<Schema, Channel>,\n ) {\n return 'requestId' in message;\n }\n\n async reply<Channel extends WebSocket.EventWithReplyServiceChannel<Schema>>(\n request: WebSocket.ServiceEventMessage<Schema, Channel>,\n replyData: WebSocket.ServiceReplyMessage<Schema, Channel>['data'],\n options: {\n sockets: Collection<ClientSocket>;\n },\n ) {\n const reply = await this.createReplyMessage(request, replyData);\n\n // If this handler received a request and was stopped before responding, discard any pending replies.\n if (this.isRunning()) {\n this.sendMessage(reply, options.sockets);\n }\n }\n\n private async createReplyMessage<Channel extends WebSocket.EventWithReplyServiceChannel<Schema>>(\n request: WebSocket.ServiceEventMessage<Schema, Channel>,\n replyData: WebSocket.ServiceReplyMessage<Schema, Channel>['data'],\n ) {\n const crypto = await importCrypto();\n\n const replyMessage: WebSocket.ServiceReplyMessage<Schema, Channel> = {\n id: crypto.randomUUID(),\n channel: request.channel,\n requestId: request.id,\n data: replyData,\n };\n return replyMessage;\n }\n\n private sendMessage<Channel extends WebSocket.ServiceChannel<Schema>>(\n message: WebSocket.ServiceMessage<Schema, Channel>,\n sockets: Collection<ClientSocket> = this.sockets,\n ) {\n if (!this.isRunning()) {\n throw new NotStartedWebSocketHandlerError();\n }\n\n const stringifiedMessage = JSON.stringify(message);\n\n for (const socket of sockets) {\n socket.send(stringifiedMessage);\n }\n }\n\n onEvent<\n Channel extends WebSocket.ServiceChannel<Schema>,\n Listener extends WebSocket.EventMessageListener<Schema, Channel>,\n >(channel: Channel, listener: Listener): Listener {\n const listeners = this.getOrCreateChannelListeners<Channel>(channel);\n listeners.event.add(listener);\n return listener;\n }\n\n private getOrCreateChannelListeners<Channel extends WebSocket.ServiceChannel<Schema>>(channel: Channel) {\n const listeners = this.channelListeners[channel] ?? {\n event: new Set(),\n reply: new Set(),\n };\n\n if (!this.channelListeners[channel]) {\n this.channelListeners[channel] = listeners;\n }\n\n return listeners;\n }\n\n onReply<\n Channel extends WebSocket.EventWithReplyServiceChannel<Schema>,\n Listener extends WebSocket.ReplyMessageListener<Schema, Channel>,\n >(channel: Channel, listener: Listener): Listener {\n const listeners = this.getOrCreateChannelListeners<Channel>(channel);\n listeners.reply.add(listener);\n return listener;\n }\n\n offEvent<Channel extends WebSocket.ServiceChannel<Schema>>(\n channel: Channel,\n listener: WebSocket.EventMessageListener<Schema, Channel>,\n ) {\n this.channelListeners[channel]?.event.delete(listener);\n }\n\n offReply<Channel extends WebSocket.EventWithReplyServiceChannel<Schema>>(\n channel: Channel,\n listener: WebSocket.ReplyMessageListener<Schema, Channel>,\n ) {\n this.channelListeners[channel]?.reply.delete(listener);\n }\n\n removeAllChannelListeners() {\n this.channelListeners = {};\n }\n\n private onAbortSocketMessages(sockets: Collection<ClientSocket>, listener: (error: unknown) => void) {\n for (const socket of sockets) {\n let listeners = this.socketListeners.messageAbort.get(socket);\n if (!listeners) {\n listeners = new Set();\n this.socketListeners.messageAbort.set(socket, listeners);\n }\n listeners.add(listener);\n }\n\n return listener;\n }\n\n private offAbortSocketMessages(sockets: Collection<ClientSocket>, listener: (error: unknown) => void) {\n for (const socket of sockets) {\n this.socketListeners.messageAbort.get(socket)?.delete(listener);\n }\n }\n\n abortSocketMessages(sockets: Collection<ClientSocket> = this.sockets) {\n const abortError = new WebSocketMessageAbortError();\n\n for (const socket of sockets) {\n const listeners = this.socketListeners.messageAbort.get(socket) ?? [];\n for (const listener of listeners) {\n listener(abortError);\n }\n }\n }\n}\n\nexport default WebSocketHandler;\n","import { Server as HttpServer } from 'http';\nimport ClientSocket from 'isomorphic-ws';\n\nimport { closeServerSocket } from '@/utils/webSocket';\n\nimport { WebSocket } from './types';\nimport WebSocketHandler from './WebSocketHandler';\n\nconst { WebSocketServer: ServerSocket } = ClientSocket;\n\ninterface WebSocketServerOptions {\n httpServer: HttpServer;\n socketTimeout?: number;\n messageTimeout?: number;\n}\n\nclass WebSocketServer<Schema extends WebSocket.ServiceSchema> extends WebSocketHandler<Schema> {\n private webSocketServer?: InstanceType<typeof ServerSocket>;\n private httpServer: HttpServer;\n\n constructor(options: WebSocketServerOptions) {\n super({\n socketTimeout: options.socketTimeout,\n messageTimeout: options.messageTimeout,\n });\n\n this.httpServer = options.httpServer;\n }\n\n isRunning() {\n return this.webSocketServer !== undefined;\n }\n\n start() {\n if (this.isRunning()) {\n return;\n }\n\n const webSocketServer = new ServerSocket({ server: this.httpServer });\n\n webSocketServer.on('error', (error) => {\n console.error(error);\n });\n\n webSocketServer.on('connection', async (socket) => {\n try {\n await super.registerSocket(socket);\n } catch (error) {\n webSocketServer.emit('error', error);\n }\n });\n\n this.webSocketServer = webSocketServer;\n }\n\n async stop() {\n if (!this.webSocketServer || !this.isRunning()) {\n return;\n }\n\n super.removeAllChannelListeners();\n super.abortSocketMessages();\n await super.closeClientSockets();\n\n await closeServerSocket(this.webSocketServer, { timeout: this.socketTimeout() });\n this.webSocketServer.removeAllListeners();\n this.webSocketServer = undefined;\n }\n}\n\nexport default WebSocketServer;\n","import { HTTP_METHODS, HttpSchema } from '@zimic/http';\n\nimport { DEFAULT_HTTP_SERVER_LIFECYCLE_TIMEOUT } from '@/utils/http';\nimport { DEFAULT_WEB_SOCKET_MESSAGE_TIMEOUT } from '@/utils/webSocket';\n\nexport const DEFAULT_SERVER_LIFE_CYCLE_TIMEOUT = DEFAULT_HTTP_SERVER_LIFECYCLE_TIMEOUT;\nexport const DEFAULT_SERVER_RPC_TIMEOUT = DEFAULT_WEB_SOCKET_MESSAGE_TIMEOUT;\n\nconst ALLOWED_ACCESS_CONTROL_HTTP_METHODS = HTTP_METHODS.join(',');\n\nexport type AccessControlHeaders = HttpSchema.Headers<{\n 'access-control-allow-origin': string;\n 'access-control-allow-methods': string;\n 'access-control-allow-headers': string;\n 'access-control-expose-headers': string;\n 'access-control-max-age'?: string;\n}>;\n\n/** The default access control headers for the server. */\nexport const DEFAULT_ACCESS_CONTROL_HEADERS = Object.freeze({\n 'access-control-allow-origin': '*',\n 'access-control-allow-methods': ALLOWED_ACCESS_CONTROL_HTTP_METHODS,\n 'access-control-allow-headers': '*',\n 'access-control-expose-headers': '*',\n 'access-control-max-age': process.env.SERVER_ACCESS_CONTROL_MAX_AGE,\n}) satisfies AccessControlHeaders;\n\n/** The default status code for the preflight request. */\nexport const DEFAULT_PREFLIGHT_STATUS_CODE = 204;\n\nexport const DEFAULT_LOG_UNHANDLED_REQUESTS = true;\n","/* istanbul ignore next -- @preserve */\n/** An error thrown when the interceptor server is not running. */\nclass NotStartedInterceptorServerError extends Error {\n constructor() {\n super('The interceptor server is not running.');\n this.name = 'NotStartedInterceptorServerError';\n }\n}\n\nexport default NotStartedInterceptorServerError;\n","import { FetchAPI } from '@whatwg-node/server';\n\nimport { importFile } from '@/utils/files';\n\nexport async function getFetchAPI(): Promise<FetchAPI> {\n return {\n fetch,\n Request,\n Response,\n Headers,\n FormData,\n ReadableStream,\n WritableStream,\n TransformStream,\n CompressionStream,\n DecompressionStream,\n TextDecoderStream,\n TextEncoderStream,\n Blob,\n File: await importFile(),\n crypto: globalThis.crypto,\n btoa,\n TextEncoder,\n TextDecoder,\n URLPattern,\n URL,\n URLSearchParams,\n };\n}\n","import { normalizeNodeRequest, sendNodeResponse } from '@whatwg-node/server';\nimport { HttpRequest, HttpMethod } from '@zimic/http';\nimport createRegExpFromURL from '@zimic/utils/url/createRegExpFromURL';\nimport excludeURLParams from '@zimic/utils/url/excludeURLParams';\nimport { createServer, Server as HttpServer, IncomingMessage, ServerResponse } from 'http';\nimport type { WebSocket as Socket } from 'isomorphic-ws';\n\nimport HttpInterceptorWorker from '@/http/interceptorWorker/HttpInterceptorWorker';\nimport { removeArrayIndex } from '@/utils/arrays';\nimport { deserializeResponse, SerializedHttpRequest, serializeRequest } from '@/utils/fetch';\nimport { getHttpServerPort, startHttpServer, stopHttpServer } from '@/utils/http';\nimport { WebSocketMessageAbortError } from '@/utils/webSocket';\nimport { WebSocket } from '@/webSocket/types';\nimport WebSocketServer from '@/webSocket/WebSocketServer';\n\nimport {\n DEFAULT_ACCESS_CONTROL_HEADERS,\n DEFAULT_PREFLIGHT_STATUS_CODE,\n DEFAULT_LOG_UNHANDLED_REQUESTS,\n} from './constants';\nimport NotStartedInterceptorServerError from './errors/NotStartedInterceptorServerError';\nimport { InterceptorServerOptions } from './types/options';\nimport { InterceptorServer as PublicInterceptorServer } from './types/public';\nimport { HttpHandlerCommit, InterceptorServerWebSocketSchema } from './types/schema';\nimport { getFetchAPI } from './utils/fetch';\n\ninterface HttpHandler {\n id: string;\n url: {\n base: string;\n fullRegex: RegExp;\n };\n socket: Socket;\n}\n\nclass InterceptorServer implements PublicInterceptorServer {\n private _httpServer?: HttpServer;\n private _webSocketServer?: WebSocketServer<InterceptorServerWebSocketSchema>;\n\n private _hostname: string;\n private _port?: number;\n private _logUnhandledRequests: boolean;\n\n private httpHandlerGroups: {\n [Method in HttpMethod]: HttpHandler[];\n } = {\n GET: [],\n POST: [],\n PATCH: [],\n PUT: [],\n DELETE: [],\n HEAD: [],\n OPTIONS: [],\n };\n\n private knownWorkerSockets = new Set<Socket>();\n\n constructor(options: InterceptorServerOptions) {\n this._hostname = options.hostname ?? 'localhost';\n this._port = options.port;\n this._logUnhandledRequests = options.logUnhandledRequests ?? DEFAULT_LOG_UNHANDLED_REQUESTS;\n }\n\n hostname() {\n return this._hostname;\n }\n\n port() {\n return this._port;\n }\n\n logUnhandledRequests() {\n return this._logUnhandledRequests;\n }\n\n httpURL() {\n if (this._port === undefined) {\n return undefined;\n }\n return `http://${this._hostname}:${this._port}`;\n }\n\n isRunning() {\n return !!this._httpServer?.listening && !!this._webSocketServer?.isRunning();\n }\n\n private httpServer() {\n /* istanbul ignore if -- @preserve\n * The HTTP server is initialized before using this method in normal conditions. */\n if (!this._httpServer) {\n throw new NotStartedInterceptorServerError();\n }\n return this._httpServer;\n }\n\n private webSocketServer() {\n /* istanbul ignore if -- @preserve\n * The web socket server is initialized before using this method in normal conditions. */\n if (!this._webSocketServer) {\n throw new NotStartedInterceptorServerError();\n }\n return this._webSocketServer;\n }\n\n async start() {\n if (this.isRunning()) {\n return;\n }\n\n this._httpServer = createServer({\n keepAlive: true,\n joinDuplicateHeaders: true,\n });\n await this.startHttpServer();\n\n this._webSocketServer = new WebSocketServer({\n httpServer: this._httpServer,\n });\n this.startWebSocketServer();\n }\n\n private async startHttpServer() {\n const httpServer = this.httpServer();\n\n await startHttpServer(httpServer, {\n hostname: this._hostname,\n port: this._port,\n });\n this._port = getHttpServerPort(httpServer);\n\n httpServer.on('request', this.handleHttpRequest);\n }\n\n private startWebSocketServer() {\n const webSocketServer = this.webSocketServer();\n\n webSocketServer.start();\n webSocketServer.onEvent('interceptors/workers/use/commit', this.commitWorker);\n webSocketServer.onEvent('interceptors/workers/use/reset', this.resetWorker);\n }\n\n private commitWorker = (\n message: WebSocket.ServiceEventMessage<InterceptorServerWebSocketSchema, 'interceptors/workers/use/commit'>,\n socket: Socket,\n ) => {\n const commit = message.data;\n this.registerHttpHandler(commit, socket);\n this.registerWorkerSocketIfUnknown(socket);\n return {};\n };\n\n private resetWorker = (\n message: WebSocket.ServiceEventMessage<InterceptorServerWebSocketSchema, 'interceptors/workers/use/reset'>,\n socket: Socket,\n ) => {\n this.removeHttpHandlersBySocket(socket);\n\n const handlersToResetTo = message.data;\n const isWorkerNoLongerCommitted = handlersToResetTo === undefined;\n\n if (isWorkerNoLongerCommitted) {\n // When a worker is no longer committed, we should abort all requests that were using it.\n // This ensures that we only wait for responses from committed worker sockets.\n this.webSocketServer().abortSocketMessages([socket]);\n } else {\n for (const handler of handlersToResetTo) {\n this.registerHttpHandler(handler, socket);\n }\n }\n\n this.registerWorkerSocketIfUnknown(socket);\n\n return {};\n };\n\n private registerHttpHandler({ id, url, method }: HttpHandlerCommit, socket: Socket) {\n const handlerGroups = this.httpHandlerGroups[method];\n\n const fullURL = new URL(url.full);\n excludeURLParams(fullURL);\n\n handlerGroups.push({\n id,\n url: {\n base: url.base,\n fullRegex: createRegExpFromURL(fullURL.toString()),\n },\n socket,\n });\n }\n\n private registerWorkerSocketIfUnknown(socket: Socket) {\n if (this.knownWorkerSockets.has(socket)) {\n return;\n }\n\n socket.addEventListener('close', () => {\n this.removeHttpHandlersBySocket(socket);\n this.knownWorkerSockets.delete(socket);\n });\n\n this.knownWorkerSockets.add(socket);\n }\n\n private removeHttpHandlersBySocket(socket: Socket) {\n for (const handlerGroups of Object.values(this.httpHandlerGroups)) {\n const socketIndex = handlerGroups.findIndex((handlerGroup) => handlerGroup.socket === socket);\n removeArrayIndex(handlerGroups, socketIndex);\n }\n }\n\n stop = async () => {\n if (!this.isRunning()) {\n return;\n }\n\n await this.stopWebSocketServer();\n await this.stopHttpServer();\n };\n\n private async stopHttpServer() {\n const httpServer = this.httpServer();\n\n await stopHttpServer(httpServer);\n httpServer.removeAllListeners();\n\n this._httpServer = undefined;\n }\n\n private async stopWebSocketServer() {\n const webSocketServer = this.webSocketServer();\n\n webSocketServer.offEvent('interceptors/workers/use/commit', this.commitWorker);\n webSocketServer.offEvent('interceptors/workers/use/reset', this.resetWorker);\n await webSocketServer.stop();\n\n this._webSocketServer = undefined;\n }\n\n private handleHttpRequest = async (nodeRequest: IncomingMessage, nodeResponse: ServerResponse) => {\n const request = normalizeNodeRequest(nodeRequest, await getFetchAPI());\n const serializedRequest = await serializeRequest(request);\n\n try {\n const { response, matchedSomeInterceptor } = await this.createResponseForRequest(serializedRequest);\n\n if (response) {\n this.setDefaultAccessControlHeaders(response, ['access-control-allow-origin', 'access-control-expose-headers']);\n await sendNodeResponse(response, nodeResponse, nodeRequest);\n return;\n }\n\n const isUnhandledPreflightResponse = request.method === 'OPTIONS';\n\n if (isUnhandledPreflightResponse) {\n const defaultPreflightResponse = new Response(null, { status: DEFAULT_PREFLIGHT_STATUS_CODE });\n this.setDefaultAccessControlHeaders(defaultPreflightResponse);\n await sendNodeResponse(defaultPreflightResponse, nodeResponse, nodeRequest);\n }\n\n const shouldWarnUnhandledRequest = !isUnhandledPreflightResponse && !matchedSomeInterceptor;\n\n if (shouldWarnUnhandledRequest) {\n await this.logUnhandledRequestIfNecessary(request, serializedRequest);\n }\n\n nodeResponse.destroy();\n } catch (error) {\n const isMessageAbortError = error instanceof WebSocketMessageAbortError;\n\n if (!isMessageAbortError) {\n console.error(error);\n await this.logUnhandledRequestIfNecessary(request, serializedRequest);\n }\n\n nodeResponse.destroy();\n }\n };\n\n private async createResponseForRequest(request: SerializedHttpRequest) {\n const webSocketServer = this.webSocketServer();\n const methodHandlers = this.httpHandlerGroups[request.method as HttpMethod];\n\n const requestURL = excludeURLParams(new URL(request.url)).toString();\n\n let matchedSomeInterceptor = false;\n\n for (let index = methodHandlers.length - 1; index >= 0; index--) {\n const handler = methodHandlers[index];\n\n const matchesHandlerURL = handler.url.fullRegex.test(requestURL);\n if (!matchesHandlerURL) {\n continue;\n }\n\n matchedSomeInterceptor = true;\n\n const { response: serializedResponse } = await webSocketServer.request(\n 'interceptors/responses/create',\n { handlerId: handler.id, request },\n { sockets: [handler.socket] },\n );\n\n if (serializedResponse) {\n const response = deserializeResponse(serializedResponse);\n return { response, matchedSomeInterceptor };\n }\n }\n\n return { response: null, matchedSomeInterceptor };\n }\n\n private setDefaultAccessControlHeaders(\n response: Response,\n headersToSet = Object.keys(DEFAULT_ACCESS_CONTROL_HEADERS),\n ) {\n for (const key of headersToSet) {\n if (response.headers.has(key)) {\n continue;\n }\n\n const value = DEFAULT_ACCESS_CONTROL_HEADERS[key];\n /* istanbul ignore else -- @preserve\n * This is always true during tests because we force max-age=0 to disable CORS caching. */\n if (value) {\n response.headers.set(key, value);\n }\n }\n }\n\n private async logUnhandledRequestIfNecessary(request: HttpRequest, serializedRequest: SerializedHttpRequest) {\n const webSocketServer = this.webSocketServer();\n\n const handler = this.findHttpHandlerByRequestBaseURL(request);\n\n if (handler) {\n try {\n const { wasLogged: wasRequestLoggedByRemoteInterceptor } = await webSocketServer.request(\n 'interceptors/responses/unhandled',\n { request: serializedRequest },\n { sockets: [handler.socket] },\n );\n\n if (wasRequestLoggedByRemoteInterceptor) {\n return;\n }\n } catch (error) {\n /* istanbul ignore next -- @preserve\n * This try..catch is for the case when the remote interceptor web socket client is closed before responding.\n * Since simulating this scenario is difficult, we are ignoring this branch fow now. */\n const isMessageAbortError = error instanceof WebSocketMessageAbortError;\n\n /* istanbul ignore next -- @preserve */\n if (!isMessageAbortError) {\n throw error;\n }\n }\n }\n\n if (!this._logUnhandledRequests) {\n return;\n }\n\n await HttpInterceptorWorker.logUnhandledRequestWarning(request, 'reject');\n }\n\n private findHttpHandlerByRequestBaseURL(request: HttpRequest) {\n const methodHandlers = this.httpHandlerGroups[request.method as HttpMethod];\n\n const handler = methodHandlers.findLast((handler) => {\n return request.url.startsWith(handler.url.base);\n });\n\n return handler;\n }\n}\n\nexport default InterceptorServer;\n","import InterceptorServer from './InterceptorServer';\nimport { InterceptorServerOptions } from './types/options';\nimport { InterceptorServer as PublicInterceptorServer } from './types/public';\n\n/**\n * Creates an {@link https://github.com/zimicjs/zimic/wiki/cli‐zimic‐server#zimic-server interceptor server}.\n *\n * @param options The options to create the server.\n * @returns The created server.\n * @see {@link https://github.com/zimicjs/zimic/wiki/cli‐zimic‐server#zimic-server-programmatic-usage `zimic-interceptor server` programmatic usage}\n * @see {@link https://github.com/zimicjs/zimic/wiki/getting‐started#remote-http-interceptors Remote HTTP Interceptors} .\n */\nexport function createInterceptorServer(options: InterceptorServerOptions = {}): PublicInterceptorServer {\n return new InterceptorServer(options);\n}\n","import { createInterceptorServer } from '../factory';\n\n/**\n * A namespace of interceptor server resources for handling HTTP requests.\n *\n * @see {@link https://github.com/zimicjs/zimic/wiki/cli‐zimic‐server#zimic-server-programmatic-usage `zimic-interceptor server` programmatic usage}\n * @see {@link https://github.com/zimicjs/zimic/wiki/getting‐started#remote-http-interceptors Remote HTTP Interceptors} .\n */\nclass InterceptorServerNamespace {\n /**\n * Creates an {@link https://github.com/zimicjs/zimic/wiki/cli‐zimic‐server#zimic-server interceptor server}.\n *\n * @param options The options to create the server.\n * @returns The created server.\n * @see {@link https://github.com/zimicjs/zimic/wiki/cli‐zimic‐server#zimic-server-programmatic-usage `zimic-interceptor server` programmatic usage}\n * @see {@link https://github.com/zimicjs/zimic/wiki/getting‐started#remote-http-interceptors Remote HTTP Interceptors} .\n */\n create = createInterceptorServer;\n}\n\nexport default InterceptorServerNamespace;\n","import InterceptorServerNamespace from './namespace/InterceptorServerNamespace';\n\nexport { default as NotStartedInterceptorServerError } from './errors/NotStartedInterceptorServerError';\n\nexport type { InterceptorServerOptions } from './types/options';\nexport type { InterceptorServer } from './types/public';\n\nexport { DEFAULT_ACCESS_CONTROL_HEADERS, DEFAULT_PREFLIGHT_STATUS_CODE } from './constants';\n\n/**\n * A namespace of interceptor server resources for handling HTTP requests.\n *\n * @see {@link https://github.com/zimicjs/zimic/wiki/cli‐zimic‐server#zimic-server `zimic-interceptor server` API reference}\n * @see {@link https://github.com/zimicjs/zimic/wiki/getting‐started#remote-http-interceptors Remote HTTP Interceptors} .\n */\nexport const interceptorServer = Object.freeze(new InterceptorServerNamespace());\n\nexport type { InterceptorServerNamespace };\n"]}
|
|
@@ -9,12 +9,12 @@ import ClientSocket from 'isomorphic-ws';
|
|
|
9
9
|
var __defProp = Object.defineProperty;
|
|
10
10
|
var __name2 = /* @__PURE__ */ __name((target, value) => __defProp(target, "name", { value, configurable: true }), "__name");
|
|
11
11
|
|
|
12
|
-
// ../zimic-utils/dist/chunk-
|
|
12
|
+
// ../zimic-utils/dist/chunk-RIVHLEFF.mjs
|
|
13
13
|
var URL_PATH_PARAM_REGEX = /\/:([^/]+)/g;
|
|
14
14
|
function createRegExpFromURL(url) {
|
|
15
15
|
URL_PATH_PARAM_REGEX.lastIndex = 0;
|
|
16
|
-
const urlWithReplacedPathParams = encodeURI(url).replace(/([.()*?+$\\])/g, "\\$1").replace(URL_PATH_PARAM_REGEX, "/(?<$1>[^/]+)").replace(
|
|
17
|
-
return new RegExp(
|
|
16
|
+
const urlWithReplacedPathParams = encodeURI(url).replace(/([.()*?+$\\])/g, "\\$1").replace(URL_PATH_PARAM_REGEX, "/(?<$1>[^/]+)").replace(/^(\/)|(\/)$/g, "");
|
|
17
|
+
return new RegExp(`^(?:/)?${urlWithReplacedPathParams}(?:/)?$`);
|
|
18
18
|
}
|
|
19
19
|
__name(createRegExpFromURL, "createRegExpFromURL");
|
|
20
20
|
__name2(createRegExpFromURL, "createRegExpFromURL");
|
|
@@ -34,7 +34,7 @@ var excludeURLParams_default = excludeURLParams;
|
|
|
34
34
|
|
|
35
35
|
// ../zimic-utils/dist/chunk-3O5CS47X.mjs
|
|
36
36
|
function isDefined(value) {
|
|
37
|
-
return value !==
|
|
37
|
+
return value !== void 0 && value !== null;
|
|
38
38
|
}
|
|
39
39
|
__name(isDefined, "isDefined");
|
|
40
40
|
__name2(isDefined, "isDefined");
|
|
@@ -58,7 +58,7 @@ __name(removeArrayElement, "removeArrayElement");
|
|
|
58
58
|
function createCachedDynamicImport(importModuleDynamically) {
|
|
59
59
|
let cachedImportResult;
|
|
60
60
|
return /* @__PURE__ */ __name2(/* @__PURE__ */ __name(async function importModuleDynamicallyWithCache() {
|
|
61
|
-
if (cachedImportResult ===
|
|
61
|
+
if (cachedImportResult === void 0) {
|
|
62
62
|
cachedImportResult = await importModuleDynamically();
|
|
63
63
|
}
|
|
64
64
|
return cachedImportResult;
|
|
@@ -70,7 +70,7 @@ var createCachedDynamicImport_default = createCachedDynamicImport;
|
|
|
70
70
|
|
|
71
71
|
// src/utils/environment.ts
|
|
72
72
|
function isClientSide() {
|
|
73
|
-
return typeof window !== "undefined";
|
|
73
|
+
return typeof window !== "undefined" && typeof document !== "undefined";
|
|
74
74
|
}
|
|
75
75
|
__name(isClientSide, "isClientSide");
|
|
76
76
|
|
|
@@ -179,7 +179,7 @@ __name(stopHttpServer, "stopHttpServer");
|
|
|
179
179
|
function getHttpServerPort(server) {
|
|
180
180
|
const address = server.address();
|
|
181
181
|
if (typeof address === "string") {
|
|
182
|
-
return
|
|
182
|
+
return void 0;
|
|
183
183
|
} else {
|
|
184
184
|
return address?.port;
|
|
185
185
|
}
|
|
@@ -322,7 +322,7 @@ var HttpInterceptorWorker = class _HttpInterceptorWorker {
|
|
|
322
322
|
this.stoppingPromise = stoppingResult;
|
|
323
323
|
await this.stoppingPromise;
|
|
324
324
|
}
|
|
325
|
-
this.stoppingPromise =
|
|
325
|
+
this.stoppingPromise = void 0;
|
|
326
326
|
}
|
|
327
327
|
async logUnhandledRequestIfNecessary(request, strategy) {
|
|
328
328
|
if (strategy?.log) {
|
|
@@ -407,7 +407,7 @@ var HttpInterceptorWorker = class _HttpInterceptorWorker {
|
|
|
407
407
|
if (!canHaveBody) {
|
|
408
408
|
return new Response(null, { headers, status });
|
|
409
409
|
}
|
|
410
|
-
if (typeof declaration.body === "string" || declaration.body ===
|
|
410
|
+
if (typeof declaration.body === "string" || declaration.body === void 0 || declaration.body instanceof FormData || declaration.body instanceof URLSearchParams || declaration.body instanceof Blob || declaration.body instanceof ArrayBuffer) {
|
|
411
411
|
return new Response(declaration.body ?? null, { headers, status });
|
|
412
412
|
}
|
|
413
413
|
return Response.json(declaration.body, { headers, status });
|
|
@@ -434,7 +434,7 @@ var HttpInterceptorWorker = class _HttpInterceptorWorker {
|
|
|
434
434
|
},
|
|
435
435
|
get(target, property) {
|
|
436
436
|
if (_HttpInterceptorWorker.isHiddenRequestProperty(property)) {
|
|
437
|
-
return
|
|
437
|
+
return void 0;
|
|
438
438
|
}
|
|
439
439
|
return Reflect.get(target, property, target);
|
|
440
440
|
}
|
|
@@ -488,7 +488,7 @@ var HttpInterceptorWorker = class _HttpInterceptorWorker {
|
|
|
488
488
|
},
|
|
489
489
|
get(target, property) {
|
|
490
490
|
if (_HttpInterceptorWorker.isHiddenResponseProperty(property)) {
|
|
491
|
-
return
|
|
491
|
+
return void 0;
|
|
492
492
|
}
|
|
493
493
|
return Reflect.get(target, property, target);
|
|
494
494
|
}
|
|
@@ -1094,7 +1094,7 @@ var WebSocketServer = class extends WebSocketHandler_default {
|
|
|
1094
1094
|
this.httpServer = options.httpServer;
|
|
1095
1095
|
}
|
|
1096
1096
|
isRunning() {
|
|
1097
|
-
return this.webSocketServer !==
|
|
1097
|
+
return this.webSocketServer !== void 0;
|
|
1098
1098
|
}
|
|
1099
1099
|
start() {
|
|
1100
1100
|
if (this.isRunning()) {
|
|
@@ -1122,7 +1122,7 @@ var WebSocketServer = class extends WebSocketHandler_default {
|
|
|
1122
1122
|
await super.closeClientSockets();
|
|
1123
1123
|
await closeServerSocket(this.webSocketServer, { timeout: this.socketTimeout() });
|
|
1124
1124
|
this.webSocketServer.removeAllListeners();
|
|
1125
|
-
this.webSocketServer =
|
|
1125
|
+
this.webSocketServer = void 0;
|
|
1126
1126
|
}
|
|
1127
1127
|
};
|
|
1128
1128
|
var WebSocketServer_default = WebSocketServer;
|
|
@@ -1212,8 +1212,8 @@ var InterceptorServer = class {
|
|
|
1212
1212
|
return this._logUnhandledRequests;
|
|
1213
1213
|
}
|
|
1214
1214
|
httpURL() {
|
|
1215
|
-
if (this._port ===
|
|
1216
|
-
return
|
|
1215
|
+
if (this._port === void 0) {
|
|
1216
|
+
return void 0;
|
|
1217
1217
|
}
|
|
1218
1218
|
return `http://${this._hostname}:${this._port}`;
|
|
1219
1219
|
}
|
|
@@ -1270,7 +1270,7 @@ var InterceptorServer = class {
|
|
|
1270
1270
|
resetWorker = /* @__PURE__ */ __name((message, socket) => {
|
|
1271
1271
|
this.removeHttpHandlersBySocket(socket);
|
|
1272
1272
|
const handlersToResetTo = message.data;
|
|
1273
|
-
const isWorkerNoLongerCommitted = handlersToResetTo ===
|
|
1273
|
+
const isWorkerNoLongerCommitted = handlersToResetTo === void 0;
|
|
1274
1274
|
if (isWorkerNoLongerCommitted) {
|
|
1275
1275
|
this.webSocketServer().abortSocketMessages([socket]);
|
|
1276
1276
|
} else {
|
|
@@ -1321,14 +1321,14 @@ var InterceptorServer = class {
|
|
|
1321
1321
|
const httpServer = this.httpServer();
|
|
1322
1322
|
await stopHttpServer(httpServer);
|
|
1323
1323
|
httpServer.removeAllListeners();
|
|
1324
|
-
this._httpServer =
|
|
1324
|
+
this._httpServer = void 0;
|
|
1325
1325
|
}
|
|
1326
1326
|
async stopWebSocketServer() {
|
|
1327
1327
|
const webSocketServer = this.webSocketServer();
|
|
1328
1328
|
webSocketServer.offEvent("interceptors/workers/use/commit", this.commitWorker);
|
|
1329
1329
|
webSocketServer.offEvent("interceptors/workers/use/reset", this.resetWorker);
|
|
1330
1330
|
await webSocketServer.stop();
|
|
1331
|
-
this._webSocketServer =
|
|
1331
|
+
this._webSocketServer = void 0;
|
|
1332
1332
|
}
|
|
1333
1333
|
handleHttpRequest = /* @__PURE__ */ __name(async (nodeRequest, nodeResponse) => {
|
|
1334
1334
|
const request = normalizeNodeRequest(nodeRequest, await getFetchAPI());
|
|
@@ -1482,5 +1482,5 @@ var interceptorServer = Object.freeze(new InterceptorServerNamespace_default());
|
|
|
1482
1482
|
* Since simulating this scenario is difficult, we are ignoring this branch fow now. */
|
|
1483
1483
|
|
|
1484
1484
|
export { DEFAULT_ACCESS_CONTROL_HEADERS, DEFAULT_PREFLIGHT_STATUS_CODE, NotStartedInterceptorServerError_default, createCachedDynamicImport_default, interceptorServer, logWithPrefix };
|
|
1485
|
-
//# sourceMappingURL=chunk-
|
|
1486
|
-
//# sourceMappingURL=chunk-
|
|
1485
|
+
//# sourceMappingURL=chunk-FEGMEAEO.mjs.map
|
|
1486
|
+
//# sourceMappingURL=chunk-FEGMEAEO.mjs.map
|