WebTransport

W3C 作業草案,

この文書の詳細情報
このバージョン:
https://www.w3.org/TR/2026/WD-webtransport-20260311/
最新公開バージョン:
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セッション 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 No Yes Yes
バイト受信(必要に応じてFIN付き) [WEB-TRANSPORT-OVERVIEW] セクション 4.3 Yes No Yes
受信中断 on WebTransport ストリーム [WEB-TRANSPORT-OVERVIEW] セクション 4.3 Yes No Yes
送信中断 on WebTransport ストリーム [WEB-TRANSPORT-OVERVIEW] セクション 4.3 No Yes Yes

WebTransportストリーム のシグナルは以下の通り:

イベント 定義 内向き単方向 外向き単方向 双方向
受信中断済 [WEB-TRANSPORT-OVERVIEW] セクション 4.3 No Yes Yes
送信中断済 [WEB-TRANSPORT-OVERVIEW] セクション 4.3 Yes No Yes
フロー制御 [WEB-TRANSPORT-OVERVIEW] セクション 4.3 No Yes Yes

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。
WebTransportDatagramsWritableWebTransport transportsendGroupsendOrder を与えて生成するには、以下の手順を行う。
  1. stream を、以下を持つ 新しい WebTransportDatagramsWritable とする:

    [[OutgoingDatagramsQueue]]

    空のキュー

    [[Transport]]

    transport

    [[SendGroup]]

    sendGroup

    [[SendOrder]]

    sendOrder

  2. writeDatagramsAlgorithm を、writeDatagramstransportstream で実行するアクションとする。

  3. セットアップ streamwriteAlgorithmwriteDatagramsAlgorithm に設定する。

  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.[[OutgoingMaxBufferedDatagrams]] 未満なら、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 を実行しなければならない。アルゴリズムが進行可能な場合はできる限り早く実行すべきである。

注記: トランスポートの [[State]]"connecting" の間もデータグラムの書き込みは許可されている。 データグラムは [[OutgoingDatagramsQueue]] に格納され、 "connected"状態と同じ方法で 破棄できる。トランスポートの [[State]]"connected" になった時、キューに格納されたデータグラムの送信が開始される。

送信順序ルール とは、送信は通常、このトランスポートで送信予定のキュー済みストリームやデータグラム、そしてこれからキューされるストリームやデータグラムと インターリーブできるが、同じ [[SendGroup]] かつ [[SendOrder]] がより高い値のストリームやデータグラムで、 エラーではなく、フロー制御によって ブロックされていないものの送信されるまで、送信は阻害されなければならない。

注記: デフォルトの null sendGroup は有効な sendGroup である。

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 unsigned long incomingMaxBufferedDatagrams;
  attribute unsigned long outgoingMaxBufferedDatagrams;
};

5.1. 内部スロット

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

内部スロット 説明 (非規範的)
[[Transport]] WebTransport は、この WebTransportDatagramDuplexStream を所有する。
[[Readable]] 受信データグラム用の ReadableStream
[[ReadableType]] 受信データグラムに使用される ReadableStreamType
[[Writables]] 順序付き集合 で、初期状態では空の WebTransportDatagramsWritable ストリーム。
[[IncomingDatagramsQueue]] 受信データグラムとタイムスタンプのペアのキュー。
[[IncomingDatagramsPullPromise]] pullDatagrams によって設定される、受信データグラムを待つためのPromise。
[[IncomingMaxBufferedDatagrams]] 受信キューの長さ(データグラム数)を表す unsigned long。 この数を超えた場合、キュー先頭からデータグラムが破棄される。
[[IncomingDatagramsExpirationDuration]] 受信データグラムの有効期限(ミリ秒)を表す unrestricted double。 または null。
[[OutgoingMaxBufferedDatagrams]] 基礎となるシンクの送信キュー長(データグラム数)を表す unsigned long。 この数を超えるとバックプレッシャーがかかる。
[[OutgoingDatagramsExpirationDuration]] 送信データグラムの有効期限(ミリ秒)を表す unrestricted double の値。 または null。
[[OutgoingMaxDatagramSize]] 送信データグラムの最大サイズを表す整数。
最大データグラムサイズは使用しているプロトコルによって異なる。 HTTP/3 [WEB-TRANSPORT-HTTP3] では、 値は経路の MTU の推定値に関係し、 実装依存の量だけオーバーヘッド分減算される。 HTTP/2 [WEB-TRANSPORT-HTTP2] には相当する上限はない。

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

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

作成するには、 WebTransportDatagramDuplexStream を、WebTransport transportreadable および readableType を指定して次の手順を行う。
  1. stream新しい WebTransportDatagramDuplexStream として次のように初期化する:

    [[Transport]]

    transport

    [[Readable]]

    readable

    [[ReadableType]]

    readableType

    [[Writables]]

    空の 順序付き集合

    [[IncomingDatagramsQueue]]

    空のキュー

    [[IncomingDatagramsPullPromise]]

    null

    [[IncomingMaxBufferedDatagrams]]

    実装依存の値

    [[IncomingDatagramsExpirationDuration]]

    null

    [[OutgoingMaxBufferedDatagrams]]

    実装依存の値

    この実装依存の値は、適切なスループットを確保しつつ、 伝送データの迅速性を損なわないように調整されるべき

    [[OutgoingDatagramsExpirationDuration]]

    null

    [[OutgoingMaxDatagramSize]]

    実装依存の整数値

  2. stream を返す

5.2. メソッド

createWritable()

WebTransportDatagramsWritableを作成する。

createWritable() メソッドが呼び出されたとき、ユーザーエージェントは次の手順を実行しなければならない:
  1. transportthis に関連付けられている WebTransport オブジェクトとする。

  2. もし transport.[[State]]"closed" または "failed" であれば、 throw を行い、InvalidStateErrorとする。

  3. sendGroupoptionssendGroup とする。

  4. もし sendGroup が null でなく、かつ sendGroup.[[Transport]]this.[[Transport]] でない場合、 throw を行い、InvalidStateErrorとする。

  5. sendOrderoptionssendOrder とする。

  6. transportsendGroupsendOrder を用いて 作成される WebTransportDatagramsWritable の結果を返す。

5.3. 属性

readableReadableStream 型、readonly

ゲッター手順は次の通り:

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

incomingMaxAge unrestricted double 型、nullable

ゲッター手順:

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

セッター手順、value を与えた場合:

  1. value が負または NaN の場合、throw RangeError

  2. value0 の場合、value を null にする。

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

maxDatagramSize unsigned long 型、readonly

WebTransportDatagramsWritable に渡すことができる最大データサイズ。 ゲッター手順は this.[[OutgoingMaxDatagramSize]] を返すこと。

outgoingMaxAge unrestricted double 型、nullable

ゲッター手順:

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

セッター手順、value を与えた場合:

  1. value が負または NaN の場合、 throw RangeError

  2. value0 の場合、value を null にする。

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

incomingMaxBufferedDatagramsunsigned long

ゲッター手順:

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

セッター手順、value を与えた場合:

  1. value1 より小さい場合、value1 にする。

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

outgoingMaxBufferedDatagramsunsigned long

ゲッター手順:

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

セッター手順、value を与えた場合:

  1. value1 より小さい場合、value1 にする。

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

5.4. 手順

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

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

  2. アサート: datagrams.[[IncomingDatagramsPullPromise]] は null である。

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

  4. queue が空の場合:

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

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

  5. datagramtimestampqueue から dequeue した結果とする。

  6. datagrams.[[ReadableType]]"bytes" の場合:

    1. datagrams.[[Readable]]current BYOB request view が null でない場合:

      1. viewdatagrams.[[Readable]]current BYOB request view とする。

      2. viewbyte lengthdatagram のサイズより小さい場合、 RangeError で reject された promise を返す。

      3. elementSizetyped array constructors tableview.[[TypedArrayName]] に指定された要素サイズとする。 view が [[TypedArrayName]] 内部スロットを持たない場合(つまり DataView の場合)、 elementSize を 0 とする。

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

    2. Pull from bytes datagramdatagrams.[[Readable]] に取り込む。

  7. それ以外の場合:

    1. chunkUint8Array オブジェクトで datagram を表す新しいものとする。

    2. Enqueue chunktransport.[[Datagrams]].[[Readable]] に追加する。

  8. Promise を undefined で resolve して返す。

