@depup/mswjs__interceptors 0.41.3-depup.0

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