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.
Files changed (50) hide show
  1. package/.claude/settings.local.json +20 -0
  2. package/.github/workflows/ci.yml +266 -0
  3. package/.github/workflows/release.yml +117 -0
  4. package/CHANGELOG.md +43 -0
  5. package/README.md +653 -0
  6. package/dist/__tests__/setup.d.ts +2 -0
  7. package/dist/__tests__/setup.d.ts.map +1 -0
  8. package/dist/__tests__/setup.js +24 -0
  9. package/dist/__tests__/setup.js.map +1 -0
  10. package/dist/decorators/index.d.ts +80 -0
  11. package/dist/decorators/index.d.ts.map +1 -0
  12. package/dist/decorators/index.js +171 -0
  13. package/dist/decorators/index.js.map +1 -0
  14. package/dist/decorators/metadata.d.ts +59 -0
  15. package/dist/decorators/metadata.d.ts.map +1 -0
  16. package/dist/decorators/metadata.js +68 -0
  17. package/dist/decorators/metadata.js.map +1 -0
  18. package/dist/decorators/registry.d.ts +42 -0
  19. package/dist/decorators/registry.d.ts.map +1 -0
  20. package/dist/decorators/registry.js +182 -0
  21. package/dist/decorators/registry.js.map +1 -0
  22. package/dist/index.d.ts +74 -0
  23. package/dist/index.d.ts.map +1 -0
  24. package/dist/index.js +198 -0
  25. package/dist/index.js.map +1 -0
  26. package/dist/queue/index.d.ts +19 -0
  27. package/dist/queue/index.d.ts.map +1 -0
  28. package/dist/queue/index.js +89 -0
  29. package/dist/queue/index.js.map +1 -0
  30. package/dist/scheduler/index.d.ts +13 -0
  31. package/dist/scheduler/index.d.ts.map +1 -0
  32. package/dist/scheduler/index.js +102 -0
  33. package/dist/scheduler/index.js.map +1 -0
  34. package/dist/types/index.d.ts +63 -0
  35. package/dist/types/index.d.ts.map +1 -0
  36. package/dist/types/index.js +12 -0
  37. package/dist/types/index.js.map +1 -0
  38. package/dist/utils/load-balancer.d.ts +36 -0
  39. package/dist/utils/load-balancer.d.ts.map +1 -0
  40. package/dist/utils/load-balancer.js +158 -0
  41. package/dist/utils/load-balancer.js.map +1 -0
  42. package/dist/utils/rabbitmq.d.ts +18 -0
  43. package/dist/utils/rabbitmq.d.ts.map +1 -0
  44. package/dist/utils/rabbitmq.js +114 -0
  45. package/dist/utils/rabbitmq.js.map +1 -0
  46. package/dist/worker/index.d.ts +20 -0
  47. package/dist/worker/index.d.ts.map +1 -0
  48. package/dist/worker/index.js +138 -0
  49. package/dist/worker/index.js.map +1 -0
  50. package/package.json +63 -0
