@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.
Files changed (53) hide show
  1. package/README.md +1 -1
  2. package/lib/{node/chunk-IHW3ERPT.js → browser/chunk-3LFH2WCF.js} +1 -9
  3. package/lib/{node/chunk-MPFSBY4S.js → browser/chunk-4CFMDU7Z.js} +36 -9
  4. package/lib/{node/chunk-LTX5IGCQ.mjs → browser/chunk-7II4SWKS.mjs} +0 -8
  5. package/lib/browser/{chunk-DWXGORCS.mjs → chunk-BRIUGDYQ.mjs} +60 -11
  6. package/lib/browser/{chunk-MW6NCDWE.mjs → chunk-GXJLJMOT.mjs} +33 -7
  7. package/lib/browser/{chunk-AKTXHQ7X.mjs → chunk-KSCN3JS4.mjs} +16 -2
  8. package/lib/browser/{chunk-3GCTA2IC.js → chunk-XAQQ5IUC.js} +20 -6
  9. package/lib/browser/{chunk-OBNZMCHS.js → chunk-Y4XXQXAW.js} +67 -18
  10. package/lib/browser/index.d.ts +2 -2
  11. package/lib/browser/index.js +4 -4
  12. package/lib/browser/index.mjs +2 -2
  13. package/lib/browser/interceptors/XMLHttpRequest/index.js +4 -4
  14. package/lib/browser/interceptors/XMLHttpRequest/index.mjs +3 -3
  15. package/lib/browser/interceptors/fetch/index.js +3 -3
  16. package/lib/browser/interceptors/fetch/index.mjs +2 -2
  17. package/lib/browser/presets/browser.js +6 -6
  18. package/lib/browser/presets/browser.mjs +4 -4
  19. package/lib/node/RemoteHttpInterceptor.d.ts +2 -3
  20. package/lib/node/RemoteHttpInterceptor.js +15 -16
  21. package/lib/node/RemoteHttpInterceptor.mjs +9 -10
  22. package/lib/node/chunk-3LFH2WCF.js +21 -0
  23. package/lib/node/chunk-7II4SWKS.mjs +21 -0
  24. package/lib/node/{chunk-VJDB3MIV.js → chunk-MVPEJK4V.js} +2 -2
  25. package/lib/node/{chunk-GLYFVYMU.js → chunk-NM5BWVVB.js} +64 -15
  26. package/lib/node/{chunk-4YIZAGXJ.js → chunk-OOSIWXHX.js} +41 -8
  27. package/lib/node/{chunk-4LRRTLLD.mjs → chunk-PSIO3L7D.mjs} +39 -6
  28. package/lib/node/{chunk-Y5QA6OEZ.mjs → chunk-RGYCLCLK.mjs} +33 -10
  29. package/lib/node/{chunk-CO6XRA5H.mjs → chunk-SOWOSKLO.mjs} +60 -11
  30. package/lib/node/{chunk-NUSH7ACE.mjs → chunk-VS3GJPUE.mjs} +1 -1
  31. package/lib/{browser/chunk-7VJMJSIJ.js → node/chunk-XYZRP5S2.js} +35 -13
  32. package/lib/node/index.js +4 -4
  33. package/lib/node/index.mjs +3 -3
  34. package/lib/node/interceptors/ClientRequest/index.js +3 -3
  35. package/lib/node/interceptors/ClientRequest/index.mjs +2 -2
  36. package/lib/node/interceptors/XMLHttpRequest/index.js +4 -4
  37. package/lib/node/interceptors/XMLHttpRequest/index.mjs +3 -3
  38. package/lib/node/interceptors/fetch/index.js +17 -3
  39. package/lib/node/interceptors/fetch/index.mjs +16 -2
  40. package/lib/node/presets/node.js +6 -6
  41. package/lib/node/presets/node.mjs +4 -4
  42. package/package.json +19 -22
  43. package/src/RemoteHttpInterceptor.ts +6 -7
  44. package/src/interceptors/ClientRequest/index.test.ts +28 -0
  45. package/src/interceptors/ClientRequest/utils/createRequest.ts +0 -1
  46. package/src/interceptors/ClientRequest/utils/createResponse.ts +34 -3
  47. package/src/interceptors/XMLHttpRequest/XMLHttpRequestController.ts +15 -7
  48. package/src/interceptors/XMLHttpRequest/utils/createResponse.ts +40 -4
  49. package/src/interceptors/fetch/index.ts +21 -1
  50. package/src/utils/bufferUtils.ts +0 -2
  51. package/lib/browser/chunk-MQA5WAD4.mjs +0 -2139
  52. package/lib/browser/chunk-QAZ3SPQZ.js +0 -2139
  53. 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('reqest', ({ request, requestId }) => {
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});var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
2
- get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
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 globalThis[symbol] || void 0;
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.__require = __require; exports.getGlobalSymbol = getGlobalSymbol; exports.deleteGlobalSymbol = deleteGlobalSymbol; exports.InterceptorReadyState = InterceptorReadyState; exports.Interceptor = Interceptor;
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-MQA5WAD4.mjs";
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-MW6NCDWE.mjs";
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 { headersToString } from "headers-polyfill";
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
- import { stringToHeaders } from "headers-polyfill";
206
- function createResponse(request, responseBody) {
207
- return new Response(responseBody, {
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: stringToHeaders(request.getAllResponseHeaders())
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
- this.request.setRequestHeader("X-Request-Id", this.requestId);
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 allHeaders = headersToString(response.headers);
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")) : void 0;
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 globalThis[symbol] || void 0;
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-MW6NCDWE.mjs";
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
- await this.emitter.untilIdle(
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 _chunk7VJMJSIJjs = require('./chunk-7VJMJSIJ.js');
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 _chunk7VJMJSIJjs.Interceptor {
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[_chunk7VJMJSIJjs.IS_PATCHED_MODULE],
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
- await this.emitter.untilIdle(
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, _chunk7VJMJSIJjs.IS_PATCHED_MODULE, {
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, _chunk7VJMJSIJjs.IS_PATCHED_MODULE, {
111
+ Object.defineProperty(globalThis.fetch, _chunk4CFMDU7Zjs.IS_PATCHED_MODULE, {
98
112
  value: void 0
99
113
  });
100
114
  globalThis.fetch = pureFetch;