48 行
1.2 KiB
TypeScript
48 行
1.2 KiB
TypeScript
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);
|
|
});
|