Files
researchChat/lib/queue.js
T

49 lines
1.1 KiB
JavaScript

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 };