{"version":3,"sources":["../src/http/interceptor/errors/RunningHttpInterceptorError.ts","../src/http/interceptor/errors/NotRunningHttpInterceptorError.ts","../src/http/interceptor/errors/UnknownHttpInterceptorPlatformError.ts","../src/http/interceptor/errors/UnknownHttpInterceptorTypeError.ts","../src/http/interceptor/errors/RequestSavingSafeLimitExceededError.ts","../src/cli/browser/shared/constants.ts","../src/http/interceptorWorker/errors/UnregisteredBrowserServiceWorkerError.ts","../src/http/requestHandler/errors/DisabledRequestSavingError.ts","../../zimic-utils/src/data/isDefined.ts","../../zimic-utils/src/data/isNonEmpty.ts","../../zimic-utils/src/data/blobEquals.ts","../../zimic-utils/src/data/isPrimitiveJSONValue.ts","../../zimic-utils/src/data/jsonContains.ts","../../zimic-utils/src/data/jsonEquals.ts","../../zimic-utils/src/import/createCachedDynamicImport.ts","../../zimic-utils/src/logging/Logger.ts","../src/utils/environment.ts","../src/utils/logging.ts","../src/http/errors/HttpTimesCheckError.ts","../../zimic-utils/src/time/waitForDelay.ts","../src/utils/data.ts","../src/utils/numbers.ts","../src/http/errors/HttpTimesDeclarationPointer.ts","../src/http/requestHandler/HttpRequestHandlerImplementation.ts","../src/http/requestHandler/LocalHttpRequestHandler.ts","../../zimic-utils/src/url/createRegexFromPath.ts","../../zimic-utils/src/url/excludeNonPathParams.ts","../../zimic-utils/src/url/validatePathParams.ts","../../zimic-utils/src/url/validateURLProtocol.ts","../src/utils/arrays.ts","../src/utils/http.ts","../src/http/requestHandler/types/requests.ts","../src/http/interceptorWorker/constants.ts","../src/http/interceptorWorker/HttpInterceptorWorker.ts","../src/http/requestHandler/RemoteHttpRequestHandler.ts","../src/http/interceptor/HttpInterceptorImplementation.ts","../src/http/interceptorWorker/LocalHttpInterceptorWorker.ts","../src/server/errors/UnsupportedResponseBypassError.ts","../src/utils/fetch.ts","../src/utils/webSocket/errors/UnauthorizedWebSocketConnectionError.ts","../src/utils/webSocket.ts","../src/utils/webSocket/constants.ts","../src/utils/webSocket/errors/InvalidWebSocketMessageError.ts","../src/utils/webSocket/errors/NotRunningWebSocketHandlerError.ts","../src/utils/webSocket/WebSocketHandler.ts","../src/utils/webSocket/WebSocketClient.ts","../src/http/interceptorWorker/RemoteHttpInterceptorWorker.ts","../src/http/interceptorWorker/factory.ts","../src/http/interceptor/HttpInterceptorStore.ts","../src/http/interceptor/LocalHttpInterceptor.ts","../src/http/interceptor/RemoteHttpInterceptor.ts","../src/http/interceptor/factory.ts","../src/http/index.ts"],"names":["color","value","HttpHeaders","HttpSearchParams","matchesRestriction","HttpFormData","protocol","interceptor","response","HttpInvalidFormDataError","HttpInvalidJSONError"],"mappings":"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","file":"http.mjs","sourcesContent":["/**\n * An error thrown when the interceptor is running and some operation requires it to be stopped first.\n *\n * @see {@link https://zimic.dev/docs/interceptor/api/http-interceptor#interceptorstart `interceptor.start()` API reference}\n * @see {@link https://zimic.dev/docs/interceptor/api/http-interceptor#interceptorstop `interceptor.stop()` API reference}\n * @see {@link https://zimic.dev/docs/interceptor/api/http-interceptor#interceptorisrunning `interceptor.isRunning` API reference}\n */\nclass RunningHttpInterceptorError extends Error {\n  constructor(additionalMessage: string) {\n    super(`The interceptor is running. ${additionalMessage}`);\n    this.name = 'RunningHttpInterceptorError';\n  }\n}\n\nexport default RunningHttpInterceptorError;\n","/**\n * An error thrown when the interceptor is not running and it's not possible to use the mocking utilities.\n *\n * @see {@link https://zimic.dev/docs/interceptor/api/http-interceptor#interceptorstart `interceptor.start()` API reference}\n * @see {@link https://zimic.dev/docs/interceptor/api/http-interceptor#interceptorstop `interceptor.stop()` API reference}\n * @see {@link https://zimic.dev/docs/interceptor/api/http-interceptor#interceptorisrunning `interceptor.isRunning` API reference}\n */\nclass NotRunningHttpInterceptorError extends Error {\n  constructor() {\n    super('Interceptor is not running. Did you forget to call `await interceptor.start()`?');\n    this.name = 'NotRunningHttpInterceptorError';\n  }\n}\n\nexport default NotRunningHttpInterceptorError;\n","/**\n * An error thrown when an unknown interceptor platform is detected. Currently, the platforms `node` and `browser` are\n * supported.\n *\n * @see {@link https://zimic.dev/docs/interceptor/api/http-interceptor#interceptorplatform `interceptor.platform` API reference}\n */\nclass UnknownHttpInterceptorPlatformError extends Error {\n  /* istanbul ignore next -- @preserve\n   * Ignoring because checking unknown platforms is currently not possible in our Vitest setup. */\n  constructor() {\n    super('Unknown interceptor platform.');\n    this.name = 'UnknownHttpInterceptorPlatformError';\n  }\n}\n\nexport default UnknownHttpInterceptorPlatformError;\n","import { HttpInterceptorType } from '../types/options';\n\nclass UnknownHttpInterceptorTypeError extends TypeError {\n  constructor(unknownType: unknown) {\n    super(\n      `Unknown HTTP interceptor type: ${unknownType}. The available options are ` +\n        `'${'local' satisfies HttpInterceptorType}' and ` +\n        `'${'remote' satisfies HttpInterceptorType}'.`,\n    );\n    this.name = 'UnknownHttpInterceptorTypeError';\n  }\n}\n\nexport default UnknownHttpInterceptorTypeError;\n","/**\n * Error thrown when the safe limit of saved intercepted requests is exceeded.\n *\n * @see {@link https://zimic.dev/docs/interceptor/api/create-http-interceptor `createHttpInterceptor` API reference}\n */\nclass RequestSavingSafeLimitExceededError extends TypeError {\n  constructor(numberOfSavedRequests: number, safeLimit: number) {\n    super(\n      `The number of intercepted requests saved in memory (${numberOfSavedRequests}) exceeded the safe limit of ` +\n        `${safeLimit}. Did you forget to call \\`interceptor.clear()\\`?\\n\\n` +\n        'If you need to save requests, make sure to regularly call `interceptor.clear()`. Alternatively, you can ' +\n        'hide this warning by increasing `requestSaving.safeLimit` in your interceptor. Note that saving too many ' +\n        'requests in memory can lead to performance issues.\\n\\n' +\n        'If you do not need to save requests, consider setting `requestSaving.enabled: false` in your ' +\n        'interceptor.\\n\\n' +\n        'Learn more: https://zimic.dev/docs/interceptor/api/create-http-interceptor',\n    );\n    this.name = 'RequestSavingSafeLimitExceededError';\n  }\n}\n\nexport default RequestSavingSafeLimitExceededError;\n","export const SERVICE_WORKER_FILE_NAME = 'mockServiceWorker.js';\n","import { SERVICE_WORKER_FILE_NAME } from '@/cli/browser/shared/constants';\n\n/**\n * An error thrown when the browser mock service worker is not found.\n *\n * @see {@link https://zimic.dev/docs/interceptor/cli/browser#zimic-interceptor-browser-init `zimic-interceptor browser init` API reference}\n */\nclass UnregisteredBrowserServiceWorkerError extends Error {\n  constructor() {\n    super(\n      'Failed to register the browser service worker: ' +\n        `script '${window.location.origin}/${SERVICE_WORKER_FILE_NAME}' not found.\\n\\n` +\n        'Did you forget to run `zimic-interceptor browser init <publicDirectory>`?\\n\\n' +\n        'Learn more: https://zimic.dev/docs/interceptor/cli/browser#zimic-interceptor-browser-init',\n    );\n    this.name = 'UnregisteredBrowserServiceWorkerError';\n  }\n\n  static matchesRawError(error: unknown) {\n    return (\n      error instanceof Error &&\n      error.message.toLowerCase().includes('service worker script does not exist at the given path')\n    );\n  }\n}\n\nexport default UnregisteredBrowserServiceWorkerError;\n","/**\n * Error thrown when trying to access requests when the interceptor is not configured to do so.\n *\n * @see {@link https://zimic.dev/docs/interceptor/api/create-http-interceptor `createHttpInterceptor` API reference}\n */\nclass DisabledRequestSavingError extends TypeError {\n  constructor() {\n    super(\n      'Intercepted requests are not being saved. ' +\n        'Did you forget to use `requestSaving.enabled: true` in your interceptor?\\n\\n' +\n        'Learn more: https://zimic.dev/docs/interceptor/api/create-http-interceptor',\n    );\n    this.name = 'DisabledRequestSavingError';\n  }\n}\n\nexport default DisabledRequestSavingError;\n","function isDefined<Value>(value: Value): value is NonNullable<Value> {\n  return value !== undefined && value !== null;\n}\n\nexport default isDefined;\n","import isDefined from './isDefined';\n\nfunction isNonEmpty<Value>(value: Value): value is Exclude<NonNullable<Value>, ''> {\n  return isDefined(value) && value !== '';\n}\n\nexport default isNonEmpty;\n","async function blobEquals(blob: Blob, otherBlob: Blob) {\n  if (blob.type !== otherBlob.type || blob.size !== otherBlob.size) {\n    return false;\n  }\n\n  const reader = blob.stream().getReader();\n  const otherReader = otherBlob.stream().getReader();\n\n  let buffer: Uint8Array = new Uint8Array(0);\n  let otherBuffer: Uint8Array = new Uint8Array(0);\n\n  try {\n    while (true) {\n      const bufferReadPromises: Promise<void>[] = [];\n\n      if (buffer.length === 0) {\n        bufferReadPromises.push(\n          reader.read().then((result) => {\n            if (!result.done) {\n              buffer = result.value;\n            }\n          }),\n        );\n      }\n\n      if (otherBuffer.length === 0) {\n        bufferReadPromises.push(\n          otherReader.read().then((result) => {\n            if (!result.done) {\n              otherBuffer = result.value;\n            }\n          }),\n        );\n      }\n\n      await Promise.all(bufferReadPromises);\n\n      const haveStreamsEndedTogether = buffer.length === 0 && otherBuffer.length === 0;\n\n      if (haveStreamsEndedTogether) {\n        return true;\n      }\n\n      const hasOneStreamEndedBeforeTheOther =\n        (buffer.length === 0 && otherBuffer.length > 0) || (buffer.length > 0 && otherBuffer.length === 0);\n\n      if (hasOneStreamEndedBeforeTheOther) {\n        return false;\n      }\n\n      const minimumByteLength = Math.min(buffer.length, otherBuffer.length);\n\n      for (let byteIndex = 0; byteIndex < minimumByteLength; byteIndex++) {\n        if (buffer[byteIndex] !== otherBuffer[byteIndex]) {\n          return false;\n        }\n      }\n\n      buffer = buffer.slice(minimumByteLength);\n      otherBuffer = otherBuffer.slice(minimumByteLength);\n    }\n  } finally {\n    reader.releaseLock();\n    otherReader.releaseLock();\n  }\n}\n\nexport default blobEquals;\n","import { JSONValue } from '@/types/json';\n\nexport function isPrimitiveJSONValue<Value extends JSONValue>(value: Value): value is Exclude<Value, object> {\n  return typeof value !== 'object' || value === null;\n}\n","import { JSONValue } from '@/types/json';\n\nimport { isPrimitiveJSONValue } from './isPrimitiveJSONValue';\n\nfunction jsonContains(value: JSONValue, otherValue: JSONValue): boolean {\n  if (isPrimitiveJSONValue(value)) {\n    return value === otherValue;\n  }\n  if (isPrimitiveJSONValue(otherValue)) {\n    return false;\n  }\n\n  if (Array.isArray<JSONValue>(value)) {\n    if (!Array.isArray<JSONValue>(otherValue)) {\n      return false;\n    }\n    if (value.length < otherValue.length) {\n      return false;\n    }\n\n    let lastMatchedIndex = -1;\n    return otherValue.every((otherItem) => {\n      for (let index = lastMatchedIndex + 1; index < value.length; index++) {\n        if (jsonContains(value[index], otherItem)) {\n          lastMatchedIndex = index;\n          return true;\n        }\n      }\n      return false;\n    });\n  }\n\n  if (Array.isArray<JSONValue>(otherValue)) {\n    return false;\n  }\n\n  const valueKeys = Object.keys(value);\n  const otherValueKeys = Object.keys(otherValue);\n\n  if (valueKeys.length < otherValueKeys.length) {\n    return false;\n  }\n\n  return otherValueKeys.every((key) => {\n    const subValue = value[key];\n    const subOtherValue = otherValue[key];\n    return jsonContains(subValue, subOtherValue);\n  });\n}\n\nexport default jsonContains;\n","import { JSONValue } from '@/types/json';\n\nimport { isPrimitiveJSONValue } from './isPrimitiveJSONValue';\n\nfunction jsonEquals(value: JSONValue, otherValue: JSONValue): boolean {\n  if (isPrimitiveJSONValue(value)) {\n    return value === otherValue;\n  }\n  if (isPrimitiveJSONValue(otherValue)) {\n    return false;\n  }\n\n  if (Array.isArray<JSONValue>(value)) {\n    if (!Array.isArray<JSONValue>(otherValue)) {\n      return false;\n    }\n    if (value.length !== otherValue.length) {\n      return false;\n    }\n    return value.every((item, index) => jsonEquals(item, otherValue[index]));\n  }\n\n  if (Array.isArray<JSONValue>(otherValue)) {\n    return false;\n  }\n\n  const valueKeys = Object.keys(value);\n  const otherValueKeys = Object.keys(otherValue);\n\n  if (valueKeys.length !== otherValueKeys.length) {\n    return false;\n  }\n\n  return valueKeys.every((key) => {\n    const subValue = value[key];\n    const subOtherValue = otherValue[key];\n    return jsonEquals(subValue, subOtherValue);\n  });\n}\n\nexport default jsonEquals;\n","function createCachedDynamicImport<ImportType>(\n  importModuleDynamically: () => Promise<ImportType>,\n): () => Promise<ImportType> {\n  let cachedImportResult: ImportType | undefined;\n\n  return async function importModuleDynamicallyWithCache() {\n    cachedImportResult ??= await importModuleDynamically();\n    return cachedImportResult;\n  };\n}\n\nexport default createCachedDynamicImport;\n","export type TableLogRow = Record<string, string>;\n\nexport interface TableLogHeader<Row extends TableLogRow> {\n  title: string;\n  property: keyof Row;\n}\n\nexport interface LoggerOptions {\n  prefix?: string;\n}\n\nclass Logger {\n  prefix?: string;\n\n  raw: Logger;\n\n  constructor(options: LoggerOptions = {}) {\n    const { prefix } = options;\n\n    this.prefix = prefix;\n\n    this.raw = prefix ? new Logger({ ...options, prefix: undefined }) : this;\n  }\n\n  private logWithLevel(level: 'log' | 'warn' | 'error', ...messages: unknown[]) {\n    if (this.prefix) {\n      console[level](this.prefix, ...messages);\n    } else {\n      console[level](...messages);\n    }\n  }\n\n  info(...messages: unknown[]) {\n    this.logWithLevel('log', ...messages);\n  }\n\n  warn(...messages: unknown[]) {\n    this.logWithLevel('warn', ...messages);\n  }\n\n  error(...messages: unknown[]) {\n    this.logWithLevel('error', ...messages);\n  }\n\n  table<Row extends TableLogRow>(headers: TableLogHeader<Row>[], rows: Row[]) {\n    const columnLengths = headers.map((header) => {\n      let maxValueLength = header.title.length;\n\n      for (const row of rows) {\n        const value = row[header.property];\n\n        if (value.length > maxValueLength) {\n          maxValueLength = value.length;\n        }\n      }\n\n      return maxValueLength;\n    });\n\n    const formattedRows: string[][] = [];\n\n    const horizontalLine = columnLengths.map((length) => '─'.repeat(length));\n    formattedRows.push(horizontalLine, []);\n\n    for (let headerIndex = 0; headerIndex < headers.length; headerIndex++) {\n      const header = headers[headerIndex];\n      const columnLength = columnLengths[headerIndex];\n\n      const value = header.title;\n      formattedRows.at(-1)?.push(value.padEnd(columnLength, ' '));\n    }\n\n    formattedRows.push(horizontalLine);\n\n    for (const row of rows) {\n      formattedRows.push([]);\n\n      for (let headerIndex = 0; headerIndex < headers.length; headerIndex++) {\n        const header = headers[headerIndex];\n        const columnLength = columnLengths[headerIndex];\n\n        const value = row[header.property];\n        formattedRows.at(-1)?.push(value.padEnd(columnLength, ' '));\n      }\n    }\n\n    formattedRows.push(horizontalLine);\n\n    const formattedTable = formattedRows\n      .map((row, index) => {\n        const isFirstLine = index === 0;\n        if (isFirstLine) {\n          return `┌─${row.join('─┬─')}─┐`;\n        }\n\n        const isLineAfterHeaders = index === 2;\n        if (isLineAfterHeaders) {\n          return `├─${row.join('─┼─')}─┤`;\n        }\n\n        const isLastLine = index === formattedRows.length - 1;\n        if (isLastLine) {\n          return `└─${row.join('─┴─')}─┘`;\n        }\n\n        return `│ ${row.join(' │ ')} │`;\n      })\n      .join('\\n');\n\n    this.logWithLevel('log', formattedTable);\n  }\n}\n\nexport default Logger;\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 { HttpFormData, HttpHeaders, HttpSearchParams } from '@zimic/http';\nimport { createCachedDynamicImport } from '@zimic/utils/import';\nimport { Logger } from '@zimic/utils/logging';\nimport color from 'picocolors';\n\nimport { isClientSide } from './environment';\n\nexport const logger = new Logger({\n  prefix: color.cyan('[@zimic/interceptor]'),\n});\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 (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","import { isNonEmpty } from '@zimic/utils/data';\nimport { Range } from '@zimic/utils/types';\nimport color from 'picocolors';\n\nimport { HttpInterceptorRequestSaving } from '@/http/interceptor/types/public';\nimport { stringifyValueToLog } from '@/utils/logging';\n\nimport { UnmatchedHttpInterceptorRequestGroup } from '../requestHandler/types/restrictions';\nimport HttpTimesDeclarationPointer from './HttpTimesDeclarationPointer';\n\ninterface HttpTimesCheckErrorOptions {\n  requestLimits: Range<number>;\n  numberOfMatchedRequests: number;\n  declarationPointer: HttpTimesDeclarationPointer | undefined;\n  unmatchedRequestGroups: UnmatchedHttpInterceptorRequestGroup[];\n  hasRestrictions: boolean;\n  requestSaving: HttpInterceptorRequestSaving;\n}\n\nfunction createMessageHeader({\n  requestLimits,\n  hasRestrictions,\n  numberOfMatchedRequests,\n  unmatchedRequestGroups,\n}: HttpTimesCheckErrorOptions) {\n  const requestPrefix = hasRestrictions ? 'matching ' : '';\n\n  return [\n    'Expected ',\n\n    requestLimits.min === requestLimits.max ? 'exactly ' : 'at least ',\n    requestLimits.min,\n\n    requestLimits.min === requestLimits.max &&\n      (requestLimits.min === 1 ? ` ${requestPrefix}request` : ` ${requestPrefix}requests`),\n\n    requestLimits.min !== requestLimits.max &&\n      Number.isFinite(requestLimits.max) &&\n      ` and at most ${requestLimits.max}`,\n\n    requestLimits.min !== requestLimits.max &&\n      (requestLimits.max === 1 ? ` ${requestPrefix}request` : ` ${requestPrefix}requests`),\n\n    ', but got ',\n    numberOfMatchedRequests,\n    '.',\n\n    unmatchedRequestGroups.length > 0 &&\n      `\\n\\nRequests evaluated by this handler:\\n\\n  ${color.green('- Expected')}\\n  ${color.red('+ Received')}`,\n  ]\n    .filter((part) => part !== false)\n    .join('');\n}\n\nfunction createMessageDiffs({ requestSaving, unmatchedRequestGroups }: HttpTimesCheckErrorOptions) {\n  if (!requestSaving.enabled) {\n    return 'Tip: use `requestSaving.enabled: true` in your interceptor for more details about the unmatched requests.';\n  }\n\n  return unmatchedRequestGroups\n    .map(({ request, diff }, index) => {\n      const requestNumber = index + 1;\n\n      const messageParts = [`${requestNumber}: ${request.method} ${request.url}`];\n\n      if (diff.computed) {\n        messageParts.push('Computed restriction:');\n\n        const stringifiedExpected = stringifyValueToLog(diff.computed.expected);\n        const stringifiedReceived = stringifyValueToLog(diff.computed.received);\n\n        messageParts.push(`  ${color.green(`- return ${stringifiedExpected}`)}`);\n        messageParts.push(`  ${color.red(`+ return ${stringifiedReceived}`)}`);\n      }\n\n      if (diff.headers) {\n        messageParts.push('Headers:');\n\n        const stringifiedExpected = stringifyValueToLog(diff.headers.expected);\n        const stringifiedReceived = stringifyValueToLog(diff.headers.received);\n\n        messageParts.push(`  ${color.green(`- ${stringifiedExpected}`)}`);\n        messageParts.push(`  ${color.red(`+ ${stringifiedReceived}`)}`);\n      }\n\n      if (diff.searchParams) {\n        messageParts.push('Search params:');\n\n        const stringifiedExpected = stringifyValueToLog(diff.searchParams.expected);\n        const stringifiedReceived = stringifyValueToLog(diff.searchParams.received);\n\n        messageParts.push(`  ${color.green(`- ${stringifiedExpected}`)}`);\n        messageParts.push(`  ${color.red(`+ ${stringifiedReceived}`)}`);\n      }\n\n      if (diff.body) {\n        messageParts.push('Body:');\n\n        const stringifiedExpected = stringifyValueToLog(diff.body.expected, {\n          includeClassName: { searchParams: true },\n        });\n        const stringifiedReceived = stringifyValueToLog(diff.body.received, {\n          includeClassName: { searchParams: true },\n        });\n\n        messageParts.push(`  ${color.green(`- ${stringifiedExpected}`)}`);\n        messageParts.push(`  ${color.red(`+ ${stringifiedReceived}`)}`);\n      }\n\n      return messageParts.join('\\n     ');\n    })\n    .join('\\n\\n');\n}\n\nfunction createMessageFooter() {\n  return 'Learn more: https://zimic.dev/docs/interceptor/api/http-request-handler#handlertimes';\n}\n\nfunction createMessage(options: HttpTimesCheckErrorOptions) {\n  const messageHeader = createMessageHeader(options);\n  const messageDiffs = createMessageDiffs(options);\n  const messageFooter = createMessageFooter();\n\n  return [messageHeader, messageDiffs, messageFooter].filter(isNonEmpty).join('\\n\\n');\n}\n\n/**\n * Error thrown when the number of requests matched by a handler does not satisfy its `handler.times()` declaration.\n *\n * @deprecated `TimesCheckError` has been renamed to `HttpTimesCheckError`.\n */\nexport class TimesCheckError extends TypeError {\n  constructor(options: HttpTimesCheckErrorOptions) {\n    const message = createMessage(options);\n    super(message);\n\n    this.name = 'TimesCheckError';\n    this.cause = options.declarationPointer;\n  }\n}\n\n/** Error thrown when the number of requests matched by a handler does not satisfy its `handler.times()` declaration. */\n// eslint-disable-next-line @typescript-eslint/no-deprecated\nclass HttpTimesCheckError extends TimesCheckError {\n  constructor(options: HttpTimesCheckErrorOptions) {\n    // eslint-disable-next-line @typescript-eslint/no-deprecated\n    super(options);\n\n    this.name = 'HttpTimesCheckError';\n  }\n}\n\nexport default HttpTimesCheckError;\n","function waitForDelay(milliseconds: number) {\n  return new Promise<void>((resolve) => {\n    setTimeout(resolve, milliseconds);\n  });\n}\n\nexport default waitForDelay;\n","import { isClientSide } from './environment';\n\nexport async function convertReadableStreamToBlob(\n  stream: ReadableStream<Uint8Array<ArrayBuffer>>,\n  options?: BlobPropertyBag,\n): Promise<Blob> {\n  const chunks: Uint8Array<ArrayBuffer>[] = [];\n  const reader = stream.getReader();\n\n  while (true) {\n    const result = await reader.read();\n\n    if (result.value) {\n      chunks.push(result.value);\n    }\n\n    if (result.done) {\n      break;\n    }\n  }\n\n  return new Blob(chunks, options);\n}\n\nexport function convertArrayBufferToBlob(buffer: ArrayBuffer, options?: BlobPropertyBag): Blob {\n  return new Blob([buffer], options);\n}\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\nexport const HEX_REGEX = /^[a-z0-9]+$/;\n\nexport function convertHexLengthToByteLength(hexLength: number) {\n  return Math.ceil(hexLength / 2); // 1 byte = 2 hex characters\n}\n\nexport const BASE64URL_REGEX = /^[a-zA-Z0-9-_]+$/;\n\nexport function convertHexLengthToBase64urlLength(hexLength: number) {\n  const byteLength = convertHexLengthToByteLength(hexLength);\n  return Math.ceil((byteLength * 4) / 3); // 1 byte = 4/3 base64url characters\n}\n","export function random(lowerLimit: number, upperLimit: number): number {\n  const range = Math.max(upperLimit - lowerLimit, 0);\n\n  if (range === 0) {\n    return lowerLimit;\n  }\n\n  return Math.random() * range + lowerLimit;\n}\n\nexport function randomInt(lowerLimit: number, upperLimit: number): number {\n  return Math.floor(random(lowerLimit, upperLimit));\n}\n","class HttpTimesDeclarationPointer extends Error {\n  constructor(minNumberOfRequests: number, maxNumberOfRequests?: number) {\n    super('declared at:');\n    this.name = `handler.times(${minNumberOfRequests}${\n      maxNumberOfRequests === undefined ? '' : `, ${maxNumberOfRequests}`\n    })`;\n  }\n}\n\nexport default HttpTimesDeclarationPointer;\n","import {\n  HttpSchemaMethod,\n  HttpSchemaPath,\n  HttpStatusCode,\n  HttpFormData,\n  HttpHeaders,\n  HttpSearchParams,\n  HttpSchema,\n  HttpRequestSearchParamsSchema,\n  HttpRequestHeadersSchema,\n} from '@zimic/http';\nimport { blobEquals, jsonContains, jsonEquals } from '@zimic/utils/data';\nimport { waitForDelay } from '@zimic/utils/time';\nimport { Default, Range } from '@zimic/utils/types';\n\nimport { convertArrayBufferToBlob, convertReadableStreamToBlob } from '@/utils/data';\nimport { random } from '@/utils/numbers';\n\nimport HttpTimesCheckError from '../errors/HttpTimesCheckError';\nimport HttpTimesDeclarationPointer from '../errors/HttpTimesDeclarationPointer';\nimport HttpInterceptorImplementation from '../interceptor/HttpInterceptorImplementation';\nimport DisabledRequestSavingError from './errors/DisabledRequestSavingError';\nimport { InternalHttpRequestHandler } from './types/public';\nimport {\n  HttpInterceptorRequest,\n  HttpInterceptorResponse,\n  HttpRequestHandlerResponseDeclaration,\n  HttpRequestHandlerResponseDeclarationFactory,\n  HttpRequestHandlerResponseDelayFactory,\n  InterceptedHttpInterceptorRequest,\n} from './types/requests';\nimport {\n  HttpRequestHandlerRestriction,\n  RestrictionDiff,\n  RestrictionDiffs,\n  RestrictionMatchResult,\n  HttpRequestHandlerStaticRestriction,\n  UnmatchedHttpInterceptorRequestGroup,\n} from './types/restrictions';\n\nconst DEFAULT_NUMBER_OF_REQUEST_LIMITS: Range<number> = Object.freeze({\n  min: 0,\n  max: Infinity,\n});\n\nexport type HttpRequestHandlerRequestMatch =\n  | { success: true }\n  | { success: false; cause: 'missingResponseDeclaration' | 'exceededNumberOfRequests' }\n  | { success: false; cause: 'unmatchedRestrictions'; diff: RestrictionDiffs };\n\nclass HttpRequestHandlerImplementation<\n  Schema extends HttpSchema,\n  Method extends HttpSchemaMethod<Schema>,\n  Path extends HttpSchemaPath<Schema, Method>,\n  StatusCode extends HttpStatusCode = never,\n> {\n  private restrictions: HttpRequestHandlerRestriction<Schema, Method, Path>[] = [];\n\n  private limits = {\n    numberOfRequests: DEFAULT_NUMBER_OF_REQUEST_LIMITS,\n  };\n\n  private timesPointer?: HttpTimesDeclarationPointer;\n\n  private numberOfMatchedRequests = 0;\n  private unmatchedRequestGroups: UnmatchedHttpInterceptorRequestGroup[] = [];\n  private savedInterceptedRequests: InterceptedHttpInterceptorRequest<\n    Path,\n    Default<Schema[Path][Method]>,\n    StatusCode\n  >[] = [];\n\n  private createResponseDeclaration?: HttpRequestHandlerResponseDeclarationFactory<\n    Path,\n    Default<Schema[Path][Method]>,\n    StatusCode\n  >;\n\n  private createResponseDelay?: HttpRequestHandlerResponseDelayFactory<Path, Default<Schema[Path][Method]>>;\n\n  constructor(\n    private interceptor: HttpInterceptorImplementation<Schema>,\n    public method: Method,\n    public path: Path,\n    private handler: InternalHttpRequestHandler<Schema, Method, Path, StatusCode>,\n  ) {}\n\n  with(restriction: HttpRequestHandlerRestriction<Schema, Method, Path>): this {\n    this.restrictions.push(restriction);\n    return this;\n  }\n\n  delay(\n    minMilliseconds: number | HttpRequestHandlerResponseDelayFactory<Path, Default<Schema[Path][Method]>>,\n    maxMilliseconds?: number,\n  ): this {\n    if (minMilliseconds === maxMilliseconds) {\n      return this.delay(minMilliseconds);\n    }\n\n    if (typeof minMilliseconds === 'number' && typeof maxMilliseconds === 'number') {\n      this.createResponseDelay = () => random(minMilliseconds, maxMilliseconds);\n      return this;\n    }\n\n    if (typeof minMilliseconds === 'number') {\n      this.createResponseDelay = () => minMilliseconds;\n      return this;\n    }\n\n    this.createResponseDelay = minMilliseconds;\n    return this;\n  }\n\n  respond<NewStatusCode extends HttpStatusCode>(\n    declaration:\n      | HttpRequestHandlerResponseDeclaration<Default<Schema[Path][Method]>, NewStatusCode>\n      | HttpRequestHandlerResponseDeclarationFactory<Path, Default<Schema[Path][Method]>, NewStatusCode>,\n  ): HttpRequestHandlerImplementation<Schema, Method, Path, NewStatusCode> {\n    const newThis = this as unknown as HttpRequestHandlerImplementation<Schema, Method, Path, NewStatusCode>;\n\n    newThis.createResponseDeclaration = this.isResponseDeclarationFactory(declaration)\n      ? declaration\n      : () => declaration;\n\n    newThis.numberOfMatchedRequests = 0;\n    newThis.unmatchedRequestGroups.length = 0;\n\n    newThis.clearInterceptedRequests();\n\n    this.interceptor.registerRequestHandler(this.handler);\n\n    return newThis;\n  }\n\n  private isResponseDeclarationFactory(\n    declaration:\n      | HttpRequestHandlerResponseDeclaration<Default<Schema[Path][Method]>>\n      | HttpRequestHandlerResponseDeclarationFactory<Path, Default<Schema[Path][Method]>>,\n  ) {\n    return typeof declaration === 'function';\n  }\n\n  times(\n    minNumberOfRequests: number,\n    maxNumberOfRequests?: number,\n  ): HttpRequestHandlerImplementation<Schema, Method, Path, StatusCode> {\n    this.limits.numberOfRequests = {\n      min: minNumberOfRequests,\n      max: maxNumberOfRequests ?? minNumberOfRequests,\n    };\n\n    this.timesPointer = new HttpTimesDeclarationPointer(minNumberOfRequests, maxNumberOfRequests);\n\n    return this;\n  }\n\n  checkTimes() {\n    const isWithinLimits =\n      this.numberOfMatchedRequests >= this.limits.numberOfRequests.min &&\n      this.numberOfMatchedRequests <= this.limits.numberOfRequests.max;\n\n    if (!isWithinLimits) {\n      throw new HttpTimesCheckError({\n        requestLimits: this.limits.numberOfRequests,\n        numberOfMatchedRequests: this.numberOfMatchedRequests,\n        declarationPointer: this.timesPointer,\n        unmatchedRequestGroups: this.unmatchedRequestGroups,\n        hasRestrictions: this.restrictions.length > 0,\n        requestSaving: this.interceptor.requestSaving,\n      });\n    }\n  }\n\n  clear(): this {\n    this.restrictions.length = 0;\n\n    this.limits = {\n      numberOfRequests: DEFAULT_NUMBER_OF_REQUEST_LIMITS,\n    };\n\n    this.timesPointer = undefined;\n\n    this.numberOfMatchedRequests = 0;\n    this.unmatchedRequestGroups.length = 0;\n\n    this.clearInterceptedRequests();\n\n    this.createResponseDeclaration = undefined;\n    this.createResponseDelay = undefined;\n\n    return this;\n  }\n\n  async matchesRequest(\n    request: HttpInterceptorRequest<Path, Default<Schema[Path][Method]>>,\n  ): Promise<HttpRequestHandlerRequestMatch> {\n    const restrictionsMatch = await this.matchesRestrictions(request);\n\n    if (!restrictionsMatch.success) {\n      return { success: false, cause: 'unmatchedRestrictions', diff: restrictionsMatch.diff };\n    }\n\n    const hasResponseDeclaration = this.createResponseDeclaration !== undefined;\n\n    if (!hasResponseDeclaration) {\n      return { success: false, cause: 'missingResponseDeclaration' };\n    }\n\n    const canAcceptMoreRequests = this.numberOfMatchedRequests < this.limits.numberOfRequests.max;\n\n    if (!canAcceptMoreRequests) {\n      return { success: false, cause: 'exceededNumberOfRequests' };\n    }\n\n    return { success: true };\n  }\n\n  markRequestAsMatched(_request: HttpInterceptorRequest<Path, Default<Schema[Path][Method]>>) {\n    this.numberOfMatchedRequests++;\n  }\n\n  markRequestAsUnmatched(\n    request: HttpInterceptorRequest<Path, Default<Schema[Path][Method]>>,\n    options: { diff: RestrictionDiffs },\n  ) {\n    const shouldSaveUnmatchedRequests =\n      this.interceptor.requestSaving.enabled && this.restrictions.length > 0 && this.timesPointer !== undefined;\n\n    if (shouldSaveUnmatchedRequests) {\n      this.unmatchedRequestGroups.push({ request, diff: options.diff });\n    }\n  }\n\n  async matchesRestrictions(\n    request: HttpInterceptorRequest<Path, Default<Schema[Path][Method]>>,\n  ): Promise<RestrictionMatchResult<RestrictionDiffs>> {\n    for (const restriction of this.restrictions) {\n      if (this.isComputedRequestRestriction(restriction)) {\n        const matchesComputedRestriction = await restriction(request);\n\n        if (!matchesComputedRestriction) {\n          return {\n            success: false,\n            diff: { computed: { expected: true, received: false } },\n          };\n        }\n\n        continue;\n      }\n\n      const matchesHeadersRestrictions = this.matchesRequestHeadersRestrictions(request, restriction);\n      const matchesSearchParamsRestrictions = this.matchesRequestSearchParamsRestrictions(request, restriction);\n      const matchesBodyRestrictions = await this.matchesRequestBodyRestrictions(request, restriction);\n\n      const matchesRestriction =\n        matchesHeadersRestrictions.success &&\n        matchesSearchParamsRestrictions.success &&\n        matchesBodyRestrictions.success;\n\n      if (!matchesRestriction) {\n        return {\n          success: false,\n          diff: {\n            headers: matchesHeadersRestrictions.diff,\n            searchParams: matchesSearchParamsRestrictions.diff,\n            body: matchesBodyRestrictions.diff,\n          },\n        };\n      }\n    }\n\n    return { success: true };\n  }\n\n  private matchesRequestHeadersRestrictions(\n    request: HttpInterceptorRequest<Path, Default<Schema[Path][Method]>>,\n    restriction: HttpRequestHandlerStaticRestriction<Schema, Method, Path>,\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  ): RestrictionMatchResult<RestrictionDiff<HttpHeaders<any>>> {\n    if (restriction.headers === undefined) {\n      return { success: true };\n    }\n\n    const restrictedHeaders = new HttpHeaders(\n      restriction.headers as Default<HttpRequestHeadersSchema<Default<Schema[Path][Method]>>>,\n    );\n\n    const matchesRestriction = restriction.exact\n      ? request.headers.equals(restrictedHeaders)\n      : request.headers.contains(restrictedHeaders);\n\n    return matchesRestriction\n      ? { success: true }\n      : {\n          success: false,\n          diff: { expected: restrictedHeaders, received: request.headers },\n        };\n  }\n\n  private matchesRequestSearchParamsRestrictions(\n    request: HttpInterceptorRequest<Path, Default<Schema[Path][Method]>>,\n    restriction: HttpRequestHandlerStaticRestriction<Schema, Method, Path>,\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  ): RestrictionMatchResult<RestrictionDiff<HttpSearchParams<any>>> {\n    if (restriction.searchParams === undefined) {\n      return { success: true };\n    }\n\n    const restrictedSearchParams = new HttpSearchParams(\n      restriction.searchParams as Default<HttpRequestSearchParamsSchema<Default<Schema[Path][Method]>>>,\n    );\n\n    const matchesRestriction = restriction.exact\n      ? request.searchParams.equals(restrictedSearchParams)\n      : request.searchParams.contains(restrictedSearchParams);\n\n    return matchesRestriction\n      ? { success: true }\n      : {\n          success: false,\n          diff: { expected: restrictedSearchParams, received: request.searchParams },\n        };\n  }\n\n  private async matchesRequestBodyRestrictions(\n    request: HttpInterceptorRequest<Path, Default<Schema[Path][Method]>>,\n    restriction: HttpRequestHandlerStaticRestriction<Schema, Method, Path>,\n  ): Promise<RestrictionMatchResult<RestrictionDiff<unknown>>> {\n    if (restriction.body === undefined) {\n      return { success: true };\n    }\n\n    const body = request.body as unknown;\n    const restrictionBody = restriction.body as unknown;\n\n    if (typeof body === 'string' && typeof restrictionBody === 'string') {\n      const matchesRestriction = restriction.exact ? body === restrictionBody : body.includes(restrictionBody);\n\n      return matchesRestriction\n        ? { success: true }\n        : {\n            success: false,\n            diff: { expected: restrictionBody, received: body },\n          };\n    }\n\n    if (restrictionBody instanceof HttpFormData) {\n      if (!(body instanceof HttpFormData)) {\n        return {\n          success: false,\n          diff: { expected: restrictionBody, received: body },\n        };\n      }\n\n      const matchesRestriction = restriction.exact\n        ? await body.equals(restrictionBody)\n        : await body.contains(restrictionBody);\n\n      return matchesRestriction\n        ? { success: true }\n        : {\n            success: false,\n            diff: { expected: restrictionBody, received: body },\n          };\n    }\n\n    if (restrictionBody instanceof HttpSearchParams) {\n      if (!(body instanceof HttpSearchParams)) {\n        return {\n          success: false,\n          diff: { expected: restrictionBody, received: body },\n        };\n      }\n\n      const matchesRestriction = restriction.exact ? body.equals(restrictionBody) : body.contains(restrictionBody);\n\n      return matchesRestriction\n        ? { success: true }\n        : {\n            success: false,\n            diff: { expected: restrictionBody, received: body },\n          };\n    }\n\n    if (\n      restrictionBody instanceof Blob ||\n      restrictionBody instanceof ArrayBuffer ||\n      restrictionBody instanceof ReadableStream\n    ) {\n      if (!(body instanceof Blob)) {\n        return {\n          success: false,\n          diff: { expected: restrictionBody, received: body },\n        };\n      }\n\n      let restrictionBodyAsBlob: Blob;\n\n      if (restrictionBody instanceof ArrayBuffer) {\n        restrictionBodyAsBlob = convertArrayBufferToBlob(restrictionBody, { type: body.type });\n      } else if (restrictionBody instanceof ReadableStream) {\n        restrictionBodyAsBlob = await convertReadableStreamToBlob(\n          restrictionBody as ReadableStream<Uint8Array<ArrayBuffer>>,\n          { type: body.type },\n        );\n      } else {\n        restrictionBodyAsBlob = restrictionBody;\n      }\n\n      const matchesRestriction = await blobEquals(body, restrictionBodyAsBlob);\n\n      return matchesRestriction\n        ? { success: true }\n        : {\n            success: false,\n            diff: { expected: restrictionBody, received: body },\n          };\n    }\n\n    const matchesRestriction = restriction.exact\n      ? jsonEquals(request.body, restriction.body)\n      : jsonContains(request.body, restriction.body);\n\n    return matchesRestriction\n      ? { success: true }\n      : {\n          success: false,\n          diff: { expected: restrictionBody, received: body },\n        };\n  }\n\n  private isComputedRequestRestriction(restriction: HttpRequestHandlerRestriction<Schema, Method, Path>) {\n    return typeof restriction === 'function';\n  }\n\n  async applyResponseDeclaration(request: HttpInterceptorRequest<Path, Default<Schema[Path][Method]>>) {\n    if (this.createResponseDelay) {\n      const delay = await this.createResponseDelay(request);\n\n      if (delay > 0) {\n        await waitForDelay(delay);\n      }\n    }\n\n    const appliedDeclaration = await this.createResponseDeclaration?.(request);\n    return appliedDeclaration;\n  }\n\n  saveInterceptedRequest(\n    request: HttpInterceptorRequest<Path, Default<Schema[Path][Method]>>,\n    response: HttpInterceptorResponse<Default<Schema[Path][Method]>, StatusCode>,\n  ) {\n    const interceptedRequest = this.createInterceptedRequest(request, response);\n    this.savedInterceptedRequests.push(interceptedRequest);\n    this.interceptor.incrementNumberOfSavedRequests(1);\n  }\n\n  private clearInterceptedRequests() {\n    this.interceptor.incrementNumberOfSavedRequests(-this.savedInterceptedRequests.length);\n    this.savedInterceptedRequests.length = 0;\n  }\n\n  private createInterceptedRequest(\n    request: HttpInterceptorRequest<Path, Default<Schema[Path][Method]>>,\n    response: HttpInterceptorResponse<Default<Schema[Path][Method]>, StatusCode>,\n  ) {\n    const interceptedRequest = request as InterceptedHttpInterceptorRequest<\n      Path,\n      Default<Schema[Path][Method]>,\n      StatusCode\n    >;\n\n    Object.defineProperty(interceptedRequest, 'response', {\n      value: response,\n      enumerable: true,\n      configurable: false,\n      writable: false,\n    });\n\n    return interceptedRequest;\n  }\n\n  get requests(): readonly InterceptedHttpInterceptorRequest<Path, Default<Schema[Path][Method]>, StatusCode>[] {\n    if (!this.interceptor.requestSaving.enabled) {\n      throw new DisabledRequestSavingError();\n    }\n    return this.savedInterceptedRequests;\n  }\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type AnyHttpRequestHandlerImplementation = HttpRequestHandlerImplementation<any, any, any, any>;\n\nexport default HttpRequestHandlerImplementation;\n","import { HttpSchema, HttpSchemaMethod, HttpSchemaPath, HttpStatusCode } from '@zimic/http';\nimport { Default } from '@zimic/utils/types';\n\nimport HttpInterceptorImplementation from '../interceptor/HttpInterceptorImplementation';\nimport HttpRequestHandlerImplementation from './HttpRequestHandlerImplementation';\nimport { InternalHttpRequestHandler } from './types/public';\nimport {\n  HttpInterceptorRequest,\n  HttpInterceptorResponse,\n  HttpRequestHandlerResponseDeclaration,\n  HttpRequestHandlerResponseDeclarationFactory,\n  HttpRequestHandlerResponseDelayFactory,\n  InterceptedHttpInterceptorRequest,\n} from './types/requests';\nimport { HttpRequestHandlerRestriction } from './types/restrictions';\n\nclass LocalHttpRequestHandler<\n  Schema extends HttpSchema,\n  Method extends HttpSchemaMethod<Schema>,\n  Path extends HttpSchemaPath<Schema, Method>,\n  StatusCode extends HttpStatusCode = never,\n> implements InternalHttpRequestHandler<Schema, Method, Path, StatusCode> {\n  readonly type = 'local';\n\n  implementation: HttpRequestHandlerImplementation<Schema, Method, Path, StatusCode>;\n\n  constructor(interceptor: HttpInterceptorImplementation<Schema>, method: Method, path: Path) {\n    this.implementation = new HttpRequestHandlerImplementation(interceptor, method, path, this);\n  }\n\n  get method() {\n    return this.implementation.method;\n  }\n\n  get path() {\n    return this.implementation.path;\n  }\n\n  with(restriction: HttpRequestHandlerRestriction<Schema, Method, Path>): this {\n    this.implementation.with(restriction);\n    return this;\n  }\n\n  delay(\n    minMilliseconds: number | HttpRequestHandlerResponseDelayFactory<Path, Default<Schema[Path][Method]>>,\n    maxMilliseconds?: number,\n  ): this {\n    this.implementation.delay(minMilliseconds, maxMilliseconds);\n    return this;\n  }\n\n  respond<NewStatusCode extends HttpStatusCode>(\n    declaration:\n      | HttpRequestHandlerResponseDeclaration<Default<Schema[Path][Method]>, NewStatusCode>\n      | HttpRequestHandlerResponseDeclarationFactory<Path, Default<Schema[Path][Method]>, NewStatusCode>,\n  ): LocalHttpRequestHandler<Schema, Method, Path, NewStatusCode> {\n    this.implementation.respond(declaration);\n\n    const newThis = this as unknown as LocalHttpRequestHandler<Schema, Method, Path, NewStatusCode>;\n    return newThis;\n  }\n\n  times(minNumberOfRequests: number, maxNumberOfRequests?: number): this {\n    this.implementation.times(minNumberOfRequests, maxNumberOfRequests);\n    return this;\n  }\n\n  checkTimes() {\n    this.implementation.checkTimes();\n  }\n\n  clear(): this {\n    this.implementation.clear();\n    return this;\n  }\n\n  get requests(): readonly InterceptedHttpInterceptorRequest<Path, Default<Schema[Path][Method]>, StatusCode>[] {\n    return this.implementation.requests;\n  }\n\n  async matchesRequest(request: HttpInterceptorRequest<Path, Default<Schema[Path][Method]>>) {\n    const requestMatch = await this.implementation.matchesRequest(request);\n\n    if (requestMatch.success) {\n      this.implementation.markRequestAsMatched(request);\n    } else if (requestMatch.cause === 'unmatchedRestrictions') {\n      this.implementation.markRequestAsUnmatched(request, { diff: requestMatch.diff });\n    } else {\n      this.implementation.markRequestAsMatched(request);\n    }\n\n    return requestMatch;\n  }\n\n  async applyResponseDeclaration(request: HttpInterceptorRequest<Path, Default<Schema[Path][Method]>>) {\n    return this.implementation.applyResponseDeclaration(request);\n  }\n\n  saveInterceptedRequest(\n    request: HttpInterceptorRequest<Path, Default<Schema[Path][Method]>>,\n    response: HttpInterceptorResponse<Default<Schema[Path][Method]>, StatusCode>,\n  ) {\n    this.implementation.saveInterceptedRequest(request, response);\n  }\n}\n\nexport type AnyLocalHttpRequestHandler =\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  | LocalHttpRequestHandler<any, any, any>\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  | LocalHttpRequestHandler<any, any, any, any>;\n\nexport default LocalHttpRequestHandler;\n","export function createPathCharactersToEscapeRegex() {\n  return /([.(){}+$])/g;\n}\n\nexport function preparePathForRegex(path: string) {\n  // We encode the path using the URL API because, differently from encodeURI and encodeURIComponent, URL does not\n  // re-encode already encoded characters. Since URL requires a full URL, we use a data scheme and strip it later.\n  const pathURLPrefix = `data:${path.startsWith('/') ? '' : '/'}`;\n  const pathAsURL = new URL(`${pathURLPrefix}${path}`);\n  const encodedPath = pathAsURL.href.replace(pathURLPrefix, '');\n\n  return encodedPath.replace(/^\\/+/g, '').replace(/\\/+$/g, '').replace(createPathCharactersToEscapeRegex(), '\\\\$1');\n}\n\n// Path params names must match the JavaScript identifier pattern.\n// See // https://developer.mozilla.org/docs/Web/JavaScript/Reference/Lexical_grammar#identifiers.\nexport function createPathParamRegex() {\n  return /(?<escape>\\\\)?:(?<identifier>[$_\\p{ID_Start}][$\\p{ID_Continue}]+)(?!\\\\[*+?])/gu;\n}\n\nexport function createRepeatingPathParamRegex() {\n  return /(?<escape>\\\\)?:(?<identifier>[$_\\p{ID_Start}][$\\p{ID_Continue}]+)\\\\\\+/gu;\n}\n\nexport function createOptionalPathParamRegex() {\n  return /(?<leadingSlash>\\/)?(?<escape>\\\\)?:(?<identifier>[$_\\p{ID_Start}][$\\p{ID_Continue}]+)\\?(?<trailingSlash>\\/)?/gu;\n}\n\nexport function createOptionalRepeatingPathParamRegex() {\n  return /(?<leadingSlash>\\/)?(?<escape>\\\\)?:(?<identifier>[$_\\p{ID_Start}][$\\p{ID_Continue}]+)\\*(?<trailingSlash>\\/)?/gu;\n}\n\nfunction createRegexFromPath(path: string) {\n  const pathRegexContent = preparePathForRegex(path)\n    .replace(\n      createOptionalRepeatingPathParamRegex(),\n      (\n        _match,\n        leadingSlash: string | undefined,\n        escape: string | undefined,\n        identifier: string,\n        trailingSlash: string | undefined,\n      ) => {\n        if (escape) {\n          return `${leadingSlash ?? ''}:${identifier}\\\\*${trailingSlash ?? ''}`;\n        }\n\n        const hasSegmentBeforePrefix = leadingSlash === '/';\n        const prefixExpression = hasSegmentBeforePrefix ? '/?' : leadingSlash;\n\n        const hasSegmentAfterSuffix = trailingSlash === '/';\n        const suffixExpression = hasSegmentAfterSuffix ? '/?' : trailingSlash;\n\n        if (prefixExpression && suffixExpression) {\n          return `(?:${prefixExpression}(?<${identifier}>.+?)?${suffixExpression})?`;\n        } else if (prefixExpression) {\n          return `(?:${prefixExpression}(?<${identifier}>.+?))?`;\n        } else if (suffixExpression) {\n          return `(?:(?<${identifier}>.+?)${suffixExpression})?`;\n        } else {\n          return `(?<${identifier}>.+?)?`;\n        }\n      },\n    )\n    .replace(createRepeatingPathParamRegex(), (_match, escape: string | undefined, identifier: string) => {\n      return escape ? `:${identifier}\\\\+` : `(?<${identifier}>.+)`;\n    })\n    .replace(\n      createOptionalPathParamRegex(),\n      (\n        _match,\n        leadingSlash: string | undefined,\n        escape: string | undefined,\n        identifier: string,\n        trailingSlash: string | undefined,\n      ) => {\n        if (escape) {\n          return `${leadingSlash ?? ''}:${identifier}\\\\?${trailingSlash ?? ''}`;\n        }\n\n        const hasSegmentBeforePrefix = leadingSlash === '/';\n        const prefixExpression = hasSegmentBeforePrefix ? '/?' : leadingSlash;\n\n        const hasSegmentAfterSuffix = trailingSlash === '/';\n        const suffixExpression = hasSegmentAfterSuffix ? '/?' : trailingSlash;\n\n        if (prefixExpression && suffixExpression) {\n          return `(?:${prefixExpression}(?<${identifier}>[^\\\\/]+?)?${suffixExpression})`;\n        } else if (prefixExpression) {\n          return `(?:${prefixExpression}(?<${identifier}>[^\\\\/]+?))?`;\n        } else if (suffixExpression) {\n          return `(?:(?<${identifier}>[^\\\\/]+?)${suffixExpression})?`;\n        } else {\n          return `(?<${identifier}>[^\\\\/]+?)?`;\n        }\n      },\n    )\n    .replace(createPathParamRegex(), (_match, escape: string | undefined, identifier: string) => {\n      return escape ? `:${identifier}` : `(?<${identifier}>[^\\\\/]+?)`;\n    });\n\n  return new RegExp(`^/?${pathRegexContent}/?$`);\n}\n\nexport default createRegexFromPath;\n","function excludeNonPathParams(url: URL) {\n  url.hash = '';\n  url.search = '';\n  url.username = '';\n  url.password = '';\n  return url;\n}\n\nexport default excludeNonPathParams;\n","import { createPathParamRegex } from './createRegexFromPath';\n\nexport class DuplicatedPathParamError extends Error {\n  constructor(path: string, paramName: string) {\n    super(\n      `The path parameter '${paramName}' appears more than once in '${path}'. This is not supported. ` +\n        'Please make sure that each parameter is unique.',\n    );\n    this.name = 'DuplicatedPathParamError';\n  }\n}\n\nfunction validatePathParams(path: string) {\n  const pathParamMatches = path.toString().matchAll(createPathParamRegex());\n\n  const uniqueParamNames = new Set<string>();\n\n  for (const paramMatch of pathParamMatches) {\n    const paramName = paramMatch.groups?.identifier;\n\n    if (!paramName) {\n      continue;\n    }\n\n    if (uniqueParamNames.has(paramName)) {\n      throw new DuplicatedPathParamError(path, paramName);\n    }\n\n    uniqueParamNames.add(paramName);\n  }\n}\n\nexport default validatePathParams;\n","export class UnsupportedURLProtocolError extends TypeError {\n  constructor(protocol: string, availableProtocols: string[] | readonly string[]) {\n    super(\n      `Unsupported URL protocol: '${protocol}'. ` +\n        `The available options are ${availableProtocols.map((protocol) => `'${protocol}'`).join(', ')}`,\n    );\n    this.name = 'UnsupportedURLProtocolError';\n  }\n}\n\nfunction validateURLProtocol(url: URL, protocols: string[] | readonly string[]) {\n  const protocol = url.protocol.replace(/:$/, '');\n\n  if (!protocols.includes(protocol)) {\n    throw new UnsupportedURLProtocolError(protocol, protocols);\n  }\n}\n\nexport default validateURLProtocol;\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","import { HttpMethod } from '@zimic/http';\n\nexport const HTTP_METHODS_WITH_REQUEST_BODY = new Set<HttpMethod>(['POST', 'PUT', 'PATCH', 'DELETE']);\n\nexport const HTTP_METHODS_WITH_RESPONSE_BODY = new Set<HttpMethod>([\n  'GET',\n  'POST',\n  'PUT',\n  'PATCH',\n  'DELETE',\n  'OPTIONS',\n]);\n\nexport function methodCanHaveResponseBody(method: HttpMethod) {\n  return HTTP_METHODS_WITH_RESPONSE_BODY.has(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, Replace } from '@zimic/utils/types';\n\nimport { UnhandledRequestStrategy } from '@/http/interceptor/types/options';\n\ntype HttpRequestHandlerResponseBody<\n  ResponseSchema extends HttpResponseSchema,\n  StatusCode extends HttpStatusCode,\n> = HttpResponseBodySchema<{ response: { [Code in StatusCode]: ResponseSchema } }, StatusCode>;\n\nexport type HttpRequestHandlerResponseWithBody<\n  ResponseSchema extends HttpResponseSchema,\n  StatusCode extends HttpStatusCode,\n> = unknown extends ResponseSchema['body']\n  ? { body?: null }\n  : undefined extends ResponseSchema['body']\n    ? { body?: HttpRequestHandlerResponseBody<ResponseSchema, StatusCode> }\n    : { body: HttpRequestHandlerResponseBody<ResponseSchema, StatusCode> };\n\ntype HttpRequestHandlerResponseDeclarationHeaders<ResponseSchema extends HttpResponseSchema> = HttpHeadersInit<\n  PartialByKey<Default<ResponseSchema['headers']>, 'content-type'>\n>;\n\nexport type HttpRequestHandlerResponseDeclarationWithHeaders<ResponseSchema extends HttpResponseSchema> =\n  undefined extends ResponseSchema['headers']\n    ? { headers?: HttpRequestHandlerResponseDeclarationHeaders<ResponseSchema> }\n    : Exclude<keyof ResponseSchema['headers'], symbol> extends 'content-type'\n      ? { headers?: HttpRequestHandlerResponseDeclarationHeaders<ResponseSchema> }\n      : { headers: HttpRequestHandlerResponseDeclarationHeaders<ResponseSchema> };\n\n/** @see {@link https://zimic.dev/docs/interceptor/api/http-request-handler#handlerrespond `handler.respond()` API reference} */\nexport type HttpRequestHandlerStatusResponseDeclaration<\n  MethodSchema extends HttpMethodSchema = HttpMethodSchema,\n  StatusCode extends HttpStatusCode = HttpStatusCode,\n> = StatusCode extends StatusCode\n  ? { status: StatusCode; action?: never } & HttpRequestHandlerResponseWithBody<\n      Default<Default<MethodSchema['response']>[StatusCode]>,\n      StatusCode\n    > &\n      HttpRequestHandlerResponseDeclarationWithHeaders<Default<Default<MethodSchema['response']>[StatusCode]>>\n  : never;\n\n/** @see {@link https://zimic.dev/docs/interceptor/api/http-request-handler#handlerrespond `handler.respond()` API reference} */\nexport interface HttpRequestHandlerActionResponseDeclaration {\n  status?: never;\n  action: UnhandledRequestStrategy.Action;\n}\n\n/** @see {@link https://zimic.dev/docs/interceptor/api/http-request-handler#handlerrespond `handler.respond()` API reference} */\nexport type HttpRequestHandlerResponseDeclaration<\n  MethodSchema extends HttpMethodSchema = HttpMethodSchema,\n  StatusCode extends HttpStatusCode = HttpStatusCode,\n> = HttpRequestHandlerStatusResponseDeclaration<MethodSchema, StatusCode> | HttpRequestHandlerActionResponseDeclaration;\n\n/** @see {@link https://zimic.dev/docs/interceptor/api/http-request-handler#handlerrespond `handler.respond()` API reference} */\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/** @see {@link https://zimic.dev/docs/interceptor/api/http-request-handler#handlerdelay `handler.delay()` API reference} */\nexport type HttpRequestHandlerResponseDelayFactory<Path extends string, MethodSchema extends HttpMethodSchema> = (\n  request: Omit<HttpInterceptorRequest<Path, MethodSchema>, 'response'>,\n) => PossiblePromise<number>;\n\n/** @see {@link https://zimic.dev/docs/interceptor/api/http-request-handler#handlerrequests `handler.requests` API reference} */\nexport interface HttpInterceptorRequest<Path extends string, MethodSchema extends HttpMethodSchema> extends Omit<\n  HttpRequest,\n  keyof Body | 'headers' | 'clone'\n> {\n  /**\n   * The headers of the request.\n   *\n   * @see {@link https://zimic.dev/docs/interceptor/guides/http/headers#using-request-headers Using request headers}\n   */\n  headers: HttpHeaders<Default<HttpRequestHeadersSchema<MethodSchema>>>;\n\n  /**\n   * The path parameters of the request. They are parsed from the path string when using dynamic paths.\n   *\n   * @see {@link https://zimic.dev/docs/interceptor/guides/http/path-params#using-request-path-params Using request path parameters}\n   */\n  pathParams: InferPathParams<Path>;\n\n  /**\n   * The search parameters of the request.\n   *\n   * @see {@link https://zimic.dev/docs/interceptor/guides/http/search-params#using-request-search-params Using request search parameters}\n   */\n  searchParams: HttpSearchParams<Default<HttpRequestSearchParamsSchema<MethodSchema>>>;\n\n  /**\n   * The body of the request. It is already parsed by default as detailed in\n   * {@link https://zimic.dev/docs/interceptor/guides/http/bodies#default-body-parsing Default body parsing}.\n   *\n   * @see {@link https://zimic.dev/docs/interceptor/guides/http/bodies#using-request-bodies Using request bodies}\n   */\n  body: Replace<HttpRequestBodySchema<MethodSchema>, ArrayBuffer | ReadableStream, Blob>;\n\n  /** The raw request object. */\n  raw: HttpRequest<HttpRequestBodySchema<MethodSchema>, Default<HttpRequestHeadersSchema<MethodSchema>>>;\n}\n\n/** @see {@link https://zimic.dev/docs/interceptor/api/http-request-handler#handlerrequests `handler.requests` API reference} */\nexport interface HttpInterceptorResponse<\n  MethodSchema extends HttpMethodSchema,\n  StatusCode extends HttpStatusCode,\n> extends Omit<HttpResponse, keyof Body | 'headers' | 'clone'> {\n  /**\n   * The headers of the response.\n   *\n   * @see {@link https://zimic.dev/docs/interceptor/guides/http/headers#using-response-headers Using response headers}\n   */\n  headers: HttpHeaders<Default<HttpResponseHeadersSchema<MethodSchema, StatusCode>>>;\n\n  /** The status code of the response. */\n  status: StatusCode;\n\n  /**\n   * The body of the response. It is already parsed by default as detailed in\n   * {@link https://zimic.dev/docs/interceptor/guides/http/bodies#default-body-parsing Default body parsing}.\n   *\n   * @see {@link https://zimic.dev/docs/interceptor/guides/http/bodies#using-response-bodies Using response bodies}\n   */\n  body: Replace<HttpResponseBodySchema<MethodSchema, StatusCode>, ArrayBuffer | ReadableStream, Blob>;\n\n  /** The raw response object. */\n  raw: HttpResponse<\n    HttpResponseBodySchema<MethodSchema, StatusCode>,\n    Default<HttpResponseHeadersSchema<MethodSchema, StatusCode>>,\n    StatusCode\n  >;\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/** @see {@link https://zimic.dev/docs/interceptor/api/http-request-handler#handlerrequests `handler.requests` API reference} */\nexport interface InterceptedHttpInterceptorRequest<\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","import {\n  HttpHeadersInit,\n  HttpHeaders,\n  HttpBody,\n  HttpResponse,\n  HttpMethod,\n  HttpMethodSchema,\n  HttpSchema,\n  HttpStatusCode,\n  InferPathParams,\n  parseHttpBody,\n  HttpSearchParams,\n  HttpRequest,\n} from '@zimic/http';\nimport { isDefined } from '@zimic/utils/data';\nimport { Default, PossiblePromise } from '@zimic/utils/types';\nimport color from 'picocolors';\n\nimport { removeArrayElement } from '@/utils/arrays';\nimport { isClientSide } from '@/utils/environment';\nimport { methodCanHaveResponseBody } from '@/utils/http';\nimport { formatValueToLog, logger } from '@/utils/logging';\n\nimport HttpInterceptorImplementation, {\n  AnyHttpInterceptorImplementation,\n} from '../interceptor/HttpInterceptorImplementation';\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 { HttpResponseFactory } from './types/http';\nimport { HttpInterceptorWorkerType } from './types/options';\n\nconst RESPONSE_ACTION_SYMBOL = Symbol.for('HttpResponse.action');\n\nabstract class HttpInterceptorWorker {\n  abstract get type(): HttpInterceptorWorkerType;\n\n  platform: HttpInterceptorPlatform | null = null;\n  isRunning = false;\n\n  private startingPromise?: Promise<void>;\n  private stoppingPromise?: Promise<void>;\n\n  private runningInterceptors: AnyHttpInterceptorImplementation[] = [];\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\n    if (this.stoppingPromise) {\n      return this.stoppingPromise;\n    }\n\n    const stoppingResult = internalStop();\n\n    /* istanbul ignore next -- @preserve\n     * This if statement only runs if concurrent calls to stop() are made, which is an edge case that is hard to\n     * reliably reproduce in tests. */\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: HttpInterceptorImplementation<Schema>,\n    method: HttpMethod,\n    path: 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 = DEFAULT_UNHANDLED_REQUEST_STRATEGY[interceptorType];\n\n    try {\n      const interceptor = this.findInterceptorByRequestBaseURL(request);\n\n      if (!interceptor) {\n        return [];\n      }\n\n      const requestClone = request.clone();\n      const interceptorStrategy = await this.getInterceptorUnhandledRequestStrategy(requestClone, interceptor);\n\n      return [interceptorStrategy, globalDefaultStrategy].filter(isDefined);\n    } catch (error) {\n      console.error(error);\n\n      return [globalDefaultStrategy];\n    }\n  }\n\n  registerRunningInterceptor(interceptor: AnyHttpInterceptorImplementation) {\n    this.runningInterceptors.push(interceptor);\n  }\n\n  unregisterRunningInterceptor(interceptor: AnyHttpInterceptorImplementation) {\n    removeArrayElement(this.runningInterceptors, interceptor);\n  }\n\n  private findInterceptorByRequestBaseURL(request: Request) {\n    const interceptor = this.runningInterceptors.findLast((interceptor) => {\n      return request.url.startsWith(interceptor.baseURLAsString);\n    });\n\n    return interceptor;\n  }\n\n  private async getInterceptorUnhandledRequestStrategy(\n    request: Request,\n    interceptor: AnyHttpInterceptorImplementation,\n  ) {\n    if (typeof interceptor.onUnhandledRequest === 'function') {\n      const parsedRequest = await HttpInterceptorWorker.parseRawUnhandledRequest(request);\n      return interceptor.onUnhandledRequest(parsedRequest);\n    }\n\n    return interceptor.onUnhandledRequest;\n  }\n\n  abstract clearHandlers<Schema extends HttpSchema>(options?: {\n    interceptor?: HttpInterceptorImplementation<Schema>;\n  }): PossiblePromise<void>;\n\n  abstract get interceptorsWithHandlers(): AnyHttpInterceptorImplementation[];\n\n  static setResponseAction(response: Response, action: UnhandledRequestStrategy.Action) {\n    Object.defineProperty(response, RESPONSE_ACTION_SYMBOL, {\n      value: action,\n      enumerable: false,\n      configurable: false,\n      writable: false,\n    });\n  }\n\n  static getResponseAction(response: Response): UnhandledRequestStrategy.Action | undefined {\n    if (!(RESPONSE_ACTION_SYMBOL in response)) {\n      return undefined;\n    }\n\n    const action = response[RESPONSE_ACTION_SYMBOL];\n\n    /* istanbul ignore if -- @preserve\n     * This is just a type guard to ensure the value is valid. In practice, this condition should never be true. */\n    if (action !== 'bypass' && action !== 'reject') {\n      return undefined;\n    }\n\n    return action;\n  }\n\n  private createBypassedResponse() {\n    const response = Response.redirect('about:blank', 302) as HttpResponse;\n    HttpInterceptorWorker.setResponseAction(response, 'bypass');\n    return response;\n  }\n\n  static isBypassedResponse(response: Response) {\n    return this.getResponseAction(response) === 'bypass';\n  }\n\n  private createRejectedResponse() {\n    const response = Response.error() as HttpResponse;\n    HttpInterceptorWorker.setResponseAction(response, 'reject');\n    return response;\n  }\n\n  static isRejectedResponse(response: Response) {\n    return this.getResponseAction(response) === 'reject';\n  }\n\n  createResponseFromDeclaration(\n    request: HttpRequest,\n    declaration:\n      | { status: number; headers?: HttpHeadersInit; body?: HttpBody }\n      | { action: UnhandledRequestStrategy.Action },\n  ): PossiblePromise<HttpResponse | null> {\n    if ('action' in declaration) {\n      if (declaration.action === 'bypass') {\n        return this.createBypassedResponse();\n      } else {\n        return this.createRejectedResponse();\n      }\n    }\n\n    const headers = new HttpHeaders(declaration.headers);\n\n    const canHaveBody = methodCanHaveResponseBody(request.method as HttpMethod) && declaration.status !== 204;\n\n    if (!canHaveBody) {\n      return new Response(null, { headers, status: declaration.status }) as HttpResponse;\n    }\n\n    if (\n      typeof declaration.body === 'string' ||\n      declaration.body === null ||\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      declaration.body instanceof ReadableStream\n    ) {\n      return new Response(declaration.body ?? null, { headers, status: declaration.status }) as HttpResponse;\n    }\n\n    return Response.json(declaration.body, { headers, status: declaration.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?: { baseURL: string; pathRegex: 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\n    const parsedBody = await parseHttpBody<BodySchema>(rawRequest).catch((error: unknown) => {\n      logger.error('Failed to parse request body:', error);\n      return null;\n    });\n\n    type HeadersSchema = Default<Default<MethodSchema['request']>['headers']>;\n    const headers = new HttpHeaders<HeadersSchema>(rawRequest.headers);\n\n    const pathParams = this.parseRawPathParams<Path>(rawRequest, options);\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<\n    MethodSchema extends HttpMethodSchema,\n    StatusCode extends HttpStatusCode = HttpStatusCode,\n  >(originalRawResponse: Response): 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 parseHttpBody<BodySchema>(rawResponse).catch((error: unknown) => {\n      logger.error('Failed to parse response body:', error);\n      return null;\n    });\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>(\n    request: Request,\n    options?: { baseURL: string; pathRegex: RegExp },\n  ): InferPathParams<Path> {\n    const requestPath = request.url.replace(options?.baseURL ?? '', '');\n    const paramsMatch = options?.pathRegex.exec(requestPath);\n\n    const params: Record<string, string | undefined> = {};\n\n    for (const [paramName, paramValue] of Object.entries(paramsMatch?.groups ?? {})) {\n      params[paramName] = typeof paramValue === 'string' ? decodeURIComponent(paramValue) : undefined;\n    }\n\n    return params as InferPathParams<Path>;\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    logger[action === 'bypass' ? 'warn' : 'error'](\n      `${action === 'bypass' ? 'Warning:' : 'Error:'} Request was not handled and was ` +\n        `${action === 'bypass' ? color.yellow('bypassed') : color.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://zimic.dev/docs/interceptor/guides/http/unhandled-requests',\n    );\n  }\n}\n\nexport default HttpInterceptorWorker;\n","import { HttpSchema, HttpSchemaMethod, HttpSchemaPath, HttpStatusCode } from '@zimic/http';\nimport { Default, PossiblePromise } from '@zimic/utils/types';\n\nimport HttpInterceptorImplementation from '../interceptor/HttpInterceptorImplementation';\nimport HttpRequestHandlerImplementation from './HttpRequestHandlerImplementation';\nimport {\n  InternalHttpRequestHandler,\n  SyncedRemoteHttpRequestHandler as PublicSyncedRemoteHttpRequestHandler,\n} from './types/public';\nimport {\n  HttpInterceptorRequest,\n  HttpInterceptorResponse,\n  HttpRequestHandlerResponseDeclaration,\n  HttpRequestHandlerResponseDeclarationFactory,\n  HttpRequestHandlerResponseDelayFactory,\n  InterceptedHttpInterceptorRequest,\n} from './types/requests';\nimport { HttpRequestHandlerRestriction } from './types/restrictions';\n\nconst UNSYNCED_PROPERTIES = new Set<string | symbol>(['then'] satisfies (keyof Promise<unknown>)[]);\n\nclass RemoteHttpRequestHandler<\n  Schema extends HttpSchema,\n  Method extends HttpSchemaMethod<Schema>,\n  Path extends HttpSchemaPath<Schema, Method>,\n  StatusCode extends HttpStatusCode = never,\n> implements InternalHttpRequestHandler<Schema, Method, Path, StatusCode> {\n  readonly type = 'remote';\n\n  implementation: HttpRequestHandlerImplementation<Schema, Method, Path, StatusCode>;\n\n  private syncPromises: Promise<unknown>[] = [];\n\n  private unsynced: this;\n  private synced: this;\n\n  constructor(\n    interceptor: HttpInterceptorImplementation<Schema, typeof RemoteHttpRequestHandler>,\n    method: Method,\n    path: Path,\n  ) {\n    this.implementation = new HttpRequestHandlerImplementation(interceptor, method, path, this);\n    this.unsynced = this;\n    this.synced = this.createSyncedProxy();\n  }\n\n  private createSyncedProxy() {\n    return new Proxy(this, {\n      has: (target, property) => {\n        if (this.shouldBeHiddenPropertyWhenSynced(property)) {\n          return false;\n        }\n        return Reflect.has(target, property);\n      },\n\n      get: (target, property) => {\n        if (this.shouldBeHiddenPropertyWhenSynced(property)) {\n          return undefined;\n        }\n        return Reflect.get(target, property);\n      },\n    });\n  }\n\n  private shouldBeHiddenPropertyWhenSynced(property: string | symbol) {\n    return UNSYNCED_PROPERTIES.has(property);\n  }\n\n  get method() {\n    return this.implementation.method;\n  }\n\n  get path() {\n    return this.implementation.path;\n  }\n\n  with(restriction: HttpRequestHandlerRestriction<Schema, Method, Path>): this {\n    this.implementation.with(restriction);\n    return this.unsynced;\n  }\n\n  delay(\n    minMilliseconds: number | HttpRequestHandlerResponseDelayFactory<Path, Default<Schema[Path][Method]>>,\n    maxMilliseconds?: number,\n  ): this {\n    this.implementation.delay(minMilliseconds, maxMilliseconds);\n    return this.unsynced;\n  }\n\n  respond<NewStatusCode extends HttpStatusCode>(\n    declaration:\n      | HttpRequestHandlerResponseDeclaration<Default<Schema[Path][Method]>, NewStatusCode>\n      | HttpRequestHandlerResponseDeclarationFactory<Path, Default<Schema[Path][Method]>, NewStatusCode>,\n  ): RemoteHttpRequestHandler<Schema, Method, Path, NewStatusCode> {\n    const newUnsyncedThis = this.unsynced as unknown as RemoteHttpRequestHandler<Schema, Method, Path, NewStatusCode>;\n    newUnsyncedThis.implementation.respond(declaration);\n    return newUnsyncedThis;\n  }\n\n  times(minNumberOfRequests: number, maxNumberOfRequests?: number): this {\n    this.implementation.times(minNumberOfRequests, maxNumberOfRequests);\n    return this;\n  }\n\n  async checkTimes() {\n    return new Promise<void>((resolve, reject) => {\n      try {\n        this.implementation.checkTimes();\n        resolve();\n      } catch (error) {\n        reject(error);\n      }\n    });\n  }\n\n  clear(): this {\n    this.implementation.clear();\n    return this.unsynced;\n  }\n\n  get requests(): readonly InterceptedHttpInterceptorRequest<Path, Default<Schema[Path][Method]>, StatusCode>[] {\n    return this.implementation.requests;\n  }\n\n  async matchesRequest(request: HttpInterceptorRequest<Path, Default<Schema[Path][Method]>>) {\n    const requestMatch = await this.implementation.matchesRequest(request);\n\n    if (requestMatch.success) {\n      this.implementation.markRequestAsMatched(request);\n    } else if (requestMatch.cause === 'unmatchedRestrictions') {\n      this.implementation.markRequestAsUnmatched(request, { diff: requestMatch.diff });\n    } else {\n      this.implementation.markRequestAsMatched(request);\n    }\n\n    return requestMatch;\n  }\n\n  async applyResponseDeclaration(request: HttpInterceptorRequest<Path, Default<Schema[Path][Method]>>) {\n    return this.implementation.applyResponseDeclaration(request);\n  }\n\n  saveInterceptedRequest(\n    request: HttpInterceptorRequest<Path, Default<Schema[Path][Method]>>,\n    response: HttpInterceptorResponse<Default<Schema[Path][Method]>, StatusCode>,\n  ) {\n    this.implementation.saveInterceptedRequest(request, response);\n  }\n\n  registerSyncPromise(promise: Promise<unknown>) {\n    this.syncPromises.push(promise);\n  }\n\n  get isSynced() {\n    return this.syncPromises.length === 0;\n  }\n\n  then<\n    FulfilledResult = PublicSyncedRemoteHttpRequestHandler<Schema, Method, Path, StatusCode>,\n    RejectedResult = never,\n  >(\n    onFulfilled?:\n      | ((\n          handler: PublicSyncedRemoteHttpRequestHandler<Schema, Method, Path, StatusCode>,\n        ) => PossiblePromise<FulfilledResult>)\n      | null,\n    onRejected?: ((reason: unknown) => PossiblePromise<RejectedResult>) | null,\n  ): Promise<FulfilledResult | RejectedResult> {\n    const promisesToWait = new Set(this.syncPromises);\n\n    return Promise.all(promisesToWait)\n      .then(() => {\n        this.syncPromises = this.syncPromises.filter((promise) => !promisesToWait.has(promise));\n\n        return this.isSynced ? this.synced : this.unsynced;\n      })\n      .then(onFulfilled, onRejected);\n  }\n\n  catch<RejectedResult = never>(\n    onRejected?: ((reason: unknown) => PossiblePromise<RejectedResult>) | null,\n  ): Promise<PublicSyncedRemoteHttpRequestHandler<Schema, Method, Path, StatusCode> | RejectedResult> {\n    return this.then().catch(onRejected);\n  }\n\n  finally(\n    onFinally?: (() => void) | null,\n  ): Promise<PublicSyncedRemoteHttpRequestHandler<Schema, Method, Path, StatusCode>> {\n    return this.then().finally(onFinally);\n  }\n}\n\nexport type AnyRemoteHttpRequestHandler =\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  | RemoteHttpRequestHandler<any, any, any>\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  | RemoteHttpRequestHandler<any, any, any, any>;\n\nexport default RemoteHttpRequestHandler;\n","import {\n  HttpResponse,\n  HTTP_METHODS,\n  HttpMethod,\n  HttpSchemaMethod,\n  HttpSchemaPath,\n  HttpStatusCode,\n  HttpSchema,\n} from '@zimic/http';\nimport { Default, PossiblePromise } from '@zimic/utils/types';\nimport { createRegexFromPath, excludeNonPathParams, validateURLProtocol } from '@zimic/utils/url';\n\nimport { isServerSide } from '@/utils/environment';\n\nimport HttpInterceptorWorker from '../interceptorWorker/HttpInterceptorWorker';\nimport HttpRequestHandlerImplementation, {\n  AnyHttpRequestHandlerImplementation,\n  HttpRequestHandlerRequestMatch,\n} from '../requestHandler/HttpRequestHandlerImplementation';\nimport LocalHttpRequestHandler from '../requestHandler/LocalHttpRequestHandler';\nimport RemoteHttpRequestHandler from '../requestHandler/RemoteHttpRequestHandler';\nimport { HttpRequestHandler, InternalHttpRequestHandler } from '../requestHandler/types/public';\nimport { HttpInterceptorRequest } from '../requestHandler/types/requests';\nimport NotRunningHttpInterceptorError from './errors/NotRunningHttpInterceptorError';\nimport RequestSavingSafeLimitExceededError from './errors/RequestSavingSafeLimitExceededError';\nimport RunningHttpInterceptorError from './errors/RunningHttpInterceptorError';\nimport HttpInterceptorStore from './HttpInterceptorStore';\nimport { UnhandledRequestStrategy } from './types/options';\nimport { HttpInterceptorRequestSaving } from './types/public';\nimport { HttpInterceptorRequestContext } from './types/requests';\n\nexport const SUPPORTED_BASE_URL_PROTOCOLS = Object.freeze(['http', 'https']);\n\nexport const DEFAULT_REQUEST_SAVING_SAFE_LIMIT = 1000;\n\nexport type HttpRequestHandlerConstructor = typeof LocalHttpRequestHandler | typeof RemoteHttpRequestHandler;\n\nclass HttpInterceptorImplementation<\n  Schema extends HttpSchema,\n  HandlerConstructor extends HttpRequestHandlerConstructor = HttpRequestHandlerConstructor,\n> {\n  private store: HttpInterceptorStore;\n  #baseURL!: URL;\n\n  private createWorker: () => HttpInterceptorWorker;\n  private deleteWorker: () => void;\n  private worker?: HttpInterceptorWorker;\n\n  requestSaving: HttpInterceptorRequestSaving;\n  private numberOfSavedRequests = 0;\n\n  onUnhandledRequest?: HandlerConstructor extends typeof LocalHttpRequestHandler\n    ? UnhandledRequestStrategy.Local\n    : UnhandledRequestStrategy.Remote;\n\n  isRunning = false;\n\n  private Handler: HandlerConstructor;\n\n  private handlers: {\n    [Method in HttpMethod]: Map<string, AnyHttpRequestHandlerImplementation[]>;\n  } = {\n    GET: new Map(),\n    POST: new Map(),\n    PATCH: new Map(),\n    PUT: new Map(),\n    DELETE: new Map(),\n    HEAD: new Map(),\n    OPTIONS: new Map(),\n  };\n\n  constructor(options: {\n    store: HttpInterceptorStore;\n    baseURL: URL;\n    createWorker: () => HttpInterceptorWorker;\n    deleteWorker: () => void;\n    requestSaving?: Partial<HttpInterceptorRequestSaving>;\n    onUnhandledRequest?: UnhandledRequestStrategy;\n    Handler: HandlerConstructor;\n  }) {\n    this.store = options.store;\n    this.baseURL = options.baseURL;\n\n    this.createWorker = options.createWorker;\n    this.deleteWorker = options.deleteWorker;\n\n    this.requestSaving = {\n      enabled: options.requestSaving?.enabled ?? this.getDefaultRequestSavingEnabled(),\n      safeLimit: options.requestSaving?.safeLimit ?? DEFAULT_REQUEST_SAVING_SAFE_LIMIT,\n    };\n\n    this.onUnhandledRequest = options.onUnhandledRequest satisfies\n      | UnhandledRequestStrategy\n      | undefined as this['onUnhandledRequest'];\n\n    this.Handler = options.Handler;\n  }\n\n  private getDefaultRequestSavingEnabled(): boolean {\n    return isServerSide() ? process.env.NODE_ENV === 'test' : false;\n  }\n\n  get baseURL() {\n    return this.#baseURL;\n  }\n\n  set baseURL(newBaseURL: URL) {\n    if (this.isRunning) {\n      throw new RunningHttpInterceptorError(\n        'Did you forget to call `await interceptor.stop()` before changing the base URL?',\n      );\n    }\n\n    validateURLProtocol(newBaseURL, SUPPORTED_BASE_URL_PROTOCOLS);\n    excludeNonPathParams(newBaseURL);\n\n    this.#baseURL = newBaseURL;\n  }\n\n  get baseURLAsString() {\n    if (this.baseURL.href === `${this.baseURL.origin}/`) {\n      return this.baseURL.origin;\n    }\n    return this.baseURL.href;\n  }\n\n  private get workerOrThrow() {\n    if (!this.worker) {\n      throw new NotRunningHttpInterceptorError();\n    }\n    return this.worker;\n  }\n\n  get platform() {\n    return this.worker?.platform ?? null;\n  }\n\n  async start() {\n    try {\n      this.worker = this.createWorker();\n\n      await this.worker.start();\n      this.worker.registerRunningInterceptor(this);\n\n      this.markAsRunning(true);\n    } catch (error) {\n      await this.stop();\n      throw error;\n    }\n  }\n\n  async stop() {\n    this.worker?.unregisterRunningInterceptor(this);\n\n    // The number of interceptors will be 0 if the first client could not start due to an error.\n    const isLastRunningInterceptor = this.numberOfRunningInterceptors === 0 || this.numberOfRunningInterceptors === 1;\n\n    if (isLastRunningInterceptor) {\n      await this.worker?.stop();\n      this.deleteWorker();\n    }\n\n    this.markAsRunning(false);\n    this.worker = undefined;\n  }\n\n  private markAsRunning(isRunning: boolean) {\n    if (this.workerOrThrow.type === 'local') {\n      this.store.markLocalInterceptorAsRunning(this, isRunning);\n    } else {\n      this.store.markRemoteInterceptorAsRunning(this, isRunning, this.baseURL);\n    }\n    this.isRunning = isRunning;\n  }\n\n  get numberOfRunningInterceptors() {\n    if (!this.isRunning) {\n      return 0;\n    }\n\n    if (this.workerOrThrow.type === 'local') {\n      return this.store.numberOfRunningLocalInterceptors;\n    } else {\n      return this.store.numberOfRunningRemoteInterceptors(this.baseURL);\n    }\n  }\n\n  get(path: HttpSchemaPath<Schema, HttpSchemaMethod<Schema>>) {\n    return this.createHttpRequestHandler('GET' as HttpSchemaMethod<Schema>, path);\n  }\n\n  post(path: HttpSchemaPath<Schema, HttpSchemaMethod<Schema>>) {\n    return this.createHttpRequestHandler('POST' as HttpSchemaMethod<Schema>, path);\n  }\n\n  patch(path: HttpSchemaPath<Schema, HttpSchemaMethod<Schema>>) {\n    return this.createHttpRequestHandler('PATCH' as HttpSchemaMethod<Schema>, path);\n  }\n\n  put(path: HttpSchemaPath<Schema, HttpSchemaMethod<Schema>>) {\n    return this.createHttpRequestHandler('PUT' as HttpSchemaMethod<Schema>, path);\n  }\n\n  delete(path: HttpSchemaPath<Schema, HttpSchemaMethod<Schema>>) {\n    return this.createHttpRequestHandler('DELETE' as HttpSchemaMethod<Schema>, path);\n  }\n\n  head(path: HttpSchemaPath<Schema, HttpSchemaMethod<Schema>>) {\n    return this.createHttpRequestHandler('HEAD' as HttpSchemaMethod<Schema>, path);\n  }\n\n  options(path: HttpSchemaPath<Schema, HttpSchemaMethod<Schema>>) {\n    return this.createHttpRequestHandler('OPTIONS' as HttpSchemaMethod<Schema>, path);\n  }\n\n  private createHttpRequestHandler<\n    Method extends HttpSchemaMethod<Schema>,\n    Path extends HttpSchemaPath<Schema, Method>,\n  >(method: Method, path: Path): HttpRequestHandler<Schema, Method, Path> {\n    if (!this.isRunning) {\n      throw new NotRunningHttpInterceptorError();\n    }\n\n    const handler = new this.Handler<Schema, Method, Path>(\n      this as SharedHttpInterceptorImplementation<Schema>,\n      method,\n      path,\n    );\n    this.registerRequestHandler(handler);\n\n    return handler;\n  }\n\n  registerRequestHandler<\n    Method extends HttpSchemaMethod<Schema>,\n    Path extends HttpSchemaPath<Schema, Method>,\n    StatusCode extends HttpStatusCode = never,\n  >(handler: InternalHttpRequestHandler<Schema, Method, Path, StatusCode>) {\n    const pathHandlers = this.handlers[handler.method].get(handler.path) ?? [];\n\n    const isAlreadyRegistered = pathHandlers.includes(handler.implementation);\n\n    if (isAlreadyRegistered) {\n      return;\n    }\n\n    pathHandlers.push(handler.implementation);\n\n    const isFirstHandlerForMethodPath = pathHandlers.length === 1;\n\n    if (!isFirstHandlerForMethodPath) {\n      return;\n    }\n\n    this.handlers[handler.method].set(handler.path, pathHandlers);\n\n    const pathRegex = createRegexFromPath(handler.path);\n\n    const registrationResult = this.workerOrThrow.use(this, handler.method, handler.path, async (context) => {\n      const response = await this.handleInterceptedRequest(\n        handler.method,\n        handler.path,\n        pathRegex,\n        context as HttpInterceptorRequestContext<Schema, Method, Path>,\n      );\n      return response;\n    });\n\n    if (handler instanceof RemoteHttpRequestHandler && registrationResult instanceof Promise) {\n      handler.registerSyncPromise(registrationResult);\n    }\n  }\n\n  async handleInterceptedRequest<\n    Method extends HttpSchemaMethod<Schema>,\n    Path extends HttpSchemaPath<Schema, Method>,\n    Context extends HttpInterceptorRequestContext<Schema, Method, Path>,\n  >(method: Method, path: Path, pathRegex: RegExp, { request }: Context): Promise<HttpResponse | null> {\n    const parsedRequest = await HttpInterceptorWorker.parseRawRequest<Path, Default<Schema[Path][Method]>>(request, {\n      baseURL: this.baseURLAsString,\n      pathRegex,\n    });\n\n    const matchedHandler = await this.findMatchedHandler(method, path, parsedRequest);\n\n    if (!matchedHandler) {\n      return null;\n    }\n\n    const responseDeclaration = await matchedHandler.applyResponseDeclaration(parsedRequest);\n\n    if (!responseDeclaration) {\n      return null;\n    }\n\n    const response = await this.workerOrThrow.createResponseFromDeclaration(request, responseDeclaration);\n\n    const shouldSaveInterceptedRequest =\n      this.requestSaving.enabled && response && !HttpInterceptorWorker.isRejectedResponse(response);\n\n    if (shouldSaveInterceptedRequest) {\n      const responseClone = response.clone();\n\n      const parsedResponse = await HttpInterceptorWorker.parseRawResponse<Default<Schema[Path][Method]>>(responseClone);\n\n      matchedHandler.saveInterceptedRequest(parsedRequest, parsedResponse);\n    }\n\n    return response;\n  }\n\n  incrementNumberOfSavedRequests(increment: number) {\n    this.numberOfSavedRequests = Math.max(this.numberOfSavedRequests + increment, 0);\n\n    const exceedsSafeLimit = this.numberOfSavedRequests > this.requestSaving.safeLimit;\n\n    if (increment > 0 && exceedsSafeLimit) {\n      const error = new RequestSavingSafeLimitExceededError(this.numberOfSavedRequests, this.requestSaving.safeLimit);\n      console.warn(error);\n    }\n  }\n\n  private async findMatchedHandler<\n    Method extends HttpSchemaMethod<Schema>,\n    Path extends HttpSchemaPath<Schema, Method>,\n  >(\n    method: Method,\n    path: Path,\n    request: HttpInterceptorRequest<Path, Default<Schema[Path][Method]>>,\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  ): Promise<HttpRequestHandlerImplementation<Schema, Method, Path, any> | undefined> {\n    /* istanbul ignore next -- @preserve\n     * Ignoring because there will always be a handler for the given method and path at this point. */\n    const pathHandlers = this.handlers[method].get(path) ?? [];\n\n    const failedRequestMatches = new Map<\n      AnyHttpRequestHandlerImplementation,\n      Extract<HttpRequestHandlerRequestMatch, { success: false }>\n    >();\n\n    // If we find a matching handler that can accept more requests, we return it immediately.\n    for (let handlerIndex = pathHandlers.length - 1; handlerIndex >= 0; handlerIndex--) {\n      const handler = pathHandlers[handlerIndex];\n      const requestMatch = await handler.matchesRequest(request);\n\n      if (requestMatch.success) {\n        handler.markRequestAsMatched(request);\n        return handler;\n      }\n\n      failedRequestMatches.set(handler, requestMatch);\n    }\n\n    // If no handler matched or could accept more requests, we iterate again over the handlers to check which ones\n    // could have matched considering only restrictions.\n    for (let handlerIndex = pathHandlers.length - 1; handlerIndex >= 0; handlerIndex--) {\n      const handler = pathHandlers[handlerIndex];\n      const requestMatch = failedRequestMatches.get(handler);\n\n      // Handlers that did not match due to anything other than restrictions are still marked as matched to trigger a\n      // times check error.\n      if (requestMatch?.cause === 'unmatchedRestrictions') {\n        handler.markRequestAsUnmatched(request, { diff: requestMatch.diff });\n      } else {\n        handler.markRequestAsMatched(request);\n        break;\n      }\n    }\n\n    return undefined;\n  }\n\n  checkTimes() {\n    for (const method of HTTP_METHODS) {\n      const pathHandlers = this.handlers[method];\n\n      for (const handlers of pathHandlers.values()) {\n        for (const handler of handlers) {\n          handler.checkTimes();\n        }\n      }\n    }\n  }\n\n  clear() {\n    const clearPromises: Promise<AnyHttpRequestHandlerImplementation | void>[] = [\n      Promise.resolve(this.workerOrThrow.clearHandlers({ interceptor: this })),\n    ];\n\n    for (const method of HTTP_METHODS) {\n      for (const result of this.clearMethodHandlers(method)) {\n        clearPromises.push(Promise.resolve(result));\n      }\n\n      const pathHandlers = this.handlers[method];\n      pathHandlers.clear();\n    }\n\n    return Promise.all(clearPromises);\n  }\n\n  private clearMethodHandlers(method: HttpMethod) {\n    const pathHandlers = this.handlers[method];\n    const clearResults: PossiblePromise<AnyHttpRequestHandlerImplementation>[] = [];\n\n    for (const handlers of pathHandlers.values()) {\n      for (const handler of handlers) {\n        clearResults.push(handler.clear());\n      }\n    }\n\n    return clearResults;\n  }\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type AnyHttpInterceptorImplementation = HttpInterceptorImplementation<any>;\n\nexport type SharedHttpInterceptorImplementation<Schema extends HttpSchema> = HttpInterceptorImplementation<\n  Schema,\n  typeof LocalHttpRequestHandler\n> &\n  HttpInterceptorImplementation<Schema, typeof RemoteHttpRequestHandler>;\n\nexport default HttpInterceptorImplementation;\n","import { HttpRequest, HttpResponse, HttpMethod, HttpSchema, HttpHeadersInit, HttpBody } from '@zimic/http';\nimport { createCachedDynamicImport } from '@zimic/utils/import';\nimport { createRegexFromPath, excludeNonPathParams, validatePathParams } from '@zimic/utils/url';\nimport { SharedOptions as MSWWorkerSharedOptions, bypass, http, passthrough } from 'msw';\n\nimport { removeArrayIndex } from '@/utils/arrays';\nimport { isClientSide, isServerSide } from '@/utils/environment';\n\nimport NotRunningHttpInterceptorError from '../interceptor/errors/NotRunningHttpInterceptorError';\nimport UnknownHttpInterceptorPlatformError from '../interceptor/errors/UnknownHttpInterceptorPlatformError';\nimport HttpInterceptorImplementation, {\n  AnyHttpInterceptorImplementation,\n} from '../interceptor/HttpInterceptorImplementation';\nimport { UnhandledRequestStrategy } from '../interceptor/types/options';\nimport UnregisteredBrowserServiceWorkerError from './errors/UnregisteredBrowserServiceWorkerError';\nimport HttpInterceptorWorker from './HttpInterceptorWorker';\nimport { HttpResponseFactory, HttpResponseFactoryContext } from './types/http';\nimport { BrowserMSWWorker, MSWHttpHandler, MSWWorker, NodeMSWWorker } from './types/msw';\nimport { LocalHttpInterceptorWorkerOptions } from './types/options';\n\nconst importMSWNode = createCachedDynamicImport(() => import('msw/node'));\nconst importMSWBrowser = createCachedDynamicImport(() => import('msw/browser'));\n\ninterface HttpHandler {\n  baseURL: string;\n  method: HttpMethod;\n  pathRegex: RegExp;\n  interceptor: AnyHttpInterceptorImplementation;\n  createResponse: (context: HttpResponseFactoryContext) => Promise<Response>;\n}\n\nclass LocalHttpInterceptorWorker extends HttpInterceptorWorker {\n  // Re-creating MSW workers may cause issues, so we should keep a single worker instance, even if all interceptor\n  // workers are stopped. See https://github.com/mswjs/msw/issues/2597.\n  private static mswWorker?: MSWWorker;\n  static isMSWWorkerRunning = false;\n\n  private mswHttpHandler?: MSWHttpHandler;\n\n  private httpHandlersByMethod: {\n    [Method in HttpMethod]: HttpHandler[];\n  } = {\n    GET: [],\n    POST: [],\n    PATCH: [],\n    PUT: [],\n    DELETE: [],\n    HEAD: [],\n    OPTIONS: [],\n  };\n\n  constructor(_options: LocalHttpInterceptorWorkerOptions) {\n    super();\n  }\n\n  get class() {\n    return LocalHttpInterceptorWorker;\n  }\n\n  get type() {\n    return 'local' as const;\n  }\n\n  get mswWorkerOrThrow() {\n    /* istanbul ignore if -- @preserve\n     * Trying to access the internal worker when it does not exist should not happen. */\n    if (!this.class.mswWorker) {\n      throw new NotRunningHttpInterceptorError();\n    }\n    return this.class.mswWorker;\n  }\n\n  async getMSWWorkerOrCreate() {\n    this.class.mswWorker ??= await this.createMSWWorker();\n    return this.class.mswWorker;\n  }\n\n  private async createMSWWorker() {\n    if (isServerSide()) {\n      const mswNode = await importMSWNode();\n\n      /* istanbul ignore else -- @preserve\n       * We still check if we actually imported the server module in case our `isServerSide()` check returns true, but\n       * the environment actually resolves the browser module. */\n      if ('setupServer' in mswNode) {\n        return mswNode.setupServer();\n      }\n    }\n\n    /* istanbul ignore else -- @preserve */\n    if (isClientSide()) {\n      const mswBrowser = await importMSWBrowser();\n\n      /* istanbul ignore else -- @preserve\n       * We still check if we actually imported the browser module in case our `isClientSide()` check returns true, but\n       * the environment actually resolves the server module. */\n      if ('setupWorker' in mswBrowser) {\n        return mswBrowser.setupWorker();\n      }\n    }\n\n    /* istanbul ignore next -- @preserve\n     * Ignoring because checking unknown platforms is not configured in our test setup. */\n    throw new UnknownHttpInterceptorPlatformError();\n  }\n\n  async start() {\n    await super.sharedStart(async () => {\n      const mswWorker = await this.getMSWWorkerOrCreate();\n\n      const sharedOptions: MSWWorkerSharedOptions = {\n        onUnhandledRequest: 'bypass',\n      };\n\n      this.mswHttpHandler = http.all('*', async (context) => {\n        const request = context.request satisfies Request as HttpRequest;\n        const response = await this.createResponseForRequest(request);\n        return response;\n      });\n\n      mswWorker.use(this.mswHttpHandler);\n\n      if (this.isInternalBrowserWorker(mswWorker)) {\n        this.platform = 'browser';\n\n        // Even after https://github.com/mswjs/msw/issues/2714 was fixed, there are collateral effects preventing us\n        // from restarting the global browser worker even if unused. Restarting it causes interception issues in MSW.\n        if (!this.class.isMSWWorkerRunning) {\n          await this.startInBrowser(mswWorker, sharedOptions);\n          this.class.isMSWWorkerRunning = true;\n        }\n      } else {\n        this.platform = 'node';\n        this.startInNode(mswWorker, sharedOptions);\n        this.class.isMSWWorkerRunning = true;\n      }\n\n      this.isRunning = true;\n    });\n  }\n\n  private async startInBrowser(mswWorker: BrowserMSWWorker, sharedOptions: MSWWorkerSharedOptions) {\n    try {\n      await mswWorker.start({ ...sharedOptions, quiet: true });\n    } catch (error) {\n      this.handleBrowserWorkerStartError(error);\n    }\n  }\n\n  private handleBrowserWorkerStartError(error: unknown) {\n    /* istanbul ignore else -- @preserve\n     * Since we start the internal worker once and do not stop it, tests may not be able exercise this branch. */\n    if (UnregisteredBrowserServiceWorkerError.matchesRawError(error)) {\n      throw new UnregisteredBrowserServiceWorkerError();\n    } else {\n      throw error;\n    }\n  }\n\n  private startInNode(mswWorker: NodeMSWWorker, sharedOptions: MSWWorkerSharedOptions) {\n    mswWorker.listen(sharedOptions);\n  }\n\n  async stop() {\n    await super.sharedStop(async () => {\n      const mswWorker = await this.getMSWWorkerOrCreate();\n\n      this.clearHandlers();\n\n      const newMSWHandlers = mswWorker.listHandlers().filter((handler) => handler !== this.mswHttpHandler);\n      mswWorker.resetHandlers(...newMSWHandlers);\n\n      if (this.isInternalBrowserWorker(mswWorker)) {\n        // Even after https://github.com/mswjs/msw/issues/2714 was fixed, restarting browser workers causes interception\n        // issues, so we keep it running and just remove our handlers.\n      } else {\n        this.stopInNode(mswWorker);\n        this.class.isMSWWorkerRunning = false;\n      }\n\n      this.mswHttpHandler = undefined;\n      this.isRunning = false;\n    });\n  }\n\n  private stopInNode(mswWorker: NodeMSWWorker) {\n    mswWorker.close();\n  }\n\n  private isInternalBrowserWorker(worker: MSWWorker) {\n    return 'start' in worker && 'stop' in worker;\n  }\n\n  hasInternalBrowserWorker() {\n    return this.isInternalBrowserWorker(this.mswWorkerOrThrow);\n  }\n\n  hasInternalNodeWorker() {\n    return !this.hasInternalBrowserWorker();\n  }\n\n  use<Schema extends HttpSchema>(\n    interceptor: HttpInterceptorImplementation<Schema>,\n    method: HttpMethod,\n    path: string,\n    createResponse: HttpResponseFactory,\n  ) {\n    if (!this.isRunning) {\n      throw new NotRunningHttpInterceptorError();\n    }\n\n    validatePathParams(path);\n\n    const methodHandlers = this.httpHandlersByMethod[method];\n\n    const handler: HttpHandler = {\n      baseURL: interceptor.baseURLAsString,\n      method,\n      pathRegex: createRegexFromPath(path),\n      interceptor,\n      createResponse: async (context) => {\n        const request = context.request as HttpRequest;\n        const requestClone = request.clone();\n\n        let response: HttpResponse | null = null;\n\n        try {\n          response = await createResponse({ request });\n        } catch (error) {\n          console.error(error);\n        }\n\n        if (!response) {\n          return this.bypassOrRejectUnhandledRequest(requestClone);\n        }\n\n        if (context.request.method === 'HEAD') {\n          return new Response(null, {\n            status: response.status,\n            statusText: response.statusText,\n            headers: response.headers,\n          });\n        }\n\n        return response;\n      },\n    };\n\n    methodHandlers.push(handler);\n  }\n\n  async createResponseFromDeclaration(\n    request: HttpRequest,\n    declaration:\n      | { status: number; headers?: HttpHeadersInit; body?: HttpBody }\n      | { action: UnhandledRequestStrategy.Action },\n  ) {\n    const requestClone = request.clone();\n    const response = await super.createResponseFromDeclaration(request, declaration);\n\n    if (response && HttpInterceptorWorker.isBypassedResponse(response)) {\n      try {\n        const response = (await fetch(bypass(requestClone))) as HttpResponse;\n        return response;\n      } catch (error) {\n        console.error(error);\n        return null;\n      }\n    }\n\n    if (response && HttpInterceptorWorker.isRejectedResponse(response)) {\n      return response;\n    }\n\n    return response;\n  }\n\n  private async createResponseForRequest(request: HttpRequest) {\n    const methodHandlers = this.httpHandlersByMethod[request.method as HttpMethod];\n\n    const requestURL = excludeNonPathParams(new URL(request.url));\n    const requestURLAsString = requestURL.href === `${requestURL.origin}/` ? requestURL.origin : requestURL.href;\n\n    for (let handlerIndex = methodHandlers.length - 1; handlerIndex >= 0; handlerIndex--) {\n      const handler = methodHandlers[handlerIndex];\n      const matchesBaseURL = requestURLAsString.startsWith(handler.baseURL);\n\n      if (!matchesBaseURL) {\n        continue;\n      }\n\n      const requestPath = requestURLAsString.replace(handler.baseURL, '');\n      const matchesPath = handler.pathRegex.test(requestPath);\n\n      if (!matchesPath) {\n        continue;\n      }\n\n      const response = await handler.createResponse({ request });\n      return response;\n    }\n\n    return this.bypassOrRejectUnhandledRequest(request);\n  }\n\n  private async bypassOrRejectUnhandledRequest(request: HttpRequest) {\n    const requestClone = request.clone();\n\n    const strategy = await super.getUnhandledRequestStrategy(request, 'local');\n    await super.logUnhandledRequestIfNecessary(requestClone, strategy);\n\n    if (strategy?.action === 'reject') {\n      return Response.error() as HttpResponse;\n    } else {\n      return passthrough() as HttpResponse;\n    }\n  }\n\n  clearHandlers<Schema extends HttpSchema>(\n    options: {\n      interceptor?: HttpInterceptorImplementation<Schema>;\n    } = {},\n  ) {\n    if (!this.isRunning) {\n      throw new NotRunningHttpInterceptorError();\n    }\n\n    if (options.interceptor === undefined) {\n      for (const handlers of Object.values(this.httpHandlersByMethod)) {\n        handlers.length = 0;\n      }\n    } else {\n      for (const methodHandlers of Object.values(this.httpHandlersByMethod)) {\n        const groupToRemoveIndex = methodHandlers.findIndex((group) => group.interceptor === options.interceptor);\n        removeArrayIndex(methodHandlers, groupToRemoveIndex);\n      }\n    }\n  }\n\n  get interceptorsWithHandlers() {\n    const interceptors = new Set<AnyHttpInterceptorImplementation>();\n\n    for (const handlers of Object.values(this.httpHandlersByMethod)) {\n      for (const handler of handlers) {\n        interceptors.add(handler.interceptor);\n      }\n    }\n\n    return Array.from(interceptors);\n  }\n}\n\nexport default LocalHttpInterceptorWorker;\n","class UnsupportedResponseBypassError extends Error {\n  constructor() {\n    super(\n      \"Remote interceptors cannot bypass responses. Use `{ action: 'reject' }` instead.\\n\\n\" +\n        'Learn more: https://zimic.dev/docs/interceptor/api/http-request-handler#handlerrespond',\n    );\n    this.name = 'UnsupportedResponseBypassError';\n  }\n}\n\nexport default UnsupportedResponseBypassError;\n","import { JSONValue } from '@zimic/http';\n\nimport { UnhandledRequestStrategy } from '@/http';\nimport HttpInterceptorWorker from '@/http/interceptorWorker/HttpInterceptorWorker';\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  type: Response['type'];\n  action?: UnhandledRequestStrategy.Action;\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    type: response.type,\n    action: HttpInterceptorWorker.getResponseAction(response),\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  let response: Response;\n\n  if (serializedResponse.type === 'error') {\n    response = Response.error();\n  } else {\n    const deserializedBody = serializedResponse.body ? convertBase64ToArrayBuffer(serializedResponse.body) : null;\n\n    response = new Response(deserializedBody, {\n      status: serializedResponse.status,\n      statusText: serializedResponse.statusText,\n      headers: new Headers(serializedResponse.headers),\n    });\n  }\n\n  if (serializedResponse.action) {\n    HttpInterceptorWorker.setResponseAction(response, serializedResponse.action);\n  }\n\n  return response;\n}\n","import { CloseEvent } from 'isomorphic-ws';\n\n/** Error thrown when the connection to the interceptor web socket server is unauthorized. */\nclass UnauthorizedWebSocketConnectionError extends Error {\n  constructor(readonly event: CloseEvent) {\n    super(`${event.reason} (code ${event.code})`);\n    this.name = 'UnauthorizedWebSocketConnectionError';\n  }\n}\n\nexport default UnauthorizedWebSocketConnectionError;\n","import ClientSocket, { type WebSocketServer as ServerSocket } from 'isomorphic-ws';\n\nimport { WebSocketControlMessage } from '@/utils/webSocket/constants';\nimport UnauthorizedWebSocketConnectionError from '@/utils/webSocket/errors/UnauthorizedWebSocketConnectionError';\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 = 'WebSocketOpenTimeoutError';\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 = 'WebSocketMessageTimeoutError';\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 = 'WebSocketCloseTimeoutError';\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    waitForAuthentication?: boolean;\n  } = {},\n) {\n  const { timeout: timeoutDuration = DEFAULT_WEB_SOCKET_LIFECYCLE_TIMEOUT, waitForAuthentication = false } = 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 removeAllSocketListeners() {\n      socket.removeEventListener('message', handleSocketMessage); // eslint-disable-line @typescript-eslint/no-use-before-define\n      socket.removeEventListener('open', handleOpenSuccess); // eslint-disable-line @typescript-eslint/no-use-before-define\n      socket.removeEventListener('error', handleOpenError); // eslint-disable-line @typescript-eslint/no-use-before-define\n      socket.removeEventListener('close', handleClose); // eslint-disable-line @typescript-eslint/no-use-before-define\n    }\n\n    function handleOpenError(error: unknown) {\n      removeAllSocketListeners();\n      reject(error);\n    }\n\n    function handleClose(event: ClientSocket.CloseEvent) {\n      const isUnauthorized = event.code === 1008;\n\n      /* istanbul ignore else -- @preserve\n       * An unauthorized close event is the only one we expect to happen here. */\n      if (isUnauthorized) {\n        const unauthorizedError = new UnauthorizedWebSocketConnectionError(event);\n        handleOpenError(unauthorizedError);\n      } else {\n        handleOpenError(event);\n      }\n    }\n\n    const openTimeout = setTimeout(() => {\n      const timeoutError = new WebSocketOpenTimeoutError(timeoutDuration);\n      handleOpenError(timeoutError);\n    }, timeoutDuration);\n\n    function handleOpenSuccess() {\n      removeAllSocketListeners();\n      clearTimeout(openTimeout);\n      resolve();\n    }\n\n    function handleSocketMessage(message: ClientSocket.MessageEvent) {\n      const hasValidAuth = message.data === ('socket:auth:valid' satisfies WebSocketControlMessage);\n\n      /* istanbul ignore else -- @preserve\n       * We currently only support the 'socket:auth:valid' message and it is the only possible control message here. */\n      if (hasValidAuth) {\n        handleOpenSuccess();\n      }\n    }\n\n    if (waitForAuthentication) {\n      socket.addEventListener('message', handleSocketMessage);\n    } else {\n      socket.addEventListener('open', handleOpenSuccess);\n    }\n\n    socket.addEventListener('error', handleOpenError);\n    socket.addEventListener('close', handleClose);\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 removeAllSocketListeners() {\n      socket.removeEventListener('error', handleError); // eslint-disable-line @typescript-eslint/no-use-before-define\n      socket.removeEventListener('close', handleClose); // eslint-disable-line @typescript-eslint/no-use-before-define\n    }\n\n    function handleError(error: unknown) {\n      removeAllSocketListeners();\n      reject(error);\n    }\n\n    const closeTimeout = setTimeout(() => {\n      const timeoutError = new WebSocketCloseTimeoutError(timeoutDuration);\n      handleError(timeoutError);\n    }, timeoutDuration);\n\n    function handleClose() {\n      removeAllSocketListeners();\n      clearTimeout(closeTimeout);\n      resolve();\n    }\n\n    socket.addEventListener('error', handleError);\n    socket.addEventListener('close', handleClose);\n\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","export const WEB_SOCKET_CONTROL_MESSAGES = Object.freeze(['socket:auth:valid'] as const);\nexport type WebSocketControlMessage = (typeof WEB_SOCKET_CONTROL_MESSAGES)[number];\n","class InvalidWebSocketMessageError extends Error {\n  constructor(message: unknown) {\n    super(`Web socket message is invalid and could not be parsed: ${message}`);\n    this.name = 'InvalidWebSocketMessageError';\n  }\n}\n\nexport default InvalidWebSocketMessageError;\n","class NotRunningWebSocketHandlerError extends Error {\n  constructor() {\n    super('Web socket handler is not running.');\n    this.name = 'NotRunningWebSocketHandlerError';\n  }\n}\n\nexport default NotRunningWebSocketHandlerError;\n","import { Collection } from '@zimic/utils/types';\nimport ClientSocket from 'isomorphic-ws';\n\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 { WEB_SOCKET_CONTROL_MESSAGES, WebSocketControlMessage } from './constants';\nimport InvalidWebSocketMessageError from './errors/InvalidWebSocketMessageError';\nimport NotRunningWebSocketHandlerError from './errors/NotRunningWebSocketHandlerError';\nimport {\n  WebSocketEventMessageListener,\n  WebSocketReplyMessageListener,\n  WebSocketReplyMessage,\n  WebSocketEventMessage,\n  WebSocketSchema,\n  WebSocketChannel,\n  WebSocketChannelWithReply,\n  WebSocketChannelWithNoReply,\n  WebSocketMessage,\n} from './types';\n\ninterface WebSocketRequestAbortOptions<Schema extends WebSocketSchema> {\n  shouldAbortRequest?: (request: WebSocketEventMessage<Schema>) => boolean;\n}\n\nabstract class WebSocketHandler<Schema extends WebSocketSchema> {\n  private sockets = new Set<ClientSocket>();\n\n  socketTimeout: number;\n  messageTimeout: number;\n\n  private channelListeners: {\n    [Channel in WebSocketChannel<Schema>]?: {\n      event: Set<WebSocketEventMessageListener<Schema, Channel>>;\n      reply: Set<WebSocketReplyMessageListener<Schema, Channel>>;\n    };\n  } = {};\n\n  private socketListeners = {\n    abortRequests: new Map<ClientSocket, Set<(options: WebSocketRequestAbortOptions<Schema>) => 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  protected async registerSocket(socket: ClientSocket, options: { waitForAuthentication?: boolean } = {}) {\n    const openPromise = waitForOpenClientSocket(socket, {\n      timeout: this.socketTimeout,\n      waitForAuthentication: options.waitForAuthentication,\n    });\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      this.sockets.delete(socket);\n\n      this.emitSocket('abortRequests', socket);\n      this.socketListeners.abortRequests.delete(socket);\n\n      socket.removeEventListener('message', handleSocketMessage);\n      socket.removeEventListener('close', handleSocketClose);\n      socket.removeEventListener('error', handleSocketError);\n    };\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      if (this.isControlMessageData(rawMessage.data)) {\n        return;\n      }\n\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 isControlMessageData(messageData: ClientSocket.Data): messageData is WebSocketControlMessage {\n    return (\n      typeof messageData === 'string' && WEB_SOCKET_CONTROL_MESSAGES.includes(messageData as WebSocketControlMessage)\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 InvalidWebSocketMessageError(data);\n    }\n  }\n\n  private parseMessage(stringifiedMessage: string): WebSocketMessage<Schema> {\n    let parsedMessage: unknown;\n\n    try {\n      parsedMessage = JSON.parse(stringifiedMessage) as unknown;\n    } catch {\n      throw new InvalidWebSocketMessageError(stringifiedMessage);\n    }\n\n    if (!this.isMessage(parsedMessage)) {\n      throw new InvalidWebSocketMessageError(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 isMessage(message: unknown): message is WebSocketMessage<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  isChannelEvent<Channel extends WebSocketChannel<Schema>>(\n    event: WebSocketEventMessage<Schema>,\n    channel: Channel,\n  ): event is WebSocketEventMessage<Schema, Channel> {\n    return event.channel === channel;\n  }\n\n  private async notifyListeners(message: WebSocketMessage<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: WebSocketReplyMessage<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(message: WebSocketEventMessage<Schema>, socket: ClientSocket) {\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      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 createEventMessage<Channel extends WebSocketChannel<Schema>>(\n    channel: Channel,\n    eventData: WebSocketEventMessage<Schema, Channel>['data'],\n  ) {\n    const eventMessage: WebSocketEventMessage<Schema, Channel> = {\n      id: crypto.randomUUID(),\n      channel,\n      data: eventData,\n    };\n    return eventMessage;\n  }\n\n  send<Channel extends WebSocketChannelWithNoReply<Schema>>(\n    channel: Channel,\n    eventData: WebSocketEventMessage<Schema, Channel>['data'],\n    options: {\n      sockets?: Collection<ClientSocket>;\n    } = {},\n  ) {\n    const event = this.createEventMessage(channel, eventData);\n    this.sendMessage(event, options.sockets);\n  }\n\n  async request<Channel extends WebSocketChannelWithReply<Schema>>(\n    channel: Channel,\n    requestData: WebSocketEventMessage<Schema, Channel>['data'],\n    options: {\n      sockets?: Collection<ClientSocket>;\n    } = {},\n  ) {\n    const request = this.createEventMessage(channel, requestData);\n    this.sendMessage(request, options.sockets);\n\n    const response = await this.waitForReply(channel, request, options.sockets);\n    return response.data;\n  }\n\n  async waitForReply<Channel extends WebSocketChannelWithReply<Schema>>(\n    channel: Channel,\n    request: WebSocketEventMessage<Schema, Channel>,\n    sockets: Collection<ClientSocket> = this.sockets,\n  ) {\n    return new Promise<WebSocketReplyMessage<Schema, Channel>>((resolve, reject) => {\n      const replyTimeout = setTimeout(() => {\n        this.offChannel('reply', channel, replyListener); // eslint-disable-line @typescript-eslint/no-use-before-define\n\n        for (const socket of sockets) {\n          this.offSocket('abortRequests', socket, abortRequestsHandler); // eslint-disable-line @typescript-eslint/no-use-before-define\n        }\n\n        const timeoutError = new WebSocketMessageTimeoutError(this.messageTimeout);\n        reject(timeoutError);\n      }, this.messageTimeout);\n\n      const replyListener = this.onChannel('reply', channel, (message) => {\n        if (message.requestId !== request.id) {\n          return;\n        }\n\n        clearTimeout(replyTimeout);\n\n        this.offChannel('reply', channel, replyListener);\n\n        for (const socket of sockets) {\n          this.offSocket('abortRequests', socket, abortRequestsHandler); // eslint-disable-line @typescript-eslint/no-use-before-define\n        }\n\n        resolve(message);\n      });\n\n      const abortRequestsHandler = (options: WebSocketRequestAbortOptions<Schema>) => {\n        const shouldAbortRequest = options.shouldAbortRequest === undefined || options.shouldAbortRequest(request);\n\n        /* istanbul ignore if -- @preserve\n         * Aborting requests is highly non-deterministic because it depends on specific timing of socket events. */\n        if (!shouldAbortRequest) {\n          return;\n        }\n\n        clearTimeout(replyTimeout);\n\n        this.offChannel('reply', channel, replyListener);\n\n        for (const socket of sockets) {\n          this.offSocket('abortRequests', socket, abortRequestsHandler);\n        }\n\n        const abortError = new WebSocketMessageAbortError();\n        reject(abortError);\n      };\n\n      for (const socket of sockets) {\n        this.onSocket('abortRequests', socket, abortRequestsHandler);\n      }\n    });\n  }\n\n  private isReplyMessage<Channel extends WebSocketChannel<Schema>>(message: WebSocketMessage<Schema, Channel>) {\n    return 'requestId' in message;\n  }\n\n  reply<Channel extends WebSocketChannel<Schema>>(\n    request: WebSocketEventMessage<Schema, Channel>,\n    replyData: WebSocketReplyMessage<Schema, Channel>['data'],\n    options: {\n      sockets: Collection<ClientSocket>;\n    },\n  ) {\n    const reply = 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 createReplyMessage<Channel extends WebSocketChannel<Schema>>(\n    request: WebSocketEventMessage<Schema, Channel>,\n    replyData: WebSocketReplyMessage<Schema, Channel>['data'],\n  ) {\n    const replyMessage: WebSocketReplyMessage<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 WebSocketChannel<Schema>>(\n    message: WebSocketMessage<Schema, Channel>,\n    sockets: Collection<ClientSocket> = this.sockets,\n  ) {\n    if (!this.isRunning) {\n      throw new NotRunningWebSocketHandlerError();\n    }\n\n    const stringifiedMessage = JSON.stringify(message);\n\n    for (const socket of sockets) {\n      socket.send(stringifiedMessage);\n    }\n  }\n\n  onChannel<Channel extends WebSocketChannel<Schema>, Listener extends WebSocketEventMessageListener<Schema, Channel>>(\n    type: 'event',\n    channel: Channel,\n    eventListener: Listener,\n  ): Listener;\n  onChannel<Channel extends WebSocketChannel<Schema>, Listener extends WebSocketReplyMessageListener<Schema, Channel>>(\n    type: 'reply',\n    channel: Channel,\n    replyListener: Listener,\n  ): Listener;\n  onChannel<\n    Channel extends WebSocketChannel<Schema>,\n    Listener extends WebSocketEventMessageListener<Schema, Channel> & WebSocketReplyMessageListener<Schema, Channel>,\n  >(type: 'event' | 'reply', channel: Channel, listener: Listener): Listener {\n    const listeners = this.getOrCreateChannelListeners<Channel>(channel);\n    listeners[type].add(listener);\n    return listener;\n  }\n\n  offAny() {\n    this.channelListeners = {};\n\n    for (const listenersBySocket of Object.values(this.socketListeners)) {\n      for (const listeners of listenersBySocket.values()) {\n        listeners.clear();\n      }\n    }\n  }\n\n  private getOrCreateChannelListeners<Channel extends WebSocketChannel<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  offChannel<Channel extends WebSocketChannel<Schema>>(\n    type: 'event',\n    channel: Channel,\n    eventListener: WebSocketEventMessageListener<Schema, Channel>,\n  ): void;\n  offChannel<Channel extends WebSocketChannel<Schema>>(\n    type: 'reply',\n    channel: Channel,\n    replyListener: WebSocketReplyMessageListener<Schema, Channel>,\n  ): void;\n  offChannel<Channel extends WebSocketChannel<Schema>>(\n    type: 'event' | 'reply',\n    channel: Channel,\n    listener: WebSocketEventMessageListener<Schema, Channel> & WebSocketReplyMessageListener<Schema, Channel>,\n  ) {\n    const listeners = this.channelListeners[channel];\n    listeners?.[type].delete(listener);\n  }\n\n  onSocket<Listener extends (options: WebSocketRequestAbortOptions<Schema>) => void>(\n    type: 'abortRequests',\n    socket: ClientSocket,\n    listener: Listener,\n  ): Listener {\n    const listeners = this.getOrCreateSocketListeners(type, socket);\n    listeners.add(listener);\n    return listener;\n  }\n\n  private getOrCreateSocketListeners(type: 'abortRequests', socket: ClientSocket) {\n    const listeners = this.socketListeners[type].get(socket) ?? new Set();\n\n    if (!this.socketListeners[type].has(socket)) {\n      this.socketListeners[type].set(socket, listeners);\n    }\n\n    return listeners;\n  }\n\n  offSocket<Listener extends (options: WebSocketRequestAbortOptions<Schema>) => void>(\n    type: 'abortRequests',\n    socket: ClientSocket,\n    listener: Listener,\n  ) {\n    const listeners = this.socketListeners[type].get(socket);\n    listeners?.delete(listener);\n  }\n\n  emitSocket(type: 'abortRequests', socket: ClientSocket, options: WebSocketRequestAbortOptions<Schema> = {}) {\n    for (const listener of this.socketListeners[type].get(socket) ?? []) {\n      listener(options);\n    }\n  }\n}\n\nexport default WebSocketHandler;\n","import { validateURLProtocol } from '@zimic/utils/url';\nimport ClientSocket from 'isomorphic-ws';\n\nimport { WebSocketSchema } from './types';\nimport WebSocketHandler from './WebSocketHandler';\n\nconst SUPPORTED_WEB_SOCKET_PROTOCOLS = ['ws', 'wss'];\n\ninterface WebSocketClientOptions {\n  url: string;\n  socketTimeout?: number;\n  messageTimeout?: number;\n}\n\nclass WebSocketClient<Schema extends WebSocketSchema> extends WebSocketHandler<Schema> {\n  private url: URL;\n\n  private socket?: ClientSocket;\n\n  constructor(options: WebSocketClientOptions) {\n    super({\n      socketTimeout: options.socketTimeout,\n      messageTimeout: options.messageTimeout,\n    });\n\n    this.url = new URL(options.url);\n    validateURLProtocol(this.url, SUPPORTED_WEB_SOCKET_PROTOCOLS);\n  }\n\n  get isRunning() {\n    return this.socket !== undefined && this.socket.readyState === this.socket.OPEN;\n  }\n\n  async start(options: { parameters?: Record<string, string>; waitForAuthentication?: boolean } = {}) {\n    const parametersAsString = options.parameters\n      ? Object.entries(options.parameters)\n          .map(([key, value]) => `${key}=${value}`)\n          .map(encodeURIComponent)\n      : [];\n\n    this.socket = new ClientSocket(this.url, parametersAsString);\n\n    try {\n      await super.registerSocket(this.socket, options);\n    } catch (error) {\n      await this.stop();\n      throw error;\n    }\n  }\n\n  async stop() {\n    super.offAny();\n\n    if (this.socket) {\n      await super.closeClientSockets([this.socket]);\n    }\n\n    this.socket = undefined;\n  }\n}\n\nexport default WebSocketClient;\n","import { HttpBody, HttpHeadersInit, HttpMethod, HttpRequest, HttpSchema } from '@zimic/http';\nimport { PossiblePromise } from '@zimic/utils/types';\nimport { validatePathParams } from '@zimic/utils/url';\n\nimport UnsupportedResponseBypassError from '@/server/errors/UnsupportedResponseBypassError';\nimport { HttpHandlerCommit, InterceptorServerWebSocketSchema } from '@/server/types/schema';\nimport { isClientSide, isServerSide } from '@/utils/environment';\nimport { deserializeRequest, serializeResponse } from '@/utils/fetch';\nimport { methodCanHaveResponseBody } from '@/utils/http';\nimport { WebSocketMessageAbortError } from '@/utils/webSocket';\nimport { WebSocketEventMessage } from '@/utils/webSocket/types';\nimport WebSocketClient from '@/utils/webSocket/WebSocketClient';\n\nimport NotRunningHttpInterceptorError from '../interceptor/errors/NotRunningHttpInterceptorError';\nimport UnknownHttpInterceptorPlatformError from '../interceptor/errors/UnknownHttpInterceptorPlatformError';\nimport HttpInterceptorImplementation, {\n  AnyHttpInterceptorImplementation,\n} from '../interceptor/HttpInterceptorImplementation';\nimport { HttpInterceptorPlatform, UnhandledRequestStrategy } from '../interceptor/types/options';\nimport HttpInterceptorWorker from './HttpInterceptorWorker';\nimport { HttpResponseFactory, HttpResponseFactoryContext } from './types/http';\nimport { RemoteHttpInterceptorWorkerOptions } from './types/options';\n\ninterface HttpHandler {\n  id: string;\n  baseURL: string;\n  method: HttpMethod;\n  path: string;\n  interceptor: AnyHttpInterceptorImplementation;\n  createResponse: (context: HttpResponseFactoryContext) => PossiblePromise<Response | null>;\n}\n\nclass RemoteHttpInterceptorWorker extends HttpInterceptorWorker {\n  private httpHandlers = new Map<HttpHandler['id'], HttpHandler>();\n\n  webSocketClient: WebSocketClient<InterceptorServerWebSocketSchema>;\n  private auth?: RemoteHttpInterceptorWorkerOptions['auth'];\n\n  constructor(options: RemoteHttpInterceptorWorkerOptions) {\n    super();\n\n    this.webSocketClient = new WebSocketClient({\n      url: this.getWebSocketServerURL(options.serverURL).toString(),\n    });\n\n    this.auth = options.auth;\n  }\n\n  get type() {\n    return 'remote' as const;\n  }\n\n  private getWebSocketServerURL(serverURL: URL) {\n    const webSocketServerURL = new URL(serverURL);\n    webSocketServerURL.protocol = serverURL.protocol.replace(/^http(s)?:$/, 'ws$1:');\n    return webSocketServerURL;\n  }\n\n  async start() {\n    await super.sharedStart(async () => {\n      this.webSocketClient.onChannel('event', 'interceptors/responses/create', this.createResponse);\n      this.webSocketClient.onChannel('event', 'interceptors/responses/unhandled', this.handleUnhandledServerRequest);\n\n      await this.webSocketClient.start({\n        parameters: this.auth ? { token: this.auth.token } : undefined,\n        waitForAuthentication: true,\n      });\n\n      this.platform = this.readPlatform();\n      this.isRunning = true;\n    });\n  }\n\n  private createResponse = async (\n    message: WebSocketEventMessage<InterceptorServerWebSocketSchema, 'interceptors/responses/create'>,\n  ) => {\n    const { handlerId, request: serializedRequest } = message.data;\n\n    const handler = this.httpHandlers.get(handlerId);\n    const request = deserializeRequest(serializedRequest);\n\n    try {\n      const rawResponse = (await handler?.createResponse({ request })) ?? null;\n\n      if (rawResponse) {\n        const response = methodCanHaveResponseBody(request.method as HttpMethod)\n          ? rawResponse\n          : new Response(null, rawResponse);\n\n        return { response: await serializeResponse(response) };\n      }\n    } catch (error) {\n      console.error(error);\n    }\n\n    const strategy = await super.getUnhandledRequestStrategy(request, 'remote');\n    await super.logUnhandledRequestIfNecessary(request, strategy);\n\n    return { response: null };\n  };\n\n  private handleUnhandledServerRequest = async (\n    message: WebSocketEventMessage<InterceptorServerWebSocketSchema, 'interceptors/responses/unhandled'>,\n  ) => {\n    const { request: serializedRequest } = message.data;\n    const request = deserializeRequest(serializedRequest);\n\n    const strategy = await super.getUnhandledRequestStrategy(request, 'remote');\n    const { wasLogged } = await super.logUnhandledRequestIfNecessary(request, strategy);\n\n    return { wasLogged };\n  };\n\n  private readPlatform(): HttpInterceptorPlatform {\n    if (isServerSide()) {\n      return 'node';\n    }\n    /* istanbul ignore else -- @preserve */\n    if (isClientSide()) {\n      return 'browser';\n    }\n    /* istanbul ignore next -- @preserve\n     * Ignoring because checking unknown platforms is not configured in our test setup. */\n    throw new UnknownHttpInterceptorPlatformError();\n  }\n\n  async stop() {\n    await super.sharedStop(async () => {\n      this.webSocketClient.offChannel('event', 'interceptors/responses/create', this.createResponse);\n      this.webSocketClient.offChannel('event', 'interceptors/responses/unhandled', this.handleUnhandledServerRequest);\n\n      await this.clearHandlers();\n\n      await this.webSocketClient.stop();\n\n      this.isRunning = false;\n    });\n  }\n\n  async use<Schema extends HttpSchema>(\n    interceptor: HttpInterceptorImplementation<Schema>,\n    method: HttpMethod,\n    path: string,\n    createResponse: HttpResponseFactory,\n  ) {\n    if (!this.isRunning) {\n      throw new NotRunningHttpInterceptorError();\n    }\n\n    validatePathParams(path);\n\n    const handler: HttpHandler = {\n      id: crypto.randomUUID(),\n      baseURL: interceptor.baseURLAsString,\n      method,\n      path,\n      interceptor,\n      createResponse,\n    };\n\n    this.httpHandlers.set(handler.id, handler);\n\n    await this.webSocketClient.request('interceptors/workers/commit', {\n      id: handler.id,\n      baseURL: handler.baseURL,\n      method: handler.method,\n      path: handler.path,\n    });\n  }\n\n  async createResponseFromDeclaration(\n    request: HttpRequest,\n    declaration:\n      | { status: number; headers?: HttpHeadersInit; body?: HttpBody }\n      | { action: UnhandledRequestStrategy.Action },\n  ) {\n    const response = await super.createResponseFromDeclaration(request, declaration);\n\n    if (response && HttpInterceptorWorker.isBypassedResponse(response)) {\n      throw new UnsupportedResponseBypassError();\n    }\n\n    if (response && HttpInterceptorWorker.isRejectedResponse(response)) {\n      return response;\n    }\n\n    return response;\n  }\n\n  async clearHandlers<Schema extends HttpSchema>(\n    options: {\n      interceptor?: HttpInterceptorImplementation<Schema>;\n    } = {},\n  ) {\n    if (!this.isRunning) {\n      throw new NotRunningHttpInterceptorError();\n    }\n\n    if (options.interceptor === undefined) {\n      this.httpHandlers.clear();\n    } else {\n      for (const handler of this.httpHandlers.values()) {\n        if (handler.interceptor === options.interceptor) {\n          this.httpHandlers.delete(handler.id);\n        }\n      }\n    }\n\n    if (!this.webSocketClient.isRunning) {\n      return;\n    }\n\n    const handlersToRecommit = Array.from<HttpHandler, HttpHandlerCommit>(this.httpHandlers.values(), (handler) => ({\n      id: handler.id,\n      baseURL: handler.baseURL,\n      method: handler.method,\n      path: handler.path,\n    }));\n\n    try {\n      await this.webSocketClient.request('interceptors/workers/reset', handlersToRecommit);\n    } catch (error) {\n      /* istanbul ignore next -- @preserve\n       *\n       * If the socket is closed before receiving a response, the message is aborted with an error. This can happen if\n       * we send a request message and the interceptor server closes the socket before sending a response. In this case,\n       * we can safely ignore the error because we know that the server is shutting down and resetting is no longer\n       * necessary.\n       *\n       * Due to the rare nature of this edge case, we can't reliably reproduce it in tests. */\n      const isMessageAbortError = error instanceof WebSocketMessageAbortError;\n\n      /* istanbul ignore next -- @preserve */\n      if (!isMessageAbortError) {\n        throw error;\n      }\n    }\n  }\n\n  get interceptorsWithHandlers() {\n    const interceptors = Array.from(this.httpHandlers.values(), (handler) => handler.interceptor);\n    return interceptors;\n  }\n}\n\nexport default RemoteHttpInterceptorWorker;\n","import LocalHttpInterceptorWorker from './LocalHttpInterceptorWorker';\nimport RemoteHttpInterceptorWorker from './RemoteHttpInterceptorWorker';\nimport {\n  HttpInterceptorWorkerOptions,\n  LocalHttpInterceptorWorkerOptions,\n  RemoteHttpInterceptorWorkerOptions,\n} from './types/options';\n\nexport function createHttpInterceptorWorker(options: LocalHttpInterceptorWorkerOptions): LocalHttpInterceptorWorker;\nexport function createHttpInterceptorWorker(options: RemoteHttpInterceptorWorkerOptions): RemoteHttpInterceptorWorker;\nexport function createHttpInterceptorWorker(\n  options: HttpInterceptorWorkerOptions,\n): LocalHttpInterceptorWorker | RemoteHttpInterceptorWorker;\nexport function createHttpInterceptorWorker(\n  options: HttpInterceptorWorkerOptions,\n): LocalHttpInterceptorWorker | RemoteHttpInterceptorWorker {\n  if (options.type === 'local') {\n    return new LocalHttpInterceptorWorker(options);\n  } else {\n    return new RemoteHttpInterceptorWorker(options);\n  }\n}\n","import { createHttpInterceptorWorker } from '../interceptorWorker/factory';\nimport LocalHttpInterceptorWorker from '../interceptorWorker/LocalHttpInterceptorWorker';\nimport RemoteHttpInterceptorWorker from '../interceptorWorker/RemoteHttpInterceptorWorker';\nimport {\n  LocalHttpInterceptorWorkerOptions,\n  RemoteHttpInterceptorWorkerOptions,\n} from '../interceptorWorker/types/options';\nimport { AnyHttpInterceptorImplementation } from './HttpInterceptorImplementation';\n\ninterface RemoteWorkerKeyOptions {\n  auth: RemoteHttpInterceptorWorkerOptions['auth'];\n}\n\nclass HttpInterceptorStore {\n  private static _localWorker?: LocalHttpInterceptorWorker;\n  private static runningLocalInterceptors = new Set<AnyHttpInterceptorImplementation>();\n\n  private static remoteWorkers = new Map<string, RemoteHttpInterceptorWorker>();\n  private static runningRemoteInterceptors = new Map<string, Set<AnyHttpInterceptorImplementation>>();\n\n  private class = HttpInterceptorStore;\n\n  get localWorker() {\n    return this.class._localWorker;\n  }\n\n  private getRemoteWorkerKey(baseURL: URL, options: RemoteWorkerKeyOptions) {\n    const key = [`${baseURL.origin}${baseURL.pathname}`];\n\n    if (options.auth) {\n      key.push(options.auth.token);\n    }\n\n    return key.join(':');\n  }\n\n  remoteWorker(baseURL: URL, options: RemoteWorkerKeyOptions) {\n    const remoteWorkerKey = this.getRemoteWorkerKey(baseURL, options);\n    return this.class.remoteWorkers.get(remoteWorkerKey);\n  }\n\n  get numberOfRunningLocalInterceptors() {\n    return this.class.runningLocalInterceptors.size;\n  }\n\n  numberOfRunningRemoteInterceptors(baseURL: URL) {\n    const runningInterceptors = this.class.runningRemoteInterceptors.get(baseURL.origin);\n    return runningInterceptors?.size ?? 0;\n  }\n\n  markLocalInterceptorAsRunning(interceptor: AnyHttpInterceptorImplementation, isRunning: boolean) {\n    if (isRunning) {\n      this.class.runningLocalInterceptors.add(interceptor);\n    } else {\n      this.class.runningLocalInterceptors.delete(interceptor);\n    }\n  }\n\n  markRemoteInterceptorAsRunning(interceptor: AnyHttpInterceptorImplementation, isRunning: boolean, baseURL: URL) {\n    const runningInterceptors =\n      this.class.runningRemoteInterceptors.get(baseURL.origin) ?? this.createRunningInterceptorsSet(baseURL);\n\n    if (isRunning) {\n      runningInterceptors.add(interceptor);\n    } else {\n      runningInterceptors.delete(interceptor);\n    }\n  }\n\n  private createRunningInterceptorsSet(baseURL: URL) {\n    const runningInterceptors = new Set<AnyHttpInterceptorImplementation>();\n    this.class.runningRemoteInterceptors.set(baseURL.origin, runningInterceptors);\n    return runningInterceptors;\n  }\n\n  getOrCreateLocalWorker(workerOptions: Omit<LocalHttpInterceptorWorkerOptions, 'type'>) {\n    const existingWorker = this.class._localWorker;\n\n    if (existingWorker) {\n      return existingWorker;\n    }\n\n    const createdWorker = createHttpInterceptorWorker({ ...workerOptions, type: 'local' });\n    this.class._localWorker = createdWorker;\n\n    return createdWorker;\n  }\n\n  deleteLocalWorker() {\n    this.class._localWorker = undefined;\n  }\n\n  getOrCreateRemoteWorker(workerOptions: Omit<RemoteHttpInterceptorWorkerOptions, 'type'>) {\n    const remoteWorkerKey = this.getRemoteWorkerKey(workerOptions.serverURL, { auth: workerOptions.auth });\n    const existingWorker = this.class.remoteWorkers.get(remoteWorkerKey);\n\n    if (existingWorker) {\n      return existingWorker;\n    }\n\n    const createdWorker = createHttpInterceptorWorker({ ...workerOptions, type: 'remote' });\n    this.class.remoteWorkers.set(remoteWorkerKey, createdWorker);\n\n    return createdWorker;\n  }\n\n  deleteRemoteWorker(baseURL: URL, options: RemoteWorkerKeyOptions) {\n    const remoteWorkerKey = this.getRemoteWorkerKey(baseURL, options);\n    this.class.remoteWorkers.delete(remoteWorkerKey);\n  }\n}\n\nexport default HttpInterceptorStore;\n","import { HttpSchema, HttpSchemaMethod, HttpSchemaPath } from '@zimic/http';\n\nimport LocalHttpRequestHandler from '../requestHandler/LocalHttpRequestHandler';\nimport HttpInterceptorImplementation from './HttpInterceptorImplementation';\nimport HttpInterceptorStore from './HttpInterceptorStore';\nimport { SyncHttpInterceptorMethodHandler } from './types/handlers';\nimport { LocalHttpInterceptorOptions, UnhandledRequestStrategy } from './types/options';\nimport { HttpInterceptorRequestSaving, LocalHttpInterceptor as PublicLocalHttpInterceptor } from './types/public';\n\nclass LocalHttpInterceptor<Schema extends HttpSchema> implements PublicLocalHttpInterceptor<Schema> {\n  private store = new HttpInterceptorStore();\n\n  implementation: HttpInterceptorImplementation<Schema, typeof LocalHttpRequestHandler>;\n\n  constructor(options: LocalHttpInterceptorOptions) {\n    const baseURL = new URL(options.baseURL);\n\n    this.implementation = new HttpInterceptorImplementation<Schema, typeof LocalHttpRequestHandler>({\n      store: this.store,\n      baseURL,\n      createWorker: () => this.store.getOrCreateLocalWorker({}),\n      deleteWorker: () => this.store.deleteLocalWorker(),\n      Handler: LocalHttpRequestHandler,\n      onUnhandledRequest: options.onUnhandledRequest,\n      requestSaving: options.requestSaving,\n    });\n  }\n\n  get type() {\n    return 'local' as const;\n  }\n\n  get baseURL() {\n    return this.implementation.baseURLAsString;\n  }\n\n  set baseURL(baseURL: LocalHttpInterceptorOptions['baseURL']) {\n    this.implementation.baseURL = new URL(baseURL);\n  }\n\n  get requestSaving() {\n    return this.implementation.requestSaving;\n  }\n\n  set requestSaving(requestSaving: HttpInterceptorRequestSaving) {\n    this.implementation.requestSaving = requestSaving;\n  }\n\n  get onUnhandledRequest() {\n    return this.implementation.onUnhandledRequest;\n  }\n\n  set onUnhandledRequest(onUnhandledRequest: UnhandledRequestStrategy.Local | undefined) {\n    this.implementation.onUnhandledRequest = onUnhandledRequest;\n  }\n\n  get platform() {\n    return this.implementation.platform;\n  }\n\n  get isRunning() {\n    return this.implementation.isRunning;\n  }\n\n  async start() {\n    if (this.isRunning) {\n      return;\n    }\n\n    await this.implementation.start();\n  }\n\n  async stop() {\n    if (!this.isRunning) {\n      return;\n    }\n\n    this.clear();\n    await this.implementation.stop();\n  }\n\n  get = ((path: HttpSchemaPath<Schema, HttpSchemaMethod<Schema>>) => {\n    return this.implementation.get(path);\n  }) as unknown as SyncHttpInterceptorMethodHandler<Schema, 'GET'>;\n\n  post = ((path: HttpSchemaPath<Schema, HttpSchemaMethod<Schema>>) => {\n    return this.implementation.post(path);\n  }) as unknown as SyncHttpInterceptorMethodHandler<Schema, 'POST'>;\n\n  patch = ((path: HttpSchemaPath<Schema, HttpSchemaMethod<Schema>>) => {\n    return this.implementation.patch(path);\n  }) as unknown as SyncHttpInterceptorMethodHandler<Schema, 'PATCH'>;\n\n  put = ((path: HttpSchemaPath<Schema, HttpSchemaMethod<Schema>>) => {\n    return this.implementation.put(path);\n  }) as unknown as SyncHttpInterceptorMethodHandler<Schema, 'PUT'>;\n\n  delete = ((path: HttpSchemaPath<Schema, HttpSchemaMethod<Schema>>) => {\n    return this.implementation.delete(path);\n  }) as unknown as SyncHttpInterceptorMethodHandler<Schema, 'DELETE'>;\n\n  head = ((path: HttpSchemaPath<Schema, HttpSchemaMethod<Schema>>) => {\n    return this.implementation.head(path);\n  }) as unknown as SyncHttpInterceptorMethodHandler<Schema, 'HEAD'>;\n\n  options = ((path: HttpSchemaPath<Schema, HttpSchemaMethod<Schema>>) => {\n    return this.implementation.options(path);\n  }) as unknown as SyncHttpInterceptorMethodHandler<Schema, 'OPTIONS'>;\n\n  checkTimes() {\n    this.implementation.checkTimes();\n  }\n\n  clear() {\n    void this.implementation.clear();\n  }\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type AnyLocalHttpInterceptor = LocalHttpInterceptor<any>;\n\nexport default LocalHttpInterceptor;\n","import { HttpSchema, HttpSchemaMethod, HttpSchemaPath } from '@zimic/http';\n\nimport RemoteHttpRequestHandler from '../requestHandler/RemoteHttpRequestHandler';\nimport RunningHttpInterceptorError from './errors/RunningHttpInterceptorError';\nimport HttpInterceptorImplementation from './HttpInterceptorImplementation';\nimport HttpInterceptorStore from './HttpInterceptorStore';\nimport { AsyncHttpInterceptorMethodHandler } from './types/handlers';\nimport { RemoteHttpInterceptorOptions, UnhandledRequestStrategy } from './types/options';\nimport { HttpInterceptorRequestSaving, RemoteHttpInterceptor as PublicRemoteHttpInterceptor } from './types/public';\n\nclass RemoteHttpInterceptor<Schema extends HttpSchema> implements PublicRemoteHttpInterceptor<Schema> {\n  private store = new HttpInterceptorStore();\n  implementation: HttpInterceptorImplementation<Schema, typeof RemoteHttpRequestHandler>;\n  #auth?: RemoteHttpInterceptorOptions['auth'];\n\n  constructor(options: RemoteHttpInterceptorOptions) {\n    this.#auth = options.auth;\n\n    const baseURL = new URL(options.baseURL);\n\n    this.implementation = new HttpInterceptorImplementation<Schema, typeof RemoteHttpRequestHandler>({\n      store: this.store,\n      baseURL,\n      createWorker: () => {\n        return this.store.getOrCreateRemoteWorker({\n          serverURL: baseURL,\n          auth: this.#auth,\n        });\n      },\n      deleteWorker: () => {\n        this.store.deleteRemoteWorker(baseURL, { auth: options.auth });\n      },\n      Handler: RemoteHttpRequestHandler,\n      onUnhandledRequest: options.onUnhandledRequest,\n      requestSaving: options.requestSaving,\n    });\n  }\n\n  get type() {\n    return 'remote' as const;\n  }\n\n  get baseURL() {\n    return this.implementation.baseURLAsString;\n  }\n\n  set baseURL(baseURL: string) {\n    this.implementation.baseURL = new URL(baseURL);\n  }\n\n  get requestSaving() {\n    return this.implementation.requestSaving;\n  }\n\n  set requestSaving(requestSaving: HttpInterceptorRequestSaving) {\n    this.implementation.requestSaving = requestSaving;\n  }\n\n  get auth() {\n    return this.#auth;\n  }\n\n  set auth(auth: RemoteHttpInterceptorOptions['auth'] | undefined) {\n    const cannotChangeAuthWhileRunningMessage =\n      'Did you forget to call `await interceptor.stop()` before changing the authentication parameters?';\n\n    if (this.isRunning) {\n      throw new RunningHttpInterceptorError(cannotChangeAuthWhileRunningMessage);\n    }\n\n    if (!auth) {\n      this.#auth = undefined;\n      return;\n    }\n\n    this.#auth = new Proxy(auth, {\n      set: (target, property, value) => {\n        if (this.isRunning) {\n          throw new RunningHttpInterceptorError(cannotChangeAuthWhileRunningMessage);\n        }\n        return Reflect.set(target, property, value);\n      },\n    });\n  }\n\n  get onUnhandledRequest() {\n    return this.implementation.onUnhandledRequest;\n  }\n\n  set onUnhandledRequest(onUnhandledRequest: UnhandledRequestStrategy.Remote | undefined) {\n    this.implementation.onUnhandledRequest = onUnhandledRequest;\n  }\n\n  get platform() {\n    return this.implementation.platform;\n  }\n\n  get isRunning() {\n    return this.implementation.isRunning;\n  }\n\n  async start() {\n    if (this.isRunning) {\n      return;\n    }\n\n    await this.implementation.start();\n  }\n\n  async stop() {\n    if (!this.isRunning) {\n      return;\n    }\n\n    await this.clear();\n    await this.implementation.stop();\n  }\n\n  get = ((path: HttpSchemaPath<Schema, HttpSchemaMethod<Schema>>) => {\n    return this.implementation.get(path);\n  }) as unknown as AsyncHttpInterceptorMethodHandler<Schema, 'GET'>;\n\n  post = ((path: HttpSchemaPath<Schema, HttpSchemaMethod<Schema>>) => {\n    return this.implementation.post(path);\n  }) as unknown as AsyncHttpInterceptorMethodHandler<Schema, 'POST'>;\n\n  patch = ((path: HttpSchemaPath<Schema, HttpSchemaMethod<Schema>>) => {\n    return this.implementation.patch(path);\n  }) as unknown as AsyncHttpInterceptorMethodHandler<Schema, 'PATCH'>;\n\n  put = ((path: HttpSchemaPath<Schema, HttpSchemaMethod<Schema>>) => {\n    return this.implementation.put(path);\n  }) as unknown as AsyncHttpInterceptorMethodHandler<Schema, 'PUT'>;\n\n  delete = ((path: HttpSchemaPath<Schema, HttpSchemaMethod<Schema>>) => {\n    return this.implementation.delete(path);\n  }) as unknown as AsyncHttpInterceptorMethodHandler<Schema, 'DELETE'>;\n\n  head = ((path: HttpSchemaPath<Schema, HttpSchemaMethod<Schema>>) => {\n    return this.implementation.head(path);\n  }) as unknown as AsyncHttpInterceptorMethodHandler<Schema, 'HEAD'>;\n\n  options = ((path: HttpSchemaPath<Schema, HttpSchemaMethod<Schema>>) => {\n    return this.implementation.options(path);\n  }) as unknown as AsyncHttpInterceptorMethodHandler<Schema, 'OPTIONS'>;\n\n  checkTimes() {\n    return new Promise<void>((resolve, reject) => {\n      try {\n        this.implementation.checkTimes();\n        resolve();\n      } catch (error) {\n        reject(error);\n      }\n    });\n  }\n\n  async clear() {\n    await this.implementation.clear();\n  }\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type AnyRemoteHttpInterceptor = RemoteHttpInterceptor<any>;\n\nexport default RemoteHttpInterceptor;\n","import { HttpSchema } from '@zimic/http';\n\nimport UnknownHttpInterceptorTypeError from './errors/UnknownHttpInterceptorTypeError';\nimport LocalHttpInterceptor from './LocalHttpInterceptor';\nimport RemoteHttpInterceptor from './RemoteHttpInterceptor';\nimport { HttpInterceptorOptions, LocalHttpInterceptorOptions, RemoteHttpInterceptorOptions } from './types/options';\nimport {\n  LocalHttpInterceptor as PublicLocalHttpInterceptor,\n  RemoteHttpInterceptor as PublicRemoteHttpInterceptor,\n} from './types/public';\n\nfunction isLocalHttpInterceptorOptions(options: HttpInterceptorOptions): options is LocalHttpInterceptorOptions {\n  return options.type === undefined || options.type === 'local';\n}\n\nfunction isRemoteHttpInterceptorOptions(options: HttpInterceptorOptions): options is RemoteHttpInterceptorOptions {\n  return options.type === 'remote';\n}\n\n/** @see {@link https://zimic.dev/docs/interceptor/api/create-http-interceptor `createHttpInterceptor()` API reference} */\nexport function createHttpInterceptor<Schema extends HttpSchema>(\n  options: LocalHttpInterceptorOptions,\n): PublicLocalHttpInterceptor<Schema>;\nexport function createHttpInterceptor<Schema extends HttpSchema>(\n  options: RemoteHttpInterceptorOptions,\n): PublicRemoteHttpInterceptor<Schema>;\nexport function createHttpInterceptor<Schema extends HttpSchema>(\n  options: HttpInterceptorOptions,\n): PublicLocalHttpInterceptor<Schema> | PublicRemoteHttpInterceptor<Schema>;\nexport function createHttpInterceptor<Schema extends HttpSchema>(\n  options: HttpInterceptorOptions,\n): PublicLocalHttpInterceptor<Schema> | PublicRemoteHttpInterceptor<Schema> {\n  const type = options.type;\n\n  if (isLocalHttpInterceptorOptions(options)) {\n    return new LocalHttpInterceptor<Schema>(options);\n  } else if (isRemoteHttpInterceptorOptions(options)) {\n    return new RemoteHttpInterceptor<Schema>(options);\n  }\n\n  throw new UnknownHttpInterceptorTypeError(type);\n}\n","import {\n  InvalidFormDataError as HttpInvalidFormDataError,\n  InvalidJSONError as HttpInvalidJSONError,\n} from '@zimic/http';\n\nexport { default as RunningHttpInterceptorError } from './interceptor/errors/RunningHttpInterceptorError';\nexport { default as NotRunningHttpInterceptorError } from './interceptor/errors/NotRunningHttpInterceptorError';\nexport { default as UnknownHttpInterceptorPlatformError } from './interceptor/errors/UnknownHttpInterceptorPlatformError';\nexport { default as UnknownHttpInterceptorTypeError } from './interceptor/errors/UnknownHttpInterceptorTypeError';\nexport { default as RequestSavingSafeLimitExceededError } from './interceptor/errors/RequestSavingSafeLimitExceededError';\n\nexport { default as UnregisteredBrowserServiceWorkerError } from './interceptorWorker/errors/UnregisteredBrowserServiceWorkerError';\n\nexport { default as DisabledRequestSavingError } from './requestHandler/errors/DisabledRequestSavingError';\n// eslint-disable-next-line @typescript-eslint/no-deprecated\nexport { default as HttpTimesCheckError, TimesCheckError } from './errors/HttpTimesCheckError';\n\nexport type {\n  HttpRequestHandlerResponseDeclaration,\n  HttpRequestHandlerResponseDeclarationFactory,\n  HttpRequestHandlerResponseDelayFactory,\n  HttpInterceptorRequest,\n  HttpInterceptorResponse,\n  InterceptedHttpInterceptorRequest,\n} from './requestHandler/types/requests';\n\nexport type {\n  LocalHttpRequestHandler,\n  RemoteHttpRequestHandler,\n  SyncedRemoteHttpRequestHandler,\n  PendingRemoteHttpRequestHandler,\n  HttpRequestHandler,\n} from './requestHandler/types/public';\nexport type {\n  HttpRequestHandlerRestriction,\n  HttpRequestHandlerStaticRestriction,\n  HttpRequestHandlerComputedRestriction,\n  HttpRequestHandlerHeadersStaticRestriction,\n  HttpRequestHandlerSearchParamsStaticRestriction,\n  HttpRequestHandlerBodyStaticRestriction,\n} from './requestHandler/types/restrictions';\n\nexport type {\n  HttpInterceptorType,\n  HttpInterceptorPlatform,\n  LocalHttpInterceptorOptions,\n  RemoteHttpInterceptorOptions,\n  HttpInterceptorOptions,\n  UnhandledRequestStrategy,\n} from './interceptor/types/options';\n\nexport type { UnhandledHttpInterceptorRequest } from './interceptor/types/requests';\n\nexport type { InferHttpInterceptorSchema } from './interceptor/types/schema';\n\nexport type { LocalHttpInterceptor, RemoteHttpInterceptor, HttpInterceptor } from './interceptor/types/public';\n\nexport { createHttpInterceptor } from './interceptor/factory';\n\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 *\n * @deprecated This type has been moved to {@link https://zimic.dev/docs/http `@zimic/http`}. Please import\n *   `InvalidFormDataError` from `@zimic/http` instead.\n *\n *   ```ts\n *   import { InvalidFormDataError } from '@zimic/http';\n *   ```\n */\nexport class InvalidFormDataError extends HttpInvalidFormDataError {}\n\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 *\n * @deprecated This type has been moved to {@link https://zimic.dev/docs/http `@zimic/http`}. Please import\n *   `InvalidJSONError` from `@zimic/http` instead.\n *\n *   ```ts\n *   import { InvalidJSONError } from '@zimic/http';\n *   ```\n */\nexport class InvalidJSONError extends HttpInvalidJSONError {}\n"]}