const { Worker, QueueScheduler, Queue } = require("bullmq"); const pino = require("pino"); const { makeRedis } = require("./lib/redis"); const path = require("path"); const fs = require("fs"); const log = pino(); const connection = makeRedis(); const plugins = new Map(); const pluginDir = path.join(__dirname, "plugins"); for (const f of fs.readdirSync(pluginDir)) { if (f.endsWith(".js")) { const p = require(path.join(pluginDir, f)); plugins.set(p.name, p); log.info({ plugin: p.name }, "loaded plugin"); } } new QueueScheduler("skynet", { connection }); const queue = new Queue("skynet", { connection }); const worker = new Worker("skynet", async job => { const plugin = plugins.get(job.name); if (!plugin) { log.warn({ job: job.name }, "no plugin found"); return; } await plugin.process(job, log); }, { connection, concurrency: 4 }); worker.on("failed", e => log.error({ err: e.message, jobId: e?.job?.id }, "job failed")); worker.on("error", e => log.error({ err: e.message }, "worker error")); // lightweight redis self heal loop setInterval(async () => { try { await connection.ping(); } catch { log.warn("redis ping failed trying to reconnect"); try { connection.disconnect(); } catch {} } }, 10_000);