msw 2.1.3 → 2.1.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 (57) hide show
  1. package/lib/browser/index.js +1775 -32
  2. package/lib/browser/index.js.map +1 -1
  3. package/lib/browser/index.mjs +1769 -28
  4. package/lib/browser/index.mjs.map +1 -1
  5. package/lib/core/handlers/GraphQLHandler.js +2 -2
  6. package/lib/core/handlers/GraphQLHandler.js.map +1 -1
  7. package/lib/core/handlers/GraphQLHandler.mjs +2 -2
  8. package/lib/core/handlers/GraphQLHandler.mjs.map +1 -1
  9. package/lib/core/handlers/HttpHandler.js +2 -2
  10. package/lib/core/handlers/HttpHandler.js.map +1 -1
  11. package/lib/core/handlers/HttpHandler.mjs +2 -2
  12. package/lib/core/handlers/HttpHandler.mjs.map +1 -1
  13. package/lib/core/sharedOptions.d.mts +0 -2
  14. package/lib/core/sharedOptions.d.ts +0 -2
  15. package/lib/core/utils/handleRequest.js +1 -1
  16. package/lib/core/utils/handleRequest.js.map +1 -1
  17. package/lib/core/utils/handleRequest.mjs +1 -1
  18. package/lib/core/utils/handleRequest.mjs.map +1 -1
  19. package/lib/core/utils/internal/parseGraphQLRequest.js +2 -2
  20. package/lib/core/utils/internal/parseGraphQLRequest.js.map +1 -1
  21. package/lib/core/utils/internal/parseGraphQLRequest.mjs +2 -2
  22. package/lib/core/utils/internal/parseGraphQLRequest.mjs.map +1 -1
  23. package/lib/core/utils/request/onUnhandledRequest.d.mts +1 -4
  24. package/lib/core/utils/request/onUnhandledRequest.d.ts +1 -4
  25. package/lib/core/utils/request/onUnhandledRequest.js +14 -115
  26. package/lib/core/utils/request/onUnhandledRequest.js.map +1 -1
  27. package/lib/core/utils/request/onUnhandledRequest.mjs +14 -107
  28. package/lib/core/utils/request/onUnhandledRequest.mjs.map +1 -1
  29. package/lib/core/utils/request/toPublicUrl.d.mts +7 -0
  30. package/lib/core/utils/request/toPublicUrl.d.ts +7 -0
  31. package/lib/core/utils/request/{getPublicUrlFromRequest.js → toPublicUrl.js} +9 -9
  32. package/lib/core/utils/request/toPublicUrl.js.map +1 -0
  33. package/lib/core/utils/request/toPublicUrl.mjs +11 -0
  34. package/lib/core/utils/request/toPublicUrl.mjs.map +1 -0
  35. package/lib/iife/index.js +46 -233
  36. package/lib/iife/index.js.map +1 -1
  37. package/lib/mockServiceWorker.js +1 -1
  38. package/package.json +5 -8
  39. package/src/browser/setupWorker/glossary.ts +1 -0
  40. package/src/browser/setupWorker/setupWorker.ts +1 -0
  41. package/src/browser/setupWorker/start/createRequestListener.ts +9 -0
  42. package/src/browser/setupWorker/start/createResponseListener.ts +9 -7
  43. package/src/core/handlers/GraphQLHandler.ts +2 -2
  44. package/src/core/handlers/HttpHandler.ts +2 -2
  45. package/src/core/utils/handleRequest.ts +1 -1
  46. package/src/core/utils/internal/parseGraphQLRequest.ts +2 -2
  47. package/src/core/utils/request/onUnhandledRequest.test.ts +5 -101
  48. package/src/core/utils/request/onUnhandledRequest.ts +16 -185
  49. package/src/core/utils/request/toPublicUrl.test.ts +18 -0
  50. package/src/core/utils/request/toPublicUrl.ts +15 -0
  51. package/lib/core/utils/request/getPublicUrlFromRequest.d.mts +0 -7
  52. package/lib/core/utils/request/getPublicUrlFromRequest.d.ts +0 -7
  53. package/lib/core/utils/request/getPublicUrlFromRequest.js.map +0 -1
  54. package/lib/core/utils/request/getPublicUrlFromRequest.mjs +0 -11
  55. package/lib/core/utils/request/getPublicUrlFromRequest.mjs.map +0 -1
  56. package/src/core/utils/request/getPublicUrlFromRequest.test.ts +0 -26
  57. package/src/core/utils/request/getPublicUrlFromRequest.ts +0 -15
@@ -1,13 +1,116 @@
1
- // src/browser/setupWorker/setupWorker.ts
2
- import { invariant } from "outvariant";
3
- import { isNodeProcess } from "is-node-process";
1
+ // node_modules/.pnpm/outvariant@1.4.2/node_modules/outvariant/lib/index.mjs
2
+ var POSITIONALS_EXP = /(%?)(%([sdijo]))/g;
3
+ function serializePositional(positional, flag) {
4
+ switch (flag) {
5
+ case "s":
6
+ return positional;
7
+ case "d":
8
+ case "i":
9
+ return Number(positional);
10
+ case "j":
11
+ return JSON.stringify(positional);
12
+ case "o": {
13
+ if (typeof positional === "string") {
14
+ return positional;
15
+ }
16
+ const json = JSON.stringify(positional);
17
+ if (json === "{}" || json === "[]" || /^\[object .+?\]$/.test(json)) {
18
+ return positional;
19
+ }
20
+ return json;
21
+ }
22
+ }
23
+ }
24
+ function format(message, ...positionals) {
25
+ if (positionals.length === 0) {
26
+ return message;
27
+ }
28
+ let positionalIndex = 0;
29
+ let formattedMessage = message.replace(
30
+ POSITIONALS_EXP,
31
+ (match, isEscaped, _, flag) => {
32
+ const positional = positionals[positionalIndex];
33
+ const value = serializePositional(positional, flag);
34
+ if (!isEscaped) {
35
+ positionalIndex++;
36
+ return value;
37
+ }
38
+ return match;
39
+ }
40
+ );
41
+ if (positionalIndex < positionals.length) {
42
+ formattedMessage += ` ${positionals.slice(positionalIndex).join(" ")}`;
43
+ }
44
+ formattedMessage = formattedMessage.replace(/%{2,2}/g, "%");
45
+ return formattedMessage;
46
+ }
47
+ var STACK_FRAMES_TO_IGNORE = 2;
48
+ function cleanErrorStack(error2) {
49
+ if (!error2.stack) {
50
+ return;
51
+ }
52
+ const nextStack = error2.stack.split("\n");
53
+ nextStack.splice(1, STACK_FRAMES_TO_IGNORE);
54
+ error2.stack = nextStack.join("\n");
55
+ }
56
+ var InvariantError = class extends Error {
57
+ constructor(message, ...positionals) {
58
+ super(message);
59
+ this.message = message;
60
+ this.name = "Invariant Violation";
61
+ this.message = format(message, ...positionals);
62
+ cleanErrorStack(this);
63
+ }
64
+ };
65
+ var invariant = (predicate, message, ...positionals) => {
66
+ if (!predicate) {
67
+ throw new InvariantError(message, ...positionals);
68
+ }
69
+ };
70
+ invariant.as = (ErrorConstructor, predicate, message, ...positionals) => {
71
+ if (!predicate) {
72
+ const formatMessage = positionals.length === 0 ? message : format(message, positionals);
73
+ let error2;
74
+ try {
75
+ error2 = Reflect.construct(ErrorConstructor, [formatMessage]);
76
+ } catch (err) {
77
+ error2 = ErrorConstructor(formatMessage);
78
+ }
79
+ throw error2;
80
+ }
81
+ };
82
+
83
+ // node_modules/.pnpm/is-node-process@1.2.0/node_modules/is-node-process/lib/index.mjs
84
+ function isNodeProcess() {
85
+ if (typeof navigator !== "undefined" && navigator.product === "ReactNative") {
86
+ return true;
87
+ }
88
+ if (typeof process !== "undefined") {
89
+ const type = process.type;
90
+ if (type === "renderer" || type === "worker") {
91
+ return false;
92
+ }
93
+ return !!(process.versions && process.versions.node);
94
+ }
95
+ return false;
96
+ }
97
+
98
+ // node_modules/.pnpm/@open-draft+until@2.1.0/node_modules/@open-draft/until/lib/index.mjs
99
+ var until = async (promise) => {
100
+ try {
101
+ const data = await promise().catch((error2) => {
102
+ throw error2;
103
+ });
104
+ return { error: null, data };
105
+ } catch (error2) {
106
+ return { error: error2, data: null };
107
+ }
108
+ };
4
109
 
5
110
  // src/browser/setupWorker/start/createStartHandler.ts
6
- import { until as until2 } from "@open-draft/until";
7
111
  import { devUtils as devUtils6 } from '../core/utils/internal/devUtils.mjs';
8
112
 
9
113
  // src/browser/setupWorker/start/utils/getWorkerInstance.ts
10
- import { until } from "@open-draft/until";
11
114
  import { devUtils } from '../core/utils/internal/devUtils.mjs';
12
115
 
13
116
  // src/browser/utils/getAbsoluteWorkerUrl.ts
@@ -163,6 +266,7 @@ function parseWorkerRequest(incomingRequest) {
163
266
  }
164
267
 
165
268
  // src/browser/setupWorker/start/createRequestListener.ts
269
+ import { RequestHandler } from '../core/handlers/RequestHandler.mjs';
166
270
  import { handleRequest } from '../core/utils/handleRequest.mjs';
167
271
  import { devUtils as devUtils4 } from '../core/utils/internal/devUtils.mjs';
168
272
  import { toResponseInit } from '../core/utils/toResponseInit.mjs';
