@lokalise/fastify-bullboard-plugin 1.1.3 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bullBoard.d.ts +1 -7
- package/dist/bullBoard.js +36 -26
- package/dist/bullBoard.js.map +1 -1
- package/package.json +1 -1
package/dist/bullBoard.d.ts
CHANGED
|
@@ -1,17 +1,11 @@
|
|
|
1
1
|
import { type RedisConfig } from '@lokalise/node-core';
|
|
2
2
|
import type { Queue, QueueOptions, RedisConnection } from 'bullmq';
|
|
3
|
-
import type { Redis } from 'ioredis';
|
|
4
3
|
export type BullBoardOptions = {
|
|
5
4
|
queueConstructor: QueueProConstructor | QueueConstructor;
|
|
6
5
|
basePath: string;
|
|
7
6
|
refreshIntervalInSeconds?: number;
|
|
8
|
-
} & ({
|
|
9
|
-
redisInstances: Redis[];
|
|
10
|
-
redisConfigs?: never;
|
|
11
|
-
} | {
|
|
12
|
-
redisInstances?: never;
|
|
13
7
|
redisConfigs: RedisConfig[];
|
|
14
|
-
}
|
|
8
|
+
};
|
|
15
9
|
export interface QueueProConstructor {
|
|
16
10
|
new (name: string, opts?: Record<string, unknown>): Queue;
|
|
17
11
|
}
|
package/dist/bullBoard.js
CHANGED
|
@@ -4,13 +4,15 @@ import { createBullBoard } from '@bull-board/api';
|
|
|
4
4
|
import { BullMQAdapter } from '@bull-board/api/bullMQAdapter.js';
|
|
5
5
|
import { FastifyAdapter } from '@bull-board/fastify';
|
|
6
6
|
import fastifySchedule from '@fastify/schedule';
|
|
7
|
-
import { backgroundJobProcessorGetActiveQueueIds,
|
|
7
|
+
import { backgroundJobProcessorGetActiveQueueIds, QUEUE_GROUP_DELIMITER, sanitizeRedisConfig, } from '@lokalise/background-jobs-common';
|
|
8
8
|
import { resolveGlobalErrorLogObject } from '@lokalise/node-core';
|
|
9
9
|
import fp from 'fastify-plugin';
|
|
10
|
+
import { Redis } from 'ioredis';
|
|
10
11
|
import { AsyncTask, SimpleIntervalJob } from 'toad-scheduler';
|
|
11
|
-
|
|
12
|
+
let currentQueues = [];
|
|
13
|
+
const containStatusCode = (error) => {
|
|
12
14
|
return Object.hasOwn(error, 'statusCode');
|
|
13
|
-
}
|
|
15
|
+
};
|
|
14
16
|
const bullBoardErrorHandler = (error) => {
|
|
15
17
|
const status = containStatusCode(error)
|
|
16
18
|
? error.statusCode
|
|
@@ -20,22 +22,31 @@ const bullBoardErrorHandler = (error) => {
|
|
|
20
22
|
body: { message: error.message, details: error.stack },
|
|
21
23
|
};
|
|
22
24
|
};
|
|
23
|
-
async
|
|
24
|
-
const queueIds = await Promise.all(
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
25
|
+
const getCurrentQueues = async (resolvedRedis, queueConstructor) => {
|
|
26
|
+
const queueIds = await Promise.all(resolvedRedis.map((e) => backgroundJobProcessorGetActiveQueueIds(e.redis)));
|
|
27
|
+
const queues = queueIds.flatMap((ids, index) => ids.map((id) => {
|
|
28
|
+
// biome-ignore lint/style/noNonNullAssertion: Should exist
|
|
29
|
+
const redisConfig = resolvedRedis[index];
|
|
30
|
+
return new queueConstructor(id, { connection: redisConfig.redis, prefix: redisConfig.prefix });
|
|
31
|
+
}));
|
|
32
|
+
return {
|
|
33
|
+
queues,
|
|
34
|
+
queuesAdapter: queues.map((queue) => new BullMQAdapter(queue, { delimiter: QUEUE_GROUP_DELIMITER })),
|
|
35
|
+
};
|
|
36
|
+
};
|
|
37
|
+
const replaceQueues = async (fastify, bullBoard, resolvedRedis, pluginOptions) => {
|
|
32
38
|
const { refreshIntervalInSeconds, queueConstructor } = pluginOptions;
|
|
39
|
+
fastify.log.debug({ refreshIntervalInSeconds }, 'Bull-dashboard -> updating queues');
|
|
40
|
+
const { queues: newQueues, queuesAdapter } = await getCurrentQueues(resolvedRedis, queueConstructor);
|
|
41
|
+
bullBoard.replaceQueues(queuesAdapter);
|
|
42
|
+
await Promise.all(currentQueues.map((queue) => queue.disconnect()));
|
|
43
|
+
currentQueues = newQueues;
|
|
44
|
+
};
|
|
45
|
+
const scheduleUpdates = async (fastify, bullBoard, resolvedRedis, pluginOptions) => {
|
|
46
|
+
const { refreshIntervalInSeconds } = pluginOptions;
|
|
33
47
|
if (!refreshIntervalInSeconds || refreshIntervalInSeconds <= 0)
|
|
34
48
|
return;
|
|
35
|
-
const refreshTask = new AsyncTask('Bull-board - update queues',
|
|
36
|
-
fastify.log.debug({ refreshIntervalInSeconds }, 'Bull-dashboard -> updating queues');
|
|
37
|
-
bullBoard.replaceQueues(await getCurrentQueues(resolvedRedisInstances, queueConstructor));
|
|
38
|
-
}, (e) => fastify.log.error(resolveGlobalErrorLogObject(e)));
|
|
49
|
+
const refreshTask = new AsyncTask('Bull-board - update queues', () => replaceQueues(fastify, bullBoard, resolvedRedis, pluginOptions), (e) => fastify.log.error(resolveGlobalErrorLogObject(e)));
|
|
39
50
|
// if scheduler is not registered, register it
|
|
40
51
|
if (!fastify.scheduler)
|
|
41
52
|
await fastify.register(fastifySchedule);
|
|
@@ -43,20 +54,19 @@ async function scheduleUpdates(fastify, bullBoard, resolvedRedisInstances, plugi
|
|
|
43
54
|
id: 'bull-board-queues-update',
|
|
44
55
|
preventOverrun: true,
|
|
45
56
|
}));
|
|
46
|
-
}
|
|
47
|
-
const resolveRedisInstances = (options) => {
|
|
48
|
-
if (options.redisInstances)
|
|
49
|
-
return options.redisInstances;
|
|
50
|
-
if (options.redisConfigs)
|
|
51
|
-
return options.redisConfigs.map(createSanitizedRedisClient);
|
|
52
|
-
throw new Error('Either `redisInstances` or `redisConfigs` must be provided in BullBoardOptions');
|
|
53
57
|
};
|
|
58
|
+
const resolveRedis = (options) => options.redisConfigs.map((config) => ({
|
|
59
|
+
redis: new Redis(sanitizeRedisConfig(config)),
|
|
60
|
+
prefix: config.keyPrefix,
|
|
61
|
+
}));
|
|
54
62
|
const plugin = async (fastify, pluginOptions) => {
|
|
55
63
|
const { basePath, queueConstructor } = pluginOptions;
|
|
56
|
-
const
|
|
64
|
+
const resolvedRedis = resolveRedis(pluginOptions);
|
|
65
|
+
const { queues, queuesAdapter } = await getCurrentQueues(resolvedRedis, queueConstructor);
|
|
66
|
+
currentQueues = queues;
|
|
57
67
|
const serverAdapter = new FastifyAdapter();
|
|
58
68
|
const bullBoard = createBullBoard({
|
|
59
|
-
queues:
|
|
69
|
+
queues: queuesAdapter,
|
|
60
70
|
serverAdapter,
|
|
61
71
|
});
|
|
62
72
|
// biome-ignore lint/suspicious/noExplicitAny: bull-board is not exporting this type
|
|
@@ -65,7 +75,7 @@ const plugin = async (fastify, pluginOptions) => {
|
|
|
65
75
|
await fastify.register(serverAdapter.registerPlugin(), {
|
|
66
76
|
prefix: basePath,
|
|
67
77
|
});
|
|
68
|
-
await scheduleUpdates(fastify, bullBoard,
|
|
78
|
+
await scheduleUpdates(fastify, bullBoard, resolvedRedis, pluginOptions);
|
|
69
79
|
};
|
|
70
80
|
export const bullBoard = fp(plugin, {
|
|
71
81
|
fastify: '>=4.0.0',
|
package/dist/bullBoard.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bullBoard.js","sourceRoot":"","sources":["../src/bullBoard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,IAAI,aAAa,EAAE,MAAM,YAAY,CAAA;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AACjD,aAAa;AACb,OAAO,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAA;AAChE,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AACpD,OAAO,eAAe,MAAM,mBAAmB,CAAA;AAC/C,OAAO,EACL,uCAAuC,EACvC,
|
|
1
|
+
{"version":3,"file":"bullBoard.js","sourceRoot":"","sources":["../src/bullBoard.ts"],"names":[],"mappings":"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"}
|