molstar
Version:
A comprehensive macromolecular library.
44 lines (43 loc) • 2.02 kB
JavaScript
/**
* Copyright (c) 2018 mol* contributors, licensed under MIT, See LICENSE file for more info.
*
* @author David Sehnal <david.sehnal@gmail.com>
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.fetchRetry = void 0;
var tslib_1 = require("tslib");
var node_fetch_1 = tslib_1.__importDefault(require("node-fetch"));
var retry_if_1 = require("../../../mol-util/retry-if");
var RETRIABLE_NETWORK_ERRORS = [
'ECONNRESET', 'ENOTFOUND', 'ESOCKETTIMEDOUT', 'ETIMEDOUT',
'ECONNREFUSED', 'EHOSTUNREACH', 'EPIPE', 'EAI_AGAIN'
];
function isRetriableNetworkError(error) {
return error && RETRIABLE_NETWORK_ERRORS.includes(error.code);
}
function fetchRetry(url, timeout, retryCount, onRetry) {
return tslib_1.__awaiter(this, void 0, void 0, function () {
var controller, id, signal, result;
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0:
controller = new AbortController();
id = setTimeout(function () { return controller.abort(); }, timeout);
signal = controller.signal;
return [4 /*yield*/, (0, retry_if_1.retryIf)(function () { return (0, node_fetch_1.default)(url, { signal: signal }); }, {
retryThenIf: function (r) { return r.status === 408 /** timeout */ || r.status === 429 /** too many requests */ || (r.status >= 500 && r.status < 600); },
// TODO test retryCatchIf
retryCatchIf: function (e) { return isRetriableNetworkError(e); },
onRetry: onRetry,
retryCount: retryCount
})];
case 1:
result = _a.sent();
clearTimeout(id);
return [2 /*return*/, result];
}
});
});
}
exports.fetchRetry = fetchRetry;
;