@mswjs/interceptors 0.25.1 → 0.25.2
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-4CFMDU7Z.js → chunk-CWVY2E3W.js} +20 -134
- 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-OSIUQA4X.js → chunk-NMG5MQJJ.js} +32 -29
- package/lib/browser/{chunk-GXJLJMOT.mjs → chunk-QPMXOLDO.mjs} +21 -135
- package/lib/browser/{chunk-ANLPTCZ5.mjs → chunk-TYEVJTWH.mjs} +27 -24
- 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 +18 -18
- package/lib/node/RemoteHttpInterceptor.mjs +14 -14
- package/lib/node/{chunk-XYZRP5S2.js → chunk-3XFLRXRY.js} +20 -134
- package/lib/node/chunk-5PTPJLB7.js +58 -0
- package/lib/node/{chunk-E6YC337Q.js → chunk-5YAV7CXX.js} +29 -26
- package/lib/node/{chunk-HSCXCLVT.mjs → chunk-7RGC35CC.mjs} +27 -24
- package/lib/node/{chunk-3MYUI4B2.js → chunk-B2CIOP5B.js} +22 -16
- package/lib/node/{chunk-RGYCLCLK.mjs → chunk-GM3YBSM3.mjs} +21 -135
- package/lib/node/{chunk-OL7OR4RL.mjs → chunk-OMRBBJT7.mjs} +20 -14
- 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 +4 -4
- package/lib/node/interceptors/ClientRequest/index.mjs +3 -3
- package/lib/node/interceptors/XMLHttpRequest/index.d.ts +4 -3
- package/lib/node/interceptors/XMLHttpRequest/index.js +4 -4
- package/lib/node/interceptors/XMLHttpRequest/index.mjs +3 -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 +6 -6
- package/lib/node/presets/node.mjs +4 -4
- package/package.json +1 -1
- 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 +35 -18
- 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/XMLHttpRequest/XMLHttpRequestProxy.ts +29 -25
- package/src/interceptors/XMLHttpRequest/index.ts +2 -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/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,193 +0,0 @@
|
|
|
1
|
-
import { Logger } from '@open-draft/logger'
|
|
2
|
-
import { Emitter, EventMap, Listener } from 'strict-event-emitter'
|
|
3
|
-
import { nextTick } from './nextTick'
|
|
4
|
-
|
|
5
|
-
export interface QueueItem<Args extends Array<unknown>> {
|
|
6
|
-
args: Args
|
|
7
|
-
done: Promise<void>
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
export enum AsyncEventEmitterReadyState {
|
|
11
|
-
ACTIVE = 'ACTIVE',
|
|
12
|
-
DEACTIVATED = 'DEACTIVATED',
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
export class AsyncEventEmitter<
|
|
16
|
-
Events extends EventMap
|
|
17
|
-
> extends Emitter<Events> {
|
|
18
|
-
public readyState: AsyncEventEmitterReadyState
|
|
19
|
-
|
|
20
|
-
private logger: Logger
|
|
21
|
-
protected queue: Map<keyof Events, Array<QueueItem<Events[any]>>>
|
|
22
|
-
|
|
23
|
-
constructor() {
|
|
24
|
-
super()
|
|
25
|
-
|
|
26
|
-
this.logger = new Logger('async-event-emitter')
|
|
27
|
-
this.queue = new Map()
|
|
28
|
-
|
|
29
|
-
this.readyState = AsyncEventEmitterReadyState.ACTIVE
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
public on<EventName extends keyof Events>(
|
|
33
|
-
eventName: EventName,
|
|
34
|
-
listener: Listener<any>
|
|
35
|
-
) {
|
|
36
|
-
const logger = this.logger.extend('on')
|
|
37
|
-
|
|
38
|
-
logger.info('adding "%s" listener...', eventName)
|
|
39
|
-
|
|
40
|
-
if (this.readyState === AsyncEventEmitterReadyState.DEACTIVATED) {
|
|
41
|
-
logger.info('the emitter is destroyed, skipping!')
|
|
42
|
-
return this
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
return super.on(eventName, async (...args) => {
|
|
46
|
-
// Event queue is always established when calling ".emit()".
|
|
47
|
-
const queue = this.openListenerQueue(eventName)
|
|
48
|
-
|
|
49
|
-
logger.info('awaiting the "%s" listener...', eventName)
|
|
50
|
-
|
|
51
|
-
// Whenever a listener is called, create a new Promise
|
|
52
|
-
// that resolves when that listener function completes its execution.
|
|
53
|
-
queue.push({
|
|
54
|
-
args,
|
|
55
|
-
done: new Promise<void>(async (resolve, reject) => {
|
|
56
|
-
try {
|
|
57
|
-
// Treat listeners as potentially asynchronous functions
|
|
58
|
-
// so they could be awaited.
|
|
59
|
-
await listener(...args)
|
|
60
|
-
resolve()
|
|
61
|
-
|
|
62
|
-
logger.info('"%s" listener has resolved!', eventName)
|
|
63
|
-
} catch (error) {
|
|
64
|
-
logger.info('"%s" listener has rejected!', error)
|
|
65
|
-
reject(error)
|
|
66
|
-
}
|
|
67
|
-
}),
|
|
68
|
-
})
|
|
69
|
-
})
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
public emit<EventName extends keyof Events>(
|
|
73
|
-
eventName: EventName,
|
|
74
|
-
...data: Events[EventName]
|
|
75
|
-
): boolean {
|
|
76
|
-
const logger = this.logger.extend('emit')
|
|
77
|
-
|
|
78
|
-
logger.info('emitting "%s" event...', eventName)
|
|
79
|
-
|
|
80
|
-
if (this.readyState === AsyncEventEmitterReadyState.DEACTIVATED) {
|
|
81
|
-
logger.info('the emitter is destroyed, skipping!')
|
|
82
|
-
return false
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
// Skip establishing event queues for internal listeners.
|
|
86
|
-
// Those are not meant to be awaited.
|
|
87
|
-
if (this.isInternalEventName(eventName)) {
|
|
88
|
-
return super.emit(eventName, ...data)
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
// Establish the Promise queue for this particular event.
|
|
92
|
-
this.openListenerQueue(eventName)
|
|
93
|
-
|
|
94
|
-
logger.info('appending a one-time cleanup "%s" listener...', eventName)
|
|
95
|
-
|
|
96
|
-
// Append a one-time clean up listener.
|
|
97
|
-
this.once(eventName, () => {
|
|
98
|
-
// Clear the Promise queue for this particular event
|
|
99
|
-
// in the next tick so the Promise in "untilIdle" has
|
|
100
|
-
// the time to properly resolve.
|
|
101
|
-
nextTick(() => {
|
|
102
|
-
this.queue.delete(eventName)
|
|
103
|
-
logger.info('cleaned up "%s" listeners queue!', eventName)
|
|
104
|
-
})
|
|
105
|
-
})
|
|
106
|
-
|
|
107
|
-
return super.emit(eventName, ...data)
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
/**
|
|
111
|
-
* Returns a promise that resolves when all the listeners for the given event
|
|
112
|
-
* has been called. Awaits asynchronous listeners.
|
|
113
|
-
* If the event has no listeners, resolves immediately.
|
|
114
|
-
*/
|
|
115
|
-
public async untilIdle<EventName extends keyof Events>(
|
|
116
|
-
eventName: EventName,
|
|
117
|
-
filter: (item: QueueItem<Events[EventName]>) => boolean = () => true
|
|
118
|
-
): Promise<void> {
|
|
119
|
-
const listenersQueue = this.queue.get(eventName) || []
|
|
120
|
-
|
|
121
|
-
await Promise.all(
|
|
122
|
-
listenersQueue.filter(filter).map(({ done }) => done)
|
|
123
|
-
).finally(() => {
|
|
124
|
-
// Clear the queue one the promise settles
|
|
125
|
-
// so that different events don't share the same queue.
|
|
126
|
-
this.queue.delete(eventName)
|
|
127
|
-
})
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
private openListenerQueue<EventName extends keyof Events>(
|
|
131
|
-
eventName: EventName
|
|
132
|
-
): Array<QueueItem<Events[EventName]>> {
|
|
133
|
-
const logger = this.logger.extend('openListenerQueue')
|
|
134
|
-
logger.info('opening "%s" listeners queue...', eventName)
|
|
135
|
-
|
|
136
|
-
const queue = this.queue.get(eventName)
|
|
137
|
-
|
|
138
|
-
if (!queue) {
|
|
139
|
-
logger.info('no queue found, creating one...')
|
|
140
|
-
this.queue.set(eventName, [])
|
|
141
|
-
return []
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
logger.info('returning an exising queue:', queue)
|
|
145
|
-
return queue
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
public removeAllListeners<EventName extends keyof Events>(
|
|
149
|
-
eventName?: EventName
|
|
150
|
-
) {
|
|
151
|
-
const logger = this.logger.extend('removeAllListeners')
|
|
152
|
-
logger.info('event:', eventName)
|
|
153
|
-
|
|
154
|
-
if (eventName) {
|
|
155
|
-
this.queue.delete(eventName)
|
|
156
|
-
logger.info(
|
|
157
|
-
'cleared the "%s" listeners queue!',
|
|
158
|
-
eventName,
|
|
159
|
-
this.queue.get(eventName)
|
|
160
|
-
)
|
|
161
|
-
} else {
|
|
162
|
-
this.queue.clear()
|
|
163
|
-
logger.info('cleared the listeners queue!', this.queue)
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
return super.removeAllListeners(eventName)
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
public activate(): void {
|
|
170
|
-
const logger = this.logger.extend('activate')
|
|
171
|
-
this.readyState = AsyncEventEmitterReadyState.ACTIVE
|
|
172
|
-
logger.info('set state to:', this.readyState)
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
/**
|
|
176
|
-
* Deactivate this event emitter.
|
|
177
|
-
* Deactivated emitter can no longer emit and listen to events
|
|
178
|
-
* and needs to be activated again in order to do so.
|
|
179
|
-
*/
|
|
180
|
-
public deactivate(): void {
|
|
181
|
-
const logger = this.logger.extend('deactivate')
|
|
182
|
-
|
|
183
|
-
logger.info('removing all listeners...')
|
|
184
|
-
this.removeAllListeners()
|
|
185
|
-
|
|
186
|
-
this.readyState = AsyncEventEmitterReadyState.DEACTIVATED
|
|
187
|
-
logger.info('set state to:', this.readyState)
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
private isInternalEventName(eventName: string | number | symbol): boolean {
|
|
191
|
-
return eventName === 'newListener' || eventName === 'removeListener'
|
|
192
|
-
}
|
|
193
|
-
}
|
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
export type AnyFunction = (...args: any[]) => any
|
|
2
|
-
|
|
3
|
-
export type LazyCallbackReturnType<FnType extends AnyFunction> =
|
|
4
|
-
| Parameters<FnType>
|
|
5
|
-
| []
|
|
6
|
-
|
|
7
|
-
export interface LazyCallback<FnType extends AnyFunction> {
|
|
8
|
-
(...args: Parameters<FnType>): void
|
|
9
|
-
invoked(): Promise<LazyCallbackReturnType<FnType>>
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
export interface LazyCallbackOptions {
|
|
13
|
-
maxCalls?: number
|
|
14
|
-
maxCallsCallback?(): void
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
export function createLazyCallback<FnType extends AnyFunction>(
|
|
18
|
-
options: LazyCallbackOptions = {}
|
|
19
|
-
): LazyCallback<FnType> {
|
|
20
|
-
let calledTimes = 0
|
|
21
|
-
let autoResolveTimeout: NodeJS.Timeout
|
|
22
|
-
let remoteResolve: (args: LazyCallbackReturnType<FnType>) => unknown
|
|
23
|
-
|
|
24
|
-
const callPromise = new Promise<LazyCallbackReturnType<FnType>>((resolve) => {
|
|
25
|
-
remoteResolve = resolve
|
|
26
|
-
}).finally(() => {
|
|
27
|
-
clearTimeout(autoResolveTimeout)
|
|
28
|
-
})
|
|
29
|
-
|
|
30
|
-
const fn: LazyCallback<FnType> = function (...args) {
|
|
31
|
-
if (options.maxCalls && calledTimes >= options.maxCalls) {
|
|
32
|
-
options.maxCallsCallback?.()
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
remoteResolve(args)
|
|
36
|
-
calledTimes++
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
fn.invoked = async () => {
|
|
40
|
-
// Immediately resolve the callback if it hasn't been called already.
|
|
41
|
-
autoResolveTimeout = setTimeout(() => {
|
|
42
|
-
remoteResolve([])
|
|
43
|
-
}, 0)
|
|
44
|
-
|
|
45
|
-
return callPromise
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
return fn
|
|
49
|
-
}
|