UNPKG

incheon

Version:

A Node.js based real-time game server

62 lines (49 loc) 1.87 kB
"use strict"; const EventEmitter = require('eventemitter3'); /** * Measures network performance between the client and the server * Represents both the client and server portions of NetworkMonitor */ class NetworkMonitor { constructor() { // mixin for EventEmitter Object.assign(this, EventEmitter.prototype); } // client registerClient(clientEngine) { this.queryIdCounter = 0; this.RTTQueries = {}; this.movingRTTAverage = 0; this.movingRTTAverageFrame = []; this.movingFPSAverageSize = clientEngine.options.healthCheckRTTSample; this.clientEngine = clientEngine; clientEngine.socket.on("RTTResponse", this.onReceivedRTTQuery.bind(this)); setInterval(this.sendRTTQuery.bind(this), clientEngine.options.healthCheckInterval); } sendRTTQuery() { // todo implement cleanup of older timestamp this.RTTQueries[this.queryIdCounter] = new Date().getTime(); this.clientEngine.socket.emit('RTTQuery', this.queryIdCounter); this.queryIdCounter++; } onReceivedRTTQuery(queryId) { let RTT = (new Date().getTime()) - this.RTTQueries[queryId]; this.movingRTTAverageFrame.push(RTT); if (this.movingRTTAverageFrame.length > this.movingFPSAverageSize) { this.movingRTTAverageFrame.shift(); } this.movingRTTAverage = this.movingRTTAverageFrame.reduce((a,b) => a + b) / this.movingRTTAverageFrame.length; this.emit('RTTUpdate',{ RTT: RTT, RTTAverage: this.movingRTTAverage }) } // server registerPlayerOnServer(socket) { socket.on('RTTQuery', this.respondToRTTQuery.bind(this, socket)); } respondToRTTQuery(socket, queryId) { socket.emit("RTTResponse", queryId); } } module.exports = NetworkMonitor;