From e6bcf91e17747eff38ce7774107d697aeff4be15 Mon Sep 17 00:00:00 2001 From: koenkk Date: Wed, 3 Jan 2024 09:09:18 +0100 Subject: [PATCH] fix: Fix crash due to unhandled Promise exception https://github.com/Koenkk/zigbee2mqtt/issues/20473 --- lib/eventBus.ts | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/lib/eventBus.ts b/lib/eventBus.ts index 3ff02d948b..e14f5ae80c 100644 --- a/lib/eventBus.ts +++ b/lib/eventBus.ts @@ -161,10 +161,14 @@ export default class EventBus { this.on('stateChange', callback, key); } - private on(event: string, callback: (...args: unknown[]) => void, key: ListenerKey): void { + private on(event: string, callback: (...args: unknown[]) => (Promise | void), key: ListenerKey): void { if (!this.callbacksByExtension[key.constructor.name]) this.callbacksByExtension[key.constructor.name] = []; - this.callbacksByExtension[key.constructor.name].push({event, callback}); - this.emitter.on(event, callback); + const wrappedCallback = (...args: unknown[]): void => { + // Wrap callback as it may return a Promise which can throw an exception + Promise.resolve(callback(...args)).catch(); + }; + this.callbacksByExtension[key.constructor.name].push({event, callback: wrappedCallback}); + this.emitter.on(event, wrappedCallback); } public removeListeners(key: ListenerKey): void {