earlect
Version:
Leader Election Generic Implementation for TypeScript
96 lines (95 loc) • 3.26 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const pino_1 = __importDefault(require("pino"));
const logger = pino_1.default();
var HallMessages;
(function (HallMessages) {
HallMessages["LEADER_SHOUT"] = "earlect.leader_shout";
HallMessages["CHALLENGE"] = "earlect.challenge";
HallMessages["CHALLENGE_RUMOUR"] = "earlect.challenge_rumour";
})(HallMessages = exports.HallMessages || (exports.HallMessages = {}));
class Hall {
constructor(communicationMedium) {
this.communicationMedium = communicationMedium;
}
static async create(communicationMedium) {
const hall = new Hall(communicationMedium);
return hall;
}
registerViking(viking) {
const hall = this;
hall.communicationMedium.receive(HallMessages.LEADER_SHOUT, (err, msg) => {
if (err) {
hall.receiveCommunicationProblemReport(err);
return;
}
let leaderShout;
try {
leaderShout = JSON.parse(msg.data);
}
catch (err) {
hall.receiveCommunicationProblemReport(err);
return;
}
viking.receiveLeaderShout(leaderShout);
});
hall.communicationMedium.receiveExclusively(HallMessages.CHALLENGE, (err, msg) => {
if (err) {
hall.receiveCommunicationProblemReport(err);
return;
}
let challenge;
try {
challenge = JSON.parse(msg.data);
}
catch (err) {
hall.receiveCommunicationProblemReport(err);
return;
}
viking.receiveChallenge(challenge);
});
hall.communicationMedium.receive(HallMessages.CHALLENGE_RUMOUR, (err, msg) => {
if (err) {
hall.receiveCommunicationProblemReport(err);
return;
}
let challenge;
try {
challenge = JSON.parse(msg.data);
}
catch (err) {
hall.receiveCommunicationProblemReport(err);
return;
}
viking.receiveChallengeRumour(challenge);
});
}
sendChallenge(challenge) {
const hall = this;
try {
hall.communicationMedium.send(HallMessages.CHALLENGE, JSON.stringify(challenge));
hall.communicationMedium.send(HallMessages.CHALLENGE_RUMOUR, JSON.stringify(challenge));
}
catch (err) {
hall.receiveCommunicationProblemReport(err);
}
}
sendLeaderShout(leaderShout) {
const hall = this;
try {
hall.communicationMedium.send(HallMessages.LEADER_SHOUT, JSON.stringify(leaderShout));
}
catch (err) {
hall.receiveCommunicationProblemReport(err);
}
}
receiveCommunicationProblemReport(err) {
const hall = this;
logger.error("Communication Problem reported:");
logger.error(err);
}
}
exports.Hall = Hall;