import { Worker, Queue } from 'bullmq'; import { PrismaClient } from '@sdi/database'; import { ProvisioningOrchestrator } from './orchestration/provisioning-orchestrator'; import Redis from 'ioredis'; const connection = new Redis(process.env.REDIS_URL || 'redis://localhost:6379', { maxRetriesPerRequest: null, }); const prisma = new PrismaClient(); const orchestrator = new ProvisioningOrchestrator(prisma); // Provisioning queue worker const provisioningWorker = new Worker( 'provisioning', async (job) => { console.log(`Processing job ${job.id}: ${job.name}`); switch (job.name) { case 'provision-order': await orchestrator.provisionOrder(job.data.orderId); break; case 'modify-service': await orchestrator.modifyService(job.data.serviceId, job.data.changes); break; case 'suspend-service': await orchestrator.suspendService(job.data.serviceId); break; case 'terminate-service': await orchestrator.terminateService(job.data.serviceId); break; default: throw new Error(`Unknown job type: ${job.name}`); } }, { connection, concurrency: 5, limiter: { max: 10, duration: 1000, }, }, ); provisioningWorker.on('completed', (job) => { console.log(`✓ Job ${job.id} completed successfully`); }); provisioningWorker.on('failed', (job, err) => { console.error(`✗ Job ${job?.id} failed:`, err.message); }); // Graceful shutdown process.on('SIGTERM', async () => { console.log('SIGTERM received, closing worker...'); await provisioningWorker.close(); await prisma.$disconnect(); process.exit(0); }); console.log('🔧 Worker started and listening for jobs...');