@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,132 +1,6 @@
1
1
  // src/Interceptor.ts
2
- import { Logger as Logger2 } from "@open-draft/logger";
3
-
4
- // src/utils/AsyncEventEmitter.ts
5
2
  import { Logger } from "@open-draft/logger";
6
3
  import { Emitter } from "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 Emitter {
15
- constructor() {
16
- super();
17
- this.logger = new 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,9 +25,9 @@ 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 Emitter();
155
29
  this.subscriptions = [];
156
- this.logger = new Logger2(symbol.description);
30
+ this.logger = new Logger(symbol.description);
157
31
  this.emitter.setMaxListeners(0);
158
32
  this.logger.info("constructing the interceptor...");
159
33
  }
@@ -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
  }
@@ -5,14 +5,18 @@
5
5
  var _chunk3LFH2WCFjs = require('./chunk-3LFH2WCF.js');
6
6
 
7
7
 
8
+ var _chunkOGN3ZR35js = require('./chunk-OGN3ZR35.js');
9
+
10
+
8
11
  var _chunkVQ4DZOBBjs = require('./chunk-VQ4DZOBB.js');
9
12
 
10
13
 
11
14
 
12
- var _chunkZJOF5MEZjs = require('./chunk-ZJOF5MEZ.js');
13
15
 
16
+ var _chunk5PTPJLB7js = require('./chunk-5PTPJLB7.js');
14
17
 
15
- var _chunkXYZRP5S2js = require('./chunk-XYZRP5S2.js');
18
+
19
+ var _chunk3XFLRXRYjs = require('./chunk-3XFLRXRY.js');
16
20
 
17
21
  // src/interceptors/XMLHttpRequest/index.ts