receiveDatagrams の手順は、 WebTransport オブジェクト transport を指定して次の通り:

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

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

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

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

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

  6. session 上で 受信可能なデータグラム がある間:

    1. datagramreceive a datagram の結果とする。

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

    3. chunkdatagramtimestamp のペアとする。

    4. Enqueue chunkqueue に追加する。

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

  8. toBeRemoved が正の値の場合、dequeuequeue に対して toBeRemoved(切り捨てで)回繰り返す。

  9. queue が空でない間:

    1. bytestimestampqueue の先頭要素とする。

    2. timestamp から duration ミリ秒以上経過していたら dequeue queue を行う。

    3. そうでない場合、このループを break する。

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

    1. bytestimestampqueue から dequeue した結果とする。

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

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

    4. ネットワークタスクをキューし、transport に対して以下を実行する:

      1. chunkUint8Array オブジェクトで bytes を表す新しいものとする。

      2. Enqueue chunkdatagrams.[[Readable]] に追加する。

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

ユーザーエージェントは、receiveDatagramsWebTransport オブジェクトで [[State]]"connected" の場合、アルゴリズムが進行可能なときはできるだけ速やかに実行すべきである。

6. WebTransport インターフェース

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

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

  Promise<WebTransportConnectionStats> getStats();
  [NewObject] Promise<Uint8Array> exportKeyingMaterial(BufferSource label, optional BufferSource context);
  readonly attribute Promise<undefined> ready;
  readonly attribute WebTransportReliabilityMode reliability;
  readonly attribute WebTransportCongestionControl congestionControl;
  attribute [EnforceRange] unsigned short? anticipatedConcurrentIncomingUnidirectionalStreams;
  attribute [EnforceRange] unsigned short? anticipatedConcurrentIncomingBidirectionalStreams;
  [SameObject] readonly attribute Headers? responseHeaders;
  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. 内部スロット

A WebTransport オブジェクトは以下の内部スロットを持つ。

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

6.2. コンストラクター

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

  2. urlURLレコード とし、 パース urlbaseURL を用いて得る。

  3. url が失敗なら throw SyntaxError 例外。

  4. urlスキームhttps でなければ throw SyntaxError 例外。

  5. urlフラグメント が null でない場合 throw SyntaxError 例外。

  6. newConnectionoptionsallowPooling が true の場合は "no"、それ以外では "yes-and-dedicated" とする。

  7. serverCertificateHashesoptionsserverCertificateHashes とする。

  8. newConnection が "no" で serverCertificateHashes が空でない場合、 throw NotSupportedError 例外。

  9. requireUnreliableoptionsrequireUnreliable とする。

  10. congestionControloptionscongestionControl とする。

  11. congestionControl"default" でなく、ユーザーエージェントが congestionControl のためのスループット最適化アルゴリズムをサポートしない場合 [RFC9002] Section 7 に従い congestionControl"default" に設定する。

  12. protocolsoptionsprotocols とする。

  13. protocols の値の中で重複するものがあった場合、 WebTransportプロトコルで定義された交渉済みアプリケーションプロトコル値の要素要件に合致しない場合、 または isomorphic encode の長さが 0 または 512 を超える場合、 throw SyntaxError 例外。 [WEB-TRANSPORT-OVERVIEW] Section 3.1.

  14. anticipatedConcurrentIncomingUnidirectionalStreamsoptionsanticipatedConcurrentIncomingUnidirectionalStreams とする。

  15. anticipatedConcurrentIncomingBidirectionalStreamsoptionsanticipatedConcurrentIncomingBidirectionalStreams とする。

  16. datagramsReadableTypeoptionsdatagramsReadableType とする。

  17. incomingDatagrams新しい ReadableStream とする。

  18. transport を新しく構築した WebTransport オブジェクトとして、

    [[SendStreams]]

    空の 順序付き集合

    [[ReceiveStreams]]

    空の 順序付き集合

    [[IncomingBidirectionalStreams]]

    新しい ReadableStream

    [[IncomingUnidirectionalStreams]]

    新しい ReadableStream

    [[State]]

    "connecting"

    [[Ready]]

    新しい promise

    [[Reliability]]

    "pending"

    [[CongestionControl]]

    congestionControl

    [[AnticipatedConcurrentIncomingUnidirectionalStreams]]

    anticipatedConcurrentIncomingUnidirectionalStreams

    [[AnticipatedConcurrentIncomingBidirectionalStreams]]

    anticipatedConcurrentIncomingBidirectionalStreams

    [[ResponseHeaders]]

    null

    [[Protocol]]

    空文字列

    [[Closed]]

    新しい promise

    [[Draining]]

    新しい promise

    [[Datagrams]]

    undefined

    [[Session]]

    null

    [[NewConnection]]

    newConnection

    [[RequireUnreliable]]

    requireUnreliable

  19. transport.[[Datagrams]]WebTransportDatagramDuplexStream 作成 の結果に設定する。引数は transport, incomingDatagrams, datagramsReadableType.

  20. pullDatagramsAlgorithmpullDatagramstransport で実行するアクションとする。

    注記: データグラムには 64 kibibytes バッファを使うことを推奨。 WebTransport データグラムフレームサイズの効果的最大値は QUIC データグラムフレームサイズの上限であり、 推奨値は 64 kibibytes である ([QUIC-DATAGRAM] Section 3)。 バッファより大きいデータグラムのためにストリームがエラー化されないようにする。

  21. datagramsReadableType"bytes" の場合は、byte読み込みサポート付きセットアップincomingDatagrams に pullAlgorithm=pullDatagramsAlgorithm, highWaterMark=0 で実行 それ以外の場合は セットアップincomingDatagrams に pullAlgorithm=pullDatagramsAlgorithm, highWaterMark=0 で行う。

  22. pullBidirectionalStreamAlgorithmpullBidirectionalStreamtransport で実行するアクションとする。

  23. セットアップ transport.[[IncomingBidirectionalStreams]] に pullAlgorithm=pullBidirectionalStreamAlgorithm, highWaterMark=0 を設定する。

  24. pullUnidirectionalStreamAlgorithmpullUnidirectionalStreamtransport で実行するアクションとする。

  25. セットアップ transport.[[IncomingUnidirectionalStreams]] に pullAlgorithm=pullUnidirectionalStreamAlgorithm, highWaterMark=0 を設定する。

  26. clienttransport関連設定オブジェクト とする。

  27. originclientオリジン とする。

  28. request を新しい リクエストとし、URLurlclientclientservice-workers mode は "none", referrer は "no-referrer", mode は "webtransport", credentials mode は "omit", cache mode は "no-store", policy containerclientpolicy containerdestination は ""、 originoriginWebTransport-hash listserverCertificateHashesredirect mode は "error" とする。

    注記: リダイレクトはフォローされない。 リダイレクトによるネットワークエラーは他のエラーと区別されない。 クロスオリジンでは CORS により通常ブロックされる情報の漏洩を防ぐため。 同一オリジンではハンドシェイクを情報伝達の手段として濫用される可能性がある。

  29. requestmethod を "CONNECT" に設定、 method に関連づけられる :protocol 疑似ヘッダー"webtransport" に設定する。

  30. headers を新しい Headers オブジェクトとし filloptions["headers"] を用いる。

  31. requestHeaders を新しい Headers オブジェクトとし header listrequestheader listguard は "request" にする。

  32. header について headersheader list の:

    1. ascii小文字化した headername が "wt-available-protocols" の場合、 TypeError を throw。

    2. append headerrequestHeaders に追加する。

    注記: ヘッダーは Fetch の forbidden request-header 制限の対象。

  33. protocols が空でない場合、構造化フィールド値を設定で (WT-Available-Protocols, 構造化ヘッダーリスト、そのメンバが protocols で順序通り 構造化ヘッダー文字列項目)を requestheader list に設定する。

  34. Fetch request を useParallelQueue=true で、 processResponse には response を与えた場合の以下手順を設定:

    1. WebTransport fetch response 処理responsetransport を用いる。

  35. transport を返す。

