UNPKG

@lokalise/fastify-extras

Version:

Opinionated set of fastify plugins, commonly used in Lokalise

64 lines 2.43 kB
import { backgroundJobProcessorGetActiveQueueIds } from '@lokalise/background-jobs-common'; import { PromisePool } from '@supercharge/promise-pool'; import { Redis } from 'ioredis'; const QUEUE_DISCOVERY_CONCURRENCY = 3; export class AbstractRedisBasedQueueDiscoverer { redisConfigs; constructor(redisConfigs) { this.redisConfigs = redisConfigs; } async discoverQueues() { const { results, errors } = await PromisePool.withConcurrency(QUEUE_DISCOVERY_CONCURRENCY) .for(this.redisConfigs) .process((redisInstance) => this.discoverQueuesForInstance(redisInstance)); if (errors.length > 0) { // Throwing first error that was encountered throw errors[0]; } return results.flat(); } } export class RedisBasedQueueDiscoverer extends AbstractRedisBasedQueueDiscoverer { queuesPrefix; constructor(redisConfigs, queuesPrefix) { super(redisConfigs); this.queuesPrefix = queuesPrefix; } async discoverQueuesForInstance(redisConfig) { const redis = new Redis(redisConfig); const scanStream = redis.scanStream({ match: `${this.queuesPrefix}:*:meta`, }); const queues = new Set(); for await (const chunk of scanStream) { // biome-ignore lint/complexity/noForEach: <explanation> ; chunk .map((key) => { const parts = key.split(':'); if (parts.length < 3) return undefined; return parts[parts.length - 2]; // we need the part before to meta }) .filter((value) => !!value) // biome-ignore lint/style/noNonNullAssertion: undefined removed in previous filter .forEach((queue) => queues.add(queue)); } await redis.quit(); return Array.from(queues) .sort() .map((queueName) => ({ redisConfig, queueName, })); } } export class BackgroundJobsBasedQueueDiscoverer extends AbstractRedisBasedQueueDiscoverer { async discoverQueuesForInstance(redisConfig) { return backgroundJobProcessorGetActiveQueueIds(redisConfig).then((queueNames) => queueNames.map((queueName) => ({ redisConfig, queueName, }))); } } //# sourceMappingURL=queueDiscoverers.js.map