@luminati-io/webdriverio8
Version:
Next-gen browser and mobile automation test framework for Node.js
111 lines • 7.7 kB
JavaScript
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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