18
22
  var _outvariant = require('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 = _chunkOGN3ZR35js.responseStatusCodesWithoutBody.includes(
213
+ request.status
214
+ ) ? null : body;
210
215
  return new Response(responseBodyOrNull, {
211
216
  status: request.status,
212
217
  statusText: request.statusText,
@@ -239,7 +244,7 @@ var XMLHttpRequestController = class {
239
244
  this.method = "GET";
240
245
  this.url = null;
241
246
  this.events = /* @__PURE__ */ new Map();
242
- this.requestId = _chunkZJOF5MEZjs.uuidv4.call(void 0, );
247
+ this.requestId = _chunk5PTPJLB7js.uuidv4.call(void 0, );
243
248
  this.requestHeaders = new Headers();
244
249
  this.responseBuffer = new Uint8Array();
245
250
  this.request = createProxy(initialRequest, {
@@ -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 = _chunkZJOF5MEZjs.toInteractiveRequest.call(void 0, 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 } = _chunk5PTPJLB7js.toInteractiveRequest.call(void 0, 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.until.call(void 0, 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 _chunk5PTPJLB7js.emitAsync.call(void 0, 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,14 +733,14 @@ 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;
733
740
  }
734
741
 
735
742
  // src/interceptors/XMLHttpRequest/index.ts
736
- var _XMLHttpRequestInterceptor = class extends _chunkXYZRP5S2js.Interceptor {
743
+ var _XMLHttpRequestInterceptor = class extends _chunk3XFLRXRYjs.Interceptor {
737
744
  constructor() {
738
745
  super(_XMLHttpRequestInterceptor.interceptorSymbol);
739
746
  }
@@ -1,10 +1,14 @@
1
1
  import {
2
+ responseStatusCodesWithoutBody
3
+ } from "./chunk-3IYIKC3X.mjs";
4
+ import {
5
+ emitAsync,
2
6
  toInteractiveRequest,
3
7
  uuidv4
4
- } from "./chunk-STA6QBYM.mjs";
8
+ } from "./chunk-YQGTMMOZ.mjs";
5
9
  import {
6
10
  Interceptor
7
- } from "./chunk-RGYCLCLK.mjs";
11
+ } from "./chunk-GM3YBSM3.mjs";
8
12
 
9
13
  // src/interceptors/ClientRequest/index.ts
10
14
  import http from "http";
@@ -13,6 +17,7 @@ import https from "https";
13
17
  // src/interceptors/ClientRequest/NodeClientRequest.ts
14
18
  import { ClientRequest, IncomingMessage as IncomingMessage2 } from "http";
15
19
  import { until } from "@open-draft/until";
20
+ import { DeferredPromise } from "@open-draft/deferred-promise";
16
21
 
17
22
  // src/interceptors/ClientRequest/utils/normalizeClientRequestEndArgs.ts
18
23
  import { Logger } from "@open-draft/logger";
@@ -101,13 +106,15 @@ function inheritProperties(source, target) {
101
106
 
102
107
  // src/interceptors/ClientRequest/utils/createResponse.ts
103
108
  function createResponse(message) {
104
- const readable = new ReadableStream({
109
+ const responseBodyOrNull = responseStatusCodesWithoutBody.includes(
110
+ message.statusCode || 200
111
+ ) ? null : new ReadableStream({
105
112
  start(controller) {
106
113
  message.on("data", (chunk) => controller.enqueue(chunk));
107
114
  message.on("end", () => controller.close());
108
115
  }
109
116
  });
110
- return new Response(readable, {
117
+ return new Response(responseBodyOrNull, {
111
118
  status: message.statusCode,
112
119
  statusText: message.statusMessage,
113
120
  headers: createHeadersFromIncomingHttpHeaders(message.headers)
@@ -155,7 +162,6 @@ function createRequest(clientRequest) {
155
162
  }
156
163
 
157
164
  // src/interceptors/ClientRequest/NodeClientRequest.ts
158
- import { DeferredPromise } from "@open-draft/deferred-promise";
159
165
  var _NodeClientRequest = class extends ClientRequest {
160
166
  constructor([url, requestOptions, callback], options) {
161
167
  super(requestOptions, callback);
@@ -208,27 +214,36 @@ var _NodeClientRequest = class extends ClientRequest {
208
214
  this.logger.info("normalized arguments:", { chunk, encoding, callback });
209
215
  this.writeRequestBodyChunk(chunk, encoding || void 0);
210
216
  const capturedRequest = createRequest(this);
211
- const interactiveRequest = toInteractiveRequest(capturedRequest);
217
+ const { interactiveRequest, requestController } = toInteractiveRequest(capturedRequest);
218
+ Object.defineProperty(capturedRequest, "respondWith", {
219
+ value: requestController.respondWith.bind(requestController)
220
+ });
212
221
  if (this.getHeader("X-Request-Id") != null) {
213
222
  this.removeHeader("X-Request-Id");
214
223
  return this.passthrough(chunk, encoding, callback);
215
224
  }
216
- this.logger.info(
217
- 'emitting the "request" event for %d listener(s)...',
218
- this.emitter.listenerCount("request")
219
- );
220
- this.emitter.emit("request", {
221
- request: interactiveRequest,
222
- requestId
225
+ this.emitter.once("request", ({ requestId: pendingRequestId }) => {
226
+ if (pendingRequestId !== requestId) {
227
+ return;
228
+ }
229
+ if (requestController.responsePromise.state === "pending") {
230
+ this.logger.info(
231
+ "request has not been handled in listeners, executing fail-safe listener..."
232
+ );
233
+ requestController.responsePromise.resolve(void 0);
234
+ }
223
235
  });
224
236
  until(async () => {
225
- await this.emitter.untilIdle(
226
- "request",
227
- ({ args: [{ requestId: pendingRequestId }] }) => {
228
- return pendingRequestId === requestId;
229
- }
237
+ this.logger.info(
238
+ 'emitting the "request" event for %d listener(s)...',
239
+ this.emitter.listenerCount("request")
230
240
  );
231
- const [mockedResponse] = await interactiveRequest.respondWith.invoked();
241
+ await emitAsync(this.emitter, "request", {
242
+ request: interactiveRequest,
243
+ requestId
244
+ });
245
+ this.logger.info('all "request" listeners done!');
246
+ const mockedResponse = await requestController.responsePromise;
232
247
  this.logger.info("event.respondWith called with:", mockedResponse);
233
248
  return mockedResponse;
234
249
  }).then((resolverResult) => {
@@ -243,13 +258,19 @@ var _NodeClientRequest = class extends ClientRequest {
243
258
  "encountered resolver exception, aborting request...",
244
259
  resolverResult.error
245
260
  );
261
+ this.destroyed = true;
246
262
  this.emit("error", resolverResult.error);
247
263
  this.terminate();
248
264
  return this;
249
265
  }
250
266
  const mockedResponse = resolverResult.data;
251
267
  if (mockedResponse) {
252
- this.logger.info("received mocked response:", mockedResponse);
268
+ this.logger.info(
269
+ "received mocked response:",
270
+ mockedResponse.status,
271
+ mockedResponse.statusText
272
+ );
273
+ this.destroyed = false;
253
274
  if (mockedResponse.type === "error") {
254
275
  this.logger.info(
255
276
  "received network error response, aborting request..."
@@ -381,9 +402,13 @@ var _NodeClientRequest = class extends ClientRequest {
381
402
  });
382
403
  }
383
404
  this.logger.info("mocked response headers ready:", headers);
405
+ this.res = this.response;
406
+ this.emit("response", this.response);
384
407
  const isResponseStreamFinished = new DeferredPromise();
385
408
  const finishResponseStream = () => {
386
409
  this.logger.info("finished response stream!");
410
+ this.response.push(null);
411
+ this.response.complete = true;
387
412
  isResponseStreamFinished.resolve();
388
413
  };
389
414
  if (body) {
@@ -401,14 +426,11 @@ var _NodeClientRequest = class extends ClientRequest {
401
426
  } else {
402
427
  finishResponseStream();
403
428
  }
404
- this.res = this.response;
405
- this.emit("response", this.response);
406
429
  isResponseStreamFinished.then(() => {
407
430
  this.logger.info("finalizing response...");
408
- this.response.push(null);
409
- this.response.complete = true;
410
431
  this.response.emit("end");
411
432
  this.terminate();
433
+ this.logger.info("request complete!");
412
434
  });
413
435
  }
414
436
  /**
@@ -696,7 +718,7 @@ function normalizeClientRequestArgs(defaultProtocol, ...args) {
696
718
 
697
719
  // src/interceptors/ClientRequest/http.get.ts
698
720
  function get(protocol, options) {
699
- return (...args) => {
721
+ return function interceptorsHttpGet(...args) {
700
722
  const clientRequestArgs = normalizeClientRequestArgs(
701
723
  `${protocol}:`,
702
724
  ...args
@@ -711,7 +733,7 @@ function get(protocol, options) {
711
733
  import { Logger as Logger6 } from "@open-draft/logger";
712
734
  var logger6 = new Logger6("http request");
713
735
  function request(protocol, options) {
714
- return (...args) => {
736
+ return function interceptorsHttpRequest(...args) {
715
737
  logger6.info('request call (protocol "%s"):', protocol, args);
716
738
  const clientRequestArgs = normalizeClientRequestArgs(
717
739
  `${protocol}:`,