createOutgoing static method

Future<UDXStream> createOutgoing(
  1. UDX udx,
  2. UDPSocket socket,
  3. int localId,
  4. int remoteId,
  5. String host,
  6. int port, {
  7. StreamType streamType = StreamType.bidirectional,
  8. bool framed = false,
  9. int initialSeq = 0,
  10. int? initialCwnd,
  11. bool firewall(
    1. UDPSocket socket,
    2. int port,
    3. String host
    )?,
})

Implementation

static Future<UDXStream> createOutgoing(
  UDX udx,
  UDPSocket socket,
  int localId,
  int remoteId,
  String host,
  int port, {
  StreamType streamType = StreamType.bidirectional,
  bool framed = false,
  int initialSeq = 0,
  int? initialCwnd,
  bool Function(UDPSocket socket, int port, String host)? firewall,
}) async {
  if (socket.closing) {
    throw StateError('UDXStream.createOutgoing: Socket is closing');
  }

  if (!socket.canCreateNewStream()) {
    throw StreamLimitExceededError('Cannot create new stream: remote peer stream limit reached.');
  }
  socket.incrementOutgoingStreams();

  final stream = UDXStream(
    udx,
    localId,
    streamType: streamType,
    isInitiator: true,
    framed: framed,
    initialSeq: initialSeq,
    firewall: firewall,
  );
  stream._socket = socket;
  stream.remoteId = remoteId;
  stream.remoteHost = host;
  stream.remotePort = port;
  stream.remoteFamily = UDX.getAddressFamily(host);
  socket.registerStream(stream);
  stream._remoteConnectionWindowUpdateSubscription?.cancel();
  stream._remoteConnectionWindowUpdateSubscription = stream._socket!.on('remoteConnectionWindowUpdate').listen(stream._handleRemoteConnectionWindowUpdate);
  stream._connected = true;
  stream.connectedAt = DateTime.now();

  try {
    // Send SYN via socket's connection-level packet manager
    socket.sendStreamPacket(
      remoteId,
      localId,
      [StreamFrame(data: Uint8List(0), isSyn: true)],
    );

    if (!socket.closing) {
      await socket.sendMaxDataFrame(UDPSocket.defaultInitialConnectionWindow);
      await socket.sendMaxStreamsFrame();
    }
  } catch (e) {
    await stream.close();
    rethrow;
  }

  stream.emit('connect');
  return stream;
}