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
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"decorators.d.ts","sourceRoot":"","sources":["../../src/decorators/decorators.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,680 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.InjectAtomicQueue = exports.JobType = exports.EntityId = exports.AtomicProcessor = exports.JOB_QUERY_METADATA = exports.JOB_COMMAND_METADATA = exports.ON_TERMINATE_WORKER_METADATA = exports.ON_SPAWN_WORKER_METADATA = exports.GET_DESIRED_WORKER_COUNT_METADATA = exports.GET_ACTIVE_ENTITIES_METADATA = exports.ENTITY_SCALER_METADATA = exports.JOB_HANDLER_METADATA = exports.WORKER_PROCESSOR_METADATA = exports.JOB_TYPE_METADATA = exports.ENTITY_ID_METADATA = exports.ENTITY_TYPE_METADATA = exports.ATOMIC_PROCESSOR_METADATA = void 0;
|
|
4
|
-
exports.EntityType = EntityType;
|
|
5
|
-
exports.QueueEntityId = QueueEntityId;
|
|
6
|
-
exports.getEntityType = getEntityType;
|
|
7
|
-
exports.getEntityIdProperty = getEntityIdProperty;
|
|
8
|
-
exports.QueueEntity = QueueEntity;
|
|
9
|
-
exports.WorkerProcessor = WorkerProcessor;
|
|
10
|
-
exports.JobHandler = JobHandler;
|
|
11
|
-
exports.EntityScaler = EntityScaler;
|
|
12
|
-
exports.GetActiveEntities = GetActiveEntities;
|
|
13
|
-
exports.GetDesiredWorkerCount = GetDesiredWorkerCount;
|
|
14
|
-
exports.OnSpawnWorker = OnSpawnWorker;
|
|
15
|
-
exports.OnTerminateWorker = OnTerminateWorker;
|
|
16
|
-
exports.JobCommand = JobCommand;
|
|
17
|
-
exports.JobQuery = JobQuery;
|
|
18
|
-
exports.getJobCommandMetadata = getJobCommandMetadata;
|
|
19
|
-
exports.getJobQueryMetadata = getJobQueryMetadata;
|
|
20
|
-
exports.isJobCommand = isJobCommand;
|
|
21
|
-
exports.isJobQuery = isJobQuery;
|
|
22
|
-
exports.getWorkerProcessorMetadata = getWorkerProcessorMetadata;
|
|
23
|
-
exports.getJobHandlerMetadata = getJobHandlerMetadata;
|
|
24
|
-
exports.getEntityScalerMetadata = getEntityScalerMetadata;
|
|
25
|
-
exports.isWorkerProcessor = isWorkerProcessor;
|
|
26
|
-
exports.isEntityScaler = isEntityScaler;
|
|
27
|
-
const common_1 = require("@nestjs/common");
|
|
28
|
-
// =============================================================================
|
|
29
|
-
// METADATA KEYS
|
|
30
|
-
// =============================================================================
|
|
31
|
-
/**
|
|
32
|
-
* Metadata keys for decorators
|
|
33
|
-
*/
|
|
34
|
-
exports.ATOMIC_PROCESSOR_METADATA = 'atomic:processor';
|
|
35
|
-
exports.ENTITY_TYPE_METADATA = 'atomic:entity-type';
|
|
36
|
-
exports.ENTITY_ID_METADATA = 'atomic:entity-id';
|
|
37
|
-
exports.JOB_TYPE_METADATA = 'atomic:job-type';
|
|
38
|
-
exports.WORKER_PROCESSOR_METADATA = 'atomic:worker-processor';
|
|
39
|
-
exports.JOB_HANDLER_METADATA = 'atomic:job-handler';
|
|
40
|
-
exports.ENTITY_SCALER_METADATA = 'atomic:entity-scaler';
|
|
41
|
-
exports.GET_ACTIVE_ENTITIES_METADATA = 'atomic:get-active-entities';
|
|
42
|
-
exports.GET_DESIRED_WORKER_COUNT_METADATA = 'atomic:get-desired-worker-count';
|
|
43
|
-
exports.ON_SPAWN_WORKER_METADATA = 'atomic:on-spawn-worker';
|
|
44
|
-
exports.ON_TERMINATE_WORKER_METADATA = 'atomic:on-terminate-worker';
|
|
45
|
-
exports.JOB_COMMAND_METADATA = 'atomic:job-command';
|
|
46
|
-
exports.JOB_QUERY_METADATA = 'atomic:job-query';
|
|
47
|
-
// Registry to track @QueueEntityId usage per class (for duplicate detection)
|
|
48
|
-
const queueEntityIdRegistry = new Map();
|
|
49
|
-
// =============================================================================
|
|
50
|
-
// LEGACY DECORATORS (Preserved for backward compatibility)
|
|
51
|
-
// =============================================================================
|
|
52
|
-
/**
|
|
53
|
-
* @AtomicProcessor decorator (LEGACY)
|
|
54
|
-
*
|
|
55
|
-
* Marks a method as an atomic job processor.
|
|
56
|
-
* Can be used on handler methods to auto-register them.
|
|
57
|
-
*
|
|
58
|
-
* @deprecated Use @WorkerProcessor class decorator with @JobHandler method decorators instead
|
|
59
|
-
*
|
|
60
|
-
* @example
|
|
61
|
-
* ```typescript
|
|
62
|
-
* @Injectable()
|
|
63
|
-
* export class MessageProcessor {
|
|
64
|
-
* @AtomicProcessor('send-message')
|
|
65
|
-
* async handleSendMessage(job: Job<IAtomicJobData>) {
|
|
66
|
-
* // Process the job
|
|
67
|
-
* }
|
|
68
|
-
* }
|
|
69
|
-
* ```
|
|
70
|
-
*/
|
|
71
|
-
const AtomicProcessor = (jobType) => {
|
|
72
|
-
return (0, common_1.SetMetadata)(exports.ATOMIC_PROCESSOR_METADATA, jobType);
|
|
73
|
-
};
|
|
74
|
-
exports.AtomicProcessor = AtomicProcessor;
|
|
75
|
-
/**
|
|
76
|
-
* @EntityType decorator
|
|
77
|
-
*
|
|
78
|
-
* Marks a command/query class with its entity type for automatic routing.
|
|
79
|
-
* When present, queueBus.enqueue(cmd) can auto-route without forEntity().
|
|
80
|
-
*
|
|
81
|
-
* @example
|
|
82
|
-
* ```typescript
|
|
83
|
-
* @EntityType('account')
|
|
84
|
-
* export class WithdrawCommand {
|
|
85
|
-
* @QueueEntityId()
|
|
86
|
-
* public readonly accountId: string;
|
|
87
|
-
* public readonly amount: number;
|
|
88
|
-
* }
|
|
89
|
-
*
|
|
90
|
-
* // Can now use direct enqueue:
|
|
91
|
-
* await queueBus.enqueue(new WithdrawCommand(accountId, amount));
|
|
92
|
-
* ```
|
|
93
|
-
*/
|
|
94
|
-
function EntityType(entityType) {
|
|
95
|
-
return (target) => {
|
|
96
|
-
Reflect.defineMetadata(exports.ENTITY_TYPE_METADATA, entityType, target);
|
|
97
|
-
};
|
|
98
|
-
}
|
|
99
|
-
/**
|
|
100
|
-
* @QueueEntityId decorator
|
|
101
|
-
*
|
|
102
|
-
* Marks a property OR constructor parameter as the entity ID for queue routing.
|
|
103
|
-
* Only ONE @QueueEntityId() allowed per class (enforced at decoration time).
|
|
104
|
-
* Overrides module-level defaultEntityId configuration.
|
|
105
|
-
*
|
|
106
|
-
* @example Property decorator:
|
|
107
|
-
* ```typescript
|
|
108
|
-
* export class TransferCommand {
|
|
109
|
-
* @QueueEntityId()
|
|
110
|
-
* public readonly sourceAccountId: string;
|
|
111
|
-
* public readonly amount: number;
|
|
112
|
-
* }
|
|
113
|
-
* ```
|
|
114
|
-
*
|
|
115
|
-
* @example Parameter decorator (recommended):
|
|
116
|
-
* ```typescript
|
|
117
|
-
* @QueueEntity('account')
|
|
118
|
-
* export class TransferCommand {
|
|
119
|
-
* constructor(
|
|
120
|
-
* @QueueEntityId() public readonly sourceAccountId: string,
|
|
121
|
-
* public readonly amount: number,
|
|
122
|
-
* ) {}
|
|
123
|
-
* }
|
|
124
|
-
* ```
|
|
125
|
-
*/
|
|
126
|
-
function QueueEntityId() {
|
|
127
|
-
return (target, propertyKey, parameterIndex) => {
|
|
128
|
-
// Parameter decorator case (on constructor param)
|
|
129
|
-
if (typeof parameterIndex === 'number') {
|
|
130
|
-
const constructor = target;
|
|
131
|
-
const className = constructor.name;
|
|
132
|
-
// Extract parameter name from constructor
|
|
133
|
-
const paramName = getConstructorParamName(constructor, parameterIndex);
|
|
134
|
-
if (!paramName) {
|
|
135
|
-
throw new Error(`Cannot determine parameter name at index ${parameterIndex} in ${className}. ` +
|
|
136
|
-
`Ensure you're using 'public readonly paramName' syntax.`);
|
|
137
|
-
}
|
|
138
|
-
// Check for duplicate
|
|
139
|
-
const existing = queueEntityIdRegistry.get(constructor);
|
|
140
|
-
if (existing) {
|
|
141
|
-
throw new Error(`Multiple @QueueEntityId() decorators on ${className}. ` +
|
|
142
|
-
`Found on '${existing}' and '${paramName}'. ` +
|
|
143
|
-
`Only one parameter/property can be the entity ID.`);
|
|
144
|
-
}
|
|
145
|
-
queueEntityIdRegistry.set(constructor, paramName);
|
|
146
|
-
Reflect.defineMetadata(exports.ENTITY_ID_METADATA, paramName, constructor);
|
|
147
|
-
return;
|
|
148
|
-
}
|
|
149
|
-
// Property decorator case (on class property)
|
|
150
|
-
const constructor = target.constructor;
|
|
151
|
-
const className = constructor.name;
|
|
152
|
-
const propName = String(propertyKey);
|
|
153
|
-
// Check for duplicate @QueueEntityId on same class
|
|
154
|
-
const existing = queueEntityIdRegistry.get(constructor);
|
|
155
|
-
if (existing) {
|
|
156
|
-
throw new Error(`Multiple @QueueEntityId() decorators on ${className}. ` +
|
|
157
|
-
`Found on '${existing}' and '${propName}'. ` +
|
|
158
|
-
`Only one property can be the entity ID.`);
|
|
159
|
-
}
|
|
160
|
-
queueEntityIdRegistry.set(constructor, propName);
|
|
161
|
-
Reflect.defineMetadata(exports.ENTITY_ID_METADATA, propName, constructor);
|
|
162
|
-
};
|
|
163
|
-
}
|
|
164
|
-
/**
|
|
165
|
-
* @deprecated Use @QueueEntityId() instead. This alias is provided for backwards compatibility.
|
|
166
|
-
*/
|
|
167
|
-
exports.EntityId = QueueEntityId;
|
|
168
|
-
/**
|
|
169
|
-
* Extract parameter name from constructor function by parsing its string representation.
|
|
170
|
-
* Works with TypeScript's 'public readonly paramName' shorthand.
|
|
171
|
-
*/
|
|
172
|
-
function getConstructorParamName(constructor, index) {
|
|
173
|
-
const fnStr = constructor.toString();
|
|
174
|
-
// Match constructor parameters - handles various formats
|
|
175
|
-
const constructorMatch = fnStr.match(/constructor\s*\(([^)]*)\)/);
|
|
176
|
-
if (!constructorMatch)
|
|
177
|
-
return undefined;
|
|
178
|
-
const paramsStr = constructorMatch[1];
|
|
179
|
-
if (!paramsStr.trim())
|
|
180
|
-
return undefined;
|
|
181
|
-
// Split by comma, but be careful with nested generics/objects
|
|
182
|
-
const params = splitParams(paramsStr);
|
|
183
|
-
if (index >= params.length)
|
|
184
|
-
return undefined;
|
|
185
|
-
const param = params[index].trim();
|
|
186
|
-
// Extract the actual parameter name, handling:
|
|
187
|
-
// - @Decorator() public readonly paramName: Type
|
|
188
|
-
// - public readonly paramName: Type
|
|
189
|
-
// - paramName: Type
|
|
190
|
-
// - paramName
|
|
191
|
-
const nameMatch = param.match(/(?:@\w+\([^)]*\)\s*)*(?:public\s+)?(?:readonly\s+)?(\w+)/);
|
|
192
|
-
return nameMatch ? nameMatch[1] : undefined;
|
|
193
|
-
}
|
|
194
|
-
/**
|
|
195
|
-
* Split parameter string by commas, respecting nested structures
|
|
196
|
-
*/
|
|
197
|
-
function splitParams(paramsStr) {
|
|
198
|
-
const params = [];
|
|
199
|
-
let current = '';
|
|
200
|
-
let depth = 0;
|
|
201
|
-
for (const char of paramsStr) {
|
|
202
|
-
if (char === '(' || char === '<' || char === '{' || char === '[') {
|
|
203
|
-
depth++;
|
|
204
|
-
current += char;
|
|
205
|
-
}
|
|
206
|
-
else if (char === ')' || char === '>' || char === '}' || char === ']') {
|
|
207
|
-
depth--;
|
|
208
|
-
current += char;
|
|
209
|
-
}
|
|
210
|
-
else if (char === ',' && depth === 0) {
|
|
211
|
-
params.push(current);
|
|
212
|
-
current = '';
|
|
213
|
-
}
|
|
214
|
-
else {
|
|
215
|
-
current += char;
|
|
216
|
-
}
|
|
217
|
-
}
|
|
218
|
-
if (current.trim()) {
|
|
219
|
-
params.push(current);
|
|
220
|
-
}
|
|
221
|
-
return params;
|
|
222
|
-
}
|
|
223
|
-
/**
|
|
224
|
-
* Get the entity type from a command/query class decorated with @EntityType or @QueueEntity
|
|
225
|
-
*/
|
|
226
|
-
function getEntityType(target) {
|
|
227
|
-
return Reflect.getMetadata(exports.ENTITY_TYPE_METADATA, target);
|
|
228
|
-
}
|
|
229
|
-
/**
|
|
230
|
-
* Get the entity ID property name from a class decorated with @QueueEntityId or @QueueEntity
|
|
231
|
-
*/
|
|
232
|
-
function getEntityIdProperty(target) {
|
|
233
|
-
return Reflect.getMetadata(exports.ENTITY_ID_METADATA, target);
|
|
234
|
-
}
|
|
235
|
-
// =============================================================================
|
|
236
|
-
// NEW COMBINED DECORATOR - Less Invasive
|
|
237
|
-
// =============================================================================
|
|
238
|
-
/**
|
|
239
|
-
* @QueueEntity decorator
|
|
240
|
-
*
|
|
241
|
-
* Single decorator that combines @EntityType and @QueueEntityId into one.
|
|
242
|
-
* This is the recommended way to mark commands/queries for queue routing.
|
|
243
|
-
*
|
|
244
|
-
* @param entityType - The entity type for routing (e.g., 'table', 'account')
|
|
245
|
-
* @param entityIdProperty - Optional property name containing the entity ID.
|
|
246
|
-
* If omitted, uses module-level defaultEntityId from entities config.
|
|
247
|
-
*
|
|
248
|
-
* @example
|
|
249
|
-
* // With explicit property name:
|
|
250
|
-
* @QueueEntity('table', 'tableId')
|
|
251
|
-
* export class MakeBetCommand {
|
|
252
|
-
* constructor(
|
|
253
|
-
* public readonly tableId: string, // ← unchanged!
|
|
254
|
-
* public readonly amount: number,
|
|
255
|
-
* ) {}
|
|
256
|
-
* }
|
|
257
|
-
*
|
|
258
|
-
* @example
|
|
259
|
-
* // Using module default (entities config has defaultEntityId: 'tableId'):
|
|
260
|
-
* @QueueEntity('table')
|
|
261
|
-
* export class DealCommand {
|
|
262
|
-
* constructor(
|
|
263
|
-
* public readonly tableId: string,
|
|
264
|
-
* public readonly card: string,
|
|
265
|
-
* ) {}
|
|
266
|
-
* }
|
|
267
|
-
*
|
|
268
|
-
* @example
|
|
269
|
-
* // Then just enqueue directly:
|
|
270
|
-
* await queueBus.enqueue(new MakeBetCommand(tableId, 100));
|
|
271
|
-
*/
|
|
272
|
-
function QueueEntity(entityType, entityIdProperty) {
|
|
273
|
-
return (target) => {
|
|
274
|
-
// Always set entity type
|
|
275
|
-
Reflect.defineMetadata(exports.ENTITY_TYPE_METADATA, entityType, target);
|
|
276
|
-
// Set entity ID property if provided (otherwise falls back to module config)
|
|
277
|
-
if (entityIdProperty) {
|
|
278
|
-
Reflect.defineMetadata(exports.ENTITY_ID_METADATA, entityIdProperty, target);
|
|
279
|
-
}
|
|
280
|
-
};
|
|
281
|
-
}
|
|
282
|
-
/**
|
|
283
|
-
* @JobType decorator (LEGACY)
|
|
284
|
-
*
|
|
285
|
-
* Specifies the job type for a processor method.
|
|
286
|
-
*
|
|
287
|
-
* @deprecated Use @JobHandler method decorator instead
|
|
288
|
-
*/
|
|
289
|
-
const JobType = (jobType) => {
|
|
290
|
-
return (0, common_1.SetMetadata)(exports.JOB_TYPE_METADATA, jobType);
|
|
291
|
-
};
|
|
292
|
-
exports.JobType = JobType;
|
|
293
|
-
/**
|
|
294
|
-
* @InjectAtomicQueue decorator
|
|
295
|
-
*
|
|
296
|
-
* Custom parameter decorator for injecting a specific queue.
|
|
297
|
-
* Useful when you need direct access to a queue in a service.
|
|
298
|
-
*/
|
|
299
|
-
const InjectAtomicQueue = (entityType, entityId) => {
|
|
300
|
-
return (target, propertyKey, parameterIndex) => {
|
|
301
|
-
const existingParams = Reflect.getMetadata('atomic:inject-queue', target, propertyKey) || [];
|
|
302
|
-
existingParams.push({
|
|
303
|
-
type: entityType,
|
|
304
|
-
id: entityId,
|
|
305
|
-
index: parameterIndex,
|
|
306
|
-
});
|
|
307
|
-
Reflect.defineMetadata('atomic:inject-queue', existingParams, target, propertyKey);
|
|
308
|
-
};
|
|
309
|
-
};
|
|
310
|
-
exports.InjectAtomicQueue = InjectAtomicQueue;
|
|
311
|
-
// =============================================================================
|
|
312
|
-
// NEW DECORATORS - Worker-First Architecture
|
|
313
|
-
// =============================================================================
|
|
314
|
-
/**
|
|
315
|
-
* @WorkerProcessor class decorator
|
|
316
|
-
*
|
|
317
|
-
* Marks a class as a worker processor for a specific entity type.
|
|
318
|
-
* Combined with @JobHandler method decorators, this enables declarative
|
|
319
|
-
* job processing with automatic worker creation and management.
|
|
320
|
-
*
|
|
321
|
-
* @example
|
|
322
|
-
* ```typescript
|
|
323
|
-
* @WorkerProcessor({
|
|
324
|
-
* entityType: 'table',
|
|
325
|
-
* queueName: (tableId) => `${tableId}-queue`,
|
|
326
|
-
* workerName: (tableId) => `table-worker-${tableId}`,
|
|
327
|
-
* workerConfig: {
|
|
328
|
-
* concurrency: 1,
|
|
329
|
-
* heartbeatTTL: 3,
|
|
330
|
-
* }
|
|
331
|
-
* })
|
|
332
|
-
* @Injectable()
|
|
333
|
-
* export class TableWorkerProcessor {
|
|
334
|
-
* constructor(private readonly commandBus: CommandBus) {}
|
|
335
|
-
*
|
|
336
|
-
* @JobHandler('make-bet')
|
|
337
|
-
* async handleMakeBet(job: Job<MakeBetData>, entityId: string) {
|
|
338
|
-
* return this.commandBus.execute(new MakeBetCommand(entityId, job.data));
|
|
339
|
-
* }
|
|
340
|
-
*
|
|
341
|
-
* @JobHandler('*') // Wildcard handler for any unmatched job
|
|
342
|
-
* async handleDynamic(job: Job, entityId: string) {
|
|
343
|
-
* // Dynamic handling
|
|
344
|
-
* }
|
|
345
|
-
* }
|
|
346
|
-
* ```
|
|
347
|
-
*/
|
|
348
|
-
function WorkerProcessor(options) {
|
|
349
|
-
return (target) => {
|
|
350
|
-
// Store the options with defaults
|
|
351
|
-
const metadata = {
|
|
352
|
-
...options,
|
|
353
|
-
overrideDefaults: options.overrideDefaults ?? false,
|
|
354
|
-
};
|
|
355
|
-
Reflect.defineMetadata(exports.WORKER_PROCESSOR_METADATA, metadata, target);
|
|
356
|
-
// Mark as injectable if not already
|
|
357
|
-
if (!Reflect.hasMetadata('injectable', target)) {
|
|
358
|
-
Reflect.defineMetadata('injectable', true, target);
|
|
359
|
-
}
|
|
360
|
-
};
|
|
361
|
-
}
|
|
362
|
-
/**
|
|
363
|
-
* @JobHandler method decorator
|
|
364
|
-
*
|
|
365
|
-
* Marks a method as a handler for a specific job name.
|
|
366
|
-
* Use '*' as jobName to create a wildcard handler that catches
|
|
367
|
-
* any jobs not matched by specific handlers.
|
|
368
|
-
*
|
|
369
|
-
* @example
|
|
370
|
-
* ```typescript
|
|
371
|
-
* @JobHandler('make-bet')
|
|
372
|
-
* async handleMakeBet(job: Job<MakeBetData>, entityId: string) {
|
|
373
|
-
* // Handle make-bet jobs
|
|
374
|
-
* }
|
|
375
|
-
*
|
|
376
|
-
* @JobHandler('*')
|
|
377
|
-
* async handleOther(job: Job, entityId: string) {
|
|
378
|
-
* // Handle any other jobs
|
|
379
|
-
* }
|
|
380
|
-
* ```
|
|
381
|
-
*/
|
|
382
|
-
function JobHandler(jobName) {
|
|
383
|
-
return (target, propertyKey, descriptor) => {
|
|
384
|
-
const methodName = String(propertyKey);
|
|
385
|
-
const isWildcard = jobName === '*';
|
|
386
|
-
// Store handler metadata on the method
|
|
387
|
-
const metadata = {
|
|
388
|
-
jobName,
|
|
389
|
-
methodName,
|
|
390
|
-
isWildcard,
|
|
391
|
-
};
|
|
392
|
-
Reflect.defineMetadata(exports.JOB_HANDLER_METADATA, metadata, target, propertyKey);
|
|
393
|
-
// Collect all handlers on the class
|
|
394
|
-
const existingHandlers = Reflect.getMetadata(exports.JOB_HANDLER_METADATA, target.constructor) || [];
|
|
395
|
-
existingHandlers.push(metadata);
|
|
396
|
-
Reflect.defineMetadata(exports.JOB_HANDLER_METADATA, existingHandlers, target.constructor);
|
|
397
|
-
return descriptor;
|
|
398
|
-
};
|
|
399
|
-
}
|
|
400
|
-
/**
|
|
401
|
-
* @EntityScaler class decorator
|
|
402
|
-
*
|
|
403
|
-
* Marks a class as an entity scaler provider for a specific entity type.
|
|
404
|
-
* Methods decorated with @GetActiveEntities, @GetDesiredWorkerCount,
|
|
405
|
-
* @OnSpawnWorker, and @OnTerminateWorker define the scaling behavior.
|
|
406
|
-
*
|
|
407
|
-
* @example
|
|
408
|
-
* ```typescript
|
|
409
|
-
* @EntityScaler({
|
|
410
|
-
* entityType: 'table',
|
|
411
|
-
* maxWorkersPerEntity: 1,
|
|
412
|
-
* })
|
|
413
|
-
* @Injectable()
|
|
414
|
-
* export class TableEntityScaler {
|
|
415
|
-
* constructor(private readonly redis: Redis) {}
|
|
416
|
-
*
|
|
417
|
-
* @GetActiveEntities()
|
|
418
|
-
* async getAllTables(): Promise<string[]> {
|
|
419
|
-
* // Return all table IDs that need workers
|
|
420
|
-
* }
|
|
421
|
-
*
|
|
422
|
-
* @GetDesiredWorkerCount()
|
|
423
|
-
* async getWorkerCount(entityId: string): Promise<number> {
|
|
424
|
-
* return 1; // Each table gets 1 worker
|
|
425
|
-
* }
|
|
426
|
-
*
|
|
427
|
-
* @OnSpawnWorker()
|
|
428
|
-
* async spawnWorker(entityId: string): Promise<void> {
|
|
429
|
-
* // Called when a worker should be spawned
|
|
430
|
-
* }
|
|
431
|
-
* }
|
|
432
|
-
* ```
|
|
433
|
-
*/
|
|
434
|
-
function EntityScaler(options) {
|
|
435
|
-
return (target) => {
|
|
436
|
-
Reflect.defineMetadata(exports.ENTITY_SCALER_METADATA, options, target);
|
|
437
|
-
if (!Reflect.hasMetadata('injectable', target)) {
|
|
438
|
-
Reflect.defineMetadata('injectable', true, target);
|
|
439
|
-
}
|
|
440
|
-
};
|
|
441
|
-
}
|
|
442
|
-
/**
|
|
443
|
-
* @GetActiveEntities method decorator
|
|
444
|
-
*
|
|
445
|
-
* Marks a method that returns all active entity IDs for scaling decisions.
|
|
446
|
-
* Used within an @EntityScaler class.
|
|
447
|
-
*/
|
|
448
|
-
function GetActiveEntities() {
|
|
449
|
-
return (target, propertyKey, descriptor) => {
|
|
450
|
-
Reflect.defineMetadata(exports.GET_ACTIVE_ENTITIES_METADATA, true, target, propertyKey);
|
|
451
|
-
Reflect.defineMetadata(exports.GET_ACTIVE_ENTITIES_METADATA + ':method', String(propertyKey), target.constructor);
|
|
452
|
-
return descriptor;
|
|
453
|
-
};
|
|
454
|
-
}
|
|
455
|
-
/**
|
|
456
|
-
* @GetDesiredWorkerCount method decorator
|
|
457
|
-
*
|
|
458
|
-
* Marks a method that returns the desired worker count for an entity.
|
|
459
|
-
* Used within an @EntityScaler class.
|
|
460
|
-
*/
|
|
461
|
-
function GetDesiredWorkerCount() {
|
|
462
|
-
return (target, propertyKey, descriptor) => {
|
|
463
|
-
Reflect.defineMetadata(exports.GET_DESIRED_WORKER_COUNT_METADATA, true, target, propertyKey);
|
|
464
|
-
Reflect.defineMetadata(exports.GET_DESIRED_WORKER_COUNT_METADATA + ':method', String(propertyKey), target.constructor);
|
|
465
|
-
return descriptor;
|
|
466
|
-
};
|
|
467
|
-
}
|
|
468
|
-
/**
|
|
469
|
-
* @OnSpawnWorker method decorator
|
|
470
|
-
*
|
|
471
|
-
* Marks a method that is called when a worker should be spawned.
|
|
472
|
-
* Used within an @EntityScaler class.
|
|
473
|
-
*/
|
|
474
|
-
function OnSpawnWorker() {
|
|
475
|
-
return (target, propertyKey, descriptor) => {
|
|
476
|
-
Reflect.defineMetadata(exports.ON_SPAWN_WORKER_METADATA, true, target, propertyKey);
|
|
477
|
-
Reflect.defineMetadata(exports.ON_SPAWN_WORKER_METADATA + ':method', String(propertyKey), target.constructor);
|
|
478
|
-
return descriptor;
|
|
479
|
-
};
|
|
480
|
-
}
|
|
481
|
-
/**
|
|
482
|
-
* @OnTerminateWorker method decorator
|
|
483
|
-
*
|
|
484
|
-
* Marks a method that is called when a worker should be terminated.
|
|
485
|
-
* Used within an @EntityScaler class.
|
|
486
|
-
*/
|
|
487
|
-
function OnTerminateWorker() {
|
|
488
|
-
return (target, propertyKey, descriptor) => {
|
|
489
|
-
Reflect.defineMetadata(exports.ON_TERMINATE_WORKER_METADATA, true, target, propertyKey);
|
|
490
|
-
Reflect.defineMetadata(exports.ON_TERMINATE_WORKER_METADATA + ':method', String(propertyKey), target.constructor);
|
|
491
|
-
return descriptor;
|
|
492
|
-
};
|
|
493
|
-
}
|
|
494
|
-
// =============================================================================
|
|
495
|
-
// JOB COMMAND/QUERY DECORATORS - Zero-Boilerplate CQRS Integration
|
|
496
|
-
// =============================================================================
|
|
497
|
-
/**
|
|
498
|
-
* Helper to convert class name to kebab-case job name
|
|
499
|
-
* MakeBetCommand -> make-bet
|
|
500
|
-
* ProcessPaymentCommand -> process-payment
|
|
501
|
-
*/
|
|
502
|
-
function deriveJobName(className, suffix) {
|
|
503
|
-
return className
|
|
504
|
-
.replace(new RegExp(`${suffix}$`), '')
|
|
505
|
-
.replace(/([a-z])([A-Z])/g, '$1-$2')
|
|
506
|
-
.toLowerCase();
|
|
507
|
-
}
|
|
508
|
-
/**
|
|
509
|
-
* Helper to extract constructor parameter names using reflection
|
|
510
|
-
*/
|
|
511
|
-
function getConstructorParamNames(target) {
|
|
512
|
-
const paramTypes = Reflect.getMetadata('design:paramtypes', target) || [];
|
|
513
|
-
// Try to extract parameter names from the constructor string
|
|
514
|
-
const constructorStr = target.toString();
|
|
515
|
-
const match = constructorStr.match(/constructor\s*\(([^)]*)\)/);
|
|
516
|
-
if (match && match[1]) {
|
|
517
|
-
return match[1]
|
|
518
|
-
.split(',')
|
|
519
|
-
.map((param) => {
|
|
520
|
-
// Handle various patterns:
|
|
521
|
-
// "public readonly tableId: string" -> "tableId"
|
|
522
|
-
// "tableId" -> "tableId"
|
|
523
|
-
// "private tableId: string" -> "tableId"
|
|
524
|
-
const cleaned = param.trim();
|
|
525
|
-
const nameMatch = cleaned.match(/(?:public\s+)?(?:private\s+)?(?:protected\s+)?(?:readonly\s+)?(\w+)/);
|
|
526
|
-
return nameMatch ? nameMatch[1] : cleaned;
|
|
527
|
-
})
|
|
528
|
-
.filter((name) => name.length > 0);
|
|
529
|
-
}
|
|
530
|
-
// Fallback: generate param0, param1, etc.
|
|
531
|
-
return paramTypes.map((_, i) => `param${i}`);
|
|
532
|
-
}
|
|
533
|
-
/**
|
|
534
|
-
* @JobCommand class decorator
|
|
535
|
-
*
|
|
536
|
-
* Marks a command class for automatic job routing. When a job with the
|
|
537
|
-
* specified name arrives, the library will automatically instantiate
|
|
538
|
-
* the command with entityId + job.data and execute it via CommandBus.
|
|
539
|
-
*
|
|
540
|
-
* This eliminates the need for @JobHandler boilerplate in processors.
|
|
541
|
-
*
|
|
542
|
-
* @example
|
|
543
|
-
* ```typescript
|
|
544
|
-
* // Option 1: Explicit job name
|
|
545
|
-
* @JobCommand('make-bet')
|
|
546
|
-
* export class MakeBetCommand {
|
|
547
|
-
* constructor(
|
|
548
|
-
* public readonly tableId: string, // entityId (first param)
|
|
549
|
-
* public readonly playerId: string,
|
|
550
|
-
* public readonly amount: number,
|
|
551
|
-
* ) {}
|
|
552
|
-
* }
|
|
553
|
-
*
|
|
554
|
-
* // Option 2: Auto-derived job name (MakeBetCommand -> 'make-bet')
|
|
555
|
-
* @JobCommand()
|
|
556
|
-
* export class MakeBetCommand { ... }
|
|
557
|
-
*
|
|
558
|
-
* // Option 3: With options
|
|
559
|
-
* @JobCommand({
|
|
560
|
-
* name: 'place-bet',
|
|
561
|
-
* entityType: 'table',
|
|
562
|
-
* entityIdParam: 'tableId', // or 0 for first param
|
|
563
|
-
* })
|
|
564
|
-
* export class PlaceBetCommand { ... }
|
|
565
|
-
* ```
|
|
566
|
-
*/
|
|
567
|
-
function JobCommand(options) {
|
|
568
|
-
return (target) => {
|
|
569
|
-
const opts = typeof options === 'string'
|
|
570
|
-
? { name: options }
|
|
571
|
-
: (options || {});
|
|
572
|
-
const jobName = opts.name || deriveJobName(target.name, 'Command');
|
|
573
|
-
const paramNames = getConstructorParamNames(target);
|
|
574
|
-
const metadata = {
|
|
575
|
-
jobName,
|
|
576
|
-
entityType: opts.entityType,
|
|
577
|
-
entityIdParam: opts.entityIdParam ?? 0,
|
|
578
|
-
targetClass: target,
|
|
579
|
-
paramNames,
|
|
580
|
-
};
|
|
581
|
-
Reflect.defineMetadata(exports.JOB_COMMAND_METADATA, metadata, target);
|
|
582
|
-
};
|
|
583
|
-
}
|
|
584
|
-
/**
|
|
585
|
-
* @JobQuery class decorator
|
|
586
|
-
*
|
|
587
|
-
* Marks a query class for automatic job routing. When a job with the
|
|
588
|
-
* specified name arrives, the library will automatically instantiate
|
|
589
|
-
* the query with entityId + job.data and execute it via QueryBus.
|
|
590
|
-
*
|
|
591
|
-
* @example
|
|
592
|
-
* ```typescript
|
|
593
|
-
* @JobQuery('get-score')
|
|
594
|
-
* export class GetScoreQuery {
|
|
595
|
-
* constructor(
|
|
596
|
-
* public readonly tableId: string,
|
|
597
|
-
* public readonly seatIndex: number,
|
|
598
|
-
* ) {}
|
|
599
|
-
* }
|
|
600
|
-
*
|
|
601
|
-
* // Auto-derived: GetTableStateQuery -> 'get-table-state'
|
|
602
|
-
* @JobQuery()
|
|
603
|
-
* export class GetTableStateQuery { ... }
|
|
604
|
-
* ```
|
|
605
|
-
*/
|
|
606
|
-
function JobQuery(options) {
|
|
607
|
-
return (target) => {
|
|
608
|
-
const opts = typeof options === 'string'
|
|
609
|
-
? { name: options }
|
|
610
|
-
: (options || {});
|
|
611
|
-
const jobName = opts.name || deriveJobName(target.name, 'Query');
|
|
612
|
-
const paramNames = getConstructorParamNames(target);
|
|
613
|
-
const metadata = {
|
|
614
|
-
jobName,
|
|
615
|
-
entityType: opts.entityType,
|
|
616
|
-
entityIdParam: opts.entityIdParam ?? 0,
|
|
617
|
-
targetClass: target,
|
|
618
|
-
paramNames,
|
|
619
|
-
};
|
|
620
|
-
Reflect.defineMetadata(exports.JOB_QUERY_METADATA, metadata, target);
|
|
621
|
-
};
|
|
622
|
-
}
|
|
623
|
-
/**
|
|
624
|
-
* Get JobCommand metadata from a class
|
|
625
|
-
*/
|
|
626
|
-
function getJobCommandMetadata(target) {
|
|
627
|
-
return Reflect.getMetadata(exports.JOB_COMMAND_METADATA, target);
|
|
628
|
-
}
|
|
629
|
-
/**
|
|
630
|
-
* Get JobQuery metadata from a class
|
|
631
|
-
*/
|
|
632
|
-
function getJobQueryMetadata(target) {
|
|
633
|
-
return Reflect.getMetadata(exports.JOB_QUERY_METADATA, target);
|
|
634
|
-
}
|
|
635
|
-
/**
|
|
636
|
-
* Check if a class is a JobCommand
|
|
637
|
-
*/
|
|
638
|
-
function isJobCommand(target) {
|
|
639
|
-
return Reflect.hasMetadata(exports.JOB_COMMAND_METADATA, target);
|
|
640
|
-
}
|
|
641
|
-
/**
|
|
642
|
-
* Check if a class is a JobQuery
|
|
643
|
-
*/
|
|
644
|
-
function isJobQuery(target) {
|
|
645
|
-
return Reflect.hasMetadata(exports.JOB_QUERY_METADATA, target);
|
|
646
|
-
}
|
|
647
|
-
// =============================================================================
|
|
648
|
-
// UTILITY FUNCTIONS
|
|
649
|
-
// =============================================================================
|
|
650
|
-
/**
|
|
651
|
-
* Get WorkerProcessor metadata from a class
|
|
652
|
-
*/
|
|
653
|
-
function getWorkerProcessorMetadata(target) {
|
|
654
|
-
return Reflect.getMetadata(exports.WORKER_PROCESSOR_METADATA, target);
|
|
655
|
-
}
|
|
656
|
-
/**
|
|
657
|
-
* Get all JobHandler metadata from a class
|
|
658
|
-
*/
|
|
659
|
-
function getJobHandlerMetadata(target) {
|
|
660
|
-
return Reflect.getMetadata(exports.JOB_HANDLER_METADATA, target) || [];
|
|
661
|
-
}
|
|
662
|
-
/**
|
|
663
|
-
* Get EntityScaler metadata from a class
|
|
664
|
-
*/
|
|
665
|
-
function getEntityScalerMetadata(target) {
|
|
666
|
-
return Reflect.getMetadata(exports.ENTITY_SCALER_METADATA, target);
|
|
667
|
-
}
|
|
668
|
-
/**
|
|
669
|
-
* Check if a class is a WorkerProcessor
|
|
670
|
-
*/
|
|
671
|
-
function isWorkerProcessor(target) {
|
|
672
|
-
return Reflect.hasMetadata(exports.WORKER_PROCESSOR_METADATA, target);
|
|
673
|
-
}
|
|
674
|
-
/**
|
|
675
|
-
* Check if a class is an EntityScaler
|
|
676
|
-
*/
|
|
677
|
-
function isEntityScaler(target) {
|
|
678
|
-
return Reflect.hasMetadata(exports.ENTITY_SCALER_METADATA, target);
|
|
679
|
-
}
|
|
680
|
-
//# sourceMappingURL=decorators.js.map
|