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