UNPKG

@luminati-io/webdriverio8

Version:

Next-gen browser and mobile automation test framework for Node.js

111 lines 7.7 kB
const TIMEOUT_ERROR = 'timeout'; const NOOP = () => { }; /** * Promise-based Timer. Execute fn every tick. * When fn is resolved — timer will stop * @param {number} delay - delay between ticks * @param {number} timeout - after that time timer will stop * @param {Function} fn - function that returns promise. will execute every tick * @param {boolean} leading - should be function invoked on start * @return {promise} Promise-based Timer. */ class Timer { _delay; _timeout; _fn; _leading; _conditionExecutedCnt = 0; _resolve = NOOP; _reject = NOOP; _startTime; _ticks = 0; _timeoutId; _mainTimeoutId; _lastError; constructor(_delay, _timeout, _fn, _leading = false) { this._delay = _delay; this._timeout = _timeout; this._fn = _fn; this._leading = _leading; const retPromise = new Promise((resolve, reject) => { this._resolve = resolve; this._reject = reject; }); this._start(); return retPromise; } _start() { this._startTime = Date.now(); if (this._leading) { this._tick(); } else { this._timeoutId = setTimeout(this._tick.bind(this), this._delay); } this._mainTimeoutId = setTimeout(() => { /** * make sure that condition was executed at least once */ if (!this._wasConditionExecuted()) { return; } const reason = this._lastError || new Error(TIMEOUT_ERROR); this._reject(reason); this._stop(); }, this._timeout); } _stop() { if (this._timeoutId) { clearTimeout(this._timeoutId); } delete this._timeoutId; } _stopMain() { if (this._mainTimeoutId) { clearTimeout(this._mainTimeoutId); } } _tick() { const result = this._fn(); if (typeof result.then !== 'function') { if (!result) { return this._checkCondition(new Error(TIMEOUT_ERROR)); } return this._checkCondition(undefined, result); } result.then((res) => this._checkCondition(undefined, res), (err) => this._checkCondition(err)); } _checkCondition(err, res) { ++this._conditionExecutedCnt; this._lastError = err; // resolve timer only on truthy values if (res) { this._resolve(res); this._stop(); this._stopMain(); return; } // autocorrect timer const diff = (Date.now() - (this._startTime || 0)) - (this._ticks++ * this._delay); const delay = Math.max(0, this._delay - diff); // clear old timeoutID this._stop(); // check if we have time to one more tick if (this._hasTime(delay)) { this._timeoutId = setTimeout(this._tick.bind(this), delay); } else { this._stopMain(); const reason = this._lastError || new Error(TIMEOUT_ERROR); this._reject(reason); } } _hasTime(delay) { return (Date.now() - (this._startTime || 0) + delay) <= this._timeout; } _wasConditionExecuted() { return this._conditionExecutedCnt > 0; } } export default Timer; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVGltZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvVGltZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxhQUFhLEdBQUcsU0FBUyxDQUFBO0FBQy9CLE1BQU0sSUFBSSxHQUFHLEdBQUcsRUFBRSxHQUFFLENBQUMsQ0FBQTtBQUVyQjs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sS0FBSztJQVlLO0lBQ0E7SUFDQTtJQUNBO0lBZEoscUJBQXFCLEdBQUcsQ0FBQyxDQUFBO0lBQ3pCLFFBQVEsR0FBYSxJQUFJLENBQUE7SUFDekIsT0FBTyxHQUFhLElBQUksQ0FBQTtJQUV4QixVQUFVLENBQVM7SUFDbkIsTUFBTSxHQUFHLENBQUMsQ0FBQTtJQUNWLFVBQVUsQ0FBaUI7SUFDM0IsY0FBYyxDQUFpQjtJQUMvQixVQUFVLENBQVE7SUFFMUIsWUFDWSxNQUFjLEVBQ2QsUUFBZ0IsRUFDaEIsR0FBYSxFQUNiLFdBQVcsS0FBSztRQUhoQixXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQ2QsYUFBUSxHQUFSLFFBQVEsQ0FBUTtRQUNoQixRQUFHLEdBQUgsR0FBRyxDQUFVO1FBQ2IsYUFBUSxHQUFSLFFBQVEsQ0FBUTtRQUV4QixNQUFNLFVBQVUsR0FBRyxJQUFJLE9BQU8sQ0FBVSxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtZQUN4RCxJQUFJLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQTtZQUN2QixJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQTtRQUN6QixDQUFDLENBQUMsQ0FBQTtRQUVGLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQTtRQUViLE9BQU8sVUFBaUIsQ0FBQTtJQUM1QixDQUFDO0lBRU8sTUFBTTtRQUNWLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFBO1FBQzVCLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2hCLElBQUksQ0FBQyxLQUFL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