UNPKG

@travetto/watch

Version:

Support for making files watchable during runtime

46 lines (38 loc) 1.41 kB
import { EventEmitter } from 'events'; import { ScanEntry } from '@travetto/boot'; export type StandardEventType = 'added' | 'addedDir' | 'removed' | 'removedDir' | 'changed'; export type AllEvent = { event: StandardEventType, entry: ScanEntry }; type Handler<T> = (payload: T) => void; /** * Standard pattern for watching and emitting */ export class WatchEmitter { protected suppress = false; #emitter = new EventEmitter(); constructor(maxListeners = -1) { if (maxListeners > 0) { this.#emitter.setMaxListeners(maxListeners); } } emit(type: 'all', payload: AllEvent): void; emit(type: StandardEventType, payload: ScanEntry): void; emit(type: 'error', payload: Error): void; emit(type: StandardEventType | 'all' | 'error', payload: unknown): void { if (!this.suppress) { if (type !== 'all' && type !== 'error') { this.#emitter.emit('all', { event: type, entry: payload }); } this.#emitter.emit(type, payload); } } on(type: 'all', handler: Handler<AllEvent>): this; on(type: StandardEventType, handler: Handler<ScanEntry>): this; on(type: 'error', handler: Handler<Error>): this; on<T extends AllEvent | ScanEntry | Error>(type: StandardEventType | 'all' | 'error', handler: Handler<T>): this { this.#emitter.on(type, handler); return this; } removeAllListeners(): void { this.#emitter.removeAllListeners(); } }