import { Queue, Worker, QueueEvents } from 'bullmq' import { EmailService } from '../services/email' import { config } from '../config/env' import Redis from 'ioredis' interface EmailJob { to: string subject: string html: string text: string } const connection = new Redis(config.redis.url, { maxRetriesPerRequest: null }) export const emailQueue = new Queue('email', { connection, defaultJobOptions: { attempts: 3, backoff: { type: 'exponential', delay: 1000 } } }) const worker = new Worker( 'email', async (job) => { const emailService = new EmailService() await emailService.sendEmail(job.data) }, { connection, concurrency: 5, limiter: { max: 100, duration: 1000 * 60 // 100 emails per minute } } ) const queueEvents = new QueueEvents('email', { connection }) worker.on('completed', (job) => { console.log(`Email job ${job.id} completed`) }) worker.on('failed', (job, error) => { console.error(`Email job ${job?.id} failed:`, error) }) queueEvents.on('waiting', ({ jobId }) => { console.log(`Job ${jobId} is waiting`) }) process.on('SIGTERM', async () => { await worker.close() await connection.quit() })