@just-every/ensemble
Version:
LLM provider abstraction layer with unified streaming interface
68 lines • 2.07 kB
JavaScript
export class SequentialQueue {
queues = new Map();
processing = new Map();
async runSequential(agentId, fn) {
return new Promise((resolve, reject) => {
if (!this.queues.has(agentId)) {
this.queues.set(agentId, []);
this.processing.set(agentId, false);
}
const queue = this.queues.get(agentId);
queue.push({
execute: fn,
resolve,
reject,
});
if (!this.processing.get(agentId)) {
this.processQueue(agentId);
}
});
}
async processQueue(agentId) {
const queue = this.queues.get(agentId);
if (!queue || queue.length === 0) {
this.processing.set(agentId, false);
return;
}
this.processing.set(agentId, true);
while (queue.length > 0) {
const item = queue.shift();
try {
const result = await item.execute();
item.resolve(result);
}
catch (error) {
item.reject(error);
}
}
this.processing.set(agentId, false);
}
getQueueSize(agentId) {
const queue = this.queues.get(agentId);
return queue ? queue.length : 0;
}
isProcessing(agentId) {
return this.processing.get(agentId) || false;
}
clearQueue(agentId) {
const queue = this.queues.get(agentId);
if (queue) {
queue.forEach(item => {
item.reject(new Error('Queue cleared'));
});
queue.length = 0;
}
}
clearAll() {
this.queues.forEach((queue, agentId) => {
this.clearQueue(agentId);
});
this.queues.clear();
this.processing.clear();
}
}
export const sequentialQueue = new SequentialQueue();
export async function runSequential(agentId, fn) {
return sequentialQueue.runSequential(agentId, fn);
}
//# sourceMappingURL=sequential_queue.js.map