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]で定義された以下の機能があります:
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。 |
WebTransportDatagramsWritable
を
WebTransport
transport、sendGroup、sendOrder を与えて生成するには、以下の手順を行う。
-
stream を、以下を持つ 新しい
WebTransportDatagramsWritableとする:[[OutgoingDatagramsQueue]]-
空のキュー
[[Transport]]-
transport
[[SendGroup]]-
sendGroup
[[SendOrder]]-
sendOrder
-
writeDatagramsAlgorithm を、writeDatagrams を transport と stream で実行するアクションとする。
-
セットアップ stream で writeAlgorithm を writeDatagramsAlgorithm に設定する。
-
stream を返す。
4.2. 属性
sendGroup, 型 WebTransportSendGroup, null可能-
ゲッター手順:
-
thisの
[[SendGroup]]を返す。
セッター手順(valueを与える):
-
valueがnullでなく、かつ value.
[[Transport]]が this.[[Transport]]でない場合、InvalidStateErrorをスローする。 -
this.
[[SendGroup]]をvalueに設定する。
-
sendOrder, 型 long long-
ゲッター手順:
-
thisの
[[SendOrder]]を返す。
セッター手順(valueを与える):
-
this.
[[SendOrder]]をvalueに設定する。
-
4.3. 手順
writeDatagrams アルゴリズムはtransportおよびwritableをパラメータ、dataを入力とし、次の手順で定義されます:
-
timestampを現在を表すタイムスタンプとする。
-
dataが
BufferSourceオブジェクトでなければ、TypeErrorでrejectされたpromiseを返す。 -
datagramsをtransport.
[[Datagrams]]とする。 -
datagrams.
[[OutgoingMaxDatagramSize]]がdataの[[ByteLength]]より小さい場合、undefinedでresolveされたpromiseを返す。 -
promiseを新しいpromiseとする。
-
bytesをdataが表すバイトのコピーとする。
-
chunkをbytes、timestamp、promiseのタプルとする。
-
writable.
[[OutgoingDatagramsQueue]]にchunkをエンキューする。 -
writable.
[[OutgoingDatagramsQueue]]の長さが datagrams.[[OutgoingMaxBufferedDatagrams]]未満なら、promiseをundefinedで解決する。 -
promiseを返す。
注: 関連するWritableStream
は、そのストリームでwriteDatagramsによって返されたpromiseが全て解決されたときのみwriteDatagramsを呼び出します。したがって、タイムスタンプと有効期限は、ウェブ開発者が
WritableStreamDefaultWriter.ready
に注意を払う場合のみ適切に動作します。
sendDatagrams
するには、WebTransport
オブジェクトtransportと
WebTransportDatagramsWritable
オブジェクトwritableで、ネットワークタスクをキューし
transportで以下のステップを実行します:
-
queueをwritable.
[[OutgoingDatagramsQueue]]のコピーとする。注: 上記のコピーおよびネットワークタスクのキューは最適化できます。
-
maxSizeをtransport.
[[Datagrams]].[[OutgoingMaxDatagramSize]]とする。 -
durationをtransport.
[[Datagrams]].[[OutgoingDatagramsExpirationDuration]]とする。 -
durationがnullなら、durationを実装定義値に設定する。
-
次のステップを並行して実行:
-
queueが空でない間:
-
bytes、timestamp、promiseをqueueの先頭要素から取得する。
-
timestampからdurationミリ秒以上経過している場合:
-
queueの先頭要素を削除する。
-
ネットワークタスクをキューしtransportでpromiseをundefinedで解決する。
-
-
それ以外の場合、このループを終了する。
-
-
transport.
[[State]]が"connected"でなければ、何もせず終了する。 -
queueが空でない間:
-
bytes、timestamp、promiseをqueueの先頭要素から取得する。
-
bytesの長さがmaxSize以下の場合:
-
bytesを即座にネットワークに送信できない場合、このループを終了する。
-
データグラムの送信をtransport.
[[Session]]とbytesで行う。
-
-
queueの先頭要素を削除する。
-
ネットワークタスクをキューし transportでpromiseを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
transport、readable および readableType を指定して次の手順を行う。
-
stream を 新しい
WebTransportDatagramDuplexStreamとして次のように初期化する:[[Transport]]-
transport
[[Readable]]-
readable
[[ReadableType]]-
readableType
[[Writables]]-
空の 順序付き集合
[[IncomingDatagramsQueue]]-
空のキュー
[[IncomingDatagramsPullPromise]]-
null
[[IncomingMaxBufferedDatagrams]]-
実装依存の値
[[IncomingDatagramsExpirationDuration]]-
null
[[OutgoingMaxBufferedDatagrams]]-
実装依存の値
この実装依存の値は、適切なスループットを確保しつつ、 伝送データの迅速性を損なわないように調整されるべき
[[OutgoingDatagramsExpirationDuration]]-
null
[[OutgoingMaxDatagramSize]]-
実装依存の整数値
-
stream を返す
5.2. メソッド
createWritable()-
WebTransportDatagramsWritableを作成する。createWritable()メソッドが呼び出されたとき、ユーザーエージェントは次の手順を実行しなければならない:-
transport を this に関連付けられている
WebTransportオブジェクトとする。 -
もし transport.
[[State]]が"closed"または"failed"であれば、 throw を行い、InvalidStateErrorとする。 -
もし sendGroup が null でなく、かつ sendGroup.
[[Transport]]が this.[[Transport]]でない場合、 throw を行い、InvalidStateErrorとする。 -
transport、sendGroup、sendOrder を用いて 作成される
WebTransportDatagramsWritableの結果を返す。
-
5.3. 属性
readable、 ReadableStream 型、readonly-
ゲッター手順は次の通り:
-
this.
[[Readable]]を返す。
-
incomingMaxAge、 unrestricted double 型、nullable-
ゲッター手順:
セッター手順、value を与えた場合:
-
value が負または NaN の場合、throw
RangeError。 -
value が
0の場合、value を null にする。 -
this.
[[IncomingDatagramsExpirationDuration]]を value に設定する。
maxDatagramSize、 unsigned long 型、readonly-
WebTransportDatagramsWritableに渡すことができる最大データサイズ。 ゲッター手順は this.[[OutgoingMaxDatagramSize]]を返すこと。 outgoingMaxAge、 unrestricted double 型、nullable-
ゲッター手順:
セッター手順、value を与えた場合:
-
value が負または NaN の場合、 throw
RangeError -
value が
0の場合、value を null にする。 -
this.
[[OutgoingDatagramsExpirationDuration]]を value に設定する。
incomingMaxBufferedDatagrams、 unsigned long 型-
ゲッター手順:
セッター手順、value を与えた場合:
-
valueが
1より小さい場合、value を1にする。 -
this.
[[IncomingMaxBufferedDatagrams]]を value に設定する。
outgoingMaxBufferedDatagrams、 unsigned long 型-
ゲッター手順:
セッター手順、value を与えた場合:
-
valueが
1より小さい場合、value を1にする。 -
this.
[[OutgoingMaxBufferedDatagrams]]を value に設定する。
5.4. 手順
pullDatagrams するには、
WebTransport
オブジェクト transport を与えて次の手順を実行する:
-
datagrams を transport.
[[Datagrams]]とする。 -
アサート: datagrams.
[[IncomingDatagramsPullPromise]]は null である。 -
queue を datagrams.
[[IncomingDatagramsQueue]]とする。 -
queue が空の場合:
-
datagrams.
[[IncomingDatagramsPullPromise]]を新しい promise に設定する。 -
datagrams.
[[IncomingDatagramsPullPromise]]を返す。
-
-
datagram と timestamp を queue から dequeue した結果とする。
-
datagrams.
[[ReadableType]]が"bytes"の場合:-
datagrams.
[[Readable]]の current BYOB request view が null でない場合:-
view を datagrams.
[[Readable]]の current BYOB request view とする。 -
view の byte length が datagram のサイズより小さい場合、 RangeError で reject された promise を返す。
-
elementSize を typed array constructors table の view.[[TypedArrayName]] に指定された要素サイズとする。 view が [[TypedArrayName]] 内部スロットを持たない場合(つまり
DataViewの場合)、 elementSize を 0 とする。 -
elementSize が 1 でない場合、TypeError で reject された promise を返す。
-
-
Pull from bytes datagram を datagrams.
[[Readable]]に取り込む。
-
-
それ以外の場合:
-
chunk を
Uint8Arrayオブジェクトで datagram を表す新しいものとする。 -
Enqueue chunk を transport.
[[Datagrams]].[[Readable]]に追加する。
-
receiveDatagrams の手順は、
WebTransport
オブジェクト transport を指定して次の通り:
-
timestamp を現在時刻を表すタイムスタンプとする。
-
queue を datagrams.
[[IncomingDatagramsQueue]]とする。 -
duration を datagrams.
[[IncomingDatagramsExpirationDuration]]とする。 -
duration が null なら 実装依存の値に設定する。
-
session を transport.
[[Session]]とする。 -
session 上で 受信可能なデータグラム がある間:
-
datagram を receive a datagram の結果とする。
-
timestamp を現在時刻を表すタイムスタンプとする。
-
chunk を datagram と timestamp のペアとする。
-
Enqueue chunk を queue に追加する。
-
-
toBeRemoved を queue の長さから datagrams.
[[IncomingMaxBufferedDatagrams]]を引いた値とする。 -
toBeRemoved が正の値の場合、dequeue を queue に対して toBeRemoved(切り捨てで)回繰り返す。
-
queue が空でない間:
-
queue が空でなく、かつ datagrams.
[[IncomingDatagramsPullPromise]]が null でない場合:-
bytes と timestamp を queue から dequeue した結果とする。
-
promise を datagrams.
[[IncomingDatagramsPullPromise]]とする。 -
datagrams.
[[IncomingDatagramsPullPromise]]を null に設定する。 -
ネットワークタスクをキューし、transport に対して以下を実行する:
-
chunk を
Uint8Arrayオブジェクトで bytes を表す新しいものとする。 -
Enqueue chunk を datagrams.
[[Readable]]に追加する。 -
Resolve promise を undefined で解決する。
-
-
ユーザーエージェントは、receiveDatagrams を WebTransport
オブジェクトで
[[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 = {}); /* a ReadableStream of WebTransportBidirectionalStream objects */options readonly attribute ReadableStream incomingBidirectionalStreams ;Promise <WebTransportSendStream >createUnidirectionalStream (optional WebTransportSendStreamOptions = {}); /* a ReadableStream of WebTransportReceiveStream objects */options 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()
コンストラクタが呼び出されたとき、
ユーザーエージェントは次の手順を実行しなければならない:
-
baseURL を this の 関連設定オブジェクト の API ベースURL とする。
-
url が失敗なら throw
SyntaxError例外。 -
url の スキーム が
httpsでなければ throwSyntaxError例外。 -
url の フラグメント が null でない場合 throw
SyntaxError例外。 -
newConnection を
optionsのallowPoolingが true の場合は "no"、それ以外では "yes-and-dedicated" とする。 -
serverCertificateHashes を
optionsのserverCertificateHashesとする。 -
newConnection が "
no" で serverCertificateHashes が空でない場合、 throwNotSupportedError例外。 -
requireUnreliable を
optionsのrequireUnreliableとする。 -
congestionControl を
optionsのcongestionControlとする。 -
congestionControl が
"default"でなく、ユーザーエージェントが congestionControl のためのスループット最適化アルゴリズムをサポートしない場合 [RFC9002] Section 7 に従い congestionControl を"default"に設定する。 -
protocols の値の中で重複するものがあった場合、 WebTransportプロトコルで定義された交渉済みアプリケーションプロトコル値の要素要件に合致しない場合、 または isomorphic encode の長さが 0 または 512 を超える場合、 throw
SyntaxError例外。 [WEB-TRANSPORT-OVERVIEW] Section 3.1. -
anticipatedConcurrentIncomingUnidirectionalStreams を
optionsのanticipatedConcurrentIncomingUnidirectionalStreamsとする。 -
anticipatedConcurrentIncomingBidirectionalStreams を
optionsのanticipatedConcurrentIncomingBidirectionalStreamsとする。 -
datagramsReadableType を
optionsのdatagramsReadableTypeとする。 -
incomingDatagrams を 新しい
ReadableStreamとする。 -
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
-
transport.
[[Datagrams]]を WebTransportDatagramDuplexStream 作成 の結果に設定する。引数は transport, incomingDatagrams, datagramsReadableType. -
pullDatagramsAlgorithm を pullDatagrams を transport で実行するアクションとする。
注記: データグラムには 64 kibibytes バッファを使うことを推奨。 WebTransport データグラムフレームサイズの効果的最大値は QUIC データグラムフレームサイズの上限であり、 推奨値は 64 kibibytes である ([QUIC-DATAGRAM] Section 3)。 バッファより大きいデータグラムのためにストリームがエラー化されないようにする。
-
datagramsReadableType が
"bytes"の場合は、byte読み込みサポート付きセットアップ を incomingDatagrams に pullAlgorithm=pullDatagramsAlgorithm, highWaterMark=0 で実行 それ以外の場合は セットアップ を incomingDatagrams に pullAlgorithm=pullDatagramsAlgorithm, highWaterMark=0 で行う。 -
pullBidirectionalStreamAlgorithm を pullBidirectionalStream を transport で実行するアクションとする。
-
セットアップ transport.
[[IncomingBidirectionalStreams]]に pullAlgorithm=pullBidirectionalStreamAlgorithm, highWaterMark=0 を設定する。 -
pullUnidirectionalStreamAlgorithm を pullUnidirectionalStream を transport で実行するアクションとする。
-
セットアップ transport.
[[IncomingUnidirectionalStreams]]に pullAlgorithm=pullUnidirectionalStreamAlgorithm, highWaterMark=0 を設定する。 -
client を transport の 関連設定オブジェクト とする。
-
origin を client の オリジン とする。
-
request を新しい リクエストとし、URL は url、 client は client、 service-workers mode は "
none", referrer は "no-referrer", mode は "webtransport", credentials mode は "omit", cache mode は "no-store", policy container は client の policy container、 destination は ""、 origin は origin、 WebTransport-hash list は serverCertificateHashes、 redirect mode は "error" とする。注記: リダイレクトはフォローされない。 リダイレクトによるネットワークエラーは他のエラーと区別されない。 クロスオリジンでは CORS により通常ブロックされる情報の漏洩を防ぐため。 同一オリジンではハンドシェイクを情報伝達の手段として濫用される可能性がある。
-
request の method を "
CONNECT" に設定、 method に関連づけられる:protocol疑似ヘッダー を"webtransport"に設定する。 -
headers を新しい
Headersオブジェクトとし fill にoptions["headers"] を用いる。 -
requestHeaders を新しい
Headersオブジェクトとし header list は request の header list、 guard は "request" にする。 -
各 header について headers の header list の:
-
ascii小文字化した header の name が "
wt-available-protocols" の場合、TypeErrorを throw。 -
append header を requestHeaders に追加する。
注記: ヘッダーは Fetch の forbidden request-header 制限の対象。
-
-
protocols が空でない場合、構造化フィールド値を設定で (
WT-Available-Protocols, 構造化ヘッダーリスト、そのメンバが protocols で順序通り 構造化ヘッダー文字列項目)を request の header list に設定する。 -
Fetch request を useParallelQueue=true で、 processResponse には response を与えた場合の以下手順を設定:
-
WebTransport fetch response 処理で response と transport を用いる。
-
-
transport を返す。
-
transport を
WebTransportオブジェクト (request に関連付けられているもの) とする。 -
url を request の current URL とする。
-
newConnection を transport.
[[NewConnection]]とする。 -
requireUnreliable を transport.
[[RequireUnreliable]]とする。 -
webTransportHashes を request の WebTransport-hash list の値とする。
-
connection を 接続の取得で networkPartitionKey, url, false, newConnection, requireUnreliable, webTransportHashes を指定して得る結果とする。
-
connection が失敗なら failure を返す。
-
connection で最初の SETTINGS フレームを受信するまで待ち、 settings をその SETTINGS フレームを表す辞書とする。
-
settings に
SETTINGS_ENABLE_CONNECT_PROTOCOL(0x08, HTTP/2 の場合は Section 3、 HTTP/3 の場合は Section 3) が値1で含まれていなければ、failure を返す。 -
settings がサーバーWebTransport対応を示していなければ failure を返す。 [WEB-TRANSPORT-OVERVIEW] Section 4.1.
-
HTTP/3 では
SETTINGS_WT_MAX_SESSIONSが0より大きい必要、SETTINGS_H3_DATAGRAMが1である必要。 [WEB-TRANSPORT-HTTP3] Section 3.1. -
HTTP/2 では
SETTINGS_ENABLE_CONNECT_PROTOCOLのみで潜在対応が示される。 [WEB-TRANSPORT-HTTP2] Section 3.1.
注記:
SETTINGS_WT_MAX_SESSIONSは IETF 内で変更予定、SETTINGS_ENABLE_WEBTRANSPORTに戻る可能性がある。 -
-
connection を返す。
WebTransport
transport を指定し次の手順:
-
response が ネットワークエラーの場合、残りの手順を中止し ネットワークタスクをキューして transport に以下を実行:
-
transport.
[[State]]が"closed"または"failed"の場合、これ以降の手順を中止。 -
error を新しく create exception した
WebTransportErrorとする。sourceは"session"。 -
Cleanup transport に error を指定して行う。
-
-
connection を response に関連付けられた下層接続とする。
-
[WEB-TRANSPORT-OVERVIEW] Section 4.1 の制約に従い WebTransport セッション確立 を connection とサーバーの response で行い、 session を得る。 得られた下層トランスポートストリームはセッションの CONNECTストリーム と呼ぶ。
注記: この手順は [QUIC-DATAGRAM] の トランスポートパラメータ交換も完結させる。
-
前ステップが失敗した場合、残りの手順を中止し ネットワークタスクをキューし transport で以下を実行:
-
transport.
[[State]]が"closed"または"failed"の場合、これ以降の手順を中止。 -
error を新しく create exception した
WebTransportErrorとする。sourceは"session"。 -
Cleanup transport に error を指定して行う。
-
-
ユーザーエージェントが複数の輻輳制御アルゴリズムに対応している場合は、 この connection の送信に transport の
[[CongestionControl]]に適したものを選ぶ。 -
ネットワークタスクをキューして transport に以下を実行:
-
アサート: this の
[[Datagrams]]の[[OutgoingMaxDatagramSize]]は整数である。 -
transport.
[[State]]が"connecting"でない場合: -
transport.
[[State]]を"connected"に設定。 -
transport.
[[Session]]を session に設定。 -
responseHeaders を response の header list のコピーにする。
-
Delete "
wt-protocol" を responseHeaders から削除。 -
transport.
[[ResponseHeaders]]を新しいHeadersオブジェクトに設定。header list は responseHeaders、guard は "immutable"。 -
transport.
[[Protocol]]を、WebTransport Protocol Framework [WEB-TRANSPORT-OVERVIEW] Section 3.1 に従い、協議されたアプリケーションプロトコルの文字列値が存在すればそれ、なければ""に設定する。 -
接続がHTTP/3の場合、transport.
[[Reliability]]を"supports-unreliable"に設定。 -
接続が HTTP/2 ([WEB-TRANSPORT-HTTP2]) の場合は transport の
[[Reliability]]を"reliable-only"に設定。
-
WebTransport
オブジェクト transport を指定し次の手順:
-
transport.
[[State]]が"connecting"なら transport.[[Ready]]の fulfillment時に 以下の手順を実行しその結果を返す:-
pullBidirectionalStream を transport で実行した結果を返す。
-
-
transport.
[[State]]が"connected"でなければ、 新しい reject promise をInvalidStateErrorで返す。 -
session を transport.
[[Session]]とする。 -
p を新しい promise とする。
-
並列処理で以下を行う:
-
session で 双方向ストリーム受信可能になるまで待つ。
-
internalStream を 双方向ストリーム受信 の結果とする。
-
ネットワークタスクをキューし transport に以下実行:
-
stream を bidirectionalStream作成 の結果 (引数 internalStream, transport) とする。
-
Enqueue stream を transport.
[[IncomingBidirectionalStreams]]に追加。 -
resolve p を undefined で解決する。
-
-
-
p を返す。
WebTransport
オブジェクト transport を指定し次の手順:
-
transport.
[[State]]が"connecting"なら transport.[[Ready]]の fulfillment時に 以下の手順を実行しその結果を返す:-
pullUnidirectionalStream を transport で実行した結果を返す。
-
-
transport.
[[State]]が"connected"でなければ、 新しい reject promise をInvalidStateErrorで返す。 -
session を transport.
[[Session]]とする。 -
p を新しい promise とする。
-
並列処理で以下を行う:
-
session で 単方向ストリーム受信可能 になるまで待つ。
-
internalStream を 単方向ストリーム受信 の結果とする。
-
ネットワークタスクをキューし transport に以下実行:
-
stream を WebTransportReceiveStream作成 の結果 (internalStream, transport) とする。
-
Enqueue stream を transport.
[[IncomingUnidirectionalStreams]]に追加。 -
resolve p を undefined で解決する。
-
-
-
p を返す。
6.3. 属性
ready, of type Promise<undefined>, readonlyclosed, of type Promise<WebTransportCloseInfo>, readonly-
取得時、this の
[[Closed]]を返す必要がある。 draining, of type Promise<undefined>, readonly-
取得時、this の
[[Draining]]を返す必要がある。 datagrams, of type WebTransportDatagramDuplexStream, readonly-
このセッションでデータグラムの送受信を行うための単一のデュプレックスストリーム。
datagrams属性のゲッター手順は次の通りとする:-
this の
[[Datagrams]]を返す。
-
incomingBidirectionalStreams, of type ReadableStream, readonly-
ReadableStreamで、サーバから受信したWebTransportBidirectionalStreamのストリームを返す。Note: 着信ストリームに既にデータがあるかどうかはサーバの動作による。
incomingBidirectionalStreams属性のゲッター手順は: incomingUnidirectionalStreams, of type ReadableStream, readonly-
サーバから受信した各
WebTransportReceiveStreamで表される単方向ストリームのReadableStream。Note: 着信ストリームに既にデータがあるかどうかはサーバの動作による。
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が呼び出されたとき、ユーザーエージェントは次の手順を実行しなければならない:
-
transport を this とする。
-
transport.
[[State]]が"closed"または"failed"ならこの手順を中止。 -
transport.
[[State]]が"connecting"なら:-
error を新しく 作成した
WebTransportErrorとする。そのsourceは"session"。 -
Cleanup transport に error を指定して実行する。
-
この手順を中止。
-
-
session を transport.
[[Session]]とする。 -
code を closeInfo.
closeCodeとする。 -
reasonString を コードユニットプレフィックスとして closeInfo.
reasonを最高1024バイト以下の 長さで UTF-8エンコードする。 -
reason を reasonString の UTF-8エンコード結果とする。
-
並列処理で terminate session に code と reason を指定して行う。
注記: これは 送信中断や 受信中断 も transport.
[[SendStreams]]および[[ReceiveStreams]]内の WebTransportストリーム で行われる。 -
Cleanup transport を
AbortErrorと closeInfo で実行する。
-
getStats()-
この
WebTransportの 基盤コネクション の統計情報を収集し、結果を非同期で返します。getStatsが呼び出されたとき、ユーザーエージェントは次の手順を実行しなければならない:
-
transport を this とする。
-
p を新しいpromiseにする。
-
transport.
[[State]]が"failed"なら、reject p をInvalidStateErrorで返し、この手順を中止。 -
並列処理で以下を実行:
-
transport.
[[State]]が"connecting"なら、状態が変化するまで待つ。 -
transport.
[[State]]が"failed"なら、 ネットワークタスクをキューして transport に reject p をInvalidStateErrorで返してこの手順を中止。 -
transport.
[[State]]が"closed"なら、 ネットワークタスクをキュー して transport に resolve p コネクションの最新統計情報で返しこの手順を中止。統計収集時点は 実装依存である。 -
gatheredStats を リストとして 基盤コネクションに固有で
WebTransportConnectionStatsとWebTransportDatagramStatsの辞書メンバーを正確に埋めるために必要な統計情報を集めたものとする。 -
ネットワークタスクをキューして transport に次の手順を実行:
-
stats を 新規
WebTransportConnectionStatsオブジェクトとする。 -
datagramStats を 新規
WebTransportDatagramStatsオブジェクトとする。 -
stats["
datagrams"] に datagramStats を設定。 -
ユーザーエージェントが公開したい stats および datagramStats の各 メンバーについて、 set member に対応する エントリを gatheredStats から設定。
-
resolve p を stats で返す。
-
-
-
p を返す。
-
exportKeyingMaterial(BufferSource label, optional BufferSource context)-
この
WebTransportの TLS Keying Material Exporter が一意に関連付けられたTLSセッションからキー素材をエクスポートします。 基盤コネクション を用いる。exportKeyingMaterialが呼び出されたとき、ユーザーエージェントは次の手順を実行しなければならない:
-
transport を this とする。
-
labelLength を label.バイト長とする。
-
labelLength が255を超える場合、RangeErrorでrejectされたpromise を返す。
-
contextLength を0とする。
-
context が指定された場合、contextLength を context.バイト長 に設定。
-
contextLength が255を超える場合、RangeErrorでrejectされたpromise を返す。
-
p を新しいpromiseにする。
-
並列処理で以下を実行(ただし abort when transport の
[[State]]が"closed"または"failed"となった場合は ネットワークタスクをキューして transport に reject p をInvalidStateErrorで返す):-
keyingMaterial を
Uint8Arrayとし [WEB-TRANSPORT-OVERVIEW] Section 4.1 のTLSキーエクスポーターを labelLength, label, contextLength, context(あれば)で呼び出して得る。 -
ネットワークタスクをキューして transport に resolve p を keyingMaterial で返す。
-
-
p を返す。
-
createBidirectionalStream()-
送信用双方向ストリームの
WebTransportBidirectionalStreamオブジェクトを生成します。ストリーム作成しただけでは相手ピア側にはすぐ反映されず、データ送信時に認識されます。注記: サーバーがストリームの存在を認識するのはデータが送信されてからです。
createBidirectionalStreamを呼び出したとき、ユーザーエージェントは次の手順を実行しなければならない:-
this.
[[State]]が"closed"または"failed"なら、 新しい reject promise をInvalidStateErrorで返す。 -
sendGroup が null でない、かつ sendGroup.
[[Transport]]が this と異なっていれば throwInvalidStateErrorを投げる。 -
waitUntilAvailable を
optionsのwaitUntilAvailableとする。 -
p を新しいpromiseにする。
-
transport を this とする。
-
並列処理で以下を実行(ただし abort when transport の
[[State]]が"closed"または"failed"となった場合は ネットワークタスクをキューして transport に reject p をInvalidStateErrorで返す):-
streamId を transport.
[[Session]]用に新規でかつ一意なストリームIDにする。 [QUIC] Section 19.11 に定義。 すぐ得られない場合、waitUntilAvailable が true なら入手まで待つ。 false なら ネットワークタスクをキューして transport に reject p をQuotaExceededErrorrequested/quota両方nullで返しこの手順を中止。 -
internalStream を bidirectional stream作成 の結果 (transport.
[[Session]], streamId) とする。 -
ネットワークタスクをキュー して transport に次を実行:
-
transport.
[[State]]が"closed"または"failed"なら reject p をInvalidStateErrorで返しこの手順を中止。 -
stream を bidirectionalStream作成 の結果 (internalStream, transport, sendGroup, sendOrder) とする。
-
resolve p を streamで返す。
-
-
-
p を返す。
-
createUnidirectionalStream()-
送信用単方向ストリームの
WebTransportSendStreamを生成します。ストリームを作成しただけではサーバー側にはすぐ認識されません。データ送信時に認識されます。注記: サーバーがストリームの存在を認識するのはデータが送信されてからです。
createUnidirectionalStream()メソッドが呼び出されたとき、ユーザーエージェントは次の手順を実行しなければならない:-
this.
[[State]]が"closed"または"failed"なら 新しい reject promise をInvalidStateErrorで返す。 -
sendGroup が null でない、かつ sendGroup.
[[Transport]]が this と異なっていれば throwInvalidStateErrorを投げる。 -
waitUntilAvailable を
optionsのwaitUntilAvailableとする。 -
p を新しいpromiseにする。
-
transport を this とする。
-
並列処理で以下を実行(ただし abort when transport の
[[State]]が"closed"または"failed"となった場合は ネットワークタスクをキューして transport に reject p をInvalidStateErrorで返す):-
streamId を transport.
[[Session]]用に新規でかつ一意なストリームIDとする。 [QUIC] Section 19.11 に定義。 すぐ得られない場合、waitUntilAvailable が true なら入手まで待つ。 false なら ネットワークタスクをキューして transport に reject p をQuotaExceededErrorで返しこの手順を中止。 -
internalStream を 単方向ストリーム作成 の結果 (transport.
[[Session]], streamId) とする。 -
ネットワークタスクをキュー して transport に次を実行:
-
transport.
[[State]]が"closed"または"failed"なら reject p をInvalidStateErrorで返しこの手順を中止。 -
stream を WebTransportSendStream作成 の結果 (internalStream, transport, sendGroup, sendOrder) とする。
-
resolve p を stream で返す。
-
-
-
p を返す。
-
createSendGroup()-
WebTransportSendGroupを生成します。createSendGroup()メソッドが呼び出されたとき、ユーザーエージェントは次の手順を実行しなければならない:-
this.
[[State]]が"closed"または"failed"なら throwInvalidStateErrorを投げる。 -
WebTransportSendGroup作成 の結果を this を引数にして返す。
-
6.5. 手順
WebTransport
transport を error および
オプションで closeInfo を用いて cleanup するには、次の手順を実行する:
-
sendStreams を transport.
[[SendStreams]]のコピーとする。 -
receiveStreams を transport.
[[ReceiveStreams]]のコピーとする。 -
outgoingDatagramWritables を transport.
[[Datagrams]].[[Writables]]とする。 -
incomingDatagrams を transport.
[[Datagrams]].[[Readable]]とする。 -
ready を transport.
[[Ready]]とする。 -
closed を transport.
[[Closed]]とする。 -
incomingBidirectionalStreams を transport.
[[IncomingBidirectionalStreams]]とする。 -
incomingUnidirectionalStreams を transport.
[[IncomingUnidirectionalStreams]]とする。 -
transport.
[[SendStreams]]に空の set を設定する。 -
transport.
[[ReceiveStreams]]に空の set を設定する。 -
transport.
[[Datagrams]].[[OutgoingDatagramsQueue]]に空の queue を設定する。 -
transport.
[[Datagrams]].[[IncomingDatagramsQueue]]に空の queue を設定する。 -
もし closeInfo が渡された場合、transport.
[[State]]を"closed"に設定する。 そうでなければ transport.[[State]]を"failed"に設定する。 -
sendStreams の各 stream について、次の手順を実行:
-
もし stream.
[[PendingOperation]]が null でなければ、その stream.[[PendingOperation]]を error で reject する。 -
Error で stream を error でエラーにする。
-
-
receiveStreams の各 stream について、error で stream を error でエラーにする。
Note: スクリプト作成者はPromise解決時に同期的なコードを挿入できる。そのためここからは transport を触ってはならない。予測不可能な形で script により破壊されている場合がある。 この制約はこの手続きを呼び出すロジックにも適用される。
-
もし closeInfo が渡された場合:
-
それ以外:
-
Reject で closed を error で拒否する。
-
closed.
[[PromiseIsHandled]]を true に設定する。 -
Reject で ready を error で拒否する。
-
ready.
[[PromiseIsHandled]]を true に設定する。 -
Error で incomingBidirectionalStreams を error でエラーにする。
-
Error で incomingUnidirectionalStreams を error でエラーにする。
-
outgoingDatagramWritables の各 writable について、error で writable を error でエラーにする。
-
Error で incomingDatagrams を error でエラーにする。
-
WebTransport
transport と
一連の steps で queue a network task するには、次の手順を実行する:
-
グローバルタスクをキューし、 ネットワークタスクソースで transport の relevant global object を用いて steps を実行する。
6.6. クライアントによって開始されていないセッション終了
WebTransport
transport に関連付けられていて
オプションで code と reasonBytes とともに
終了するときは、次の手順を実行:
-
ネットワークタスクをキューし transport で次の手順を実行する:
-
もし transport.
[[State]]が"closed"または"failed"なら、この手順を中止する。 -
error を新たに 作成した
WebTransportErrorでsourceは"session"。 -
closeInfo を 新しい
WebTransportCloseInfoとする。 -
もし code が与えられていれば、closeInfo の
closeCodeに code を設定する。 -
もし reasonBytes が与えられていれば、closeInfo の
reasonに reasonBytes を UTF-8 デコードした値で設定する。Note: reasonBytes には言語や方向のメタデータは含まれない。 表示時の方向には first-strong ヒューリスティクスを用いることができる。
-
Cleanup で transport, error, closeInfo を渡す。
-
WebTransport
transport の 基盤コネクション でコネクションエラーが発生した時は、次の手順を実行:
-
ネットワークタスクをキューし transport で次の手順を実行する:
-
もし transport.
[[State]]が"closed"または"failed"なら、この手順を中止する。 -
error を新たに 作成した
WebTransportErrorでsourceは"session"。 -
Cleanup で transport, error を渡す。
-
6.7. コンテキストクリーンアップ手順
この仕様では、コンテキストクリーンアップ手順を以下の手順として定義する。
WebTransport
transport が与えられた場合:
-
もし transport.
[[State]]が"connected"なら、次を行う:-
transport.
[[State]]を"failed"に設定する。 -
並行して、terminate を transport.
[[Session]]に対して実行する。 -
ネットワークタスクをキューに入れる。transport を与え、次の手順を実行する:
-
error を、新たに 作成された
WebTransportErrorとし、 そのsourceは"session"とする。 -
Cleanup を transport に対して error を用いて行う。
-
-
-
もし transport.
[[State]]が"connecting"なら、transport.[[State]]を"failed"に設定する。これはワーカーでも実施する必要がある。次を参照: #127 および whatwg/html#6731。
6.8. ガベージコレクション
WebTransport
オブジェクトの [[State]]
が "connecting" の場合、[[IncomingBidirectionalStreams]]、
[[IncomingUnidirectionalStreams]]、
いずれかの
WebTransportReceiveStream、
または [[Datagrams]].[[Readable]]
がlockedされている場合、または ready、
draining、
closed
promise が監視されている場合は、ガベージコレクションされてはならない。
WebTransport
オブジェクトの [[State]]
が "connected" の場合、[[IncomingBidirectionalStreams]]、
[[IncomingUnidirectionalStreams]]、
いずれかの
WebTransportReceiveStream、
または [[Datagrams]].[[Readable]]
がlockedされている場合、またはdraining
や closed
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"-
オプションで、アプリケーションがスループット最適化または低遅延に特化した輻輳制御アルゴリズムを希望する場合に指定。 この値はユーザーエージェントへのヒントとなります。
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 を与え、次の手順を実行する:
-
cert を certificate とし、[RFC5280] で定義される Certificate メッセージの DER エンコーディングとして表現する。
-
cert の SHA-256 ハッシュを計算し、計算された値を返す。
証明書ハッシュを検証するために、certificate chain とハッシュ配列 hashes を与え、次の手順を実行する:
-
certificate を certificate chain の最初の証明書(リーフ証明書)とする。
-
referenceHash を、certificate を用いて証明書ハッシュを計算した結果とする。
-
hashes 内のすべてのハッシュ hash について:
-
もし hash.
valueが null でなく、かつ hash.algorithmが "sha-256" とASCII 大文字小文字非区別で一致するなら:-
hashValue を、hash.
valueが表すバイト列とする。 -
もし hashValue が referenceHash に等しいなら、true を返す。
-
-
-
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 = ""; };
この辞書は以下の属性を持ちます:
closeCode、 unsigned long 型、初期値0-
ピアに通知されるエラーコード。
reason、 USVString 型、初期値""-
WebTransportを閉じる理由。
6.11. WebTransportSendOptions辞書
WebTransportSendOptionsは、
createUnidirectionalStream、
createBidirectionalStream、
createWritable
の振る舞いに影響を与える基本パラメータの辞書です。
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の場合、
createUnidirectionalStreamやcreateBidirectionalStreamの呼び出しで返される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より遅れますが、パケットロスにより永続的に小さいこともあります。 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はアプリケーションが利用可能なネットワーク容量を反映している。atSendCapacityがtrueの場合、estimatedSendRateは上限値(ceiling)を反映します。 アプリ送信レートが持続している限り、estimatedSendRateはネットワーク状況に適応します。 ただしestimatedSendRateはnullになり得ます(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-
アプリケーションが
datagramsのreadableから読み出す前に、受信キューが新しいデータグラムであふれてしまったために廃棄された受信データグラムの数。 expiredIncoming, 型 unsigned long long-
incomingMaxAgeよりも古くなったため、datagramsのreadableから読み出される前に廃棄された受信データグラムの数。 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. 属性
sendGroup、 WebTransportSendGroup 型、nullable-
ゲッター手順:
-
this の
[[SendGroup]]を返す。
セッター手順(value を与えた場合):
-
value が null でなく、 value.
[[Transport]]が this の[[Transport]]と異なる場合、 throwInvalidStateErrorを投げる。 -
this の
[[SendGroup]]に value を設定する。
-
sendOrder、 long long 型-
ゲッター手順:
-
this の
[[SendOrder]]を返す。
セッター手順(value を与えた場合):
-
this の
[[SendOrder]]に value を設定する。
-
7.2. メソッド
getStats()-
この
WebTransportSendStreamの性能に関する統計情報を収集し、 非同期で結果を報告します。getStatsが呼び出されたとき、ユーザーエージェントは次の手順を実行しなければならない:
-
p を新しいPromiseとする。
-
並列処理で以下実行:
-
gatheredStats をリストとして、 this
WebTransportSendStreamの統計情報でWebTransportSendStreamStatsの 辞書メンバーを正確に埋めるために必要なものとする。 -
ネットワークタスクをキューして transport に次を実行:
-
-
p を返す。
-
getWriter()-
このメソッドは、
getWriter(WritableStreamから継承) と同様に実装されますが、WritableStreamDefaultWriterを作成する代わりに、WebTransportWriterを this で 作成しなければなりません。
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ストリーム
internalStream、WebTransport
transport、sendGroup、sendOrderを指定し、次の手順を実行する:
-
stream を 新しい
WebTransportSendStreamとして次のように初期化する:[[InternalStream]]-
internalStream
[[PendingOperation]]-
null
[[Transport]]-
transport
[[SendGroup]]-
sendGroup
[[SendOrder]]-
sendOrder
[[AtomicWriteRequests]]-
空の順序付き集合のpromise
[[InsideSynchronousAtomicWrite]]-
false
[[BytesWritten]]-
0
[[CommittedOffset]]-
0
-
writeAlgorithm を write chunk を stream に書き込むアクション(chunkを指定)とする。
-
closeAlgorithm を close stream とするアクションとする。
-
abortAlgorithm を abort reason を指定して stream を中断するアクションとする。
-
セットアップ stream に、 writeAlgorithm を writeAlgorithm に、 closeAlgorithm を closeAlgorithm に、 abortAlgorithm を abortAlgorithm に設定して実行する。
-
abortSignal を stream の [[controller]].[[abortController]].[[signal]] とする。
-
Add 以下の手順を abortSignal に追加する:
-
pendingOperation を stream.
[[PendingOperation]]とする。 -
pendingOperation が null ならこれ以降中止。
-
stream.
[[PendingOperation]]を null に設定。 -
reason を abortSignal の abort reasonとする。
-
promise を abort stream に reason を指定した結果とする。
-
fulfillment時に promise がresolveされたら reject pendingOperation を reason で返す。
-
-
append stream を transport.
[[SendStreams]]に追加する。 -
stream を返す。
write は、WebTransportSendStream
stream に chunk を送信する手順:
-
transport を stream.
[[Transport]]とする。 -
chunk が
BufferSource型でなければ、 TypeErrorでrejectされたpromise を返す。 -
promise を新しいpromiseとする。
-
bytes を chunk が表す バイト列 のコピーとする。
-
stream.
[[PendingOperation]]を promise に設定。 -
inFlightWriteRequest を stream の inFlightWriteRequest とする。
-
atomic を、 stream.
[[AtomicWriteRequests]]が inFlightWriteRequestを含むか stream.[[InsideSynchronousAtomicWrite]]が true なら true、そうでなければ false とする。 -
並列処理で以下を実行:
-
atomic が true で現在のフロー制御 ウィンドウが bytes の全体送信に不足している場合、 この手順以降中止し、 ネットワークタスクをキューして transport に次のサブ手順を実行:
-
stream.
[[PendingOperation]]を null に設定。 -
atomic書き込み要求全中断を stream で実行。
-
-
そうでない場合、 send bytes を stream.
[[InternalStream]]で送信し、完了まで待つ。 この送信は同Transportでキュー済みストリーム・データグラムや これからキューされるストリーム・データグラムとインターリーブしてよい。ユーザーエージェントは転送性能向上のためバッファを持つ場合がある。 バッファは固定上限を設け、
WebTransportSendStreamの利用者にバックプレッシャー情報を伝えるべき。この送信は、同じ
[[SendGroup]]かつ[[SendOrder]]がより高いストリームの送信(エラーでなく、フロー制御でブロックされていないもの)が完了するまで starvationしなければならない。stream.
[[SendOrder]]をここで並列処理でアクセスする。 ユーザーエージェントは送信中の値のライブ更新にも対応すべきだが、 詳細は実装依存である。注記: 再送順序は 実装依存だが、 ユーザーエージェントは
[[SendOrder]]値が高い方を優先再送することが推奨される。その他のstarvationは フロー制御や エラーの場合のみ許される。
ユーザーエージェントはstarveされていない全ストリームに公平に帯域を分配すべき。
注記: 公平性の定義は 実装依存です。
-
先の手順でネットワークエラーが原因で失敗した場合、以降の手順を中止。
注記: ここでは promise を reject しません。 ネットワークエラーの処理は別の手順で行われ、 そちらで stream.
[[PendingOperation]]が reject されるためです。 -
そうでない場合、ネットワークタスクをキューして transport に次を実行:
-
stream.
[[PendingOperation]]を null に設定。 -
bytes の長さを stream.
[[BytesWritten]]に加算する。 -
stream.
[[AtomicWriteRequests]]が inFlightWriteRequestを含む場合、 remove inFlightWriteRequest を行う。 -
resolve promise を undefined で返す。
-
-
-
promise を返す。
注記:
このアルゴリズム(または
write(chunk))
から返されるpromiseのfulfillmentは、
サーバー[QUIC]からackされたことを必ずしも意味しません。
実際はバッファへ追加されたことを意味します。
chunkがサーバーに到着したことを確認したい場合、
サーバー側でアプリケーションレベルのackメッセージを送信する必要があります。
WebTransportSendStream
stream を閉じるには、次を実行する:
-
transport を stream.
[[Transport]]とする。 -
promise を新しい promise とする。
-
Remove で stream を transport.
[[SendStreams]]から取り除く。 -
stream.
[[PendingOperation]]に promise をセットする。 -
次の手順を 並列で実行する:
-
FIN を送信し、 stream.
[[InternalStream]]で完了を待つ。 -
stream.
[[InternalStream]]が "all data committed" 状態に遷移するまで待機。[QUIC] -
ネットワークタスクをキューし、 transport で次の手順を実行:
-
stream.
[[PendingOperation]]に null をセットする。 -
resolve で promise に undefined を渡す。
-
-
-
promise を返す。
WebTransportSendStream
stream を reason 付きで中止するには、次の手順を実行する:
-
transport を stream.
[[Transport]]とする。 -
promise を新しい promise とする。
-
code を 0 とする。
-
Remove で stream を transport.
[[SendStreams]]から取り除く。 -
もし reason が
WebTransportErrorでありかつ reason.[[StreamErrorCode]]が null でなければ、その値を code にセットする。 -
もし code < 0 なら、code を 0 にセットする。
-
もし code > 4294967295 なら、code を 4294967295 にセットする。
-
committedOffset を stream.
[[CommittedOffset]]とする。注記: code の有効範囲は 0~4294967295。 基礎接続 が HTTP/3 の場合は コードは [0x52e4a40fa8db, 0x52e5ac983162] にエンコードされる。 [WEB-TRANSPORT-HTTP3] を参照。
-
次の手順を 並列で実行する:
-
送信中止 を stream.
[[InternalStream]]と code および committedOffset で行う。 -
ネットワークタスクをキューし、 transport で resolve で promise に undefined を渡す。
-
-
promise を返す。
WebTransportSendStream
stream を指定して次の手順を行う:
-
writeRequests を stream.writeRequests とする。
-
requestsToAbort を stream.
[[AtomicWriteRequests]]とする。 -
writeRequests が requestsToAbortに含まれないpromise を含む場合、 streamをエラー化し、
AbortErrorを投げ、この手順を中止する。 -
requestsToAbortの各 promise について reject promise を
AbortErrorで返す。 -
並列で、 requestsToAbortの各 promiseについて、そのpromiseに関連する byte送信を中断する。
7.5. サーバーから送信された受信中止シグナルの受信
WebTransportSendStream
stream に関連付けられたWebTransport streamに対し、次の手順を実行する:
-
transport を stream.
[[Transport]]とする。 -
code を、receiving aborted シグナルに付随するアプリケーションプロトコルのエラーコードとする。
Note: code の有効な値は 0 から 4294967295(両端を含む)。underlying connection が HTTP/3 を使用している場合、コードは [WEB-TRANSPORT-HTTP3] に記載のとおり [0x52e4a40fa8db, 0x52e5ac983162] の範囲の数値にエンコードされる。
-
Queue a network task を transport で実行し、次の手順を行う:
-
もし transport.
[[State]]が"closed"または"failed"なら、これらの手順を中止する。 -
Remove を行い、transport.
[[SendStreams]]から stream を取り除く。 -
error を、新たに 作成された
WebTransportErrorとし、 そのsourceは"stream"、かつstreamErrorCodeは code とする。 -
もし stream.
[[PendingOperation]]が null でないなら、stream.[[PendingOperation]]を error で reject する。 -
Error を行い、stream を error でエラー状態にする。
-
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
にまたがるデータ転送を追跡するためのオプションの管理オブジェクトです。
WebTransportSendStream
や WebTransportDatagramsWritable
は、
作成時または sendGroup 属性の割り当てによって、任意の時点で最大1つの WebTransportSendGroup
または null sendGroup
の下でグループ化されます。
デフォルトでは、WebTransportSendStream
や
WebTransportDatagramsWritable
は
null sendGroup に割り当てられます。
ユーザーエージェントは、WebTransportSendGroup
を
帯域分配時にWebTransportSendStreamへの送信について平等に扱います。
また、各 WebTransportSendGroup
は sendOrder
番号評価用の独立した数値空間も確立します。
[Exposed =(Window ,Worker ),SecureContext ]interface {WebTransportSendGroup Promise <WebTransportSendStreamStats >getStats (); };
WebTransportSendGroup
は必ずcreate手続きによって作成されます。
8.1. メソッド
getStats()-
この
WebTransportSendStreamを grouped した全ストリームの統計情報を集計し、 結果を非同期で報告します。getStatsが呼び出されたとき、ユーザーエージェントは次の手順を実行しなければならない:
-
p を新しいpromiseとする。
-
streams を
WebTransportSendStreamのうち[[SendGroup]]が this のもの全てとする。 -
並列処理で以下を実行:
-
gatheredStats を、streams内のすべてのストリームから集計した統計情報の リストとして、
WebTransportSendStreamStatsの 辞書メンバーを正確に埋めるために必要なものとする。 -
ネットワークタスクをキューして transport に以下を実行:
-
-
p を返す。
-
8.2. 内部スロット
WebTransportSendGroup
は以下の内部スロットを持つ。
| 内部スロット | 説明 (非規範的) |
|---|---|
[[Transport]]
| この WebTransport
オブジェクトが所有する WebTransportSendGroup。
|
8.3. 手続き
SendGroup を作成するには、
WebTransportSendGroup
と
WebTransport
transport を用いて、以下の手順を実行する:
-
sendGroup を 新しい
WebTransportSendGroupとし、次のように初期化する:[[Transport]]-
transport
-
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 が呼び出されたとき、ユーザーエージェントは次の手順を実行しなければならない:
-
p を新しい Promise とする。
-
次の手順を 並行して実行する:
-
gatheredStats を、リスト(this
WebTransportReceiveStreamに特化した統計)とし、WebTransportReceiveStreamStatsの辞書メンバーを正確に埋めるために必要なものとする。 -
ネットワークタスクをキューに入れ、transport を用いて次の手順を実行する:
-
-
p を返す。
-
9.2. 内部スロット
WebTransportReceiveStream
には以下の内部スロットがあります。
| 内部スロット | 説明(非規範的) |
|---|---|
[[InternalStream]]
| 受信単方向または双方向 のWebTransportストリーム。 |
[[Transport]]
| このWebTransport
オブジェクトがこのWebTransportReceiveStreamを所有します。
|
9.3. 手続き
create を、
WebTransportReceiveStream
に対して、incoming unidirectional または bidirectional の WebTransport stream
internalStream と、WebTransport
transport を用いて実行するには、次の手順を行う:
-
stream を、new な
WebTransportReceiveStreamとし、以下を持つものとする:[[InternalStream]]-
internalStream
[[Transport]]-
transport
-
pullAlgorithm を、pulls bytes を stream から行うアクションとする。
-
cancelAlgorithm を、cancels を stream に対して reason を与えて実行するアクションとし、 reason を与えた場合に stream をキャンセルするものとする。
-
Set up with byte reading support を用いて stream をセットアップし、 pullAlgorithm を pullAlgorithm に、 cancelAlgorithm を cancelAlgorithm に設定する。
-
Append を行い、stream を transport.
[[ReceiveStreams]]に追加する。 -
stream を返す。
バイト取得を WebTransportReceiveStream
stream から行うには、次の手順を実行する。
-
transport を stream.
[[Transport]]とする。 -
internalStream を stream.
[[InternalStream]]とする。 -
promise を新しいpromiseとする。
-
buffer、offset、maxBytes をnullに設定する。
-
stream の current BYOB request view がnullでない場合:
-
offset を stream の current BYOB request view.[[ByteOffset]] に設定する。
-
maxBytes を stream の current BYOB request view の byte length に設定。
-
buffer を stream の current BYOB request view の underlying buffer に設定する。
-
-
それ以外の場合:
-
offset を0に設定。
-
maxBytes を 実装依存サイズに設定。
-
buffer を 新規
ArrayBuffer(サイズ maxBytes)に設定。ArrayBufferの割り当てが失敗した場合、 RangeErrorでrejectされたpromise を返す。
-
-
並列処理で以下を実行:
-
Write internalStream から読み取られたバイト を buffer の offset から最大 maxBytes バイト分書き込む。 少なくとも1バイト読むかFIN受信まで待つ。 read を読み取ったバイト数、hasReceivedFIN をFIN同行有無とする。
ユーザーエージェントは転送性能向上のためバッファを持つ場合があり、このバッファは固定上限を持つべきで、サーバーにバックプレッシャー情報を伝える。
注記: この操作は buffer 全体を埋める前に返る場合がある。
-
先の手順で失敗した場合以降を中止する。
注記: ここで promise を reject しない理由は、ネットワークエラーの処理は他の工程で行われ、 その工程では stream をエラー状態にし、この pull を待つ read 要求が reject されるためです。
-
ネットワークタスクをキューして transport に次の手順を実行:
注記: 上記バッファがこの手続きの実行イベントループ内で利用可能なら以下は即時実行可。
-
read > 0の場合:
-
view を新しい
Uint8Array(buffer, offset, read)に設定。 -
view を stream にenqueue。
-
-
hasReceivedFIN がtrueの場合:
-
Remove stream を transport.
[[ReceiveStreams]]から削除。 -
stream をclose。
-
-
promise を undefined でresolve。
-
-
-
promise を返す。
cancel を WebTransportReceiveStream
の stream に対して reason を用いて行うための手順は次のとおり。
-
transport を、stream.
[[Transport]]とする。 -
internalStream を、stream.
[[InternalStream]]とする。 -
promise を新しい promise とする。
-
code を 0 とする。
-
もし reason が
WebTransportErrorであり、かつ reason.[[StreamErrorCode]]が null でないなら、code を reason.[[StreamErrorCode]]に設定する。 -
もし code < 0 なら、code を 0 に設定する。
-
もし code > 4294967295 なら、code を 4294967295 に設定する。
Note: code の有効な値は 0 から 4294967295(両端を含む)。underlying connection が HTTP/3 を使用している場合、コードは [WEB-TRANSPORT-HTTP3] に記載のとおり [0x52e4a40fa8db, 0x52e5ac983162] の範囲の数値にエンコードされる。
-
Remove を行い、stream を transport.
[[SendStreams]]から取り除く。 -
次の手順を 並行して実行する:
-
Abort receiving を internalStream に対して code を用いて行う。
-
Queue a network task を transport で実行し、次の手順を行う:
Note: 上で述べたバッファが、この手続きが実行されている event loop 内で利用可能な場合、以下の手順は直ちに実行されることがある。
-
Remove を行い、stream を transport.
[[ReceiveStreams]]から取り除く。 -
Resolve を行い、promise を undefined で解決する。
-
-
-
promise を返す。
9.4. サーバーから送信中止シグナルを受信した場合
WebTransportReceiveStream
stream に関連付けられたWebTransport streamに対し、次の手順を実行する:
-
transport を stream.
[[Transport]]とする。 -
code を、sending aborted シグナルに付随するアプリケーションプロトコルのエラーコードとする。
Note: code の有効な値は 0 から 4294967295(両端を含む)。underlying connection が HTTP/3 を使用している場合、コードは [WEB-TRANSPORT-HTTP3] に記載のとおり [0x52e4a40fa8db, 0x52e5ac983162] の範囲の数値にエンコードされる。
-
Queue a network task を transport で実行し、次の手順を行う:
-
もし transport.
[[State]]が"closed"または"failed"なら、これらの手順を中止する。 -
Remove を行い、transport.
[[ReceiveStreams]]から stream を取り除く。 -
error を、新たに 作成された
WebTransportErrorとし、 そのsourceは"stream"、かつstreamErrorCodeは code とする。 -
Error を行い、stream を error でエラー状態にする。
-
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ストリーム internalStream、
WebTransport
オブジェクト transport、sendOrder を指定して次の手順を実行する。
-
readable を WebTransportReceiveStream作成 の 結果 (internalStream, transport) とする。
-
writable を WebTransportSendStream作成 の 結果 (internalStream, transport, sendOrder) とする。
-
stream を 新規
WebTransportBidirectionalStreamとして次のプロパティで生成する:[[Readable]]-
readable
[[Writable]]-
writable
[[Transport]]-
transport
-
stream を返す。
11.
WebTransportWriter インターフェイス
WebTransportWriter
はWritableStreamDefaultWriter
のサブクラスであり、
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)が呼び出された場合、ユーザーエージェントは次の手順を実行する:-
stream が undefined なら TypeErrorでrejectされたpromise を返す。
-
stream.
[[InsideSynchronousAtomicWrite]]を true に設定。 -
p を
write(chunk)onWritableStreamDefaultWriterで chunk を渡して実行した結果とする。 -
stream.
[[InsideSynchronousAtomicWrite]]を false に設定。 -
append p を stream.
[[AtomicWriteRequests]]に追加。 -
reacting to p の結果として次を返す:
-
stream.
[[AtomicWriteRequests]]が pを含む場合、 remove p。 -
p が r で reject なら、rでrejectされたpromise を返す。
-
undefined を返す。
-
commit()-
commitメソッドは、ストリームの[[CommittedOffset]]を そのストリームで書き込んだバイト数([[BytesWritten]])と 一致させるよう更新します。 この操作によりストリームで書いたバイトは、書き込みが中断された場合も、 送信中断後でも ピアに確実に配送されます。 これは [RELIABLE-RESET] の仕組みを使います。注記: この操作はコネクションが失敗した場合の配送保証ではありません。 ストリームが送信中断された場合のみ確実な配送が保証されます。
commitが stream に対して呼び出されたとき、ユーザーエージェントは次の手順を実行:-
transport を stream.
[[Transport]]とする。 -
stream.
[[CommittedOffset]]を stream.[[BytesWritten]]の値に設定する。
-
11.2. 手続き
作成するには、
WebTransportWriter
を、WebTransportSendStream
streamで、次の
手順を実行する:
-
writer を 新しい
WebTransportWriterとする。 -
new WritableStreamDefaultWriter(stream) のコンストラクタ手順を writer をthis, streamをコンストラクタ引数として実行する。
-
writer を返す。
12.
WebTransportError インターフェイス
WebTransportErrorはDOMException
のサブクラスであり、
-
サーバーまたはネットワークからのエラー、または
-
クライアントが開始した中止操作の理由を表します。
[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 = "stream"; [source Clamp ]unsigned long ?=streamErrorCode null ; };enum {WebTransportErrorSource ,"stream" , };"session"
12.1. 内部スロット
WebTransportError
は以下の内部スロットを持ちます。
| 内部スロット | 説明 (非規範的) |
|---|---|
[[Source]]
| WebTransportErrorSource
このエラーのソースを示します。
|
[[StreamErrorCode]]
| このエラーのアプリケーションプロトコルエラーコード、またはnull。 |
12.2. コンストラクタ
new WebTransportError(message, options)
コンストラクタ手順:
-
this の name を
"WebTransportError"に設定する。 -
this の message を message に設定する。
-
this の内部スロットを次のように設定:
[[Source]]-
options.
source [[StreamErrorCode]]-
options.
streamErrorCode
12.3. 属性
source、 型は WebTransportErrorSource、読み取り専用-
ゲッター手順は、this の
[[Source]]を返すことです。 streamErrorCode、 型は unsigned long、読み取り専用、nullable-
ゲッター手順は、this の
[[StreamErrorCode]]を返すことです。
12.4. シリアライズ
WebTransportError
オブジェクトはシリアライズ可能オブジェクトです。
そのシリアライズ手順(valueとserializedを与えて):
-
DOMExceptionのシリアライズ手順をvalueとserializedで実行する。 -
serialized.
[[Source]]をvalue.[[Source]]に設定。 -
serialized.
[[StreamErrorCode]]をvalue.[[StreamErrorCode]]に設定。
そのデシリアライズ手順(serializedとvalueを与えて):
-
DOMExceptionのデシリアライズ手順をserializedとvalueで実行する。 -
value.
[[Source]]をserialized.[[Source]]に設定。 -
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をエラー状態にする writable
(streamErrorCode付き)
|
| STREAM受信 | (await
readable.getReader().read()).value
|
| STREAM受信(FINビットセット) | (await
readable.getReader().read()).done
|
| received RESET_STREAM with httpErrorCode | readableをエラー状態にする readable
(streamErrorCode付き)
|
| セッションが正常に終了し、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 writable
(streamErrorCode付き)
|
| WT_STREAM を受信 | (await
readable.getReader().read()).value
|
| WT_STREAM(FINビット付き) を受信 | (await
readable.getReader().read()).done
|
| WT_RESET_STREAM(エラー付き)を受信 | errors readable
(streamErrorCode付き)
|
| セッションが正常に 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]で記述された一連の要件を課します。主なものは以下の通りです:
-
リモートサーバーが WebTransport プロトコルの使用を認識していることを保証し、リモートサーバーが WebTransport プロトコルの使用に同意していることを確認する。[WEB-TRANSPORT-HTTP3] では、ALPN と [RFC7301]、 HTTP/3 の設定、そして WebTransport プロトコルを識別するための
:protocol擬似ヘッダーの組み合わせを用いる。[WEB-TRANSPORT-HTTP2] では、ALPN、HTTP/2 の設定、 そして WebTransport プロトコルを識別するための:protocol擬似ヘッダーの組み合わせを用いる。 -
トランスポートセッションを開始するリソースのオリジンに基づいて、サーバーが接続をフィルタリングできるようにする。セッション確立要求の
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. データグラムバッファの送信
この節は非規範的です。
データグラムのバッファ送信は、datagramsの
createWritable
メソッドおよびその結果のストリームのwriterを利用して実現できます。下記例では、トランスポートが送信可能な場合のみデータグラムを送信します。
async function sendDatagrams( url, datagrams) { const wt= new WebTransport( url); const writable= wt. datagrams. createWritable(); const writer= writable. getWriter(); for ( const bytesof datagrams) { await writer. ready; writer. write( bytes). catch (() => {}); } await writer. close(); }
15.2. 一定レートでデータグラム送信
この節は非規範的です。
トランスポートが送信可能かどうかに関わらず一定レートでデータグラムを送信したい場合は、datagramsの
createWritable
メソッドと、その結果のストリームの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 datagramof wt. datagrams. readable) { // datagramを処理 } }
15.4. BYOBリーダーによるデータグラム受信
この節は非規範的です。
datagrams
は可読バイトストリームであるため、バッファ割当てをより正確に制御しコピーを避けるための
BYOBリーダー
を取得できる。この例では64キビバイトのメモリバッファにデータグラムを読み出している。
const wt= new WebTransport( url); for await ( const datagramof 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 bytesof 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 readableof wt. incomingUnidirectionalStreams) { // 各ストリームを個別に消費し、ストリームごとのエラーを報告 (( async () => { try { for await ( const bytesof 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 readableof 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 dataof wt. datagrams. readable. pipeThrough( decoder)) { addToEventLog( `データグラム受信: ${ data} ` ); } addToEventLog( 'データグラム読み取り終了!' ); } catch ( e) { addToEventLog( `データグラム読取中のエラー: ${ e} ` , 'error' ); } } async function acceptUnidirectionalStreams() { try { for await ( const readableof 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 dataof 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 インターフェイスに基づいており、本仕様に合わせて適合・拡張されています。