import { Task } from './taskbuffer.classes.task.js'; import { logger } from './taskbuffer.logging.js'; export class BufferRunner { public task: Task; // initialize by default public bufferCounter: number = 0; constructor(taskArg: Task) { this.task = taskArg; } public trigger(x: any): Promise { if (!(this.bufferCounter >= this.task.bufferMax)) { this.bufferCounter++; } const returnPromise: Promise = this.task.cycleCounter.getPromiseForCycle(this.bufferCounter); if (!this.task.running) { this._run(x); } return returnPromise; } private async _run(x: any) { this.task.running = true; while (this.bufferCounter > 0) { try { const result = await Task.runTask(this.task, { x: x }); this.bufferCounter--; this.task.cycleCounter.informOfCycle(result); } catch (err) { logger.log('error', `BufferRunner: task "${this.task.name || 'unnamed'}" failed: ${err instanceof Error ? err.message : String(err)}`); this.bufferCounter--; if (this.task.catchErrors) { this.task.cycleCounter.informOfCycle(undefined); } else { this.task.cycleCounter.informOfCycleError(err instanceof Error ? err : new Error(String(err))); } } } this.task.running = false; } }