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.
- 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 +53 -0
- package/dist/utils/master-election.d.ts.map +1 -0
- package/dist/utils/master-election.js +281 -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,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
|
Binary file
|
|
Binary file
|