sanity
Version:
Sanity is a real-time content infrastructure with a scalable, hosted backend featuring a Graph Oriented Query Language (GROQ), asset pipelines and fast edge caches
31 lines (24 loc) • 902 B
text/typescript
import debug from './debug'
const MAX_RETRIES = 5
const BACKOFF_DELAY_BASE = 200
const exponentialBackoff = (retryCount: number) => Math.pow(2, retryCount) * BACKOFF_DELAY_BASE
async function withRetry<T>(
operation: () => Promise<T>,
maxRetries: number = MAX_RETRIES,
): Promise<T> {
for (let retryCount = 0; retryCount < maxRetries; retryCount++) {
try {
return await operation()
} catch (err) {
// Immediately rethrow if the error is not server-related.
if (err.response && err.response.statusCode && err.response.statusCode < 500) {
throw err
}
const retryDelay = exponentialBackoff(retryCount)
debug(`Error encountered, retrying after ${retryDelay}ms: %s`, err.message)
await new Promise((resolve) => setTimeout(resolve, retryDelay))
}
}
throw new Error('Operation failed after all retries')
}
export default withRetry