createOutgoing static method
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 firewall(
- UDPSocket socket,
- int port,
- 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;
}