@mswjs/interceptors 0.25.1 → 0.25.3

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 (85) hide show
  1. package/lib/browser/Interceptor-8d5fd4c6.d.ts +86 -0
  2. package/lib/browser/{chunk-ANLPTCZ5.mjs → chunk-AN3YI76R.mjs} +33 -26
  3. package/lib/browser/{chunk-4CFMDU7Z.js → chunk-CWVY2E3W.js} +20 -134
  4. package/lib/browser/{chunk-OSIUQA4X.js → chunk-FFBQOFWV.js} +38 -31
  5. package/lib/browser/{chunk-VMXB5F2J.mjs → chunk-HXJPKJY3.mjs} +25 -15
  6. package/lib/browser/{chunk-DBFLI5DJ.js → chunk-KITNLK66.js} +30 -20
  7. package/lib/browser/chunk-KK6APRON.mjs +58 -0
  8. package/lib/browser/{chunk-GXJLJMOT.mjs → chunk-QPMXOLDO.mjs} +21 -135
  9. package/lib/browser/chunk-X3NRJIZW.js +58 -0
  10. package/lib/browser/index.d.ts +7 -3
  11. package/lib/browser/index.js +24 -5
  12. package/lib/browser/index.mjs +22 -3
  13. package/lib/browser/interceptors/XMLHttpRequest/index.d.ts +4 -3
  14. package/lib/browser/interceptors/XMLHttpRequest/index.js +4 -4
  15. package/lib/browser/interceptors/XMLHttpRequest/index.mjs +3 -3
  16. package/lib/browser/interceptors/fetch/index.d.ts +2 -1
  17. package/lib/browser/interceptors/fetch/index.js +4 -4
  18. package/lib/browser/interceptors/fetch/index.mjs +3 -3
  19. package/lib/browser/presets/browser.d.ts +2 -1
  20. package/lib/browser/presets/browser.js +6 -6
  21. package/lib/browser/presets/browser.mjs +4 -4
  22. package/lib/node/{BatchInterceptor-c841b068.d.ts → BatchInterceptor-9785c567.d.ts} +5 -2
  23. package/lib/node/Interceptor-7a701c1f.d.ts +86 -0
  24. package/lib/node/RemoteHttpInterceptor.d.ts +3 -2
  25. package/lib/node/RemoteHttpInterceptor.js +19 -18
  26. package/lib/node/RemoteHttpInterceptor.mjs +15 -14
  27. package/lib/node/chunk-3IYIKC3X.mjs +6 -0
  28. package/lib/node/{chunk-XYZRP5S2.js → chunk-3XFLRXRY.js} +20 -134
  29. package/lib/node/chunk-5PTPJLB7.js +58 -0
  30. package/lib/node/{chunk-HSCXCLVT.mjs → chunk-FB53TMYN.mjs} +33 -26
  31. package/lib/node/{chunk-RGYCLCLK.mjs → chunk-GM3YBSM3.mjs} +21 -135
  32. package/lib/node/{chunk-E6YC337Q.js → chunk-JCWVLTP7.js} +35 -28
  33. package/lib/node/{chunk-OL7OR4RL.mjs → chunk-MCO3RLQC.mjs} +48 -26
  34. package/lib/node/{chunk-3MYUI4B2.js → chunk-NCHFM2TB.js} +50 -28
  35. package/lib/node/chunk-OGN3ZR35.js +6 -0
  36. package/lib/node/{chunk-VS3GJPUE.mjs → chunk-UBEFEZXT.mjs} +22 -3
  37. package/lib/node/{chunk-MVPEJK4V.js → chunk-UF7QIAQ5.js} +23 -4
  38. package/lib/node/chunk-YQGTMMOZ.mjs +58 -0
  39. package/lib/node/index.d.ts +3 -2
  40. package/lib/node/index.js +3 -3
  41. package/lib/node/index.mjs +2 -2
  42. package/lib/node/interceptors/ClientRequest/index.d.ts +4 -3
  43. package/lib/node/interceptors/ClientRequest/index.js +5 -4
  44. package/lib/node/interceptors/ClientRequest/index.mjs +4 -3
  45. package/lib/node/interceptors/XMLHttpRequest/index.d.ts +4 -3
  46. package/lib/node/interceptors/XMLHttpRequest/index.js +5 -4
  47. package/lib/node/interceptors/XMLHttpRequest/index.mjs +4 -3
  48. package/lib/node/interceptors/fetch/index.d.ts +2 -1
  49. package/lib/node/interceptors/fetch/index.js +27 -17
  50. package/lib/node/interceptors/fetch/index.mjs +25 -15
  51. package/lib/node/presets/node.d.ts +3 -2
  52. package/lib/node/presets/node.js +7 -6
  53. package/lib/node/presets/node.mjs +5 -4
  54. package/package.json +2 -2
  55. package/src/BatchInterceptor.test.ts +141 -0
  56. package/src/BatchInterceptor.ts +38 -4
  57. package/src/Interceptor.test.ts +46 -0
  58. package/src/Interceptor.ts +35 -16
  59. package/src/RemoteHttpInterceptor.ts +11 -9
  60. package/src/interceptors/ClientRequest/NodeClientRequest.test.ts +10 -10
  61. package/src/interceptors/ClientRequest/NodeClientRequest.ts +80 -43
  62. package/src/interceptors/ClientRequest/http.get.ts +3 -1
  63. package/src/interceptors/ClientRequest/http.request.ts +3 -1
  64. package/src/interceptors/ClientRequest/index.test.ts +2 -3
  65. package/src/interceptors/ClientRequest/index.ts +2 -2
  66. package/src/interceptors/ClientRequest/utils/createRequest.test.ts +2 -2
  67. package/src/interceptors/ClientRequest/utils/createResponse.test.ts +23 -0
  68. package/src/interceptors/ClientRequest/utils/createResponse.ts +18 -13
  69. package/src/interceptors/XMLHttpRequest/XMLHttpRequestProxy.ts +29 -25
  70. package/src/interceptors/XMLHttpRequest/index.ts +2 -2
  71. package/src/interceptors/XMLHttpRequest/utils/createResponse.ts +4 -2
  72. package/src/interceptors/fetch/index.ts +26 -13
  73. package/src/utils/RequestController.ts +21 -0
  74. package/src/utils/emitAsync.ts +25 -0
  75. package/src/utils/responseUtils.ts +5 -0
  76. package/src/utils/toInteractiveRequest.ts +17 -23
  77. package/lib/browser/Interceptor-0a020bc4.d.ts +0 -116
  78. package/lib/browser/chunk-PCFJD76X.js +0 -64
  79. package/lib/browser/chunk-RT3ATOJH.mjs +0 -64
  80. package/lib/node/Interceptor-738f79c5.d.ts +0 -116
  81. package/lib/node/chunk-STA6QBYM.mjs +0 -64
  82. package/lib/node/chunk-ZJOF5MEZ.js +0 -64
  83. package/src/utils/AsyncEventEmitter.test.ts +0 -102
  84. package/src/utils/AsyncEventEmitter.ts +0 -193
  85. package/src/utils/createLazyCallback.ts +0 -49
