WebTransport

W3C 作業草案,

この文書の詳細情報
このバージョン:
https://www.w3.org/TR/2025/WD-webtransport-20250702/
最新公開バージョン:
https://www.w3.org/TR/webtransport/
編集者ドラフト:
https://w3c.github.io/webtransport/
履歴:
https://www.w3.org/standards/history/webtransport/
フィードバック:
public-webtransport@w3.org 件名 “[webtransport] … メッセージのトピック …” (アーカイブ)
GitHub
仕様内でインライン
編集者:
Nidhi Jaju (Google)
Victor Vasiliev (Google)
Jan-Ivar Bruaroey (Mozilla)
以前の編集者:
Bernard Aboba (Microsoft Corporation)
Peter Thatcher (Google)
Robin Raymond (Optical Tone Ltd.)
Yutaka Hirano (Google)

概要

この文書は、ブラウザとサーバー間でデータの送受信を可能にするための WebIDL で定義された ECMAScript API のセットを定義します。[WEB-TRANSPORT-HTTP3] および[WEB-TRANSPORT-HTTP2]を利用します。本仕様は、IETF WEBTRANS ワーキンググループによって策定されたプロトコル仕様と連携して開発されています。

この文書のステータス

このセクションは、公開時点での文書のステータスについて説明します。現在の W3C 公開物およびこの技術レポートの最新改訂版は、W3C 技術レポートインデックスをご覧ください。

この文書は WebTransport ワーキンググループ によって、勧告トラックを用いて作業草案として公開されました。この文書は W3C 勧告になることを意図しています。

この文書へのフィードバックやコメントは歓迎します。issue を提出してください。 この文書の GitHub レポジトリもご参照ください。

作業草案として公開されていることは、W3Cおよびその会員による承認を意味するものではありません。この文書はドラフトであり、随時更新、置換、または他の文書によって廃止される可能性があります。本文書を進行中の作業以外のものとして引用することは適切ではありません。

この文書は W3C 特許ポリシーの下で運営されているグループによって作成されました。 W3C は、グループの成果物に関して提出された特許開示の公開リストを維持しています。 そのページには特許開示の方法も記載されています。 個人が特許に関する実際の知識を持ち、その特許が必須クレームを含むと考える場合、W3C 特許ポリシー第6節に従って情報を開示する必要があります。

この文書は2023年11月3日 W3C プロセス文書に準拠しています。

1. はじめに

このセクションは規範的ではありません。

本仕様は、[WEB-TRANSPORT-HTTP3] および [WEB-TRANSPORT-HTTP2] を用いて、サーバーへのデータ送信およびサーバーからのデータ受信を行います。WebSocketsのように利用できますが、複数ストリーム対応、単方向ストリーム、順不同配信、信頼性のある・ない転送もサポートしています。

注: 本仕様で示されているAPIは、IETF WEBTRANS WGで進行中の作業に基づく暫定案です。[WEB-TRANSPORT-HTTP3] および [WEB-TRANSPORT-HTTP2] の仕様は進行中であるため、今後プロトコルやAPIが大きく変更される可能性があります。

2. 適合性

規範的でないと明記されたセクションだけでなく、著者向けガイドライン、図、例、および本仕様書内の注記も全て非規範的です。それ以外は全て規範的です。

「MUST」「MUST NOT」「REQUIRED」「SHALL」「SHALL NOT」「SHOULD」「SHOULD NOT」「RECOMMENDED」「NOT RECOMMENDED」「MAY」「OPTIONAL」といったキーワードは、[RFC2119] および [RFC8174] の定義に従い、ここで示されるように全て大文字で現れる場合のみ、同様に解釈されます。

本仕様は、ここに含まれるインターフェースを実装するユーザーエージェント製品単体に適用される適合性基準を定義します。

アルゴリズムや具体的な手順として記述された適合要件は、最終結果が同等である限り、どのような方法で実装してもかまいません。(特に、本仕様で定義されているアルゴリズムは理解しやすいように意図されており、性能面を考慮しているものではありません。)

本仕様で定義されるAPIをECMAScriptを用いて実装する場合、Web IDL仕様 [WEBIDL] で定義されるECMAScriptバインディングと用語に従い、一貫した方法で実装しなければなりません。

3. プロトコルの概念

WebTransportの主要なプロトコル概念は「セッション」と「ストリーム」の2つです。各WebTransportセッションは複数のWebTransportストリームを含むことができます。

これらは、アプリケーションレベルのAPI構造であるプロトコル名と混同しないでください。

3.1. WebTransportセッション

WebTransportセッションは、HTTP/3またはHTTP/2の基盤となるコネクション上のWebTransportのセッションです。 プーリングが有効な場合、1つのコネクション上に複数のWebTransportセッションが存在することがあります。

WebTransportセッションには、[WEB-TRANSPORT-OVERVIEW]で定義された以下の機能があります:

機能 定義
データグラムを送信する [WEB-TRANSPORT-OVERVIEW] セクション4.2
データグラムを受信する [WEB-TRANSPORT-OVERVIEW] セクション4.2
送信単方向ストリームを作成する [WEB-TRANSPORT-OVERVIEW] セクション4.3
双方向ストリームを作成する [WEB-TRANSPORT-OVERVIEW] セクション4.3
受信単方向ストリームを受信する [WEB-TRANSPORT-OVERVIEW] セクション4.3
双方向ストリームを受信する [WEB-TRANSPORT-OVERVIEW] セクション4.3

確立するには、WebTransportセッションoriginprotocols配列とともに、[WEB-TRANSPORT-OVERVIEW] セクション4.1に従い、 originシリアル化および同型エンコードし、リクエストの`Origin`ヘッダーとして使用します。 同型エンコードしたprotocolsは、クライアントがこのセッションでサーバーに優先して使ってほしいプロトコルのリストとして使用し、[WEB-TRANSPORT-OVERVIEW] セクション3.1に従います。 セッションの確立時に、クライアントは認証情報を一切提供してはなりません。 得られる基盤となるトランスポートストリームはセッションのCONNECTストリームと呼ばれます。

ドレインするには、WebTransportセッション sessionについて、[WEB-TRANSPORT-OVERVIEW] セクション4.1に従います。

WebTransportセッション sessionは、ドレイン中です。これは、CONNECTストリームがサーバーによって正常に閉じられるよう要求された場合であり、[WEB-TRANSPORT-OVERVIEW] セクション4.1に記載されています。

終了するには、オプションの整数codeおよびオプションのバイト列reasonを使い、WebTransportセッション sessionについて、[WEB-TRANSPORT-OVERVIEW] セクション4.1に従ってください。

WebTransportセッション sessionは、終了済みとなります。オプションで整数codeバイト列reasonを持ち、CONNECTストリームがサーバーによって閉じられた時に発生します。詳細は[WEB-TRANSPORT-OVERVIEW] セクション4.1を参照してください。

3.2. WebTransportストリーム

WebTransportストリームは、WebTransportセッション上の信頼性のある順序どおりのバイトストリームの概念であり、[WEB-TRANSPORT-OVERVIEW] セクション4.3で説明されています。

WebTransportストリームは、受信単方向送信単方向または双方向のいずれかです。

WebTransportストリームには以下の機能があります:

機能 定義 受信単方向 送信単方向 双方向
バイトを送信(必要に応じてFIN付き) [WEB-TRANSPORT-OVERVIEW] セクション4.3 不可
バイトを受信(必要に応じてFIN付き) [WEB-TRANSPORT-OVERVIEW] セクション4.3 不可
STOP_SENDINGを送信 [WEB-TRANSPORT-OVERVIEW] セクション4.3 不可
WebTransportストリームをリセット [WEB-TRANSPORT-OVERVIEW] セクション4.3 不可

WebTransportストリームは、以下のシグナルを持ちます:

イベント 定義 受信単方向 送信単方向 双方向
STOP_SENDING [WEB-TRANSPORT-OVERVIEW] セクション4.3 不可
RESET_STREAM [WEB-TRANSPORT-OVERVIEW] セクション4.3 不可
フロー制御 [WEB-TRANSPORT-OVERVIEW] セクション4.3 不可

4. WebTransportDatagramsWritable インターフェース

WebTransportDatagramsWritableは、WritableStream であり、 データグラムの送信のための送信ストリーミング機能を提供します。

[Exposed=(Window,Worker), SecureContext, Transferable]
interface WebTransportDatagramsWritable : WritableStream {
  attribute WebTransportSendGroup? sendGroup;
  attribute long long sendOrder;
};

4.1. 内部スロット

WebTransportDatagramsWritable オブジェクトは以下の内部スロットを持ちます。

