feat: async task pipeline for media and llm workflows

这个提交包含在:
cryptocommuniums-afk
2026-03-15 00:12:26 +08:00
父节点 1cc863e60e
当前提交 20e183d2da
修改 36 个文件,包含 1961 行新增339 行删除

47
server/worker.ts 普通文件
查看文件

@@ -0,0 +1,47 @@
import "dotenv/config";
import { ENV } from "./_core/env";
import * as db from "./db";
import { processBackgroundTask } from "./taskWorker";
const workerId = `app-worker-${process.pid}`;
function sleep(ms: number) {
return new Promise((resolve) => setTimeout(resolve, ms));
}
async function workOnce() {
await db.requeueStaleBackgroundTasks(new Date(Date.now() - ENV.backgroundTaskStaleMs));
const task = await db.claimNextBackgroundTask(workerId);
if (!task) {
return false;
}
try {
const result = await processBackgroundTask(task);
if (result !== null) {
await db.completeBackgroundTask(task.id, result, "任务执行完成");
}
} catch (error) {
const message = error instanceof Error ? error.message : "Unknown background task error";
await db.failBackgroundTask(task.id, message);
console.error(`[worker] task ${task.id} failed:`, error);
}
return true;
}
async function main() {
console.log(`[worker] ${workerId} started`);
for (;;) {
const hasWorked = await workOnce();
if (!hasWorked) {
await sleep(ENV.backgroundTaskPollMs);
}
}
}
main().catch((error) => {
console.error("[worker] fatal error", error);
process.exit(1);
});