@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.
Files changed (77) hide show
  1. package/lib/browser/Interceptor-8d5fd4c6.d.ts +86 -0
  2. package/lib/browser/{chunk-4CFMDU7Z.js → chunk-CWVY2E3W.js} +20 -134
  3. package/lib/browser/{chunk-VMXB5F2J.mjs → chunk-HXJPKJY3.mjs} +25 -15
  4. package/lib/browser/{chunk-DBFLI5DJ.js → chunk-KITNLK66.js} +30 -20
  5. package/lib/browser/chunk-KK6APRON.mjs +58 -0
  6. package/lib/browser/{chunk-OSIUQA4X.js → chunk-NMG5MQJJ.js} +32 -29
  7. package/lib/browser/{chunk-GXJLJMOT.mjs → chunk-QPMXOLDO.mjs} +21 -135
  8. package/lib/browser/{chunk-ANLPTCZ5.mjs → chunk-TYEVJTWH.mjs} +27 -24
  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 +18 -18
  26. package/lib/node/RemoteHttpInterceptor.mjs +14 -14
  27. package/lib/node/{chunk-XYZRP5S2.js → chunk-3XFLRXRY.js} +20 -134
  28. package/lib/node/chunk-5PTPJLB7.js +58 -0
  29. package/lib/node/{chunk-E6YC337Q.js → chunk-5YAV7CXX.js} +29 -26
  30. package/lib/node/{chunk-HSCXCLVT.mjs → chunk-7RGC35CC.mjs} +27 -24
  31. package/lib/node/{chunk-3MYUI4B2.js → chunk-B2CIOP5B.js} +22 -16
  32. package/lib/node/{chunk-RGYCLCLK.mjs → chunk-GM3YBSM3.mjs} +21 -135
  33. package/lib/node/{chunk-OL7OR4RL.mjs → chunk-OMRBBJT7.mjs} +20 -14
  34. package/lib/node/{chunk-VS3GJPUE.mjs → chunk-UBEFEZXT.mjs} +22 -3
  35. package/lib/node/{chunk-MVPEJK4V.js → chunk-UF7QIAQ5.js} +23 -4
  36. package/lib/node/chunk-YQGTMMOZ.mjs +58 -0
  37. package/lib/node/index.d.ts +3 -2
  38. package/lib/node/index.js +3 -3
  39. package/lib/node/index.mjs +2 -2
  40. package/lib/node/interceptors/ClientRequest/index.d.ts +4 -3
  41. package/lib/node/interceptors/ClientRequest/index.js +4 -4
  42. package/lib/node/interceptors/ClientRequest/index.mjs +3 -3
  43. package/lib/node/interceptors/XMLHttpRequest/index.d.ts +4 -3
  44. package/lib/node/interceptors/XMLHttpRequest/index.js +4 -4
  45. package/lib/node/interceptors/XMLHttpRequest/index.mjs +3 -3
  46. package/lib/node/interceptors/fetch/index.d.ts +2 -1
  47. package/lib/node/interceptors/fetch/index.js +27 -17
  48. package/lib/node/interceptors/fetch/index.mjs +25 -15
  49. package/lib/node/presets/node.d.ts +3 -2
  50. package/lib/node/presets/node.js +6 -6
  51. package/lib/node/presets/node.mjs +4 -4
  52. package/package.json +1 -1
  53. package/src/BatchInterceptor.test.ts +141 -0
  54. package/src/BatchInterceptor.ts +38 -4
  55. package/src/Interceptor.test.ts +46 -0
  56. package/src/Interceptor.ts +35 -16
  57. package/src/RemoteHttpInterceptor.ts +11 -9
  58. package/src/interceptors/ClientRequest/NodeClientRequest.test.ts +10 -10
  59. package/src/interceptors/ClientRequest/NodeClientRequest.ts +35 -18
  60. package/src/interceptors/ClientRequest/index.test.ts +2 -3
  61. package/src/interceptors/ClientRequest/index.ts +2 -2
  62. package/src/interceptors/ClientRequest/utils/createRequest.test.ts +2 -2
  63. package/src/interceptors/XMLHttpRequest/XMLHttpRequestProxy.ts +29 -25
  64. package/src/interceptors/XMLHttpRequest/index.ts +2 -2
  65. package/src/interceptors/fetch/index.ts +26 -13
  66. package/src/utils/RequestController.ts +21 -0
  67. package/src/utils/emitAsync.ts +25 -0
  68. package/src/utils/toInteractiveRequest.ts +17 -23
  69. package/lib/browser/Interceptor-0a020bc4.d.ts +0 -116
  70. package/lib/browser/chunk-PCFJD76X.js +0 -64
  71. package/lib/browser/chunk-RT3ATOJH.mjs +0 -64
  72. package/lib/node/Interceptor-738f79c5.d.ts +0 -116
  73. package/lib/node/chunk-STA6QBYM.mjs +0 -64
  74. package/lib/node/chunk-ZJOF5MEZ.js +0 -64
  75. package/src/utils/AsyncEventEmitter.test.ts +0 -102
  76. package/src/utils/AsyncEventEmitter.ts +0 -193
  77. 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
- }