WebTransport接続を取得するには、 ネットワークパーティションキー networkPartitionKey, リクエスト request を指定して:
  1. transportWebTransport オブジェクト (request に関連付けられているもの) とする。

  2. urlrequestcurrent URL とする。

  3. newConnectiontransport.[[NewConnection]] とする。

  4. requireUnreliabletransport.[[RequireUnreliable]] とする。

  5. webTransportHashesrequestWebTransport-hash list の値とする。

  6. connection接続の取得networkPartitionKey, url, false, newConnection, requireUnreliable, webTransportHashes を指定して得る結果とする。

  7. connection が失敗なら failure を返す。

  8. connection で最初の SETTINGS フレームを受信するまで待ち、 settings をその SETTINGS フレームを表す辞書とする。

  9. settingsSETTINGS_ENABLE_CONNECT_PROTOCOL (0x08, HTTP/2 の場合は Section 3、 HTTP/3 の場合は Section 3) が値1で含まれていなければ、failure を返す。

  10. settings がサーバーWebTransport対応を示していなければ failure を返す。 [WEB-TRANSPORT-OVERVIEW] Section 4.1.

    注記: SETTINGS_WT_MAX_SESSIONS は IETF 内で変更予定、SETTINGS_ENABLE_WEBTRANSPORT に戻る可能性がある。

  11. connection を返す。

WebTransport fetch response 処理は、 レスポンス responseWebTransport transport を指定し次の手順:
  1. responseネットワークエラーの場合、残りの手順を中止し ネットワークタスクをキューして transport に以下を実行:

    1. transport.[[State]]"closed" または "failed" の場合、これ以降の手順を中止。

    2. error を新しく create exception した WebTransportError とする。source"session"

    3. Cleanup transporterror を指定して行う。

  2. connectionresponse に関連付けられた下層接続とする。

  3. [WEB-TRANSPORT-OVERVIEW] Section 4.1 の制約に従い WebTransport セッション確立connection とサーバーの response で行い、 session を得る。 得られた下層トランスポートストリームはセッションの CONNECTストリーム と呼ぶ。

    注記: この手順は [QUIC-DATAGRAM] の トランスポートパラメータ交換も完結させる。

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

    1. transport.[[State]]"closed" または "failed" の場合、これ以降の手順を中止。

    2. error を新しく create exception した WebTransportError とする。source"session"

    3. Cleanup transporterror を指定して行う。

  5. ユーザーエージェントが複数の輻輳制御アルゴリズムに対応している場合は、 この connection の送信に transport[[CongestionControl]] に適したものを選ぶ。

  6. ネットワークタスクをキューして transport に以下を実行:

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

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

      1. 並列処理terminate session を行う。

      2. これ以降の手順を中止。

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

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

    5. responseHeadersresponseheader list のコピーにする。

    6. Delete "wt-protocol" を responseHeaders から削除。

    7. transport.[[ResponseHeaders]] を新しい Headers オブジェクトに設定。header list は responseHeaders、guard は "immutable"。

    8. transport.[[Protocol]] を、WebTransport Protocol Framework [WEB-TRANSPORT-OVERVIEW] Section 3.1 に従い、協議されたアプリケーションプロトコルの文字列値が存在すればそれ、なければ "" に設定する。

    9. 接続がHTTP/3の場合、transport.[[Reliability]]"supports-unreliable" に設定。

    10. 接続が HTTP/2 ([WEB-TRANSPORT-HTTP2]) の場合は transport[[Reliability]]"reliable-only" に設定。

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

pullBidirectionalStreamは、 WebTransport オブジェクト transport を指定し次の手順:
  1. transport.[[State]]"connecting" なら transport.[[Ready]]fulfillment時に 以下の手順を実行しその結果を返す:

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

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

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

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

  5. 並列処理で以下を行う:

    1. session双方向ストリーム受信可能になるまで待つ。

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

    3. ネットワークタスクをキューtransport に以下実行:

      1. streambidirectionalStream作成 の結果 (引数 internalStream, transport) とする。

      2. Enqueue streamtransport.[[IncomingBidirectionalStreams]] に追加。

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

  6. p を返す。

pullUnidirectionalStreamは、 WebTransport オブジェクト transport を指定し次の手順:
  1. transport.[[State]]"connecting" なら transport.[[Ready]]fulfillment時に 以下の手順を実行しその結果を返す:

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

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

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

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

  5. 並列処理で以下を行う:

    1. session単方向ストリーム受信可能 になるまで待つ。

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

    3. ネットワークタスクをキューtransport に以下実行:

      1. streamWebTransportReceiveStream作成 の結果 (internalStream, transport) とする。

      2. Enqueue streamtransport.[[IncomingUnidirectionalStreams]] に追加。

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

  6. p を返す。

6.3. 属性

ready, of type Promise<undefined>, readonly

取得時、this[[Ready]] を返す必要がある。

closed, of type Promise<WebTransportCloseInfo>, readonly

取得時、this[[Closed]] を返す必要がある。

draining, of type Promise<undefined>, readonly

取得時、this[[Draining]] を返す必要がある。

datagrams, of type WebTransportDatagramDuplexStream, readonly

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

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

incomingBidirectionalStreams, of type ReadableStream, readonly

ReadableStream で、サーバから受信したWebTransportBidirectionalStreamのストリームを返す。

Note: 着信ストリームに既にデータがあるかどうかはサーバの動作による。

incomingBidirectionalStreams 属性のゲッター手順は:

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

incomingUnidirectionalStreams, of type ReadableStream, readonly

サーバから受信した各WebTransportReceiveStream で表される単方向ストリームのReadableStream

Note: 着信ストリームに既にデータがあるかどうかはサーバの動作による。

incomingUnidirectionalStreamsのゲッター手順:

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

reliability, of type WebTransportReliabilityMode, readonly

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

congestionControl, of type WebTransportCongestionControl, readonly

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

supportsReliableOnly, of type boolean, readonly

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

anticipatedConcurrentIncomingUnidirectionalStreams, of type unsigned short, nullable

アプリがサーバで同時オープンされると予測する 着信単方向ストリーム数を指定できる。 nullでなければ、ユーザーエージェントは [[AnticipatedConcurrentIncomingUnidirectionalStreams]] をサーバとのネゴシエーションで考慮しラウンドトリップ削減を試みるべきである。

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

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

anticipatedConcurrentIncomingBidirectionalStreams, of type unsigned short, nullable

アプリがサーバで同時オープンされると予測する 双方向ストリーム数を指定できる。 nullでなければ、ユーザーエージェントは [[AnticipatedConcurrentIncomingBidirectionalStreams]] をサーバとのネゴシエーションで考慮しラウンドトリップ削減を試みるべきである。

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

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

Note: anticipatedConcurrentIncomingUnidirectionalStreams または anticipatedConcurrentIncomingBidirectionalStreams を設定しても、アプリが予測する本数のストリームを必ず受信できる保証はない。

responseHeaders Headers 型、readonly、nullable

WebTransportセッションが確立された後、 サーバーによって設定されたアプリケーションレベルのレスポンスヘッダーを保持します(あれば)。初期値はnullです。 ゲッター手順は this[[ResponseHeaders]] を返すことです。

protocol DOMString 型、readonly

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. Cleanup transporterror を指定して実行する。

    3. この手順を中止。

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

  5. codecloseInfo.closeCode とする。

  6. reasonStringコードユニットプレフィックスとして closeInfo.reason を最高1024バイト以下の 長さUTF-8エンコードする。

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

  8. 並列処理terminate sessioncodereason を指定して行う。

    注記: これは 送信中断受信中断transport.[[SendStreams]] および [[ReceiveStreams]] 内の WebTransportストリーム で行われる。

  9. Cleanup transportAbortErrorcloseInfo で実行する。

getStats()

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

getStatsが呼び出されたとき、ユーザーエージェントは次の手順を実行しなければならない:

  1. transportthis とする。

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

  3. transport.[[State]]"failed" なら、reject pInvalidStateError で返し、この手順を中止。

  4. 並列処理で以下を実行:

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

    2. transport.[[State]]"failed" なら、 ネットワークタスクをキューして transportreject pInvalidStateError で返してこの手順を中止。

    3. transport.[[State]]"closed" なら、 ネットワークタスクをキュー して transportresolve p コネクションの最新統計情報で返しこの手順を中止。統計収集時点は 実装依存である。

    4. gatheredStatsリストとして 基盤コネクションに固有で WebTransportConnectionStatsWebTransportDatagramStats の辞書メンバーを正確に埋めるために必要な統計情報を集めたものとする。

    5. ネットワークタスクをキューして transport に次の手順を実行:

      1. stats新規 WebTransportConnectionStats オブジェクトとする。

      2. datagramStats新規 WebTransportDatagramStats オブジェクトとする。

      3. stats["datagrams"] に datagramStats を設定。

      4. ユーザーエージェントが公開したい stats および datagramStats の各 メンバーについて、 set member に対応する エントリgatheredStats から設定。

      5. resolve pstats で返す。

  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. 並列処理で以下を実行(ただし abort when transport[[State]]"closed" または "failed" となった場合は ネットワークタスクをキューして transportreject pInvalidStateError で返す):

    1. keyingMaterialUint8Array とし [WEB-TRANSPORT-OVERVIEW] Section 4.1 のTLSキーエクスポーターを labelLength, label, contextLength, context(あれば)で呼び出して得る。

    2. ネットワークタスクをキューして transportresolve pkeyingMaterial で返す。

  9. p を返す。

