Example of usage
const Consul = require('consul');
const {LeaderElection} = require('./index.js');
const consul = new Consul({
host: '127.0.0.1',
port: 8500,
promisify: true //required
});
const sessionOptions = {
dc: 'dc1',
name: 'Session name',
node: 'some.local.host',
ttlSec: 30, //30 seconds, not settled by default
lockdelaySec: 5, //5 seconds, default=15
checks: ['serfHealth', 'my-check-id'] //only 'serfHealth' by default
};
const kvOptions = {
key: 'service/vsscc/leader', //required
value: 'some value', //require
dc: 'dc1',
json: true //parse KV value on record change
};
let leader = false;
const leaderElectionService = new LeaderElection(consul, sessionOptions, kvOptions);
leaderElectionService.on(LeaderElection.ELECTED_EVENT, async (amILeader, sessionId) => {
if (amILeader) {
if (leader) {
console.log('Leadership was reacquired by myself. Maybe, I am only one candidate )');
} else {
console.log('I\'m the leader');
leader = true;
}
} else {
if (leader) {
const sessionInfo = await consul.session.get(sessionId);
console.log(`${sessionInfo.Node} is a leader now`);
} else {
console.log('Not today...');
}
}
});
leaderElectionService.on(LeaderElection.LOST_LEADER_EVENT, () => {
if (leader) {
leader = false;
console.log('I have lost my leadership =(');
}
});
leaderElectionService.on(LeaderElection.UNHEALTHY_EVENT, () => {
if (leader) {
leader = leaderElectionService.isLeader(); //set to false, because leadership can't be confirmed
// pause processing or so on
}
});
leaderElectionService.on(LeaderElection.ERROR_EVENT, error => {
console.error(error);
});
await leaderElectionService.start();
const value = leaderElectionService.getElectionKeyValue();
const rawData = leaderElectionService.getElectionKeyData();
setTimeout(async () => {
await leaderElectionService.resign();
process.exit(0);
}, 10000);