@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,24 +1,26 @@
|
|
|
1
|
-
import
|
|
2
|
-
import
|
|
3
|
-
import {
|
|
4
|
-
|
|
1
|
+
import * as http from 'node:http'
|
|
2
|
+
import { setTimeout } from 'node:timers/promises'
|
|
3
|
+
import {
|
|
4
|
+
createTestHttpServer,
|
|
5
|
+
type TestHttpServer,
|
|
6
|
+
} from '@epic-web/test-server/http'
|
|
5
7
|
import { ClientRequestInterceptor } from '.'
|
|
6
|
-
import {
|
|
8
|
+
import { toWebResponse } from '../../../test/helpers'
|
|
7
9
|
|
|
8
|
-
|
|
9
|
-
app.get('/', (_req, res) => {
|
|
10
|
-
res.status(200).send('/')
|
|
11
|
-
})
|
|
12
|
-
app.get('/get', (_req, res) => {
|
|
13
|
-
res.status(200).send('/get')
|
|
14
|
-
})
|
|
15
|
-
})
|
|
10
|
+
let httpServer: TestHttpServer
|
|
16
11
|
|
|
17
12
|
const interceptor = new ClientRequestInterceptor()
|
|
18
13
|
|
|
19
14
|
beforeAll(async () => {
|
|
20
15
|
interceptor.apply()
|
|
21
|
-
await
|
|
16
|
+
httpServer = await createTestHttpServer({
|
|
17
|
+
defineRoutes(router) {
|
|
18
|
+
// The test server always defines a root ("/") route.
|
|
19
|
+
router.get('/get', () => {
|
|
20
|
+
return new Response('/get')
|
|
21
|
+
})
|
|
22
|
+
},
|
|
23
|
+
})
|
|
22
24
|
})
|
|
23
25
|
|
|
24
26
|
afterEach(() => {
|
|
@@ -31,10 +33,10 @@ afterAll(async () => {
|
|
|
31
33
|
})
|
|
32
34
|
|
|
33
35
|
it('abort the request if the abort signal is emitted', async () => {
|
|
34
|
-
const requestUrl = httpServer.http.url('/')
|
|
36
|
+
const requestUrl = httpServer.http.url('/').href
|
|
35
37
|
|
|
36
38
|
interceptor.on('request', async function delayedResponse({ controller }) {
|
|
37
|
-
await
|
|
39
|
+
await setTimeout(1000)
|
|
38
40
|
controller.respondWith(new Response())
|
|
39
41
|
})
|
|
40
42
|
|
|
@@ -43,33 +45,13 @@ it('abort the request if the abort signal is emitted', async () => {
|
|
|
43
45
|
|
|
44
46
|
abortController.abort()
|
|
45
47
|
|
|
46
|
-
const abortErrorPromise =
|
|
48
|
+
const abortErrorPromise = Promise.withResolvers<Error>()
|
|
47
49
|
request.on('error', function (error) {
|
|
48
50
|
abortErrorPromise.resolve(error)
|
|
49
51
|
})
|
|
50
52
|
|
|
51
|
-
const abortError = await abortErrorPromise
|
|
52
|
-
expect(abortError.name).
|
|
53
|
+
const abortError = await abortErrorPromise.promise
|
|
54
|
+
expect(abortError.name).toBe('AbortError')
|
|
53
55
|
|
|
54
56
|
expect(request.destroyed).toBe(true)
|
|
55
57
|
})
|
|
56
|
-
|
|
57
|
-
it('patch the Headers object correctly after dispose and reapply', async () => {
|
|
58
|
-
interceptor.dispose()
|
|
59
|
-
interceptor.apply()
|
|
60
|
-
|
|
61
|
-
interceptor.on('request', ({ controller }) => {
|
|
62
|
-
const headers = new Headers({
|
|
63
|
-
'X-CustoM-HeadeR': 'Yes',
|
|
64
|
-
})
|
|
65
|
-
controller.respondWith(new Response(null, { headers }))
|
|
66
|
-
})
|
|
67
|
-
|
|
68
|
-
const request = http.get(httpServer.http.url('/'))
|
|
69
|
-
const { res } = await waitForClientRequest(request)
|
|
70
|
-
|
|
71
|
-
expect(res.rawHeaders).toEqual(
|
|
72
|
-
expect.arrayContaining(['X-CustoM-HeadeR', 'Yes'])
|
|
73
|
-
)
|
|
74
|
-
expect(res.headers['x-custom-header']).toEqual('Yes')
|
|
75
|
-
})
|
|
@@ -1,193 +1,78 @@
|
|
|
1
1
|
import http from 'node:http'
|
|
2
2
|
import https from 'node:https'
|
|
3
|
-
import {
|
|
4
|
-
import
|
|
5
|
-
import {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
import { normalizeClientRequestArgs } from './utils/normalizeClientRequestArgs'
|
|
14
|
-
import { handleRequest } from '../../utils/handleRequest'
|
|
15
|
-
import {
|
|
16
|
-
recordRawFetchHeaders,
|
|
17
|
-
restoreHeadersPrototype,
|
|
18
|
-
} from './utils/recordRawHeaders'
|
|
19
|
-
|
|
3
|
+
import { runInRequestContext } from '#/src/request-context'
|
|
4
|
+
import { patchesRegistry } from '#/src/utils/patches-registry'
|
|
5
|
+
import { forwardHttpEvents } from '#/src/interceptors/http/forward-events'
|
|
6
|
+
import { NodeHttpRequestSource } from '#/src/interceptors/http/source'
|
|
7
|
+
import { Interceptor } from '../../interceptor'
|
|
8
|
+
import { HttpRequestEventMap } from '#/src/events/http'
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Interceptor for HTTP requests in Node.js made via `http.ClientRequest`.
|
|
12
|
+
*/
|
|
20
13
|
export class ClientRequestInterceptor extends Interceptor<HttpRequestEventMap> {
|
|
21
14
|
static symbol = Symbol.for('client-request-interceptor')
|
|
22
15
|
|
|
23
|
-
|
|
24
|
-
|
|
16
|
+
protected predicate(): boolean {
|
|
17
|
+
return true
|
|
25
18
|
}
|
|
26
19
|
|
|
27
20
|
protected setup(): void {
|
|
28
|
-
const
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
request: originalRequest,
|
|
32
|
-
} = http
|
|
33
|
-
const { get: originalHttpsGet, request: originalHttpsRequest } = https
|
|
34
|
-
|
|
35
|
-
const onRequest = this.onRequest.bind(this)
|
|
36
|
-
const onResponse = this.onResponse.bind(this)
|
|
37
|
-
|
|
38
|
-
// Support requests performed via the `ClientRequest` constructor directly.
|
|
39
|
-
http.ClientRequest = new Proxy(http.ClientRequest, {
|
|
40
|
-
construct: (target, args: Parameters<typeof http.request>) => {
|
|
41
|
-
const [url, options, callback] = normalizeClientRequestArgs(
|
|
42
|
-
'http:',
|
|
43
|
-
args
|
|
44
|
-
)
|
|
45
|
-
|
|
46
|
-
// Create a mock agent instance appropriate for the request protocol.
|
|
47
|
-
const Agent = options.protocol === 'https:' ? MockHttpsAgent : MockAgent
|
|
48
|
-
const mockAgent = new Agent({
|
|
49
|
-
customAgent: options.agent,
|
|
50
|
-
onRequest,
|
|
51
|
-
onResponse,
|
|
52
|
-
})
|
|
53
|
-
options.agent = mockAgent
|
|
54
|
-
|
|
55
|
-
return Reflect.construct(target, [url, options, callback])
|
|
56
|
-
},
|
|
57
|
-
})
|
|
58
|
-
|
|
59
|
-
http.request = new Proxy(http.request, {
|
|
60
|
-
apply: (target, thisArg, args: Parameters<typeof http.request>) => {
|
|
61
|
-
const [url, options, callback] = normalizeClientRequestArgs(
|
|
62
|
-
'http:',
|
|
63
|
-
args
|
|
64
|
-
)
|
|
65
|
-
const mockAgent = new MockAgent({
|
|
66
|
-
customAgent: options.agent,
|
|
67
|
-
onRequest,
|
|
68
|
-
onResponse,
|
|
69
|
-
})
|
|
70
|
-
options.agent = mockAgent
|
|
71
|
-
|
|
72
|
-
return Reflect.apply(target, thisArg, [url, options, callback])
|
|
73
|
-
},
|
|
74
|
-
})
|
|
75
|
-
|
|
76
|
-
http.get = new Proxy(http.get, {
|
|
77
|
-
apply: (target, thisArg, args: Parameters<typeof http.get>) => {
|
|
78
|
-
const [url, options, callback] = normalizeClientRequestArgs(
|
|
79
|
-
'http:',
|
|
80
|
-
args
|
|
81
|
-
)
|
|
82
|
-
|
|
83
|
-
const mockAgent = new MockAgent({
|
|
84
|
-
customAgent: options.agent,
|
|
85
|
-
onRequest,
|
|
86
|
-
onResponse,
|
|
87
|
-
})
|
|
88
|
-
options.agent = mockAgent
|
|
89
|
-
|
|
90
|
-
return Reflect.apply(target, thisArg, [url, options, callback])
|
|
91
|
-
},
|
|
92
|
-
})
|
|
93
|
-
|
|
94
|
-
//
|
|
95
|
-
// HTTPS.
|
|
96
|
-
//
|
|
97
|
-
|
|
98
|
-
https.request = new Proxy(https.request, {
|
|
99
|
-
apply: (target, thisArg, args: Parameters<typeof https.request>) => {
|
|
100
|
-
const [url, options, callback] = normalizeClientRequestArgs(
|
|
101
|
-
'https:',
|
|
102
|
-
args
|
|
103
|
-
)
|
|
104
|
-
|
|
105
|
-
const mockAgent = new MockHttpsAgent({
|
|
106
|
-
customAgent: options.agent,
|
|
107
|
-
onRequest,
|
|
108
|
-
onResponse,
|
|
109
|
-
})
|
|
110
|
-
options.agent = mockAgent
|
|
111
|
-
|
|
112
|
-
return Reflect.apply(target, thisArg, [url, options, callback])
|
|
113
|
-
},
|
|
114
|
-
})
|
|
115
|
-
|
|
116
|
-
https.get = new Proxy(https.get, {
|
|
117
|
-
apply: (target, thisArg, args: Parameters<typeof https.get>) => {
|
|
118
|
-
const [url, options, callback] = normalizeClientRequestArgs(
|
|
119
|
-
'https:',
|
|
120
|
-
args
|
|
121
|
-
)
|
|
122
|
-
|
|
123
|
-
const mockAgent = new MockHttpsAgent({
|
|
124
|
-
customAgent: options.agent,
|
|
125
|
-
onRequest,
|
|
126
|
-
onResponse,
|
|
127
|
-
})
|
|
128
|
-
options.agent = mockAgent
|
|
129
|
-
|
|
130
|
-
return Reflect.apply(target, thisArg, [url, options, callback])
|
|
131
|
-
},
|
|
132
|
-
})
|
|
133
|
-
|
|
134
|
-
// Spy on `Header.prototype.set` and `Header.prototype.append` calls
|
|
135
|
-
// and record the raw header names provided. This is to support
|
|
136
|
-
// `IncomingMessage.prototype.rawHeaders`.
|
|
137
|
-
recordRawFetchHeaders()
|
|
138
|
-
|
|
21
|
+
const requestSource = Interceptor.singleton(NodeHttpRequestSource)
|
|
22
|
+
const requestLogger = this.logger
|
|
23
|
+
requestSource.apply(this)
|
|
139
24
|
this.subscriptions.push(() => {
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
http.get = originalGet
|
|
143
|
-
http.request = originalRequest
|
|
144
|
-
|
|
145
|
-
https.get = originalHttpsGet
|
|
146
|
-
https.request = originalHttpsRequest
|
|
147
|
-
|
|
148
|
-
restoreHeadersPrototype()
|
|
25
|
+
requestSource.dispose(this)
|
|
149
26
|
})
|
|
150
|
-
}
|
|
151
27
|
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
28
|
+
this.subscriptions.push(
|
|
29
|
+
forwardHttpEvents({
|
|
30
|
+
source: requestSource,
|
|
31
|
+
emitter: this.emitter,
|
|
32
|
+
predicate: (initiator) => {
|
|
33
|
+
return initiator instanceof http.ClientRequest
|
|
34
|
+
},
|
|
35
|
+
})
|
|
36
|
+
)
|
|
37
|
+
|
|
38
|
+
this.subscriptions.push(
|
|
39
|
+
patchesRegistry.applyPatch(http, 'ClientRequest', (ClientRequest) => {
|
|
40
|
+
return new Proxy(ClientRequest, {
|
|
41
|
+
construct(target, args, newTarget) {
|
|
42
|
+
return runInRequestContext(() => {
|
|
43
|
+
return Reflect.construct(target, args, newTarget)
|
|
44
|
+
}, requestLogger)
|
|
45
|
+
},
|
|
46
|
+
})
|
|
47
|
+
}),
|
|
48
|
+
patchesRegistry.applyPatch(http, 'get', (httpGet) => {
|
|
49
|
+
return function mockHttpGet(...args) {
|
|
50
|
+
return runInRequestContext(() => {
|
|
51
|
+
return httpGet(...(args as [any, any]))
|
|
52
|
+
}, requestLogger)
|
|
166
53
|
}
|
|
167
|
-
},
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
isMockedResponse,
|
|
191
|
-
})
|
|
54
|
+
}),
|
|
55
|
+
patchesRegistry.applyPatch(http, 'request', (httpRequest) => {
|
|
56
|
+
return function mockHttpRequest(...args) {
|
|
57
|
+
return runInRequestContext(() => {
|
|
58
|
+
return httpRequest(...(args as [any, any]))
|
|
59
|
+
}, requestLogger)
|
|
60
|
+
}
|
|
61
|
+
}),
|
|
62
|
+
patchesRegistry.applyPatch(https, 'get', (httpsGet) => {
|
|
63
|
+
return function mockHttpsGet(...args) {
|
|
64
|
+
return runInRequestContext(() => {
|
|
65
|
+
return httpsGet(...(args as [any, any]))
|
|
66
|
+
}, requestLogger)
|
|
67
|
+
}
|
|
68
|
+
}),
|
|
69
|
+
patchesRegistry.applyPatch(https, 'request', (httpsRequest) => {
|
|
70
|
+
return function mockHttpsRequest(...args) {
|
|
71
|
+
return runInRequestContext(() => {
|
|
72
|
+
return httpsRequest(...(args as [any, any]))
|
|
73
|
+
}, requestLogger)
|
|
74
|
+
}
|
|
75
|
+
})
|
|
76
|
+
)
|
|
192
77
|
}
|
|
193
78
|
}
|
package/src/interceptors/ClientRequest/utils/{recordRawHeaders.test.ts → record-raw-headers.test.ts}
RENAMED
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
// @vitest-environment node
|
|
2
|
-
import { it, expect, afterEach } from 'vitest'
|
|
3
2
|
import {
|
|
4
3
|
recordRawFetchHeaders,
|
|
5
4
|
restoreHeadersPrototype,
|
|
6
5
|
getRawFetchHeaders,
|
|
7
|
-
} from './
|
|
6
|
+
} from './record-raw-headers'
|
|
8
7
|
|
|
9
8
|
const url = 'http://localhost'
|
|
10
9
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { FetchRequest, FetchResponse } from '../../../utils/
|
|
1
|
+
import { FetchRequest, FetchResponse } from '../../../utils/fetch-utils'
|
|
2
2
|
|
|
3
3
|
type HeaderTuple = [string, string]
|
|
4
4
|
type RawHeaders = Array<HeaderTuple>
|
|
@@ -71,7 +71,7 @@ function defineRawHeadersSymbol(headers: Headers, rawHeaders: RawHeaders) {
|
|
|
71
71
|
* h.append('x-custom', 'two')
|
|
72
72
|
* h[Symbol('headers map')] // Map { 'X-Custom' => 'one, two' }
|
|
73
73
|
*/
|
|
74
|
-
export function recordRawFetchHeaders() {
|
|
74
|
+
export function recordRawFetchHeaders(): () => void {
|
|
75
75
|
// Prevent patching the Headers prototype multiple times.
|
|
76
76
|
if (Reflect.get(Headers, kRestorePatches)) {
|
|
77
77
|
return Reflect.get(Headers, kRestorePatches)
|
|
@@ -255,6 +255,8 @@ export function recordRawFetchHeaders() {
|
|
|
255
255
|
Object.setPrototypeOf(FetchRequest.prototype, globalThis.Request.prototype)
|
|
256
256
|
Object.setPrototypeOf(FetchResponse, globalThis.Response)
|
|
257
257
|
Object.setPrototypeOf(FetchResponse.prototype, globalThis.Response.prototype)
|
|
258
|
+
|
|
259
|
+
return restoreHeadersPrototype
|
|
258
260
|
}
|
|
259
261
|
|
|
260
262
|
export function restoreHeadersPrototype() {
|
|
@@ -293,3 +295,28 @@ function inferRawHeaders(headers: HeadersInit): RawHeaders {
|
|
|
293
295
|
|
|
294
296
|
return Reflect.get(new Headers(headers), kRawHeaders)
|
|
295
297
|
}
|
|
298
|
+
|
|
299
|
+
export function copyRawHeaders(source: Headers, destination: Headers): void {
|
|
300
|
+
const rawHeaders = [...getRawFetchHeaders(source)]
|
|
301
|
+
|
|
302
|
+
if (rawHeaders.length === 0) {
|
|
303
|
+
return
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
/**
|
|
307
|
+
* @note Add headers from trhe destination that raw headers from the source
|
|
308
|
+
* don't have. Undici automatically appends a "Content-Type" header for responses
|
|
309
|
+
* and, for some reason, that change is not recorded. This preserves it.
|
|
310
|
+
*/
|
|
311
|
+
for (const [name, value] of destination) {
|
|
312
|
+
if (
|
|
313
|
+
rawHeaders.every(
|
|
314
|
+
(header) => header[0].toLowerCase() !== name.toLowerCase()
|
|
315
|
+
)
|
|
316
|
+
) {
|
|
317
|
+
rawHeaders.push([name, value])
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
defineRawHeadersSymbol(destination, rawHeaders)
|
|
322
|
+
}
|
|
@@ -1,29 +1,33 @@
|
|
|
1
|
-
import { Interceptor } from '../../
|
|
1
|
+
import { Interceptor } from '../../interceptor'
|
|
2
|
+
import {
|
|
3
|
+
WebSocketConnectionEvent,
|
|
4
|
+
type WebSocketEventMap,
|
|
5
|
+
} from '../../events/websocket'
|
|
2
6
|
import {
|
|
3
7
|
WebSocketClientConnectionProtocol,
|
|
4
8
|
WebSocketClientConnection,
|
|
5
9
|
type WebSocketClientEventMap,
|
|
6
|
-
} from './
|
|
10
|
+
} from './web-socket-client-connection'
|
|
7
11
|
import {
|
|
8
12
|
WebSocketServerConnectionProtocol,
|
|
9
13
|
WebSocketServerConnection,
|
|
10
14
|
type WebSocketServerEventMap,
|
|
11
|
-
} from './
|
|
12
|
-
import { WebSocketClassTransport } from './
|
|
15
|
+
} from './web-socket-server-connection'
|
|
16
|
+
import { WebSocketClassTransport } from './web-socket-class-transport'
|
|
13
17
|
import {
|
|
14
18
|
kClose,
|
|
15
19
|
kPassthroughPromise,
|
|
16
20
|
WebSocketOverride,
|
|
17
|
-
} from './
|
|
18
|
-
import { bindEvent } from './utils/
|
|
19
|
-
import { hasConfigurableGlobal } from '../../utils/
|
|
20
|
-
import {
|
|
21
|
-
import {
|
|
21
|
+
} from './web-socket-override'
|
|
22
|
+
import { bindEvent } from './utils/bind-event'
|
|
23
|
+
import { hasConfigurableGlobal } from '../../utils/has-configurable-global'
|
|
24
|
+
import { patchesRegistry } from '../../utils/patches-registry'
|
|
25
|
+
import { createLogger } from '../../utils/logger'
|
|
22
26
|
|
|
23
27
|
export {
|
|
24
28
|
type WebSocketData,
|
|
25
29
|
type WebSocketTransport,
|
|
26
|
-
} from './
|
|
30
|
+
} from './web-socket-transport'
|
|
27
31
|
export {
|
|
28
32
|
WebSocketClientEventMap,
|
|
29
33
|
WebSocketClientConnectionProtocol,
|
|
@@ -39,31 +43,7 @@ export {
|
|
|
39
43
|
CancelableMessageEvent,
|
|
40
44
|
} from './utils/events'
|
|
41
45
|
|
|
42
|
-
|
|
43
|
-
connection: [args: WebSocketConnectionData]
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
export type WebSocketConnectionData = {
|
|
47
|
-
/**
|
|
48
|
-
* The incoming WebSocket client connection.
|
|
49
|
-
*/
|
|
50
|
-
client: WebSocketClientConnection
|
|
51
|
-
|
|
52
|
-
/**
|
|
53
|
-
* The original WebSocket server connection.
|
|
54
|
-
*/
|
|
55
|
-
server: WebSocketServerConnection
|
|
56
|
-
|
|
57
|
-
/**
|
|
58
|
-
* The connection information.
|
|
59
|
-
*/
|
|
60
|
-
info: {
|
|
61
|
-
/**
|
|
62
|
-
* The protocols supported by the WebSocket client.
|
|
63
|
-
*/
|
|
64
|
-
protocols: string | Array<string> | undefined
|
|
65
|
-
}
|
|
66
|
-
}
|
|
46
|
+
const logger = createLogger('websocket')
|
|
67
47
|
|
|
68
48
|
/**
|
|
69
49
|
* Intercept the outgoing WebSocket connections created using
|
|
@@ -72,16 +52,12 @@ export type WebSocketConnectionData = {
|
|
|
72
52
|
export class WebSocketInterceptor extends Interceptor<WebSocketEventMap> {
|
|
73
53
|
static symbol = Symbol.for('websocket-interceptor')
|
|
74
54
|
|
|
75
|
-
|
|
76
|
-
super(WebSocketInterceptor.symbol)
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
protected checkEnvironment(): boolean {
|
|
55
|
+
protected predicate(): boolean {
|
|
80
56
|
return hasConfigurableGlobal('WebSocket')
|
|
81
57
|
}
|
|
82
58
|
|
|
83
59
|
protected setup(): void {
|
|
84
|
-
|
|
60
|
+
logger.verbose('setup')
|
|
85
61
|
|
|
86
62
|
const WebSocketProxy = new Proxy(globalThis.WebSocket, {
|
|
87
63
|
construct: (
|
|
@@ -91,6 +67,11 @@ export class WebSocketInterceptor extends Interceptor<WebSocketEventMap> {
|
|
|
91
67
|
) => {
|
|
92
68
|
const [url, protocols] = args
|
|
93
69
|
|
|
70
|
+
logger.info('connection intercepted %o', {
|
|
71
|
+
url: url.toString(),
|
|
72
|
+
protocols,
|
|
73
|
+
})
|
|
74
|
+
|
|
94
75
|
const createConnection = (): WebSocket => {
|
|
95
76
|
return Reflect.construct(target, args, newTarget)
|
|
96
77
|
}
|
|
@@ -118,13 +99,15 @@ export class WebSocketInterceptor extends Interceptor<WebSocketEventMap> {
|
|
|
118
99
|
// The "globalThis.WebSocket" class stands for
|
|
119
100
|
// the client-side connection. Assume it's established
|
|
120
101
|
// as soon as the WebSocket instance is constructed.
|
|
121
|
-
await
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
102
|
+
await this.emitter.emitAsPromise(
|
|
103
|
+
new WebSocketConnectionEvent({
|
|
104
|
+
client: new WebSocketClientConnection(socket, transport),
|
|
105
|
+
server,
|
|
106
|
+
info: {
|
|
107
|
+
protocols,
|
|
108
|
+
},
|
|
109
|
+
})
|
|
110
|
+
)
|
|
128
111
|
|
|
129
112
|
if (hasConnectionListeners) {
|
|
130
113
|
socket[kPassthroughPromise].resolve(false)
|
|
@@ -173,12 +156,12 @@ export class WebSocketInterceptor extends Interceptor<WebSocketEventMap> {
|
|
|
173
156
|
},
|
|
174
157
|
})
|
|
175
158
|
|
|
176
|
-
logger.
|
|
159
|
+
logger.verbose('patching global WebSocket...')
|
|
177
160
|
|
|
178
161
|
this.subscriptions.push(
|
|
179
162
|
patchesRegistry.applyPatch(globalThis, 'WebSocket', () => WebSocketProxy)
|
|
180
163
|
)
|
|
181
164
|
|
|
182
|
-
logger.
|
|
165
|
+
logger.verbose('global WebSocket patched: %s', globalThis.WebSocket.name)
|
|
183
166
|
}
|
|
184
167
|
}
|
package/src/interceptors/WebSocket/{WebSocketClassTransport.ts → web-socket-class-transport.ts}
RENAMED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import { bindEvent } from './utils/
|
|
1
|
+
import { bindEvent } from './utils/bind-event'
|
|
2
2
|
import {
|
|
3
3
|
StrictEventListenerOrEventListenerObject,
|
|
4
4
|
WebSocketData,
|
|
5
5
|
WebSocketTransport,
|
|
6
6
|
WebSocketTransportEventMap,
|
|
7
|
-
} from './
|
|
8
|
-
import { kOnSend, kClose, WebSocketOverride } from './
|
|
7
|
+
} from './web-socket-transport'
|
|
8
|
+
import { kOnSend, kClose, WebSocketOverride } from './web-socket-override'
|
|
9
9
|
import { CancelableMessageEvent, CloseEvent } from './utils/events'
|
|
10
10
|
|
|
11
11
|
/**
|
package/src/interceptors/WebSocket/{WebSocketClientConnection.ts → web-socket-client-connection.ts}
RENAMED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import type { WebSocketData, WebSocketTransport } from './
|
|
2
|
-
import type { WebSocketEventListener } from './
|
|
3
|
-
import { bindEvent } from './utils/
|
|
1
|
+
import type { WebSocketData, WebSocketTransport } from './web-socket-transport'
|
|
2
|
+
import type { WebSocketEventListener } from './web-socket-override'
|
|
3
|
+
import { bindEvent } from './utils/bind-event'
|
|
4
4
|
import { CancelableMessageEvent, CloseEvent } from './utils/events'
|
|
5
|
-
import { createRequestId } from '../../
|
|
5
|
+
import { createRequestId } from '../../create-request-id'
|
|
6
6
|
|
|
7
7
|
const kEmitter = Symbol('kEmitter')
|
|
8
8
|
const kBoundListener = Symbol('kBoundListener')
|
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
import { invariant } from 'outvariant'
|
|
2
|
-
import {
|
|
3
|
-
import
|
|
4
|
-
import { bindEvent } from './utils/bindEvent'
|
|
2
|
+
import type { WebSocketData } from './web-socket-transport'
|
|
3
|
+
import { bindEvent } from './utils/bind-event'
|
|
5
4
|
import { CloseEvent } from './utils/events'
|
|
6
|
-
import { resolveWebSocketUrl } from '../../utils/
|
|
5
|
+
import { resolveWebSocketUrl } from '../../utils/resolve-web-socket-url'
|
|
7
6
|
|
|
8
7
|
export type WebSocketEventListener<
|
|
9
8
|
EventType extends WebSocketEventMap[keyof WebSocketEventMap] = Event,
|
|
@@ -40,7 +39,7 @@ export class WebSocketOverride extends EventTarget implements WebSocket {
|
|
|
40
39
|
private _onerror: WebSocketEventListener | null = null
|
|
41
40
|
private _onclose: WebSocketEventListener<CloseEvent> | null = null
|
|
42
41
|
|
|
43
|
-
private [kPassthroughPromise]:
|
|
42
|
+
private [kPassthroughPromise]: PromiseWithResolvers<boolean>
|
|
44
43
|
private [kOnSend]?: (data: WebSocketData) => void
|
|
45
44
|
|
|
46
45
|
constructor(url: string | URL, protocols?: string | Array<string>) {
|
|
@@ -52,10 +51,10 @@ export class WebSocketOverride extends EventTarget implements WebSocket {
|
|
|
52
51
|
this.readyState = this.CONNECTING
|
|
53
52
|
this.bufferedAmount = 0
|
|
54
53
|
|
|
55
|
-
this[kPassthroughPromise] =
|
|
54
|
+
this[kPassthroughPromise] = Promise.withResolvers<boolean>()
|
|
56
55
|
|
|
57
56
|
queueMicrotask(async () => {
|
|
58
|
-
if (await this[kPassthroughPromise]) {
|
|
57
|
+
if (await this[kPassthroughPromise].promise) {
|
|
59
58
|
return
|
|
60
59
|
}
|
|
61
60
|
|
package/src/interceptors/WebSocket/{WebSocketServerConnection.ts → web-socket-server-connection.ts}
RENAMED
|
@@ -3,10 +3,10 @@ import {
|
|
|
3
3
|
kClose,
|
|
4
4
|
WebSocketEventListener,
|
|
5
5
|
WebSocketOverride,
|
|
6
|
-
} from './
|
|
7
|
-
import type { WebSocketData } from './
|
|
8
|
-
import type { WebSocketClassTransport } from './
|
|
9
|
-
import { bindEvent } from './utils/
|
|
6
|
+
} from './web-socket-override'
|
|
7
|
+
import type { WebSocketData } from './web-socket-transport'
|
|
8
|
+
import type { WebSocketClassTransport } from './web-socket-class-transport'
|
|
9
|
+
import { bindEvent } from './utils/bind-event'
|
|
10
10
|
import {
|
|
11
11
|
CancelableMessageEvent,
|
|
12
12
|
CancelableCloseEvent,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { CloseEvent } from './utils/events'
|
|
2
2
|
|
|
3
|
-
export type WebSocketData = string |
|
|
3
|
+
export type WebSocketData = string | ArrayBuffer | Blob | ArrayBufferView<ArrayBuffer>
|
|
4
4
|
|
|
5
5
|
export type WebSocketTransportEventMap = {
|
|
6
6
|
incoming: MessageEvent<WebSocketData>
|