shouldRetry function

RetryDecision shouldRetry({
  1. required ApiError error,
  2. required RetryContext context,
  3. required RetryConfig config,
})

Determine whether an error should be retried.

Implementation

RetryDecision shouldRetry({
  required ApiError error,
  required RetryContext context,
  required RetryConfig config,
}) {
  // Never retry auth or content errors
  if (!error.isRetryable) {
    return RetryDecision.abort(error.message);
  }

  // Check 529 limit
  if (error.type == ApiErrorType.overloaded) {
    context.consecutive529s++;
    if (context.consecutive529s > config.max529Retries && !config.persistent) {
      return RetryDecision.abort(repeated529ErrorMessage);
    }
  } else {
    context.consecutive529s = 0;
  }

  // Check max retries
  if (context.attempt >= config.maxRetries && !config.persistent) {
    return RetryDecision.abort(
      'Max retries (${config.maxRetries}) exceeded: ${error.message}',
    );
  }

  final delay = calculateRetryDelay(
    attempt: context.attempt,
    config: config,
    retryAfterHeader: error.retryAfter,
  );

  return RetryDecision.retry(delay);
}