mirror of
https://github.com/toeverything/AFFiNE.git
synced 2026-02-25 18:26:05 +08:00
fix(infra): memory leak (#9013)
This commit is contained in:
@@ -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 {
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -82,4 +82,8 @@ export class Workspace extends Entity {
|
||||
}),
|
||||
undefined
|
||||
);
|
||||
|
||||
override dispose(): void {
|
||||
this.docCollection.dispose();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -49,7 +49,7 @@ export class WorkspaceRepositoryService extends Service {
|
||||
return {
|
||||
workspace,
|
||||
dispose: () => {
|
||||
workspace.dispose();
|
||||
workspace.scope.dispose();
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
@@ -10,4 +10,8 @@ export class WorkspaceService extends Service {
|
||||
}
|
||||
return this._workspace;
|
||||
}
|
||||
|
||||
override dispose(): void {
|
||||
this._workspace?.dispose();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user