@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,5 +1,5 @@
|
|
|
1
1
|
import { EventMap, Listener } from 'strict-event-emitter';
|
|
2
|
-
import { e as Interceptor, E as ExtractEventNames } from './Interceptor-
|
|
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]>):
|
|
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-
|
|
3
|
-
import { a as BatchInterceptor } from './BatchInterceptor-
|
|
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
|
|
3
|
+
var _chunkUF7QIAQ5js = require('./chunk-UF7QIAQ5.js');
|
|
4
4
|
|
|
5
5
|
|
|
6
|
-
var
|
|
6
|
+
var _chunkNCHFM2TBjs = require('./chunk-NCHFM2TB.js');
|
|
7
7
|
|
|
8
8
|
|
|
9
|
-
var
|
|
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
|
-
|
|
18
|
+
|
|
19
|
+
var _chunk3XFLRXRYjs = require('./chunk-3XFLRXRY.js');
|
|
18
20
|
|
|
19
21
|
// src/RemoteHttpInterceptor.ts
|
|
20
|
-
var RemoteHttpInterceptor = class extends
|
|
22
|
+
var RemoteHttpInterceptor = class extends _chunkUF7QIAQ5js.BatchInterceptor {
|
|
21
23
|
constructor() {
|
|
22
24
|
super({
|
|
23
25
|
name: "remote-interceptor",
|
|
24
26
|
interceptors: [
|
|
25
|
-
new (0,
|
|
26
|
-
new (0,
|
|
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
|
|
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 =
|
|
122
|
-
this.emitter.
|
|
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
|
|
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-
|
|
3
|
+
} from "./chunk-UBEFEZXT.mjs";
|
|
4
4
|
import {
|
|
5
5
|
ClientRequestInterceptor
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-MCO3RLQC.mjs";
|
|
7
7
|
import {
|
|
8
8
|
XMLHttpRequestInterceptor
|
|
9
|
-
} from "./chunk-
|
|
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-
|
|
16
|
+
} from "./chunk-YQGTMMOZ.mjs";
|
|
15
17
|
import {
|
|
16
18
|
Interceptor
|
|
17
|
-
} from "./chunk-
|
|
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.
|
|
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
|
|
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,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
|
|
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(
|
|
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
|
}
|
|
@@ -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-
|
|
16
|
+
} from "./chunk-YQGTMMOZ.mjs";
|
|
13
17
|
import {
|
|
14
18
|
Interceptor
|
|
15
|
-
} from "./chunk-
|
|
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 =
|
|
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
|
|
662
|
+
const xhrRequestController = new XMLHttpRequestController(
|
|
658
663
|
originalRequest,
|
|
659
664
|
logger
|
|
660
665
|
);
|
|
661
|
-
|
|
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
|
-
|
|
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 emitAsync(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,7 +733,7 @@ function createXMLHttpRequestProxy({
|
|
|
726
733
|
requestId
|
|
727
734
|
});
|
|
728
735
|
};
|
|
729
|
-
return
|
|
736
|
+
return xhrRequestController.request;
|
|
730
737
|
}
|
|
731
738
|
});
|
|
732
739
|
return XMLHttpRequestProxy;
|