内部スロット 説明(非規範的
[[OutgoingDatagramsQueue]] 送信するデータグラム、タイムスタンプ、およびデータグラムが送信または破棄された時に解決されるpromiseのタプルのキュー。
[[Transport]] WebTransport このWebTransportDatagramsWritableを所有するオブジェクト。
[[SendGroup]] オプションのWebTransportSendGroupまたはnull。
[[SendOrder]] オプションの送信順番号(デフォルトは0)。

作成するには、 WebTransportDatagramsWritable を、WebTransport transportsendGroupsendOrderで次のステップを実行します。

  1. stream新しいWebTransportDatagramsWritable として、以下の内容で作成:

    [[OutgoingDatagramsQueue]]

    空のキュー

    [[Transport]]

    transport

    [[SendGroup]]

    sendGroup

    [[SendOrder]]

    sendOrder

  2. writeDatagramsAlgorithmtransportstreamwriteDatagramsを実行するアクションとする。

  3. streamをセットアップし、writeAlgorithmwriteDatagramsAlgorithmに設定する。

  4. streamを返す。

4.2. 属性

sendGroup, WebTransportSendGroup, null可能

ゲッター手順:

  1. this[[SendGroup]] を返す。

セッター手順(valueを与える):

  1. valueがnullでなく、かつ value.[[Transport]]this.[[Transport]] でない場合、InvalidStateErrorをスローする。

  2. this.[[SendGroup]]valueに設定する。

sendOrder, long long

ゲッター手順:

  1. this[[SendOrder]] を返す。

セッター手順(valueを与える):

  1. this.[[SendOrder]]valueに設定する。

4.3. 手順

writeDatagrams アルゴリズムはtransportおよびwritableをパラメータ、dataを入力とし、次の手順で定義されます:

  1. timestampを現在を表すタイムスタンプとする。

  2. dataBufferSource オブジェクトでなければ、TypeErrorでrejectされたpromiseを返す。

  3. datagramstransport.[[Datagrams]]とする。

  4. datagrams.[[OutgoingMaxDatagramSize]]dataの[[ByteLength]]より小さい場合、undefinedでresolveされたpromiseを返す。

  5. promiseを新しいpromiseとする。

  6. bytesdataが表すバイトのコピーとする。

  7. chunkbytestimestamppromiseのタプルとする。

  8. writable.[[OutgoingDatagramsQueue]]chunkをエンキューする。

  9. writable.[[OutgoingDatagramsQueue]] の長さが datagrams.[[OutgoingDatagramsHighWaterMark]] 未満なら、promiseをundefinedで解決する

  10. promiseを返す。

注: 関連するWritableStream は、そのストリームでwriteDatagramsによって返されたpromiseが全て解決されたときのみwriteDatagramsを呼び出します。したがって、タイムスタンプと有効期限は、ウェブ開発者が WritableStreamDefaultWriter.ready に注意を払う場合のみ適切に動作します。

sendDatagrams するには、WebTransport オブジェクトtransportWebTransportDatagramsWritable オブジェクトwritableで、ネットワークタスクをキューし transportで以下のステップを実行します:

  1. queuewritable.[[OutgoingDatagramsQueue]] のコピーとする。

    注: 上記のコピーおよびネットワークタスクのキューは最適化できます。

  2. maxSizetransport.[[Datagrams]].[[OutgoingMaxDatagramSize]] とする。

  3. durationtransport.[[Datagrams]].[[OutgoingDatagramsExpirationDuration]] とする。

  4. durationがnullなら、duration実装定義値に設定する。

  5. 次のステップを並行して実行:

    1. queueが空でない間:

      1. bytestimestamppromisequeueの先頭要素から取得する。

      2. timestampからdurationミリ秒以上経過している場合:

        1. queueの先頭要素を削除する。

        2. ネットワークタスクをキューしtransportpromiseをundefinedで解決する。

      3. それ以外の場合、このループを終了する。

    2. transport.[[State]]"connected"でなければ、何もせず終了する。

    3. queueが空でない間:

      1. bytestimestamppromisequeueの先頭要素から取得する。

      2. bytesの長さがmaxSize以下の場合:

        1. bytesを即座にネットワークに送信できない場合、このループを終了する。

        2. データグラムの送信transport.[[Session]]bytesで行う。

      3. queueの先頭要素を削除する。

      4. ネットワークタスクをキューし transportpromiseをundefinedで解決する。

ユーザーエージェントは、WebTransport オブジェクトのうち [[State]]"connecting"または"connected"のものについて、関連するWebTransportDatagramsWritable オブジェクトの部分集合(送信順ルールにより決定)に対してsendDatagramsを実行しなければならず、アルゴリズムが進捗できる場合は合理的な範囲ですぐに実行するべきです。

送信順ルールは、送信は一般に、このトランスポート上で以前にキューされたストリームやデータグラムの送信、および今後キューされるストリームやデータグラムの送信とインターリーブされてもよいですが、送信は、同じ [[SendGroup]] かつより高い [[SendOrder]] を持つストリームやデータグラム(エラー状態でもフロー制御でブロックされているものでもない)が全て送信されるまで、優先的に待機しなければなりません。

注: トランスポートの[[State]]"connecting"の間、データグラムの書き込みは許可されます。 データグラムは[[OutgoingDatagramsQueue]] に格納され、"connected"状態の時と同様に破棄される可能性があります。トランスポートの[[State]]"connected"になると、キューされたデータグラムの送信が開始されます。

5. WebTransportDatagramDuplexStream インターフェース

WebTransportDatagramDuplexStreamは、汎用的なデュプレックスストリームです。

[Exposed=(Window,Worker), SecureContext]
interface WebTransportDatagramDuplexStream {
  WebTransportDatagramsWritable createWritable(
      optional WebTransportSendOptions options = {});
  readonly attribute ReadableStream readable;

  readonly attribute unsigned long maxDatagramSize;
  attribute unrestricted double? incomingMaxAge;
  attribute unrestricted double? outgoingMaxAge;
  attribute unrestricted double incomingHighWaterMark;
  attribute unrestricted double outgoingHighWaterMark;
};

5.1. 内部スロット

WebTransportDatagramDuplexStream オブジェクトは以下の内部スロットを持ちます。

内部スロット 説明(非規範的
[[Readable]] 着信データグラム用のReadableStream
[[Writables]] 順序付き集合としてのWebTransportDatagramsWritable ストリーム。初期値は空。
[[IncomingDatagramsQueue]] 着信データグラムとタイムスタンプのペアのキュー。
[[IncomingDatagramsPullPromise]] pullDatagramsによって設定される、着信データグラムの待機用promise。
[[IncomingDatagramsHighWaterMark]] 着信データグラムのハイウォーターマークを表すunrestricted double
[[IncomingDatagramsExpirationDuration]] 着信データグラムの有効期限(ミリ秒単位)を表すunrestricted doubleまたはnull。
[[OutgoingDatagramsHighWaterMark]] 送信データグラムのハイウォーターマークを表すunrestricted double
[[OutgoingDatagramsExpirationDuration]] 送信データグラムの有効期限(ミリ秒単位)を表すunrestricted double値、またはnull。
[[OutgoingMaxDatagramSize]] 送信データグラムの最大サイズを表す整数。
最大データグラムサイズは使用中のプロトコルによって異なります。 HTTP/3 [WEB-TRANSPORT-HTTP3] では、 パスの MTU の推定値に関連し、実装依存の量だけオーバーヘッド分減算されます。 HTTP/2 [WEB-TRANSPORT-HTTP2] には同等の制限はありません。

データグラムの処理は通常、全データグラムをメモリに保持するため、 実装はサイズに制限を設けます。 将来的なプロトコル拡張により、すべてのプロトコルバリエーションに対して これらサイズ制限のシグナリングが可能となる場合があります。

ユーザーエージェントは、[[OutgoingMaxDatagramSize]] を、WebTransport オブジェクトの [[State]]"connecting"または"connected"の場合に更新してもよいです。

作成するには、 WebTransportDatagramDuplexStream を、readableで、以下の手順を実行します。

  1. stream新しいWebTransportDatagramDuplexStream として、以下の内容で作成:

    [[Readable]]

    readable

    [[Writables]]

    空の順序付き集合

    [[IncomingDatagramsQueue]]

    空のキュー

    [[IncomingDatagramsPullPromise]]

    null

    [[IncomingDatagramsHighWaterMark]]

    実装定義

    [[IncomingDatagramsExpirationDuration]]

    null

    [[OutgoingDatagramsHighWaterMark]]

    実装定義

    この実装定義値は、送信データの適切なスループットを確保しつつ、 送信データの即時性を損なわないように調整されるべきです。

    [[OutgoingDatagramsExpirationDuration]]

    null

    [[OutgoingMaxDatagramSize]]

    実装定義の整数。

  2. streamを返す。

5.2. メソッド

createWritable()

WebTransportDatagramsWritableを生成します。

createWritable()メソッドが呼ばれた場合、ユーザーエージェントは以下の手順を実行しなければなりません:

  1. transportthisに関連付けられたWebTransport オブジェクトとする。

  2. transport.[[State]]"closed"または"failed"の場合は、 InvalidStateErrorをスローする。

  3. sendGroupoptionssendGroup とする。

  4. sendOrderoptionssendOrder とする。

  5. WebTransportDatagramsWritabletransportsendGroupsendOrder作成した結果を返す。

5.3. 属性

readable, ReadableStream、読み取り専用

ゲッター手順:

  1. this[[Readable]] を返す。

incomingMaxAge, unrestricted double、null可能

ゲッター手順:

  1. this[[IncomingDatagramsExpirationDuration]] を返す。

セッター手順(valueを与える):

  1. valueが負またはNaNなら、RangeErrorをスローする。

  2. value0なら、valueをnullに設定する。

  3. this[[IncomingDatagramsExpirationDuration]]valueに設定する。

maxDatagramSize, unsigned long、読み取り専用

WebTransportDatagramsWritableに渡せる最大データサイズ。 ゲッター手順はthis[[OutgoingMaxDatagramSize]] を返す。

outgoingMaxAge, unrestricted double、null可能

ゲッター手順:

  1. this[[OutgoingDatagramsExpirationDuration]] を返す。

セッター手順(valueを与える):

  1. valueが負またはNaNなら、RangeErrorをスローする。

  2. value0なら、valueをnullに設定する。

  3. this[[OutgoingDatagramsExpirationDuration]]valueに設定する。

incomingHighWaterMark, unrestricted double

ゲッター手順:

  1. this[[IncomingDatagramsHighWaterMark]] を返す。

セッター手順(valueを与える):

  1. valueが負またはNaNなら、RangeErrorをスローする。

  2. value1未満なら、value1に設定する。

  3. this[[IncomingDatagramsHighWaterMark]]valueに設定する。

outgoingHighWaterMark, unrestricted double

ゲッター手順:

  1. this[[OutgoingDatagramsHighWaterMark]] を返す。

セッター手順(valueを与える):

  1. valueが負またはNaNなら、RangeErrorをスローする。

  2. value1未満なら、value1に設定する。

  3. this[[OutgoingDatagramsHighWaterMark]]valueに設定する。

5.4. 手順

pullDatagramsは、 WebTransport オブジェクトtransportについて以下の手順を実行します:

  1. datagramstransport.[[Datagrams]] とする。

  2. Assert: datagrams.[[IncomingDatagramsPullPromise]] はnullである。

  3. queuedatagrams.[[IncomingDatagramsQueue]] とする。

  4. queueが空の場合:

    1. datagrams.[[IncomingDatagramsPullPromise]] に新しいpromiseを設定する。

    2. datagrams.[[IncomingDatagramsPullPromise]] を返す。

  5. datagramtimestampqueueからデキュー した結果とする。

  6. もしdatagrams.[[Readable]]現在のBYOBリクエストビューがnullでない場合:

    1. viewdatagrams.[[Readable]]現在のBYOBリクエストビュー とする。

    2. viewバイト長datagramのサイズより小さい場合、 RangeErrorでrejectされたpromiseを返す。

    3. elementSize型付き配列コンストラクタ表view.[[TypedArrayName]]に指定されている要素サイズとする。viewが[[TypedArrayName]]内部スロットを持たない場合(DataViewの場合)は elementSizeを0とする。

    4. elementSizeが1でない場合、TypeErrorでrejectされたpromiseを返す。

  7. datagramをバイトからプルdatagrams.[[Readable]] に格納する。

  8. undefinedでresolveされたpromiseを返す。

receiveDatagrams は、 WebTransport オブジェクトtransportについて以下の手順を実行します:

  1. timestampを現在のタイムスタンプとする。

  2. queuedatagrams.[[IncomingDatagramsQueue]] とする。

  3. durationdatagrams.[[IncomingDatagramsExpirationDuration]] とする。

  4. durationがnullなら、duration実装定義値に設定する。

  5. sessiontransport.[[Session]] とする。

  6. session利用可能な着信データグラムがある間:

    1. datagram着信データグラムを受信の結果とする。

    2. timestampを現在のタイムスタンプとする。

    3. chunkdatagramtimestampのペアとする。

    4. chunkをqueueにエンキューする。

  7. toBeRemovedqueueの長さからdatagrams.[[IncomingDatagramsHighWaterMark]] を引いた値とする。

  8. toBeRemovedが正ならqueueからデキューtoBeRemoved回(切り捨て)繰り返す。

  9. queueが空でない間:

    1. bytestimestampqueueの先頭要素から取得する。

    2. timestampからdurationミリ秒以上経過していれば、queueからデキューする。

    3. それ以外の場合、このループをbreakする。

  10. queueが空でなく、かつdatagrams.[[IncomingDatagramsPullPromise]] がnullでない場合:

    1. bytestimestampqueueからデキューした結果とする。

    2. promisedatagrams.[[IncomingDatagramsPullPromise]] とする。

    3. datagrams.[[IncomingDatagramsPullPromise]] をnullに設定する。

    4. ネットワークタスクをキューし transportで以下の手順を実行:

      1. chunkUint8Array オブジェクトとしてbytesを表現したものとする。

      2. chunkを datagrams.[[Readable]] にエンキューする。

      3. promiseをundefinedでresolveする

ユーザーエージェントは、WebTransport オブジェクトの [[State]]"connected"のとき、アルゴリズムが進行可能な場合は合理的な範囲ですぐにreceiveDatagramsを実行するべきです。

6. WebTransport インターフェース

WebTransportは、[WEB-TRANSPORT-OVERVIEW]で定義された基盤となるトランスポート機能へのAPIを提供します。

[Exposed=(Window,Worker), SecureContext]
interface WebTransport {
  constructor(USVString url, optional WebTransportOptions options = {});

  Promise<WebTransportConnectionStats> getStats();
  [NewObject] Promise<ArrayBuffer> exportKeyingMaterial(BufferSource label, optional BufferSource context);
  readonly attribute Promise<undefined> ready;
  readonly attribute WebTransportReliabilityMode reliability;
  readonly attribute WebTransportCongestionControl congestionControl;
  [EnforceRange] attribute unsigned short? anticipatedConcurrentIncomingUnidirectionalStreams;
  [EnforceRange] attribute unsigned short? anticipatedConcurrentIncomingBidirectionalStreams;
  readonly attribute DOMString protocol;

  readonly attribute Promise<WebTransportCloseInfo> closed;
  readonly attribute Promise<undefined> draining;
  undefined close(optional WebTransportCloseInfo closeInfo = {});

  readonly attribute WebTransportDatagramDuplexStream datagrams;

  Promise<WebTransportBidirectionalStream> createBidirectionalStream(
      optional WebTransportSendStreamOptions options = {});
  /* a ReadableStream of WebTransportBidirectionalStream objects */
  readonly attribute ReadableStream incomingBidirectionalStreams;

  Promise<WebTransportSendStream> createUnidirectionalStream(
      optional WebTransportSendStreamOptions options = {});
  /* a ReadableStream of WebTransportReceiveStream objects */
  readonly attribute ReadableStream incomingUnidirectionalStreams;
  WebTransportSendGroup createSendGroup();

  static readonly attribute boolean supportsReliableOnly;
};

enum WebTransportReliabilityMode {
  "pending",
  "reliable-only",
  "supports-unreliable",
};

6.1. 内部スロット

WebTransport オブジェクトは以下の内部スロットを持ちます。

内部スロット 説明(非規範的
[[SendStreams]] このWebTransportが所有するWebTransportSendStream順序付き集合
[[ReceiveStreams]] このWebTransportが所有するWebTransportReceiveStream順序付き集合
[[IncomingBidirectionalStreams]] ReadableStreamであり、WebTransportBidirectionalStreamオブジェクトから成る。
[[IncomingUnidirectionalStreams]] ReadableStreamであり、WebTransportReceiveStreamから成る。
[[State]] トランスポートの状態を示すenum。"connecting""connected""draining""closed""failed"のいずれか。
[[Ready]] 関連するWebTransportセッション確立されたときにfulfillされるpromise。確立処理が失敗した場合はrejectされる。
[[Reliability]] 最初のホップが信頼性のない(UDP)転送をサポートしているか、信頼性のある(TCPフォールバックのみ)転送が利用可能かを示すWebTransportReliabilityMode。接続確立までは"pending"を返す。
[[CongestionControl]] アプリケーションが要求し、ユーザーエージェントが満たした場合のスループット最適化・低遅延最適化の輻輳制御アルゴリズムの希望を示すWebTransportCongestionControl"default"もあり。
[[AnticipatedConcurrentIncomingUnidirectionalStreams]] アプリケーションがサーバーによる同時オープンを予想する受信単方向ストリームの数。nullの場合もある。
[[AnticipatedConcurrentIncomingBidirectionalStreams]] アプリケーションがサーバーによる同時オープンを予想する双方向ストリームの数。nullの場合もある。
[[Protocol]] サーバーが選択したアプリケーションレベルのプロトコルを示す文字列(あれば)。初期値は空文字列。
[[Closed]] 関連するWebTransport オブジェクトが正常に閉じられたときにfulfillされるpromise。初期化失敗や突然終了時はrejectされる。
[[Draining]] 関連するWebTransportセッションドレイン済みになったときにfulfillされるpromise。
[[Datagrams]] WebTransportDatagramDuplexStream
[[Session]] このWebTransportオブジェクト用のWebTransportセッション、またはnull。

6.2. コンストラクター

WebTransport() コンストラクターが呼び出されたとき、ユーザーエージェントは次の手順を実行しなければなりません:
  1. baseURLthis関連設定オブジェクトAPI基準URLとする。

  2. parsedURLURLレコードとして、 解析 urlbaseURLで行った結果とする。

  3. parsedURLが失敗であれば、SyntaxError例外をスローする。

  4. parsedURLスキームhttpsでなければ、SyntaxError例外をスローする。

  5. parsedURLフラグメントがnullでなければ、SyntaxError例外をスローする。

  6. allowPoolingoptionsallowPoolingとする。

  7. dedicatedallowPoolingの否定値とする。

  8. serverCertificateHashesoptionsserverCertificateHashes が存在する場合はその値、なければnullとする。

  9. dedicatedがfalseでserverCertificateHashesがnullでない場合、NotSupportedError例外をスローする。

  10. requireUnreliableoptionsrequireUnreliableとする。

  11. congestionControloptionscongestionControlとする。

  12. congestionControl"default"でなく、ユーザーエージェントが [RFC9002] Section 7で許可される congestionControlに最適化された輻輳制御アルゴリズムをサポートしていなければ、congestionControl"default"に設定する。

  13. protocolsoptionsprotocols

  14. protocols内の値に重複がある場合、WebTransportプロトコルで交渉されるアプリケーションプロトコル値を構成する要素の要件に合致しない場合、または同型エンコード長が0または512を超える場合、SyntaxError例外をスローする。 [WEB-TRANSPORT-OVERVIEW] Section 3.1参照。

  15. anticipatedConcurrentIncomingUnidirectionalStreamsoptionsanticipatedConcurrentIncomingUnidirectionalStreamsとする。

  16. anticipatedConcurrentIncomingBidirectionalStreamsoptionsanticipatedConcurrentIncomingBidirectionalStreamsとする。

  17. incomingDatagrams新しいReadableStreamとする。

  18. datagramsWebTransportDatagramDuplexStreamの作成の結果とし、 readableincomingDatagramsを設定する。

  19. transportを新しく構築したWebTransportオブジェクトとし、以下の内容で初期化:

    [[SendStreams]]

    空の順序付き集合

    [[ReceiveStreams]]

    空の順序付き集合

    [[IncomingBidirectionalStreams]]

    新しいReadableStream

    [[IncomingUnidirectionalStreams]]

    新しいReadableStream

    [[State]]

    "connecting"

    [[Ready]]

    新しいpromise

    [[Reliability]]

    "pending"

    [[CongestionControl]]

    congestionControl

    [[AnticipatedConcurrentIncomingUnidirectionalStreams]]

    anticipatedConcurrentIncomingUnidirectionalStreams

    [[AnticipatedConcurrentIncomingBidirectionalStreams]]

    anticipatedConcurrentIncomingBidirectionalStreams

    [[Protocol]]

    空文字列

    [[Closed]]

    新しいpromise

    [[Draining]]

    新しいpromise

    [[Datagrams]]

    datagrams

    [[Session]]

    null

  20. pullDatagramsAlgorithmtransportpullDatagramsを実行するアクションとする。

注: データグラムには64kBバッファを使うことが推奨されます。WebTransportデータグラムフレームの最大サイズはQUICデータグラムフレームサイズの上限であり、64kBが推奨されています([QUIC-DATAGRAM] Section 3参照)。 これは、バッファより大きいデータグラムでストリームがエラーになるのを防ぎます。

  1. バイトリーディング対応でセットアップincomingDatagramsに対して行い、 pullAlgorithmpullDatagramsAlgorithmを設定し、highWaterMarkは0とする。

  2. pullBidirectionalStreamAlgorithmtransportpullBidirectionalStream を実行するアクションとする。

  3. セットアップtransport.[[IncomingBidirectionalStreams]] に対して行い、 pullAlgorithmpullBidirectionalStreamAlgorithmを設定し、 highWaterMarkは0とする。

  4. pullUnidirectionalStreamAlgorithmtransportpullUnidirectionalStream を実行するアクションとする。

  5. セットアップtransport.[[IncomingUnidirectionalStreams]] に対して行い、 pullAlgorithmpullUnidirectionalStreamAlgorithmを設定し、 highWaterMarkは0とする。

  6. WebTransport over HTTPの初期化transportparsedURLdedicatedrequireUnreliablecongestionControlprotocolsserverCertificateHashesで行う。

  7. transportを返す。

WebTransportをHTTP上で初期化するには、WebTransport オブジェクト transportURLレコードurl、boolean dedicated、boolean requireUnreliableWebTransportCongestionControl congestionControlprotocols配列、および sequence<WebTransportHash> serverCertificateHashesで以下の手順を実行する。
  1. clienttransport関連設定オブジェクトとする。

  2. originclientオリジンとする。

  3. requestを新しいリクエストとし、URLurlclientclientpolicy containerclientpolicy containerdestinationは空文字列、 originoriginredirect modeは"error"とする。

  4. Content Security Policy違反をrequestで報告する。

  5. Content Security Policyによりリクエストがブロックされるべきか?request"Blocked"を返した場合、またはrequest不正なポートでブロックされるべき なら、残りの手順を中止し、ネットワークタスクをキューし、 transportで以下の手順を実行:

    1. transport.[[State]]"closed"または"failed"なら、これらの手順を中止。

    2. errorを新しく作成したWebTransportError とし、 source"session"とする。

    3. transportのクリーンアップerrorで実行する。

  6. networkPartitionKeyネットワークパーティションキーの決定transport関連設定オブジェクトを使用して得る。

  7. 以下の手順を並行して実行するが、transportの[[State]]が"closed"または"failed"になると中止

    1. newConnectiondedicatedがfalseなら"no"、それ以外は"yes-and-dedicated"とする。

    2. connectionコネクションの取得networkPartitionKeyurl、false、newConnectionrequireUnreliableで得る。ユーザーエージェントが複数の輻輳制御アルゴリズムをサポートする場合は、congestionControlに適したものを選択する。コネクション取得時、serverCertificateHashes指定の場合は、デフォルトの証明書検証アルゴリズムではなく、カスタム証明書要件を満たし、証明書ハッシュの検証serverCertificateHashesでtrueを返せば有効とする。どちらか満たさない場合はconnectionは失敗とする。

    3. connectionが失敗なら残りの手順を中止し、ネットワークタスクをキューtransportで以下を実行:

      1. transport.[[State]]"closed"または"failed"なら中止。

      2. errorを新しく作成したWebTransportError とし、 source"session"とする。

      3. transportのクリーンアップerrorで実行する。

        注: リダイレクトは追従しません。リダイレクトによるネットワークエラーは他のネットワークエラーと区別できません。クロスオリジンではCORSによって通常は遮断される情報が漏れるため、同一オリジンではハンドシェイク乱用のベクトルになり得るためです。

    4. connectionが最初のSETTINGSフレームを受信するまで待機し、settingsをそのフレームの辞書表現とする。

    5. settingsにSETTINGS_ENABLE_WEBTRANPORTが値1で含まれていない、またはH3_DATAGRAMが値1で含まれていない場合、残りの手順を中止し、ネットワークタスクをキューtransportで以下を実行:

      1. transport.[[State]]"closed"または"failed"なら中止。

      2. errorを新しく作成したWebTransportError とし、 source"session"とする。

      3. transportのクリーンアップerrorで実行する。

    6. WebTransportセッションを確立する。originprotocolsconnection上で用いる。

      注: この手順には[QUIC-DATAGRAM]で指定されたトランスポートパラメータ交換も含まれます。

    7. 前の手順が失敗した場合、残りの手順を中止し、ネットワークタスクをキューtransportで以下を実行:

      1. transport.[[State]]"closed"または"failed"なら中止。

      2. errorを新しく作成したWebTransportError とし、 source"session"とする。

      3. transportのクリーンアップerrorで実行する。

    8. sessionを確立されたWebTransportセッションとする。

    9. Assert: maxDatagramSizeは整数である。

    10. ネットワークタスクをキューtransportで以下の手順を実行:

      1. transport.[[State]]"connecting"でない場合:

        1. 並行してsessionを終了する。

        2. これらの手順を中止。

      2. transport.[[State]]"connected"に設定する。

      3. transport.[[Session]]sessionに設定する。

      4. transport.[[Protocol]] を、交渉されたアプリケーションプロトコルの文字列値(存在する場合。詳細は[WEB-TRANSPORT-OVERVIEW] Section 3.1参照)、なければ""に設定する。

      5. コネクションがHTTP/3接続の場合、transport.[[Reliability]]"supports-unreliable"に設定する。

      6. コネクションがHTTP/2接続[WEB-TRANSPORT-HTTP2]の場合、 transport[[Reliability]]"reliable-only"に設定する。

      7. transportの[[Ready]]をundefinedでresolveする。

双方向ストリームをプルするには、WebTransport オブジェクトtransportで以下の手順を実行する。
  1. transport.[[State]]"connecting"なら、transport.[[Ready]]fulfilled時に次の手順を実行した結果を返す:

    1. transportpullBidirectionalStreamを実行した結果を返す。

  2. transport.[[State]]"connected"でなければ、新しいrejected promise(InvalidStateError)を返す。

  3. sessiontransport.[[Session]]とする。

  4. pを新しいpromiseとする。

  5. 以下の手順を並行して実行:

    1. 利用可能な着信双方向ストリームが現れるまで待機する。

    2. internalStream双方向ストリームを受信するの結果とする。

    3. ネットワークタスクをキューtransportで以下の手順を実行:

      1. streamWebTransportBidirectionalStreamの作成の結果とし、 internalStreamtransportで初期化する。

      2. streamをエンキュー transport.[[IncomingBidirectionalStreams]] に追加。

      3. pをundefinedでresolveする。

  6. pを返す。

単方向ストリームをプルするには、WebTransport オブジェクトtransportで以下の手順を実行する。
  1. transport.[[State]]"connecting"なら、transport.[[Ready]]fulfilled時に次の手順を実行した結果を返す:

    1. transportpullUnidirectionalStreamを実行した結果を返す。

  2. transport.[[State]]"connected"でなければ、新しいrejected promise(InvalidStateError)を返す。

  3. sessiontransport.[[Session]]とする。

  4. pを新しいpromiseとする。

  5. 以下の手順を並行して実行:

    1. 利用可能な着信単方向ストリームが現れるまで待機する。

    2. internalStream着信単方向ストリームを受信するの結果とする。

    3. ネットワークタスクをキューtransportで以下の手順を実行:

      1. streamWebTransportReceiveStreamの作成の結果とし、 internalStreamtransportで初期化する。

      2. streamをエンキュー transport.[[IncomingUnidirectionalStreams]] に追加。

      3. pをundefinedでresolveする。

  6. pを返す。

6.3. 属性

ready, 型 Promise<undefined>、読み取り専用

取得時、this[[Ready]]を返す。

closed, 型 Promise<WebTransportCloseInfo>、読み取り専用

取得時、this[[Closed]]を返す。

draining, 型 Promise<undefined>、読み取り専用

取得時、this[[Draining]]を返す。

datagrams, WebTransportDatagramDuplexStream、読み取り専用

このセッション上でデータグラムの送受信を行うための単一のデュプレックスストリーム。 datagrams属性のゲッター手順は以下の通り:

  1. this[[Datagrams]]を返す。

incomingBidirectionalStreams, ReadableStream、読み取り専用

サーバーから受信したReadableStreamWebTransportBidirectionalStreamを返す。

注: 着信ストリームにすでにデータがあるかどうかはサーバーの挙動による。

incomingBidirectionalStreams属性のゲッター手順:

  1. this[[IncomingBidirectionalStreams]]を返す。

incomingUnidirectionalStreams, ReadableStream、読み取り専用

サーバーから受信した単方向ストリーム(各WebTransportReceiveStreamで表現)を含むReadableStream

注: 着信ストリームにすでにデータがあるかどうかはサーバーの挙動による。

incomingUnidirectionalStreamsのゲッター手順:

  1. this.[[IncomingUnidirectionalStreams]]を返す。

reliability, WebTransportReliabilityMode、読み取り専用

接続が非信頼性(UDP経由)転送をサポートするか、信頼性(TCPフォールバック)転送のみか。 接続確立までは"pending"を返す。 ゲッター手順はthis[[Reliability]]を返す。

congestionControl, WebTransportCongestionControl、読み取り専用

アプリケーションがコンストラクタでリクエストし、ユーザーエージェントが満たした場合のスループット最適化・低遅延最適化の輻輳制御アルゴリズムの希望。希望が満たされなかった場合は"default"となる。 ゲッター手順はthis[[CongestionControl]]を返す。

supportsReliableOnly, boolean、読み取り専用

ユーザーエージェントが排他的に信頼性のあるWebTransportセッションコネクション上でサポートする場合はtrue、そうでなければfalseを返す。

anticipatedConcurrentIncomingUnidirectionalStreams, unsigned short、null可能

アプリケーションがサーバーによる同時オープンを予想する受信単方向ストリームの数を指定できる。 nullでなければ、ユーザーエージェントは今後のラウンドトリップを減らすため、 [[AnticipatedConcurrentIncomingUnidirectionalStreams]] をサーバーとの交渉で考慮するべきである。

ゲッター手順はthis[[AnticipatedConcurrentIncomingUnidirectionalStreams]]を返す。

セッター手順(valueを与える)は、this[[AnticipatedConcurrentIncomingUnidirectionalStreams]]valueに設定する。

anticipatedConcurrentIncomingBidirectionalStreams, unsigned short、null可能

アプリケーションがサーバーによる同時オープンを予想する双方向ストリームの数を指定できる。 nullでなければ、ユーザーエージェントは今後のラウンドトリップを減らすため、 [[AnticipatedConcurrentIncomingBidirectionalStreams]] をサーバーとの交渉で考慮するべきである。

ゲッター手順はthis[[AnticipatedConcurrentIncomingBidirectionalStreams]]を返す。

セッター手順(valueを与える)は、this[[AnticipatedConcurrentIncomingBidirectionalStreams]]valueに設定する。

注: anticipatedConcurrentIncomingUnidirectionalStreamsanticipatedConcurrentIncomingBidirectionalStreams を設定しても、アプリケーションが予想したストリーム数が必ず受信できることは保証されません。

protocol, DOMString、読み取り専用

WebTransportセッションが確立され、 protocols コンストラクタオプションで非空配列が指定された場合、サーバーが選択したアプリケーションレベルのプロトコルがあればそれを返す。なければ空文字列。 ゲッター手順はthis[[Protocol]]を返す。

6.4. メソッド

close(closeInfo)

このWebTransportオブジェクトに関連付けられたWebTransportセッションを終了します。

closeが呼ばれた場合、ユーザーエージェントは以下の手順を実行しなければなりません:

  1. transportthisとする。

  2. transport.[[State]]"closed"または"failed"なら、これらの手順を中止。

  3. transport.[[State]]"connecting"の場合:

    1. errorを新しく作成したWebTransportError とし、 source"session"とする。

    2. transportのクリーンアップerrorで実行する。

    3. これらの手順を中止。

  4. sessiontransport.[[Session]]とする。

  5. codecloseInfo.closeCodeとする。

  6. reasonStringcloseInfo.reason最大コードユニットプレフィックスUTF-8エンコードしたプレフィックスの長さが1024を超えないもの)とする。

  7. reasonreasonStringUTF-8エンコードしたものとする。

  8. 並行してsessionを終了 sessioncodereasonを渡して実行する。

    注: これにより ストリームのリセットSTOP_SENDINGの送信transport.[[SendStreams]] および[[ReceiveStreams]] 内のWebTransportストリームに対して行われます。

  9. transportのクリーンアップAbortErrorcloseInfoで実行する。

getStats()

このWebTransport基盤となるコネクション の統計情報を収集し、結果を非同期で返します。

getStatsが呼ばれた場合、ユーザーエージェントは以下の手順を実行しなければなりません:

  1. transportthisとする。

  2. pを新しいpromiseとする。

  3. transport.[[State]]"failed"なら、pをInvalidStateErrorでrejectし、これらの手順を中止する。

  4. 以下の手順を並行して実行:

    1. transport.[[State]]"connecting"なら、状態が変わるまで待機する。

    2. transport.[[State]]"failed"なら、ネットワークタスクをキューtransportpをInvalidStateErrorでrejectし、これらの手順を中止する。

    3. transport.[[State]]"closed"なら、ネットワークタスクをキューtransportpをコネクションの最新の統計情報でresolveし、これらの手順を中止する。 統計情報の取得タイミングは実装定義

    4. 基盤となるコネクションから統計情報(データグラムも含む)を収集する。

    5. ネットワークタスクをキューtransportで以下の手順を実行:

      1. stats新しい WebTransportConnectionStats オブジェクトとして収集した統計情報を格納する。

      2. pをstatsでresolveする。

  5. pを返す。

exportKeyingMaterial(BufferSource label, optional BufferSource context)

このWebTransportTLS Keying Material Exporter からTLSセッションに一意に関連付けられた基盤となるコネクションの鍵素材をエクスポートします。

exportKeyingMaterialが呼ばれた場合、ユーザーエージェントは以下の手順を実行しなければなりません:

  1. transportthisとする。

  2. labelLengthlabelバイト長とする。

  3. labelLengthが255を超える場合、RangeErrorでrejectされたpromiseを返す。

  4. contextLengthを0とする。

  5. contextが与えられた場合、contextLengthcontextバイト長とする。

  6. contextLengthが255を超える場合、RangeErrorでrejectされたpromiseを返す。

  7. pを新しいpromiseとする。

  8. 以下の手順を並行して実行(ただしtransport[[State]]"closed"または"failed"になった時はネットワークタスクをキューtransportpをInvalidStateErrorでrejectする):

    1. keyingMaterialをTLS鍵素材のエクスポート結果とする( [WEB-TRANSPORT-HTTP3] Section 4.7参照)、 labelLengthlabelcontextLengthcontext(存在する場合)を使用する。

    2. ネットワークタスクをキューtransportpをkeyingMaterialでresolveする。

  9. pを返す。

createBidirectionalStream()

送信用双方向ストリームとしてWebTransportBidirectionalStream オブジェクトを生成します。ただしストリームの作成だけでは、相手側に即座に可視化されるわけではなく、データが送信されて初めて認識されます。

注: サーバーはデータ送信までストリームの存在を認識することは期待されません。

createBidirectionalStreamが呼ばれた場合、ユーザーエージェントは以下の手順を実行しなければなりません:

  1. transportthisとする。

  2. transport.[[State]]"closed"または"failed"なら、 新しいInvalidStateErrorでrejectされたpromiseを返す。

  3. sendGroupoptionssendGroupとする。

  4. sendOrderoptionssendOrderとする。

  5. waitUntilAvailableoptionswaitUntilAvailableとする。

  6. pを新しいpromiseとする。

  7. 以下の手順を並行して実行(ただしtransport[[State]]"closed"または"failed"になった時はネットワークタスクをキューtransportpをInvalidStateErrorでrejectする):

    1. streamIdtransport.[[Session]] 用に有効かつ一意な新しいストリームIDとする([QUIC] Section 19.11参照)。IDが即座に利用できない場合、waitUntilAvailableがtrueなら利用可能になるまで待つ。falseなら ネットワークタスクをキューtransportpをQuotaExceededErrorでrejectし、これらの手順を中止する。

    2. internalStream双方向ストリームの作成の結果とし transport.[[Session]]streamIdで初期化する。

    3. ネットワークタスクをキューtransportで以下の手順を実行:

      1. transport.[[State]]"closed"または"failed"なら、 pをInvalidStateErrorでrejectし、これらの手順を中止する。

      2. streamWebTransportBidirectionalStreamの作成の結果とし internalStreamtransportsendGroupsendOrderで初期化する。

      3. pをstreamでresolveする。

  8. pを返す。

createUnidirectionalStream()

送信用単方向ストリームとしてWebTransportSendStream を生成します。 ただしストリームの作成だけでは、サーバーに即座に可視化されるわけではなく、データが送信されて初めて認識されます。

注: サーバーはデータ送信までストリームの存在を認識することは期待されません。

createUnidirectionalStream()が呼ばれた場合、ユーザーエージェントは以下の手順を実行しなければなりません:

  1. transportthisとする。

  2. transport.[[State]]"closed"または"failed"なら、 新しいInvalidStateErrorでrejectされたpromiseを返す。

  3. sendGroupoptionssendGroupとする。

  4. sendOrderoptionssendOrderとする。

  5. waitUntilAvailableoptionswaitUntilAvailableとする。

  6. pを新しいpromiseとする。

  7. 以下の手順を並行して実行(ただしtransport[[State]]"closed"または"failed"になった時はネットワークタスクをキューtransportpをInvalidStateErrorでrejectする):

    1. streamIdtransport.[[Session]] 用に有効かつ一意な新しいストリームIDとする([QUIC] Section 19.11参照)。IDが即座に利用できない場合、waitUntilAvailableがtrueなら利用可能になるまで待つ。falseなら ネットワークタスクをキューtransportpをQuotaExceededErrorでrejectし、これらの手順を中止する。

    2. internalStream送信用単方向ストリームの作成の結果とし transport.[[Session]]streamIdで初期化する。

    3. ネットワークタスクをキューtransportで以下の手順を実行:

      1. transport.[[State]]"closed"または"failed"なら、 pをInvalidStateErrorでrejectし、これらの手順を中止する。

      2. streamWebTransportSendStreamの作成の結果とし internalStreamtransportsendGroupsendOrderで初期化する。

      3. pをstreamでresolveする。

  8. pを返す。

createSendGroup()

WebTransportSendGroup を生成します。

createSendGroup()が呼ばれた場合、ユーザーエージェントは以下の手順を実行しなければなりません:

  1. transportthisとする。

  2. transport.[[State]]"closed"または"failed"なら、 InvalidStateErrorをスローする。

  3. WebTransportSendGroupの作成の結果をtransportで返す。

6.5. 手順

cleanupは、WebTransport transporterror、オプションでcloseInfoを受け取り、以下の手順を実行します:
  1. sendStreamstransport.[[SendStreams]]のコピーとする。

  2. receiveStreamstransport.[[ReceiveStreams]]のコピーとする。

  3. outgoingDatagramWritablestransport.[[Datagrams]].[[Writables]]とする。

  4. incomingDatagramstransport.[[Datagrams]].[[Readable]]とする。

  5. readytransport.[[Ready]]とする。

  6. closedtransport.[[Closed]]とする。

  7. incomingBidirectionalStreamstransport.[[IncomingBidirectionalStreams]]とする。

  8. incomingUnidirectionalStreamstransport.[[IncomingUnidirectionalStreams]]とする。

  9. transport.[[SendStreams]] を空の集合に設定する。

  10. transport.[[ReceiveStreams]] を空の集合に設定する。

  11. transport.[[Datagrams]].[[OutgoingDatagramsQueue]] を空のキューに設定する。

  12. transport.[[Datagrams]].[[IncomingDatagramsQueue]] を空のキューに設定する。

  13. closeInfoが与えられた場合、transport.[[State]]"closed"に設定する。 それ以外の場合はtransport.[[State]]"failed"に設定する。

  14. sendStreamsの各streamについて以下を実行:

    1. stream.[[PendingOperation]] がnullでなければ、stream.[[PendingOperation]]errorでrejectする。

    2. streamをerrorでエラー化する。

  15. receiveStreamsの各streamについて、streamをerrorでエラー化する。

    注: スクリプトはPromise解決時に同期的にコードを挿入できるため、この時点からtransportに触れないこと。スクリプトによって予期せず変更される可能性があるため、この手順を呼び出すロジックにも適用される。

  16. closeInfoが与えられている場合:

    1. closedをcloseInfoでresolveする。

    2. readyはsettledであることを保証。

    3. incomingBidirectionalStreamsをcloseする。

    4. incomingUnidirectionalStreamsをcloseする。

    5. outgoingDatagramWritables内の各writableについてcloseする。

    6. incomingDatagramsをcloseする。

  17. それ以外の場合:

    1. closedをerrorでrejectする。

    2. closed.[[PromiseIsHandled]]をtrueに設定する。

    3. readyをerrorでrejectする。

    4. ready.[[PromiseIsHandled]]をtrueに設定する。

    5. incomingBidirectionalStreamsをerrorでエラー化する。

    6. incomingUnidirectionalStreamsをerrorでエラー化する。

    7. outgoingDatagramWritables内の各writableについてerrorでエラー化する。

    8. incomingDatagramsをerrorでエラー化する。

queue a network taskは、WebTransport transportと一連の手順stepsを受け取り、以下の手順を実行します:

  1. グローバルタスクをキューし、ネットワークタスクソースtransport関連グローバルオブジェクトを使い、stepsを実行する。

6.6. クライアントによって開始されていないセッション終了

WebTransportセッションが、WebTransport transportに関連付けられており、 オプションのcodereasonBytesとともに 終了された場合、以下の手順を実行する:
  1. ネットワークタスクをキューし、 transportで以下の手順を実行:

    1. transport.[[State]]"closed"または"failed"なら、これらの手順を中止する。

    2. errorを新しく作成したWebTransportErrorとし、 source"session"とする。

    3. closeInfo新しい WebTransportCloseInfoとする。

    4. codeが与えられていれば、closeInfocloseCodecodeに設定する。

    5. reasonBytesが与えられていれば、closeInforeasonreasonBytesUTF-8デコード結果を設定する。

      注: reasonBytesには言語や方向性メタデータは含まれません。 表示時の方向判定にはfirst-strongヒューリスティックが利用できます。

    6. transportのクリーンアップerrorcloseInfoで実行する。

WebTransport transport基盤となるコネクションがコネクションエラーとなった場合、以下の手順を実行する:
  1. ネットワークタスクをキューし、 transportで以下の手順を実行:

    1. transport.[[State]]"closed"または"failed"なら、これらの手順を中止する。

    2. errorを新しく作成したWebTransportErrorとし、 source"session"とする。

    3. transportのクリーンアップerrorで実行する。

6.7. コンテキストクリーンアップ手順

この仕様はコンテキストクリーンアップ手順を次の手順として定義する。WebTransport transportについて:

  1. transport.[[State]]"connected"なら:

    1. transport.[[State]]"failed"に設定する。

    2. 並行してtransport.[[Session]]を終了する。

    3. ネットワークタスクをキューし、 transportで以下の手順を実行:

      1. errorを新しく作成したWebTransportErrorとし、 source"session"とする。

      2. transportのクリーンアップerrorで実行する。

  2. transport.[[State]]"connecting"なら、transport.[[State]]"failed"に設定する。

    これはWorkerでも行う必要がある。詳細は #127 および whatwg/html#6731参照。

6.8. ガベージコレクション

WebTransport オブジェクトの[[State]]"connecting"の場合、 [[IncomingBidirectionalStreams]][[IncomingUnidirectionalStreams]]、 いずれかの WebTransportReceiveStream、 または[[Datagrams]].[[Readable]]ロックされている場合、またはreadydrainingclosed promise が監視されている場合はガベージコレクトされてはならない。

WebTransport オブジェクトの[[State]]"connected"の場合、 [[IncomingBidirectionalStreams]][[IncomingUnidirectionalStreams]]、 いずれかの WebTransportReceiveStream、 または[[Datagrams]].[[Readable]]ロックされている場合、またはdrainingclosed promiseが監視されている場合はガベージコレクトされてはならない。

WebTransport オブジェクトの[[State]]"draining"の場合、 [[IncomingBidirectionalStreams]][[IncomingUnidirectionalStreams]]、 いずれかの WebTransportReceiveStream、 または[[Datagrams]].[[Readable]]ロックされている場合、またはclosed promiseが監視されている場合はガベージコレクトされてはならない。

WebTransport オブジェクトで、確立されたWebTransportセッション があり、ネットワークへの送信待ちデータがキューされている場合([[Datagrams]].[[OutgoingDatagramsQueue]]など)、 ガベージコレクトされてはならない。

WebTransport オブジェクトがガベージコレクトされた時、基盤となるコネクション がまだ開いている場合、ユーザーエージェントは WebTransportセッションの終了 を、Application Error Code 0とApplication Error Message ""で行う必要がある。

6.9. 設定

dictionary WebTransportHash {
  DOMString algorithm;
  BufferSource value;
};

dictionary WebTransportOptions {
  boolean allowPooling = false;
  boolean requireUnreliable = false;
  sequence<WebTransportHash> serverCertificateHashes;
  WebTransportCongestionControl congestionControl = "default";
  [EnforceRange] unsigned short? anticipatedConcurrentIncomingUnidirectionalStreams = null;
  [EnforceRange] unsigned short? anticipatedConcurrentIncomingBidirectionalStreams = null;
  sequence<DOMString> protocols = [];
};

enum WebTransportCongestionControl {
  "default",
  "throughput",
  "low-latency",
};

WebTransportOptionsは、WebTransportセッションの確立および利用方法を決定するパラメータの辞書です。

allowPooling, boolean、デフォルトはfalse

trueの場合、WebTransportセッションはプール可能、すなわち 基盤となるコネクションが他のWebTransportセッションと共有可能です。

requireUnreliable, boolean、デフォルトはfalse

trueの場合、HTTP/3 コネクションが不可能な場合、HTTP/2 コネクションではWebTransportセッションを確立できません。

serverCertificateHashes, 型 sequence<WebTransportHash>

このオプションは専用コネクション利用時のみサポートされます。 この機能をサポートしないトランスポートプロトコルでは、このフィールドが空でない場合、NotSupportedError例外がスローされます。

サポートされていて非空の場合、ユーザーエージェントは、証明書ハッシュ検証serverCertificateHashes で成功し、カスタム証明書要件を満たす場合のみサーバー証明書を信頼します。未知のalgorithmを使うハッシュは無視します。 空の場合は、通常のfetch操作で使う証明書検証手順を使用します。

これはallowPoolingと併用できません。

congestionControl, WebTransportCongestionControl、デフォルトは"default"

このコネクション上で送信時にスループット優先または低遅延優先の輻輳制御アルゴリズムを利用したいアプリケーションの希望を任意で指定します。これはユーザーエージェントへのヒントです。

この設定項目は、低遅延最適化の輻輳制御アルゴリズムが現時点のブラウザに実装されていないため、リスクのある機能と見なされています。

anticipatedConcurrentIncomingUnidirectionalStreams, unsigned short、null可能、デフォルトはnull

サーバーが同時に作成すると予想される着信単方向ストリーム数をアプリケーションが任意で指定できます。 ユーザーエージェントは初期状態でサーバーから少なくとも100本の着信単方向ストリームを許可する必要があります。 nullでなければ、ユーザーエージェントは今後のラウンドトリップ削減のため、[[AnticipatedConcurrentIncomingUnidirectionalStreams]] をサーバーとの交渉で考慮するべきです。

anticipatedConcurrentIncomingBidirectionalStreams, unsigned short、null可能、デフォルトはnull

サーバーが同時に作成すると予想される双方向ストリーム数をアプリケーションが任意で指定できます。 ユーザーエージェントは初期状態でサーバーが少なくとも100本の双方向ストリームを作成できるようにする必要があります。 nullでなければ、ユーザーエージェントはラウンドトリップ削減のため、[[AnticipatedConcurrentIncomingBidirectionalStreams]] をサーバーとの交渉で考慮するべきです。

protocols, 型 sequence<DOMString>、デフォルトは[]

アプリケーションレベルのプロトコル名の配列を任意で指定できます。サーバーが希望するアプリケーションプロトコルを選択し、クライアントに通知することは任意です。 適切なプロトコルが提供されていない場合、サーバーはリクエストを拒否することがあります。

証明書ハッシュの計算は、certificateを受け取り、以下の手順を実行します:
  1. certcertificateとし、[RFC5280]で定義されるCertificateメッセージのDERエンコーディングで表現します。

  2. certのSHA-256ハッシュを計算し、その値を返します。

証明書ハッシュの検証は、certificateとハッシュ配列hashesを受け取り、以下の手順を実行します:
  1. referenceHashcertificate証明書ハッシュの計算した結果とする。

  2. すべてのhashhashes内)について:

    1. hash.value がnullでなく、hash.algorithm が"sha-256"とASCII大文字小文字区別しない一致の場合:

      1. hashValuehash.value が表すバイト列とする。

      2. hashValuereferenceHashと等しければtrueを返す。

  3. falseを返す。

カスタム証明書要件は以下の通り:証明書は[RFC5280]で定義されるX.509v3証明書でなければならず、Subject Public Keyの鍵は許可された公開鍵アルゴリズムのいずれかでなければならず、現在時刻は[RFC5280]のSection 4.1.2.5で定義される有効期限の範囲内でなければならず、有効期間の合計長は2週間を超えてはならない。ユーザーエージェントは追加の実装定義要件を課すことができます。

許可された公開鍵アルゴリズムのリストは実装定義ですが、相互運用性のためにNIST P-256(secp256r1)を使うECDSA([RFC3279]、Section 2.3.5; [RFC8422])は必須です。RSA鍵([RFC3279]、Section 2.3.1)は含めてはなりません。

6.10. WebTransportCloseInfo辞書

WebTransportCloseInfo辞書は、WebTransport の切断時のエラーコードに関する情報を含みます。 この情報はCONNECTION_CLOSEフレームのエラーコードと理由を設定する際に使われます。

dictionary WebTransportCloseInfo {
  unsigned long closeCode = 0;
  USVString reason = "";
};

この辞書は次の属性を持ちます:

closeCode, unsigned long、デフォルトは0

相手に通知されるエラーコードです。

reason, USVString、デフォルトは""

WebTransport を切断する理由です。

6.11. WebTransportSendOptions辞書

WebTransportSendOptionsは、 createUnidirectionalStreamcreateBidirectionalStreamcreateWritable の振る舞いに影響を与える基本パラメータの辞書です。

dictionary WebTransportSendOptions {
  WebTransportSendGroup? sendGroup = null;
  long long sendOrder = 0;
};

この辞書は次の属性を持ちます:

sendGroup, WebTransportSendGroup、null可能、デフォルトはnull

作成されたストリームをグループ化するための任意のWebTransportSendGroup、またはnull。

sendOrder, long long、デフォルトは0

送信順序番号。指定すると作成されたストリームは厳密な順序付けに参加します。 現在厳密順序ストリームにキューされたバイトは、より小さい送信順序番号で作成された他の厳密順序ストリームにキューされたバイトよりも先に送信されます。

送信順序番号が指定されていない場合、他のストリームとの相対的な送信順は実装定義です。ただし、ユーザーエージェントは、低い順序番号で飢餓状態になっていない限り、すべてのストリーム間で帯域を公平に分配することが強く推奨されます。

注: これは送信側のデータ優先制御であり、受信順序を保証するものではありません。

6.12. WebTransportSendStreamOptions辞書

WebTransportSendStreamOptionsは、 WebTransportSendStreamの パラメータ辞書であり、 createUnidirectionalStream および createBidirectionalStream で生成されたストリームの振る舞いに影響します。

dictionary WebTransportSendStreamOptions : WebTransportSendOptions {
  boolean waitUntilAvailable = false;
};

この辞書は次の属性を持ちます:

waitUntilAvailable, boolean、デフォルトはfalse

trueの場合、 createUnidirectionalStreamcreateBidirectionalStream の呼び出しで返されるPromiseは、 settled されるまで、基盤となるコネクションがストリーム生成に十分なフロー制御クレジットを持つか あるいはコネクションが新たな送信ストリームを生成できない状態になるまで待機します。falseの場合、呼び出し時にフロー制御ウィンドウがなければPromiseは rejectedされます。

6.13. WebTransportConnectionStats辞書

WebTransportConnectionStats辞書は、 WebTransportセッション基盤となるコネクションに関するWebTransport固有の統計情報を含みます。

注: プールが利用される場合、同一WebTransportセッションが同じコネクション上にプールされている場合、すべて同じ情報を受け取ります。つまり、同じネットワークパーティションキーに属するプールされたセッション間で情報が公開されます。

注: 利用不可な統計項目はWebTransportConnectionStats辞書から欠落します。

dictionary WebTransportConnectionStats {
  unsigned long long bytesSent = 0;
  unsigned long long packetsSent = 0;
  unsigned long long bytesLost = 0;
  unsigned long long packetsLost = 0;
  unsigned long long bytesReceived = 0;
  unsigned long long packetsReceived = 0;
  required DOMHighResTimeStamp smoothedRtt;
  required DOMHighResTimeStamp rttVariation;
  required DOMHighResTimeStamp minRtt;
  required WebTransportDatagramStats datagrams;
  unsigned long long? estimatedSendRate = null;
  boolean atSendCapacity = false;
};

この辞書は次の属性を持ちます:

bytesSent, unsigned long long、デフォルトは0

基盤となるコネクション上で送信されたバイト数(再送分も含む)。UDPやその他の外部フレーミングは含みません。

packetsSent, unsigned long long、デフォルトは0

基盤となるコネクション上で送信されたパケット数(ロストと判定されたものも含む)。

bytesLost, unsigned long long、デフォルトは0

基盤となるコネクション上でロストしたバイト数(単調増加ではない。ロストとされたパケットが後で受信されることもある)。UDPや外部フレーミングは含みません。

packetsLost, unsigned long long、デフォルトは 0

基盤となるコネクション上でロストしたパケット数(単調増加ではない。ロストとされたパケットが後で受信されることもある)。

bytesReceived, unsigned long long、デフォルトは 0

基盤となるコネクション上で受信したバイト数(ストリーム重複データも含む)。UDPや外部フレーミングは含みません。

packetsReceived, unsigned long long、デフォルトは 0

基盤となるコネクション上で受信したパケット数(処理不能パケットも含む)。

smoothedRtt, DOMHighResTimeStamp

コネクション上で現在観測されているスムーズなRTT(往復遅延時間)。定義は[RFC9002] Section 5.3参照。

rttVariation, DOMHighResTimeStamp

コネクション上で現在観測されているRTTサンプルの平均変動。定義は[RFC9002] Section 5.3参照。

minRtt, DOMHighResTimeStamp

コネクション全体で観測された最小RTT。

estimatedSendRate, unsigned long long、null可能、デフォルトは null

ユーザーエージェントがキューしたデータを送信する推定速度(bps)。この値は同じWebTransportセッション内の全ストリーム・データグラムに適用され、 (congestionControlで選択された可能性のある)輻輳制御アルゴリズムにより算出されます。フレーミングオーバーヘッドは除外され、アプリケーションペイロード送信速度を示します。現在推定値がなければnullとします。前回はnullでなかった場合でもnullになることがあります。

atSendCapacity, boolean、デフォルトはfalse

falseの場合、estimatedSendRate がアプリケーション制限となり、アプリケーションが輻輳制御で許容されるよりも明らかに少ないデータしか送信していないことを意味します。輻輳制御がアプリケーション制限時は、利用可能なネットワーク容量の推定値が不正確になる可能性があります。

trueの場合、アプリケーションはネットワーク容量一杯で送信しており、estimatedSendRate はアプリケーションの利用可能なネットワーク容量を反映します。

atSendCapacitytrueの時、estimatedSendRate は上限値となります。 アプリケーション送信速度が維持される限り、estimatedSendRate はネットワーク状況に応じて適応します。ただし、estimatedSendRatetrueでもnullになり得ます。

6.14. WebTransportDatagramStats辞書

WebTransportDatagramStats辞書は、 基盤となるコネクション上でのデータグラム送受信に関する統計情報を含みます。

dictionary WebTransportDatagramStats {
  unsigned long long droppedIncoming = 0;
  unsigned long long expiredIncoming = 0;
  unsigned long long expiredOutgoing = 0;
  unsigned long long lostOutgoing = 0;
};

この辞書は次の属性を持ちます:

droppedIncoming, unsigned long long、デフォルトは0

アプリケーションがdatagramsreadable から読み取る前に、新しいデータグラムにより受信キューがオーバーフローし、破棄された着信データグラムの数。

expiredIncoming, unsigned long long、デフォルトは0

incomingMaxAge より古くなり、datagramsreadable から読み取られる前に破棄された着信データグラムの数。

expiredOutgoing, unsigned long long、デフォルトは0

送信待ちキューに入っていたデータグラムが、outgoingMaxAge より古くなり、送信される前に破棄された数。

lostOutgoing, unsigned long long、デフォルトは0

送信されたデータグラムで、[RFC9002] Section 6.1で定義される「ロスト」と判定された数。

7. インターフェイス WebTransportSendStream

WebTransportSendStream は、WritableStream であり、送信単方向または双方向 WebTransport ストリーム の送信ストリーミング機能を提供します。

これは、WritableStreamUint8Array であり、サーバーへデータを送信するために書き込むことができます。

[Exposed=(Window,Worker), SecureContext, Transferable]
interface WebTransportSendStream : WritableStream {
  attribute WebTransportSendGroup? sendGroup;
  attribute long long sendOrder;
  Promise<WebTransportSendStreamStats> getStats();
  WebTransportWriter getWriter();
};

WebTransportSendStream は必ずcreate手続きによって作成されます。

WebTransportSendStream転送ステップおよび 転送受信ステップWritableStreamのものです。

7.1. 属性

sendGroup, WebTransportSendGroup、nullable

getter手順:

  1. this[[SendGroup]]を返す。

setter手順(valueを与えられたとき):

  1. valueがnullでなく、かつ value.[[Transport]]this.[[Transport]] でない場合、 InvalidStateErrorInvalidStateErrorとしてスローする。

  2. this.[[SendGroup]]valueを設定する。

sendOrder, long long

getter手順:

  1. this[[SendOrder]]を返す。

setter手順(valueを与えられたとき):

  1. this.[[SendOrder]]valueを設定する。

7.2. メソッド

getStats()

このWebTransportSendStreamの パフォーマンスに関する統計情報を収集し、結果を非同期で報告します。

getStatsが呼び出されたとき、ユーザーエージェントは以下の手順を実行しなければなりません:

  1. 新しいpromisepを作成する。

  2. 以下の手順を並行して実行する:

    1. このWebTransportSendStreamに 特有の統計情報を収集する。

    2. 統計情報が準備できるまで待機する。

    3. ネットワークタスクをキューに入れるtransport)を実行し、以下の手順を行う:

      1. 収集した統計情報を表すnew WebTransportSendStreamStats オブジェクトとしてstatsを作成する。

      2. Resolve pstatsで解決する。

  3. pを返す。