@@ -1,5 +1,5 @@
1
1
  import { EventMap, Listener } from 'strict-event-emitter';
2
- import { e as Interceptor, E as ExtractEventNames } from './Interceptor-738f79c5.js';
2
+ import { e as Interceptor, E as ExtractEventNames } from './Interceptor-7a701c1f.js';
3
3
 
4
4
  interface BatchInterceptorOptions<InterceptorList extends ReadonlyArray<Interceptor<any>>> {
5
5
  name: string;
@@ -15,7 +15,10 @@ declare class BatchInterceptor<InterceptorList extends ReadonlyArray<Interceptor
15
15
  private interceptors;
16
16
  constructor(options: BatchInterceptorOptions<InterceptorList>);
17
17
  protected setup(): void;
18
- on<EventName extends ExtractEventNames<Events>>(event: EventName, listener: Listener<Events[EventName]>): void;
18
+ on<EventName extends ExtractEventNames<Events>>(event: EventName, listener: Listener<Events[EventName]>): this;
19
+ once<EventName extends ExtractEventNames<Events>>(event: EventName, listener: Listener<Events[EventName]>): this;
20
+ off<EventName extends ExtractEventNames<Events>>(event: EventName, listener: Listener<Events[EventName]>): this;
21
+ removeAllListeners<EventName extends ExtractEventNames<Events>>(event?: EventName | undefined): this;
19
22
  }
20
23
 
21
24
  export { BatchInterceptorOptions as B, ExtractEventMapType as E, BatchInterceptor as a };
