import { Queue, Worker } from "bullmq"; import config from "../config"; import Repository from "../core/Repository"; import * as path from "path"; export let cacheQueue: Queue; export let removeQueue: Queue; export let downloadQueue: Queue; // avoid to load the queue outside the main server export function startWorker() { const connection = { host: config.REDIS_HOSTNAME, port: config.REDIS_PORT, }; cacheQueue = new Queue("cache removal", { connection, defaultJobOptions: { removeOnComplete: true, }, }); removeQueue = new Queue("repository removal", { connection: { host: config.REDIS_HOSTNAME, port: config.REDIS_PORT, }, defaultJobOptions: { removeOnComplete: true, }, }); downloadQueue = new Queue("repository download", { connection, defaultJobOptions: { removeOnComplete: true, }, }); const cacheWorker = new Worker( cacheQueue.name, path.resolve("build/queue/processes/removeCache.js"), { concurrency: 5, connection, autorun: true, } ); cacheWorker.on("completed", async (job) => { await job.remove(); }); const removeWorker = new Worker( removeQueue.name, path.resolve("build/queue/processes/removeRepository.js"), { concurrency: 5, connection, autorun: true, } ); removeWorker.on("completed", async (job) => { await job.remove(); }); const downloadWorker = new Worker( downloadQueue.name, path.resolve("build/queue/processes/downloadRepository.js"), { concurrency: 3, connection, autorun: true, } ); if (!downloadWorker.isRunning) downloadWorker.run(); downloadWorker.on("active", async (job) => { console.log("[QUEUE] download repository start", job.data.repoId); }); downloadWorker.on("completed", async (job) => { console.log("[QUEUE] download repository completed", job.data.repoId); }); downloadWorker.on("failed", async (job) => { console.log("download repository failed", job.data.repoId); }); }