@embrace-io/web-sdk
Version:
45 lines (44 loc) • 1.61 kB
JavaScript
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