@@ -172,6 +276,9 @@ var createRequestListener = (context, options) => {
172
276
  const requestId = message.payload.id;
173
277
  const request = parseWorkerRequest(message.payload);
174
278
  const requestCloneForLogs = request.clone();
279
+ const requestClone = request.clone();
280
+ RequestHandler.cache.set(request, requestClone);
281
+ context.requests.set(requestId, requestClone);
175
282
  try {
176
283
  await handleRequest(
177
284
  request,
@@ -216,8 +323,8 @@ var createRequestListener = (context, options) => {
216
323
  }
217
324
  }
218
325
  );
219
- } catch (error) {
220
- if (error instanceof Error) {
326
+ } catch (error2) {
327
+ if (error2 instanceof Error) {
221
328
  devUtils4.error(
222
329
  `Uncaught exception in the request handler for "%s %s":
223
330
 
@@ -226,7 +333,7 @@ var createRequestListener = (context, options) => {
226
333
  This exception has been gracefully handled as a 500 response, however, it's strongly recommended to resolve this error, as it indicates a mistake in your code. If you wish to mock an error response, please see this guide: https://mswjs.io/docs/recipes/mocking-error-responses`,
227
334
  request.method,
228
335
  request.url,
229
- error.stack ?? error
336
+ error2.stack ?? error2
230
337
  );
231
338
  messageChannel.postMessage("MOCK_RESPONSE", {
232
339
  status: 500,
@@ -235,9 +342,9 @@ This exception has been gracefully handled as a 500 response, however, it's stro
235
342
  "Content-Type": "application/json"
236
343
  },
237
344
  body: JSON.stringify({
238
- name: error.name,
239
- message: error.message,
240
- stack: error.stack
345
+ name: error2.name,
346
+ message: error2.message,
347
+ stack: error2.stack
241
348
  })
242
349
  });
243
350
  }
@@ -259,11 +366,664 @@ async function requestIntegrityCheck(context, serviceWorker) {
259
366
  return serviceWorker;
260
367
  }
261
368
 
369
+ // node_modules/.pnpm/@mswjs+interceptors@0.25.15/node_modules/@mswjs/interceptors/lib/browser/chunk-UJZOJSMP.mjs
370
+ var encoder = new TextEncoder();
371
+ function encodeBuffer(text) {
372
+ return encoder.encode(text);
373
+ }
374
+ function decodeBuffer(buffer, encoding) {
375
+ const decoder = new TextDecoder(encoding);
376
+ return decoder.decode(buffer);
377
+ }
378
+ function toArrayBuffer(array) {
379
+ return array.buffer.slice(
380
+ array.byteOffset,
381
+ array.byteOffset + array.byteLength
382
+ );
383
+ }
384
+ var RESPONSE_STATUS_CODES_WITHOUT_BODY = /* @__PURE__ */ new Set([
385
+ 101,
386
+ 103,
387
+ 204,
388
+ 205,
389
+ 304
390
+ ]);
391
+ function isResponseWithoutBody(status) {
392
+ return RESPONSE_STATUS_CODES_WITHOUT_BODY.has(status);
393
+ }
394
+
395
+ // node_modules/.pnpm/@open-draft+logger@0.3.0/node_modules/@open-draft/logger/lib/index.mjs
396
+ var __defProp = Object.defineProperty;
397
+ var __export = (target, all) => {
398
+ for (var name in all)
399
+ __defProp(target, name, { get: all[name], enumerable: true });
400
+ };
401
+ var colors_exports = {};
402
+ __export(colors_exports, {
403
+ blue: () => blue,
404
+ gray: () => gray,
405
+ green: () => green,
406
+ red: () => red,
407
+ yellow: () => yellow
408
+ });
409
+ function yellow(text) {
410
+ return `\x1B[33m${text}\x1B[0m`;
411
+ }
412
+ function blue(text) {
413
+ return `\x1B[34m${text}\x1B[0m`;
414
+ }
415
+ function gray(text) {
416
+ return `\x1B[90m${text}\x1B[0m`;
417
+ }
418
+ function red(text) {
419
+ return `\x1B[31m${text}\x1B[0m`;
420
+ }
421
+ function green(text) {
422
+ return `\x1B[32m${text}\x1B[0m`;
423
+ }
424
+ var IS_NODE = isNodeProcess();
425
+ var Logger = class {
426
+ constructor(name) {
427
+ this.name = name;
428
+ this.prefix = `[${this.name}]`;
429
+ const LOGGER_NAME = getVariable("DEBUG");
430
+ const LOGGER_LEVEL = getVariable("LOG_LEVEL");
431
+ const isLoggingEnabled = LOGGER_NAME === "1" || LOGGER_NAME === "true" || typeof LOGGER_NAME !== "undefined" && this.name.startsWith(LOGGER_NAME);
432
+ if (isLoggingEnabled) {
433
+ this.debug = isDefinedAndNotEquals(LOGGER_LEVEL, "debug") ? noop : this.debug;
434
+ this.info = isDefinedAndNotEquals(LOGGER_LEVEL, "info") ? noop : this.info;
435
+ this.success = isDefinedAndNotEquals(LOGGER_LEVEL, "success") ? noop : this.success;
436
+ this.warning = isDefinedAndNotEquals(LOGGER_LEVEL, "warning") ? noop : this.warning;
437
+ this.error = isDefinedAndNotEquals(LOGGER_LEVEL, "error") ? noop : this.error;
438
+ } else {
439
+ this.info = noop;
440
+ this.success = noop;
441
+ this.warning = noop;
442
+ this.error = noop;
443
+ this.only = noop;
444
+ }
445
+ }
446
+ prefix;
447
+ extend(domain) {
448
+ return new Logger(`${this.name}:${domain}`);
449
+ }
450
+ /**
451
+ * Print a debug message.
452
+ * @example
453
+ * logger.debug('no duplicates found, creating a document...')
454
+ */
455
+ debug(message, ...positionals) {
456
+ this.logEntry({
457
+ level: "debug",
458
+ message: gray(message),
459
+ positionals,
460
+ prefix: this.prefix,
461
+ colors: {
462
+ prefix: "gray"
463
+ }
464
+ });
465
+ }
466
+ /**
467
+ * Print an info message.
468
+ * @example
469
+ * logger.info('start parsing...')
470
+ */
471
+ info(message, ...positionals) {
472
+ this.logEntry({
473
+ level: "info",
474
+ message,
475
+ positionals,
476
+ prefix: this.prefix,
477
+ colors: {
478
+ prefix: "blue"
479
+ }
480
+ });
481
+ const performance2 = new PerformanceEntry();
482
+ return (message2, ...positionals2) => {
483
+ performance2.measure();
484
+ this.logEntry({
485
+ level: "info",
486
+ message: `${message2} ${gray(`${performance2.deltaTime}ms`)}`,
487
+ positionals: positionals2,
488
+ prefix: this.prefix,
489
+ colors: {
490
+ prefix: "blue"
491
+ }
492
+ });
493
+ };
494
+ }
495
+ /**
496
+ * Print a success message.
497
+ * @example
498
+ * logger.success('successfully created document')
499
+ */
500
+ success(message, ...positionals) {
501
+ this.logEntry({
502
+ level: "info",
503
+ message,
504
+ positionals,
505
+ prefix: `\u2714 ${this.prefix}`,
506
+ colors: {
507
+ timestamp: "green",
508
+ prefix: "green"
509
+ }
510
+ });
511
+ }
512
+ /**
513
+ * Print a warning.
514
+ * @example
515
+ * logger.warning('found legacy document format')
516
+ */
517
+ warning(message, ...positionals) {
518
+ this.logEntry({
519
+ level: "warning",
520
+ message,
521
+ positionals,
522
+ prefix: `\u26A0 ${this.prefix}`,
523
+ colors: {
524
+ timestamp: "yellow",
525
+ prefix: "yellow"
526
+ }
527
+ });
528
+ }
529
+ /**
530
+ * Print an error message.
531
+ * @example
532
+ * logger.error('something went wrong')
533
+ */
534
+ error(message, ...positionals) {
535
+ this.logEntry({
536
+ level: "error",
537
+ message,
538
+ positionals,
539
+ prefix: `\u2716 ${this.prefix}`,
540
+ colors: {
541
+ timestamp: "red",
542
+ prefix: "red"
543
+ }
544
+ });
545
+ }
546
+ /**
547
+ * Execute the given callback only when the logging is enabled.
548
+ * This is skipped in its entirety and has no runtime cost otherwise.
549
+ * This executes regardless of the log level.
550
+ * @example
551
+ * logger.only(() => {
552
+ * logger.info('additional info')
553
+ * })
554
+ */
555
+ only(callback) {
556
+ callback();
557
+ }
558
+ createEntry(level, message) {
559
+ return {
560
+ timestamp: /* @__PURE__ */ new Date(),
561
+ level,
562
+ message
563
+ };
564
+ }
565
+ logEntry(args) {
566
+ const {
567
+ level,
568
+ message,
569
+ prefix,
570
+ colors: customColors,
571
+ positionals = []
572
+ } = args;
573
+ const entry = this.createEntry(level, message);
574
+ const timestampColor = customColors?.timestamp || "gray";
575
+ const prefixColor = customColors?.prefix || "gray";
576
+ const colorize = {
577
+ timestamp: colors_exports[timestampColor],
578
+ prefix: colors_exports[prefixColor]
579
+ };
580
+ const write = this.getWriter(level);
581
+ write(
582
+ [colorize.timestamp(this.formatTimestamp(entry.timestamp))].concat(prefix != null ? colorize.prefix(prefix) : []).concat(serializeInput(message)).join(" "),
583
+ ...positionals.map(serializeInput)
584
+ );
585
+ }
586
+ formatTimestamp(timestamp) {
587
+ return `${timestamp.toLocaleTimeString(
588
+ "en-GB"
589
+ )}:${timestamp.getMilliseconds()}`;
590
+ }
591
+ getWriter(level) {
592
+ switch (level) {
593
+ case "debug":
594
+ case "success":
595
+ case "info": {
596
+ return log;
597
+ }
598
+ case "warning": {
599
+ return warn;
600
+ }
601
+ case "error": {
602
+ return error;
603
+ }
604
+ }
605
+ }
606
+ };
607
+ var PerformanceEntry = class {
608
+ startTime;
609
+ endTime;
610
+ deltaTime;
611
+ constructor() {
612
+ this.startTime = performance.now();
613
+ }
614
+ measure() {
615
+ this.endTime = performance.now();
616
+ const deltaTime = this.endTime - this.startTime;
617
+ this.deltaTime = deltaTime.toFixed(2);
618
+ }
619
+ };
620
+ var noop = () => void 0;
621
+ function log(message, ...positionals) {
622
+ if (IS_NODE) {
623
+ process.stdout.write(format(message, ...positionals) + "\n");
624
+ return;
625
+ }
626
+ console.log(message, ...positionals);
627
+ }
628
+ function warn(message, ...positionals) {
629
+ if (IS_NODE) {
630
+ process.stderr.write(format(message, ...positionals) + "\n");
631
+ return;
632
+ }
633
+ console.warn(message, ...positionals);
634
+ }
635
+ function error(message, ...positionals) {
636
+ if (IS_NODE) {
637
+ process.stderr.write(format(message, ...positionals) + "\n");
638
+ return;
639
+ }
640
+ console.error(message, ...positionals);
641
+ }
642
+ function getVariable(variableName) {
643
+ if (IS_NODE) {
644
+ return process.env[variableName];
645
+ }
646
+ return globalThis[variableName]?.toString();
647
+ }
648
+ function isDefinedAndNotEquals(value, expected) {
649
+ return value !== void 0 && value !== expected;
650
+ }
651
+ function serializeInput(message) {
652
+ if (typeof message === "undefined") {
653
+ return "undefined";
654
+ }
655
+ if (message === null) {
656
+ return "null";
657
+ }
658
+ if (typeof message === "string") {
659
+ return message;
660
+ }
661
+ if (typeof message === "object") {
662
+ return JSON.stringify(message);
663
+ }
664
+ return message.toString();
665
+ }
666
+
667
+ // node_modules/.pnpm/strict-event-emitter@0.5.1/node_modules/strict-event-emitter/lib/index.mjs
668
+ var MemoryLeakError = class extends Error {
669
+ constructor(emitter, type, count) {
670
+ super(
671
+ `Possible EventEmitter memory leak detected. ${count} ${type.toString()} listeners added. Use emitter.setMaxListeners() to increase limit`
672
+ );
673
+ this.emitter = emitter;
674
+ this.type = type;
675
+ this.count = count;
676
+ this.name = "MaxListenersExceededWarning";
677
+ }
678
+ };
679
+ var _Emitter = class {
680
+ static listenerCount(emitter, eventName) {
681
+ return emitter.listenerCount(eventName);
682
+ }
683
+ constructor() {
684
+ this.events = /* @__PURE__ */ new Map();
685
+ this.maxListeners = _Emitter.defaultMaxListeners;
686
+ this.hasWarnedAboutPotentialMemoryLeak = false;
687
+ }
688
+ _emitInternalEvent(internalEventName, eventName, listener) {
689
+ this.emit(
690
+ internalEventName,
691
+ ...[eventName, listener]
692
+ );
693
+ }
694
+ _getListeners(eventName) {
695
+ return Array.prototype.concat.apply([], this.events.get(eventName)) || [];
696
+ }
697
+ _removeListener(listeners, listener) {
698
+ const index = listeners.indexOf(listener);
699
+ if (index > -1) {
700
+ listeners.splice(index, 1);
701
+ }
702
+ return [];
703
+ }
704
+ _wrapOnceListener(eventName, listener) {
705
+ const onceListener = (...data) => {
706
+ this.removeListener(eventName, onceListener);
707
+ return listener.apply(this, data);
708
+ };
709
+ Object.defineProperty(onceListener, "name", { value: listener.name });
710
+ return onceListener;
711
+ }
712
+ setMaxListeners(maxListeners) {
713
+ this.maxListeners = maxListeners;
714
+ return this;
715
+ }
716
+ /**
717
+ * Returns the current max listener value for the `Emitter` which is
718
+ * either set by `emitter.setMaxListeners(n)` or defaults to
719
+ * `Emitter.defaultMaxListeners`.
720
+ */
721
+ getMaxListeners() {
722
+ return this.maxListeners;
723
+ }
724
+ /**
725
+ * Returns an array listing the events for which the emitter has registered listeners.
726
+ * The values in the array will be strings or Symbols.
727
+ */
728
+ eventNames() {
729
+ return Array.from(this.events.keys());
730
+ }
731
+ /**
732
+ * Synchronously calls each of the listeners registered for the event named `eventName`,
733
+ * in the order they were registered, passing the supplied arguments to each.
734
+ * Returns `true` if the event has listeners, `false` otherwise.
735
+ *
736
+ * @example
737
+ * const emitter = new Emitter<{ hello: [string] }>()
738
+ * emitter.emit('hello', 'John')
739
+ */
740
+ emit(eventName, ...data) {
741
+ const listeners = this._getListeners(eventName);
742
+ listeners.forEach((listener) => {
743
+ listener.apply(this, data);
744
+ });
745
+ return listeners.length > 0;
746
+ }
747
+ addListener(eventName, listener) {
748
+ this._emitInternalEvent("newListener", eventName, listener);
749
+ const nextListeners = this._getListeners(eventName).concat(listener);
750
+ this.events.set(eventName, nextListeners);
751
+ if (this.maxListeners > 0 && this.listenerCount(eventName) > this.maxListeners && !this.hasWarnedAboutPotentialMemoryLeak) {
752
+ this.hasWarnedAboutPotentialMemoryLeak = true;
753
+ const memoryLeakWarning = new MemoryLeakError(
754
+ this,
755
+ eventName,
756
+ this.listenerCount(eventName)
757
+ );
758
+ console.warn(memoryLeakWarning);
759
+ }
760
+ return this;
761
+ }
762
+ on(eventName, listener) {
763
+ return this.addListener(eventName, listener);
764
+ }
765
+ once(eventName, listener) {
766
+ return this.addListener(
767
+ eventName,
768
+ this._wrapOnceListener(eventName, listener)
769
+ );
770
+ }
771
+ prependListener(eventName, listener) {
772
+ const listeners = this._getListeners(eventName);
773
+ if (listeners.length > 0) {
774
+ const nextListeners = [listener].concat(listeners);
775
+ this.events.set(eventName, nextListeners);
776
+ } else {
777
+ this.events.set(eventName, listeners.concat(listener));
778
+ }
779
+ return this;
780
+ }
781
+ prependOnceListener(eventName, listener) {
782
+ return this.prependListener(
783
+ eventName,
784
+ this._wrapOnceListener(eventName, listener)
785
+ );
786
+ }
787
+ removeListener(eventName, listener) {
788
+ const listeners = this._getListeners(eventName);
789
+ if (listeners.length > 0) {
790
+ this._removeListener(listeners, listener);
791
+ this.events.set(eventName, listeners);
792
+ this._emitInternalEvent("removeListener", eventName, listener);
793
+ }
794
+ return this;
795
+ }
796
+ /**
797
+ * Alias for `emitter.removeListener()`.
798
+ *
799
+ * @example
800
+ * emitter.off('hello', listener)
801
+ */
802
+ off(eventName, listener) {
803
+ return this.removeListener(eventName, listener);
804
+ }
805
+ removeAllListeners(eventName) {
806
+ if (eventName) {
807
+ this.events.delete(eventName);
808
+ } else {
809
+ this.events.clear();
810
+ }
811
+ return this;
812
+ }
813
+ /**
814
+ * Returns a copy of the array of listeners for the event named `eventName`.
815
+ */
816
+ listeners(eventName) {
817
+ return Array.from(this._getListeners(eventName));
818
+ }
819
+ /**
820
+ * Returns the number of listeners listening to the event named `eventName`.
821
+ */
822
+ listenerCount(eventName) {
823
+ return this._getListeners(eventName).length;
824
+ }
825
+ rawListeners(eventName) {
826
+ return this.listeners(eventName);
827
+ }
828
+ };
829
+ var Emitter = _Emitter;
830
+ Emitter.defaultMaxListeners = 10;
831
+
832
+ // node_modules/.pnpm/@mswjs+interceptors@0.25.15/node_modules/@mswjs/interceptors/lib/browser/chunk-WZQN3FMY.mjs
833
+ var IS_PATCHED_MODULE = Symbol("isPatchedModule");
834
+ function getGlobalSymbol(symbol) {
835
+ return (
836
+ // @ts-ignore https://github.com/Microsoft/TypeScript/issues/24587
837
+ globalThis[symbol] || void 0
838
+ );
839
+ }
840
+ function setGlobalSymbol(symbol, value) {
841
+ globalThis[symbol] = value;
842
+ }
843
+ function deleteGlobalSymbol(symbol) {
844
+ delete globalThis[symbol];
845
+ }
846
+ var Interceptor = class {
847
+ constructor(symbol) {
848
+ this.symbol = symbol;
849
+ this.readyState = "INACTIVE";
850
+ this.emitter = new Emitter();
851
+ this.subscriptions = [];
852
+ this.logger = new Logger(symbol.description);
853
+ this.emitter.setMaxListeners(0);
854
+ this.logger.info("constructing the interceptor...");
855
+ }
856
+ /**
857
+ * Determine if this interceptor can be applied
858
+ * in the current environment.
859
+ */
860
+ checkEnvironment() {
861
+ return true;
862
+ }
863
+ /**
864
+ * Apply this interceptor to the current process.
865
+ * Returns an already running interceptor instance if it's present.
866
+ */
867
+ apply() {
868
+ const logger = this.logger.extend("apply");
869
+ logger.info("applying the interceptor...");
870
+ if (this.readyState === "APPLIED") {
871
+ logger.info("intercepted already applied!");
872
+ return;
873
+ }
874
+ const shouldApply = this.checkEnvironment();
875
+ if (!shouldApply) {
876
+ logger.info("the interceptor cannot be applied in this environment!");
877
+ return;
878
+ }
879
+ this.readyState = "APPLYING";
880
+ const runningInstance = this.getInstance();
881
+ if (runningInstance) {
882
+ logger.info("found a running instance, reusing...");
883
+ this.on = (event, listener) => {
884
+ logger.info('proxying the "%s" listener', event);
885
+ runningInstance.emitter.addListener(event, listener);
886
+ this.subscriptions.push(() => {
887
+ runningInstance.emitter.removeListener(event, listener);
888
+ logger.info('removed proxied "%s" listener!', event);
889
+ });
890
+ return this;
891
+ };
892
+ this.readyState = "APPLIED";
893
+ return;
894
+ }
895
+ logger.info("no running instance found, setting up a new instance...");
896
+ this.setup();
897
+ this.setInstance();
898
+ this.readyState = "APPLIED";
899
+ }
900
+ /**
901
+ * Setup the module augments and stubs necessary for this interceptor.
902
+ * This method is not run if there's a running interceptor instance
903
+ * to prevent instantiating an interceptor multiple times.
904
+ */
905
+ setup() {
906
+ }
907
+ /**
908
+ * Listen to the interceptor's public events.
909
+ */
910
+ on(event, listener) {
911
+ const logger = this.logger.extend("on");
912
+ if (this.readyState === "DISPOSING" || this.readyState === "DISPOSED") {
913
+ logger.info("cannot listen to events, already disposed!");
914
+ return this;
915
+ }
916
+ logger.info('adding "%s" event listener:', event, listener);
917
+ this.emitter.on(event, listener);
918
+ return this;
919
+ }
920
+ once(event, listener) {
921
+ this.emitter.once(event, listener);
922
+ return this;
923
+ }
924
+ off(event, listener) {
925
+ this.emitter.off(event, listener);
926
+ return this;
927
+ }
928
+ removeAllListeners(event) {
929
+ this.emitter.removeAllListeners(event);
930
+ return this;
931
+ }
932
+ /**
933
+ * Disposes of any side-effects this interceptor has introduced.
934
+ */
935
+ dispose() {
936
+ const logger = this.logger.extend("dispose");
937
+ if (this.readyState === "DISPOSED") {
938
+ logger.info("cannot dispose, already disposed!");
939
+ return;
940
+ }
941
+ logger.info("disposing the interceptor...");
942
+ this.readyState = "DISPOSING";
943
+ if (!this.getInstance()) {
944
+ logger.info("no interceptors running, skipping dispose...");
945
+ return;
946
+ }
947
+ this.clearInstance();
948
+ logger.info("global symbol deleted:", getGlobalSymbol(this.symbol));
949
+ if (this.subscriptions.length > 0) {
950
+ logger.info("disposing of %d subscriptions...", this.subscriptions.length);
951
+ for (const dispose of this.subscriptions) {
952
+ dispose();
953
+ }
954
+ this.subscriptions = [];
955
+ logger.info("disposed of all subscriptions!", this.subscriptions.length);
956
+ }
957
+ this.emitter.removeAllListeners();
958
+ logger.info("destroyed the listener!");
959
+ this.readyState = "DISPOSED";
960
+ }
961
+ getInstance() {
962
+ var _a;
963
+ const instance = getGlobalSymbol(this.symbol);
964
+ this.logger.info("retrieved global instance:", (_a = instance == null ? void 0 : instance.constructor) == null ? void 0 : _a.name);
965
+ return instance;
966
+ }
967
+ setInstance() {
968
+ setGlobalSymbol(this.symbol, this);
969
+ this.logger.info("set global instance!", this.symbol.description);
970
+ }
971
+ clearInstance() {
972
+ deleteGlobalSymbol(this.symbol);
973
+ this.logger.info("cleared global instance!", this.symbol.description);
974
+ }
975
+ };
976
+
977
+ // node_modules/.pnpm/@mswjs+interceptors@0.25.15/node_modules/@mswjs/interceptors/lib/browser/index.mjs
978
+ var BatchInterceptor = class extends Interceptor {
979
+ constructor(options) {
980
+ BatchInterceptor.symbol = Symbol(options.name);
981
+ super(BatchInterceptor.symbol);
982
+ this.interceptors = options.interceptors;
983
+ }
984
+ setup() {
985
+ const logger = this.logger.extend("setup");
986
+ logger.info("applying all %d interceptors...", this.interceptors.length);
987
+ for (const interceptor of this.interceptors) {
988
+ logger.info('applying "%s" interceptor...', interceptor.constructor.name);
989
+ interceptor.apply();
990
+ logger.info("adding interceptor dispose subscription");
991
+ this.subscriptions.push(() => interceptor.dispose());
992
+ }
993
+ }
994
+ on(event, listener) {
995
+ for (const interceptor of this.interceptors) {
996
+ interceptor.on(event, listener);
997
+ }
998
+ return this;
999
+ }
1000
+ once(event, listener) {
1001
+ for (const interceptor of this.interceptors) {
1002
+ interceptor.once(event, listener);
1003
+ }
1004
+ return this;
1005
+ }
1006
+ off(event, listener) {
1007
+ for (const interceptor of this.interceptors) {
1008
+ interceptor.off(event, listener);
1009
+ }
1010
+ return this;
1011
+ }
1012
+ removeAllListeners(event) {
1013
+ for (const interceptors of this.interceptors) {
1014
+ interceptors.removeAllListeners(event);
1015
+ }
1016
+ return this;
1017
+ }
1018
+ };
1019
+
262
1020
  // src/browser/setupWorker/start/createResponseListener.ts
263
- import { isResponseWithoutBody } from "@mswjs/interceptors";
264
1021
  function createResponseListener(context) {
265
1022
  return (_, message) => {
266
1023
  const { payload: responseJson } = message;
1024
+ const { requestId } = responseJson;
1025
+ const request = context.requests.get(requestId);
1026
+ context.requests.delete(requestId);
267
1027
  if (responseJson.type?.includes("opaque")) {
268
1028
  return;
269
1029
  }
@@ -281,11 +1041,7 @@ function createResponseListener(context) {
281
1041
  responseJson.isMockedResponse ? "response:mocked" : "response:bypass",
282
1042
  {
283
1043
  response,
284
- /**
285
- * @todo @fixme In this context, we don't know anything about
286
- * the request.
287
- */
288
- request: null,
1044
+ request,
289
1045
  requestId: responseJson.requestId
290
1046
  }
291
1047
  );
@@ -348,7 +1104,7 @@ Please consider using a custom "serviceWorker.url" option to point to the actual
348
1104
  }
349
1105
  window.clearInterval(context.keepAliveInterval);
350
1106
  });
