selectServerByCapacity method

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

Select server with best capacity

Implementation

Future<PeerId?> selectServerByCapacity(List<SFServerPreference> preferences) async {
  if (preferences.isEmpty) return null;

  final sorted = preferences.toList()
    ..sort((a, b) => a.priority.compareTo(b.priority));

  PeerId? bestServer;
  double bestScore = -1;

  for (final pref in sorted) {
    if (_isMarkedUnavailable(pref.serverId)) continue;

    final capacity = await queryServerCapacity(pref.serverId);
    if (capacity == null) {
      // A connected server that did not answer the capacity query is
      // still reachable; only leave it out of this choice.
      if (!_isConnected(pref.serverId)) markServerUnavailable(pref.serverId);
      continue;
    }

    // Calculate score based on available capacity and health
    final availablePercent = (capacity.availableStorageBytes / capacity.totalStorageBytes) * 100;
    final score = (availablePercent * 0.7) + (capacity.healthScore * 30);

    if (score > bestScore) {
      bestScore = score;
      bestServer = pref.serverId;
    }
  }

  return bestServer;
}