getWriter()

このメソッドは、getWriterWritableStream から継承)と同様に実装されなければならないが、 WritableStreamDefaultWriter の代わりに、 WebTransportWriterWebTransportWriter としてthisに対して生成する必要がある。

7.3. 内部スロット

WebTransportSendStream は以下の内部スロットを持ちます。

内部スロット 説明 (非規範的)
[[InternalStream]] 送信単方向または双方向 WebTransport ストリーム
[[PendingOperation]] 保留中の書き込みまたはクローズ操作を表すpromise、またはnull。
[[Transport]] WebTransport がこのWebTransportSendStreamを所有する。
[[SendGroup]] オプションのWebTransportSendGroup、 またはnull。
[[SendOrder]] オプションの送信順序番号。デフォルトは0。
[[AtomicWriteRequests]] 順序付きセット のpromiseであり、基礎となるsinkで処理待ちのうち原子的な書き込みリクエストの部分集合を管理する。
[[BytesWritten]] ストリームに書き込まれたバイト数。
[[CommittedOffset]] ストリーム内のオフセットであり、 リセット時もピアに配信されるバイト数を記録する。 詳細は[RELIABLE-RESET]を参照。

7.4. 手続き

create により、 WebTransportSendStream を、送信単方向または双方向WebTransport ストリーム internalStreamWebTransport transportsendGroupsendOrderで生成するには、以下の手順を実行する:

  1. streamnew WebTransportSendStream として以下のプロパティで作成:

    [[InternalStream]]

    internalStream

    [[PendingOperation]]

    null

    [[Transport]]

    transport

    [[SendGroup]]

    sendGroup

    [[SendOrder]]

    sendOrder

    [[AtomicWriteRequests]]

    空の順序付きセット(promise)。

    [[BytesWritten]]

    0

    [[CommittedOffset]]

    0

  2. writeAlgorithmを、chunkを与えられた時にstream書き込むアクションとして定義。

  3. closeAlgorithmを、stream閉じるアクションとして定義。

  4. abortAlgorithmを、reasonを与えられた時にstream中止するアクションとして定義。

  5. streamのセットアップを行い、 writeAlgorithmwriteAlgorithmに、 closeAlgorithmcloseAlgorithmに、 abortAlgorithmabortAlgorithmに設定する。

  6. abortSignalstreamの[[controller]].[[abortController]].[[signal]]とする。

  7. abortSignalに次のステップを追加

    1. pendingOperationstream.[[PendingOperation]]とする。

    2. pendingOperationがnullなら、これらのステップを中止。

    3. stream.[[PendingOperation]] をnullに設定。

    4. reasonabortSignal中止理由とする。

    5. streamの中止reason)の結果をpromiseとする。

    6. promiseがFulfilledになった時、 pendingOperationをreasonでrejectする。

  8. streamtransport.[[SendStreams]]追加

  9. streamを返す。

