'use strict'; const logger = require('../logger'); const { EventEmitter } = require('events'); const TEN_SECONDS = 10 * 1000; class ClientMetricsStore extends EventEmitter { constructor (metricsDb, pollInterval = TEN_SECONDS) { super(); this.metricsDb = metricsDb; this.highestIdSeen = 0; this.timer; //Build internal state metricsDb.getMetricsLastHour() .then((metrics) => this._emitMetrics(metrics)) .then(() => this._startPoller(pollInterval)) .then(() => this.emit('ready')) .catch((err) => logger.error(err)); } _startPoller (pollInterval) { this.timer = setInterval(() => this._fetchNewAndEmit(), pollInterval); this.timer.unref(); } _fetchNewAndEmit() { this.metricsDb.getNewMetrics(this.highestIdSeen) .then((metrics) => this._emitMetrics(metrics)) } _emitMetrics (metrics) { if (metrics && metrics.length > 0) { this.highestIdSeen = metrics[metrics.length - 1].id; metrics.forEach(m => this.emit('metrics', m.metrics)); } } // Insert new client metrics insert (metrics) { return this.metricsDb.insert(metrics) } destroy () { try { clearInterval(this.timer); } catch (e) {} } }; module.exports = ClientMetricsStore;