UNPKG

node-ws-packets

Version:

A packet-based javascript websocket communitcation.

81 lines (72 loc) 2.4 kB
/** * Imports */ const CKeepAlivePacket = require("./CKeepAlivePacket.js"); const SKeepAlivePacket = require("./SKeepAlivePacket.js"); /** * Create Manager * @param {object} packetManager server or client packet manager */ class IKeepAliveManager { __keepAliveTimeout; __keepAliveInterval; constructor(packetManager, isClient = false, { keepAliveTimeout = 60, keepAliveInterval = 30 } = {}) { // Set Vars this.__keepAliveTimeout = keepAliveTimeout; this.__keepAliveInterval = keepAliveInterval; /* Check If Client */ if(isClient) { packetManager.addPacket(new CKeepAlivePacket()); return; } /** Do Server Stuff */ packetManager.addPacket(new SKeepAlivePacket()); } /** * Send Keep Alive Packet on Server * @param {object} wsClient WebSocket Client Object on Server */ onConnect(wsClient) { // Add this manager to client wsClient.__keepAliveManager = this; wsClient.__keepAliveHandler = () => { this.receivePing(wsClient); }; // Start Timer this.sendPing(wsClient); } /** * Stop Sending Keep Alive Packets * @param {object} wsClient WebSocket Client Object on Server */ onDisconnect(wsClient) { // Stop Timer clearTimeout(wsClient.__keepAliveTimeout); } /** * Send a Ping Packet to a specific client * @param {object} wsClient WebSocket Client Object on Server */ sendPing(wsClient) { // Send Packet and Start Timer wsClient.sendPacket(new SKeepAlivePacket({ timestamp: Date.now() })); // Start Timer wsClient.__keepAliveTimeout = setTimeout(() => { // If Timeout reached => Disconnect Client wsClient.terminate(); }, this.__keepAliveTimeout * 1000 /* Seconds */); } /** * After receiving a ping, wait the interval timer and send a new one * @param {object} wsClient WebSocket Client Object on Server */ receivePing(wsClient) { // Stop Timer clearTimeout(wsClient.__keepAliveTimeout); // Wait for interval and send new ping wsClient.__keepAliveTimeout = setTimeout(() => { this.sendPing(wsClient); }, this.__keepAliveInterval * 1000 /* Seconds */); } } module.exports = IKeepAliveManager;