"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.addNotificationJob = exports.addAnalyticsJob = exports.initWorkers = exports.QUEUE_NAMES = void 0; const bullmq_1 = require("bullmq"); const config_1 = __importDefault(require("../config")); // Define queue names exports.QUEUE_NAMES = { ANALYTICS: 'analytics', NOTIFICATIONS: 'notifications', }; // Create Redis connection options const redisOptions = { host: config_1.default.bull.redis.host, port: config_1.default.bull.redis.port, password: config_1.default.bull.redis.password, }; // Create queues with error handling let analyticsQueue; let notificationsQueue; try { analyticsQueue = new bullmq_1.Queue(exports.QUEUE_NAMES.ANALYTICS, { connection: redisOptions, defaultJobOptions: { attempts: 3, backoff: { type: 'exponential', delay: 1000, }, }, }); notificationsQueue = new bullmq_1.Queue(exports.QUEUE_NAMES.NOTIFICATIONS, { connection: redisOptions, defaultJobOptions: { attempts: 3, backoff: { type: 'exponential', delay: 1000, }, }, }); } catch (error) { console.error('Error initializing BullMQ queues:', error); // Create mock queues for development analyticsQueue = { add: async (name, data) => { console.log(`Mock analytics job added: ${name}`, data); return { id: 'mock-job-id' }; }, close: async () => console.log('Mock analytics queue closed'), }; notificationsQueue = { add: async (name, data) => { console.log(`Mock notification job added: ${name}`, data); return { id: 'mock-job-id' }; }, close: async () => console.log('Mock notifications queue closed'), }; } // Initialize workers const initWorkers = () => { try { // Analytics worker const analyticsWorker = new bullmq_1.Worker(exports.QUEUE_NAMES.ANALYTICS, async (job) => { console.log(`Processing analytics job ${job.id}`); const { type, data } = job.data; switch (type) { case 'process_views': // Process view analytics console.log('Processing view analytics', data); break; case 'process_likes': // Process like analytics console.log('Processing like analytics', data); break; case 'process_followers': // Process follower analytics console.log('Processing follower analytics', data); break; default: console.log(`Unknown analytics job type: ${type}`); } }, { connection: redisOptions }); // Notifications worker const notificationsWorker = new bullmq_1.Worker(exports.QUEUE_NAMES.NOTIFICATIONS, async (job) => { console.log(`Processing notification job ${job.id}`); const { type, data } = job.data; switch (type) { case 'new_follower': // Send new follower notification console.log('Sending new follower notification', data); break; case 'new_like': // Send new like notification console.log('Sending new like notification', data); break; default: console.log(`Unknown notification job type: ${type}`); } }, { connection: redisOptions }); // Handle worker events analyticsWorker.on('completed', (job) => { console.log(`Analytics job ${job.id} completed`); }); analyticsWorker.on('failed', (job, err) => { console.error(`Analytics job ${job?.id} failed with error ${err.message}`); }); notificationsWorker.on('completed', (job) => { console.log(`Notification job ${job.id} completed`); }); notificationsWorker.on('failed', (job, err) => { console.error(`Notification job ${job?.id} failed with error ${err.message}`); }); return { analyticsWorker, notificationsWorker, }; } catch (error) { console.error('Error initializing BullMQ workers:', error); // Return mock workers return { analyticsWorker: { close: async () => console.log('Mock analytics worker closed'), }, notificationsWorker: { close: async () => console.log('Mock notifications worker closed'), }, }; } }; exports.initWorkers = initWorkers; // Helper function to add jobs to queues const addAnalyticsJob = async (type, data, options = {}) => { try { return await analyticsQueue.add(type, { type, data }, options); } catch (error) { console.error('Error adding analytics job:', error); console.log('Job details:', { type, data }); return null; } }; exports.addAnalyticsJob = addAnalyticsJob; const addNotificationJob = async (type, data, options = {}) => { try { return await notificationsQueue.add(type, { type, data }, options); } catch (error) { console.error('Error adding notification job:', error); console.log('Job details:', { type, data }); return null; } }; exports.addNotificationJob = addNotificationJob;