@zimic/interceptor 0.14.0-canary.22 → 0.14.0-canary.23
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-JIUQ7G6N.js → chunk-BJLJWEVE.js} +2 -2
- package/dist/chunk-BJLJWEVE.js.map +1 -0
- package/dist/{chunk-5ESJW32X.mjs → chunk-QSY6YMZ7.mjs} +2 -2
- package/dist/chunk-QSY6YMZ7.mjs.map +1 -0
- package/dist/cli.js +7 -7
- package/dist/cli.js.map +1 -1
- package/dist/cli.mjs +2 -2
- package/dist/cli.mjs.map +1 -1
- package/dist/http.d.ts +6 -3
- package/dist/http.js.map +1 -1
- package/dist/http.mjs.map +1 -1
- package/dist/server.js +5 -5
- package/dist/server.mjs +1 -1
- package/package.json +3 -3
- package/src/http/requestHandler/types/requests.ts +9 -3
- package/dist/chunk-5ESJW32X.mjs.map +0 -1
- package/dist/chunk-JIUQ7G6N.js.map +0 -1
|
@@ -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-BJLJWEVE.js.map
|
|
1498
|
+
//# sourceMappingURL=chunk-BJLJWEVE.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-BJLJWEVE.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(/(\\/+)$/, '(?:/+)?');\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 isClientSide() {\n return typeof window !== '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"]}
|
|
@@ -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-QSY6YMZ7.mjs.map
|
|
1486
|
+
//# sourceMappingURL=chunk-QSY6YMZ7.mjs.map
|