@lokalise/fastify-extras
Version:
Opinionated set of fastify plugins, commonly used in Lokalise
57 lines • 2.21 kB
JavaScript
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