createBidirectionalStream()

送信用双方向ストリームの WebTransportBidirectionalStream オブジェクトを生成します。ストリーム作成しただけでは相手ピア側にはすぐ反映されず、データ送信時に認識されます。

注記: サーバーがストリームの存在を認識するのはデータが送信されてからです。

createBidirectionalStreamを呼び出したとき、ユーザーエージェントは次の手順を実行しなければならない:
  1. this.[[State]]"closed" または "failed" なら、 新しい reject promise を InvalidStateError で返す。

  2. sendGroupoptionssendGroup とする。

  3. sendGroup が null でない、かつ sendGroup.[[Transport]]this と異なっていれば throw InvalidStateError を投げる。

  4. sendOrderoptionssendOrder とする。

  5. waitUntilAvailableoptionswaitUntilAvailable とする。

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

  7. transportthis とする。

  8. 並列処理で以下を実行(ただし abort when transport[[State]]"closed" または "failed" となった場合は ネットワークタスクをキューして transportreject pInvalidStateError で返す):

    1. streamIdtransport.[[Session]] 用に新規でかつ一意なストリームIDにする。 [QUIC] Section 19.11 に定義。 すぐ得られない場合、waitUntilAvailable が true なら入手まで待つ。 false なら ネットワークタスクをキューして transportreject pQuotaExceededError requested/quota両方nullで返しこの手順を中止。

    2. internalStreambidirectional stream作成 の結果 (transport.[[Session]], streamId) とする。

    3. ネットワークタスクをキュー して transport に次を実行:

      1. transport.[[State]]"closed" または "failed" なら reject pInvalidStateError で返しこの手順を中止。

      2. streambidirectionalStream作成 の結果 (internalStream, transport, sendGroup, sendOrder) とする。

      3. resolve pstreamで返す。

  9. p を返す。

createUnidirectionalStream()

送信用単方向ストリームの WebTransportSendStream を生成します。ストリームを作成しただけではサーバー側にはすぐ認識されません。データ送信時に認識されます。

注記: サーバーがストリームの存在を認識するのはデータが送信されてからです。

createUnidirectionalStream()メソッドが呼び出されたとき、ユーザーエージェントは次の手順を実行しなければならない:
  1. this.[[State]]"closed" または "failed" なら 新しい reject promise を InvalidStateError で返す。

  2. sendGroupoptionssendGroup とする。

  3. sendGroup が null でない、かつ sendGroup.[[Transport]]this と異なっていれば throw InvalidStateError を投げる。

  4. sendOrderoptionssendOrder とする。

  5. waitUntilAvailableoptionswaitUntilAvailable とする。

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

  7. transportthis とする。

  8. 並列処理で以下を実行(ただし abort when transport[[State]]"closed" または "failed" となった場合は ネットワークタスクをキューして transportreject pInvalidStateError で返す):

    1. streamIdtransport.[[Session]] 用に新規でかつ一意なストリームIDとする。 [QUIC] Section 19.11 に定義。 すぐ得られない場合、waitUntilAvailable が true なら入手まで待つ。 false なら ネットワークタスクをキューして transportreject pQuotaExceededError で返しこの手順を中止。

    2. internalStream単方向ストリーム作成 の結果 (transport.[[Session]], streamId) とする。

    3. ネットワークタスクをキュー して transport に次を実行:

      1. transport.[[State]]"closed" または "failed" なら reject pInvalidStateError で返しこの手順を中止。

      2. streamWebTransportSendStream作成 の結果 (internalStream, transport, sendGroup, sendOrder) とする。

      3. resolve pstream で返す。

  9. p を返す。

createSendGroup()

WebTransportSendGroup を生成します。

createSendGroup()メソッドが呼び出されたとき、ユーザーエージェントは次の手順を実行しなければならない:
  1. this.[[State]]"closed" または "failed" なら throw InvalidStateError を投げる。

  2. WebTransportSendGroup作成 の結果を this を引数にして返す。

6.5. 手順

WebTransport transporterror および オプションで closeInfo を用いて cleanup するには、次の手順を実行する:
  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]] に空の set を設定する。

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

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

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

  13. もし closeInfo が渡された場合、transport.[[State]]"closed" に設定する。 そうでなければ transport.[[State]]"failed" に設定する。

  14. sendStreams の各 stream について、次の手順を実行:

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

    2. Errorstreamerror でエラーにする。

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

    Note: スクリプト作成者はPromise解決時に同期的なコードを挿入できる。そのためここからは transport を触ってはならない。予測不可能な形で script により破壊されている場合がある。 この制約はこの手続きを呼び出すロジックにも適用される。

  16. もし closeInfo が渡された場合:

    1. ResolveclosedcloseInfo で解決する。

    2. Assert: readysettled である。

    3. CloseincomingBidirectionalStreams をクローズする。

    4. CloseincomingUnidirectionalStreams をクローズする。

    5. outgoingDatagramWritables の各 writable について、closewritable をクローズする。

    6. CloseincomingDatagrams をクローズする。

  17. それ以外:

    1. Rejectclosederror で拒否する。

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

    3. Rejectreadyerror で拒否する。

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

    5. ErrorincomingBidirectionalStreamserror でエラーにする。

    6. ErrorincomingUnidirectionalStreamserror でエラーにする。

    7. outgoingDatagramWritables の各 writable について、errorwritableerror でエラーにする。

    8. ErrorincomingDatagramserror でエラーにする。

WebTransport transport と 一連の steps で queue a network task するには、次の手順を実行する:

  1. グローバルタスクをキューし、 ネットワークタスクソースtransportrelevant global object を用いて steps を実行する。

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

WebTransport セッションが、WebTransport transport に関連付けられていて オプションで codereasonBytes とともに 終了するときは、次の手順を実行:
  1. ネットワークタスクをキューtransport で次の手順を実行する:

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

    2. error を新たに 作成した WebTransportErrorsource"session"

    3. closeInfo新しい WebTransportCloseInfo とする。

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

    5. もし reasonBytes が与えられていれば、closeInforeasonreasonBytesUTF-8 デコードした値で設定する。

      Note: reasonBytes には言語や方向のメタデータは含まれない。 表示時の方向には first-strong ヒューリスティクスを用いることができる。

    6. Cleanuptransport, error, closeInfo を渡す。

WebTransport transport基盤コネクション でコネクションエラーが発生した時は、次の手順を実行:
  1. ネットワークタスクをキューtransport で次の手順を実行する:

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

    2. error を新たに 作成した WebTransportErrorsource"session"

    3. Cleanuptransport, error を渡す。

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

この仕様では、コンテキストクリーンアップ手順を以下の手順として定義する。 WebTransport transport が与えられた場合:

  1. もし transport.[[State]]"connected" なら、次を行う:

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

    2. 並行してterminatetransport.[[Session]] に対して実行する。

    3. ネットワークタスクをキューに入れるtransport を与え、次の手順を実行する:

      1. error を、新たに 作成された WebTransportError とし、 その source"session" とする。

      2. Cleanuptransport に対して error を用いて行う。

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

    これはワーカーでも実施する必要がある。次を参照: #127 および whatwg/html#6731

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

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

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

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

確立済みWebTransport セッションを持ち、 ネットワークへ送信待ちのデータ([[Datagrams]].[[OutgoingDatagramsQueue]]内のデータグラムを含む)がある WebTransport オブジェクトは、ガベージコレクションされてはならない。

WebTransport オブジェクトが、基盤コネクション がまだ開いている間にガベージコレクションされた場合、 ユーザーエージェントは Application Error Code 0、Application Error Message "" でWebTransportセッションを終了 しなければならない。

6.9. 設定

dictionary WebTransportHash {
  required DOMString algorithm;
  required BufferSource value;
};

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

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

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

allowPooling boolean 型、初期値は false

