UNPKG

@embrace-io/web-sdk

Version:
45 lines (44 loc) 1.61 kB
import { OTelPerformanceManager } from "../../utils/PerformanceManager/OTelPerformanceManager.js"; import { BACKOFF_MULTIPLIER, INITIAL_BACKOFF, MAX_BACKOFF } from "./constants.js"; //#region src/transport/RetryingTransport/RetryingTransport.ts /** * Get a pseudo-random jitter that falls in the range of [-JITTER, +JITTER] */ const getJitter = () => Math.random() * 40 - 20; var RetryingTransport = class { _transport; _perf; constructor(_transport, _perf = new OTelPerformanceManager()) { this._transport = _transport; this._perf = _perf; } async send(data, timeoutMillis) { const deadline = this._perf.getNowMillis() + timeoutMillis; let result = await this._transport.send(data, timeoutMillis); let attempts = 5; let nextBackoff = INITIAL_BACKOFF; while (result.status === "retryable" && attempts > 0) { attempts--; const backoff = Math.max(Math.min(nextBackoff, MAX_BACKOFF) + getJitter(), 0); nextBackoff = nextBackoff * BACKOFF_MULTIPLIER; const retryInMillis = result.retryInMillis ?? backoff; const remainingTimeoutMillis = deadline - this._perf.getNowMillis(); if (retryInMillis > remainingTimeoutMillis) return result; result = await this._retry(data, remainingTimeoutMillis, retryInMillis); } return result; } shutdown() { this._transport.shutdown(); } _retry(data, timeoutMillis, inMillis) { return new Promise((resolve, reject) => { setTimeout(() => { this._transport.send(data, timeoutMillis).then(resolve, reject); }, inMillis); }); } }; //#endregion export { RetryingTransport }; //# sourceMappingURL=RetryingTransport.js.map