const config = require("../config.json"); const GRAPH_UPDATE_TIME_GAP = 60 * 1000; // 60 seconds class TimeTracker { constructor(app) { this._app = app; this._serverGraphPoints = []; this._graphPoints = []; } newPointTimestamp() { const timestamp = TimeTracker.getEpochMillis(); TimeTracker.pushAndShift( this._serverGraphPoints, timestamp, TimeTracker.getMaxServerGraphDataLength() ); // Flag each group as history graph additions each minute // This is sent to the frontend for graph updates const updateHistoryGraph = config.logToDatabase && (!this._lastHistoryGraphUpdate || timestamp - this._lastHistoryGraphUpdate >= GRAPH_UPDATE_TIME_GAP); if (updateHistoryGraph) { this._lastHistoryGraphUpdate = timestamp; // Push into timestamps array to update backend state TimeTracker.pushAndShift( this._graphPoints, timestamp, TimeTracker.getMaxGraphDataLength() ); } return { timestamp, updateHistoryGraph, }; } loadGraphPoints(startTime, timestamps) { // This is a copy of ServerRegistration#loadGraphPoints // timestamps contains original timestamp data and needs to be filtered into minutes this._graphPoints = TimeTracker.everyN( timestamps, startTime, GRAPH_UPDATE_TIME_GAP, (i) => timestamps[i] ); } getGraphPointAt(i) { return TimeTracker.toSeconds(this._graphPoints[i]); } getServerGraphPoints() { return this._serverGraphPoints.map(TimeTracker.toSeconds); } getGraphPoints() { return this._graphPoints.map(TimeTracker.toSeconds); } static toSeconds = (timestamp) => { return Math.floor(timestamp / 1000); }; static getEpochMillis() { return new Date().getTime(); } static getMaxServerGraphDataLength() { return Math.ceil(config.serverGraphDuration / config.rates.pingAll); } static getMaxGraphDataLength() { return Math.ceil(config.graphDuration / GRAPH_UPDATE_TIME_GAP); } static everyN(array, start, diff, adapter) { const selected = []; let lastPoint = start; for (let i = 0; i < array.length; i++) { const point = array[i]; if (point - lastPoint >= diff) { lastPoint = point; selected.push(adapter(i)); } } return selected; } static pushAndShift(array, value, maxLength) { array.push(value); if (array.length > maxLength) { array.splice(0, array.length - maxLength); } } } module.exports = { GRAPH_UPDATE_TIME_GAP, TimeTracker, };