openStream method
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;
}