WebTransport

W3C 作業草案,

この文書の詳細情報
このバージョン:
https://www.w3.org/TR/2025/WD-webtransport-20251008/
最新公開バージョン:
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)

概要

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

この文書のステータス

このセクションは、公開時点でのこの文書のステータスについて説明します。最新のW3C出版物の一覧やこの技術報告書の最新版は、W3C技術報告書インデックスに掲載されています。

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

この文書へのフィードバックやコメントは歓迎します。イシューを提出 するか、GitHubリポジトリをご利用ください。

作業草案としての公開は、W3Cおよびその会員による支持を意味するものではありません。この文書は草案であり、随時更新、差し替え、または廃止される可能性があります。進行中の作業以外として引用するのは不適切です。

この文書はW3C特許ポリシーの下で活動するグループによって作成されました。 W3Cは、グループの成果物に関して行われた特許開示の公開リストを維持しています。 そのページには特許開示方法の案内も含まれています。 個人が本質的な請求項Essential Claim(s)を含むと考える特許について実際に知っている場合は、W3C特許ポリシー第6節に従って情報を開示する必要があります。

この文書は、2025年8月18日W3Cプロセス文書に従って管理されています。

1. はじめに

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

この仕様は、[WEB-TRANSPORT-OVERVIEW]を使用して、サーバーへのデータ送信およびサーバーからのデータ受信を行います。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は、排出中となります。これは、CONNECTストリームがサーバーによって正常に閉じるよう要求された場合であり、詳細は [WEB-TRANSPORT-OVERVIEW] セクション4.1で説明されています。

終了するには、WebTransportセッション sessionに任意の整数 codeと任意のバイト列 reasonを指定し、[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 はい いいえ はい
受信の中止WebTransportストリームで) [WEB-TRANSPORT-OVERVIEW] セクション4.3 はい いいえ はい
送信の中止WebTransportストリームで) [WEB-TRANSPORT-OVERVIEW] セクション4.3 いいえ はい はい

WebTransportストリームには以下のシグナルがあります:

