UNPKG

wretch

Version:

A tiny wrapper built around fetch with an intuitive syntax.

54 lines 2.83 kB
/* Defaults */ const defaultDelayRamp = (delay, nbOfAttempts) => (delay * nbOfAttempts); const defaultUntil = response => response && response.ok; export const retry = ({ delayTimer = 500, delayRamp = defaultDelayRamp, maxAttempts = 10, until = defaultUntil, onRetry = null, retryOnNetworkError = false, resolveWithLatestResponse = false } = {}) => { return next => (url, opts) => { let numberOfAttemptsMade = 0; const checkStatus = (response, error) => { return Promise.resolve(until(response, error)).then(done => { // If the response is not suitable if (!done) { numberOfAttemptsMade++; if (!maxAttempts || numberOfAttemptsMade <= maxAttempts) { // We need to recurse until we have a correct response and chain the checks return new Promise(resolve => { const delay = delayRamp(delayTimer, numberOfAttemptsMade); setTimeout(() => { if (typeof onRetry === "function") { Promise.resolve(onRetry({ response, error, url, options: opts })).then((values = {}) => { var _a, _b; resolve(next((_a = (values && values.url)) !== null && _a !== void 0 ? _a : url, (_b = (values && values.options)) !== null && _b !== void 0 ? _b : opts)); }); } else { resolve(next(url, opts)); } }, delay); }).then(checkStatus).catch(error => { if (!retryOnNetworkError) throw error; return checkStatus(null, error); }); } else { return !!response && resolveWithLatestResponse ? response : Promise.reject(error || new Error("Number of attempts exceeded.")); } } return !!response && resolveWithLatestResponse ? response : error ? Promise.reject(error) : response; }); }; return next(url, opts) .then(checkStatus) .catch(error => { if (!retryOnNetworkError) throw error; return checkStatus(null, error); }); }; }; //# sourceMappingURL=retry.js.map