Skip to content

Commit 97cf4c7

Browse files
authored
fix(setupWorker): handle in-flight requests after calling worker.stop() (#2578)
1 parent 44e1521 commit 97cf4c7

24 files changed

+474
-474
lines changed

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -251,6 +251,7 @@
251251
"outvariant": "^1.4.3",
252252
"path-to-regexp": "^6.3.0",
253253
"picocolors": "^1.1.1",
254+
"rettime": "^0.7.0",
254255
"strict-event-emitter": "^0.5.1",
255256
"tough-cookie": "^6.0.0",
256257
"type-fest": "^4.26.1",

pnpm-lock.yaml

Lines changed: 8 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/browser/setupWorker/glossary.ts

Lines changed: 9 additions & 114 deletions
Original file line numberDiff line numberDiff line change
@@ -1,137 +1,30 @@
11
import { Emitter } from 'strict-event-emitter'
2+
import type { DeferredPromise } from '@open-draft/deferred-promise'
23
import {
34
LifeCycleEventEmitter,
45
LifeCycleEventsMap,
56
SharedOptions,
67
} from '~/core/sharedOptions'
7-
import { ServiceWorkerMessage } from './start/utils/createMessageChannel'
88
import { RequestHandler } from '~/core/handlers/RequestHandler'
99
import type { HttpRequestEventMap, Interceptor } from '@mswjs/interceptors'
1010
import type { RequiredDeep } from '~/core/typeUtils'
1111
import type { WebSocketHandler } from '~/core/handlers/WebSocketHandler'
12-
13-
type RequestWithoutMethods = Omit<
14-
Request,
15-
| 'text'
16-
| 'body'
17-
| 'json'
18-
| 'blob'
19-
| 'arrayBuffer'
20-
| 'formData'
21-
| 'clone'
22-
| 'signal'
23-
| 'isHistoryNavigation'
24-
| 'isReloadNavigation'
25-
>
26-
27-
/**
28-
* Request representation received from the worker message event.
29-
*/
30-
export interface ServiceWorkerIncomingRequest extends RequestWithoutMethods {
31-
/**
32-
* Unique ID of the request generated once the request is
33-
* intercepted by the "fetch" event in the Service Worker.
34-
*/
35-
id: string
36-
body?: ArrayBuffer | null
37-
}
38-
39-
type ServiceWorkerIncomingResponse = {
40-
isMockedResponse: boolean
41-
request: ServiceWorkerIncomingRequest
42-
response: Pick<
43-
Response,
44-
'type' | 'ok' | 'status' | 'statusText' | 'body' | 'headers' | 'redirected'
45-
>
46-
}
47-
48-
/**
49-
* Map of the events that can be received from the Service Worker.
50-
*/
51-
export interface ServiceWorkerIncomingEventsMap {
52-
MOCKING_ENABLED: {
53-
client: {
54-
id: string
55-
frameType: string
56-
}
57-
}
58-
INTEGRITY_CHECK_RESPONSE: {
59-
packageVersion: string
60-
checksum: string
61-
}
62-
KEEPALIVE_RESPONSE: never
63-
REQUEST: ServiceWorkerIncomingRequest
64-
RESPONSE: ServiceWorkerIncomingResponse
65-
}
66-
67-
/**
68-
* Map of the events that can be sent to the Service Worker
69-
* from any execution context.
70-
*/
71-
type ServiceWorkerOutgoingEventTypes =
72-
| 'MOCK_ACTIVATE'
73-
| 'MOCK_DEACTIVATE'
74-
| 'INTEGRITY_CHECK_REQUEST'
75-
| 'KEEPALIVE_REQUEST'
76-
| 'CLIENT_CLOSED'
12+
import type { WorkerChannel } from '../utils/workerChannel'
7713

7814
export interface StringifiedResponse extends ResponseInit {
7915
body: string | ArrayBuffer | ReadableStream<Uint8Array> | null
8016
}
8117

82-
interface StrictEventListener<EventType extends Event> {
83-
(event: EventType): void
84-
}
85-
86-
export interface SetupWorkerInternalContext {
18+
export type SetupWorkerInternalContext = {
8719
isMockingEnabled: boolean
20+
workerStoppedAt?: number
8821
startOptions: RequiredDeep<StartOptions>
89-
worker: ServiceWorker | null
90-
registration: ServiceWorkerRegistration | null
22+
workerPromise: DeferredPromise<ServiceWorker>
23+
registration: ServiceWorkerRegistration | undefined
9124
getRequestHandlers: () => Array<RequestHandler | WebSocketHandler>
9225
emitter: Emitter<LifeCycleEventsMap>
9326
keepAliveInterval?: number
94-
workerChannel: {
95-
/**
96-
* Adds a Service Worker event listener.
97-
*/
98-
on<EventType extends keyof ServiceWorkerIncomingEventsMap>(
99-
eventType: EventType,
100-
callback: (
101-
event: MessageEvent,
102-
message: ServiceWorkerMessage<
103-
EventType,
104-
ServiceWorkerIncomingEventsMap[EventType]
105-
>,
106-
) => void,
107-
): void
108-
send<EventType extends ServiceWorkerOutgoingEventTypes>(
109-
eventType: EventType,
110-
): void
111-
}
112-
events: {
113-
/**
114-
* Adds an event listener on the given target.
115-
* Returns a clean-up function that removes that listener.
116-
*/
117-
addListener<EventType extends Event>(
118-
target: EventTarget,
119-
eventType: string,
120-
callback: StrictEventListener<EventType>,
121-
): () => void
122-
/**
123-
* Removes all currently attached listeners.
124-
*/
125-
removeAllListeners(): void
126-
/**
127-
* Awaits a given message type from the Service Worker.
128-
*/
129-
once<EventType extends keyof ServiceWorkerIncomingEventsMap>(
130-
eventType: EventType,
131-
): Promise<
132-
ServiceWorkerMessage<EventType, ServiceWorkerIncomingEventsMap[EventType]>
133-
>
134-
}
27+
workerChannel: WorkerChannel
13528
supports: {
13629
serviceWorkerApi: boolean
13730
readableStreamTransfer: boolean
@@ -184,10 +77,12 @@ export interface StartOptions extends SharedOptions {
18477
}
18578

18679
export type StartReturnType = Promise<ServiceWorkerRegistration | undefined>
80+
18781
export type StartHandler = (
18882
options: RequiredDeep<StartOptions>,
18983
initialOptions: StartOptions,
19084
) => StartReturnType
85+
19186
export type StopHandler = () => void
19287

19388
export interface SetupWorker {

0 commit comments

Comments
 (0)