イベント 定義 受信単方向 送信単方向 双方向
受信中止 [WEB-TRANSPORT-OVERVIEW] セクション4.3 いいえ はい はい
送信中止 [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
[[ReadableMode]] 受信データグラムに使用されるDatagramsReadableMode
[[Writables]] 順序付き集合WebTransportDatagramsWritable ストリーム群。初期値は空。
[[IncomingDatagramsQueue]] 受信データグラムとタイムスタンプのペアのキュー。
[[IncomingDatagramsPullPromise]] pullDatagramsによって設定され、受信データグラムの到着を待つプロミス。
[[IncomingDatagramsHighWaterMark]] 受信データグラムのhigh water markを表すunrestricted double
[[IncomingDatagramsExpirationDuration]] 受信データグラムの有効期限(ミリ秒単位)を表すunrestricted double。またはnull。
[[OutgoingDatagramsHighWaterMark]] 送信データグラムのhigh water markを表すunrestricted double
[[OutgoingDatagramsExpirationDuration]] 送信データグラムの有効期限(ミリ秒単位)を表すunrestricted double値。 またはnull。
[[OutgoingMaxDatagramSize]] 送信データグラムの最大サイズを表す整数。
最大データグラムサイズは使用されるプロトコルに依存します。 HTTP/3 [WEB-TRANSPORT-HTTP3]では、この値は経路の MTUの推定値に関連し、実装依存の値だけオーバーヘッド分減算されます。 HTTP/2 [WEB-TRANSPORT-HTTP2]では、同等の制限はありません。

データグラムの処理は一般的に全体をメモリに保持するため、実装にはサイズ上限があります。 将来的なプロトコル拡張で、すべてのプロトコルバリアントに対してこれらのサイズ制限を通知することが可能になるかもしれません。

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

生成するには、 WebTransportDatagramDuplexStreamreadablereadableModeを指定して、以下の手順を実行する。

  1. stream新規 WebTransportDatagramDuplexStreamとして生成し、以下の値で初期化する:

    [[Readable]]

    readable

    [[ReadableMode]]

    readableMode

    [[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. アサーション: datagrams.[[IncomingDatagramsPullPromise]] は null である。

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

  4. もし queue が空なら、次を実行する:

    1. datagrams.[[IncomingDatagramsPullPromise]] を新しいプロミスに設定する。

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

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

  6. もし datagrams.[[ReadableMode]]"bytes" なら、次を実行する:

    1. もし datagrams.[[Readable]]現在の BYOB リクエストビュー が null でない場合、次を実行する:

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

      2. もし viewバイト長datagram のサイズより小さいなら、 RangeError で拒否されたプロミス を返す。

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

      4. もし elementSize が 1 でない場合、TypeError で拒否されたプロミス を返す。

    2. バイトからプル datagramdatagrams.[[Readable]] にプルする。

  7. それ以外の場合:

    1. chunkdatagram を表す新しい Uint8Array オブジェクトとする。

    2. エンキュー chunktransport.[[Datagrams]].[[Readable]] に追加する。

  8. undefined で解決されたプロミス を返す。

receiveDatagrams するには、 WebTransport オブジェクト transport を与えて、次の手順を実行する:

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

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

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

  4. もし duration が null なら、duration実装依存値に設定する。

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

  6. session受信可能なデータグラム がある間、次を繰り返す:

    1. datagramdatagram を受信した結果とする。

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

    3. chunkdatagramtimestamp のペアとする。

    4. エンキュー chunkqueue に追加する。

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

  8. もし toBeRemoved が正なら、 キューからデキューqueue から toBeRemoved 回(切り捨て)実行する。

  9. queue が空でない間、次を繰り返す:

    1. bytestimestampqueue の最初の要素とする。

    2. もし timestamp から duration ミリ秒超過していたら、キューからデキューする。

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

  10. もし queue が空でなく、datagrams.[[IncomingDatagramsPullPromise]] が null でない場合、次を実行する:

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

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

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

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

      1. chunkbytes を表す新しい Uint8Array オブジェクトとする。

      2. エンキュー chunkdatagrams.[[Readable]] に追加する。

      3. 解決する promise を undefined で解決する。

ユーザーエージェントは、任意の 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が失敗なら、throw SyntaxError 例外を投げる。

  4. もしparsedURLschemehttpsでないなら、throw SyntaxError 例外を投げる。

  5. もしparsedURLfragmentがnullでないなら、throw SyntaxError 例外を投げる。

  6. allowPoolingoptionsallowPooling とする。

  7. dedicatedallowPoolingの否定値とする。

  8. serverCertificateHashesoptionsserverCertificateHashes (存在する場合)とし、なければnullとする。

  9. もしdedicatedがfalseかつserverCertificateHashesがnullでなければ、throw NotSupportedError 例外を投げる。

  10. requireUnreliableoptionsrequireUnreliable とする。

  11. congestionControloptionscongestionControl とする。

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

  13. protocolsoptionsprotocols

  14. もしprotocols内の値が重複していたり、WebTransportプロトコルで定義される交渉済みアプリケーションプロトコル値の要素要件を満たしていなかったり、isomorphic encoded 長が0または512を超えていた場合、throw SyntaxError 例外を投げる。 [WEB-TRANSPORT-OVERVIEW] Section 3.1参照。

  15. anticipatedConcurrentIncomingUnidirectionalStreamsoptionsanticipatedConcurrentIncomingUnidirectionalStreams とする。

  16. anticipatedConcurrentIncomingBidirectionalStreamsoptionsanticipatedConcurrentIncomingBidirectionalStreams とする。

  17. datagramsReadableModeoptionsdatagramsReadableMode とする。

  18. incomingDatagrams新規 ReadableStream とする。

  19. datagramsWebTransportDatagramDuplexStreamを生成した結果とし、 readableincomingDatagramsreadableModedatagramsReadableModeに設定する。

  20. transportを新しく構築したWebTransport オブジェクトとし、以下の値で初期化する:

    [[SendStreams]]

    空の順序付き集合

    [[ReceiveStreams]]

    空の順序付き集合

    [[IncomingBidirectionalStreams]]

    新規ReadableStream

    [[IncomingUnidirectionalStreams]]

    新規ReadableStream

    [[State]]

    "connecting"

    [[Ready]]

    新規プロミス

    [[Reliability]]

    "pending"

    [[CongestionControl]]

    congestionControl

    [[AnticipatedConcurrentIncomingUnidirectionalStreams]]

    anticipatedConcurrentIncomingUnidirectionalStreams

    [[AnticipatedConcurrentIncomingBidirectionalStreams]]

    anticipatedConcurrentIncomingBidirectionalStreams

    [[Protocol]]

    空文字列

    [[Closed]]

    新規プロミス

    [[Draining]]

    新規プロミス

    [[Datagrams]]

    datagrams

    [[Session]]

    null

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

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

  1. もしdatagramsReadableMode"bytes"なら、バイト読み込み対応でセットアップ incomingDatagramspullAlgorithmpullDatagramsAlgorithmを、highWaterMark に0を設定する。そうでなければ、セットアップincomingDatagramspullAlgorithmpullDatagramsAlgorithmhighWaterMarkに0を設定する。

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

  3. セットアップ transport.[[IncomingBidirectionalStreams]]pullAlgorithmpullBidirectionalStreamAlgorithmhighWaterMarkに0を設定する。

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

  5. セットアップ transport.[[IncomingUnidirectionalStreams]]pullAlgorithmpullUnidirectionalStreamAlgorithmhighWaterMarkに0を設定する。

  6. WebTransport over HTTPを初期化transportparsedURLdedicatedrequireUnreliablecongestionControlprotocolsserverCertificateHashesを渡す。

  7. transportを返す。

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

  2. originclientオリジンとする。

  3. requestを新規リクエストとし、URLurlclientclientpolicy containerclientポリシーコンテナdestinationは空文字列、 originoriginredirect modeは"error"とする。

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

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

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

    2. errorを新規WebTransportErrorとして生成し、 source"session"にする。

    3. Cleanuptransporterrorを渡す。

  6. networkPartitionKeyネットワークパーティションキーを決定した結果とし、 transport関連設定オブジェクトを渡す。

  7. 以下の手順を並列で実行する。ただしtransport.[[State]]"closed"または"failed"になったら中止する:

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

    2. connectionコネクションの取得networkPartitionKeyurl、false、newConnectionrequireUnreliableを渡して実行した結果とする。 複数の輻輳制御アルゴリズムをサポートする場合、connectionへのデータ送信にcongestionControlに適したものを選択する。 serverCertificateHashesが指定されている場合、デフォルトの証明書検証の代わりに、 カスタム証明書要件を満たし、 証明書ハッシュ検証serverCertificateHashesがtrueを返すなら証明書を有効とみなす。どちらか満たさない場合はconnectionを失敗とする。

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

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

      2. errorを新規WebTransportErrorとして生成し、 source"session"にする。

      3. Cleanuptransporterrorを渡す。

        注: リダイレクトは行われません。リダイレクトによるネットワークエラーは他のネットワークエラーと区別できません。クロスオリジンでは通常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. Cleanuptransporterrorを渡す。

    6. WebTransportセッションの確立originprotocolsconnectionで実行する。

      注: このステップには[QUIC-DATAGRAM]で規定されたトランスポートパラメータ交換も含まれる。

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

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

      2. errorを新規WebTransportErrorとして生成し、 source"session"にする。

      3. Cleanuptransporterrorを渡す。

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

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

      1. アサーション: this[[Datagrams]][[OutgoingMaxDatagramSize]] は整数である。

      2. もしtransport.[[State]]"connecting"でない場合:

        1. 並列sessionを終了する

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

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

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

      5. transport.[[Protocol]] を交渉済みアプリケーションプロトコルの文字列値(存在すれば)に設定する。[WEB-TRANSPORT-OVERVIEW] Section 3.1参照。 存在しなければ""とする。

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

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

      8. 解決する transport.[[Ready]] をundefinedで解決する。

pullBidirectionalStreamには、WebTransport オブジェクトtransportを与え、以下の手順を実行する。
  1. もしtransport.[[State]]"connecting"なら、transport.[[Ready]]fulfilled時に以下の手順を実行した結果を返す:

    1. pullBidirectionalStreamtransportで呼び出した結果を返す。

  2. もしtransport.[[State]]"connected"でないなら、新規拒否されたプロミスを返し、 その値はInvalidStateErrorとする。

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

  4. pを新規プロミスとする。

  5. 以下の手順を並列で実行する:

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

    2. internalStream双方向ストリームの受信sessionから得る。

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

      1. streamWebTransportBidirectionalStream生成WebTransportBidirectionalStreaminternalStreamtransportを渡して作成する。

      2. エンキューstreamtransport.[[IncomingBidirectionalStreams]] に追加する。

      3. 解決する pをundefinedで解決する。

  6. pを返す。

pullUnidirectionalStreamには、WebTransport オブジェクトtransportを与え、以下の手順を実行する。
  1. もしtransport.[[State]]"connecting"なら、transport.[[Ready]]fulfilled時に以下の手順を実行した結果を返す:

    1. pullUnidirectionalStreamtransportで呼び出した結果を返す。

  2. もしtransport.[[State]]"connected"でないなら、新規拒否されたプロミスを返し、 その値はInvalidStateErrorとする。

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

  4. pを新規プロミスとする。

  5. 以下の手順を並列で実行する:

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

    2. internalStream単方向ストリームの受信sessionから得る。

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

      1. streamWebTransportReceiveStream生成WebTransportReceiveStreaminternalStreamtransportを渡して作成する。

      2. エンキューstreamtransport.[[IncomingUnidirectionalStreams]] に追加する。

      3. 解決する pをundefinedで解決する。

  6. pを返す。

6.3. 属性

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

取得時、this[[Ready]]を返さなければならない。

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

取得時、this[[Closed]]を返さなければならない。

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

取得時、this[[Draining]]を返さなければならない。

datagrams型: WebTransportDatagramDuplexStream、 読み取り専用

このセッション上でデータグラムの送受信に使う単一のデュプレックスストリーム。 datagrams属性のgetter手順は以下の通りとする:

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

incomingBidirectionalStreams型: ReadableStream、読み取り専用

サーバーから受信したReadableStream 内のWebTransportBidirectionalStream を返す。

注: 受信ストリームに既にデータが含まれているかどうかはサーバーの挙動による。

incomingBidirectionalStreams属性のgetter手順は以下の通りとする:

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

incomingUnidirectionalStreams型: ReadableStream、読み取り専用

サーバーから受信した各ReadableStream 内に含まれる単方向ストリーム( WebTransportReceiveStream で表される)。

注: 受信ストリームに既にデータが含まれているかどうかはサーバーの挙動による。

incomingUnidirectionalStreamsのgetter手順は以下の通り:

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

reliability型: WebTransportReliabilityMode、 読み取り専用

コネクションが非信頼性(UDP)転送をサポートするか、信頼性(TCPフォールバック)のみをサポートするかを示す。 コネクションが確立されるまで"pending"を返す。 getterの手順はthis[[Reliability]]を返すこと。

congestionControl 型: WebTransportCongestionControl、 読み取り専用

アプリケーションがコンストラクターで要求した場合、ユーザーエージェントが満たせばこのコネクションで送信時にスループット最適化型または低遅延最適化型の輻輳制御アルゴリズムの希望値。 希望値が満たされなければ値は"default"。 getterの手順はthis[[CongestionControl]]を返すこと。

supportsReliableOnly型: boolean、読み取り専用

ユーザーエージェントが完全に信頼性のあるWebTransportセッションconnection上でサポートしていればtrue、そうでなければfalseを返す。

anticipatedConcurrentIncomingUnidirectionalStreams型: unsigned short、nullable

アプリケーションがサーバーが生成すると予想する同時オープン状態の 受信単方向ストリーム数を指定できる(任意)。 nullでなければ、ユーザーエージェントはサーバーとのネゴシエーション時に将来のラウンドトリップ削減のため [[AnticipatedConcurrentIncomingUnidirectionalStreams]] を考慮すべきである。

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

setter手順はvalueを受け取り、this[[AnticipatedConcurrentIncomingUnidirectionalStreams]]valueを設定する。

anticipatedConcurrentIncomingBidirectionalStreams型: unsigned short、nullable

アプリケーションがサーバーが生成すると予想する同時オープン状態の 双方向ストリーム数を指定できる(任意)。 nullでなければ、ユーザーエージェントはサーバーとのネゴシエーション時に将来のラウンドトリップ削減のため [[AnticipatedConcurrentIncomingBidirectionalStreams]] を考慮すべきである。

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

setter手順はvalueを受け取り、this[[AnticipatedConcurrentIncomingBidirectionalStreams]]valueを設定する。

注: anticipatedConcurrentIncomingUnidirectionalStreams または anticipatedConcurrentIncomingBidirectionalStreams を設定しても、アプリケーションが期待するストリーム数が必ずしも受信できることを保証しません。

protocol型: DOMString、読み取り専用

WebTransportセッションが確立され、 protocols コンストラクターオプションに非空配列を指定した場合、サーバーが選択したアプリケーションレベルのプロトコルを返す(存在すれば)。それ以外は空文字列。 getter手順は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. Cleanuptransporterrorを渡す。

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

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

  5. codecloseInfo.closeCode とする。

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

  7. reasonreasonStringUTF-8エンコードとする。

  8. 並列で、sessionを終了する sessioncodeおよびreasonを渡す。

    注: これはまたtransport.[[SendStreams]] および[[ReceiveStreams]] に含まれるWebTransportストリーム送信中止または受信中止も行う。

  9. CleanuptransportAbortErrorcloseInfoを渡す。

getStats()

このWebTransport基盤となる接続 の統計情報を収集し、非同期で結果を返します。

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

  1. transportthisとする。

  2. pを新規プロミスとする。

  3. もしtransport.[[State]]"failed"なら、pをInvalidStateErrorで拒否し、手順を中止する。

  4. 以下の手順を並列で実行する:

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

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

    3. もしtransport.[[State]]"closed"なら、ネットワークタスクをキューtransportpを接続の最新の統計情報で解決し、手順を中止する。 その統計情報の収集タイミングは実装依存とする。

    4. 基盤となる接続から統計情報(データグラムの統計も含む)を収集する。

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

      1. stats新規 WebTransportConnectionStats オブジェクト(収集した統計情報を表す)とする。

      2. pをstatsで解決する。

  5. pを返す。

exportKeyingMaterial(BufferSource label, optional BufferSource context)

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

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

  1. transportthisとする。

  2. labelLengthlabel.バイト長とする。

  3. もしlabelLengthが255を超えていたら、RangeErrorで拒否されたプロミスを返す。

  4. contextLengthを0とする。

  5. もしcontextが与えられていれば、contextLengthcontext.バイト長にする。

  6. もしcontextLengthが255を超えていたら、RangeErrorで拒否されたプロミスを返す。

  7. pを新規プロミスとする。

  8. 以下の手順を並列で実行する。ただし、abort when transport[[State]]"closed"または"failed"になった場合は中止し、 代わりにネットワークタスクをキューtransportpを InvalidStateErrorでrejectする:

    1. keyingMaterialをTLS鍵素材のエクスポート結果とし、 [WEB-TRANSPORT-OVERVIEW] Section TBDに従い、 labelLengthlabelcontextLength、存在する場合はcontextを渡す。

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

  9. pを返す。

createBidirectionalStream()

送信側の双方向ストリーム用WebTransportBidirectionalStream オブジェクトを生成します。ストリームの生成だけではピアに即座に認識されません。データ送信時に初めて認識されます。

注: サーバーはデータが送信されるまでこのストリームを認識しない場合があります。

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

  1. transportthisとする。

  2. もしtransport.[[State]]"closed"または"failed"なら、 新規InvalidStateErrorで拒否されたプロミスを返す。

  3. sendGroupoptionssendGroup とする。

  4. sendOrderoptionssendOrder とする。

  5. waitUntilAvailableoptionswaitUntilAvailable とする。

  6. pを新規プロミスとする。

  7. 以下の手順を並列で実行する。ただし、abort when transport[[State]]"closed"または"failed"になった場合は中止し、 代わりにネットワークタスクをキューtransportpを InvalidStateErrorでrejectする:

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

    2. internalStream双方向ストリームの生成transport.[[Session]]streamIdを渡して得る。

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

      1. もしtransport.[[State]]"closed"または"failed"なら、 pをInvalidStateErrorで拒否し、手順を中止する。

      2. streamWebTransportBidirectionalStream生成internalStreamtransportsendGroupsendOrderを渡して得る。

      3. pをstreamで解決する。

  8. pを返す。

createUnidirectionalStream()

送信側の単方向ストリーム用WebTransportSendStream を生成します。ストリームの生成だけではサーバーに即座に認識されず、データ送信時に初めて認識されます。

注: サーバーはデータが送信されるまでこのストリームを認識しない場合があります。

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

  1. transportthisとする。

  2. もしtransport.[[State]]"closed"または"failed"なら、 新規InvalidStateErrorで拒否されたプロミスを返す。

  3. sendGroupoptionssendGroup とする。

  4. sendOrderoptionssendOrder とする。

  5. waitUntilAvailableoptionswaitUntilAvailable とする。

  6. pを新規プロミスとする。

  7. 以下の手順を並列で実行する。ただし、abort when transport[[State]]"closed"または"failed"になった場合は中止し、 代わりにネットワークタスクをキューtransportpを InvalidStateErrorでrejectする:

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

    2. internalStream送信側単方向ストリームの生成transport.[[Session]]streamIdを渡して得る。

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

      1. もしtransport.[[State]]"closed"または"failed"なら、 pをInvalidStateErrorで拒否し、手順を中止する。

      2. streamWebTransportSendStream生成internalStreamtransportsendGroupsendOrderを渡して得る。

      3. pをstreamで解決する。

  8. pを返す。

createSendGroup()

WebTransportSendGroup を生成します。

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

  1. transportthisとする。

  2. もしtransport.[[State]]"closed"または"failed"なら、 InvalidStateErrorを投げる

  3. WebTransportSendGroup生成WebTransportSendGrouptransportを渡した結果を返す。

6.5. 手順

WebTransportをクリーンアップするには、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. アサーション: readysettled状態になっている。

    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でエラー状態にする。エラーはerror

    6. incomingUnidirectionalStreamsをerrorでエラー状態にする。エラーはerror

    7. outgoingDatagramWritables内の各writableについて、writableをerrorでエラー状態にする。エラーはerror

    8. incomingDatagramsをerrorでエラー状態にする。エラーはerror

ネットワークタスクをキューするには、WebTransport transportと一連の手順stepsを与えて、次の手順を実行する:

  1. グローバルタスクをキューし、network task sourcetransport関連グローバルオブジェクトを渡して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 の各プロミスが監視されている場合は、ガベージコレクションされてはならない。

WebTransport オブジェクトで[[State]]"connected"の場合、 [[IncomingBidirectionalStreams]][[IncomingUnidirectionalStreams]]、 いずれかの WebTransportReceiveStream、 または[[Datagrams]].[[Readable]]ロック済みである場合、またはdraining またはclosed のプロミスが監視されている場合は、ガベージコレクションされてはならない。

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

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 = [];
  DatagramsReadableMode datagramsReadableMode;
};

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

enum DatagramsReadableMode { "bytes" };

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

allowPooling型:boolean、デフォルトはfalse

trueに設定した場合、WebTransportセッションはプール可能、すなわち 基盤接続が他のWebTransportセッションと共有可能になります。

requireUnreliable型:boolean、デフォルトはfalse

trueに設定した場合、WebTransportセッションは、 HTTP/3 connectionが不可能な場合、HTTP/2 connectionで確立できません。

serverCertificateHashes型:sequence<WebTransportHash>

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

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

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

congestionControl型:WebTransportCongestionControl、デフォルトは"default"

アプリケーションがこの接続でデータ送信時にスループット最適型または低遅延最適型の輻輳制御アルゴリズムの希望値を指定できます。これはユーザーエージェントへのヒントです。

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

anticipatedConcurrentIncomingUnidirectionalStreams型:unsigned short、nullable、デフォルトはnull

アプリケーションがサーバーが生成すると予想する同時オープン状態の 受信単方向ストリーム数を指定できます。 ユーザーエージェントは初期状態でサーバーから少なくとも100本の受信単方向 ストリームを許可しなければなりません。 nullでなければ、ユーザーエージェントはネゴシエーション時に [[AnticipatedConcurrentIncomingUnidirectionalStreams]] を考慮してラウンドトリップ削減を試みるべきです。

anticipatedConcurrentIncomingBidirectionalStreams型:unsigned short、nullable、デフォルトはnull

アプリケーションがサーバーが生成すると予想する同時オープン状態の 双方向ストリーム数を指定できます。 ユーザーエージェントは初期状態でサーバーに少なくとも100本の双方向ストリーム生成を許可しなければなりません。 nullでなければ、ユーザーエージェントはネゴシエーション時に [[AnticipatedConcurrentIncomingBidirectionalStreams]] を考慮してラウンドトリップ削減を試みるべきです。

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

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

datagramsReadableMode 型:DatagramsReadableMode

アプリケーションが受信データグラムに対して 読み取りバイトストリームを利用することを希望する場合に指定できます。そうでなければ、デフォルトの読み取りストリームが使われます。

注: デフォルトの読み取りストリームはゼロ長データグラムの検出に必要です。 一方、読み取りバイトストリームはBYOBリーダーを用いることでより効率的にバイト処理(特にコピーの最小化)が可能です。

証明書ハッシュの計算は、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セッションのエラーコードと理由を設定するための情報を含みます。

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

接続全体で観測された最小ラウンドトリップ時間。[RFC9002] セクション5.2で定義されています。

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 は、送信単方向または双方向WebTransportストリームを使った送信ストリーミング機能を提供する WritableStream です。

これはサーバーにデータを送信するために書き込み可能な WritableStream 型のUint8Array です。

[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]]でない場合、 InvalidStateErrorを投げる。

  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]] 書き込みまたはclose操作の保留を表すプロミス、またはnull。
