@fullstory/server-api-client
Version:
The official FullStory server API client SDK for NodeJS.
61 lines • 2.63 kB
JavaScript
;
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.withRetry = exports.withDelay = void 0;
const errors_1 = require("../errors");
const maxRetry_1 = require("../errors/maxRetry");
/*
* withDelay wraps func to be invoked with a delay.
* Resolves if func resolves.
* If func rejects with retry-able error, resolves with the error and retryIn milliseconds.
*/
function withDelay(func, delay = 0) {
return __awaiter(this, void 0, void 0, function* () {
return new Promise((res, rej) => {
setTimeout(() => {
func()
.then(res)
.catch(rej);
}, delay);
});
});
}
exports.withDelay = withDelay;
function withRetry(func, onError, limit = 3, initialDelay = 0) {
return __awaiter(this, void 0, void 0, function* () {
let tries = 0;
let delay = initialDelay;
while (limit > tries) {
tries++;
try {
return yield withDelay(func, delay);
}
catch (err) {
onError(err);
if (!(0, errors_1.isFSError)(err) || !err.canRetry()) {
throw err;
}
/*
* TODO(sabrina):
* Minimal effort to reasonably retry with exponential back-off and
* at least wait for retry after. This could be an issue if there are
* multiple jobs/nodes running all at once. Consider allowing custom
* delay calculation using something more reasonable like distributed cache.
* Should eventually allow custom retry strategies
*/
delay = err.getRetryAfter() + delay * 2;
}
}
throw new maxRetry_1.FSMaxRetryError(`max number of retry ${limit} reached`);
});
}
exports.withRetry = withRetry;
//# sourceMappingURL=retry.js.map