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