@@ -0,0 +1,86 @@
1
+ import { DeferredPromise } from '@open-draft/deferred-promise';
2
+ import { Logger } from '@open-draft/logger';
3
+ import { Emitter, Listener } from 'strict-event-emitter';
4
+
5
+ declare class RequestController {
6
+ protected request: Request;
7
+ responsePromise: DeferredPromise<Response | undefined>;
8
+ constructor(request: Request);
9
+ respondWith(response?: Response): void;
10
+ }
11
+
12
+ type InteractiveRequest = globalThis.Request & {
13
+ respondWith: RequestController['respondWith'];
14
+ };
15
+
16
+ declare const IS_PATCHED_MODULE: unique symbol;
17
+ type RequestCredentials = 'omit' | 'include' | 'same-origin';
18
+ type HttpRequestEventMap = {
19
+ request: [
20
+ args: {
21
+ request: InteractiveRequest;
22
+ requestId: string;
23
+ }
24
+ ];
25
+ response: [
26
+ args: {
27
+ response: Response;
28
+ isMockedResponse: boolean;
29
+ request: Request;
30
+ requestId: string;
31
+ }
32
+ ];
33
+ };
34
+
35
+ type InterceptorEventMap = Record<string, any>;
36
+ type InterceptorSubscription = () => void;
37
+ declare function getGlobalSymbol<V>(symbol: Symbol): V | undefined;
38
+ declare function deleteGlobalSymbol(symbol: Symbol): void;
39
+ declare enum InterceptorReadyState {
40
+ INACTIVE = "INACTIVE",
41
+ APPLYING = "APPLYING",
42
+ APPLIED = "APPLIED",
43
+ DISPOSING = "DISPOSING",
44
+ DISPOSED = "DISPOSED"
45
+ }
46
+ type ExtractEventNames<Events extends Record<string, any>> = Events extends Record<infer EventName, any> ? EventName : never;
47
+ declare class Interceptor<Events extends InterceptorEventMap> {
48
+ private readonly symbol;
49
+ protected emitter: Emitter<Events>;
50
+ protected subscriptions: Array<InterceptorSubscription>;
51
+ protected logger: Logger;
52
+ readyState: InterceptorReadyState;
53
+ constructor(symbol: symbol);
54
+ /**
55
+ * Determine if this interceptor can be applied
56
+ * in the current environment.
57
+ */
58
+ protected checkEnvironment(): boolean;
59
+ /**
60
+ * Apply this interceptor to the current process.
61
+ * Returns an already running interceptor instance if it's present.
62
+ */
63
+ apply(): void;
64
+ /**
65
+ * Setup the module augments and stubs necessary for this interceptor.
66
+ * This method is not run if there's a running interceptor instance
67
+ * to prevent instantiating an interceptor multiple times.
68
+ */
69
+ protected setup(): void;
70
+ /**
71
+ * Listen to the interceptor's public events.
72
+ */
73
+ on<EventName extends ExtractEventNames<Events>>(event: EventName, listener: Listener<Events[EventName]>): this;
74
+ once<EventName extends ExtractEventNames<Events>>(event: EventName, listener: Listener<Events[EventName]>): this;
75
+ off<EventName extends ExtractEventNames<Events>>(event: EventName, listener: Listener<Events[EventName]>): this;
76
+ removeAllListeners<EventName extends ExtractEventNames<Events>>(event?: EventName): this;
77
+ /**
78
+ * Disposes of any side-effects this interceptor has introduced.
79
+ */
80
+ dispose(): void;
81
+ private getInstance;
82
+ private setInstance;
83
+ private clearInstance;
84
+ }
85
+
86
+ export { ExtractEventNames as E, HttpRequestEventMap as H, IS_PATCHED_MODULE as I, RequestCredentials as R, InterceptorEventMap as a, InterceptorSubscription as b, InterceptorReadyState as c, deleteGlobalSymbol as d, Interceptor as e, InteractiveRequest as f, getGlobalSymbol as g };
@@ -1,8 +1,9 @@
1
1
  import { ChildProcess } from 'child_process';
2
- import { e as Interceptor, H as HttpRequestEventMap } from './Interceptor-738f79c5.js';
3
- import { a as BatchInterceptor } from './BatchInterceptor-c841b068.js';
2
+ import { e as Interceptor, H as HttpRequestEventMap } from './Interceptor-7a701c1f.js';
3
+ import { a as BatchInterceptor } from './BatchInterceptor-9785c567.js';
4
4
  import { ClientRequestInterceptor } from './interceptors/ClientRequest/index.js';
5
5
  import { XMLHttpRequestInterceptor } from './interceptors/XMLHttpRequest/index.js';
