nodejs-task-scheduler 1.0.5 → 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.
- package/.claude/settings.local.json +2 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -1
- package/dist/scheduler/index.d.ts +10 -0
- package/dist/scheduler/index.d.ts.map +1 -1
- package/dist/scheduler/index.js +69 -13
- package/dist/scheduler/index.js.map +1 -1
- package/dist/utils/master-election.d.ts +50 -0
- package/dist/utils/master-election.d.ts.map +1 -0
- package/dist/utils/master-election.js +230 -0
- package/dist/utils/master-election.js.map +1 -0
- package/package.json +1 -1
- package/nodejs-task-scheduler-1.0.4.tgz +0 -0
- package/nodejs-task-scheduler-1.0.5.tgz +0 -0
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
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC;AAG1B,OAAO,EAAgB,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAK/D,OAAO,EACL,gBAAgB,EAChB,YAAY,EACZ,SAAS,EACT,aAAa,EACb,WAAW,EACZ,MAAM,SAAS,CAAC;AAEjB,qBAAa,aAAa;IACxB,OAAO,CAAC,UAAU,CAAqB;IACvC,OAAO,CAAC,SAAS,CAAe;IAChC,OAAO,CAAC,OAAO,CAAqC;IACpD,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,iBAAiB,CAAoB;IAC7C,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,aAAa,CAAS;gBAElB,gBAAgB,EAAE,gBAAgB;IAUxC,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;
|
|
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":";;;;;;;;;;;;;;;;;AAAA,4BAA0B;AAC1B,+BAAoC;AACpC,+CAAsD;AACtD,yDAA+D;AAC/D,2CAA2C;AAC3C,qCAAqC;AACrC,mCAAuC;AACvC,oDAA0D;AAS1D,MAAa,aAAa;IAWxB,YAAY,gBAAkC;QARtC,YAAO,GAA2B,IAAI,GAAG,EAAE,CAAC;QAM5C,kBAAa,GAAG,KAAK,CAAC;QAG5B,IAAI,CAAC,MAAM,GAAG,IAAA,SAAM,GAAE,CAAC;QACvB,IAAI,CAAC,WAAW,GAAG,gBAAgB,CAAC,WAAW,IAAI,EAAE,CAAC;QACtD,IAAI,CAAC,UAAU,GAAG,IAAI,6BAAkB,CAAC,gBAAgB,CAAC,CAAC;QAC3D,IAAI,CAAC,SAAS,GAAG,IAAI,wBAAY,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;QACrE,IAAI,CAAC,YAAY,GAAG,IAAI,oBAAY,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;QACxE,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;
|
|
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;
|
|
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"}
|
package/dist/scheduler/index.js
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
|
|
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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,gDAAkC;AAClC,+BAAoC;AACpC,oCAA2E;
|
|
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
|
Binary file
|
|
Binary file
|