true に設定すると、WebTransport セッションはプーリング可能(他の WebTransport セッションと 基盤コネクション を共有可能)になります。

requireUnreliable boolean 型、初期値は false

true に設定すると、WebTransport セッション は HTTP/2 の connection では確立できなくなり、 HTTP/3 の connection が不可能な場合は失敗します。

headers HeadersInit 型、初期値は {}

オプションで、Headers オブジェクトやオブジェクトリテラル、二要素配列の配列として指定可能。 request の header list は、この値で セッション確立 時に利用される。

serverCertificateHashes sequence<WebTransportHash> 型、初期値 []

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

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

これは allowPooling との併用は不可です。

congestionControl WebTransportCongestionControl 型、 初期値 "default"

オプションで、アプリケーションがスループット最適化または低遅延に特化した輻輳制御アルゴリズムを希望する場合に指定。 この値はユーザーエージェントへのヒントとなります。

この設定オプションはブラウザで低遅延向け輻輳制御アルゴリズムが実装されていないため危険扱い(at risk)です。

anticipatedConcurrentIncomingUnidirectionalStreams unsigned short 型、nullable、初期値 null

オプションで、アプリケーションがサーバーにより同時生成される 受信単方向ストリーム数を指定できます。 ユーザーエージェントは、サーバーから最低100の 受信単方向 ストリームを初期状態で許可します。 nullでない場合、ラウンドトリップ削減のため [[AnticipatedConcurrentIncomingUnidirectionalStreams]] をサーバーとの協議時に考慮しようとします。

anticipatedConcurrentIncomingBidirectionalStreams unsigned short 型、nullable、初期値 null

オプションで、アプリケーションがサーバーにより同時生成される 双方向ストリーム数を指定できます。 ユーザーエージェントは、サーバーが最低100の 双方向ストリームを生成可能とします。 nullでない場合、ラウンドトリップ削減のため [[AnticipatedConcurrentIncomingBidirectionalStreams]] をサーバーとの協議時に考慮しようとします。

protocols sequence<DOMString> 型、初期値 []

アプリケーションレベルの プロトコル名配列(オプション)。 サーバー側は推奨プロトコルを選択してクライアントに通知するか任意。適切なプロトコルが指定されなかった場合リクエスト拒否もあり得ます。

datagramsReadableType ReadableStreamType

オプションで、受信データグラム用の readable byte stream を使いたい場合に指定。 未指定ならデフォルトの readable stream が用いられます。

注記: readable stream はデータグラムの意味論と互換性がありますが、 readable byte stream はそうではありません。データグラムは意味のあるメッセージ(0以上バイト)で順不同に到達するため、単なるバイト列とは異なります。 空のデータグラムは失われますし、 min ではメッセージの区切りが失われます。

証明書ハッシュを計算するために、certificate を与え、次の手順を実行する:

  1. certcertificate とし、[RFC5280] で定義される Certificate メッセージの DER エンコーディングとして表現する。

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

証明書ハッシュを検証するために、certificate chain とハッシュ配列 hashes を与え、次の手順を実行する:

  1. certificatecertificate chain の最初の証明書(リーフ証明書)とする。

  2. referenceHash を、certificate を用いて証明書ハッシュを計算した結果とする。

  3. hashes 内のすべてのハッシュ hash について:

    1. もし hash.value が null でなく、かつ hash.algorithm が "sha-256" とASCII 大文字小文字非区別で一致するなら:

      1. hashValue を、hash.value が表すバイト列とする。

      2. もし hashValuereferenceHash に等しいなら、true を返す。

  4. false を返す。

カスタム証明書要件は次のとおりである: 証明書は[RFC5280]で定義される X.509v3 証明書でなければならず、 Subject Public Key フィールドで使用される鍵は許可された公開鍵アルゴリズムのいずれかでなければならない。 現在時刻は、[RFC5280] のセクション 4.1.2.5 で定義される証明書の有効期間内でなければならず、 有効期間の総期間は 2 週間を超えてはならない。ユーザーエージェントは証明書に対して追加の 実装定義の要件を課すことができる。

Subject Public Key Info フィールド(その結果として TLS の CertificateVerify メッセージにおいて)で使用される許可された公開鍵アルゴリズムの正確なリストは実装定義である。しかし、相互運用可能な既定とするために、secp256r1(NIST P-256)名前付きグループを用いた ECDSA([RFC3279]、 セクション 2.3.5;[RFC8422])を含めなければならない。 RSA 鍵([RFC3279]、 セクション 2.3.1)は含めてはならない。

6.10. WebTransportCloseInfo辞書

WebTransportCloseInfo辞書は、 終了処理時に WebTransportセッションのエラーコードと理由を設定するための情報を含みます。

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

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

closeCodeunsigned long 型、初期値 0

ピアに通知されるエラーコード。

reasonUSVString 型、初期値 ""

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セッションが同一の connection上でプールされ、 全て同じ情報を受け取ります。つまり、この情報は同一 セッション間で ネットワークパーティションキー を保持している場合公開されます。

注記: 利用できない統計情報は mapに存在しない状態で WebTransportConnectionStats 辞書に入ります。

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

この辞書は以下の属性を持つものとする:

bytesSent unsigned long long

基盤コネクションで送信されたペイロードバイト数(フレームや再送オーバーヘッド除く)。

bytesSentOverhead unsigned long long

bytesSent バイトのペイロードを 基盤コネクション 上で送信した際のフレーミング・再送オーバーヘッド(バイト単位)。

bytesAcknowledged unsigned long long

QUIC の ACK 機構によりサーバーから受領確認されたペイロードバイト数(フレーム除く)。 基盤コネクションでの値。

注記: 通常は bytesSent より遅れますが、パケットロスにより永続的に小さいこともあります。

bytesAcknowledgedWebTransportConnectionStats 内)は実装懸念があり、Working Group により危険扱いとなっています。
packetsSent unsigned long long

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

bytesLost unsigned long long

基盤コネクションで失われたバイト数 (UDPなど外部フレームは含まず。パケットが失われた後で受信されることもあり、単調増加でない)。

packetsLost unsigned long long

基盤コネクションで失われたパケット数 (パケットが失われた後で受信されることもあり、単調増加でない)。

bytesReceived unsigned long long

基盤コネクションで受信したバイト数(ストリームの重複データ含む。UDP等外部フレーム除く)。

packetsReceived unsigned long long

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

smoothedRtt DOMHighResTimeStamp

現在観測されている往復遅延(RTT)の平滑値。 [RFC9002] Section 5.3 の定義。

rttVariation DOMHighResTimeStamp

現在観測されている往復遅延サンプルの平均変動値。 [RFC9002] Section 5.3 の定義。

minRtt DOMHighResTimeStamp

コネクション全体で観測された最低往復遅延。 [RFC9002] Section 5.2 の定義。

estimatedSendRate unsigned long long 型、nullable、初期値 null

ユーザーエージェントによる送信予定データの推定レート(bps)。 このレートは WebTransportセッション を共有する全ストリーム・データグラムに適用され、 輻輳制御アルゴリズム( congestionControl で決まる可能性あり) により算出される。フレーミングオーバーヘッドを除外し、 アプリケーションペイロードとして送信され得る速度を表す。 推定値がない場合は null。 過去は nullでなかった場合も、現時点でnullになり得る。

atSendCapacity boolean 型、初期値 false

false の場合、estimatedSendRate はアプリケーション側制限値である可能性(輻輳制御よりもアプリ側がずっと少ないデータしか送信していない場合)。 アプリ制限時、輻輳制御はネットワーク容量の推定値が不正確になり得る。

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

atSendCapacitytrue の場合、 estimatedSendRate は上限値(ceiling)を反映します。 アプリ送信レートが持続している限り、 estimatedSendRate はネットワーク状況に適応します。 ただし estimatedSendRatenull になり得ます( atSendCapacity が true の時でも)。

6.14. WebTransportDatagramStats辞書

WebTransportDatagramStats 辞書には 基盤コネクション 上のデータグラム送受信に関する統計が含まれる。

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

この辞書は以下の属性を持つものとする:

droppedIncoming, unsigned long long

アプリケーションがdatagramsreadable から読み出す前に、受信キューが新しいデータグラムであふれてしまったために廃棄された受信データグラムの数。

expiredIncoming, unsigned long long

incomingMaxAge よりも古くなったため、datagramsreadable から読み出される前に廃棄された受信データグラムの数。

expiredOutgoing, unsigned long long

