const { EventEmitter } = require('events'); /** * A simple object for tracking elapsed time * * @extends {EventEmitter} */ class Stopwatch extends EventEmitter { /** * Creates a started Stopwatch * @param {StopwatchProperties} [options] See {@link StopwatchProperties} */ constructor(options) { super(); options = options || {}; EventEmitter.call(this); if (options.getTime) { this._getTime = options.getTime; } this._start = this._getTime(); this._ended = false; } /** * Called to mark the end of the timer task * @return {number} the total execution time */ end() { if (this._ended) { return null; } this._ended = true; const elapsed = this._getTime() - this._start; this.emit('end', elapsed); return elapsed; } _getTime() { if (!process.hrtime) { return Date.now(); } const hrtime = process.hrtime(); return hrtime[0] * 1000 + hrtime[1] / (1000 * 1000); } } module.exports = Stopwatch; /** * @interface StopwatchProperties * @typedef StopwatchProperties * @type {Object} * @property {function} getTime optional function override for supplying time., defaults to new Date() / process.hrt() */