const { EventEmitter } = require('node:events'); const events = new EventEmitter(); events.setMaxListeners(100); let queue = []; let running = false; /** Einen Job anmelden. Läuft sofort, wenn nichts anderes läuft, sonst wartet er. */ function enqueue(job) { queue.push(job); events.emit('job-queued', job.sessionId); processNext(); } /** Job aus der Warteschlange holen und ausführen. */ async function processNext() { if (running || queue.length === 0) return; const job = queue.shift(); running = true; try { await job.run(); } catch (e) { job.onError?.(e); } finally { running = false; events.emit('job-finished', job.sessionId); processNext(); } } function queuedBefore(sessionId) { return queue.findIndex((j) => j.sessionId === sessionId); } function isRunning(sessionId) { return running; } function cancelQueued(sessionId) { queue = queue.filter((j) => j.sessionId !== sessionId); } function state() { return { running, queued: queue.map((j) => j.sessionId) }; } module.exports = { events, enqueue, queuedBefore, isRunning, cancelQueued, state };