mirror of
https://github.com/renovatebot/renovate.git
synced 2025-01-12 06:56:24 +00:00
56 lines
1.5 KiB
JavaScript
56 lines
1.5 KiB
JavaScript
const logger = require('../logger');
|
|
const ghGot = require('gh-got');
|
|
|
|
// istanbul ignore next
|
|
function sleep(ms) {
|
|
// eslint-disable-next-line promise/avoid-new
|
|
return new Promise(resolve => setTimeout(resolve, ms));
|
|
}
|
|
|
|
async function ghGotRetry(path, opts, retries = 5) {
|
|
try {
|
|
const res = await ghGot(path, opts);
|
|
return res;
|
|
} catch (err) {
|
|
if (err.statusCode >= 500 && err.statusCode < 600 && retries > 0) {
|
|
logger.debug(`Retrying statusCode ${err.statusCode}`);
|
|
// istanbul ignore if
|
|
if (process.env.NODE_ENV !== 'test') {
|
|
await sleep(5000 / retries);
|
|
}
|
|
return ghGotRetry(path, opts, retries - 1);
|
|
}
|
|
if (
|
|
err.statusCode === 403 &&
|
|
err.message &&
|
|
err.message.indexOf('You have triggered an abuse detection mechanism') ===
|
|
0
|
|
) {
|
|
logger.debug(`Retrying abuse detection trigger`);
|
|
// istanbul ignore if
|
|
if (process.env.NODE_ENV !== 'test') {
|
|
await sleep(180000 / (retries * retries));
|
|
}
|
|
return ghGotRetry(path, opts, retries - 1);
|
|
}
|
|
throw err;
|
|
}
|
|
}
|
|
|
|
const helpers = ['get', 'post', 'put', 'patch', 'head', 'delete'];
|
|
|
|
for (const x of helpers) {
|
|
ghGotRetry[x] = async (path, opts, retries = 3) => {
|
|
try {
|
|
const res = await ghGot[x](path, opts);
|
|
return res;
|
|
} catch (err) {
|
|
if (err.statusCode === 502 && retries > 0) {
|
|
return ghGotRetry[x](path, opts, retries - 1);
|
|
}
|
|
throw err;
|
|
}
|
|
};
|
|
}
|
|
|
|
module.exports = ghGotRetry;
|