@mswjs/interceptors 0.41.9 → 0.42.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (335) hide show
  1. package/README.md +274 -228
  2. package/lib/browser/{bufferUtils-BiiO6HZv.mjs → buffer-utils-DJj7YzLG.js} +3 -3
  3. package/lib/browser/buffer-utils-DJj7YzLG.js.map +1 -0
  4. package/lib/browser/create-request-id-DlEd4GOA.js +184 -0
  5. package/lib/browser/create-request-id-DlEd4GOA.js.map +1 -0
  6. package/lib/browser/{getRawRequest-B1BqgWG6.mjs → fetch-utils-zxA_SD66.js} +123 -52
  7. package/lib/browser/fetch-utils-zxA_SD66.js.map +1 -0
  8. package/lib/browser/handle-request-CIOa9O-N.js +167 -0
  9. package/lib/browser/handle-request-CIOa9O-N.js.map +1 -0
  10. package/lib/{node/hasConfigurableGlobal-BiTmog1u.mjs → browser/has-configurable-global-Cew-dYqk.js} +5 -7
  11. package/lib/browser/has-configurable-global-Cew-dYqk.js.map +1 -0
  12. package/lib/browser/http-CB9rQ7i_.d.ts +105 -0
  13. package/lib/browser/{index.d.cts → index.d.ts} +33 -38
  14. package/lib/browser/index.js +130 -0
  15. package/lib/browser/index.js.map +1 -0
  16. package/lib/browser/interceptor-dtJZ_9QT.d.ts +50 -0
  17. package/lib/browser/interceptors/WebSocket/index.d.ts +2 -0
  18. package/lib/browser/interceptors/WebSocket/{index.mjs → index.js} +39 -30
  19. package/lib/browser/interceptors/WebSocket/index.js.map +1 -0
  20. package/lib/browser/interceptors/XMLHttpRequest/web.d.ts +11 -0
  21. package/lib/browser/interceptors/XMLHttpRequest/web.js +2 -0
  22. package/lib/browser/interceptors/fetch/web.d.ts +14 -0
  23. package/lib/browser/interceptors/fetch/web.js +2 -0
  24. package/lib/browser/presets/browser.d.ts +11 -0
  25. package/lib/browser/presets/browser.js +12 -0
  26. package/lib/browser/presets/browser.js.map +1 -0
  27. package/lib/browser/{resolveWebSocketUrl-C83-x9iE.mjs → resolve-web-socket-url-CSvNPLGi.js} +3 -3
  28. package/lib/browser/resolve-web-socket-url-CSvNPLGi.js.map +1 -0
  29. package/lib/browser/web-BjVDkiX0.js +248 -0
  30. package/lib/browser/web-BjVDkiX0.js.map +1 -0
  31. package/lib/browser/{XMLHttpRequest-DrZAf3w6.mjs → web-C2oKsT3Q.js} +327 -255
  32. package/lib/browser/web-C2oKsT3Q.js.map +1 -0
  33. package/lib/browser/{interceptors/WebSocket/index.d.cts → websocket-CC0nB0md.d.ts} +41 -33
  34. package/lib/node/batch-interceptor-ByEZVih3.js +119 -0
  35. package/lib/node/batch-interceptor-ByEZVih3.js.map +1 -0
  36. package/lib/node/batch-interceptor-CPjFK2td.d.ts +28 -0
  37. package/lib/node/buffer-utils-BvPY1Tc-.js +187 -0
  38. package/lib/node/buffer-utils-BvPY1Tc-.js.map +1 -0
  39. package/lib/node/fetch-utils-Dw1PsmtX.js +568 -0
  40. package/lib/node/fetch-utils-Dw1PsmtX.js.map +1 -0
  41. package/lib/node/has-configurable-global-CJCh_g1I.js +22 -0
  42. package/lib/node/has-configurable-global-CJCh_g1I.js.map +1 -0
  43. package/lib/node/http-CB9rQ7i_.d.ts +105 -0
  44. package/lib/{browser/interceptors/WebSocket/index.d.mts → node/index.d.ts} +120 -60
  45. package/lib/node/{index.mjs → index.js} +8 -11
  46. package/lib/node/index.js.map +1 -0
  47. package/lib/node/interceptor-dtJZ_9QT.d.ts +50 -0
  48. package/lib/node/interceptors/ClientRequest/index.d.ts +14 -0
  49. package/lib/node/interceptors/ClientRequest/index.js +67 -0
  50. package/lib/node/interceptors/ClientRequest/index.js.map +1 -0
  51. package/lib/node/interceptors/XMLHttpRequest/node.d.ts +12 -0
  52. package/lib/node/interceptors/XMLHttpRequest/node.js +74 -0
  53. package/lib/node/interceptors/XMLHttpRequest/node.js.map +1 -0
  54. package/lib/node/interceptors/fetch/node.d.ts +18 -0
  55. package/lib/node/interceptors/fetch/node.js +83 -0
  56. package/lib/node/interceptors/fetch/node.js.map +1 -0
  57. package/lib/node/interceptors/http/index.d.ts +14 -0
  58. package/lib/node/interceptors/http/index.js +32 -0
  59. package/lib/node/interceptors/http/index.js.map +1 -0
  60. package/lib/node/interceptors/net/index.d.ts +203 -0
  61. package/lib/node/interceptors/net/index.js +2 -0
  62. package/lib/node/llhttp/constants.cjs +485 -0
  63. package/lib/node/llhttp/constants.d.cts +957 -0
  64. package/lib/node/llhttp/llhttp.wasm +0 -0
  65. package/lib/node/net-DtMnyEeg.js +1388 -0
  66. package/lib/node/net-DtMnyEeg.js.map +1 -0
  67. package/lib/node/presets/node.d.ts +12 -0
  68. package/lib/node/presets/node.js +17 -0
  69. package/lib/node/presets/node.js.map +1 -0
  70. package/lib/node/{RemoteHttpInterceptor.d.cts → remote-http-interceptor.d.ts} +12 -11
  71. package/lib/node/{RemoteHttpInterceptor.mjs → remote-http-interceptor.js} +38 -33
  72. package/lib/node/remote-http-interceptor.js.map +1 -0
  73. package/lib/node/source-lP0yyEtA.js +1990 -0
  74. package/lib/node/source-lP0yyEtA.js.map +1 -0
  75. package/package.json +79 -118
  76. package/src/batch-interceptor.test.ts +475 -0
  77. package/src/batch-interceptor.ts +244 -0
  78. package/src/{createRequestId.test.ts → create-request-id.test.ts} +1 -2
  79. package/src/disposable.ts +13 -0
  80. package/src/events/http.ts +92 -0
  81. package/src/events/websocket.ts +47 -0
  82. package/src/glossary.ts +1 -27
  83. package/src/index.ts +18 -10
  84. package/src/interceptor.test.ts +279 -0
  85. package/src/interceptor.ts +139 -0
  86. package/src/interceptors/ClientRequest/index.test.ts +21 -39
  87. package/src/interceptors/ClientRequest/index.ts +64 -179
  88. package/src/interceptors/ClientRequest/utils/{recordRawHeaders.test.ts → record-raw-headers.test.ts} +1 -2
  89. package/src/interceptors/ClientRequest/utils/{recordRawHeaders.ts → record-raw-headers.ts} +29 -2
  90. package/src/interceptors/WebSocket/index.ts +33 -50
  91. package/src/interceptors/WebSocket/utils/{bindEvent.test.ts → bind-event.test.ts} +1 -2
  92. package/src/interceptors/WebSocket/utils/events.test.ts +0 -1
  93. package/src/interceptors/WebSocket/{WebSocketClassTransport.ts → web-socket-class-transport.ts} +3 -3
  94. package/src/interceptors/WebSocket/{WebSocketClientConnection.ts → web-socket-client-connection.ts} +4 -4
  95. package/src/interceptors/WebSocket/{WebSocketOverride.ts → web-socket-override.ts} +6 -7
  96. package/src/interceptors/WebSocket/{WebSocketServerConnection.ts → web-socket-server-connection.ts} +4 -4
  97. package/src/interceptors/WebSocket/{WebSocketTransport.ts → web-socket-transport.ts} +1 -1
  98. package/src/interceptors/XMLHttpRequest/node.ts +104 -0
  99. package/src/interceptors/XMLHttpRequest/polyfills/{ProgressEventPolyfill.ts → progress-event-polyfill.ts} +1 -1
  100. package/src/interceptors/XMLHttpRequest/utils/{concateArrayBuffer.test.ts → concat-array-buffer.test.ts} +1 -2
  101. package/src/interceptors/XMLHttpRequest/utils/{concatArrayBuffer.ts → concat-array-buffer.ts} +1 -1
  102. package/src/interceptors/XMLHttpRequest/utils/{createEvent.test.ts → create-event.test.ts} +3 -4
  103. package/src/interceptors/XMLHttpRequest/utils/{createEvent.ts → create-event.ts} +2 -2
  104. package/src/interceptors/XMLHttpRequest/utils/{createResponse.ts → create-response.ts} +1 -1
  105. package/src/interceptors/XMLHttpRequest/utils/{getBodyByteLength.test.ts → get-body-byte-length.test.ts} +1 -2
  106. package/src/interceptors/XMLHttpRequest/web.ts +34 -0
  107. package/src/interceptors/XMLHttpRequest/{XMLHttpRequestController.ts → xml-http-request-controller.ts} +363 -204
  108. package/src/interceptors/XMLHttpRequest/{XMLHttpRequestProxy.ts → xml-http-request-proxy.ts} +28 -25
  109. package/src/interceptors/fetch/node.ts +103 -0
  110. package/src/interceptors/fetch/utils/{followRedirect.ts → follow-redirect.ts} +1 -1
  111. package/src/interceptors/fetch/web.ts +217 -0
  112. package/src/interceptors/http/forward-events.test.ts +86 -0
  113. package/src/interceptors/http/forward-events.ts +139 -0
  114. package/src/interceptors/http/http-parser/index.ts +310 -0
  115. package/src/interceptors/http/http-parser/llhttp/constants.cjs +485 -0
  116. package/src/interceptors/http/http-parser/llhttp/constants.d.cts +957 -0
  117. package/src/interceptors/http/http-parser/llhttp/llhttp.wasm +0 -0
  118. package/src/interceptors/http/http-parser.ts +138 -0
  119. package/src/interceptors/http/index.ts +34 -0
  120. package/src/interceptors/http/source.ts +688 -0
  121. package/src/interceptors/net/index.ts +368 -0
  122. package/src/interceptors/net/socket-controller.ts +1476 -0
  123. package/src/interceptors/net/utils/address-info.ts +54 -0
  124. package/src/interceptors/net/utils/connection-options-to-url.ts +56 -0
  125. package/src/interceptors/net/utils/flush-writes.ts +57 -0
  126. package/src/interceptors/net/utils/get-tls-connect-options.ts +23 -0
  127. package/src/interceptors/net/utils/normalize-net-connect-args.test.ts +233 -0
  128. package/src/interceptors/net/utils/normalize-net-connect-args.ts +121 -0
  129. package/src/interceptors/net/utils/normalize-tls-connect-args.ts +50 -0
  130. package/src/presets/browser.ts +4 -4
  131. package/src/presets/node.ts +4 -4
  132. package/src/{RemoteHttpInterceptor.ts → remote-http-interceptor.ts} +55 -42
  133. package/src/request-context.ts +40 -0
  134. package/src/{RequestController.test.ts → request-controller.test.ts} +37 -3
  135. package/src/{RequestController.ts → request-controller.ts} +33 -11
  136. package/src/utils/{bufferUtils.test.ts → buffer-utils.test.ts} +1 -2
  137. package/src/utils/buffer-utils.ts +37 -0
  138. package/src/utils/{cloneObject.test.ts → clone-object.test.ts} +1 -2
  139. package/src/utils/{cloneObject.ts → clone-object.ts} +8 -8
  140. package/src/utils/{createProxy.test.ts → create-proxy.test.ts} +6 -4
  141. package/src/utils/{createProxy.ts → create-proxy.ts} +1 -1
  142. package/src/utils/{fetchUtils.test.ts → fetch-utils.test.ts} +1 -1
  143. package/src/utils/{fetchUtils.ts → fetch-utils.ts} +28 -3
  144. package/src/utils/{findPropertySource.test.ts → find-property-source.test.ts} +1 -2
  145. package/src/utils/{getCleanUrl.test.ts → get-clean-url.test.ts} +1 -2
  146. package/src/utils/{getUrlByRequestOptions.test.ts → get-url-by-request-options.test.ts} +4 -8
  147. package/src/utils/{getUrlByRequestOptions.ts → get-url-by-request-options.ts} +16 -16
  148. package/src/utils/{getValueBySymbol.test.ts → get-value-by-symbol.test.ts} +1 -2
  149. package/src/utils/{handleRequest.ts → handle-request.ts} +61 -41
  150. package/src/utils/{hasConfigurableGlobal.test.ts → has-configurable-global.test.ts} +1 -2
  151. package/src/utils/{hasConfigurableGlobal.ts → has-configurable-global.ts} +2 -4
  152. package/src/utils/{isObject.test.ts → is-object.test.ts} +1 -2
  153. package/src/utils/logger.test.ts +154 -0
  154. package/src/utils/logger.ts +154 -0
  155. package/src/utils/{parseJson.test.ts → parse-json.test.ts} +1 -2
  156. package/src/utils/{patchesRegistry.test.ts → patches-registry.test.ts} +1 -1
  157. package/src/utils/{patchesRegistry.ts → patches-registry.ts} +1 -1
  158. package/src/utils/{responseUtils.ts → response-utils.ts} +25 -2
  159. package/ClientRequest/package.json +0 -11
  160. package/RemoteHttpInterceptor/package.json +0 -11
  161. package/WebSocket/package.json +0 -12
  162. package/XMLHttpRequest/package.json +0 -12
  163. package/fetch/package.json +0 -12
  164. package/lib/browser/Interceptor-Deczogc8.d.cts +0 -65
  165. package/lib/browser/Interceptor-gqKgs-aF.d.mts +0 -65
  166. package/lib/browser/XMLHttpRequest-DrZAf3w6.mjs.map +0 -1
  167. package/lib/browser/XMLHttpRequest-gXuzzX1g.cjs +0 -751
  168. package/lib/browser/XMLHttpRequest-gXuzzX1g.cjs.map +0 -1
  169. package/lib/browser/bufferUtils-BiiO6HZv.mjs.map +0 -1
  170. package/lib/browser/bufferUtils-Uc0eRItL.cjs +0 -38
  171. package/lib/browser/bufferUtils-Uc0eRItL.cjs.map +0 -1
  172. package/lib/browser/createRequestId-DOf8Ktjs.cjs +0 -205
  173. package/lib/browser/createRequestId-DOf8Ktjs.cjs.map +0 -1
  174. package/lib/browser/createRequestId-DYCsFHOi.mjs +0 -170
  175. package/lib/browser/createRequestId-DYCsFHOi.mjs.map +0 -1
  176. package/lib/browser/fetch-5IMPqr9e.mjs +0 -236
  177. package/lib/browser/fetch-5IMPqr9e.mjs.map +0 -1
  178. package/lib/browser/fetch-Bt9rMY9c.cjs +0 -241
  179. package/lib/browser/fetch-Bt9rMY9c.cjs.map +0 -1
  180. package/lib/browser/getRawRequest-B1BqgWG6.mjs.map +0 -1
  181. package/lib/browser/getRawRequest-DdfaiPVH.cjs +0 -376
  182. package/lib/browser/getRawRequest-DdfaiPVH.cjs.map +0 -1
  183. package/lib/browser/glossary-1lhZx6Aw.d.cts +0 -69
  184. package/lib/browser/glossary-nkHWcwvY.d.mts +0 -69
  185. package/lib/browser/handleRequest-CJim54xG.cjs +0 -191
  186. package/lib/browser/handleRequest-CJim54xG.cjs.map +0 -1
  187. package/lib/browser/handleRequest-CPPgsG7s.mjs +0 -180
  188. package/lib/browser/handleRequest-CPPgsG7s.mjs.map +0 -1
  189. package/lib/browser/hasConfigurableGlobal-C8zq1MCg.mjs +0 -109
  190. package/lib/browser/hasConfigurableGlobal-C8zq1MCg.mjs.map +0 -1
  191. package/lib/browser/hasConfigurableGlobal-CS7adEvV.cjs +0 -126
  192. package/lib/browser/hasConfigurableGlobal-CS7adEvV.cjs.map +0 -1
  193. package/lib/browser/index.cjs +0 -70
  194. package/lib/browser/index.cjs.map +0 -1
  195. package/lib/browser/index.d.mts +0 -125
  196. package/lib/browser/index.mjs +0 -56
  197. package/lib/browser/index.mjs.map +0 -1
  198. package/lib/browser/interceptors/WebSocket/index.cjs +0 -618
  199. package/lib/browser/interceptors/WebSocket/index.cjs.map +0 -1
  200. package/lib/browser/interceptors/WebSocket/index.mjs.map +0 -1
  201. package/lib/browser/interceptors/XMLHttpRequest/index.cjs +0 -8
  202. package/lib/browser/interceptors/XMLHttpRequest/index.d.cts +0 -15
  203. package/lib/browser/interceptors/XMLHttpRequest/index.d.mts +0 -15
  204. package/lib/browser/interceptors/XMLHttpRequest/index.mjs +0 -8
  205. package/lib/browser/interceptors/fetch/index.cjs +0 -7
  206. package/lib/browser/interceptors/fetch/index.d.cts +0 -13
  207. package/lib/browser/interceptors/fetch/index.d.mts +0 -13
  208. package/lib/browser/interceptors/fetch/index.mjs +0 -7
  209. package/lib/browser/presets/browser.cjs +0 -18
  210. package/lib/browser/presets/browser.cjs.map +0 -1
  211. package/lib/browser/presets/browser.d.cts +0 -12
  212. package/lib/browser/presets/browser.d.mts +0 -14
  213. package/lib/browser/presets/browser.mjs +0 -18
  214. package/lib/browser/presets/browser.mjs.map +0 -1
  215. package/lib/browser/resolveWebSocketUrl-6K6EgqsA.cjs +0 -31
  216. package/lib/browser/resolveWebSocketUrl-6K6EgqsA.cjs.map +0 -1
  217. package/lib/browser/resolveWebSocketUrl-C83-x9iE.mjs.map +0 -1
  218. package/lib/node/BatchInterceptor-BGhH8z1z.cjs +0 -49
  219. package/lib/node/BatchInterceptor-BGhH8z1z.cjs.map +0 -1
  220. package/lib/node/BatchInterceptor-C4-RX5rg.mjs +0 -44
  221. package/lib/node/BatchInterceptor-C4-RX5rg.mjs.map +0 -1
  222. package/lib/node/BatchInterceptor-KKF8Q47I.d.cts +0 -26
  223. package/lib/node/BatchInterceptor-rSr-NH_H.d.mts +0 -26
  224. package/lib/node/ClientRequest-2loAH7xM.cjs +0 -1058
  225. package/lib/node/ClientRequest-2loAH7xM.cjs.map +0 -1
  226. package/lib/node/ClientRequest-DGhBX21V.mjs +0 -1049
  227. package/lib/node/ClientRequest-DGhBX21V.mjs.map +0 -1
  228. package/lib/node/Interceptor-BsZ21ue0.d.cts +0 -132
  229. package/lib/node/Interceptor-soD-WpQO.d.mts +0 -132
  230. package/lib/node/RemoteHttpInterceptor.cjs +0 -155
  231. package/lib/node/RemoteHttpInterceptor.cjs.map +0 -1
  232. package/lib/node/RemoteHttpInterceptor.d.mts +0 -39
  233. package/lib/node/RemoteHttpInterceptor.mjs.map +0 -1
  234. package/lib/node/XMLHttpRequest-BtDNZipW.cjs +0 -752
  235. package/lib/node/XMLHttpRequest-BtDNZipW.cjs.map +0 -1
  236. package/lib/node/XMLHttpRequest-Dw6Wm-UU.mjs +0 -746
  237. package/lib/node/XMLHttpRequest-Dw6Wm-UU.mjs.map +0 -1
  238. package/lib/node/bufferUtils-DxPxwff_.mjs +0 -20
  239. package/lib/node/bufferUtils-DxPxwff_.mjs.map +0 -1
  240. package/lib/node/bufferUtils-S5_-2eN4.cjs +0 -38
  241. package/lib/node/bufferUtils-S5_-2eN4.cjs.map +0 -1
  242. package/lib/node/chunk-CbDLau6x.cjs +0 -34
  243. package/lib/node/fetch-CaC3rGEu.mjs +0 -252
  244. package/lib/node/fetch-CaC3rGEu.mjs.map +0 -1
  245. package/lib/node/fetch-D2ClLNN-.cjs +0 -259
  246. package/lib/node/fetch-D2ClLNN-.cjs.map +0 -1
  247. package/lib/node/fetchUtils-BKJ1XmiO.mjs +0 -480
  248. package/lib/node/fetchUtils-BKJ1XmiO.mjs.map +0 -1
  249. package/lib/node/fetchUtils-umV5xXBy.cjs +0 -546
  250. package/lib/node/fetchUtils-umV5xXBy.cjs.map +0 -1
  251. package/lib/node/getRawRequest-B6znU6il.cjs +0 -36
  252. package/lib/node/getRawRequest-B6znU6il.cjs.map +0 -1
  253. package/lib/node/getRawRequest-C2-1urzA.mjs +0 -24
  254. package/lib/node/getRawRequest-C2-1urzA.mjs.map +0 -1
  255. package/lib/node/handleRequest-C-cKYjIh.cjs +0 -222
  256. package/lib/node/handleRequest-C-cKYjIh.cjs.map +0 -1
  257. package/lib/node/handleRequest-FIQv5pwH.mjs +0 -192
  258. package/lib/node/handleRequest-FIQv5pwH.mjs.map +0 -1
  259. package/lib/node/hasConfigurableGlobal-BiTmog1u.mjs.map +0 -1
  260. package/lib/node/hasConfigurableGlobal-MjY06_Ok.cjs +0 -108
  261. package/lib/node/hasConfigurableGlobal-MjY06_Ok.cjs.map +0 -1
  262. package/lib/node/index-BJ5E5aW-.d.cts +0 -113
  263. package/lib/node/index-DfoF45ih.d.mts +0 -113
  264. package/lib/node/index.cjs +0 -53
  265. package/lib/node/index.cjs.map +0 -1
  266. package/lib/node/index.d.cts +0 -104
  267. package/lib/node/index.d.mts +0 -104
  268. package/lib/node/index.mjs.map +0 -1
  269. package/lib/node/interceptors/ClientRequest/index.cjs +0 -6
  270. package/lib/node/interceptors/ClientRequest/index.d.cts +0 -2
  271. package/lib/node/interceptors/ClientRequest/index.d.mts +0 -3
  272. package/lib/node/interceptors/ClientRequest/index.mjs +0 -6
  273. package/lib/node/interceptors/XMLHttpRequest/index.cjs +0 -7
  274. package/lib/node/interceptors/XMLHttpRequest/index.d.cts +0 -14
  275. package/lib/node/interceptors/XMLHttpRequest/index.d.mts +0 -14
  276. package/lib/node/interceptors/XMLHttpRequest/index.mjs +0 -7
  277. package/lib/node/interceptors/fetch/index.cjs +0 -6
  278. package/lib/node/interceptors/fetch/index.d.cts +0 -12
  279. package/lib/node/interceptors/fetch/index.d.mts +0 -12
  280. package/lib/node/interceptors/fetch/index.mjs +0 -6
  281. package/lib/node/node-DIKcnzhK.cjs +0 -39
  282. package/lib/node/node-DIKcnzhK.cjs.map +0 -1
  283. package/lib/node/node-lsdNwZEW.mjs +0 -27
  284. package/lib/node/node-lsdNwZEW.mjs.map +0 -1
  285. package/lib/node/presets/node.cjs +0 -23
  286. package/lib/node/presets/node.cjs.map +0 -1
  287. package/lib/node/presets/node.d.cts +0 -13
  288. package/lib/node/presets/node.d.mts +0 -15
  289. package/lib/node/presets/node.mjs +0 -23
  290. package/lib/node/presets/node.mjs.map +0 -1
  291. package/lib/node/utils/node/index.cjs +0 -4
  292. package/lib/node/utils/node/index.d.cts +0 -16
  293. package/lib/node/utils/node/index.d.mts +0 -16
  294. package/lib/node/utils/node/index.mjs +0 -3
  295. package/presets/browser/package.json +0 -5
  296. package/presets/node/package.json +0 -11
  297. package/src/BatchInterceptor.test.ts +0 -255
  298. package/src/BatchInterceptor.ts +0 -96
  299. package/src/Interceptor.test.ts +0 -205
  300. package/src/Interceptor.ts +0 -249
  301. package/src/getRawRequest.ts +0 -21
  302. package/src/interceptors/ClientRequest/MockHttpSocket.ts +0 -724
  303. package/src/interceptors/ClientRequest/agents.ts +0 -110
  304. package/src/interceptors/ClientRequest/utils/getIncomingMessageBody.test.ts +0 -54
  305. package/src/interceptors/ClientRequest/utils/getIncomingMessageBody.ts +0 -45
  306. package/src/interceptors/ClientRequest/utils/normalizeClientRequestArgs.test.ts +0 -427
  307. package/src/interceptors/ClientRequest/utils/normalizeClientRequestArgs.ts +0 -268
  308. package/src/interceptors/ClientRequest/utils/parserUtils.ts +0 -48
  309. package/src/interceptors/Socket/MockSocket.test.ts +0 -264
  310. package/src/interceptors/Socket/MockSocket.ts +0 -58
  311. package/src/interceptors/Socket/utils/baseUrlFromConnectionOptions.ts +0 -26
  312. package/src/interceptors/Socket/utils/normalizeSocketWriteArgs.test.ts +0 -52
  313. package/src/interceptors/Socket/utils/normalizeSocketWriteArgs.ts +0 -33
  314. package/src/interceptors/XMLHttpRequest/index.ts +0 -40
  315. package/src/interceptors/fetch/index.ts +0 -203
  316. package/src/utils/bufferUtils.ts +0 -22
  317. package/src/utils/canParseUrl.ts +0 -13
  318. package/src/utils/emitAsync.ts +0 -25
  319. package/src/utils/nextTick.ts +0 -11
  320. package/src/utils/node/index.ts +0 -39
  321. /package/src/{createRequestId.ts → create-request-id.ts} +0 -0
  322. /package/src/{InterceptorError.ts → interceptor-error.ts} +0 -0
  323. /package/src/interceptors/WebSocket/utils/{bindEvent.ts → bind-event.ts} +0 -0
  324. /package/src/interceptors/XMLHttpRequest/polyfills/{EventPolyfill.ts → event-polyfill.ts} +0 -0
  325. /package/src/interceptors/XMLHttpRequest/utils/{getBodyByteLength.ts → get-body-byte-length.ts} +0 -0
  326. /package/src/interceptors/XMLHttpRequest/utils/{isDomParserSupportedType.ts → is-dom-parser-supported-type.ts} +0 -0
  327. /package/src/interceptors/fetch/utils/{createNetworkError.ts → create-network-error.ts} +0 -0
  328. /package/src/utils/{findPropertySource.ts → find-property-source.ts} +0 -0
  329. /package/src/utils/{getCleanUrl.ts → get-clean-url.ts} +0 -0
  330. /package/src/utils/{getValueBySymbol.ts → get-value-by-symbol.ts} +0 -0
  331. /package/src/utils/{isNodeLikeError.ts → is-node-like-error.ts} +0 -0
  332. /package/src/utils/{isObject.ts → is-object.ts} +0 -0
  333. /package/src/utils/{isPropertyAccessible.ts → is-property-accessible.ts} +0 -0
  334. /package/src/utils/{parseJson.ts → parse-json.ts} +0 -0
  335. /package/src/utils/{resolveWebSocketUrl.ts → resolve-web-socket-url.ts} +0 -0
