infobip-rtc
Version:
Infobip RTC JavaScript SDK - Infobip WebRTC API Implementation
58 lines • 2.27 kB
JavaScript
export var RetryFailReason;
(function (RetryFailReason) {
RetryFailReason[RetryFailReason["MaxRetries"] = 0] = "MaxRetries";
})(RetryFailReason || (RetryFailReason = {}));
export default class Retry {
static linearDelay(baseDelayMs, baseIncrementMs) {
baseIncrementMs = baseIncrementMs || baseDelayMs;
return iteration => baseDelayMs + iteration * baseIncrementMs;
}
static fibonacciDelay(baseDelayMs) {
const phi = (1 + Math.pow(5, .5)) / 2, psi = 1 - phi;
const fib = (n) => Math.round((Math.pow(phi, n) - Math.pow(psi, n)) / (Math.pow(5, .5)));
return iteration => baseDelayMs * fib(iteration + 1);
}
static exponentialDelay(baseDelayMs, factor = 2) {
return iteration => Math.pow(factor, iteration) * baseDelayMs;
}
constructor(callable, delayFunction, maxDelayMs = 5000, maxRetries = 5, timeoutFunction = window.setTimeout.bind(window), cancelTimeoutFunction = (ref) => window.clearTimeout(ref)) {
this.callable = callable;
this.delayFunction = delayFunction;
this.maxDelayMs = maxDelayMs;
this.maxRetries = maxRetries;
this.timeoutFunction = timeoutFunction;
this.cancelTimeoutFunction = cancelTimeoutFunction;
this.awaitingTimeout = false;
this.timeoutRef = null;
this.iteration = 0;
}
cancel() {
if (this.awaitingTimeout) {
this.cancelTimeoutFunction(this.timeoutRef);
return true;
}
return false;
}
retry() {
var _a;
if (this.awaitingTimeout)
return this;
if (this.iteration >= this.maxRetries) {
(_a = this.reject) === null || _a === void 0 ? void 0 : _a.call(this, RetryFailReason.MaxRetries);
return this;
}
let timeoutMs = Math.min(this.maxDelayMs, this.delayFunction(this.iteration));
this.awaitingTimeout = true;
this.timeoutRef = this.timeoutFunction(() => {
this.awaitingTimeout = false;
this.timeoutRef = null;
this.callable(this.iteration++);
}, timeoutMs);
return this;
}
catch(reject) {
this.reject = reject;
return this;
}
}
//# sourceMappingURL=Retry.js.map