送信待ちキュー内のデータグラムがoutgoingMaxAge よりも古くなったため送信される前に廃棄された数。

lostOutgoing, unsigned long long

送信済みデータグラムのうちロスト([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. 属性

sendGroupWebTransportSendGroup 型、nullable

ゲッター手順:

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

セッター手順(value を与えた場合):

  1. value が null でなく、 value.[[Transport]]this[[Transport]] と異なる場合、 throw InvalidStateError を投げる。

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

sendOrderlong long

ゲッター手順:

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

セッター手順(value を与えた場合):

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

7.2. メソッド

getStats()

この WebTransportSendStream の性能に関する統計情報を収集し、 非同期で結果を報告します。

getStatsが呼び出されたとき、ユーザーエージェントは次の手順を実行しなければならない:

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

  2. 並列処理で以下実行:

    1. gatheredStatsリストとして、 this WebTransportSendStream の統計情報で WebTransportSendStreamStats辞書メンバーを正確に埋めるために必要なものとする。

    2. ネットワークタスクをキューして transport に次を実行:

      1. stats新規 WebTransportSendStreamStats オブジェクトとする。

      2. statsの各メンバーで ユーザーエージェントが公開したいものについて set member に gatheredStatsの対応する を設定する。

      3. resolve pstatsで返す。

  3. p を返す。

getWriter()

このメソッドは、 getWriterWritableStreamから継承) と同様に実装されますが、 WritableStreamDefaultWriter を作成する代わりに、 WebTransportWriterthis作成しなければなりません。

7.3. 内部スロット

WebTransportSendStream は以下の内部スロットを持つ。

内部スロット 説明 (非規範的)
[[InternalStream]] 送信単方向または双方向 WebTransportストリーム
[[PendingOperation]] 保留中の書き込みやclose操作を表すpromise、またはnull。
[[Transport]] WebTransport は、この WebTransportSendStream を所有する。
[[SendGroup]] オプションのWebTransportSendGroup 、またはnull。
[[SendOrder]] オプションの送信順序番号。初期値は0。
[[AtomicWriteRequests]] 順序付き集合 で、下層sinkで処理待ちの書き込み要求のうちatomicなものを追跡するpromiseの集合。
[[InsideSynchronousAtomicWrite]] atomicWrite メソッドの同期パート内のみtrueになるboolean。
[[BytesWritten]] ストリームに書き込まれたバイト数。
[[CommittedOffset]] ストリーム中でピアに配送されるバイト数を記録するオフセット( 送信中断後も)。 [RELIABLE-RESET]参照。

7.4. 手続き

作成するには、 WebTransportSendStream を、送信単方向または双方向 WebTransportストリーム internalStreamWebTransport transportsendGroupsendOrderを指定し、次の手順を実行する:

  1. stream新しい WebTransportSendStream として次のように初期化する:

    [[InternalStream]]

    internalStream

    [[PendingOperation]]

    null

    [[Transport]]

    transport

    [[SendGroup]]

    sendGroup

    [[SendOrder]]

    sendOrder

    [[AtomicWriteRequests]]

    空の順序付き集合のpromise

    [[InsideSynchronousAtomicWrite]]

    false

    [[BytesWritten]]

    0

    [[CommittedOffset]]

    0

  2. writeAlgorithmwrite chunkstream に書き込むアクション(chunkを指定)とする。

  3. closeAlgorithmclose stream とするアクションとする。

  4. abortAlgorithmabort reason を指定して stream を中断するアクションとする。

  5. セットアップ stream に、 writeAlgorithmwriteAlgorithm に、 closeAlgorithmcloseAlgorithm に、 abortAlgorithmabortAlgorithm に設定して実行する。

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

  7. Add 以下の手順を abortSignal に追加する:

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

    2. pendingOperation が null ならこれ以降中止。

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

    4. reasonabortSignalabort reasonとする。

    5. promiseabort streamreason を指定した結果とする。

    6. fulfillment時promise がresolveされたら reject pendingOperationreason で返す。

  8. append streamtransport.[[SendStreams]] に追加する。

  9. stream を返す。

write は、WebTransportSendStream streamchunk を送信する手順:

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

  2. chunkBufferSource 型でなければ、 TypeErrorでrejectされたpromise を返す。

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

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

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

  6. inFlightWriteRequeststreaminFlightWriteRequest とする。

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

  8. 並列処理で以下を実行:

    1. atomic が true で現在のフロー制御 ウィンドウが bytes の全体送信に不足している場合、 この手順以降中止し、 ネットワークタスクをキューして transport に次のサブ手順を実行:

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

      2. atomic書き込み要求全中断stream で実行。

    2. そうでない場合、 send bytesstream.[[InternalStream]] で送信し、完了まで待つ。 この送信は同Transportでキュー済みストリーム・データグラムや これからキューされるストリーム・データグラムとインターリーブしてよい。

      ユーザーエージェントは転送性能向上のためバッファを持つ場合がある。 バッファは固定上限を設け、WebTransportSendStream の利用者にバックプレッシャー情報を伝えるべき。

      この送信は、同じ[[SendGroup]] かつ[[SendOrder]] がより高いストリームの送信(エラーでなく、フロー制御でブロックされていないもの)が完了するまで starvationしなければならない。

      stream.[[SendOrder]] をここで並列処理でアクセスする。 ユーザーエージェントは送信中の値のライブ更新にも対応すべきだが、 詳細は実装依存である。

      注記: 再送順序は 実装依存だが、 ユーザーエージェントは[[SendOrder]] 値が高い方を優先再送することが推奨される。

      その他のstarvationは フロー制御エラーの場合のみ許される。

      ユーザーエージェントはstarveされていない全ストリームに公平に帯域を分配すべき。

      注記: 公平性の定義は 実装依存です。

    3. 先の手順でネットワークエラーが原因で失敗した場合、以降の手順を中止。

      注記: ここでは promise を reject しません。 ネットワークエラーの処理は別の手順で行われ、 そちらで stream.[[PendingOperation]] が reject されるためです。

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

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

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

      3. stream.[[AtomicWriteRequests]]inFlightWriteRequestを含む場合、 remove inFlightWriteRequest を行う。

      4. resolve promise を undefined で返す。

  9. promise を返す。

注記: このアルゴリズム(または write(chunk)) から返されるpromiseのfulfillmentは、 サーバー[QUIC]からackされたことを必ずしも意味しません。 実際はバッファへ追加されたことを意味します。 chunkがサーバーに到着したことを確認したい場合、 サーバー側でアプリケーションレベルのackメッセージを送信する必要があります。

closeWebTransportSendStream stream を閉じるには、次を実行する:
  1. transportstream.[[Transport]] とする。

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

  3. Removestreamtransport.[[SendStreams]] から取り除く。

  4. stream.[[PendingOperation]]promise をセットする。

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

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

    2. stream.[[InternalStream]] が "all data committed" 状態に遷移するまで待機。[QUIC]

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

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

      2. resolvepromise に undefined を渡す。

  6. promise を返す。

abortWebTransportSendStream streamreason 付きで中止するには、次の手順を実行する:
  1. transportstream.[[Transport]] とする。

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

  3. code を 0 とする。

  4. Removestreamtransport.[[SendStreams]] から取り除く。

  5. もし reasonWebTransportError でありかつ reason.[[StreamErrorCode]] が null でなければ、その値を code にセットする。

  6. もし code < 0 なら、code を 0 にセットする。

  7. もし code > 4294967295 なら、code を 4294967295 にセットする。

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

    注記: code の有効範囲は 0~4294967295。 基礎接続 が HTTP/3 の場合は コードは [0x52e4a40fa8db, 0x52e5ac983162] にエンコードされる。 [WEB-TRANSPORT-HTTP3] を参照。

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

    1. 送信中止stream.[[InternalStream]]code および committedOffset で行う。

    2. ネットワークタスクをキューし、 transportresolvepromise に undefined を渡す。

  10. promise を返す。

全atomic書き込み要求を中断するには、 WebTransportSendStream stream を指定して次の手順を行う:
  1. writeRequestsstream.writeRequests とする。

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

  3. writeRequestsrequestsToAbortに含まれないpromise を含む場合、 streamをエラー化し、 AbortError を投げ、この手順を中止する。

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

  5. requestsToAbortの各 promise について reject promiseAbortError で返す。

  6. 並列で、 requestsToAbortの各 promiseについて、そのpromiseに関連する byte送信を中断する。

7.5. サーバーから送信された受信中止シグナルの受信

サーバーからreceiving aborted(受信中止)のシグナルを受け取ったとき、WebTransportSendStream stream に関連付けられたWebTransport streamに対し、次の手順を実行する:
  1. transportstream.[[Transport]] とする。

  2. code を、receiving aborted シグナルに付随するアプリケーションプロトコルのエラーコードとする。

    Note: code の有効な値は 0 から 4294967295(両端を含む)。underlying connection が HTTP/3 を使用している場合、コードは [WEB-TRANSPORT-HTTP3] に記載のとおり [0x52e4a40fa8db, 0x52e5ac983162] の範囲の数値にエンコードされる。

  3. Queue a network tasktransport で実行し、次の手順を行う:

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

    2. Remove を行い、transport.[[SendStreams]] から stream を取り除く。

    3. error を、新たに 作成された WebTransportError とし、 その source"stream"、かつ streamErrorCodecode とする。

    4. もし stream.[[PendingOperation]] が null でないなら、stream.[[PendingOperation]]error で reject する。

    5. Error を行い、streamerror でエラー状態にする。

7.6. WebTransportSendStreamStats辞書

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

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

この辞書は以下の属性を持つものとする:

bytesWritten, unsigned long long

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

bytesSent, unsigned long long

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

Note: これは単一ストリームで送信されたアプリデータの進捗のみを示し、ネットワークのオーバーヘッドは含まない。

bytesAcknowledged, unsigned long long

この WebTransportSendStream に書き込み済みのアプリケーションバイトがサーバのQUIC ACK機構で送信・受信確認されたバイトの進捗指標。最初の未確認バイト未満までの連続したバイトのみをカウント。この値は増加のみ行われ、常に bytesSent 以下となる。

Note: この値はコネクションがHTTP/2の場合、 bytesSent と一致する。

8. インターフェイス WebTransportSendGroup

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

WebTransportSendStreamWebTransportDatagramsWritable は、 作成時または sendGroup 属性の割り当てによって、任意の時点で最大1つの WebTransportSendGroup または null sendGroup の下でグループ化されます。 デフォルトでは、WebTransportSendStreamWebTransportDatagramsWritablenull sendGroup に割り当てられます。

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

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

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

8.1. メソッド

getStats()

この WebTransportSendStreamgrouped した全ストリームの統計情報を集計し、 結果を非同期で報告します。

getStatsが呼び出されたとき、ユーザーエージェントは次の手順を実行しなければならない:

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

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

  3. 並列処理で以下を実行:

    1. gatheredStats を、streams内のすべてのストリームから集計した統計情報の リストとして、 WebTransportSendStreamStats辞書メンバーを正確に埋めるために必要なものとする。

    2. ネットワークタスクをキューして transport に以下を実行:

      1. stats新規 WebTransportSendStreamStats オブジェクトとする。

      2. statsの各メンバーで ユーザーエージェントが公開したいものについて set member に gatheredStatsの対応する を設定する。

      3. resolve pstatsで返す。

  4. p を返す。

8.2. 内部スロット

WebTransportSendGroup は以下の内部スロットを持つ。

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

8.3. 手続き

SendGroup を作成するには、 WebTransportSendGroupWebTransport transport を用いて、以下の手順を実行する:

  1. sendGroup新しい 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. p を新しい Promise とする。

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

    1. gatheredStats を、リストthis WebTransportReceiveStream に特化した統計)とし、WebTransportReceiveStreamStats辞書メンバーを正確に埋めるために必要なものとする。

    2. ネットワークタスクをキューに入れtransport を用いて次の手順を実行する:

      1. stats を、newWebTransportReceiveStreamStats オブジェクトとする。

      2. ユーザーエージェントが公開したい stats の各メンバー member について、set を行い、gatheredStats 内の対応するエントリに設定する。

      3. Resolve を行い、pstats で解決する。

  3. p を返す。