@@ -0,0 +1,74 @@
1
+ import 'reflect-metadata';
2
+ import { NodeInfo } from './utils/load-balancer';
3
+ import { ConnectionConfig, WorkerConfig, JobConfig, CronJobConfig, QueueConfig } from './types';
4
+ export declare class TaskScheduler {
5
+ private connection;
6
+ private scheduler;
7
+ private workers;
8
+ private queueManager;
9
+ private loadBalancer;
10
+ private decoratorRegistry;
11
+ private nodeId;
12
+ private isInitialized;
13
+ constructor(connectionConfig: ConnectionConfig);
14
+ initialize(): Promise<void>;
15
+ shutdown(): Promise<void>;
16
+ createWorker(config: WorkerConfig): Promise<void>;
17
+ startWorker(workerName: string): Promise<void>;
18
+ stopWorker(workerName: string): Promise<void>;
19
+ scheduleJob(config: JobConfig): Promise<string>;
20
+ scheduleCronJob(config: CronJobConfig): Promise<string>;
21
+ cancelCronJob(jobId: string): Promise<boolean>;
22
+ createQueue(config: QueueConfig): Promise<void>;
23
+ getQueueInfo(queueName: string): Promise<any>;
24
+ purgeQueue(queueName: string): Promise<void>;
25
+ getNodeInfo(): {
26
+ nodeId: string;
27
+ workers: string[];
28
+ activeNodes: NodeInfo[];
29
+ };
30
+ getWorkerStatus(workerName: string): {
31
+ isRunning: boolean;
32
+ activeJobs: number;
33
+ } | null;
34
+ getCronJobs(): string[];
35
+ /**
36
+ * Register a class instance with decorators
37
+ * This will automatically create workers and schedule cron jobs based on decorators
38
+ */
39
+ register(instance: any): Promise<void>;
40
+ /**
41
+ * Execute a job method from a registered class
42
+ */
43
+ executeJobMethod(className: string, methodName: string, data?: any): Promise<string>;
44
+ /**
45
+ * Get information about registered classes
46
+ */
47
+ getRegisteredClasses(): Array<{
48
+ name: string;
49
+ instance: any;
50
+ }>;
51
+ /**
52
+ * Get job methods for a registered class
53
+ */
54
+ getJobMethods(className: string): Array<{
55
+ method: string;
56
+ metadata: any;
57
+ }>;
58
+ /**
59
+ * Get cron job methods for a registered class
60
+ */
61
+ getCronJobMethods(className: string): Array<{
62
+ method: string;
63
+ metadata: any;
64
+ }>;
65
+ private ensureInitialized;
66
+ }
67
+ export * from './types';
68
+ export { RabbitMQConnection } from './utils/rabbitmq';
69
+ export { JobScheduler } from './scheduler';
70
+ export { JobWorker } from './worker';
71
+ export { QueueManager } from './queue';
72
+ export { LoadBalancer } from './utils/load-balancer';
73
+ export * from './decorators';
74
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js ADDED
@@ -0,0 +1,198 @@
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.LoadBalancer = exports.QueueManager = exports.JobWorker = exports.JobScheduler = exports.RabbitMQConnection = exports.TaskScheduler = void 0;
18
+ require("reflect-metadata");
19
+ const uuid_1 = require("uuid");
20
+ const rabbitmq_1 = require("./utils/rabbitmq");
21
+ const load_balancer_1 = require("./utils/load-balancer");
22
+ const scheduler_1 = require("./scheduler");
23
+ const worker_1 = require("./worker");
24
+ const queue_1 = require("./queue");
25
+ const registry_1 = require("./decorators/registry");
26
+ class TaskScheduler {
27
+ constructor(connectionConfig) {
28
+ this.workers = new Map();
29
+ this.isInitialized = false;
30
+ this.nodeId = (0, uuid_1.v4)();
31
+ this.connection = new rabbitmq_1.RabbitMQConnection(connectionConfig);
32
+ this.scheduler = new scheduler_1.JobScheduler(this.connection);
33
+ this.queueManager = new queue_1.QueueManager(this.connection);
34
+ this.loadBalancer = new load_balancer_1.LoadBalancer(this.connection, this.nodeId);
35
+ this.decoratorRegistry = registry_1.DecoratorRegistry.getInstance();
36
+ }
37
+ async initialize() {
38
+ if (this.isInitialized) {
39
+ throw new Error('TaskScheduler is already initialized');
40
+ }
41
+ await this.connection.connect();
42
+ await this.queueManager.setupDeadLetterQueue();
43
+ await this.queueManager.setupDelayedJobQueue();
44
+ await this.loadBalancer.start();
45
+ this.isInitialized = true;
46
+ console.log(`TaskScheduler initialized with node ID: ${this.nodeId}`);
47
+ }
48
+ async shutdown() {
49
+ console.log('Shutting down TaskScheduler...');
50
+ for (const [name, worker] of this.workers) {
51
+ await worker.stop();
52
+ console.log(`Worker ${name} stopped`);
53
+ }
54
+ await this.loadBalancer.stop();
55
+ await this.connection.disconnect();
56
+ this.isInitialized = false;
57
+ console.log('TaskScheduler shut down successfully');
58
+ }
59
+ async createWorker(config) {
60
+ this.ensureInitialized();
61
+ if (this.workers.has(config.name)) {
62
+ throw new Error(`Worker with name ${config.name} already exists`);
63
+ }
64
+ for (const queueName of config.queues) {
65
+ await this.queueManager.createQueue({ name: queueName });
66
+ }
67
+ const worker = new worker_1.JobWorker(this.connection, config);
68
+ this.workers.set(config.name, worker);
69
+ const nodeInfo = {
70
+ id: this.nodeId,
71
+ name: config.name,
72
+ activeJobs: 0,
73
+ maxConcurrency: config.concurrency,
74
+ queues: config.queues,
75
+ status: 'active'
76
+ };
77
+ await this.loadBalancer.registerNode(nodeInfo);
78
+ await worker.start();
79
+ console.log(`Worker ${config.name} created and started`);
80
+ }
81
+ async startWorker(workerName) {
82
+ this.ensureInitialized();
83
+ const worker = this.workers.get(workerName);
84
+ if (!worker) {
85
+ throw new Error(`Worker ${workerName} not found`);
86
+ }
87
+ await worker.start();
88
+ console.log(`Worker ${workerName} started`);
89
+ }
90
+ async stopWorker(workerName) {
91
+ this.ensureInitialized();
92
+ const worker = this.workers.get(workerName);
93
+ if (!worker) {
94
+ throw new Error(`Worker ${workerName} not found`);
95
+ }
96
+ await worker.stop();
97
+ console.log(`Worker ${workerName} stopped`);
98
+ }
99
+ async scheduleJob(config) {
100
+ this.ensureInitialized();
101
+ return await this.scheduler.executeJob(config);
102
+ }
103
+ async scheduleCronJob(config) {
104
+ this.ensureInitialized();
105
+ return await this.scheduler.scheduleCronJob(config);
106
+ }
107
+ async cancelCronJob(jobId) {
108
+ this.ensureInitialized();
109
+ return await this.scheduler.cancelCronJob(jobId);
110
+ }
111
+ async createQueue(config) {
112
+ this.ensureInitialized();
113
+ await this.queueManager.createQueue(config);
114
+ }
115
+ async getQueueInfo(queueName) {
116
+ this.ensureInitialized();
117
+ return await this.queueManager.getQueueInfo(queueName);
118
+ }
119
+ async purgeQueue(queueName) {
120
+ this.ensureInitialized();
121
+ await this.queueManager.purgeQueue(queueName);
122
+ }
123
+ getNodeInfo() {
124
+ this.ensureInitialized();
125
+ return {
126
+ nodeId: this.nodeId,
127
+ workers: Array.from(this.workers.keys()),
128
+ activeNodes: this.loadBalancer.getActiveNodes()
129
+ };
130
+ }
131
+ getWorkerStatus(workerName) {
132
+ const worker = this.workers.get(workerName);
133
+ if (!worker) {
134
+ return null;
135
+ }
136
+ return {
137
+ isRunning: worker.isWorkerRunning(),
138
+ activeJobs: worker.getActiveJobCount()
139
+ };
140
+ }
141
+ getCronJobs() {
142
+ this.ensureInitialized();
143
+ return this.scheduler.getCronJobs();
144
+ }
145
+ // Decorator-based methods
146
+ /**
147
+ * Register a class instance with decorators
148
+ * This will automatically create workers and schedule cron jobs based on decorators
149
+ */
150
+ async register(instance) {
151
+ this.ensureInitialized();
152
+ await this.decoratorRegistry.registerClass(this, instance);
153
+ }
154
+ /**
155
+ * Execute a job method from a registered class
156
+ */
157
+ async executeJobMethod(className, methodName, data = {}) {
158
+ this.ensureInitialized();
159
+ return await this.decoratorRegistry.executeJob(this, className, methodName, data);
160
+ }
161
+ /**
162
+ * Get information about registered classes
163
+ */
164
+ getRegisteredClasses() {
165
+ return this.decoratorRegistry.getRegisteredClasses();
166
+ }
167
+ /**
168
+ * Get job methods for a registered class
169
+ */
170
+ getJobMethods(className) {
171
+ return this.decoratorRegistry.getJobMethods(className);
172
+ }
173
+ /**
174
+ * Get cron job methods for a registered class
175
+ */
176
+ getCronJobMethods(className) {
177
+ return this.decoratorRegistry.getCronJobMethods(className);
178
+ }
179
+ ensureInitialized() {
180
+ if (!this.isInitialized) {
181
+ throw new Error('TaskScheduler must be initialized before use');
182
+ }
183
+ }
184
+ }
185
+ exports.TaskScheduler = TaskScheduler;
186
+ __exportStar(require("./types"), exports);
187
+ var rabbitmq_2 = require("./utils/rabbitmq");
188
+ Object.defineProperty(exports, "RabbitMQConnection", { enumerable: true, get: function () { return rabbitmq_2.RabbitMQConnection; } });
189
+ var scheduler_2 = require("./scheduler");
190
+ Object.defineProperty(exports, "JobScheduler", { enumerable: true, get: function () { return scheduler_2.JobScheduler; } });
191
+ var worker_2 = require("./worker");
192
+ Object.defineProperty(exports, "JobWorker", { enumerable: true, get: function () { return worker_2.JobWorker; } });
193
+ var queue_2 = require("./queue");
194
+ Object.defineProperty(exports, "QueueManager", { enumerable: true, get: function () { return queue_2.QueueManager; } });
195
+ var load_balancer_2 = require("./utils/load-balancer");
196
+ Object.defineProperty(exports, "LoadBalancer", { enumerable: true, get: function () { return load_balancer_2.LoadBalancer; } });
197
+ __exportStar(require("./decorators"), exports);
198
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,4BAA0B;AAC1B,+BAAoC;AACpC,+CAAsD;AACtD,yDAA+D;AAC/D,2CAA2C;AAC3C,qCAAqC;AACrC,mCAAuC;AACvC,oDAA0D;AAS1D,MAAa,aAAa;IAUxB,YAAY,gBAAkC;QAPtC,YAAO,GAA2B,IAAI,GAAG,EAAE,CAAC;QAK5C,kBAAa,GAAG,KAAK,CAAC;QAG5B,IAAI,CAAC,MAAM,GAAG,IAAA,SAAM,GAAE,CAAC;QACvB,IAAI,CAAC,UAAU,GAAG,IAAI,6BAAkB,CAAC,gBAAgB,CAAC,CAAC;QAC3D,IAAI,CAAC,SAAS,GAAG,IAAI,wBAAY,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACnD,IAAI,CAAC,YAAY,GAAG,IAAI,oBAAY,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACtD,IAAI,CAAC,YAAY,GAAG,IAAI,4BAAY,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QACnE,IAAI,CAAC,iBAAiB,GAAG,4BAAiB,CAAC,WAAW,EAAE,CAAC;IAC3D,CAAC;IAED,KAAK,CAAC,UAAU;QACd,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;QAC1D,CAAC;QAED,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;QAChC,MAAM,IAAI,CAAC,YAAY,CAAC,oBAAoB,EAAE,CAAC;QAC/C,MAAM,IAAI,CAAC,YAAY,CAAC,oBAAoB,EAAE,CAAC;QAC/C,MAAM,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC;QAEhC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;QAC1B,OAAO,CAAC,GAAG,CAAC,2CAA2C,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IACxE,CAAC;IAED,KAAK,CAAC,QAAQ;QACZ,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;QAE9C,KAAK,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAC1C,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;YACpB,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,UAAU,CAAC,CAAC;QACxC,CAAC;QAED,MAAM,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;QAC/B,MAAM,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC;QAEnC,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;QAC3B,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC;IACtD,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,MAAoB;QACrC,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAEzB,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;YAClC,MAAM,IAAI,KAAK,CAAC,oBAAoB,MAAM,CAAC,IAAI,iBAAiB,CAAC,CAAC;QACpE,CAAC;QAED,KAAK,MAAM,SAAS,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YACtC,MAAM,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;QAC3D,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,kBAAS,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QACtD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAEtC,MAAM,QAAQ,GAAoC;YAChD,EAAE,EAAE,IAAI,CAAC,MAAM;YACf,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,UAAU,EAAE,CAAC;YACb,cAAc,EAAE,MAAM,CAAC,WAAW;YAClC,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,MAAM,EAAE,QAAQ;SACjB,CAAC;QAEF,MAAM,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;QAC/C,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;QAErB,OAAO,CAAC,GAAG,CAAC,UAAU,MAAM,CAAC,IAAI,sBAAsB,CAAC,CAAC;IAC3D,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,UAAkB;QAClC,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAEzB,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAC5C,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,UAAU,UAAU,YAAY,CAAC,CAAC;QACpD,CAAC;QAED,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;QACrB,OAAO,CAAC,GAAG,CAAC,UAAU,UAAU,UAAU,CAAC,CAAC;IAC9C,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,UAAkB;QACjC,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAEzB,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAC5C,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,UAAU,UAAU,YAAY,CAAC,CAAC;QACpD,CAAC;QAED,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;QACpB,OAAO,CAAC,GAAG,CAAC,UAAU,UAAU,UAAU,CAAC,CAAC;IAC9C,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,MAAiB;QACjC,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACzB,OAAO,MAAM,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;IACjD,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,MAAqB;QACzC,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACzB,OAAO,MAAM,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;IACtD,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,KAAa;QAC/B,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACzB,OAAO,MAAM,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IACnD,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,MAAmB;QACnC,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACzB,MAAM,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IAC9C,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,SAAiB;QAClC,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACzB,OAAO,MAAM,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;IACzD,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,SAAiB;QAChC,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACzB,MAAM,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;IAChD,CAAC;IAED,WAAW;QACT,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAEzB,OAAO;YACL,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;YACxC,WAAW,EAAE,IAAI,CAAC,YAAY,CAAC,cAAc,EAAE;SAChD,CAAC;IACJ,CAAC;IAED,eAAe,CAAC,UAAkB;QAChC,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAC5C,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO;YACL,SAAS,EAAE,MAAM,CAAC,eAAe,EAAE;YACnC,UAAU,EAAE,MAAM,CAAC,iBAAiB,EAAE;SACvC,CAAC;IACJ,CAAC;IAED,WAAW;QACT,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACzB,OAAO,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC;IACtC,CAAC;IAED,0BAA0B;IAE1B;;;OAGG;IACH,KAAK,CAAC,QAAQ,CAAC,QAAa;QAC1B,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACzB,MAAM,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC7D,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,gBAAgB,CAAC,SAAiB,EAAE,UAAkB,EAAE,OAAY,EAAE;QAC1E,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACzB,OAAO,MAAM,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC;IACpF,CAAC;IAED;;OAEG;IACH,oBAAoB;QAClB,OAAO,IAAI,CAAC,iBAAiB,CAAC,oBAAoB,EAAE,CAAC;IACvD,CAAC;IAED;;OAEG;IACH,aAAa,CAAC,SAAiB;QAC7B,OAAO,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;IACzD,CAAC;IAED;;OAEG;IACH,iBAAiB,CAAC,SAAiB;QACjC,OAAO,IAAI,CAAC,iBAAiB,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;IAC7D,CAAC;IAEO,iBAAiB;QACvB,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;QAClE,CAAC;IACH,CAAC;CACF;AA3MD,sCA2MC;AAED,0CAAwB;AACxB,6CAAsD;AAA7C,8GAAA,kBAAkB,OAAA;AAC3B,yCAA2C;AAAlC,yGAAA,YAAY,OAAA;AACrB,mCAAqC;AAA5B,mGAAA,SAAS,OAAA;AAClB,iCAAuC;AAA9B,qGAAA,YAAY,OAAA;AACrB,uDAAqD;AAA5C,6GAAA,YAAY,OAAA;AACrB,+CAA6B"}
@@ -0,0 +1,19 @@
1
+ import { QueueConfig } from '../types';
2
+ import { RabbitMQConnection } from '../utils/rabbitmq';
3
+ export declare class QueueManager {
4
+ private connection;
5
+ private queues;
6
+ constructor(connection: RabbitMQConnection);
7
+ createQueue(config: QueueConfig): Promise<void>;
8
+ deleteQueue(queueName: string): Promise<void>;
9
+ purgeQueue(queueName: string): Promise<void>;
10
+ getQueueInfo(queueName: string): Promise<any>;
11
+ listQueues(): Promise<string[]>;
12
+ getQueueLength(queueName: string): Promise<number>;
13
+ bindQueueToExchange(queueName: string, exchangeName: string, routingKey?: string): Promise<void>;
14
+ createExchange(exchangeName: string, type?: 'direct' | 'topic' | 'headers' | 'fanout', options?: any): Promise<void>;
15
+ setupDeadLetterQueue(): Promise<void>;
16
+ setupDelayedJobQueue(): Promise<void>;
17
+ getQueueConfig(queueName: string): QueueConfig | undefined;
18
+ }
19
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/queue/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAc,MAAM,UAAU,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAEvD,qBAAa,YAAY;IACvB,OAAO,CAAC,UAAU,CAAqB;IACvC,OAAO,CAAC,MAAM,CAAuC;gBAEzC,UAAU,EAAE,kBAAkB;IAIpC,WAAW,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAc/C,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ7C,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAO5C,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAe7C,UAAU,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAI/B,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAKlD,mBAAmB,CACvB,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,EACpB,UAAU,GAAE,MAAW,GACtB,OAAO,CAAC,IAAI,CAAC;IAOV,cAAc,CAClB,YAAY,EAAE,MAAM,EACpB,IAAI,GAAE,QAAQ,GAAG,OAAO,GAAG,SAAS,GAAG,QAAmB,EAC1D,OAAO,GAAE,GAAQ,GAChB,OAAO,CAAC,IAAI,CAAC;IAYV,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC;IAOrC,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC;IAc3C,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS;CAG3D"}
@@ -0,0 +1,89 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.QueueManager = void 0;
4
+ class QueueManager {
5
+ constructor(connection) {
6
+ this.queues = new Map();
7
+ this.connection = connection;
8
+ }
9
+ async createQueue(config) {
10
+ const channel = this.connection.getChannel();
11
+ await channel.assertQueue(config.name, {
12
+ durable: config.durable !== false,
13
+ exclusive: config.exclusive || false,
14
+ autoDelete: config.autoDelete || false,
15
+ arguments: config.arguments || {}
16
+ });
17
+ this.queues.set(config.name, config);
18
+ console.log(`Queue ${config.name} created/asserted`);
19
+ }
20
+ async deleteQueue(queueName) {
21
+ const channel = this.connection.getChannel();
22
+ await channel.deleteQueue(queueName);
23
+ this.queues.delete(queueName);
24
+ console.log(`Queue ${queueName} deleted`);
25
+ }
26
+ async purgeQueue(queueName) {
27
+ const channel = this.connection.getChannel();
28
+ await channel.purgeQueue(queueName);
29
+ console.log(`Queue ${queueName} purged`);
30
+ }
31
+ async getQueueInfo(queueName) {
32
+ const channel = this.connection.getChannel();
33
+ try {
34
+ const queueInfo = await channel.checkQueue(queueName);
35
+ return {
36
+ queue: queueName,
37
+ messageCount: queueInfo.messageCount,
38
+ consumerCount: queueInfo.consumerCount
39
+ };
40
+ }
41
+ catch (error) {
42
+ throw new Error(`Queue ${queueName} does not exist`);
43
+ }
44
+ }
45
+ async listQueues() {
46
+ return Array.from(this.queues.keys());
47
+ }
48
+ async getQueueLength(queueName) {
49
+ const info = await this.getQueueInfo(queueName);
50
+ return info.messageCount;
51
+ }
52
+ async bindQueueToExchange(queueName, exchangeName, routingKey = '') {
53
+ const channel = this.connection.getChannel();
54
+ await channel.bindQueue(queueName, exchangeName, routingKey);
55
+ console.log(`Queue ${queueName} bound to exchange ${exchangeName} with routing key: ${routingKey}`);
56
+ }
57
+ async createExchange(exchangeName, type = 'direct', options = {}) {
58
+ const channel = this.connection.getChannel();
59
+ await channel.assertExchange(exchangeName, type, {
60
+ durable: options.durable !== false,
61
+ autoDelete: options.autoDelete || false,
62
+ arguments: options.arguments || {}
63
+ });
64
+ console.log(`Exchange ${exchangeName} of type ${type} created/asserted`);
65
+ }
66
+ async setupDeadLetterQueue() {
67
+ await this.createQueue({
68
+ name: 'dead_letter_queue',
69
+ durable: true
70
+ });
71
+ }
72
+ async setupDelayedJobQueue() {
73
+ await this.createExchange('delayed_jobs', 'direct');
74
+ await this.createQueue({
75
+ name: 'delayed_job_queue',
76
+ durable: true,
77
+ arguments: {
78
+ 'x-message-ttl': 60000,
79
+ 'x-dead-letter-exchange': '',
80
+ 'x-dead-letter-routing-key': 'job_queue'
81
+ }
82
+ });
83
+ }
84
+ getQueueConfig(queueName) {
85
+ return this.queues.get(queueName);
86
+ }
87
+ }
88
+ exports.QueueManager = QueueManager;
89
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/queue/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import { CronJobConfig, JobConfig } from '../types';
2
+ import { RabbitMQConnection } from '../utils/rabbitmq';
3
+ export declare class JobScheduler {
4
+ private connection;
5
+ private cronJobs;
6
+ constructor(connection: RabbitMQConnection);
7
+ scheduleCronJob(config: CronJobConfig): Promise<string>;
8
+ executeJob(config: JobConfig): Promise<string>;
9
+ cancelCronJob(jobId: string): Promise<boolean>;
10
+ getCronJobs(): string[];
11
+ private getQueueForJob;
12
+ }
13
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/scheduler/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,SAAS,EAAyB,MAAM,UAAU,CAAC;AAC3E,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAEvD,qBAAa,YAAY;IACvB,OAAO,CAAC,UAAU,CAAqB;IACvC,OAAO,CAAC,QAAQ,CAA8C;gBAElD,UAAU,EAAE,kBAAkB;IAIpC,eAAe,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC;IA4BvD,UAAU,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC;IA2B9C,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAYpD,WAAW,IAAI,MAAM,EAAE;IAIvB,OAAO,CAAC,cAAc;CAGvB"}
@@ -0,0 +1,102 @@
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 __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.JobScheduler = void 0;
37
+ const cron = __importStar(require("node-cron"));
38
+ const uuid_1 = require("uuid");
39
+ const types_1 = require("../types");
40
+ class JobScheduler {
41
+ constructor(connection) {
42
+ this.cronJobs = new Map();
43
+ this.connection = connection;
44
+ }
45
+ async scheduleCronJob(config) {
46
+ const jobId = config.id || (0, uuid_1.v4)();
47
+ if (this.cronJobs.has(jobId)) {
48
+ throw new Error(`Cron job with ID ${jobId} already exists`);
49
+ }
50
+ const task = cron.schedule(config.schedule, async () => {
51
+ await this.executeJob({
52
+ ...config,
53
+ id: (0, uuid_1.v4)()
54
+ });
55
+ }, {
56
+ scheduled: false,
57
+ timezone: config.timezone
58
+ });
59
+ this.cronJobs.set(jobId, task);
60
+ task.start();
61
+ console.log(`Scheduled cron job ${jobId} with schedule: ${config.schedule}`);
62
+ return jobId;
63
+ }
64
+ async executeJob(config) {
65
+ const jobId = config.id || (0, uuid_1.v4)();
66
+ const jobMessage = {
67
+ id: jobId,
68
+ config,
69
+ status: types_1.JobStatus.PENDING,
70
+ attempts: 0,
71
+ createdAt: new Date()
72
+ };
73
+ const channel = this.connection.getChannel();
74
+ const queueName = this.getQueueForJob(config);
75
+ await channel.assertQueue(queueName, { durable: true });
76
+ const message = Buffer.from(JSON.stringify(jobMessage));
77
+ await channel.sendToQueue(queueName, message, {
78
+ persistent: true,
79
+ priority: config.priority || 0
80
+ });
81
+ console.log(`Job ${jobId} added to queue ${queueName}`);
82
+ return jobId;
83
+ }
84
+ async cancelCronJob(jobId) {
85
+ const task = this.cronJobs.get(jobId);
86
+ if (!task) {
87
+ return false;
88
+ }
89
+ task.stop();
90
+ this.cronJobs.delete(jobId);
91
+ console.log(`Cancelled cron job ${jobId}`);
92
+ return true;
93
+ }
94
+ getCronJobs() {
95
+ return Array.from(this.cronJobs.keys());
96
+ }
97
+ getQueueForJob(config) {
98
+ return `job_queue_${config.handler}`;
99
+ }
100
+ }
101
+ exports.JobScheduler = JobScheduler;
102
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/scheduler/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,63 @@
1
+ export interface JobConfig {
2
+ id: string;
3
+ name: string;
4
+ handler: string;
5
+ data?: any;
6
+ priority?: number;
7
+ delay?: number;
8
+ attempts?: number;
9
+ backoff?: BackoffConfig;
10
+ }
11
+ export interface CronJobConfig extends JobConfig {
12
+ schedule: string;
13
+ timezone?: string;
14
+ }
15
+ export interface BackoffConfig {
16
+ type: 'fixed' | 'exponential';
17
+ delay: number;
18
+ }
19
+ export interface JobResult {
20
+ success: boolean;
21
+ data?: any;
22
+ error?: string;
23
+ }
24
+ export interface WorkerConfig {
25
+ name: string;
26
+ concurrency: number;
27
+ queues: string[];
28
+ handlers: {
29
+ [key: string]: JobHandler;
30
+ };
31
+ }
32
+ export interface JobHandler {
33
+ (data: any): Promise<JobResult>;
34
+ }
35
+ export interface QueueConfig {
36
+ name: string;
37
+ durable?: boolean;
38
+ exclusive?: boolean;
39
+ autoDelete?: boolean;
40
+ arguments?: any;
41
+ }
42
+ export interface ConnectionConfig {
43
+ url: string;
44
+ options?: any;
45
+ }
46
+ export declare enum JobStatus {
47
+ PENDING = "pending",
48
+ PROCESSING = "processing",
49
+ COMPLETED = "completed",
50
+ FAILED = "failed",
51
+ RETRY = "retry"
52
+ }
53
+ export interface JobMessage {
54
+ id: string;
55
+ config: JobConfig;
56
+ status: JobStatus;
57
+ attempts: number;
58
+ createdAt: Date;
59
+ processedAt?: Date;
60
+ completedAt?: Date;
61
+ error?: string;
62
+ }
63
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,GAAG,CAAC;IACX,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,aAAa,CAAC;CACzB;AAED,MAAM,WAAW,aAAc,SAAQ,SAAS;IAC9C,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,OAAO,GAAG,aAAa,CAAC;IAC9B,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,GAAG,CAAC;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,CAAA;KAAE,CAAC;CACzC;AAED,MAAM,WAAW,UAAU;IACzB,CAAC,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;CACjC;AAED,MAAM,WAAW,WAAW;IAC1B,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,gBAAgB;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,GAAG,CAAC;CACf;AAED,oBAAY,SAAS;IACnB,OAAO,YAAY;IACnB,UAAU,eAAe;IACzB,SAAS,cAAc;IACvB,MAAM,WAAW;IACjB,KAAK,UAAU;CAChB;AAED,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,SAAS,CAAC;IAClB,MAAM,EAAE,SAAS,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,IAAI,CAAC;IAChB,WAAW,CAAC,EAAE,IAAI,CAAC;IACnB,WAAW,CAAC,EAAE,IAAI,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB"}
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.JobStatus = void 0;
4
+ var JobStatus;
5
+ (function (JobStatus) {
6
+ JobStatus["PENDING"] = "pending";
7
+ JobStatus["PROCESSING"] = "processing";
8
+ JobStatus["COMPLETED"] = "completed";
9
+ JobStatus["FAILED"] = "failed";
10
+ JobStatus["RETRY"] = "retry";
11
+ })(JobStatus || (exports.JobStatus = JobStatus = {}));
12
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":";;;AAmDA,IAAY,SAMX;AAND,WAAY,SAAS;IACnB,gCAAmB,CAAA;IACnB,sCAAyB,CAAA;IACzB,oCAAuB,CAAA;IACvB,8BAAiB,CAAA;IACjB,4BAAe,CAAA;AACjB,CAAC,EANW,SAAS,yBAAT,SAAS,QAMpB"}
@@ -0,0 +1,36 @@
1
+ import { RabbitMQConnection } from './rabbitmq';
2
+ export interface NodeInfo {
3
+ id: string;
4
+ name: string;
5
+ lastHeartbeat: Date;
6
+ activeJobs: number;
7
+ maxConcurrency: number;
8
+ queues: string[];
9
+ status: 'active' | 'busy' | 'offline';
10
+ }
11
+ export declare class LoadBalancer {
12
+ private connection;
13
+ private nodes;
14
+ private heartbeatInterval;
15
+ private nodeId;
16
+ private heartbeatIntervalMs;
17
+ private nodeTimeoutMs;
18
+ constructor(connection: RabbitMQConnection, nodeId: string);
19
+ start(): Promise<void>;
20
+ stop(): Promise<void>;
21
+ registerNode(nodeInfo: Omit<NodeInfo, 'lastHeartbeat'>): Promise<void>;
22
+ getAvailableNode(queueName: string): NodeInfo | null;
23
+ getLeastLoadedNode(queueName: string): NodeInfo | null;
24
+ getAllNodes(): NodeInfo[];
25
+ getActiveNodes(): NodeInfo[];
26
+ updateNodeStatus(nodeId: string, activeJobs: number): void;
27
+ private setupHeartbeatQueues;
28
+ private startHeartbeat;
29
+ private sendHeartbeat;
30
+ private sendOfflineHeartbeat;
31
+ private listenForHeartbeats;
32
+ private processHeartbeat;
33
+ private isNodeAlive;
34
+ private cleanupDeadNodes;
35
+ }
36
+ //# sourceMappingURL=load-balancer.d.ts.map