57 lines
1.8 KiB
JavaScript
57 lines
1.8 KiB
JavaScript
"use strict";
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
const DEFAULT_CHECK_INTERVAL = 300;
|
|
class CheckBrokenConnections {
|
|
constructor({ realm, config, checkInterval = DEFAULT_CHECK_INTERVAL, onClose }) {
|
|
this.realm = realm;
|
|
this.config = config;
|
|
this.onClose = onClose;
|
|
this.checkInterval = checkInterval;
|
|
}
|
|
start() {
|
|
if (this.timeoutId) {
|
|
clearTimeout(this.timeoutId);
|
|
}
|
|
this.timeoutId = setTimeout(() => {
|
|
this.checkConnections();
|
|
this.timeoutId = null;
|
|
this.start();
|
|
}, this.checkInterval);
|
|
}
|
|
stop() {
|
|
if (this.timeoutId) {
|
|
clearTimeout(this.timeoutId);
|
|
this.timeoutId = null;
|
|
}
|
|
}
|
|
checkConnections() {
|
|
const clientsIds = this.realm.getClientsIds();
|
|
const now = new Date().getTime();
|
|
const { alive_timeout: aliveTimeout } = this.config;
|
|
for (const clientId of clientsIds) {
|
|
const client = this.realm.getClientById(clientId);
|
|
const timeSinceLastPing = now - client.getLastPing();
|
|
if (timeSinceLastPing < aliveTimeout) {
|
|
continue;
|
|
}
|
|
try {
|
|
if (client.getSocket()) {
|
|
client.getSocket().close();
|
|
}
|
|
}
|
|
catch (e) {
|
|
// @ts-nocheck
|
|
}
|
|
finally {
|
|
this.realm.clearMessageQueue(clientId);
|
|
this.realm.removeClientById(clientId);
|
|
client.setSocket(null);
|
|
if (this.onClose) {
|
|
this.onClose(client);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
exports.CheckBrokenConnections = CheckBrokenConnections;
|