UNPKG

@codefresh-io/cf-git-providers

Version:

An NPM module/CLI for interacting with various git providers

65 lines 2.98 kB
"use strict"; 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