import type { Emitter, ReadonlyEmitter } from '../../types'; import { SerialEmitter } from './SerialEmitter'; export class AggregatedEmitter implements ReadonlyEmitter { readonly #emitters = new WeakSet>(); readonly #rootEmitter: SerialEmitter; constructor(name: string) { this.#rootEmitter = new SerialEmitter(name); } add(emitter: Emitter): this { if (!this.#emitters.has(emitter)) { this.#emitters.add(emitter); emitter.on('*', (event: Event) => /* re-emit */ this.#rootEmitter.emit(event)); } return this; } on(type: Event['type'] | '*', listener: (event: Event) => unknown): this { this.#rootEmitter.on(type, listener); return this; } once(type: Event['type'] | '*', listener: (event: Event) => unknown): this { this.#rootEmitter.once(type, listener); return this; } off(type: Event['type'] | '*', listener: (event: Event) => unknown): this { this.#rootEmitter.off(type, listener); return this; } }