@depup/mswjs__interceptors 0.41.3-depup.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/ClientRequest/package.json +11 -0
- package/LICENSE.md +9 -0
- package/README.md +31 -0
- package/RemoteHttpInterceptor/package.json +11 -0
- package/WebSocket/package.json +12 -0
- package/XMLHttpRequest/package.json +12 -0
- package/changes.json +10 -0
- package/fetch/package.json +12 -0
- package/lib/browser/Interceptor-Deczogc8.d.cts +65 -0
- package/lib/browser/Interceptor-gqKgs-aF.d.mts +65 -0
- package/lib/browser/XMLHttpRequest-BACqefB-.cjs +761 -0
- package/lib/browser/XMLHttpRequest-BACqefB-.cjs.map +1 -0
- package/lib/browser/XMLHttpRequest-BvxZV0WU.mjs +756 -0
- package/lib/browser/XMLHttpRequest-BvxZV0WU.mjs.map +1 -0
- package/lib/browser/bufferUtils-BiiO6HZv.mjs +20 -0
- package/lib/browser/bufferUtils-BiiO6HZv.mjs.map +1 -0
- package/lib/browser/bufferUtils-Uc0eRItL.cjs +38 -0
- package/lib/browser/bufferUtils-Uc0eRItL.cjs.map +1 -0
- package/lib/browser/createRequestId-Cs4oXfa1.cjs +205 -0
- package/lib/browser/createRequestId-Cs4oXfa1.cjs.map +1 -0
- package/lib/browser/createRequestId-DQcIlohW.mjs +170 -0
- package/lib/browser/createRequestId-DQcIlohW.mjs.map +1 -0
- package/lib/browser/fetch-DdKEdDOR.mjs +248 -0
- package/lib/browser/fetch-DdKEdDOR.mjs.map +1 -0
- package/lib/browser/fetch-U3v3Y4ap.cjs +253 -0
- package/lib/browser/fetch-U3v3Y4ap.cjs.map +1 -0
- package/lib/browser/getRawRequest-BTaNLFr0.mjs +218 -0
- package/lib/browser/getRawRequest-BTaNLFr0.mjs.map +1 -0
- package/lib/browser/getRawRequest-zx8rUJL2.cjs +259 -0
- package/lib/browser/getRawRequest-zx8rUJL2.cjs.map +1 -0
- package/lib/browser/glossary-BdLS4k1H.d.cts +70 -0
- package/lib/browser/glossary-DYwOrogs.d.mts +70 -0
- package/lib/browser/handleRequest-CvX2G-Lz.cjs +189 -0
- package/lib/browser/handleRequest-CvX2G-Lz.cjs.map +1 -0
- package/lib/browser/handleRequest-D7kpTI5U.mjs +178 -0
- package/lib/browser/handleRequest-D7kpTI5U.mjs.map +1 -0
- package/lib/browser/hasConfigurableGlobal-BvCTG97d.cjs +45 -0
- package/lib/browser/hasConfigurableGlobal-BvCTG97d.cjs.map +1 -0
- package/lib/browser/hasConfigurableGlobal-npXitu1-.mjs +33 -0
- package/lib/browser/hasConfigurableGlobal-npXitu1-.mjs.map +1 -0
- package/lib/browser/index.cjs +70 -0
- package/lib/browser/index.cjs.map +1 -0
- package/lib/browser/index.d.cts +96 -0
- package/lib/browser/index.d.mts +96 -0
- package/lib/browser/index.mjs +56 -0
- package/lib/browser/index.mjs.map +1 -0
- package/lib/browser/interceptors/WebSocket/index.cjs +622 -0
- package/lib/browser/interceptors/WebSocket/index.cjs.map +1 -0
- package/lib/browser/interceptors/WebSocket/index.d.cts +277 -0
- package/lib/browser/interceptors/WebSocket/index.d.mts +277 -0
- package/lib/browser/interceptors/WebSocket/index.mjs +615 -0
- package/lib/browser/interceptors/WebSocket/index.mjs.map +1 -0
- package/lib/browser/interceptors/XMLHttpRequest/index.cjs +7 -0
- package/lib/browser/interceptors/XMLHttpRequest/index.d.cts +15 -0
- package/lib/browser/interceptors/XMLHttpRequest/index.d.mts +15 -0
- package/lib/browser/interceptors/XMLHttpRequest/index.mjs +7 -0
- package/lib/browser/interceptors/fetch/index.cjs +6 -0
- package/lib/browser/interceptors/fetch/index.d.cts +13 -0
- package/lib/browser/interceptors/fetch/index.d.mts +13 -0
- package/lib/browser/interceptors/fetch/index.mjs +6 -0
- package/lib/browser/presets/browser.cjs +17 -0
- package/lib/browser/presets/browser.cjs.map +1 -0
- package/lib/browser/presets/browser.d.cts +12 -0
- package/lib/browser/presets/browser.d.mts +14 -0
- package/lib/browser/presets/browser.mjs +17 -0
- package/lib/browser/presets/browser.mjs.map +1 -0
- package/lib/browser/resolveWebSocketUrl-6K6EgqsA.cjs +31 -0
- package/lib/browser/resolveWebSocketUrl-6K6EgqsA.cjs.map +1 -0
- package/lib/browser/resolveWebSocketUrl-C83-x9iE.mjs +25 -0
- package/lib/browser/resolveWebSocketUrl-C83-x9iE.mjs.map +1 -0
- package/lib/node/BatchInterceptor-3LnAnLTx.cjs +49 -0
- package/lib/node/BatchInterceptor-3LnAnLTx.cjs.map +1 -0
- package/lib/node/BatchInterceptor-D7mXzHcQ.d.mts +26 -0
- package/lib/node/BatchInterceptor-DFaBPilf.mjs +44 -0
- package/lib/node/BatchInterceptor-DFaBPilf.mjs.map +1 -0
- package/lib/node/BatchInterceptor-D_YqR8qU.d.cts +26 -0
- package/lib/node/ClientRequest-2rDe54Ui.cjs +1043 -0
- package/lib/node/ClientRequest-2rDe54Ui.cjs.map +1 -0
- package/lib/node/ClientRequest-Ca8Qykuv.mjs +1034 -0
- package/lib/node/ClientRequest-Ca8Qykuv.mjs.map +1 -0
- package/lib/node/Interceptor-DEazpLJd.d.mts +133 -0
- package/lib/node/Interceptor-DJ2akVWI.d.cts +133 -0
- package/lib/node/RemoteHttpInterceptor.cjs +154 -0
- package/lib/node/RemoteHttpInterceptor.cjs.map +1 -0
- package/lib/node/RemoteHttpInterceptor.d.cts +39 -0
- package/lib/node/RemoteHttpInterceptor.d.mts +39 -0
- package/lib/node/RemoteHttpInterceptor.mjs +152 -0
- package/lib/node/RemoteHttpInterceptor.mjs.map +1 -0
- package/lib/node/XMLHttpRequest-B7kJdYYI.cjs +763 -0
- package/lib/node/XMLHttpRequest-B7kJdYYI.cjs.map +1 -0
- package/lib/node/XMLHttpRequest-C8dIZpds.mjs +757 -0
- package/lib/node/XMLHttpRequest-C8dIZpds.mjs.map +1 -0
- package/lib/node/bufferUtils-DiCTqG-7.cjs +38 -0
- package/lib/node/bufferUtils-DiCTqG-7.cjs.map +1 -0
- package/lib/node/bufferUtils-_8XfKIfX.mjs +20 -0
- package/lib/node/bufferUtils-_8XfKIfX.mjs.map +1 -0
- package/lib/node/chunk-CbDLau6x.cjs +34 -0
- package/lib/node/fetch-BmXpK10r.cjs +272 -0
- package/lib/node/fetch-BmXpK10r.cjs.map +1 -0
- package/lib/node/fetch-G1DVwDKG.mjs +265 -0
- package/lib/node/fetch-G1DVwDKG.mjs.map +1 -0
- package/lib/node/fetchUtils-BaY5iWXw.cjs +419 -0
- package/lib/node/fetchUtils-BaY5iWXw.cjs.map +1 -0
- package/lib/node/fetchUtils-CoU35g3M.mjs +359 -0
- package/lib/node/fetchUtils-CoU35g3M.mjs.map +1 -0
- package/lib/node/getRawRequest-BavnMWh_.cjs +36 -0
- package/lib/node/getRawRequest-BavnMWh_.cjs.map +1 -0
- package/lib/node/getRawRequest-DnwmXyOW.mjs +24 -0
- package/lib/node/getRawRequest-DnwmXyOW.mjs.map +1 -0
- package/lib/node/glossary-BLKRyLBd.cjs +12 -0
- package/lib/node/glossary-BLKRyLBd.cjs.map +1 -0
- package/lib/node/glossary-glQBRnVD.mjs +6 -0
- package/lib/node/glossary-glQBRnVD.mjs.map +1 -0
- package/lib/node/handleRequest-Bb7Y-XLw.cjs +220 -0
- package/lib/node/handleRequest-Bb7Y-XLw.cjs.map +1 -0
- package/lib/node/handleRequest-Y97UwBbF.mjs +190 -0
- package/lib/node/handleRequest-Y97UwBbF.mjs.map +1 -0
- package/lib/node/hasConfigurableGlobal-C97fWuaA.cjs +26 -0
- package/lib/node/hasConfigurableGlobal-C97fWuaA.cjs.map +1 -0
- package/lib/node/hasConfigurableGlobal-DBJA0vjm.mjs +20 -0
- package/lib/node/hasConfigurableGlobal-DBJA0vjm.mjs.map +1 -0
- package/lib/node/index-BMbJ8FXL.d.cts +113 -0
- package/lib/node/index-C0YAQ36w.d.mts +113 -0
- package/lib/node/index.cjs +54 -0
- package/lib/node/index.cjs.map +1 -0
- package/lib/node/index.d.cts +75 -0
- package/lib/node/index.d.mts +75 -0
- package/lib/node/index.mjs +40 -0
- package/lib/node/index.mjs.map +1 -0
- package/lib/node/interceptors/ClientRequest/index.cjs +6 -0
- package/lib/node/interceptors/ClientRequest/index.d.cts +2 -0
- package/lib/node/interceptors/ClientRequest/index.d.mts +3 -0
- package/lib/node/interceptors/ClientRequest/index.mjs +6 -0
- package/lib/node/interceptors/XMLHttpRequest/index.cjs +6 -0
- package/lib/node/interceptors/XMLHttpRequest/index.d.cts +14 -0
- package/lib/node/interceptors/XMLHttpRequest/index.d.mts +14 -0
- package/lib/node/interceptors/XMLHttpRequest/index.mjs +6 -0
- package/lib/node/interceptors/fetch/index.cjs +5 -0
- package/lib/node/interceptors/fetch/index.d.cts +12 -0
- package/lib/node/interceptors/fetch/index.d.mts +12 -0
- package/lib/node/interceptors/fetch/index.mjs +5 -0
- package/lib/node/node-DwCc6iuP.mjs +27 -0
- package/lib/node/node-DwCc6iuP.mjs.map +1 -0
- package/lib/node/node-dKdAf3tC.cjs +39 -0
- package/lib/node/node-dKdAf3tC.cjs.map +1 -0
- package/lib/node/presets/node.cjs +22 -0
- package/lib/node/presets/node.cjs.map +1 -0
- package/lib/node/presets/node.d.cts +13 -0
- package/lib/node/presets/node.d.mts +15 -0
- package/lib/node/presets/node.mjs +22 -0
- package/lib/node/presets/node.mjs.map +1 -0
- package/lib/node/utils/node/index.cjs +4 -0
- package/lib/node/utils/node/index.d.cts +16 -0
- package/lib/node/utils/node/index.d.mts +16 -0
- package/lib/node/utils/node/index.mjs +3 -0
- package/package.json +204 -0
- package/presets/browser/package.json +5 -0
- package/presets/node/package.json +11 -0
- package/src/BatchInterceptor.test.ts +255 -0
- package/src/BatchInterceptor.ts +95 -0
- package/src/Interceptor.test.ts +205 -0
- package/src/Interceptor.ts +249 -0
- package/src/InterceptorError.ts +7 -0
- package/src/RemoteHttpInterceptor.ts +251 -0
- package/src/RequestController.test.ts +104 -0
- package/src/RequestController.ts +109 -0
- package/src/createRequestId.test.ts +7 -0
- package/src/createRequestId.ts +9 -0
- package/src/getRawRequest.ts +21 -0
- package/src/glossary.ts +37 -0
- package/src/index.ts +15 -0
- package/src/interceptors/ClientRequest/MockHttpSocket.ts +724 -0
- package/src/interceptors/ClientRequest/agents.ts +110 -0
- package/src/interceptors/ClientRequest/index.test.ts +75 -0
- package/src/interceptors/ClientRequest/index.ts +193 -0
- package/src/interceptors/ClientRequest/utils/getIncomingMessageBody.test.ts +54 -0
- package/src/interceptors/ClientRequest/utils/getIncomingMessageBody.ts +45 -0
- package/src/interceptors/ClientRequest/utils/normalizeClientRequestArgs.test.ts +427 -0
- package/src/interceptors/ClientRequest/utils/normalizeClientRequestArgs.ts +268 -0
- package/src/interceptors/ClientRequest/utils/parserUtils.ts +48 -0
- package/src/interceptors/ClientRequest/utils/recordRawHeaders.test.ts +258 -0
- package/src/interceptors/ClientRequest/utils/recordRawHeaders.ts +262 -0
- package/src/interceptors/Socket/MockSocket.test.ts +264 -0
- package/src/interceptors/Socket/MockSocket.ts +58 -0
- package/src/interceptors/Socket/utils/baseUrlFromConnectionOptions.ts +26 -0
- package/src/interceptors/Socket/utils/normalizeSocketWriteArgs.test.ts +52 -0
- package/src/interceptors/Socket/utils/normalizeSocketWriteArgs.ts +33 -0
- package/src/interceptors/WebSocket/WebSocketClassTransport.ts +116 -0
- package/src/interceptors/WebSocket/WebSocketClientConnection.ts +152 -0
- package/src/interceptors/WebSocket/WebSocketOverride.ts +252 -0
- package/src/interceptors/WebSocket/WebSocketServerConnection.ts +420 -0
- package/src/interceptors/WebSocket/WebSocketTransport.ts +39 -0
- package/src/interceptors/WebSocket/index.ts +191 -0
- package/src/interceptors/WebSocket/utils/bindEvent.test.ts +27 -0
- package/src/interceptors/WebSocket/utils/bindEvent.ts +21 -0
- package/src/interceptors/WebSocket/utils/events.test.ts +101 -0
- package/src/interceptors/WebSocket/utils/events.ts +94 -0
- package/src/interceptors/XMLHttpRequest/XMLHttpRequestController.ts +746 -0
- package/src/interceptors/XMLHttpRequest/XMLHttpRequestProxy.ts +121 -0
- package/src/interceptors/XMLHttpRequest/index.ts +61 -0
- package/src/interceptors/XMLHttpRequest/polyfills/EventPolyfill.ts +51 -0
- package/src/interceptors/XMLHttpRequest/polyfills/ProgressEventPolyfill.ts +17 -0
- package/src/interceptors/XMLHttpRequest/utils/concatArrayBuffer.ts +12 -0
- package/src/interceptors/XMLHttpRequest/utils/concateArrayBuffer.test.ts +12 -0
- package/src/interceptors/XMLHttpRequest/utils/createEvent.test.ts +26 -0
- package/src/interceptors/XMLHttpRequest/utils/createEvent.ts +41 -0
- package/src/interceptors/XMLHttpRequest/utils/createResponse.ts +49 -0
- package/src/interceptors/XMLHttpRequest/utils/getBodyByteLength.test.ts +164 -0
- package/src/interceptors/XMLHttpRequest/utils/getBodyByteLength.ts +16 -0
- package/src/interceptors/XMLHttpRequest/utils/isDomParserSupportedType.ts +14 -0
- package/src/interceptors/fetch/index.ts +214 -0
- package/src/interceptors/fetch/utils/brotli-decompress.browser.ts +14 -0
- package/src/interceptors/fetch/utils/brotli-decompress.ts +31 -0
- package/src/interceptors/fetch/utils/createNetworkError.ts +5 -0
- package/src/interceptors/fetch/utils/decompression.ts +85 -0
- package/src/interceptors/fetch/utils/followRedirect.ts +114 -0
- package/src/presets/browser.ts +11 -0
- package/src/presets/node.ts +13 -0
- package/src/utils/bufferUtils.test.ts +21 -0
- package/src/utils/bufferUtils.ts +22 -0
- package/src/utils/canParseUrl.ts +13 -0
- package/src/utils/cloneObject.test.ts +94 -0
- package/src/utils/cloneObject.ts +36 -0
- package/src/utils/createProxy.test.ts +164 -0
- package/src/utils/createProxy.ts +104 -0
- package/src/utils/emitAsync.ts +25 -0
- package/src/utils/fetchUtils.ts +119 -0
- package/src/utils/findPropertySource.test.ts +27 -0
- package/src/utils/findPropertySource.ts +20 -0
- package/src/utils/getCleanUrl.test.ts +32 -0
- package/src/utils/getCleanUrl.ts +6 -0
- package/src/utils/getUrlByRequestOptions.test.ts +163 -0
- package/src/utils/getUrlByRequestOptions.ts +152 -0
- package/src/utils/getValueBySymbol.test.ts +14 -0
- package/src/utils/getValueBySymbol.ts +19 -0
- package/src/utils/handleRequest.ts +205 -0
- package/src/utils/hasConfigurableGlobal.test.ts +83 -0
- package/src/utils/hasConfigurableGlobal.ts +34 -0
- package/src/utils/isNodeLikeError.ts +13 -0
- package/src/utils/isObject.test.ts +21 -0
- package/src/utils/isObject.ts +8 -0
- package/src/utils/isPropertyAccessible.ts +19 -0
- package/src/utils/nextTick.ts +11 -0
- package/src/utils/node/index.ts +39 -0
- package/src/utils/parseJson.test.ts +10 -0
- package/src/utils/parseJson.ts +12 -0
- package/src/utils/resolveWebSocketUrl.ts +45 -0
- package/src/utils/responseUtils.ts +59 -0
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { vi, it, expect } from 'vitest'
|
|
2
|
+
import {
|
|
3
|
+
RequestController,
|
|
4
|
+
type RequestControllerSource,
|
|
5
|
+
} from './RequestController'
|
|
6
|
+
import { InterceptorError } from './InterceptorError'
|
|
7
|
+
|
|
8
|
+
const defaultSource = {
|
|
9
|
+
passthrough() {},
|
|
10
|
+
respondWith() {},
|
|
11
|
+
errorWith() {},
|
|
12
|
+
} satisfies RequestControllerSource
|
|
13
|
+
|
|
14
|
+
it('has a pending state upon construction', () => {
|
|
15
|
+
const controller = new RequestController(
|
|
16
|
+
new Request('http://localhost'),
|
|
17
|
+
defaultSource
|
|
18
|
+
)
|
|
19
|
+
|
|
20
|
+
expect(controller.handled).toBeInstanceOf(Promise)
|
|
21
|
+
expect(controller.readyState).toBe(RequestController.PENDING)
|
|
22
|
+
})
|
|
23
|
+
|
|
24
|
+
it('handles a request when calling ".respondWith()" with a mocked response', async () => {
|
|
25
|
+
const respondWith = vi.fn<RequestControllerSource['respondWith']>()
|
|
26
|
+
const controller = new RequestController(new Request('http://localhost'), {
|
|
27
|
+
...defaultSource,
|
|
28
|
+
respondWith,
|
|
29
|
+
})
|
|
30
|
+
|
|
31
|
+
await controller.respondWith(new Response('hello world'))
|
|
32
|
+
|
|
33
|
+
expect(controller.readyState).toBe(RequestController.RESPONSE)
|
|
34
|
+
await expect(controller.handled).resolves.toBeUndefined()
|
|
35
|
+
|
|
36
|
+
expect(respondWith).toHaveBeenCalledOnce()
|
|
37
|
+
const [response] = respondWith.mock.calls[0]
|
|
38
|
+
|
|
39
|
+
expect(response).toBeInstanceOf(Response)
|
|
40
|
+
expect(response.status).toBe(200)
|
|
41
|
+
await expect(response.text()).resolves.toBe('hello world')
|
|
42
|
+
})
|
|
43
|
+
|
|
44
|
+
it('handles the request when calling ".errorWith()" with an error', async () => {
|
|
45
|
+
const errorWith = vi.fn<RequestControllerSource['errorWith']>()
|
|
46
|
+
const controller = new RequestController(new Request('http://localhost'), {
|
|
47
|
+
...defaultSource,
|
|
48
|
+
errorWith,
|
|
49
|
+
})
|
|
50
|
+
|
|
51
|
+
const error = new Error('Oops!')
|
|
52
|
+
await controller.errorWith(error)
|
|
53
|
+
|
|
54
|
+
expect(controller.readyState).toBe(RequestController.ERROR)
|
|
55
|
+
await expect(controller.handled).resolves.toBeUndefined()
|
|
56
|
+
|
|
57
|
+
expect(errorWith).toHaveBeenCalledOnce()
|
|
58
|
+
expect(errorWith).toHaveBeenCalledWith(error)
|
|
59
|
+
})
|
|
60
|
+
|
|
61
|
+
it('handles the request when calling ".errorWith()" with an arbitrary object', async () => {
|
|
62
|
+
const errorWith = vi.fn<RequestControllerSource['errorWith']>()
|
|
63
|
+
const controller = new RequestController(new Request('http://localhost'), {
|
|
64
|
+
...defaultSource,
|
|
65
|
+
errorWith,
|
|
66
|
+
})
|
|
67
|
+
|
|
68
|
+
const error = { message: 'Oops!' }
|
|
69
|
+
await controller.errorWith(error)
|
|
70
|
+
|
|
71
|
+
expect(controller.readyState).toBe(RequestController.ERROR)
|
|
72
|
+
await expect(controller.handled).resolves.toBeUndefined()
|
|
73
|
+
|
|
74
|
+
expect(errorWith).toHaveBeenCalledOnce()
|
|
75
|
+
expect(errorWith).toHaveBeenCalledWith(error)
|
|
76
|
+
})
|
|
77
|
+
|
|
78
|
+
it('throws when calling "respondWith" multiple times', async () => {
|
|
79
|
+
const controller = new RequestController(
|
|
80
|
+
new Request('http://localhost'),
|
|
81
|
+
defaultSource
|
|
82
|
+
)
|
|
83
|
+
controller.respondWith(new Response('hello world'))
|
|
84
|
+
|
|
85
|
+
expect(() => controller.respondWith(new Response('second response'))).toThrow(
|
|
86
|
+
new InterceptorError(
|
|
87
|
+
'Failed to respond to the "GET http://localhost/" request with "200 OK": the request has already been handled (2)'
|
|
88
|
+
)
|
|
89
|
+
)
|
|
90
|
+
})
|
|
91
|
+
|
|
92
|
+
it('throws when calling "errorWith" multiple times', async () => {
|
|
93
|
+
const controller = new RequestController(
|
|
94
|
+
new Request('http://localhost'),
|
|
95
|
+
defaultSource
|
|
96
|
+
)
|
|
97
|
+
controller.errorWith(new Error('Oops!'))
|
|
98
|
+
|
|
99
|
+
expect(() => controller.errorWith(new Error('second error'))).toThrow(
|
|
100
|
+
new InterceptorError(
|
|
101
|
+
'Failed to error the "GET http://localhost/" request with "Error: second error": the request has already been handled (3)'
|
|
102
|
+
)
|
|
103
|
+
)
|
|
104
|
+
})
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { DeferredPromise } from '@open-draft/deferred-promise'
|
|
2
|
+
import { invariant } from 'outvariant'
|
|
3
|
+
import { InterceptorError } from './InterceptorError'
|
|
4
|
+
|
|
5
|
+
export interface RequestControllerSource {
|
|
6
|
+
passthrough(): void
|
|
7
|
+
respondWith(response: Response): void
|
|
8
|
+
errorWith(reason?: unknown): void
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export class RequestController {
|
|
12
|
+
static PENDING = 0 as const
|
|
13
|
+
static PASSTHROUGH = 1 as const
|
|
14
|
+
static RESPONSE = 2 as const
|
|
15
|
+
static ERROR = 3 as const
|
|
16
|
+
|
|
17
|
+
public readyState: number
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* A Promise that resolves when this controller handles a request.
|
|
21
|
+
* See `controller.readyState` for more information on the handling result.
|
|
22
|
+
*/
|
|
23
|
+
public handled: Promise<void>
|
|
24
|
+
|
|
25
|
+
constructor(
|
|
26
|
+
protected readonly request: Request,
|
|
27
|
+
protected readonly source: RequestControllerSource
|
|
28
|
+
) {
|
|
29
|
+
this.readyState = RequestController.PENDING
|
|
30
|
+
this.handled = new DeferredPromise<void>()
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
get #handled() {
|
|
34
|
+
return this.handled as DeferredPromise<void>
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Perform this request as-is.
|
|
39
|
+
*/
|
|
40
|
+
public async passthrough(): Promise<void> {
|
|
41
|
+
invariant.as(
|
|
42
|
+
InterceptorError,
|
|
43
|
+
this.readyState === RequestController.PENDING,
|
|
44
|
+
'Failed to passthrough the "%s %s" request: the request has already been handled',
|
|
45
|
+
this.request.method,
|
|
46
|
+
this.request.url
|
|
47
|
+
)
|
|
48
|
+
|
|
49
|
+
this.readyState = RequestController.PASSTHROUGH
|
|
50
|
+
await this.source.passthrough()
|
|
51
|
+
this.#handled.resolve()
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Respond to this request with the given `Response` instance.
|
|
56
|
+
*
|
|
57
|
+
* @example
|
|
58
|
+
* controller.respondWith(new Response())
|
|
59
|
+
* controller.respondWith(Response.json({ id }))
|
|
60
|
+
* controller.respondWith(Response.error())
|
|
61
|
+
*/
|
|
62
|
+
public respondWith(response: Response): void {
|
|
63
|
+
invariant.as(
|
|
64
|
+
InterceptorError,
|
|
65
|
+
this.readyState === RequestController.PENDING,
|
|
66
|
+
'Failed to respond to the "%s %s" request with "%d %s": the request has already been handled (%d)',
|
|
67
|
+
this.request.method,
|
|
68
|
+
this.request.url,
|
|
69
|
+
response.status,
|
|
70
|
+
response.statusText || 'OK',
|
|
71
|
+
this.readyState
|
|
72
|
+
)
|
|
73
|
+
|
|
74
|
+
this.readyState = RequestController.RESPONSE
|
|
75
|
+
this.#handled.resolve()
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* @note Although `source.respondWith()` is potentially asynchronous,
|
|
79
|
+
* do NOT await it for backward-compatibility. Awaiting it will short-circuit
|
|
80
|
+
* the request listener invocation as soon as a listener responds to a request.
|
|
81
|
+
* Ideally, that's what we want, but that's not what we promise the user.
|
|
82
|
+
*/
|
|
83
|
+
this.source.respondWith(response)
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Error this request with the given reason.
|
|
88
|
+
*
|
|
89
|
+
* @example
|
|
90
|
+
* controller.errorWith()
|
|
91
|
+
* controller.errorWith(new Error('Oops!'))
|
|
92
|
+
* controller.errorWith({ message: 'Oops!'})
|
|
93
|
+
*/
|
|
94
|
+
public errorWith(reason?: unknown): void {
|
|
95
|
+
invariant.as(
|
|
96
|
+
InterceptorError,
|
|
97
|
+
this.readyState === RequestController.PENDING,
|
|
98
|
+
'Failed to error the "%s %s" request with "%s": the request has already been handled (%d)',
|
|
99
|
+
this.request.method,
|
|
100
|
+
this.request.url,
|
|
101
|
+
reason?.toString(),
|
|
102
|
+
this.readyState
|
|
103
|
+
)
|
|
104
|
+
|
|
105
|
+
this.readyState = RequestController.ERROR
|
|
106
|
+
this.source.errorWith(reason)
|
|
107
|
+
this.#handled.resolve()
|
|
108
|
+
}
|
|
109
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
const kRawRequest = Symbol('kRawRequest')
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Returns a raw request instance associated with this request.
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* interceptor.on('request', ({ request }) => {
|
|
8
|
+
* const rawRequest = getRawRequest(request)
|
|
9
|
+
*
|
|
10
|
+
* if (rawRequest instanceof http.ClientRequest) {
|
|
11
|
+
* console.log(rawRequest.rawHeaders)
|
|
12
|
+
* }
|
|
13
|
+
* })
|
|
14
|
+
*/
|
|
15
|
+
export function getRawRequest(request: Request): unknown | undefined {
|
|
16
|
+
return Reflect.get(request, kRawRequest)
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export function setRawRequest(request: Request, rawRequest: unknown): void {
|
|
20
|
+
Reflect.set(request, kRawRequest, rawRequest)
|
|
21
|
+
}
|
package/src/glossary.ts
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { RequestController } from './RequestController'
|
|
2
|
+
|
|
3
|
+
export const IS_PATCHED_MODULE: unique symbol = Symbol('isPatchedModule')
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* @note Export `RequestController` as a type only.
|
|
7
|
+
* It's never meant to be created in the userland.
|
|
8
|
+
*/
|
|
9
|
+
export type { RequestController }
|
|
10
|
+
|
|
11
|
+
export type RequestCredentials = 'omit' | 'include' | 'same-origin'
|
|
12
|
+
|
|
13
|
+
export type HttpRequestEventMap = {
|
|
14
|
+
request: [
|
|
15
|
+
args: {
|
|
16
|
+
request: Request
|
|
17
|
+
requestId: string
|
|
18
|
+
controller: RequestController
|
|
19
|
+
}
|
|
20
|
+
]
|
|
21
|
+
response: [
|
|
22
|
+
args: {
|
|
23
|
+
response: Response
|
|
24
|
+
isMockedResponse: boolean
|
|
25
|
+
request: Request
|
|
26
|
+
requestId: string
|
|
27
|
+
}
|
|
28
|
+
]
|
|
29
|
+
unhandledException: [
|
|
30
|
+
args: {
|
|
31
|
+
error: unknown
|
|
32
|
+
request: Request
|
|
33
|
+
requestId: string
|
|
34
|
+
controller: RequestController
|
|
35
|
+
}
|
|
36
|
+
]
|
|
37
|
+
}
|
package/src/index.ts
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export * from './glossary'
|
|
2
|
+
export * from './Interceptor'
|
|
3
|
+
export * from './BatchInterceptor'
|
|
4
|
+
export {
|
|
5
|
+
RequestController,
|
|
6
|
+
type RequestControllerSource,
|
|
7
|
+
} from './RequestController'
|
|
8
|
+
|
|
9
|
+
/* Utils */
|
|
10
|
+
export { createRequestId } from './createRequestId'
|
|
11
|
+
export { getCleanUrl } from './utils/getCleanUrl'
|
|
12
|
+
export { encodeBuffer, decodeBuffer } from './utils/bufferUtils'
|
|
13
|
+
export { FetchResponse } from './utils/fetchUtils'
|
|
14
|
+
export { getRawRequest } from './getRawRequest'
|
|
15
|
+
export { resolveWebSocketUrl } from './utils/resolveWebSocketUrl'
|