sam522's picture
node
d4b85c0
import { Emitter } from 'strict-event-emitter'
import {
LifeCycleEventEmitter,
LifeCycleEventsMap,
SharedOptions,
} from '~/core/sharedOptions'
import { ServiceWorkerMessage } from './start/utils/createMessageChannel'
import { RequestHandler } from '~/core/handlers/RequestHandler'
import type { HttpRequestEventMap, Interceptor } from '@mswjs/interceptors'
import type { Path } from '~/core/utils/matching/matchRequestUrl'
import type { RequiredDeep } from '~/core/typeUtils'
import type { WebSocketHandler } from '~/core/handlers/WebSocketHandler'
export type ResolvedPath = Path | URL
type RequestWithoutMethods = Omit<
Request,
| 'text'
| 'body'
| 'json'
| 'blob'
| 'arrayBuffer'
| 'formData'
| 'clone'
| 'signal'
| 'isHistoryNavigation'
| 'isReloadNavigation'
>
/**
* Request representation received from the worker message event.
*/
export interface ServiceWorkerIncomingRequest extends RequestWithoutMethods {
/**
* Unique ID of the request generated once the request is
* intercepted by the "fetch" event in the Service Worker.
*/
id: string
body?: ArrayBuffer | null
}
export type ServiceWorkerIncomingResponse = Pick<
Response,
'type' | 'ok' | 'status' | 'statusText' | 'body' | 'headers' | 'redirected'
> & {
requestId: string
isMockedResponse: boolean
}
/**
* Map of the events that can be received from the Service Worker.
*/
export interface ServiceWorkerIncomingEventsMap {
MOCKING_ENABLED: {
client: {
id: string
frameType: string
}
}
INTEGRITY_CHECK_RESPONSE: {
packageVersion: string
checksum: string
}
KEEPALIVE_RESPONSE: never
REQUEST: ServiceWorkerIncomingRequest
RESPONSE: ServiceWorkerIncomingResponse
}
/**
* Map of the events that can be sent to the Service Worker
* from any execution context.
*/
export type ServiceWorkerOutgoingEventTypes =
| 'MOCK_ACTIVATE'
| 'MOCK_DEACTIVATE'
| 'INTEGRITY_CHECK_REQUEST'
| 'KEEPALIVE_REQUEST'
| 'CLIENT_CLOSED'
export interface StringifiedResponse extends ResponseInit {
body: string | ArrayBuffer | ReadableStream<Uint8Array> | null
}
export interface StrictEventListener<EventType extends Event> {
(event: EventType): void
}
export interface SetupWorkerInternalContext {
isMockingEnabled: boolean
startOptions: RequiredDeep<StartOptions>
worker: ServiceWorker | null
registration: ServiceWorkerRegistration | null
getRequestHandlers(): Array<RequestHandler | WebSocketHandler>
requests: Map<string, Request>
emitter: Emitter<LifeCycleEventsMap>
keepAliveInterval?: number
workerChannel: {
/**
* Adds a Service Worker event listener.
*/
on<EventType extends keyof ServiceWorkerIncomingEventsMap>(
eventType: EventType,
callback: (
event: MessageEvent,
message: ServiceWorkerMessage<
EventType,
ServiceWorkerIncomingEventsMap[EventType]
>,
) => void,
): void
send<EventType extends ServiceWorkerOutgoingEventTypes>(
eventType: EventType,
): void
}
events: {
/**
* Adds an event listener on the given target.
* Returns a clean-up function that removes that listener.
*/
addListener<EventType extends Event>(
target: EventTarget,
eventType: string,
callback: StrictEventListener<EventType>,
): () => void
/**
* Removes all currently attached listeners.
*/
removeAllListeners(): void
/**
* Awaits a given message type from the Service Worker.
*/
once<EventType extends keyof ServiceWorkerIncomingEventsMap>(
eventType: EventType,
): Promise<
ServiceWorkerMessage<EventType, ServiceWorkerIncomingEventsMap[EventType]>
>
}
supports: {
serviceWorkerApi: boolean
readableStreamTransfer: boolean
}
fallbackInterceptor?: Interceptor<HttpRequestEventMap>
}
export type ServiceWorkerInstanceTuple = [
ServiceWorker | null,
ServiceWorkerRegistration,
]
export type FindWorker = (
scriptUrl: string,
mockServiceWorkerUrl: string,
) => boolean
export interface StartOptions extends SharedOptions {
/**
* Service Worker registration options.
*/
serviceWorker?: {
/**
* Custom url to the worker script.
* @default "/mockServiceWorker.js"
*/
url?: string
options?: RegistrationOptions
}
/**
* Disables the logging of the intercepted requests
* into browser's console.
* @default false
*/
quiet?: boolean
/**
* Defers any network requests until the Service Worker
* instance is activated.
* @default true
*/
waitUntilReady?: boolean
/**
* A custom lookup function to find a Mock Service Worker in the list
* of all registered Service Workers on the page.
*/
findWorker?: FindWorker
}
export type StartReturnType = Promise<ServiceWorkerRegistration | undefined>
export type StartHandler = (
options: RequiredDeep<StartOptions>,
initialOptions: StartOptions,
) => StartReturnType
export type StopHandler = () => void
export interface SetupWorker {
/**
* Registers and activates the mock Service Worker.
*
* @see {@link https://mswjs.io/docs/api/setup-worker/start `worker.start()` API reference}
*/
start: (options?: StartOptions) => StartReturnType
/**
* Stops requests interception for the current client.
*
* @see {@link https://mswjs.io/docs/api/setup-worker/stop `worker.stop()` API reference}
*/
stop: StopHandler
/**
* Prepends given request handlers to the list of existing handlers.
* @param {RequestHandler[]} handlers List of runtime request handlers.
*
* @see {@link https://mswjs.io/docs/api/setup-worker/use `worker.use()` API reference}
*/
use: (...handlers: Array<RequestHandler | WebSocketHandler>) => void
/**
* Marks all request handlers that respond using `res.once()` as unused.
*
* @see {@link https://mswjs.io/docs/api/setup-worker/restore-handlers `worker.restoreHandlers()` API reference}
*/
restoreHandlers: () => void
/**
* Resets request handlers to the initial list given to the `setupWorker` call, or to the explicit next request handlers list, if given.
* @param {RequestHandler[]} nextHandlers List of the new initial request handlers.
*
* @see {@link https://mswjs.io/docs/api/setup-worker/reset-handlers `worker.resetHandlers()` API reference}
*/
resetHandlers: (
...nextHandlers: Array<RequestHandler | WebSocketHandler>
) => void
/**
* Returns a readonly list of currently active request handlers.
*
* @see {@link https://mswjs.io/docs/api/setup-worker/list-handlers `worker.listHandlers()` API reference}
*/
listHandlers(): ReadonlyArray<RequestHandler | WebSocketHandler>
/**
* Life-cycle events.
* Life-cycle events allow you to subscribe to the internal library events occurring during the request/response handling.
*
* @see {@link https://mswjs.io/docs/api/life-cycle-events Life-cycle Events API reference}
*/
events: LifeCycleEventEmitter<LifeCycleEventsMap>
}