starry / backend /omr-service /src /worker.ts
k-l-lambda's picture
Initial deployment: frontend + omr-service + cluster-server + nginx proxy
6f1c297
import { config } from './config.js';
import { predictPagesService } from './services/predict-pages.js';
import * as predictorService from './services/predictor.service.js';
interface PageTask {
taskId: string;
scoreId: string;
pageIndex: number;
imageData: Buffer;
}
interface AllPagesTask {
taskId: string;
scoreId: string;
imageDataList: Buffer[];
layoutList?: any[];
}
interface PredictPagesTask {
taskId: string;
scoreId: string;
predictPages: {
images: Array<{ data: Buffer; layout?: any; enableGauge?: boolean }>;
outputWidth?: number;
processes?: string[];
};
}
type TaskItem = PageTask | AllPagesTask | PredictPagesTask;
function isAllPagesTask(task: TaskItem): task is AllPagesTask {
return 'imageDataList' in task;
}
function isPredictPagesTask(task: TaskItem): task is PredictPagesTask {
return 'predictPages' in task;
}
class TaskWorker {
private queue: TaskItem[] = [];
private running = 0;
private maxConcurrent: number;
constructor(maxConcurrent: number = 2) {
this.maxConcurrent = maxConcurrent;
}
queueTask(task: TaskItem) {
this.queue.push(task);
this.processQueue();
}
private async processQueue() {
if (this.running >= this.maxConcurrent) {
return;
}
const task = this.queue.shift();
if (!task) {
return;
}
this.running++;
try {
if (isPredictPagesTask(task)) {
await predictPagesService({
taskId: task.taskId,
scoreId: task.scoreId,
...task.predictPages,
});
} else if (isAllPagesTask(task)) {
if (task.layoutList?.length) {
await predictorService.predictWithLayout({
taskId: task.taskId,
scoreId: task.scoreId,
imageDataList: task.imageDataList,
layoutList: task.layoutList,
});
} else {
await predictorService.predictAll({
taskId: task.taskId,
scoreId: task.scoreId,
imageDataList: task.imageDataList,
});
}
} else {
await predictorService.predictPage({
taskId: task.taskId,
scoreId: task.scoreId,
pageIndex: task.pageIndex,
imageData: task.imageData,
});
}
} catch (error) {
console.error(`Task ${task.taskId} failed:`, error);
} finally {
this.running--;
this.processQueue();
}
}
get pendingCount() {
return this.queue.length;
}
get runningCount() {
return this.running;
}
}
export const taskWorker = new TaskWorker(config.taskWorker.maxConcurrent);