echos-ocr/src/lib/processing-queue.ts

45 lines
992 B
TypeScript
Raw Normal View History

import { processFile } from "./ocr";
const MAX_CONCURRENT = 2;
const queue: QueueItem[] = [];
let running = 0;
type QueueItem = {
jobId: string;
fileName: string;
fileBuffer: Buffer;
isPdf: boolean;
resolve: (ids: string[]) => void;
reject: (err: unknown) => void;
};
function drain() {
while (running < MAX_CONCURRENT && queue.length > 0) {
const item = queue.shift()!;
running++;
processFile(item.jobId, item.fileName, item.fileBuffer, item.isPdf)
.then(item.resolve)
.catch(item.reject)
.finally(() => {
running--;
drain();
});
}
}
export function enqueueProcessing(
jobId: string,
fileName: string,
fileBuffer: Buffer,
isPdf: boolean
): Promise<string[]> {
return new Promise((resolve, reject) => {
queue.push({ jobId, fileName, fileBuffer, isPdf, resolve, reject });
drain();
});
}
export function getQueueStatus() {
return { running, queued: queue.length, maxConcurrent: MAX_CONCURRENT };
}