nodejs-task-scheduler 1.0.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/.claude/settings.local.json +20 -0
- package/.github/workflows/ci.yml +266 -0
- package/.github/workflows/release.yml +117 -0
- package/CHANGELOG.md +43 -0
- package/README.md +653 -0
- package/dist/__tests__/setup.d.ts +2 -0
- package/dist/__tests__/setup.d.ts.map +1 -0
- package/dist/__tests__/setup.js +24 -0
- package/dist/__tests__/setup.js.map +1 -0
- package/dist/decorators/index.d.ts +80 -0
- package/dist/decorators/index.d.ts.map +1 -0
- package/dist/decorators/index.js +171 -0
- package/dist/decorators/index.js.map +1 -0
- package/dist/decorators/metadata.d.ts +59 -0
- package/dist/decorators/metadata.d.ts.map +1 -0
- package/dist/decorators/metadata.js +68 -0
- package/dist/decorators/metadata.js.map +1 -0
- package/dist/decorators/registry.d.ts +42 -0
- package/dist/decorators/registry.d.ts.map +1 -0
- package/dist/decorators/registry.js +182 -0
- package/dist/decorators/registry.js.map +1 -0
- package/dist/index.d.ts +74 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +198 -0
- package/dist/index.js.map +1 -0
- package/dist/queue/index.d.ts +19 -0
- package/dist/queue/index.d.ts.map +1 -0
- package/dist/queue/index.js +89 -0
- package/dist/queue/index.js.map +1 -0
- package/dist/scheduler/index.d.ts +13 -0
- package/dist/scheduler/index.d.ts.map +1 -0
- package/dist/scheduler/index.js +102 -0
- package/dist/scheduler/index.js.map +1 -0
- package/dist/types/index.d.ts +63 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +12 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/load-balancer.d.ts +36 -0
- package/dist/utils/load-balancer.d.ts.map +1 -0
- package/dist/utils/load-balancer.js +158 -0
- package/dist/utils/load-balancer.js.map +1 -0
- package/dist/utils/rabbitmq.d.ts +18 -0
- package/dist/utils/rabbitmq.d.ts.map +1 -0
- package/dist/utils/rabbitmq.js +114 -0
- package/dist/utils/rabbitmq.js.map +1 -0
- package/dist/worker/index.d.ts +20 -0
- package/dist/worker/index.d.ts.map +1 -0
- package/dist/worker/index.js +138 -0
- package/dist/worker/index.js.map +1 -0
- package/package.json +63 -0
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import 'reflect-metadata';
|
|
2
|
+
export interface JobOptions {
|
|
3
|
+
name?: string;
|
|
4
|
+
queue?: string;
|
|
5
|
+
priority?: number;
|
|
6
|
+
attempts?: number;
|
|
7
|
+
backoff?: {
|
|
8
|
+
type: 'fixed' | 'exponential';
|
|
9
|
+
delay: number;
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
export interface CronJobOptions {
|
|
13
|
+
schedule: string;
|
|
14
|
+
name?: string;
|
|
15
|
+
timezone?: string;
|
|
16
|
+
queue?: string;
|
|
17
|
+
priority?: number;
|
|
18
|
+
attempts?: number;
|
|
19
|
+
backoff?: {
|
|
20
|
+
type: 'fixed' | 'exponential';
|
|
21
|
+
delay: number;
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
export interface QueueOptions {
|
|
25
|
+
name: string;
|
|
26
|
+
durable?: boolean;
|
|
27
|
+
exclusive?: boolean;
|
|
28
|
+
autoDelete?: boolean;
|
|
29
|
+
arguments?: any;
|
|
30
|
+
}
|
|
31
|
+
export interface WorkerOptions {
|
|
32
|
+
name?: string;
|
|
33
|
+
concurrency?: number;
|
|
34
|
+
queues?: string[];
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Decorator to mark a method as a job handler
|
|
38
|
+
* @param options Job configuration options
|
|
39
|
+
*/
|
|
40
|
+
export declare function Job(options?: JobOptions): MethodDecorator;
|
|
41
|
+
/**
|
|
42
|
+
* Decorator to mark a method as a cron job handler
|
|
43
|
+
* @param options Cron job configuration options
|
|
44
|
+
*/
|
|
45
|
+
export declare function CronJob(options: CronJobOptions): MethodDecorator;
|
|
46
|
+
/**
|
|
47
|
+
* Decorator to define queue configuration for a class
|
|
48
|
+
* @param options Queue configuration options
|
|
49
|
+
*/
|
|
50
|
+
export declare function Queue(options: QueueOptions): ClassDecorator;
|
|
51
|
+
/**
|
|
52
|
+
* Decorator to define worker configuration for a class
|
|
53
|
+
* @param options Worker configuration options
|
|
54
|
+
*/
|
|
55
|
+
export declare function Worker(options?: WorkerOptions): ClassDecorator;
|
|
56
|
+
/**
|
|
57
|
+
* Decorator to mark a method as a singleton job (concurrency: 1)
|
|
58
|
+
* @param options Job configuration options
|
|
59
|
+
*/
|
|
60
|
+
export declare function SingletonJob(options?: JobOptions): MethodDecorator;
|
|
61
|
+
/**
|
|
62
|
+
* Decorator to mark a method as a high priority job
|
|
63
|
+
* @param options Job configuration options
|
|
64
|
+
*/
|
|
65
|
+
export declare function HighPriorityJob(options?: JobOptions): MethodDecorator;
|
|
66
|
+
/**
|
|
67
|
+
* Decorator to mark a method as a low priority job
|
|
68
|
+
* @param options Job configuration options
|
|
69
|
+
*/
|
|
70
|
+
export declare function LowPriorityJob(options?: JobOptions): MethodDecorator;
|
|
71
|
+
/**
|
|
72
|
+
* Decorator to add retry configuration to a job
|
|
73
|
+
* @param attempts Number of retry attempts
|
|
74
|
+
* @param backoffType Type of backoff strategy
|
|
75
|
+
* @param delay Initial delay in milliseconds
|
|
76
|
+
*/
|
|
77
|
+
export declare function Retry(attempts?: number, backoffType?: 'fixed' | 'exponential', delay?: number): MethodDecorator;
|
|
78
|
+
export { MetadataStore } from './metadata';
|
|
79
|
+
export * from './metadata';
|
|
80
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/decorators/index.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC;AAS1B,MAAM,WAAW,UAAU;IACzB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE;QACR,IAAI,EAAE,OAAO,GAAG,aAAa,CAAC;QAC9B,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;CACH;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE;QACR,IAAI,EAAE,OAAO,GAAG,aAAa,CAAC;QAC9B,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;CACH;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,SAAS,CAAC,EAAE,GAAG,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAED;;;GAGG;AACH,wBAAgB,GAAG,CAAC,OAAO,GAAE,UAAe,GAAG,eAAe,CAwB7D;AAED;;;GAGG;AACH,wBAAgB,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,eAAe,CA0BhE;AAED;;;GAGG;AACH,wBAAgB,KAAK,CAAC,OAAO,EAAE,YAAY,GAAG,cAAc,CAY3D;AAED;;;GAGG;AACH,wBAAgB,MAAM,CAAC,OAAO,GAAE,aAAkB,GAAG,cAAc,CAUlE;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,OAAO,GAAE,UAAe,GAAG,eAAe,CAKtE;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,OAAO,GAAE,UAAe,GAAG,eAAe,CAKzE;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,OAAO,GAAE,UAAe,GAAG,eAAe,CAKxE;AAED;;;;;GAKG;AACH,wBAAgB,KAAK,CACnB,QAAQ,GAAE,MAAU,EACpB,WAAW,GAAE,OAAO,GAAG,aAA6B,EACpD,KAAK,GAAE,MAAa,GACnB,eAAe,CAoBjB;AAGD,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,cAAc,YAAY,CAAC"}
|
|
@@ -0,0 +1,171 @@
|
|
|
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.MetadataStore = void 0;
|
|
18
|
+
exports.Job = Job;
|
|
19
|
+
exports.CronJob = CronJob;
|
|
20
|
+
exports.Queue = Queue;
|
|
21
|
+
exports.Worker = Worker;
|
|
22
|
+
exports.SingletonJob = SingletonJob;
|
|
23
|
+
exports.HighPriorityJob = HighPriorityJob;
|
|
24
|
+
exports.LowPriorityJob = LowPriorityJob;
|
|
25
|
+
exports.Retry = Retry;
|
|
26
|
+
require("reflect-metadata");
|
|
27
|
+
const metadata_1 = require("./metadata");
|
|
28
|
+
/**
|
|
29
|
+
* Decorator to mark a method as a job handler
|
|
30
|
+
* @param options Job configuration options
|
|
31
|
+
*/
|
|
32
|
+
function Job(options = {}) {
|
|
33
|
+
return function (target, propertyKey, descriptor) {
|
|
34
|
+
if (typeof propertyKey !== 'string') {
|
|
35
|
+
throw new Error('Job decorator can only be applied to string property keys');
|
|
36
|
+
}
|
|
37
|
+
const metadata = {
|
|
38
|
+
name: options.name || propertyKey,
|
|
39
|
+
queue: options.queue,
|
|
40
|
+
priority: options.priority,
|
|
41
|
+
attempts: options.attempts,
|
|
42
|
+
backoff: options.backoff
|
|
43
|
+
};
|
|
44
|
+
metadata_1.MetadataStore.setJobMetadata(target, propertyKey, metadata);
|
|
45
|
+
// Ensure the original method is preserved
|
|
46
|
+
if (descriptor && descriptor.value) {
|
|
47
|
+
const originalMethod = descriptor.value;
|
|
48
|
+
descriptor.value = async function (...args) {
|
|
49
|
+
return await originalMethod.apply(this, args);
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Decorator to mark a method as a cron job handler
|
|
56
|
+
* @param options Cron job configuration options
|
|
57
|
+
*/
|
|
58
|
+
function CronJob(options) {
|
|
59
|
+
return function (target, propertyKey, descriptor) {
|
|
60
|
+
if (typeof propertyKey !== 'string') {
|
|
61
|
+
throw new Error('CronJob decorator can only be applied to string property keys');
|
|
62
|
+
}
|
|
63
|
+
const metadata = {
|
|
64
|
+
name: options.name || propertyKey,
|
|
65
|
+
schedule: options.schedule,
|
|
66
|
+
timezone: options.timezone,
|
|
67
|
+
queue: options.queue,
|
|
68
|
+
priority: options.priority,
|
|
69
|
+
attempts: options.attempts,
|
|
70
|
+
backoff: options.backoff
|
|
71
|
+
};
|
|
72
|
+
metadata_1.MetadataStore.setCronJobMetadata(target, propertyKey, metadata);
|
|
73
|
+
// Ensure the original method is preserved
|
|
74
|
+
if (descriptor && descriptor.value) {
|
|
75
|
+
const originalMethod = descriptor.value;
|
|
76
|
+
descriptor.value = async function (...args) {
|
|
77
|
+
return await originalMethod.apply(this, args);
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Decorator to define queue configuration for a class
|
|
84
|
+
* @param options Queue configuration options
|
|
85
|
+
*/
|
|
86
|
+
function Queue(options) {
|
|
87
|
+
return function (target) {
|
|
88
|
+
const metadata = {
|
|
89
|
+
name: options.name,
|
|
90
|
+
durable: options.durable,
|
|
91
|
+
exclusive: options.exclusive,
|
|
92
|
+
autoDelete: options.autoDelete,
|
|
93
|
+
arguments: options.arguments
|
|
94
|
+
};
|
|
95
|
+
metadata_1.MetadataStore.setQueueMetadata(target, metadata);
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Decorator to define worker configuration for a class
|
|
100
|
+
* @param options Worker configuration options
|
|
101
|
+
*/
|
|
102
|
+
function Worker(options = {}) {
|
|
103
|
+
return function (target) {
|
|
104
|
+
const metadata = {
|
|
105
|
+
name: options.name || target.name,
|
|
106
|
+
concurrency: options.concurrency || 1,
|
|
107
|
+
queues: options.queues || []
|
|
108
|
+
};
|
|
109
|
+
metadata_1.MetadataStore.setWorkerMetadata(target, metadata);
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Decorator to mark a method as a singleton job (concurrency: 1)
|
|
114
|
+
* @param options Job configuration options
|
|
115
|
+
*/
|
|
116
|
+
function SingletonJob(options = {}) {
|
|
117
|
+
return Job({
|
|
118
|
+
...options,
|
|
119
|
+
queue: options.queue || 'singleton-queue'
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Decorator to mark a method as a high priority job
|
|
124
|
+
* @param options Job configuration options
|
|
125
|
+
*/
|
|
126
|
+
function HighPriorityJob(options = {}) {
|
|
127
|
+
return Job({
|
|
128
|
+
...options,
|
|
129
|
+
priority: options.priority || 9
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Decorator to mark a method as a low priority job
|
|
134
|
+
* @param options Job configuration options
|
|
135
|
+
*/
|
|
136
|
+
function LowPriorityJob(options = {}) {
|
|
137
|
+
return Job({
|
|
138
|
+
...options,
|
|
139
|
+
priority: options.priority || 1
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Decorator to add retry configuration to a job
|
|
144
|
+
* @param attempts Number of retry attempts
|
|
145
|
+
* @param backoffType Type of backoff strategy
|
|
146
|
+
* @param delay Initial delay in milliseconds
|
|
147
|
+
*/
|
|
148
|
+
function Retry(attempts = 3, backoffType = 'exponential', delay = 1000) {
|
|
149
|
+
return function (target, propertyKey, descriptor) {
|
|
150
|
+
if (typeof propertyKey !== 'string') {
|
|
151
|
+
throw new Error('Retry decorator can only be applied to string property keys');
|
|
152
|
+
}
|
|
153
|
+
const existingMetadata = metadata_1.MetadataStore.getJobMetadata(target, propertyKey) ||
|
|
154
|
+
metadata_1.MetadataStore.getCronJobMetadata(target, propertyKey);
|
|
155
|
+
if (existingMetadata) {
|
|
156
|
+
existingMetadata.attempts = attempts;
|
|
157
|
+
existingMetadata.backoff = { type: backoffType, delay };
|
|
158
|
+
if ('schedule' in existingMetadata) {
|
|
159
|
+
metadata_1.MetadataStore.setCronJobMetadata(target, propertyKey, existingMetadata);
|
|
160
|
+
}
|
|
161
|
+
else {
|
|
162
|
+
metadata_1.MetadataStore.setJobMetadata(target, propertyKey, existingMetadata);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
// Re-export metadata utilities
|
|
168
|
+
var metadata_2 = require("./metadata");
|
|
169
|
+
Object.defineProperty(exports, "MetadataStore", { enumerable: true, get: function () { return metadata_2.MetadataStore; } });
|
|
170
|
+
__exportStar(require("./metadata"), exports);
|
|
171
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/decorators/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import 'reflect-metadata';
|
|
2
|
+
export declare const JOB_METADATA_KEY: unique symbol;
|
|
3
|
+
export declare const CRON_JOB_METADATA_KEY: unique symbol;
|
|
4
|
+
export declare const QUEUE_METADATA_KEY: unique symbol;
|
|
5
|
+
export declare const WORKER_METADATA_KEY: unique symbol;
|
|
6
|
+
export interface JobMetadata {
|
|
7
|
+
name: string;
|
|
8
|
+
queue?: string;
|
|
9
|
+
priority?: number;
|
|
10
|
+
attempts?: number;
|
|
11
|
+
backoff?: {
|
|
12
|
+
type: 'fixed' | 'exponential';
|
|
13
|
+
delay: number;
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
export interface CronJobMetadata {
|
|
17
|
+
name: string;
|
|
18
|
+
schedule: string;
|
|
19
|
+
timezone?: string;
|
|
20
|
+
queue?: string;
|
|
21
|
+
priority?: number;
|
|
22
|
+
attempts?: number;
|
|
23
|
+
backoff?: {
|
|
24
|
+
type: 'fixed' | 'exponential';
|
|
25
|
+
delay: number;
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
export interface QueueMetadata {
|
|
29
|
+
name: string;
|
|
30
|
+
durable?: boolean;
|
|
31
|
+
exclusive?: boolean;
|
|
32
|
+
autoDelete?: boolean;
|
|
33
|
+
arguments?: any;
|
|
34
|
+
}
|
|
35
|
+
export interface WorkerMetadata {
|
|
36
|
+
name: string;
|
|
37
|
+
concurrency?: number;
|
|
38
|
+
queues?: string[];
|
|
39
|
+
}
|
|
40
|
+
export declare class MetadataStore {
|
|
41
|
+
static getJobMetadata(target: any, propertyKey: string): JobMetadata | undefined;
|
|
42
|
+
static setJobMetadata(target: any, propertyKey: string, metadata: JobMetadata): void;
|
|
43
|
+
static getCronJobMetadata(target: any, propertyKey: string): CronJobMetadata | undefined;
|
|
44
|
+
static setCronJobMetadata(target: any, propertyKey: string, metadata: CronJobMetadata): void;
|
|
45
|
+
static getQueueMetadata(target: any): QueueMetadata | undefined;
|
|
46
|
+
static setQueueMetadata(target: any, metadata: QueueMetadata): void;
|
|
47
|
+
static getWorkerMetadata(target: any): WorkerMetadata | undefined;
|
|
48
|
+
static setWorkerMetadata(target: any, metadata: WorkerMetadata): void;
|
|
49
|
+
static getAllJobMethods(target: any): Array<{
|
|
50
|
+
method: string;
|
|
51
|
+
metadata: JobMetadata;
|
|
52
|
+
}>;
|
|
53
|
+
static getAllCronJobMethods(target: any): Array<{
|
|
54
|
+
method: string;
|
|
55
|
+
metadata: CronJobMetadata;
|
|
56
|
+
}>;
|
|
57
|
+
static getAllQueues(target: any): QueueMetadata[];
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=metadata.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metadata.d.ts","sourceRoot":"","sources":["../../src/decorators/metadata.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC;AAE1B,eAAO,MAAM,gBAAgB,eAAgB,CAAC;AAC9C,eAAO,MAAM,qBAAqB,eAAoB,CAAC;AACvD,eAAO,MAAM,kBAAkB,eAAkB,CAAC;AAClD,eAAO,MAAM,mBAAmB,eAAmB,CAAC;AAEpD,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE;QACR,IAAI,EAAE,OAAO,GAAG,aAAa,CAAC;QAC9B,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;CACH;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE;QACR,IAAI,EAAE,OAAO,GAAG,aAAa,CAAC;QAC9B,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;CACH;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,SAAS,CAAC,EAAE,GAAG,CAAC;CACjB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,qBAAa,aAAa;IACxB,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,GAAG,EAAE,WAAW,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS;IAIhF,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,GAAG,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,GAAG,IAAI;IAIpF,MAAM,CAAC,kBAAkB,CAAC,MAAM,EAAE,GAAG,EAAE,WAAW,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS;IAIxF,MAAM,CAAC,kBAAkB,CAAC,MAAM,EAAE,GAAG,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,eAAe,GAAG,IAAI;IAI5F,MAAM,CAAC,gBAAgB,CAAC,MAAM,EAAE,GAAG,GAAG,aAAa,GAAG,SAAS;IAI/D,MAAM,CAAC,gBAAgB,CAAC,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,aAAa,GAAG,IAAI;IAInE,MAAM,CAAC,iBAAiB,CAAC,MAAM,EAAE,GAAG,GAAG,cAAc,GAAG,SAAS;IAIjE,MAAM,CAAC,iBAAiB,CAAC,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,cAAc,GAAG,IAAI;IAIrE,MAAM,CAAC,gBAAgB,CAAC,MAAM,EAAE,GAAG,GAAG,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,WAAW,CAAA;KAAE,CAAC;IAkBtF,MAAM,CAAC,oBAAoB,CAAC,MAAM,EAAE,GAAG,GAAG,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,eAAe,CAAA;KAAE,CAAC;IAkB9F,MAAM,CAAC,YAAY,CAAC,MAAM,EAAE,GAAG,GAAG,aAAa,EAAE;CAIlD"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MetadataStore = exports.WORKER_METADATA_KEY = exports.QUEUE_METADATA_KEY = exports.CRON_JOB_METADATA_KEY = exports.JOB_METADATA_KEY = void 0;
|
|
4
|
+
require("reflect-metadata");
|
|
5
|
+
exports.JOB_METADATA_KEY = Symbol('job');
|
|
6
|
+
exports.CRON_JOB_METADATA_KEY = Symbol('cronJob');
|
|
7
|
+
exports.QUEUE_METADATA_KEY = Symbol('queue');
|
|
8
|
+
exports.WORKER_METADATA_KEY = Symbol('worker');
|
|
9
|
+
class MetadataStore {
|
|
10
|
+
static getJobMetadata(target, propertyKey) {
|
|
11
|
+
return Reflect.getMetadata(exports.JOB_METADATA_KEY, target, propertyKey);
|
|
12
|
+
}
|
|
13
|
+
static setJobMetadata(target, propertyKey, metadata) {
|
|
14
|
+
Reflect.defineMetadata(exports.JOB_METADATA_KEY, metadata, target, propertyKey);
|
|
15
|
+
}
|
|
16
|
+
static getCronJobMetadata(target, propertyKey) {
|
|
17
|
+
return Reflect.getMetadata(exports.CRON_JOB_METADATA_KEY, target, propertyKey);
|
|
18
|
+
}
|
|
19
|
+
static setCronJobMetadata(target, propertyKey, metadata) {
|
|
20
|
+
Reflect.defineMetadata(exports.CRON_JOB_METADATA_KEY, metadata, target, propertyKey);
|
|
21
|
+
}
|
|
22
|
+
static getQueueMetadata(target) {
|
|
23
|
+
return Reflect.getMetadata(exports.QUEUE_METADATA_KEY, target);
|
|
24
|
+
}
|
|
25
|
+
static setQueueMetadata(target, metadata) {
|
|
26
|
+
Reflect.defineMetadata(exports.QUEUE_METADATA_KEY, metadata, target);
|
|
27
|
+
}
|
|
28
|
+
static getWorkerMetadata(target) {
|
|
29
|
+
return Reflect.getMetadata(exports.WORKER_METADATA_KEY, target);
|
|
30
|
+
}
|
|
31
|
+
static setWorkerMetadata(target, metadata) {
|
|
32
|
+
Reflect.defineMetadata(exports.WORKER_METADATA_KEY, metadata, target);
|
|
33
|
+
}
|
|
34
|
+
static getAllJobMethods(target) {
|
|
35
|
+
const prototype = target.prototype || target;
|
|
36
|
+
const methods = [];
|
|
37
|
+
const propertyNames = Object.getOwnPropertyNames(prototype);
|
|
38
|
+
for (const propertyName of propertyNames) {
|
|
39
|
+
if (propertyName === 'constructor')
|
|
40
|
+
continue;
|
|
41
|
+
const jobMetadata = this.getJobMetadata(prototype, propertyName);
|
|
42
|
+
if (jobMetadata) {
|
|
43
|
+
methods.push({ method: propertyName, metadata: jobMetadata });
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return methods;
|
|
47
|
+
}
|
|
48
|
+
static getAllCronJobMethods(target) {
|
|
49
|
+
const prototype = target.prototype || target;
|
|
50
|
+
const methods = [];
|
|
51
|
+
const propertyNames = Object.getOwnPropertyNames(prototype);
|
|
52
|
+
for (const propertyName of propertyNames) {
|
|
53
|
+
if (propertyName === 'constructor')
|
|
54
|
+
continue;
|
|
55
|
+
const cronJobMetadata = this.getCronJobMetadata(prototype, propertyName);
|
|
56
|
+
if (cronJobMetadata) {
|
|
57
|
+
methods.push({ method: propertyName, metadata: cronJobMetadata });
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return methods;
|
|
61
|
+
}
|
|
62
|
+
static getAllQueues(target) {
|
|
63
|
+
const queueMetadata = this.getQueueMetadata(target);
|
|
64
|
+
return queueMetadata ? [queueMetadata] : [];
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
exports.MetadataStore = MetadataStore;
|
|
68
|
+
//# sourceMappingURL=metadata.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metadata.js","sourceRoot":"","sources":["../../src/decorators/metadata.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { TaskScheduler } from '../index';
|
|
2
|
+
export declare class DecoratorRegistry {
|
|
3
|
+
private static instance;
|
|
4
|
+
private registeredClasses;
|
|
5
|
+
private constructor();
|
|
6
|
+
static getInstance(): DecoratorRegistry;
|
|
7
|
+
/**
|
|
8
|
+
* Register a class instance with the scheduler
|
|
9
|
+
* This will automatically set up workers and schedule cron jobs based on decorators
|
|
10
|
+
*/
|
|
11
|
+
registerClass(scheduler: TaskScheduler, instance: any): Promise<void>;
|
|
12
|
+
/**
|
|
13
|
+
* Execute a job method directly
|
|
14
|
+
*/
|
|
15
|
+
executeJob(scheduler: TaskScheduler, className: string, methodName: string, data?: any): Promise<string>;
|
|
16
|
+
/**
|
|
17
|
+
* Get all registered classes
|
|
18
|
+
*/
|
|
19
|
+
getRegisteredClasses(): Array<{
|
|
20
|
+
name: string;
|
|
21
|
+
instance: any;
|
|
22
|
+
}>;
|
|
23
|
+
/**
|
|
24
|
+
* Get job methods for a registered class
|
|
25
|
+
*/
|
|
26
|
+
getJobMethods(className: string): Array<{
|
|
27
|
+
method: string;
|
|
28
|
+
metadata: any;
|
|
29
|
+
}>;
|
|
30
|
+
/**
|
|
31
|
+
* Get cron job methods for a registered class
|
|
32
|
+
*/
|
|
33
|
+
getCronJobMethods(className: string): Array<{
|
|
34
|
+
method: string;
|
|
35
|
+
metadata: any;
|
|
36
|
+
}>;
|
|
37
|
+
/**
|
|
38
|
+
* Clear all registrations (useful for testing)
|
|
39
|
+
*/
|
|
40
|
+
clear(): void;
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/decorators/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAIzC,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAoB;IAC3C,OAAO,CAAC,iBAAiB,CAA4B;IAErD,OAAO;IAEP,MAAM,CAAC,WAAW,IAAI,iBAAiB;IAOvC;;;OAGG;IACG,aAAa,CAAC,SAAS,EAAE,aAAa,EAAE,QAAQ,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IA6G3E;;OAEG;IACG,UAAU,CACd,SAAS,EAAE,aAAa,EACxB,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,IAAI,GAAE,GAAQ,GACb,OAAO,CAAC,MAAM,CAAC;IAoClB;;OAEG;IACH,oBAAoB,IAAI,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,GAAG,CAAA;KAAE,CAAC;IAO9D;;OAEG;IACH,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,GAAG,CAAA;KAAE,CAAC;IAS1E;;OAEG;IACH,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,GAAG,CAAA;KAAE,CAAC;IAS9E;;OAEG;IACH,KAAK,IAAI,IAAI;CAGd"}
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DecoratorRegistry = void 0;
|
|
4
|
+
const metadata_1 = require("./metadata");
|
|
5
|
+
class DecoratorRegistry {
|
|
6
|
+
constructor() {
|
|
7
|
+
this.registeredClasses = new Map();
|
|
8
|
+
}
|
|
9
|
+
static getInstance() {
|
|
10
|
+
if (!DecoratorRegistry.instance) {
|
|
11
|
+
DecoratorRegistry.instance = new DecoratorRegistry();
|
|
12
|
+
}
|
|
13
|
+
return DecoratorRegistry.instance;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Register a class instance with the scheduler
|
|
17
|
+
* This will automatically set up workers and schedule cron jobs based on decorators
|
|
18
|
+
*/
|
|
19
|
+
async registerClass(scheduler, instance) {
|
|
20
|
+
const constructor = instance.constructor;
|
|
21
|
+
// Check if already registered
|
|
22
|
+
if (this.registeredClasses.has(constructor)) {
|
|
23
|
+
console.warn(`Class ${constructor.name} is already registered`);
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
// Get worker metadata
|
|
27
|
+
const workerMetadata = metadata_1.MetadataStore.getWorkerMetadata(constructor);
|
|
28
|
+
// Get all job methods
|
|
29
|
+
const jobMethods = metadata_1.MetadataStore.getAllJobMethods(constructor);
|
|
30
|
+
const cronJobMethods = metadata_1.MetadataStore.getAllCronJobMethods(constructor);
|
|
31
|
+
// Collect all queues needed
|
|
32
|
+
const queues = new Set();
|
|
33
|
+
// Add queues from worker metadata
|
|
34
|
+
if (workerMetadata?.queues) {
|
|
35
|
+
workerMetadata.queues.forEach(queue => queues.add(queue));
|
|
36
|
+
}
|
|
37
|
+
// Add queues from job metadata
|
|
38
|
+
jobMethods.forEach(({ metadata }) => {
|
|
39
|
+
if (metadata.queue) {
|
|
40
|
+
queues.add(metadata.queue);
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
cronJobMethods.forEach(({ metadata }) => {
|
|
44
|
+
if (metadata.queue) {
|
|
45
|
+
queues.add(metadata.queue);
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
// If no queues specified, use class name as default queue
|
|
49
|
+
if (queues.size === 0) {
|
|
50
|
+
queues.add(`${constructor.name.toLowerCase()}-queue`);
|
|
51
|
+
}
|
|
52
|
+
// Create handlers map
|
|
53
|
+
const handlers = {};
|
|
54
|
+
// Add job handlers
|
|
55
|
+
jobMethods.forEach(({ method, metadata }) => {
|
|
56
|
+
handlers[metadata.name] = async (data) => {
|
|
57
|
+
try {
|
|
58
|
+
const result = await instance[method](data);
|
|
59
|
+
return { success: true, data: result };
|
|
60
|
+
}
|
|
61
|
+
catch (error) {
|
|
62
|
+
return { success: false, error: error.message };
|
|
63
|
+
}
|
|
64
|
+
};
|
|
65
|
+
});
|
|
66
|
+
// Add cron job handlers
|
|
67
|
+
cronJobMethods.forEach(({ method, metadata }) => {
|
|
68
|
+
handlers[metadata.name] = async (data) => {
|
|
69
|
+
try {
|
|
70
|
+
const result = await instance[method](data);
|
|
71
|
+
return { success: true, data: result };
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
return { success: false, error: error.message };
|
|
75
|
+
}
|
|
76
|
+
};
|
|
77
|
+
});
|
|
78
|
+
// Create worker if we have handlers
|
|
79
|
+
if (Object.keys(handlers).length > 0) {
|
|
80
|
+
const workerName = workerMetadata?.name || `${constructor.name.toLowerCase()}-worker`;
|
|
81
|
+
const concurrency = workerMetadata?.concurrency || 1;
|
|
82
|
+
await scheduler.createWorker({
|
|
83
|
+
name: workerName,
|
|
84
|
+
concurrency,
|
|
85
|
+
queues: Array.from(queues),
|
|
86
|
+
handlers
|
|
87
|
+
});
|
|
88
|
+
console.log(`✅ Registered worker ${workerName} with ${Object.keys(handlers).length} handlers`);
|
|
89
|
+
}
|
|
90
|
+
// Schedule cron jobs
|
|
91
|
+
for (const { method, metadata } of cronJobMethods) {
|
|
92
|
+
const jobId = `${constructor.name}-${method}`;
|
|
93
|
+
await scheduler.scheduleCronJob({
|
|
94
|
+
id: jobId,
|
|
95
|
+
name: metadata.name,
|
|
96
|
+
handler: metadata.name,
|
|
97
|
+
schedule: metadata.schedule,
|
|
98
|
+
timezone: metadata.timezone,
|
|
99
|
+
data: {}, // Cron jobs typically don't need initial data
|
|
100
|
+
priority: metadata.priority,
|
|
101
|
+
attempts: metadata.attempts,
|
|
102
|
+
backoff: metadata.backoff
|
|
103
|
+
});
|
|
104
|
+
console.log(`⏰ Scheduled cron job ${jobId}: ${metadata.schedule}`);
|
|
105
|
+
}
|
|
106
|
+
// Mark as registered
|
|
107
|
+
this.registeredClasses.set(constructor, instance);
|
|
108
|
+
console.log(`🎯 Successfully registered class ${constructor.name}`);
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Execute a job method directly
|
|
112
|
+
*/
|
|
113
|
+
async executeJob(scheduler, className, methodName, data = {}) {
|
|
114
|
+
// Find the registered class
|
|
115
|
+
let targetInstance = null;
|
|
116
|
+
let targetMetadata = null;
|
|
117
|
+
for (const [constructor, instance] of this.registeredClasses.entries()) {
|
|
118
|
+
if (constructor.name === className) {
|
|
119
|
+
targetInstance = instance;
|
|
120
|
+
// Find the method metadata
|
|
121
|
+
const jobMethods = metadata_1.MetadataStore.getAllJobMethods(constructor);
|
|
122
|
+
const method = jobMethods.find(m => m.method === methodName);
|
|
123
|
+
if (method) {
|
|
124
|
+
targetMetadata = method.metadata;
|
|
125
|
+
break;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
if (!targetInstance || !targetMetadata) {
|
|
130
|
+
throw new Error(`Job ${className}.${methodName} not found or not registered`);
|
|
131
|
+
}
|
|
132
|
+
// Schedule the job
|
|
133
|
+
return await scheduler.scheduleJob({
|
|
134
|
+
id: `${className}-${methodName}-${Date.now()}`,
|
|
135
|
+
name: targetMetadata.name,
|
|
136
|
+
handler: targetMetadata.name,
|
|
137
|
+
data,
|
|
138
|
+
priority: targetMetadata.priority,
|
|
139
|
+
attempts: targetMetadata.attempts,
|
|
140
|
+
backoff: targetMetadata.backoff
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Get all registered classes
|
|
145
|
+
*/
|
|
146
|
+
getRegisteredClasses() {
|
|
147
|
+
return Array.from(this.registeredClasses.entries()).map(([constructor, instance]) => ({
|
|
148
|
+
name: constructor.name,
|
|
149
|
+
instance
|
|
150
|
+
}));
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Get job methods for a registered class
|
|
154
|
+
*/
|
|
155
|
+
getJobMethods(className) {
|
|
156
|
+
for (const [constructor] of this.registeredClasses.entries()) {
|
|
157
|
+
if (constructor.name === className) {
|
|
158
|
+
return metadata_1.MetadataStore.getAllJobMethods(constructor);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
return [];
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Get cron job methods for a registered class
|
|
165
|
+
*/
|
|
166
|
+
getCronJobMethods(className) {
|
|
167
|
+
for (const [constructor] of this.registeredClasses.entries()) {
|
|
168
|
+
if (constructor.name === className) {
|
|
169
|
+
return metadata_1.MetadataStore.getAllCronJobMethods(constructor);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
return [];
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Clear all registrations (useful for testing)
|
|
176
|
+
*/
|
|
177
|
+
clear() {
|
|
178
|
+
this.registeredClasses.clear();
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
exports.DecoratorRegistry = DecoratorRegistry;
|
|
182
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/decorators/registry.ts"],"names":[],"mappings":"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"}
|