@tsed/bullmq 7.47.1 → 7.48.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/README.md +30 -10
- package/jest.config.js +1 -1
- package/lib/cjs/BullMQModule.js +15 -8
- package/lib/cjs/BullMQModule.js.map +1 -1
- package/lib/esm/BullMQModule.js +15 -8
- package/lib/esm/BullMQModule.js.map +1 -1
- package/lib/tsconfig.esm.tsbuildinfo +1 -1
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/lib/types/config/config.d.ts +40 -1
- package/lib/types/contracts/JobMethods.d.ts +3 -2
- package/package.json +5 -5
- package/src/BullMQModule.spec.ts +242 -124
- package/src/BullMQModule.ts +25 -10
- package/src/config/config.ts +48 -3
- package/src/contracts/JobMethods.ts +4 -2
package/README.md
CHANGED
|
@@ -33,7 +33,7 @@ A package of Ts.ED framework. See website: https://tsed.io
|
|
|
33
33
|
|
|
34
34
|
## Feature
|
|
35
35
|
|
|
36
|
-
The `@tsed/bullmq` package allows you to define jobs using the `@
|
|
36
|
+
The `@tsed/bullmq` package allows you to define jobs using the `@JobController` decorator and the `JobMethods` interface and have them picked up by the `BullMQ` worker.
|
|
37
37
|
|
|
38
38
|
## Installation
|
|
39
39
|
|
|
@@ -53,16 +53,35 @@ import "@tsed/bullmq"; // import bullmq ts.ed module
|
|
|
53
53
|
|
|
54
54
|
@Configuration({
|
|
55
55
|
bullmq: {
|
|
56
|
-
|
|
56
|
+
// Specify queue name's to create
|
|
57
|
+
queues: ["default", "special"],
|
|
57
58
|
connection: {
|
|
58
59
|
// redisio connection options
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
60
|
+
},
|
|
61
|
+
defaultQueueOptions: {
|
|
62
|
+
// Default queue options which are applied to every queue
|
|
63
|
+
// Can be extended/overridden by `queueOptions`
|
|
64
|
+
},
|
|
65
|
+
queueOptions: {
|
|
66
|
+
special: {
|
|
67
|
+
// Specify additional queue options by queue name
|
|
68
|
+
}
|
|
69
|
+
},
|
|
70
|
+
// Disable the creation of any worker.
|
|
71
|
+
// All other worker configuration will be ignored
|
|
72
|
+
disableWorker: true,
|
|
73
|
+
// Specify for which queues to start a worker for.
|
|
74
|
+
// When undefined falls back to all queues specified.
|
|
75
|
+
workerQueues: ["default"],
|
|
76
|
+
defaultWorkerOptions: {
|
|
77
|
+
// Default worker options which are applied to every worker
|
|
78
|
+
// Can be extended/overridden by `workerOptions`
|
|
79
|
+
},
|
|
80
|
+
workerOptions: {
|
|
81
|
+
special: {
|
|
82
|
+
// Specify additional worker options by queue name
|
|
83
|
+
}
|
|
84
|
+
}
|
|
66
85
|
}
|
|
67
86
|
})
|
|
68
87
|
export class Server {}
|
|
@@ -100,7 +119,8 @@ class OtherExampleJob implements JobMethods {
|
|
|
100
119
|
|
|
101
120
|
## Defining a repeating job
|
|
102
121
|
|
|
103
|
-
Jobs that should be run regularly on a schedule can also easily defined using the `@
|
|
122
|
+
Jobs that should be run regularly on a schedule can also easily defined using the `@JobController` decorator.
|
|
123
|
+
Doing so will automatically dispatch it without any data
|
|
104
124
|
|
|
105
125
|
```ts
|
|
106
126
|
import {JobController, JobMethods} from "@tsed/bullmq";
|
package/jest.config.js
CHANGED
package/lib/cjs/BullMQModule.js
CHANGED
|
@@ -4,6 +4,7 @@ exports.BullMQModule = void 0;
|
|
|
4
4
|
const tslib_1 = require("tslib");
|
|
5
5
|
const common_1 = require("@tsed/common");
|
|
6
6
|
const di_1 = require("@tsed/di");
|
|
7
|
+
const core_1 = require("@tsed/core");
|
|
7
8
|
const schema_1 = require("@tsed/schema");
|
|
8
9
|
const bullmq_1 = require("bullmq");
|
|
9
10
|
const uuid_1 = require("uuid");
|
|
@@ -20,19 +21,23 @@ let BullMQModule = class BullMQModule {
|
|
|
20
21
|
if (!this.bullmq) {
|
|
21
22
|
return;
|
|
22
23
|
}
|
|
23
|
-
this.
|
|
24
|
+
if (!this.bullmq.disableWorker) {
|
|
25
|
+
this.buildWorkers();
|
|
26
|
+
}
|
|
24
27
|
this.buildQueues();
|
|
25
28
|
this.injector.getMany("bullmq:cron").map((job) => this.dispatcher.dispatch((0, schema_1.getComputedType)(job)));
|
|
26
29
|
}
|
|
27
30
|
buildQueues() {
|
|
28
31
|
this.bullmq.queues.forEach((queue) => {
|
|
32
|
+
const ops = (0, core_1.deepMerge)({
|
|
33
|
+
connection: this.bullmq.connection,
|
|
34
|
+
defaultJobOptions: this.bullmq.defaultJobOptions,
|
|
35
|
+
...this.bullmq.defaultQueueOptions
|
|
36
|
+
}, this.bullmq.queueOptions?.[queue]);
|
|
29
37
|
this.injector
|
|
30
38
|
.add(`bullmq.queue.${queue}`, {
|
|
31
39
|
type: "bullmq:queue",
|
|
32
|
-
useValue: new bullmq_1.Queue(queue,
|
|
33
|
-
connection: this.bullmq.connection,
|
|
34
|
-
defaultJobOptions: this.bullmq.defaultJobOptions
|
|
35
|
-
}),
|
|
40
|
+
useValue: new bullmq_1.Queue(queue, ops),
|
|
36
41
|
hooks: {
|
|
37
42
|
$onDestroy: (queue) => queue.close()
|
|
38
43
|
}
|
|
@@ -42,12 +47,14 @@ let BullMQModule = class BullMQModule {
|
|
|
42
47
|
}
|
|
43
48
|
buildWorkers() {
|
|
44
49
|
(this.bullmq.workerQueues ?? this.bullmq.queues).forEach((queue) => {
|
|
50
|
+
const ops = (0, core_1.deepMerge)({
|
|
51
|
+
connection: this.bullmq.connection,
|
|
52
|
+
...this.bullmq.defaultWorkerOptions
|
|
53
|
+
}, this.bullmq.workerOptions?.[queue]);
|
|
45
54
|
this.injector
|
|
46
55
|
.add(`bullmq.worker.${queue}`, {
|
|
47
56
|
type: "bullmq:worker",
|
|
48
|
-
useValue: new bullmq_1.Worker(queue, this.onProcess.bind(this),
|
|
49
|
-
connection: this.bullmq.connection
|
|
50
|
-
}),
|
|
57
|
+
useValue: new bullmq_1.Worker(queue, this.onProcess.bind(this), ops),
|
|
51
58
|
hooks: {
|
|
52
59
|
$onDestroy: (worker) => worker.close()
|
|
53
60
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BullMQModule.js","sourceRoot":"","sources":["../../src/BullMQModule.ts"],"names":[],"mappings":";;;;AAAA,yCAAiE;AACjE,iCAA2D;AAC3D,yCAA6C;AAC7C,
|
|
1
|
+
{"version":3,"file":"BullMQModule.js","sourceRoot":"","sources":["../../src/BullMQModule.ts"],"names":[],"mappings":"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"}
|
package/lib/esm/BullMQModule.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { __decorate, __metadata } from "tslib";
|
|
2
2
|
import { DIContext, runInContext } from "@tsed/common";
|
|
3
3
|
import { Constant, InjectorService, Module } from "@tsed/di";
|
|
4
|
+
import { deepMerge } from "@tsed/core";
|
|
4
5
|
import { getComputedType } from "@tsed/schema";
|
|
5
6
|
import { Queue, Worker } from "bullmq";
|
|
6
7
|
import { v4 } from "uuid";
|
|
@@ -17,19 +18,23 @@ let BullMQModule = class BullMQModule {
|
|
|
17
18
|
if (!this.bullmq) {
|
|
18
19
|
return;
|
|
19
20
|
}
|
|
20
|
-
this.
|
|
21
|
+
if (!this.bullmq.disableWorker) {
|
|
22
|
+
this.buildWorkers();
|
|
23
|
+
}
|
|
21
24
|
this.buildQueues();
|
|
22
25
|
this.injector.getMany("bullmq:cron").map((job) => this.dispatcher.dispatch(getComputedType(job)));
|
|
23
26
|
}
|
|
24
27
|
buildQueues() {
|
|
25
28
|
this.bullmq.queues.forEach((queue) => {
|
|
29
|
+
const ops = deepMerge({
|
|
30
|
+
connection: this.bullmq.connection,
|
|
31
|
+
defaultJobOptions: this.bullmq.defaultJobOptions,
|
|
32
|
+
...this.bullmq.defaultQueueOptions
|
|
33
|
+
}, this.bullmq.queueOptions?.[queue]);
|
|
26
34
|
this.injector
|
|
27
35
|
.add(`bullmq.queue.${queue}`, {
|
|
28
36
|
type: "bullmq:queue",
|
|
29
|
-
useValue: new Queue(queue,
|
|
30
|
-
connection: this.bullmq.connection,
|
|
31
|
-
defaultJobOptions: this.bullmq.defaultJobOptions
|
|
32
|
-
}),
|
|
37
|
+
useValue: new Queue(queue, ops),
|
|
33
38
|
hooks: {
|
|
34
39
|
$onDestroy: (queue) => queue.close()
|
|
35
40
|
}
|
|
@@ -39,12 +44,14 @@ let BullMQModule = class BullMQModule {
|
|
|
39
44
|
}
|
|
40
45
|
buildWorkers() {
|
|
41
46
|
(this.bullmq.workerQueues ?? this.bullmq.queues).forEach((queue) => {
|
|
47
|
+
const ops = deepMerge({
|
|
48
|
+
connection: this.bullmq.connection,
|
|
49
|
+
...this.bullmq.defaultWorkerOptions
|
|
50
|
+
}, this.bullmq.workerOptions?.[queue]);
|
|
42
51
|
this.injector
|
|
43
52
|
.add(`bullmq.worker.${queue}`, {
|
|
44
53
|
type: "bullmq:worker",
|
|
45
|
-
useValue: new Worker(queue, this.onProcess.bind(this),
|
|
46
|
-
connection: this.bullmq.connection
|
|
47
|
-
}),
|
|
54
|
+
useValue: new Worker(queue, this.onProcess.bind(this), ops),
|
|
48
55
|
hooks: {
|
|
49
56
|
$onDestroy: (worker) => worker.close()
|
|
50
57
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BullMQModule.js","sourceRoot":"","sources":["../../src/BullMQModule.ts"],"names":[],"mappings":";AAAA,OAAO,EAAa,SAAS,EAAE,YAAY,EAAC,MAAM,cAAc,CAAC;AACjE,OAAO,EAAC,QAAQ,EAAE,eAAe,EAAE,MAAM,EAAC,MAAM,UAAU,CAAC;AAC3D,OAAO,EAAC,eAAe,EAAC,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAM,KAAK,
|
|
1
|
+
{"version":3,"file":"BullMQModule.js","sourceRoot":"","sources":["../../src/BullMQModule.ts"],"names":[],"mappings":"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"}
|