{"version":3,"sources":["../src/server/errors/RunningInterceptorServerError.ts","../src/server/errors/NotRunningInterceptorServerError.ts","../../zimic-utils/src/server/lifecycle.ts","../src/utils/webSocket/errors/UnauthorizedWebSocketConnectionError.ts","../src/utils/webSocket.ts","../src/server/constants.ts","../../zimic-utils/src/url/createRegexFromPath.ts","../../zimic-utils/src/url/excludeNonPathParams.ts","../../zimic-utils/src/data/isDefined.ts","../src/utils/arrays.ts","../src/utils/environment.ts","../src/utils/http.ts","../../zimic-utils/src/import/createCachedDynamicImport.ts","../../zimic-utils/src/logging/Logger.ts","../src/utils/logging.ts","../src/http/requestHandler/types/requests.ts","../src/http/interceptorWorker/constants.ts","../src/http/interceptorWorker/HttpInterceptorWorker.ts","../src/utils/data.ts","../src/utils/fetch.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/WebSocketServer.ts","../src/utils/files.ts","../src/server/errors/InvalidInterceptorTokenError.ts","../src/server/errors/InvalidInterceptorTokenFileError.ts","../src/server/errors/InvalidInterceptorTokenValueError.ts","../src/server/utils/auth.ts","../src/server/utils/fetch.ts","../src/server/InterceptorServer.ts","../src/server/factory.ts"],"names":["path","color","util","interceptor","HttpHeaders","HttpSearchParams","fs","crypto","handler"],"mappings":"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","file":"chunk-F3VMDYHM.mjs","sourcesContent":["/**\n * An error thrown when the interceptor server is running and some operation requires it to be stopped first.\n *\n * @see {@link https://zimic.dev/docs/interceptor/api/interceptor-server `@zimic/interceptor/server` API reference}\n */\nclass RunningInterceptorServerError extends Error {\n  constructor(additionalMessage: string) {\n    super(`The interceptor server is running.${additionalMessage}`);\n    this.name = 'RunningInterceptorServerError';\n  }\n}\n\nexport default RunningInterceptorServerError;\n","/* istanbul ignore next -- @preserve */\n/** An error thrown when the interceptor server is not running. */\nclass NotRunningInterceptorServerError extends Error {\n  constructor() {\n    super('The interceptor server is not running. Did you forget to start it?');\n    this.name = 'NotRunningInterceptorServerError';\n  }\n}\n\nexport default NotRunningInterceptorServerError;\n","import { Server as HttpServer } from 'http';\n\nexport const DEFAULT_HTTP_SERVER_LIFECYCLE_TIMEOUT = 60 * 1000;\n\nexport class HttpServerTimeoutError extends Error {\n  constructor(message: string) {\n    super(message);\n    this.name = 'HttpServerTimeoutError';\n  }\n}\n\nexport class HttpServerStartTimeoutError extends HttpServerTimeoutError {\n  constructor(reachedTimeout: number) {\n    super(`HTTP server start timed out after ${reachedTimeout}ms.`);\n    this.name = 'HttpServerStartTimeoutError';\n  }\n}\n\nexport class HttpServerStopTimeoutError extends HttpServerTimeoutError {\n  constructor(reachedTimeout: number) {\n    super(`HTTP server stop timed out after ${reachedTimeout}ms.`);\n    this.name = 'HttpServerStopTimeoutError';\n  }\n}\n\nexport async function startHttpServer(\n  server: HttpServer,\n  options: {\n    hostname?: string;\n    port?: number;\n    timeout?: number;\n  } = {},\n) {\n  const { hostname, port, timeout: timeoutDuration = DEFAULT_HTTP_SERVER_LIFECYCLE_TIMEOUT } = options;\n\n  await new Promise<void>((resolve, reject) => {\n    function handleStartError(error: unknown) {\n      server.off('listening', handleStartSuccess); // eslint-disable-line @typescript-eslint/no-use-before-define\n      reject(error);\n    }\n\n    const startTimeout = setTimeout(() => {\n      const timeoutError = new HttpServerStartTimeoutError(timeoutDuration);\n      handleStartError(timeoutError);\n    }, timeoutDuration);\n\n    function handleStartSuccess() {\n      server.off('error', handleStartError);\n      clearTimeout(startTimeout);\n      resolve();\n    }\n\n    server.once('error', handleStartError);\n    server.listen(port, hostname, handleStartSuccess);\n  });\n}\n\nexport async function stopHttpServer(server: HttpServer, options: { timeout?: number } = {}) {\n  const { timeout: timeoutDuration = DEFAULT_HTTP_SERVER_LIFECYCLE_TIMEOUT } = options;\n\n  if (!server.listening) {\n    return;\n  }\n\n  await new Promise<void>((resolve, reject) => {\n    const stopTimeout = setTimeout(() => {\n      const timeoutError = new HttpServerStopTimeoutError(timeoutDuration);\n      reject(timeoutError);\n    }, timeoutDuration);\n\n    server.close((error) => {\n      clearTimeout(stopTimeout);\n\n      /* istanbul ignore if -- @preserve\n       * This is expected not to happen since the servers are not stopped unless they are running. */\n      if (error) {\n        reject(error);\n      } else {\n        resolve();\n      }\n    });\n\n    server.closeAllConnections();\n  });\n}\n\nexport function getHttpServerHostname(server: HttpServer) {\n  const address = server.address();\n\n  if (typeof address === 'string') {\n    return undefined;\n  } else {\n    return address?.address;\n  }\n}\n\nexport function getHttpServerPort(server: HttpServer) {\n  const address = server.address();\n\n  if (typeof address === 'string') {\n    return undefined;\n  } else {\n    return address?.port;\n  }\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","import { HTTP_METHODS, HttpSchema } from '@zimic/http';\nimport { DEFAULT_HTTP_SERVER_LIFECYCLE_TIMEOUT } from '@zimic/utils/server';\n\nimport { DEFAULT_WEB_SOCKET_MESSAGE_TIMEOUT } from '@/utils/webSocket';\n\nexport const DEFAULT_SERVER_LIFE_CYCLE_TIMEOUT = DEFAULT_HTTP_SERVER_LIFECYCLE_TIMEOUT;\nexport const DEFAULT_SERVER_RPC_TIMEOUT = DEFAULT_WEB_SOCKET_MESSAGE_TIMEOUT;\n\nconst ALLOWED_ACCESS_CONTROL_HTTP_METHODS = HTTP_METHODS.join(',');\n\nexport type AccessControlHeaders = HttpSchema.Headers<{\n  'access-control-allow-origin': string;\n  'access-control-allow-methods': string;\n  'access-control-allow-headers': string;\n  'access-control-expose-headers': string;\n  'access-control-max-age'?: string;\n}>;\n\n/** The default access control headers for the server. */\nexport const DEFAULT_ACCESS_CONTROL_HEADERS = Object.freeze({\n  'access-control-allow-origin': '*',\n  'access-control-allow-methods': ALLOWED_ACCESS_CONTROL_HTTP_METHODS,\n  'access-control-allow-headers': '*',\n  'access-control-expose-headers': '*',\n  'access-control-max-age': process.env.INTERCEPTOR_SERVER_ACCESS_CONTROL_MAX_AGE,\n}) satisfies AccessControlHeaders;\n\n/** The default status code for the preflight request. */\nexport const DEFAULT_PREFLIGHT_STATUS_CODE = 204;\n\nexport const DEFAULT_HOSTNAME = 'localhost';\nexport const DEFAULT_LOG_UNHANDLED_REQUESTS = true;\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","function isDefined<Value>(value: Value): value is NonNullable<Value> {\n  return value !== undefined && value !== null;\n}\n\nexport default isDefined;\n","export function removeArrayIndex<Item>(array: Item[], index: number) {\n  if (index >= 0 && index < array.length) {\n    array.splice(index, 1);\n  }\n  return array;\n}\n\nexport function removeArrayElement<Item>(array: Item[], element: Item) {\n  const index = array.indexOf(element);\n  return removeArrayIndex(array, index);\n}\n","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 { 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","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","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 {\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 { 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","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","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 { PossiblePromise } from '@zimic/utils/types';\nimport { Server as HttpServer, IncomingMessage } from 'http';\nimport ClientSocket from 'isomorphic-ws';\n\nimport { closeServerSocket } from '@/utils/webSocket';\n\nimport { WebSocketControlMessage } from './constants';\nimport { WebSocketSchema } from './types';\nimport WebSocketHandler from './WebSocketHandler';\n\nconst { WebSocketServer: ServerSocket } = ClientSocket;\n\nexport type WebSocketServerAuthenticate = (\n  socket: ClientSocket,\n  request: IncomingMessage,\n) => PossiblePromise<{ isValid: true } | { isValid: false; message: string }>;\n\ninterface WebSocketServerOptions {\n  httpServer: HttpServer;\n  socketTimeout?: number;\n  messageTimeout?: number;\n  authenticate?: WebSocketServerAuthenticate;\n}\n\nclass WebSocketServer<Schema extends WebSocketSchema> extends WebSocketHandler<Schema> {\n  private webSocketServer?: InstanceType<typeof ServerSocket>;\n\n  private httpServer: HttpServer;\n  private authenticate?: WebSocketServerOptions['authenticate'];\n\n  constructor(options: WebSocketServerOptions) {\n    super({\n      socketTimeout: options.socketTimeout,\n      messageTimeout: options.messageTimeout,\n    });\n\n    this.httpServer = options.httpServer;\n    this.authenticate = options.authenticate;\n  }\n\n  get isRunning() {\n    return this.webSocketServer !== undefined;\n  }\n\n  start() {\n    if (this.isRunning) {\n      return;\n    }\n\n    const webSocketServer = new ServerSocket({ server: this.httpServer });\n\n    webSocketServer.on('error', (error) => {\n      console.error(error);\n    });\n\n    webSocketServer.on('connection', async (socket, request) => {\n      if (this.authenticate) {\n        const result = await this.authenticate(socket, request);\n\n        if (!result.isValid) {\n          socket.close(1008, result.message);\n          return;\n        }\n      }\n\n      try {\n        await super.registerSocket(socket);\n        socket.send('socket:auth:valid' satisfies WebSocketControlMessage);\n      } catch (error) {\n        webSocketServer.emit('error', error);\n      }\n    });\n\n    this.webSocketServer = webSocketServer;\n  }\n\n  async stop() {\n    if (!this.webSocketServer || !this.isRunning) {\n      return;\n    }\n\n    super.offAny();\n    await super.closeClientSockets();\n\n    await closeServerSocket(this.webSocketServer, { timeout: this.socketTimeout });\n\n    this.webSocketServer = undefined;\n  }\n}\n\nexport default WebSocketServer;\n","import { createCachedDynamicImport } from '@zimic/utils/import';\nimport type fs from 'fs';\n\nexport const importFilesystem = createCachedDynamicImport<typeof fs>(() => import('fs'));\n\nexport async function pathExists(path: string) {\n  const fs = await importFilesystem();\n\n  try {\n    await fs.promises.access(path);\n    return true;\n  } catch {\n    return false;\n  }\n}\n","/**\n * Error thrown when an interceptor token is invalid.\n *\n * @see {@link https://zimic.dev/docs/interceptor/guides/http/remote-interceptors#interceptor-server-authentication Interceptor server authentication}\n */\nclass InvalidInterceptorTokenError extends Error {\n  constructor(tokenId: string) {\n    super(`Invalid interceptor token: ${tokenId}`);\n    this.name = 'InvalidInterceptorTokenError';\n  }\n}\n\nexport default InvalidInterceptorTokenError;\n","/**\n * Error thrown when an interceptor token file is invalid.\n *\n * @see {@link https://zimic.dev/docs/interceptor/guides/http/remote-interceptors#interceptor-server-authentication Interceptor server authentication}\n */\nclass InvalidInterceptorTokenFileError extends Error {\n  constructor(tokenFilePath: string, validationErrorMessage: string) {\n    super(`Invalid interceptor token file ${tokenFilePath}: ${validationErrorMessage}`);\n    this.name = 'InvalidInterceptorTokenFileError';\n  }\n}\n\nexport default InvalidInterceptorTokenFileError;\n","/**\n * Error thrown when an interceptor token value is invalid.\n *\n * @see {@link https://zimic.dev/docs/interceptor/guides/http/remote-interceptors#interceptor-server-authentication Interceptor server authentication}\n */\nclass InvalidInterceptorTokenValueError extends Error {\n  constructor(tokenValue: string) {\n    super(`Invalid interceptor token value: ${tokenValue}`);\n    this.name = 'InvalidInterceptorTokenValueError';\n  }\n}\n\nexport default InvalidInterceptorTokenValueError;\n","import crypto from 'crypto';\nimport fs from 'fs';\nimport os from 'os';\nimport path from 'path';\nimport color from 'picocolors';\nimport util from 'util';\nimport * as z from 'zod';\n\nimport {\n  BASE64URL_REGEX,\n  convertHexLengthToBase64urlLength,\n  convertHexLengthToByteLength,\n  HEX_REGEX,\n} from '@/utils/data';\nimport { pathExists } from '@/utils/files';\nimport { logger } from '@/utils/logging';\n\nimport InvalidInterceptorTokenError from '../errors/InvalidInterceptorTokenError';\nimport InvalidInterceptorTokenFileError from '../errors/InvalidInterceptorTokenFileError';\nimport InvalidInterceptorTokenValueError from '../errors/InvalidInterceptorTokenValueError';\n\nexport const DEFAULT_INTERCEPTOR_TOKENS_DIRECTORY = path.join(\n  '.zimic',\n  'interceptor',\n  'server',\n  `tokens${process.env.VITEST_POOL_ID}`,\n);\n\nexport const INTERCEPTOR_TOKEN_ID_HEX_LENGTH = 32;\n\nexport const INTERCEPTOR_TOKEN_SECRET_HEX_LENGTH = 64;\nexport const INTERCEPTOR_TOKEN_VALUE_HEX_LENGTH = INTERCEPTOR_TOKEN_ID_HEX_LENGTH + INTERCEPTOR_TOKEN_SECRET_HEX_LENGTH;\nexport const INTERCEPTOR_TOKEN_VALUE_BASE64URL_LENGTH = convertHexLengthToBase64urlLength(\n  INTERCEPTOR_TOKEN_VALUE_HEX_LENGTH,\n);\n\nexport const INTERCEPTOR_TOKEN_SALT_HEX_LENGTH = 64;\nexport const INTERCEPTOR_TOKEN_HASH_ITERATIONS = Number(process.env.INTERCEPTOR_TOKEN_HASH_ITERATIONS);\nexport const INTERCEPTOR_TOKEN_HASH_HEX_LENGTH = 128;\nexport const INTERCEPTOR_TOKEN_HASH_ALGORITHM = 'sha512';\n\nconst pbkdf2 = util.promisify(crypto.pbkdf2);\n\nasync function hashInterceptorToken(plainToken: string, salt: string) {\n  const hashBuffer = await pbkdf2(\n    plainToken,\n    salt,\n    INTERCEPTOR_TOKEN_HASH_ITERATIONS,\n    convertHexLengthToByteLength(INTERCEPTOR_TOKEN_HASH_HEX_LENGTH),\n    INTERCEPTOR_TOKEN_HASH_ALGORITHM,\n  );\n\n  const hash = hashBuffer.toString('hex');\n  return hash;\n}\n\ninterface InterceptorTokenSecret {\n  hash: string;\n  salt: string;\n  value: string;\n}\n\nexport interface InterceptorToken {\n  id: string;\n  name?: string;\n  secret: InterceptorTokenSecret;\n  value: string;\n  createdAt: Date;\n}\n\nexport function createInterceptorTokenId() {\n  return crypto.randomUUID().replace(/[^a-z0-9]/g, '');\n}\n\nexport function isValidInterceptorTokenId(tokenId: string) {\n  return tokenId.length === INTERCEPTOR_TOKEN_ID_HEX_LENGTH && HEX_REGEX.test(tokenId);\n}\n\nfunction isValidInterceptorTokenValue(tokenValue: string) {\n  return tokenValue.length === INTERCEPTOR_TOKEN_VALUE_BASE64URL_LENGTH && BASE64URL_REGEX.test(tokenValue);\n}\n\nexport async function createInterceptorTokensDirectory(tokensDirectory: string) {\n  try {\n    const parentTokensDirectory = path.dirname(tokensDirectory);\n    await fs.promises.mkdir(parentTokensDirectory, { recursive: true });\n    await fs.promises.mkdir(tokensDirectory, { mode: 0o700, recursive: true });\n    await fs.promises.appendFile(path.join(tokensDirectory, '.gitignore'), `*${os.EOL}`, { encoding: 'utf-8' });\n  } catch (error) {\n    logger.error(\n      `${color.red(color.bold('✖'))} Failed to create the tokens directory: ${color.magenta(tokensDirectory)}`,\n    );\n    throw error;\n  }\n}\n\nconst interceptorTokenFileContentSchema = z.object({\n  version: z.literal(1),\n  token: z.object({\n    id: z.string().length(INTERCEPTOR_TOKEN_ID_HEX_LENGTH).regex(HEX_REGEX),\n    name: z.string().optional(),\n    secret: z.object({\n      hash: z.string().length(INTERCEPTOR_TOKEN_HASH_HEX_LENGTH).regex(HEX_REGEX),\n      salt: z.string().length(INTERCEPTOR_TOKEN_SALT_HEX_LENGTH).regex(HEX_REGEX),\n    }),\n    createdAt: z.iso.datetime().transform((value) => new Date(value)),\n  }),\n});\n\nexport type InterceptorTokenFileContent = z.infer<typeof interceptorTokenFileContentSchema>;\n\nexport namespace InterceptorTokenFileContent {\n  export type Input = z.input<typeof interceptorTokenFileContentSchema>;\n}\n\nexport type PersistedInterceptorToken = InterceptorTokenFileContent['token'];\n\nnamespace PersistedInterceptorToken {\n  export type Input = InterceptorTokenFileContent.Input['token'];\n}\n\nexport async function saveInterceptorTokenToFile(tokensDirectory: string, token: InterceptorToken) {\n  const tokeFilePath = path.join(tokensDirectory, token.id);\n\n  const persistedToken: PersistedInterceptorToken.Input = {\n    id: token.id,\n    name: token.name,\n    secret: {\n      hash: token.secret.hash,\n      salt: token.secret.salt,\n    },\n    createdAt: token.createdAt.toISOString(),\n  };\n\n  const tokenFileContent = interceptorTokenFileContentSchema.parse({\n    version: 1,\n    token: persistedToken,\n  } satisfies InterceptorTokenFileContent.Input);\n\n  await fs.promises.writeFile(tokeFilePath, JSON.stringify(tokenFileContent, null, 2), {\n    mode: 0o600,\n    encoding: 'utf-8',\n  });\n\n  return tokeFilePath;\n}\n\nexport async function readInterceptorTokenFromFile(\n  tokenId: InterceptorToken['id'],\n  options: { tokensDirectory: string },\n): Promise<PersistedInterceptorToken | null> {\n  if (!isValidInterceptorTokenId(tokenId)) {\n    throw new InvalidInterceptorTokenError(tokenId);\n  }\n\n  const tokenFilePath = path.join(options.tokensDirectory, tokenId);\n  const tokenFileExists = await pathExists(tokenFilePath);\n\n  if (!tokenFileExists) {\n    return null;\n  }\n\n  const tokenFileContentAsString = await fs.promises.readFile(tokenFilePath, { encoding: 'utf-8' });\n\n  const validation = interceptorTokenFileContentSchema.safeParse(JSON.parse(tokenFileContentAsString) as unknown);\n\n  if (!validation.success) {\n    throw new InvalidInterceptorTokenFileError(tokenFilePath, validation.error.message);\n  }\n\n  return validation.data.token;\n}\n\nexport async function createInterceptorToken(\n  options: { name?: string; tokensDirectory?: string } = {},\n): Promise<InterceptorToken> {\n  const { name, tokensDirectory = DEFAULT_INTERCEPTOR_TOKENS_DIRECTORY } = options;\n\n  const tokensDirectoryExists = await pathExists(tokensDirectory);\n\n  if (!tokensDirectoryExists) {\n    await createInterceptorTokensDirectory(tokensDirectory);\n  }\n\n  const tokenId = createInterceptorTokenId();\n\n  /* istanbul ignore if -- @preserve\n   * This should never happen, but let's check that the token identifier is valid after generated. */\n  if (!isValidInterceptorTokenId(tokenId)) {\n    throw new InvalidInterceptorTokenError(tokenId);\n  }\n\n  const tokenSecretSizeInBytes = convertHexLengthToByteLength(INTERCEPTOR_TOKEN_SECRET_HEX_LENGTH);\n  const tokenSecret = crypto.randomBytes(tokenSecretSizeInBytes).toString('hex');\n\n  const tokenSecretSaltSizeInBytes = convertHexLengthToByteLength(INTERCEPTOR_TOKEN_SALT_HEX_LENGTH);\n  const tokenSecretSalt = crypto.randomBytes(tokenSecretSaltSizeInBytes).toString('hex');\n  const tokenSecretHash = await hashInterceptorToken(tokenSecret, tokenSecretSalt);\n\n  const tokenValue = Buffer.from(`${tokenId}${tokenSecret}`, 'hex').toString('base64url');\n\n  /* istanbul ignore if -- @preserve\n   * This should never happen, but let's check that the token value is valid after generated. */\n  if (!isValidInterceptorTokenValue(tokenValue)) {\n    throw new InvalidInterceptorTokenValueError(tokenValue);\n  }\n\n  const token: InterceptorToken = {\n    id: tokenId,\n    name,\n    secret: {\n      hash: tokenSecretHash,\n      salt: tokenSecretSalt,\n      value: tokenSecret,\n    },\n    value: tokenValue,\n    createdAt: new Date(),\n  };\n\n  await saveInterceptorTokenToFile(tokensDirectory, token);\n\n  return token;\n}\n\nexport async function listInterceptorTokens(options: { tokensDirectory?: string } = {}) {\n  const { tokensDirectory = DEFAULT_INTERCEPTOR_TOKENS_DIRECTORY } = options;\n\n  const tokensDirectoryExists = await pathExists(tokensDirectory);\n\n  if (!tokensDirectoryExists) {\n    return [];\n  }\n\n  const files = await fs.promises.readdir(tokensDirectory);\n\n  const tokenReadPromises = files.map(async (file) => {\n    if (!isValidInterceptorTokenId(file)) {\n      return null;\n    }\n\n    const tokenId = file;\n    const token = await readInterceptorTokenFromFile(tokenId, { tokensDirectory });\n    return token;\n  });\n\n  const tokenCandidates = await Promise.allSettled(tokenReadPromises);\n\n  const tokens: PersistedInterceptorToken[] = [];\n\n  for (const tokenCandidate of tokenCandidates) {\n    if (tokenCandidate.status === 'rejected') {\n      console.error(tokenCandidate.reason);\n    } else if (tokenCandidate.value !== null) {\n      tokens.push(tokenCandidate.value);\n    }\n  }\n\n  tokens.sort((token, otherToken) => token.createdAt.getTime() - otherToken.createdAt.getTime());\n\n  return tokens;\n}\n\nexport async function validateInterceptorToken(tokenValue: string, options: { tokensDirectory: string }) {\n  if (!isValidInterceptorTokenValue(tokenValue)) {\n    throw new InvalidInterceptorTokenValueError(tokenValue);\n  }\n\n  const decodedTokenValue = Buffer.from(tokenValue, 'base64url').toString('hex');\n\n  const tokenId = decodedTokenValue.slice(0, INTERCEPTOR_TOKEN_ID_HEX_LENGTH);\n  const tokenSecret = decodedTokenValue.slice(\n    INTERCEPTOR_TOKEN_ID_HEX_LENGTH,\n    INTERCEPTOR_TOKEN_ID_HEX_LENGTH + INTERCEPTOR_TOKEN_VALUE_HEX_LENGTH,\n  );\n\n  const tokenFromFile = await readInterceptorTokenFromFile(tokenId, options);\n\n  if (!tokenFromFile) {\n    throw new InvalidInterceptorTokenValueError(tokenValue);\n  }\n\n  const tokenSecretHash = await hashInterceptorToken(tokenSecret, tokenFromFile.secret.salt);\n\n  if (tokenSecretHash !== tokenFromFile.secret.hash) {\n    throw new InvalidInterceptorTokenValueError(tokenValue);\n  }\n}\n\nexport async function removeInterceptorToken(tokenId: string, options: { tokensDirectory?: string } = {}) {\n  const { tokensDirectory = DEFAULT_INTERCEPTOR_TOKENS_DIRECTORY } = options;\n\n  /* istanbul ignore if -- @preserve\n   * At this point, we should have a valid tokenId. This is just a sanity check. */\n  if (!isValidInterceptorTokenId(tokenId)) {\n    throw new InvalidInterceptorTokenError(tokenId);\n  }\n\n  const tokenFilePath = path.join(tokensDirectory, tokenId);\n\n  await fs.promises.rm(tokenFilePath, { force: true });\n}\n","import { FetchAPI } from '@whatwg-node/server';\n\nexport function getFetchAPI(): FetchAPI {\n  return {\n    fetch,\n    Request,\n    Response,\n    Headers,\n    FormData,\n    ReadableStream,\n    WritableStream,\n    TransformStream,\n    CompressionStream,\n    DecompressionStream,\n    TextDecoderStream,\n    TextEncoderStream,\n    Blob,\n    File,\n    crypto: globalThis.crypto,\n    btoa,\n    TextEncoder,\n    TextDecoder,\n    URLPattern,\n    URL,\n    URLSearchParams,\n  };\n}\n","import { normalizeNodeRequest, sendNodeResponse } from '@whatwg-node/server';\nimport { HttpRequest, HttpMethod } from '@zimic/http';\nimport { startHttpServer, stopHttpServer, getHttpServerPort } from '@zimic/utils/server';\nimport { createRegexFromPath, excludeNonPathParams } from '@zimic/utils/url';\nimport { createServer, Server as HttpServer, IncomingMessage, ServerResponse } from 'http';\nimport type { WebSocket as Socket } from 'isomorphic-ws';\n\nimport HttpInterceptorWorker from '@/http/interceptorWorker/HttpInterceptorWorker';\nimport { removeArrayIndex } from '@/utils/arrays';\nimport { deserializeResponse, SerializedHttpRequest, serializeRequest } from '@/utils/fetch';\nimport { WebSocketMessageAbortError } from '@/utils/webSocket';\nimport { WebSocketEventMessage } from '@/utils/webSocket/types';\nimport WebSocketServer, { WebSocketServerAuthenticate } from '@/utils/webSocket/WebSocketServer';\n\nimport {\n  DEFAULT_ACCESS_CONTROL_HEADERS,\n  DEFAULT_PREFLIGHT_STATUS_CODE,\n  DEFAULT_LOG_UNHANDLED_REQUESTS,\n  DEFAULT_HOSTNAME,\n} from './constants';\nimport NotRunningInterceptorServerError from './errors/NotRunningInterceptorServerError';\nimport RunningInterceptorServerError from './errors/RunningInterceptorServerError';\nimport { InterceptorServerOptions } from './types/options';\nimport { InterceptorServer as PublicInterceptorServer } from './types/public';\nimport { HttpHandlerCommit, InterceptorServerWebSocketSchema } from './types/schema';\nimport { validateInterceptorToken } from './utils/auth';\nimport { getFetchAPI } from './utils/fetch';\n\ninterface HttpHandler {\n  id: string;\n  baseURL: string;\n  pathRegex: RegExp;\n  socket: Socket;\n}\n\nclass InterceptorServer implements PublicInterceptorServer {\n  private httpServer?: HttpServer;\n  private webSocketServer?: WebSocketServer<InterceptorServerWebSocketSchema>;\n\n  _hostname: string;\n  _port: number | undefined;\n  logUnhandledRequests: boolean;\n  tokensDirectory?: string;\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  private knownWorkerSockets = new Set<Socket>();\n\n  constructor(options: InterceptorServerOptions) {\n    this._hostname = options.hostname ?? DEFAULT_HOSTNAME;\n    this._port = options.port;\n    this.logUnhandledRequests = options.logUnhandledRequests ?? DEFAULT_LOG_UNHANDLED_REQUESTS;\n    this.tokensDirectory = options.tokensDirectory;\n  }\n\n  get hostname() {\n    return this._hostname;\n  }\n\n  set hostname(newHostname: string) {\n    if (this.isRunning) {\n      throw new RunningInterceptorServerError('Did you forget to stop it before changing the hostname?');\n    }\n    this._hostname = newHostname;\n  }\n\n  get port() {\n    return this._port;\n  }\n\n  set port(newPort: number | undefined) {\n    if (this.isRunning) {\n      throw new RunningInterceptorServerError('Did you forget to stop it before changing the port?');\n    }\n    this._port = newPort;\n  }\n\n  get isRunning() {\n    return !!this.httpServer?.listening && !!this.webSocketServer?.isRunning;\n  }\n\n  private get httpServerOrThrow(): HttpServer {\n    /* istanbul ignore if -- @preserve\n     * The HTTP server is initialized before using this method in normal conditions. */\n    if (!this.httpServer) {\n      throw new NotRunningInterceptorServerError();\n    }\n    return this.httpServer;\n  }\n\n  private get webSocketServerOrThrow(): WebSocketServer<InterceptorServerWebSocketSchema> {\n    /* istanbul ignore if -- @preserve\n     * The web socket server is initialized before using this method in normal conditions. */\n    if (!this.webSocketServer) {\n      throw new NotRunningInterceptorServerError();\n    }\n    return this.webSocketServer;\n  }\n\n  async start() {\n    if (this.isRunning) {\n      return;\n    }\n\n    this.httpServer = createServer({\n      keepAlive: true,\n      joinDuplicateHeaders: true,\n    });\n    await this.startHttpServer();\n\n    this.webSocketServer = new WebSocketServer({\n      httpServer: this.httpServer,\n      authenticate: this.authenticateWebSocketConnection,\n    });\n\n    this.startWebSocketServer();\n  }\n\n  private authenticateWebSocketConnection: WebSocketServerAuthenticate = async (_socket, request) => {\n    if (!this.tokensDirectory) {\n      return { isValid: true };\n    }\n\n    const tokenValue = this.getWebSocketRequestTokenValue(request);\n\n    if (!tokenValue) {\n      return { isValid: false, message: 'An interceptor token is required, but none was provided.' };\n    }\n\n    try {\n      await validateInterceptorToken(tokenValue, { tokensDirectory: this.tokensDirectory });\n      return { isValid: true };\n    } catch (error) {\n      console.error(error);\n      return { isValid: false, message: 'The interceptor token is not valid.' };\n    }\n  };\n\n  private getWebSocketRequestTokenValue(request: IncomingMessage) {\n    const protocols = request.headers['sec-websocket-protocol'] ?? '';\n    const parametersAsString = decodeURIComponent(protocols).split(', ');\n\n    for (const parameterAsString of parametersAsString) {\n      const tokenValueMatch = /^token=(?<tokenValue>.+?)$/.exec(parameterAsString);\n      const tokenValue = tokenValueMatch?.groups?.tokenValue;\n\n      if (tokenValue) {\n        return tokenValue;\n      }\n    }\n\n    return undefined;\n  }\n\n  private async startHttpServer() {\n    this.httpServerOrThrow.on('request', this.handleHttpRequest);\n\n    await startHttpServer(this.httpServerOrThrow, {\n      hostname: this.hostname,\n      port: this.port,\n    });\n\n    this.port = getHttpServerPort(this.httpServerOrThrow);\n  }\n\n  private startWebSocketServer() {\n    this.webSocketServerOrThrow.onChannel('event', 'interceptors/workers/commit', this.commitWorker);\n    this.webSocketServerOrThrow.onChannel('event', 'interceptors/workers/reset', this.resetWorker);\n\n    this.webSocketServerOrThrow.start();\n  }\n\n  private commitWorker = (\n    message: WebSocketEventMessage<InterceptorServerWebSocketSchema, 'interceptors/workers/commit'>,\n    socket: Socket,\n  ) => {\n    const commit = message.data;\n\n    this.registerHttpHandler(commit, socket);\n    this.registerWorkerSocketIfUnknown(socket);\n\n    return {};\n  };\n\n  private resetWorker = (\n    { data: handlersToRecommit }: WebSocketEventMessage<InterceptorServerWebSocketSchema, 'interceptors/workers/reset'>,\n    socket: Socket,\n  ) => {\n    this.registerWorkerSocketIfUnknown(socket);\n\n    this.webSocketServerOrThrow.emitSocket('abortRequests', socket, {\n      shouldAbortRequest: (request) => {\n        const isResponseCreationRequest = this.webSocketServerOrThrow.isChannelEvent(\n          request,\n          'interceptors/responses/create',\n        );\n\n        /* istanbul ignore if -- @preserve\n         * While resetting a worker, there could be other types of requests in progress. These are not guaranteed to\n         * exist and are not related to handler resets, so we let them continue. */\n        if (!isResponseCreationRequest) {\n          return false;\n        }\n\n        // TODO: create a test with two interceptors, one for each path,, and reset only one of them.\n        const isHandlerStillCommitted = handlersToRecommit.some(\n          /* istanbul ignore next -- @preserve\n           * Ensuring this function is called in tests is difficult because it requires clearing or stopping a worker\n           * at the exact moment a request is being handled, in a scenario when there are other handlers still\n           * committed. */\n          (handler) => request.data.handlerId === handler.id,\n        );\n        return !isHandlerStillCommitted;\n      },\n    });\n\n    this.removeHttpHandlersBySocket(socket);\n\n    for (const handler of handlersToRecommit) {\n      this.registerHttpHandler(handler, socket);\n    }\n\n    return {};\n  };\n\n  private registerHttpHandler({ id, baseURL, method, path }: HttpHandlerCommit, socket: Socket) {\n    const handlerGroups = this.httpHandlersByMethod[method];\n\n    handlerGroups.push({\n      id,\n      baseURL,\n      pathRegex: createRegexFromPath(path),\n      socket,\n    });\n  }\n\n  private registerWorkerSocketIfUnknown(socket: Socket) {\n    if (this.knownWorkerSockets.has(socket)) {\n      return;\n    }\n\n    socket.addEventListener('close', () => {\n      this.removeHttpHandlersBySocket(socket);\n      this.knownWorkerSockets.delete(socket);\n    });\n\n    this.knownWorkerSockets.add(socket);\n  }\n\n  private removeHttpHandlersBySocket(socket: Socket) {\n    for (const handlerGroups of Object.values(this.httpHandlersByMethod)) {\n      const socketIndex = handlerGroups.findIndex((handlerGroup) => handlerGroup.socket === socket);\n      removeArrayIndex(handlerGroups, socketIndex);\n    }\n  }\n\n  async stop() {\n    if (!this.isRunning) {\n      return;\n    }\n\n    await this.stopWebSocketServer();\n    await this.stopHttpServer();\n  }\n\n  private async stopHttpServer() {\n    await stopHttpServer(this.httpServerOrThrow);\n    this.httpServerOrThrow.removeAllListeners();\n    this.httpServer = undefined;\n  }\n\n  private async stopWebSocketServer() {\n    this.webSocketServerOrThrow.offChannel('event', 'interceptors/workers/commit', this.commitWorker);\n    this.webSocketServerOrThrow.offChannel('event', 'interceptors/workers/reset', this.resetWorker);\n\n    await this.webSocketServerOrThrow.stop();\n\n    this.webSocketServer = undefined;\n  }\n\n  private handleHttpRequest = async (nodeRequest: IncomingMessage, nodeResponse: ServerResponse) => {\n    const request = normalizeNodeRequest(nodeRequest, getFetchAPI());\n    const serializedRequest = await serializeRequest(request);\n\n    try {\n      const { response, matchedSomeInterceptor } = await this.createResponseForRequest(serializedRequest);\n\n      if (response) {\n        if (HttpInterceptorWorker.isRejectedResponse(response)) {\n          nodeResponse.destroy();\n        } else {\n          this.setDefaultAccessControlHeaders(response, [\n            'access-control-allow-origin',\n            'access-control-expose-headers',\n          ]);\n\n          await sendNodeResponse(response, nodeResponse, nodeRequest, true);\n        }\n\n        return;\n      }\n\n      const isUnhandledPreflightResponse = request.method === 'OPTIONS';\n\n      if (isUnhandledPreflightResponse) {\n        const defaultPreflightResponse = new Response(null, { status: DEFAULT_PREFLIGHT_STATUS_CODE });\n        this.setDefaultAccessControlHeaders(defaultPreflightResponse);\n        await sendNodeResponse(defaultPreflightResponse, nodeResponse, nodeRequest, true);\n      }\n\n      const shouldWarnUnhandledRequest = !isUnhandledPreflightResponse && !matchedSomeInterceptor;\n\n      if (shouldWarnUnhandledRequest) {\n        await this.logUnhandledRequestIfNecessary(request, serializedRequest);\n      }\n\n      nodeResponse.destroy();\n    } catch (error) {\n      const isMessageAbortError = error instanceof WebSocketMessageAbortError;\n\n      if (!isMessageAbortError) {\n        console.error(error);\n        await this.logUnhandledRequestIfNecessary(request, serializedRequest);\n      }\n\n      nodeResponse.destroy();\n    }\n  };\n\n  private async createResponseForRequest(request: SerializedHttpRequest) {\n    const 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    let matchedSomeInterceptor = false;\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      matchedSomeInterceptor = true;\n\n      const { response: serializedResponse } = await this.webSocketServerOrThrow.request(\n        'interceptors/responses/create',\n        { handlerId: handler.id, request },\n        { sockets: [handler.socket] },\n      );\n\n      if (serializedResponse) {\n        const response = deserializeResponse(serializedResponse);\n        return { response, matchedSomeInterceptor };\n      }\n    }\n\n    return { response: null, matchedSomeInterceptor };\n  }\n\n  private setDefaultAccessControlHeaders(\n    response: Response,\n    headersToSet = Object.keys(DEFAULT_ACCESS_CONTROL_HEADERS),\n  ) {\n    for (const key of headersToSet) {\n      if (response.headers.has(key)) {\n        continue;\n      }\n\n      const value = DEFAULT_ACCESS_CONTROL_HEADERS[key];\n      /* istanbul ignore else -- @preserve\n       * This is always true during tests because we force max-age=0 to disable CORS caching. */\n      if (value) {\n        response.headers.set(key, value);\n      }\n    }\n  }\n\n  private async logUnhandledRequestIfNecessary(request: HttpRequest, serializedRequest: SerializedHttpRequest) {\n    const handler = this.findHttpHandlerByRequestBaseURL(request);\n\n    if (handler) {\n      try {\n        const { wasLogged: wasRequestLoggedByRemoteInterceptor } = await this.webSocketServerOrThrow.request(\n          'interceptors/responses/unhandled',\n          { request: serializedRequest },\n          { sockets: [handler.socket] },\n        );\n\n        if (wasRequestLoggedByRemoteInterceptor) {\n          return;\n        }\n      } catch (error) {\n        /* istanbul ignore next -- @preserve\n         *\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 worker closes the socket before sending a response. In this\n         * case, we can safely ignore the error because we know that the worker is shutting down and won't handle\n         * any more requests.\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    if (!this.logUnhandledRequests) {\n      return;\n    }\n\n    await HttpInterceptorWorker.logUnhandledRequestWarning(request, 'reject');\n  }\n\n  private findHttpHandlerByRequestBaseURL(request: HttpRequest) {\n    const methodHandlers = this.httpHandlersByMethod[request.method as HttpMethod];\n\n    const handler = methodHandlers.findLast((handler) => request.url.startsWith(handler.baseURL));\n    return handler;\n  }\n}\n\nexport default InterceptorServer;\n","import InterceptorServer from './InterceptorServer';\nimport { InterceptorServerOptions } from './types/options';\nimport { InterceptorServer as PublicInterceptorServer } from './types/public';\n\n/** @see {@link https://zimic.dev/docs/interceptor/api/create-interceptor-server `createInterceptorServer` API reference} */\nexport function createInterceptorServer(options: InterceptorServerOptions = {}): PublicInterceptorServer {\n  return new InterceptorServer(options);\n}\n"]}