openStream method

  1. @override
Future<MuxedStream> openStream(
  1. Context context
)
override

Creates a new stream.

Implementation

@override
Future<MuxedStream> openStream(Context context) async {
  _logger.fine('[UDXSessionConn $id] openStream called.');
  if (_isClosed) {
    _logger.fine('[UDXSessionConn $id] Session closed, cannot open stream.');
    throw SocketException('UDX session is closed');
  }
  final localStreamId = _nextOwnStreamId;
  _nextOwnStreamId += 2;
  final remoteStreamId = _nextExpectedRemoteStreamId;
  _nextExpectedRemoteStreamId += 2;
  _logger.fine('[UDXSessionConn $id] Opening new stream. LocalId: $localStreamId, RemoteExpectedId: $remoteStreamId');

  final remoteHost = _remoteMultiaddr.valueForProtocol('ip4') ?? _remoteMultiaddr.valueForProtocol('ip6');
  final remotePort = int.parse(_remoteMultiaddr.valueForProtocol('udp') ?? '0');

  if (remoteHost == null || remotePort == 0) {
    _logger.fine('[UDXSessionConn $id] Remote address not set, cannot open stream.');
    throw StateError('Remote address not properly set for UDXSessionConn');
  }

  _logger.fine('[UDXSessionConn $id] Creating outgoing UDXStream to $remoteHost:$remotePort (localId: $localStreamId, remoteId: $remoteStreamId)');
  final udxStream = await UDXStream.createOutgoing(
    _transport._udxInstance,
    _udpSocket,
    localStreamId,
    remoteStreamId,
    remoteHost,
    remotePort,
    framed: true,
  );
  _logger.fine('[UDXSessionConn $id] Outgoing UDXStream created: ${udxStream.id}');

  final muxedStream = UDXP2PStreamAdapter(
    udxStream: udxStream,
    parentConn: this,
    direction: Direction.outbound,
  );
  _activeStreams[udxStream.id] = muxedStream;
  _logger.fine('[UDXSessionConn $id] New outgoing stream ${muxedStream.id()} adapted and stored.');
  return muxedStream;
}