9.2. 内部スロット

WebTransportReceiveStream には以下の内部スロットがあります。

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

9.3. 手続き

create を、 WebTransportReceiveStream に対して、incoming unidirectional または bidirectionalWebTransport stream internalStream と、WebTransport transport を用いて実行するには、次の手順を行う:

  1. stream を、newWebTransportReceiveStream とし、以下を持つものとする:

    [[InternalStream]]

    internalStream

    [[Transport]]

    transport

  2. pullAlgorithm を、pulls bytesstream から行うアクションとする。

  3. cancelAlgorithm を、cancelsstream に対して reason を与えて実行するアクションとし、 reason を与えた場合に stream をキャンセルするものとする。

  4. Set up with byte reading support を用いて stream をセットアップし、 pullAlgorithmpullAlgorithm に、 cancelAlgorithmcancelAlgorithm に設定する。

  5. Append を行い、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. buffer新規 ArrayBuffer (サイズ maxBytes)に設定。ArrayBufferの割り当てが失敗した場合、 RangeErrorでrejectされたpromise を返す。

  7. 並列処理で以下を実行:

    1. Write internalStream から読み取られたバイトbufferoffset から最大 maxBytes バイト分書き込む。 少なくとも1バイト読むかFIN受信まで待つ。 read を読み取ったバイト数、hasReceivedFIN をFIN同行有無とする。

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

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

    2. 先の手順で失敗した場合以降を中止する。

      注記: ここで promise を reject しない理由は、ネットワークエラーの処理は他の工程で行われ、 その工程では stream をエラー状態にし、この pull を待つ read 要求が reject されるためです。

    3. ネットワークタスクをキューして transport に次の手順を実行:

      注記: 上記バッファがこの手続きの実行イベントループ内で利用可能なら以下は即時実行可。

      1. read > 0の場合:

        1. view を新しい Uint8Array (buffer, offset, read)に設定。

        2. viewstream にenqueue。

      2. hasReceivedFIN がtrueの場合:

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

        2. stream をclose。

      3. promise を undefined でresolve。

  8. promise を返す。

cancelWebTransportReceiveStreamstream に対して reason を用いて行うための手順は次のとおり。

  1. transport を、stream.[[Transport]] とする。

  2. internalStream を、stream.[[InternalStream]] とする。

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

  4. code を 0 とする。

  5. もし reasonWebTransportError であり、かつ reason.[[StreamErrorCode]] が null でないなら、codereason.[[StreamErrorCode]] に設定する。

  6. もし code < 0 なら、code を 0 に設定する。

  7. もし code > 4294967295 なら、code を 4294967295 に設定する。

    Note: code の有効な値は 0 から 4294967295(両端を含む)。underlying connection が HTTP/3 を使用している場合、コードは [WEB-TRANSPORT-HTTP3] に記載のとおり [0x52e4a40fa8db, 0x52e5ac983162] の範囲の数値にエンコードされる。

  8. Remove を行い、streamtransport.[[SendStreams]] から取り除く。

  9. 次の手順を 並行して実行する:

    1. Abort receivinginternalStream に対して code を用いて行う。

    2. Queue a network tasktransport で実行し、次の手順を行う:

      Note: 上で述べたバッファが、この手続きが実行されている event loop 内で利用可能な場合、以下の手順は直ちに実行されることがある。

      1. Remove を行い、streamtransport.[[ReceiveStreams]] から取り除く。

      2. Resolve を行い、promise を undefined で解決する。

  10. promise を返す。

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

サーバーからsending aborted(送信中止)のシグナルを受け取ったとき、WebTransportReceiveStream stream に関連付けられたWebTransport streamに対し、次の手順を実行する:
  1. transportstream.[[Transport]] とする。

  2. code を、sending aborted シグナルに付随するアプリケーションプロトコルのエラーコードとする。

    Note: code の有効な値は 0 から 4294967295(両端を含む)。underlying connection が HTTP/3 を使用している場合、コードは [WEB-TRANSPORT-HTTP3] に記載のとおり [0x52e4a40fa8db, 0x52e5ac983162] の範囲の数値にエンコードされる。

  3. Queue a network tasktransport で実行し、次の手順を行う:

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

    2. Remove を行い、transport.[[ReceiveStreams]] から stream を取り除く。

    3. error を、新たに 作成された WebTransportError とし、 その source"stream"、かつ streamErrorCodecode とする。

    4. Error を行い、streamerror でエラー状態にする。

9.5. WebTransportReceiveStreamStats辞書

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

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

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

bytesReceived, unsigned long long