6
+ import '@open-draft/deferred-promise';
6
7
  import '@open-draft/logger';
7
8
  import 'strict-event-emitter';
8
9
  import 'http';
@@ -1,29 +1,31 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true});
2
2
 
3
- var _chunkMVPEJK4Vjs = require('./chunk-MVPEJK4V.js');
3
+ var _chunkUF7QIAQ5js = require('./chunk-UF7QIAQ5.js');
4
4
 
5
5
 
6
- var _chunk3MYUI4B2js = require('./chunk-3MYUI4B2.js');
6
+ var _chunkNCHFM2TBjs = require('./chunk-NCHFM2TB.js');
7
7
 
8
8
 
9
- var _chunkE6YC337Qjs = require('./chunk-E6YC337Q.js');
9
+ var _chunkJCWVLTP7js = require('./chunk-JCWVLTP7.js');
10
10
  require('./chunk-3LFH2WCF.js');
11
+ require('./chunk-OGN3ZR35.js');
11
12
  require('./chunk-VQ4DZOBB.js');
12
13
 
13
14
 
14
- var _chunkZJOF5MEZjs = require('./chunk-ZJOF5MEZ.js');
15
15
 
16
+ var _chunk5PTPJLB7js = require('./chunk-5PTPJLB7.js');
16
17
 
17
- var _chunkXYZRP5S2js = require('./chunk-XYZRP5S2.js');
18
+
19
+ var _chunk3XFLRXRYjs = require('./chunk-3XFLRXRY.js');
18
20
 
19
21
  // src/RemoteHttpInterceptor.ts
20
- var RemoteHttpInterceptor = class extends _chunkMVPEJK4Vjs.BatchInterceptor {
22
+ var RemoteHttpInterceptor = class extends _chunkUF7QIAQ5js.BatchInterceptor {
21
23
  constructor() {
22
24
  super({
23
25
  name: "remote-interceptor",
24
26
  interceptors: [
25
- new (0, _chunk3MYUI4B2js.ClientRequestInterceptor)(),
26
- new (0, _chunkE6YC337Qjs.XMLHttpRequestInterceptor)()
27
+ new (0, _chunkNCHFM2TBjs.ClientRequestInterceptor)(),
28
+ new (0, _chunkJCWVLTP7js.XMLHttpRequestInterceptor)()
27
29
  ]
28
30
  });
29
31
  }
@@ -90,7 +92,7 @@ function requestReviver(key, value) {
90
92
  return value;
91
93
  }
92
94
  }
93
- var _RemoteHttpResolver = class extends _chunkXYZRP5S2js.Interceptor {
95
+ var _RemoteHttpResolver = class extends _chunk3XFLRXRYjs.Interceptor {
94
96
  constructor(options) {
95
97
  super(_RemoteHttpResolver.symbol);
96
98
  this.process = options.process;
@@ -118,18 +120,17 @@ var _RemoteHttpResolver = class extends _chunkXYZRP5S2js.Interceptor {
118
120
  credentials: requestJson.credentials,
119
121
  body: requestJson.body
120
122
  });
121
- const interactiveRequest = _chunkZJOF5MEZjs.toInteractiveRequest.call(void 0, capturedRequest);
122
- this.emitter.emit("request", {
123
+ const { interactiveRequest, requestController } = _chunk5PTPJLB7js.toInteractiveRequest.call(void 0, capturedRequest);
124
+ this.emitter.once("request", () => {
125
+ if (requestController.responsePromise.state === "pending") {
126
+ requestController.respondWith(void 0);
127
+ }
128
+ });
129
+ await _chunk5PTPJLB7js.emitAsync.call(void 0, this.emitter, "request", {
123
130
  request: interactiveRequest,
124
131
  requestId: requestJson.id
125
132
  });
126
- await this.emitter.untilIdle(
127
- "request",
128
- ({ args: [{ requestId: pendingRequestId }] }) => {
129
- return pendingRequestId === requestJson.id;
130
- }
131
- );
132
- const [mockedResponse] = await interactiveRequest.respondWith.invoked();
133
+ const mockedResponse = await requestController.responsePromise;
133
134
  if (!mockedResponse) {
134
135
  return;
135
136
  }
@@ -1,20 +1,22 @@
1
1
  import {
2
2
  BatchInterceptor
3
- } from "./chunk-VS3GJPUE.mjs";
3
+ } from "./chunk-UBEFEZXT.mjs";
4
4
  import {
5
5
  ClientRequestInterceptor
6
- } from "./chunk-OL7OR4RL.mjs";
6
+ } from "./chunk-MCO3RLQC.mjs";
7
7
  import {
8
8
  XMLHttpRequestInterceptor
9
- } from "./chunk-HSCXCLVT.mjs";
9
+ } from "./chunk-FB53TMYN.mjs";
10
10
  import "./chunk-7II4SWKS.mjs";
11
+ import "./chunk-3IYIKC3X.mjs";
11
12
  import "./chunk-GFH37L5D.mjs";
12
13
  import {
14
+ emitAsync,
13
15
  toInteractiveRequest
14
- } from "./chunk-STA6QBYM.mjs";
16
+ } from "./chunk-YQGTMMOZ.mjs";
15
17
  import {
16
18
  Interceptor
17
- } from "./chunk-RGYCLCLK.mjs";
19
+ } from "./chunk-GM3YBSM3.mjs";
18
20
 
