fifteen/apps/web/lib/queue.ts
2026-03-01 21:59:44 +01:00

66 lines
2.1 KiB
TypeScript

import { Queue, QueueEvents } from "bullmq";
import { createBullMQConnection } from "./redis";
// Re-export shared job types so web code can import from one place
export type {
PipelineJobData,
DownloadPbfJobData,
ExtractPoisJobData,
GenerateGridJobData,
ComputeScoresJobData,
BuildValhallaJobData,
RefreshCityJobData,
JobProgress,
} from "@transportationer/shared";
export { JOB_OPTIONS } from "@transportationer/shared";
import type { PipelineJobData } from "@transportationer/shared";
// ─── Queue singleton ──────────────────────────────────────────────────────────
declare global {
// eslint-disable-next-line no-var
// eslint-disable-next-line @typescript-eslint/no-explicit-any
var __pipelineQueue: Queue<any> | undefined;
// eslint-disable-next-line no-var
// eslint-disable-next-line @typescript-eslint/no-explicit-any
var __valhallaQueue: Queue<any> | undefined;
}
// eslint-disable-next-line @typescript-eslint/no-explicit-any
export function getPipelineQueue(): Queue<any> {
if (!globalThis.__pipelineQueue) {
globalThis.__pipelineQueue = new Queue("pipeline", {
connection: createBullMQConnection(),
defaultJobOptions: {
attempts: 1,
removeOnComplete: { age: 86400 * 7 },
removeOnFail: { age: 86400 * 30 },
},
});
}
return globalThis.__pipelineQueue;
}
/** Queue for build-valhalla jobs, processed by the valhalla-worker container. */
// eslint-disable-next-line @typescript-eslint/no-explicit-any
export function getValhallaQueue(): Queue<any> {
if (!globalThis.__valhallaQueue) {
globalThis.__valhallaQueue = new Queue("valhalla", {
connection: createBullMQConnection(),
defaultJobOptions: {
attempts: 1,
removeOnComplete: { age: 86400 * 7 },
removeOnFail: { age: 86400 * 30 },
},
});
}
return globalThis.__valhallaQueue;
}
export function createQueueEvents(): QueueEvents {
return new QueueEvents("pipeline", {
connection: createBullMQConnection(),
});
}