351
- const integrityCheckResult = await until2(
1107
+ const integrityCheckResult = await until(
352
1108
  () => requestIntegrityCheck(context, worker)
353
1109
  );
354
1110
  if (integrityCheckResult.error) {
@@ -380,8 +1136,8 @@ If this message still persists after updating, please report an issue: https://g
380
1136
  });
381
1137
  });
382
1138
  }
383
- await enableMocking(context, options).catch((error) => {
384
- throw new Error(`Failed to enable mocking: ${error?.message}`);
1139
+ await enableMocking(context, options).catch((error2) => {
1140
+ throw new Error(`Failed to enable mocking: ${error2?.message}`);
385
1141
  });
386
1142
  return registration;
387
1143
  }
@@ -436,12 +1192,996 @@ var DEFAULT_START_OPTIONS = {
436
1192
  }
437
1193
  };
438
1194
 
1195
+ // node_modules/.pnpm/@open-draft+deferred-promise@2.2.0/node_modules/@open-draft/deferred-promise/build/index.mjs
1196
+ function createDeferredExecutor() {
1197
+ const executor = (resolve, reject) => {
1198
+ executor.state = "pending";
1199
+ executor.resolve = (data) => {
1200
+ if (executor.state !== "pending") {
1201
+ return;
1202
+ }
1203
+ executor.result = data;
1204
+ const onFulfilled = (value) => {
1205
+ executor.state = "fulfilled";
1206
+ return value;
1207
+ };
1208
+ return resolve(
1209
+ data instanceof Promise ? data : Promise.resolve(data).then(onFulfilled)
1210
+ );
1211
+ };
1212
+ executor.reject = (reason) => {
1213
+ if (executor.state !== "pending") {
1214
+ return;
1215
+ }
1216
+ queueMicrotask(() => {
1217
+ executor.state = "rejected";
1218
+ });
1219
+ return reject(executor.rejectionReason = reason);
1220
+ };
1221
+ };
1222
+ return executor;
1223
+ }
1224
+ var DeferredPromise = class extends Promise {
1225
+ #executor;
1226
+ resolve;
1227
+ reject;
1228
+ constructor(executor = null) {
1229
+ const deferredExecutor = createDeferredExecutor();
1230
+ super((originalResolve, originalReject) => {
1231
+ deferredExecutor(originalResolve, originalReject);
1232
+ executor?.(deferredExecutor.resolve, deferredExecutor.reject);
1233
+ });
1234
+ this.#executor = deferredExecutor;
1235
+ this.resolve = this.#executor.resolve;
1236
+ this.reject = this.#executor.reject;
1237
+ }
1238
+ get state() {
1239
+ return this.#executor.state;
1240
+ }
1241
+ get rejectionReason() {
1242
+ return this.#executor.rejectionReason;
1243
+ }
1244
+ then(onFulfilled, onRejected) {
1245
+ return this.#decorate(super.then(onFulfilled, onRejected));
1246
+ }
1247
+ catch(onRejected) {
1248
+ return this.#decorate(super.catch(onRejected));
1249
+ }
1250
+ finally(onfinally) {
1251
+ return this.#decorate(super.finally(onfinally));
1252
+ }
1253
+ #decorate(promise) {
1254
+ return Object.defineProperties(promise, {
1255
+ resolve: { configurable: true, value: this.resolve },
1256
+ reject: { configurable: true, value: this.reject }
1257
+ });
1258
+ }
1259
+ };
1260
+
1261
+ // node_modules/.pnpm/@mswjs+interceptors@0.25.15/node_modules/@mswjs/interceptors/lib/browser/chunk-72HT65NX.mjs
1262
+ function uuidv4() {
1263
+ return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, function(c) {
1264
+ const r = Math.random() * 16 | 0;
1265
+ const v = c == "x" ? r : r & 3 | 8;
1266
+ return v.toString(16);
1267
+ });
1268
+ }
1269
+ var RequestController = class {
1270
+ constructor(request) {
1271
+ this.request = request;
1272
+ this.responsePromise = new DeferredPromise();
1273
+ }
1274
+ respondWith(response) {
1275
+ invariant(
1276
+ this.responsePromise.state === "pending",
1277
+ 'Failed to respond to "%s %s" request: the "request" event has already been responded to.',
1278
+ this.request.method,
1279
+ this.request.url
1280
+ );
1281
+ this.responsePromise.resolve(response);
1282
+ }
1283
+ };
1284
+ function toInteractiveRequest(request) {
1285
+ const requestController = new RequestController(request);
1286
+ Reflect.set(
1287
+ request,
1288
+ "respondWith",
1289
+ requestController.respondWith.bind(requestController)
1290
+ );
1291
+ return {
1292
+ interactiveRequest: request,
1293
+ requestController
1294
+ };
1295
+ }
1296
+ async function emitAsync(emitter, eventName, ...data) {
1297
+ const listners = emitter.listeners(eventName);
1298
+ if (listners.length === 0) {
1299
+ return;
1300
+ }
1301
+ for (const listener of listners) {
1302
+ await listener.apply(emitter, data);
1303
+ }
1304
+ }
1305
+
1306
+ // node_modules/.pnpm/@mswjs+interceptors@0.25.15/node_modules/@mswjs/interceptors/lib/browser/chunk-44V5AUD6.mjs
1307
+ function isPropertyAccessible(obj, key) {
1308
+ try {
1309
+ obj[key];
1310
+ return true;
1311
+ } catch (e) {
1312
+ return false;
1313
+ }
1314
+ }
1315
+ function canParseUrl(url) {
1316
+ try {
1317
+ new URL(url);
1318
+ return true;
1319
+ } catch (_error) {
1320
+ return false;
1321
+ }
1322
+ }
1323
+ var _FetchInterceptor = class extends Interceptor {
1324
+ constructor() {
1325
+ super(_FetchInterceptor.symbol);
1326
+ }
1327
+ checkEnvironment() {
1328
+ return typeof globalThis !== "undefined" && typeof globalThis.fetch !== "undefined";
1329
+ }
1330
+ setup() {
1331
+ const pureFetch = globalThis.fetch;
1332
+ invariant(
1333
+ !pureFetch[IS_PATCHED_MODULE],
1334
+ 'Failed to patch the "fetch" module: already patched.'
1335
+ );
1336
+ globalThis.fetch = async (input, init) => {
1337
+ var _a;
1338
+ const requestId = uuidv4();
1339
+ const resolvedInput = typeof input === "string" && typeof location !== "undefined" && !canParseUrl(input) ? new URL(input, location.origin) : input;
1340
+ const request = new Request(resolvedInput, init);
1341
+ this.logger.info("[%s] %s", request.method, request.url);
1342
+ const { interactiveRequest, requestController } = toInteractiveRequest(request);
1343
+ this.logger.info(
1344
+ 'emitting the "request" event for %d listener(s)...',
1345
+ this.emitter.listenerCount("request")
1346
+ );
1347
+ this.emitter.once("request", ({ requestId: pendingRequestId }) => {
1348
+ if (pendingRequestId !== requestId) {
1349
+ return;
1350
+ }
1351
+ if (requestController.responsePromise.state === "pending") {
1352
+ requestController.responsePromise.resolve(void 0);
1353
+ }
1354
+ });
1355
+ this.logger.info("awaiting for the mocked response...");
1356
+ const signal = interactiveRequest.signal;
1357
+ const requestAborted = new DeferredPromise();
1358
+ signal.addEventListener(
1359
+ "abort",
1360
+ () => {
1361
+ requestAborted.reject(signal.reason);
1362
+ },
1363
+ { once: true }
1364
+ );
1365
+ const resolverResult = await until(async () => {
1366
+ const listenersFinished = emitAsync(this.emitter, "request", {
1367
+ request: interactiveRequest,
1368
+ requestId
1369
+ });
1370
+ await Promise.race([
1371
+ requestAborted,
1372
+ // Put the listeners invocation Promise in the same race condition
1373
+ // with the request abort Promise because otherwise awaiting the listeners
1374
+ // would always yield some response (or undefined).
1375
+ listenersFinished,
1376
+ requestController.responsePromise
1377
+ ]);
1378
+ this.logger.info("all request listeners have been resolved!");
1379
+ const mockedResponse2 = await requestController.responsePromise;
1380
+ this.logger.info("event.respondWith called with:", mockedResponse2);
1381
+ return mockedResponse2;
1382
+ });
1383
+ if (requestAborted.state === "rejected") {
1384
+ return Promise.reject(requestAborted.rejectionReason);
1385
+ }
1386
+ if (resolverResult.error) {
1387
+ return Promise.reject(createNetworkError(resolverResult.error));
1388
+ }
1389
+ const mockedResponse = resolverResult.data;
1390
+ if (mockedResponse && !((_a = request.signal) == null ? void 0 : _a.aborted)) {
1391
+ this.logger.info("received mocked response:", mockedResponse);
1392
+ if (isPropertyAccessible(mockedResponse, "type") && mockedResponse.type === "error") {
1393
+ this.logger.info(
1394
+ "received a network error response, rejecting the request promise..."
1395
+ );
1396
+ return Promise.reject(createNetworkError(mockedResponse));
1397
+ }
1398
+ const responseClone = mockedResponse.clone();
1399
+ this.emitter.emit("response", {
1400
+ response: responseClone,
1401
+ isMockedResponse: true,
1402
+ request: interactiveRequest,
1403
+ requestId
1404
+ });
1405
+ const response = new Response(mockedResponse.body, mockedResponse);
1406
+ Object.defineProperty(response, "url", {
1407
+ writable: false,
1408
+ enumerable: true,
1409
+ configurable: false,
1410
+ value: request.url
1411
+ });
1412
+ return response;
1413
+ }
1414
+ this.logger.info("no mocked response received!");
1415
+ return pureFetch(request).then((response) => {
1416
+ const responseClone = response.clone();
1417
+ this.logger.info("original fetch performed", responseClone);
1418
+ this.emitter.emit("response", {
1419
+ response: responseClone,
1420
+ isMockedResponse: false,
1421
+ request: interactiveRequest,
1422
+ requestId
1423
+ });
1424
+ return response;
1425
+ });
1426
+ };
1427
+ Object.defineProperty(globalThis.fetch, IS_PATCHED_MODULE, {
1428
+ enumerable: true,
1429
+ configurable: true,
1430
+ value: true
1431
+ });
1432
+ this.subscriptions.push(() => {
1433
+ Object.defineProperty(globalThis.fetch, IS_PATCHED_MODULE, {
1434
+ value: void 0
1435
+ });
1436
+ globalThis.fetch = pureFetch;
1437
+ this.logger.info(
1438
+ 'restored native "globalThis.fetch"!',
1439
+ globalThis.fetch.name
1440
+ );
1441
+ });
1442
+ }
1443
+ };
1444
+ var FetchInterceptor = _FetchInterceptor;
1445
+ FetchInterceptor.symbol = Symbol("fetch");
1446
+ function createNetworkError(cause) {
1447
+ return Object.assign(new TypeError("Failed to fetch"), {
1448
+ cause
1449
+ });
1450
+ }
1451
+
1452
+ // node_modules/.pnpm/@mswjs+interceptors@0.25.15/node_modules/@mswjs/interceptors/lib/browser/chunk-DZVB7JEV.mjs
1453
+ function concatArrayBuffer(left, right) {
1454
+ const result = new Uint8Array(left.byteLength + right.byteLength);
1455
+ result.set(left, 0);
1456
+ result.set(right, left.byteLength);
1457
+ return result;
1458
+ }
1459
+ var EventPolyfill = class {
1460
+ constructor(type, options) {
1461
+ this.AT_TARGET = 0;
1462
+ this.BUBBLING_PHASE = 0;
1463
+ this.CAPTURING_PHASE = 0;
1464
+ this.NONE = 0;
1465
+ this.type = "";
1466
+ this.srcElement = null;
1467
+ this.currentTarget = null;
1468
+ this.eventPhase = 0;
1469
+ this.isTrusted = true;
1470
+ this.composed = false;
1471
+ this.cancelable = true;
1472
+ this.defaultPrevented = false;
1473
+ this.bubbles = true;
1474
+ this.lengthComputable = true;
1475
+ this.loaded = 0;
1476
+ this.total = 0;
1477
+ this.cancelBubble = false;
1478
+ this.returnValue = true;
1479
+ this.type = type;
1480
+ this.target = (options == null ? void 0 : options.target) || null;
1481
+ this.currentTarget = (options == null ? void 0 : options.currentTarget) || null;
1482
+ this.timeStamp = Date.now();
1483
+ }
1484
+ composedPath() {
1485
+ return [];
1486
+ }
1487
+ initEvent(type, bubbles, cancelable) {
1488
+ this.type = type;
1489
+ this.bubbles = !!bubbles;
1490
+ this.cancelable = !!cancelable;
1491
+ }
1492
+ preventDefault() {
1493
+ this.defaultPrevented = true;
1494
+ }
1495
+ stopPropagation() {
1496
+ }
1497
+ stopImmediatePropagation() {
1498
+ }
1499
+ };
1500
+ var ProgressEventPolyfill = class extends EventPolyfill {
1501
+ constructor(type, init) {
1502
+ super(type);
1503
+ this.lengthComputable = (init == null ? void 0 : init.lengthComputable) || false;
1504
+ this.composed = (init == null ? void 0 : init.composed) || false;
1505
+ this.loaded = (init == null ? void 0 : init.loaded) || 0;
1506
+ this.total = (init == null ? void 0 : init.total) || 0;
1507
+ }
1508
+ };
1509
+ var SUPPORTS_PROGRESS_EVENT = typeof ProgressEvent !== "undefined";
1510
+ function createEvent(target, type, init) {
1511
+ const progressEvents = [
1512
+ "error",
1513
+ "progress",
1514
+ "loadstart",
1515
+ "loadend",
1516
+ "load",
1517
+ "timeout",
1518
+ "abort"
1519
+ ];
1520
+ const ProgressEventClass = SUPPORTS_PROGRESS_EVENT ? ProgressEvent : ProgressEventPolyfill;
1521
+ const event = progressEvents.includes(type) ? new ProgressEventClass(type, {
1522
+ lengthComputable: true,
1523
+ loaded: (init == null ? void 0 : init.loaded) || 0,
1524
+ total: (init == null ? void 0 : init.total) || 0
1525
+ }) : new EventPolyfill(type, {
1526
+ target,
1527
+ currentTarget: target
1528
+ });
1529
+ return event;
1530
+ }
1531
+ function findPropertySource(target, propertyName) {
1532
+ if (!(propertyName in target)) {
1533
+ return null;
1534
+ }
1535
+ const hasProperty = Object.prototype.hasOwnProperty.call(target, propertyName);
1536
+ if (hasProperty) {
1537
+ return target;
1538
+ }
1539
+ const prototype = Reflect.getPrototypeOf(target);
1540
+ return prototype ? findPropertySource(prototype, propertyName) : null;
1541
+ }
1542
+ function createProxy(target, options) {
1543
+ const proxy = new Proxy(target, optionsToProxyHandler(options));
1544
+ return proxy;
1545
+ }
1546
+ function optionsToProxyHandler(options) {
1547
+ const { constructorCall, methodCall, getProperty, setProperty } = options;
1548
+ const handler = {};
1549
+ if (typeof constructorCall !== "undefined") {
1550
+ handler.construct = function(target, args, newTarget) {
1551
+ const next = Reflect.construct.bind(null, target, args, newTarget);
1552
+ return constructorCall.call(newTarget, args, next);
1553
+ };
1554
+ }
1555
+ handler.set = function(target, propertyName, nextValue) {
1556
+ const next = () => {
1557
+ const propertySource = findPropertySource(target, propertyName) || target;
1558
+ const ownDescriptors = Reflect.getOwnPropertyDescriptor(
1559
+ propertySource,
1560
+ propertyName
1561
+ );
1562
+ if (typeof (ownDescriptors == null ? void 0 : ownDescriptors.set) !== "undefined") {
1563
+ ownDescriptors.set.apply(target, [nextValue]);
1564
+ return true;
1565
+ }
1566
+ return Reflect.defineProperty(propertySource, propertyName, {
1567
+ writable: true,
1568
+ enumerable: true,
1569
+ configurable: true,
1570
+ value: nextValue
1571
+ });
1572
+ };
1573
+ if (typeof setProperty !== "undefined") {
1574
+ return setProperty.call(target, [propertyName, nextValue], next);
1575
+ }
1576
+ return next();
1577
+ };
1578
+ handler.get = function(target, propertyName, receiver) {
1579
+ const next = () => target[propertyName];
1580
+ const value = typeof getProperty !== "undefined" ? getProperty.call(target, [propertyName, receiver], next) : next();
1581
+ if (typeof value === "function") {
1582
+ return (...args) => {
1583
+ const next2 = value.bind(target, ...args);
1584
+ if (typeof methodCall !== "undefined") {
1585
+ return methodCall.call(target, [propertyName, args], next2);
1586
+ }
1587
+ return next2();
1588
+ };
1589
+ }
1590
+ return value;
1591
+ };
1592
+ return handler;
1593
+ }
1594
+ function isDomParserSupportedType(type) {
1595
+ const supportedTypes = [
1596
+ "application/xhtml+xml",
1597
+ "application/xml",
1598
+ "image/svg+xml",
1599
+ "text/html",
1600
+ "text/xml"
1601
+ ];
1602
+ return supportedTypes.some((supportedType) => {
1603
+ return type.startsWith(supportedType);
1604
+ });
1605
+ }
1606
+ function parseJson(data) {
1607
+ try {
1608
+ const json = JSON.parse(data);
1609
+ return json;
1610
+ } catch (_) {
1611
+ return null;
1612
+ }
1613
+ }
1614
+ function createResponse(request, body) {
1615
+ const responseBodyOrNull = isResponseWithoutBody(request.status) ? null : body;
1616
+ return new Response(responseBodyOrNull, {
1617
+ status: request.status,
1618
+ statusText: request.statusText,
1619
+ headers: createHeadersFromXMLHttpReqestHeaders(
1620
+ request.getAllResponseHeaders()
1621
+ )
1622
+ });
1623
+ }
1624
+ function createHeadersFromXMLHttpReqestHeaders(headersString) {
1625
+ const headers = new Headers();
1626
+ const lines = headersString.split(/[\r\n]+/);
1627
+ for (const line of lines) {
1628
+ if (line.trim() === "") {
1629
+ continue;
1630
+ }
1631
+ const [name, ...parts] = line.split(": ");
1632
+ const value = parts.join(": ");
1633
+ headers.append(name, value);
1634
+ }
1635
+ return headers;
1636
+ }
1637
+ var IS_MOCKED_RESPONSE = Symbol("isMockedResponse");
1638
+ var IS_NODE2 = isNodeProcess();
1639
+ var XMLHttpRequestController = class {
1640
+ constructor(initialRequest, logger) {
1641
+ this.initialRequest = initialRequest;
1642
+ this.logger = logger;
1643
+ this.method = "GET";
1644
+ this.url = null;
1645
+ this.events = /* @__PURE__ */ new Map();
1646
+ this.requestId = uuidv4();
1647
+ this.requestHeaders = new Headers();
1648
+ this.responseBuffer = new Uint8Array();
1649
+ this.request = createProxy(initialRequest, {
1650
+ setProperty: ([propertyName, nextValue], invoke) => {
1651
+ switch (propertyName) {
1652
+ case "ontimeout": {
1653
+ const eventName = propertyName.slice(
1654
+ 2
1655
+ );
1656
+ this.request.addEventListener(eventName, nextValue);
1657
+ return invoke();
1658
+ }
1659
+ default: {
1660
+ return invoke();
1661
+ }
1662
+ }
1663
+ },
1664
+ methodCall: ([methodName, args], invoke) => {
1665
+ var _a;
1666
+ switch (methodName) {
1667
+ case "open": {
1668
+ const [method, url] = args;
1669
+ if (typeof url === "undefined") {
1670
+ this.method = "GET";
1671
+ this.url = toAbsoluteUrl(method);
1672
+ } else {
1673
+ this.method = method;
1674
+ this.url = toAbsoluteUrl(url);
1675
+ }
1676
+ this.logger = this.logger.extend(`${this.method} ${this.url.href}`);
1677
+ this.logger.info("open", this.method, this.url.href);
1678
+ return invoke();
1679
+ }
1680
+ case "addEventListener": {
1681
+ const [eventName, listener] = args;
1682
+ this.registerEvent(eventName, listener);
1683
+ this.logger.info("addEventListener", eventName, listener);
1684
+ return invoke();
1685
+ }
1686
+ case "setRequestHeader": {
1687
+ const [name, value] = args;
1688
+ this.requestHeaders.set(name, value);
1689
+ this.logger.info("setRequestHeader", name, value);
1690
+ return invoke();
1691
+ }
1692
+ case "send": {
1693
+ const [body] = args;
1694
+ if (body != null) {
1695
+ this.requestBody = typeof body === "string" ? encodeBuffer(body) : body;
1696
+ }
1697
+ this.request.addEventListener("load", () => {
1698
+ if (typeof this.onResponse !== "undefined") {
1699
+ const fetchResponse = createResponse(
1700
+ this.request,
1701
+ /**
1702
+ * The `response` property is the right way to read
1703
+ * the ambiguous response body, as the request's "responseType" may differ.
1704
+ * @see https://xhr.spec.whatwg.org/#the-response-attribute
1705
+ */
1706
+ this.request.response
1707
+ );
1708
+ this.onResponse.call(this, {
1709
+ response: fetchResponse,
1710
+ isMockedResponse: IS_MOCKED_RESPONSE in this.request,
1711
+ request: fetchRequest,
1712
+ requestId: this.requestId
1713
+ });
1714
+ }
1715
+ });
1716
+ const fetchRequest = this.toFetchApiRequest();
1717
+ const onceRequestSettled = ((_a = this.onRequest) == null ? void 0 : _a.call(this, {
1718
+ request: fetchRequest,
1719
+ requestId: this.requestId
1720
+ })) || Promise.resolve();
1721
+ onceRequestSettled.finally(() => {
1722
+ if (this.request.readyState < this.request.LOADING) {
1723
+ this.logger.info(
1724
+ "request callback settled but request has not been handled (readystate %d), performing as-is...",
1725
+ this.request.readyState
1726
+ );
1727
+ if (IS_NODE2) {
1728
+ this.request.setRequestHeader("X-Request-Id", this.requestId);
1729
+ }
1730
+ return invoke();
1731
+ }
1732
+ });
1733
+ break;
1734
+ }
1735
+ default: {
1736
+ return invoke();
1737
+ }
1738
+ }
1739
+ }
1740
+ });
1741
+ }
1742
+ registerEvent(eventName, listener) {
1743
+ const prevEvents = this.events.get(eventName) || [];
1744
+ const nextEvents = prevEvents.concat(listener);
1745
+ this.events.set(eventName, nextEvents);
1746
+ this.logger.info('registered event "%s"', eventName, listener);
1747
+ }
1748
+ /**
1749
+ * Responds to the current request with the given
1750
+ * Fetch API `Response` instance.
1751
+ */
1752
+ respondWith(response) {
1753
+ this.logger.info(
1754
+ "responding with a mocked response: %d %s",
1755
+ response.status,
1756
+ response.statusText
1757
+ );
1758
+ define(this.request, IS_MOCKED_RESPONSE, true);
1759
+ define(this.request, "status", response.status);
1760
+ define(this.request, "statusText", response.statusText);
1761
+ define(this.request, "responseURL", this.url.href);
1762
+ this.request.getResponseHeader = new Proxy(this.request.getResponseHeader, {
1763
+ apply: (_, __, args) => {
1764
+ this.logger.info("getResponseHeader", args[0]);
1765
+ if (this.request.readyState < this.request.HEADERS_RECEIVED) {
1766
+ this.logger.info("headers not received yet, returning null");
1767
+ return null;
1768
+ }
1769
+ const headerValue = response.headers.get(args[0]);
1770
+ this.logger.info(
1771
+ 'resolved response header "%s" to',
1772
+ args[0],
1773
+ headerValue
1774
+ );
1775
+ return headerValue;
1776
+ }
1777
+ });
1778
+ this.request.getAllResponseHeaders = new Proxy(
1779
+ this.request.getAllResponseHeaders,
1780
+ {
1781
+ apply: () => {
1782
+ this.logger.info("getAllResponseHeaders");
1783
+ if (this.request.readyState < this.request.HEADERS_RECEIVED) {
1784
+ this.logger.info("headers not received yet, returning empty string");
1785
+ return "";
1786
+ }
1787
+ const headersList = Array.from(response.headers.entries());
1788
+ const allHeaders = headersList.map(([headerName, headerValue]) => {
1789
+ return `${headerName}: ${headerValue}`;
1790
+ }).join("\r\n");
1791
+ this.logger.info("resolved all response headers to", allHeaders);
1792
+ return allHeaders;
1793
+ }
1794
+ }
1795
+ );
1796
+ Object.defineProperties(this.request, {
1797
+ response: {
1798
+ enumerable: true,
1799
+ configurable: false,
1800
+ get: () => this.response
1801
+ },
1802
+ responseText: {
1803
+ enumerable: true,
1804
+ configurable: false,
1805
+ get: () => this.responseText
1806
+ },
1807
+ responseXML: {
1808
+ enumerable: true,
1809
+ configurable: false,
1810
+ get: () => this.responseXML
1811
+ }
1812
+ });
1813
+ const totalResponseBodyLength = response.headers.has("Content-Length") ? Number(response.headers.get("Content-Length")) : (
1814
+ /**
1815
+ * @todo Infer the response body length from the response body.
1816
+ */
1817
+ void 0
1818
+ );
1819
+ this.logger.info("calculated response body length", totalResponseBodyLength);
1820
+ this.trigger("loadstart", {
1821
+ loaded: 0,
1822
+ total: totalResponseBodyLength
1823
+ });
1824
+ this.setReadyState(this.request.HEADERS_RECEIVED);
1825
+ this.setReadyState(this.request.LOADING);
1826
+ const finalizeResponse = () => {
1827
+ this.logger.info("finalizing the mocked response...");
1828
+ this.setReadyState(this.request.DONE);
1829
+ this.trigger("load", {
1830
+ loaded: this.responseBuffer.byteLength,
1831
+ total: totalResponseBodyLength
1832
+ });
1833
+ this.trigger("loadend", {
1834
+ loaded: this.responseBuffer.byteLength,
1835
+ total: totalResponseBodyLength
1836
+ });
1837
+ };
1838
+ if (response.body) {
1839
+ this.logger.info("mocked response has body, streaming...");
1840
+ const reader = response.body.getReader();
1841
+ const readNextResponseBodyChunk = async () => {
1842
+ const { value, done } = await reader.read();
1843
+ if (done) {
1844
+ this.logger.info("response body stream done!");
1845
+ finalizeResponse();
1846
+ return;
1847
+ }
1848
+ if (value) {
1849
+ this.logger.info("read response body chunk:", value);
1850
+ this.responseBuffer = concatArrayBuffer(this.responseBuffer, value);
1851
+ this.trigger("progress", {
1852
+ loaded: this.responseBuffer.byteLength,
1853
+ total: totalResponseBodyLength
1854
+ });
1855
+ }
1856
+ readNextResponseBodyChunk();
1857
+ };
1858
+ readNextResponseBodyChunk();
1859
+ } else {
1860
+ finalizeResponse();
1861
+ }
1862
+ }
1863
+ responseBufferToText() {
1864
+ return decodeBuffer(this.responseBuffer);
1865
+ }
1866
+ get response() {
1867
+ this.logger.info(
1868
+ "getResponse (responseType: %s)",
1869
+ this.request.responseType
1870
+ );
1871
+ if (this.request.readyState !== this.request.DONE) {
1872
+ return null;
1873
+ }
1874
+ switch (this.request.responseType) {
1875
+ case "json": {
1876
+ const responseJson = parseJson(this.responseBufferToText());
1877
+ this.logger.info("resolved response JSON", responseJson);
1878
+ return responseJson;
1879
+ }
1880
+ case "arraybuffer": {
1881
+ const arrayBuffer = toArrayBuffer(this.responseBuffer);
1882
+ this.logger.info("resolved response ArrayBuffer", arrayBuffer);
1883
+ return arrayBuffer;
1884
+ }
1885
+ case "blob": {
1886
+ const mimeType = this.request.getResponseHeader("Content-Type") || "text/plain";
1887
+ const responseBlob = new Blob([this.responseBufferToText()], {
1888
+ type: mimeType
1889
+ });
1890
+ this.logger.info(
1891
+ "resolved response Blob (mime type: %s)",
1892
+ responseBlob,
1893
+ mimeType
1894
+ );
1895
+ return responseBlob;
1896
+ }
1897
+ default: {
1898
+ const responseText = this.responseBufferToText();
1899
+ this.logger.info(
1900
+ 'resolving "%s" response type as text',
1901
+ this.request.responseType,
1902
+ responseText
1903
+ );
1904
+ return responseText;
1905
+ }
1906
+ }
1907
+ }
1908
+ get responseText() {
1909
+ invariant(
1910
+ this.request.responseType === "" || this.request.responseType === "text",
1911
+ "InvalidStateError: The object is in invalid state."
1912
+ );
1913
+ if (this.request.readyState !== this.request.LOADING && this.request.readyState !== this.request.DONE) {
1914
+ return "";
1915
+ }
1916
+ const responseText = this.responseBufferToText();
1917
+ this.logger.info('getResponseText: "%s"', responseText);
1918
+ return responseText;
1919
+ }
1920
+ get responseXML() {
1921
+ invariant(
1922
+ this.request.responseType === "" || this.request.responseType === "document",
1923
+ "InvalidStateError: The object is in invalid state."
1924
+ );
1925
+ if (this.request.readyState !== this.request.DONE) {
1926
+ return null;
1927
+ }
1928
+ const contentType = this.request.getResponseHeader("Content-Type") || "";
1929
+ if (typeof DOMParser === "undefined") {
1930
+ console.warn(
1931
+ "Cannot retrieve XMLHttpRequest response body as XML: DOMParser is not defined. You are likely using an environment that is not browser or does not polyfill browser globals correctly."
1932
+ );
1933
+ return null;
1934
+ }
1935
+ if (isDomParserSupportedType(contentType)) {
1936
+ return new DOMParser().parseFromString(
1937
+ this.responseBufferToText(),
1938
+ contentType
1939
+ );
1940
+ }
1941
+ return null;
1942
+ }
1943
+ errorWith(error2) {
1944
+ this.logger.info("responding with an error");
1945
+ this.setReadyState(this.request.DONE);
1946
+ this.trigger("error");
1947
+ this.trigger("loadend");
1948
+ }
1949
+ /**
1950
+ * Transitions this request's `readyState` to the given one.
1951
+ */
1952
+ setReadyState(nextReadyState) {
1953
+ this.logger.info(
1954
+ "setReadyState: %d -> %d",
1955
+ this.request.readyState,
1956
+ nextReadyState
1957
+ );
1958
+ if (this.request.readyState === nextReadyState) {
1959
+ this.logger.info("ready state identical, skipping transition...");
1960
+ return;
1961
+ }
1962
+ define(this.request, "readyState", nextReadyState);
1963
+ this.logger.info("set readyState to: %d", nextReadyState);
1964
+ if (nextReadyState !== this.request.UNSENT) {
1965
+ this.logger.info('triggerring "readystatechange" event...');
1966
+ this.trigger("readystatechange");
1967
+ }
1968
+ }
1969
+ /**
1970
+ * Triggers given event on the `XMLHttpRequest` instance.
1971
+ */
1972
+ trigger(eventName, options) {
1973
+ const callback = this.request[`on${eventName}`];
1974
+ const event = createEvent(this.request, eventName, options);
1975
+ this.logger.info('trigger "%s"', eventName, options || "");
1976
+ if (typeof callback === "function") {
1977
+ this.logger.info('found a direct "%s" callback, calling...', eventName);
1978
+ callback.call(this.request, event);
1979
+ }
1980
+ for (const [registeredEventName, listeners] of this.events) {
1981
+ if (registeredEventName === eventName) {
1982
+ this.logger.info(
1983
+ 'found %d listener(s) for "%s" event, calling...',
1984
+ listeners.length,
1985
+ eventName
1986
+ );
1987
+ listeners.forEach((listener) => listener.call(this.request, event));
1988
+ }
1989
+ }
1990
+ }
1991
+ /**
1992
+ * Converts this `XMLHttpRequest` instance into a Fetch API `Request` instance.
1993
+ */
1994
+ toFetchApiRequest() {
1995
+ this.logger.info("converting request to a Fetch API Request...");
1996
+ const fetchRequest = new Request(this.url.href, {
1997
+ method: this.method,
1998
+ headers: this.requestHeaders,
1999
+ /**
2000
+ * @see https://xhr.spec.whatwg.org/#cross-origin-credentials
2001
+ */
2002
+ credentials: this.request.withCredentials ? "include" : "same-origin",
2003
+ body: ["GET", "HEAD"].includes(this.method) ? null : this.requestBody
2004
+ });
2005
+ const proxyHeaders = createProxy(fetchRequest.headers, {
2006
+ methodCall: ([methodName, args], invoke) => {
2007
+ switch (methodName) {
2008
+ case "append":
2009
+ case "set": {
2010
+ const [headerName, headerValue] = args;
2011
+ this.request.setRequestHeader(headerName, headerValue);
2012
+ break;
2013
+ }
2014
+ case "delete": {
2015
+ const [headerName] = args;
2016
+ console.warn(
2017
+ `XMLHttpRequest: Cannot remove a "${headerName}" header from the Fetch API representation of the "${fetchRequest.method} ${fetchRequest.url}" request. XMLHttpRequest headers cannot be removed.`
2018
+ );
2019
+ break;
2020
+ }
2021
+ }
2022
+ return invoke();
2023
+ }
2024
+ });
2025
+ define(fetchRequest, "headers", proxyHeaders);
2026
+ this.logger.info("converted request to a Fetch API Request!", fetchRequest);
2027
+ return fetchRequest;
2028
+ }
2029
+ };
2030
+ function toAbsoluteUrl(url) {
2031
+ if (typeof location === "undefined") {
2032
+ return new URL(url);
2033
+ }
2034
+ return new URL(url.toString(), location.href);
2035
+ }
2036
+ function define(target, property, value) {
2037
+ Reflect.defineProperty(target, property, {
2038
+ // Ensure writable properties to allow redefining readonly properties.
2039
+ writable: true,
2040
+ enumerable: true,
2041
+ value
2042
+ });
2043
+ }
2044
+ function createXMLHttpRequestProxy({
2045
+ emitter,
2046
+ logger
2047
+ }) {
2048
+ const XMLHttpRequestProxy = new Proxy(globalThis.XMLHttpRequest, {
2049
+ construct(target, args, newTarget) {
2050
+ logger.info("constructed new XMLHttpRequest");
2051
+ const originalRequest = Reflect.construct(target, args, newTarget);
2052
+ const prototypeDescriptors = Object.getOwnPropertyDescriptors(
2053
+ target.prototype
2054
+ );
2055
+ for (const propertyName in prototypeDescriptors) {
2056
+ Reflect.defineProperty(
2057
+ originalRequest,
2058
+ propertyName,
2059
+ prototypeDescriptors[propertyName]
2060
+ );
2061
+ }
2062
+ const xhrRequestController = new XMLHttpRequestController(
2063
+ originalRequest,
2064
+ logger
2065
+ );
2066
+ xhrRequestController.onRequest = async function({ request, requestId }) {
2067
+ const { interactiveRequest, requestController } = toInteractiveRequest(request);
2068
+ this.logger.info("awaiting mocked response...");
2069
+ emitter.once("request", ({ requestId: pendingRequestId }) => {
2070
+ if (pendingRequestId !== requestId) {
2071
+ return;
2072
+ }
2073
+ if (requestController.responsePromise.state === "pending") {
2074
+ requestController.respondWith(void 0);
2075
+ }
2076
+ });
2077
+ const resolverResult = await until(async () => {
2078
+ this.logger.info(
2079
+ 'emitting the "request" event for %s listener(s)...',
2080
+ emitter.listenerCount("request")
2081
+ );
2082
+ await emitAsync(emitter, "request", {
2083
+ request: interactiveRequest,
2084
+ requestId
2085
+ });
2086
+ this.logger.info('all "request" listeners settled!');
2087
+ const mockedResponse2 = await requestController.responsePromise;
2088
+ this.logger.info("event.respondWith called with:", mockedResponse2);
2089
+ return mockedResponse2;
2090
+ });
2091
+ if (resolverResult.error) {
2092
+ this.logger.info(
2093
+ "request listener threw an exception, aborting request...",
2094
+ resolverResult.error
2095
+ );
2096
+ xhrRequestController.errorWith(resolverResult.error);
2097
+ return;
2098
+ }
2099
+ const mockedResponse = resolverResult.data;
2100
+ if (typeof mockedResponse !== "undefined") {
2101
+ this.logger.info(
2102
+ "received mocked response: %d %s",
2103
+ mockedResponse.status,
2104
+ mockedResponse.statusText
2105
+ );
2106
+ if (mockedResponse.type === "error") {
2107
+ this.logger.info(
2108
+ "received a network error response, rejecting the request promise..."
2109
+ );
2110
+ xhrRequestController.errorWith(new TypeError("Network error"));
2111
+ return;
2112
+ }
2113
+ return xhrRequestController.respondWith(mockedResponse);
2114
+ }
2115
+ this.logger.info(
2116
+ "no mocked response received, performing request as-is..."
2117
+ );
2118
+ };
2119
+ xhrRequestController.onResponse = async function({
2120
+ response,
2121
+ isMockedResponse,
2122
+ request,
2123
+ requestId
2124
+ }) {
2125
+ this.logger.info(
2126
+ 'emitting the "response" event for %s listener(s)...',
2127
+ emitter.listenerCount("response")
2128
+ );
2129
+ emitter.emit("response", {
2130
+ response,
2131
+ isMockedResponse,
2132
+ request,
2133
+ requestId
2134
+ });
2135
+ };
2136
+ return xhrRequestController.request;
2137
+ }
2138
+ });
2139
+ return XMLHttpRequestProxy;
2140
+ }
2141
+ var _XMLHttpRequestInterceptor = class extends Interceptor {
2142
+ constructor() {
2143
+ super(_XMLHttpRequestInterceptor.interceptorSymbol);
2144
+ }
2145
+ checkEnvironment() {
2146
+ return typeof globalThis.XMLHttpRequest !== "undefined";
2147
+ }
2148
+ setup() {
2149
+ const logger = this.logger.extend("setup");
2150
+ logger.info('patching "XMLHttpRequest" module...');
2151
+ const PureXMLHttpRequest = globalThis.XMLHttpRequest;
2152
+ invariant(
2153
+ !PureXMLHttpRequest[IS_PATCHED_MODULE],
2154
+ 'Failed to patch the "XMLHttpRequest" module: already patched.'
2155
+ );
2156
+ globalThis.XMLHttpRequest = createXMLHttpRequestProxy({
2157
+ emitter: this.emitter,
2158
+ logger: this.logger
2159
+ });
2160
+ logger.info(
2161
+ 'native "XMLHttpRequest" module patched!',
2162
+ globalThis.XMLHttpRequest.name
2163
+ );
2164
+ Object.defineProperty(globalThis.XMLHttpRequest, IS_PATCHED_MODULE, {
2165
+ enumerable: true,
2166
+ configurable: true,
2167
+ value: true
2168
+ });
2169
+ this.subscriptions.push(() => {
2170
+ Object.defineProperty(globalThis.XMLHttpRequest, IS_PATCHED_MODULE, {
2171
+ value: void 0
2172
+ });
2173
+ globalThis.XMLHttpRequest = PureXMLHttpRequest;
2174
+ logger.info(
2175
+ 'native "XMLHttpRequest" module restored!',
2176
+ globalThis.XMLHttpRequest.name
2177
+ );
2178
+ });
2179
+ }
2180
+ };
2181
+ var XMLHttpRequestInterceptor = _XMLHttpRequestInterceptor;
2182
+ XMLHttpRequestInterceptor.interceptorSymbol = Symbol("xhr");
2183
+
439
2184
  // src/browser/setupWorker/start/createFallbackRequestListener.ts
