timing.js 8.44 KB
"use strict";

var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = exports.Duration = exports.Timer = void 0;

require("source-map-support/register");

var _lodash = _interopRequireDefault(require("lodash"));

const NS_PER_S = 1e9;
const NS_PER_MS = 1e6;

class Duration {
  constructor(nanos) {
    this._nanos = nanos;
  }

  get nanos() {
    return this._nanos;
  }

  get asNanoSeconds() {
    return this.nanos;
  }

  get asMilliSeconds() {
    return this.nanos / NS_PER_MS;
  }

  get asSeconds() {
    return this.nanos / NS_PER_S;
  }

  toString() {
    return this.asMilliSeconds.toFixed(0);
  }

}

exports.Duration = Duration;

class Timer {
  constructor() {
    this._startTime = null;
  }

  get startTime() {
    return this._startTime;
  }

  start() {
    if (!_lodash.default.isNull(this.startTime)) {
      throw new Error('Timer has already been started.');
    }

    this._startTime = _lodash.default.isFunction(process.hrtime.bigint) ? process.hrtime.bigint() : process.hrtime();
    return this;
  }

  getDuration() {
    if (_lodash.default.isNull(this.startTime)) {
      throw new Error(`Unable to get duration. Timer was not started`);
    }

    let nanoDuration;

    if (_lodash.default.isArray(this.startTime)) {
      const [seconds, nanos] = process.hrtime(this.startTime);
      nanoDuration = seconds * NS_PER_S + nanos;
    } else if (typeof this.startTime === 'bigint' && _lodash.default.isFunction(process.hrtime.bigint)) {
      const endTime = process.hrtime.bigint();
      nanoDuration = Number(endTime - this.startTime);
    } else {
      throw new Error(`Unable to get duration. Start time '${this.startTime}' cannot be parsed`);
    }

    return new Duration(nanoDuration);
  }

  toString() {
    try {
      return this.getDuration().toString();
    } catch (err) {
      return `<err: ${err.message}>`;
    }
  }

}

exports.Timer = Timer;
var _default = Timer;
exports.default = _default;require('source-map-support').install();


