@mswjs/interceptors 0.42.3 → 0.42.5

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 (54) hide show
  1. package/lib/browser/interceptors/WebSocket/index.js +14 -1
  2. package/lib/browser/interceptors/WebSocket/index.js.map +1 -1
  3. package/lib/browser/interceptors/fetch/web.js +1 -1
  4. package/lib/browser/presets/browser.js +1 -1
  5. package/lib/browser/{web-CdcYFjgm.js → web-DUlFZEtz.js} +58 -3
  6. package/lib/browser/web-DUlFZEtz.js.map +1 -0
  7. package/lib/node/{batch-interceptor-ByEZVih3.js → batch-interceptor-DMOfd-9x.js} +2 -2
  8. package/lib/node/{batch-interceptor-ByEZVih3.js.map → batch-interceptor-DMOfd-9x.js.map} +1 -1
  9. package/lib/node/buffer-utils-B4FUq-l2.js +17 -0
  10. package/lib/node/buffer-utils-B4FUq-l2.js.map +1 -0
  11. package/lib/node/create-request-id-DHo-fRTV.js +14 -0
  12. package/lib/node/create-request-id-DHo-fRTV.js.map +1 -0
  13. package/lib/node/{fetch-utils-Dw1PsmtX.js → fetch-utils-D-_xeRlK.js} +3 -14
  14. package/lib/node/{fetch-utils-Dw1PsmtX.js.map → fetch-utils-D-_xeRlK.js.map} +1 -1
  15. package/lib/node/{has-configurable-global-BU1sT1u4.js → has-configurable-global-CT6-QYdg.js} +2 -2
  16. package/lib/node/{has-configurable-global-BU1sT1u4.js.map → has-configurable-global-CT6-QYdg.js.map} +1 -1
  17. package/lib/node/index.d.ts +2 -243
  18. package/lib/node/index.js +6 -25
  19. package/lib/node/index.js.map +1 -1
  20. package/lib/node/{buffer-utils-BvPY1Tc-.js → interceptor-C8qRPjxG.js} +2 -16
  21. package/lib/node/interceptor-C8qRPjxG.js.map +1 -0
  22. package/lib/node/interceptors/ClientRequest/index.js +3 -3
  23. package/lib/node/interceptors/WebSocket/index.d.ts +2 -0
  24. package/lib/node/interceptors/WebSocket/index.js +635 -0
  25. package/lib/node/interceptors/WebSocket/index.js.map +1 -0
  26. package/lib/node/interceptors/XMLHttpRequest/node.js +5 -5
  27. package/lib/node/interceptors/fetch/node.js +5 -5
  28. package/lib/node/interceptors/http/index.js +2 -2
  29. package/lib/node/interceptors/net/index.d.ts +16 -0
  30. package/lib/node/interceptors/net/index.js +1 -1
  31. package/lib/node/{net-Ca8p1rIe.js → net-Bh16MP4u.js} +82 -92
  32. package/lib/node/net-Bh16MP4u.js.map +1 -0
  33. package/lib/node/patches-registry-DxR5TEc-.js +76 -0
  34. package/lib/node/patches-registry-DxR5TEc-.js.map +1 -0
  35. package/lib/node/remote-http-interceptor.js +4 -4
  36. package/lib/node/resolve-web-socket-url-CSvNPLGi.js +25 -0
  37. package/lib/node/resolve-web-socket-url-CSvNPLGi.js.map +1 -0
  38. package/lib/node/{source-CIgPng7r.js → source-DHVO1vzq.js} +327 -213
  39. package/lib/node/source-DHVO1vzq.js.map +1 -0
  40. package/lib/node/websocket-CC0nB0md.d.ts +285 -0
  41. package/package.json +5 -2
  42. package/src/interceptors/WebSocket/index.ts +4 -1
  43. package/src/interceptors/fetch/web.ts +11 -2
  44. package/src/interceptors/http/http-parser/index.ts +9 -1
  45. package/src/interceptors/http/http-parser.ts +21 -4
  46. package/src/interceptors/http/source.ts +368 -283
  47. package/src/interceptors/net/index.ts +39 -12
  48. package/src/interceptors/net/socket-controller.ts +126 -66
  49. package/src/utils/clone-response.ts +72 -0
  50. package/src/utils/internal-connection.ts +22 -0
  51. package/lib/browser/web-CdcYFjgm.js.map +0 -1
  52. package/lib/node/buffer-utils-BvPY1Tc-.js.map +0 -1
  53. package/lib/node/net-Ca8p1rIe.js.map +0 -1
  54. package/lib/node/source-CIgPng7r.js.map +0 -1
@@ -6,6 +6,7 @@ import { createRequestId } from '../../create-request-id'
6
6
  import { createNetworkError } from './utils/create-network-error'
7
7
  import { followFetchRedirect } from './utils/follow-redirect'
8
8
  import { decompressResponse } from './utils/decompression'
9
+ import { cloneResponse } from '../../utils/clone-response'
9
10
  import { hasConfigurableGlobal } from '../../utils/has-configurable-global'
10
11
  import { FetchResponse } from '../../utils/fetch-utils'
11
12
  import { isResponseError } from '../../utils/response-utils'
