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で説明されています。
終了するには、WebTransportセッション sessionに任意の整数 codeと任意のバイト列 reasonを指定し、[WEB-TRANSPORT-OVERVIEW] セクション4.1に従ってください。
WebTransportセッション sessionは、任意の整数 codeとバイト列 reasonとともに、CONNECTストリームがサーバーによって閉じられたときに 終了済みとなります。詳細は [WEB-TRANSPORT-OVERVIEW] セクション4.1で説明されています。
3.2. WebTransportストリーム
WebTransportストリームは、WebTransportセッション上の信頼性のある順序どおりのバイトストリームの概念であり、[WEB-TRANSPORT-OVERVIEW] セクション4.3で説明されています。
WebTransportストリームは、受信単方向、 送信単方向または双方向のいずれかです。
WebTransportストリームには以下の機能があります:
| 機能 | 定義 | 受信単方向 | 送信単方向 | 双方向 |
|---|---|---|---|---|
| バイト送信(FIN付きの場合あり) | [WEB-TRANSPORT-OVERVIEW] セクション4.3 | いいえ | はい | はい |
| バイト受信(FIN付きの場合あり) | [WEB-TRANSPORT-OVERVIEW] セクション4.3 | はい | いいえ | はい |
| 受信の中止(WebTransportストリームで) | [WEB-TRANSPORT-OVERVIEW] セクション4.3 | はい | いいえ | はい |
| 送信の中止(WebTransportストリームで) | [WEB-TRANSPORT-OVERVIEW] セクション4.3 | いいえ | はい | はい |
WebTransportストリームには以下のシグナルがあります:
| イベント | 定義 | 受信単方向 | 送信単方向 | 双方向 |
|---|---|---|---|---|
| 受信中止 | [WEB-TRANSPORT-OVERVIEW] セクション4.3 | いいえ | はい | はい |
| 送信中止 | [WEB-TRANSPORT-OVERVIEW] セクション4.3 | はい | いいえ | はい |
| フロー制御 | [WEB-TRANSPORT-OVERVIEW] セクション4.3 | いいえ | はい | はい |
4. WebTransportDatagramsWritable インターフェース
WebTransportDatagramsWritableは、WritableStream
であり、
データグラムの送信のための送信ストリーミング機能を提供します。
[Exposed =(Window ,Worker ),SecureContext ,Transferable ]interface WebTransportDatagramsWritable :WritableStream {attribute WebTransportSendGroup ?sendGroup ;attribute long long sendOrder ; };
4.1. 内部スロット
WebTransportDatagramsWritable
オブジェクトは以下の内部スロットを持ちます。
| 内部スロット | 説明 (非規範的) |
|---|---|
[[OutgoingDatagramsQueue]]
| 送信用データグラム、タイムスタンプ、およびデータグラムが送信または破棄されたときに解決される Promise のタプルのキュー。 |
[[Transport]]
| この WebTransport
が所有する WebTransportDatagramsWritable。
|
[[SendGroup]]
| オプションの WebTransportSendGroup、
または null。
|
[[SendOrder]]
| オプションの送信順序番号。デフォルトは 0。 |
WebTransportDatagramsWritable
を
WebTransport
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.[[OutgoingDatagramsHighWaterMark]]未満なら、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を実行しなければならず、アルゴリズムが進捗できる場合は合理的な範囲ですぐに実行するべきです。
送信順ルールは、送信は一般に、このトランスポート上で以前にキューされたストリームやデータグラムの送信、および今後キューされるストリームやデータグラムの送信とインターリーブされてもよいですが、送信は、同じ
[[SendGroup]]
かつより高い
[[SendOrder]]
を持つストリームやデータグラム(エラー状態でもフロー制御でブロックされているものでもない)が全て送信されるまで、優先的に待機しなければなりません。
注: トランスポートの[[State]]
が"connecting"の間、データグラムの書き込みは許可されます。
データグラムは[[OutgoingDatagramsQueue]]
に格納され、"connected"状態の時と同様に破棄される可能性があります。トランスポートの[[State]]
が"connected"になると、キューされたデータグラムの送信が開始されます。
5. WebTransportDatagramDuplexStream インターフェース
WebTransportDatagramDuplexStreamは、汎用的なデュプレックスストリームです。
[Exposed =(Window ,Worker ),SecureContext ]interface WebTransportDatagramDuplexStream {WebTransportDatagramsWritable createWritable (optional WebTransportSendOptions = {});options readonly attribute ReadableStream readable ;readonly attribute unsigned long maxDatagramSize ;attribute unrestricted double ?incomingMaxAge ;attribute unrestricted double ?outgoingMaxAge ;attribute unrestricted double incomingHighWaterMark ;attribute unrestricted double outgoingHighWaterMark ; };
5.1. 内部スロット
WebTransportDatagramDuplexStream
オブジェクトは以下の内部スロットを持ちます。
| 内部スロット | 説明 (非規範的) |
|---|---|
[[Transport]]
| このWebTransport
が所有するWebTransportDatagramDuplexStream。
|
[[Readable]]
| 受信データグラム用の ReadableStream。
|
[[ReadableType]]
| 受信データグラムで使用される ReadableStreamType。
|
[[Writables]]
| 順序付き集合
のWebTransportDatagramsWritable
ストリーム、
初期状態は空。
|
[[IncomingDatagramsQueue]]
| 受信データグラムとタイムスタンプのペアのキュー。 |
[[IncomingDatagramsPullPromise]]
| pullDatagramsによって設定される、受信データグラムを待つためのpromise。 |
[[IncomingDatagramsHighWaterMark]]
|
unrestricted double
で表される受信データグラムの
high water mark。
|
[[IncomingDatagramsExpirationDuration]]
|
unrestricted double
で表される受信データグラムの有効期限(ミリ秒単位)、または null。
|
[[OutgoingDatagramsHighWaterMark]]
|
unrestricted double
で表される送信データグラムの
high water mark。
|
[[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
[[IncomingDatagramsHighWaterMark]]-
実装依存の値
[[IncomingDatagramsExpirationDuration]]-
null
[[OutgoingDatagramsHighWaterMark]]-
実装依存の値
この実装依存の値は、十分なスループットを確保しつつ、送信データの即時性を損ねないよう調整されるべきです。
[[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, of type ReadableStream, readonly-
ゲッター手順は以下の通り:
-
this.
[[Readable]]を返す。
-
incomingMaxAge, of type unrestricted double, nullable-
ゲッター手順は以下の通り:
セッター手順(value が与えられた場合):
-
もし value が負または NaN なら、throw し、
RangeErrorとする。 -
もし value が
0なら、value を null に設定する。 -
this.
[[IncomingDatagramsExpirationDuration]]に value を設定する。
maxDatagramSize, of type unsigned long, readonly-
WebTransportDatagramsWritableに渡せる最大データサイズ。 ゲッター手順は、this.[[OutgoingMaxDatagramSize]]を返す。 outgoingMaxAge, of type unrestricted double, nullable-
ゲッター手順は以下の通り:
セッター手順(value が与えられた場合):
-
もし value が負または NaN なら、throw し、
RangeErrorとする。 -
もし value が
0なら、value を null に設定する。 -
this.
[[OutgoingDatagramsExpirationDuration]]に value を設定する。
incomingHighWaterMark, of type unrestricted double-
ゲッター手順は以下の通り:
セッター手順(value が与えられた場合):
-
もし value が負または NaN なら、throw し、
RangeErrorとする。 -
もし value が
1未満なら、value を1に設定する。 -
this.
[[IncomingDatagramsHighWaterMark]]に value を設定する。
outgoingHighWaterMark, of type unrestricted double-
ゲッター手順は以下の通り:
セッター手順(value が与えられた場合):
-
もし value が負または NaN なら、throw し、
RangeErrorとする。 -
もし value が
1未満なら、value を1に設定する。 -
this.
[[OutgoingDatagramsHighWaterMark]]に value を設定する。
5.4. 手順
pullDatagrams するには、
WebTransport
オブジェクト transport を与えて次の手順を実行する:
-
datagramsを transport.
[[Datagrams]]とする。 -
アサート:datagrams.
[[IncomingDatagramsPullPromise]]はnull。 -
queueを datagrams.
[[IncomingDatagramsQueue]]とする。 -
もしqueueが空なら、
-
datagrams.
[[IncomingDatagramsPullPromise]]に新しいpromiseを設定する。 -
datagrams.
[[IncomingDatagramsPullPromise]]を返す。
-
-
datagramとtimestampをqueueからデキュー queueした結果とする。
-
もしdatagrams.
[[ReadableType]]が"bytes"なら:-
もしdatagrams.
[[Readable]]の current BYOB request viewが nullでなければ:-
viewをdatagrams.
[[Readable]]の current BYOB request viewとする。 -
もしviewのbyte lengthがdatagramのサイズより小さいなら、 promise rejected(失敗promise)を
RangeErrorで返す。 -
typed array constructors tableの view.[[TypedArrayName]]で指定されたelement sizeをelementSizeとする。viewが [[TypedArrayName]]の内部スロットを持たない場合(
DataViewの場合)、elementSizeは0とする。 -
もしelementSizeが1でなければ promise rejected(失敗promise)を
TypeErrorで返す。
-
-
Pull from bytesで datagramをdatagrams.
[[Readable]]にpullする。
-
-
それ以外:
-
chunkを
Uint8Arrayでdatagramを表現した新規オブジェクトとする。 -
Enqueueで chunkを transport.
[[Datagrams]].[[Readable]]にenqueueする。
-
-
promise resolved(成功promise)でundefinedを返す。
receiveDatagrams するには、
WebTransport
オブジェクト transport を与えて次の手順を実行する:
-
timestampを現在時刻とする。
-
queueをdatagrams.
[[IncomingDatagramsQueue]]とする。 -
durationをdatagrams.
[[IncomingDatagramsExpirationDuration]]とする。 -
もしdurationがnullなら、durationに実装依存の値を設定する。
-
sessionをtransport.
[[Session]]とする。 -
sessionで利用可能な受信データグラムがある間:
-
datagramをdatagram受信の結果とする。
-
timestampを現在時刻とする。
-
chunkをdatagramとtimestampのペアとする。
-
Enqueueでchunkをqueueにenqueueする。
-
-
toBeRemovedをqueueの長さからdatagrams.
[[IncomingDatagramsHighWaterMark]]を引いた値とする。 -
もしtoBeRemovedが正なら、queueからデキューするqueueをtoBeRemoved 回(切り捨て)繰り返す。
-
queueが空でない間:
-
bytesとtimestampをqueueの先頭要素とする。
-
もしtimestampからdurationミリ秒より長く経過していたら、queueからデキューする。
-
それ以外は、このループをbreakする。
-
-
もしqueueが空でなく、かつdatagrams.
[[IncomingDatagramsPullPromise]]が非nullなら:-
bytesとtimestampをqueueからデキューした結果とする。
-
promiseをdatagrams.
[[IncomingDatagramsPullPromise]]とする。 -
datagrams.
[[IncomingDatagramsPullPromise]]をnullに設定する。 -
Queue a network taskで transportで次の手順を実行:
-
chunkを
Uint8Arrayでbytesを表現した新規オブジェクトとする。 -
Enqueueでchunkを datagrams.
[[Readable]]にenqueueする。 -
promise 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 <ArrayBuffer >exportKeyingMaterial (BufferSource ,label optional BufferSource );context readonly attribute Promise <undefined >ready ;readonly attribute WebTransportReliabilityMode reliability ;readonly attribute WebTransportCongestionControl congestionControl ; [EnforceRange ]attribute unsigned short ?anticipatedConcurrentIncomingUnidirectionalStreams ; [EnforceRange ]attribute unsigned short ?anticipatedConcurrentIncomingBidirectionalStreams ;readonly attribute DOMString protocol ;readonly attribute Promise <WebTransportCloseInfo >closed ;readonly attribute Promise <undefined >draining ;undefined close (optional WebTransportCloseInfo = {});closeInfo readonly attribute WebTransportDatagramDuplexStream datagrams ;Promise <WebTransportBidirectionalStream >createBidirectionalStream (optional WebTransportSendStreamOptions = {}); /* 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]]
| トランスポートの状態を示すenum。
"connecting",
"connected", "draining", "closed",
"failed"のいずれか。
|
[[Ready]]
| 関連するWebTransportセッション が確立された際に fulfillされるpromise。確立処理が失敗した場合は rejectする。 |
[[Reliability]]
|
WebTransportReliabilityMode
で、最初のホップが信頼性なし(UDP)か、信頼性あり(TCPフォールバック)のどちらかを示す。
接続確立までは"pending"を返す。
|
[[CongestionControl]]
|
WebTransportCongestionControl
で、アプリによるスループット最適/低遅延最適の輻輳制御アルゴリズム要求がユーザーエージェントに満たされたか、"default"かを示す。
|
[[AnticipatedConcurrentIncomingUnidirectionalStreams]]
| アプリがサーバーによって生成されると予測する同時オープン 着信単方向ストリーム数、またはnull。 |
[[AnticipatedConcurrentIncomingBidirectionalStreams]]
| アプリがサーバーによって生成されると予測する同時オープン 双方向ストリーム数、またはnull。 |
[[Protocol]]
| サーバーによって選択されたアプリケーションレベルプロトコルを示す文字列。初期値は空文字列。 |
[[Closed]]
|
関連するWebTransport
オブジェクトが正常にクローズされた場合にfulfill、異常終了/初期化失敗時にrejectされるpromise。
|
[[Draining]]
| 関連するWebTransportセッション がdrainedのときにfulfillされるpromise。 |
[[Datagrams]]
|
WebTransportDatagramDuplexStream。
|
[[Session]]
|
このWebTransportオブジェクトのWebTransportセッション、またはnull。
|
[[NewConnection]]
| "no"または"yes-and-dedicated"のいずれか。
|
[[RequireUnreliable]]
| UDPが必須かどうかを示すboolean。 |
[[ServerCertificateHashes]]
|
リストで、0個以上の
WebTransportHashオブジェクトを格納する。
|
6.2. コンストラクター
WebTransport()
コンストラクターが呼び出されたとき、ユーザーエージェントは次の手順を実行しなければならない:
-
baseURL に this の 関連設定オブジェクト の API base URL を取得する。
-
もし url が failure の場合、throw で
SyntaxError例外。 -
もし url の scheme が
httpsでない場合、throw でSyntaxError例外。 -
もし url の fragment が null でない場合、throw で
SyntaxError例外。 -
allowPooling に
optionsのallowPoolingを取得する。 -
dedicated に allowPooling の否定値を設定する。
-
serverCertificateHashes を
optionsのserverCertificateHashesとする。 -
もし dedicated が false で serverCertificateHashes が 空でないなら、throw で
NotSupportedError例外。 -
newConnection に dedicated が false なら "
no"、そうでなければ "yes-and-dedicated" を設定。 -
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
[[Protocol]]-
空文字列
[[Closed]]-
新しい promise
[[Draining]]-
新しい promise
[[Datagrams]]-
undefined
[[Session]]-
null
[[NewConnection]]-
newConnection
[[RequireUnreliable]]-
requireUnreliable
[[ServerCertificateHashes]]-
serverCertificateHashes
-
transport.
[[Datagrams]]に WebTransportDatagramDuplexStream を生成した結果を設定し、 引数は transport、incomingDatagrams、datagramsReadableType を用いる。 -
pullDatagramsAlgorithm を pullDatagrams を transport で実行するアクションとする。
Note: データグラムには 64 KiB バッファ利用が推奨される。なぜなら有効な最大WebTransportデータグラムフレームサイズはQUIC最大データグラムフレームサイズ(推奨64 KiB)が上限となるため。 [QUIC-DATAGRAM] Section 3 参照。 この値がバッファより大きいデータグラムでエラーが発生しないことを担保するため。
-
もし datagramsReadableType が
"bytes"なら、バイト読み出しサポート付きセットアップで incomingDatagrams の pullAlgorithm を pullDatagramsAlgorithm、および highWaterMark を 0 でセットアップ。 それ以外の場合は セットアップ で 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 の origin を設定。
-
request に新しい 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、 redirect mode を "error" に設定する。Note: リダイレクトはフォローされない。リダイレクトに起因するネットワークエラーは他のネットワークエラーと区別不能であることが意図的。 クロスオリジン環境では、これは通常CORSでブロックされる情報を漏らさないようにするため。同一オリジン環境では、ハンドシェイク悪用による情報漏洩を防ぐため。
-
request の method を "
CONNECT" に設定し、 method に紐付けた:protocol疑似ヘッダーに"webtransport"を設定する。 -
protocols が空でない場合、(
WT-Available-Protocols, structured header list のメンバーが protocols 内順番通りの structured header stringアイテムでできたもの)として 構造化フィールド値を request の header listに設定する。 -
Fetch で request を送信し、 useParallelQueue を true に、 processResponse を response で次の手順とする:
-
WebTransport fetch response を処理で、 引数は response、origin、protocols、congestionControl。
-
-
transport を返す。
-
transport を
WebTransportオブジェクトで request に関連付けられているものとする。 -
url を request の current URL とする。
-
newConnection を transport.
[[NewConnection]]とする。 -
requireUnreliable を transport.
[[RequireUnreliable]]とする。 -
serverCertificateHashes を transport.
[[ServerCertificateHashes]]内の値とする。 -
connection を connection を取得で networkPartitionKey、url、false、newConnection、requireUnreliable を渡して得られた結果とする。 ただし serverCertificateHashes が 空でない場合、デフォルトの証明書検証アルゴリズムの代わりに カスタム証明書要件を満たし、 証明書ハッシュの検証が serverCertificateHashesと一致する場合のみ証明書が有効と見なす。それ以外は failure とする。
-
もし connection が failure なら failure を返す。
-
connection が最初のSETTINGSフレームを受信するまで待機し、settings をその内容を表すディクショナリとする。
-
もし settings に
SETTINGS_ENABLE_CONNECT_PROTOCOL(0x08, Section 3 of [RFC8441] HTTP/2; 0x08, Section 3 of [RFC9220])が1で含まれないなら failure を返す。 -
もし settings がWebTransportサポートを示さない場合、failure を返す。 [WEB-TRANSPORT-OVERVIEW] Section 4.1.
-
HTTP/3の場合、
SETTINGS_WT_MAX_SESSIONSが1より大きい値、SETTINGS_H3_DATAGRAMが1で必要。 [WEB-TRANSPORT-HTTP3] Section 3.1参照。 -
HTTP/2の場合、上記
SETTINGS_ENABLE_CONNECT_PROTOCOLが既にサポートを示す。 [WEB-TRANSPORT-HTTP2] Section 3.1参照。
Note:
SETTINGS_WT_MAX_SESSIONSはIETFで仕様が流動的で、SETTINGS_ENABLE_WEBTRANSPORTへ戻る可能性あり。 -
-
connection を返す。
-
もし response が network error なら、残りの手順を中止し、ネットワークタスクをキューして transport で以下を行う:
-
もし transport.
[[State]]が"closed"または"failed"なら、この手順を中止する。 -
error を 新規作成した
WebTransportErrorでsourceは"session"。 -
クリーンアップで transport と error を渡す。
-
-
connection を response に紐付く接続とする。
-
[WEB-TRANSPORT-OVERVIEW] Section 4.1 に従って WebTransport セッションの確立を connection と サーバーの response で行う。
-
session を直近で 確立された WebTransportセッションとする。 結果として得られる基盤トランスポートストリームをセッションの CONNECT stream と呼ぶ。
Note: このステップで、[QUIC-DATAGRAM]で規定された トランスポートパラメータ交換も完了する。
-
もし前ステップが失敗した場合、残りを中止し、ネットワークタスクをキューして transport で以下を実行:
-
もし transport.
[[State]]が"closed"または"failed"なら中止。 -
error を 新規作成した
WebTransportErrorでsourceは"session"。 -
クリーンアップで transport と error を渡す。
-
-
もし複数の輻輳制御アルゴリズムをサポートしているなら、その congestionControl に相応しいものをこの connection のデータ送信に用いる。
-
ネットワークタスクをキューして transport で以下を行う:
-
アサート:this の
[[Datagrams]]の[[OutgoingMaxDatagramSize]]は整数である。 -
もし transport.
[[State]]が"connecting"でなければ: -
transport.
[[State]]を"connected"に設定。 -
transport.
[[Session]]に session を設定。 -
transport.
[[Protocol]]に、存在する場合は交渉済みアプリケーションプロトコルの文字列値を、なければ""を設定 ([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"なら、次の手順を fulfillment後に transport.[[Ready]]で実施する結果を返す:-
pullBidirectionalStream を transport に実行した結果を返す。
-
-
もし transport.
[[State]]が"connected"以外なら、新しい rejected promise をInvalidStateErrorで返す。 -
session を transport.
[[Session]]とする。 -
p を新しいpromiseとする。
-
次の手順を 並列 で実行:
-
session に 利用可能な着信双方向ストリーム が現れるまで待つ。
-
internalStream を bidirectional stream の受信 を session で実行した結果とする。
-
ネットワークタスクをキューして、 transport で次を実施:
-
stream を WebTransportBidirectionalStream の作成で、 引数は internalStream, transport。
-
Enqueue で stream を transport.
[[IncomingBidirectionalStreams]]にenqueueする。 -
resolve で p を undefined で解決する。
-
-
-
p を返す。
WebTransport
オブジェクト transport が与えられたとき、次の手順を実行する:
-
もし transport.
[[State]]が"connecting"なら、次の手順を fulfillment後に transport.[[Ready]]で実施する結果を返す:-
pullUnidirectionalStream を transport に実行した結果を返す。
-
-
もし transport.
[[State]]が"connected"以外なら、新しい rejected promise をInvalidStateErrorで返す。 -
session を transport.
[[Session]]とする。 -
p を新しいpromiseとする。
-
次の手順を 並列 で実行:
-
session に 利用可能な着信単方向ストリーム が現れるまで待つ。
-
internalStream を incoming unidirectional stream の受信 を session で実行した結果とする。
-
ネットワークタスクをキューして transport で次を実施:
-
stream を WebTransportReceiveStream の作成で、 引数は internalStream, transport。
-
Enqueue で stream を transport.
[[IncomingUnidirectionalStreams]]にenqueueする。 -
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
を設定しても、アプリが予測する本数のストリームを必ず受信できる保証はない。
protocol, of type 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の 長さ が UTF-8 エンコードで 1024 を超えない最大の prefix とする。 -
reason を reasonString の UTF-8 エンコードで取得する。
-
並列で、terminate session に code および reason を指定して実行する。
Note: これにより 送信中止や 受信中止が、 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 の member ごとに、 set で gatheredStats の対応する エントリを設定する。
-
resolve で p を stats で解決する。
-
-
-
p を返す。
-
exportKeyingMaterial(BufferSource label, optional BufferSource context)-
この
WebTransportの 基盤コネクションに一意に紐付く TLS セッションから TLS Keying Material Exporter を用いてキーをエクスポートする。exportKeyingMaterialが呼ばれたとき、ユーザーエージェントは次の手順を実行しなければならない:-
transport を this とする。
-
labelLength を label の バイト長とする。
-
もし labelLength が 255 より大きい場合、promise rejected を
RangeErrorで返す。 -
contextLength を 0 とする。
-
もし context が指定されていれば、contextLength を context のバイト長に設定する。
-
もし contextLength が 255 より大きい場合、promise rejected を
RangeErrorで返す。 -
p を新しい promise とする。
-
次の手順を 並列で実行する。ただし、abort when transport の
[[State]]が"closed"または"failed"になった場合は中止し、 代わりに ネットワークタスクをキューし、 transport で reject p をInvalidStateErrorで行う:-
keyingMaterial をエクスポートされた TLS キー情報として取得する([WEB-TRANSPORT-OVERVIEW] Section 4.1に従う)、labelLength、label、contextLength、context(ある場合)を使う。
-
ネットワークタスクをキューし transport で resolve p を keyingMaterial で解決する。
-
-
p を返す。
-
createBidirectionalStream()-
送信用の
WebTransportBidirectionalStreamオブジェクトを作成する。ストリームの作成だけではピアにはすぐに認識されず、データ送信を伴って初めて認識される。Note: サーバはデータ送信があるまでこのストリームの存在を認識しない。
createBidirectionalStreamが呼ばれたとき、ユーザーエージェントは次の手順を実行しなければならない:-
もし this.
[[State]]が"closed"または"failed"なら、 新しい rejected promise をInvalidStateErrorで返す。 -
もし sendGroup が null でなく、 sendGroup.
[[Transport]]が this でない場合、throw でInvalidStateErrorを返す。 -
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 を bidirectional stream の作成で transport.
[[Session]]および streamId を渡して得る。 -
ネットワークタスクをキュー し transport で以下を実行:
-
もし transport.
[[State]]が"closed"または"failed"なら、 reject p をInvalidStateErrorで拒否してこの手順を中止する。 -
stream を 作成した
WebTransportBidirectionalStream(internalStream, transport, sendGroup, sendOrder渡す) とする。 -
resolve で p を stream で解決する。
-
-
-
p を返す。
-
createUnidirectionalStream()-
送信用の
WebTransportSendStreamを作成する。ストリームの作成だけではサーバにはすぐに認識されず、データ送信で初めて認識される。Note: サーバはデータ送信があるまでこのストリームの存在を認識しない。
createUnidirectionalStream()メソッドが呼ばれたとき、ユーザーエージェントは 次の手順を実行しなければならない:-
もし this.
[[State]]が"closed"または"failed"なら、 新しい rejected promise をInvalidStateErrorで返す。 -
もし sendGroup が null でなく、 sendGroup.
[[Transport]]が this でない場合、throw でInvalidStateErrorを返す。 -
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"であれば、 throw でInvalidStateErrorを返す。 -
作成した
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 ;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, of type boolean, defaulting tofalse-
true の場合、WebTransport セッションはプール可能(複数 WebTransport セッション間で 基盤コネクション の共有が可能)となる。
requireUnreliable, of type boolean, defaulting tofalse-
true の場合、HTTP/3 connection が不可の場合、WebTransport セッションは HTTP/2 connection 上では確立されない。
serverCertificateHashes, of type sequence<WebTransportHash>, defaulting to[]-
このオプションは専用コネクション利用時のみサポートされる。 この機能が未サポートのトランスポートプロトコルで本フィールドが空でない場合は
NotSupportedError例外がスローされる。サポートされており非空の場合、ユーザーエージェントは 証明書ハッシュの検証が
serverCertificateHashesで一致し、カスタム証明書要件も満たす場合に限り サーバ証明書を信頼すべきである。未知のalgorithmのハッシュは無視される。 空の場合は通常の fetch 操作時と同じ証明書検証を行う。これは
allowPoolingと併用できない。 congestionControl, of type WebTransportCongestionControl, defaulting to"default"-
データ送信時に利用する輻輳制御アルゴリズムについて、 スループット最適/低遅延最適どちらをアプリが好むかヒントとして指定できる。これはユーザーエージェントへのヒント。
anticipatedConcurrentIncomingUnidirectionalStreams, of type unsigned short, nullable, defaulting tonull-
アプリがサーバで同時オープンされると予想する 着信単方向ストリーム数を指定できる。 ユーザーエージェントは初期状態で少なくとも100本の 着信単方向 ストリームを許可しなければならない。 nullでなければ、サーバとのネゴシエーション時に
[[AnticipatedConcurrentIncomingUnidirectionalStreams]]を考慮してラウンドトリップ削減に努めるべきである。 anticipatedConcurrentIncomingBidirectionalStreams, of type unsigned short, nullable, defaulting tonull-
アプリがサーバで同時オープンされると予想する 双方向ストリーム数を指定できる。 ユーザーエージェントは初期状態でサーバに少なくとも100本の 双方向ストリーム作成を許可しなければならない。 nullでなければ、サーバとのネゴシエーション時に
[[AnticipatedConcurrentIncomingBidirectionalStreams]]を考慮してラウンドトリップ削減に努めるべきである。 protocols, of type sequence<DOMString>, defaulting to[]-
アプリケーションレベルの プロトコル名 を格納する配列を省略可能で指定できる。サーバ側でプロトコル選択と通知は任意。 適切なプロトコルが指定されていなければサーバはリクエストを拒否することがある。
datagramsReadableType, of type ReadableStreamType-
アプリの受信データグラム用に readable byte stream の利用を希望する場合に指定できる。 指定しなければデフォルトで readable stream が用いられる。
Note: 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 固有の統計情報を含む。
Note: プーリングが使用される場合、同じ connection 上でプールされた複数の WebTransport セッション はすべて同じ情報を受け取る。つまり、同じ network partition key を保持するプールされた sessions 間で情報が開示される。
Note: 利用不能な統計は 欠落 として、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機構によりサーバに受信済みと確認されたペイロードバイト数(フレーミングを除く、基盤コネクション上)。
Note: 通常は
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は実効上限値となる。 アプリ送信レートが継続する限り、この値はネットワーク状況に適応する。ただしestimatedSendRateはatSendCapacityが true のときでもnullになりうる。
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]]でなければ、 throw でInvalidStateErrorを投げる。 -
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]]
| 書き込みまたはクローズ処理が保留中であればその promise、それ以外は null。 |
[[Transport]]
| この WebTransport
を所有する WebTransportSendStream。
|
[[SendGroup]]
| オプションの WebTransportSendGroup、
または null。
|
[[SendOrder]]
| オプションの送信順序番号。デフォルトは0。 |
[[AtomicWriteRequests]]
| 順序付き集合で、 基盤の sink にキューイングされた書き込みリクエストのうちアトミックなものを追跡するための promises。 |
[[BytesWritten]]
| このストリームに書き込まれたバイト数。 |
[[CommittedOffset]]
| ストリーム内でピアに配信されるバイト数を記録するオフセット。ストリームが送信中止 された場合でも有効。 [RELIABLE-RESET] 参照。 |
7.4. 手続き
生成するには、
WebTransportSendStreamを
送信単方向または双方向のWebTransportストリーム
internalStream、WebTransport
transport、sendGroup、およびsendOrderを指定して、次の手順を実行する:
-
streamをnew
WebTransportSendStreamとして以下のプロパティで作成:[[InternalStream]]-
internalStream
[[PendingOperation]]-
null
[[Transport]]-
transport
[[SendGroup]]-
sendGroup
[[SendOrder]]-
sendOrder
[[AtomicWriteRequests]]-
空の順序付きセット(promise)。
[[BytesWritten]]-
0
[[CommittedOffset]]-
0
-
writeAlgorithmを、chunkを与えられた時にstreamへ書き込むアクションとして定義。
-
closeAlgorithmを、streamを閉じるアクションとして定義。
-
abortAlgorithmを、reasonを与えられた時にstreamを中止するアクションとして定義。
-
streamのセットアップを行い、 writeAlgorithmをwriteAlgorithmに、 closeAlgorithmをcloseAlgorithmに、 abortAlgorithmをabortAlgorithmに設定する。
-
abortSignalをstreamの[[controller]].[[abortController]].[[signal]]とする。
-
-
pendingOperationをstream.
[[PendingOperation]]とする。 -
pendingOperationがnullなら、これらのステップを中止。
-
stream.
[[PendingOperation]]をnullに設定。 -
reasonをabortSignalの中止理由とする。
-
streamの中止(reason)の結果をpromiseとする。
-
-
streamをtransport.
[[SendStreams]]に追加。 -
streamを返す。
WebTransportSendStream
stream に書き込むには、次の手順を実行する:
-
transport を stream.
[[Transport]]とする。 -
もし chunk が
BufferSourceでなければ、promise rejected with でTypeErrorを返す。 -
promise を新しい promise とする。
-
bytes を chunk が表す バイト列のコピーとする。
-
stream.
[[PendingOperation]]に promise をセットする。 -
inFlightWriteRequest を stream.inFlightWriteRequest とする。
-
atomic を、 stream.
[[AtomicWriteRequests]]が inFlightWriteRequest を含む場合に true、 それ以外は false とする。 -
次の手順を 並列で実行する:
-
もし atomic が true で、現在の フロー制御ウィンドウが bytes 全体分の送信に小さすぎる場合は、 残りの手順を中止し、ネットワークタスクをキューし、 transport で次のサブステップを実行する:
-
stream.
[[PendingOperation]]に null をセットする。 -
すべてのアトミック書き込みリクエストを中止 を stream で実施する。
-
-
それ以外の場合、送信 で bytes を stream.
[[InternalStream]]に送り、操作完了まで待機する。 この送信は、すでにキューに入っているストリームやデータグラム、これからキューにされるストリームやデータグラムと インターリーブされる場合がある。ユーザーエージェントはパフォーマンス改善のためにバッファを用いることがある。このバッファにはバックプレッシャー反映のために固定上限を設けるべきである。
WebTransportSendStreamの利用者にその情報が伝わるようにすべきである。この送信は、 同じ
[[SendGroup]]かつ、より高い[[SendOrder]]を持ち、かつ エラー状態でなく、フロー制御でブロックされていないストリーム全ての 送信待ちのバイトが送り終わるまでスターブ状態になること。ここで stream.
[[SendOrder]]に並列でアクセスがある。 ユーザーエージェントは送信中にこれら値の動的変更へ対応すべきであるが、 詳細は実装定義とする。注記: 再送の順序は 実装定義だが、 ユーザーエージェントはより高い
[[SendOrder]]のデータ再送を優先することが強く推奨される。フロー制御やエラー以外の理由でスターブ状態になるべきではない。
ユーザーエージェントはスターブでない全ストリーム間で帯域幅を公平に分配すべきである。
注記: ここでの公平性の定義は実装定義である。
-
前のステップでネットワークエラーが生じたら、残りの手順を中止する。
注記: ここで promise を reject しない。ネットワークエラーは本来別部分で処理され、stream.
[[PendingOperation]]を reject する。 -
それ以外の場合、ネットワークタスクをキューし、 transport で次の手順を実行する:
-
stream.
[[PendingOperation]]に null をセットする。 -
stream.
[[BytesWritten]]に bytes の長さを加算する。 -
もし stream.
[[AtomicWriteRequests]]が inFlightWriteRequest を含む場合、 inFlightWriteRequest を取り除く。 -
resolve で promise に undefined を渡す。
-
-
-
promise を返す。
注記: このアルゴリズムが返す promise
(または write(chunk))
が fulfill されても、その chunk がサーバーに 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 を含む場合、 error で stream に
AbortErrorを設定し、 この手順を中止する。 -
Empty で stream.
[[AtomicWriteRequests]]を空にする。 -
requestsToAbort の各 promise について、 reject で promise に
AbortErrorを渡す。 -
並列で requestsToAbort 各 promise について、その 送信 を中止する。
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は、
生成時またはsendGroup属性の割り当てによって、
同時に最大1つのWebTransportSendGroup
にグループ化されることができます。デフォルトでは
グループ化されていません。
ユーザーエージェントは、WebTransportSendGroup
間の帯域分配を平等に扱います。
各WebTransportSendGroup
はsendOrder
番号評価の独立した数値空間も確立します。
[Exposed =(Window ,Worker ),SecureContext ]interface {WebTransportSendGroup Promise <WebTransportSendStreamStats >getStats (); };
WebTransportSendGroup
は必ずcreate手続きによって作成されます。
8.1. メソッド
getStats()-
この sendGroup に grouped されているすべての
WebTransportSendStreamの統計情報を集約し、非同期に結果を返す。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 を返す。
pull bytes を WebTransportReceiveStream
stream から行うには、次の手順を実行する。
-
transport を、stream.
[[Transport]]とする。 -
internalStream を、stream.
[[InternalStream]]とする。 -
promise を新しい promise とする。
-
buffer、offset、maxBytes を null とする。
-
もし stream の current BYOB request view が stream に対して 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 を implementation-defined なサイズに設定する。
-
buffer を、new な
ArrayBuffer(サイズは maxBytes)に設定する。もしArrayBufferの割り当てに失敗した場合は、a promise rejected with を返し、RangeErrorとする。
-
-
次の手順を 並行して実行する:
-
Write を行い、read されたバイトを internalStream から buffer の offset 位置へ、最大 maxBytes バイトまで書き込む。少なくとも 1 バイトが 読み込まれるか、FIN が受信されるまで待機する。read を読み込まれたバイト数、hasReceivedFIN を FIN が伴われたかどうかを示すものとする。
ユーザーエージェントは転送性能を改善するためのバッファを有する場合がある。そのようなバッファは、サーバーへバックプレッシャー情報を伝えるため、固定の上限を持つべきである。
Note: この操作は、buffer を完全に埋める前に返る場合がある。
-
前の手順が失敗した場合、残りの手順を中止する。
Note: ここでは promise を reject しない。ネットワークエラーは別の場所で処理され、その手順で error が stream に対して発生し、この pull を待っている読み取り要求は拒否されるためである。
-
Queue a network task を transport で実行し、次の手順を行う:
Note: 上で述べたバッファが、この手続きが実行されている event loop 内で利用可能な場合、以下の手順は直ちに実行されることがある。
-
もし read > 0 なら:
-
view を新しい
Uint8Array(buffer、offset、read)に設定する。 -
Enqueue を行い、view を stream に投入する。
-
-
もし hasReceivedFIN が true なら:
-
Remove を行い、stream を transport.
[[ReceiveStreams]]から取り除く。 -
Close を行い、stream を閉じる。
-
-
Resolve を行い、promise を undefined で解決する。
-
-
-
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, 読み取り専用-
ゲッター手順:this の
[[Readable]]を返す。 writable, 型 WebTransportSendStream, 読み取り専用-
ゲッター手順:this の
[[Writable]]を返す。
10.3. 手続き
WebTransportBidirectionalStream
に対して、
bidirectional
の WebTransport stream internalStream、WebTransport
オブジェクト transport、および sendOrder を用いて実行するには、次の手順を行う。
-
readable を、creating により得られる、
WebTransportReceiveStreamとし、 internalStream および transport を用いる。 -
writable を、creating により得られる、
WebTransportSendStreamとし、 internalStream、transport、および sendOrder を用いる。 -
stream を、new な
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はデータをパケット間で分割したり、他のデータとインターリーブされるのを防ぐものではありません。 フロー制御クレジット不足による失敗は送信側のみが把握できます。注: 原子的書き込みも非原子的書き込みの後ろに並ぶとブロックされる場合があります。 atomicWriteがrejectされた場合、その時点で後ろに並んでいた全てのリクエストもrejectされます。 このときrejectされた非原子的書き込みはストリームをエラー状態にします。 したがって、アプリケーションはatomicWriteのawaitを推奨します。
atomicWriteが呼ばれた際、ユーザーエージェントは以下の手順を実行します:-
pを
write(chunk)(WritableStreamDefaultWriterに対してchunkを渡す)で得る。 -
pをstreamの
[[AtomicWriteRequests]]に追加。 -
promiseがsettledになった際に反応する以下のステップの結果を返す:
-
もしstreamの
[[AtomicWriteRequests]]にpが含まれていれば、 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. 手続き
create を
WebTransportWriter
に対して、WebTransportSendStream
stream を用いて実行するため、次の手順を行う:
-
writer を、new な
WebTransportWriterとする。 -
new WritableStreamDefaultWriter(stream) のコンストラクター手順を、this に writer、コンストラクター引数に 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、読み取り専用-
getterの手順は、thisの
[[Source]]を返すこと。 streamErrorCode、型:unsigned long、読み取り専用、nullable-
getterの手順は、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の効果 |
|---|---|
| セッションがdrained状態 | await wt.draining
|
下層接続がHTTP/3の場合、[WEB-TRANSPORT-HTTP3]から以下のプロトコル挙動が適用されます。
WebTransportError
エラーの application streamErrorCode
は、httpErrorCode に変換され、またその逆も [WEB-TRANSPORT-HTTP3]
Section 4.3
に従って行われます。
| APIメソッド | QUICプロトコル動作 |
|---|---|
writable.abort(error)
| 送信中止をSTREAMに対してhttpErrorCodeと、[[CommittedOffset]]
(さらにストリームヘッダ分を加算)を使ってstreamで行う。詳細は[RELIABLE-RESET]
|
writable.close()
| 送信STREAM(FINビットがセット) |
writable.getWriter().write(chunk)()
| 送信STREAM |
writable.getWriter().close()
| 送信STREAM(FINビットがセット) |
writable.getWriter().abort(error)
| 送信中止をSTREAMに対してhttpErrorCodeと、[[CommittedOffset]]
(さらにストリームヘッダ分を加算)を使ってstreamで行う。詳細は[RELIABLE-RESET]
|
readable.cancel(error)
| 受信中止をSTREAMに対してhttpErrorCodeで行う |
readable.getReader().cancel(error)
| 受信中止をSTREAMに対してhttpErrorCodeで行う |
wt.close(closeInfo)
| セッションをcloseInfoで終了 |
| QUICプロトコル動作 | APIの効果 |
|---|---|
| received STOP_SENDING with httpErrorCode | writableをエラー状態にする 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の効果 |
|---|---|
| セッションがdrained | await wt.draining
|
基盤接続がHTTP/2を使用している場合は、 [WEB-TRANSPORT-HTTP2]に記載されているプロトコル動作が適用されます。 HTTP/3の場合とは異なり、ストリームエラーコードをHTTPエラーコードに変換する必要はありませんし、逆も同様です。
| APIメソッド | HTTP/2プロトコル動作 |
|---|---|
writable.abort(error)
| 送信中止をWT_STREAMにerrorで行う |
writable.close()
| 送信 WT_STREAM(FINビットセット) |
writable.getWriter().write()
| 送信 WT_STREAM |
writable.getWriter().close()
| 送信 WT_STREAM(FINビットセット) |
writable.getWriter().abort(error)
| 送信中止をWT_STREAMにerrorで行う |
readable.cancel(error)
| 受信中止をWT_STREAMにerrorで行う |
readable.getReader().cancel(error)
| 受信中止をWT_STREAMにerrorで行う |
wt.close(closeInfo)
| セッションをcloseInfoで終了 |
| HTTP/2プロトコル動作 | APIの効果 |
|---|---|
| received WT_STOP_SENDING with error | writableをエラー状態にする writable
(streamErrorCode付き)
|
| WT_STREAM受信 | (await
readable.getReader().read()).value
|
| WT_STREAM受信(FINビットセット) | (await
readable.getReader().read()).done
|
| received WT_RESET_STREAM with error | readableをエラー状態にする readable
(streamErrorCode付き)
|
| セッションが正常に終了し、closeInfo | (await wt.closed).closeInfo,
および
エラー状態となるオープンストリーム
|
| ネットワークエラー | (await wt.closed)
がrejectし、
エラー状態となるオープンストリーム
|
| セッションがdrained | await wt.draining
|
14. プライバシーおよびセキュリティに関する考慮事項
この節は非規範的であり、新しい挙動は規定せず、他の仕様部分に既に存在する情報をまとめたものです。
14.1. 通信の機密性
ネットワークを監視できる攻撃者に対して、通信が行われている事実を隠すことはできないため、これは公開情報として扱う必要があります。
本書で説明する全てのトランスポートプロトコルはTLS [RFC8446] またはそれと同等の意味を持つプロトコルを利用し、TLSの全てのセキュリティ特性(通信の機密性と完全性含む)を提供します。WebTransport over HTTPは、外向きHTTPリクエストと同じ証明書検証メカニズムを使用するため、リモートサーバーの認証に同じ公開鍵基盤に依存します。WebTransportでは、証明書検証エラーは致命的であり、証明書検証を回避するインタースティシャル(警告画面)はありません。
14.2. 状態の永続性
WebTransport自体は新しい一意な識別子や新たな永続的状態保存方法を作成せず、既存の永続的状態をサーバーに自動的に公開することもありません。例えば、[WEB-TRANSPORT-HTTP3] や [WEB-TRANSPORT-HTTP2] では、Cookieの送信やHTTP認証、キャッシュ無効化機構はサポートされません。ただしTLSを利用するため、TLSセッションチケットなどTLSの永続的状態を継承します。これは受動的ネットワーク監視者からは見えませんが、サーバー側が同じクライアントからの複数接続を関連付けるために利用できる場合があります。
14.3. プロトコルセキュリティ
WebTransportは[WEB-TRANSPORT-OVERVIEW]で記述された一連の要件を課します。主なものは以下の通りです:
-
リモートサーバーが 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 インターフェイスに基づいており、本仕様に合わせて適合・拡張されています。