19
21
  // src/RemoteHttpInterceptor.ts
20
22
  var RemoteHttpInterceptor = class extends BatchInterceptor {
@@ -118,18 +120,17 @@ var _RemoteHttpResolver = class extends Interceptor {
118
120
  credentials: requestJson.credentials,
119
121
  body: requestJson.body
120
122
  });
121
- const interactiveRequest = toInteractiveRequest(capturedRequest);
122
- this.emitter.emit("request", {
123
+ const { interactiveRequest, requestController } = toInteractiveRequest(capturedRequest);
124
+ this.emitter.once("request", () => {
125
+ if (requestController.responsePromise.state === "pending") {
126
+ requestController.respondWith(void 0);
127
+ }
128
+ });
129
+ await emitAsync(this.emitter, "request", {
123
130
  request: interactiveRequest,
124
131
  requestId: requestJson.id
125
132
  });
126
- await this.emitter.untilIdle(
127
- "request",
128
- ({ args: [{ requestId: pendingRequestId }] }) => {
129
- return pendingRequestId === requestJson.id;
130
- }
131
- );
132
- const [mockedResponse] = await interactiveRequest.respondWith.invoked();
133
+ const mockedResponse = await requestController.responsePromise;
133
134
  if (!mockedResponse) {
134
135
  return;
135
136
  }
@@ -0,0 +1,6 @@
1
+ // src/utils/responseUtils.ts
2
+ var responseStatusCodesWithoutBody = [204, 205, 304];
3
+
4
+ export {
5
+ responseStatusCodesWithoutBody
6
+ };
@@ -1,132 +1,6 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true});// src/Interceptor.ts
2
2
  var _logger = require('@open-draft/logger');
3
-
4
- // src/utils/AsyncEventEmitter.ts
5
-
6
3
  var _stricteventemitter = require('strict-event-emitter');
