@deenruv/job-queue-plugin 1.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.
Files changed (48) hide show
  1. package/LICENSE +23 -0
  2. package/README.md +94 -0
  3. package/package/bullmq/bullmq-job-queue-strategy.d.ts +39 -0
  4. package/package/bullmq/bullmq-job-queue-strategy.js +362 -0
  5. package/package/bullmq/bullmq-job-queue-strategy.js.map +1 -0
  6. package/package/bullmq/constants.d.ts +4 -0
  7. package/package/bullmq/constants.js +16 -0
  8. package/package/bullmq/constants.js.map +1 -0
  9. package/package/bullmq/index.d.ts +2 -0
  10. package/package/bullmq/index.js +27 -0
  11. package/package/bullmq/index.js.map +1 -0
  12. package/package/bullmq/plugin.d.ts +133 -0
  13. package/package/bullmq/plugin.js +171 -0
  14. package/package/bullmq/plugin.js.map +1 -0
  15. package/package/bullmq/redis-health-check-strategy.d.ts +6 -0
  16. package/package/bullmq/redis-health-check-strategy.js +15 -0
  17. package/package/bullmq/redis-health-check-strategy.js.map +1 -0
  18. package/package/bullmq/redis-health-indicator.d.ts +8 -0
  19. package/package/bullmq/redis-health-indicator.js +80 -0
  20. package/package/bullmq/redis-health-indicator.js.map +1 -0
  21. package/package/bullmq/redis-job-buffer-storage-strategy.d.ts +16 -0
  22. package/package/bullmq/redis-job-buffer-storage-strategy.js +82 -0
  23. package/package/bullmq/redis-job-buffer-storage-strategy.js.map +1 -0
  24. package/package/bullmq/scripts/get-jobs-by-type.d.ts +10 -0
  25. package/package/bullmq/scripts/get-jobs-by-type.js +114 -0
  26. package/package/bullmq/scripts/get-jobs-by-type.js.map +1 -0
  27. package/package/bullmq/types.d.ts +101 -0
  28. package/package/bullmq/types.js +3 -0
  29. package/package/bullmq/types.js.map +1 -0
  30. package/package/index.d.ts +4 -0
  31. package/package/index.js +8 -0
  32. package/package/index.js.map +1 -0
  33. package/package/pub-sub/constants.d.ts +2 -0
  34. package/package/pub-sub/constants.js +6 -0
  35. package/package/pub-sub/constants.js.map +1 -0
  36. package/package/pub-sub/index.d.ts +2 -0
  37. package/package/pub-sub/index.js +19 -0
  38. package/package/pub-sub/index.js.map +1 -0
  39. package/package/pub-sub/options.d.ts +13 -0
  40. package/package/pub-sub/options.js +3 -0
  41. package/package/pub-sub/options.js.map +1 -0
  42. package/package/pub-sub/plugin.d.ts +6 -0
  43. package/package/pub-sub/plugin.js +36 -0
  44. package/package/pub-sub/plugin.js.map +1 -0
  45. package/package/pub-sub/pub-sub-job-queue-strategy.d.ts +16 -0
  46. package/package/pub-sub/pub-sub-job-queue-strategy.js +123 -0
  47. package/package/pub-sub/pub-sub-job-queue-strategy.js.map +1 -0
  48. package/package.json +42 -0