440
- import {
441
- BatchInterceptor
442
- } from "@mswjs/interceptors";
443
- import { FetchInterceptor } from "@mswjs/interceptors/fetch";
444
- import { XMLHttpRequestInterceptor } from "@mswjs/interceptors/XMLHttpRequest";
445
2185
  import { handleRequest as handleRequest2 } from '../core/utils/handleRequest.mjs';
446
2186
  function createFallbackRequestListener(context, options) {
447
2187
  const interceptor = new BatchInterceptor({
@@ -528,7 +2268,7 @@ function supportsReadableStreamTransfer() {
528
2268
  const message = new MessageChannel();
529
2269
  message.port1.postMessage(stream, [stream]);
530
2270
  return true;
531
- } catch (error) {
2271
+ } catch (error2) {
532
2272
  return false;
533
2273
  }
534
2274
  }
@@ -559,6 +2299,7 @@ var SetupWorkerApi = class extends SetupApi {
559
2299
  worker: null,
560
2300
  registration: null,
561
2301
  requestHandlers: this.currentHandlers,
2302
+ requests: /* @__PURE__ */ new Map(),
562
2303
  emitter: this.emitter,
563
2304
  workerChannel: {
564
2305
  on: (eventType, callback) => {
@@ -606,8 +2347,8 @@ var SetupWorkerApi = class extends SetupApi {
606
2347
  if (message.type === eventType) {
607
2348
  resolve(message);
608
2349
  }
609
- } catch (error) {
610
- reject(error);
2350
+ } catch (error2) {
2351
+ reject(error2);
611
2352
  }
612
2353
  };
613
2354
  bindings.push(