msw 2.14.5 → 2.14.6

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.
@@ -7,7 +7,7 @@
7
7
  * - Please do NOT modify this file.
8
8
  */
9
9
 
10
- const PACKAGE_VERSION = '2.14.5'
10
+ const PACKAGE_VERSION = '2.14.6'
11
11
  const INTEGRITY_CHECKSUM = '4db4a41e972cec1b64cc569c66952d82'
12
12
  const IS_MOCKED_RESPONSE = Symbol('isMockedResponse')
13
13
  const activeClientIds = new Set()
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "msw",
3
- "version": "2.14.5",
3
+ "version": "2.14.6",
4
4
  "description": "Seamless REST/GraphQL API mocking library for browser and Node.js.",
5
5
  "type": "commonjs",
6
6
  "main": "./lib/core/index.js",
@@ -286,7 +286,7 @@
286
286
  "vitest-environment-miniflare": "^2.14.4",
287
287
  "webpack": "^5.106.2",
288
288
  "webpack-http-server": "^0.5.0",
289
- "msw": "^2.14.5"
289
+ "msw": "^2.14.6"
290
290
  },
291
291
  "peerDependencies": {
292
292
  "typescript": ">= 4.8.x"
@@ -12,6 +12,7 @@ import {
12
12
  type AnyHandler,
13
13
  } from './handlers-controller'
14
14
  import { toReadonlyArray } from '../utils/internal/toReadonlyArray'
15
+ import { Disposable } from '../utils/internal/Disposable'
15
16
 
16
17
  type UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends (
17
18
  k: infer I,
@@ -112,6 +113,7 @@ export function defineNetwork<Sources extends Array<NetworkSource<any>>>(
112
113
  ): NetworkApi<Sources> {
113
114
  let readyState: NetworkReadyState = NetworkReadyState.DISABLED
114
115
  const events = new Emitter<MergeEventMaps<Sources>>()
116
+ const disposable = new Disposable()
115
117
 
116
118
  const deriveHandlersController = (
117
119
  handlers: DefineNetworkOptions<Sources>['handlers'],
@@ -130,7 +132,6 @@ export function defineNetwork<Sources extends Array<NetworkSource<any>>>(
130
132
  * certain setup APIs, like `setupServer`, don't await `.enable` (`.listen`).
131
133
  */
132
134
  let handlersController = deriveHandlersController(resolvedOptions.handlers)
133
- let listenersController: AbortController
134
135
 
135
136
  return {
136
137
  get readyState() {
@@ -138,7 +139,10 @@ export function defineNetwork<Sources extends Array<NetworkSource<any>>>(
138
139
  },
139
140
  events,
140
141
  configure(options) {
141
- invariant(readyState === NetworkReadyState.DISABLED, '')
142
+ invariant(
143
+ readyState === NetworkReadyState.DISABLED,
144
+ 'Failed to call "configure()" on the network: cannot configure an already enabled network.',
145
+ )
142
146
 
143
147
  if (
144
148
  options.handlers &&
@@ -158,9 +162,18 @@ export function defineNetwork<Sources extends Array<NetworkSource<any>>>(
158
162
  'Failed to call "enable" on the network: already enabled',
159
163
  )
160
164
 
161
- listenersController = new AbortController()
162
165
  readyState = NetworkReadyState.ENABLED
163
166
 
167
+ /**
168
+ * @note Use a session object scoped to the current "enable()"
169
+ * to prevent "frame.events" listeners from surviving across enable/disable cycles.
170
+ * @see The note about `AbortController` below.
171
+ */
172
+ const session = { active: true }
173
+ disposable['subscriptions'].push(() => {
174
+ session.active = false
175
+ })
176
+
164
177
  const result = resolvedOptions.sources.map((source) => {
165
178
  /**
166
179
  * @note Preemptively disable the network source before enabling.
@@ -171,8 +184,19 @@ export function defineNetwork<Sources extends Array<NetworkSource<any>>>(
171
184
  NetworkSource.prototype.disable.call(source)
172
185
 
173
186
  source.on('frame', async ({ frame }) => {
174
- frame.events.on('*', (event) => events.emit(event), {
175
- signal: listenersController.signal,
187
+ frame.events.on('*', (event) => {
188
+ /**
189
+ * @note Prevent event forwarding manually and not via an AbortController
190
+ * because certain runtimes, like Cloudflare, throw when referencing an
191
+ * AbortController created in a different context. Bear in mind that the frame
192
+ * events run in the patched request client context while the AbortController
193
+ * is created outside, in the "defineNetwork" closure, which is a test context.
194
+ */
195
+ if (!session.active) {
196
+ return
197
+ }
198
+
199
+ events.emit(event)
176
200
  })
177
201
 
178
202
  const handlers = frame.getHandlers(handlersController)
@@ -197,8 +221,8 @@ export function defineNetwork<Sources extends Array<NetworkSource<any>>>(
197
221
  'Failed to call "disable" on the network: already disabled',
198
222
  )
199
223
 
200
- listenersController.abort()
201
224
  readyState = NetworkReadyState.DISABLED
225
+ disposable.dispose()
202
226
 
203
227
  return colorlessPromiseAll(
204
228
  resolvedOptions.sources.map((source) => source.disable()),
@@ -1,3 +1,5 @@
1
+ import { devUtils } from './devUtils'
2
+
1
3
  export type DisposableSubscription = () => void
2
4
 
3
5
  export class Disposable {
@@ -5,8 +7,27 @@ export class Disposable {
5
7
 
6
8
  public dispose() {
7
9
  let subscription: DisposableSubscription | undefined
10
+ const errors: Array<Error> = []
11
+
8
12
  while ((subscription = this.subscriptions.shift())) {
9
- subscription()
13
+ try {
14
+ subscription()
15
+ } catch (error) {
16
+ if (error instanceof Error) {
17
+ errors.push(error)
18
+ }
19
+ }
20
+ }
21
+
22
+ if (errors.length > 0) {
23
+ console.error(
24
+ new AggregateError(
25
+ errors,
26
+ devUtils.formatMessage(
27
+ 'Failed to dispose of some side effects. This is likely an issue with MSW, please report it on GitHub: https://github.com/mswjs/msw/issues',
28
+ ),
29
+ ),
30
+ )
10
31
  }
11
32
  }
12
33
  }