@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.
- package/lib/browser/Interceptor-8d5fd4c6.d.ts +86 -0
- package/lib/browser/{chunk-ANLPTCZ5.mjs → chunk-AN3YI76R.mjs} +33 -26
- package/lib/browser/{chunk-4CFMDU7Z.js → chunk-CWVY2E3W.js} +20 -134
- package/lib/browser/{chunk-OSIUQA4X.js → chunk-FFBQOFWV.js} +38 -31
- package/lib/browser/{chunk-VMXB5F2J.mjs → chunk-HXJPKJY3.mjs} +25 -15
- package/lib/browser/{chunk-DBFLI5DJ.js → chunk-KITNLK66.js} +30 -20
- package/lib/browser/chunk-KK6APRON.mjs +58 -0
- package/lib/browser/{chunk-GXJLJMOT.mjs → chunk-QPMXOLDO.mjs} +21 -135
- package/lib/browser/chunk-X3NRJIZW.js +58 -0
- package/lib/browser/index.d.ts +7 -3
- package/lib/browser/index.js +24 -5
- package/lib/browser/index.mjs +22 -3
- package/lib/browser/interceptors/XMLHttpRequest/index.d.ts +4 -3
- package/lib/browser/interceptors/XMLHttpRequest/index.js +4 -4
- package/lib/browser/interceptors/XMLHttpRequest/index.mjs +3 -3
- package/lib/browser/interceptors/fetch/index.d.ts +2 -1
- package/lib/browser/interceptors/fetch/index.js +4 -4
- package/lib/browser/interceptors/fetch/index.mjs +3 -3
- package/lib/browser/presets/browser.d.ts +2 -1
- package/lib/browser/presets/browser.js +6 -6
- package/lib/browser/presets/browser.mjs +4 -4
- package/lib/node/{BatchInterceptor-c841b068.d.ts → BatchInterceptor-9785c567.d.ts} +5 -2
- package/lib/node/Interceptor-7a701c1f.d.ts +86 -0
- package/lib/node/RemoteHttpInterceptor.d.ts +3 -2
- package/lib/node/RemoteHttpInterceptor.js +19 -18
- package/lib/node/RemoteHttpInterceptor.mjs +15 -14
- package/lib/node/chunk-3IYIKC3X.mjs +6 -0
- package/lib/node/{chunk-XYZRP5S2.js → chunk-3XFLRXRY.js} +20 -134
- package/lib/node/chunk-5PTPJLB7.js +58 -0
- package/lib/node/{chunk-HSCXCLVT.mjs → chunk-FB53TMYN.mjs} +33 -26
- package/lib/node/{chunk-RGYCLCLK.mjs → chunk-GM3YBSM3.mjs} +21 -135
- package/lib/node/{chunk-E6YC337Q.js → chunk-JCWVLTP7.js} +35 -28
- package/lib/node/{chunk-OL7OR4RL.mjs → chunk-MCO3RLQC.mjs} +48 -26
- package/lib/node/{chunk-3MYUI4B2.js → chunk-NCHFM2TB.js} +50 -28
- package/lib/node/chunk-OGN3ZR35.js +6 -0
- package/lib/node/{chunk-VS3GJPUE.mjs → chunk-UBEFEZXT.mjs} +22 -3
- package/lib/node/{chunk-MVPEJK4V.js → chunk-UF7QIAQ5.js} +23 -4
- package/lib/node/chunk-YQGTMMOZ.mjs +58 -0
- package/lib/node/index.d.ts +3 -2
- package/lib/node/index.js +3 -3
- package/lib/node/index.mjs +2 -2
- package/lib/node/interceptors/ClientRequest/index.d.ts +4 -3
- package/lib/node/interceptors/ClientRequest/index.js +5 -4
- package/lib/node/interceptors/ClientRequest/index.mjs +4 -3
- package/lib/node/interceptors/XMLHttpRequest/index.d.ts +4 -3
- package/lib/node/interceptors/XMLHttpRequest/index.js +5 -4
- package/lib/node/interceptors/XMLHttpRequest/index.mjs +4 -3
- package/lib/node/interceptors/fetch/index.d.ts +2 -1
- package/lib/node/interceptors/fetch/index.js +27 -17
- package/lib/node/interceptors/fetch/index.mjs +25 -15
- package/lib/node/presets/node.d.ts +3 -2
- package/lib/node/presets/node.js +7 -6
- package/lib/node/presets/node.mjs +5 -4
- package/package.json +2 -2
- package/src/BatchInterceptor.test.ts +141 -0
- package/src/BatchInterceptor.ts +38 -4
- package/src/Interceptor.test.ts +46 -0
- package/src/Interceptor.ts +35 -16
- package/src/RemoteHttpInterceptor.ts +11 -9
- package/src/interceptors/ClientRequest/NodeClientRequest.test.ts +10 -10
- package/src/interceptors/ClientRequest/NodeClientRequest.ts +80 -43
- package/src/interceptors/ClientRequest/http.get.ts +3 -1
- package/src/interceptors/ClientRequest/http.request.ts +3 -1
- package/src/interceptors/ClientRequest/index.test.ts +2 -3
- package/src/interceptors/ClientRequest/index.ts +2 -2
- package/src/interceptors/ClientRequest/utils/createRequest.test.ts +2 -2
- package/src/interceptors/ClientRequest/utils/createResponse.test.ts +23 -0
- package/src/interceptors/ClientRequest/utils/createResponse.ts +18 -13
- package/src/interceptors/XMLHttpRequest/XMLHttpRequestProxy.ts +29 -25
- package/src/interceptors/XMLHttpRequest/index.ts +2 -2
- package/src/interceptors/XMLHttpRequest/utils/createResponse.ts +4 -2
- package/src/interceptors/fetch/index.ts +26 -13
- package/src/utils/RequestController.ts +21 -0
- package/src/utils/emitAsync.ts +25 -0
- package/src/utils/responseUtils.ts +5 -0
- package/src/utils/toInteractiveRequest.ts +17 -23
- package/lib/browser/Interceptor-0a020bc4.d.ts +0 -116
- package/lib/browser/chunk-PCFJD76X.js +0 -64
- package/lib/browser/chunk-RT3ATOJH.mjs +0 -64
- package/lib/node/Interceptor-738f79c5.d.ts +0 -116
- package/lib/node/chunk-STA6QBYM.mjs +0 -64
- package/lib/node/chunk-ZJOF5MEZ.js +0 -64
- package/src/utils/AsyncEventEmitter.test.ts +0 -102
- package/src/utils/AsyncEventEmitter.ts +0 -193
- 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
|
|
28
|
+
this.emitter = new Emitter();
|
|
155
29
|
this.subscriptions = [];
|
|
156
|
-
this.logger = new
|
|
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(
|
|
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:',
|
|
222
|
-
this.emitter.on(
|
|
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.
|
|
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
|
-
|
|
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 =
|
|
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 =
|
|
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
|
|
662
|
+
const xhrRequestController = new XMLHttpRequestController(
|
|
658
663
|
originalRequest,
|
|
659
664
|
logger
|
|
660
665
|
);
|
|
661
|
-
|
|
662
|
-
const interactiveRequest =
|
|
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
|
-
|
|
674
|
-
"request",
|
|
675
|
-
(
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
710
|
+
xhrRequestController.errorWith(new TypeError("Network error"));
|
|
704
711
|
return;
|
|
705
712
|
}
|
|
706
|
-
return
|
|
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
|
-
|
|
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
|
|
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
|
|
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-
|
|
8
|
+
} from "./chunk-YQGTMMOZ.mjs";
|
|
5
9
|
import {
|
|
6
10
|
Interceptor
|
|
7
|
-
} from "./chunk-
|
|
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
|
|
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(
|
|
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.
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
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
|
-
|
|
226
|
-
"request",
|
|
227
|
-
(
|
|
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
|
-
|
|
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(
|
|
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}:`,
|