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 | undefined; // eslint-disable-next-line no-var // eslint-disable-next-line @typescript-eslint/no-explicit-any var __valhallaQueue: Queue | undefined; } // eslint-disable-next-line @typescript-eslint/no-explicit-any export function getPipelineQueue(): Queue { 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 { 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(), }); }