[[Transport]] このWebTransport を所有するWebTransportSendStream
[[SendGroup]] オプションのWebTransportSendGroup、またはnull。
[[SendOrder]] オプションの送信順序番号。デフォルトは0。
[[AtomicWriteRequests]] 順序付き集合 のプロミス。基盤のsinkで処理待ちの書き込み要求のうち、アトミックなものだけを記録する。
[[BytesWritten]] このストリームに書き込まれたバイト数。
[[CommittedOffset]] ストリーム内でピアに配信されるバイト数を記録するオフセット。ストリームが送信中止された場合でも記録される。 詳細は[RELIABLE-RESET]参照。

7.4. 手続き

生成するには、 WebTransportSendStream送信単方向または双方向WebTransportストリーム internalStreamWebTransport transportsendGroup、およびsendOrderを指定して、次の手順を実行する:

  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を返す。

abortは、WebTransportSendStream streamreasonを指定して、次の手順を実行する:
  1. transportstream.[[Transport]] とする。

  2. promiseを新しいプロミスとする。

  3. codeを0とする。

  4. Removestreamtransport.[[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. 送信中止stream.[[InternalStream]] に対してcodecommittedOffsetを指定して実行する。

    2. ネットワークタスクをキューtransportpromiseを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. サーバーから送信された受信中止シグナルの受信

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

  2. code受信中止シグナルに付与されたアプリケーションプロトコルエラーコードとする。

    注: codeの有効値は0から4294967295(両端含む)です。基盤接続 がHTTP/3の場合、codeは[0x52e4a40fa8db, 0x52e5ac983162]範囲の数値にエンコードされます。 詳細は[WEB-TRANSPORT-HTTP3]参照。

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

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

    2. Removestreamtransport.[[SendStreams]]から削除する。

    3. errorを新規WebTransportErrorとして生成し、 source"stream"に、 streamErrorCodecodeに設定する。

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

    5. streamをエラー状態にする、エラーは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()

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

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

  1. pを新規プロミスとする。

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

  3. 次の手順を並列で実行する:

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

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

      1. stats新規 WebTransportSendStreamStats オブジェクト(集計した統計値を表す)とする。

      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 は、受信単方向または双方向WebTransportストリームを用いて、受信ストリーミング機能を提供する ReadableStream です。

これはサーバーから受信したデータを消費するために読み取ることができる ReadableStream 型のUint8Array です。WebTransportReceiveStream読み取りバイトストリームであり、 利用者は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. 手続き

生成するには、 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を新しいプロミスとする。

  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. Removestreamtransport.[[SendStreams]]から削除する。

  9. 次の手順を並列で実行する:

    1. Abort receivinginternalStreamcodeを指定して実行する。

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

      注: 上記のバッファがこの手続きが実行されるイベントループで利用可能なら、以下の手順は即座に実行される場合があります。

      1. Removestreamtransport.[[ReceiveStreams]]から削除する。

      2. promiseをundefinedで解決する。

  10. promiseを返す。

9.4. サーバーから送信中止シグナルを受信した場合

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

  2. code送信中止シグナルに付与されたアプリケーションプロトコルエラーコードとする。

    注: codeの有効値は0から4294967295(両端含む)です。基盤接続 がHTTP/3の場合、codeは[0x52e4a40fa8db, 0x52e5ac983162]範囲の数値にエンコードされます。 詳細は[WEB-TRANSPORT-HTTP3]参照。

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

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

    2. Removestreamtransport.[[ReceiveStreams]]から削除する。

    3. errorを新規WebTransportErrorとして生成し、 source"stream"に、 streamErrorCodecodeに設定する。

    4. streamをエラー状態にする、エラーは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. 手続き

To 生成するには、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) 送信中止をSTREAMに対してhttpErrorCodeと、[[CommittedOffset]] (さらにストリームヘッダ分を加算)を使ってstreamで行う。詳細は[RELIABLE-RESET]
writable.close() 送信STREAM(FINビットがセット)
writable.getWriter().write(chunk)() 送信STREAM
writable.getWriter().close() 送信STREAM(FINビットがセット)
writable.getWriter().abort(error) 送信中止をSTREAMに対してhttpErrorCodeと、[[CommittedOffset]] (さらにストリームヘッダ分を加算)を使ってstreamで行う。詳細は[RELIABLE-RESET]
readable.cancel(error) 受信中止をSTREAMに対してhttpErrorCodeで行う
readable.getReader().cancel(error) 受信中止をSTREAMに対してhttpErrorCodeで行う
wt.close(closeInfo) セッションをcloseInfoで終了
QUICプロトコル動作 APIの効果
received STOP_SENDING with httpErrorCode writableをエラー状態にする writablestreamErrorCode付き)
STREAM受信 (await readable.getReader().read()).value
STREAM受信(FINビットセット) (await readable.getReader().read()).done
received RESET_STREAM with httpErrorCode readableをエラー状態にする readablestreamErrorCode付き)
セッションが正常に終了し、closeInfo
(await wt.closed).closeInfo, および エラー状態となるオープンストリーム
ネットワークエラー
(await wt.closed) がrejectし、 エラー状態となるオープンストリーム

