sendHttp3ControlStream method

void sendHttp3ControlStream()

Implementation

void sendHttp3ControlStream() {
  if (h3.controlStreamSent) return;
  if (!applicationSecretsDerived || appWrite == null) {
    throw StateError('Cannot send HTTP/3 control stream before 1-RTT keys');
  }

  final settingsPayload = build_settings_frame({
    'SETTINGS_QPACK_MAX_TABLE_CAPACITY': 0,
    'SETTINGS_QPACK_BLOCKED_STREAMS': 0,
    'SETTINGS_ENABLE_CONNECT_PROTOCOL': 1,
    'SETTINGS_ENABLE_WEBTRANSPORT': 1,
    'SETTINGS_H3_DATAGRAM': 1,
  });

  final controlStreamBytes = Uint8List.fromList([
    ...writeVarInt(H3_STREAM_TYPE_CONTROL),
    ...writeVarInt(H3_FRAME_SETTINGS),
    ...writeVarInt(settingsPayload.length),
    ...settingsPayload,
  ]);

  // ✅ Allocate exactly ONE server-initiated unidirectional stream
  serverControlStreamId ??= _allocateServerUniStreamId();

  sendApplicationStream(
    serverControlStreamId!,
    controlStreamBytes,
    fin: false,
    offset: 0,
  );

  serverControlStreamOffset = controlStreamBytes.length;
  h3.controlStreamSent = true;

  print(
    '✅ HTTP/3 control stream sent '
    '(streamId=$serverControlStreamId)',
  );
}