@@ -79,7 +80,7 @@ export class FetchInterceptor extends Interceptor<HttpRequestEventMap> {
79
80
  if (this.emitter.listenerCount('response') > 0) {
80
81
  logger.verbose('emitting the "response" event')
81
82
 
82
- const responseClone = FetchResponse.clone(originalResponse)
83
+ const [response, responseClone] = cloneResponse(originalResponse)
83
84
  await this.emitter.emitAsPromise(
84
85
  new HttpResponseEvent({
85
86
  initiator: requestCloneForResponseEvent,
@@ -89,6 +90,9 @@ export class FetchInterceptor extends Interceptor<HttpRequestEventMap> {
89
90
  responseType: 'original',
90
91
  })
91
92
  )
93
+
94
+ responsePromise.resolve(response)
95
+ return
92
96
  }
93
97
 
94
98
  // Resolve the response promise with the original response
@@ -151,6 +155,8 @@ export class FetchInterceptor extends Interceptor<HttpRequestEventMap> {
151
155
  if (this.emitter.listenerCount('response') > 0) {
152
156
  logger.verbose('emitting the "response" event')
153
157
 
158
+ const [callerResponse, responseClone] = cloneResponse(response)
159
+
154
160
  // Await the response listeners to finish before resolving
155
161
  // the response promise. This ensures all your logic finishes
156
162
  // before the interceptor resolves the pending response.
@@ -160,12 +166,15 @@ export class FetchInterceptor extends Interceptor<HttpRequestEventMap> {
160
166
  // Clone the mocked response for the "response" event listener.
161
167
  // This way, the listener can read the response and not lock its body
162
168
  // for the actual fetch consumer.
163
- response: FetchResponse.clone(response),
169
+ response: responseClone,
164
170
  responseType: 'mock',
165
171
  request,
166
172
  requestId,
167
173
  })
168
174
  )
175
+
176
+ responsePromise.resolve(callerResponse)
177
+ return
169
178
  }
170
179
 
171
180
  responsePromise.resolve(response)
@@ -29,6 +29,7 @@ const KIND_RESPONSE = constants.TYPE.RESPONSE
29
29
  type ParserKind = typeof KIND_REQUEST | typeof KIND_RESPONSE
30
30
 
31
31
  export interface ParserCallbacks<K extends ParserKind> {
32
+ onError?: (error: Error) => void
32
33
  onMessageBegin?: () => number | void
33
34
  onHeadersComplete?: (
34
35
  info: K extends typeof KIND_REQUEST
@@ -305,6 +306,13 @@ export class HttpParser<K extends ParserKind> {
305
306
  const buffer = new Uint8Array(llhttp_memory.buffer)
306
307
  const length = buffer.indexOf(0, errorPointer) - errorPointer
307
308
 
308
- throw new Error(readStringFrom(errorPointer, length))
309
+ const error = new Error(readStringFrom(errorPointer, length))
310
+
311
+ if (this[kCallbacks].onError) {
312
+ this[kCallbacks].onError(error)
313
+ return
314
+ }
315
+
316
+ throw error
309
317
  }
310
318
  }
@@ -4,6 +4,7 @@ import { FetchRequest, FetchResponse } from '../../utils/fetch-utils'
4
4
  import { HttpParser } from './http-parser/index'
5
5
 
6
6
  interface HttpRequestParserOptions {
7
+ onError: (error: Error) => void
7
8
  connectionOptions: {
8
9
  method?: string
9
10
  url: URL
@@ -18,6 +19,7 @@ export class HttpRequestParser extends HttpParser<1> {
18
19
 
19
20
  constructor(options: HttpRequestParserOptions) {
20
21
  super(1, {
22
+ onError: options.onError,
21
23
  onHeadersComplete: ({ rawHeaders, method, url: path, upgrade }) => {
22
24
  this.#upgrade = upgrade
23
25
  /**
@@ -82,6 +84,7 @@ export class HttpRequestParser extends HttpParser<1> {
82
84
  },
83
85
  onMessageComplete: () => {
84
86
  this.#requestBodyStream?.push(null)
87
+ this.#requestBodyStream = undefined
85
88
 
86
89
  /**
87
90
  * @note An upgraded exchange (e.g. "CONNECT", WebSocket) has
@@ -95,23 +98,30 @@ export class HttpRequestParser extends HttpParser<1> {
95
98
  })
96
99
  }
97
100
 
98
- public free(): void {
101
+ public free(error?: Error): void {
99
102
  this.destroy()
100
- this.#requestBodyStream?.destroy()
103
+ this.#requestBodyStream?.destroy(error)
101
104
  this.#requestBodyStream = undefined
102
105
  }
103
106
  }
104
107
 
105
108
  export class HttpResponseParser extends HttpParser<2> {
106
109
  #responseBodyStream?: Readable | null
110
+ #status = 0
107
111
 
108
- constructor(options: { onResponse: (response: Response) => void }) {
112
+ constructor(options: {
113
+ onResponse: (response: Response) => void
114
+ onError: (error: Error) => void
115
+ onMessageComplete?: (status: number) => void
116
+ }) {
109
117
  super(2, {
118
+ onError: options.onError,
110
119
  onHeadersComplete: ({
111
120
  rawHeaders,
112
121
  statusCode: status,
113
122
  statusMessage: statusText,
114
123
  }) => {
124
+ this.#status = status
115
125
  const headers = FetchResponse.parseRawHeaders([...rawHeaders])
116
126
 
117
127
  const response = new FetchResponse(
@@ -139,12 +149,19 @@ export class HttpResponseParser extends HttpParser<2> {
139
149
  },
140
150
  onMessageComplete: () => {
141
151
  this.#responseBodyStream?.push(null)
152
+ this.#responseBodyStream = null
153
+ options.onMessageComplete?.(this.#status)
142
154
  },
143
155
  })
144
156
  }
145
157
 
146
- public free(): void {
158
+ public free(error?: Error): void {
147
159
  this.destroy()
160
+
161
+ if (error) {
162
+ this.#responseBodyStream?.destroy(error)
163
+ }
164
+
148
165
  this.#responseBodyStream = null
149
166
  }
150
167
  }