@mswjs/interceptors 0.41.9 → 0.42.1
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/README.md +274 -228
- package/lib/browser/{bufferUtils-BiiO6HZv.mjs → buffer-utils-DJj7YzLG.js} +3 -3
- package/lib/browser/buffer-utils-DJj7YzLG.js.map +1 -0
- package/lib/browser/create-request-id-Bk5YX1AM.js +720 -0
- package/lib/browser/create-request-id-Bk5YX1AM.js.map +1 -0
- package/lib/browser/{getRawRequest-B1BqgWG6.mjs → fetch-utils-CUOrwEQf.js} +123 -52
- package/lib/browser/fetch-utils-CUOrwEQf.js.map +1 -0
- package/lib/browser/handle-request-CqVvBhcw.js +167 -0
- package/lib/browser/handle-request-CqVvBhcw.js.map +1 -0
- package/lib/{node/hasConfigurableGlobal-BiTmog1u.mjs → browser/has-configurable-global-Cew-dYqk.js} +5 -7
- package/lib/browser/has-configurable-global-Cew-dYqk.js.map +1 -0
- package/lib/browser/http-CB9rQ7i_.d.ts +105 -0
- package/lib/browser/{index.d.cts → index.d.ts} +33 -38
- package/lib/browser/index.js +130 -0
- package/lib/browser/index.js.map +1 -0
- package/lib/browser/interceptor-dtJZ_9QT.d.ts +50 -0
- package/lib/browser/interceptors/WebSocket/index.d.ts +2 -0
- package/lib/browser/interceptors/WebSocket/{index.mjs → index.js} +39 -30
- package/lib/browser/interceptors/WebSocket/index.js.map +1 -0
- package/lib/browser/interceptors/XMLHttpRequest/web.d.ts +11 -0
- package/lib/browser/interceptors/XMLHttpRequest/web.js +2 -0
- package/lib/browser/interceptors/fetch/web.d.ts +14 -0
- package/lib/browser/interceptors/fetch/web.js +2 -0
- package/lib/browser/presets/browser.d.ts +11 -0
- package/lib/browser/presets/browser.js +12 -0
- package/lib/browser/presets/browser.js.map +1 -0
- package/lib/browser/{resolveWebSocketUrl-C83-x9iE.mjs → resolve-web-socket-url-CSvNPLGi.js} +3 -3
- package/lib/browser/resolve-web-socket-url-CSvNPLGi.js.map +1 -0
- package/lib/browser/{XMLHttpRequest-DrZAf3w6.mjs → web-BcKSQghf.js} +327 -255
- package/lib/browser/web-BcKSQghf.js.map +1 -0
- package/lib/browser/web-CdcYFjgm.js +248 -0
- package/lib/browser/web-CdcYFjgm.js.map +1 -0
- package/lib/browser/{interceptors/WebSocket/index.d.cts → websocket-CC0nB0md.d.ts} +41 -33
- package/lib/node/batch-interceptor-ByEZVih3.js +119 -0
- package/lib/node/batch-interceptor-ByEZVih3.js.map +1 -0
- package/lib/node/batch-interceptor-CPjFK2td.d.ts +28 -0
- package/lib/node/buffer-utils-BvPY1Tc-.js +187 -0
- package/lib/node/buffer-utils-BvPY1Tc-.js.map +1 -0
- package/lib/node/fetch-utils-Dw1PsmtX.js +568 -0
- package/lib/node/fetch-utils-Dw1PsmtX.js.map +1 -0
- package/lib/node/has-configurable-global-CJCh_g1I.js +22 -0
- package/lib/node/has-configurable-global-CJCh_g1I.js.map +1 -0
- package/lib/node/http-CB9rQ7i_.d.ts +105 -0
- package/lib/{browser/interceptors/WebSocket/index.d.mts → node/index.d.ts} +120 -60
- package/lib/node/{index.mjs → index.js} +8 -11
- package/lib/node/index.js.map +1 -0
- package/lib/node/interceptor-dtJZ_9QT.d.ts +50 -0
- package/lib/node/interceptors/ClientRequest/index.d.ts +14 -0
- package/lib/node/interceptors/ClientRequest/index.js +67 -0
- package/lib/node/interceptors/ClientRequest/index.js.map +1 -0
- package/lib/node/interceptors/XMLHttpRequest/node.d.ts +12 -0
- package/lib/node/interceptors/XMLHttpRequest/node.js +74 -0
- package/lib/node/interceptors/XMLHttpRequest/node.js.map +1 -0
- package/lib/node/interceptors/fetch/node.d.ts +18 -0
- package/lib/node/interceptors/fetch/node.js +83 -0
- package/lib/node/interceptors/fetch/node.js.map +1 -0
- package/lib/node/interceptors/http/index.d.ts +14 -0
- package/lib/node/interceptors/http/index.js +32 -0
- package/lib/node/interceptors/http/index.js.map +1 -0
- package/lib/node/interceptors/net/index.d.ts +203 -0
- package/lib/node/interceptors/net/index.js +2 -0
- package/lib/node/llhttp/constants.cjs +485 -0
- package/lib/node/llhttp/constants.d.cts +957 -0
- package/lib/node/llhttp/llhttp.wasm +0 -0
- package/lib/node/net-DtMnyEeg.js +1388 -0
- package/lib/node/net-DtMnyEeg.js.map +1 -0
- package/lib/node/presets/node.d.ts +12 -0
- package/lib/node/presets/node.js +17 -0
- package/lib/node/presets/node.js.map +1 -0
- package/lib/node/{RemoteHttpInterceptor.d.cts → remote-http-interceptor.d.ts} +12 -11
- package/lib/node/{RemoteHttpInterceptor.mjs → remote-http-interceptor.js} +38 -33
- package/lib/node/remote-http-interceptor.js.map +1 -0
- package/lib/node/source-lP0yyEtA.js +1990 -0
- package/lib/node/source-lP0yyEtA.js.map +1 -0
- package/package.json +79 -118
- package/src/batch-interceptor.test.ts +475 -0
- package/src/batch-interceptor.ts +244 -0
- package/src/{createRequestId.test.ts → create-request-id.test.ts} +1 -2
- package/src/disposable.ts +13 -0
- package/src/events/http.ts +92 -0
- package/src/events/websocket.ts +47 -0
- package/src/glossary.ts +1 -27
- package/src/index.ts +18 -10
- package/src/interceptor.test.ts +279 -0
- package/src/interceptor.ts +139 -0
- package/src/interceptors/ClientRequest/index.test.ts +21 -39
- package/src/interceptors/ClientRequest/index.ts +64 -179
- package/src/interceptors/ClientRequest/utils/{recordRawHeaders.test.ts → record-raw-headers.test.ts} +1 -2
- package/src/interceptors/ClientRequest/utils/{recordRawHeaders.ts → record-raw-headers.ts} +29 -2
- package/src/interceptors/WebSocket/index.ts +33 -50
- package/src/interceptors/WebSocket/utils/{bindEvent.test.ts → bind-event.test.ts} +1 -2
- package/src/interceptors/WebSocket/utils/events.test.ts +0 -1
- package/src/interceptors/WebSocket/{WebSocketClassTransport.ts → web-socket-class-transport.ts} +3 -3
- package/src/interceptors/WebSocket/{WebSocketClientConnection.ts → web-socket-client-connection.ts} +4 -4
- package/src/interceptors/WebSocket/{WebSocketOverride.ts → web-socket-override.ts} +6 -7
- package/src/interceptors/WebSocket/{WebSocketServerConnection.ts → web-socket-server-connection.ts} +4 -4
- package/src/interceptors/WebSocket/{WebSocketTransport.ts → web-socket-transport.ts} +1 -1
- package/src/interceptors/XMLHttpRequest/node.ts +104 -0
- package/src/interceptors/XMLHttpRequest/polyfills/{ProgressEventPolyfill.ts → progress-event-polyfill.ts} +1 -1
- package/src/interceptors/XMLHttpRequest/utils/{concateArrayBuffer.test.ts → concat-array-buffer.test.ts} +1 -2
- package/src/interceptors/XMLHttpRequest/utils/{concatArrayBuffer.ts → concat-array-buffer.ts} +1 -1
- package/src/interceptors/XMLHttpRequest/utils/{createEvent.test.ts → create-event.test.ts} +3 -4
- package/src/interceptors/XMLHttpRequest/utils/{createEvent.ts → create-event.ts} +2 -2
- package/src/interceptors/XMLHttpRequest/utils/{createResponse.ts → create-response.ts} +1 -1
- package/src/interceptors/XMLHttpRequest/utils/{getBodyByteLength.test.ts → get-body-byte-length.test.ts} +1 -2
- package/src/interceptors/XMLHttpRequest/web.ts +34 -0
- package/src/interceptors/XMLHttpRequest/{XMLHttpRequestController.ts → xml-http-request-controller.ts} +363 -204
- package/src/interceptors/XMLHttpRequest/{XMLHttpRequestProxy.ts → xml-http-request-proxy.ts} +28 -25
- package/src/interceptors/fetch/node.ts +103 -0
- package/src/interceptors/fetch/utils/{followRedirect.ts → follow-redirect.ts} +1 -1
- package/src/interceptors/fetch/web.ts +217 -0
- package/src/interceptors/http/forward-events.test.ts +86 -0
- package/src/interceptors/http/forward-events.ts +139 -0
- package/src/interceptors/http/http-parser/index.ts +310 -0
- package/src/interceptors/http/http-parser/llhttp/constants.cjs +485 -0
- package/src/interceptors/http/http-parser/llhttp/constants.d.cts +957 -0
- package/src/interceptors/http/http-parser/llhttp/llhttp.wasm +0 -0
- package/src/interceptors/http/http-parser.ts +138 -0
- package/src/interceptors/http/index.ts +34 -0
- package/src/interceptors/http/source.ts +688 -0
- package/src/interceptors/net/index.ts +368 -0
- package/src/interceptors/net/socket-controller.ts +1476 -0
- package/src/interceptors/net/utils/address-info.ts +54 -0
- package/src/interceptors/net/utils/connection-options-to-url.ts +56 -0
- package/src/interceptors/net/utils/flush-writes.ts +57 -0
- package/src/interceptors/net/utils/get-tls-connect-options.ts +23 -0
- package/src/interceptors/net/utils/normalize-net-connect-args.test.ts +233 -0
- package/src/interceptors/net/utils/normalize-net-connect-args.ts +121 -0
- package/src/interceptors/net/utils/normalize-tls-connect-args.ts +50 -0
- package/src/presets/browser.ts +4 -4
- package/src/presets/node.ts +4 -4
- package/src/{RemoteHttpInterceptor.ts → remote-http-interceptor.ts} +55 -42
- package/src/request-context.ts +40 -0
- package/src/{RequestController.test.ts → request-controller.test.ts} +37 -3
- package/src/{RequestController.ts → request-controller.ts} +33 -11
- package/src/utils/{bufferUtils.test.ts → buffer-utils.test.ts} +1 -2
- package/src/utils/buffer-utils.ts +37 -0
- package/src/utils/{cloneObject.test.ts → clone-object.test.ts} +1 -2
- package/src/utils/{cloneObject.ts → clone-object.ts} +8 -8
- package/src/utils/{createProxy.test.ts → create-proxy.test.ts} +6 -4
- package/src/utils/{createProxy.ts → create-proxy.ts} +1 -1
- package/src/utils/{fetchUtils.test.ts → fetch-utils.test.ts} +1 -1
- package/src/utils/{fetchUtils.ts → fetch-utils.ts} +28 -3
- package/src/utils/{findPropertySource.test.ts → find-property-source.test.ts} +1 -2
- package/src/utils/{getCleanUrl.test.ts → get-clean-url.test.ts} +1 -2
- package/src/utils/{getUrlByRequestOptions.test.ts → get-url-by-request-options.test.ts} +4 -8
- package/src/utils/{getUrlByRequestOptions.ts → get-url-by-request-options.ts} +16 -16
- package/src/utils/{getValueBySymbol.test.ts → get-value-by-symbol.test.ts} +1 -2
- package/src/utils/{handleRequest.ts → handle-request.ts} +61 -41
- package/src/utils/{hasConfigurableGlobal.test.ts → has-configurable-global.test.ts} +1 -2
- package/src/utils/{hasConfigurableGlobal.ts → has-configurable-global.ts} +2 -4
- package/src/utils/{isObject.test.ts → is-object.test.ts} +1 -2
- package/src/utils/logger.test.ts +154 -0
- package/src/utils/logger.ts +154 -0
- package/src/utils/{parseJson.test.ts → parse-json.test.ts} +1 -2
- package/src/utils/{patchesRegistry.test.ts → patches-registry.test.ts} +1 -1
- package/src/utils/{patchesRegistry.ts → patches-registry.ts} +1 -1
- package/src/utils/{responseUtils.ts → response-utils.ts} +25 -2
- package/ClientRequest/package.json +0 -11
- package/RemoteHttpInterceptor/package.json +0 -11
- package/WebSocket/package.json +0 -12
- package/XMLHttpRequest/package.json +0 -12
- package/fetch/package.json +0 -12
- package/lib/browser/Interceptor-Deczogc8.d.cts +0 -65
- package/lib/browser/Interceptor-gqKgs-aF.d.mts +0 -65
- package/lib/browser/XMLHttpRequest-DrZAf3w6.mjs.map +0 -1
- package/lib/browser/XMLHttpRequest-gXuzzX1g.cjs +0 -751
- package/lib/browser/XMLHttpRequest-gXuzzX1g.cjs.map +0 -1
- package/lib/browser/bufferUtils-BiiO6HZv.mjs.map +0 -1
- package/lib/browser/bufferUtils-Uc0eRItL.cjs +0 -38
- package/lib/browser/bufferUtils-Uc0eRItL.cjs.map +0 -1
- package/lib/browser/createRequestId-DOf8Ktjs.cjs +0 -205
- package/lib/browser/createRequestId-DOf8Ktjs.cjs.map +0 -1
- package/lib/browser/createRequestId-DYCsFHOi.mjs +0 -170
- package/lib/browser/createRequestId-DYCsFHOi.mjs.map +0 -1
- package/lib/browser/fetch-5IMPqr9e.mjs +0 -236
- package/lib/browser/fetch-5IMPqr9e.mjs.map +0 -1
- package/lib/browser/fetch-Bt9rMY9c.cjs +0 -241
- package/lib/browser/fetch-Bt9rMY9c.cjs.map +0 -1
- package/lib/browser/getRawRequest-B1BqgWG6.mjs.map +0 -1
- package/lib/browser/getRawRequest-DdfaiPVH.cjs +0 -376
- package/lib/browser/getRawRequest-DdfaiPVH.cjs.map +0 -1
- package/lib/browser/glossary-1lhZx6Aw.d.cts +0 -69
- package/lib/browser/glossary-nkHWcwvY.d.mts +0 -69
- package/lib/browser/handleRequest-CJim54xG.cjs +0 -191
- package/lib/browser/handleRequest-CJim54xG.cjs.map +0 -1
- package/lib/browser/handleRequest-CPPgsG7s.mjs +0 -180
- package/lib/browser/handleRequest-CPPgsG7s.mjs.map +0 -1
- package/lib/browser/hasConfigurableGlobal-C8zq1MCg.mjs +0 -109
- package/lib/browser/hasConfigurableGlobal-C8zq1MCg.mjs.map +0 -1
- package/lib/browser/hasConfigurableGlobal-CS7adEvV.cjs +0 -126
- package/lib/browser/hasConfigurableGlobal-CS7adEvV.cjs.map +0 -1
- package/lib/browser/index.cjs +0 -70
- package/lib/browser/index.cjs.map +0 -1
- package/lib/browser/index.d.mts +0 -125
- package/lib/browser/index.mjs +0 -56
- package/lib/browser/index.mjs.map +0 -1
- package/lib/browser/interceptors/WebSocket/index.cjs +0 -618
- package/lib/browser/interceptors/WebSocket/index.cjs.map +0 -1
- package/lib/browser/interceptors/WebSocket/index.mjs.map +0 -1
- package/lib/browser/interceptors/XMLHttpRequest/index.cjs +0 -8
- package/lib/browser/interceptors/XMLHttpRequest/index.d.cts +0 -15
- package/lib/browser/interceptors/XMLHttpRequest/index.d.mts +0 -15
- package/lib/browser/interceptors/XMLHttpRequest/index.mjs +0 -8
- package/lib/browser/interceptors/fetch/index.cjs +0 -7
- package/lib/browser/interceptors/fetch/index.d.cts +0 -13
- package/lib/browser/interceptors/fetch/index.d.mts +0 -13
- package/lib/browser/interceptors/fetch/index.mjs +0 -7
- package/lib/browser/presets/browser.cjs +0 -18
- package/lib/browser/presets/browser.cjs.map +0 -1
- package/lib/browser/presets/browser.d.cts +0 -12
- package/lib/browser/presets/browser.d.mts +0 -14
- package/lib/browser/presets/browser.mjs +0 -18
- package/lib/browser/presets/browser.mjs.map +0 -1
- package/lib/browser/resolveWebSocketUrl-6K6EgqsA.cjs +0 -31
- package/lib/browser/resolveWebSocketUrl-6K6EgqsA.cjs.map +0 -1
- package/lib/browser/resolveWebSocketUrl-C83-x9iE.mjs.map +0 -1
- package/lib/node/BatchInterceptor-BGhH8z1z.cjs +0 -49
- package/lib/node/BatchInterceptor-BGhH8z1z.cjs.map +0 -1
- package/lib/node/BatchInterceptor-C4-RX5rg.mjs +0 -44
- package/lib/node/BatchInterceptor-C4-RX5rg.mjs.map +0 -1
- package/lib/node/BatchInterceptor-KKF8Q47I.d.cts +0 -26
- package/lib/node/BatchInterceptor-rSr-NH_H.d.mts +0 -26
- package/lib/node/ClientRequest-2loAH7xM.cjs +0 -1058
- package/lib/node/ClientRequest-2loAH7xM.cjs.map +0 -1
- package/lib/node/ClientRequest-DGhBX21V.mjs +0 -1049
- package/lib/node/ClientRequest-DGhBX21V.mjs.map +0 -1
- package/lib/node/Interceptor-BsZ21ue0.d.cts +0 -132
- package/lib/node/Interceptor-soD-WpQO.d.mts +0 -132
- package/lib/node/RemoteHttpInterceptor.cjs +0 -155
- package/lib/node/RemoteHttpInterceptor.cjs.map +0 -1
- package/lib/node/RemoteHttpInterceptor.d.mts +0 -39
- package/lib/node/RemoteHttpInterceptor.mjs.map +0 -1
- package/lib/node/XMLHttpRequest-BtDNZipW.cjs +0 -752
- package/lib/node/XMLHttpRequest-BtDNZipW.cjs.map +0 -1
- package/lib/node/XMLHttpRequest-Dw6Wm-UU.mjs +0 -746
- package/lib/node/XMLHttpRequest-Dw6Wm-UU.mjs.map +0 -1
- package/lib/node/bufferUtils-DxPxwff_.mjs +0 -20
- package/lib/node/bufferUtils-DxPxwff_.mjs.map +0 -1
- package/lib/node/bufferUtils-S5_-2eN4.cjs +0 -38
- package/lib/node/bufferUtils-S5_-2eN4.cjs.map +0 -1
- package/lib/node/chunk-CbDLau6x.cjs +0 -34
- package/lib/node/fetch-CaC3rGEu.mjs +0 -252
- package/lib/node/fetch-CaC3rGEu.mjs.map +0 -1
- package/lib/node/fetch-D2ClLNN-.cjs +0 -259
- package/lib/node/fetch-D2ClLNN-.cjs.map +0 -1
- package/lib/node/fetchUtils-BKJ1XmiO.mjs +0 -480
- package/lib/node/fetchUtils-BKJ1XmiO.mjs.map +0 -1
- package/lib/node/fetchUtils-umV5xXBy.cjs +0 -546
- package/lib/node/fetchUtils-umV5xXBy.cjs.map +0 -1
- package/lib/node/getRawRequest-B6znU6il.cjs +0 -36
- package/lib/node/getRawRequest-B6znU6il.cjs.map +0 -1
- package/lib/node/getRawRequest-C2-1urzA.mjs +0 -24
- package/lib/node/getRawRequest-C2-1urzA.mjs.map +0 -1
- package/lib/node/handleRequest-C-cKYjIh.cjs +0 -222
- package/lib/node/handleRequest-C-cKYjIh.cjs.map +0 -1
- package/lib/node/handleRequest-FIQv5pwH.mjs +0 -192
- package/lib/node/handleRequest-FIQv5pwH.mjs.map +0 -1
- package/lib/node/hasConfigurableGlobal-BiTmog1u.mjs.map +0 -1
- package/lib/node/hasConfigurableGlobal-MjY06_Ok.cjs +0 -108
- package/lib/node/hasConfigurableGlobal-MjY06_Ok.cjs.map +0 -1
- package/lib/node/index-BJ5E5aW-.d.cts +0 -113
- package/lib/node/index-DfoF45ih.d.mts +0 -113
- package/lib/node/index.cjs +0 -53
- package/lib/node/index.cjs.map +0 -1
- package/lib/node/index.d.cts +0 -104
- package/lib/node/index.d.mts +0 -104
- package/lib/node/index.mjs.map +0 -1
- package/lib/node/interceptors/ClientRequest/index.cjs +0 -6
- package/lib/node/interceptors/ClientRequest/index.d.cts +0 -2
- package/lib/node/interceptors/ClientRequest/index.d.mts +0 -3
- package/lib/node/interceptors/ClientRequest/index.mjs +0 -6
- package/lib/node/interceptors/XMLHttpRequest/index.cjs +0 -7
- package/lib/node/interceptors/XMLHttpRequest/index.d.cts +0 -14
- package/lib/node/interceptors/XMLHttpRequest/index.d.mts +0 -14
- package/lib/node/interceptors/XMLHttpRequest/index.mjs +0 -7
- package/lib/node/interceptors/fetch/index.cjs +0 -6
- package/lib/node/interceptors/fetch/index.d.cts +0 -12
- package/lib/node/interceptors/fetch/index.d.mts +0 -12
- package/lib/node/interceptors/fetch/index.mjs +0 -6
- package/lib/node/node-DIKcnzhK.cjs +0 -39
- package/lib/node/node-DIKcnzhK.cjs.map +0 -1
- package/lib/node/node-lsdNwZEW.mjs +0 -27
- package/lib/node/node-lsdNwZEW.mjs.map +0 -1
- package/lib/node/presets/node.cjs +0 -23
- package/lib/node/presets/node.cjs.map +0 -1
- package/lib/node/presets/node.d.cts +0 -13
- package/lib/node/presets/node.d.mts +0 -15
- package/lib/node/presets/node.mjs +0 -23
- package/lib/node/presets/node.mjs.map +0 -1
- package/lib/node/utils/node/index.cjs +0 -4
- package/lib/node/utils/node/index.d.cts +0 -16
- package/lib/node/utils/node/index.d.mts +0 -16
- package/lib/node/utils/node/index.mjs +0 -3
- package/presets/browser/package.json +0 -5
- package/presets/node/package.json +0 -11
- package/src/BatchInterceptor.test.ts +0 -255
- package/src/BatchInterceptor.ts +0 -96
- package/src/Interceptor.test.ts +0 -205
- package/src/Interceptor.ts +0 -249
- package/src/getRawRequest.ts +0 -21
- package/src/interceptors/ClientRequest/MockHttpSocket.ts +0 -724
- package/src/interceptors/ClientRequest/agents.ts +0 -110
- package/src/interceptors/ClientRequest/utils/getIncomingMessageBody.test.ts +0 -54
- package/src/interceptors/ClientRequest/utils/getIncomingMessageBody.ts +0 -45
- package/src/interceptors/ClientRequest/utils/normalizeClientRequestArgs.test.ts +0 -427
- package/src/interceptors/ClientRequest/utils/normalizeClientRequestArgs.ts +0 -268
- package/src/interceptors/ClientRequest/utils/parserUtils.ts +0 -48
- package/src/interceptors/Socket/MockSocket.test.ts +0 -264
- package/src/interceptors/Socket/MockSocket.ts +0 -58
- package/src/interceptors/Socket/utils/baseUrlFromConnectionOptions.ts +0 -26
- package/src/interceptors/Socket/utils/normalizeSocketWriteArgs.test.ts +0 -52
- package/src/interceptors/Socket/utils/normalizeSocketWriteArgs.ts +0 -33
- package/src/interceptors/XMLHttpRequest/index.ts +0 -40
- package/src/interceptors/fetch/index.ts +0 -203
- package/src/utils/bufferUtils.ts +0 -22
- package/src/utils/canParseUrl.ts +0 -13
- package/src/utils/emitAsync.ts +0 -25
- package/src/utils/nextTick.ts +0 -11
- package/src/utils/node/index.ts +0 -39
- /package/src/{createRequestId.ts → create-request-id.ts} +0 -0
- /package/src/{InterceptorError.ts → interceptor-error.ts} +0 -0
- /package/src/interceptors/WebSocket/utils/{bindEvent.ts → bind-event.ts} +0 -0
- /package/src/interceptors/XMLHttpRequest/polyfills/{EventPolyfill.ts → event-polyfill.ts} +0 -0
- /package/src/interceptors/XMLHttpRequest/utils/{getBodyByteLength.ts → get-body-byte-length.ts} +0 -0
- /package/src/interceptors/XMLHttpRequest/utils/{isDomParserSupportedType.ts → is-dom-parser-supported-type.ts} +0 -0
- /package/src/interceptors/fetch/utils/{createNetworkError.ts → create-network-error.ts} +0 -0
- /package/src/utils/{findPropertySource.ts → find-property-source.ts} +0 -0
- /package/src/utils/{getCleanUrl.ts → get-clean-url.ts} +0 -0
- /package/src/utils/{getValueBySymbol.ts → get-value-by-symbol.ts} +0 -0
- /package/src/utils/{isNodeLikeError.ts → is-node-like-error.ts} +0 -0
- /package/src/utils/{isObject.ts → is-object.ts} +0 -0
- /package/src/utils/{isPropertyAccessible.ts → is-property-accessible.ts} +0 -0
- /package/src/utils/{parseJson.ts → parse-json.ts} +0 -0
- /package/src/utils/{resolveWebSocketUrl.ts → resolve-web-socket-url.ts} +0 -0
|
@@ -1,14 +1,15 @@
|
|
|
1
|
-
import { ChildProcess } from 'child_process'
|
|
2
|
-
import { HttpRequestEventMap } from './
|
|
3
|
-
import { Interceptor } from './
|
|
4
|
-
import { BatchInterceptor } from './
|
|
1
|
+
import type { ChildProcess } from 'node:child_process'
|
|
2
|
+
import { type HttpRequestEventMap, HttpResponseEvent } from './events/http'
|
|
3
|
+
import { Interceptor } from './interceptor'
|
|
4
|
+
import { BatchInterceptor } from './batch-interceptor'
|
|
5
5
|
import { ClientRequestInterceptor } from './interceptors/ClientRequest'
|
|
6
|
-
import { XMLHttpRequestInterceptor } from './interceptors/XMLHttpRequest'
|
|
7
|
-
import { FetchInterceptor } from './interceptors/fetch'
|
|
8
|
-
import { handleRequest } from './utils/
|
|
9
|
-
import { RequestController } from './
|
|
10
|
-
import { FetchRequest, FetchResponse } from './utils/
|
|
11
|
-
import { isResponseError } from './utils/
|
|
6
|
+
import { XMLHttpRequestInterceptor } from './interceptors/XMLHttpRequest/node'
|
|
7
|
+
import { FetchInterceptor } from './interceptors/fetch/node'
|
|
8
|
+
import { handleRequest } from './utils/handle-request'
|
|
9
|
+
import { RequestController } from './request-controller'
|
|
10
|
+
import { FetchRequest, FetchResponse } from './utils/fetch-utils'
|
|
11
|
+
import { isResponseError } from './utils/response-utils'
|
|
12
|
+
import { createLogger } from './utils/logger'
|
|
12
13
|
|
|
13
14
|
export interface SerializedRequest {
|
|
14
15
|
id: string
|
|
@@ -16,7 +17,7 @@ export interface SerializedRequest {
|
|
|
16
17
|
method: string
|
|
17
18
|
headers: Array<[string, string]>
|
|
18
19
|
credentials: RequestCredentials
|
|
19
|
-
body: string
|
|
20
|
+
body: string | null
|
|
20
21
|
}
|
|
21
22
|
|
|
22
23
|
interface RevivedRequest extends Omit<SerializedRequest, 'url' | 'headers'> {
|
|
@@ -28,9 +29,11 @@ export interface SerializedResponse {
|
|
|
28
29
|
status: number
|
|
29
30
|
statusText: string
|
|
30
31
|
headers: Array<[string, string]>
|
|
31
|
-
body: string
|
|
32
|
+
body: string | null
|
|
32
33
|
}
|
|
33
34
|
|
|
35
|
+
const logger = createLogger('remote-http')
|
|
36
|
+
|
|
34
37
|
export class RemoteHttpInterceptor extends BatchInterceptor<
|
|
35
38
|
[ClientRequestInterceptor, XMLHttpRequestInterceptor, FetchInterceptor]
|
|
36
39
|
> {
|
|
@@ -62,10 +65,10 @@ export class RemoteHttpInterceptor extends BatchInterceptor<
|
|
|
62
65
|
body: ['GET', 'HEAD'].includes(request.method)
|
|
63
66
|
? null
|
|
64
67
|
: await request.text(),
|
|
65
|
-
}
|
|
68
|
+
} satisfies SerializedRequest)
|
|
66
69
|
|
|
67
|
-
|
|
68
|
-
'sent serialized request to
|
|
70
|
+
logger.verbose(
|
|
71
|
+
'sent serialized request to child: %s',
|
|
69
72
|
serializedRequest
|
|
70
73
|
)
|
|
71
74
|
|
|
@@ -108,7 +111,7 @@ export class RemoteHttpInterceptor extends BatchInterceptor<
|
|
|
108
111
|
})
|
|
109
112
|
|
|
110
113
|
// Listen for the mocked response message from the parent.
|
|
111
|
-
|
|
114
|
+
logger.verbose(
|
|
112
115
|
'add "message" listener to the parent process',
|
|
113
116
|
handleParentMessage
|
|
114
117
|
)
|
|
@@ -141,22 +144,24 @@ export interface RemoveResolverOptions {
|
|
|
141
144
|
}
|
|
142
145
|
|
|
143
146
|
export class RemoteHttpResolver extends Interceptor<HttpRequestEventMap> {
|
|
144
|
-
static symbol = Symbol.for('remote-resolver')
|
|
147
|
+
static symbol = Symbol.for('remote-http-resolver')
|
|
145
148
|
private process: ChildProcess
|
|
146
149
|
|
|
147
150
|
constructor(options: RemoveResolverOptions) {
|
|
148
|
-
super(
|
|
151
|
+
super()
|
|
149
152
|
this.process = options.process
|
|
150
153
|
}
|
|
151
154
|
|
|
152
|
-
protected
|
|
153
|
-
|
|
155
|
+
protected predicate(): boolean {
|
|
156
|
+
return true
|
|
157
|
+
}
|
|
154
158
|
|
|
159
|
+
protected setup() {
|
|
155
160
|
const handleChildMessage: NodeJS.MessageListener = async (message) => {
|
|
156
|
-
logger.
|
|
161
|
+
logger.verbose('received message from child %o', message)
|
|
157
162
|
|
|
158
163
|
if (typeof message !== 'string' || !message.startsWith('request:')) {
|
|
159
|
-
logger.
|
|
164
|
+
logger.verbose('unknown message, ignoring')
|
|
160
165
|
return
|
|
161
166
|
}
|
|
162
167
|
|
|
@@ -168,9 +173,9 @@ export class RemoteHttpResolver extends Interceptor<HttpRequestEventMap> {
|
|
|
168
173
|
const requestJson = JSON.parse(
|
|
169
174
|
serializedRequest,
|
|
170
175
|
requestReviver
|
|
171
|
-
)
|
|
176
|
+
) satisfies RevivedRequest
|
|
172
177
|
|
|
173
|
-
logger.
|
|
178
|
+
logger.verbose('parsed intercepted request %o', requestJson)
|
|
174
179
|
|
|
175
180
|
const request = new FetchRequest(requestJson.url, {
|
|
176
181
|
method: requestJson.method,
|
|
@@ -180,69 +185,77 @@ export class RemoteHttpResolver extends Interceptor<HttpRequestEventMap> {
|
|
|
180
185
|
})
|
|
181
186
|
|
|
182
187
|
const controller = new RequestController(request, {
|
|
183
|
-
passthrough: () => {
|
|
188
|
+
passthrough: () => {
|
|
189
|
+
// Intentionally empty.
|
|
190
|
+
},
|
|
184
191
|
respondWith: async (response) => {
|
|
185
192
|
if (isResponseError(response)) {
|
|
186
|
-
|
|
193
|
+
logger.verbose('received a network error %o', { response })
|
|
187
194
|
throw new Error('Not implemented')
|
|
188
195
|
}
|
|
189
196
|
|
|
190
|
-
this.logger.info('received mocked response!', { response })
|
|
191
|
-
|
|
192
197
|
const responseClone = FetchResponse.clone(response)
|
|
193
198
|
const responseText = await responseClone.text()
|
|
194
199
|
|
|
195
|
-
//
|
|
200
|
+
// Send the mocked response to the child process.
|
|
196
201
|
const serializedResponse = JSON.stringify({
|
|
197
202
|
status: response.status,
|
|
198
203
|
statusText: response.statusText,
|
|
199
204
|
headers: Array.from(response.headers.entries()),
|
|
200
205
|
body: responseText,
|
|
201
|
-
}
|
|
206
|
+
} satisfies SerializedResponse)
|
|
202
207
|
|
|
203
208
|
this.process.send(
|
|
204
209
|
`response:${requestJson.id}:${serializedResponse}`,
|
|
205
|
-
(error) => {
|
|
210
|
+
async (error) => {
|
|
206
211
|
if (error) {
|
|
207
212
|
return
|
|
208
213
|
}
|
|
209
214
|
|
|
210
215
|
// Emit an optimistic "response" event at this point,
|
|
211
216
|
// not to rely on the back-and-forth signaling for the sake of the event.
|
|
212
|
-
this.emitter.
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
217
|
+
await this.emitter.emitAsPromise(
|
|
218
|
+
new HttpResponseEvent({
|
|
219
|
+
initiator: null,
|
|
220
|
+
request,
|
|
221
|
+
requestId: requestJson.id,
|
|
222
|
+
response: responseClone,
|
|
223
|
+
responseType: 'mock',
|
|
224
|
+
})
|
|
225
|
+
)
|
|
218
226
|
}
|
|
219
227
|
)
|
|
220
228
|
|
|
221
|
-
logger.
|
|
222
|
-
'sent serialized mocked response to
|
|
229
|
+
logger.verbose(
|
|
230
|
+
'sent serialized mocked response to parent: %s',
|
|
223
231
|
serializedResponse
|
|
224
232
|
)
|
|
225
233
|
},
|
|
226
234
|
errorWith: (reason) => {
|
|
227
|
-
|
|
235
|
+
logger.verbose('request errored %o', { error: reason })
|
|
228
236
|
throw new Error('Not implemented')
|
|
229
237
|
},
|
|
238
|
+
}, {
|
|
239
|
+
logger,
|
|
240
|
+
requestId: requestJson.id,
|
|
230
241
|
})
|
|
231
242
|
|
|
232
243
|
await handleRequest({
|
|
244
|
+
initiator: null,
|
|
233
245
|
request,
|
|
234
246
|
requestId: requestJson.id,
|
|
235
247
|
controller,
|
|
236
248
|
emitter: this.emitter,
|
|
249
|
+
logger,
|
|
237
250
|
})
|
|
238
251
|
}
|
|
239
252
|
|
|
240
253
|
this.subscriptions.push(() => {
|
|
241
254
|
this.process.removeListener('message', handleChildMessage)
|
|
242
|
-
logger.
|
|
255
|
+
logger.verbose('removed "message" listener from child process')
|
|
243
256
|
})
|
|
244
257
|
|
|
245
|
-
logger.
|
|
258
|
+
logger.verbose('adding "message" listener to child process')
|
|
246
259
|
this.process.addListener('message', handleChildMessage)
|
|
247
260
|
|
|
248
261
|
this.process.once('error', () => this.dispose())
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { AsyncLocalStorage } from 'node:async_hooks'
|
|
2
|
+
import type { Logger } from './utils/logger'
|
|
3
|
+
|
|
4
|
+
interface RequestContext {
|
|
5
|
+
initiator: unknown
|
|
6
|
+
logger?: Logger
|
|
7
|
+
transformRequest?: (request: Request) => Request
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export const requestContext = new AsyncLocalStorage<RequestContext>()
|
|
11
|
+
|
|
12
|
+
export function runInRequestContext<T>(callback: () => T, logger?: Logger): T {
|
|
13
|
+
/**
|
|
14
|
+
* @note Never shadow an existing request context. Nested calls
|
|
15
|
+
* (e.g. a patched entry point re-entered synchronously, or a request
|
|
16
|
+
* made within the fetch/XMLHttpRequest interceptor context) must run
|
|
17
|
+
* within the parent context so the sockets they create capture it.
|
|
18
|
+
*/
|
|
19
|
+
if (requestContext.getStore()) {
|
|
20
|
+
return callback()
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* @note The initiator is the callback's return value (e.g. the
|
|
25
|
+
* "ClientRequest" instance), so it cannot be known before running
|
|
26
|
+
* the callback. The context is mutated in place once the callback
|
|
27
|
+
* returns; readers hold the context object by reference and sample
|
|
28
|
+
* "initiator" only after the request has been written.
|
|
29
|
+
*/
|
|
30
|
+
const context: RequestContext = {
|
|
31
|
+
initiator: undefined,
|
|
32
|
+
logger,
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
return requestContext.run(context, () => {
|
|
36
|
+
const initiator = callback()
|
|
37
|
+
context.initiator = initiator
|
|
38
|
+
return initiator
|
|
39
|
+
})
|
|
40
|
+
}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { vi, it, expect } from 'vitest'
|
|
2
1
|
import {
|
|
3
2
|
RequestController,
|
|
4
3
|
type RequestControllerSource,
|
|
5
|
-
} from './
|
|
6
|
-
import { InterceptorError } from './
|
|
4
|
+
} from './request-controller'
|
|
5
|
+
import { InterceptorError } from './interceptor-error'
|
|
6
|
+
import type { Logger } from './utils/logger'
|
|
7
7
|
|
|
8
8
|
const defaultSource = {
|
|
9
9
|
passthrough() {},
|
|
@@ -41,6 +41,40 @@ it('handles a request when calling ".respondWith()" with a mocked response', asy
|
|
|
41
41
|
await expect(response.text()).resolves.toBe('hello world')
|
|
42
42
|
})
|
|
43
43
|
|
|
44
|
+
it('logs a mocked resolution and response as a single message', async () => {
|
|
45
|
+
const info = vi.fn<Logger['info']>()
|
|
46
|
+
const logger = {
|
|
47
|
+
info,
|
|
48
|
+
verbose: vi.fn<Logger['verbose']>(),
|
|
49
|
+
isEnabled() {
|
|
50
|
+
return true
|
|
51
|
+
},
|
|
52
|
+
} satisfies Logger
|
|
53
|
+
const controller = new RequestController(
|
|
54
|
+
new Request('http://localhost'),
|
|
55
|
+
defaultSource,
|
|
56
|
+
{ logger, requestId: 'request-id' }
|
|
57
|
+
)
|
|
58
|
+
|
|
59
|
+
controller.respondWith(
|
|
60
|
+
new Response(null, {
|
|
61
|
+
status: 201,
|
|
62
|
+
statusText: 'Created',
|
|
63
|
+
headers: {
|
|
64
|
+
'x-example': 'yes',
|
|
65
|
+
},
|
|
66
|
+
})
|
|
67
|
+
)
|
|
68
|
+
|
|
69
|
+
await vi.waitFor(() => {
|
|
70
|
+
expect(info).toHaveBeenCalledWith(
|
|
71
|
+
'[%s] mocked %s',
|
|
72
|
+
'request-id',
|
|
73
|
+
['HTTP 201 Created', 'x-example: yes', '', ''].join('\n')
|
|
74
|
+
)
|
|
75
|
+
})
|
|
76
|
+
})
|
|
77
|
+
|
|
44
78
|
it('handles the request when calling ".errorWith()" with an error', async () => {
|
|
45
79
|
const errorWith = vi.fn<RequestControllerSource['errorWith']>()
|
|
46
80
|
const controller = new RequestController(new Request('http://localhost'), {
|
|
@@ -1,11 +1,16 @@
|
|
|
1
|
-
import { DeferredPromise } from '@open-draft/deferred-promise'
|
|
2
1
|
import { invariant } from 'outvariant'
|
|
3
|
-
import { InterceptorError } from './
|
|
2
|
+
import { InterceptorError } from './interceptor-error'
|
|
3
|
+
import { formatResponse, type Logger } from './utils/logger'
|
|
4
4
|
|
|
5
5
|
export interface RequestControllerSource {
|
|
6
|
-
passthrough(): void
|
|
7
|
-
respondWith(response: Response): void
|
|
8
|
-
errorWith(reason?: unknown): void
|
|
6
|
+
passthrough(): void | Promise<void>
|
|
7
|
+
respondWith(response: Response): void | Promise<void>
|
|
8
|
+
errorWith(reason?: unknown): void | Promise<void>
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
interface RequestControllerOptions {
|
|
12
|
+
logger: Logger
|
|
13
|
+
requestId: string
|
|
9
14
|
}
|
|
10
15
|
|
|
11
16
|
export class RequestController {
|
|
@@ -22,16 +27,16 @@ export class RequestController {
|
|
|
22
27
|
*/
|
|
23
28
|
public handled: Promise<void>
|
|
24
29
|
|
|
30
|
+
readonly #handled: PromiseWithResolvers<void>
|
|
31
|
+
|
|
25
32
|
constructor(
|
|
26
33
|
protected readonly request: Request,
|
|
27
|
-
protected readonly source: RequestControllerSource
|
|
34
|
+
protected readonly source: RequestControllerSource,
|
|
35
|
+
protected readonly options?: RequestControllerOptions
|
|
28
36
|
) {
|
|
29
37
|
this.readyState = RequestController.PENDING
|
|
30
|
-
this
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
get #handled() {
|
|
34
|
-
return this.handled as DeferredPromise<void>
|
|
38
|
+
this.#handled = Promise.withResolvers<void>()
|
|
39
|
+
this.handled = this.#handled.promise
|
|
35
40
|
}
|
|
36
41
|
|
|
37
42
|
/**
|
|
@@ -47,6 +52,9 @@ export class RequestController {
|
|
|
47
52
|
)
|
|
48
53
|
|
|
49
54
|
this.readyState = RequestController.PASSTHROUGH
|
|
55
|
+
if (this.options) {
|
|
56
|
+
this.options.logger.info('[%s] passthrough', this.options.requestId)
|
|
57
|
+
}
|
|
50
58
|
await this.source.passthrough()
|
|
51
59
|
this.#handled.resolve()
|
|
52
60
|
}
|
|
@@ -72,6 +80,13 @@ export class RequestController {
|
|
|
72
80
|
)
|
|
73
81
|
|
|
74
82
|
this.readyState = RequestController.RESPONSE
|
|
83
|
+
if (this.options?.logger.isEnabled('default')) {
|
|
84
|
+
const { logger, requestId } = this.options
|
|
85
|
+
|
|
86
|
+
void formatResponse(response).then((message) => {
|
|
87
|
+
logger.info('[%s] mocked %s', requestId, message)
|
|
88
|
+
})
|
|
89
|
+
}
|
|
75
90
|
this.#handled.resolve()
|
|
76
91
|
|
|
77
92
|
/**
|
|
@@ -103,6 +118,13 @@ export class RequestController {
|
|
|
103
118
|
)
|
|
104
119
|
|
|
105
120
|
this.readyState = RequestController.ERROR
|
|
121
|
+
if (this.options) {
|
|
122
|
+
this.options.logger.info(
|
|
123
|
+
'[%s] error %o',
|
|
124
|
+
this.options.requestId,
|
|
125
|
+
reason
|
|
126
|
+
)
|
|
127
|
+
}
|
|
106
128
|
this.source.errorWith(reason)
|
|
107
129
|
this.#handled.resolve()
|
|
108
130
|
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
const encoder = new TextEncoder()
|
|
2
|
+
|
|
3
|
+
export function encodeBuffer(text: string) {
|
|
4
|
+
return encoder.encode(text)
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
export function decodeBuffer(buffer: AllowSharedBufferSource, encoding?: string): string {
|
|
8
|
+
const decoder = new TextDecoder(encoding)
|
|
9
|
+
return decoder.decode(buffer)
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Create an `ArrayBuffer` from the given `Uint8Array`.
|
|
14
|
+
* Takes the byte offset into account to produce the right buffer
|
|
15
|
+
* in the case when the buffer is bigger than the data view.
|
|
16
|
+
*/
|
|
17
|
+
export function toArrayBuffer(array: Uint8Array<ArrayBuffer>): ArrayBuffer {
|
|
18
|
+
return array.buffer.slice(
|
|
19
|
+
array.byteOffset,
|
|
20
|
+
array.byteOffset + array.byteLength
|
|
21
|
+
)
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export function toBuffer(
|
|
25
|
+
data: string | Buffer | Uint8Array<ArrayBufferLike>,
|
|
26
|
+
encoding?: BufferEncoding
|
|
27
|
+
): Buffer {
|
|
28
|
+
if (Buffer.isBuffer(data)) {
|
|
29
|
+
return data
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
if (data instanceof Uint8Array) {
|
|
33
|
+
return Buffer.from(data.buffer)
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
return Buffer.from(data, encoding)
|
|
37
|
+
}
|
|
@@ -1,27 +1,27 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { createLogger } from './logger'
|
|
2
2
|
|
|
3
|
-
const logger =
|
|
3
|
+
const logger = createLogger('clone-object')
|
|
4
4
|
|
|
5
5
|
function isPlainObject(obj?: Record<string, any>): boolean {
|
|
6
|
-
logger.
|
|
6
|
+
logger.verbose('is plain object? %o', obj)
|
|
7
7
|
|
|
8
8
|
if (obj == null || !obj.constructor?.name) {
|
|
9
|
-
logger.
|
|
9
|
+
logger.verbose('given object is undefined, not a plain object')
|
|
10
10
|
return false
|
|
11
11
|
}
|
|
12
12
|
|
|
13
|
-
logger.
|
|
13
|
+
logger.verbose('checking object constructor: %s', obj.constructor.name)
|
|
14
14
|
return obj.constructor.name === 'Object'
|
|
15
15
|
}
|
|
16
16
|
|
|
17
17
|
export function cloneObject<ObjectType extends Record<string, any>>(
|
|
18
18
|
obj: ObjectType
|
|
19
19
|
): ObjectType {
|
|
20
|
-
logger.
|
|
20
|
+
logger.verbose('cloning object %o', obj)
|
|
21
21
|
|
|
22
22
|
const enumerableProperties = Object.entries(obj).reduce<Record<string, any>>(
|
|
23
23
|
(acc, [key, value]) => {
|
|
24
|
-
logger.
|
|
24
|
+
logger.verbose('analyzing key-value pair: %s %o', key, value)
|
|
25
25
|
|
|
26
26
|
// Recursively clone only plain objects, omitting class instances.
|
|
27
27
|
acc[key] = isPlainObject(value) ? cloneObject(value) : value
|
|
@@ -31,6 +31,6 @@ export function cloneObject<ObjectType extends Record<string, any>>(
|
|
|
31
31
|
)
|
|
32
32
|
|
|
33
33
|
return isPlainObject(obj)
|
|
34
|
-
? enumerableProperties
|
|
34
|
+
? (enumerableProperties as ObjectType)
|
|
35
35
|
: Object.assign(Object.getPrototypeOf(obj), enumerableProperties)
|
|
36
36
|
}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { createProxy } from './createProxy'
|
|
1
|
+
import { createProxy } from './create-proxy'
|
|
3
2
|
|
|
4
3
|
it('does not interfere with default constructors', () => {
|
|
5
4
|
const ProxyClass = createProxy(
|
|
@@ -59,7 +58,7 @@ it('does not interfere with existing descriptors', () => {
|
|
|
59
58
|
|
|
60
59
|
it('infer prototype descriptors', () => {
|
|
61
60
|
class Child {
|
|
62
|
-
ok
|
|
61
|
+
ok!: boolean
|
|
63
62
|
|
|
64
63
|
set status(nextStatus: number) {
|
|
65
64
|
this.ok = nextStatus >= 200 && nextStatus < 300
|
|
@@ -86,7 +85,10 @@ it('infer prototype descriptors', () => {
|
|
|
86
85
|
|
|
87
86
|
it('spies on the constructor', () => {
|
|
88
87
|
const OriginalClass = class {
|
|
89
|
-
constructor(
|
|
88
|
+
constructor(
|
|
89
|
+
public name: string,
|
|
90
|
+
public age: number
|
|
91
|
+
) {}
|
|
90
92
|
}
|
|
91
93
|
|
|
92
94
|
const constructorCall = vi.fn<
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { getValueBySymbol } from './
|
|
1
|
+
import { copyRawHeaders } from '../interceptors/ClientRequest/utils/record-raw-headers'
|
|
2
|
+
import { getValueBySymbol } from './get-value-by-symbol'
|
|
3
|
+
import { isResponseError } from './response-utils'
|
|
3
4
|
|
|
4
5
|
interface UndiciRequestState extends RequestInit {}
|
|
5
6
|
|
|
@@ -164,6 +165,27 @@ const kStatus = Symbol('kStatus')
|
|
|
164
165
|
const kUrl = Symbol('kUrl')
|
|
165
166
|
|
|
166
167
|
export class FetchResponse extends Response {
|
|
168
|
+
static from(response: Response, init?: FetchResponseInit): FetchResponse {
|
|
169
|
+
if (response instanceof FetchResponse) {
|
|
170
|
+
return response
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
if (isResponseError(response)) {
|
|
174
|
+
return response
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
const fetchResponse = new FetchResponse(response.body, {
|
|
178
|
+
url: init?.url ?? response.url,
|
|
179
|
+
status: init?.status || response.status,
|
|
180
|
+
statusText: init?.statusText ?? response.statusText,
|
|
181
|
+
headers: init?.headers ?? response.headers,
|
|
182
|
+
})
|
|
183
|
+
|
|
184
|
+
copyRawHeaders(response.headers, fetchResponse.headers)
|
|
185
|
+
|
|
186
|
+
return fetchResponse
|
|
187
|
+
}
|
|
188
|
+
|
|
167
189
|
/**
|
|
168
190
|
* Response status codes for responses that cannot have body.
|
|
169
191
|
* @see https://fetch.spec.whatwg.org/#statuses
|
|
@@ -216,7 +238,7 @@ export class FetchResponse extends Response {
|
|
|
216
238
|
}
|
|
217
239
|
|
|
218
240
|
static setUrl(url: string | undefined, response: Response): void {
|
|
219
|
-
if (!url || url === 'about:' || !
|
|
241
|
+
if (!url || url === 'about:' || !URL.canParse(url)) {
|
|
220
242
|
return
|
|
221
243
|
}
|
|
222
244
|
|
|
@@ -283,6 +305,9 @@ export class FetchResponse extends Response {
|
|
|
283
305
|
}
|
|
284
306
|
}
|
|
285
307
|
|
|
308
|
+
#status?: number
|
|
309
|
+
#url?: string
|
|
310
|
+
|
|
286
311
|
constructor(body?: BodyInit | null, init: FetchResponseInit = {}) {
|
|
287
312
|
const status = init.status ?? 200
|
|
288
313
|
const safeStatus = FetchResponse.isConfigurableStatusCode(status)
|
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { Agent as
|
|
3
|
-
import {
|
|
4
|
-
import { getUrlByRequestOptions } from './getUrlByRequestOptions'
|
|
1
|
+
import { Agent as HttpAgent } from 'node:http'
|
|
2
|
+
import { RequestOptions, Agent as HttpsAgent } from 'node:https'
|
|
3
|
+
import { getUrlByRequestOptions } from './get-url-by-request-options'
|
|
5
4
|
|
|
6
5
|
it('returns a URL based on the basic RequestOptions', () => {
|
|
7
6
|
expect(
|
|
@@ -130,9 +129,7 @@ it('use "hostname" if both "hostname" and "host" are specified', () => {
|
|
|
130
129
|
path: '/resource',
|
|
131
130
|
}
|
|
132
131
|
|
|
133
|
-
expect(getUrlByRequestOptions(options).href).toBe(
|
|
134
|
-
'https://hostname/resource'
|
|
135
|
-
)
|
|
132
|
+
expect(getUrlByRequestOptions(options).href).toBe('https://hostname/resource')
|
|
136
133
|
})
|
|
137
134
|
|
|
138
135
|
it('parses "host" in IPv6', () => {
|
|
@@ -149,7 +146,6 @@ it('parses "host" in IPv6', () => {
|
|
|
149
146
|
path: '/resource',
|
|
150
147
|
}).href
|
|
151
148
|
).toBe('http://[::1]/resource')
|
|
152
|
-
|
|
153
149
|
})
|
|
154
150
|
|
|
155
151
|
it('parses "host" and "port" in IPv6', () => {
|