WebTransportSendStream streamchunkを書き込むには、以下の手順を実行する:
  1. transportstream.[[Transport]]とする。

  2. chunkBufferSourceでない場合、 TypeErrorでrejectされたpromiseを返す。

  3. promiseを新しいpromiseとする。

  4. byteschunkが表すバイト列のコピーとする。

  5. stream.[[PendingOperation]]promiseに設定。

  6. inFlightWriteRequeststream.inFlightWriteRequestとする。

  7. atomicを、stream.[[AtomicWriteRequests]]inFlightWriteRequestが含まれていればtrue、そうでなければfalseとする。

  8. 以下の手順を並行して実行:

    1. atomicがtrueで、現在のフロー制御ウィンドウがbytesの全送信に対して小さすぎる場合、残りのステップを中止し、ネットワークタスクtransportでキューし、次のサブステップを実行:

      1. stream.[[PendingOperation]]をnullにする。

      2. 全ての原子的書き込みリクエストを中止(stream)。

    2. そうでない場合、bytesを送信 stream.[[InternalStream]] で送信し、操作完了まで待機。 この送信は、既にキューされたストリームやデータグラム、今後キューされるストリームやデータグラムの送信とインターリーブされる場合がある。

      ユーザーエージェントは転送性能向上のためにバッファを持つことができる。このバッファは固定上限を持つべきであり、ユーザーにバックプレッシャー情報を伝達する。

      この送信は、同じ[[SendGroup]]かつ より高い[[SendOrder]]を持ち、 エラー状態でなく、フロー制御でブロックされていない全てのストリームの送信バイトが送信されるまで スターべーションする必要がある。

      stream.[[SendOrder]]並行して参照できる。 ユーザーエージェントは送信中にこれらの値のライブ更新へ応答すべきだが、 詳細は実装定義である。

      注: 再送信の順序は 実装定義だが、 ユーザーエージェントはより高い[[SendOrder]]値のデータ再送信を優先することが推奨される。

      他の理由でスターべーションしてはならない。例外はフロー制御またはエラー

      ユーザーエージェントはスターべーションしていない全てのストリーム間で帯域を公平に分配すべき。

      注: ここでの公平性の定義は実装定義

    3. 前ステップがネットワークエラーで失敗したら、残りのステップを中止。

      注: promiseをここでrejectしない。なぜならネットワークエラーは他のステップで処理され、そこでstream.[[PendingOperation]]がrejectされる。

    4. そうでない場合、ネットワークタスクtransportでキューし、次のステップを実行:

      1. stream.[[PendingOperation]]をnullにする。

      2. bytesの長さをstream.[[BytesWritten]]に加算。

      3. もしstream.[[AtomicWriteRequests]] にinFlightWriteRequestが含まれていればinFlightWriteRequestを削除

      4. promiseをundefinedで解決

  9. promiseを返す。

