selectServer method

Future<PeerId?> selectServer(
  1. List<SFServerPreference> preferences
)

Select best available server from preference list

Implementation

Future<PeerId?> selectServer(List<SFServerPreference> preferences) async {
  if (preferences.isEmpty) {
    _logger.warning('No preferred servers configured');
    return null;
  }

  // Sort by priority (lower value = higher priority)
  final sorted = preferences.toList()
    ..sort((a, b) => a.priority.compareTo(b.priority));

  // Try each server in priority order
  for (final pref in sorted) {
    final serverId = pref.serverId;

    // Skip if recently marked unavailable
    if (_isMarkedUnavailable(serverId)) {
      _logger.warning('Skipping unavailable server: ${serverId.toString().substring(0, 12)}...');
      continue;
    }

    // Check if server is reachable
    if (await isServerAvailable(serverId)) {
      _logger.info('Selected server: ${serverId.toString().substring(0, 12)}... (priority: ${pref.priority})');
      return serverId;
    } else if (_isConnected(serverId)) {
      // The check failed, but another dial connected the server in the
      // meantime: it is available.
      _logger.info('Selected server: ${serverId.toString().substring(0, 12)}... (priority: ${pref.priority})');
      return serverId;
    } else {
      // Mark as unavailable temporarily
      markServerUnavailable(serverId);
    }
  }

  _logger.warning('No available servers found from ${preferences.length} preferences');
  return null;
}