UNPKG

vulpes

Version:
153 lines (127 loc) 5.25 kB
"use strict"; var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var ms = require("ms"); /** * @typedef {Object} TrackerJobStats * @property {Number} totalJobs - Total number of jobs * @property {Number} stoppedJobs - Total number of currently stopped jobs * @property {Number} runningJobs - Total number of currently running jobs * @property {Number} pendingJobs - Total number of currently pending jobs * @property {Number} succeededJobs - Total succeeded jobs * @property {Number} failedJobs - Total failed jobs * @property {Number} jobsInLastHour - Total number of jobs completed successfully in the last hour */ var STATS = { totalJobs: 0, stoppedJobs: 0, runningJobs: 0, pendingJobs: 0, succeededJobs: 0, failedJobs: 0, jobsInLastHour: 0 }; /** * @typedef {Object} RegisteredWorker * @property {String} id The worker ID * @property {Number} updated The last updated timestamp * @property {Number} count The number of times the worker has updated */ var Tracker = function () { function Tracker(service) { _classCallCheck(this, Tracker); this._service = service; this._workers = []; this._stats = this.statsTemplate; this.liveWorkerTolerance = ms("60s"); } /** * The current live workers * @type {RegisteredWorker} * @readonly * @memberof Tracker */ _createClass(Tracker, [{ key: "fetchStats", /** * Fetch job stats * @returns {Promise.<TrackerJobStats>} * @memberof Tracker */ value: function () { var _ref = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() { return regeneratorRuntime.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: _context.next = 2; return this._service.queryJobs({}); case 2: return _context.abrupt("return", Object.assign(this.statsTemplate, this._stats)); case 3: case "end": return _context.stop(); } } }, _callee, this); })); function fetchStats() { return _ref.apply(this, arguments); } return fetchStats; }() /** * Register a worker * @param {String} workerID The ID of the worker * @memberof Tracker */ }, { key: "registerWorker", value: function registerWorker(workerID) { var worker = this._workers.find(function (worker) { return worker.id === workerID; }); if (worker) { worker.updated = Date.now(); worker.count += 1; return; } this._workers.push({ id: workerID, updated: Date.now(), count: 1 }); } /** * Update job stats * @param {TrackerJobStats} newStats * @memberof Tracker */ }, { key: "updateStats", value: function updateStats(newStats) { this._stats = Object.assign(this.statsTemplate, newStats); } }, { key: "liveWorkers", get: function get() { var validUpdatedTime = Date.now() - this.liveWorkerTolerance; return this._workers.filter(function (worker) { return worker.updated >= validUpdatedTime; }); } /** * Get a new stats template (zeroed) * @returns {TrackerJobStats} * @memberof Tracker */ }, { key: "statsTemplate", get: function get() { return Object.assign({}, STATS); } }]); return Tracker; }(); module.exports = Tracker;