注: このアルゴリズム(またはwrite(chunk)) から返されるpromiseがFulfilledになっても、そのchunkがサーバー側でackされたことを意味しない。 バッファに追加されたのみかもしれない。chunkがサーバーに到達したことを確認したい場合は、サーバーがアプリケーションレベルのackメッセージを送信する必要がある。

WebTransportSendStream streamを閉じるには、以下の手順を実行する:
  1. transportstream.[[Transport]]とする。

  2. promiseを新しいpromiseとする。

  3. streamtransport.[[SendStreams]]から削除

  4. stream.[[PendingOperation]]promiseに設定。

  5. 以下の手順を並行して実行:

    1. FINを送信 stream.[[InternalStream]] で送信し、完了まで待機。

    2. stream.[[InternalStream]] が「全データコミット済み」状態になるまで待機する。[QUIC]

    3. ネットワークタスクtransportでキューし、次のステップを実行:

      1. stream.[[PendingOperation]] をnullにする。

      2. promiseをundefinedで解決

  6. promiseを返す。

WebTransportSendStream streamreasonで中止するには、以下の手順を実行する:
  1. transportstream.[[Transport]]とする。

  2. promiseを新しいpromiseとする。

  3. codeを0とする。

  4. streamtransport.[[SendStreams]]から削除

  5. reasonWebTransportError かつ reason.[[StreamErrorCode]] がnullでない場合、codereason.[[StreamErrorCode]]に設定。

  6. code < 0 の場合、codeを0に設定。

  7. code > 4294967295 の場合、codeを4294967295に設定。

  8. committedOffsetstream.[[CommittedOffset]]とする。

    注: codeの有効値は0~4294967295。 下層接続がHTTP/3の場合、codeは[0x52e4a40fa8db, 0x52e5ac983162]の値にエンコードされる。 詳細は[WEB-TRANSPORT-HTTP3]参照。

  9. 以下の手順を並行して実行:

    1. Reset stream.[[InternalStream]]codecommittedOffsetでリセット。

    2. ネットワークタスクtransportでキューし、 promiseをundefinedで解決

  10. promiseを返す。

WebTransportSendStream streamの全ての原子的書き込みリクエストを中止するには、以下の手順を実行する:
  1. writeRequestsstream.writeRequestsとする。

  2. requestsToAbortstream.[[AtomicWriteRequests]]とする。

  3. もしwriteRequestsrequestsToAbortに含まれないpromiseを含む場合、 AbortErrorでstreamをエラーにし、 これらのステップを中止。

  4. stream.[[AtomicWriteRequests]]を空にする。

  5. requestsToAbortの各promiseに対し、 AbortErrorでrejectする。

  6. 並行してrequestsToAbortの各promiseに対し、 対応するバイト送信を中止する。

7.5. サーバーからのSTOP_SENDINGシグナル

WebTransport ストリームが、関連するWebTransportSendStream streamに対してサーバーから STOP_SENDINGシグナルを受信した場合、次の手順を実行する:
  1. transportstream.[[Transport]]とする。

  2. codeをSTOP_SENDINGフレームに付随するアプリケーションプロトコルエラーコードとする。[QUIC]

    注: codeの有効値は0~4294967295。 下層接続がHTTP/3の場合、codeは[0x52e4a40fa8db, 0x52e5ac983162]の範囲でエンコードされる。 詳細は[WEB-TRANSPORT-HTTP3]参照。

  3. ネットワークタスクをキューtransport)し、以下の手順を実行:

    1. もしtransport.[[State]]"closed" または "failed" なら、これらのステップを中止。

    2. streamtransport.[[SendStreams]]から削除

    3. errorを新たに生成したWebTransportError とし、 source"stream"streamErrorCodecodeとする。

    4. もしstream.[[PendingOperation]] がnullでなければ、stream.[[PendingOperation]]errorでrejectする。

    5. streamをerror状態にerror)。

7.6. WebTransportSendStreamStats辞書

WebTransportSendStreamStats辞書には、 1つのWebTransportSendStream に特有の統計情報が含まれます。

dictionary WebTransportSendStreamStats {
  unsigned long long bytesWritten = 0;
  unsigned long long bytesSent = 0;
  unsigned long long bytesAcknowledged = 0;
};

この辞書は以下の属性を持ちます:

bytesWritten, unsigned long long、デフォルト値0

アプリケーションがこのWebTransportSendStream に正常に書き込んだバイト数の合計。この値は増加のみする。

bytesSent, unsigned long long、デフォルト値0

このWebTransportSendStream に書き込まれたアプリケーションバイトのうち、少なくとも一度送信されたバイト数の進捗指標。この値は増加のみし、常にbytesWritten以下。

注: これは単一ストリーム上のアプリデータ送信のみの進捗であり、ネットワークオーバーヘッドは含まない。

bytesAcknowledged, unsigned long long、デフォルト値0

このWebTransportSendStream に書き込まれたアプリケーションバイトのうち、QUICのACKメカニズムでサーバーに受信を認められたバイト数の進捗指標。最初の非ackバイトを除くまでの連続バイトのみカウントされる。この値は増加のみし、常にbytesSent以下。

注: HTTP/2接続時はこの値はbytesSent と一致する。

8. インターフェイス WebTransportSendGroup

WebTransportSendGroup は多数の個別(通常は厳密順序WebTransportSendStream にまたがるデータ転送を追跡するためのオプションの管理オブジェクトです。

WebTransportSendStream は、生成時またはsendGroup属性の割り当てによって、最大1つのWebTransportSendGroupグループ化されることができます。デフォルトでは非グループ化です。

ユーザーエージェントは、WebTransportSendGroup 間の帯域分配を平等に扱います。 各WebTransportSendGroupsendOrder 番号評価の独立した数値空間も確立します。

[Exposed=(Window,Worker), SecureContext]
interface WebTransportSendGroup {
  Promise<WebTransportSendStreamStats> getStats();
};

WebTransportSendGroup は必ずcreate手続きによって作成されます。

8.1. メソッド

getStats()

thisのsendGroupにグループ化された全てのWebTransportSendStream の統計情報を集約し、結果を非同期で報告します。

getStatsが呼ばれたとき、ユーザーエージェントは以下の手順を実行:

  1. pを新しいpromiseとする。

  2. streamsWebTransportSendStream のうち[[SendGroup]]thisであるもの全てとする。

  3. 以下の手順を並行して実行:

    1. streams内の全ストリームから統計情報を収集。

    2. ネットワークタスクをキューし、 transportで次の手順を実行:

      1. 収集した統計情報の合計値を表すnew WebTransportSendStreamStats オブジェクトstatsを作成。

      2. pをstatsで解決

  4. pを返す。

8.2. 内部スロット

WebTransportSendGroup は以下の内部スロットを持ちます。

内部スロット 説明 (非規範的)
[[Transport]] WebTransport オブジェクトがこのWebTransportSendGroupを所有する。

8.3. 手続き

create により、 WebTransportSendGroupWebTransport transportで生成するには、以下の手順を実行する:

  1. sendGroupnew WebTransportSendGroup とし、以下のプロパティで作成:

    [[Transport]]

    transport

  2. sendGroupを返す。

9. インターフェイス WebTransportReceiveStream

WebTransportReceiveStream は、ReadableStream であり、 受信単方向または双方向 WebTransport ストリーム の受信ストリーミング機能を提供します。

これは、ReadableStreamUint8Array であり、サーバーから受信したデータを読み出すことができます。 WebTransportReceiveStreamReadable byte streamであり、 そのため、利用者はBYOBリーダーデフォルトリーダーを利用できます。

[Exposed=(Window,Worker), SecureContext, Transferable]
interface WebTransportReceiveStream : ReadableStream {
  Promise<WebTransportReceiveStreamStats> getStats();
};

WebTransportReceiveStream は必ずcreate手続きによって作成されます。

WebTransportReceiveStream転送ステップおよび 転送受信ステップReadableStreamのものです。

9.1. メソッド

getStats()

このWebTransportReceiveStreamの パフォーマンスに関する統計情報を収集し、結果を非同期で報告します。

getStatsが呼び出されたとき、ユーザーエージェントは以下の手順を実行します:

  1. 新しいpromisepを作成する。

  2. 以下の手順を並行して実行する:

    1. このWebTransportReceiveStream に特有の統計情報を収集する。

    2. ネットワークタスクをキューtransport)し、以下の手順を実行:

      1. 収集した統計情報を表すnew WebTransportReceiveStreamStats オブジェクトstatsを作成。

      2. pをstatsで解決

  3. pを返す。

