Skip to content

Commit b79c2e1

Browse files
committed
fix: dispose of frame listeners on disable()
1 parent 9b9a99b commit b79c2e1

2 files changed

Lines changed: 29 additions & 1 deletion

File tree

src/core/experimental/define-network.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import {
1212
type AnyHandler,
1313
} from './handlers-controller'
1414
import { toReadonlyArray } from '../utils/internal/toReadonlyArray'
15+
import { Disposable } from '../utils/internal/Disposable'
1516

1617
type UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends (
1718
k: infer I,
@@ -112,6 +113,7 @@ export function defineNetwork<Sources extends Array<NetworkSource<any>>>(
112113
): NetworkApi<Sources> {
113114
let readyState: NetworkReadyState = NetworkReadyState.DISABLED
114115
const events = new Emitter<MergeEventMaps<Sources>>()
116+
const disposable = new Disposable()
115117

116118
const deriveHandlersController = (
117119
handlers: DefineNetworkOptions<Sources>['handlers'],
@@ -187,6 +189,10 @@ export function defineNetwork<Sources extends Array<NetworkSource<any>>>(
187189
events.emit(event)
188190
})
189191

192+
disposable['subscriptions'].push(() => {
193+
frame.events.removeAllListeners()
194+
})
195+
190196
const handlers = frame.getHandlers(handlersController)
191197

192198
await frame.resolve(
@@ -210,6 +216,7 @@ export function defineNetwork<Sources extends Array<NetworkSource<any>>>(
210216
)
211217

212218
readyState = NetworkReadyState.DISABLED
219+
disposable.dispose()
213220

214221
return colorlessPromiseAll(
215222
resolvedOptions.sources.map((source) => source.disable()),
Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,33 @@
1+
import { devUtils } from './devUtils'
2+
13
export type DisposableSubscription = () => void
24

35
export class Disposable {
46
protected subscriptions: Array<DisposableSubscription> = []
57

68
public dispose() {
79
let subscription: DisposableSubscription | undefined
10+
const errors: Array<Error> = []
11+
812
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+
)
1031
}
1132
}
1233
}

0 commit comments

Comments
 (0)