From 89cff9d5333decc913283cf6cee41fe929735ffd Mon Sep 17 00:00:00 2001 From: Jaanus Sellin Date: Thu, 3 Jul 2025 12:09:35 +0300 Subject: [PATCH] fix: tear down also event handlers in addon service (#10295) --- src/lib/features/events/event-service.ts | 7 +++++++ src/lib/services/addon-service.ts | 23 ++++++++++++++++++++--- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/src/lib/features/events/event-service.ts b/src/lib/features/events/event-service.ts index b6acb84642..89141ff00a 100644 --- a/src/lib/features/events/event-service.ts +++ b/src/lib/features/events/event-service.ts @@ -110,6 +110,13 @@ export default class EventService { return this.eventStore.on(eventName, listener); } + off( + eventName: string | symbol, + listener: (...args: any[]) => void, + ): EventEmitter { + return this.eventStore.off(eventName, listener); + } + private async enhanceEventsWithTags( events: IBaseEvent[], ): Promise { diff --git a/src/lib/services/addon-service.ts b/src/lib/services/addon-service.ts index 130919d880..11e12105b1 100644 --- a/src/lib/services/addon-service.ts +++ b/src/lib/services/addon-service.ts @@ -59,6 +59,8 @@ export default class AddonService { fetchAddonConfigs: (() => Promise) & memoizee.Memoized<() => Promise>; + private eventHandlers: Map void>; + constructor( { addonStore, @@ -83,6 +85,7 @@ export default class AddonService { this.logger = getLogger('services/addon-service.js'); this.tagTypeService = tagTypeService; this.eventService = eventService; + this.eventHandlers = new Map(); this.addonProviders = addons || @@ -124,9 +127,11 @@ export default class AddonService { } registerEventHandler(): void { - SUPPORTED_EVENTS.forEach((eventName) => - this.eventService.onEvent(eventName, this.handleEvent(eventName)), - ); + SUPPORTED_EVENTS.forEach((eventName) => { + const handler = this.handleEvent(eventName); + this.eventHandlers.set(eventName, handler); + this.eventService.onEvent(eventName, handler); + }); } handleEvent(eventName: string): (event: IEvent) => void { @@ -349,6 +354,18 @@ export default class AddonService { } destroy(): void { + this.eventHandlers.forEach((handler, eventName) => { + try { + this.eventService.off(eventName, handler); + } catch (error) { + this.logger.debug( + `Failed to remove event handler for ${eventName}:`, + error, + ); + } + }); + this.eventHandlers.clear(); + Object.values(this.addonProviders).forEach((addon) => addon.destroy?.(), );