Skip to content

Commit

Permalink
feat(event-emitter)!: add typed EventEmitter, remove legacy events
Browse files Browse the repository at this point in the history
  • Loading branch information
weyoss committed Nov 26, 2023
1 parent c7d5e2d commit 65d57c3
Show file tree
Hide file tree
Showing 9 changed files with 76 additions and 27 deletions.
2 changes: 1 addition & 1 deletion index.ts
Expand Up @@ -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';
30 changes: 30 additions & 0 deletions src/event/event-emitter.ts
@@ -0,0 +1,30 @@
/*
* Copyright (c)
* Weyoss <weyoss@protonmail.com>
* 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<string | symbol, (...args: any) => any>; // type-coverage:ignore-line

export declare interface EventEmitter<Events extends TEventEmitterEvent>
extends Base {
on<E extends keyof Events>(event: E, listener: Events[E]): this;
once<E extends keyof Events>(event: E, listener: Events[E]): this;
emit<E extends keyof Events>(
event: E,
...args: Parameters<Events[E]>
): boolean;
removeAllListeners<E extends keyof Events>(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 {}
9 changes: 1 addition & 8 deletions src/events/events.ts → src/event/index.ts
Expand Up @@ -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';
15 changes: 7 additions & 8 deletions src/ticker/ticker.ts
Expand Up @@ -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<TEvent> {
protected powerManager = new PowerSwitch();
protected onTickFn: TFunction;
protected onNextTickFn: TFunction | null = null;
Expand All @@ -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 {
Expand All @@ -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`));
}
}

Expand All @@ -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) {
Expand Down
15 changes: 7 additions & 8 deletions src/worker/worker-runner/worker-runner.ts
Expand Up @@ -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<TEvent> {
private readonly powerManager: PowerSwitch;
private readonly ticker: Ticker;
private readonly lock: Lock;
Expand Down Expand Up @@ -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);
},
);
};
Expand All @@ -71,7 +70,7 @@ export class WorkerRunner extends EventEmitter {
};

private stopTicker = (cb: ICallback<void>) => {
this.ticker.once(events.DOWN, cb);
this.ticker.once('down', cb);
this.ticker.quit();
};

Expand All @@ -84,15 +83,15 @@ export class WorkerRunner extends EventEmitter {
}

run = (): void => {
this.emit(events.UP);
this.emit('up');
this.ticker.nextTick();
};

quit = (cb: ICallback<void>): void => {
async.waterfall(
[this.stopTicker, this.clearWorkerPool, this.releaseLock],
() => {
this.emit(events.DOWN);
this.emit('down');
cb();
},
);
Expand Down
3 changes: 1 addition & 2 deletions src/worker/worker.ts
Expand Up @@ -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';

Expand Down Expand Up @@ -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();
});
Expand Down
18 changes: 18 additions & 0 deletions types/event/event.ts
@@ -0,0 +1,18 @@
/*
* Copyright (c)
* Weyoss <weyoss@protonmail.com>
* 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;
};
10 changes: 10 additions & 0 deletions types/event/index.ts
@@ -0,0 +1,10 @@
/*
* Copyright (c)
* Weyoss <weyoss@protonmail.com>
* 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';
1 change: 1 addition & 0 deletions types/index.ts
Expand Up @@ -10,3 +10,4 @@
export * from './common';
export * from './redis';
export * from './logger';
export * from './event';

0 comments on commit 65d57c3

Please sign in to comment.