From 65d57c31639add4808edfb5d2db4ed6a4cb6bf58 Mon Sep 17 00:00:00 2001 From: Weyoss Date: Sun, 26 Nov 2023 16:50:34 +0100 Subject: [PATCH] feat(event-emitter)!: add typed EventEmitter, remove legacy events --- index.ts | 2 +- src/event/event-emitter.ts | 30 +++++++++++++++++++++++ src/{events/events.ts => event/index.ts} | 9 +------ src/ticker/ticker.ts | 15 ++++++------ src/worker/worker-runner/worker-runner.ts | 15 ++++++------ src/worker/worker.ts | 3 +-- types/event/event.ts | 18 ++++++++++++++ types/event/index.ts | 10 ++++++++ types/index.ts | 1 + 9 files changed, 76 insertions(+), 27 deletions(-) create mode 100644 src/event/event-emitter.ts rename src/{events/events.ts => event/index.ts} (60%) create mode 100644 types/event/event.ts create mode 100644 types/event/index.ts diff --git a/index.ts b/index.ts index f3c2ac6..570f053 100755 --- a/index.ts +++ b/index.ts @@ -22,7 +22,7 @@ export { Ticker } from './src/ticker/ticker'; export { Worker } from './src/worker/worker'; export { WorkerRunner } from './src/worker/worker-runner/worker-runner'; export { WorkerPool } from './src/worker/worker-runner/worker-pool'; -export { events } from './src/events/events'; export { logger } from './src/logger/logger'; export { async } from './src/async/async'; export { redis } from './src/redis-client'; +export * from './src/event'; diff --git a/src/event/event-emitter.ts b/src/event/event-emitter.ts new file mode 100644 index 0000000..d5b41c2 --- /dev/null +++ b/src/event/event-emitter.ts @@ -0,0 +1,30 @@ +/* + * Copyright (c) + * Weyoss + * https://github.com/weyoss + * + * This source code is licensed under the MIT license found in the LICENSE file + * in the root directory of this source tree. + */ + +import { EventEmitter as Base } from 'events'; + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export type TEventEmitterEvent = Record any>; // type-coverage:ignore-line + +export declare interface EventEmitter + extends Base { + on(event: E, listener: Events[E]): this; + once(event: E, listener: Events[E]): this; + emit( + event: E, + ...args: Parameters + ): boolean; + removeAllListeners(event?: E): this; +} + +// eslint-disable-next-line @typescript-eslint/no-unsafe-declaration-merging +export class EventEmitter< + // eslint-disable-next-line @typescript-eslint/no-unused-vars + Events extends TEventEmitterEvent, +> extends Base {} diff --git a/src/events/events.ts b/src/event/index.ts similarity index 60% rename from src/events/events.ts rename to src/event/index.ts index 14e8340..8c86c1a 100644 --- a/src/events/events.ts +++ b/src/event/index.ts @@ -7,11 +7,4 @@ * in the root directory of this source tree. */ -export const events = { - GOING_UP: 'going_up', - UP: 'up', - GOING_DOWN: 'going_down', - DOWN: 'down', - ERROR: 'error', - TICK: 'tick', -}; +export * from './event-emitter'; diff --git a/src/ticker/ticker.ts b/src/ticker/ticker.ts index 31e46e8..54d47db 100644 --- a/src/ticker/ticker.ts +++ b/src/ticker/ticker.ts @@ -7,14 +7,13 @@ * in the root directory of this source tree. */ -import { TFunction } from '../../types'; -import { EventEmitter } from 'events'; -import { events } from '../events/events'; +import { TFunction, TEvent } from '../../types'; import { PowerSwitch } from '../power-switch/power-switch'; import { TickerError } from './errors'; import { PanicError } from '../errors'; +import { EventEmitter } from '../event'; -export class Ticker extends EventEmitter { +export class Ticker extends EventEmitter { protected powerManager = new PowerSwitch(); protected onTickFn: TFunction; protected onNextTickFn: TFunction | null = null; @@ -37,7 +36,7 @@ export class Ticker extends EventEmitter { clearTimeout(this.shutdownTimeout); } this.powerManager.commit(); - this.emit(events.DOWN); + this.emit('down'); } protected onTick(): void { @@ -48,7 +47,7 @@ export class Ticker extends EventEmitter { this.onNextTickFn = null; tickFn(); } else { - this.emit(events.ERROR, new PanicError(`Unexpected call`)); + this.emit('error', new PanicError(`Unexpected call`)); } } @@ -63,9 +62,9 @@ export class Ticker extends EventEmitter { quit(): void { if (this.powerManager.isGoingUp()) { this.powerManager.rollback(); - this.emit(events.DOWN); + this.emit('down'); } else if (this.aborted && this.powerManager.isDown()) { - this.emit(events.DOWN); + this.emit('down'); } else { this.powerManager.goingDown(); if (this.timeout) { diff --git a/src/worker/worker-runner/worker-runner.ts b/src/worker/worker-runner/worker-runner.ts index 8f7fa06..c22d43f 100644 --- a/src/worker/worker-runner/worker-runner.ts +++ b/src/worker/worker-runner/worker-runner.ts @@ -7,19 +7,18 @@ * in the root directory of this source tree. */ -import { ICallback, ILogger } from '../../../types'; +import { ICallback, ILogger, TEvent } from '../../../types'; import { PowerSwitch } from '../../power-switch/power-switch'; -import { EventEmitter } from 'events'; import { Ticker } from '../../ticker/ticker'; import { ELockStatus, Lock } from '../../lock/lock'; import { RedisClient } from '../../redis-client/redis-client'; -import { events } from '../../events/events'; import { WorkerPool } from './worker-pool'; import { Worker } from '../worker'; import { async } from '../../async/async'; import { LockAcquireError } from '../../lock/errors'; +import { EventEmitter } from '../../event'; -export class WorkerRunner extends EventEmitter { +export class WorkerRunner extends EventEmitter { private readonly powerManager: PowerSwitch; private readonly ticker: Ticker; private readonly lock: Lock; @@ -61,7 +60,7 @@ export class WorkerRunner extends EventEmitter { ], (err) => { if (!err || err instanceof LockAcquireError) this.ticker.nextTick(); - else this.emit(events.ERROR, err); + else this.emit('error', err); }, ); }; @@ -71,7 +70,7 @@ export class WorkerRunner extends EventEmitter { }; private stopTicker = (cb: ICallback) => { - this.ticker.once(events.DOWN, cb); + this.ticker.once('down', cb); this.ticker.quit(); }; @@ -84,7 +83,7 @@ export class WorkerRunner extends EventEmitter { } run = (): void => { - this.emit(events.UP); + this.emit('up'); this.ticker.nextTick(); }; @@ -92,7 +91,7 @@ export class WorkerRunner extends EventEmitter { async.waterfall( [this.stopTicker, this.clearWorkerPool, this.releaseLock], () => { - this.emit(events.DOWN); + this.emit('down'); cb(); }, ); diff --git a/src/worker/worker.ts b/src/worker/worker.ts index 9a369ca..ee59d52 100644 --- a/src/worker/worker.ts +++ b/src/worker/worker.ts @@ -9,7 +9,6 @@ import { Ticker } from '../ticker/ticker'; import { ICallback } from '../../types'; -import { events } from '../events/events'; import { PowerSwitch } from '../power-switch/power-switch'; import { WorkerError } from './errors'; @@ -63,7 +62,7 @@ export abstract class Worker { const powerManager = this.getPowerManager(); powerManager.goingDown(); const ticker = this.getTicker(); - ticker.on(events.DOWN, () => { + ticker.on('down', () => { powerManager.commit(); cb(); }); diff --git a/types/event/event.ts b/types/event/event.ts new file mode 100644 index 0000000..21b9210 --- /dev/null +++ b/types/event/event.ts @@ -0,0 +1,18 @@ +/* + * Copyright (c) + * Weyoss + * https://github.com/weyoss + * + * This source code is licensed under the MIT license found in the LICENSE file + * in the root directory of this source tree. + */ + +export type TEvent = { + error: (err: Error) => void; + next: () => void; + up: () => void; + down: () => void; + goingUp: () => void; + goingDown: () => void; + tick: () => void; +}; diff --git a/types/event/index.ts b/types/event/index.ts new file mode 100644 index 0000000..43d10c2 --- /dev/null +++ b/types/event/index.ts @@ -0,0 +1,10 @@ +/* + * Copyright (c) + * Weyoss + * https://github.com/weyoss + * + * This source code is licensed under the MIT license found in the LICENSE file + * in the root directory of this source tree. + */ + +export * from './event'; diff --git a/types/index.ts b/types/index.ts index 80ec517..f236bbb 100644 --- a/types/index.ts +++ b/types/index.ts @@ -10,3 +10,4 @@ export * from './common'; export * from './redis'; export * from './logger'; +export * from './event';