UNPKG

earlect

Version:

Leader Election Generic Implementation for TypeScript

96 lines (95 loc) 3.26 kB
"use strict"; 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;