msw
Version:
61 lines (55 loc) • 1.98 kB
text/typescript
import type { Interceptor } from '@mswjs/interceptors'
import { ClientRequestInterceptor } from '@mswjs/interceptors/ClientRequest'
import { XMLHttpRequestInterceptor } from '@mswjs/interceptors/XMLHttpRequest'
import { FetchInterceptor } from '@mswjs/interceptors/fetch'
import { WebSocketInterceptor } from '@mswjs/interceptors/WebSocket'
import {
defineNetwork,
type DefineNetworkOptions,
} from '#core/experimental/define-network'
import type { AnyHandler } from '#core/experimental/handlers-controller'
import { InterceptorSource } from '#core/experimental/sources/interceptor-source'
import type { SetupServer } from './glossary'
import { AsyncHandlersController } from './async-handlers-controller'
import { defineSetupServerApi } from './setup-server-common'
const defaultInterceptors: Array<Interceptor<any>> = [
new ClientRequestInterceptor(),
new XMLHttpRequestInterceptor(),
new FetchInterceptor(),
new WebSocketInterceptor(),
]
export const defaultNetworkOptions: DefineNetworkOptions<[InterceptorSource]> =
{
sources: [
new InterceptorSource({
interceptors: defaultInterceptors,
}),
],
onUnhandledFrame: 'warn',
context: {
quiet: true,
},
}
/**
* Enables request interception in Node.js with the given request handlers.
* @see {@link https://mswjs.io/docs/api/setup-server `setupServer()` API reference}
*/
export function setupServer(...handlers: Array<AnyHandler>): SetupServer {
const handlersController = new AsyncHandlersController(handlers)
const network = defineNetwork({
...defaultNetworkOptions,
handlers: handlersController,
})
const commonApi = defineSetupServerApi(network)
return {
...commonApi,
/**
* @note Spreading evaluates the "readyState" getter once.
* Redefine it so the property stays live.
*/
get readyState() {
return network.readyState
},
boundary: handlersController.boundary.bind(handlersController),
}
}