9.2. 内部スロット

WebTransportReceiveStream は以下の内部スロットを持ちます。

内部スロット 説明 (非規範的)
[[InternalStream]] 受信単方向または双方向 WebTransport ストリーム
[[Transport]] WebTransport オブジェクトがこのWebTransportReceiveStreamを所有する。

9.3. 手続き

create により、 WebTransportReceiveStream を、受信単方向または双方向WebTransport ストリーム internalStreamWebTransport transportで生成するには、以下の手順を実行する:

  1. streamnew WebTransportReceiveStream として以下のプロパティで作成:

    [[InternalStream]]

    internalStream

    [[Transport]]

    transport

  2. pullAlgorithmを、streamからバイトを取り出すアクションとして定義。

  3. cancelAlgorithmを、reasonstreamキャンセルするアクションとして定義。

  4. バイト読み出し対応でセットアップ streamに対し、 pullAlgorithmpullAlgorithmに、 cancelAlgorithmcancelAlgorithmに設定する。

  5. streamtransport.[[ReceiveStreams]]追加

  6. streamを返す。

バイトを取り出すWebTransportReceiveStream streamから実行するには、以下の手順を行う。

  1. transportstream.[[Transport]]とする。

  2. internalStreamstream.[[InternalStream]]とする。

  3. promiseを新しいpromiseとする。

  4. bufferoffsetmaxBytesをnullとする。

  5. もしstreamcurrent BYOB request viewがnullでなければ:

    1. offsetstreamcurrent BYOB request view.[[ByteOffset]]に設定。

    2. maxBytesstreamcurrent BYOB request viewbyte lengthに設定。

    3. bufferstreamcurrent BYOB request viewunderlying bufferに設定。

  6. そうでない場合:

    1. offsetを0に設定。

    2. maxBytes実装定義のサイズに設定。

    3. buffernew ArrayBuffermaxBytesサイズ)に設定。ArrayBuffer の割り当てに失敗したら、RangeErrorでrejectされたpromiseを返す。

  7. 以下の手順を並行して実行:

    1. バイトを書き込みinternalStreamから読み取った バイトをbufferoffsetから最大maxBytes分書き込み。最低1バイト読み取るかFIN受信まで待機。readを読んだバイト数、hasReceivedFINをFINの有無とする。

      ユーザーエージェントは転送性能向上のためバッファを持つことができる。このバッファは固定上限を持つべきであり、サーバー側のバックプレッシャー情報を伝える。

      注: この操作はbuffer全体を埋める前に返ることがある。

    2. 前ステップが失敗したら、残りのステップを中止。

      注: promiseはここでrejectしない。ネットワークエラーは他のステップで処理され、そこでstreamがエラー状態になりpull待ちのreadリクエストpromiseがrejectされる。

    3. ネットワークタスクをキューtransport)し、以下の手順を実行:

      注: 上記バッファが本手続きの走るevent loopで利用可能なら、以下のステップは即座に実行される場合がある。

      1. もしread > 0なら:

        1. viewを新しいUint8Arraybufferoffsetread)に設定。

        2. viewをstreamにenqueue

      2. hasReceivedFINがtrueなら:

        1. streamtransport.[[ReceiveStreams]]から削除

        2. streamをclose

      3. promiseをundefinedで解決

  8. promiseを返す。

cancel によりWebTransportReceiveStream streamreasonでキャンセルするには、以下の手順を行う。

  1. transportstream.[[Transport]]とする。

  2. internalStreamstream.[[InternalStream]]とする。

  3. promiseを新しいpromiseとする。

  4. codeを0とする。

  5. もしreasonWebTransportError かつ reason.[[StreamErrorCode]] がnullでなければ、codereason.[[StreamErrorCode]]に設定。

  6. code < 0 ならcodeを0に設定。

  7. code > 4294967295 ならcodeを4294967295に設定。

    注: codeの有効値は0~4294967295。 下層接続がHTTP/3の場合、codeは[0x52e4a40fa8db, 0x52e5ac983162]の範囲でエンコードされる。 詳細は[WEB-TRANSPORT-HTTP3]参照。

  8. streamtransport.[[SendStreams]]から削除

  9. 以下の手順を並行して実行:

    1. internalStreamにSTOP_SENDINGをcode付きで送信

    2. ネットワークタスクをキューtransport)し、以下の手順を実行:

      注: 上記バッファが本手続きの走るevent loopで利用可能なら、以下のステップは即座に実行される場合がある。

      1. streamtransport.[[ReceiveStreams]]から削除

      2. promiseをundefinedで解決

  10. promiseを返す。

9.4. サーバーからのResetシグナル

WebTransport ストリームが、関連するWebTransportReceiveStream streamに対してサーバーから RESET_STREAMシグナルを受信した場合、次の手順を実行する:
  1. transportstream.[[Transport]]とする。

  2. codeをRESET_STREAM_ATまたはWT_RESET_STREAMフレームに付随するアプリケーションプロトコルエラーコードとする。 [RELIABLE-RESET] [WEB-TRANSPORT-HTTP2]

    注: codeの有効値は0~4294967295。 下層接続がHTTP/3の場合、codeは[0x52e4a40fa8db, 0x52e5ac983162]の範囲でエンコードされる。 詳細は[WEB-TRANSPORT-HTTP3]参照。

  3. ネットワークタスクをキューtransport)し、以下の手順を実行:

    1. もしtransport.[[State]]"closed" または "failed" なら、これらのステップを中止。

    2. streamtransport.[[ReceiveStreams]]から削除

    3. errorを新たに生成したWebTransportError とし、 source"stream"streamErrorCodecodeとする。

    4. streamをerror状態にerror)。

9.5. WebTransportReceiveStreamStats辞書

WebTransportReceiveStreamStats辞書には、 1つのWebTransportReceiveStream に特有の統計情報が含まれます。

dictionary WebTransportReceiveStreamStats {
  unsigned long long bytesReceived = 0;
  unsigned long long bytesRead = 0;
};

この辞書は以下の属性を持ちます:

bytesReceived, unsigned long long、デフォルト値0

サーバーアプリケーションがこのWebTransportReceiveStream に送信することを意図したバイトのうち、これまで受信した分の進捗指標。最初の欠損バイトを除くまでの連続バイトのみカウントされる。この値は増加のみする。

注: これは単一ストリーム上のアプリデータ受信のみの進捗であり、ネットワークオーバーヘッドは含まない。

bytesRead, unsigned long long、デフォルト値0

アプリケーションがこのWebTransportReceiveStream から正常に読み取ったバイト数の合計。この値は増加のみし、常にbytesReceived以下。

10. インターフェイス WebTransportBidirectionalStream

[Exposed=(Window,Worker), SecureContext]
interface WebTransportBidirectionalStream {
  readonly attribute WebTransportReceiveStream readable;
  readonly attribute WebTransportSendStream writable;
};

10.1. 内部スロット

WebTransportBidirectionalStream は以下の内部スロットを持ちます。

内部スロット 説明 (非規範的)
[[Readable]] WebTransportReceiveStream
[[Writable]] WebTransportSendStream
[[Transport]] WebTransport オブジェクトがこの WebTransportBidirectionalStreamを所有する。

10.2. 属性

readable, WebTransportReceiveStream, 読み取り専用

getter手順は、this[[Readable]]を返すこと。

writable, WebTransportSendStream, 読み取り専用

getter手順は、this[[Writable]]を返すこと。

10.3. 手続き

create によりWebTransportBidirectionalStream双方向 WebTransport ストリーム internalStreamWebTransport オブジェクトtransportsendOrderで生成するには以下の手順:
  1. readableWebTransportReceiveStreamの生成internalStream, transport)の結果とする。

  2. writableWebTransportSendStreamの生成internalStream, transport, sendOrder)の結果とする。

  3. streamnew WebTransportBidirectionalStream として以下のプロパティで作成:

    [[Readable]]

    readable

    [[Writable]]

    writable

    [[Transport]]

    transport

  4. streamを返す。

11. WebTransportWriter インターフェイス

WebTransportWriterWritableStreamDefaultWriter のサブクラスであり、 2つのメソッドを追加します。

WebTransportWriter は必ずcreate 手続きによって作成されます。

[Exposed=*, SecureContext]
interface WebTransportWriter : WritableStreamDefaultWriter {
  Promise<undefined> atomicWrite(optional any chunk);
  undefined commit();
};

11.1. メソッド

atomicWrite(chunk)

atomicWrite メソッドは、与えられたchunkが送信時点でのフロー制御 ウィンドウ内で全て送信できない場合はrejectされます。 この動作は、フロー制御デッドロックに敏感な ニッチなトランザクション型アプリケーションに対応するためのものです([RFC9308] Section 4.4)。

注: atomicWrite は、一部データ送信後にrejectされる場合もあります。 フロー制御に対して原子的ですが、他のエラーが発生することがあります。 atomicWrite はデータをパケット間で分割したり、他のデータとインターリーブされるのを防ぐものではありません。 フロー制御クレジット不足による失敗は送信側のみが把握できます。

注: 原子的書き込みも非原子的書き込みの後ろに並ぶとブロックされる場合があります。 atomicWriteがrejectされた場合、その時点で後ろに並んでいた全てのリクエストもrejectされます。 このときrejectされた非原子的書き込みはストリームをエラー状態にします。 したがって、アプリケーションはatomicWriteのawaitを推奨します。

atomicWrite が呼ばれた際、ユーザーエージェントは以下の手順を実行します:

  1. pwrite(chunk)WritableStreamDefaultWriter に対してchunkを渡す)で得る。

  2. pstream[[AtomicWriteRequests]]追加

  3. promiseがsettledになった際に反応する以下のステップの結果を返す:

    1. もしstream[[AtomicWriteRequests]] にpが含まれていればpを削除する。

    2. もしpが理由rでrejectされた場合、rでrejectされたpromiseを返す。

    3. undefinedを返す。

commit()

commit メソッドは、ストリームの[[CommittedOffset]] を、そのストリームに書き込まれたバイト数([[BytesWritten]])に更新します。 これにより、そのバイトは書き込みが中止されてストリームがリセットされても ピアに確実に配送されます。 この仕組みは[RELIABLE-RESET]で説明されています。

注: この操作は接続障害時の配送は保証しません。 ストリームがリセットされた場合のみ配送を保証します。

commitstreamに対して呼ばれた際、ユーザーエージェントは以下の手順を実行します:

  1. transportstream[[Transport]]とする。

  2. stream[[CommittedOffset]]stream[[BytesWritten]] の値に設定する。

11.2. 手続き

create によりWebTransportWriterWebTransportSendStream streamで生成するには以下の手順:

  1. writernew WebTransportWriter とする。

  2. new WritableStreamDefaultWriter(stream) コンストラクタ手順をwriterをthis、streamを引数として実行する。

  3. writerを返す。

12. WebTransportError インターフェイス

WebTransportErrorDOMException のサブクラスであり、

[Exposed=(Window,Worker), Serializable, SecureContext]
interface WebTransportError : DOMException {
  constructor(optional DOMString message = "", optional WebTransportErrorOptions options = {});

  readonly attribute WebTransportErrorSource source;
  readonly attribute unsigned long? streamErrorCode;
};

dictionary WebTransportErrorOptions {
  WebTransportErrorSource source = "stream";
  [Clamp] unsigned long? streamErrorCode = null;
};

enum WebTransportErrorSource {
  "stream",
  "session",
};

12.1. 内部スロット

WebTransportError は以下の内部スロットを持ちます。

内部スロット 説明 (非規範的)
[[Source]] WebTransportErrorSource このエラーのソースを示します。
[[StreamErrorCode]] このエラーのアプリケーションプロトコルエラーコード、またはnull。

12.2. コンストラクタ

new WebTransportError(message, options) のコンストラクタ手順:

  1. thisname"WebTransportError"に設定。

  2. thismessagemessageに設定。

  3. thisの内部スロットを次のように設定:

    [[Source]]

    options.source

    [[StreamErrorCode]]

    options.streamErrorCode

    注: このnameにはレガシーコードのマッピングはなく、thiscode は0です。

12.3. 属性

source, WebTransportErrorSource, 読み取り専用

getter手順は、this[[Source]]を返すこと。

streamErrorCode, unsigned long, 読み取り専用, nullable

getter手順は、this[[StreamErrorCode]]を返すこと。

12.4. シリアライズ

WebTransportError オブジェクトはシリアライズ可能オブジェクトです。 そのシリアライズ手順valueserializedを与えて):

  1. DOMExceptionシリアライズ手順valueserializedで実行する。

  2. serialized.[[Source]]value.[[Source]]に設定。

  3. serialized.[[StreamErrorCode]]value.[[StreamErrorCode]]に設定。

そのデシリアライズ手順serializedvalueを与えて):

  1. DOMExceptionデシリアライズ手順serializedvalueで実行する。

  2. value.[[Source]]serialized.[[Source]]に設定。

  3. value.[[StreamErrorCode]] serialized.[[StreamErrorCode]]に設定。

13. プロトコルマッピング

この節は非規範的です。

この節では、[WEB-TRANSPORT-OVERVIEW] を用いて、本仕様で定義されるメソッドの基盤となるプロトコルの挙動を説明します。バッファリングにより、因果関係は即時でない場合があります。

WebTransportプロトコルの動作 APIの効果
セッションがdrained状態 await wt.draining

下層接続がHTTP/3の場合、[WEB-TRANSPORT-HTTP3]から以下のプロトコル挙動が適用されます。

WebTransportError エラーの application streamErrorCode は、httpErrorCode に変換され、またその逆も [WEB-TRANSPORT-HTTP3] Section 4.3 に従って行われます。

APIメソッド QUICプロトコル動作
writable.abort(error) RESET_STREAM_AT を httpErrorCode と、その [[CommittedOffset]] に加え、ストリームヘッダー分を含めて送信(stream); 詳細は[RELIABLE-RESET]
writable.close() STREAM(FINビット付き)を送信
writable.getWriter().write(chunk)() STREAMを送信
writable.getWriter().close() STREAM(FINビット付き)を送信
writable.getWriter().abort(error) RESET_STREAM_AT を httpErrorCode と、その [[CommittedOffset]] に加え、ストリームヘッダー分を含めて送信(stream); 詳細は[RELIABLE-RESET]
readable.cancel(error) STOP_SENDING を httpErrorCode付きで送信
readable.getReader().cancel(error) STOP_SENDING を httpErrorCode付きで送信
wt.close(closeInfo) セッションをcloseInfoで終了
QUICプロトコル動作 APIの効果
STOP_SENDING(httpErrorCode付き)受信 writable writablestreamErrorCode付きでエラー化
STREAM受信 (await readable.getReader().read()).value
STREAM(FINビット付き)受信 (await readable.getReader().read()).done
RESET_STREAM(httpErrorCode付き)受信 readable readablestreamErrorCode付きでエラー化
セッションがcloseInfo付きで正常終了
(await wt.closed).closeInfo, および すべてのopenストリームがエラー化
ネットワークエラー
(await wt.closed) がrejectされ、すべてのopenストリームがエラー化

注: RFC9000 Section 3.2[QUIC])で議論されているように、RESET_STREAM または RESET_STREAM_AT フレーム([RELIABLE-RESET])の受信は、必ずしもアプリケーションに通知されるとは限りません。 リセットの受信は即時通知され、ストリームデータの配信を中断し、消費されていないデータは破棄されます。 しかし、即時通知は必須ではありません。 特に、RESET_STREAM_ATフレームのReliable Sizeフィールドで示されたデータの配信を許すため、通知が遅延する可能性があります。 ストリームデータが完全に受信されているが、まだアプリケーションに読み込まれていない場合、通知が抑制されることがあります。 WebTransportは常にRESET_STREAM_ATフレームを使用し、ストリームヘッダーの確実な配送を保証します。 詳細はSection 4.1およびSection 4.2[WEB-TRANSPORT-HTTP3])を参照。

HTTP/3プロトコル動作 APIの効果
セッションがdrained状態 await wt.draining

下層接続がHTTP/2の場合、[WEB-TRANSPORT-HTTP2]から以下のプロトコル挙動が適用されます。HTTP/3と異なり、ストリームエラーコードとHTTPエラーコードの変換は不要です。