7
-
8
- // src/utils/nextTick.ts
9
- function nextTick(callback) {
10
- setTimeout(callback, 0);
11
- }
12
-
13
- // src/utils/AsyncEventEmitter.ts
14
- var AsyncEventEmitter = class extends _stricteventemitter.Emitter {
15
- constructor() {
16
- super();
17
- this.logger = new (0, _logger.Logger)("async-event-emitter");
18
- this.queue = /* @__PURE__ */ new Map();
19
- this.readyState = "ACTIVE" /* ACTIVE */;
20
- }
21
- on(eventName, listener) {
22
- const logger = this.logger.extend("on");
23
- logger.info('adding "%s" listener...', eventName);
24
- if (this.readyState === "DEACTIVATED" /* DEACTIVATED */) {
25
- logger.info("the emitter is destroyed, skipping!");
26
- return this;
27
- }
28
- return super.on(eventName, async (...args) => {
29
- const queue = this.openListenerQueue(eventName);
30
- logger.info('awaiting the "%s" listener...', eventName);
31
- queue.push({
32
- args,
33
- done: new Promise(async (resolve, reject) => {
34
- try {
35
- await listener(...args);
36
- resolve();
37
- logger.info('"%s" listener has resolved!', eventName);
38
- } catch (error) {
39
- logger.info('"%s" listener has rejected!', error);
40
- reject(error);
41
- }
42
- })
43
- });
44
- });
45
- }
46
- emit(eventName, ...data) {
47
- const logger = this.logger.extend("emit");
48
- logger.info('emitting "%s" event...', eventName);
49
- if (this.readyState === "DEACTIVATED" /* DEACTIVATED */) {
50
- logger.info("the emitter is destroyed, skipping!");
51
- return false;
52
- }
53
- if (this.isInternalEventName(eventName)) {
54
- return super.emit(eventName, ...data);
55
- }
56
- this.openListenerQueue(eventName);
57
- logger.info('appending a one-time cleanup "%s" listener...', eventName);
58
- this.once(eventName, () => {
59
- nextTick(() => {
60
- this.queue.delete(eventName);
61
- logger.info('cleaned up "%s" listeners queue!', eventName);
62
- });
63
- });
64
- return super.emit(eventName, ...data);
65
- }
66
- /**
67
- * Returns a promise that resolves when all the listeners for the given event
68
- * has been called. Awaits asynchronous listeners.
69
- * If the event has no listeners, resolves immediately.
70
- */
71
- async untilIdle(eventName, filter = () => true) {
72
- const listenersQueue = this.queue.get(eventName) || [];
73
- await Promise.all(
74
- listenersQueue.filter(filter).map(({ done }) => done)
75
- ).finally(() => {
76
- this.queue.delete(eventName);
77
- });
78
- }
79
- openListenerQueue(eventName) {
80
- const logger = this.logger.extend("openListenerQueue");
81
- logger.info('opening "%s" listeners queue...', eventName);
82
- const queue = this.queue.get(eventName);
83
- if (!queue) {
84
- logger.info("no queue found, creating one...");
85
- this.queue.set(eventName, []);
86
- return [];
87
- }
88
- logger.info("returning an exising queue:", queue);
89
- return queue;
90
- }
91
- removeAllListeners(eventName) {
92
- const logger = this.logger.extend("removeAllListeners");
93
- logger.info("event:", eventName);
94
- if (eventName) {
95
- this.queue.delete(eventName);
96
- logger.info(
97
- 'cleared the "%s" listeners queue!',
98
- eventName,
99
- this.queue.get(eventName)
100
- );
101
- } else {
102
- this.queue.clear();
103
- logger.info("cleared the listeners queue!", this.queue);
104
- }
105
- return super.removeAllListeners(eventName);
106
- }
107
- activate() {
108
- const logger = this.logger.extend("activate");
109
- this.readyState = "ACTIVE" /* ACTIVE */;
110
- logger.info("set state to:", this.readyState);
111
- }
112
- /**
113
- * Deactivate this event emitter.
114
- * Deactivated emitter can no longer emit and listen to events
115
- * and needs to be activated again in order to do so.
116
- */
117
- deactivate() {
118
- const logger = this.logger.extend("deactivate");
119
- logger.info("removing all listeners...");
120
- this.removeAllListeners();
121
- this.readyState = "DEACTIVATED" /* DEACTIVATED */;
122
- logger.info("set state to:", this.readyState);
123
- }
124
- isInternalEventName(eventName) {
125
- return eventName === "newListener" || eventName === "removeListener";
126
- }
127
- };
128
-
129
- // src/Interceptor.ts
130
4
  function getGlobalSymbol(symbol) {
131
5
  return (
132
6
  // @ts-ignore https://github.com/Microsoft/TypeScript/issues/24587
@@ -151,7 +25,7 @@ var Interceptor = class {
151
25
  constructor(symbol) {
152
26
  this.symbol = symbol;
153
27
  this.readyState = "INACTIVE" /* INACTIVE */;
154
- this.emitter = new AsyncEventEmitter();
28
+ this.emitter = new (0, _stricteventemitter.Emitter)();
155
29
  this.subscriptions = [];
156
30
  this.logger = new (0, _logger.Logger)(symbol.description);
157
31
  this.emitter.setMaxListeners(0);
@@ -181,8 +55,6 @@ var Interceptor = class {
181
55
  return;
182
56
  }
183
57
  this.readyState = "APPLYING" /* APPLYING */;
184
- this.emitter.activate();
185
- logger.info("activated the emiter!", this.emitter.readyState);
186
58
  const runningInstance = this.getInstance();
187
59
  if (runningInstance) {
188
60
  logger.info("found a running instance, reusing...");
@@ -193,6 +65,7 @@ var Interceptor = class {
193
65
  runningInstance.emitter.removeListener(event, listener);
194
66
  logger.info('removed proxied "%s" listener!', event);
195
67
  });
68
+ return this;
196
69
  };
197
70
  this.readyState = "APPLIED" /* APPLIED */;
198
71
  return;
@@ -212,14 +85,27 @@ var Interceptor = class {
212
85
  /**
213
86
  * Listen to the interceptor's public events.
214
87
  */
215
- on(eventName, listener) {
88
+ on(event, listener) {
216
89
  const logger = this.logger.extend("on");
217
90
  if (this.readyState === "DISPOSING" /* DISPOSING */ || this.readyState === "DISPOSED" /* DISPOSED */) {
218
91
  logger.info("cannot listen to events, already disposed!");
219
- return;
92
+ return this;
220
93
  }
221
- logger.info('adding "%s" event listener:', eventName, listener.name);
222
- this.emitter.on(eventName, listener);
94
+ logger.info('adding "%s" event listener:', event, listener.name);
95
+ this.emitter.on(event, listener);
96
+ return this;
97
+ }
98
+ once(event, listener) {
99
+ this.emitter.once(event, listener);
100
+ return this;
101
+ }
102
+ off(event, listener) {
103
+ this.emitter.off(event, listener);
104
+ return this;
105
+ }
106
+ removeAllListeners(event) {
107
+ this.emitter.removeAllListeners(event);
108
+ return this;
223
109
  }
224
110
  /**
225
111
  * Disposes of any side-effects this interceptor has introduced.
@@ -246,7 +132,7 @@ var Interceptor = class {
246
132
  this.subscriptions = [];
247
133
  logger.info("disposed of all subscriptions!", this.subscriptions.length);
248
134
  }
249
- this.emitter.deactivate();
135
+ this.emitter.removeAllListeners();
250
136
  logger.info("destroyed the listener!");
251
137
  this.readyState = "DISPOSED" /* DISPOSED */;
252
138
  }
@@ -0,0 +1,58 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});// src/utils/RequestController.ts
2
+ var _outvariant = require('outvariant');
3
+ var _deferredpromise = require('@open-draft/deferred-promise');
4
+ var RequestController = class {
5
+ constructor(request) {
6
+ this.request = request;
7
+ this.responsePromise = new (0, _deferredpromise.DeferredPromise)();
8
+ }
9
+ respondWith(response) {
10
+ _outvariant.invariant.call(void 0,
11
+ this.responsePromise.state === "pending",
12
+ 'Failed to respond to "%s %s" request: the "request" event has already been responded to.',
13
+ this.request.method,
14
+ this.request.url
15
+ );
16
+ this.responsePromise.resolve(response);
17
+ }
18
+ };
19
+
20
+ // src/utils/toInteractiveRequest.ts
21
+ function toInteractiveRequest(request) {
22
+ const requestController = new RequestController(request);
23
+ Reflect.set(
24
+ request,
25
+ "respondWith",
26
+ requestController.respondWith.bind(requestController)
27
+ );
28
+ return {
29
+ interactiveRequest: request,
30
+ requestController
31
+ };
32
+ }
33
+
34
+ // src/utils/uuid.ts
35
+ function uuidv4() {
36
+ return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, function(c) {
37
+ const r = Math.random() * 16 | 0;
38
+ const v = c == "x" ? r : r & 3 | 8;
39
+ return v.toString(16);
40
+ });
41
+ }
42
+
43
+ // src/utils/emitAsync.ts
44
+ async function emitAsync(emitter, eventName, ...data) {
45
+ const listners = emitter.listeners(eventName);
46
+ if (listners.length === 0) {
47
+ return;
48
+ }
49
+ for (const listener of listners) {
50
+ await listener.apply(emitter, data);
51
+ }
52
+ }
53
+
54
+
55
+
56
+
57
+
58
+ exports.toInteractiveRequest = toInteractiveRequest; exports.uuidv4 = uuidv4; exports.emitAsync = emitAsync;
@@ -3,16 +3,20 @@ import {
3
3
  encodeBuffer,
4
4
  toArrayBuffer
5
5
  } from "./chunk-7II4SWKS.mjs";
6
+ import {
7
+ responseStatusCodesWithoutBody
8
+ } from "./chunk-3IYIKC3X.mjs";
6
9
  import {
7
10
  IS_PATCHED_MODULE
8
11
  } from "./chunk-GFH37L5D.mjs";
9
12
  import {
13
+ emitAsync,
10
14
  toInteractiveRequest,
11
15
  uuidv4
12
- } from "./chunk-STA6QBYM.mjs";
16
+ } from "./chunk-YQGTMMOZ.mjs";
13
17
  import {
14
18
  Interceptor
15
- } from "./chunk-RGYCLCLK.mjs";
19
+ } from "./chunk-GM3YBSM3.mjs";
16
20
 
