helene
Version:
Real-time Web Apps for Node.js
83 lines • 2.98 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.IdleTimeout = void 0;
const utils_1 = require("../utils");
const defer_1 = __importDefault(require("lodash/defer"));
const isNumber_1 = __importDefault(require("lodash/isNumber"));
const throttle_1 = __importDefault(require("lodash/throttle"));
class IdleTimeout {
client;
timeout = null;
idleTimeout = null;
constructor(client) {
this.client = client;
this.timeout = this.client.options.idlenessTimeout;
this.setup();
}
start() {
if ((0, isNumber_1.default)(this.timeout) &&
(utils_1.Environment.isBrowser || utils_1.Environment.isTest)) {
this.idleTimeout = setTimeout(() => {
this.client.close();
console.log('Helene: Disconnected due to inactivity');
}, this.timeout);
}
}
setup() {
this.client.on(utils_1.ClientEvents.CLOSE, () => {
clearTimeout(this.idleTimeout);
});
(0, defer_1.default)(() => {
this.start();
});
if (typeof window === 'undefined')
return;
const reset = (0, isNumber_1.default)(this.timeout)
? (0, throttle_1.default)(this.reset.bind(this), this.timeout / 2, {
leading: true,
trailing: true,
})
: null;
if (reset) {
// https://github.com/socketio/socket.io/issues/2924#issuecomment-297985409
window.addEventListener('focus', reset);
window.addEventListener('mousemove', reset);
window.addEventListener('mousedown', reset);
window.addEventListener('keydown', reset);
window.addEventListener('scroll', reset);
window.addEventListener('touchstart', reset);
window.addEventListener('pageshow', reset);
window.addEventListener('pagehide', reset);
}
document.addEventListener('visibilitychange', () => {
if (document.visibilityState === 'visible') {
this.reset();
}
else {
if (this.client.options?.ws?.disconnectOnPageHide) {
this.client.close();
console.log('Helene: Disconnected on page hide');
}
}
});
}
stop() {
if (this.idleTimeout) {
clearTimeout(this.idleTimeout);
}
}
async reset() {
this.stop();
this.start();
if (this.client.clientSocket.socket?.active) {
return;
}
this.client.clientSocket.connect();
await this.client.waitFor(utils_1.ClientEvents.WEBSOCKET_CONNECTED, 10000);
}
}
exports.IdleTimeout = IdleTimeout;
//# sourceMappingURL=idle-timeout.js.map