APIメソッド HTTP/2プロトコル動作
writable.abort(error) WT_RESET_STREAM を error付きで送信
writable.close() WT_STREAM(FINビット付き)を送信
writable.getWriter().write() WT_STREAMを送信
writable.getWriter().close() WT_STREAM(FINビット付き)を送信
writable.getWriter().abort(error) WT_RESET_STREAM を error付きで送信
readable.cancel(error) WT_STOP_SENDING を error付きで送信
readable.getReader().cancel(error) WT_STOP_SENDING を error付きで送信
wt.close(closeInfo) セッションをcloseInfoで終了
HTTP/2プロトコル動作 APIの効果
WT_STOP_SENDING(error付き)受信 writable writablestreamErrorCode付きでエラー化
WT_STREAM受信 (await readable.getReader().read()).value
WT_STREAM(FINビット付き)受信 (await readable.getReader().read()).done
WT_RESET_STREAM(error付き)受信 readable readablestreamErrorCode付きでエラー化
セッションがcloseInfo付きで正常終了
(await wt.closed).closeInfo, および すべてのopenストリームがエラー化
ネットワークエラー
(await wt.closed) がrejectされ、すべてのopenストリームがエラー化
セッションがdrained状態 await wt.draining

14. プライバシーおよびセキュリティに関する考慮事項

この節は非規範的であり、新しい挙動は規定せず、他の仕様部分に既に存在する情報をまとめたものです。

14.1. 通信の機密性

ネットワークを監視できる攻撃者に対して、通信が行われている事実を隠すことはできないため、これは公開情報として扱う必要があります。

本書で説明する全てのトランスポートプロトコルはTLS [RFC8446] またはそれと同等の意味を持つプロトコルを利用し、TLSの全てのセキュリティ特性(通信の機密性と完全性含む)を提供します。WebTransport over HTTPは、外向きHTTPリクエストと同じ証明書検証メカニズムを使用するため、リモートサーバーの認証に同じ公開鍵基盤に依存します。WebTransportでは、証明書検証エラーは致命的であり、証明書検証を回避するインタースティシャル(警告画面)はありません。

14.2. 状態の永続性

WebTransport自体は新しい一意な識別子や新たな永続的状態保存方法を作成せず、既存の永続的状態をサーバーに自動的に公開することもありません。例えば、[WEB-TRANSPORT-HTTP3][WEB-TRANSPORT-HTTP2] では、Cookieの送信やHTTP認証、キャッシュ無効化機構はサポートされません。ただしTLSを利用するため、TLSセッションチケットなどTLSの永続的状態を継承します。これは受動的ネットワーク監視者からは見えませんが、サーバー側が同じクライアントからの複数接続を関連付けるために利用できる場合があります。

14.3. プロトコルセキュリティ

WebTransportは[WEB-TRANSPORT-OVERVIEW]で記述された一連の要件を課します。主なものは以下の通りです:

  1. リモートサーバーがWebTransportプロトコルの利用を認識し、WebTransportプロトコルの利用意思があることを確認すること。[WEB-TRANSPORT-HTTP3] ではALPN [RFC7301]、 HTTP/3設定、:protocol擬似ヘッダーの組み合わせでWebTransportプロトコルを特定します。[WEB-TRANSPORT-HTTP2] ではALPN、HTTP/2設定、:protocol擬似ヘッダーの組み合わせでWebTransportプロトコルを特定します。

  2. サーバーが、トランスポートセッションを開始したリソースのオリジンに基づいて接続をフィルタリングできること。セッション確立リクエストの Origin ヘッダーがこの情報を伝達します。

プロトコルセキュリティ関連の考慮事項は、Security Considerations節([WEB-TRANSPORT-HTTP3] および [WEB-TRANSPORT-HTTP2])で説明されています。

ネットワークAPIはローカルネットワークの利用可能なホストをスキャンする用途にも使われることが多く、フィンガープリントやその他攻撃手法に利用される可能性があります。WebTransportはWebSocketのアプローチに従います:特定の接続エラーは、エンドポイントがWebTransportエンドポイントであることが検証されるまで返されません。つまりWebアプリケーションは、存在しないエンドポイントとWebからの接続受け入れ意思のないエンドポイントとを区別できません。

14.4. 証明書ハッシュによる認証

通常、ユーザーエージェントは、URLのサーバー名に対して提供されたTLSサーバー証明書の有効性を検証することで、TLS接続の認証を行います [RFC9525]。これは、ユーザーエージェントが管理する信頼できるアンカーに証明書チェーンをつなげることで達成されます。信頼アンカーは証明書内のサーバー名認証を担当します。この仕組みをWeb PKIと呼びます。

このAPIは、Webアプリケーションが、サーバー名ではなく特定のサーバー証明書で認証されたリモートネットワークエンドポイントに接続する機能を提供します。この仕組みは、長期証明書の取得が困難なエンドポイント(例:短命な仮想マシンや公開ルート不可なホスト)への接続を可能にします。この仕組みはWeb PKIベース認証の代替となるため、両者のセキュリティ特性を比較する必要があります。

リモートサーバーは、指定された証明書の公開鍵に対応する秘密鍵を保持している場合のみ、TLSハンドシェイクに成功できます。APIは証明書のハッシュで証明書を識別します。これは使用する暗号学的ハッシュ関数がセカンドプリイメージ耐性を持つ場合のみ安全です。本書で定義される唯一の関数はSHA-256であり、APIは複数のアルゴリズム-ハッシュペア指定により新たなハッシュ関数の導入手段を提供します。

Web PKIはサーバー名の信頼チェーン構築以外にも、証明書失効処理など追加のセキュリティ機構を提供します。証明書がエフェメラルな場合はこの機構は不要ですが、その他の場合は証明書ハッシュの導入方法(例:キャッシュされたHTTPリソースの場合、証明書が侵害により交換された際はキャッシュを無効化する必要がある)を検討する必要があります。Web PKIは、既知の弱い鍵を持つ証明書の拒否など、鍵生成に関する問題への対策も提供します。本仕様では特定の指針はありませんが、ブラウザは実装依存でこれらを拒否しても構いません。

Web PKIは証明書の有効期間制限を課します。これは鍵侵害の範囲を限定し、運用者が鍵ローテーションを設計・実行する仕組みとなります。WebTransportも同様の有効期間制限(最大2週間)を課します。2週間という制限は、鍵侵害の影響最小化と、デバイス間の時計ズレやクライアントとサーバー間での証明書同期コスト低減のバランスを考慮したものです。

WebTransport APIは、アプリケーションが複数の証明書ハッシュを同時に指定できるようにし、新しい証明書がロールアウトされる期間中クライアントが複数の証明書を受け入れられるようにします。

WebRTCの類似の仕組みと異なり、WebTransportのサーバー証明書ハッシュAPIはクライアント認証手段を提供しません。クライアントがサーバー証明書や接続方法を知っているだけでは十分ではなく、必要に応じてアプリケーションがバンド内でクライアントのアイデンティティを確立する必要があります。

14.5. フィンガープリントとトラッキング

このAPIはサイトにネットワーク活動を生成し、その効果を詳細に観察する能力を提供します。このように得られた情報は識別可能である可能性があります。

同様のネットワーク機能は他のWebプラットフォームAPI(例:fetch[webrtc])でも提供されているため、WebTransport追加によるプライバシーへの悪影響は最小限です。本節の考慮事項は他のネットワーク機能にも等しく適用されます。

ネットワーク特性の計測にはネットワーク利用とその利用効果の計測が必要であり、どちらもこのAPIによって可能となります。WebTransportはサイトに、任意のサーバーへのネットワーク活動生成および効果の観察能力を提供します。ネットワーク経路の安定した特性や動的な利用効果の両方の観察が可能です。

ネットワーク情報は、サーバー自身のネットワークスタック、クライアントによるデータ消費・送信速度、またはAPIが提供する統計情報(§ 6.13 WebTransportConnectionStats Dictionary参照)としてサーバーに直接・間接的に提供されます。そのため、ユーザーエージェントで情報制限するだけではプライバシーリスク管理には不十分な場合があります。

14.5.1. 静的観測

サイトはユーザーエージェントと選択したサーバー間の利用可能なネットワーク容量やRTT(往復遅延時間)を観測できます。これらの情報は他のトラッキング要素と組み合わせると識別性を持つ場合があります。RTTは複数地点から複数回測定することでユーザーエージェントの物理的な位置情報の一部を明らかにできる場合もあります。

ネットワークは共有されているものの、利用は断続的なことが多いため、サイトは競合や負荷の少ない経路の容量やRTTを観測できる場合があります。これらの特性は多くの人にとって安定しており、ネットワークの位置が変わらず、ボトルネック(容量決定要素)がユーザーエージェントに近い場合は特に安定します。

14.5.2. 共有ネットワーク

競合するリンクでは、サイトにクロスサイト認識 の機会が生まれ、これが非公認のトラッキング([UNSANCTIONED-TRACKING])に利用される恐れがあります。 ネットワーク容量は有限で共有資源のため、ユーザーエージェントが複数サイトに同時アクセスする場合、各サイトに提示されるアイデンティティの関連付けが明らかになる場合があります。

一つのサイトでネットワーク機能を使うと、他サイトで利用できる容量が減少し、ネットワークAPIを使って観測できます。ネットワーク利用やメトリクスは動的に変化し、変化はリアルタイムで観測可能です。これにより、異なるサイト上の活動が同一ユーザーによるものであるという確信度を高めることができます。

ユーザーエージェントは、アクティブでない・フォーカスされていないサイトに対して、フィードバック機構(統計情報、§ 6.13 WebTransportConnectionStats Dictionary)へのアクセスを制限・劣化させることができます。ただし、これだけではサーバーがネットワークの変化を観測することを防ぎきれません。

14.5.3. セッションのプール

共有ネットワークのシナリオと同様、セッションが単一の接続上でプールされる場合、あるセッションの情報は他のセッションの活動によって影響を受けます。別のセッションがどの程度データを送信しているかなどの情報が推論される可能性があります。

共有接続の利用は、サーバー側がセッションを関連付けることを可能にします。network partition keyを使用すると、プール利用が無効化され、共有セッションが不要なクロスサイト認識を可能にする状況を防ぐことができます。

15.

15.1. データグラムバッファの送信

この節は非規範的です。

データグラムのバッファ送信は、datagramscreateWritable メソッドおよびその結果のストリームのwriterを利用して実現できます。下記例では、トランスポートが送信可能な場合のみデータグラムを送信します。

async function sendDatagrams(url, datagrams) {
  const wt = new WebTransport(url);
  const writable = wt.datagrams.createWritable();
  const writer = writable.getWriter();
  for (const bytes of datagrams) {
    await writer.ready;
    writer.write(bytes).catch(() => {});
  }
  await writer.close();
}

15.2. 一定レートでデータグラム送信

この節は非規範的です。

トランスポートが送信可能かどうかに関わらず一定レートでデータグラムを送信したい場合は、datagramscreateWritable メソッドと、その結果のストリームのwriterをready属性を待たずに使えばよいです。

// 100msごとにデータグラム送信
async function sendFixedRate(url, createDatagram, ms = 100) {
  const wt = new WebTransport(url);
  const writable = wt.datagrams.createWritable();
  const writer = writable.getWriter();
  const bytes = createDatagram();
  setInterval(() => writer.write(bytes).catch(() => {}), ms);
}

15.3. データグラム受信

この節は非規範的です。

データグラムはtransport.datagrams.readable 属性から読み出すことで受信できます。null値はパケット処理が遅すぎることを示す場合があります。

async function receiveDatagrams(url) {
  const wt = new WebTransport(url);
  for await (const datagram of wt.datagrams.readable) {
    // datagramを処理
  }
}

15.4. BYOBリーダーによるデータグラム受信

この節は非規範的です。

datagramsReadable byte streamなので、BYOBリーダーを取得でき、バッファ割り当てをより精密に制御しコピーを避けることができます。この例では64kBメモリバッファにデータグラムを読み取ります。

const wt = new WebTransport(url);

for await (const datagram of wt.datagrams.readable) {
  const reader = datagram.getReader({ mode: "byob" });

  let array_buffer = new ArrayBuffer(65536);
  const buffer = await readInto(array_buffer);
}

async function readInto(buffer) {
  let offset = 0;

  while (offset < buffer.byteLength) {
    const {value: view, done} = await reader.read(
        new Uint8Array(buffer, offset, buffer.byteLength - offset));
    buffer = view.buffer;
    if (done) {
      break;
    }
    offset += view.byteLength;
  }

  return buffer;
}

15.5. ストリーム送信

この節は非規範的です。

一方向ストリームでデータを送信するには、createUnidirectionalStream 関数およびその結果のストリームのwriterを利用します。

書き込みchunkの境界は受信側で保証されません。バイトがワイヤ上で合流する可能性があるため、アプリケーションは独自フレーミングを推奨します。

async function sendData(url, ...data) {
  const wt = new WebTransport(url);
  const writable = await wt.createUnidirectionalStream();
  const writer = writable.getWriter();
  for (const bytes of data) {
    await writer.ready;
    writer.write(bytes).catch(() => {});
  }
  await writer.close();
}

Streams仕様では write()のawait を推奨しません。

エンコーディングは、ReadableStreamからpipeすることで実現できます。 例えばTextEncoderStream を用います。

async function sendText(url, readableStreamOfTextData) {
  const wt = new WebTransport(url);
  const writable = await wt.createUnidirectionalStream();
  await readableStreamOfTextData
    .pipeThrough(new TextEncoderStream("utf-8"))
    .pipeTo(writable);
}

15.6. 着信ストリームの受信

この節は非規範的です。

着信ストリームの読み出しは、incomingUnidirectionalStreams 属性を反復し、各WebTransportReceiveStream のチャンクを反復処理することで実現できます。

チャンク化はユーザーエージェントによって決定され、送信者ではありません。

async function receiveData(url, processTheData) {
  const wt = new WebTransport(url);
  for await (const readable of wt.incomingUnidirectionalStreams) {
    // 各ストリームを個別に消費し、ストリームごとのエラーを報告
    ((async () => {
      try {
        for await (const bytes of readable) {
          processTheData(bytes);
        }
      } catch (e) {
        console.error(e);
      }
    })());
  }
}

デコードは新しいWritableStreamにpipeすることで実現できます。例えば TextDecoderStream を使います。 この例ではテキスト出力が混在しないよう、1ストリームずつ読み取ります。

async function receiveText(url, createWritableStreamForTextData) {
  const wt = new WebTransport(url);
  for await (const readable of wt.incomingUnidirectionalStreams) {
    // 順次消費して出力を混在させず、ストリームごとのエラーを報告
    try {
      await readable
       .pipeThrough(new TextDecoderStream("utf-8"))
       .pipeTo(createWritableStreamForTextData());
    } catch (e) {
      console.error(e);
    }
  }
}

15.7. BYOBリーダーでストリーム受信

この節は非規範的です。

WebTransportReceiveStreamReadable byte streamなので、BYOBリーダーを取得でき、バッファ割り当てをより精密に制御しコピーを避けることができます。この例ではWebTransportReceiveStreamから最初の1024バイトを単一バッファに読み取ります。

const wt = new WebTransport(url);

const reader = wt.incomingUnidirectionalStreams.getReader();
const { value: recv_stream, done } = await reader.read();
const byob_reader = recv_stream.getReader({ mode: "byob" });

let array_buffer = new ArrayBuffer(1024);
const buffer = await readInto(array_buffer);

async function readInto(buffer) {
  let offset = 0;

  while (offset < buffer.byteLength) {
    const {value: view, done} = await reader.read(
        new Uint8Array(buffer, offset, buffer.byteLength - offset));
    buffer = view.buffer;
    if (done) {
      break;
    }
    offset += view.byteLength;
  }

  return buffer;
}

15.8. ストリームでトランザクションチャンク送信

この節は非規範的です。

一方向ストリームで、フロー制御でブロックせずに全体送信できる場合のみトランザクションデータを送信したい場合は、 getWriter 関数およびそのwriterを利用します。

async function sendTransactionalData(wt, bytes) {
  const writable = await wt.createUnidirectionalStream();
  const writer = writable.getWriter();
  await writer.ready;
  try {
    await writer.atomicWrite(bytes);
  } catch (e) {
    if (e.name != "AbortError") throw e;
    // フロー制御でブロックを避けるためreject
    // 非atomicな書き込みがpendingでなければwritableはエラー化されない
  } finally {
    writer.releaseLock();
  }
}

15.9. サーバー証明書ハッシュ利用

この節は非規範的です。

WebTransportセッションは、クライアント側で行われるデフォルトの信頼評価を、サーバーに提供された証明書のハッシュによるチェックで上書きできます。下記例ではhashValue下層接続が有効とみなすべきサーバー証明書のSHA-256ハッシュを含むBufferSourceです。

const wt = new WebTransport(url, {
  serverCertificateHashes: [
    {
      algorithm: "sha-256",
      value: hashValue,
    }
  ]
});
await wt.ready;

15.10. 完全な例

この節は非規範的です。

この例はclosed/ready promiseの利用、クライアント・サーバー双方での一方向・双方向ストリームの開始、データグラムの送受信方法を示します。

