createWebTransportSession method

Future<WebTransportSession> createWebTransportSession(
  1. WebTransportConnectRequest request
)

Create a WebTransport session by sending an Extended CONNECT request.

Awaits response headers; throws if the status is not 2xx.

Implementation

Future<WebTransportSession> createWebTransportSession(
  WebTransportConnectRequest request,
) async {
  final extendedRequest = ExtendedConnectRequest(
    protocol: 'webtransport',
    scheme: 'https',
    authority: request.authority,
    path: request.path,
    headers: {
      if (request.origin != null) 'origin': request.origin!,
    },
  );
  final streamId = await sendExtendedConnect(extendedRequest);

  // Poll for response headers with a short timeout.
  for (var attempt = 0; attempt < 50; attempt++) {
    final response = getResponse(streamId);
    if (response != null) {
      if (response.statusCode < 200 || response.statusCode >= 300) {
        throw StateError(
          'WebTransport session establishment failed: '
          '${response.statusCode}',
        );
      }
      final session = WebTransportSession(this, streamId);
      _webTransportSessions[streamId] = session;
      return session;
    }
    await Future<void>.delayed(Duration(milliseconds: 1));
  }

  throw StateError('Timed out waiting for WebTransport session response');
}