UNPKG

mokka

Version:

Mokka Consensus Algorithm implementation in Javascript

64 lines 3.04 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.HeartbeatController = void 0; const MessageApi_1 = require("../api/MessageApi"); const NodeApi_1 = require("../api/NodeApi"); const EventTypes_1 = __importDefault(require("../constants/EventTypes")); const MessageTypes_1 = __importDefault(require("../constants/MessageTypes")); const NodeStates_1 = __importDefault(require("../constants/NodeStates")); const NodeStates_2 = __importDefault(require("../constants/NodeStates")); class HeartbeatController { constructor(mokka) { this.mokka = mokka; this.messageApi = new MessageApi_1.MessageApi(mokka); this.nodeApi = new NodeApi_1.NodeApi(mokka); this.runBeat = false; } async stopBeat() { this.runBeat = false; if (this.adjustmentDate) await new Promise((res) => setTimeout(res, Date.now() - this.adjustmentDate, null)); } async watchBeat() { this.runBeat = true; while (this.runBeat) { if (this.adjustmentDate > Date.now()) { await new Promise((res) => setTimeout(res, this.adjustmentDate - Date.now(), null)); continue; } if (this.mokka.state === NodeStates_1.default.FOLLOWER || // tslint:disable-next-line:max-line-length (this.mokka.state === NodeStates_1.default.LEADER && this.mokka.getProofMintedTime() + this.mokka.proofExpiration < Date.now())) { this.mokka.emit(EventTypes_1.default.HEARTBEAT_TIMEOUT); this.mokka.setState(NodeStates_1.default.FOLLOWER, this.mokka.term, null, null); await this.nodeApi.promote(); if (this.mokka.state === NodeStates_2.default.FOLLOWER) { this.setNextBeat(Math.round(this.mokka.electionTimeout * (1 + 2 * Math.random()))); continue; } } this.mokka.logger.trace(`sending ack signal to peers`); await Promise.all([...this.mokka.nodes.values()].map((node) => { const packet = this.messageApi.packet(MessageTypes_1.default.ACK); return this.messageApi.message(packet, node.publicKey); })); this.mokka.logger.trace(`sent ack signal to peers`); this.adjustmentDate = Date.now() + this.mokka.heartbeat; } } setNextBeat(duration) { this.mokka.logger.trace(`set next beat in ${duration}`); this.adjustmentDate = Date.now() + duration; } timeout() { return this.safeHeartbeat() + Math.round(this.mokka.heartbeat * Math.random()); } safeHeartbeat() { return this.mokka.heartbeat * 1.5; } } exports.HeartbeatController = HeartbeatController; //# sourceMappingURL=HeartbeatController.js.map