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()
*/