17
21
  // src/interceptors/XMLHttpRequest/index.ts
18
22
  import { invariant as invariant2 } from "outvariant";
@@ -204,9 +208,10 @@ function parseJson(data) {
204
208
  }
205
209
 
206
210
  // src/interceptors/XMLHttpRequest/utils/createResponse.ts
207
- var statusCodesWithoutBody = [204, 205, 304];
208
211
  function createResponse(request, body) {
209
- const responseBodyOrNull = statusCodesWithoutBody.includes(request.status) ? null : body;
212
+ const responseBodyOrNull = responseStatusCodesWithoutBody.includes(
213
+ request.status
214
+ ) ? null : body;
210
215
  return new Response(responseBodyOrNull, {
211
216
  status: request.status,
212
217
  statusText: request.statusText,
@@ -654,30 +659,32 @@ function createXMLHttpRequestProxy({
654
659
  prototypeDescriptors[propertyName]
655
660
  );
656
661
  }
657
- const requestController = new XMLHttpRequestController(
662
+ const xhrRequestController = new XMLHttpRequestController(
658
663
  originalRequest,
659
664
  logger
660
665
  );
661
- requestController.onRequest = async function({ request, requestId }) {
662
- const interactiveRequest = toInteractiveRequest(request);
663
- this.logger.info(
664
- 'emitting the "request" event for %s listener(s)...',
665
- emitter.listenerCount("request")
666
- );
667
- emitter.emit("request", {
668
- request: interactiveRequest,
669
- requestId
670
- });
666
+ xhrRequestController.onRequest = async function({ request, requestId }) {
667
+ const { interactiveRequest, requestController } = toInteractiveRequest(request);
671
668
  this.logger.info("awaiting mocked response...");
669
+ emitter.once("request", ({ requestId: pendingRequestId }) => {
670
+ if (pendingRequestId !== requestId) {
671
+ return;
672
+ }
673
+ if (requestController.responsePromise.state === "pending") {
674
+ requestController.respondWith(void 0);
675
+ }
676
+ });
672
677
  const resolverResult = await until(async () => {
673
- await emitter.untilIdle(
674
- "request",
675
- ({ args: [{ requestId: pendingRequestId }] }) => {
676
- return pendingRequestId === requestId;
677
- }
678
+ this.logger.info(
679
+ 'emitting the "request" event for %s listener(s)...',
680
+ emitter.listenerCount("request")
678
681
  );
682
+ await emitAsync(emitter, "request", {
683
+ request: interactiveRequest,
684
+ requestId
685
+ });
679
686
  this.logger.info('all "request" listeners settled!');
680
- const [mockedResponse2] = await interactiveRequest.respondWith.invoked();
687
+ const mockedResponse2 = await requestController.responsePromise;
681
688
  this.logger.info("event.respondWith called with:", mockedResponse2);
682
689
  return mockedResponse2;
683
690
  });
@@ -686,7 +693,7 @@ function createXMLHttpRequestProxy({
686
693
  "request listener threw an exception, aborting request...",
687
694
  resolverResult.error
688
695
  );
689
- requestController.errorWith(resolverResult.error);
696
+ xhrRequestController.errorWith(resolverResult.error);
690
697
  return;
691
698
  }
692
699
  const mockedResponse = resolverResult.data;
@@ -700,16 +707,16 @@ function createXMLHttpRequestProxy({
700
707
  this.logger.info(
701
708
  "received a network error response, rejecting the request promise..."
702
709
  );
703
- requestController.errorWith(new TypeError("Network error"));
710
+ xhrRequestController.errorWith(new TypeError("Network error"));
704
711
  return;
705
712
  }
706
- return requestController.respondWith(mockedResponse);
713
+ return xhrRequestController.respondWith(mockedResponse);
707
714
  }
708
715
  this.logger.info(
709
716
  "no mocked response received, performing request as-is..."
710
717
  );
711
718
  };
712
- requestController.onResponse = async function({
719
+ xhrRequestController.onResponse = async function({
713
720
  response,
714
721
  isMockedResponse,
715
722
  request,
@@ -726,7 +733,7 @@ function createXMLHttpRequestProxy({
726
733
  requestId
727
734
  });
728
735
  };
729
- return requestController.request;
736
+ return xhrRequestController.request;
730
737
  }
731
738
  });
732
739
  return XMLHttpRequestProxy;