nodejs-task-scheduler 1.0.5 → 1.0.7

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.
@@ -13,7 +13,8 @@
13
13
  "Bash(npm test)",
14
14
  "Bash(npm test:*)",
15
15
  "Bash(node:*)",
16
- "Bash(touch:*)"
16
+ "Bash(touch:*)",
17
+ "Bash(npx tsc:*)"
17
18
  ],
18
19
  "deny": []
19
20
  }
package/dist/index.d.ts CHANGED
@@ -33,6 +33,8 @@ export declare class TaskScheduler {
33
33
  activeJobs: number;
34
34
  } | null;
35
35
  getCronJobs(): string[];
36
+ isLeader(): boolean;
37
+ getSchedulerNodeId(): string;
36
38
  /**
37
39
  * Register a class instance with decorators
38
40
  * This will automatically create workers and schedule cron jobs based on decorators
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -43,6 +43,7 @@ class TaskScheduler {
43
43
  await this.queueManager.setupDeadLetterQueue();
44
44
  await this.queueManager.setupDelayedJobQueue();
45
45
  await this.loadBalancer.start();
46
+ await this.scheduler.startMasterElection();
46
47
  this.isInitialized = true;
47
48
  console.log(`TaskScheduler initialized with node ID: ${this.nodeId}`);
48
49
  }
@@ -52,6 +53,7 @@ class TaskScheduler {
52
53
  await worker.stop();
53
54
  console.log(`Worker ${name} stopped`);
54
55
  }
56
+ await this.scheduler.stopMasterElection();
55
57
  await this.loadBalancer.stop();
56
58
  await this.connection.disconnect();
57
59
  this.isInitialized = false;
@@ -143,6 +145,14 @@ class TaskScheduler {
143
145
  this.ensureInitialized();
144
146
  return this.scheduler.getCronJobs();
145
147
  }
148
+ isLeader() {
149
+ this.ensureInitialized();
150
+ return this.scheduler.isLeader();
151
+ }
152
+ getSchedulerNodeId() {
153
+ this.ensureInitialized();
154
+ return this.scheduler.getNodeId();
155
+ }
146
156
  // Decorator-based methods
147
157
  /**
148
158
  * Register a class instance with decorators
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -4,11 +4,21 @@ export declare class JobScheduler {
4
4
  private connection;
5
5
  private cronJobs;
6
6
  private queuePrefix;
7
+ private masterElection;
8
+ private pendingCronJobs;
7
9
  constructor(connection: RabbitMQConnection, queuePrefix?: string);
8
10
  scheduleCronJob(config: CronJobConfig): Promise<string>;
9
11
  executeJob(config: JobConfig): Promise<string>;
10
12
  cancelCronJob(jobId: string): Promise<boolean>;
11
13
  getCronJobs(): string[];
14
+ startMasterElection(): Promise<void>;
15
+ stopMasterElection(): Promise<void>;
16
+ isLeader(): boolean;
17
+ getNodeId(): string;
18
+ private setupMasterElectionHandlers;
19
+ private activateCronJob;
20
+ private activateAllPendingCronJobs;
21
+ private deactivateAllCronJobs;
12
22
  private getQueueForJob;
13
23
  }
14
24
  //# sourceMappingURL=index.d.ts.map
@@ -1 +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;IAC9D,OAAO,CAAC,WAAW,CAAS;gBAEhB,UAAU,EAAE,kBAAkB,EAAE,WAAW,GAAE,MAAW;IAK9D,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"}
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;AAGvD,qBAAa,YAAY;IACvB,OAAO,CAAC,UAAU,CAAqB;IACvC,OAAO,CAAC,QAAQ,CAA8C;IAC9D,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,eAAe,CAAyC;gBAEpD,UAAU,EAAE,kBAAkB,EAAE,WAAW,GAAE,MAAW;IAW9D,eAAe,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC;IAqBvD,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;IAIjB,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC;IAIpC,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC;IAIzC,QAAQ,IAAI,OAAO;IAInB,SAAS,IAAI,MAAM;IAInB,OAAO,CAAC,2BAA2B;YAYrB,eAAe;YAyBf,0BAA0B;IAMxC,OAAO,CAAC,qBAAqB;IAQ7B,OAAO,CAAC,cAAc;CAGvB"}
@@ -37,29 +37,34 @@ exports.JobScheduler = void 0;
37
37
  const cron = __importStar(require("node-cron"));
38
38
  const uuid_1 = require("uuid");
39
39
  const types_1 = require("../types");
40
+ const master_election_1 = require("../utils/master-election");
40
41
  class JobScheduler {
41
42
  constructor(connection, queuePrefix = '') {
42
43
  this.cronJobs = new Map();
44
+ this.pendingCronJobs = new Map();
43
45
  this.connection = connection;
44
46
  this.queuePrefix = queuePrefix;
47
+ this.masterElection = new master_election_1.MasterElection({
48
+ connection: this.connection,
49
+ queuePrefix: this.queuePrefix
50
+ });
51
+ this.setupMasterElectionHandlers();
45
52
  }
46
53
  async scheduleCronJob(config) {
47
54
  const jobId = config.id || (0, uuid_1.v4)();
48
- if (this.cronJobs.has(jobId)) {
55
+ const cronConfig = { ...config, id: jobId };
56
+ if (this.cronJobs.has(jobId) || this.pendingCronJobs.has(jobId)) {
49
57
  throw new Error(`Cron job with ID ${jobId} already exists`);
50
58
  }
51
- const task = cron.schedule(config.schedule, async () => {
52
- await this.executeJob({
53
- ...config,
54
- id: (0, uuid_1.v4)()
55
- });
56
- }, {
57
- scheduled: false,
58
- timezone: config.timezone
59
- });
60
- this.cronJobs.set(jobId, task);
61
- task.start();
62
- console.log(`Scheduled cron job ${jobId} with schedule: ${config.schedule}`);
59
+ // Store the cron job configuration
60
+ this.pendingCronJobs.set(jobId, cronConfig);
61
+ // Only schedule if this node is the master
62
+ if (this.masterElection.isLeader()) {
63
+ await this.activateCronJob(jobId, cronConfig);
64
+ }
65
+ else {
66
+ console.log(`Cron job ${jobId} queued, waiting for master election`);
67
+ }
63
68
  return jobId;
64
69
  }
65
70
  async executeJob(config) {
@@ -95,6 +100,57 @@ class JobScheduler {
95
100
  getCronJobs() {
96
101
  return Array.from(this.cronJobs.keys());
97
102
  }
103
+ async startMasterElection() {
104
+ await this.masterElection.start();
105
+ }
106
+ async stopMasterElection() {
107
+ await this.masterElection.stop();
108
+ }
109
+ isLeader() {
110
+ return this.masterElection.isLeader();
111
+ }
112
+ getNodeId() {
113
+ return this.masterElection.getNodeId();
114
+ }
115
+ setupMasterElectionHandlers() {
116
+ this.masterElection.on('elected', async () => {
117
+ console.log(`Node ${this.masterElection.getNodeId()} elected as master - activating cron jobs`);
118
+ await this.activateAllPendingCronJobs();
119
+ });
120
+ this.masterElection.on('demoted', () => {
121
+ console.log(`Node ${this.masterElection.getNodeId()} lost leadership - deactivating cron jobs`);
122
+ this.deactivateAllCronJobs();
123
+ });
124
+ }
125
+ async activateCronJob(jobId, config) {
126
+ if (this.cronJobs.has(jobId)) {
127
+ return; // Already active
128
+ }
129
+ const task = cron.schedule(config.schedule, async () => {
130
+ await this.executeJob({
131
+ ...config,
132
+ id: (0, uuid_1.v4)()
133
+ });
134
+ }, {
135
+ scheduled: false,
136
+ timezone: config.timezone
137
+ });
138
+ this.cronJobs.set(jobId, task);
139
+ task.start();
140
+ console.log(`Activated cron job ${jobId} with schedule: ${config.schedule} on master node ${this.masterElection.getNodeId()}`);
141
+ }
142
+ async activateAllPendingCronJobs() {
143
+ for (const [jobId, config] of this.pendingCronJobs.entries()) {
144
+ await this.activateCronJob(jobId, config);
145
+ }
146
+ }
147
+ deactivateAllCronJobs() {
148
+ for (const [jobId, task] of this.cronJobs.entries()) {
149
+ task.stop();
150
+ console.log(`Deactivated cron job ${jobId} - no longer master`);
151
+ }
152
+ this.cronJobs.clear();
153
+ }
98
154
  getQueueForJob(config) {
99
155
  return this.queuePrefix ? `${this.queuePrefix}${config.queue}` : config.queue;
100
156
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/scheduler/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/scheduler/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ import { RabbitMQConnection } from './rabbitmq';
2
+ import { EventEmitter } from 'events';
3
+ export interface MasterElectionConfig {
4
+ connection: RabbitMQConnection;
5
+ nodeId?: string;
6
+ heartbeatInterval?: number;
7
+ leadershipTimeout?: number;
8
+ queuePrefix?: string;
9
+ }
10
+ export declare enum LeadershipState {
11
+ FOLLOWER = "follower",
12
+ CANDIDATE = "candidate",
13
+ LEADER = "leader"
14
+ }
15
+ export interface LeadershipEvent {
16
+ type: 'elected' | 'demoted' | 'heartbeat';
17
+ nodeId: string;
18
+ timestamp: Date;
19
+ }
20
+ export declare class MasterElection extends EventEmitter {
21
+ private connection;
22
+ private nodeId;
23
+ private state;
24
+ private heartbeatInterval;
25
+ private leadershipTimeout;
26
+ private queuePrefix;
27
+ private heartbeatTimer?;
28
+ private leadershipTimer?;
29
+ private cleanupTimer?;
30
+ private electionQueue;
31
+ private heartbeatQueue;
32
+ private lastHeartbeat?;
33
+ private isRunning;
34
+ constructor(config: MasterElectionConfig);
35
+ start(): Promise<void>;
36
+ stop(): Promise<void>;
37
+ isLeader(): boolean;
38
+ getNodeId(): string;
39
+ getState(): LeadershipState;
40
+ private initializeQueues;
41
+ private startElection;
42
+ private attemptLeadership;
43
+ private becomeLeader;
44
+ private becomeFollower;
45
+ private sendHeartbeat;
46
+ private monitorLeaderHeartbeat;
47
+ private resetLeadershipTimeout;
48
+ private resignLeadership;
49
+ private startPeriodicCleanup;
50
+ private cleanupHeartbeatQueue;
51
+ private getQueueName;
52
+ }
53
+ //# sourceMappingURL=master-election.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"master-election.d.ts","sourceRoot":"","sources":["../../src/utils/master-election.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAEtC,MAAM,WAAW,oBAAoB;IACnC,UAAU,EAAE,kBAAkB,CAAC;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,oBAAY,eAAe;IACzB,QAAQ,aAAa;IACrB,SAAS,cAAc;IACvB,MAAM,WAAW;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,SAAS,GAAG,SAAS,GAAG,WAAW,CAAC;IAC1C,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,IAAI,CAAC;CACjB;AAED,qBAAa,cAAe,SAAQ,YAAY;IAC9C,OAAO,CAAC,UAAU,CAAqB;IACvC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,KAAK,CAA6C;IAC1D,OAAO,CAAC,iBAAiB,CAAS;IAClC,OAAO,CAAC,iBAAiB,CAAS;IAClC,OAAO,CAAC,WAAW,CAAS;IAE5B,OAAO,CAAC,cAAc,CAAC,CAAiB;IACxC,OAAO,CAAC,eAAe,CAAC,CAAiB;IACzC,OAAO,CAAC,YAAY,CAAC,CAAiB;IACtC,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,aAAa,CAAC,CAAO;IAC7B,OAAO,CAAC,SAAS,CAAS;gBAEd,MAAM,EAAE,oBAAoB;IAYlC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAWtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IA6B3B,QAAQ,IAAI,OAAO;IAInB,SAAS,IAAI,MAAM;IAInB,QAAQ,IAAI,eAAe;YAIb,gBAAgB;YA+BhB,aAAa;YAYb,iBAAiB;YA2BjB,YAAY;YAoBZ,cAAc;YAuBd,aAAa;YAuCb,sBAAsB;IAoCpC,OAAO,CAAC,sBAAsB;YAahB,gBAAgB;IAuB9B,OAAO,CAAC,oBAAoB;YAmBd,qBAAqB;IAenC,OAAO,CAAC,YAAY;CAGrB"}
@@ -0,0 +1,281 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MasterElection = exports.LeadershipState = void 0;
4
+ const uuid_1 = require("uuid");
5
+ const events_1 = require("events");
6
+ var LeadershipState;
7
+ (function (LeadershipState) {
8
+ LeadershipState["FOLLOWER"] = "follower";
9
+ LeadershipState["CANDIDATE"] = "candidate";
10
+ LeadershipState["LEADER"] = "leader";
11
+ })(LeadershipState || (exports.LeadershipState = LeadershipState = {}));
12
+ class MasterElection extends events_1.EventEmitter {
13
+ constructor(config) {
14
+ super();
15
+ this.state = LeadershipState.FOLLOWER;
16
+ this.isRunning = false;
17
+ this.connection = config.connection;
18
+ this.nodeId = config.nodeId || (0, uuid_1.v4)();
19
+ this.heartbeatInterval = config.heartbeatInterval || 10000; // 10 seconds
20
+ this.leadershipTimeout = config.leadershipTimeout || 30000; // 30 seconds
21
+ this.queuePrefix = config.queuePrefix || '';
22
+ this.electionQueue = this.getQueueName('leader-election');
23
+ this.heartbeatQueue = this.getQueueName('leader-heartbeat');
24
+ }
25
+ async start() {
26
+ if (this.isRunning) {
27
+ return;
28
+ }
29
+ this.isRunning = true;
30
+ await this.initializeQueues();
31
+ this.startPeriodicCleanup();
32
+ await this.startElection();
33
+ }
34
+ async stop() {
35
+ if (!this.isRunning) {
36
+ return;
37
+ }
38
+ this.isRunning = false;
39
+ if (this.heartbeatTimer) {
40
+ clearInterval(this.heartbeatTimer);
41
+ }
42
+ if (this.leadershipTimer) {
43
+ clearTimeout(this.leadershipTimer);
44
+ }
45
+ if (this.cleanupTimer) {
46
+ clearInterval(this.cleanupTimer);
47
+ }
48
+ if (this.state === LeadershipState.LEADER) {
49
+ await this.resignLeadership();
50
+ }
51
+ // Clean up heartbeat queue
52
+ await this.cleanupHeartbeatQueue();
53
+ console.log(`Node ${this.nodeId} stopped master election`);
54
+ }
55
+ isLeader() {
56
+ return this.state === LeadershipState.LEADER;
57
+ }
58
+ getNodeId() {
59
+ return this.nodeId;
60
+ }
61
+ getState() {
62
+ return this.state;
63
+ }
64
+ async initializeQueues() {
65
+ const channel = this.connection.getChannel();
66
+ // Election queue - exclusive, auto-delete when connection closes
67
+ await channel.assertQueue(this.electionQueue, {
68
+ exclusive: false,
69
+ durable: false,
70
+ autoDelete: false
71
+ });
72
+ // Heartbeat exchange - use fanout for better distribution
73
+ await channel.assertExchange('leader-heartbeat-exchange', 'fanout', {
74
+ durable: false,
75
+ autoDelete: true
76
+ });
77
+ // Heartbeat queue - with TTL and auto-cleanup
78
+ await channel.assertQueue(this.heartbeatQueue, {
79
+ exclusive: false,
80
+ durable: false,
81
+ autoDelete: true,
82
+ arguments: {
83
+ 'x-message-ttl': this.heartbeatInterval * 3, // Messages expire after 3 heartbeat intervals
84
+ 'x-expires': this.leadershipTimeout * 2 // Queue expires if unused
85
+ }
86
+ });
87
+ // Bind heartbeat queue to exchange
88
+ await channel.bindQueue(this.heartbeatQueue, 'leader-heartbeat-exchange', '');
89
+ }
90
+ async startElection() {
91
+ try {
92
+ this.state = LeadershipState.CANDIDATE;
93
+ console.log(`Node ${this.nodeId} starting election`);
94
+ await this.attemptLeadership();
95
+ }
96
+ catch (error) {
97
+ console.error(`Election failed for node ${this.nodeId}:`, error);
98
+ await this.becomeFollower();
99
+ }
100
+ }
101
+ async attemptLeadership() {
102
+ const channel = this.connection.getChannel();
103
+ try {
104
+ // Try to consume from election queue exclusively
105
+ const consumerResult = await channel.consume(this.electionQueue, () => { }, // We don't process messages, just need exclusive access
106
+ {
107
+ exclusive: true,
108
+ noAck: true
109
+ });
110
+ if (consumerResult) {
111
+ await this.becomeLeader();
112
+ }
113
+ }
114
+ catch (error) {
115
+ if (error.message && error.message.includes('exclusive')) {
116
+ // Another node is already the leader
117
+ await this.becomeFollower();
118
+ }
119
+ else {
120
+ throw error;
121
+ }
122
+ }
123
+ }
124
+ async becomeLeader() {
125
+ console.log(`Node ${this.nodeId} became the leader`);
126
+ this.state = LeadershipState.LEADER;
127
+ this.lastHeartbeat = new Date();
128
+ // Start sending heartbeats
129
+ this.heartbeatTimer = setInterval(async () => {
130
+ await this.sendHeartbeat();
131
+ }, this.heartbeatInterval);
132
+ // Set up leadership timeout monitor
133
+ this.resetLeadershipTimeout();
134
+ this.emit('elected', {
135
+ type: 'elected',
136
+ nodeId: this.nodeId,
137
+ timestamp: new Date()
138
+ });
139
+ }
140
+ async becomeFollower() {
141
+ if (this.state === LeadershipState.LEADER) {
142
+ console.log(`Node ${this.nodeId} lost leadership, becoming follower`);
143
+ this.emit('demoted', {
144
+ type: 'demoted',
145
+ nodeId: this.nodeId,
146
+ timestamp: new Date()
147
+ });
148
+ }
149
+ else {
150
+ console.log(`Node ${this.nodeId} is following, monitoring for leader changes`);
151
+ }
152
+ this.state = LeadershipState.FOLLOWER;
153
+ if (this.heartbeatTimer) {
154
+ clearInterval(this.heartbeatTimer);
155
+ this.heartbeatTimer = undefined;
156
+ }
157
+ // Start monitoring heartbeats
158
+ await this.monitorLeaderHeartbeat();
159
+ }
160
+ async sendHeartbeat() {
161
+ if (this.state !== LeadershipState.LEADER || !this.isRunning) {
162
+ return;
163
+ }
164
+ try {
165
+ const channel = this.connection.getChannel();
166
+ const heartbeatMessage = {
167
+ nodeId: this.nodeId,
168
+ timestamp: new Date(),
169
+ state: this.state
170
+ };
171
+ await channel.publish('leader-heartbeat-exchange', '', Buffer.from(JSON.stringify(heartbeatMessage)), {
172
+ persistent: false,
173
+ expiration: (this.heartbeatInterval * 2).toString() // Message expires in 2 heartbeat intervals
174
+ });
175
+ this.lastHeartbeat = new Date();
176
+ this.resetLeadershipTimeout();
177
+ this.emit('heartbeat', {
178
+ type: 'heartbeat',
179
+ nodeId: this.nodeId,
180
+ timestamp: new Date()
181
+ });
182
+ }
183
+ catch (error) {
184
+ console.error(`Failed to send heartbeat from node ${this.nodeId}:`, error);
185
+ // If we can't send heartbeat, we should step down
186
+ await this.resignLeadership();
187
+ }
188
+ }
189
+ async monitorLeaderHeartbeat() {
190
+ if (this.state === LeadershipState.LEADER) {
191
+ return;
192
+ }
193
+ const channel = this.connection.getChannel();
194
+ await channel.consume(this.heartbeatQueue, async (msg) => {
195
+ if (!msg || !this.isRunning) {
196
+ return;
197
+ }
198
+ try {
199
+ const heartbeat = JSON.parse(msg.content.toString());
200
+ if (heartbeat.nodeId !== this.nodeId) {
201
+ // Received heartbeat from current leader
202
+ this.lastHeartbeat = new Date(heartbeat.timestamp);
203
+ this.resetLeadershipTimeout();
204
+ }
205
+ channel.ack(msg);
206
+ }
207
+ catch (error) {
208
+ console.error('Error processing heartbeat:', error);
209
+ channel.nack(msg, false, false);
210
+ }
211
+ }, { noAck: false });
212
+ // Start timeout to detect leader failure
213
+ this.resetLeadershipTimeout();
214
+ }
215
+ resetLeadershipTimeout() {
216
+ if (this.leadershipTimer) {
217
+ clearTimeout(this.leadershipTimer);
218
+ }
219
+ this.leadershipTimer = setTimeout(async () => {
220
+ if (this.state === LeadershipState.FOLLOWER && this.isRunning) {
221
+ console.log(`Node ${this.nodeId} detected leader timeout, starting new election`);
222
+ await this.startElection();
223
+ }
224
+ }, this.leadershipTimeout);
225
+ }
226
+ async resignLeadership() {
227
+ if (this.state !== LeadershipState.LEADER) {
228
+ return;
229
+ }
230
+ console.log(`Node ${this.nodeId} resigning leadership`);
231
+ if (this.heartbeatTimer) {
232
+ clearInterval(this.heartbeatTimer);
233
+ this.heartbeatTimer = undefined;
234
+ }
235
+ // Cancel exclusive consumption to allow other nodes to become leader
236
+ try {
237
+ const channel = this.connection.getChannel();
238
+ await channel.cancel(this.electionQueue);
239
+ }
240
+ catch (error) {
241
+ console.warn('Error canceling election queue consumption:', error);
242
+ }
243
+ await this.becomeFollower();
244
+ }
245
+ startPeriodicCleanup() {
246
+ // Clean up heartbeat queue every minute to prevent message buildup
247
+ this.cleanupTimer = setInterval(async () => {
248
+ if (this.isRunning && this.state === LeadershipState.FOLLOWER) {
249
+ try {
250
+ const channel = this.connection.getChannel();
251
+ // Only purge if queue has too many messages (check queue info)
252
+ const queueInfo = await channel.checkQueue(this.heartbeatQueue);
253
+ if (queueInfo.messageCount > 50) { // Threshold to prevent excessive cleanup
254
+ await channel.purgeQueue(this.heartbeatQueue);
255
+ console.log(`Cleaned up ${queueInfo.messageCount} old heartbeat messages for node ${this.nodeId}`);
256
+ }
257
+ }
258
+ catch (error) {
259
+ // Queue might not exist yet, ignore error
260
+ }
261
+ }
262
+ }, 60000); // Every minute
263
+ }
264
+ async cleanupHeartbeatQueue() {
265
+ try {
266
+ const channel = this.connection.getChannel();
267
+ // Purge any remaining messages from heartbeat queue
268
+ await channel.purgeQueue(this.heartbeatQueue);
269
+ // Delete the heartbeat queue if it exists and is empty
270
+ await channel.deleteQueue(this.heartbeatQueue, { ifEmpty: true });
271
+ }
272
+ catch (error) {
273
+ console.warn(`Error cleaning up heartbeat queue for node ${this.nodeId}:`, error);
274
+ }
275
+ }
276
+ getQueueName(baseName) {
277
+ return this.queuePrefix ? `${this.queuePrefix}${baseName}` : baseName;
278
+ }
279
+ }
280
+ exports.MasterElection = MasterElection;
281
+ //# sourceMappingURL=master-election.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"master-election.js","sourceRoot":"","sources":["../../src/utils/master-election.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "nodejs-task-scheduler",
3
- "version": "1.0.5",
3
+ "version": "1.0.7",
4
4
  "description": "Distributed task scheduler using RabbitMQ with cron and direct job execution",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
Binary file
Binary file