writable属性(transportのdatagramsにあったもの)は 以下のようにPolyfillできます:
wt.datagrams.writable ||= wt.datagrams.createWritable();
// ページ上のイベントログにエントリを追加し、指定CSSクラスを適用可能
// CSSクラスを任意指定

let wt, streamNumber, datagramWriter;

connect.onclick = async () => {
  try {
    const url = document.getElementById('url').value;

    wt = new WebTransport(url);
    wt.datagrams.writable ||= wt.datagrams.createWritable();
    addToEventLog('接続を開始しています...');
    await wt.ready;
    addToEventLog(`${(wt.reliability == "reliable-only")? "TCP" : "UDP"} ` +
                  `接続完了.`);
    wt.closed
      .then(() => addToEventLog('接続が正常に閉じられました。'))
      .catch(() => addToEventLog('接続が異常終了しました。', 'error'));

    streamNumber = 1;
    datagramWriter = wt.datagrams.writable.getWriter();

    readDatagrams();
    acceptUnidirectionalStreams();
    document.forms.sending.elements.send.disabled = false;
    document.getElementById('connect').disabled = true;
  } catch (e) {
    addToEventLog(`接続失敗: ${e}`, 'error');
  }
}

sendData.onclick = async () => {
  const form = document.forms.sending.elements;
  const data = sending.data.value;
  const bytes = new TextEncoder('utf-8').encode(data);
  try {
    switch (form.sendtype.value) {
      case 'datagram': {
        await datagramWriter.ready;
        datagramWriter.write(bytes).catch(() => {});
        addToEventLog(`データグラム送信: ${data}`);
        break;
      }
      case 'unidi': {
        const writable = await wt.createUnidirectionalStream();
        const writer = writable.getWriter();
        writer.write(bytes).catch(() => {});
        await writer.close();
        addToEventLog(`一方向ストリームでデータ送信: ${data}`);
        break;
      }
      case 'bidi': {
        const duplexStream = await wt.createBidirectionalStream();
        const n = streamNumber++;
        readFromIncomingStream(duplexStream.readable, n);

        const writer = duplexStream.writable.getWriter();
        writer.write(bytes).catch(() => {});
        await writer.close();
        addToEventLog(`双方向ストリーム #${n} でデータ送信: ${data}`);
        break;
      }
    }
  } catch (e) {
    addToEventLog(`送信中のエラー: ${e}`, 'error');
  }
}

// EOF到達までデータグラムをイベントログに読み出し
async function readDatagrams() {
  try {
    const decoder = new TextDecoderStream('utf-8');

    for await (const data of wt.datagrams.readable.pipeThrough(decoder)) {
      addToEventLog(`データグラム受信: ${data}`);
    }
    addToEventLog('データグラム読み取り終了!');
  } catch (e) {
    addToEventLog(`データグラム読取中のエラー: ${e}`, 'error');
  }
}

async function acceptUnidirectionalStreams() {
  try {
    for await (const readable of wt.incomingUnidirectionalStreams) {
      const number = streamNumber++;
      addToEventLog(`新しい着信一方向ストリーム #${number}`);
      readFromIncomingStream(readable, number);
    }
    addToEventLog('着信一方向ストリーム受付終了!');
  } catch (e) {
    addToEventLog(`ストリーム受付中エラー ${e}`, 'error');
  }
}

async function readFromIncomingStream(readable, number) {
  try {
    const decoder = new TextDecoderStream('utf-8');
    for await (const data of readable.pipeThrough(decoder)) {
      addToEventLog(`ストリーム #${number} でデータ受信: ${data}`);
    }
    addToEventLog(`ストリーム #${number} 閉じました`);
  } catch (e) {
    addToEventLog(`ストリーム #${number} 読取中のエラー: ${e}`, 'error');
    addToEventLog(`    ${e.message}`);
  }
}

function addToEventLog(text, severity = 'info') {
  const log = document.getElementById('event-log');
  const previous = log.lastElementChild;
  const entry = document.createElement('li');
  entry.innerText = text;
  entry.className = `log-${severity}`;
  log.appendChild(entry);

  // ログの直前のエントリが可視なら、新しい要素までスクロール
  if (previous &&
      previous.getBoundingClientRect().top < log.getBoundingClientRect().bottom) {
    entry.scrollIntoView();
  }
}

16. 謝辞

編集者は、ワーキンググループ議長およびチームコンタクトである Jan-Ivar Bruaroey、Will Law、Yves Lafon のご支援に感謝します。

WebTransport インターフェイスは、W3C ORTC CGで最初に記述された QuicTransport インターフェイスに基づいており、本仕様に合わせて適合・拡張されています。

索引

本仕様で定義される用語

参照によって定義される用語

参考文献

規範的参考文献

[CSP3]
Mike West; Antonio Sartori. Content Security Policy Level 3. 2025年6月30日. WD. URL: https://www.w3.org/TR/CSP3/
[DOM]
Anne van Kesteren. DOM Standard. 現行標準. URL: https://dom.spec.whatwg.org/
[ECMASCRIPT-6.0]
Allen Wirfs-Brock. ECMA-262 6th Edition, The ECMAScript 2015 Language Specification. 2015年6月. 標準. URL: http://www.ecma-international.org/ecma-262/6.0/index.html
[ENCODING]
Anne van Kesteren. Encoding Standard. 現行標準. URL: https://encoding.spec.whatwg.org/
[FETCH]
Anne van Kesteren. Fetch Standard. 現行標準. URL: https://fetch.spec.whatwg.org/
[HR-TIME-3]
Yoav Weiss. High Resolution Time. 2024年11月7日. WD. URL: https://www.w3.org/TR/hr-time-3/
[HTML]
Anne van Kesteren; 他. HTML Standard. 現行標準. URL: https://html.spec.whatwg.org/multipage/
[INFRA]
Anne van Kesteren; Domenic Denicola. Infra Standard. 現行標準. URL: https://infra.spec.whatwg.org/
[QUIC]
Jana Iyengar; Martin Thomson. QUIC: A UDP-Based Multiplexed and Secure Transport. 提案標準. URL: https://www.rfc-editor.org/rfc/rfc9000
[QUIC-DATAGRAM]
Tommy Pauly; Eric Kinnear; David Schinazi. An Unreliable Datagram Extension to QUIC. 提案標準. URL: https://www.rfc-editor.org/rfc/rfc9221
[RFC2119]
S. Bradner. Key words for use in RFCs to Indicate Requirement Levels. 1997年3月. ベストカレントプラクティス. URL: https://datatracker.ietf.org/doc/html/rfc2119
[RFC3279]
L. Bassham; W. Polk; R. Housley. Algorithms and Identifiers for the Internet X.509 Public Key Infrastructure Certificate and Certificate Revocation List (CRL) Profile. 2002年4月. 提案標準. URL: https://www.rfc-editor.org/rfc/rfc3279
[RFC5280]
D. Cooper; 他. Internet X.509 Public Key Infrastructure Certificate and Certificate Revocation List (CRL) Profile. 2008年5月. 提案標準. URL: https://www.rfc-editor.org/rfc/rfc5280
[RFC8174]
B. Leiba. Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words. 2017年5月. ベストカレントプラクティス. URL: https://www.rfc-editor.org/rfc/rfc8174
[RFC8422]
Y. Nir; S. Josefsson; M. Pegourie-Gonnard. Elliptic Curve Cryptography (ECC) Cipher Suites for Transport Layer Security (TLS) Versions 1.2 and Earlier. 2018年8月. 提案標準. URL: https://www.rfc-editor.org/rfc/rfc8422
[RFC9002]
J. Iyengar, Ed.; I. Swett, Ed.. QUIC Loss Detection and Congestion Control. 2021年5月. 提案標準. URL: https://www.rfc-editor.org/rfc/rfc9002
[RFC9525]
P. Saint-Andre; R. Salz. Service Identity in TLS. 2023年11月. 提案標準. URL: https://www.rfc-editor.org/rfc/rfc9525
[STREAMS]
Adam Rice; 他. Streams Standard. 現行標準. URL: https://streams.spec.whatwg.org/
[URL]
Anne van Kesteren. URL Standard. 現行標準. URL: https://url.spec.whatwg.org/
[WEB-TRANSPORT-HTTP2]
Alan Frindell; 他. WebTransport over HTTP/2. インターネットドラフト. URL: https://datatracker.ietf.org/doc/html/draft-ietf-webtrans-http2
[WEB-TRANSPORT-HTTP3]
Alan Frindell; Eric Kinnear; Victor Vasiliev. WebTransport over HTTP/3. インターネットドラフト. URL: https://datatracker.ietf.org/doc/html/draft-ietf-webtrans-http3
[WEB-TRANSPORT-OVERVIEW]
Victor Vasiliev. WebTransport Protocol Framework. インターネットドラフト. URL: https://datatracker.ietf.org/doc/html/draft-ietf-webtrans-overview
[WEBIDL]
Edgar Chen; Timothy Gu. Web IDL Standard. 現行標準. URL: https://webidl.spec.whatwg.org/
[WEBTRANSPORT]
Nidhi Jaju; Victor Vasiliev. WebTransport. 2025年2月12日. WD. URL: https://www.w3.org/TR/webtransport/

参考情報

[RELIABLE-RESET]
Marten Seemann; 奥一穂. QUIC Stream Resets with Partial Delivery. インターネットドラフト. URL: https://datatracker.ietf.org/doc/html/draft-ietf-quic-reliable-stream-reset
[RFC7301]
S. Friedl; 他. Transport Layer Security (TLS) Application-Layer Protocol Negotiation Extension. 2014年7月. 提案標準. URL: https://www.rfc-editor.org/rfc/rfc7301
[RFC8446]
E. Rescorla. The Transport Layer Security (TLS) Protocol Version 1.3. 2018年8月. 提案標準. URL: https://www.rfc-editor.org/rfc/rfc8446
[RFC9308]
M. Kühlewind; B. Trammell. Applicability of the QUIC Transport Protocol. 2022年9月. 情報提供. URL: https://www.rfc-editor.org/rfc/rfc9308
[UNSANCTIONED-TRACKING]
Mark Nottingham. Unsanctioned Web Tracking. 2015年7月17日. TAG Finding. URL: https://www.w3.org/2001/tag/doc/unsanctioned-tracking/
[WEBRTC]
Cullen Jennings; 他. WebRTC: Real-Time Communication in Browsers. 2025年3月13日. REC. URL: https://www.w3.org/TR/webrtc/

IDL索引

[Exposed=(Window,Worker), SecureContext, Transferable]
interface WebTransportDatagramsWritable : WritableStream {
  attribute WebTransportSendGroup? sendGroup;
  attribute long long sendOrder;
};

[Exposed=(Window,Worker), SecureContext]
interface WebTransportDatagramDuplexStream {
  WebTransportDatagramsWritable createWritable(
      optional WebTransportSendOptions options = {});
  readonly attribute ReadableStream readable;

  readonly attribute unsigned long maxDatagramSize;
  attribute unrestricted double? incomingMaxAge;
  attribute unrestricted double? outgoingMaxAge;
  attribute unrestricted double incomingHighWaterMark;
  attribute unrestricted double outgoingHighWaterMark;
};

[Exposed=(Window,Worker), SecureContext]
interface WebTransport {
  constructor(USVString url, optional WebTransportOptions options = {});

  Promise<WebTransportConnectionStats> getStats();
  [NewObject] Promise<ArrayBuffer> exportKeyingMaterial(BufferSource label, optional BufferSource context);
  readonly attribute Promise<undefined> ready;
  readonly attribute WebTransportReliabilityMode reliability;
  readonly attribute WebTransportCongestionControl congestionControl;
  [EnforceRange] attribute unsigned short? anticipatedConcurrentIncomingUnidirectionalStreams;
  [EnforceRange] attribute unsigned short? anticipatedConcurrentIncomingBidirectionalStreams;
  readonly attribute DOMString protocol;

  readonly attribute Promise<WebTransportCloseInfo> closed;
  readonly attribute Promise<undefined> draining;
  undefined close(optional WebTransportCloseInfo closeInfo = {});

  readonly attribute WebTransportDatagramDuplexStream datagrams;

  Promise<WebTransportBidirectionalStream> createBidirectionalStream(
      optional WebTransportSendStreamOptions options = {});
  /* a ReadableStream of WebTransportBidirectionalStream objects */
  readonly attribute ReadableStream incomingBidirectionalStreams;

  Promise<WebTransportSendStream> createUnidirectionalStream(
      optional WebTransportSendStreamOptions options = {});
  /* a ReadableStream of WebTransportReceiveStream objects */
  readonly attribute ReadableStream incomingUnidirectionalStreams;
  WebTransportSendGroup createSendGroup();

  static readonly attribute boolean supportsReliableOnly;
};

enum WebTransportReliabilityMode {
  "pending",
  "reliable-only",
  "supports-unreliable",
};

dictionary WebTransportHash {
  DOMString algorithm;
  BufferSource value;
};

dictionary WebTransportOptions {
  boolean allowPooling = false;
  boolean requireUnreliable = false;
  sequence<WebTransportHash> serverCertificateHashes;
  WebTransportCongestionControl congestionControl = "default";
  [EnforceRange] unsigned short? anticipatedConcurrentIncomingUnidirectionalStreams = null;
  [EnforceRange] unsigned short? anticipatedConcurrentIncomingBidirectionalStreams = null;
  sequence<DOMString> protocols = [];
};

enum WebTransportCongestionControl {
  "default",
  "throughput",
  "low-latency",
};

dictionary WebTransportCloseInfo {
  unsigned long closeCode = 0;
  USVString reason = "";
};

dictionary WebTransportSendOptions {
  WebTransportSendGroup? sendGroup = null;
  long long sendOrder = 0;
};

dictionary WebTransportSendStreamOptions : WebTransportSendOptions {
  boolean waitUntilAvailable = false;
};

dictionary WebTransportConnectionStats {
  unsigned long long bytesSent = 0;
  unsigned long long packetsSent = 0;
  unsigned long long bytesLost = 0;
  unsigned long long packetsLost = 0;
  unsigned long long bytesReceived = 0;
  unsigned long long packetsReceived = 0;
  required DOMHighResTimeStamp smoothedRtt;
  required DOMHighResTimeStamp rttVariation;
  required DOMHighResTimeStamp minRtt;
  required WebTransportDatagramStats datagrams;
  unsigned long long? estimatedSendRate = null;
  boolean atSendCapacity = false;
};

dictionary WebTransportDatagramStats {
  unsigned long long droppedIncoming = 0;
  unsigned long long expiredIncoming = 0;
  unsigned long long expiredOutgoing = 0;
  unsigned long long lostOutgoing = 0;
};

[Exposed=(Window,Worker), SecureContext, Transferable]
interface WebTransportSendStream : WritableStream {
  attribute WebTransportSendGroup? sendGroup;
  attribute long long sendOrder;
  Promise<WebTransportSendStreamStats> getStats();
  WebTransportWriter getWriter();
};

dictionary WebTransportSendStreamStats {
  unsigned long long bytesWritten = 0;
  unsigned long long bytesSent = 0;
  unsigned long long bytesAcknowledged = 0;
};

[Exposed=(Window,Worker), SecureContext]
interface WebTransportSendGroup {
  Promise<WebTransportSendStreamStats> getStats();
};

[Exposed=(Window,Worker), SecureContext, Transferable]
interface WebTransportReceiveStream : ReadableStream {
  Promise<WebTransportReceiveStreamStats> getStats();
};

dictionary WebTransportReceiveStreamStats {
  unsigned long long bytesReceived = 0;
  unsigned long long bytesRead = 0;
};

[Exposed=(Window,Worker), SecureContext]
interface WebTransportBidirectionalStream {
  readonly attribute WebTransportReceiveStream readable;
  readonly attribute WebTransportSendStream writable;
};

[Exposed=*, SecureContext]
interface WebTransportWriter : WritableStreamDefaultWriter {
  Promise<undefined> atomicWrite(optional any chunk);
  undefined commit();
};

[Exposed=(Window,Worker), Serializable, SecureContext]
interface WebTransportError : DOMException {
  constructor(optional DOMString message = "", optional WebTransportErrorOptions options = {});

  readonly attribute WebTransportErrorSource source;
  readonly attribute unsigned long? streamErrorCode;
};

dictionary WebTransportErrorOptions {
  WebTransportErrorSource source = "stream";
  [Clamp] unsigned long? streamErrorCode = null;
};

enum WebTransportErrorSource {
  "stream",
  "session",
};

課題索引

これはWorkerでも対応する必要があります。詳細は #127 および whatwg/html#6731 を参照してください。

この設定オプションは、現時点で低遅延最適化の輻輳制御アルゴリズムをブラウザが実装していないため、リスクのある機能と見なされています。