@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.
- package/lib/browser/interceptors/WebSocket/index.js +14 -1
- package/lib/browser/interceptors/WebSocket/index.js.map +1 -1
- package/lib/browser/interceptors/fetch/web.js +1 -1
- package/lib/browser/presets/browser.js +1 -1
- package/lib/browser/{web-CdcYFjgm.js → web-DUlFZEtz.js} +58 -3
- package/lib/browser/web-DUlFZEtz.js.map +1 -0
- package/lib/node/{batch-interceptor-ByEZVih3.js → batch-interceptor-DMOfd-9x.js} +2 -2
- package/lib/node/{batch-interceptor-ByEZVih3.js.map → batch-interceptor-DMOfd-9x.js.map} +1 -1
- package/lib/node/buffer-utils-B4FUq-l2.js +17 -0
- package/lib/node/buffer-utils-B4FUq-l2.js.map +1 -0
- package/lib/node/create-request-id-DHo-fRTV.js +14 -0
- package/lib/node/create-request-id-DHo-fRTV.js.map +1 -0
- package/lib/node/{fetch-utils-Dw1PsmtX.js → fetch-utils-D-_xeRlK.js} +3 -14
- package/lib/node/{fetch-utils-Dw1PsmtX.js.map → fetch-utils-D-_xeRlK.js.map} +1 -1
- package/lib/node/{has-configurable-global-BU1sT1u4.js → has-configurable-global-CT6-QYdg.js} +2 -2
- package/lib/node/{has-configurable-global-BU1sT1u4.js.map → has-configurable-global-CT6-QYdg.js.map} +1 -1
- package/lib/node/index.d.ts +2 -243
- package/lib/node/index.js +6 -25
- package/lib/node/index.js.map +1 -1
- package/lib/node/{buffer-utils-BvPY1Tc-.js → interceptor-C8qRPjxG.js} +2 -16
- package/lib/node/interceptor-C8qRPjxG.js.map +1 -0
- package/lib/node/interceptors/ClientRequest/index.js +3 -3
- package/lib/node/interceptors/WebSocket/index.d.ts +2 -0
- package/lib/node/interceptors/WebSocket/index.js +635 -0
- package/lib/node/interceptors/WebSocket/index.js.map +1 -0
- package/lib/node/interceptors/XMLHttpRequest/node.js +5 -5
- package/lib/node/interceptors/fetch/node.js +5 -5
- package/lib/node/interceptors/http/index.js +2 -2
- package/lib/node/interceptors/net/index.d.ts +16 -0
- package/lib/node/interceptors/net/index.js +1 -1
- package/lib/node/{net-Ca8p1rIe.js → net-Bh16MP4u.js} +82 -92
- package/lib/node/net-Bh16MP4u.js.map +1 -0
- package/lib/node/patches-registry-DxR5TEc-.js +76 -0
- package/lib/node/patches-registry-DxR5TEc-.js.map +1 -0
- package/lib/node/remote-http-interceptor.js +4 -4
- package/lib/node/resolve-web-socket-url-CSvNPLGi.js +25 -0
- package/lib/node/resolve-web-socket-url-CSvNPLGi.js.map +1 -0
- package/lib/node/{source-CIgPng7r.js → source-DHVO1vzq.js} +327 -213
- package/lib/node/source-DHVO1vzq.js.map +1 -0
- package/lib/node/websocket-CC0nB0md.d.ts +285 -0
- package/package.json +5 -2
- package/src/interceptors/WebSocket/index.ts +4 -1
- package/src/interceptors/fetch/web.ts +11 -2
- package/src/interceptors/http/http-parser/index.ts +9 -1
- package/src/interceptors/http/http-parser.ts +21 -4
- package/src/interceptors/http/source.ts +368 -283
- package/src/interceptors/net/index.ts +39 -12
- package/src/interceptors/net/socket-controller.ts +126 -66
- package/src/utils/clone-response.ts +72 -0
- package/src/utils/internal-connection.ts +22 -0
- package/lib/browser/web-CdcYFjgm.js.map +0 -1
- package/lib/node/buffer-utils-BvPY1Tc-.js.map +0 -1
- package/lib/node/net-Ca8p1rIe.js.map +0 -1
- 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 =
|
|
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:
|
|
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
|
-
|
|
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: {
|
|
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
|
}
|