@mswjs/interceptors 0.23.0 → 0.24.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/lib/{node/chunk-IHW3ERPT.js → browser/chunk-3LFH2WCF.js} +1 -9
- package/lib/{node/chunk-MPFSBY4S.js → browser/chunk-4CFMDU7Z.js} +36 -9
- package/lib/{node/chunk-LTX5IGCQ.mjs → browser/chunk-7II4SWKS.mjs} +0 -8
- package/lib/browser/{chunk-DWXGORCS.mjs → chunk-BRIUGDYQ.mjs} +60 -11
- package/lib/browser/{chunk-MW6NCDWE.mjs → chunk-GXJLJMOT.mjs} +33 -7
- package/lib/browser/{chunk-AKTXHQ7X.mjs → chunk-KSCN3JS4.mjs} +16 -2
- package/lib/browser/{chunk-3GCTA2IC.js → chunk-XAQQ5IUC.js} +20 -6
- package/lib/browser/{chunk-OBNZMCHS.js → chunk-Y4XXQXAW.js} +67 -18
- package/lib/browser/index.d.ts +2 -2
- package/lib/browser/index.js +4 -4
- package/lib/browser/index.mjs +2 -2
- package/lib/browser/interceptors/XMLHttpRequest/index.js +4 -4
- package/lib/browser/interceptors/XMLHttpRequest/index.mjs +3 -3
- package/lib/browser/interceptors/fetch/index.js +3 -3
- package/lib/browser/interceptors/fetch/index.mjs +2 -2
- package/lib/browser/presets/browser.js +6 -6
- package/lib/browser/presets/browser.mjs +4 -4
- package/lib/node/RemoteHttpInterceptor.d.ts +2 -3
- package/lib/node/RemoteHttpInterceptor.js +15 -16
- package/lib/node/RemoteHttpInterceptor.mjs +9 -10
- package/lib/node/chunk-3LFH2WCF.js +21 -0
- package/lib/node/chunk-7II4SWKS.mjs +21 -0
- package/lib/node/{chunk-VJDB3MIV.js → chunk-MVPEJK4V.js} +2 -2
- package/lib/node/{chunk-GLYFVYMU.js → chunk-NM5BWVVB.js} +64 -15
- package/lib/node/{chunk-4YIZAGXJ.js → chunk-OOSIWXHX.js} +41 -8
- package/lib/node/{chunk-4LRRTLLD.mjs → chunk-PSIO3L7D.mjs} +39 -6
- package/lib/node/{chunk-Y5QA6OEZ.mjs → chunk-RGYCLCLK.mjs} +33 -10
- package/lib/node/{chunk-CO6XRA5H.mjs → chunk-SOWOSKLO.mjs} +60 -11
- package/lib/node/{chunk-NUSH7ACE.mjs → chunk-VS3GJPUE.mjs} +1 -1
- package/lib/{browser/chunk-7VJMJSIJ.js → node/chunk-XYZRP5S2.js} +35 -13
- package/lib/node/index.js +4 -4
- package/lib/node/index.mjs +3 -3
- package/lib/node/interceptors/ClientRequest/index.js +3 -3
- package/lib/node/interceptors/ClientRequest/index.mjs +2 -2
- package/lib/node/interceptors/XMLHttpRequest/index.js +4 -4
- package/lib/node/interceptors/XMLHttpRequest/index.mjs +3 -3
- package/lib/node/interceptors/fetch/index.js +17 -3
- package/lib/node/interceptors/fetch/index.mjs +16 -2
- package/lib/node/presets/node.js +6 -6
- package/lib/node/presets/node.mjs +4 -4
- package/package.json +19 -22
- package/src/RemoteHttpInterceptor.ts +6 -7
- package/src/interceptors/ClientRequest/index.test.ts +28 -0
- package/src/interceptors/ClientRequest/utils/createRequest.ts +0 -1
- package/src/interceptors/ClientRequest/utils/createResponse.ts +34 -3
- package/src/interceptors/XMLHttpRequest/XMLHttpRequestController.ts +15 -7
- package/src/interceptors/XMLHttpRequest/utils/createResponse.ts +40 -4
- package/src/interceptors/fetch/index.ts +21 -1
- package/src/utils/bufferUtils.ts +0 -2
- package/lib/browser/chunk-MQA5WAD4.mjs +0 -2139
- package/lib/browser/chunk-QAZ3SPQZ.js +0 -2139
- package/src/shims/webEncoding.ts +0 -9
package/README.md
CHANGED
|
@@ -206,7 +206,7 @@ All HTTP request interceptors emit a "request" event. In the listener to this ev
|
|
|
206
206
|
> There are many ways to describe a request in Node.js but this library coerces different request definitions to a single specification-compliant `Request` instance to make the handling consistent.
|
|
207
207
|
|
|
208
208
|
```js
|
|
209
|
-
interceptor.on('
|
|
209
|
+
interceptor.on('request', ({ request, requestId }) => {
|
|
210
210
|
console.log(request.method, request.url)
|
|
211
211
|
})
|
|
212
212
|
```
|
|
@@ -1,12 +1,4 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports, "__esModule", {value: true})
|
|
2
|
-
|
|
3
|
-
var _chunkMPFSBY4Sjs = require('./chunk-MPFSBY4S.js');
|
|
4
|
-
|
|
5
|
-
// src/shims/webEncoding.ts
|
|
6
|
-
var TextEncoder = typeof globalThis.TextEncoder === "undefined" ? _chunkMPFSBY4Sjs.__require.call(void 0, "util").TextEncoder : globalThis.TextEncoder;
|
|
7
|
-
var TextDecoder = typeof globalThis.TextDecoder === "undefined" ? _chunkMPFSBY4Sjs.__require.call(void 0, "util").TextDecoder : globalThis.TextDecoder;
|
|
8
|
-
|
|
9
|
-
// src/utils/bufferUtils.ts
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true});// src/utils/bufferUtils.ts
|
|
10
2
|
var encoder = new TextEncoder();
|
|
11
3
|
function encodeBuffer(text) {
|
|
12
4
|
return encoder.encode(text);
|
|
@@ -1,10 +1,5 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports, "__esModule", {value: true})
|
|
2
|
-
|
|
3
|
-
}) : x)(function(x) {
|
|
4
|
-
if (typeof require !== "undefined")
|
|
5
|
-
return require.apply(this, arguments);
|
|
6
|
-
throw new Error('Dynamic require of "' + x + '" is not supported');
|
|
7
|
-
});
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true});// src/glossary.ts
|
|
2
|
+
var IS_PATCHED_MODULE = Symbol("isPatchedModule");
|
|
8
3
|
|
|
9
4
|
// src/Interceptor.ts
|
|
10
5
|
var _logger = require('@open-draft/logger');
|
|
@@ -71,6 +66,11 @@ var AsyncEventEmitter = class extends _stricteventemitter.Emitter {
|
|
|
71
66
|
});
|
|
72
67
|
return super.emit(eventName, ...data);
|
|
73
68
|
}
|
|
69
|
+
/**
|
|
70
|
+
* Returns a promise that resolves when all the listeners for the given event
|
|
71
|
+
* has been called. Awaits asynchronous listeners.
|
|
72
|
+
* If the event has no listeners, resolves immediately.
|
|
73
|
+
*/
|
|
74
74
|
async untilIdle(eventName, filter = () => true) {
|
|
75
75
|
const listenersQueue = this.queue.get(eventName) || [];
|
|
76
76
|
await Promise.all(
|
|
@@ -112,6 +112,11 @@ var AsyncEventEmitter = class extends _stricteventemitter.Emitter {
|
|
|
112
112
|
this.readyState = "ACTIVE" /* ACTIVE */;
|
|
113
113
|
logger.info("set state to:", this.readyState);
|
|
114
114
|
}
|
|
115
|
+
/**
|
|
116
|
+
* Deactivate this event emitter.
|
|
117
|
+
* Deactivated emitter can no longer emit and listen to events
|
|
118
|
+
* and needs to be activated again in order to do so.
|
|
119
|
+
*/
|
|
115
120
|
deactivate() {
|
|
116
121
|
const logger = this.logger.extend("deactivate");
|
|
117
122
|
logger.info("removing all listeners...");
|
|
@@ -126,7 +131,10 @@ var AsyncEventEmitter = class extends _stricteventemitter.Emitter {
|
|
|
126
131
|
|
|
127
132
|
// src/Interceptor.ts
|
|
128
133
|
function getGlobalSymbol(symbol) {
|
|
129
|
-
return
|
|
134
|
+
return (
|
|
135
|
+
// @ts-ignore https://github.com/Microsoft/TypeScript/issues/24587
|
|
136
|
+
globalThis[symbol] || void 0
|
|
137
|
+
);
|
|
130
138
|
}
|
|
131
139
|
function setGlobalSymbol(symbol, value) {
|
|
132
140
|
globalThis[symbol] = value;
|
|
@@ -152,9 +160,17 @@ var Interceptor = class {
|
|
|
152
160
|
this.emitter.setMaxListeners(0);
|
|
153
161
|
this.logger.info("constructing the interceptor...");
|
|
154
162
|
}
|
|
163
|
+
/**
|
|
164
|
+
* Determine if this interceptor can be applied
|
|
165
|
+
* in the current environment.
|
|
166
|
+
*/
|
|
155
167
|
checkEnvironment() {
|
|
156
168
|
return true;
|
|
157
169
|
}
|
|
170
|
+
/**
|
|
171
|
+
* Apply this interceptor to the current process.
|
|
172
|
+
* Returns an already running interceptor instance if it's present.
|
|
173
|
+
*/
|
|
158
174
|
apply() {
|
|
159
175
|
const logger = this.logger.extend("apply");
|
|
160
176
|
logger.info("applying the interceptor...");
|
|
@@ -189,8 +205,16 @@ var Interceptor = class {
|
|
|
189
205
|
this.setInstance();
|
|
190
206
|
this.readyState = "APPLIED" /* APPLIED */;
|
|
191
207
|
}
|
|
208
|
+
/**
|
|
209
|
+
* Setup the module augments and stubs necessary for this interceptor.
|
|
210
|
+
* This method is not run if there's a running interceptor instance
|
|
211
|
+
* to prevent instantiating an interceptor multiple times.
|
|
212
|
+
*/
|
|
192
213
|
setup() {
|
|
193
214
|
}
|
|
215
|
+
/**
|
|
216
|
+
* Listen to the interceptor's public events.
|
|
217
|
+
*/
|
|
194
218
|
on(eventName, listener) {
|
|
195
219
|
const logger = this.logger.extend("on");
|
|
196
220
|
if (this.readyState === "DISPOSING" /* DISPOSING */ || this.readyState === "DISPOSED" /* DISPOSED */) {
|
|
@@ -200,6 +224,9 @@ var Interceptor = class {
|
|
|
200
224
|
logger.info('adding "%s" event listener:', eventName, listener.name);
|
|
201
225
|
this.emitter.on(eventName, listener);
|
|
202
226
|
}
|
|
227
|
+
/**
|
|
228
|
+
* Disposes of any side-effects this interceptor has introduced.
|
|
229
|
+
*/
|
|
203
230
|
dispose() {
|
|
204
231
|
const logger = this.logger.extend("dispose");
|
|
205
232
|
if (this.readyState === "DISPOSED" /* DISPOSED */) {
|
|
@@ -248,4 +275,4 @@ var Interceptor = class {
|
|
|
248
275
|
|
|
249
276
|
|
|
250
277
|
|
|
251
|
-
exports.
|
|
278
|
+
exports.IS_PATCHED_MODULE = IS_PATCHED_MODULE; exports.getGlobalSymbol = getGlobalSymbol; exports.deleteGlobalSymbol = deleteGlobalSymbol; exports.InterceptorReadyState = InterceptorReadyState; exports.Interceptor = Interceptor;
|
|
@@ -1,11 +1,3 @@
|
|
|
1
|
-
import {
|
|
2
|
-
__require
|
|
3
|
-
} from "./chunk-Y5QA6OEZ.mjs";
|
|
4
|
-
|
|
5
|
-
// src/shims/webEncoding.ts
|
|
6
|
-
var TextEncoder = typeof globalThis.TextEncoder === "undefined" ? __require("util").TextEncoder : globalThis.TextEncoder;
|
|
7
|
-
var TextDecoder = typeof globalThis.TextDecoder === "undefined" ? __require("util").TextDecoder : globalThis.TextDecoder;
|
|
8
|
-
|
|
9
1
|
// src/utils/bufferUtils.ts
|
|
10
2
|
var encoder = new TextEncoder();
|
|
11
3
|
function encodeBuffer(text) {
|
|
@@ -2,7 +2,7 @@ import {
|
|
|
2
2
|
decodeBuffer,
|
|
3
3
|
encodeBuffer,
|
|
4
4
|
toArrayBuffer
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-7II4SWKS.mjs";
|
|
6
6
|
import {
|
|
7
7
|
toInteractiveRequest,
|
|
8
8
|
uuidv4
|
|
@@ -10,7 +10,7 @@ import {
|
|
|
10
10
|
import {
|
|
11
11
|
IS_PATCHED_MODULE,
|
|
12
12
|
Interceptor
|
|
13
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-GXJLJMOT.mjs";
|
|
14
14
|
|
|
15
15
|
// src/interceptors/XMLHttpRequest/index.ts
|
|
16
16
|
import { invariant as invariant2 } from "outvariant";
|
|
@@ -20,7 +20,7 @@ import { until } from "@open-draft/until";
|
|
|
20
20
|
|
|
21
21
|
// src/interceptors/XMLHttpRequest/XMLHttpRequestController.ts
|
|
22
22
|
import { invariant } from "outvariant";
|
|
23
|
-
import {
|
|
23
|
+
import { isNodeProcess } from "is-node-process";
|
|
24
24
|
|
|
25
25
|
// src/interceptors/XMLHttpRequest/utils/concatArrayBuffer.ts
|
|
26
26
|
function concatArrayBuffer(left, right) {
|
|
@@ -202,17 +202,34 @@ function parseJson(data) {
|
|
|
202
202
|
}
|
|
203
203
|
|
|
204
204
|
// src/interceptors/XMLHttpRequest/utils/createResponse.ts
|
|
205
|
-
|
|
206
|
-
function createResponse(request,
|
|
207
|
-
|
|
205
|
+
var statusCodesWithoutBody = [204, 205, 304];
|
|
206
|
+
function createResponse(request, body) {
|
|
207
|
+
const responseBodyOrNull = statusCodesWithoutBody.includes(request.status) ? null : body;
|
|
208
|
+
return new Response(responseBodyOrNull, {
|
|
208
209
|
status: request.status,
|
|
209
210
|
statusText: request.statusText,
|
|
210
|
-
headers:
|
|
211
|
+
headers: createHeadersFromXMLHttpReqestHeaders(
|
|
212
|
+
request.getAllResponseHeaders()
|
|
213
|
+
)
|
|
211
214
|
});
|
|
212
215
|
}
|
|
216
|
+
function createHeadersFromXMLHttpReqestHeaders(headersString) {
|
|
217
|
+
const headers = new Headers();
|
|
218
|
+
const lines = headersString.split(/[\r\n]+/);
|
|
219
|
+
for (const line of lines) {
|
|
220
|
+
if (line.trim() === "") {
|
|
221
|
+
continue;
|
|
222
|
+
}
|
|
223
|
+
const [name, ...parts] = line.split(": ");
|
|
224
|
+
const value = parts.join(": ");
|
|
225
|
+
headers.append(name, value);
|
|
226
|
+
}
|
|
227
|
+
return headers;
|
|
228
|
+
}
|
|
213
229
|
|
|
214
230
|
// src/interceptors/XMLHttpRequest/XMLHttpRequestController.ts
|
|
215
231
|
var IS_MOCKED_RESPONSE = Symbol("isMockedResponse");
|
|
232
|
+
var IS_NODE = isNodeProcess();
|
|
216
233
|
var XMLHttpRequestController = class {
|
|
217
234
|
constructor(initialRequest, logger) {
|
|
218
235
|
this.initialRequest = initialRequest;
|
|
@@ -220,6 +237,7 @@ var XMLHttpRequestController = class {
|
|
|
220
237
|
this.method = "GET";
|
|
221
238
|
this.url = null;
|
|
222
239
|
this.events = /* @__PURE__ */ new Map();
|
|
240
|
+
this.requestId = uuidv4();
|
|
223
241
|
this.requestHeaders = new Headers();
|
|
224
242
|
this.responseBuffer = new Uint8Array();
|
|
225
243
|
this.request = createProxy(initialRequest, {
|
|
@@ -242,7 +260,6 @@ var XMLHttpRequestController = class {
|
|
|
242
260
|
switch (methodName) {
|
|
243
261
|
case "open": {
|
|
244
262
|
const [method, url] = args;
|
|
245
|
-
this.requestId = uuidv4();
|
|
246
263
|
if (typeof url === "undefined") {
|
|
247
264
|
this.method = "GET";
|
|
248
265
|
this.url = toAbsoluteUrl(method);
|
|
@@ -275,6 +292,11 @@ var XMLHttpRequestController = class {
|
|
|
275
292
|
if (typeof this.onResponse !== "undefined") {
|
|
276
293
|
const fetchResponse = createResponse(
|
|
277
294
|
this.request,
|
|
295
|
+
/**
|
|
296
|
+
* The `response` property is the right way to read
|
|
297
|
+
* the ambiguous response body, as the request's "responseType" may differ.
|
|
298
|
+
* @see https://xhr.spec.whatwg.org/#the-response-attribute
|
|
299
|
+
*/
|
|
278
300
|
this.request.response
|
|
279
301
|
);
|
|
280
302
|
this.onResponse.call(this, {
|
|
@@ -296,7 +318,9 @@ var XMLHttpRequestController = class {
|
|
|
296
318
|
"request callback settled but request has not been handled (readystate %d), performing as-is...",
|
|
297
319
|
this.request.readyState
|
|
298
320
|
);
|
|
299
|
-
|
|
321
|
+
if (IS_NODE) {
|
|
322
|
+
this.request.setRequestHeader("X-Request-Id", this.requestId);
|
|
323
|
+
}
|
|
300
324
|
return invoke();
|
|
301
325
|
}
|
|
302
326
|
});
|
|
@@ -315,6 +339,10 @@ var XMLHttpRequestController = class {
|
|
|
315
339
|
this.events.set(eventName, nextEvents);
|
|
316
340
|
this.logger.info('registered event "%s"', eventName, listener.name);
|
|
317
341
|
}
|
|
342
|
+
/**
|
|
343
|
+
* Responds to the current request with the given
|
|
344
|
+
* Fetch API `Response` instance.
|
|
345
|
+
*/
|
|
318
346
|
respondWith(response) {
|
|
319
347
|
this.logger.info(
|
|
320
348
|
"responding with a mocked response: %d %s",
|
|
@@ -350,7 +378,10 @@ var XMLHttpRequestController = class {
|
|
|
350
378
|
this.logger.info("headers not received yet, returning empty string");
|
|
351
379
|
return "";
|
|
352
380
|
}
|
|
353
|
-
const
|
|
381
|
+
const headersList = Array.from(response.headers.entries());
|
|
382
|
+
const allHeaders = headersList.map(([headerName, headerValue]) => {
|
|
383
|
+
return `${headerName}: ${headerValue}`;
|
|
384
|
+
}).join("\r\n");
|
|
354
385
|
this.logger.info("resolved all response headers to", allHeaders);
|
|
355
386
|
return allHeaders;
|
|
356
387
|
}
|
|
@@ -373,7 +404,12 @@ var XMLHttpRequestController = class {
|
|
|
373
404
|
get: () => this.responseXML
|
|
374
405
|
}
|
|
375
406
|
});
|
|
376
|
-
const totalResponseBodyLength = response.headers.has("Content-Length") ? Number(response.headers.get("Content-Length")) :
|
|
407
|
+
const totalResponseBodyLength = response.headers.has("Content-Length") ? Number(response.headers.get("Content-Length")) : (
|
|
408
|
+
/**
|
|
409
|
+
* @todo Infer the response body length from the response body.
|
|
410
|
+
*/
|
|
411
|
+
void 0
|
|
412
|
+
);
|
|
377
413
|
this.logger.info("calculated response body length", totalResponseBodyLength);
|
|
378
414
|
this.trigger("loadstart", {
|
|
379
415
|
loaded: 0,
|
|
@@ -504,6 +540,9 @@ var XMLHttpRequestController = class {
|
|
|
504
540
|
this.trigger("error");
|
|
505
541
|
this.trigger("loadend");
|
|
506
542
|
}
|
|
543
|
+
/**
|
|
544
|
+
* Transitions this request's `readyState` to the given one.
|
|
545
|
+
*/
|
|
507
546
|
setReadyState(nextReadyState) {
|
|
508
547
|
this.logger.info(
|
|
509
548
|
"setReadyState: %d -> %d",
|
|
@@ -521,6 +560,9 @@ var XMLHttpRequestController = class {
|
|
|
521
560
|
this.trigger("readystatechange");
|
|
522
561
|
}
|
|
523
562
|
}
|
|
563
|
+
/**
|
|
564
|
+
* Triggers given event on the `XMLHttpRequest` instance.
|
|
565
|
+
*/
|
|
524
566
|
trigger(eventName, options) {
|
|
525
567
|
const callback = this.request[`on${eventName}`];
|
|
526
568
|
const event = createEvent(this.request, eventName, options);
|
|
@@ -540,11 +582,17 @@ var XMLHttpRequestController = class {
|
|
|
540
582
|
}
|
|
541
583
|
}
|
|
542
584
|
}
|
|
585
|
+
/**
|
|
586
|
+
* Converts this `XMLHttpRequest` instance into a Fetch API `Request` instance.
|
|
587
|
+
*/
|
|
543
588
|
toFetchApiRequest() {
|
|
544
589
|
this.logger.info("converting request to a Fetch API Request...");
|
|
545
590
|
const fetchRequest = new Request(this.url.href, {
|
|
546
591
|
method: this.method,
|
|
547
592
|
headers: this.requestHeaders,
|
|
593
|
+
/**
|
|
594
|
+
* @see https://xhr.spec.whatwg.org/#cross-origin-credentials
|
|
595
|
+
*/
|
|
548
596
|
credentials: this.request.withCredentials ? "include" : "same-origin",
|
|
549
597
|
body: ["GET", "HEAD"].includes(this.method) ? null : this.requestBody
|
|
550
598
|
});
|
|
@@ -578,6 +626,7 @@ function toAbsoluteUrl(url) {
|
|
|
578
626
|
}
|
|
579
627
|
function define(target, property, value) {
|
|
580
628
|
Reflect.defineProperty(target, property, {
|
|
629
|
+
// Ensure writable properties to allow redefining readonly properties.
|
|
581
630
|
writable: true,
|
|
582
631
|
enumerable: true,
|
|
583
632
|
value
|
|
@@ -1,8 +1,3 @@
|
|
|
1
|
-
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
2
|
-
var __commonJS = (cb, mod) => function __require() {
|
|
3
|
-
return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
|
|
4
|
-
};
|
|
5
|
-
|
|
6
1
|
// src/glossary.ts
|
|
7
2
|
var IS_PATCHED_MODULE = Symbol("isPatchedModule");
|
|
8
3
|
|
|
@@ -71,6 +66,11 @@ var AsyncEventEmitter = class extends Emitter {
|
|
|
71
66
|
});
|
|
72
67
|
return super.emit(eventName, ...data);
|
|
73
68
|
}
|
|
69
|
+
/**
|
|
70
|
+
* Returns a promise that resolves when all the listeners for the given event
|
|
71
|
+
* has been called. Awaits asynchronous listeners.
|
|
72
|
+
* If the event has no listeners, resolves immediately.
|
|
73
|
+
*/
|
|
74
74
|
async untilIdle(eventName, filter = () => true) {
|
|
75
75
|
const listenersQueue = this.queue.get(eventName) || [];
|
|
76
76
|
await Promise.all(
|
|
@@ -112,6 +112,11 @@ var AsyncEventEmitter = class extends Emitter {
|
|
|
112
112
|
this.readyState = "ACTIVE" /* ACTIVE */;
|
|
113
113
|
logger.info("set state to:", this.readyState);
|
|
114
114
|
}
|
|
115
|
+
/**
|
|
116
|
+
* Deactivate this event emitter.
|
|
117
|
+
* Deactivated emitter can no longer emit and listen to events
|
|
118
|
+
* and needs to be activated again in order to do so.
|
|
119
|
+
*/
|
|
115
120
|
deactivate() {
|
|
116
121
|
const logger = this.logger.extend("deactivate");
|
|
117
122
|
logger.info("removing all listeners...");
|
|
@@ -126,7 +131,10 @@ var AsyncEventEmitter = class extends Emitter {
|
|
|
126
131
|
|
|
127
132
|
// src/Interceptor.ts
|
|
128
133
|
function getGlobalSymbol(symbol) {
|
|
129
|
-
return
|
|
134
|
+
return (
|
|
135
|
+
// @ts-ignore https://github.com/Microsoft/TypeScript/issues/24587
|
|
136
|
+
globalThis[symbol] || void 0
|
|
137
|
+
);
|
|
130
138
|
}
|
|
131
139
|
function setGlobalSymbol(symbol, value) {
|
|
132
140
|
globalThis[symbol] = value;
|
|
@@ -152,9 +160,17 @@ var Interceptor = class {
|
|
|
152
160
|
this.emitter.setMaxListeners(0);
|
|
153
161
|
this.logger.info("constructing the interceptor...");
|
|
154
162
|
}
|
|
163
|
+
/**
|
|
164
|
+
* Determine if this interceptor can be applied
|
|
165
|
+
* in the current environment.
|
|
166
|
+
*/
|
|
155
167
|
checkEnvironment() {
|
|
156
168
|
return true;
|
|
157
169
|
}
|
|
170
|
+
/**
|
|
171
|
+
* Apply this interceptor to the current process.
|
|
172
|
+
* Returns an already running interceptor instance if it's present.
|
|
173
|
+
*/
|
|
158
174
|
apply() {
|
|
159
175
|
const logger = this.logger.extend("apply");
|
|
160
176
|
logger.info("applying the interceptor...");
|
|
@@ -189,8 +205,16 @@ var Interceptor = class {
|
|
|
189
205
|
this.setInstance();
|
|
190
206
|
this.readyState = "APPLIED" /* APPLIED */;
|
|
191
207
|
}
|
|
208
|
+
/**
|
|
209
|
+
* Setup the module augments and stubs necessary for this interceptor.
|
|
210
|
+
* This method is not run if there's a running interceptor instance
|
|
211
|
+
* to prevent instantiating an interceptor multiple times.
|
|
212
|
+
*/
|
|
192
213
|
setup() {
|
|
193
214
|
}
|
|
215
|
+
/**
|
|
216
|
+
* Listen to the interceptor's public events.
|
|
217
|
+
*/
|
|
194
218
|
on(eventName, listener) {
|
|
195
219
|
const logger = this.logger.extend("on");
|
|
196
220
|
if (this.readyState === "DISPOSING" /* DISPOSING */ || this.readyState === "DISPOSED" /* DISPOSED */) {
|
|
@@ -200,6 +224,9 @@ var Interceptor = class {
|
|
|
200
224
|
logger.info('adding "%s" event listener:', eventName, listener.name);
|
|
201
225
|
this.emitter.on(eventName, listener);
|
|
202
226
|
}
|
|
227
|
+
/**
|
|
228
|
+
* Disposes of any side-effects this interceptor has introduced.
|
|
229
|
+
*/
|
|
203
230
|
dispose() {
|
|
204
231
|
const logger = this.logger.extend("dispose");
|
|
205
232
|
if (this.readyState === "DISPOSED" /* DISPOSED */) {
|
|
@@ -243,7 +270,6 @@ var Interceptor = class {
|
|
|
243
270
|
};
|
|
244
271
|
|
|
245
272
|
export {
|
|
246
|
-
__commonJS,
|
|
247
273
|
IS_PATCHED_MODULE,
|
|
248
274
|
getGlobalSymbol,
|
|
249
275
|
deleteGlobalSymbol,
|
|
@@ -5,9 +5,10 @@ import {
|
|
|
5
5
|
import {
|
|
6
6
|
IS_PATCHED_MODULE,
|
|
7
7
|
Interceptor
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-GXJLJMOT.mjs";
|
|
9
9
|
|
|
10
10
|
// src/interceptors/fetch/index.ts
|
|
11
|
+
import { DeferredPromise } from "@open-draft/deferred-promise";
|
|
11
12
|
import { invariant } from "outvariant";
|
|
12
13
|
import { until } from "@open-draft/until";
|
|
13
14
|
var _FetchInterceptor = class extends Interceptor {
|
|
@@ -38,18 +39,31 @@ var _FetchInterceptor = class extends Interceptor {
|
|
|
38
39
|
requestId
|
|
39
40
|
});
|
|
40
41
|
this.logger.info("awaiting for the mocked response...");
|
|
42
|
+
const signal = interactiveRequest.signal;
|
|
43
|
+
const requestAborted = new DeferredPromise();
|
|
44
|
+
signal.addEventListener(
|
|
45
|
+
"abort",
|
|
46
|
+
() => {
|
|
47
|
+
requestAborted.reject(signal.reason);
|
|
48
|
+
},
|
|
49
|
+
{ once: true }
|
|
50
|
+
);
|
|
41
51
|
const resolverResult = await until(async () => {
|
|
42
|
-
|
|
52
|
+
const allListenersResolved = this.emitter.untilIdle(
|
|
43
53
|
"request",
|
|
44
54
|
({ args: [{ requestId: pendingRequestId }] }) => {
|
|
45
55
|
return pendingRequestId === requestId;
|
|
46
56
|
}
|
|
47
57
|
);
|
|
58
|
+
await Promise.race([requestAborted, allListenersResolved]);
|
|
48
59
|
this.logger.info("all request listeners have been resolved!");
|
|
49
60
|
const [mockedResponse2] = await interactiveRequest.respondWith.invoked();
|
|
50
61
|
this.logger.info("event.respondWith called with:", mockedResponse2);
|
|
51
62
|
return mockedResponse2;
|
|
52
63
|
});
|
|
64
|
+
if (requestAborted.state === "rejected") {
|
|
65
|
+
return Promise.reject(requestAborted.rejectionReason);
|
|
66
|
+
}
|
|
53
67
|
if (resolverResult.error) {
|
|
54
68
|
const error = Object.assign(new TypeError("Failed to fetch"), {
|
|
55
69
|
cause: resolverResult.error
|
|
@@ -5,12 +5,13 @@ var _chunkPCFJD76Xjs = require('./chunk-PCFJD76X.js');
|
|
|
5
5
|
|
|
6
6
|
|
|
7
7
|
|
|
8
|
-
var
|
|
8
|
+
var _chunk4CFMDU7Zjs = require('./chunk-4CFMDU7Z.js');
|
|
9
9
|
|
|
10
10
|
// src/interceptors/fetch/index.ts
|
|
11
|
+
var _deferredpromise = require('@open-draft/deferred-promise');
|
|
11
12
|
var _outvariant = require('outvariant');
|
|
12
13
|
var _until = require('@open-draft/until');
|
|
13
|
-
var _FetchInterceptor = class extends
|
|
14
|
+
var _FetchInterceptor = class extends _chunk4CFMDU7Zjs.Interceptor {
|
|
14
15
|
constructor() {
|
|
15
16
|
super(_FetchInterceptor.symbol);
|
|
16
17
|
}
|
|
@@ -20,7 +21,7 @@ var _FetchInterceptor = class extends _chunk7VJMJSIJjs.Interceptor {
|
|
|
20
21
|
setup() {
|
|
21
22
|
const pureFetch = globalThis.fetch;
|
|
22
23
|
_outvariant.invariant.call(void 0,
|
|
23
|
-
!pureFetch[
|
|
24
|
+
!pureFetch[_chunk4CFMDU7Zjs.IS_PATCHED_MODULE],
|
|
24
25
|
'Failed to patch the "fetch" module: already patched.'
|
|
25
26
|
);
|
|
26
27
|
globalThis.fetch = async (input, init) => {
|
|
@@ -38,18 +39,31 @@ var _FetchInterceptor = class extends _chunk7VJMJSIJjs.Interceptor {
|
|
|
38
39
|
requestId
|
|
39
40
|
});
|
|
40
41
|
this.logger.info("awaiting for the mocked response...");
|
|
42
|
+
const signal = interactiveRequest.signal;
|
|
43
|
+
const requestAborted = new (0, _deferredpromise.DeferredPromise)();
|
|
44
|
+
signal.addEventListener(
|
|
45
|
+
"abort",
|
|
46
|
+
() => {
|
|
47
|
+
requestAborted.reject(signal.reason);
|
|
48
|
+
},
|
|
49
|
+
{ once: true }
|
|
50
|
+
);
|
|
41
51
|
const resolverResult = await _until.until.call(void 0, async () => {
|
|
42
|
-
|
|
52
|
+
const allListenersResolved = this.emitter.untilIdle(
|
|
43
53
|
"request",
|
|
44
54
|
({ args: [{ requestId: pendingRequestId }] }) => {
|
|
45
55
|
return pendingRequestId === requestId;
|
|
46
56
|
}
|
|
47
57
|
);
|
|
58
|
+
await Promise.race([requestAborted, allListenersResolved]);
|
|
48
59
|
this.logger.info("all request listeners have been resolved!");
|
|
49
60
|
const [mockedResponse2] = await interactiveRequest.respondWith.invoked();
|
|
50
61
|
this.logger.info("event.respondWith called with:", mockedResponse2);
|
|
51
62
|
return mockedResponse2;
|
|
52
63
|
});
|
|
64
|
+
if (requestAborted.state === "rejected") {
|
|
65
|
+
return Promise.reject(requestAborted.rejectionReason);
|
|
66
|
+
}
|
|
53
67
|
if (resolverResult.error) {
|
|
54
68
|
const error = Object.assign(new TypeError("Failed to fetch"), {
|
|
55
69
|
cause: resolverResult.error
|
|
@@ -88,13 +102,13 @@ var _FetchInterceptor = class extends _chunk7VJMJSIJjs.Interceptor {
|
|
|
88
102
|
return response;
|
|
89
103
|
});
|
|
90
104
|
};
|
|
91
|
-
Object.defineProperty(globalThis.fetch,
|
|
105
|
+
Object.defineProperty(globalThis.fetch, _chunk4CFMDU7Zjs.IS_PATCHED_MODULE, {
|
|
92
106
|
enumerable: true,
|
|
93
107
|
configurable: true,
|
|
94
108
|
value: true
|
|
95
109
|
});
|
|
96
110
|
this.subscriptions.push(() => {
|
|
97
|
-
Object.defineProperty(globalThis.fetch,
|
|
111
|
+
Object.defineProperty(globalThis.fetch, _chunk4CFMDU7Zjs.IS_PATCHED_MODULE, {
|
|
98
112
|
value: void 0
|
|
99
113
|
});
|
|
100
114
|
globalThis.fetch = pureFetch;
|