import { CallbacksManager } from "./CallbacksManager"; import { IElementEvent, ElementId } from "./types"; export class EventsManager { public events: IElementEvent[] = []; protected resolve?: (events: IElementEvent) => void; protected timeoutId: number; constructor(protected callbacksManager: CallbacksManager) {} createEvent(elementId: ElementId, type: T["type"], params: T["params"]) { return this.callbacksManager.addCallback((value: T["value"]) => { const event = { elementId, // TODO why error? type: type as any, params, value, }; this.triggerEvent(event); }); } clearEventByElementId(elementId: ElementId) { this.events = this.events.filter((event) => event.elementId !== elementId); } clearEvents() { this.events = []; if (this.timeoutId) { clearTimeout(this.timeoutId); } } getEvents() { return this.events; } triggerEvent(event: IElementEvent) { if (this.resolve) { this.resolve(event); this.resolve = undefined; } else { this.events.push(event); } } next(): Promise { const event = this.events.shift(); if (event) { this.resolve = undefined; return Promise.resolve(event); } const promise = new Promise((resolve) => { this.resolve = resolve; }); return promise; } }