{"version":3,"sources":["../../src/node/setup-server.ts","../../src/node/async-handlers-controller.ts","../../src/node/setup-server-common.ts"],"sourcesContent":["import type { Interceptor } from '@mswjs/interceptors'\nimport { ClientRequestInterceptor } from '@mswjs/interceptors/ClientRequest'\nimport { XMLHttpRequestInterceptor } from '@mswjs/interceptors/XMLHttpRequest'\nimport { FetchInterceptor } from '@mswjs/interceptors/fetch'\nimport { WebSocketInterceptor } from '@mswjs/interceptors/WebSocket'\nimport {\n  defineNetwork,\n  type DefineNetworkOptions,\n} from '#core/experimental/define-network'\nimport type { AnyHandler } from '#core/experimental/handlers-controller'\nimport { InterceptorSource } from '#core/experimental/sources/interceptor-source'\nimport type { SetupServer } from './glossary'\nimport { AsyncHandlersController } from './async-handlers-controller'\nimport {\n  defineSetupServerApi,\n  SetupServerCommonApi,\n} from './setup-server-common'\n\nconst defaultInterceptors: Array<Interceptor<any>> = [\n  new ClientRequestInterceptor(),\n  new XMLHttpRequestInterceptor(),\n  new FetchInterceptor(),\n  /**\n   * @fixme WebSocketInterceptor is in a browser-only export of Interceptors\n   * while the Interceptor class imported from the root module points to `lib/node`.\n   * An absolute madness to solve as it requires to duplicate the build config we have\n   * in MSW: shared core, CJS/ESM patching, .d.ts patching...\n   */\n  new WebSocketInterceptor() as any,\n]\n\nexport const defaultNetworkOptions: DefineNetworkOptions<[InterceptorSource]> =\n  {\n    sources: [\n      new InterceptorSource({\n        interceptors: defaultInterceptors,\n      }),\n    ],\n    onUnhandledFrame: 'warn',\n    context: {\n      quiet: true,\n    },\n  }\n\n/**\n * Enables request interception in Node.js with the given request handlers.\n * @see {@link https://mswjs.io/docs/api/setup-server `setupServer()` API reference}\n */\nexport function setupServer(...handlers: Array<AnyHandler>): SetupServer {\n  const handlersController = new AsyncHandlersController(handlers)\n  const network = defineNetwork({\n    ...defaultNetworkOptions,\n    handlers: handlersController,\n  })\n\n  const commonApi = defineSetupServerApi(network)\n\n  return {\n    ...commonApi,\n    boundary: handlersController.boundary.bind(handlersController),\n  }\n}\n\n/**\n * @deprecated\n * Please use the `defineNetwork` API instead.\n */\nexport class SetupServerApi\n  extends SetupServerCommonApi\n  implements SetupServer\n{\n  #handlersController: AsyncHandlersController\n\n  public boundary: AsyncHandlersController['boundary']\n\n  constructor(\n    handlers: Array<AnyHandler>,\n    interceptors: Array<Interceptor<any>>,\n  ) {\n    const controller = new AsyncHandlersController(handlers)\n    super(interceptors, controller)\n\n    const { sources: _, ...networkOptions } = defaultNetworkOptions\n    this.network.configure(networkOptions)\n\n    this.#handlersController = controller\n    this.boundary = this.#handlersController.boundary.bind(\n      this.#handlersController,\n    )\n  }\n}\n","import { AsyncLocalStorage } from 'node:async_hooks'\nimport {\n  HandlersController,\n  type AnyHandler,\n  type HandlersMap,\n  type HandlersControllerState,\n} from '#core/experimental/handlers-controller'\n\nexport interface AsyncHandlersControllerContext {\n  initialHandlers: HandlersMap\n  handlers: HandlersMap\n}\n\nexport class AsyncHandlersController extends HandlersController {\n  #asyncContext: AsyncLocalStorage<AsyncHandlersControllerContext>\n  #fallbackContext: AsyncHandlersControllerContext\n\n  constructor(initialHandlers: Array<AnyHandler>) {\n    super()\n\n    const initialState = this.getInitialState(initialHandlers)\n\n    this.#asyncContext = new AsyncLocalStorage()\n    this.#fallbackContext = {\n      initialHandlers: initialState.initialHandlers,\n      handlers: initialState.handlers,\n    }\n  }\n\n  protected getState() {\n    const { initialHandlers, handlers } = this.#getContext()\n\n    return {\n      initialHandlers,\n      handlers,\n    }\n  }\n\n  protected setState(nextState: HandlersControllerState): void {\n    const context = this.#getContext()\n\n    if (nextState.initialHandlers) {\n      context.initialHandlers = nextState.initialHandlers\n    }\n\n    if (nextState.handlers) {\n      context.handlers = nextState.handlers\n    }\n  }\n\n  public boundary<Args extends Array<any>, R>(callback: (...args: Args) => R) {\n    return (...args: Args) => {\n      const initialHandlers = { ...this.getState().handlers }\n\n      return this.#asyncContext.run(\n        {\n          initialHandlers,\n          handlers: { ...initialHandlers },\n        },\n        callback,\n        ...args,\n      )\n    }\n  }\n\n  #getContext() {\n    return this.#asyncContext.getStore() || this.#fallbackContext\n  }\n}\n","import type { PartialDeep } from 'type-fest'\nimport type { Interceptor } from '@mswjs/interceptors'\nimport {\n  NetworkReadyState,\n  defineNetwork,\n  type NetworkApi,\n} from '#core/experimental/define-network'\nimport type { AnyHandler } from '#core/experimental/handlers-controller'\nimport type { HandlersController } from '#core/experimental/handlers-controller'\nimport { InterceptorSource } from '#core/experimental/sources/interceptor-source'\nimport { fromLegacyOnUnhandledRequest } from '#core/experimental/compat'\nimport type { ListenOptions, SetupServerCommon } from './glossary'\n\n/**\n * Define the common `setupServer` API around the given network.\n * This is used by both `msw/node` and `msw/native` to implement the same\n * baseline setup methods, like `.use()`, `.resetHandlers()`, `.close()`, etc.\n */\nexport function defineSetupServerApi(\n  network: NetworkApi<any>,\n): SetupServerCommon {\n  return {\n    events: network.events,\n    listen(options) {\n      network.configure({\n        onUnhandledFrame: fromLegacyOnUnhandledRequest(() => {\n          return options?.onUnhandledRequest || 'warn'\n        }),\n      })\n\n      network.enable()\n    },\n    use: network.use.bind(network),\n    resetHandlers: network.resetHandlers.bind(network),\n    restoreHandlers: network.restoreHandlers.bind(network),\n    listHandlers: network.listHandlers.bind(network),\n    close() {\n      /**\n       * @note Ignore closing after closed for backwards compatibility.\n       */\n      if (network.readyState === NetworkReadyState.DISABLED) {\n        return\n      }\n\n      network.disable()\n    },\n  }\n}\n\n/**\n * @deprecated\n * Please use the `defineNetwork` API instead.\n */\nexport class SetupServerCommonApi implements SetupServerCommon {\n  protected network: NetworkApi<[InterceptorSource]>\n\n  constructor(\n    interceptors: Array<Interceptor<any>>,\n    handlers: Array<AnyHandler> | HandlersController,\n  ) {\n    this.network = defineNetwork({\n      sources: [new InterceptorSource({ interceptors })],\n      handlers,\n    })\n  }\n\n  get events() {\n    return this.network.events\n  }\n\n  public listen(options?: PartialDeep<ListenOptions>): void {\n    this.network.configure({\n      onUnhandledFrame: fromLegacyOnUnhandledRequest(() => {\n        return options?.onUnhandledRequest || 'warn'\n      }),\n    })\n\n    this.network.enable()\n  }\n\n  public use(...handlers: Array<AnyHandler>): void {\n    this.network.use(...handlers)\n  }\n\n  public resetHandlers(...nextHandlers: Array<AnyHandler>): void {\n    return this.network.resetHandlers(...nextHandlers)\n  }\n\n  public restoreHandlers(): void {\n    return this.network.restoreHandlers()\n  }\n\n  public listHandlers(): ReadonlyArray<AnyHandler> {\n    return this.network.listHandlers()\n  }\n\n  public close(): void {\n    this.network.disable()\n  }\n}\n"],"mappings":"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","names":["defineNetwork","InterceptorSource","InterceptorSource","defineNetwork"]}