atomic-queues 1.4.1 → 1.6.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 +300 -283
- package/dist/decorators/constants.d.ts +17 -0
- package/dist/decorators/constants.d.ts.map +1 -0
- package/dist/decorators/constants.js +23 -0
- package/dist/decorators/constants.js.map +1 -0
- package/dist/decorators/entity.decorators.d.ts +88 -0
- package/dist/decorators/entity.decorators.d.ts.map +1 -0
- package/dist/decorators/entity.decorators.js +150 -0
- package/dist/decorators/entity.decorators.js.map +1 -0
- package/dist/decorators/index.d.ts +9 -1
- package/dist/decorators/index.d.ts.map +1 -1
- package/dist/decorators/index.js +9 -1
- package/dist/decorators/index.js.map +1 -1
- package/dist/decorators/interfaces.d.ts +130 -0
- package/dist/decorators/interfaces.d.ts.map +1 -0
- package/dist/decorators/interfaces.js +3 -0
- package/dist/decorators/interfaces.js.map +1 -0
- package/dist/decorators/job.decorators.d.ts +60 -0
- package/dist/decorators/job.decorators.d.ts.map +1 -0
- package/dist/decorators/job.decorators.js +97 -0
- package/dist/decorators/job.decorators.js.map +1 -0
- package/dist/decorators/legacy.decorators.d.ts +36 -0
- package/dist/decorators/legacy.decorators.d.ts.map +1 -0
- package/dist/decorators/legacy.decorators.js +61 -0
- package/dist/decorators/legacy.decorators.js.map +1 -0
- package/dist/decorators/metadata-readers.d.ts +31 -0
- package/dist/decorators/metadata-readers.d.ts.map +1 -0
- package/dist/decorators/metadata-readers.js +53 -0
- package/dist/decorators/metadata-readers.js.map +1 -0
- package/dist/decorators/registry.d.ts +2 -0
- package/dist/decorators/registry.d.ts.map +1 -0
- package/dist/decorators/registry.js +6 -0
- package/dist/decorators/registry.js.map +1 -0
- package/dist/decorators/scaler.decorators.d.ts +65 -0
- package/dist/decorators/scaler.decorators.d.ts.map +1 -0
- package/dist/decorators/scaler.decorators.js +103 -0
- package/dist/decorators/scaler.decorators.js.map +1 -0
- package/dist/decorators/type-guards.d.ts +18 -0
- package/dist/decorators/type-guards.d.ts.map +1 -0
- package/dist/decorators/type-guards.js +32 -0
- package/dist/decorators/type-guards.js.map +1 -0
- package/dist/decorators/utils.d.ts +20 -0
- package/dist/decorators/utils.d.ts.map +1 -0
- package/dist/decorators/utils.js +98 -0
- package/dist/decorators/utils.js.map +1 -0
- package/dist/decorators/worker.decorators.d.ts +58 -0
- package/dist/decorators/worker.decorators.d.ts.map +1 -0
- package/dist/decorators/worker.decorators.js +92 -0
- package/dist/decorators/worker.decorators.js.map +1 -0
- package/dist/domain/interfaces/config.interfaces.d.ts +188 -0
- package/dist/domain/interfaces/config.interfaces.d.ts.map +1 -0
- package/dist/domain/interfaces/config.interfaces.js +3 -0
- package/dist/domain/interfaces/config.interfaces.js.map +1 -0
- package/dist/domain/interfaces/cqrs.interfaces.d.ts +7 -0
- package/dist/domain/interfaces/cqrs.interfaces.d.ts.map +1 -0
- package/dist/domain/interfaces/cqrs.interfaces.js +3 -0
- package/dist/domain/interfaces/cqrs.interfaces.js.map +1 -0
- package/dist/domain/interfaces/event.interfaces.d.ts +71 -0
- package/dist/domain/interfaces/event.interfaces.d.ts.map +1 -0
- package/dist/domain/interfaces/event.interfaces.js +3 -0
- package/dist/domain/interfaces/event.interfaces.js.map +1 -0
- package/dist/domain/interfaces/index-tracking.interfaces.d.ts +69 -0
- package/dist/domain/interfaces/index-tracking.interfaces.d.ts.map +1 -0
- package/dist/domain/interfaces/index-tracking.interfaces.js +3 -0
- package/dist/domain/interfaces/index-tracking.interfaces.js.map +1 -0
- package/dist/domain/interfaces/index.d.ts +12 -0
- package/dist/domain/interfaces/index.d.ts.map +1 -0
- package/dist/domain/interfaces/index.js +28 -0
- package/dist/domain/interfaces/index.js.map +1 -0
- package/dist/domain/interfaces/job.interfaces.d.ts +76 -0
- package/dist/domain/interfaces/job.interfaces.d.ts.map +1 -0
- package/dist/domain/interfaces/job.interfaces.js +3 -0
- package/dist/domain/interfaces/job.interfaces.js.map +1 -0
- package/dist/domain/interfaces/lock.interfaces.d.ts +54 -0
- package/dist/domain/interfaces/lock.interfaces.d.ts.map +1 -0
- package/dist/domain/interfaces/lock.interfaces.js +3 -0
- package/dist/domain/interfaces/lock.interfaces.js.map +1 -0
- package/dist/domain/interfaces/process.interfaces.d.ts +44 -0
- package/dist/domain/interfaces/process.interfaces.d.ts.map +1 -0
- package/dist/domain/interfaces/process.interfaces.js +3 -0
- package/dist/domain/interfaces/process.interfaces.js.map +1 -0
- package/dist/domain/interfaces/queue.interfaces.d.ts +46 -0
- package/dist/domain/interfaces/queue.interfaces.d.ts.map +1 -0
- package/dist/domain/interfaces/queue.interfaces.js +3 -0
- package/dist/domain/interfaces/queue.interfaces.js.map +1 -0
- package/dist/domain/interfaces/scaling.interfaces.d.ts +62 -0
- package/dist/domain/interfaces/scaling.interfaces.d.ts.map +1 -0
- package/dist/domain/interfaces/scaling.interfaces.js +3 -0
- package/dist/domain/interfaces/scaling.interfaces.js.map +1 -0
- package/dist/domain/interfaces/utility.types.d.ts +15 -0
- package/dist/domain/interfaces/utility.types.d.ts.map +1 -0
- package/dist/domain/interfaces/utility.types.js +3 -0
- package/dist/domain/interfaces/utility.types.js.map +1 -0
- package/dist/domain/interfaces/worker.interfaces.d.ts +120 -0
- package/dist/domain/interfaces/worker.interfaces.d.ts.map +1 -0
- package/dist/domain/interfaces/worker.interfaces.js +3 -0
- package/dist/domain/interfaces/worker.interfaces.js.map +1 -0
- package/dist/module/atomic-queues.module.d.ts.map +1 -1
- package/dist/module/atomic-queues.module.js +5 -0
- package/dist/module/atomic-queues.module.js.map +1 -1
- package/dist/services/cron-manager/cron-manager.service.d.ts +5 -4
- package/dist/services/cron-manager/cron-manager.service.d.ts.map +1 -1
- package/dist/services/cron-manager/cron-manager.service.js +26 -57
- package/dist/services/cron-manager/cron-manager.service.js.map +1 -1
- package/dist/services/index-manager/index-manager.service.d.ts +0 -4
- package/dist/services/index-manager/index-manager.service.d.ts.map +1 -1
- package/dist/services/index-manager/index-manager.service.js +4 -16
- package/dist/services/index-manager/index-manager.service.js.map +1 -1
- package/dist/services/index.d.ts +1 -0
- package/dist/services/index.d.ts.map +1 -1
- package/dist/services/index.js +1 -0
- package/dist/services/index.js.map +1 -1
- package/dist/services/processor-discovery/decorator-discovery.service.d.ts +40 -0
- package/dist/services/processor-discovery/decorator-discovery.service.d.ts.map +1 -0
- package/dist/services/processor-discovery/decorator-discovery.service.js +191 -0
- package/dist/services/processor-discovery/decorator-discovery.service.js.map +1 -0
- package/dist/services/processor-discovery/index.d.ts +4 -0
- package/dist/services/processor-discovery/index.d.ts.map +1 -1
- package/dist/services/processor-discovery/index.js +4 -0
- package/dist/services/processor-discovery/index.js.map +1 -1
- package/dist/services/processor-discovery/processor-discovery.service.d.ts +30 -138
- package/dist/services/processor-discovery/processor-discovery.service.d.ts.map +1 -1
- package/dist/services/processor-discovery/processor-discovery.service.js +125 -502
- package/dist/services/processor-discovery/processor-discovery.service.js.map +1 -1
- package/dist/services/processor-discovery/processor-registry.d.ts +58 -0
- package/dist/services/processor-discovery/processor-registry.d.ts.map +1 -0
- package/dist/services/processor-discovery/processor-registry.js +74 -0
- package/dist/services/processor-discovery/processor-registry.js.map +1 -0
- package/dist/services/processor-discovery/scaling-registration.service.d.ts +60 -0
- package/dist/services/processor-discovery/scaling-registration.service.d.ts.map +1 -0
- package/dist/services/processor-discovery/scaling-registration.service.js +261 -0
- package/dist/services/processor-discovery/scaling-registration.service.js.map +1 -0
- package/dist/services/processor-discovery/worker-factory.service.d.ts +54 -0
- package/dist/services/processor-discovery/worker-factory.service.d.ts.map +1 -0
- package/dist/services/processor-discovery/worker-factory.service.js +185 -0
- package/dist/services/processor-discovery/worker-factory.service.js.map +1 -0
- package/dist/services/queue-bus/entity-target.d.ts +58 -0
- package/dist/services/queue-bus/entity-target.d.ts.map +1 -0
- package/dist/services/queue-bus/entity-target.js +109 -0
- package/dist/services/queue-bus/entity-target.js.map +1 -0
- package/dist/services/queue-bus/index.d.ts +4 -0
- package/dist/services/queue-bus/index.d.ts.map +1 -1
- package/dist/services/queue-bus/index.js +4 -0
- package/dist/services/queue-bus/index.js.map +1 -1
- package/dist/services/queue-bus/queue-bus.service.d.ts +9 -145
- package/dist/services/queue-bus/queue-bus.service.d.ts.map +1 -1
- package/dist/services/queue-bus/queue-bus.service.js +23 -311
- package/dist/services/queue-bus/queue-bus.service.js.map +1 -1
- package/dist/services/queue-bus/queue-bus.types.d.ts +40 -0
- package/dist/services/queue-bus/queue-bus.types.d.ts.map +1 -0
- package/dist/services/queue-bus/queue-bus.types.js +3 -0
- package/dist/services/queue-bus/queue-bus.types.js.map +1 -0
- package/dist/services/queue-bus/queue-bus.utils.d.ts +34 -0
- package/dist/services/queue-bus/queue-bus.utils.d.ts.map +1 -0
- package/dist/services/queue-bus/queue-bus.utils.js +82 -0
- package/dist/services/queue-bus/queue-bus.utils.js.map +1 -0
- package/dist/services/queue-bus/queue-target.d.ts +61 -0
- package/dist/services/queue-bus/queue-target.d.ts.map +1 -0
- package/dist/services/queue-bus/queue-target.js +123 -0
- package/dist/services/queue-bus/queue-target.js.map +1 -0
- package/dist/services/queue-events-manager/queue-events-manager.service.d.ts +23 -6
- package/dist/services/queue-events-manager/queue-events-manager.service.d.ts.map +1 -1
- package/dist/services/queue-events-manager/queue-events-manager.service.js +69 -37
- package/dist/services/queue-events-manager/queue-events-manager.service.js.map +1 -1
- package/dist/services/resource-lock/resource-lock.service.d.ts +0 -4
- package/dist/services/resource-lock/resource-lock.service.d.ts.map +1 -1
- package/dist/services/resource-lock/resource-lock.service.js +4 -16
- package/dist/services/resource-lock/resource-lock.service.js.map +1 -1
- package/dist/services/service-queue/index.d.ts +1 -0
- package/dist/services/service-queue/index.d.ts.map +1 -1
- package/dist/services/service-queue/index.js +1 -0
- package/dist/services/service-queue/index.js.map +1 -1
- package/dist/services/service-queue/service-queue.service.d.ts +2 -35
- package/dist/services/service-queue/service-queue.service.d.ts.map +1 -1
- package/dist/services/service-queue/service-queue.service.js +17 -49
- package/dist/services/service-queue/service-queue.service.js.map +1 -1
- package/dist/services/service-queue/service-queue.types.d.ts +32 -0
- package/dist/services/service-queue/service-queue.types.d.ts.map +1 -0
- package/dist/services/service-queue/service-queue.types.js +27 -0
- package/dist/services/service-queue/service-queue.types.js.map +1 -0
- package/dist/services/spawn-queue/index.d.ts +2 -0
- package/dist/services/spawn-queue/index.d.ts.map +1 -0
- package/dist/services/spawn-queue/index.js +18 -0
- package/dist/services/spawn-queue/index.js.map +1 -0
- package/dist/services/spawn-queue/spawn-queue.service.d.ts +119 -0
- package/dist/services/spawn-queue/spawn-queue.service.d.ts.map +1 -0
- package/dist/services/spawn-queue/spawn-queue.service.js +273 -0
- package/dist/services/spawn-queue/spawn-queue.service.js.map +1 -0
- package/dist/services/worker-manager/worker-manager.service.d.ts +18 -3
- package/dist/services/worker-manager/worker-manager.service.d.ts.map +1 -1
- package/dist/services/worker-manager/worker-manager.service.js +46 -21
- package/dist/services/worker-manager/worker-manager.service.js.map +1 -1
- package/dist/utils/async.utils.d.ts +51 -0
- package/dist/utils/async.utils.d.ts.map +1 -0
- package/dist/utils/async.utils.js +87 -0
- package/dist/utils/async.utils.js.map +1 -0
- package/dist/utils/helpers.d.ts +4 -123
- package/dist/utils/helpers.d.ts.map +1 -1
- package/dist/utils/helpers.js +18 -226
- package/dist/utils/helpers.js.map +1 -1
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +1 -0
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/job.utils.d.ts +50 -0
- package/dist/utils/job.utils.d.ts.map +1 -0
- package/dist/utils/job.utils.js +89 -0
- package/dist/utils/job.utils.js.map +1 -0
- package/dist/utils/naming.utils.d.ts +21 -0
- package/dist/utils/naming.utils.d.ts.map +1 -0
- package/dist/utils/naming.utils.js +38 -0
- package/dist/utils/naming.utils.js.map +1 -0
- package/dist/utils/rate-limit.utils.d.ts +9 -0
- package/dist/utils/rate-limit.utils.d.ts.map +1 -0
- package/dist/utils/rate-limit.utils.js +30 -0
- package/dist/utils/rate-limit.utils.js.map +1 -0
- package/dist/utils/redis.utils.d.ts +3 -0
- package/dist/utils/redis.utils.d.ts.map +1 -0
- package/dist/utils/redis.utils.js +14 -0
- package/dist/utils/redis.utils.js.map +1 -0
- package/package.json +17 -17
- package/dist/decorators/decorators.d.ts +0 -489
- package/dist/decorators/decorators.d.ts.map +0 -1
- package/dist/decorators/decorators.js +0 -680
- package/dist/decorators/decorators.js.map +0 -1
- package/dist/domain/interfaces.d.ts +0 -748
- package/dist/domain/interfaces.d.ts.map +0 -1
- package/dist/domain/interfaces.js +0 -19
- package/dist/domain/interfaces.js.map +0 -1
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.WorkerProcessor = WorkerProcessor;
|
|
4
|
+
exports.JobHandler = JobHandler;
|
|
5
|
+
const constants_1 = require("./constants");
|
|
6
|
+
/**
|
|
7
|
+
* @WorkerProcessor class decorator
|
|
8
|
+
*
|
|
9
|
+
* Marks a class as a worker processor for a specific entity type.
|
|
10
|
+
* Combined with @JobHandler method decorators, this enables declarative
|
|
11
|
+
* job processing with automatic worker creation and management.
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```typescript
|
|
15
|
+
* @WorkerProcessor({
|
|
16
|
+
* entityType: 'table',
|
|
17
|
+
* queueName: (tableId) => `${tableId}-queue`,
|
|
18
|
+
* workerName: (tableId) => `table-worker-${tableId}`,
|
|
19
|
+
* workerConfig: {
|
|
20
|
+
* concurrency: 1,
|
|
21
|
+
* heartbeatTTL: 3,
|
|
22
|
+
* }
|
|
23
|
+
* })
|
|
24
|
+
* @Injectable()
|
|
25
|
+
* export class TableWorkerProcessor {
|
|
26
|
+
* constructor(private readonly commandBus: CommandBus) {}
|
|
27
|
+
*
|
|
28
|
+
* @JobHandler('make-bet')
|
|
29
|
+
* async handleMakeBet(job: Job<MakeBetData>, entityId: string) {
|
|
30
|
+
* return this.commandBus.execute(new MakeBetCommand(entityId, job.data));
|
|
31
|
+
* }
|
|
32
|
+
*
|
|
33
|
+
* @JobHandler('*') // Wildcard handler for any unmatched job
|
|
34
|
+
* async handleDynamic(job: Job, entityId: string) {
|
|
35
|
+
* // Dynamic handling
|
|
36
|
+
* }
|
|
37
|
+
* }
|
|
38
|
+
* ```
|
|
39
|
+
*/
|
|
40
|
+
function WorkerProcessor(options) {
|
|
41
|
+
return (target) => {
|
|
42
|
+
// Store the options with defaults
|
|
43
|
+
const metadata = {
|
|
44
|
+
...options,
|
|
45
|
+
overrideDefaults: options.overrideDefaults ?? false,
|
|
46
|
+
};
|
|
47
|
+
Reflect.defineMetadata(constants_1.WORKER_PROCESSOR_METADATA, metadata, target);
|
|
48
|
+
// Mark as injectable if not already
|
|
49
|
+
if (!Reflect.hasMetadata('injectable', target)) {
|
|
50
|
+
Reflect.defineMetadata('injectable', true, target);
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* @JobHandler method decorator
|
|
56
|
+
*
|
|
57
|
+
* Marks a method as a handler for a specific job name.
|
|
58
|
+
* Use '*' as jobName to create a wildcard handler that catches
|
|
59
|
+
* any jobs not matched by specific handlers.
|
|
60
|
+
*
|
|
61
|
+
* @example
|
|
62
|
+
* ```typescript
|
|
63
|
+
* @JobHandler('make-bet')
|
|
64
|
+
* async handleMakeBet(job: Job<MakeBetData>, entityId: string) {
|
|
65
|
+
* // Handle make-bet jobs
|
|
66
|
+
* }
|
|
67
|
+
*
|
|
68
|
+
* @JobHandler('*')
|
|
69
|
+
* async handleOther(job: Job, entityId: string) {
|
|
70
|
+
* // Handle any other jobs
|
|
71
|
+
* }
|
|
72
|
+
* ```
|
|
73
|
+
*/
|
|
74
|
+
function JobHandler(jobName) {
|
|
75
|
+
return (target, propertyKey, descriptor) => {
|
|
76
|
+
const methodName = String(propertyKey);
|
|
77
|
+
const isWildcard = jobName === '*';
|
|
78
|
+
// Store handler metadata on the method
|
|
79
|
+
const metadata = {
|
|
80
|
+
jobName,
|
|
81
|
+
methodName,
|
|
82
|
+
isWildcard,
|
|
83
|
+
};
|
|
84
|
+
Reflect.defineMetadata(constants_1.JOB_HANDLER_METADATA, metadata, target, propertyKey);
|
|
85
|
+
// Collect all handlers on the class
|
|
86
|
+
const existingHandlers = Reflect.getMetadata(constants_1.JOB_HANDLER_METADATA, target.constructor) || [];
|
|
87
|
+
existingHandlers.push(metadata);
|
|
88
|
+
Reflect.defineMetadata(constants_1.JOB_HANDLER_METADATA, existingHandlers, target.constructor);
|
|
89
|
+
return descriptor;
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=worker.decorators.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker.decorators.js","sourceRoot":"","sources":["../../src/decorators/worker.decorators.ts"],"names":[],"mappings":";;AAqCA,0CAcC;AAsBD,gCAyBC;AAlGD,2CAA8E;AAG9E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,SAAgB,eAAe,CAAC,OAA+B;IAC7D,OAAO,CAAC,MAAgB,EAAE,EAAE;QAC1B,kCAAkC;QAClC,MAAM,QAAQ,GAAG;YACf,GAAG,OAAO;YACV,gBAAgB,EAAE,OAAO,CAAC,gBAAgB,IAAI,KAAK;SACpD,CAAC;QACF,OAAO,CAAC,cAAc,CAAC,qCAAyB,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;QAEpE,oCAAoC;QACpC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,YAAY,EAAE,MAAM,CAAC,EAAE,CAAC;YAC/C,OAAO,CAAC,cAAc,CAAC,YAAY,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;QACrD,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,SAAgB,UAAU,CAAC,OAAe;IACxC,OAAO,CACL,MAAc,EACd,WAA4B,EAC5B,UAA8B,EAC9B,EAAE;QACF,MAAM,UAAU,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC;QACvC,MAAM,UAAU,GAAG,OAAO,KAAK,GAAG,CAAC;QAEnC,uCAAuC;QACvC,MAAM,QAAQ,GAAuB;YACnC,OAAO;YACP,UAAU;YACV,UAAU;SACX,CAAC;QACF,OAAO,CAAC,cAAc,CAAC,gCAAoB,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;QAE5E,oCAAoC;QACpC,MAAM,gBAAgB,GACpB,OAAO,CAAC,WAAW,CAAC,gCAAoB,EAAE,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;QACtE,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAChC,OAAO,CAAC,cAAc,CAAC,gCAAoB,EAAE,gBAAgB,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;QAEnF,OAAO,UAAU,CAAC;IACpB,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Redis connection configuration
|
|
3
|
+
*/
|
|
4
|
+
export interface IRedisConfig {
|
|
5
|
+
host?: string;
|
|
6
|
+
port?: number;
|
|
7
|
+
password?: string;
|
|
8
|
+
db?: number;
|
|
9
|
+
url?: string;
|
|
10
|
+
maxRetriesPerRequest?: number | null;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Worker configuration options
|
|
14
|
+
*/
|
|
15
|
+
export interface IWorkerConfig {
|
|
16
|
+
/** Number of concurrent jobs a worker can process */
|
|
17
|
+
concurrency?: number;
|
|
18
|
+
/** Interval in ms to check for stalled jobs */
|
|
19
|
+
stalledInterval?: number;
|
|
20
|
+
/** Duration in ms that a job lock is held */
|
|
21
|
+
lockDuration?: number;
|
|
22
|
+
/** Maximum number of times a job can be marked as stalled before failing */
|
|
23
|
+
maxStalledCount?: number;
|
|
24
|
+
/** Heartbeat TTL in seconds for worker liveness tracking */
|
|
25
|
+
heartbeatTTL?: number;
|
|
26
|
+
/** Interval in ms between heartbeat updates */
|
|
27
|
+
heartbeatInterval?: number;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Queue configuration options
|
|
31
|
+
*/
|
|
32
|
+
export interface IQueueConfig {
|
|
33
|
+
/** Default job options for the queue */
|
|
34
|
+
defaultJobOptions?: IJobOptions;
|
|
35
|
+
/** Limiter configuration for rate limiting */
|
|
36
|
+
limiter?: {
|
|
37
|
+
groupKey?: string;
|
|
38
|
+
max?: number;
|
|
39
|
+
duration?: number;
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Job configuration options
|
|
44
|
+
*/
|
|
45
|
+
export interface IJobOptions {
|
|
46
|
+
/** Remove job from queue when completed */
|
|
47
|
+
removeOnComplete?: boolean | number;
|
|
48
|
+
/** Remove job from queue when failed */
|
|
49
|
+
removeOnFail?: boolean | number;
|
|
50
|
+
/** Number of attempts before marking as failed */
|
|
51
|
+
attempts?: number;
|
|
52
|
+
/** Backoff strategy for retries */
|
|
53
|
+
backoff?: {
|
|
54
|
+
type: 'fixed' | 'exponential';
|
|
55
|
+
delay: number;
|
|
56
|
+
};
|
|
57
|
+
/** Job priority (lower = higher priority) */
|
|
58
|
+
priority?: number;
|
|
59
|
+
/** Delay in ms before the job becomes available */
|
|
60
|
+
delay?: number;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Service queue configuration for global singleton operations
|
|
64
|
+
*/
|
|
65
|
+
export interface IServiceQueueConfig {
|
|
66
|
+
/** Whether to enable the service queue (default: true) */
|
|
67
|
+
enabled?: boolean;
|
|
68
|
+
/** Custom queue name (default: {keyPrefix}-service-queue) */
|
|
69
|
+
queueName?: string;
|
|
70
|
+
/** Custom worker name (default: {keyPrefix}-service-worker) */
|
|
71
|
+
workerName?: string;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Entity-specific configuration for per-entity queue defaults
|
|
75
|
+
* Used in module-level `entities` config to define defaults per entity type.
|
|
76
|
+
*
|
|
77
|
+
* When configured in the module, entities automatically get:
|
|
78
|
+
* - Worker spawning when jobs arrive (via QueueEvents)
|
|
79
|
+
* - Idle worker termination (via CronManager)
|
|
80
|
+
* - Job routing via CQRS CommandBus/QueryBus
|
|
81
|
+
*
|
|
82
|
+
* No @WorkerProcessor class needed!
|
|
83
|
+
*
|
|
84
|
+
* @example
|
|
85
|
+
* ```typescript
|
|
86
|
+
* AtomicQueuesModule.forRoot({
|
|
87
|
+
* redis: { host: 'localhost', port: 6379 },
|
|
88
|
+
* enableCronManager: true,
|
|
89
|
+
* entities: {
|
|
90
|
+
* account: {
|
|
91
|
+
* queueName: (id) => `${id}-queue`,
|
|
92
|
+
* workerName: (id) => `${id}-worker`,
|
|
93
|
+
* maxWorkersPerEntity: 1,
|
|
94
|
+
* idleTimeoutSeconds: 15,
|
|
95
|
+
* },
|
|
96
|
+
* },
|
|
97
|
+
* })
|
|
98
|
+
* ```
|
|
99
|
+
*/
|
|
100
|
+
export interface IEntityConfig {
|
|
101
|
+
/**
|
|
102
|
+
* Default property name to use for entity ID extraction.
|
|
103
|
+
* This is used when commands don't have an @QueueEntityId() decorator.
|
|
104
|
+
* Example: 'tableId', 'accountId', 'userId'
|
|
105
|
+
*/
|
|
106
|
+
defaultEntityId?: string;
|
|
107
|
+
/**
|
|
108
|
+
* Custom queue name generator for this entity type.
|
|
109
|
+
* If not provided, uses: {keyPrefix}:{entityType}:{entityId}:queue
|
|
110
|
+
*/
|
|
111
|
+
queueName?: (entityId: string) => string;
|
|
112
|
+
/**
|
|
113
|
+
* Custom worker name generator for this entity type.
|
|
114
|
+
* If not provided, uses: {keyPrefix}:{entityType}:{entityId}:worker
|
|
115
|
+
*/
|
|
116
|
+
workerName?: (entityId: string) => string;
|
|
117
|
+
/** Worker configuration overrides for this entity type */
|
|
118
|
+
workerConfig?: Partial<IWorkerConfig>;
|
|
119
|
+
/**
|
|
120
|
+
* Maximum workers per entity (default: 1).
|
|
121
|
+
* Determines how many concurrent workers can process jobs for a single entity.
|
|
122
|
+
*/
|
|
123
|
+
maxWorkersPerEntity?: number;
|
|
124
|
+
/**
|
|
125
|
+
* Idle timeout in seconds before a worker is terminated (default: 15).
|
|
126
|
+
* Workers are terminated when they have no jobs to process for this duration.
|
|
127
|
+
*/
|
|
128
|
+
idleTimeoutSeconds?: number;
|
|
129
|
+
/**
|
|
130
|
+
* If true, workers are automatically spawned when jobs arrive (default: true).
|
|
131
|
+
* When enabled, no @WorkerProcessor or @EntityScaler is required.
|
|
132
|
+
*/
|
|
133
|
+
autoSpawn?: boolean;
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Main module configuration
|
|
137
|
+
*/
|
|
138
|
+
export interface IAtomicQueuesModuleConfig {
|
|
139
|
+
/** Redis connection configuration */
|
|
140
|
+
redis: IRedisConfig;
|
|
141
|
+
/** Default worker configuration */
|
|
142
|
+
workerDefaults?: IWorkerConfig;
|
|
143
|
+
/** Default queue configuration */
|
|
144
|
+
queueDefaults?: IQueueConfig;
|
|
145
|
+
/** Enable cron-based worker management */
|
|
146
|
+
enableCronManager?: boolean;
|
|
147
|
+
/** Cron interval in ms for worker management cycle */
|
|
148
|
+
cronInterval?: number;
|
|
149
|
+
/** Prefix for all Redis keys */
|
|
150
|
+
keyPrefix?: string;
|
|
151
|
+
/** Service queue configuration for global atomic operations */
|
|
152
|
+
serviceQueue?: IServiceQueueConfig;
|
|
153
|
+
/** Enable verbose logging (debug logs for service jobs, scaling cycles, etc.) */
|
|
154
|
+
verbose?: boolean;
|
|
155
|
+
/**
|
|
156
|
+
* Auto-register commands from @nestjs/cqrs handlers (default: true)
|
|
157
|
+
* When enabled, all @CommandHandler and @QueryHandler decorated classes
|
|
158
|
+
* are automatically discovered and registered with QueueBus.
|
|
159
|
+
*/
|
|
160
|
+
autoRegisterCommands?: boolean;
|
|
161
|
+
/**
|
|
162
|
+
* Per-entity type configuration.
|
|
163
|
+
* Allows setting defaults for specific entity types (e.g., 'table', 'account').
|
|
164
|
+
* These defaults are merged with processor-level and command-level settings.
|
|
165
|
+
*
|
|
166
|
+
* Priority chain (highest to lowest):
|
|
167
|
+
* 1. @QueueEntityId() decorator on command property
|
|
168
|
+
* 2. @WorkerProcessor({ defaultEntityId })
|
|
169
|
+
* 3. entities[entityType].defaultEntityId
|
|
170
|
+
* 4. Error (no fallback to magic extraction)
|
|
171
|
+
*
|
|
172
|
+
* @example
|
|
173
|
+
* ```typescript
|
|
174
|
+
* entities: {
|
|
175
|
+
* table: {
|
|
176
|
+
* defaultEntityId: 'tableId',
|
|
177
|
+
* workerConfig: { concurrency: 1 }
|
|
178
|
+
* },
|
|
179
|
+
* account: {
|
|
180
|
+
* defaultEntityId: 'accountId',
|
|
181
|
+
* queueName: (id) => `accounts-${id}-queue`
|
|
182
|
+
* }
|
|
183
|
+
* }
|
|
184
|
+
* ```
|
|
185
|
+
*/
|
|
186
|
+
entities?: Record<string, IEntityConfig>;
|
|
187
|
+
}
|
|
188
|
+
//# sourceMappingURL=config.interfaces.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.interfaces.d.ts","sourceRoot":"","sources":["../../../src/domain/interfaces/config.interfaces.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.interfaces.js","sourceRoot":"","sources":["../../../src/domain/interfaces/config.interfaces.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cqrs.interfaces.d.ts","sourceRoot":"","sources":["../../../src/domain/interfaces/cqrs.interfaces.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;IAC1B,OAAO,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;CACtC;AAED,MAAM,WAAW,SAAS;IACxB,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;CACpC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cqrs.interfaces.js","sourceRoot":"","sources":["../../../src/domain/interfaces/cqrs.interfaces.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Event types for pub/sub communication
|
|
3
|
+
*/
|
|
4
|
+
export type AtomicQueueEventType = 'worker:shutdown' | 'worker:ready' | 'worker:closed' | 'job:completed' | 'job:failed' | 'job:progress' | 'queue:closed' | 'custom';
|
|
5
|
+
/**
|
|
6
|
+
* Event payload structure
|
|
7
|
+
*/
|
|
8
|
+
export interface IAtomicQueueEvent<T = unknown> {
|
|
9
|
+
type: AtomicQueueEventType;
|
|
10
|
+
nodeId: string;
|
|
11
|
+
workerId?: string;
|
|
12
|
+
entityId?: string;
|
|
13
|
+
entityType?: string;
|
|
14
|
+
timestamp: Date;
|
|
15
|
+
data?: T;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Event bus interface for internal pub/sub
|
|
19
|
+
*/
|
|
20
|
+
export interface IEventBus {
|
|
21
|
+
/**
|
|
22
|
+
* Publish an event
|
|
23
|
+
*/
|
|
24
|
+
publish<T>(channel: string, event: IAtomicQueueEvent<T>): Promise<void>;
|
|
25
|
+
/**
|
|
26
|
+
* Subscribe to a channel
|
|
27
|
+
*/
|
|
28
|
+
subscribe(channel: string, handler: (event: IAtomicQueueEvent) => void | Promise<void>): Promise<void>;
|
|
29
|
+
/**
|
|
30
|
+
* Unsubscribe from a channel
|
|
31
|
+
*/
|
|
32
|
+
unsubscribe(channel: string): Promise<void>;
|
|
33
|
+
/**
|
|
34
|
+
* Subscribe to worker shutdown events for a specific worker
|
|
35
|
+
*/
|
|
36
|
+
subscribeToWorkerShutdown(workerName: string, handler: () => void | Promise<void>): Promise<void>;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Socket connection tracking interface
|
|
40
|
+
*/
|
|
41
|
+
export interface IConnectionTracker {
|
|
42
|
+
/**
|
|
43
|
+
* Track a socket connection for an entity
|
|
44
|
+
*/
|
|
45
|
+
trackConnection(entityType: string, entityId: string, socketId: string, nodeId: string): Promise<void>;
|
|
46
|
+
/**
|
|
47
|
+
* Untrack a socket connection
|
|
48
|
+
*/
|
|
49
|
+
untrackConnection(entityType: string, entityId: string, socketId: string): Promise<void>;
|
|
50
|
+
/**
|
|
51
|
+
* Get all socket connections for an entity
|
|
52
|
+
*/
|
|
53
|
+
getEntityConnections(entityType: string, entityId: string): Promise<string[]>;
|
|
54
|
+
/**
|
|
55
|
+
* Get entity connections for a specific node
|
|
56
|
+
*/
|
|
57
|
+
getEntityNodeConnections(entityType: string, entityId: string, nodeId: string): Promise<string[]>;
|
|
58
|
+
/**
|
|
59
|
+
* Untrack all connections for current node
|
|
60
|
+
*/
|
|
61
|
+
untrackNodeConnections(): Promise<void>;
|
|
62
|
+
/**
|
|
63
|
+
* Check if entity has active connections
|
|
64
|
+
*/
|
|
65
|
+
hasActiveConnections(entityType: string, entityId: string): Promise<boolean>;
|
|
66
|
+
/**
|
|
67
|
+
* Get node ID for a socket connection
|
|
68
|
+
*/
|
|
69
|
+
getNodeForSocket(entityType: string, entityId: string, socketId: string): Promise<string | null>;
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=event.interfaces.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event.interfaces.d.ts","sourceRoot":"","sources":["../../../src/domain/interfaces/event.interfaces.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,MAAM,oBAAoB,GAC5B,iBAAiB,GACjB,cAAc,GACd,eAAe,GACf,eAAe,GACf,YAAY,GACZ,cAAc,GACd,cAAc,GACd,QAAQ,CAAC;AAEb;;GAEG;AACH,MAAM,WAAW,iBAAiB,CAAC,CAAC,GAAG,OAAO;IAC5C,IAAI,EAAE,oBAAoB,CAAC;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,IAAI,CAAC;IAChB,IAAI,CAAC,EAAE,CAAC,CAAC;CACV;AAED;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB;;OAEG;IACH,OAAO,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,iBAAiB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAExE;;OAEG;IACH,SAAS,CACP,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAC1D,OAAO,CAAC,IAAI,CAAC,CAAC;IAEjB;;OAEG;IACH,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE5C;;OAEG;IACH,yBAAyB,CACvB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAClC,OAAO,CAAC,IAAI,CAAC,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC;;OAEG;IACH,eAAe,CACb,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC,CAAC;IAEjB;;OAEG;IACH,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEzF;;OAEG;IACH,oBAAoB,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAE9E;;OAEG;IACH,wBAAwB,CACtB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAErB;;OAEG;IACH,sBAAsB,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAExC;;OAEG;IACH,oBAAoB,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAE7E;;OAEG;IACH,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;CAClG"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event.interfaces.js","sourceRoot":"","sources":["../../../src/domain/interfaces/event.interfaces.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Index entry for tracking jobs, workers, queues
|
|
3
|
+
*/
|
|
4
|
+
export interface IIndexEntry {
|
|
5
|
+
id: string;
|
|
6
|
+
type: 'job' | 'worker' | 'queue' | 'death' | 'custom';
|
|
7
|
+
entityId: string;
|
|
8
|
+
entityType: string;
|
|
9
|
+
createdAt: Date;
|
|
10
|
+
metadata?: Record<string, unknown>;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Index manager interface for tracking various entities
|
|
14
|
+
*/
|
|
15
|
+
export interface IIndexManager {
|
|
16
|
+
/**
|
|
17
|
+
* Index a job for an entity
|
|
18
|
+
*/
|
|
19
|
+
indexJob(entityType: string, entityId: string, jobId: string): Promise<void>;
|
|
20
|
+
/**
|
|
21
|
+
* Remove job index
|
|
22
|
+
*/
|
|
23
|
+
removeJobIndex(entityType: string, entityId: string, jobId: string): Promise<void>;
|
|
24
|
+
/**
|
|
25
|
+
* Get all job IDs for an entity
|
|
26
|
+
*/
|
|
27
|
+
getEntityJobs(entityType: string, entityId: string): Promise<string[]>;
|
|
28
|
+
/**
|
|
29
|
+
* Get all entities with jobs
|
|
30
|
+
*/
|
|
31
|
+
getEntitiesWithJobs(entityType: string): Promise<Record<string, number>>;
|
|
32
|
+
/**
|
|
33
|
+
* Index a worker death signal
|
|
34
|
+
*/
|
|
35
|
+
indexWorkerDeath(entityType: string, entityId: string, deathId: string): Promise<void>;
|
|
36
|
+
/**
|
|
37
|
+
* Remove worker death index
|
|
38
|
+
*/
|
|
39
|
+
removeWorkerDeathIndex(entityType: string, entityId: string, deathId: string): Promise<void>;
|
|
40
|
+
/**
|
|
41
|
+
* Get queued worker deaths for an entity
|
|
42
|
+
*/
|
|
43
|
+
getQueuedWorkerDeaths(entityType: string, entityId: string): Promise<string[]>;
|
|
44
|
+
/**
|
|
45
|
+
* Index entity queue
|
|
46
|
+
*/
|
|
47
|
+
indexEntityQueue(entityType: string, entityId: string): Promise<void>;
|
|
48
|
+
/**
|
|
49
|
+
* Remove entity queue index
|
|
50
|
+
*/
|
|
51
|
+
removeEntityQueueIndex(entityType: string, entityId: string): Promise<void>;
|
|
52
|
+
/**
|
|
53
|
+
* Get all entities with active queues
|
|
54
|
+
*/
|
|
55
|
+
getEntitiesWithQueues(entityType: string): Promise<string[]>;
|
|
56
|
+
/**
|
|
57
|
+
* Index a queue death signal
|
|
58
|
+
*/
|
|
59
|
+
indexQueueDeath(entityType: string, entityId: string): Promise<void>;
|
|
60
|
+
/**
|
|
61
|
+
* Remove queue death index
|
|
62
|
+
*/
|
|
63
|
+
removeQueueDeathIndex(entityType: string, entityId: string): Promise<void>;
|
|
64
|
+
/**
|
|
65
|
+
* Get all entities with queued queue deaths
|
|
66
|
+
*/
|
|
67
|
+
getEntitiesWithQueuedQueueDeaths(entityType: string): Promise<string[]>;
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=index-tracking.interfaces.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-tracking.interfaces.d.ts","sourceRoot":"","sources":["../../../src/domain/interfaces/index-tracking.interfaces.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,KAAK,GAAG,QAAQ,GAAG,OAAO,GAAG,OAAO,GAAG,QAAQ,CAAC;IACtD,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,IAAI,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B;;OAEG;IACH,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE7E;;OAEG;IACH,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEnF;;OAEG;IACH,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAEvE;;OAEG;IACH,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAEzE;;OAEG;IACH,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEvF;;OAEG;IACH,sBAAsB,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE7F;;OAEG;IACH,qBAAqB,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAE/E;;OAEG;IACH,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEtE;;OAEG;IACH,sBAAsB,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE5E;;OAEG;IACH,qBAAqB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAE7D;;OAEG;IACH,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAErE;;OAEG;IACH,qBAAqB,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE3E;;OAEG;IACH,gCAAgC,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;CACzE"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-tracking.interfaces.js","sourceRoot":"","sources":["../../../src/domain/interfaces/index-tracking.interfaces.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export * from './config.interfaces';
|
|
2
|
+
export * from './queue.interfaces';
|
|
3
|
+
export * from './worker.interfaces';
|
|
4
|
+
export * from './lock.interfaces';
|
|
5
|
+
export * from './job.interfaces';
|
|
6
|
+
export * from './scaling.interfaces';
|
|
7
|
+
export * from './index-tracking.interfaces';
|
|
8
|
+
export * from './event.interfaces';
|
|
9
|
+
export * from './process.interfaces';
|
|
10
|
+
export * from './cqrs.interfaces';
|
|
11
|
+
export * from './utility.types';
|
|
12
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/domain/interfaces/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,sBAAsB,CAAC;AACrC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
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("./config.interfaces"), exports);
|
|
18
|
+
__exportStar(require("./queue.interfaces"), exports);
|
|
19
|
+
__exportStar(require("./worker.interfaces"), exports);
|
|
20
|
+
__exportStar(require("./lock.interfaces"), exports);
|
|
21
|
+
__exportStar(require("./job.interfaces"), exports);
|
|
22
|
+
__exportStar(require("./scaling.interfaces"), exports);
|
|
23
|
+
__exportStar(require("./index-tracking.interfaces"), exports);
|
|
24
|
+
__exportStar(require("./event.interfaces"), exports);
|
|
25
|
+
__exportStar(require("./process.interfaces"), exports);
|
|
26
|
+
__exportStar(require("./cqrs.interfaces"), exports);
|
|
27
|
+
__exportStar(require("./utility.types"), exports);
|
|
28
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/domain/interfaces/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,sDAAoC;AACpC,qDAAmC;AACnC,sDAAoC;AACpC,oDAAkC;AAClC,mDAAiC;AACjC,uDAAqC;AACrC,8DAA4C;AAC5C,qDAAmC;AACnC,uDAAqC;AACrC,oDAAkC;AAClC,kDAAgC"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { Job } from 'bullmq';
|
|
2
|
+
/**
|
|
3
|
+
* Job data structure for atomic processing
|
|
4
|
+
*/
|
|
5
|
+
export interface IAtomicJobData<T = unknown> {
|
|
6
|
+
/** Unique job identifier */
|
|
7
|
+
uuid: string;
|
|
8
|
+
/** Entity ID this job belongs to */
|
|
9
|
+
entityId: string;
|
|
10
|
+
/** Entity type (user, table, etc.) */
|
|
11
|
+
entityType: string;
|
|
12
|
+
/** Command/Query class name to execute */
|
|
13
|
+
commandName?: string;
|
|
14
|
+
/** Type of operation */
|
|
15
|
+
type: 'command' | 'query' | 'custom';
|
|
16
|
+
/** Payload data */
|
|
17
|
+
payload: T;
|
|
18
|
+
/** Additional metadata */
|
|
19
|
+
metadata?: Record<string, unknown>;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Job processing result
|
|
23
|
+
*/
|
|
24
|
+
export interface IJobResult<T = unknown> {
|
|
25
|
+
success: boolean;
|
|
26
|
+
result?: T;
|
|
27
|
+
error?: string;
|
|
28
|
+
processingTime: number;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Job processor function type
|
|
32
|
+
*/
|
|
33
|
+
export type JobProcessor<T = unknown, R = unknown> = (job: Job<IAtomicJobData<T>>) => Promise<R>;
|
|
34
|
+
/**
|
|
35
|
+
* Job processor registry interface
|
|
36
|
+
*/
|
|
37
|
+
export interface IJobProcessorRegistry {
|
|
38
|
+
/**
|
|
39
|
+
* Register a processor for a job type
|
|
40
|
+
*/
|
|
41
|
+
registerProcessor<T, R>(jobType: string, processor: JobProcessor<T, R>): void;
|
|
42
|
+
/**
|
|
43
|
+
* Get processor for a job type
|
|
44
|
+
*/
|
|
45
|
+
getProcessor<T, R>(jobType: string): JobProcessor<T, R> | undefined;
|
|
46
|
+
/**
|
|
47
|
+
* Check if processor exists
|
|
48
|
+
*/
|
|
49
|
+
hasProcessor(jobType: string): boolean;
|
|
50
|
+
/**
|
|
51
|
+
* Get all registered job types
|
|
52
|
+
*/
|
|
53
|
+
getRegisteredTypes(): string[];
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Dynamic command/query executor interface
|
|
57
|
+
*/
|
|
58
|
+
export interface IDynamicExecutor {
|
|
59
|
+
/**
|
|
60
|
+
* Execute a command by class name
|
|
61
|
+
*/
|
|
62
|
+
executeCommand<T>(commandName: string, payload: T): Promise<unknown>;
|
|
63
|
+
/**
|
|
64
|
+
* Execute a query by class name
|
|
65
|
+
*/
|
|
66
|
+
executeQuery<T>(queryName: string, payload: T): Promise<unknown>;
|
|
67
|
+
/**
|
|
68
|
+
* Register command module for dynamic loading
|
|
69
|
+
*/
|
|
70
|
+
registerCommandModule(modulePath: string): void;
|
|
71
|
+
/**
|
|
72
|
+
* Register query module for dynamic loading
|
|
73
|
+
*/
|
|
74
|
+
registerQueryModule(modulePath: string): void;
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=job.interfaces.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"job.interfaces.d.ts","sourceRoot":"","sources":["../../../src/domain/interfaces/job.interfaces.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,QAAQ,CAAC;AAE7B;;GAEG;AACH,MAAM,WAAW,cAAc,CAAC,CAAC,GAAG,OAAO;IACzC,4BAA4B;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,oCAAoC;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,sCAAsC;IACtC,UAAU,EAAE,MAAM,CAAC;IACnB,0CAA0C;IAC1C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,wBAAwB;IACxB,IAAI,EAAE,SAAS,GAAG,OAAO,GAAG,QAAQ,CAAC;IACrC,mBAAmB;IACnB,OAAO,EAAE,CAAC,CAAC;IACX,0BAA0B;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED;;GAEG;AACH,MAAM,WAAW,UAAU,CAAC,CAAC,GAAG,OAAO;IACrC,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,CAAC,CAAC;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,MAAM,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,MAAM,YAAY,CAAC,CAAC,GAAG,OAAO,EAAE,CAAC,GAAG,OAAO,IAAI,CACnD,GAAG,EAAE,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,KACxB,OAAO,CAAC,CAAC,CAAC,CAAC;AAEhB;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC;;OAEG;IACH,iBAAiB,CAAC,CAAC,EAAE,CAAC,EACpB,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC,GAC5B,IAAI,CAAC;IAER;;OAEG;IACH,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,MAAM,GAAG,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,SAAS,CAAC;IAEpE;;OAEG;IACH,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC;IAEvC;;OAEG;IACH,kBAAkB,IAAI,MAAM,EAAE,CAAC;CAChC;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;OAEG;IACH,cAAc,CAAC,CAAC,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAErE;;OAEG;IACH,YAAY,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAEjE;;OAEG;IACH,qBAAqB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAEhD;;OAEG;IACH,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/C"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"job.interfaces.js","sourceRoot":"","sources":["../../../src/domain/interfaces/job.interfaces.ts"],"names":[],"mappings":""}
|