handleConnectionError method

Future<bool> handleConnectionError({
  1. required String relayUrl,
  2. required dynamic error,
  3. required int attemptNumber,
  4. required Future<bool> retryFn(),
})

Handle a relay connection error with recovery attempt.

Implementation

Future<bool> handleConnectionError({
  required String relayUrl,
  required dynamic error,
  required int attemptNumber,
  required Future<bool> Function() retryFn,
}) async {
  _recordError(
    relayUrl: relayUrl,
    errorType: ErrorType.connectionError,
    error: error,
    attemptNumber: attemptNumber,
  );

  logger.log(
    'Connection error on relay $relayUrl (attempt $attemptNumber): $error',
  );

  if (attemptNumber > _strategy.maxRetries) {
    logger.log(
      'Max retries exceeded for relay $relayUrl, giving up',
    );
    return false;
  }

  final delay = _strategy.getDelayForAttempt(attemptNumber);
  logger.log(
    'Retrying relay $relayUrl in ${delay.inMilliseconds}ms (attempt ${attemptNumber + 1})',
  );

  await Future<void>.delayed(delay);

  try {
    return await retryFn();
  } catch (e) {
    return handleConnectionError(
      relayUrl: relayUrl,
      error: e,
      attemptNumber: attemptNumber + 1,
      retryFn: retryFn,
    );
  }
}