nodejs-task-scheduler 1.0.3 → 1.0.6

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,50 @@
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 electionQueue;
30
+ private heartbeatQueue;
31
+ private lastHeartbeat?;
32
+ private isRunning;
33
+ constructor(config: MasterElectionConfig);
34
+ start(): Promise<void>;
35
+ stop(): Promise<void>;
36
+ isLeader(): boolean;
37
+ getNodeId(): string;
38
+ getState(): LeadershipState;
39
+ private initializeQueues;
40
+ private startElection;
41
+ private attemptLeadership;
42
+ private becomeLeader;
43
+ private becomeFollower;
44
+ private sendHeartbeat;
45
+ private monitorLeaderHeartbeat;
46
+ private resetLeadershipTimeout;
47
+ private resignLeadership;
48
+ private getQueueName;
49
+ }
50
+ //# 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,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;IAUtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAsB3B,QAAQ,IAAI,OAAO;IAInB,SAAS,IAAI,MAAM;IAInB,QAAQ,IAAI,eAAe;YAIb,gBAAgB;YAkBhB,aAAa;YAYb,iBAAiB;YA2BjB,YAAY;YAoBZ,cAAc;YAuBd,aAAa;YAoCb,sBAAsB;IAoCpC,OAAO,CAAC,sBAAsB;YAahB,gBAAgB;IAuB9B,OAAO,CAAC,YAAY;CAGrB"}
@@ -0,0 +1,230 @@
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
+ await this.startElection();
32
+ }
33
+ async stop() {
34
+ if (!this.isRunning) {
35
+ return;
36
+ }
37
+ this.isRunning = false;
38
+ if (this.heartbeatTimer) {
39
+ clearInterval(this.heartbeatTimer);
40
+ }
41
+ if (this.leadershipTimer) {
42
+ clearTimeout(this.leadershipTimer);
43
+ }
44
+ if (this.state === LeadershipState.LEADER) {
45
+ await this.resignLeadership();
46
+ }
47
+ console.log(`Node ${this.nodeId} stopped master election`);
48
+ }
49
+ isLeader() {
50
+ return this.state === LeadershipState.LEADER;
51
+ }
52
+ getNodeId() {
53
+ return this.nodeId;
54
+ }
55
+ getState() {
56
+ return this.state;
57
+ }
58
+ async initializeQueues() {
59
+ const channel = this.connection.getChannel();
60
+ // Election queue - exclusive, auto-delete when connection closes
61
+ await channel.assertQueue(this.electionQueue, {
62
+ exclusive: false,
63
+ durable: false,
64
+ autoDelete: false
65
+ });
66
+ // Heartbeat queue - for leader heartbeats
67
+ await channel.assertQueue(this.heartbeatQueue, {
68
+ exclusive: false,
69
+ durable: false,
70
+ autoDelete: false
71
+ });
72
+ }
73
+ async startElection() {
74
+ try {
75
+ this.state = LeadershipState.CANDIDATE;
76
+ console.log(`Node ${this.nodeId} starting election`);
77
+ await this.attemptLeadership();
78
+ }
79
+ catch (error) {
80
+ console.error(`Election failed for node ${this.nodeId}:`, error);
81
+ await this.becomeFollower();
82
+ }
83
+ }
84
+ async attemptLeadership() {
85
+ const channel = this.connection.getChannel();
86
+ try {
87
+ // Try to consume from election queue exclusively
88
+ const consumerResult = await channel.consume(this.electionQueue, () => { }, // We don't process messages, just need exclusive access
89
+ {
90
+ exclusive: true,
91
+ noAck: true
92
+ });
93
+ if (consumerResult) {
94
+ await this.becomeLeader();
95
+ }
96
+ }
97
+ catch (error) {
98
+ if (error.message && error.message.includes('exclusive')) {
99
+ // Another node is already the leader
100
+ await this.becomeFollower();
101
+ }
102
+ else {
103
+ throw error;
104
+ }
105
+ }
106
+ }
107
+ async becomeLeader() {
108
+ console.log(`Node ${this.nodeId} became the leader`);
109
+ this.state = LeadershipState.LEADER;
110
+ this.lastHeartbeat = new Date();
111
+ // Start sending heartbeats
112
+ this.heartbeatTimer = setInterval(async () => {
113
+ await this.sendHeartbeat();
114
+ }, this.heartbeatInterval);
115
+ // Set up leadership timeout monitor
116
+ this.resetLeadershipTimeout();
117
+ this.emit('elected', {
118
+ type: 'elected',
119
+ nodeId: this.nodeId,
120
+ timestamp: new Date()
121
+ });
122
+ }
123
+ async becomeFollower() {
124
+ if (this.state === LeadershipState.LEADER) {
125
+ console.log(`Node ${this.nodeId} lost leadership, becoming follower`);
126
+ this.emit('demoted', {
127
+ type: 'demoted',
128
+ nodeId: this.nodeId,
129
+ timestamp: new Date()
130
+ });
131
+ }
132
+ else {
133
+ console.log(`Node ${this.nodeId} is following, monitoring for leader changes`);
134
+ }
135
+ this.state = LeadershipState.FOLLOWER;
136
+ if (this.heartbeatTimer) {
137
+ clearInterval(this.heartbeatTimer);
138
+ this.heartbeatTimer = undefined;
139
+ }
140
+ // Start monitoring heartbeats
141
+ await this.monitorLeaderHeartbeat();
142
+ }
143
+ async sendHeartbeat() {
144
+ if (this.state !== LeadershipState.LEADER || !this.isRunning) {
145
+ return;
146
+ }
147
+ try {
148
+ const channel = this.connection.getChannel();
149
+ const heartbeatMessage = {
150
+ nodeId: this.nodeId,
151
+ timestamp: new Date(),
152
+ state: this.state
153
+ };
154
+ await channel.publish('', this.heartbeatQueue, Buffer.from(JSON.stringify(heartbeatMessage)), { persistent: false });
155
+ this.lastHeartbeat = new Date();
156
+ this.resetLeadershipTimeout();
157
+ this.emit('heartbeat', {
158
+ type: 'heartbeat',
159
+ nodeId: this.nodeId,
160
+ timestamp: new Date()
161
+ });
162
+ }
163
+ catch (error) {
164
+ console.error(`Failed to send heartbeat from node ${this.nodeId}:`, error);
165
+ // If we can't send heartbeat, we should step down
166
+ await this.resignLeadership();
167
+ }
168
+ }
169
+ async monitorLeaderHeartbeat() {
170
+ if (this.state === LeadershipState.LEADER) {
171
+ return;
172
+ }
173
+ const channel = this.connection.getChannel();
174
+ await channel.consume(this.heartbeatQueue, async (msg) => {
175
+ if (!msg || !this.isRunning) {
176
+ return;
177
+ }
178
+ try {
179
+ const heartbeat = JSON.parse(msg.content.toString());
180
+ if (heartbeat.nodeId !== this.nodeId) {
181
+ // Received heartbeat from current leader
182
+ this.lastHeartbeat = new Date(heartbeat.timestamp);
183
+ this.resetLeadershipTimeout();
184
+ }
185
+ channel.ack(msg);
186
+ }
187
+ catch (error) {
188
+ console.error('Error processing heartbeat:', error);
189
+ channel.nack(msg, false, false);
190
+ }
191
+ }, { noAck: false });
192
+ // Start timeout to detect leader failure
193
+ this.resetLeadershipTimeout();
194
+ }
195
+ resetLeadershipTimeout() {
196
+ if (this.leadershipTimer) {
197
+ clearTimeout(this.leadershipTimer);
198
+ }
199
+ this.leadershipTimer = setTimeout(async () => {
200
+ if (this.state === LeadershipState.FOLLOWER && this.isRunning) {
201
+ console.log(`Node ${this.nodeId} detected leader timeout, starting new election`);
202
+ await this.startElection();
203
+ }
204
+ }, this.leadershipTimeout);
205
+ }
206
+ async resignLeadership() {
207
+ if (this.state !== LeadershipState.LEADER) {
208
+ return;
209
+ }
210
+ console.log(`Node ${this.nodeId} resigning leadership`);
211
+ if (this.heartbeatTimer) {
212
+ clearInterval(this.heartbeatTimer);
213
+ this.heartbeatTimer = undefined;
214
+ }
215
+ // Cancel exclusive consumption to allow other nodes to become leader
216
+ try {
217
+ const channel = this.connection.getChannel();
218
+ await channel.cancel(this.electionQueue);
219
+ }
220
+ catch (error) {
221
+ console.warn('Error canceling election queue consumption:', error);
222
+ }
223
+ await this.becomeFollower();
224
+ }
225
+ getQueueName(baseName) {
226
+ return this.queuePrefix ? `${this.queuePrefix}${baseName}` : baseName;
227
+ }
228
+ }
229
+ exports.MasterElection = MasterElection;
230
+ //# 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.3",
3
+ "version": "1.0.6",
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",