サーバアプリケーションがこの WebTransportReceiveStream に対して送信しようとしたバイトのうち、これまでに受信された進捗を示す指標。 連続している最初の欠損バイト直前までのバイトのみがカウントされる。この値は増加のみ行われる。

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

bytesRead, unsigned long long

アプリケーションがこの 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 型、readonly

ゲッター手順は、this[[Readable]] を返すことです。

writable WebTransportSendStream 型、readonly

ゲッター手順は、this[[Writable]] を返すことです。

10.3. 手続き

双方向ストリームを作成するには、WebTransportBidirectionalStream双方向 WebTransportストリーム internalStreamWebTransport オブジェクト transportsendOrder を指定して次の手順を実行する。
  1. readableWebTransportReceiveStream作成 の 結果 (internalStream, transport) とする。

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

  3. stream新規 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 はデータがパケット間で分割されたり他データとインターリーブされることを防ぎません。 フロー制御クレジット不足により失敗したことは送信側のみ検出可能です。

注記: atomic write は 非atomic writeの裏にキューされるとブロックされる場合があります。 atomic write が reject された場合、その時点でキューされていた全ては reject されます。 非atomic write がこの方法で reject された場合は ストリームエラーになります。 よってアプリケーションはatomic writeを常にawaitすることが推奨されます。

atomicWrite(chunk) が呼び出された場合、ユーザーエージェントは次の手順を実行する:

  1. streamthis.stream とする。

  2. stream が undefined なら TypeErrorでrejectされたpromise を返す。

  3. stream.[[InsideSynchronousAtomicWrite]] を true に設定。

  4. pwrite(chunk) on WritableStreamDefaultWriterchunk を渡して実行した結果とする。

  5. stream.[[InsideSynchronousAtomicWrite]] を false に設定。

  6. append pstream.[[AtomicWriteRequests]] に追加。

  7. reacting to p の結果として次を返す:

    1. stream.[[AtomicWriteRequests]]pを含む場合、 remove p

    2. pr で reject なら、rでrejectされたpromise を返す。

    3. undefined を返す。

commit()

commit メソッドは、ストリームの [[CommittedOffset]] を そのストリームで書き込んだバイト数([[BytesWritten]])と 一致させるよう更新します。 この操作によりストリームで書いたバイトは、書き込みが中断された場合も、 送信中断後でも ピアに確実に配送されます。 これは [RELIABLE-RESET] の仕組みを使います。

注記: この操作はコネクションが失敗した場合の配送保証ではありません。 ストリームが送信中断された場合のみ確実な配送が保証されます。

commitstream に対して呼び出されたとき、ユーザーエージェントは次の手順を実行:

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

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

11.2. 手続き

作成するには、 WebTransportWriter を、WebTransportSendStream streamで、次の 手順を実行する:

  1. writer新しい 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、読み取り専用

ゲッター手順は、this[[Source]] を返すことです。

streamErrorCode型は unsigned long、読み取り専用、nullable

ゲッター手順は、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の効果
セッションが draining 状態になる 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の効果
セッションが draining 状態になる 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の効果
WT_STOP_SENDING(エラー付き)を受信 errors writablestreamErrorCode付き)
WT_STREAM を受信 (await readable.getReader().read()).value
WT_STREAM(FINビット付き) を受信 (await readable.getReader().read()).done
WT_RESET_STREAM(エラー付き)を受信 errors readablestreamErrorCode付き)
セッションが正常に terminated(closeInfo付き)される
(await wt.closed).closeInfo、 かつ errors open streams
ネットワークエラー
(await wt.closed) がrejectし、 errors open streams
セッションが draining 状態になる 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 の設定、そして WebTransport プロトコルを識別するための :protocol 擬似ヘッダーの組み合わせを用いる。[WEB-TRANSPORT-HTTP2] では、ALPN、HTTP/2 の設定、 そして WebTransport プロトコルを識別するための :protocol 擬似ヘッダーの組み合わせを用いる。

  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リーダー を取得できる。この例では64キビバイトのメモリバッファにデータグラムを読み出している。

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. コンテンツセキュリティポリシー レベル3。2026年3月11日。WD。URL: https://www.w3.org/TR/CSP3/
[DOM]
Anne van Kesteren. 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 標準。リビングスタンダード。URL: https://encoding.spec.whatwg.org/
[FETCH]
Anne van Kesteren. Fetch 標準。リビングスタンダード。URL: https://fetch.spec.whatwg.org/
[HR-TIME-3]
Yoav Weiss. 高精度時間。2026年3月2日。WD。URL: https://www.w3.org/TR/hr-time-3/
[HTML]
Anne van Kesteren; et al. HTML 標準。リビングスタンダード。URL: https://html.spec.whatwg.org/multipage/
[INFRA]
Anne van Kesteren; Domenic Denicola. Infra 標準。リビングスタンダード。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; et al. インターネット 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. TLS1.2以前のトランスポート層セキュリティ(ECC)暗号スイート。2018年8月。提案標準。URL: https://www.rfc-editor.org/rfc/rfc8422
[RFC8441]
P. McManus. HTTP/2でのWebSocketブートストラップ。2018年9月。提案標準。URL: https://httpwg.org/specs/rfc8441.html
[RFC9002]
J. Iyengar, Ed.; I. Swett, Ed.. QUIC 損失検出と輻輳制御。2021年5月。提案標準。URL: https://www.rfc-editor.org/rfc/rfc9002
[RFC9220]
R. Hamilton. HTTP/3でのWebSocketブートストラップ。2022年6月。提案標準。URL: https://httpwg.org/specs/rfc9220.html
[RFC9525]
P. Saint-Andre; R. Salz. TLSのサービスアイデンティティ。2023年11月。提案標準。URL: https://www.rfc-editor.org/rfc/rfc9525
[STREAMS]
Adam Rice; et al. Streams 標準。リビングスタンダード。URL: https://streams.spec.whatwg.org/
[URL]
Anne van Kesteren. URL 標準。リビングスタンダード。URL: https://url.spec.whatwg.org/
[WEB-TRANSPORT-HTTP2]
Alan Frindell; et al. HTTP/2上のWebTransport。インターネットドラフト。URL: https://datatracker.ietf.org/doc/html/draft-ietf-webtrans-http2
[WEB-TRANSPORT-HTTP3]
Alan Frindell; Eric Kinnear; Victor Vasiliev. HTTP/3上のWebTransport。インターネットドラフト。URL: https://datatracker.ietf.org/doc/html/draft-ietf-webtrans-http3
[WEB-TRANSPORT-OVERVIEW]
Victor Vasiliev. WebTransport プロトコル フレームワーク。インターネットドラフト。URL: https://datatracker.ietf.org/doc/html/draft-ietf-webtrans-overview
[WEBIDL]
Edgar Chen; Timothy Gu. 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 unsigned long incomingMaxBufferedDatagrams;
  attribute unsigned long outgoingMaxBufferedDatagrams;
};

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

  Promise<WebTransportConnectionStats> getStats();
  [NewObject] Promise<Uint8Array> exportKeyingMaterial(BufferSource label, optional BufferSource context);
  readonly attribute Promise<undefined> ready;
  readonly attribute WebTransportReliabilityMode reliability;
  readonly attribute WebTransportCongestionControl congestionControl;
  attribute [EnforceRange] unsigned short? anticipatedConcurrentIncomingUnidirectionalStreams;
  attribute [EnforceRange] unsigned short? anticipatedConcurrentIncomingBidirectionalStreams;
  [SameObject] readonly attribute Headers? responseHeaders;
  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 {
  required DOMString algorithm;
  required BufferSource value;
};

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

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;
  unsigned long long bytesSentOverhead;
  unsigned long long bytesAcknowledged;
  unsigned long long packetsSent;
  unsigned long long bytesLost;
  unsigned long long packetsLost;
  unsigned long long bytesReceived;
  unsigned long long packetsReceived;
  DOMHighResTimeStamp smoothedRtt;
  DOMHighResTimeStamp rttVariation;
  DOMHighResTimeStamp minRtt;
  required WebTransportDatagramStats datagrams;
  unsigned long long? estimatedSendRate = null;
  boolean atSendCapacity = false;
};

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

[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;
  unsigned long long bytesSent;
  unsigned long long bytesAcknowledged;
};

[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;
  unsigned long long bytesRead;
};

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

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

bytesAcknowledgedWebTransportConnectionStats において、実装可能性に関する懸念からワーキンググループによりリスクあり機能(feature at risk)と識別されている。