eletrotupi / tcc/ api/src/lib/queue/WorkerRegistry.ts164355ee693dc3ac93d11260eab56ea45a2a76e0
1.1 KB | 41 lines Raw
1
import { Worker, WorkerOptions, Processor } from 'bullmq';
2
import { QueueName } from '@app/lib/queue/QueueRegistry';
3
import { mailProcessor } from  '@app/lib/queue/processors/mail';
4

5
type ProcessorMap = Record<QueueName, Processor>;
6

7
const processorMap: ProcessorMap = {
8
  mail: mailProcessor
9
};
10

11
// Per-queue concurrency
12
// TODO: When we process images, we need to bump for that queue
13
const concurrencyMap: Record<QueueName, number> = {
14
  mail: 10
15
};
16

17
const workers: Worker[] = [];
18

19
export function bootWorkers(): void {
20
  for (const [name, processor] of Object.entries(processorMap)) {
21
    const queueName = name as QueueName;
22

23
    const worker = new Worker(queueName, processor, {
24
      connection: {
25
        host: process.env.VALKEY_HOST,
26
        port: Number(process.env.VALKEY_PORT)
27
      },
28
      concurrency: concurrencyMap[queueName],
29
    } satisfies WorkerOptions);
30

31
    worker.on('failed', (job, err) => {
32
      console.error(`[${queueName}] job ${job?.id} failed:`, err.message);
33
    });
34

35
    workers.push(worker);
36
  }
37
}
38

39
export async function closeAllWorkers(): Promise<void> {
40
  await Promise.all(workers.map(w => w.close()));
41
}