注: [QUIC]の3.2節で述べられているように、 RESET_STREAMフレームやRESET_STREAM_ATフレーム([RELIABLE-RESET]) の受信は、必ずしもアプリケーションに通知されるわけではありません。 リセットの受信は即座にシグナルされ、 ストリームデータの配信が中断され、消費されていないデータは破棄されます。 ただし、即時のシグナルは必須ではありません。 特に、RESET_STREAM_ATフレームのReliable Sizeフィールドで指定されたデータの配信を許すため、 シグナルが遅延される場合があります。 ストリームデータが完全に受信されていて、 まだアプリケーションによって読み取られていない場合には、 送信中止シグナルが抑制されることがあります。 WebTransportは常にRESET_STREAM_ATフレームを使用し、 ストリームヘッダの確実な配信を保証します。 詳細は4.1節 および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_STREAMにerrorで行う
writable.close() 送信 WT_STREAM(FINビットセット)
writable.getWriter().write() 送信 WT_STREAM
writable.getWriter().close() 送信 WT_STREAM(FINビットセット)
writable.getWriter().abort(error) 送信中止をWT_STREAMにerrorで行う
readable.cancel(error) 受信中止をWT_STREAMにerrorで行う
readable.getReader().cancel(error) 受信中止をWT_STREAMにerrorで行う
wt.close(closeInfo) セッションをcloseInfoで終了
HTTP/2プロトコル動作 APIの効果
received WT_STOP_SENDING with error writableをエラー状態にする writablestreamErrorCode付き)
WT_STREAM受信 (await readable.getReader().read()).value
WT_STREAM受信(FINビットセット) (await readable.getReader().read()).done
received WT_RESET_STREAM with error readableをエラー状態にする readablestreamErrorCode付き)
セッションが正常に終了し、closeInfo
(await wt.closed).closeInfo, および エラー状態となるオープンストリーム
ネットワークエラー
(await wt.closed) がrejectし、 エラー状態となるオープンストリーム
セッションが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 ヘッダーがこの情報を伝達します。

