"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const get_timer_1 = __importDefault(require("./get-timer"));
class KeepaliveManager {
get keepaliveTimeoutTimestamp() {
return this._keepaliveTimeoutTimestamp;
}
get intervalEvery() {
return this._intervalEvery;
}
get keepalive() {
return this._keepalive;
}
constructor(client, variant) {
this.destroyed = false;
this.client = client;
this.timer =
typeof variant === 'object' &&
'set' in variant &&
'clear' in variant
? variant
: (0, get_timer_1.default)(variant);
this.setKeepalive(client.options.keepalive);
}
clear() {
if (this.timerId) {
this.timer.clear(this.timerId);
this.timerId = null;
}
}
setKeepalive(value) {
value *= 1000;
if (isNaN(value) ||
value <= 0 ||
value > 2147483647) {
throw new Error(`Keepalive value must be an integer between 0 and 2147483647. Provided value is ${value}`);
}
this._keepalive = value;
this.reschedule();
this.client['log'](`KeepaliveManager: set keepalive to ${value}ms`);
}
destroy() {
this.clear();
this.destroyed = true;
}
reschedule() {
if (this.destroyed) {
return;
}
this.clear();
this.counter = 0;
const keepAliveTimeout = Math.ceil(this._keepalive * 1.5);
this._keepaliveTimeoutTimestamp = Date.now() + keepAliveTimeout;
this._intervalEvery = Math.ceil(this._keepalive / 2);
this.timerId = this.timer.set(() => {
if (this.destroyed) {
return;
}
this.counter += 1;
if (this.counter === 2) {
this.client.sendPing();
}
else if (this.counter > 2) {
this.client.onKeepaliveTimeout();
}
}, this._intervalEvery);
}
}
exports.default = KeepaliveManager;
//# sourceMappingURL=KeepaliveManager.js.map