@codefresh-io/cf-git-providers
Version:
An NPM module/CLI for interacting with various git providers
65 lines • 2.98 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.RpRetry = void 0;
const lodash_1 = __importDefault(require("lodash"));
const request_promise_1 = __importDefault(require("request-promise"));
const DEFAULT_RETRY_CONFIG = [502, 503, 504].map(sc => {
return {
statusCode: sc,
delayInMs: 300,
backoffFactor: 2,
retryCount: 20,
maxDelayMS: 10000
};
});
class RpRetry {
static async rpRetry(options, logger, doRefreshToken) {
const retryConfigMap = (options.retryConfig?.length > 0) ? options.retryConfig : DEFAULT_RETRY_CONFIG;
const retryConfigForRequest = lodash_1.default.cloneDeep(retryConfigMap);
return await RpRetry.fetchDataWithRetry(options, retryConfigForRequest, logger, doRefreshToken);
}
static async fetchDataWithRetry(options, retryConfigMap, logger, doRefreshToken) {
try {
const result = await (0, request_promise_1.default)(options)
.then((res) => {
if (res.statusCode === 401 && doRefreshToken) {
return doRefreshToken(options, res);
}
return res;
});
const retryConf = retryConfigMap.find(x => x.statusCode === result.statusCode && x.retryCount > 0);
if (retryConf) {
return await RpRetry.doRetry(options, retryConfigMap, result.statusCode, logger);
}
logger.info(`Result obtained for ${options.method} request to ${options.uri}`);
return result;
}
catch (error) {
const retryConf = retryConfigMap.find(x => x.statusCode === error.statusCode && x.retryCount > 0);
if (retryConf) {
return await RpRetry.doRetry(options, retryConfigMap, error.statusCode, logger, error);
}
logger.info(`Encountered error ${error.message} for ${options.method} request to ${options.uri}`);
throw error;
}
}
static doRetry(options, retryConfig, statusCode, logger, error) {
const conf = retryConfig.find(x => x.statusCode === statusCode);
if (conf) {
conf.retryCount--;
return new Promise((resolve) => {
setTimeout(() => {
logger.debug(`retrying statusCode:${conf.statusCode}. Waiting for ${conf.delayInMs} ms before next retry for ${options.uri}. Next wait ${Math.max(conf.delayInMs, conf.maxDelayMS)}`);
conf.delayInMs *= conf.backoffFactor;
resolve(RpRetry.fetchDataWithRetry(options, retryConfig, logger));
}, Math.min(conf.delayInMs, conf.maxDelayMS));
});
}
return Promise.reject(error);
}
}
exports.RpRetry = RpRetry;
//# sourceMappingURL=request-retry.js.map