@@ -1,12 +1,11 @@
1
- import { n as INTERNAL_REQUEST_ID_HEADER_NAME, r as Interceptor, t as createRequestId } from "./createRequestId-DYCsFHOi.mjs";
2
- import { i as FetchResponse, n as setRawRequest, o as RequestController, r as FetchRequest } from "./getRawRequest-B1BqgWG6.mjs";
3
- import { n as encodeBuffer, r as toArrayBuffer, t as decodeBuffer } from "./bufferUtils-BiiO6HZv.mjs";
4
- import { n as patchesRegistry, t as hasConfigurableGlobal } from "./hasConfigurableGlobal-C8zq1MCg.mjs";
5
- import { n as isResponseError, t as handleRequest } from "./handleRequest-CPPgsG7s.mjs";
1
+ import { n as Interceptor, r as createLogger, t as createRequestId } from "./create-request-id-DlEd4GOA.js";
2
+ import { c as RequestController, i as isResponseError, n as FetchResponse, t as FetchRequest } from "./fetch-utils-zxA_SD66.js";
3
+ import { n as encodeBuffer, r as toArrayBuffer, t as decodeBuffer } from "./buffer-utils-DJj7YzLG.js";
4
+ import { n as HttpResponseEvent, t as handleRequest } from "./handle-request-CIOa9O-N.js";
5
+ import { n as patchesRegistry, t as hasConfigurableGlobal } from "./has-configurable-global-Cew-dYqk.js";
6
6
  import { invariant } from "outvariant";
