selectServer method
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;
}