@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,268 +0,0 @@
|
|
|
1
|
-
import { urlToHttpOptions } from 'node:url'
|
|
2
|
-
import {
|
|
3
|
-
Agent as HttpAgent,
|
|
4
|
-
globalAgent as httpGlobalAgent,
|
|
5
|
-
IncomingMessage,
|
|
6
|
-
} from 'node:http'
|
|
7
|
-
import {
|
|
8
|
-
RequestOptions,
|
|
9
|
-
Agent as HttpsAgent,
|
|
10
|
-
globalAgent as httpsGlobalAgent,
|
|
11
|
-
} from 'node:https'
|
|
12
|
-
import {
|
|
13
|
-
/**
|
|
14
|
-
* @note Use the Node.js URL instead of the global URL
|
|
15
|
-
* because environments like JSDOM may override the global,
|
|
16
|
-
* breaking the compatibility with Node.js.
|
|
17
|
-
* @see https://github.com/node-fetch/node-fetch/issues/1376#issuecomment-966435555
|
|
18
|
-
*/
|
|
19
|
-
URL,
|
|
20
|
-
Url as LegacyURL,
|
|
21
|
-
parse as parseUrl,
|
|
22
|
-
} from 'node:url'
|
|
23
|
-
import { Logger } from '@open-draft/logger'
|
|
24
|
-
import {
|
|
25
|
-
ResolvedRequestOptions,
|
|
26
|
-
getUrlByRequestOptions,
|
|
27
|
-
} from '../../../utils/getUrlByRequestOptions'
|
|
28
|
-
import { cloneObject } from '../../../utils/cloneObject'
|
|
29
|
-
import { isObject } from '../../../utils/isObject'
|
|
30
|
-
|
|
31
|
-
const logger = new Logger('http normalizeClientRequestArgs')
|
|
32
|
-
|
|
33
|
-
export type HttpRequestCallback = (response: IncomingMessage) => void
|
|
34
|
-
|
|
35
|
-
export type ClientRequestArgs =
|
|
36
|
-
// Request without any arguments is also possible.
|
|
37
|
-
| []
|
|
38
|
-
| [string | URL | LegacyURL, HttpRequestCallback?]
|
|
39
|
-
| [string | URL | LegacyURL, RequestOptions, HttpRequestCallback?]
|
|
40
|
-
| [RequestOptions, HttpRequestCallback?]
|
|
41
|
-
|
|
42
|
-
function resolveRequestOptions(
|
|
43
|
-
args: ClientRequestArgs,
|
|
44
|
-
url: URL
|
|
45
|
-
): RequestOptions {
|
|
46
|
-
// Calling `fetch` provides only URL to `ClientRequest`
|
|
47
|
-
// without any `RequestOptions` or callback.
|
|
48
|
-
if (typeof args[1] === 'undefined' || typeof args[1] === 'function') {
|
|
49
|
-
logger.info('request options not provided, deriving from the url', url)
|
|
50
|
-
return urlToHttpOptions(url)
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
if (args[1]) {
|
|
54
|
-
logger.info('has custom RequestOptions!', args[1])
|
|
55
|
-
const requestOptionsFromUrl = urlToHttpOptions(url)
|
|
56
|
-
|
|
57
|
-
logger.info('derived RequestOptions from the URL:', requestOptionsFromUrl)
|
|
58
|
-
|
|
59
|
-
/**
|
|
60
|
-
* Clone the request options to lock their state
|
|
61
|
-
* at the moment they are provided to `ClientRequest`.
|
|
62
|
-
* @see https://github.com/mswjs/interceptors/issues/86
|
|
63
|
-
*/
|
|
64
|
-
logger.info('cloning RequestOptions...')
|
|
65
|
-
const clonedRequestOptions = cloneObject(args[1])
|
|
66
|
-
logger.info('successfully cloned RequestOptions!', clonedRequestOptions)
|
|
67
|
-
|
|
68
|
-
return {
|
|
69
|
-
...requestOptionsFromUrl,
|
|
70
|
-
...clonedRequestOptions,
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
logger.info('using an empty object as request options')
|
|
75
|
-
return {} as RequestOptions
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
/**
|
|
79
|
-
* Overrides the given `URL` instance with the explicit properties provided
|
|
80
|
-
* on the `RequestOptions` object. The options object takes precedence,
|
|
81
|
-
* and will replace URL properties like "host", "path", and "port", if specified.
|
|
82
|
-
*/
|
|
83
|
-
function overrideUrlByRequestOptions(url: URL, options: RequestOptions): URL {
|
|
84
|
-
url.host = options.host || url.host
|
|
85
|
-
url.hostname = options.hostname || url.hostname
|
|
86
|
-
url.port = options.port ? options.port.toString() : url.port
|
|
87
|
-
|
|
88
|
-
if (options.path) {
|
|
89
|
-
const parsedOptionsPath = parseUrl(options.path, false)
|
|
90
|
-
url.pathname = parsedOptionsPath.pathname || ''
|
|
91
|
-
url.search = parsedOptionsPath.search || ''
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
return url
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
function resolveCallback(
|
|
98
|
-
args: ClientRequestArgs
|
|
99
|
-
): HttpRequestCallback | undefined {
|
|
100
|
-
return typeof args[1] === 'function' ? args[1] : args[2]
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
export type NormalizedClientRequestArgs = [
|
|
104
|
-
url: URL,
|
|
105
|
-
options: ResolvedRequestOptions,
|
|
106
|
-
callback?: HttpRequestCallback
|
|
107
|
-
]
|
|
108
|
-
|
|
109
|
-
/**
|
|
110
|
-
* Normalizes parameters given to a `http.request` call
|
|
111
|
-
* so it always has a `URL` and `RequestOptions`.
|
|
112
|
-
*/
|
|
113
|
-
export function normalizeClientRequestArgs(
|
|
114
|
-
defaultProtocol: string,
|
|
115
|
-
args: ClientRequestArgs
|
|
116
|
-
): NormalizedClientRequestArgs {
|
|
117
|
-
let url: URL
|
|
118
|
-
let options: ResolvedRequestOptions
|
|
119
|
-
let callback: HttpRequestCallback | undefined
|
|
120
|
-
|
|
121
|
-
logger.info('arguments', args)
|
|
122
|
-
logger.info('using default protocol:', defaultProtocol)
|
|
123
|
-
|
|
124
|
-
// Support "http.request()" calls without any arguments.
|
|
125
|
-
// That call results in a "GET http://localhost" request.
|
|
126
|
-
if (args.length === 0) {
|
|
127
|
-
const url = new URL('http://localhost')
|
|
128
|
-
const options = resolveRequestOptions(args, url)
|
|
129
|
-
return [url, options]
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
// Convert a url string into a URL instance
|
|
133
|
-
// and derive request options from it.
|
|
134
|
-
if (typeof args[0] === 'string') {
|
|
135
|
-
logger.info('first argument is a location string:', args[0])
|
|
136
|
-
|
|
137
|
-
url = new URL(args[0])
|
|
138
|
-
logger.info('created a url:', url)
|
|
139
|
-
|
|
140
|
-
const requestOptionsFromUrl = urlToHttpOptions(url)
|
|
141
|
-
logger.info('request options from url:', requestOptionsFromUrl)
|
|
142
|
-
|
|
143
|
-
options = resolveRequestOptions(args, url)
|
|
144
|
-
logger.info('resolved request options:', options)
|
|
145
|
-
|
|
146
|
-
callback = resolveCallback(args)
|
|
147
|
-
}
|
|
148
|
-
// Handle a given URL instance as-is
|
|
149
|
-
// and derive request options from it.
|
|
150
|
-
else if (args[0] instanceof URL) {
|
|
151
|
-
url = args[0]
|
|
152
|
-
logger.info('first argument is a URL:', url)
|
|
153
|
-
|
|
154
|
-
// Check if the second provided argument is RequestOptions.
|
|
155
|
-
// If it is, check if "options.path" was set and rewrite it
|
|
156
|
-
// on the input URL.
|
|
157
|
-
// Do this before resolving options from the URL below
|
|
158
|
-
// to prevent query string from being duplicated in the path.
|
|
159
|
-
if (typeof args[1] !== 'undefined' && isObject<RequestOptions>(args[1])) {
|
|
160
|
-
url = overrideUrlByRequestOptions(url, args[1])
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
options = resolveRequestOptions(args, url)
|
|
164
|
-
logger.info('derived request options:', options)
|
|
165
|
-
|
|
166
|
-
callback = resolveCallback(args)
|
|
167
|
-
}
|
|
168
|
-
// Handle a legacy URL instance and re-normalize from either a RequestOptions object
|
|
169
|
-
// or a WHATWG URL.
|
|
170
|
-
else if ('hash' in args[0] && !('method' in args[0])) {
|
|
171
|
-
const [legacyUrl] = args
|
|
172
|
-
logger.info('first argument is a legacy URL:', legacyUrl)
|
|
173
|
-
|
|
174
|
-
if (legacyUrl.hostname === null) {
|
|
175
|
-
/**
|
|
176
|
-
* We are dealing with a relative url, so use the path as an "option" and
|
|
177
|
-
* merge in any existing options, giving priority to existing options -- i.e. a path in any
|
|
178
|
-
* existing options will take precedence over the one contained in the url. This is consistent
|
|
179
|
-
* with the behaviour in ClientRequest.
|
|
180
|
-
* @see https://github.com/nodejs/node/blob/d84f1312915fe45fe0febe888db692c74894c382/lib/_http_client.js#L122
|
|
181
|
-
*/
|
|
182
|
-
logger.info('given legacy URL is relative (no hostname)')
|
|
183
|
-
|
|
184
|
-
return isObject(args[1])
|
|
185
|
-
? normalizeClientRequestArgs(defaultProtocol, [
|
|
186
|
-
{ path: legacyUrl.path, ...args[1] },
|
|
187
|
-
args[2],
|
|
188
|
-
])
|
|
189
|
-
: normalizeClientRequestArgs(defaultProtocol, [
|
|
190
|
-
{ path: legacyUrl.path },
|
|
191
|
-
args[1] as HttpRequestCallback,
|
|
192
|
-
])
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
logger.info('given legacy url is absolute')
|
|
196
|
-
|
|
197
|
-
// We are dealing with an absolute URL, so convert to WHATWG and try again.
|
|
198
|
-
const resolvedUrl = new URL(legacyUrl.href)
|
|
199
|
-
|
|
200
|
-
return args[1] === undefined
|
|
201
|
-
? normalizeClientRequestArgs(defaultProtocol, [resolvedUrl])
|
|
202
|
-
: typeof args[1] === 'function'
|
|
203
|
-
? normalizeClientRequestArgs(defaultProtocol, [resolvedUrl, args[1]])
|
|
204
|
-
: normalizeClientRequestArgs(defaultProtocol, [
|
|
205
|
-
resolvedUrl,
|
|
206
|
-
args[1],
|
|
207
|
-
args[2],
|
|
208
|
-
])
|
|
209
|
-
}
|
|
210
|
-
// Handle a given "RequestOptions" object as-is
|
|
211
|
-
// and derive the URL instance from it.
|
|
212
|
-
else if (isObject(args[0])) {
|
|
213
|
-
options = { ...(args[0] as any) }
|
|
214
|
-
logger.info('first argument is RequestOptions:', options)
|
|
215
|
-
|
|
216
|
-
// When handling a "RequestOptions" object without an explicit "protocol",
|
|
217
|
-
// infer the protocol from the request issuing module (http/https).
|
|
218
|
-
options.protocol = options.protocol || defaultProtocol
|
|
219
|
-
logger.info('normalized request options:', options)
|
|
220
|
-
|
|
221
|
-
url = getUrlByRequestOptions(options)
|
|
222
|
-
logger.info('created a URL from RequestOptions:', url.href)
|
|
223
|
-
|
|
224
|
-
callback = resolveCallback(args)
|
|
225
|
-
} else {
|
|
226
|
-
throw new Error(
|
|
227
|
-
`Failed to construct ClientRequest with these parameters: ${args}`
|
|
228
|
-
)
|
|
229
|
-
}
|
|
230
|
-
|
|
231
|
-
options.protocol = options.protocol || url.protocol
|
|
232
|
-
options.method = options.method || 'GET'
|
|
233
|
-
|
|
234
|
-
/**
|
|
235
|
-
* Ensure that the default Agent is always set.
|
|
236
|
-
* This prevents the protocol mismatch for requests with { agent: false },
|
|
237
|
-
* where the global Agent is inferred.
|
|
238
|
-
* @see https://github.com/mswjs/msw/issues/1150
|
|
239
|
-
* @see https://github.com/nodejs/node/blob/418ff70b810f0e7112d48baaa72932a56cfa213b/lib/_http_client.js#L130
|
|
240
|
-
* @see https://github.com/nodejs/node/blob/418ff70b810f0e7112d48baaa72932a56cfa213b/lib/_http_client.js#L157-L159
|
|
241
|
-
*/
|
|
242
|
-
if (!options._defaultAgent) {
|
|
243
|
-
logger.info(
|
|
244
|
-
'has no default agent, setting the default agent for "%s"',
|
|
245
|
-
options.protocol
|
|
246
|
-
)
|
|
247
|
-
|
|
248
|
-
options._defaultAgent =
|
|
249
|
-
options.protocol === 'https:' ? httpsGlobalAgent : httpGlobalAgent
|
|
250
|
-
}
|
|
251
|
-
|
|
252
|
-
logger.info('successfully resolved url:', url.href)
|
|
253
|
-
logger.info('successfully resolved options:', options)
|
|
254
|
-
logger.info('successfully resolved callback:', callback)
|
|
255
|
-
|
|
256
|
-
/**
|
|
257
|
-
* @note If the user-provided URL is not a valid URL in Node.js,
|
|
258
|
-
* (e.g. the one provided by the JSDOM polyfills), case it to
|
|
259
|
-
* string. Otherwise, this throws on Node.js incompatibility
|
|
260
|
-
* (`ERR_INVALID_ARG_TYPE` on the connection listener)
|
|
261
|
-
* @see https://github.com/node-fetch/node-fetch/issues/1376#issuecomment-966435555
|
|
262
|
-
*/
|
|
263
|
-
if (!(url instanceof URL)) {
|
|
264
|
-
url = (url as any).toString()
|
|
265
|
-
}
|
|
266
|
-
|
|
267
|
-
return [url, options, callback]
|
|
268
|
-
}
|
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
import type { Socket } from 'node:net'
|
|
2
|
-
import { HTTPParser } from '_http_common'
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* @see https://github.com/nodejs/node/blob/f3adc11e37b8bfaaa026ea85c1cf22e3a0e29ae9/lib/_http_common.js#L180
|
|
6
|
-
*/
|
|
7
|
-
export function freeParser(parser: HTTPParser<any>, socket?: Socket): void {
|
|
8
|
-
if (parser._consumed) {
|
|
9
|
-
parser.unconsume()
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
parser._headers = []
|
|
13
|
-
parser._url = ''
|
|
14
|
-
parser.socket = null
|
|
15
|
-
parser.incoming = null
|
|
16
|
-
parser.outgoing = null
|
|
17
|
-
parser.maxHeaderPairs = 2000
|
|
18
|
-
parser._consumed = false
|
|
19
|
-
parser.onIncoming = null
|
|
20
|
-
|
|
21
|
-
parser[HTTPParser.kOnHeaders] = null
|
|
22
|
-
parser[HTTPParser.kOnHeadersComplete] = null
|
|
23
|
-
parser[HTTPParser.kOnMessageBegin] = null
|
|
24
|
-
parser[HTTPParser.kOnMessageComplete] = null
|
|
25
|
-
parser[HTTPParser.kOnBody] = null
|
|
26
|
-
parser[HTTPParser.kOnExecute] = null
|
|
27
|
-
parser[HTTPParser.kOnTimeout] = null
|
|
28
|
-
|
|
29
|
-
parser.remove()
|
|
30
|
-
parser.free()
|
|
31
|
-
|
|
32
|
-
if (socket) {
|
|
33
|
-
/**
|
|
34
|
-
* @note Unassigning the socket's parser will fail this assertion
|
|
35
|
-
* if there's still some data being processed on the socket:
|
|
36
|
-
* @see https://github.com/nodejs/node/blob/4e1f39b678b37017ac9baa0971e3aeecd3b67b51/lib/_http_client.js#L613
|
|
37
|
-
*/
|
|
38
|
-
if (socket.destroyed) {
|
|
39
|
-
// @ts-expect-error Node.js internals.
|
|
40
|
-
socket.parser = null
|
|
41
|
-
} else {
|
|
42
|
-
socket.once('end', () => {
|
|
43
|
-
// @ts-expect-error Node.js internals.
|
|
44
|
-
socket.parser = null
|
|
45
|
-
})
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
}
|
|
@@ -1,264 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @vitest-environment node
|
|
3
|
-
*/
|
|
4
|
-
import { Socket } from 'node:net'
|
|
5
|
-
import { vi, it, expect } from 'vitest'
|
|
6
|
-
import { MockSocket } from './MockSocket'
|
|
7
|
-
|
|
8
|
-
it(`keeps the socket connecting until it's destroyed`, () => {
|
|
9
|
-
const socket = new MockSocket({
|
|
10
|
-
write: vi.fn(),
|
|
11
|
-
read: vi.fn(),
|
|
12
|
-
})
|
|
13
|
-
|
|
14
|
-
expect(socket.connecting).toBe(true)
|
|
15
|
-
|
|
16
|
-
socket.destroy()
|
|
17
|
-
expect(socket.connecting).toBe(false)
|
|
18
|
-
})
|
|
19
|
-
|
|
20
|
-
it('calls the "write" on "socket.write()"', () => {
|
|
21
|
-
const writeCallback = vi.fn()
|
|
22
|
-
const socket = new MockSocket({
|
|
23
|
-
write: writeCallback,
|
|
24
|
-
read: vi.fn(),
|
|
25
|
-
})
|
|
26
|
-
|
|
27
|
-
socket.write()
|
|
28
|
-
expect(writeCallback).toHaveBeenCalledWith(undefined, undefined, undefined)
|
|
29
|
-
})
|
|
30
|
-
|
|
31
|
-
it('calls the "write" on "socket.write(chunk)"', () => {
|
|
32
|
-
const writeCallback = vi.fn()
|
|
33
|
-
const socket = new MockSocket({
|
|
34
|
-
write: writeCallback,
|
|
35
|
-
read: vi.fn(),
|
|
36
|
-
})
|
|
37
|
-
|
|
38
|
-
socket.write('hello')
|
|
39
|
-
expect(writeCallback).toHaveBeenCalledWith('hello', undefined, undefined)
|
|
40
|
-
})
|
|
41
|
-
|
|
42
|
-
it('calls the "write" on "socket.write(chunk, encoding)"', () => {
|
|
43
|
-
const writeCallback = vi.fn()
|
|
44
|
-
const socket = new MockSocket({
|
|
45
|
-
write: writeCallback,
|
|
46
|
-
read: vi.fn(),
|
|
47
|
-
})
|
|
48
|
-
|
|
49
|
-
socket.write('hello', 'utf8')
|
|
50
|
-
expect(writeCallback).toHaveBeenCalledWith('hello', 'utf8', undefined)
|
|
51
|
-
})
|
|
52
|
-
|
|
53
|
-
it('calls the "write" on "socket.write(chunk, encoding, callback)"', () => {
|
|
54
|
-
const writeCallback = vi.fn()
|
|
55
|
-
const socket = new MockSocket({
|
|
56
|
-
write: writeCallback,
|
|
57
|
-
read: vi.fn(),
|
|
58
|
-
})
|
|
59
|
-
|
|
60
|
-
const callback = vi.fn()
|
|
61
|
-
socket.write('hello', 'utf8', callback)
|
|
62
|
-
expect(writeCallback).toHaveBeenCalledWith('hello', 'utf8', callback)
|
|
63
|
-
})
|
|
64
|
-
|
|
65
|
-
it('calls the "write" on "socket.end()"', () => {
|
|
66
|
-
const writeCallback = vi.fn()
|
|
67
|
-
const socket = new MockSocket({
|
|
68
|
-
write: writeCallback,
|
|
69
|
-
read: vi.fn(),
|
|
70
|
-
})
|
|
71
|
-
|
|
72
|
-
socket.end()
|
|
73
|
-
expect(writeCallback).toHaveBeenCalledWith(undefined, undefined, undefined)
|
|
74
|
-
})
|
|
75
|
-
|
|
76
|
-
it('calls the "write" on "socket.end(chunk)"', () => {
|
|
77
|
-
const writeCallback = vi.fn()
|
|
78
|
-
const socket = new MockSocket({
|
|
79
|
-
write: writeCallback,
|
|
80
|
-
read: vi.fn(),
|
|
81
|
-
})
|
|
82
|
-
|
|
83
|
-
socket.end('final')
|
|
84
|
-
expect(writeCallback).toHaveBeenCalledWith('final', undefined, undefined)
|
|
85
|
-
})
|
|
86
|
-
|
|
87
|
-
it('calls the "write" on "socket.end(chunk, encoding)"', () => {
|
|
88
|
-
const writeCallback = vi.fn()
|
|
89
|
-
const socket = new MockSocket({
|
|
90
|
-
write: writeCallback,
|
|
91
|
-
read: vi.fn(),
|
|
92
|
-
})
|
|
93
|
-
|
|
94
|
-
socket.end('final', 'utf8')
|
|
95
|
-
expect(writeCallback).toHaveBeenCalledWith('final', 'utf8', undefined)
|
|
96
|
-
})
|
|
97
|
-
|
|
98
|
-
it('calls the "write" on "socket.end(chunk, encoding, callback)"', () => {
|
|
99
|
-
const writeCallback = vi.fn()
|
|
100
|
-
const socket = new MockSocket({
|
|
101
|
-
write: writeCallback,
|
|
102
|
-
read: vi.fn(),
|
|
103
|
-
})
|
|
104
|
-
|
|
105
|
-
const callback = vi.fn()
|
|
106
|
-
socket.end('final', 'utf8', callback)
|
|
107
|
-
expect(writeCallback).toHaveBeenCalledWith('final', 'utf8', callback)
|
|
108
|
-
})
|
|
109
|
-
|
|
110
|
-
it('calls the "write" on "socket.end()" without any arguments', () => {
|
|
111
|
-
const writeCallback = vi.fn()
|
|
112
|
-
const socket = new MockSocket({
|
|
113
|
-
write: writeCallback,
|
|
114
|
-
read: vi.fn(),
|
|
115
|
-
})
|
|
116
|
-
|
|
117
|
-
socket.end()
|
|
118
|
-
expect(writeCallback).toHaveBeenCalledWith(undefined, undefined, undefined)
|
|
119
|
-
})
|
|
120
|
-
|
|
121
|
-
it('emits "finished" on .end() without any arguments', async () => {
|
|
122
|
-
const finishListener = vi.fn()
|
|
123
|
-
const socket = new MockSocket({
|
|
124
|
-
write: vi.fn(),
|
|
125
|
-
read: vi.fn(),
|
|
126
|
-
})
|
|
127
|
-
socket.on('finish', finishListener)
|
|
128
|
-
socket.end()
|
|
129
|
-
|
|
130
|
-
await vi.waitFor(() => {
|
|
131
|
-
expect(finishListener).toHaveBeenCalledTimes(1)
|
|
132
|
-
})
|
|
133
|
-
})
|
|
134
|
-
|
|
135
|
-
it('calls the "read" on "socket.read(chunk)"', () => {
|
|
136
|
-
const readCallback = vi.fn()
|
|
137
|
-
const socket = new MockSocket({
|
|
138
|
-
write: vi.fn(),
|
|
139
|
-
read: readCallback,
|
|
140
|
-
})
|
|
141
|
-
|
|
142
|
-
socket.push('hello')
|
|
143
|
-
expect(readCallback).toHaveBeenCalledWith('hello', undefined)
|
|
144
|
-
})
|
|
145
|
-
|
|
146
|
-
it('calls the "read" on "socket.read(chunk, encoding)"', () => {
|
|
147
|
-
const readCallback = vi.fn()
|
|
148
|
-
const socket = new MockSocket({
|
|
149
|
-
write: vi.fn(),
|
|
150
|
-
read: readCallback,
|
|
151
|
-
})
|
|
152
|
-
|
|
153
|
-
socket.push('world', 'utf8')
|
|
154
|
-
expect(readCallback).toHaveBeenCalledWith('world', 'utf8')
|
|
155
|
-
})
|
|
156
|
-
|
|
157
|
-
it('calls the "read" on "socket.read(null)"', () => {
|
|
158
|
-
const readCallback = vi.fn()
|
|
159
|
-
const socket = new MockSocket({
|
|
160
|
-
write: vi.fn(),
|
|
161
|
-
read: readCallback,
|
|
162
|
-
})
|
|
163
|
-
|
|
164
|
-
socket.push(null)
|
|
165
|
-
expect(readCallback).toHaveBeenCalledWith(null, undefined)
|
|
166
|
-
})
|
|
167
|
-
|
|
168
|
-
it('updates the writable state on "socket.end()"', async () => {
|
|
169
|
-
const finishListener = vi.fn()
|
|
170
|
-
const endListener = vi.fn()
|
|
171
|
-
const socket = new MockSocket({
|
|
172
|
-
write: vi.fn(),
|
|
173
|
-
read: vi.fn(),
|
|
174
|
-
})
|
|
175
|
-
socket.on('finish', finishListener)
|
|
176
|
-
socket.on('end', endListener)
|
|
177
|
-
|
|
178
|
-
expect(socket.writable).toBe(true)
|
|
179
|
-
expect(socket.writableEnded).toBe(false)
|
|
180
|
-
expect(socket.writableFinished).toBe(false)
|
|
181
|
-
|
|
182
|
-
socket.write('hello')
|
|
183
|
-
// Finish the writable stream.
|
|
184
|
-
socket.end()
|
|
185
|
-
|
|
186
|
-
expect(socket.writable).toBe(false)
|
|
187
|
-
expect(socket.writableEnded).toBe(true)
|
|
188
|
-
|
|
189
|
-
// The "finish" event is emitted when writable is done.
|
|
190
|
-
// I.e. "socket.end()" is called.
|
|
191
|
-
await vi.waitFor(() => {
|
|
192
|
-
expect(finishListener).toHaveBeenCalledTimes(1)
|
|
193
|
-
})
|
|
194
|
-
expect(socket.writableFinished).toBe(true)
|
|
195
|
-
})
|
|
196
|
-
|
|
197
|
-
it('updates the readable state on "socket.push(null)"', async () => {
|
|
198
|
-
const endListener = vi.fn()
|
|
199
|
-
const socket = new MockSocket({
|
|
200
|
-
write: vi.fn(),
|
|
201
|
-
read: vi.fn(),
|
|
202
|
-
})
|
|
203
|
-
socket.on('end', endListener)
|
|
204
|
-
|
|
205
|
-
expect(socket.readable).toBe(true)
|
|
206
|
-
expect(socket.readableEnded).toBe(false)
|
|
207
|
-
|
|
208
|
-
socket.push('hello')
|
|
209
|
-
socket.push(null)
|
|
210
|
-
|
|
211
|
-
expect(socket.readable).toBe(true)
|
|
212
|
-
expect(socket.readableEnded).toBe(false)
|
|
213
|
-
|
|
214
|
-
// Read the data to free the buffer and
|
|
215
|
-
// make Socket emit "end".
|
|
216
|
-
socket.read()
|
|
217
|
-
|
|
218
|
-
await vi.waitFor(() => {
|
|
219
|
-
expect(endListener).toHaveBeenCalledTimes(1)
|
|
220
|
-
})
|
|
221
|
-
expect(socket.readable).toBe(false)
|
|
222
|
-
expect(socket.readableEnded).toBe(true)
|
|
223
|
-
})
|
|
224
|
-
|
|
225
|
-
it('updates the readable/writable state on "socket.destroy()"', async () => {
|
|
226
|
-
const finishListener = vi.fn()
|
|
227
|
-
const endListener = vi.fn()
|
|
228
|
-
const closeListener = vi.fn()
|
|
229
|
-
const socket = new MockSocket({
|
|
230
|
-
write: vi.fn(),
|
|
231
|
-
read: vi.fn(),
|
|
232
|
-
})
|
|
233
|
-
socket.on('finish', finishListener)
|
|
234
|
-
socket.on('end', endListener)
|
|
235
|
-
socket.on('close', closeListener)
|
|
236
|
-
|
|
237
|
-
expect(socket.writable).toBe(true)
|
|
238
|
-
expect(socket.writableEnded).toBe(false)
|
|
239
|
-
expect(socket.writableFinished).toBe(false)
|
|
240
|
-
expect(socket.readable).toBe(true)
|
|
241
|
-
|
|
242
|
-
socket.destroy()
|
|
243
|
-
|
|
244
|
-
expect(socket.writable).toBe(false)
|
|
245
|
-
// The ".end()" wasn't called.
|
|
246
|
-
expect(socket.writableEnded).toBe(false)
|
|
247
|
-
expect(socket.writableFinished).toBe(false)
|
|
248
|
-
expect(socket.readable).toBe(false)
|
|
249
|
-
|
|
250
|
-
await vi.waitFor(() => {
|
|
251
|
-
expect(closeListener).toHaveBeenCalledTimes(1)
|
|
252
|
-
})
|
|
253
|
-
|
|
254
|
-
// Neither "finish" nor "end" events are emitted
|
|
255
|
-
// when you destroy the stream. If you want those,
|
|
256
|
-
// call ".end()", then destroy the stream.
|
|
257
|
-
expect(finishListener).not.toHaveBeenCalled()
|
|
258
|
-
expect(endListener).not.toHaveBeenCalled()
|
|
259
|
-
expect(socket.writableFinished).toBe(false)
|
|
260
|
-
|
|
261
|
-
// The "end" event was never emitted so "readableEnded"
|
|
262
|
-
// remains false.
|
|
263
|
-
expect(socket.readableEnded).toBe(false)
|
|
264
|
-
})
|
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
import net from 'node:net'
|
|
2
|
-
import {
|
|
3
|
-
normalizeSocketWriteArgs,
|
|
4
|
-
type WriteArgs,
|
|
5
|
-
type WriteCallback,
|
|
6
|
-
} from './utils/normalizeSocketWriteArgs'
|
|
7
|
-
|
|
8
|
-
export interface MockSocketOptions {
|
|
9
|
-
write: (
|
|
10
|
-
chunk: Buffer | string,
|
|
11
|
-
encoding: BufferEncoding | undefined,
|
|
12
|
-
callback?: WriteCallback
|
|
13
|
-
) => void
|
|
14
|
-
|
|
15
|
-
read: (chunk: Buffer, encoding: BufferEncoding | undefined) => void
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
export class MockSocket extends net.Socket {
|
|
19
|
-
public connecting: boolean
|
|
20
|
-
|
|
21
|
-
constructor(protected readonly options: MockSocketOptions) {
|
|
22
|
-
super()
|
|
23
|
-
this.connecting = false
|
|
24
|
-
this.connect()
|
|
25
|
-
|
|
26
|
-
this._final = (callback) => {
|
|
27
|
-
callback(null)
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
public connect() {
|
|
32
|
-
// The connection will remain pending until
|
|
33
|
-
// the consumer decides to handle it.
|
|
34
|
-
this.connecting = true
|
|
35
|
-
return this
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
public write(...args: Array<unknown>): boolean {
|
|
39
|
-
const [chunk, encoding, callback] = normalizeSocketWriteArgs(
|
|
40
|
-
args as WriteArgs
|
|
41
|
-
)
|
|
42
|
-
this.options.write(chunk, encoding, callback)
|
|
43
|
-
return true
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
public end(...args: Array<unknown>) {
|
|
47
|
-
const [chunk, encoding, callback] = normalizeSocketWriteArgs(
|
|
48
|
-
args as WriteArgs
|
|
49
|
-
)
|
|
50
|
-
this.options.write(chunk, encoding, callback)
|
|
51
|
-
return super.end.apply(this, args as any)
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
public push(chunk: any, encoding?: BufferEncoding): boolean {
|
|
55
|
-
this.options.read(chunk, encoding)
|
|
56
|
-
return super.push(chunk, encoding)
|
|
57
|
-
}
|
|
58
|
-
}
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
export function baseUrlFromConnectionOptions(options: any): URL {
|
|
2
|
-
if ('href' in options) {
|
|
3
|
-
return new URL(options.href)
|
|
4
|
-
}
|
|
5
|
-
|
|
6
|
-
const protocol = options.port === 443 ? 'https:' : 'http:'
|
|
7
|
-
const host = options.host
|
|
8
|
-
|
|
9
|
-
const url = new URL(`${protocol}//${host}`)
|
|
10
|
-
|
|
11
|
-
if (options.port) {
|
|
12
|
-
url.port = options.port.toString()
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
if (options.path) {
|
|
16
|
-
url.pathname = options.path
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
if (options.auth) {
|
|
20
|
-
const [username, password] = options.auth.split(':')
|
|
21
|
-
url.username = username
|
|
22
|
-
url.password = password
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
return url
|
|
26
|
-
}
|