プロトコルのセキュリティ関連事項については、 セキュリティに関する考慮事項の章で説明されています。 [WEB-TRANSPORT-OVERVIEW]セクション6[WEB-TRANSPORT-HTTP3]セクション8、 そして[WEB-TRANSPORT-HTTP2]セクション9を参照してください。

ネットワーク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リーダーによるデータグラム受信

この節は非規範的です。

datagrams読み取りバイトストリームなので、バッファのコピーを避けるために より精密なバッファ割り当て制御ができるBYOBリーダーを取得できます。 この例では、64kBのメモリバッファに datagram を読み取ります。

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リーダーでストリーム受信

この節は非規範的です。

WebTransportReceiveStream読み取りバイトストリームなので、コピーを避けるために より精密なバッファ割り当て制御ができる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(コンテンツセキュリティポリシー レベル3)。2025年7月11日。作業草案。URL: https://www.w3.org/TR/CSP3/
[DOM]
Anne van Kesteren. DOM Standard(DOM標準)。リビングスタンダード。URL: https://dom.spec.whatwg.org/
[ECMASCRIPT-6.0]
Allen Wirfs-Brock. ECMA-262 第6版 ECMAScript 2015 言語仕様。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日。作業草案。URL: https://www.w3.org/TR/hr-time-3/
[HTML]
Anne van Kesteren; 他。HTML Standard(HTML標準)。リビングスタンダード。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: UDPベースの多重化・セキュアトランスポート。提案標準。URL: https://www.rfc-editor.org/rfc/rfc9000
[QUIC-DATAGRAM]
Tommy Pauly; Eric Kinnear; David Schinazi. QUICへの非信頼性データグラム拡張。提案標準。URL: https://www.rfc-editor.org/rfc/rfc9221
[RFC2119]
S. Bradner. RFCで要求レベルを示すキーワード。1997年3月。ベストカレントプラクティス。URL: https://datatracker.ietf.org/doc/html/rfc2119
[RFC3279]
L. Bassham; W. Polk; R. Housley. インターネットX.509公開鍵基盤証明書および証明書失効リスト(CRL)プロファイルのアルゴリズムと識別子。2002年4月。提案標準。URL: https://www.rfc-editor.org/rfc/rfc3279
[RFC5280]
D. Cooper; 他。インターネットX.509公開鍵基盤証明書および証明書失効リスト(CRL)プロファイル。2008年5月。提案標準。URL: https://www.rfc-editor.org/rfc/rfc5280
[RFC8174]
B. Leiba. RFC 2119キーワードの大文字・小文字の曖昧さ。2017年5月。ベストカレントプラクティス。URL: https://www.rfc-editor.org/rfc/rfc8174
[RFC8422]
Y. Nir; S. Josefsson; M. Pegourie-Gonnard. TLSバージョン1.2以前の楕円曲線暗号(ECC)暗号スイート。2018年8月。提案標準。URL: https://www.rfc-editor.org/rfc/rfc8422
[RFC9002]
J. Iyengar, Ed.; I. Swett, Ed.. QUIC損失検出と輻輳制御。2021年5月。提案標準。URL: https://www.rfc-editor.org/rfc/rfc9002
[RFC9525]
P. Saint-Andre; R. Salz. TLSのサービスID。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標準)。リビングスタンダード。URL: https://url.spec.whatwg.org/
[WEB-TRANSPORT-HTTP2]
Alan Frindell; 他。WebTransport over HTTP/2(HTTP/2上のWebTransport)。インターネットドラフト。URL: https://datatracker.ietf.org/doc/html/draft-ietf-webtrans-http2
[WEB-TRANSPORT-HTTP3]
Alan Frindell; Eric Kinnear; Victor Vasiliev. WebTransport over HTTP/3(HTTP/3上のWebTransport)。インターネットドラフト。URL: https://datatracker.ietf.org/doc/html/draft-ietf-webtrans-http3
[WEB-TRANSPORT-OVERVIEW]
Victor Vasiliev. WebTransport Protocol Framework(WebTransportプロトコルフレームワーク)。インターネットドラフト。URL: https://datatracker.ietf.org/doc/html/draft-ietf-webtrans-overview
[WEBIDL]
Edgar Chen; Timothy Gu. Web IDL Standard(Web IDL標準)。リビングスタンダード。URL: https://webidl.spec.whatwg.org/

参考情報

[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 = [];
  DatagramsReadableMode datagramsReadableMode;
};

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

enum DatagramsReadableMode { "bytes" };

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 を参照してください。

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