Skip to content

Commit 7cd82a2

Browse files
Fix memory leaks in actor cleanup (#5408)
* Clear event listeners and actor state on stop * Update packages/core/src/actors/callback.ts Co-authored-by: Mateusz Burzyński <[email protected]> --------- Co-authored-by: Mateusz Burzyński <[email protected]>
1 parent 54cd991 commit 7cd82a2

File tree

3 files changed

+6
-0
lines changed

3 files changed

+6
-0
lines changed

packages/core/src/actors/callback.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -230,6 +230,8 @@ export function fromCallback<
230230
error: undefined
231231
};
232232

233+
instanceStates.delete(actorScope.self);
234+
callbackState.receivers?.clear();
233235
callbackState.dispose?.();
234236
return state;
235237
}

packages/core/src/actors/promise.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,7 @@ export function fromPromise<
165165
};
166166
case XSTATE_STOP: {
167167
controllerMap.get(scope.self)?.abort();
168+
controllerMap.delete(scope.self);
168169
return {
169170
...state,
170171
status: 'stopped',

packages/core/src/createActor.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -635,12 +635,14 @@ export class Actor<TLogic extends AnyActorLogic>
635635
}
636636
}
637637
this.observers.clear();
638+
this.eventListeners.clear();
638639
}
639640
private _reportError(err: unknown): void {
640641
if (!this.observers.size) {
641642
if (!this._parent) {
642643
reportUnhandledError(err);
643644
}
645+
this.eventListeners.clear();
644646
return;
645647
}
646648
let reportError = false;
@@ -655,6 +657,7 @@ export class Actor<TLogic extends AnyActorLogic>
655657
}
656658
}
657659
this.observers.clear();
660+
this.eventListeners.clear();
658661
if (reportError) {
659662
reportUnhandledError(err);
660663
}

0 commit comments

Comments
 (0)