@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,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.QUEUE_MODULE_OPTIONS = exports.INJECT_QUEUE_METADATA = exports.JOB_EVENT_METADATA = exports.QUEUE_EVENT_METADATA = exports.PROCESS_METADATA = exports.QUEUE_METADATA = void 0;
4
+ exports.QUEUE_METADATA = 'queue:metadata';
5
+ exports.PROCESS_METADATA = 'queue:process';
6
+ exports.QUEUE_EVENT_METADATA = 'queue:event';
7
+ exports.JOB_EVENT_METADATA = 'queue:job:event';
8
+ exports.INJECT_QUEUE_METADATA = 'queue:inject';
9
+ exports.QUEUE_MODULE_OPTIONS = 'queue:module:options';
@@ -0,0 +1,5 @@
1
+ export * from './queue.decorator';
2
+ export * from './process.decorator';
3
+ export * from './inject-queue.decorator';
4
+ export * from './job-events.decorator';
5
+ export * from './queue-events.decorator';
@@ -0,0 +1,21 @@
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
+ __exportStar(require("./queue.decorator"), exports);
18
+ __exportStar(require("./process.decorator"), exports);
19
+ __exportStar(require("./inject-queue.decorator"), exports);
20
+ __exportStar(require("./job-events.decorator"), exports);
21
+ __exportStar(require("./queue-events.decorator"), exports);
@@ -0,0 +1,2 @@
1
+ export declare function InjectQueue(queueName: string): ParameterDecorator;
2
+ export declare function getQueueToken(queueName: string): string;
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.InjectQueue = InjectQueue;
4
+ exports.getQueueToken = getQueueToken;
5
+ function InjectQueue(queueName) {
6
+ return (target, propertyKey, parameterIndex) => {
7
+ const token = getQueueToken(queueName);
8
+ const existingParams = Reflect.getMetadata('design:paramtypes', target, propertyKey) || [];
9
+ existingParams[parameterIndex] = token;
10
+ Reflect.defineMetadata('design:paramtypes', existingParams, target, propertyKey);
11
+ };
12
+ }
13
+ function getQueueToken(queueName) {
14
+ return `Queue:${queueName}`;
15
+ }
@@ -0,0 +1,8 @@
1
+ export declare const OnJobCompleted: (jobName?: string) => MethodDecorator;
2
+ export declare const OnJobFailed: (jobName?: string) => MethodDecorator;
3
+ export declare const OnJobProgress: (jobName?: string) => MethodDecorator;
4
+ export declare const OnJobActive: (jobName?: string) => MethodDecorator;
5
+ export declare const OnJobWaiting: (jobName?: string) => MethodDecorator;
6
+ export declare const OnJobDelayed: (jobName?: string) => MethodDecorator;
7
+ export declare const OnJobRemoved: (jobName?: string) => MethodDecorator;
8
+ export declare const OnJobStalled: (jobName?: string) => MethodDecorator;
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.OnJobStalled = exports.OnJobRemoved = exports.OnJobDelayed = exports.OnJobWaiting = exports.OnJobActive = exports.OnJobProgress = exports.OnJobFailed = exports.OnJobCompleted = void 0;
4
+ const core_1 = require("@carno.js/core");
5
+ const constants_1 = require("../constants");
6
+ function createJobEventDecorator(eventName) {
7
+ return (jobName) => {
8
+ return (target, propertyKey) => {
9
+ addEventMetadata(eventName, jobName, target, propertyKey);
10
+ };
11
+ };
12
+ }
13
+ function addEventMetadata(eventName, jobName, target, propertyKey) {
14
+ const metadata = {
15
+ eventName,
16
+ jobName,
17
+ methodName: propertyKey,
18
+ target,
19
+ };
20
+ const existing = core_1.Metadata.get(constants_1.JOB_EVENT_METADATA, Reflect) || [];
21
+ core_1.Metadata.set(constants_1.JOB_EVENT_METADATA, [...existing, metadata], Reflect);
22
+ }
23
+ exports.OnJobCompleted = createJobEventDecorator('completed');
24
+ exports.OnJobFailed = createJobEventDecorator('failed');
25
+ exports.OnJobProgress = createJobEventDecorator('progress');
26
+ exports.OnJobActive = createJobEventDecorator('active');
27
+ exports.OnJobWaiting = createJobEventDecorator('waiting');
28
+ exports.OnJobDelayed = createJobEventDecorator('delayed');
29
+ exports.OnJobRemoved = createJobEventDecorator('removed');
30
+ exports.OnJobStalled = createJobEventDecorator('stalled');
@@ -0,0 +1,2 @@
1
+ import { ProcessOptions } from '../interfaces';
2
+ export declare function Process(nameOrOptions?: string | ProcessOptions): MethodDecorator;
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Process = Process;
4
+ const core_1 = require("@carno.js/core");
5
+ const constants_1 = require("../constants");
6
+ function Process(nameOrOptions) {
7
+ return (target, propertyKey) => {
8
+ const options = normalizeOptions(nameOrOptions);
9
+ const metadata = {
10
+ ...options,
11
+ methodName: propertyKey,
12
+ target,
13
+ };
14
+ const existingMetadata = core_1.Metadata.get(constants_1.PROCESS_METADATA, Reflect) || [];
15
+ core_1.Metadata.set(constants_1.PROCESS_METADATA, [...existingMetadata, metadata], Reflect);
16
+ };
17
+ }
18
+ function normalizeOptions(nameOrOptions) {
19
+ if (!nameOrOptions) {
20
+ return {};
21
+ }
22
+ if (typeof nameOrOptions === 'string') {
23
+ return { name: nameOrOptions };
24
+ }
25
+ return nameOrOptions;
26
+ }
@@ -0,0 +1,6 @@
1
+ export declare const OnQueueCleaned: () => MethodDecorator;
2
+ export declare const OnQueueDrained: () => MethodDecorator;
3
+ export declare const OnQueueError: () => MethodDecorator;
4
+ export declare const OnQueuePaused: () => MethodDecorator;
5
+ export declare const OnQueueResumed: () => MethodDecorator;
6
+ export declare const OnQueueWaiting: () => MethodDecorator;
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.OnQueueWaiting = exports.OnQueueResumed = exports.OnQueuePaused = exports.OnQueueError = exports.OnQueueDrained = exports.OnQueueCleaned = void 0;
4
+ const core_1 = require("@carno.js/core");
5
+ const constants_1 = require("../constants");
6
+ function createQueueEventDecorator(eventName) {
7
+ return () => {
8
+ return (target, propertyKey) => {
9
+ addEventMetadata(eventName, target, propertyKey);
10
+ };
11
+ };
12
+ }
13
+ function addEventMetadata(eventName, target, propertyKey) {
14
+ const metadata = {
15
+ eventName,
16
+ methodName: propertyKey,
17
+ target,
18
+ };
19
+ const existing = core_1.Metadata.get(constants_1.QUEUE_EVENT_METADATA, Reflect) || [];
20
+ core_1.Metadata.set(constants_1.QUEUE_EVENT_METADATA, [...existing, metadata], Reflect);
21
+ }
22
+ exports.OnQueueCleaned = createQueueEventDecorator('cleaned');
23
+ exports.OnQueueDrained = createQueueEventDecorator('drained');
24
+ exports.OnQueueError = createQueueEventDecorator('error');
25
+ exports.OnQueuePaused = createQueueEventDecorator('paused');
26
+ exports.OnQueueResumed = createQueueEventDecorator('resumed');
27
+ exports.OnQueueWaiting = createQueueEventDecorator('waiting');
@@ -0,0 +1,2 @@
1
+ import { QueueOptions } from '../interfaces';
2
+ export declare function Queue(name: string, options?: Omit<QueueOptions, 'name'>): ClassDecorator;
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Queue = Queue;
4
+ const core_1 = require("@carno.js/core");
5
+ const constants_1 = require("../constants");
6
+ function Queue(name, options = {}) {
7
+ return (target) => {
8
+ const metadata = {
9
+ name,
10
+ options,
11
+ target,
12
+ };
13
+ const existingMetadata = core_1.Metadata.get(constants_1.QUEUE_METADATA, Reflect) || [];
14
+ core_1.Metadata.set(constants_1.QUEUE_METADATA, [...existingMetadata, metadata], Reflect);
15
+ return (0, core_1.Injectable)()(target);
16
+ };
17
+ }
@@ -0,0 +1,3 @@
1
+ import { Carno } from '@carno.js/core';
2
+ import { QueueModuleOptions } from './interfaces';
3
+ export declare function CarnoQueue(options?: QueueModuleOptions): Carno;
package/dist/entry.js ADDED
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CarnoQueue = CarnoQueue;
4
+ const core_1 = require("@carno.js/core");
5
+ const queue_orchestration_service_1 = require("./queue-orchestration.service");
6
+ const queue_registry_1 = require("./queue.registry");
7
+ const queue_discovery_service_1 = require("./services/queue-discovery.service");
8
+ const queue_builder_service_1 = require("./services/queue-builder.service");
9
+ const event_binder_service_1 = require("./services/event-binder.service");
10
+ const connection_manager_service_1 = require("./services/connection-manager.service");
11
+ const constants_1 = require("./constants");
12
+ function CarnoQueue(options = {}) {
13
+ const connectionManager = new connection_manager_service_1.ConnectionManagerService();
14
+ connectionManager.setDefaultConnection(options.connection);
15
+ return new core_1.Carno({
16
+ providers: [
17
+ {
18
+ provide: constants_1.QUEUE_MODULE_OPTIONS,
19
+ useValue: options,
20
+ },
21
+ {
22
+ provide: connection_manager_service_1.ConnectionManagerService,
23
+ useValue: () => connectionManager,
24
+ },
25
+ ],
26
+ exports: [
27
+ queue_orchestration_service_1.QueueOrchestration,
28
+ queue_registry_1.QueueRegistry,
29
+ queue_discovery_service_1.QueueDiscoveryService,
30
+ queue_builder_service_1.QueueBuilderService,
31
+ event_binder_service_1.EventBinderService,
32
+ connection_manager_service_1.ConnectionManagerService,
33
+ ],
34
+ });
35
+ }
@@ -0,0 +1,14 @@
1
+ export * from './decorators';
2
+ export * from './interfaces';
3
+ export * from './constants';
4
+ export * from './queue.registry';
5
+ export * from './queue-orchestration.service';
6
+ export * from './entry';
7
+ export { getQueueToken } from './decorators/inject-queue.decorator';
8
+ export { QueueDiscoveryService } from './services/queue-discovery.service';
9
+ export { QueueBuilderService } from './services/queue-builder.service';
10
+ export { EventBinderService } from './services/event-binder.service';
11
+ export { ConnectionManagerService } from './services/connection-manager.service';
12
+ export { QueueClient } from './services/queue-client.service';
13
+ export { QueueClientProxy } from './services/queue-client-proxy.service';
14
+ export { Queue as BullQueue, Worker, Job } from 'bullmq';
package/dist/index.js ADDED
@@ -0,0 +1,41 @@
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
+ exports.Job = exports.Worker = exports.BullQueue = exports.QueueClientProxy = exports.QueueClient = exports.ConnectionManagerService = exports.EventBinderService = exports.QueueBuilderService = exports.QueueDiscoveryService = exports.getQueueToken = void 0;
18
+ __exportStar(require("./decorators"), exports);
19
+ __exportStar(require("./interfaces"), exports);
20
+ __exportStar(require("./constants"), exports);
21
+ __exportStar(require("./queue.registry"), exports);
22
+ __exportStar(require("./queue-orchestration.service"), exports);
23
+ __exportStar(require("./entry"), exports);
24
+ var inject_queue_decorator_1 = require("./decorators/inject-queue.decorator");
25
+ Object.defineProperty(exports, "getQueueToken", { enumerable: true, get: function () { return inject_queue_decorator_1.getQueueToken; } });
26
+ var queue_discovery_service_1 = require("./services/queue-discovery.service");
27
+ Object.defineProperty(exports, "QueueDiscoveryService", { enumerable: true, get: function () { return queue_discovery_service_1.QueueDiscoveryService; } });
28
+ var queue_builder_service_1 = require("./services/queue-builder.service");
29
+ Object.defineProperty(exports, "QueueBuilderService", { enumerable: true, get: function () { return queue_builder_service_1.QueueBuilderService; } });
30
+ var event_binder_service_1 = require("./services/event-binder.service");
31
+ Object.defineProperty(exports, "EventBinderService", { enumerable: true, get: function () { return event_binder_service_1.EventBinderService; } });
32
+ var connection_manager_service_1 = require("./services/connection-manager.service");
33
+ Object.defineProperty(exports, "ConnectionManagerService", { enumerable: true, get: function () { return connection_manager_service_1.ConnectionManagerService; } });
34
+ var queue_client_service_1 = require("./services/queue-client.service");
35
+ Object.defineProperty(exports, "QueueClient", { enumerable: true, get: function () { return queue_client_service_1.QueueClient; } });
36
+ var queue_client_proxy_service_1 = require("./services/queue-client-proxy.service");
37
+ Object.defineProperty(exports, "QueueClientProxy", { enumerable: true, get: function () { return queue_client_proxy_service_1.QueueClientProxy; } });
38
+ var bullmq_1 = require("bullmq");
39
+ Object.defineProperty(exports, "BullQueue", { enumerable: true, get: function () { return bullmq_1.Queue; } });
40
+ Object.defineProperty(exports, "Worker", { enumerable: true, get: function () { return bullmq_1.Worker; } });
41
+ Object.defineProperty(exports, "Job", { enumerable: true, get: function () { return bullmq_1.Job; } });
@@ -0,0 +1,3 @@
1
+ export * from './queue-options.interface';
2
+ export * from './process-options.interface';
3
+ export * from './queue-module-options.interface';
@@ -0,0 +1,19 @@
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
+ __exportStar(require("./queue-options.interface"), exports);
18
+ __exportStar(require("./process-options.interface"), exports);
19
+ __exportStar(require("./queue-module-options.interface"), exports);
@@ -0,0 +1,4 @@
1
+ export interface ProcessOptions {
2
+ name?: string;
3
+ concurrency?: number;
4
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,4 @@
1
+ import { ConnectionOptions } from 'bullmq';
2
+ export interface QueueModuleOptions {
3
+ connection?: ConnectionOptions;
4
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,15 @@
1
+ import { ConnectionOptions } from 'bullmq';
2
+ export interface QueueOptions {
3
+ name?: string;
4
+ connection?: ConnectionOptions;
5
+ defaultJobOptions?: {
6
+ attempts?: number;
7
+ backoff?: number | {
8
+ type: string;
9
+ delay: number;
10
+ };
11
+ delay?: number;
12
+ removeOnComplete?: boolean | number;
13
+ removeOnFail?: boolean | number;
14
+ };
15
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,38 @@
1
+ import { InjectorService } from '@carno.js/core';
2
+ import { QueueRegistry } from './queue.registry';
3
+ import { QueueDiscoveryService } from './services/queue-discovery.service';
4
+ import { QueueBuilderService } from './services/queue-builder.service';
5
+ import { EventBinderService } from './services/event-binder.service';
6
+ export declare class QueueOrchestration {
7
+ private queueRegistry;
8
+ private discoveryService;
9
+ private builderService;
10
+ private eventBinder;
11
+ private injector;
12
+ constructor(queueRegistry: QueueRegistry, discoveryService: QueueDiscoveryService, builderService: QueueBuilderService, eventBinder: EventBinderService, injector: InjectorService);
13
+ onApplicationInit(): Promise<void>;
14
+ onApplicationShutdown(): Promise<void>;
15
+ private setupQueues;
16
+ private isProviderNotFoundError;
17
+ private setupQueue;
18
+ private createQueue;
19
+ private setupProcessors;
20
+ private findProcessors;
21
+ private createUnifiedWorker;
22
+ private buildWorkerId;
23
+ private getOrCreateInstance;
24
+ private createProcessorFunction;
25
+ private buildProcessorMap;
26
+ private createRouterProcessor;
27
+ private executeProcessorWithContext;
28
+ private findProcessorMethodName;
29
+ private calculateMaxConcurrency;
30
+ private setupAllJobEvents;
31
+ private deduplicateEvents;
32
+ private setupJobEvents;
33
+ private findJobEvents;
34
+ private isEventForProcessor;
35
+ private setupQueueEvents;
36
+ private findQueueEvents;
37
+ private registerQueueProvider;
38
+ }
@@ -0,0 +1,243 @@
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.QueueOrchestration = void 0;
13
+ const core_1 = require("@carno.js/core");
14
+ const queue_registry_1 = require("./queue.registry");
15
+ const queue_discovery_service_1 = require("./services/queue-discovery.service");
16
+ const queue_builder_service_1 = require("./services/queue-builder.service");
17
+ const event_binder_service_1 = require("./services/event-binder.service");
18
+ const inject_queue_decorator_1 = require("./decorators/inject-queue.decorator");
19
+ const queue_proxy_factory_service_1 = require("./services/queue-proxy-factory.service");
20
+ let QueueOrchestration = class QueueOrchestration {
21
+ constructor(queueRegistry, discoveryService, builderService, eventBinder, injector) {
22
+ this.queueRegistry = queueRegistry;
23
+ this.discoveryService = discoveryService;
24
+ this.builderService = builderService;
25
+ this.eventBinder = eventBinder;
26
+ this.injector = injector;
27
+ }
28
+ async onApplicationInit() {
29
+ this.setupQueues();
30
+ }
31
+ async onApplicationShutdown() {
32
+ await this.queueRegistry.closeAll();
33
+ }
34
+ setupQueues() {
35
+ const queues = this.discoveryService.discoverQueues();
36
+ // First pass: Create all queues and register their providers
37
+ queues.forEach(queueMetadata => {
38
+ try {
39
+ const queue = this.createQueue(queueMetadata);
40
+ this.registerQueueProvider(queueMetadata.name, queue);
41
+ }
42
+ catch (error) {
43
+ if (this.isProviderNotFoundError(error)) {
44
+ return;
45
+ }
46
+ throw error;
47
+ }
48
+ });
49
+ // Second pass: Setup processors and workers for all queues
50
+ queues.forEach(queueMetadata => {
51
+ try {
52
+ this.setupProcessors(queueMetadata);
53
+ const queue = this.queueRegistry.getQueue(queueMetadata.name);
54
+ this.setupQueueEvents(queueMetadata, queue);
55
+ }
56
+ catch (error) {
57
+ if (this.isProviderNotFoundError(error)) {
58
+ return;
59
+ }
60
+ throw error;
61
+ }
62
+ });
63
+ }
64
+ isProviderNotFoundError(error) {
65
+ return error?.message?.includes('Provider not found');
66
+ }
67
+ setupQueue(queueMetadata) {
68
+ const queue = this.createQueue(queueMetadata);
69
+ this.registerQueueProvider(queueMetadata.name, queue);
70
+ this.setupProcessors(queueMetadata);
71
+ this.setupQueueEvents(queueMetadata, queue);
72
+ }
73
+ createQueue(metadata) {
74
+ return this.builderService.createQueue(metadata.name, metadata.options);
75
+ }
76
+ setupProcessors(queueMetadata) {
77
+ const processors = this.findProcessors(queueMetadata);
78
+ if (processors.length === 0) {
79
+ return;
80
+ }
81
+ this.createUnifiedWorker(queueMetadata, processors);
82
+ }
83
+ findProcessors(queueMetadata) {
84
+ const all = this.discoveryService.discoverProcessors();
85
+ const filtered = all.filter(p => {
86
+ const matches = p.target === queueMetadata.target.prototype;
87
+ return matches;
88
+ });
89
+ return filtered;
90
+ }
91
+ createUnifiedWorker(queueMetadata, processors) {
92
+ try {
93
+ const instance = this.getOrCreateInstance(queueMetadata);
94
+ const processorMap = this.buildProcessorMap(instance, processors);
95
+ const routerProcessor = this.createRouterProcessor(queueMetadata, processorMap);
96
+ const maxConcurrency = this.calculateMaxConcurrency(processors);
97
+ const worker = this.builderService.createWorker(queueMetadata.name, queueMetadata.name, routerProcessor, { concurrency: maxConcurrency });
98
+ // Add worker event listeners for debugging
99
+ worker.on('ready', () => {
100
+ console.log(`[WORKER READY] Worker for queue ${queueMetadata.name} is ready and waiting for jobs`);
101
+ });
102
+ this.setupAllJobEvents(queueMetadata, worker, instance, processors);
103
+ }
104
+ catch (error) {
105
+ console.error(`[ERROR] Failed to create unified worker for queue ${queueMetadata.name}:`, error);
106
+ throw error;
107
+ }
108
+ }
109
+ buildWorkerId(queueName, jobName) {
110
+ return `${queueName}:${jobName}`;
111
+ }
112
+ getOrCreateInstance(metadata) {
113
+ return this.injector.invoke(metadata.target);
114
+ }
115
+ createProcessorFunction(instance, metadata) {
116
+ return instance[metadata.methodName].bind(instance);
117
+ }
118
+ buildProcessorMap(instance, processors) {
119
+ const map = new Map();
120
+ processors.forEach(processor => {
121
+ const jobName = processor.name || '__default__';
122
+ const fn = instance[processor.methodName].bind(instance);
123
+ map.set(jobName, fn);
124
+ });
125
+ return map;
126
+ }
127
+ createRouterProcessor(queueMetadata, processorMap) {
128
+ return async (job) => {
129
+ const jobName = job.name;
130
+ const processor = processorMap.get(jobName);
131
+ if (!processor) {
132
+ const defaultProcessor = processorMap.get('__default__');
133
+ if (defaultProcessor) {
134
+ return this.executeProcessorWithContext(queueMetadata, defaultProcessor, job);
135
+ }
136
+ throw new Error(`No processor found for job \"${jobName}\"`);
137
+ }
138
+ return this.executeProcessorWithContext(queueMetadata, processor, job);
139
+ };
140
+ }
141
+ executeProcessorWithContext(queueMetadata, processor, job) {
142
+ const context = core_1.Context.createFromJob(job);
143
+ const locals = new core_1.LocalsContainer();
144
+ locals.set(core_1.Context, context);
145
+ const instance = this.injector.invoke(queueMetadata.target, locals);
146
+ const boundProcessor = instance[this.findProcessorMethodName(queueMetadata, job.name)].bind(instance);
147
+ return boundProcessor(job);
148
+ }
149
+ findProcessorMethodName(queueMetadata, jobName) {
150
+ const processors = this.findProcessors(queueMetadata);
151
+ const processor = processors.find(p => (p.name || '__default__') === jobName);
152
+ if (!processor) {
153
+ const defaultProcessor = processors.find(p => !p.name || p.name === '__default__');
154
+ return defaultProcessor?.methodName;
155
+ }
156
+ return processor.methodName;
157
+ }
158
+ calculateMaxConcurrency(processors) {
159
+ const concurrencies = processors
160
+ .map(p => p.concurrency ?? 1)
161
+ .filter(c => typeof c === 'number');
162
+ if (concurrencies.length === 0) {
163
+ return 1;
164
+ }
165
+ return Math.max(...concurrencies);
166
+ }
167
+ setupAllJobEvents(queueMetadata, worker, instance, processors) {
168
+ const allEvents = processors.flatMap(processor => {
169
+ return this.findJobEvents(queueMetadata, processor);
170
+ });
171
+ const uniqueEvents = this.deduplicateEvents(allEvents);
172
+ this.eventBinder.bindJobEvents(worker, uniqueEvents, instance);
173
+ }
174
+ deduplicateEvents(events) {
175
+ const seen = new Set();
176
+ const unique = [];
177
+ events.forEach(event => {
178
+ const key = `${event.eventName}:${event.methodName}`;
179
+ if (!seen.has(key)) {
180
+ seen.add(key);
181
+ unique.push(event);
182
+ }
183
+ });
184
+ return unique;
185
+ }
186
+ setupJobEvents(queueMetadata, worker, instance, processorMetadata) {
187
+ const events = this.findJobEvents(queueMetadata, processorMetadata);
188
+ this.eventBinder.bindJobEvents(worker, events, instance);
189
+ }
190
+ findJobEvents(queueMetadata, processorMetadata) {
191
+ const all = this.discoveryService.discoverJobEvents();
192
+ return all.filter(e => {
193
+ return this.isEventForProcessor(e, queueMetadata, processorMetadata);
194
+ });
195
+ }
196
+ isEventForProcessor(event, queueMetadata, processorMetadata) {
197
+ const sameTarget = event.target === queueMetadata.target.prototype;
198
+ const sameJob = !event.jobName ||
199
+ event.jobName === processorMetadata.name;
200
+ return sameTarget && sameJob;
201
+ }
202
+ setupQueueEvents(queueMetadata, queue) {
203
+ const events = this.findQueueEvents(queueMetadata);
204
+ const instance = this.getOrCreateInstance(queueMetadata);
205
+ this.eventBinder.bindQueueEvents(queue, events, instance);
206
+ }
207
+ findQueueEvents(queueMetadata) {
208
+ const all = this.discoveryService.discoverQueueEvents();
209
+ return all.filter(e => {
210
+ return e.target === queueMetadata.target.prototype;
211
+ });
212
+ }
213
+ registerQueueProvider(name, queue) {
214
+ const token = (0, inject_queue_decorator_1.getQueueToken)(name);
215
+ const ProxyFactory = (0, queue_proxy_factory_service_1.createQueueProxyFactory)(queue);
216
+ this.injector.container.addProvider(token, {
217
+ provide: token,
218
+ useClass: ProxyFactory,
219
+ scope: core_1.ProviderScope.SINGLETON,
220
+ });
221
+ }
222
+ };
223
+ exports.QueueOrchestration = QueueOrchestration;
224
+ __decorate([
225
+ (0, core_1.OnApplicationInit)(100),
226
+ __metadata("design:type", Function),
227
+ __metadata("design:paramtypes", []),
228
+ __metadata("design:returntype", Promise)
229
+ ], QueueOrchestration.prototype, "onApplicationInit", null);
230
+ __decorate([
231
+ (0, core_1.OnApplicationShutdown)(),
232
+ __metadata("design:type", Function),
233
+ __metadata("design:paramtypes", []),
234
+ __metadata("design:returntype", Promise)
235
+ ], QueueOrchestration.prototype, "onApplicationShutdown", null);
236
+ exports.QueueOrchestration = QueueOrchestration = __decorate([
237
+ (0, core_1.Service)(),
238
+ __metadata("design:paramtypes", [queue_registry_1.QueueRegistry,
239
+ queue_discovery_service_1.QueueDiscoveryService,
240
+ queue_builder_service_1.QueueBuilderService,
241
+ event_binder_service_1.EventBinderService,
242
+ core_1.InjectorService])
243
+ ], QueueOrchestration);