const { sleep } = require('../libs/util.js'); const EventEmitter = require('events'); const Message = require('./Message.js'); class Heartbeat extends EventEmitter { constructor() { super(); this.interval = config?.server?.heartbeat || 10000; this.#listenForPingPong(); this.#sendPing(); } async #sendPing() { if (this.destroyed === true) { return; } if (this.alive === false) { this.emit('timeout'); } if (this.alive === undefined) { await sleep(this.interval); } this.alive = false; await new Message('ping').send(); await sleep(this.interval); this.#sendPing(); } async #listenForPingPong() { eventparser.on('ping', () => { logger.debug('handling event \'ping\', responding with \'pong\'...'); new Message('pong').send(); }); eventparser.on('pong', () => { logger.debug('handling event \'pong\'...'); this.alive = true; }); } destroy() { this.destroyed = true; eventparser.removeAllListeners('ping'); eventparser.removeAllListeners('pong'); } } module.exports = Heartbeat;