UDPSocket constructor

UDPSocket({
  1. required UDX udx,
  2. required UDXMultiplexer multiplexer,
  3. required InternetAddress remoteAddress,
  4. required int remotePort,
  5. required ConnectionCids cids,
  6. UdxMetricsObserver? metricsObserver,
  7. bool isServer = false,
})

Creates a new UDX connection socket.

Implementation

UDPSocket({
  required this.udx,
  required this.multiplexer,
  required this.remoteAddress,
  required this.remotePort,
  required this.cids,
  this.metricsObserver,
  bool isServer = false,
}) {
  _localConnectionMaxData = defaultInitialConnectionWindow;
  _remoteConnectionMaxData = defaultInitialConnectionWindow;
  _localMaxStreams = defaultMaxStreams;
  _pmtudController = PathMtuDiscoveryController();

  // Initialize connection-level packet management
  _packetManager = PacketManager();
  _congestionController = CongestionController(packetManager: _packetManager);
  _packetManager.congestionController = _congestionController;

  // Set up retransmission callback
  _packetManager.onRetransmit = (packet) {
    if (!_closing) {
      try {
        send(packet.toBytes());
      } catch (e) {
        // Ignore send errors during retransmission
      }
    }
  };

  _packetManager.onSendProbe = (packet) {
    if (!_closing) {
      try {
        send(packet.toBytes());
      } catch (e) {
        // Ignore send errors for probes
      }
    }
  };

  _congestionController.onProbe = () {
    _packetManager.sendProbe(cids.remoteCid, cids.localCid, 0, 0);
  };

  _congestionController.onFastRetransmit = (sequence) {
    _packetManager.retransmitPacket(sequence);
  };

  // For client-initiated connections, address is validated by default
  // For server-side connections (receiving SYN), address must be validated
  _addressValidated = !isServer;

  // Notify observer that handshake is starting
  _handshakeStartTime = DateTime.now();
  metricsObserver?.onHandshakeStart(
    cids.localCid,
    cids.remoteCid,
    '${remoteAddress.address}:$remotePort',
  );
}