@carno.js/queue 0.2.3

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 (46) hide show
  1. package/LICENSE +674 -0
  2. package/dist/constants.d.ts +6 -0
  3. package/dist/constants.js +9 -0
  4. package/dist/decorators/index.d.ts +5 -0
  5. package/dist/decorators/index.js +21 -0
  6. package/dist/decorators/inject-queue.decorator.d.ts +2 -0
  7. package/dist/decorators/inject-queue.decorator.js +15 -0
  8. package/dist/decorators/job-events.decorator.d.ts +8 -0
  9. package/dist/decorators/job-events.decorator.js +30 -0
  10. package/dist/decorators/process.decorator.d.ts +2 -0
  11. package/dist/decorators/process.decorator.js +26 -0
  12. package/dist/decorators/queue-events.decorator.d.ts +6 -0
  13. package/dist/decorators/queue-events.decorator.js +27 -0
  14. package/dist/decorators/queue.decorator.d.ts +2 -0
  15. package/dist/decorators/queue.decorator.js +17 -0
  16. package/dist/entry.d.ts +3 -0
  17. package/dist/entry.js +35 -0
  18. package/dist/index.d.ts +14 -0
  19. package/dist/index.js +41 -0
  20. package/dist/interfaces/index.d.ts +3 -0
  21. package/dist/interfaces/index.js +19 -0
  22. package/dist/interfaces/process-options.interface.d.ts +4 -0
  23. package/dist/interfaces/process-options.interface.js +2 -0
  24. package/dist/interfaces/queue-module-options.interface.d.ts +4 -0
  25. package/dist/interfaces/queue-module-options.interface.js +2 -0
  26. package/dist/interfaces/queue-options.interface.d.ts +15 -0
  27. package/dist/interfaces/queue-options.interface.js +2 -0
  28. package/dist/queue-orchestration.service.d.ts +38 -0
  29. package/dist/queue-orchestration.service.js +243 -0
  30. package/dist/queue.registry.d.ts +18 -0
  31. package/dist/queue.registry.js +88 -0
  32. package/dist/services/connection-manager.service.d.ts +7 -0
  33. package/dist/services/connection-manager.service.js +28 -0
  34. package/dist/services/event-binder.service.d.ts +7 -0
  35. package/dist/services/event-binder.service.js +34 -0
  36. package/dist/services/queue-builder.service.d.ts +11 -0
  37. package/dist/services/queue-builder.service.js +50 -0
  38. package/dist/services/queue-client-proxy.service.d.ts +12 -0
  39. package/dist/services/queue-client-proxy.service.js +19 -0
  40. package/dist/services/queue-client.service.d.ts +13 -0
  41. package/dist/services/queue-client.service.js +40 -0
  42. package/dist/services/queue-discovery.service.d.ts +7 -0
  43. package/dist/services/queue-discovery.service.js +32 -0
  44. package/dist/services/queue-proxy-factory.service.d.ts +13 -0
  45. package/dist/services/queue-proxy-factory.service.js +11 -0
  46. package/package.json +32 -0