7
- import { isNodeProcess } from "is-node-process";
8
-
9
- //#region src/interceptors/XMLHttpRequest/utils/concatArrayBuffer.ts
7
+ import { until } from "@open-draft/until";
8
+ //#region src/interceptors/XMLHttpRequest/utils/concat-array-buffer.ts
10
9
  /**
11
10
  * Concatenate two `Uint8Array` buffers.
12
11
  */
@@ -16,9 +15,8 @@ function concatArrayBuffer(left, right) {
16
15
  result.set(right, left.byteLength);
17
16
  return result;
18
17
  }
19
-
20
18
  //#endregion
21
- //#region src/interceptors/XMLHttpRequest/polyfills/EventPolyfill.ts
19
+ //#region src/interceptors/XMLHttpRequest/polyfills/event-polyfill.ts
22
20
  var EventPolyfill = class {
23
21
  constructor(type, options) {
24
22
  this.NONE = 0;
@@ -58,9 +56,8 @@ var EventPolyfill = class {
58
56
  stopPropagation() {}
59
57
  stopImmediatePropagation() {}
60
58
  };
61
-
62
59
  //#endregion
63
- //#region src/interceptors/XMLHttpRequest/polyfills/ProgressEventPolyfill.ts
60
+ //#region src/interceptors/XMLHttpRequest/polyfills/progress-event-polyfill.ts
64
61
  var ProgressEventPolyfill = class extends EventPolyfill {
65
62
  constructor(type, init) {
66
63
  super(type);
@@ -70,9 +67,8 @@ var ProgressEventPolyfill = class extends EventPolyfill {
70
67
  this.total = init?.total || 0;
71
68
  }
72
69
  };
73
-
74
70
  //#endregion
75
- //#region src/interceptors/XMLHttpRequest/utils/createEvent.ts
71
+ //#region src/interceptors/XMLHttpRequest/utils/create-event.ts
76
72
  const SUPPORTS_PROGRESS_EVENT = typeof ProgressEvent !== "undefined";
77
73
  function createEvent(target, type, init) {
78
74
  const progressEvents = [
@@ -98,9 +94,8 @@ function createEvent(target, type, init) {
98
94
  currentTarget: target
99
95
  });
100
96
  }
101
-
102
97
  //#endregion
103
- //#region src/utils/findPropertySource.ts
98
+ //#region src/utils/find-property-source.ts
104
99
  /**
105
100
  * Returns the source object of the given property on the target object
106
101
  * (the target itself, any parent in its prototype, or null).
@@ -111,9 +106,8 @@ function findPropertySource(target, propertyName) {
111
106
  const prototype = Reflect.getPrototypeOf(target);
112
107
  return prototype ? findPropertySource(prototype, propertyName) : null;
113
108
  }
114
-
115
109
  //#endregion
116
- //#region src/utils/createProxy.ts
110
+ //#region src/utils/create-proxy.ts
117
111
  function createProxy(target, options) {
118
112
  return new Proxy(target, optionsToProxyHandler(options));
119
113
  }
@@ -149,17 +143,16 @@ function optionsToProxyHandler(options) {
149
143
  const next = () => target[propertyName];
150
144
  const value = typeof getProperty !== "undefined" ? getProperty.call(target, [propertyName, receiver], next) : next();
151
145
  if (typeof value === "function") return (...args) => {
152
- const next$1 = value.bind(target, ...args);
153
- if (typeof methodCall !== "undefined") return methodCall.call(target, [propertyName, args], next$1);
154
- return next$1();
146
+ const next = value.bind(target, ...args);
147
+ if (typeof methodCall !== "undefined") return methodCall.call(target, [propertyName, args], next);
148
+ return next();
155
149
  };
156
150
  return value;
157
151
  };
158
152
  return handler;
159
153
  }
160
-
161
154
  //#endregion
162
- //#region src/interceptors/XMLHttpRequest/utils/isDomParserSupportedType.ts
155
+ //#region src/interceptors/XMLHttpRequest/utils/is-dom-parser-supported-type.ts
163
156
  function isDomParserSupportedType(type) {
164
157
  return [
165
158
  "application/xhtml+xml",
@@ -171,9 +164,8 @@ function isDomParserSupportedType(type) {
171
164
  return type.startsWith(supportedType);
172
165
  });
173
166
  }
174
-
175
167
  //#endregion
176
- //#region src/utils/parseJson.ts
168
+ //#region src/utils/parse-json.ts
177
169
  /**
178
170
  * Parses a given string into JSON.
179
171
  * Gracefully handles invalid JSON by returning `null`.
@@ -185,9 +177,8 @@ function parseJson(data) {
185
177
  return null;
186
178
  }
187
179
  }
188
-
189
180
  //#endregion
190
- //#region src/interceptors/XMLHttpRequest/utils/createResponse.ts
181
+ //#region src/interceptors/XMLHttpRequest/utils/create-response.ts
191
182
  /**
192
183
  * Creates a Fetch API `Response` instance from the given
193
184
  * `XMLHttpRequest` instance and a response body.
@@ -211,9 +202,8 @@ function createHeadersFromXMLHttpRequestHeaders(headersString) {
211
202
  }
212
203
  return headers;
213
204
  }
214
-
215
205
  //#endregion
216
- //#region src/interceptors/XMLHttpRequest/utils/getBodyByteLength.ts
206
+ //#region src/interceptors/XMLHttpRequest/utils/get-body-byte-length.ts
217
207
  /**
218
208
  * Return a total byte length of the given request/response body.
219
209
  * If the `Content-Length` header is present, it will be used as the byte length.
@@ -223,12 +213,11 @@ async function getBodyByteLength(input) {
223
213
  if (explicitContentLength != null && explicitContentLength !== "") return Number(explicitContentLength);
224
214
  return (await input.arrayBuffer()).byteLength;
225
215
  }
226
-
227
216
  //#endregion
228
- //#region src/interceptors/XMLHttpRequest/XMLHttpRequestController.ts
217
+ //#region src/interceptors/XMLHttpRequest/xml-http-request-controller.ts
229
218
  const kIsRequestHandled = Symbol("kIsRequestHandled");
230
- const IS_NODE = isNodeProcess();
231
219
  const kFetchRequest = Symbol("kFetchRequest");
220
+ const MAX_REDIRECTS = 20;
232
221
  /**
233
222
  * An `XMLHttpRequest` instance controller that allows us
234
223
  * to handle any given request instance (e.g. responding to it).
@@ -237,112 +226,91 @@ var XMLHttpRequestController = class {
237
226
  constructor(initialRequest, logger) {
238
227
  this.initialRequest = initialRequest;
239
228
  this.logger = logger;
229
+ this.sync = false;
240
230
  this.method = "GET";
241
231
  this.url = null;
242
232
  this[kIsRequestHandled] = false;
233
+ this.redirectCount = 0;
243
234
  this.events = /* @__PURE__ */ new Map();
244
235
  this.uploadEvents = /* @__PURE__ */ new Map();
245
236
  this.requestId = createRequestId();
246
237
  this.requestHeaders = new Headers();
247
- this.responseBuffer = new Uint8Array();
248
- this.request = createProxy(initialRequest, {
249
- setProperty: ([propertyName, nextValue], invoke) => {
250
- switch (propertyName) {
251
- case "ontimeout": {
252
- const eventName = propertyName.slice(2);
253
- /**
254
- * @note Proxy callbacks to event listeners because JSDOM has trouble
255
- * translating these properties to callbacks. It seemed to be operating
256
- * on events exclusively.
257
- */
258
- this.request.addEventListener(eventName, nextValue);
259
- return invoke();
238
+ this.responseBuffer = /* @__PURE__ */ new Uint8Array();
239
+ this.request = createProxy(initialRequest, { methodCall: ([methodName, args], invoke) => {
240
+ switch (methodName) {
241
+ case "open": {
242
+ const [method, url, async] = args;
243
+ this.sync = !(async ?? true);
244
+ if (typeof url === "undefined") {
245
+ this.method = "GET";
246
+ this.url = toAbsoluteUrl(method);
247
+ } else {
248
+ this.method = method;
249
+ this.url = toAbsoluteUrl(url);
260
250
  }
261
- default: return invoke();
251
+ this.logger.verbose("open %s %s", this.method, this.url.href);
252
+ return invoke();
262
253
  }
263
- },
264
- methodCall: ([methodName, args], invoke) => {
265
- switch (methodName) {
266
- case "open": {
267
- const [method, url] = args;
268
- if (typeof url === "undefined") {
269
- this.method = "GET";
270
- this.url = toAbsoluteUrl(method);
271
- } else {
272
- this.method = method;
273
- this.url = toAbsoluteUrl(url);
274
- }
275
- this.logger = this.logger.extend(`${this.method} ${this.url.href}`);
276
- this.logger.info("open", this.method, this.url.href);
277
- return invoke();
278
- }
279
- case "addEventListener": {
280
- const [eventName, listener] = args;
281
- this.registerEvent(eventName, listener);
282
- this.logger.info("addEventListener", eventName, listener);
283
- return invoke();
284
- }
285
- case "setRequestHeader": {
286
- const [name, value] = args;
287
- this.requestHeaders.set(name, value);
288
- this.logger.info("setRequestHeader", name, value);
254
+ case "addEventListener": {
255
+ const [eventName, listener] = args;
256
+ this.registerEvent(eventName, listener);
257
+ this.logger.verbose("addEventListener", eventName, listener);
258
+ return invoke();
259
+ }
260
+ case "setRequestHeader": {
261
+ const [name, value] = args;
262
+ this.requestHeaders.set(name, value);
263
+ this.logger.verbose("setRequestHeader", name, value);
264
+ return invoke();
265
+ }
266
+ case "send": {
267
+ const [body] = args;
268
+ if (this.sync) {
269
+ console.warn(`Failed to intercept an XMLHttpRequest (${this.method} ${this.url}): synchronous requests are not supported. This request will be performed as-is.`);
289
270
  return invoke();
290
271
  }
291
- case "send": {
292
- const [body] = args;
293
- this.request.addEventListener("load", () => {
294
- if (typeof this.onResponse !== "undefined") {
295
- const fetchResponse = createResponse(
296
- this.request,
297
- /**
298
- * The `response` property is the right way to read
299
- * the ambiguous response body, as the request's "responseType" may differ.
300
- * @see https://xhr.spec.whatwg.org/#the-response-attribute
301
- */
302
- this.request.response
303
- );
304
- this.onResponse.call(this, {
305
- response: fetchResponse,
306
- isMockedResponse: this[kIsRequestHandled],
307
- request: fetchRequest,
308
- requestId: this.requestId
309
- });
310
- }
311
- });
312
- const requestBody = typeof body === "string" ? encodeBuffer(body) : body;
313
- const fetchRequest = this.toFetchApiRequest(requestBody);
314
- this[kFetchRequest] = fetchRequest.clone();
315
- /**
316
- * @note Start request handling on the next tick so that the user
317
- * could add event listeners for "loadend" before the interceptor fires it.
318
- */
319
- queueMicrotask(() => {
320
- (this.onRequest?.call(this, {
272
+ this.request.addEventListener("load", () => {
273
+ if (typeof this.onResponse !== "undefined") {
274
+ const fetchResponse = createResponse(
275
+ this.request,
276
+ /**
277
+ * The `response` property is the right way to read
278
+ * the ambiguous response body, as the request's "responseType" may differ.
279
+ * @see https://xhr.spec.whatwg.org/#the-response-attribute
280
+ */
281
+ this.request.response
282
+ );
283
+ this.onResponse.call(this, {
284
+ response: fetchResponse,
285
+ responseType: this[kIsRequestHandled] ? "mock" : "original",
321
286
  request: fetchRequest,
322
287
  requestId: this.requestId
323
- }) || Promise.resolve()).finally(() => {
324
- if (!this[kIsRequestHandled]) {
325
- this.logger.info("request callback settled but request has not been handled (readystate %d), performing as-is...", this.request.readyState);
326
- /**
327
- * @note Set the intercepted request ID on the original request in Node.js
328
- * so that if it triggers any other interceptors, they don't attempt
329
- * to process it once again.
330
- *
331
- * For instance, XMLHttpRequest is often implemented via "http.ClientRequest"
332
- * and we don't want for both XHR and ClientRequest interceptors to
333
- * handle the same request at the same time (e.g. emit the "response" event twice).
334
- */
335
- if (IS_NODE) this.request.setRequestHeader(INTERNAL_REQUEST_ID_HEADER_NAME, this.requestId);
336
- return invoke();
337
- }
338
288
  });
289
+ }
290
+ });
291
+ const requestBody = typeof body === "string" ? encodeBuffer(body) : body;
292
+ const fetchRequest = this.toFetchApiRequest(requestBody);
293
+ this[kFetchRequest] = fetchRequest.clone();
294
+ /**
295
+ * @note Start request handling on the next tick so that the user
296
+ * could add event listeners for "loadend" before the interceptor fires it.
297
+ */
298
+ queueMicrotask(() => {
299
+ (this.onRequest?.call(this, {
300
+ request: fetchRequest,
301
+ requestId: this.requestId
302
+ }) || Promise.resolve()).finally(() => {
303
+ if (!this[kIsRequestHandled]) {
304
+ this.logger.verbose("request callback settled but request has not been handled (readystate %d), performing as-is...", this.request.readyState);
305
+ return invoke();
306
+ }
339
307
  });
340
- break;
341
- }
342
- default: return invoke();
308
+ });
309
+ break;
343
310
  }
311
+ default: return invoke();
344
312
  }
345
- });
313
+ } });
346
314
  /**
347
315
  * Proxy the `.upload` property to gather the event listeners/callbacks.
348
316
  */
@@ -367,7 +335,7 @@ var XMLHttpRequestController = class {
367
335
  case "addEventListener": {
368
336
  const [eventName, listener] = args;
369
337
  this.registerUploadEvent(eventName, listener);
370
- this.logger.info("upload.addEventListener", eventName, listener);
338
+ this.logger.verbose("upload.addEventListener", eventName, listener);
371
339
  return invoke();
372
340
  }
373
341
  }
@@ -377,12 +345,12 @@ var XMLHttpRequestController = class {
377
345
  registerEvent(eventName, listener) {
378
346
  const nextEvents = (this.events.get(eventName) || []).concat(listener);
379
347
  this.events.set(eventName, nextEvents);
380
- this.logger.info("registered event \"%s\"", eventName, listener);
348
+ this.logger.verbose("registered event \"%s\"", eventName, listener);
381
349
  }
382
350
  registerUploadEvent(eventName, listener) {
383
351
  const nextEvents = (this.uploadEvents.get(eventName) || []).concat(listener);
384
352
  this.uploadEvents.set(eventName, nextEvents);
385
- this.logger.info("registered upload event \"%s\"", eventName, listener);
353
+ this.logger.verbose("registered upload event \"%s\"", eventName, listener);
386
354
  }
387
355
  /**
388
356
  * Responds to the current request with the given
@@ -398,55 +366,8 @@ var XMLHttpRequestController = class {
398
366
  * calculating request/response total body length is asynchronous.
399
367
  */
400
368
  this[kIsRequestHandled] = true;
401
- /**
402
- * Dispatch request upload events for requests with a body.
403
- * @see https://github.com/mswjs/interceptors/issues/573
404
- */
405
- if (this[kFetchRequest]) {
406
- const totalRequestBodyLength = await getBodyByteLength(this[kFetchRequest]);
407
- this.trigger("loadstart", this.request.upload, {
408
- loaded: 0,
409
- total: totalRequestBodyLength
410
- });
411
- this.trigger("progress", this.request.upload, {
412
- loaded: totalRequestBodyLength,
413
- total: totalRequestBodyLength
414
- });
415
- this.trigger("load", this.request.upload, {
416
- loaded: totalRequestBodyLength,
417
- total: totalRequestBodyLength
418
- });
419
- this.trigger("loadend", this.request.upload, {
420
- loaded: totalRequestBodyLength,
421
- total: totalRequestBodyLength
422
- });
423
- }
424
- this.logger.info("responding with a mocked response: %d %s", response.status, response.statusText);
425
- define(this.request, "status", response.status);
426
- define(this.request, "statusText", response.statusText);
427
- define(this.request, "responseURL", this.url.href);
428
- this.request.getResponseHeader = new Proxy(this.request.getResponseHeader, { apply: (_, __, args) => {
429
- this.logger.info("getResponseHeader", args[0]);
430
- if (this.request.readyState < this.request.HEADERS_RECEIVED) {
431
- this.logger.info("headers not received yet, returning null");
432
- return null;
433
- }
434
- const headerValue = response.headers.get(args[0]);
435
- this.logger.info("resolved response header \"%s\" to", args[0], headerValue);
436
- return headerValue;
437
- } });
438
- this.request.getAllResponseHeaders = new Proxy(this.request.getAllResponseHeaders, { apply: () => {
439
- this.logger.info("getAllResponseHeaders");
440
- if (this.request.readyState < this.request.HEADERS_RECEIVED) {
441
- this.logger.info("headers not received yet, returning empty string");
442
- return "";
443
- }
444
- const allHeaders = Array.from(response.headers.entries()).map(([headerName, headerValue]) => {
445
- return `${headerName}: ${headerValue}`;
446
- }).join("\r\n");
447
- this.logger.info("resolved all response headers to", allHeaders);
448
- return allHeaders;
449
- } });
369
+ this.logger.verbose("responding with a mocked response: %d %s", response.status, response.statusText);
370
+ FetchResponse.setUrl(this.url.href, response);
450
371
  Object.defineProperties(this.request, {
451
372
  response: {
452
373
  enumerable: true,
@@ -464,75 +385,203 @@ var XMLHttpRequestController = class {
464
385
  get: () => this.responseXML
465
386
  }
466
387
  });
467
- const totalResponseBodyLength = await getBodyByteLength(response.clone());
468
- this.logger.info("calculated response body length", totalResponseBodyLength);
469
388
  this.trigger("loadstart", this.request, {
470
389
  loaded: 0,
471
- total: totalResponseBodyLength
390
+ total: 0
472
391
  });
473
- this.setReadyState(this.request.HEADERS_RECEIVED);
474
- this.setReadyState(this.request.LOADING);
475
- const finalizeResponse = () => {
476
- this.logger.info("finalizing the mocked response...");
392
+ let requestBodyTransmitted = 0;
393
+ let uploadComplete = false;
394
+ if (this[kFetchRequest]) {
395
+ const requestBodyLength = await getBodyByteLength(this[kFetchRequest].clone());
396
+ if (!uploadComplete) this.trigger("loadstart", this.request.upload, {
397
+ loaded: 0,
398
+ total: requestBodyLength
399
+ });
400
+ const processRequestBodyChunkLength = (bytesLength) => {
401
+ requestBodyTransmitted += bytesLength;
402
+ if (requestBodyTransmitted < requestBodyLength) this.trigger("progress", this.request.upload, {
403
+ loaded: requestBodyTransmitted,
404
+ total: requestBodyLength
405
+ });
406
+ };
407
+ const processRequestEndOfBody = () => {
408
+ uploadComplete = true;
409
+ this.trigger("progress", this.request.upload, {
410
+ loaded: requestBodyTransmitted,
411
+ total: requestBodyLength
412
+ });
413
+ this.trigger("load", this.request.upload, {
414
+ loaded: requestBodyTransmitted,
415
+ total: requestBodyLength
416
+ });
417
+ this.trigger("loadend", this.request.upload, {
418
+ loaded: requestBodyTransmitted,
419
+ total: requestBodyLength
420
+ });
421
+ };
422
+ if (this[kFetchRequest]?.body != null) {
423
+ const reader = this[kFetchRequest].body.getReader();
424
+ while (true) {
425
+ const { value, done } = await reader.read();
426
+ if (done) {
427
+ processRequestEndOfBody();
428
+ break;
429
+ }
430
+ processRequestBodyChunkLength(value.byteLength);
431
+ }
432
+ } else processRequestEndOfBody();
433
+ }
434
+ let timedOut = false;
435
+ const responseReadController = new AbortController();
436
+ const requestErrorSteps = (event) => {
477
437
  this.setReadyState(this.request.DONE);
478
- this.trigger("load", this.request, {
479
- loaded: this.responseBuffer.byteLength,
480
- total: totalResponseBodyLength
438
+ if (!uploadComplete) {
439
+ this.trigger(event, this.request.upload, {
440
+ loaded: 0,
441
+ total: 0
442
+ });
443
+ this.trigger("loadend", this.request.upload, {
444
+ loaded: 0,
445
+ total: 0
446
+ });
447
+ }
448
+ this.trigger(event, this.request, {
449
+ loaded: 0,
450
+ total: 0
481
451
  });
482
452
  this.trigger("loadend", this.request, {
483
- loaded: this.responseBuffer.byteLength,
484
- total: totalResponseBodyLength
453
+ loaded: 0,
454
+ total: 0
485
455
  });
486
456
  };
487
- if (response.body) {
488
- this.logger.info("mocked response has body, streaming...");
489
- const reader = response.body.getReader();
490
- const readNextResponseBodyChunk = async () => {
491
- const { value, done } = await reader.read();
492
- if (done) {
493
- this.logger.info("response body stream done!");
494
- finalizeResponse();
495
- return;
496
- }
497
- if (value) {
498
- this.logger.info("read response body chunk:", value);
499
- this.responseBuffer = concatArrayBuffer(this.responseBuffer, value);
500
- this.trigger("progress", this.request, {
501
- loaded: this.responseBuffer.byteLength,
502
- total: totalResponseBodyLength
503
- });
504
- }
505
- readNextResponseBodyChunk();
457
+ const processResponse = async (response) => {
458
+ const handleErrors = () => {
459
+ if (timedOut) requestErrorSteps("timeout");
460
+ else if (responseReadController.signal.aborted) requestErrorSteps("abort");
461
+ else if (isResponseError(response)) requestErrorSteps("error");
462
+ };
463
+ handleErrors();
464
+ define(this.request, "status", response.status);
465
+ define(this.request, "statusText", response.statusText);
466
+ if (!this.request.responseURL) define(this.request, "responseURL", response.url);
467
+ if (isResponseError(response)) return;
468
+ /**
469
+ * @note The response body length is derived ONLY from the "content-length" header.
470
+ * If that response header is not set, the "total" in all progress events must be 0.
471
+ */
472
+ const responseBodyLength = Number(response.headers.get("content-length") ?? "0");
473
+ this.setReadyState(this.request.HEADERS_RECEIVED);
474
+ let receivedBytes = 0;
475
+ let lastReceivedResponseBytesAt = performance.now();
476
+ const processResponseBodyChunk = (bytesLength) => {
477
+ receivedBytes += bytesLength;
478
+ const now = performance.now();
479
+ const shouldBuffer = now - lastReceivedResponseBytesAt <= 60 && receivedBytes < responseBodyLength;
480
+ lastReceivedResponseBytesAt = now;
481
+ if (shouldBuffer) return;
482
+ if (this.request.readyState === this.request.HEADERS_RECEIVED) this.setReadyState(this.request.LOADING, false);
483
+ this.trigger("readystatechange", this.request);
484
+ this.trigger("progress", this.request, {
485
+ loaded: receivedBytes,
486
+ total: responseBodyLength
487
+ });
506
488
  };
507
- readNextResponseBodyChunk();
508
- } else finalizeResponse();
489
+ const processResponseBodyError = () => {
490
+ requestErrorSteps("error");
491
+ };
492
+ const processResponseEndOfBody = async () => {
493
+ handleErrors();
494
+ if (isResponseError(response)) return;
495
+ let transmitted = receivedBytes;
496
+ this.setReadyState(this.request.DONE);
497
+ this.trigger("load", this.request, {
498
+ loaded: transmitted,
499
+ total: responseBodyLength
500
+ });
501
+ this.trigger("loadend", this.request, {
502
+ loaded: transmitted,
503
+ total: responseBodyLength
504
+ });
505
+ };
506
+ if (response.body == null) processResponseEndOfBody();
507
+ else {
508
+ const reader = response.body.getReader();
509
+ while (true) {
510
+ if (responseReadController.signal.aborted) break;
511
+ try {
512
+ const { value, done } = await reader.read();
513
+ if (done) {
514
+ processResponseEndOfBody();
515
+ return;
516
+ }
517
+ processResponseBodyChunk(value.byteLength);
518
+ this.responseBuffer = concatArrayBuffer(this.responseBuffer, value);
519
+ } catch {
520
+ processResponseBodyError();
521
+ }
522
+ }
523
+ }
524
+ };
525
+ const [redirectError, finalResponse] = await until(() => {
526
+ return this.followRedirects(response);
527
+ });
528
+ if (redirectError) return;
529
+ processResponse(finalResponse);
530
+ if (this.request.timeout) setTimeout(() => {
531
+ if (this.request.readyState !== this.request.DONE) {
532
+ timedOut = true;
533
+ responseReadController.abort();
534
+ }
535
+ }, this.request.timeout);
536
+ this.request.getResponseHeader = new Proxy(this.request.getResponseHeader, { apply: (_, __, args) => {
537
+ this.logger.verbose("getResponseHeader", args[0]);
538
+ if (this.request.readyState < this.request.HEADERS_RECEIVED) {
539
+ this.logger.verbose("headers not received yet, returning null");
540
+ return null;
541
+ }
542
+ const headerValue = finalResponse.headers.get(args[0]);
543
+ this.logger.verbose("resolved response header \"%s\" to", args[0], headerValue);
544
+ return headerValue;
545
+ } });
546
+ this.request.getAllResponseHeaders = new Proxy(this.request.getAllResponseHeaders, { apply: () => {
547
+ this.logger.verbose("getAllResponseHeaders");
548
+ if (this.request.readyState < this.request.HEADERS_RECEIVED) {
549
+ this.logger.verbose("headers not received yet, returning empty string");
550
+ return "";
551
+ }
552
+ const allHeaders = Array.from(finalResponse.headers).map(([headerName, headerValue]) => {
553
+ return `${headerName}: ${headerValue}`;
554
+ }).join("\r\n");
555
+ this.logger.verbose("resolved all response headers to", allHeaders);
556
+ return allHeaders;
557
+ } });
509
558
  }
510
559
  responseBufferToText() {
511
560
  return decodeBuffer(this.responseBuffer);
512
561
  }
513
562
  get response() {
514
- this.logger.info("getResponse (responseType: %s)", this.request.responseType);
563
+ this.logger.verbose("getResponse (responseType: %s)", this.request.responseType);
515
564
  if (this.request.readyState !== this.request.DONE) return null;
516
565
  switch (this.request.responseType) {
517
566
  case "json": {
518
567
  const responseJson = parseJson(this.responseBufferToText());
519
- this.logger.info("resolved response JSON", responseJson);
568
+ this.logger.verbose("resolved response JSON", responseJson);
520
569
  return responseJson;
521
570
  }
522
571
  case "arraybuffer": {
523
572
  const arrayBuffer = toArrayBuffer(this.responseBuffer);
524
- this.logger.info("resolved response ArrayBuffer", arrayBuffer);
573
+ this.logger.verbose("resolved response ArrayBuffer", arrayBuffer);
525
574
  return arrayBuffer;
526
575
  }
527
576
  case "blob": {
528
577
  const mimeType = this.request.getResponseHeader("Content-Type") || "text/plain";
529
578
  const responseBlob = new Blob([this.responseBufferToText()], { type: mimeType });
530
- this.logger.info("resolved response Blob (mime type: %s)", responseBlob, mimeType);
579
+ this.logger.verbose("resolved response Blob (mime type: %s)", responseBlob, mimeType);
531
580
  return responseBlob;
532
581
  }
533
582
  default: {
534
583
  const responseText = this.responseBufferToText();
535
- this.logger.info("resolving \"%s\" response type as text", this.request.responseType, responseText);
584
+ this.logger.verbose("resolving \"%s\" response type as text", this.request.responseType, responseText);
536
585
  return responseText;
537
586
  }
538
587
  }
@@ -546,7 +595,7 @@ var XMLHttpRequestController = class {
546
595
  invariant(this.request.responseType === "" || this.request.responseType === "text", "InvalidStateError: The object is in invalid state.");
547
596
  if (this.request.readyState !== this.request.LOADING && this.request.readyState !== this.request.DONE) return "";
548
597
  const responseText = this.responseBufferToText();
549
- this.logger.info("getResponseText: \"%s\"", responseText);
598
+ this.logger.verbose("getResponseText: \"%s\"", responseText);
550
599
  return responseText;
551
600
  }
552
601
  get responseXML() {
@@ -560,13 +609,36 @@ var XMLHttpRequestController = class {
560
609
  if (isDomParserSupportedType(contentType)) return new DOMParser().parseFromString(this.responseBufferToText(), contentType);
561
610
  return null;
562
611
  }
612
+ async followRedirects(response) {
613
+ const redirectLocation = response.headers.get("location");
614
+ if (!redirectLocation || !FetchResponse.isRedirectResponse(response.status)) return response;
615
+ this.redirectCount++;
616
+ if (this.redirectCount > MAX_REDIRECTS) throw new Error("Too many redirects");
617
+ const redirectUrl = new URL(redirectLocation, location.href);
618
+ const redirectMethod = FetchResponse.isResponseWithBody(response.status) ? this.method : "GET";
619
+ const redirectResponse = await new Promise((resolve, reject) => {
620
+ const request = new XMLHttpRequest();
621
+ request.responseType = this.request.responseType;
622
+ request.addEventListener("load", () => {
623
+ this.url = new URL(request.responseURL);
624
+ resolve(createResponse(request, request.response));
625
+ });
626
+ request.addEventListener("error", () => {
627
+ this.errorWith();
628
+ reject(/* @__PURE__ */ new Error("Redirect request failed"));
629
+ });
630
+ request.open(redirectMethod, redirectUrl.href);
631
+ request.send();
632
+ });
633
+ return this.followRedirects(redirectResponse);
634
+ }
563
635
  errorWith(error) {
564
636
  /**
565
637
  * @note Mark this request as handled even if it received a mock error.
566
638
  * This prevents the controller from trying to perform this request as-is.
567
639
  */
568
640
  this[kIsRequestHandled] = true;
569
- this.logger.info("responding with an error");
641
+ this.logger.verbose("responding with an error");
570
642
  this.setReadyState(this.request.DONE);
571
643
  this.trigger("error", this.request);
572
644
  this.trigger("loadend", this.request);
@@ -574,16 +646,17 @@ var XMLHttpRequestController = class {
574
646
  /**
575
647
  * Transitions this request's `readyState` to the given one.
576
648
  */
577
- setReadyState(nextReadyState) {
578
- this.logger.info("setReadyState: %d -> %d", this.request.readyState, nextReadyState);
649
+ setReadyState(nextReadyState, triggerReadyStateChangeEvent = true) {
650
+ this.logger.verbose("setReadyState: %d -> %d", this.request.readyState, nextReadyState);
579
651
  if (this.request.readyState === nextReadyState) {
580
- this.logger.info("ready state identical, skipping transition...");
652
+ this.logger.verbose("ready state identical, skipping transition...");
581
653
  return;
582
654
  }
583
655
  define(this.request, "readyState", nextReadyState);
584
- this.logger.info("set readyState to: %d", nextReadyState);
656
+ this.logger.verbose("set readyState to: %d", nextReadyState);
657
+ if (!triggerReadyStateChangeEvent) return;
585
658
  if (nextReadyState !== this.request.UNSENT) {
586
- this.logger.info("triggering \"readystatechange\" event...");
659
+ this.logger.verbose("triggering \"readystatechange\" event...");
587
660
  this.trigger("readystatechange", this.request);
588
661
  }
589
662
  }
@@ -593,14 +666,14 @@ var XMLHttpRequestController = class {
593
666
  trigger(eventName, target, options) {
594
667
  const callback = target[`on${eventName}`];
595
668
  const event = createEvent(target, eventName, options);
596
- this.logger.info("trigger \"%s\"", eventName, options || "");
669
+ this.logger.verbose("trigger \"%s\"", eventName, options || "");
597
670
  if (typeof callback === "function") {
598
- this.logger.info("found a direct \"%s\" callback, calling...", eventName);
671
+ this.logger.verbose("found a direct \"%s\" callback, calling...", eventName);
599
672
  callback.call(target, event);
600
673
  }
601
674
  const events = target instanceof XMLHttpRequestUpload ? this.uploadEvents : this.events;
602
675
  for (const [registeredEventName, listeners] of events) if (registeredEventName === eventName) {
603
- this.logger.info("found %d listener(s) for \"%s\" event, calling...", listeners.length, eventName);
676
+ this.logger.verbose("found %d listener(s) for \"%s\" event, calling...", listeners.length, eventName);
604
677
  listeners.forEach((listener) => listener.call(target, event));
605
678
  }
606
679
  }
@@ -608,13 +681,16 @@ var XMLHttpRequestController = class {
608
681
  * Converts this `XMLHttpRequest` instance into a Fetch API `Request` instance.
609
682
  */
610
683
  toFetchApiRequest(body) {
611
- this.logger.info("converting request to a Fetch API Request...");
684
+ this.logger.verbose("converting request to a Fetch API Request...");
612
685
  const resolvedBody = body instanceof Document ? body.documentElement.innerText : body;
613
686
  const fetchRequest = new FetchRequest(this.url.href, {
614
687
  method: this.method,
615
688
  headers: this.requestHeaders,
689
+ /**
690
+ * @see https://xhr.spec.whatwg.org/#cross-origin-credentials
691
+ */
616
692
  credentials: this.request.withCredentials ? "include" : "same-origin",
617
- body: ["GET", "HEAD"].includes(this.method.toUpperCase()) ? null : resolvedBody
693
+ body: resolvedBody
618
694
  });
619
695
  define(fetchRequest, "headers", createProxy(fetchRequest.headers, { methodCall: ([methodName, args], invoke) => {
620
696
  switch (methodName) {
@@ -632,8 +708,7 @@ var XMLHttpRequestController = class {
632
708
  }
633
709
  return invoke();
634
710
  } }));
635
- setRawRequest(fetchRequest, this.request);
636
- this.logger.info("converted request to a Fetch API Request!", fetchRequest);
711
+ this.logger.verbose("converted request to a Fetch API Request!", fetchRequest);
637
712
  return fetchRequest;
638
713
  }
639
714
  };
@@ -655,9 +730,8 @@ function define(target, property, value) {
655
730
  value
656
731
  });
657
732
  }
658
-
659
733
  //#endregion
660
- //#region src/interceptors/XMLHttpRequest/XMLHttpRequestProxy.ts
734
+ //#region src/interceptors/XMLHttpRequest/xml-http-request-proxy.ts
661
735
  /**
662
736
  * Create a proxied `XMLHttpRequest` class.
663
737
  * The proxied class establishes spies on certain methods,
@@ -665,7 +739,7 @@ function define(target, property, value) {
665
739
  */
666
740
  function createXMLHttpRequestProxy({ emitter, logger }) {
667
741
  return new Proxy(globalThis.XMLHttpRequest, { construct(target, args, newTarget) {
668
- logger.info("constructed new XMLHttpRequest");
742
+ logger.verbose("constructed new XMLHttpRequest");
669
743
  const originalRequest = Reflect.construct(target, args, newTarget);
670
744
  /**
671
745
  * @note Forward prototype descriptors onto the proxied object.
@@ -680,67 +754,65 @@ function createXMLHttpRequestProxy({ emitter, logger }) {
680
754
  xhrRequestController.onRequest = async function({ request, requestId }) {
681
755
  const controller = new RequestController(request, {
682
756
  passthrough: () => {
683
- this.logger.info("no mocked response received, performing request as-is...");
757
+ this.logger.verbose("no mocked response received, performing request as-is...");
684
758
  },
685
759
  respondWith: async (response) => {
686
- if (isResponseError(response)) {
687
- this.errorWith(/* @__PURE__ */ new TypeError("Network error"));
688
- return;
689
- }
690
760
  await this.respondWith(response);
691
761
  },
692
762
  errorWith: (reason) => {
693
- this.logger.info("request errored!", { error: reason });
763
+ this.logger.verbose("request errored %o", { error: reason });
694
764
  if (reason instanceof Error) this.errorWith(reason);
695
765
  }
766
+ }, {
767
+ logger,
768
+ requestId
696
769
  });
697
- this.logger.info("awaiting mocked response...");
698
- this.logger.info("emitting the \"request\" event for %s listener(s)...", emitter.listenerCount("request"));
770
+ this.logger.verbose("awaiting mocked response");
771
+ this.logger.verbose("emitting the \"request\" event for %s listener(s)...", emitter.listenerCount("request"));
699
772
  await handleRequest({
773
+ initiator: this.request,
700
774
  request,
701
775
  requestId,
702
776
  controller,
703
- emitter
777
+ emitter,
778
+ logger
704
779
  });
705
780
  };
706
- xhrRequestController.onResponse = async function({ response, isMockedResponse, request, requestId }) {
707
- this.logger.info("emitting the \"response\" event for %s listener(s)...", emitter.listenerCount("response"));
708
- emitter.emit("response", {
781
+ xhrRequestController.onResponse = async function({ response, responseType, request, requestId }) {
782
+ this.logger.verbose("emitting the \"response\" event for %s listener(s)...", emitter.listenerCount("response"));
783
+ await emitter.emitAsPromise(new HttpResponseEvent({
784
+ initiator: this.request,
709
785
  response,
710
- isMockedResponse,
786
+ responseType,
711
787
  request,
712
788
  requestId
713
- });
789
+ }));
714
790
  };
715
791
  return xhrRequestController.request;
716
792
  } });
717
793
  }
718
-
719
794
  //#endregion
720
- //#region src/interceptors/XMLHttpRequest/index.ts
721
- var XMLHttpRequestInterceptor = class XMLHttpRequestInterceptor extends Interceptor {
795
+ //#region src/interceptors/XMLHttpRequest/web.ts
796
+ const logger = createLogger("xhr");
797
+ var XMLHttpRequestInterceptor = class extends Interceptor {
722
798
  static {
723
799
  this.symbol = Symbol.for("xhr-interceptor");
724
800
  }
725
- constructor() {
726
- super(XMLHttpRequestInterceptor.symbol);
727
- }
728
- checkEnvironment() {
801
+ predicate() {
729
802
  return hasConfigurableGlobal("XMLHttpRequest");
730
803
  }
731
804
  setup() {
732
- const logger = this.logger.extend("setup");
733
- logger.info("patching global XMLHttpRequest...");
805
+ logger.verbose("patching \"XMLHttpRequest\"...");
734
806
  this.subscriptions.push(patchesRegistry.applyPatch(globalThis, "XMLHttpRequest", () => {
735
807
  return createXMLHttpRequestProxy({
736
808
  emitter: this.emitter,
737
- logger: this.logger
809
+ logger
738
810
  });
739
811
  }));
740
- logger.info("global XMLHttpRequest patched!", globalThis.XMLHttpRequest.name);
812
+ logger.verbose("global \"XMLHttpRequest\" patched!", globalThis.XMLHttpRequest.name);
741
813
  }
742
814
  };
743
-
744
815
  //#endregion
745
816
  export { XMLHttpRequestInterceptor as t };
746
- //# sourceMappingURL=XMLHttpRequest-DrZAf3w6.mjs.map
817
+
818
+ //# sourceMappingURL=web-C2oKsT3Q.js.map