mokka
Version:
Mokka Consensus Algorithm implementation in Javascript
64 lines • 3.04 kB
JavaScript
"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