@@ -0,0 +1,18 @@
1
+ import { Queue, Worker } from 'bullmq';
2
+ export declare class QueueRegistry {
3
+ private readonly queues;
4
+ private readonly workers;
5
+ hasQueue(name: string): boolean;
6
+ getQueue(name: string): Queue;
7
+ addQueue(name: string, queue: Queue): void;
8
+ hasWorker(name: string): boolean;
9
+ getWorker(name: string): Worker;
10
+ addWorker(name: string, worker: Worker): void;
11
+ getQueues(): Map<string, Queue>;
12
+ getWorkers(): Map<string, Worker>;
13
+ closeQueue(name: string): Promise<void>;
14
+ closeWorker(name: string): Promise<void>;
15
+ closeAll(): Promise<void>;
16
+ private closeAllQueues;
17
+ private closeAllWorkers;
18
+ }
@@ -0,0 +1,88 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.QueueRegistry = void 0;
10
+ const core_1 = require("@carno.js/core");
11
+ let QueueRegistry = class QueueRegistry {
12
+ constructor() {
13
+ this.queues = new Map();
14
+ this.workers = new Map();
15
+ }
16
+ hasQueue(name) {
17
+ return this.queues.has(name);
18
+ }
19
+ getQueue(name) {
20
+ const queue = this.queues.get(name);
21
+ if (!queue) {
22
+ throw new Error(`Queue "${name}" not found`);
23
+ }
24
+ return queue;
25
+ }
26
+ addQueue(name, queue) {
27
+ if (this.hasQueue(name)) {
28
+ throw new Error(`Queue "${name}" already exists`);
29
+ }
30
+ this.queues.set(name, queue);
31
+ }
32
+ hasWorker(name) {
33
+ return this.workers.has(name);
34
+ }
35
+ getWorker(name) {
36
+ const worker = this.workers.get(name);
37
+ if (!worker) {
38
+ throw new Error(`Worker "${name}" not found`);
39
+ }
40
+ return worker;
41
+ }
42
+ addWorker(name, worker) {
43
+ if (this.hasWorker(name)) {
44
+ throw new Error(`Worker "${name}" already exists`);
45
+ }
46
+ this.workers.set(name, worker);
47
+ }
48
+ getQueues() {
49
+ return this.queues;
50
+ }
51
+ getWorkers() {
52
+ return this.workers;
53
+ }
54
+ async closeQueue(name) {
55
+ const queue = this.getQueue(name);
56
+ await queue.close();
57
+ this.queues.delete(name);
58
+ }
59
+ async closeWorker(name) {
60
+ const worker = this.getWorker(name);
61
+ await worker.close();
62
+ this.workers.delete(name);
63
+ }
64
+ async closeAll() {
65
+ console.log("Closing all workers and queues...");
66
+ await this.closeAllWorkers();
67
+ await this.closeAllQueues();
68
+ console.log("All workers and queues closed.");
69
+ }
70
+ async closeAllQueues() {
71
+ const names = Array.from(this.queues.keys());
72
+ for (const name of names) {
73
+ console.log(`Closing queue: ${name}`);
74
+ await this.closeQueue(name);
75
+ }
76
+ }
77
+ async closeAllWorkers() {
78
+ const names = Array.from(this.workers.keys());
79
+ for (const name of names) {
80
+ console.log(`Closing worker: ${name}`);
81
+ await this.closeWorker(name);
82
+ }
83
+ }
84
+ };
85
+ exports.QueueRegistry = QueueRegistry;
86
+ exports.QueueRegistry = QueueRegistry = __decorate([
87
+ (0, core_1.Injectable)()
88
+ ], QueueRegistry);
@@ -0,0 +1,7 @@
1
+ import { ConnectionOptions } from 'bullmq';
2
+ export declare class ConnectionManagerService {
3
+ private defaultConnection?;
4
+ setDefaultConnection(connection?: ConnectionOptions): void;
5
+ getConnection(override?: ConnectionOptions): ConnectionOptions | undefined;
6
+ hasConnection(): boolean;
7
+ }
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.ConnectionManagerService = void 0;
10
+ const core_1 = require("@carno.js/core");
11
+ let ConnectionManagerService = class ConnectionManagerService {
12
+ setDefaultConnection(connection) {
13
+ this.defaultConnection = connection;
14
+ }
15
+ getConnection(override) {
16
+ if (override) {
17
+ return override;
18
+ }
19
+ return this.defaultConnection;
20
+ }
21
+ hasConnection() {
22
+ return this.defaultConnection !== undefined;
23
+ }
24
+ };
25
+ exports.ConnectionManagerService = ConnectionManagerService;
26
+ exports.ConnectionManagerService = ConnectionManagerService = __decorate([
27
+ (0, core_1.Injectable)()
28
+ ], ConnectionManagerService);
@@ -0,0 +1,7 @@
1
+ import { Queue, Worker } from 'bullmq';
2
+ export declare class EventBinderService {
3
+ bindJobEvents(worker: Worker, events: any[], target: any): void;
4
+ bindQueueEvents(queue: Queue, events: any[], target: any): void;
5
+ private bindJobEvent;
6
+ private bindQueueEvent;
7
+ }
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.EventBinderService = void 0;
10
+ const core_1 = require("@carno.js/core");
11
+ let EventBinderService = class EventBinderService {
12
+ bindJobEvents(worker, events, target) {
13
+ events.forEach(event => {
14
+ this.bindJobEvent(worker, event, target);
15
+ });
16
+ }
17
+ bindQueueEvents(queue, events, target) {
18
+ events.forEach(event => {
19
+ this.bindQueueEvent(queue, event, target);
20
+ });
21
+ }
22
+ bindJobEvent(worker, event, target) {
23
+ const handler = target[event.methodName].bind(target);
24
+ worker.on(event.eventName, handler);
25
+ }
26
+ bindQueueEvent(queue, event, target) {
27
+ const handler = target[event.methodName].bind(target);
28
+ queue.on(event.eventName, handler);
29
+ }
30
+ };
31
+ exports.EventBinderService = EventBinderService;
32
+ exports.EventBinderService = EventBinderService = __decorate([
33
+ (0, core_1.Injectable)()
34
+ ], EventBinderService);
@@ -0,0 +1,11 @@
1
+ import { Queue, Worker, Job } from 'bullmq';
2
+ import { ConnectionManagerService } from './connection-manager.service';
3
+ import { QueueRegistry } from '../queue.registry';
4
+ export declare class QueueBuilderService {
5
+ private connectionManager;
6
+ private queueRegistry;
7
+ constructor(connectionManager: ConnectionManagerService, queueRegistry: QueueRegistry);
8
+ createQueue(name: string, options?: any): Queue;
9
+ createWorker(queueName: string, workerId: string, processor: (job: Job) => Promise<any>, options?: any): Worker;
10
+ private getConnectionConfig;
11
+ }
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.QueueBuilderService = void 0;
13
+ const core_1 = require("@carno.js/core");
14
+ const bullmq_1 = require("bullmq");
15
+ const connection_manager_service_1 = require("./connection-manager.service");
16
+ const queue_registry_1 = require("../queue.registry");
17
+ let QueueBuilderService = class QueueBuilderService {
18
+ constructor(connectionManager, queueRegistry) {
19
+ this.connectionManager = connectionManager;
20
+ this.queueRegistry = queueRegistry;
21
+ }
22
+ createQueue(name, options = {}) {
23
+ const connection = this.getConnectionConfig(options);
24
+ const queue = new bullmq_1.Queue(name, {
25
+ connection,
26
+ defaultJobOptions: options.defaultJobOptions,
27
+ });
28
+ this.queueRegistry.addQueue(name, queue);
29
+ return queue;
30
+ }
31
+ createWorker(queueName, workerId, processor, options = {}) {
32
+ const connection = this.getConnectionConfig(options);
33
+ const concurrency = options.concurrency ?? 1;
34
+ const worker = new bullmq_1.Worker(queueName, processor, {
35
+ connection,
36
+ concurrency,
37
+ });
38
+ this.queueRegistry.addWorker(workerId, worker);
39
+ return worker;
40
+ }
41
+ getConnectionConfig(options) {
42
+ return this.connectionManager.getConnection(options.connection);
43
+ }
44
+ };
45
+ exports.QueueBuilderService = QueueBuilderService;
46
+ exports.QueueBuilderService = QueueBuilderService = __decorate([
47
+ (0, core_1.Injectable)(),
48
+ __metadata("design:paramtypes", [connection_manager_service_1.ConnectionManagerService,
49
+ queue_registry_1.QueueRegistry])
50
+ ], QueueBuilderService);
@@ -0,0 +1,12 @@
1
+ import { Queue, JobsOptions, Job } from 'bullmq';
2
+ export declare class QueueClientProxy {
3
+ readonly queue: Queue;
4
+ constructor(queue: Queue);
5
+ add(jobName: string, data?: any, options?: JobsOptions): Promise<any>;
6
+ addBulk(jobs: Array<{
7
+ name: string;
8
+ data?: any;
9
+ opts?: JobsOptions;
10
+ }>): Promise<any>;
11
+ getJob(jobId: string): Promise<Job | undefined>;
12
+ }
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.QueueClientProxy = void 0;
4
+ class QueueClientProxy {
5
+ constructor(queue) {
6
+ this.queue = queue;
7
+ }
8
+ async add(jobName, data = {}, options) {
9
+ return this.queue.add(jobName, data, options);
10
+ }
11
+ async addBulk(jobs) {
12
+ return this.queue.addBulk(jobs);
13
+ }
14
+ async getJob(jobId) {
15
+ const job = await this.queue.getJob(jobId);
16
+ return job;
17
+ }
18
+ }
19
+ exports.QueueClientProxy = QueueClientProxy;
@@ -0,0 +1,13 @@
1
+ import { JobsOptions } from "bullmq";
2
+ import { QueueRegistry } from "../queue.registry";
3
+ export declare class QueueClient {
4
+ private queueRegistry;
5
+ constructor(queueRegistry: QueueRegistry);
6
+ add(queueName: string, jobName: string, data?: any, options?: JobsOptions): Promise<any>;
7
+ addBulk(queueName: string, jobs: Array<{
8
+ name: string;
9
+ data?: any;
10
+ opts?: JobsOptions;
11
+ }>): Promise<any>;
12
+ private getQueue;
13
+ }
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.QueueClient = void 0;
13
+ const core_1 = require("@carno.js/core");
14
+ const core_2 = require("@carno.js/core");
15
+ const queue_registry_1 = require("../queue.registry");
16
+ let QueueClient = class QueueClient {
17
+ constructor(queueRegistry) {
18
+ this.queueRegistry = queueRegistry;
19
+ }
20
+ async add(queueName, jobName, data = {}, options) {
21
+ const queue = this.getQueue(queueName);
22
+ return queue.add(jobName, data, options);
23
+ }
24
+ async addBulk(queueName, jobs) {
25
+ const queue = this.getQueue(queueName);
26
+ return queue.addBulk(jobs);
27
+ }
28
+ getQueue(queueName) {
29
+ const queue = this.queueRegistry.getQueue(queueName);
30
+ if (!queue) {
31
+ throw new Error(`Queue "${queueName}" not found`);
32
+ }
33
+ return queue;
34
+ }
35
+ };
36
+ exports.QueueClient = QueueClient;
37
+ exports.QueueClient = QueueClient = __decorate([
38
+ (0, core_1.Injectable)({ scope: core_2.ProviderScope.SINGLETON }),
39
+ __metadata("design:paramtypes", [queue_registry_1.QueueRegistry])
40
+ ], QueueClient);
@@ -0,0 +1,7 @@
1
+ export declare class QueueDiscoveryService {
2
+ discoverQueues(): any[];
3
+ discoverProcessors(): any[];
4
+ discoverJobEvents(): any[];
5
+ discoverQueueEvents(): any[];
6
+ private getMetadata;
7
+ }
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.QueueDiscoveryService = void 0;
10
+ const core_1 = require("@carno.js/core");
11
+ const constants_1 = require("../constants");
12
+ let QueueDiscoveryService = class QueueDiscoveryService {
13
+ discoverQueues() {
14
+ return this.getMetadata(constants_1.QUEUE_METADATA);
15
+ }
16
+ discoverProcessors() {
17
+ return this.getMetadata(constants_1.PROCESS_METADATA);
18
+ }
19
+ discoverJobEvents() {
20
+ return this.getMetadata(constants_1.JOB_EVENT_METADATA);
21
+ }
22
+ discoverQueueEvents() {
23
+ return this.getMetadata(constants_1.QUEUE_EVENT_METADATA);
24
+ }
25
+ getMetadata(key) {
26
+ return core_1.Metadata.get(key, Reflect) || [];
27
+ }
28
+ };
29
+ exports.QueueDiscoveryService = QueueDiscoveryService;
30
+ exports.QueueDiscoveryService = QueueDiscoveryService = __decorate([
31
+ (0, core_1.Injectable)()
32
+ ], QueueDiscoveryService);
@@ -0,0 +1,13 @@
1
+ import { Queue } from 'bullmq';
2
+ export declare function createQueueProxyFactory(queue: Queue): {
3
+ new (): {
4
+ readonly queue: Queue;
5
+ add(jobName: string, data?: any, options?: import("bullmq").JobsOptions): Promise<any>;
6
+ addBulk(jobs: Array<{
7
+ name: string;
8
+ data?: any;
9
+ opts?: import("bullmq").JobsOptions;
10
+ }>): Promise<any>;
11
+ getJob(jobId: string): Promise<import("bullmq").Job | undefined>;
12
+ };
13
+ };
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createQueueProxyFactory = createQueueProxyFactory;
4
+ const queue_client_proxy_service_1 = require("./queue-client-proxy.service");
5
+ function createQueueProxyFactory(queue) {
6
+ return class extends queue_client_proxy_service_1.QueueClientProxy {
7
+ constructor() {
8
+ super(queue);
9
+ }
10
+ };
11
+ }
package/package.json ADDED
@@ -0,0 +1,32 @@
1
+ {
2
+ "name": "@carno.js/queue",
3
+ "version": "0.2.3",
4
+ "description": "Queue module for Carno framework with BullMQ support",
5
+ "type": "commonjs",
6
+ "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "scripts": {
9
+ "compile": "rm -rf ./dist tsconfig.tsbuildinfo && tsc --build --force",
10
+ "build": "tsc --build --force",
11
+ "prepublishOnly": "bun run build"
12
+ },
13
+ "dependencies": {
14
+ "bullmq": "^5.61.2"
15
+ },
16
+ "exports": {
17
+ "./package.json": "./package.json",
18
+ ".": {
19
+ "require": "./dist/index.js",
20
+ "default": "./dist/index.js"
21
+ }
22
+ },
23
+ "peerDependencies": {
24
+ "@carno.js/core": "^0.2.0"
25
+ },
26
+ "author": "",
27
+ "license": "MIT",
28
+ "publishConfig": {
29
+ "access": "public"
30
+ },
31
+ "gitHead": "179037d66f41ab7014a008b141afce3c9232190e"
32
+ }