//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi90aW1pbmcuanMiXSwibmFtZXMiOlsiTlNfUEVSX1MiLCJOU19QRVJfTVMiLCJEdXJhdGlvbiIsImNvbnN0cnVjdG9yIiwibmFub3MiLCJfbmFub3MiLCJhc05hbm9TZWNvbmRzIiwiYXNNaWxsaVNlY29uZHMiLCJhc1NlY29uZHMiLCJ0b1N0cmluZyIsInRvRml4ZWQiLCJUaW1lciIsIl9zdGFydFRpbWUiLCJzdGFydFRpbWUiLCJzdGFydCIsIl8iLCJpc051bGwiLCJFcnJvciIsImlzRnVuY3Rpb24iLCJwcm9jZXNzIiwiaHJ0aW1lIiwiYmlnaW50IiwiZ2V0RHVyYXRpb24iLCJuYW5vRHVyYXRpb24iLCJpc0FycmF5Iiwic2Vjb25kcyIsImVuZFRpbWUiLCJOdW1iZXIiLCJlcnIiLCJtZXNzYWdlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFBOztBQUdBLE1BQU1BLFFBQVEsR0FBRyxHQUFqQjtBQUNBLE1BQU1DLFNBQVMsR0FBRyxHQUFsQjs7QUFNQSxNQUFNQyxRQUFOLENBQWU7QUFDYkMsRUFBQUEsV0FBVyxDQUFFQyxLQUFGLEVBQVM7QUFDbEIsU0FBS0MsTUFBTCxHQUFjRCxLQUFkO0FBQ0Q7O0FBRUQsTUFBSUEsS0FBSixHQUFhO0FBQ1gsV0FBTyxLQUFLQyxNQUFaO0FBQ0Q7O0FBT0QsTUFBSUMsYUFBSixHQUFxQjtBQUNuQixXQUFPLEtBQUtGLEtBQVo7QUFDRDs7QUFPRCxNQUFJRyxjQUFKLEdBQXNCO0FBQ3BCLFdBQU8sS0FBS0gsS0FBTCxHQUFhSCxTQUFwQjtBQUNEOztBQU9ELE1BQUlPLFNBQUosR0FBaUI7QUFDZixXQUFPLEtBQUtKLEtBQUwsR0FBYUosUUFBcEI7QUFDRDs7QUFFRFMsRUFBQUEsUUFBUSxHQUFJO0FBRVYsV0FBTyxLQUFLRixjQUFMLENBQW9CRyxPQUFwQixDQUE0QixDQUE1QixDQUFQO0FBQ0Q7O0FBdkNZOzs7O0FBMENmLE1BQU1DLEtBQU4sQ0FBWTtBQUlWUixFQUFBQSxXQUFXLEdBQUk7QUFDYixTQUFLUyxVQUFMLEdBQWtCLElBQWxCO0FBQ0Q7O0FBRUQsTUFBSUMsU0FBSixHQUFpQjtBQUNmLFdBQU8sS0FBS0QsVUFBWjtBQUNEOztBQU9ERSxFQUFBQSxLQUFLLEdBQUk7QUFDUCxRQUFJLENBQUNDLGdCQUFFQyxNQUFGLENBQVMsS0FBS0gsU0FBZCxDQUFMLEVBQStCO0FBQzdCLFlBQU0sSUFBSUksS0FBSixDQUFVLGlDQUFWLENBQU47QUFDRDs7QUFFRCxTQUFLTCxVQUFMLEdBQWtCRyxnQkFBRUcsVUFBRixDQUFhQyxPQUFPLENBQUNDLE1BQVIsQ0FBZUMsTUFBNUIsSUFDZEYsT0FBTyxDQUFDQyxNQUFSLENBQWVDLE1BQWYsRUFEYyxHQUVkRixPQUFPLENBQUNDLE1BQVIsRUFGSjtBQUdBLFdBQU8sSUFBUDtBQUNEOztBQU9ERSxFQUFBQSxXQUFXLEdBQUk7QUFDYixRQUFJUCxnQkFBRUMsTUFBRixDQUFTLEtBQUtILFNBQWQsQ0FBSixFQUE4QjtBQUM1QixZQUFNLElBQUlJLEtBQUosQ0FBVywrQ0FBWCxDQUFOO0FBQ0Q7O0FBRUQsUUFBSU0sWUFBSjs7QUFDQSxRQUFJUixnQkFBRVMsT0FBRixDQUFVLEtBQUtYLFNBQWYsQ0FBSixFQUErQjtBQUU3QixZQUFNLENBQUNZLE9BQUQsRUFBVXJCLEtBQVYsSUFBbUJlLE9BQU8sQ0FBQ0MsTUFBUixDQUFlLEtBQUtQLFNBQXBCLENBQXpCO0FBQ0FVLE1BQUFBLFlBQVksR0FBR0UsT0FBTyxHQUFHekIsUUFBVixHQUFxQkksS0FBcEM7QUFDRCxLQUpELE1BSU8sSUFBSSxPQUFPLEtBQUtTLFNBQVosS0FBMEIsUUFBMUIsSUFBc0NFLGdCQUFFRyxVQUFGLENBQWFDLE9BQU8sQ0FBQ0MsTUFBUixDQUFlQyxNQUE1QixDQUExQyxFQUErRTtBQUVwRixZQUFNSyxPQUFPLEdBQUdQLE9BQU8sQ0FBQ0MsTUFBUixDQUFlQyxNQUFmLEVBQWhCO0FBRUFFLE1BQUFBLFlBQVksR0FBR0ksTUFBTSxDQUFDRCxPQUFPLEdBQUcsS0FBS2IsU0FBaEIsQ0FBckI7QUFDRCxLQUxNLE1BS0E7QUFDTCxZQUFNLElBQUlJLEtBQUosQ0FBVyx1Q0FBc0MsS0FBS0osU0FBVSxvQkFBaEUsQ0FBTjtBQUNEOztBQUVELFdBQU8sSUFBSVgsUUFBSixDQUFhcUIsWUFBYixDQUFQO0FBQ0Q7O0FBRURkLEVBQUFBLFFBQVEsR0FBSTtBQUNWLFFBQUk7QUFDRixhQUFPLEtBQUthLFdBQUwsR0FBbUJiLFFBQW5CLEVBQVA7QUFDRCxLQUZELENBRUUsT0FBT21CLEdBQVAsRUFBWTtBQUNaLGFBQVEsU0FBUUEsR0FBRyxDQUFDQyxPQUFRLEdBQTVCO0FBQ0Q7QUFDRjs7QUE3RFM7OztlQWtFR2xCLEsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuXG5cbmNvbnN0IE5TX1BFUl9TID0gMWU5O1xuY29uc3QgTlNfUEVSX01TID0gMWU2O1xuXG5cbi8qKlxuICogQ2xhc3MgcmVwcmVzZW50aW5nIGEgZHVyYXRpb24sIGVuY2Fwc3VsYXRpbmcgdGhlIG51bWJlciBhbmQgdW5pdHMuXG4gKi9cbmNsYXNzIER1cmF0aW9uIHtcbiAgY29uc3RydWN0b3IgKG5hbm9zKSB7XG4gICAgdGhpcy5fbmFub3MgPSBuYW5vcztcbiAgfVxuXG4gIGdldCBuYW5vcyAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX25hbm9zO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgZHVyYXRpb24gYXMgbmFub3NlY29uZHNcbiAgICpcbiAgICogQHJldHVybnMge251bWJlcn0gVGhlIGR1cmF0aW9uIGFzIG5hbm9zZWNvbmRzXG4gICAqL1xuICBnZXQgYXNOYW5vU2Vjb25kcyAoKSB7XG4gICAgcmV0dXJuIHRoaXMubmFub3M7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBkdXJhdGlvbiBjb252ZXJ0ZWQgaW50byBtaWxsaXNlY29uZHNcbiAgICpcbiAgICogQHJldHVybnMge251bWJlcn0gVGhlIGR1cmF0aW9uIGFzIG1pbGxpc2Vjb25kc1xuICAgKi9cbiAgZ2V0IGFzTWlsbGlTZWNvbmRzICgpIHtcbiAgICByZXR1cm4gdGhpcy5uYW5vcyAvIE5TX1BFUl9NUztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGR1cmF0aW9uIGNvbnZlcnRlZCBpbnRvIHNlY29uZHNcbiAgICpcbiAgICogQHJldHVybnMge251bWJlcn0gVGhlIGR1cmF0aW9uIGZhcyBzZWNvbmRzXG4gICAqL1xuICBnZXQgYXNTZWNvbmRzICgpIHtcbiAgICByZXR1cm4gdGhpcy5uYW5vcyAvIE5TX1BFUl9TO1xuICB9XG5cbiAgdG9TdHJpbmcgKCkge1xuICAgIC8vIGRlZmF1bHQgdG8gbWlsbGlzZWNvbmRzLCByb3VuZGVkXG4gICAgcmV0dXJuIHRoaXMuYXNNaWxsaVNlY29uZHMudG9GaXhlZCgwKTtcbiAgfVxufVxuXG5jbGFzcyBUaW1lciB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgdGltZXJcbiAgICovXG4gIGNvbnN0cnVjdG9yICgpIHtcbiAgICB0aGlzLl9zdGFydFRpbWUgPSBudWxsO1xuICB9XG5cbiAgZ2V0IHN0YXJ0VGltZSAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YXJ0VGltZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGFydCB0aGUgdGltZXJcbiAgICpcbiAgICogQHJldHVybiB7VGltZXJ9IFRoZSBjdXJyZW50IGluc3RhbmNlLCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIHN0YXJ0ICgpIHtcbiAgICBpZiAoIV8uaXNOdWxsKHRoaXMuc3RhcnRUaW1lKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaW1lciBoYXMgYWxyZWFkeSBiZWVuIHN0YXJ0ZWQuJyk7XG4gICAgfVxuICAgIC8vIG9uY2UgTm9kZSAxMCBpcyBubyBsb25nZXIgc3VwcG9ydGVkLCB0aGlzIGNoZWNrIGNhbiBiZSByZW1vdmVkXG4gICAgdGhpcy5fc3RhcnRUaW1lID0gXy5pc0Z1bmN0aW9uKHByb2Nlc3MuaHJ0aW1lLmJpZ2ludClcbiAgICAgID8gcHJvY2Vzcy5ocnRpbWUuYmlnaW50KClcbiAgICAgIDogcHJvY2Vzcy5ocnRpbWUoKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGR1cmF0aW9uIHNpbmNlIHRoZSB0aW1lciB3YXMgc3RhcnRlZFxuICAgKlxuICAgKiBAcmV0dXJuIHtEdXJhdGlvbn0gdGhlIGR1cmF0aW9uXG4gICAqL1xuICBnZXREdXJhdGlvbiAoKSB7XG4gICAgaWYgKF8uaXNOdWxsKHRoaXMuc3RhcnRUaW1lKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gZ2V0IGR1cmF0aW9uLiBUaW1lciB3YXMgbm90IHN0YXJ0ZWRgKTtcbiAgICB9XG5cbiAgICBsZXQgbmFub0R1cmF0aW9uO1xuICAgIGlmIChfLmlzQXJyYXkodGhpcy5zdGFydFRpbWUpKSB7XG4gICAgICAvLyBzdGFydFRpbWUgd2FzIGNyZWF0ZWQgdXNpbmcgcHJvY2Vzcy5ocnRpbWUoKVxuICAgICAgY29uc3QgW3NlY29uZHMsIG5hbm9zXSA9IHByb2Nlc3MuaHJ0aW1lKHRoaXMuc3RhcnRUaW1lKTtcbiAgICAgIG5hbm9EdXJhdGlvbiA9IHNlY29uZHMgKiBOU19QRVJfUyArIG5hbm9zO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHRoaXMuc3RhcnRUaW1lID09PSAnYmlnaW50JyAmJiBfLmlzRnVuY3Rpb24ocHJvY2Vzcy5ocnRpbWUuYmlnaW50KSkge1xuICAgICAgLy8gc3RhcnRUaW1lIHdhcyBjcmVhdGVkIHVzaW5nIHByb2Nlc3MuaHJ0aW1lLmJpZ2ludCgpXG4gICAgICBjb25zdCBlbmRUaW1lID0gcHJvY2Vzcy5ocnRpbWUuYmlnaW50KCk7XG4gICAgICAvLyBnZXQgdGhlIGRpZmZlcmVuY2UsIGFuZCBjb252ZXJ0IHRvIG51bWJlclxuICAgICAgbmFub0R1cmF0aW9uID0gTnVtYmVyKGVuZFRpbWUgLSB0aGlzLnN0YXJ0VGltZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIGdldCBkdXJhdGlvbi4gU3RhcnQgdGltZSAnJHt0aGlzLnN0YXJ0VGltZX0nIGNhbm5vdCBiZSBwYXJzZWRgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IER1cmF0aW9uKG5hbm9EdXJhdGlvbik7XG4gIH1cblxuICB0b1N0cmluZyAoKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB0aGlzLmdldER1cmF0aW9uKCkudG9TdHJpbmcoKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHJldHVybiBgPGVycjogJHtlcnIubWVzc2FnZX0+YDtcbiAgICB9XG4gIH1cbn1cblxuXG5leHBvcnQgeyBUaW1lciwgRHVyYXRpb24gfTtcbmV4cG9ydCBkZWZhdWx0IFRpbWVyO1xuIl0sImZpbGUiOiJsaWIvdGltaW5nLmpzIiwic291cmNlUm9vdCI6Ii4uLy4uIn0=