PHP WebShell
Текущая директория: /opt/BitGoJS/modules/express/src
Просмотр файла: retryPromise.ts
/**
* Thrown in `retryPromise()`
*
* @prettier
*/
export class ErrorMaxRetriesExceededError extends Error {
constructor(maxTries: number) {
super(`giving up after reaching max retry limit of ${maxTries}`);
}
}
/**
* Retries a promise (like a request) if it returns with 'ECONNREFUSED'. Retries are delayed with an exponential backoff.
* @param {Function} func - Promise to execute. When it throws an error, it is called and passed to onError
* @param {Function} onError - Error handler. Called with error as argument.
* If an error should not be retried, the handler should re-throw the passed error.
* @param params
* @param {Number} params.retryLimit - the maximum number of retries to attempt before giving up.
*/
export async function retryPromise<T>(
func: () => Promise<T>,
onError: (err: Error, tryCount: number) => void = () => ({}),
params: { retryLimit: number } = { retryLimit: 3 }
): Promise<T> {
let tryCount = 0;
while (tryCount < params.retryLimit) {
tryCount += 1;
try {
return await func();
} catch (err) {
if (err.code === 'ECONNREFUSED') {
onError(err, tryCount);
} else {
throw new Error(err);
}
}
// if we are going to make another attempt, delay first with exponential backoff
if (tryCount < params.retryLimit) {
const secondsToWait = 2 ** (tryCount - 1) + Math.random();
await new Promise((res) => setTimeout(res, Math.round(secondsToWait * 1000)));
}
}
throw new ErrorMaxRetriesExceededError(params.retryLimit);
}
Выполнить команду
Для локальной разработки. Не используйте в интернете!