selectStrategy static method

TraversalStrategy selectStrategy(
  1. NatBehavior localBehavior
)

Selects the appropriate traversal strategy based on the local NAT behavior

Implementation

static TraversalStrategy selectStrategy(NatBehavior localBehavior) {
  // If mapping behavior is unknown, use relayed as a safe fallback
  if (localBehavior.mappingBehavior == NatMappingBehavior.unknown) {
    return TraversalStrategy.relayed;
  }

  // If filtering behavior is unknown, use relayed as a safe fallback
  if (localBehavior.filteringBehavior == NatFilteringBehavior.unknown) {
    return TraversalStrategy.relayed;
  }

  // For endpoint-independent mapping and filtering, direct connection may work
  if (localBehavior.mappingBehavior == NatMappingBehavior.endpointIndependent &&
      localBehavior.filteringBehavior == NatFilteringBehavior.endpointIndependent) {
    return TraversalStrategy.direct;
  }

  // For endpoint-independent mapping but stricter filtering, UDP hole punching is likely to work
  if (localBehavior.mappingBehavior == NatMappingBehavior.endpointIndependent) {
    return TraversalStrategy.udpHolePunching;
  }

  // For address-dependent mapping, UDP hole punching might work but is less reliable
  if (localBehavior.mappingBehavior == NatMappingBehavior.addressDependent) {
    return TraversalStrategy.udpHolePunching;
  }

  // For address-and-port-dependent mapping (symmetric NAT), TCP hole punching might be needed
  if (localBehavior.mappingBehavior == NatMappingBehavior.addressAndPortDependent) {
    return TraversalStrategy.tcpHolePunching;
  }

  // Default to relayed as a fallback
  return TraversalStrategy.relayed;
}