Skip to content

Commit c49c8da

Browse files
fix: Ensure all stateOwnersUpdateHandlers are properly torn down (#1237)
Resolve #1212 ## Problem Only the last handler's teardown in `stateOwnersUpdateHandlers` was called when a media element changed, causing memory leaks and stale listeners. ## Solution - Store all teardown functions in an array - Call every teardown when state owners change - Ignore handlers that don’t return a teardown
1 parent 58d1e1b commit c49c8da

File tree

1 file changed

+23
-12
lines changed

1 file changed

+23
-12
lines changed

src/js/media-store/media-store.ts

Lines changed: 23 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -455,19 +455,30 @@ export const createMediaStore = ({
455455

456456
// NOTE: Since custom update handlers may depend on *any* state owner
457457
// we should apply them whenever any state owner changes (CJP)
458-
const prevHandlerTeardown =
458+
const prevHandlerTeardowns =
459459
stateUpdateHandlers[stateName].stateOwnersUpdateHandlers;
460-
stateOwnersUpdateHandlers.forEach((fn) => {
461-
if (prevHandlerTeardown && teardownSomething) {
462-
prevHandlerTeardown();
463-
}
464-
if (setupSomething) {
465-
stateUpdateHandlers[stateName].stateOwnersUpdateHandlers = fn(
466-
handler,
467-
nextStateOwners
468-
);
469-
}
470-
});
460+
461+
if (prevHandlerTeardowns && teardownSomething) {
462+
const teardowns = Array.isArray(prevHandlerTeardowns)
463+
? prevHandlerTeardowns
464+
: [prevHandlerTeardowns];
465+
teardowns.forEach((teardown) => {
466+
if (typeof teardown === 'function') {
467+
teardown();
468+
}
469+
});
470+
}
471+
472+
if (setupSomething) {
473+
const newTeardowns = stateOwnersUpdateHandlers
474+
.map((fn) => fn(handler, nextStateOwners))
475+
.filter((teardown) => typeof teardown === 'function');
476+
477+
stateUpdateHandlers[stateName].stateOwnersUpdateHandlers =
478+
newTeardowns.length === 1 ? newTeardowns[0] : newTeardowns;
479+
} else if (teardownSomething) {
480+
stateUpdateHandlers[stateName].stateOwnersUpdateHandlers = undefined;
481+
}
471482
}
472483
);
473484

0 commit comments

Comments
 (0)