fix(infra): memory leak (#9013)

This commit is contained in:
EYHN
2024-12-16 16:55:49 +00:00
parent 55f1cc4b1e
commit b36b398957
30 changed files with 399 additions and 135 deletions

View File

@@ -48,16 +48,16 @@ export class EventBus {
this.listeners[event.id].push(listener);
const off = this.parent?.on(event, listener);
return () => {
this.off(event, listener);
off?.();
this.off(event.id, listener);
};
}
off<T>(event: FrameworkEvent<T>, listener: (event: T) => void) {
if (!this.listeners[event.id]) {
private off(eventId: string, listener: (event: any) => void) {
if (!this.listeners[eventId]) {
return;
}
this.listeners[event.id] = this.listeners[event.id].filter(
this.listeners[eventId] = this.listeners[eventId].filter(
l => l !== listener
);
}
@@ -76,6 +76,15 @@ export class EventBus {
}
});
}
dispose(): void {
for (const eventId of Object.keys(this.listeners)) {
for (const listener of this.listeners[eventId]) {
this.parent?.off(eventId, listener);
}
}
this.listeners = {};
}
}
interface EventHandler {

View File

@@ -130,6 +130,7 @@ export class ComponentCachePool {
}
}
}
this.cache.clear();
}
[Symbol.dispose]() {
@@ -318,5 +319,6 @@ export class BasicFrameworkProvider extends FrameworkProvider {
}
this.disposed = true;
this.cache.dispose();
this.eventBus.dispose();
}
}

View File

@@ -82,4 +82,8 @@ export class Workspace extends Entity {
}),
undefined
);
override dispose(): void {
this.docCollection.dispose();
}
}

View File

@@ -49,7 +49,7 @@ export class WorkspaceRepositoryService extends Service {
return {
workspace,
dispose: () => {
workspace.dispose();
workspace.scope.dispose();
},
};
}

View File

@@ -10,4 +10,8 @@ export class WorkspaceService extends Service {
}
return this._workspace;
}
override dispose(): void {
this._workspace?.dispose();
}
}

View File

@@ -70,6 +70,8 @@ class TestingWorkspaceLocalProvider implements WorkspaceFlavourProvider {
const list = this.workspaceListStore.get<WorkspaceMetadata[]>('list') ?? [];
this.workspaceListStore.set('list', [...list, meta]);
docCollection.dispose();
return { id, flavour: 'local' };
}
workspaces$ = LiveData.from<WorkspaceMetadata[]>(
@@ -94,6 +96,8 @@ class TestingWorkspaceLocalProvider implements WorkspaceFlavourProvider {
applyUpdate(bs.doc, data);
bs.dispose();
return {
name: bs.meta.name,
avatar: bs.meta.avatar,