in packages/fbjs/src/fetch/fetchWithRetries.js [53:103]
function sendTimedRequest(): void {
requestsAttempted++;
requestStartTime = Date.now();
let isRequestAlive = true;
const request = fetch(uri, init);
const requestTimeout = setTimeout(() => {
isRequestAlive = false;
if (shouldRetry(requestsAttempted)) {
warning(false, 'fetchWithRetries: HTTP timeout, retrying.');
retryRequest();
} else {
reject(new Error(sprintf(
'fetchWithRetries(): Failed to get response from server, ' +
'tried %s times.',
requestsAttempted
)));
}
}, _fetchTimeout);
request.then(response => {
clearTimeout(requestTimeout);
if (isRequestAlive) {
// We got a response, we can clear the timeout.
if (response.status >= 200 && response.status < 300) {
// Got a response code that indicates success, resolve the promise.
resolve(response);
} else if (shouldRetry(requestsAttempted)) {
// Fetch was not successful, retrying.
// TODO(#7595849): Only retry on transient HTTP errors.
warning(false, 'fetchWithRetries: HTTP error, retrying.'),
retryRequest();
} else {
// Request was not successful, giving up.
const error: any = new Error(sprintf(
'fetchWithRetries(): Still no successful response after ' +
'%s retries, giving up.',
requestsAttempted
));
error.response = response;
reject(error);
}
}
}).catch(error => {
clearTimeout(requestTimeout);
if (shouldRetry(requestsAttempted)) {
retryRequest();
} else {
reject(error);
}
});
}