-
-
Notifications
You must be signed in to change notification settings - Fork 473
/
createResponseListener.ts
37 lines (33 loc) · 1.19 KB
/
createResponseListener.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
import {
ServiceWorkerIncomingEventsMap,
SetupWorkerInternalContext,
} from '../../setupWorker/glossary'
import { ServiceWorkerMessage } from './utils/createMessageChannel'
export function createResponseListener(context: SetupWorkerInternalContext) {
return (
_: MessageEvent,
message: ServiceWorkerMessage<
'RESPONSE',
ServiceWorkerIncomingEventsMap['RESPONSE']
>,
) => {
const { payload: responseJson } = message
/**
* CORS requests with `mode: "no-cors"` result in "opaque" responses.
* That kind of responses cannot be manipulated in JavaScript due
* to the security considerations.
* @see https://fetch.spec.whatwg.org/#concept-filtered-response-opaque
* @see https://github.com/mswjs/msw/issues/529
*/
if (responseJson.type?.includes('opaque')) {
return
}
const response = new Response(responseJson.body || null, responseJson)
const isMockedResponse = response.headers.get('x-powered-by') === 'msw'
if (isMockedResponse) {
context.emitter.emit('response:mocked', response, responseJson.requestId)
} else {
context.emitter.emit('response:bypass', response, responseJson.requestId)
}
}
}