import { WithDocument } from "./Document"; export interface DATABASE_EVENTS { delete: (doc: WithDocument) => void; update: (oldDoc: WithDocument, newDoc: WithDocument) => void; create: (doc: WithDocument) => void; } export class BaseEvent { private _listeners: { [k in keyof DATABASE_EVENTS]?: DATABASE_EVENTS[k][]; } = {}; get listeners() { return { ...this._listeners }; } on>(event: K, cb: DATABASE_EVENTS[K]) { const asEvent = this._listeners[event] || []; this._listeners[event as any] = [...asEvent, cb]; } emit>( event: K, ...args: Parameters[K]> ): void { if (!(event in this._listeners) || !Array.isArray(this._listeners[event])) return; this._listeners[event]?.forEach((cb) => cb?.apply(null, args)); } removeListeners(): void; removeListeners(forEvent: keyof DATABASE_EVENTS): void; removeListeners(forEvent?: keyof DATABASE_EVENTS): void { if (forEvent) { this._listeners[forEvent] = []; } else { this._listeners = {}; } } }