From dcf2592c35c0724b20a73d434c398c482238a34c Mon Sep 17 00:00:00 2001 From: Nerivec <62446222+Nerivec@users.noreply.github.com> Date: Thu, 23 Jan 2025 19:42:38 +0100 Subject: [PATCH] fix(ignore): cleanup logger, add waitress clear util (#1307) --- src/adapter/zboss/adapter/zbossAdapter.ts | 6 +++--- src/utils/logger.ts | 12 ++++++------ src/utils/waitress.ts | 8 ++++++++ test/utils.test.ts | 19 +++++++++++++++---- 4 files changed, 32 insertions(+), 13 deletions(-) diff --git a/src/adapter/zboss/adapter/zbossAdapter.ts b/src/adapter/zboss/adapter/zbossAdapter.ts index 346a152af3..4d2c101c3a 100644 --- a/src/adapter/zboss/adapter/zbossAdapter.ts +++ b/src/adapter/zboss/adapter/zbossAdapter.ts @@ -172,7 +172,7 @@ export class ZBOSSAdapter extends Adapter { } public async addInstallCode(ieeeAddress: string, key: Buffer): Promise { - logger.error(() => `NOT SUPPORTED: sendZclFrameToGroup(${ieeeAddress},${key.toString('hex')}`, NS); + logger.error(`NOT SUPPORTED: sendZclFrameToGroup(${ieeeAddress},${key.toString('hex')}`, NS); throw new Error(`Install code is not supported for 'zboss' yet`); } @@ -431,12 +431,12 @@ export class ZBOSSAdapter extends Adapter { } public async sendZclFrameInterPANToIeeeAddr(zclFrame: Zcl.Frame, ieeeAddress: string): Promise { - logger.error(() => `NOT SUPPORTED: sendZclFrameInterPANToIeeeAddr(${JSON.stringify(zclFrame)},${ieeeAddress})`, NS); + logger.error(`NOT SUPPORTED: sendZclFrameInterPANToIeeeAddr(${JSON.stringify(zclFrame)},${ieeeAddress})`, NS); return; } public async sendZclFrameInterPANBroadcast(zclFrame: Zcl.Frame, timeout: number): Promise { - logger.error(() => `NOT SUPPORTED: sendZclFrameInterPANBroadcast(${JSON.stringify(zclFrame)},${timeout})`, NS); + logger.error(`NOT SUPPORTED: sendZclFrameInterPANBroadcast(${JSON.stringify(zclFrame)},${timeout})`, NS); throw new Error(`Is not supported for 'zboss' yet`); } diff --git a/src/utils/logger.ts b/src/utils/logger.ts index a3611d8441..076532d217 100644 --- a/src/utils/logger.ts +++ b/src/utils/logger.ts @@ -2,17 +2,17 @@ export interface Logger { debug: (messageOrLambda: string | (() => string), namespace: string) => void; info: (messageOrLambda: string | (() => string), namespace: string) => void; warning: (messageOrLambda: string | (() => string), namespace: string) => void; - error: (messageOrLambda: string | (() => string), namespace: string) => void; + error: (messageOrLambda: string, namespace: string) => void; } export let logger: Logger = { debug: (messageOrLambda, namespace) => - console.debug(`${namespace}: ${typeof messageOrLambda === 'function' ? messageOrLambda() : messageOrLambda}`), - info: (messageOrLambda, namespace) => console.info(`${namespace}: ${typeof messageOrLambda === 'string' ? messageOrLambda : messageOrLambda()}`), + console.debug(`[${new Date().toISOString()}] ${namespace}: ${typeof messageOrLambda === 'function' ? messageOrLambda() : messageOrLambda}`), + info: (messageOrLambda, namespace) => + console.info(`[${new Date().toISOString()}] ${namespace}: ${typeof messageOrLambda === 'function' ? messageOrLambda() : messageOrLambda}`), warning: (messageOrLambda, namespace) => - console.warn(`${namespace}: ${typeof messageOrLambda === 'function' ? messageOrLambda() : messageOrLambda}`), - error: (messageOrLambda, namespace) => - console.error(`${namespace}: ${typeof messageOrLambda === 'function' ? messageOrLambda() : messageOrLambda}`), + console.warn(`[${new Date().toISOString()}] ${namespace}: ${typeof messageOrLambda === 'function' ? messageOrLambda() : messageOrLambda}`), + error: (message, namespace) => console.error(`[${new Date().toISOString()}] ${namespace}: ${message}`), }; export function setLogger(l: Logger): void { diff --git a/src/utils/waitress.ts b/src/utils/waitress.ts index b03b397290..217802a30b 100644 --- a/src/utils/waitress.ts +++ b/src/utils/waitress.ts @@ -24,6 +24,14 @@ export class Waitress { this.currentID = 0; } + public clear(): void { + for (const [, waiter] of this.waiters) { + clearTimeout(waiter.timer); + } + + this.waiters.clear(); + } + public resolve(payload: TPayload): boolean { return this.forEachMatching(payload, (waiter) => waiter.resolve(payload)); } diff --git a/test/utils.test.ts b/test/utils.test.ts index 73255966ba..8fdb47a842 100644 --- a/test/utils.test.ts +++ b/test/utils.test.ts @@ -117,6 +117,17 @@ describe('Utils', () => { expect(error2_).toStrictEqual(new Error("Timedout '5000'")); let handled2 = waitress.reject('two', 'drop'); expect(handled2).toBe(false); + + const waitClear_1 = waitress.waitFor(2, 10000).start().promise; + const waitClear_2 = waitress.waitFor(2, 10000).start().promise; + + await vi.advanceTimersByTimeAsync(2000); + waitress.clear(); + await vi.advanceTimersByTimeAsync(12000); + + // @ts-expect-error private + expect(waitress.waiters.size).toStrictEqual(0); + vi.useRealTimers(); }); @@ -186,13 +197,13 @@ describe('Utils', () => { const warningSpy = vi.spyOn(console, 'warn'); const errorSpy = vi.spyOn(console, 'error'); logger.debug('debug', 'zh'); - expect(debugSpy).toHaveBeenCalledWith('zh: debug'); + expect(debugSpy).toHaveBeenCalledWith(expect.stringMatching(/^\[\d\d\d\d-\d\d-\d\dT\d\d:\d\d:\d\d.\d\d\dZ\] zh: debug$/)); logger.info('info', 'zh'); - expect(infoSpy).toHaveBeenCalledWith('zh: info'); + expect(infoSpy).toHaveBeenCalledWith(expect.stringMatching(/^\[\d\d\d\d-\d\d-\d\dT\d\d:\d\d:\d\d.\d\d\dZ\] zh: info$/)); logger.warning('warning', 'zh'); - expect(warningSpy).toHaveBeenCalledWith('zh: warning'); + expect(warningSpy).toHaveBeenCalledWith(expect.stringMatching(/^\[\d\d\d\d-\d\d-\d\dT\d\d:\d\d:\d\d.\d\d\dZ\] zh: warning$/)); logger.error('error', 'zh'); - expect(errorSpy).toHaveBeenCalledWith('zh: error'); + expect(errorSpy).toHaveBeenCalledWith(expect.stringMatching(/^\[\d\d\d\d-\d\d-\d\dT\d\d:\d\d:\d\d.\d\d\dZ\] zh: error$/)); setLogger(mockLogger); expect(logger).toEqual(mockLogger);