UNPKG

@lokalise/fastify-extras

Version:

Opinionated set of fastify plugins, commonly used in Lokalise

57 lines 2.21 kB
import { backgroundJobProcessorGetActiveQueueIds, createSanitizedRedisClient, } from '@lokalise/background-jobs-common'; import { PromisePool } from '@supercharge/promise-pool'; 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 = createSanitizedRedisClient(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) => key.split(':')[1]) .filter((value) => !!value) // biome-ignore lint/style/noNonNullAssertion: undefined removed in previous filter .forEach((queue) => queues.add(queue)); } 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