package/LICENSE ADDED
@@ -0,0 +1,23 @@
1
+ # License 1
2
+
3
+ The MIT License
4
+
5
+ Copyright (c) 2025-present Aexol
6
+
7
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
8
+
9
+ The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
10
+
11
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
12
+
13
+ # License 2
14
+
15
+ The MIT License
16
+
17
+ Copyright (c) 2018-2025 Michael Bromley
18
+
19
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
20
+
21
+ The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
22
+
23
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,94 @@
1
+ # @deenruv/job-queue-plugin
2
+
3
+ Alternate `JobQueueStrategy` implementations for Deenruv, providing scalable alternatives to the default database-polling approach.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ pnpm add @deenruv/job-queue-plugin
9
+ ```
10
+
11
+ ## Sub-Plugins
12
+
13
+ ### BullMQJobQueuePlugin
14
+
15
+ A drop-in replacement for `DefaultJobQueuePlugin` using [BullMQ](https://github.com/taskforcesh/bullmq) with Redis for push-based job processing.
16
+
17
+ ```bash
18
+ pnpm add bullmq
19
+ ```
20
+
21
+ ```typescript
22
+ import { BullMQJobQueuePlugin } from '@deenruv/job-queue-plugin/package/bullmq';
23
+
24
+ const config = {
25
+ plugins: [
26
+ // Remove DefaultJobQueuePlugin first
27
+ BullMQJobQueuePlugin.init({
28
+ connection: {
29
+ host: 'localhost',
30
+ port: 6379,
31
+ },
32
+ workerOptions: {
33
+ concurrency: 10,
34
+ },
35
+ }),
36
+ ],
37
+ };
38
+ ```
39
+
40
+ **Options:**
41
+
42
+ | Option | Type | Default | Description |
43
+ |--------|------|---------|-------------|
44
+ | `connection` | `ConnectionOptions` | `127.0.0.1:6379` | Redis connection options |
45
+ | `queueOptions` | `QueueOptions` | - | BullMQ Queue instance options |
46
+ | `workerOptions` | `WorkerOptions` | `{ concurrency: 3 }` | BullMQ Worker instance options |
47
+ | `setRetries` | `fn(queueName, job) => number` | - | Override retry count per queue/job |
48
+ | `setBackoff` | `fn(queueName, job) => BackoffOptions` | exponential/1000ms | Custom backoff strategy for retries |
49
+
50
+ **Advantages over DefaultJobQueuePlugin:**
51
+
52
+ - Push-based (no polling) - significantly lower DB load
53
+ - Jobs stored in Redis instead of the database
54
+ - Much better scalability with multiple workers
55
+ - Lower latency in job processing
56
+ - Built-in Redis health checks
57
+ - Auto-cleanup of completed/failed jobs (30 days or 5,000 jobs by default)
58
+
59
+ ### PubSubPlugin
60
+
61
+ Uses [Google Cloud Pub/Sub](https://cloud.google.com/pubsub) for the Deenruv job queue, suitable for GCP-based deployments.
62
+
63
+ ```bash
64
+ pnpm add @google-cloud/pubsub
65
+ ```
66
+
67
+ ```typescript
68
+ import { PubSubPlugin } from '@deenruv/job-queue-plugin/package/pub-sub';
69
+
70
+ const config = {
71
+ plugins: [
72
+ PubSubPlugin.init({
73
+ // PubSub options
74
+ }),
75
+ ],
76
+ };
77
+ ```
78
+
79
+ ## Features
80
+
81
+ - BullMQ: Push-based Redis job queue with configurable concurrency
82
+ - BullMQ: Redis health indicator for monitoring
83
+ - BullMQ: Configurable retry strategies (exponential/fixed backoff)
84
+ - BullMQ: Automatic cleanup of old completed/failed jobs
85
+ - Pub/Sub: Google Cloud native job queue strategy
86
+ - Both are drop-in replacements for DefaultJobQueuePlugin
87
+
88
+ ## Admin UI
89
+
90
+ Server-only plugin. No Admin UI extensions.
91
+
92
+ ## API Extensions
93
+
94
+ No GraphQL API extensions. These plugins configure the internal job queue strategy.
@@ -0,0 +1,39 @@
1
+ import { JobListOptions } from "@deenruv/common/lib/generated-types";
2
+ import { ID, Injector, InspectableJobQueueStrategy, Job, JobData, PaginatedList } from "@deenruv/core";
3
+ /**
4
+ * @description
5
+ * This JobQueueStrategy uses [BullMQ](https://docs.bullmq.io/) to implement a push-based job queue
6
+ * on top of Redis. It should not be used alone, but as part of the {@link BullMQJobQueuePlugin}.
7
+ *
8
+ * @docsCategory core plugins/JobQueuePlugin
9
+ */
10
+ export declare class BullMQJobQueueStrategy implements InspectableJobQueueStrategy {
11
+ private redisConnection;
12
+ private connectionOptions;
13
+ private queue;
14
+ private worker;
15
+ private workerProcessor;
16
+ private options;
17
+ private queueNameProcessFnMap;
18
+ private cancellationSub;
19
+ private cancelRunningJob$;
20
+ private readonly CANCEL_JOB_CHANNEL;
21
+ private readonly CANCELLED_JOB_LIST_NAME;
22
+ init(injector: Injector): Promise<void>;
23
+ destroy(): Promise<void>;
24
+ add<Data extends JobData<Data> = object>(job: Job<Data>): Promise<Job<Data>>;
25
+ cancelJob(jobId: string): Promise<Job | undefined>;
26
+ findMany(options?: JobListOptions): Promise<PaginatedList<Job>>;
27
+ findManyById(ids: ID[]): Promise<Job[]>;
28
+ findOne(id: ID): Promise<Job | undefined>;
29
+ removeSettledJobs(queueNames?: string[], olderThan?: Date): Promise<number>;
30
+ start<Data extends JobData<Data> = object>(queueName: string, process: (job: Job<Data>) => Promise<any>): Promise<void>;
31
+ private subscribeToCancellationEvents;
32
+ private stopped;
33
+ stop<Data extends JobData<Data> = object>(queueName: string, process: (job: Job<Data>) => Promise<any>): Promise<void>;
34
+ private setActiveJobAsCancelled;
35
+ private createDeenruvJob;
36
+ private getState;
37
+ private callCustomScript;
38
+ private defineCustomLuaScripts;
39
+ }
@@ -0,0 +1,362 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BullMQJobQueueStrategy = void 0;
4
+ const generated_types_1 = require("@deenruv/common/lib/generated-types");
5
+ const shared_utils_1 = require("@deenruv/common/lib/shared-utils");
6
+ const core_1 = require("@deenruv/core");
7
+ const bullmq_1 = require("bullmq");
8
+ const events_1 = require("events");
9
+ const ioredis_1 = require("ioredis");
10
+ const rxjs_1 = require("rxjs");
11
+ const operators_1 = require("rxjs/operators");
12
+ const constants_1 = require("./constants");
13
+ const redis_health_indicator_1 = require("./redis-health-indicator");
14
+ const get_jobs_by_type_1 = require("./scripts/get-jobs-by-type");
15
+ const QUEUE_NAME = "deenruv-job-queue";
16
+ const DEFAULT_CONCURRENCY = 3;
17
+ /**
18
+ * @description
19
+ * This JobQueueStrategy uses [BullMQ](https://docs.bullmq.io/) to implement a push-based job queue
20
+ * on top of Redis. It should not be used alone, but as part of the {@link BullMQJobQueuePlugin}.
21
+ *
22
+ * @docsCategory core plugins/JobQueuePlugin
23
+ */
24
+ class BullMQJobQueueStrategy {
25
+ constructor() {
26
+ this.queueNameProcessFnMap = new Map();
27
+ this.cancelRunningJob$ = new rxjs_1.Subject();
28
+ this.CANCEL_JOB_CHANNEL = "cancel-job";
29
+ this.CANCELLED_JOB_LIST_NAME = "deenruv:cancelled-jobs";
30
+ this.subscribeToCancellationEvents = (channel, jobId) => {
31
+ if (channel === this.CANCEL_JOB_CHANNEL && jobId) {
32
+ this.cancelRunningJob$.next(jobId);
33
+ }
34
+ };
35
+ this.stopped = false;
36
+ }
37
+ async init(injector) {
38
+ var _a, _b, _c, _d, _e;
39
+ const options = injector.get(constants_1.BULLMQ_PLUGIN_OPTIONS);
40
+ this.options = Object.assign(Object.assign({}, options), { workerOptions: Object.assign(Object.assign({}, options.workerOptions), { removeOnComplete: (_b = (_a = options.workerOptions) === null || _a === void 0 ? void 0 : _a.removeOnComplete) !== null && _b !== void 0 ? _b : {
41
+ age: 60 * 60 * 24 * 30,
42
+ count: 5000,
43
+ }, removeOnFail: (_d = (_c = options.workerOptions) === null || _c === void 0 ? void 0 : _c.removeOnFail) !== null && _d !== void 0 ? _d : {
44
+ age: 60 * 60 * 24 * 30,
45
+ count: 5000,
46
+ } }) });
47
+ this.connectionOptions =
48
+ (_e = options.connection) !== null && _e !== void 0 ? _e : {
49
+ host: "localhost",
50
+ port: 6379,
51
+ maxRetriesPerRequest: null,
52
+ };
53
+ this.redisConnection =
54
+ this.connectionOptions instanceof events_1.EventEmitter
55
+ ? this.connectionOptions
56
+ : new ioredis_1.Redis(this.connectionOptions);
57
+ this.defineCustomLuaScripts();
58
+ const redisHealthIndicator = injector.get(redis_health_indicator_1.RedisHealthIndicator);
59
+ core_1.Logger.info("Checking Redis connection...", constants_1.loggerCtx);
60
+ const health = await redisHealthIndicator.isHealthy("redis");
61
+ if (health.redis.status === "down") {
62
+ core_1.Logger.error("Could not connect to Redis", constants_1.loggerCtx);
63
+ }
64
+ else {
65
+ core_1.Logger.info("Connected to Redis ✔", constants_1.loggerCtx);
66
+ }
67
+ this.queue = new bullmq_1.Queue(QUEUE_NAME, Object.assign(Object.assign({}, options.queueOptions), { connection: this.redisConnection }))
68
+ .on("error", (e) => core_1.Logger.error(`BullMQ Queue error: ${JSON.stringify(e.message)}`, constants_1.loggerCtx, e.stack))
69
+ .on("resumed", () => core_1.Logger.verbose("BullMQ Queue resumed", constants_1.loggerCtx))
70
+ .on("paused", () => core_1.Logger.verbose("BullMQ Queue paused", constants_1.loggerCtx));
71
+ if (await this.queue.isPaused()) {
72
+ await this.queue.resume();
73
+ }
74
+ this.workerProcessor = async (bullJob) => {
75
+ var _a, _b, _c;
76
+ const queueName = bullJob.name;
77
+ core_1.Logger.debug(`Job ${(_a = bullJob.id) !== null && _a !== void 0 ? _a : ""} [${queueName}] starting (attempt ${bullJob.attemptsMade + 1} of ${(_b = bullJob.opts.attempts) !== null && _b !== void 0 ? _b : 1})`);
78
+ const processFn = this.queueNameProcessFnMap.get(queueName);
79
+ if (processFn) {
80
+ const job = await this.createDeenruvJob(bullJob);
81
+ const completed$ = new rxjs_1.Subject();
82
+ try {
83
+ // eslint-disable-next-line
84
+ job.on('progress', _job => bullJob.updateProgress(_job.progress));
85
+ this.cancelRunningJob$
86
+ .pipe((0, operators_1.filter)((jobId) => jobId === job.id), (0, operators_1.takeUntil)(completed$))
87
+ .subscribe(() => {
88
+ var _a;
89
+ core_1.Logger.info(`Setting job ${(_a = job.id) !== null && _a !== void 0 ? _a : ""} as cancelled`, constants_1.loggerCtx);
90
+ job.cancel();
91
+ });
92
+ const result = await processFn(job);
93
+ await bullJob.updateProgress(100);
94
+ return result;
95
+ }
96
+ catch (e) {
97
+ throw e;
98
+ }
99
+ finally {
100
+ if (job.id) {
101
+ await this.redisConnection.srem(this.CANCELLED_JOB_LIST_NAME, (_c = job.id) === null || _c === void 0 ? void 0 : _c.toString());
102
+ }
103
+ completed$.next();
104
+ completed$.complete();
105
+ }
106
+ }
107
+ throw new core_1.InternalServerError(`No processor defined for the queue "${queueName}"`);
108
+ };
109
+ // Subscription-mode Redis connection for the cancellation messages
110
+ this.cancellationSub = new ioredis_1.Redis(this.connectionOptions);
111
+ }
112
+ async destroy() {
113
+ var _a;
114
+ await Promise.all([this.queue.close(), (_a = this.worker) === null || _a === void 0 ? void 0 : _a.close()]);
115
+ }
116
+ async add(job) {
117
+ var _a, _b, _c, _d, _e, _f, _g;
118
+ const retries = (_d = (_c = (_b = (_a = this.options).setRetries) === null || _b === void 0 ? void 0 : _b.call(_a, job.queueName, job)) !== null && _c !== void 0 ? _c : job.retries) !== null && _d !== void 0 ? _d : 0;
119
+ const backoff = (_g = (_f = (_e = this.options).setBackoff) === null || _f === void 0 ? void 0 : _f.call(_e, job.queueName, job)) !== null && _g !== void 0 ? _g : {
120
+ delay: 1000,
121
+ type: "exponential",
122
+ };
123
+ const bullJob = await this.queue.add(job.queueName, job.data, {
124
+ attempts: retries + 1,
125
+ backoff,
126
+ });
127
+ return this.createDeenruvJob(bullJob);
128
+ }
129
+ async cancelJob(jobId) {
130
+ const bullJob = await this.queue.getJob(jobId);
131
+ if (bullJob) {
132
+ if (await bullJob.isActive()) {
133
+ await this.setActiveJobAsCancelled(jobId);
134
+ return this.createDeenruvJob(bullJob);
135
+ }
136
+ else {
137
+ try {
138
+ const job = await this.createDeenruvJob(bullJob);
139
+ await bullJob.remove();
140
+ return job;
141
+ }
142
+ catch (e) {
143
+ const message = `Error when cancelling job: ${JSON.stringify(e.message)}`;
144
+ core_1.Logger.error(message, constants_1.loggerCtx);
145
+ throw new core_1.InternalServerError(message);
146
+ }
147
+ }
148
+ }
149
+ }
150
+ async findMany(options) {
151
+ var _a, _b, _c, _d, _e, _f, _g;
152
+ const skip = (_a = options === null || options === void 0 ? void 0 : options.skip) !== null && _a !== void 0 ? _a : 0;
153
+ const take = (_b = options === null || options === void 0 ? void 0 : options.take) !== null && _b !== void 0 ? _b : 10;
154
+ let jobTypes = constants_1.ALL_JOB_TYPES;
155
+ const stateFilter = (_c = options === null || options === void 0 ? void 0 : options.filter) === null || _c === void 0 ? void 0 : _c.state;
156
+ if (stateFilter === null || stateFilter === void 0 ? void 0 : stateFilter.eq) {
157
+ switch (stateFilter.eq) {
158
+ case "PENDING":
159
+ jobTypes = ["wait"];
160
+ break;
161
+ case "RUNNING":
162
+ jobTypes = ["active"];
163
+ break;
164
+ case "COMPLETED":
165
+ jobTypes = ["completed"];
166
+ break;
167
+ case "RETRYING":
168
+ jobTypes = ["repeat"];
169
+ break;
170
+ case "FAILED":
171
+ jobTypes = ["failed"];
172
+ break;
173
+ case "CANCELLED":
174
+ jobTypes = ["failed"];
175
+ break;
176
+ }
177
+ }
178
+ const settledFilter = (_d = options === null || options === void 0 ? void 0 : options.filter) === null || _d === void 0 ? void 0 : _d.isSettled;
179
+ if ((settledFilter === null || settledFilter === void 0 ? void 0 : settledFilter.eq) != null) {
180
+ jobTypes =
181
+ settledFilter.eq === true
182
+ ? ["completed", "failed"]
183
+ : [
184
+ "wait",
185
+ "waiting-children",
186
+ "active",
187
+ "repeat",
188
+ "delayed",
189
+ "paused",
190
+ ];
191
+ }
192
+ let items = [];
193
+ let totalItems = 0;
194
+ try {
195
+ const [total, jobIds] = await this.callCustomScript(get_jobs_by_type_1.getJobsByType, [
196
+ skip,
197
+ take,
198
+ (_g = (_f = (_e = options === null || options === void 0 ? void 0 : options.filter) === null || _e === void 0 ? void 0 : _e.queueName) === null || _f === void 0 ? void 0 : _f.eq) !== null && _g !== void 0 ? _g : "",
199
+ ...jobTypes,
200
+ ]);
201
+ items = (await Promise.all(jobIds.map((id) => {
202
+ return bullmq_1.Job.fromId(this.queue, id);
203
+ }))).filter(shared_utils_1.notNullOrUndefined);
204
+ totalItems = total;
205
+ }
206
+ catch (e) {
207
+ throw new core_1.InternalServerError(e.message);
208
+ }
209
+ return {
210
+ items: await Promise.all(items.map((bullJob) => this.createDeenruvJob(bullJob))),
211
+ totalItems,
212
+ };
213
+ }
214
+ async findManyById(ids) {
215
+ const bullJobs = await Promise.all(ids.map((id) => this.queue.getJob(id.toString())));
216
+ return Promise.all(bullJobs.filter(shared_utils_1.notNullOrUndefined).map((j) => this.createDeenruvJob(j)));
217
+ }
218
+ async findOne(id) {
219
+ const bullJob = await this.queue.getJob(id.toString());
220
+ if (bullJob) {
221
+ return this.createDeenruvJob(bullJob);
222
+ }
223
+ }
224
+ // TODO V2: actually make it use the olderThan parameter
225
+ async removeSettledJobs(queueNames, olderThan) {
226
+ try {
227
+ const jobCounts = await this.queue.getJobCounts("completed", "failed");
228
+ await this.queue.clean(100, 0, "completed");
229
+ await this.queue.clean(100, 0, "failed");
230
+ return Object.values(jobCounts).reduce((sum, num) => sum + num, 0);
231
+ }
232
+ catch (e) {
233
+ core_1.Logger.error(e.message, constants_1.loggerCtx, e.stack);
234
+ return 0;
235
+ }
236
+ }
237
+ async start(queueName, process) {
238
+ this.queueNameProcessFnMap.set(queueName, process);
239
+ if (!this.worker) {
240
+ const options = Object.assign(Object.assign({ concurrency: DEFAULT_CONCURRENCY }, this.options.workerOptions), { connection: this.redisConnection });
241
+ this.worker = new bullmq_1.Worker(QUEUE_NAME, this.workerProcessor, options)
242
+ .on("error", (e) => core_1.Logger.error(`BullMQ Worker error: ${e.message}`, constants_1.loggerCtx, e.stack))
243
+ .on("closing", (e) => core_1.Logger.verbose(`BullMQ Worker closing: ${e}`, constants_1.loggerCtx))
244
+ .on("closed", () => core_1.Logger.verbose("BullMQ Worker closed", constants_1.loggerCtx))
245
+ .on("failed", (job, error) => {
246
+ var _a, _b, _c, _d;
247
+ core_1.Logger.warn(`Job ${(_a = job === null || job === void 0 ? void 0 : job.id) !== null && _a !== void 0 ? _a : "(unknown id)"} [${(_b = job === null || job === void 0 ? void 0 : job.name) !== null && _b !== void 0 ? _b : "unknown name"}] failed (attempt ${(_c = job === null || job === void 0 ? void 0 : job.attemptsMade) !== null && _c !== void 0 ? _c : "unknown"} of ${(_d = job === null || job === void 0 ? void 0 : job.opts.attempts) !== null && _d !== void 0 ? _d : 1})`, constants_1.loggerCtx);
248
+ })
249
+ .on("stalled", (jobId) => {
250
+ core_1.Logger.warn(`BullMQ Worker: job ${jobId} stalled`, constants_1.loggerCtx);
251
+ })
252
+ .on("completed", (job) => {
253
+ var _a;
254
+ core_1.Logger.debug(`Job ${(_a = job === null || job === void 0 ? void 0 : job.id) !== null && _a !== void 0 ? _a : "unknown id"} [${job.name}] completed`, constants_1.loggerCtx);
255
+ });
256
+ await this.cancellationSub.subscribe(this.CANCEL_JOB_CHANNEL);
257
+ this.cancellationSub.on("message", this.subscribeToCancellationEvents);
258
+ }
259
+ }
260
+ async stop(queueName, process) {
261
+ if (!this.stopped) {
262
+ this.stopped = true;
263
+ try {
264
+ core_1.Logger.info(`Closing worker`, constants_1.loggerCtx);
265
+ let timer;
266
+ const checkActive = async () => {
267
+ const activeCount = await this.queue.getActiveCount();
268
+ if (0 < activeCount) {
269
+ const activeJobs = await this.queue.getActive();
270
+ core_1.Logger.info(`Waiting on ${activeCount} active ${activeCount > 1 ? "jobs" : "job"} (${activeJobs.map((j) => j.id).join(", ")})...`, constants_1.loggerCtx);
271
+ timer = setTimeout(checkActive, 2000);
272
+ }
273
+ };
274
+ timer = setTimeout(checkActive, 2000);
275
+ await this.worker.close();
276
+ core_1.Logger.info(`Worker closed`, constants_1.loggerCtx);
277
+ await this.queue.close();
278
+ clearTimeout(timer);
279
+ core_1.Logger.info(`Queue closed`, constants_1.loggerCtx);
280
+ this.cancellationSub.off("message", this.subscribeToCancellationEvents);
281
+ }
282
+ catch (e) {
283
+ core_1.Logger.error(e, constants_1.loggerCtx, e.stack);
284
+ }
285
+ }
286
+ }
287
+ async setActiveJobAsCancelled(jobId) {
288
+ // Not yet possible natively in BullMQ, see
289
+ // https://github.com/taskforcesh/bullmq/issues/632
290
+ // So we have our own custom method of marking a job as cancelled.
291
+ await this.redisConnection.publish(this.CANCEL_JOB_CHANNEL, jobId);
292
+ await this.redisConnection.sadd(this.CANCELLED_JOB_LIST_NAME, jobId.toString());
293
+ }
294
+ async createDeenruvJob(bullJob) {
295
+ const jobJson = bullJob.toJSON();
296
+ return new core_1.Job({
297
+ queueName: bullJob.name,
298
+ id: bullJob.id,
299
+ state: await this.getState(bullJob),
300
+ data: bullJob.data,
301
+ attempts: bullJob.attemptsMade,
302
+ createdAt: new Date(jobJson.timestamp),
303
+ startedAt: jobJson.processedOn
304
+ ? new Date(jobJson.processedOn)
305
+ : undefined,
306
+ settledAt: jobJson.finishedOn ? new Date(jobJson.finishedOn) : undefined,
307
+ error: jobJson.failedReason,
308
+ progress: +jobJson.progress,
309
+ result: jobJson.returnvalue,
310
+ retries: bullJob.opts.attempts ? bullJob.opts.attempts - 1 : 0,
311
+ });
312
+ }
313
+ async getState(bullJob) {
314
+ var _a;
315
+ const jobId = (_a = bullJob.id) === null || _a === void 0 ? void 0 : _a.toString();
316
+ if ((await bullJob.isWaiting()) || (await bullJob.isWaitingChildren())) {
317
+ return generated_types_1.JobState.PENDING;
318
+ }
319
+ if (await bullJob.isActive()) {
320
+ const isCancelled = jobId &&
321
+ (await this.redisConnection.sismember(this.CANCELLED_JOB_LIST_NAME, jobId));
322
+ if (isCancelled) {
323
+ return generated_types_1.JobState.CANCELLED;
324
+ }
325
+ else {
326
+ return generated_types_1.JobState.RUNNING;
327
+ }
328
+ }
329
+ if (await bullJob.isDelayed()) {
330
+ return generated_types_1.JobState.RETRYING;
331
+ }
332
+ if (await bullJob.isFailed()) {
333
+ return generated_types_1.JobState.FAILED;
334
+ }
335
+ if (await bullJob.isCompleted()) {
336
+ return generated_types_1.JobState.COMPLETED;
337
+ }
338
+ throw new core_1.InternalServerError("Could not determine job state");
339
+ // TODO: how to handle "cancelled" state? Currently when we cancel a job, we simply remove all record of it.
340
+ }
341
+ callCustomScript(scriptDef, args) {
342
+ return new Promise((resolve, reject) => {
343
+ this.redisConnection[scriptDef.name](`bull:${this.queue.name}:`, ...args, (err, result) => {
344
+ if (err) {
345
+ reject(err);
346
+ }
347
+ else {
348
+ resolve(result);
349
+ }
350
+ });
351
+ });
352
+ }
353
+ defineCustomLuaScripts() {
354
+ const redis = this.redisConnection;
355
+ redis.defineCommand(get_jobs_by_type_1.getJobsByType.name, {
356
+ numberOfKeys: get_jobs_by_type_1.getJobsByType.numberOfKeys,
357
+ lua: get_jobs_by_type_1.getJobsByType.script,
358
+ });
359
+ }
360
+ }
361
+ exports.BullMQJobQueueStrategy = BullMQJobQueueStrategy;
362
+ //# sourceMappingURL=bullmq-job-queue-strategy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bullmq-job-queue-strategy.js","sourceRoot":"","sources":["../../src/bullmq/bullmq-job-queue-strategy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { JobType } from "bullmq";
2
+ export declare const loggerCtx = "BullMQJobQueuePlugin";
3
+ export declare const BULLMQ_PLUGIN_OPTIONS: unique symbol;
4
+ export declare const ALL_JOB_TYPES: JobType[];
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ALL_JOB_TYPES = exports.BULLMQ_PLUGIN_OPTIONS = exports.loggerCtx = void 0;
4
+ exports.loggerCtx = "BullMQJobQueuePlugin";
5
+ exports.BULLMQ_PLUGIN_OPTIONS = Symbol("BULLMQ_PLUGIN_OPTIONS");
6
+ exports.ALL_JOB_TYPES = [
7
+ "completed",
8
+ "failed",
9
+ "delayed",
10
+ "repeat",
11
+ "waiting-children",
12
+ "active",
13
+ "wait",
14
+ "paused",
15
+ ];
16
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/bullmq/constants.ts"],"names":[],"mappings":";;;AAEa,QAAA,SAAS,GAAG,sBAAsB,CAAC;AACnC,QAAA,qBAAqB,GAAG,MAAM,CAAC,uBAAuB,CAAC,CAAC;AAExD,QAAA,aAAa,GAAc;IACtC,WAAW;IACX,QAAQ;IACR,SAAS;IACT,QAAQ;IACR,kBAAkB;IAClB,QAAQ;IACR,MAAM;IACN,QAAQ;CACT,CAAC"}
@@ -0,0 +1,2 @@
1
+ export * from "./plugin";
2
+ export * from "./types";
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ // ensure that the bullmq package is installed
18
+ try {
19
+ require("bullmq");
20
+ }
21
+ catch (e) {
22
+ console.error('The BullMQJobQueuePlugin depends on the "bullmq" package being installed.');
23
+ process.exit(1);
24
+ }
25
+ __exportStar(require("./plugin"), exports);
26
+ __exportStar(require("./types"), exports);
27
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/bullmq/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAEA,8CAA8C;AAC9C,IAAI,CAAC;IACH,OAAO,CAAC,QAAQ,CAAC,CAAC;AACpB,CAAC;AAAC,OAAO,CAAM,EAAE,CAAC;IAChB,OAAO,CAAC,KAAK,CACX,2EAA2E,CAC5E,CAAC;IACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,2CAAyB;AACzB,0CAAwB"}