discoverNatBehavior method

Future<NatBehavior> discoverNatBehavior()

Discovers detailed NAT behavior according to RFC 5780

This method uses the NatBehaviorDiscovery class to perform comprehensive NAT behavior discovery tests. It requires a STUN server that supports RFC 5780.

Returns a NatBehavior object containing mapping and filtering behaviors.

Implementation

Future<NatBehavior> discoverNatBehavior() async {
  // First, find a healthy server
  await _checkServerHealth();
  final healthyServers = _servers.where((s) => s.healthScore > 50).toList();

  if (healthyServers.isEmpty) {
    if (_servers.isEmpty) {
      throw Exception('No STUN servers available');
    }
    // Use the first server even if it's not healthy
    final server = _servers.first;
    final discovery = NatBehaviorDiscovery(stunClient: server.client);
    return discovery.discoverBehavior();
  }

  // Try each healthy server until we find one that supports RFC 5780
  for (final server in healthyServers) {
    try {
      final discovery = NatBehaviorDiscovery(stunClient: server.client);
      final behavior = await discovery.discoverBehavior();

      // If we got a valid result (not unknown for both behaviors), return it
      if (behavior.mappingBehavior != NatMappingBehavior.unknown ||
          behavior.filteringBehavior != NatFilteringBehavior.unknown) {
        return behavior;
      }
    } catch (e) {
      print('Error discovering NAT behavior with server ${server.host}: $e');
      // Continue to the next server
    }
  }

  // If we get here, none of the servers supported RFC 5780
  // Return unknown behaviors
  return NatBehavior();
}