1. 序論
◎非規範的この仕様は、 `WEB-TRANSPORT-HTTP3$r, `WEB-TRANSPORT-HTTP2$r を利用して~dataを[ ~UAから送信する/ ~serverから受信する ]ための~APIを定義する。 それは,~WebSocketの様に利用できるが、 次に挙げるもの用の~supportを伴う ⇒# 複数の~stream, 一方向~stream, 順序どおりでない送達, `依拠-可能$な( `reliable^en )~transport【~TCP( ~HTTP2 )】, `不依拠-可能$な( `unreliable^en )~transport【~UDP( ~HTTP3 )】 ◎ This specification uses [WEB-TRANSPORT-HTTP3] and [WEB-TRANSPORT-HTTP2] to send data to and receive data from servers. It can be used like WebSockets but with support for multiple streams, unidirectional streams, out-of-order delivery, and reliable as well as unreliable transport.
注記: この仕様に呈示される~APIは、 ~IETF~WEBTRANS~WGの中で進捗-中な作業に基づく,準備的な提案を表現する。 その[ `WEB-TRANSPORT-HTTP3$r, `WEB-TRANSPORT-HTTP2$r ]仕様は,進捗-中な作業なので、 今後[ ~protocol, ~API ]どちらも有意に変更される見込みが高い。 ◎ Note: The API presented in this specification represents a preliminary proposal based on work-in-progress within the IETF WEBTRANS WG. Since the [WEB-TRANSPORT-HTTP3] and [WEB-TRANSPORT-HTTP2] specifications are a work-in-progress, both the protocol and API are likely to change significantly going forward.
【この訳に特有な表記規約】
◎表記記号3. ~protocol概念
~WebTransportには、 主な~protocol概念として,~sessionと~streamが在る。 各`~WebTransport~session$は、 複数個の`~WebTransport~stream$を包含し得る。 ◎ There are two main protocol concepts for WebTransport: sessions and streams. Each WebTransport session can contain multiple WebTransport streams.
これらは、 `~protocol名$と混同するべきでない — それは、 応用~levelの~API構成子である。 ◎ These should not be confused with protocol names which is an application-level API construct.
3.1. ~WebTransport~session
`~WebTransport~session@ は、 その `下層~接続@ と称される[ ~HTTP3/~HTTP2 ]`接続$越しの~WebTransportが成す~sessionである。 ~pool法が可能化されたときは、 1 個の`接続$に複数個の`~WebTransport~session$が在り得る。 ◎ A WebTransport session is a session of WebTransport over an HTTP/3 or HTTP/2 underlying connection. There may be multiple WebTransport sessions on one connection, when pooling is enabled.
各`~WebTransport~session$は、 次に挙げる能力を有する — それらは `WEB-TRANSPORT-OVERVIEW$r にて定義される: ◎ A WebTransport session has the following capabilities defined in [WEB-TRANSPORT-OVERVIEW]:
能力 | `WEB-TRANSPORT-OVERVIEW$r における定義 【括弧内はこの訳による補完】 |
---|---|
`~datagramを送信する@ | `~datagramを送信する@~WT-OVERVIEW#send-a-datagram$ |
`~datagramを受信する@ | `~datagramを受信する@~WT-OVERVIEW#receive-a-datagram$ |
`流出~一方向~streamを作成する@ | `一方向~streamを作成する@~WT-OVERVIEW#create-a-unidirectional-stream$ (~clientが起動した`流出~一方向$な~streamを返す。) |
`双方向~streamを作成する@ | `双方向~streamを作成する@~WT-OVERVIEW#create-a-bidirectional-stream$ (~clientが起動した`双方向$な~streamを返す。) |
`流入~一方向~streamを受信する@ | `一方向~streamを受信する@~WT-OVERVIEW#receive-a-unidirectional-stream$ (~serverから起動された`流入~一方向$な~streamを返す。) |
`双方向~streamを受信する@ | `双方向~streamを受信する@~WT-OVERVIEW#receive-a-bidirectional-stream$ (~serverから起動された`双方向$な~streamを返す。) |
`~WebTransport~sessionを確立する@ ときは、 所与の ( `生成元$ %生成元, `~list$ %~protocol群 【!~array】 ) に対し,[ `~WebTransport~session$ / `失敗^i ]を返す — `WEB-TRANSPORT-OVERVIEW$r `新たな~sessionの作成-法@~WT-OVERVIEW#establish-a-session$【!4.1】 および次に従う下で: ◎ To establish a WebTransport session with an origin origin and a protocols array, follow [WEB-TRANSPORT-OVERVIEW] Section 4.1,\
- 当の要請の `Origin$h ~headerには、 次の結果を利用する ⇒ `同型に符号化する$( `生成元を直列化する$( %生成元 ) ) ◎ with using origin, serialized and isomorphic encoded, as the `Origin` header of the request.\
-
~sessionを確立するときは、 ~clientは,`資格証$を供さないモノトスル。 ◎ When establishing a session, the client MUST NOT provide any credentials.\
結果の下層~transport~streamは、 当の~sessionの `~CONNECT~stream@ と称される。 ◎ The resulting underlying transport stream is referred to as the session’s CONNECT stream.\
-
加えて, %~protocol群 は空でない場合、 `WEB-TRANSPORT-HTTP3$r `§ 下位protocolの折衝$ に従って, 当の `CONNECT$M 要請に次の結果を包含する `WT-Available-Protocols$h ~headerを追加する:
- %結果 ~LET 新たな`~list$
- %~protocol群 を成す ~EACH( %~protocol名 ) に対し ⇒ %結果 に次の結果を`付加する$ ⇒ `同型に符号化する$( %~protocol名 )
- ~RET %結果
注記: これは、 代わりに `WEB-TRANSPORT-OVERVIEW$r を参照するべきである — その`課題 #15@https://github.com/ietf-wg-webtrans/draft-ietf-webtrans-overview/issues/15$ が解決されたなら。 ◎ This should reference [WEB-TRANSPORT-OVERVIEW] instead pending issue 15.
`~WebTransport~session$は、 次(1)または次(2) のとき,次(3) に述べられるとおり `~draining@ 【 `Draining$sl を見よ】:
- (1) 当の~sessionの`~CONNECT~stream$において, `DRAIN_WEBTRANSPORT_SESSION$ft `~capsule$を受信したとき
- (2) `GOAWAY$ft ~frameを受信したとき
- (3) `WEB-TRANSPORT-HTTP3$r `§ ~HTTP3 GOAWAY ~frameとの相互作用@~WT-HTTP3#interaction-with-http3-goaway-frame$【!4.6】
`~WebTransport~sessionを終了する@ ときは、 所与の ( `~WebTransport~session$, 省略可能な整数 %~code, 省略可能な`~byte列$ %事由 ) に対し, `WEB-TRANSPORT-HTTP3$r `§ ~sessionの終了n@~WT-HTTP3#session-termination$【!5】 に従う。 ◎ To terminate a WebTransport session session with an optional integer code and an optional byte sequence reason, follow [WEB-TRANSPORT-HTTP3] Section 5.
`~WebTransport~session$は、 次(1) のとき,次(2) を伴って,次(3) に述べられるとおり `終了され@ る 【 `§ 5.6@#web-transport-termination$ を見よ】:
- (1) 当の~sessionを起動した `CONNECT$M 要請に結付けられた~HTTP3~streamが~serverにより~closeされた
- (2) 整数 %~code, `~byte列$ %事由 — いずれも省略可能
- (3) `WEB-TRANSPORT-HTTP3$r `§ ~sessionの終了n@~WT-HTTP3#session-termination$【!5】
各`~WebTransport~session$には、 次に挙げる通達が生じ得る: ◎ A WebTransport session has the following signals:
~event | 定義 |
---|---|
`DRAIN_WEBTRANSPORT_SESSION@ft | `WEB-TRANSPORT-HTTP3$r `§ ~HTTP3 GOAWAY ~frameとの相互作用@~WT-HTTP3#interaction-with-http3-goaway-frame$【!4.6】 |
`GOAWAY@ft | `WEB-TRANSPORT-HTTP3$r `§ ~HTTP3 GOAWAY ~frameとの相互作用@~WT-HTTP3#interaction-with-http3-goaway-frame$【!4.6】 |
3.2. ~WebTransport~stream
`~WebTransport~stream@ は、 `WEB-TRANSPORT-OVERVIEW$r `§ ~stream@~WT-OVERVIEW#features-streams$ にて述べられるとおり,[ `~WebTransport~session$上の `依拠-可能$な順序どおりな~byteたちが成す~stream ]用の概念である。 ◎ A WebTransport stream is a concept for a reliable in-order stream of bytes on a WebTransport session, as described in [WEB-TRANSPORT-OVERVIEW] Section 4.3.
所与の`~WebTransport~stream$は、 次に挙げるいずれかになる:
- `流入~一方向@ ( `incoming unidirectional^en )
- `流出~一方向@ ( `outgoing unidirectional^en )
- `双方向@ ( `bidirectional^en )
各`~WebTransport~stream$ %~stream は、 次に挙げる能力を有する: ◎ A WebTransport stream has the following capabilities:
能力 | `WEB-TRANSPORT-OVERVIEW$r における定義 | `流入~一方向$ | `流出~一方向$ | `双方向$ |
---|---|---|---|---|
%~stream に~byte列を `送信する@WT (~FINを伴い得る) | `~byte列を送信する@~WT-OVERVIEW#send-bytes$ | 不可 | 可 | 可 |
%~stream から~byte列を `受信する@WT (~FINを伴い得る) | `~byte列を受信する@~WT-OVERVIEW#receive-bytes$ | 可 | 不可 | 可 |
%~stream 上の `送信を停止させる@WT ( `STOP_SENDING$ft ) | `受信-側を中止する@~WT-OVERVIEW#abort-receive-side$ | 可 | 不可 | 可 |
%~stream を `設定し直す@WT ( `RESET_STREAM$ft ) | `送信-側を中止する@~WT-OVERVIEW#abort-send-side$ | 不可 | 可 | 可 |
各`~WebTransport~session$には、 次に挙げる通達が生じ得る: ◎ A WebTransport stream has the following signals:
~event | `WEB-TRANSPORT-OVERVIEW$r における定義 | `流入~一方向$ | `流出~一方向$ | `双方向$ |
---|---|---|---|---|
`STOP_SENDING@ft | `受信-側は中止された@~WT-OVERVIEW#receive-side-aborted$【!受信-側を中止する】 | 生じない | 生じ得る | 生じ得る |
`RESET_STREAM@ft | `送信-側は中止された@~WT-OVERVIEW#send-side-aborted$【!送信-側を中止する】 | 生じ得る | 生じない | 生じ得る |
`~flow制御@ | `~flow制御される@~WT-OVERVIEW#is-flow-controlled$ | 生じない | 生じ得る | 生じ得る |
4. `WebTransportDatagramDuplexStream^I ~interface
`WebTransportDatagramDuplexStream$I は、 汎用な二重化~streamを成す。 ◎ A WebTransportDatagramDuplexStream is a generic duplex stream.
[`Exposed$=(Window,Worker), `SecureContext$] interface `WebTransportDatagramDuplexStream@I { readonly attribute `ReadableStream$I `readable$mD; readonly attribute `WritableStream$I `writable$mD; readonly attribute `unsigned long$ `maxDatagramSize$mD; attribute `unrestricted double$? `incomingMaxAge$mD; attribute `unrestricted double$? `outgoingMaxAge$mD; attribute `unrestricted double$ `incomingHighWaterMark$mD; attribute `unrestricted double$ `outgoingHighWaterMark$mD; };
4.1. 内部~slot
各 `WebTransportDatagramDuplexStream$I は、 次に挙げる内部~slotを有する — 各項に与える記述は規範的ではない: ◎ A WebTransportDatagramDuplexStream object has the following internal slots. ◎ Internal Slot|Description (non-normative)
- `Readable@sl
- ある `ReadableStream$I ◎ A ReadableStream\
- 流入~datagram用。 ◎ for incoming datagrams.
- `Writable@sl
- ある `WritableStream$I ◎ A WritableStream\
- 流出~datagram用。 ◎ for outgoing datagrams.
- `IncomingDatagramsQueue@sl
- ある`~queue$ ◎ A queue\
- ( 流入~datagram, 時刻印 ) が成す~pairたちからなる。 ◎ of pairs of an incoming datagram and a timestamp.
- `IncomingDatagramsPullPromise@sl
- ある~promise ◎ A promise\
- `~datagram群を~pullする$により設定され, 流入~datagramを待機する。 ◎ set by pullDatagrams, to wait for an incoming datagram.
- `IncomingDatagramsHighWaterMark@sl
- ある `unrestricted double$c ◎ An unrestricted double\
- 流入~datagramたちの`限界水位$を表現する。 ◎ representing the high water mark of the incoming datagrams.
- `IncomingDatagramsExpirationDuration@sl
- ~NULL / ある `unrestricted double$c ◎ ↓
- ~NULL でない場合、 流入~datagramたち用の失効n所要時間を(~milli秒数で)表現する。 ◎ An unrestricted double representing the expiration duration for incoming datagrams (in milliseconds), or null.
- `OutgoingDatagramsQueue@sl
- ある`~queue$ ◎ A queue\
- ( 流出~datagram, 時刻印, ~promise ) が成す~tupleたちからなる。 ◎ of tuples of an outgoing datagram, a timestamp and a promise\
- この~tupleを成す~promiseは、 ~datagramが[ 送信される/破棄される ]とき解決される。 ◎ which is resolved when the datagram is sent or discarded.
- `OutgoingDatagramsHighWaterMark@sl
- ある `unrestricted double$c ◎ An unrestricted double\
- 流出~datagramの`限界水位$を表現する。 ◎ representing the high water mark of the outgoing datagrams.
- `OutgoingDatagramsExpirationDuration@sl
- ~NULL / ある `unrestricted double$c ◎ ↓
- ~NULL でない場合、 流出~datagram用の失効n所要時間を(~milli秒数で)表現する。 ◎ An unrestricted double value representing the expiration duration for outgoing datagrams (in milliseconds), or null.
- `OutgoingMaxDatagramSize@sl
- ある整数 ◎ An integer\
- 流出~datagram用の最大~sizeを表現する。 ◎ representing the maximum size for an outgoing datagram.
~UAは、 所与の `WebTransport$I ~obj %~transport に対し[ %~transport . `State$sl ~IN { `connecting^l, `connected^l } ]が満たされる間は, %~transport . `OutgoingMaxDatagramSize$sl を更新してもヨイ。 ◎ The user agent MAY update [[OutgoingMaxDatagramSize]] for any WebTransport object whose [[State]] is either "connecting" or "connected".
`WebTransportDatagramDuplexStream$I を `作成する@DPS ときは、 所与の ( %可読~stream, %可書~stream ) に対し,次の手続きを遂行する: ◎ To create a WebTransportDatagramDuplexStream given a readable, and a writable, perform the following steps.
-
%~stream ~LET `新たな$ `WebTransportDatagramDuplexStream$I — その ⇒# `Readable$sl ~SET %可読~stream, `Writable$sl ~SET %可書~stream, `IncomingDatagramsQueue$sl ~SET 新たな`~queue$, `IncomingDatagramsPullPromise$sl ~SET ~NULL, `IncomingDatagramsHighWaterMark$sl ~SET `実装定義$な値, `IncomingDatagramsExpirationDuration$sl ~SET ~NULL, `OutgoingDatagramsQueue$sl ~SET 新たな`~queue$, `OutgoingDatagramsHighWaterMark$sl ~SET `実装定義$な値†, `OutgoingDatagramsExpirationDuration$sl ~SET ~NULL, `OutgoingMaxDatagramSize$sl ~SET `実装定義$な整数
注記†: この実装定義な値は、[ まずまずの~throughputを確保する ]かつ[ 伝送される~dataの適時性を危うくしない ]よう調律されるべきである。
◎ Let stream be a new WebTransportDatagramDuplexStream, with: • [[Readable]] •• readable • [[Writable]] •• writable • [[IncomingDatagramsQueue]] •• an empty queue • [[IncomingDatagramsPullPromise]] •• null • [[IncomingDatagramsHighWaterMark]] •• an implementation-defined value • [[IncomingDatagramsExpirationDuration]] •• null • [[OutgoingDatagramsQueue]] •• an empty queue • [[OutgoingDatagramsHighWaterMark]] •• an implementation-defined value •• This implementation-defined value should be tuned to ensure decent throughput, without jeopardizing the timeliness of transmitted data. • [[OutgoingDatagramsExpirationDuration]] •• null • [[OutgoingMaxDatagramSize]] •• an implementation-defined integer. - ~RET %~stream ◎ Return stream.
4.2. 属性
- `readable@mD ◎ readable, of type ReadableStream, readonly
- 取得子~手続きは ⇒ ~RET コレ . `Readable$sl ◎ The getter steps are: • Return this.[[Readable]].
- `writable@mD ◎ writable, of type WritableStream, readonly
- 取得子~手続きは ⇒ ~RET コレ . `Writable$sl ◎ The getter steps are: • Return this.[[Writable]].
- `incomingMaxAge@mD ◎ incomingMaxAge, of type unrestricted double, nullable
- 取得子~手続きは ⇒ ~RET コレ . `IncomingDatagramsExpirationDuration$sl ◎ The getter steps are: • Return this.[[IncomingDatagramsExpirationDuration]].
-
設定子~手続きは、 `所与の値$ %値 に対し: ◎ The setter steps, given value, are:
- ~IF[ %値 ~LT 0 ]~OR[ %値 ~EQ NaN ] ⇒ ~THROW `RangeError$E ◎ If value is negative or NaN, throw a RangeError.
- ~IF[ %値 ~EQ 0 ] ⇒ %値 ~SET ~NULL ◎ If value is 0, set value to null.
- コレ . `IncomingDatagramsExpirationDuration$sl ~SET %値 ◎ Set this.[[IncomingDatagramsExpirationDuration]] to value.
- `maxDatagramSize@mD ◎ maxDatagramSize, of type unsigned long, readonly
- `writable$mD に渡してもよい~dataの最大~size ◎ The maximum size data that may be passed to writable.\
- 取得子~手続きは ⇒ ~RET コレ . `OutgoingMaxDatagramSize$sl ◎ The getter steps are to return this.[[OutgoingMaxDatagramSize]].
- `outgoingMaxAge@mD ◎ outgoingMaxAge, of type unrestricted double, nullable
- 取得子~手続きは ⇒ ~RET コレの `OutgoingDatagramsExpirationDuration$sl ◎ The getter steps are: • Return this's [[OutgoingDatagramsExpirationDuration]].
-
設定子~手続きは、 `所与の値$ %値 に対し: ◎ The setter steps, given value, are:
- ~IF[ %値 ~LT 0 ]~OR[ %値 ~EQ NaN ] ⇒ ~THROW `RangeError$E ◎ If value is negative or NaN, throw a RangeError.
- ~IF[ %値 ~EQ 0 ] ⇒ %値 ~SET ~NULL ◎ If value is 0, set value to null.
- コレ . `OutgoingDatagramsExpirationDuration$sl ~SET %値 ◎ Set this.[[OutgoingDatagramsExpirationDuration]] to value.
- `incomingHighWaterMark@mD ◎ incomingHighWaterMark, of type unrestricted double
- 取得子~手続きは ⇒ ~RET コレ . `IncomingDatagramsHighWaterMark$sl ◎ The getter steps are: • Return this.[[IncomingDatagramsHighWaterMark]].
-
設定子~手続きは、 `所与の値$ %値 に対し: ◎ The setter steps, given value, are:
- ~IF[ %値 ~LT 0 ]~OR[ %値 ~EQ NaN ] ⇒ ~THROW `RangeError$E ◎ If value is negative or NaN, throw a RangeError.
- ~IF[ %値 ~LT 1 ] ⇒ %値 ~SET 1 ◎ If value is < 1, set value to 1.
- コレ . `IncomingDatagramsHighWaterMark$sl ~SET %値 ◎ Set this.[[IncomingDatagramsHighWaterMark]] to value.
- `outgoingHighWaterMark@mD ◎ outgoingHighWaterMark, of type unrestricted double
- 取得子~手続きは ⇒ ~RET コレ . `OutgoingDatagramsHighWaterMark$sl ◎ The getter steps are: • Return this.[[OutgoingDatagramsHighWaterMark]].
-
設定子~手続きは、 `所与の値$ %値 に対し: ◎ The setter steps, given value, are:
- ~IF[ %値 ~LT 0 ]~OR[ %値 ~EQ NaN ] ⇒ ~THROW `RangeError$E ◎ If value is negative or NaN, throw a RangeError.
- ~IF[ %値 ~LT 1 ] ⇒ %値 ~SET 1 ◎ If value is < 1, set value to 1.
- コレ . `OutgoingDatagramsHighWaterMark$sl ~SET %値 ◎ Set this.[[OutgoingDatagramsHighWaterMark]] to value.
4.3. 手続-
`~datagram群を~pullする@ ときは、 所与の ( `WebTransport$I ~obj %~transport ) に対し,次の手続きを走らす: ◎ To pullDatagrams, given a WebTransport object transport, run these steps:
- %~datagram群 ~LET %~transport . `Datagrams$sl ◎ Let datagrams be transport.[[Datagrams]].
- ~Assert: %~datagram群 . `IncomingDatagramsPullPromise$sl ~EQ ~NULL ◎ Assert: datagrams.[[IncomingDatagramsPullPromise]] is null.
- %~queue ~LET %~datagram群 . `IncomingDatagramsQueue$sl ◎ Let queue be datagrams.[[IncomingDatagramsQueue]].
-
~IF[ %~queue は空である ]: ◎ If queue is empty, then:
- %~datagram群 . `IncomingDatagramsPullPromise$sl ~SET `新たな~promise$ ◎ Set datagrams.[[IncomingDatagramsPullPromise]] to a new promise.
- ~RET %~datagram群 . `IncomingDatagramsPullPromise$sl ◎ Return datagrams.[[IncomingDatagramsPullPromise]].
- ( %~datagram, %時刻印 ) ~LET %~queue から`~dequeueする$ ◎ Let datagram and timestamp be the result of dequeuing queue.
- %~view ~LET %~datagram群 . `Readable$sl 用の`現在の~BYOB要請~view$RS ◎ ↓
-
~IF[ %~view ~NEQ ~NULL ]: ◎ If datagrams.[[Readable]]'s current BYOB request view is not null, then:
- ~IF[ %~view の`~byte長さ$BS ~LT %~datagram の~size ] ⇒ ~RET `却下される~promise$( `RangeError$E ) ◎ Let view be datagrams.[[Readable]]'s current BYOB request view. ◎ If view’s byte length is less than the size of datagram, return a promise rejected with a RangeError.
- %要素~size ~LET 0 ◎ ↓
- ~IF[ %~view は `TypedArrayName^sl 内部~slotを有する (すなわち, %~view は `DataView$I でない) ] ⇒ `有型~配列~構築子~表t@~ECMA262#table-49$にて指定される[ %~view . `TypedArrayName^sl ]用の要素~size ◎ Let elementSize be the element size specified in the typed array constructors table for view.[[TypedArrayName]]. If view does not have a [[TypedArrayName]] internal slot (i.e. it is a DataView), let elementSize be 0.
- ~IF[ %要素~size ~NEQ 1 ] ⇒ ~RET `却下される~promise$( `TypeError$E ) ◎ If elementSize is not 1, return a promise rejected with a TypeError.
- %~datagram群 . `Readable$sl の中へ`~byte列から~pullする$RS( %~datagram ) ◎ Pull from bytes datagram into datagrams.[[Readable]].
- ~RET `解決される~promise$( `undefined^jv ) ◎ Return a promise resolved with undefined.
`~datagram群を受信する@ ときは、 所与の ( `WebTransport$I ~obj %~transport ) に対し,次の手続きを走らす: ◎ To receiveDatagrams, given a WebTransport object transport, run these steps:
- %時刻印 ~LET 今を表現している時刻印 ◎ Let timestamp be a timestamp representing now.
- %~queue ~LET %~datagram群 . `IncomingDatagramsQueue$sl ◎ Let queue be datagrams.[[IncomingDatagramsQueue]].
- %所要時間 ~LET %~datagram群 . `IncomingDatagramsExpirationDuration$sl ◎ Let duration be datagrams.[[IncomingDatagramsExpirationDuration]].
- ~IF[ %所要時間 ~EQ ~NULL ] ⇒ %所要時間 ~SET `実装定義$な値 ◎ If duration is null, then set duration to an implementation-defined value.
- %~session ~LET %~transport . `Session$sl ◎ Let session be transport.[[Session]].
-
~WHILE[ %~session 上に可用な流入~datagramは在る 【!`~datagramを受信する$】 ]: ◎ While there are available incoming datagrams on session:
- %~datagram ~LET `~datagramを受信する$( %~session ) ◎ Let datagram be the result of receiving a datagram with session.
- %~chunk ~LET ( %~datagram, 今を表現している時刻印 ) が成す~pair ◎ Let timestamp be a timestamp representing now. ◎ Let chunk be a pair of datagram and timestamp.
- %~queue に %~chunk を`~enqueueする$ ◎ Enqueue chunk to queue.
- %除去する個数 ~LET %~queue の`~size$【!長さ】 ~MINUS %~datagram群 . `IncomingDatagramsHighWaterMark$sl ◎ Let toBeRemoved be the length of queue minus datagrams.[[IncomingDatagramsHighWaterMark]].
- ~WHILE[ %除去する個数 ~GTE 1 【!rounded down@https://tc39.github.io/ecma262/#eqn-floor$ 】 ] ⇒# %~queue から`~dequeueする$; %除去する個数 ~DECBY 1 ◎ If toBeRemoved is positive, repeat dequeuing queue toBeRemoved (rounded down) times.
-
~WHILE[ %~queue は空でない ]: ◎ While queue is not empty:
- ~IF[ %~queue[ 0 ][ 1 ] から[ 今を表現している時刻印 ]までを成す~milli秒数 ~LTE %所要時間 ] ⇒ ~BREAK ◎ Let bytes and timestamp be queue’s first element. ◎ If more than duration milliseconds have passed since timestamp, then dequeue queue. ◎ Otherwise, break this loop.
- %~queue から`~dequeueする$ ◎ ↑
-
~IF[ %~queue は空でない ]~AND[ %~datagram群 . `IncomingDatagramsPullPromise$sl ~NEQ ~NULL ]: ◎ If queue is not empty and datagrams.[[IncomingDatagramsPullPromise]] is non-null, then:
- ( %~byte列, %時刻印 ) ~LET %~queue から`~dequeueする$ ◎ Let bytes and timestamp be the result of dequeuing queue.
- %~promise ~LET %~datagram群 . `IncomingDatagramsPullPromise$sl ◎ Let promise be datagrams.[[IncomingDatagramsPullPromise]].
- %~datagram群 . `IncomingDatagramsPullPromise$sl ~SET ~NULL ◎ Set datagrams.[[IncomingDatagramsPullPromise]] to null.
-
`~network~taskを~queueする$( %~transport, 次の手続き ) ◎ Queue a network task with transport to\
手続きは: ◎ run the following steps:
- %~chunk ~LET %~byte列 を表現している新たな `Uint8Array$I ~obj ◎ Let chunk be a new Uint8Array object representing bytes.
- %~datagram群 . `Readable$sl に`~chunkを~enqueueする$RS( %~chunk ) ◎ Enqueue chunk to datagrams.[[Readable]].
- `~promiseを解決する$( %~promise ) ◎ Resolve promise with undefined.
~UAは、 次に従うベキである ⇒ `WebTransport$I ~objが[ その `State$sl ~EQ `connected^l ]を満たす間は ⇒ `~datagram群を受信する$ ~algoが進捗を為せるようになったときには、 アリな限り適度に早く,それを走らす ◎ The user agent SHOULD run receiveDatagrams for any WebTransport object whose [[State]] is "connected" as soon as reasonably possible whenever the algorithm can make progress.
`~datagram群を書込む@ ~algoは、 所与の ( `WebTransport$I ~obj %~transport, %~data ) に対し: ◎ The writeDatagrams algorithm is given a transport as parameter and data as input. It is defined by running the following steps:
- %時刻印 ~LET 今を表現している時刻印 ◎ Let timestamp be a timestamp representing now.
- ~IF[ %~data は `BufferSource$I ~objでない ] ⇒ ~RET `却下される~promise$( `TypeError$E ) ◎ If data is not a BufferSource object, then return a promise rejected with a TypeError.
- %~datagram群 ~LET %~transport . `Datagrams$sl ◎ Let datagrams be transport.[[Datagrams]].
- ~IF[ %~datagram群 . `OutgoingMaxDatagramSize$sl ~LT %~data . `ByteLength^sl ] ⇒ ~RET `解決される~promise$( `undefined^jv ) ◎ If datagrams.[[OutgoingMaxDatagramSize]] is less than data’s [[ByteLength]], return a promise resolved with undefined.
- %~promise ~LET `新たな~promise$ ◎ Let promise be a new promise.
- %~byte列 ~LET %~data に`保持された~byte列の複製を取得する$ ◎ Let bytes be a copy of bytes which data represents.
- %~chunk ~LET ( %~byte列, %時刻印, %~promise ) が成す~tuple ◎ Let chunk be a tuple of bytes, timestamp and promise.
- %~datagram群 . `OutgoingDatagramsQueue$sl に %~chunk を`~enqueueする$ ◎ Enqueue chunk to datagrams.[[OutgoingDatagramsQueue]].
- ~IF[ %~datagram群 . `OutgoingDatagramsQueue$sl の`~size$【!長さ】 ~LT %~datagram群 . `OutgoingDatagramsHighWaterMark$sl ] ⇒ `~promiseを解決する$( %~promise ) ◎ If the length of datagrams.[[OutgoingDatagramsQueue]] is less than datagrams.[[OutgoingDatagramsHighWaterMark]], then resolve promise with undefined.
- ~RET %~promise ◎ Return promise.
注記: 結付けられた `WritableStream$I 【すなわち %~datagram群 . `Writable$sl 】は、[ `~datagram群を書込む$から返されたすべての~promise ]が解決されたときに限り,`~datagram群を書込む$を~callする。 よって,[ 時刻印, 失効n所要時間 ]がきちんと働くのは、 ~web開発者が `WritableStreamDefaultWriter.ready$c に気を配るときに限られる。 ◎ Note: The associated WritableStream calls writeDatagrams only when all the promises that have been returned by writeDatagrams have been resolved. Hence the timestamp and the expiration duration work well only when the web developer pays attention to WritableStreamDefaultWriter.ready.
`~datagram群を送信する@ ときは、 所与の ( `WebTransport$I ~obj %~transport ) に対し,次の手続きを走らす: ◎ To sendDatagrams, given a WebTransport object transport, run these steps:
- %~queue ~LET %~datagram群 . `OutgoingDatagramsQueue$sl ◎ Let queue be datagrams.[[OutgoingDatagramsQueue]].
- %所要時間 ~LET %~datagram群 . `OutgoingDatagramsExpirationDuration$sl ◎ Let duration be datagrams.[[OutgoingDatagramsExpirationDuration]].
- ~IF[ %所要時間 ~EQ ~NULL ] ⇒ %所要時間 ~SET `実装定義$な値 ◎ If duration is null, then set duration to an implementation-defined value.
-
~WHILE[ %~queue は空でない ]:
-
~IF[ %~queue[ 0 ][ 1 ] から[ 今を表現している時刻印 ]までを成す~milli秒数 ~LTE %所要時間 ] ⇒ ~BREAK
- %~queue から`~dequeueする$【!Remove the first element】
-
`~network~taskを~queueする$( %~transport, 次の手続き )
手続きは ⇒ `~promiseを解決する$( %~promise )
-
- ~IF[ %~transport . `State$sl ~NEQ `connected^l ] ⇒ ~RET ◎ If transport.[[State]] is not "connected", then return.
- %最大-~size ~LET %~datagram群 . `OutgoingMaxDatagramSize$sl ◎ Let maxSize be datagrams.[[OutgoingMaxDatagramSize]].
-
~WHILE[ %~queue は空でない ]: ◎ While queue is not empty:
- ( %~byte列, %時刻印, %~promise ) ~LET %~queue[ 0 ]【!’s first element】 ◎ Let bytes, timestamp and promise be queue’s first element.
-
~IF[ %~byte列 の長さ ~LTE %最大-~size ]: ◎ If bytes’s length ≤ maxSize:
- ~IF[ %~byte列 を~networkへ即時に送信することはアリでない ] ⇒ ~BREAK ◎ If it is not possible to send bytes to the network immediately, then break this loop.
- `~datagramを送信する$( %~transport . `Session$sl, %~byte列 ) ◎ Send a datagram, with transport.[[Session]] and bytes.
- %~queue から`~dequeueする$【!Remove the first element】 ◎ Remove the first element from queue.
-
`~network~taskを~queueする$( %~transport, 次の手続き ) ◎ Queue a network task with transport to\
手続きは ⇒ `~promiseを解決する$( %~promise ) ◎ resolve promise with undefined.
~UAは、 次に従うベキである ⇒ `WebTransport$I ~objが[ その `State$sl ~IN { `connecting^l, `connected^l } ]を満たす間は ⇒ `~datagram群を送信する$ ~algoが進捗を為せるようになったときには、 アリな限り適度に早く,それを走らす ◎ The user agent SHOULD run sendDatagrams for any WebTransport object whose [[State]] is "connecting" or "connected" as soon as reasonably possible whenever the algorithm can make progress.
注記: [ %~transport . `State$sl ~EQ `connecting^l ]が満たされる間でも,~datagram群を書込むことは許容される。 書込まれた~datagram群は:
- 【%~transport . `Datagrams$sl . 】 `OutgoingDatagramsQueue$sl 内に格納される
- `connected^l 状態にあるときと同じ方式で破棄され得る/できる。
- [ %~transport . `State$sl ~EQ `connected^l ]になったとき、 送信を開始することになる。
5. `WebTransport^I ~interface
`WebTransport$I は、[ `WEB-TRANSPORT-OVERVIEW$r にて定義される下層~transportの機能性 ]への~APIを供する。 ◎ WebTransport provides an API to the underlying transport functionality defined in [WEB-TRANSPORT-OVERVIEW].
[`Exposed$=(Window,Worker), `SecureContext$] interface `WebTransport@I { `constructor@#dom-webtransport-webtransport$(`USVString$ %url, optional `WebTransportOptions$I %options = {}); `Promise$<`WebTransportConnectionStats$I> `getStats$mT(); readonly attribute `Promise$<`undefined$> `ready$mT; readonly attribute `WebTransportReliabilityMode$I `reliability$mT; readonly attribute `WebTransportCongestionControl$I `congestionControl$mT; [`EnforceRange$] attribute `unsigned short$? `anticipatedConcurrentIncomingUnidirectionalStreams$mT; [`EnforceRange$] attribute `unsigned short$? `anticipatedConcurrentIncomingBidirectionalStreams$mT; readonly attribute DOMString `protocol$mT; readonly attribute `Promise$<`WebTransportCloseInfo$I> `closed$mT; readonly attribute `Promise$<`undefined$> `draining$mT; `undefined$ `close$mT(optional `WebTransportCloseInfo$I %closeInfo = {}); readonly attribute `WebTransportDatagramDuplexStream$I `datagrams$mT; `Promise$<`WebTransportBidirectionalStream$I> `createBidirectionalStream$mT( optional `WebTransportSendStreamOptions$I %options = {}); /* `WebTransportBidirectionalStream$I ~objの `ReadableStream$I ◎ a ReadableStream of WebTransportBidirectionalStream objects */ readonly attribute `ReadableStream$I `incomingBidirectionalStreams$mT; `Promise$<`WebTransportSendStream$I> `createUnidirectionalStream$mT( optional `WebTransportSendStreamOptions$I %options = {}); /* `WebTransportReceiveStream$I ~objの `ReadableStream$I ◎ a ReadableStream of WebTransportReceiveStream objects */ readonly attribute `ReadableStream$I `incomingUnidirectionalStreams$mT; `WebTransportSendGroup$I `createSendGroup$mT(); static readonly attribute `boolean$ `supportsReliableOnly$mT; }; enum `WebTransportReliabilityMode@I { `pending@l, `reliable-only@l, `supports-unreliable@l, };
5.1. 内部~slot
各 `WebTransport$I %~transport は、 次に挙げる内部~slotを有する — 各項に与える【~data型~以外の】記述は規範的ではない: ◎ A WebTransport object has the following internal slots. ◎ Internal Slot|Description (non-normative)
- `SendStreams@sl
- `有順序~集合$ ◎ An ordered set\
- %~transport に所有されている `WebTransportSendStream$I たちからなる ◎ An ordered set of WebTransportSendStreams owned by this WebTransport.
- `ReceiveStreams@sl
- `有順序~集合$ ◎ An ordered set\
- %~transport に所有されている `WebTransportReceiveStream$I たちからなる ◎ of WebTransportReceiveStreams owned by this WebTransport.
- `IncomingBidirectionalStreams@sl
- `IncomingUnidirectionalStreams@sl
- いずれも,ある `ReadableStream$I ◎ A ReadableStream\
- 順に,~serverから受信した[ 双方向~streamを表現する `WebTransportBidirectionalStream$I たち/ 一方向~streamを表現する `WebTransportReceiveStream$I たち ]からなる† ◎ consisting of WebTransportBidirectionalStream objects. ◎ IncomingUnidirectionalStreams ◎ A ReadableStream consisting of WebTransportReceiveStreams.
- 【† “からなる( `consisting of^en )” とは、 これら各~objが `ReadableStream$I に~chunkとして~enqueueされることを意味する — [ `双方向~streamを~pullする$, `一方向~streamを~pullする$ ]を見よ。 】
- 注記: 流入~stream上にすでに~dataがあるかどうかは、 ~serverの挙動に依存することになる。 【!Note: Whether the incoming streams already have data on them will depend on server behavior.】
- `State@sl
- 次に挙げるいずれか ⇒# `connecting^l, `connected^l, `draining^l, `closed^l, `failed^l ◎ An enum indicating the state of the transport. One of "connecting", "connected", "draining", "closed", and "failed".
- %~transport の状態を指示する ◎ ↑
- `Ready@sl
- ある~promise ◎ A promise\
- `~WebTransport~sessionを確立する$ことに ⇒# 成功したとき充足される/ 失敗したとき却下される ◎ fulfilled when the associated WebTransport session gets established, or rejected if the establishment process failed.
- `Reliability@sl
- ある `WebTransportReliabilityMode$I ◎ A WebTransportReliabilityMode\
- 接続が確立されるまでは `pending$l を返す。 それ以降は、 接続が[ `不依拠-可能$な(~UDP越し)~transportを~supportするならば `supports-unreliable$l / `依拠-可能$な(~fallbackによる~TCP越し)~transportしか~supportしないならば `reliable-only$l ]を返す。 ◎ indicating whether the first hop supports unreliable (UDP) transport or whether only reliable (TCP fallback) transport is available.\ ◎ Returns "pending" until a connection has been established.
- `CongestionControl@sl
- ある `WebTransportCongestionControl$I ◎ A WebTransportCongestionControl\
- 応用により[ ~throughput/短い待時間 ]用に最適化された輻輳~制御~algoが要請され,~UAにより満足されたならば、 その選好を 【 `throughput$l / `low-latency$l として】 指示する。 他の場合は `default$l になる。 ◎ indicating whether a preference for a congestion control algorithm optimized for throughput or low latency was requested by the application and satisfied by the user agent, or "default".
- `AnticipatedConcurrentIncomingUnidirectionalStreams@sl
- ~NULL / ある整数 ◎ ↓
- ~NULL でない場合、[ 同時並行に~openな,`流入~一方向$な~streamたち ]として[ ~serverが作成するものと応用が見越す個数 ]を与える。 ◎ The number of concurrently open incoming unidirectional streams the application anticipates the server creating, or null.
- `AnticipatedConcurrentIncomingBidirectionalStreams@sl
- ~NULL / ある整数 ◎ ↓
- ~NULL でない場合、[ 同時並行に~openな,`双方向$な~streamたち ]として[ ~serverが作成するものと応用が見越す個数 ]を与える。 ◎ The number of concurrently open bidirectional streams the application anticipates the server creating, or null.
- `Protocol@sl
- ある文字列 ◎ A string\
- ~serverにより選定された応用~levelの~protocolを指示する。 ◎ indicating the application-level protocol selected by the server, if any.\
- 初期~時は空~文字列とする。 ◎ Initially an empty string.
- `Closed@sl
- ある~promise ◎ A promise\
- %~transport が ⇒# 上品に~closeされたとき充足される/ 中途で~closeされたとき却下される/ 初期化に失敗したとき却下される ◎ fulfilled when the associated WebTransport object is closed gracefully, or rejected when it is closed abruptly or failed on initialization.
- `Draining@sl
- ある~promise ◎ A promise\
- %~transport が[ `DRAIN_WEBTRANSPORT_SESSION$ft `~capsule$ / `GOAWAY$ft ~frame ]を受信したとき充足される。 ◎ fulfilled when the associated WebTransport session receives a DRAIN_WEBTRANSPORT_SESSION capsule or a GOAWAY frame.
- `Datagrams@sl
- ある `WebTransportDatagramDuplexStream$I ◎ A WebTransportDatagramDuplexStream.
- この~session越しに~datagram群を[ 送信する/受信する ]ための単独の二重化~stream。 ◎ ↓↓
- `Session@sl
- ~NULL / %~transport 用の`~WebTransport~session$ ◎ A WebTransport session for this WebTransport object, or null.
5.2. 構築子
`new WebTransport(url, options)@m 構築子手続きは: ◎ When the WebTransport() constructor is invoked, the user agent MUST run the following steps:
- %基底~URL ~LET コレに`関連な設定群~obj$の`~API用~基底~URL$enV ◎ Let baseURL be this's relevant settings object's API base URL.
- %構文解析した~URL ~LET `~URL構文解析する$( %url, %基底~URL ) ◎ Let parsedURL be the URL record resulting from parsing url with baseURL.
- ~IF[ %構文解析した~URL ~EQ `失敗^i ] ⇒ ~THROW `SyntaxError$E ◎ If parsedURL is a failure, throw a SyntaxError exception.
- ~IF[ %構文解析した~URL の`~scheme$url ~NEQ `https^l ] ⇒ ~THROW `SyntaxError$E ◎ If parsedURL scheme is not https, throw a SyntaxError exception.
- ~IF[ %構文解析した~URL の`素片$url ~NEQ ~NULL ] ⇒ ~THROW `SyntaxError$E ◎ If parsedURL fragment is not null, throw a SyntaxError exception.
- %専用か ~LET ~IS[ %options[ "`allowPooling$mb" ] ~EQ ~F ] ◎ Let allowPooling be options's allowPooling. ◎ Let dedicated be the negation of allowPooling.
- %~server証明書~hash群 ~LET %options[ "`serverCertificateHashes$mb" ] ◎ Let serverCertificateHashes be options's serverCertificateHashes if it exists, and null otherwise.
- ~IF[ %~server証明書~hash群 ~EQ ε ] ⇒ %~server証明書~hash群 ~SET ~NULL ◎ ↑
- ~IF[ %専用か ~EQ ~F ]~AND[ %~server証明書~hash群 ~NEQ ~NULL ] ⇒ ~THROW `NotSupportedError$E ◎ If dedicated is false and serverCertificateHashes is non-null, then throw a NotSupportedError exception.
- %不依拠-可能が要求されるか ~LET %options[ "`requireUnreliable$mb" ] ◎ Let requireUnreliable be options's requireUnreliable.
- %輻輳~制御 ~LET %options[ "`congestionControl$mb" ] ◎ Let congestionControl be options's congestionControl.
- ~IF[ %輻輳~制御 ~NEQ `default^l ]~AND[[ %輻輳~制御 用に最適化するための輻輳~制御~algo ]として[ `RFC9002$r `§ 7@~RFCx/rfc9002#section-7$ により許容されるもの ]のうち[ ~UAが~supportするもの ]は無い ] ⇒ %輻輳~制御 ~SET `default^l ◎ If congestionControl is not "default", and the user agent does not support any congestion control algorithms that optimize for congestionControl, as allowed by [RFC9002] Section 7, then set congestionControl to "default".
- %~protocol群 ~LET %options[ "`protocols$mb" ] ◎ Let protocols be options's protocols
-
~IF[ %~protocol群 を成す ある~itemの値は ~AND↓ を満たさない ]…
- %~protocol群 を成す他の~itemの値に一致しない
- ~WebTransport~protocolにより定義されるとおり, `WT-Protocol$h の~field値を成すための要件を満たす
- 次の結果の長さ ~IN { 1 〜 512 } ⇒ `同型に符号化する$( 当の~itemの値 )
…ならば ⇒ ~THROW `SyntaxError$E
`WEB-TRANSPORT-HTTP3$r `§ 下位protocolの折衝$ を見よ。
◎ If any of the values in protocols occur more than once, fail to match the requirements for elements that comprise the value of WT-Protocol fields as defined by the WebTransport protocol, or have an isomorphic encoded length of 0 or exceeding 512, throw a SyntaxError exception. [WEB-TRANSPORT-HTTP3] Section 3.4. - %見越される同時並行な流入~一方向~stream数 ~LET %options[ "`anticipatedConcurrentIncomingUnidirectionalStreams$mb" ] ◎ Let anticipatedConcurrentIncomingUnidirectionalStreams be options's anticipatedConcurrentIncomingUnidirectionalStreams.
- %見越される同時並行な流入~双方向~stream数 ~LET %options[ "`anticipatedConcurrentIncomingBidirectionalStreams$mb" ] ◎ Let anticipatedConcurrentIncomingBidirectionalStreams be options's anticipatedConcurrentIncomingBidirectionalStreams.
- %流入~datagram群 ~LET `新たな$ `ReadableStream$I ◎ Let incomingDatagrams be a new ReadableStream.
- %流出~datagram群 ~LET `新たな$ `WritableStream$I ◎ Let outgoingDatagrams be a new WritableStream.
- %~datagram群 ~LET `WebTransportDatagramDuplexStream$I を`作成する$DPS( %流入~datagram群, %流出~datagram群 ) ◎ Let datagrams be the result of creating a WebTransportDatagramDuplexStream, its readable set to incomingDatagrams and its writable set to outgoingDatagrams.
- %~transport ~LET `新たな$ `WebTransport$I ~obj — その ⇒# `SendStreams$sl ~SET 新たな`有順序~集合$, `ReceiveStreams$sl ~SET 新たな`有順序~集合$, `IncomingBidirectionalStreams$sl ~SET `新たな$ `ReadableStream$I, `IncomingUnidirectionalStreams$sl ~SET `新たな$ `ReadableStream$I, `State$sl ~SET `connecting^l, `Ready$sl ~SET `新たな~promise$, `Reliability$sl ~SET `pending^l, `CongestionControl$sl ~SET %輻輳~制御, `AnticipatedConcurrentIncomingUnidirectionalStreams$sl ~SET %見越される同時並行な流入~一方向~stream数, `AnticipatedConcurrentIncomingBidirectionalStreams$sl ~SET %見越される同時並行な流入~双方向~stream数, `Protocol$sl ~SET 空~文字列, `Closed$sl ~SET `新たな~promise$, `Draining$sl ~SET `新たな~promise$, `Datagrams$sl ~SET %~datagram群, `Session$sl ~SET ~NULL ◎ Let transport be a newly constructed WebTransport object, with: • [[SendStreams]] •• an empty ordered set • [[ReceiveStreams]] •• an empty ordered set • [[IncomingBidirectionalStreams]] •• a new ReadableStream • [[IncomingUnidirectionalStreams]] •• a new ReadableStream • [[State]] •• "connecting" • [[Ready]] •• a new promise • [[Reliability]] •• "pending" • [[CongestionControl]] •• congestionControl • [[AnticipatedConcurrentIncomingUnidirectionalStreams]] •• anticipatedConcurrentIncomingUnidirectionalStreams • [[AnticipatedConcurrentIncomingBidirectionalStreams]] •• anticipatedConcurrentIncomingBidirectionalStreams • [[Protocol]] •• an empty string • [[Closed]] •• a new promise • [[Draining]] •• a new promise • [[Datagrams]] •• datagrams • [[Session]] •• null
-
%流入~datagram群 を`~byte読取り~support付きで設定しておく$RS — 次を与える下で:
- `~pull~algo^i ~SET 次を走らす動作 ⇒ `~datagram群を~pullする$( %~transport )
- `限界水位^i ~SET 0
-
%流出~datagram群 を`設定しておく$WS — 次を与える下で:
- `書込n~algo^i ~SET 【所与の ( %~data ) に対し,】 次を走らす動作 ⇒ `~datagram群を書込む$( %~transport【, %~data】 )
注記: 各~datagramには 64kB ~bufferを利用することが推奨される — [ ~WebTransportにおける~datagramの実質的な最大~frame~size ]には,上界として[ ~QUICにおける~datagramの最大~frame~size ]があり、 それには 64kB が推奨されるので ( `QUIC-DATAGRAM$r `§ 3@~RFCx/rfc9221#section-3$ を見よ)。 これは、[ ある~datagramが~bufferより大きいことに因り,当の~streamが~errorする ]ことは生じないことを確保する。
◎ Let pullDatagramsAlgorithm be an action that runs pullDatagrams with transport. ◎ Let writeDatagramsAlgorithm be an action that runs writeDatagrams with transport. ◎ Note: Using 64kB buffers with datagrams is recommended because the effective maximum WebTransport datagram frame size has an upper bound of the QUIC maximum datagram frame size which is recommended to be 64kB (See [QUIC-DATAGRAM] Section 3). This will ensure the stream is not errored due to a datagram being larger than the buffer. ◎ Set up with byte reading support incomingDatagrams with pullAlgorithm set to pullDatagramsAlgorithm, and highWaterMark set to 0. ◎ Set up outgoingDatagrams with writeAlgorithm set to writeDatagramsAlgorithm. -
%~transport . `IncomingBidirectionalStreams$sl を`設定しておく$RS — 次を与える下で:
- `~pull~algo^i ~SET 次を走らす動作 ⇒ `双方向~streamを~pullする$( %~transport )
- `限界水位^i ~SET 0
-
%~transport . `IncomingUnidirectionalStreams$sl を`設定しておく$RS — 次を与える下で:
- `~pull~algo^i ~SET 次を走らす動作 ⇒ `一方向~streamを~pullする$( %~transport )
- `限界水位^i ~SET 0
- `~HTTP越しの~WebTransportを初期化する$( ↓ ) ⇒# %~transport, %構文解析した~URL, %専用か, %不依拠-可能が要求されるか, %輻輳~制御, %~protocol群, %~server証明書~hash群 ◎ Initialize WebTransport over HTTP with transport, parsedURL, dedicated, requireUnreliable, congestionControl, protocols, and serverCertificateHashes.
- ~RET %~transport ◎ Return transport.
`~HTTP越しの~WebTransportを初期化する@ ときは、 所与の ⇒# `WebTransport$I ~obj %~transport, `~URL~record$ %~URL, 真偽値 %専用か, 真偽値 %不依拠-可能が要求されるか, `WebTransportCongestionControl$I %輻輳~制御, 文字列たちが成す連列 %~protocol群 【!array】, `WebTransportHash$I たちが成す連列 %~server証明書~hash群 ◎終 に対し, 次の手続きを走らす: ◎ To initialize WebTransport over HTTP, given a WebTransport object transport, a URL record url, a boolean dedicated, a boolean requireUnreliable, a WebTransportCongestionControl congestionControl, a protocols array, and a sequence<WebTransportHash> serverCertificateHashes, run these steps.
- %~client ~LET %~transport に`関連な設定群~obj$ ◎ Let client be transport’s relevant settings object.
- %生成元 ~LET %~client の`生成元$enV ◎ Let origin be client’s origin.
- %要請 ~LET 新たな`要請$ — その ⇒# `~URL$rq ~SET %~URL, `~client$rq ~SET %~client, `施策~容器$rq ~SET %~client の`施策~容器$enV, `行先$rq ~SET 空~文字列, `生成元$rq ~SET %生成元, `~redirect~mode$rq ~SET `error^l ◎ Let request be a new request whose URL is url, client is client, policy container is client’s policy container, destination is an empty string, origin is origin and redirect mode is "error".
- `要請に対する~CSP違反を報告する$( %要請 ) ◎ Run report Content Security Policy violations for request.
-
~IF[ `要請は~CSPにより阻止されるべきか?$( %要請 ) ~EQ `阻止される^i ]~OR[ `~fetchingは,不良~portに因り阻止されるべきか?$( %要請 ) ~EQ `阻止される^i ]: ◎ If should request be blocked by Content Security Policy? with request returns "Blocked", or if request should be blocked due to a bad port returns blocked, then abort the remaining steps and\
-
`~network~taskを~queueする$( %~transport, 次の手続き ) ◎ queue a network task with transport to\
手続きは: ◎ run these steps:
- ~IF[ %~transport . `State$sl ~IN { `closed^l, `failed^l } ] ⇒ ~RET ◎ If transport.[[State]] is "closed" or "failed", then abort these steps.
- %~error ~LET `~WebTransport用の例外を作成する$( `session^l ) ◎ Let error be a newly created WebTransportError whose source is "session".
- `~WebTransportを片付ける$( %~transport, %~error ) ◎ Cleanup transport with error.
- ~RET ◎ ↑↑
-
- %~network区分~key ~LET `~network区分~keyを決定する$( %~transport に`関連な設定群~obj$ ) ◎ Let networkPartitionKey be the result of determining the network partition key with transport’s relevant settings object.
-
この段は、 `並列的$に走らすことに加え: ◎ Run the following steps in parallel,\
- 次が満たされた`ときは中止する$ ⇒ %~transport . `State$sl ~IN { `closed^l, `failed^l } ◎ but abort when transport.[[State]] becomes "closed" or "failed":
- %新たな接続 ~LET %専用か に応じて ⇒# ~F ならば `no^l/ ~T ならば `yes-and-dedicated^l ◎ Let newConnection be "no" if dedicated is false; otherwise "yes-and-dedicated".
-
%接続 ~LET `接続を得する$( ↓ ) ⇒# %~network区分~key, %~URL, ~F, %新たな接続, %不依拠-可能が要求されるか ◎ Let connection be the result of obtaining a connection with networkPartitionKey, url, false, newConnection, and requireUnreliable.\
— 次に従う下で:
- ~UAは,複数の輻輳~制御~algoを~supportする場合、[ この %接続 上に~dataを送信するためとして, %輻輳~制御 用に適切なもの ]を選ぶ。
-
%~server証明書~hash群 が指定された【空でない】場合:
- 接続を得するときは,証明書は — 既定の証明書~検証y~algoを利用する代わりに — 次を満たす場合に妥当であるものと見なす ⇒ [ `~custom証明書~要件$を満たす ]~AND[ `証明書~hashを検証yする$( %~server証明書~hash群 ) の結果 ~EQ ~T ]
- 前項の条件が満たされない場合 ⇒ %接続 ~SET `失敗^i
-
~IF[ %接続 ~EQ `失敗^i ]: ◎ If connection is failure, then abort the remaining steps and\
-
`~network~taskを~queueする$( %~transport, 次の手続き ) ◎ queue a network task with transport to\
手続きは: ◎ run these steps:
- ~IF[ %~transport . `State$sl ~IN { `closed^l, `failed^l } ] ⇒ ~RET ◎ If transport.[[State]] is "closed" or "failed", then abort these steps.
- %~error ~LET `~WebTransport用の例外を作成する$( `session^l ) ◎ Let error be a newly created WebTransportError whose source is "session".
-
`~WebTransportを片付ける$( %~transport, %~error ) ◎ Cleanup transport with error.
注記: ~redirectは追従されない 【 %要請 の`~redirect~mode$rqは `error^l に設定されたので】。 ~redirectionにより生じる~network~errorは、 意図的に,他の~network~errorと判別-不能になる。 非同一-生成元な文脈においては、 これ【追従すること?】は,[ 通常は~CORSにより阻止されることになる情報 ]を露呈することになる。 同一-生成元な文脈においては、 これは,[ 情報を渡すための行路として~handshakeを濫用する ]よう応用に奨励するかもしれない。 ◎ Note: Redirects are not followed. Network errors caused by redirection are intentionally indistinguishable from other network errors. In cross-origin contexts, this would reveal information that would normally be blocked by CORS. In same-origin contexts, it might encourage applications to abuse the handshake as a vector for passing information.
- ~RET ◎ ↑↑
-
- %接続 から最初の `SETTINGS$ft ~frameを受信するまで待機する ◎ Wait for connection to receive the first SETTINGS frame,\
- %設定群 ~LET 前~段の `SETTINGS$ft ~frameを表現する辞書 ◎ and let settings be a dictionary that represents the SETTINGS frame.
-
~IF[ %設定群 [ "`SETTINGS_ENABLE_WEBTRANPORT^sp" ] ~NEQ 1 ]~OR[ %設定群 [ "`H3_DATAGRAM^sp" ] ~NEQ 1 ]: ◎ If settings doesn’t contain SETTINGS_ENABLE_WEBTRANPORT with a value of 1, or it doesn’t contain H3_DATAGRAM with a value of 1, then abort the remaining steps and\
-
`~network~taskを~queueする$( %~transport, 次の手続き ) ◎ queue a network task with transport to\
手続きは: ◎ run these steps:
- ~IF[ %~transport . `State$sl ~IN { `closed^l, `failed^l } ] ⇒ ~RET ◎ If transport.[[State]] is "closed" or "failed", then abort these steps.
- %~error ~LET `~WebTransport用の例外を作成する$( `session^l ) ◎ Let error be a newly created WebTransportError whose source is "session".
- `~WebTransportを片付ける$( %~transport, %~error ) ◎ Cleanup transport with error.
- ~RET ◎ ↑↑
-
-
%~session ~LET `~WebTransport~sessionを確立する$( %生成元, %~protocol群 ) `on^en %接続 ◎ Establish a WebTransport session with origin and protocols on connection.
注記: この段は、[ `QUIC-DATAGRAM$r にて指定される,~transport~parameterの交換 ]も包含する。 ◎ Note: This step also contains the transport parameter exchange specified in [QUIC-DATAGRAM].
-
~IF[ %~session ~EQ `失敗^i ]: ◎ If the previous step fails, abort the remaining steps and\
-
`~network~taskを~queueする$( %~transport, 次の手続き ) ◎ queue a network task with transport to\
手続きは: ◎ run these steps:
- ~IF[ %~transport . `State$sl ~IN { `closed^l, `failed^l } ] ⇒ ~RET ◎ If transport.[[State]] is "closed" or "failed", then abort these steps.
- %~error ~LET `~WebTransport用の例外を作成する$( `session^l ) ◎ Let error be a newly created WebTransportError whose source is "session".
- `~WebTransportを片付ける$( %~transport, %~error ) ◎ Cleanup transport with error.
- ~RET ◎ ↑↑
-
- ~Assert: %maxDatagramSize は整数である。 【未定義な変数。前後との関係が不明で意図不明な段。】 ◎ ↑↑ Let session be the established WebTransport session. ◎ Assert: maxDatagramSize is an integer.
-
`~network~taskを~queueする$( %~transport, 次の手続き ) ◎ Queue a network task with transport to\
手続きは: ◎ run these steps:
-
~IF[ %~transport . `State$sl ~NEQ `connecting^l ]: ◎ If transport.[[State]] is not "connecting":
- この段は`並列的$に走らす ⇒ `~WebTransport~sessionを終了する$( %~session ) ◎ In parallel, terminate session.
- ~RET ◎ Abort these steps.
-
- %~transport . `State$sl ~SET `connected^l ◎ Set transport.[[State]] to "connected".
- %~transport . `Session$sl ~SET %~session ◎ Set transport.[[Session]] to session.
- %~transport .`Protocol$sl ~SET 空~文字列 ◎ ↓
-
`WEB-TRANSPORT-HTTP3$r `§ 下位protocolの折衝$ に従って ⇒ ~IF[ 当の `CONNECT$M 要請に対する `2xx$st 応答~内に `WT-Protocol$h ~headerは在る ] ⇒ %~transport .`Protocol$sl ~SET 当の~headerの値を成す文字列 ◎ Set transport.[[Protocol]] to either the string value of the WT-Protocol header field in the 2xx response to the CONNECT request if present, following [WEB-TRANSPORT-HTTP3] Section 3.4, or "" if not present.
注記: これは、 代わりに `WEB-TRANSPORT-OVERVIEW$r を参照するべきである — その`課題 #15@https://github.com/ietf-wg-webtrans/draft-ietf-webtrans-overview/issues/15$ が解決されたなら。 ◎ This should reference [WEB-TRANSPORT-OVERVIEW] instead pending issue 15.
- %~transport . `Reliability$sl ~SET %接続 【!the connection】に応じて ⇒# ~HTTP3接続であるならば `supports-unreliable$l / ~HTTP2接続である `WEB-TRANSPORT-HTTP2$r ならば `reliable-only$l ◎ If the connection is an HTTP/3 connection, set transport’s [[Reliability]] to "supports-unreliable". ◎ If the connection is an HTTP/2 connection [WEB-TRANSPORT-HTTP2], set transport’s [[Reliability]] to "reliable-only".
- `~promiseを解決する$( %~transport . `Ready$sl ) ◎ Resolve transport.[[Ready]] with undefined.
`双方向~streamを~pullする@ ときは、 所与の ( `WebTransport$I ~obj %~transport ) に対し, 次の手続きを走らす: ◎ To pullBidirectionalStream, given a WebTransport object transport, run these steps.
-
~IF[ %~transport . `State$sl ~EQ `connecting^l ] ⇒ ~RET %~transport . `Ready$sl の`充足-時$に次の手続きを遂行するようにする: ◎ If transport.[[State]] is "connecting", then return the result of performing the following steps upon fulfillment of transport.[[Ready]]:
手続きは ⇒ ~RET `双方向~streamを~pullする$( %~transport ) ◎ Return the result of pullBidirectionalStream with transport. - ~IF[ %~transport . `State$sl ~NEQ `connected^l ] ⇒ ~RET `却下される~promise$( `InvalidStateError$E ) ◎ If transport.[[State]] is not "connected", then return a new rejected promise with an InvalidStateError.
- %~session ~LET %~transport . `Session$sl ◎ Let session be transport.[[Session]].
- %~promise ~LET `新たな~promise$ ◎ Let p be a new promise.
-
この段は`並列的$に走らす: ◎ Run the following steps in parallel:
- %~session に可用な流入~双方向~streamが在るようになるまで待機する 【!`双方向~streamを受信する$】 ◎ Wait until there is an available incoming bidirectional stream.
- %内部~stream ~LET `双方向~streamを受信する$( %~session ) ◎ Let internalStream be the result of receiving a bidirectional stream.
-
`~network~taskを~queueする$( %~transport, 次の手続き ) ◎ Queue a network task with transport to\
手続きは: ◎ run these steps:
- %~stream ~LET `WebTransportBidirectionalStream$I を`作成する$wtB( %内部~stream, %~transport ) ◎ Let stream be the result of creating a WebTransportBidirectionalStream with internalStream and transport.
- %~transport . `IncomingBidirectionalStreams$sl に`~chunkを~enqueueする$RS( %~stream ) ◎ Enqueue stream to transport.[[IncomingBidirectionalStreams]].
- `~promiseを解決する$( %~promise ) ◎ Resolve p with undefined.
- ~RET %~promise ◎ Return p.
`一方向~streamを~pullする@ ときは、 所与の ( `WebTransport$I ~obj %~transport ) に対し, 次の手続きを走らす: ◎ To pullUnidirectionalStream, given a WebTransport object transport, run these steps.
-
~IF[ %~transport . `State$sl ~EQ `connecting^l ] ⇒ ~RET %~transport . `Ready$sl の`充足-時$に次の手続きを遂行するようにする: ◎ If transport.[[State]] is "connecting", then return the result of performing the following steps upon fulfillment of transport.[[Ready]]:
手続きは ⇒ ~RET `一方向~streamを~pullする$( %~transport ) ◎ Return the result of pullUnidirectionalStream with transport. - ~IF[ %~transport . `State$sl ~NEQ `connected^l ] ⇒ ~RET `却下される~promise$( `InvalidStateError$E ) ◎ If transport.[[State]] is not "connected", then return a new rejected promise with an InvalidStateError.
- %~session ~LET %~transport . `Session$sl ◎ Let session be transport.[[Session]].
- %~promise ~LET `新たな~promise$ ◎ Let p be a new promise.
-
この段は`並列的$に走らす: ◎ Run the following steps in parallel:
- %~session に可用な流入~一方向~streamが在るようになるまで待機する 【!`流入~一方向~streamを受信する$】 ◎ Wait until there is an available incoming unidirectional stream.
- %内部~stream ~LET `流入~一方向~streamを受信する$( %~session ) ◎ Let internalStream be the result of receiving an incoming unidirectional stream.
-
`~network~taskを~queueする$( %~transport, 次の手続き ) ◎ Queue a network task with transport to\
手続きは: ◎ run these steps:
- %~stream ~LET `WebTransportReceiveStream$I を`作成する$wtR( %内部~stream, %~transport ) ◎ Let stream be the result of creating a WebTransportReceiveStream with internalStream and transport.
- %~transport . `IncomingUnidirectionalStreams$sl に`~chunkを~enqueueする$RS( %~stream ) ◎ Enqueue stream to transport.[[IncomingUnidirectionalStreams]].
- `~promiseを解決する$( %~promise ) ◎ Resolve p with undefined.
- ~RET %~promise ◎ Return p.
5.3. 属性
【 原文には、 各~属性のうち一部に(規範的でない)記述もあるが、 属性が返す内部~slotの定義にて同様な内容が述べられているので,この訳では省略する (あるいは、そこへ移動している)。 】
- `ready@mT ◎ ready, of type Promise<undefined>, readonly
- 取得子~手続きは ⇒ ~RET コレ . `Ready$sl ◎ On getting, it MUST return this's [[Ready]].
- `closed@mT ◎ closed, of type Promise<WebTransportCloseInfo>, readonly
- 取得子~手続きは ⇒ ~RET コレ . `Closed$sl ◎ On getting, it MUST return this's [[Closed]].
- `draining@mT ◎ draining, of type Promise<undefined>, readonly
- 取得子~手続きは ⇒ ~RET コレ . `Draining$sl ◎ On getting, it MUST return this's [[Draining]].
- `datagrams@mT ◎ datagrams, of type WebTransportDatagramDuplexStream, readonly
- 取得子~手続きは ⇒ ~RET コレ . `Datagrams$sl ◎ ↑↑ A single duplex stream for sending and receiving datagrams over this session.\ ◎ The getter steps for the datagrams attribute SHALL be: • Return this's [[Datagrams]].
- `incomingBidirectionalStreams@mT ◎ incomingBidirectionalStreams, of type ReadableStream, readonly
- 取得子~手続きは ⇒ ~RET コレ . `IncomingBidirectionalStreams$sl ◎ ↑↑ Returns a ReadableStream of WebTransportBidirectionalStreams that have been received from the server.\ ◎ ↑↑ Note: Whether the incoming streams already have data on them will depend on server behavior. ◎ The getter steps for the incomingBidirectionalStreams attribute SHALL be: • Return this's [[IncomingBidirectionalStreams]].
- `incomingUnidirectionalStreams@mT ◎ incomingUnidirectionalStreams, of type ReadableStream, readonly
- 取得子~手続きは ⇒ ~RET コレ . `IncomingUnidirectionalStreams$sl ◎ ↑↑ A ReadableStream of unidirectional streams, each represented by a WebTransportReceiveStream, that have been received from the server.\ ◎ ↑↑ Note: Whether the incoming streams already have data on them will depend on server behavior. ◎ The getter steps for incomingUnidirectionalStreams are: • Return this.[[IncomingUnidirectionalStreams]].
- `reliability@mT ◎ reliability, of type WebTransportReliabilityMode, readonly
- 取得子~手続きは ⇒ ~RET コレ . `Reliability$sl ◎ Whether connection supports unreliable (over UDP) transport or only reliable (over TCP fallback) transport. Returns "pending" until a connection has been established.\ The getter steps are to return this's [[Reliability]].
- `congestionControl@mT ◎ congestionControl, of type WebTransportCongestionControl, readonly
- 取得子~手続きは ⇒ ~RET コレ . `CongestionControl$sl ◎ The application’s preference, if requested in the constructor, and satisfied by the user agent, for a congestion control algorithm optimized for either throughput or low latency for sending on this connection. If a preference was requested but not satisfied, then the value is "default"\ The getter steps are to return this's [[CongestionControl]].
- `supportsReliableOnly@mT ◎ supportsReliableOnly, of type boolean, readonly
- 取得子~手続きは ⇒ ~RET ~IS[ ~UAは、 `~WebTransport~session$を`依拠-可能$な`接続$越しに限り~supportする ] ◎ Returns true if the user agent supports WebTransport sessions over exclusively reliable connections, otherwise false.
- `anticipatedConcurrentIncomingUnidirectionalStreams@mT ◎ anticipatedConcurrentIncomingUnidirectionalStreams, of type unsigned short, nullable
- 値の意味は、 `WebTransportOptions$I の `anticipatedConcurrentIncomingUnidirectionalStreams$mb を見よ。 ◎ Optionally lets an application specify the number of concurrently open incoming unidirectional streams it anticipates the server creating.\ If not null, the user agent SHOULD attempt to reduce future round-trips by taking [[AnticipatedConcurrentIncomingUnidirectionalStreams]] into consideration in its negotiations with the server.
- 取得子~手続きは ⇒ ~RET コレ . `AnticipatedConcurrentIncomingUnidirectionalStreams$sl ◎ The getter steps are to return this's [[AnticipatedConcurrentIncomingUnidirectionalStreams]].
- 設定子~手続きは ⇒ コレ . `AnticipatedConcurrentIncomingUnidirectionalStreams$sl ~SET 所与の値 ◎ The setter steps, given value, are to set this's [[AnticipatedConcurrentIncomingUnidirectionalStreams]] to value.
- `anticipatedConcurrentIncomingBidirectionalStreams@mT ◎ anticipatedConcurrentIncomingBidirectionalStreams, of type unsigned short, nullable
- 値の意味は、 `WebTransportOptions$I の `anticipatedConcurrentIncomingBidirectionalStreams$mb を見よ。 ◎ Optionally lets an application specify the number of concurrently open bidirectional streams it anticipates the server creating.\ If not null, the user agent SHOULD attempt to reduce future round-trips by taking [[AnticipatedConcurrentIncomingBidirectionalStreams]] into consideration in its negotiations with the server.
- 取得子~手続きは ⇒ ~RET コレ . `AnticipatedConcurrentIncomingBidirectionalStreams$sl ◎ The getter steps are to return this's [[AnticipatedConcurrentIncomingBidirectionalStreams]].
- 設定子~手続きは ⇒ コレ . `AnticipatedConcurrentIncomingBidirectionalStreams$sl ~SET 所与の値 ◎ The setter steps, given value, are to set this's [[AnticipatedConcurrentIncomingBidirectionalStreams]] to value.
- 注記: [ `anticipatedConcurrentIncomingUnidirectionalStreams$mT / `anticipatedConcurrentIncomingBidirectionalStreams$mT ]は、 設定したとしても,[ 応用が,自身が見越した~streamの個数を受信するようになる ]ことを保証するものではない。 ◎ Note: Setting anticipatedConcurrentIncomingUnidirectionalStreams or anticipatedConcurrentIncomingBidirectionalStreams does not guarantee the application will receive the number of streams it anticipates.
- `protocol@mT ◎ protocol, of type DOMString, readonly
- [ 構築子~optionとして空でない `protocols$mb が利用された ]下で[ `~WebTransport~session$が確立された ]なら、[ ~serverにより選定された応用~levelの~protocol ]が在る場合は,それを指示する文字列を返す。 他の場合、 空~文字列を返す。 ◎ Once a WebTransport session has been established and the protocols constructor option was used to provide a non-empty array, returns the application-level protocol selected by the server, if any. Otherwise, an empty string.\
- 取得子~手続きは ⇒ ~RET コレ .`Protocol$sl ◎ The getter steps are to return this's [[Protocol]].
5.4. ~method
- `close(closeInfo)@mT ◎ close(closeInfo)
- この `WebTransport$I に結付けられた`~WebTransport~session$を終了する。 ◎ Terminates the WebTransport session associated with the WebTransport object.
-
~method手続きは: ◎ When close is called, the user agent MUST run the following steps:
- %~transport ~LET コレ ◎ Let transport be this.
- ~IF[ %~transport . `State$sl ~IN { `closed^l, `failed^l } ] ⇒ ~RET ◎ If transport.[[State]] is "closed" or "failed", then abort these steps.
-
~IF[ %~transport . `State$sl ~EQ `connecting^l ]: ◎ If transport.[[State]] is "connecting":
- %~error ~LET `~WebTransport用の例外を作成する$( `session^l ) ◎ Let error be a newly created WebTransportError whose source is "session".
- `~WebTransportを片付ける$( %~transport, %~error ) ◎ Cleanup transport with error.
- ~RET ◎ Abort these steps.
- %~session ~LET %~transport . `Session$sl ◎ Let session be transport.[[Session]].
- %~code ~LET %closeInfo[ "`closeCode$mb" ] ◎ Let code be closeInfo.closeCode.
- %事由 ~LET 空な`~byte列$ ◎ ↓
-
%事由~文字列 ~LET `~scalar値~文字列に変換する$( %closeInfo[ "`reason$mb" ] )
【 原文は,`符号単位$に基づいて演算しているが、 以下で~UTF-8符号化法を適用するためには, ~scalar値に変換する必要があろう。 】
◎ ↓ - %長さ ~LET 0 ◎ ↓
-
%事由~文字列 を成す ~EACH( %符号位置 ) に対し: 【!`符号単位~接頭辞$】
- %~byte列 ~LET `~UTF-8符号化する$( %符号位置 )
- %長さ ~INCBY %~byte列 の`長さ$byte
- ~IF[ %長さ ~GT 1024 ] ⇒ ~BREAK
- %事由 に %~byte列 を付加する
-
この段は`並列的$に走らす ⇒ `~WebTransport~sessionを終了する$( %~session, %~code, %事由 ) ◎ In parallel, terminate session with code and reason.
注記: これはまた[ %~transport . `SendStreams$sl, %~transport . `ReceiveStreams$sl ]内に包含された各`~WebTransport~stream$に対しても[ `設定し直す$WT/ `送信を停止させる$WT ] ◎ Note: This also resets or sends STOP_SENDING WebTransport streams contained in transport.[[SendStreams]] and [[ReceiveStreams]].
- `~WebTransportを片付ける$( %~transport, `AbortError$E, %closeInfo ) ◎ Cleanup transport with AbortError and closeInfo.
- `getStats()@mT ◎ getStats()
- この `WebTransport$I の`下層~接続$用の統計を集めて, その結果を非同期的に報告する。 ◎ Gathers stats for this WebTransport's underlying connection and reports the result asynchronously.
-
~method手続きは: ◎ When getStats is called, the user agent MUST run the following steps:
- %~transport ~LET コレ ◎ Let transport be this.
- %~promise ~LET `新たな~promise$ ◎ Let p be a new promise.
-
~IF[ %~transport . `State$sl ~EQ `failed^l ] ⇒ ~RET `却下される~promise$( `InvalidStateError$E 例外 ) ◎ ↑
【 この段は、 原文では[ `~promiseを却下する$( %p, `InvalidStateError^E 例外 ) ]を行ってから値を返さずに手続きを終えているが,誤りであろう。 `failed^l は、 以下で`並列的$に走らす手続きの中でも取扱われているので,この段は不要かもしれない。 】
◎ If transport.[[State]] is "failed", reject p with an InvalidStateError and abort these steps. -
この段は`並列的$に走らす: ◎ Run the following steps in parallel:
- ~IF[ %~transport . `State$sl ~EQ `connecting^l ] ⇒ %~transport . `State$sl が変化するまで待機する ◎ If transport.[[State]] is "connecting", wait until it changes.
- ~IF[ %~transport . `State$sl ~EQ `failed^l ] ⇒# `~promiseを却下する$( %p, `InvalidStateError$E 例外 ); ~RET ◎ If transport.[[State]] is "failed", reject p with an InvalidStateError and abort these steps.
-
~IF[ %~transport . `State$sl ~EQ `closed^l ]:
- %統計 ~LET `新たな$ `WebTransportConnectionStats$I ~obj
- %統計 を成す各~memberを当の接続~用に可用な最も近過去な統計を表現するよう設定する — 統計が収集される正確な時点は、 `実装定義$とする。
- `~promiseを解決する$( %p, %統計 )
- ~RET
- `下層~接続$から統計を集める — 各~datagram上の統計も含む ◎ Gather the stats from the underlying connection, including stats on datagrams.
-
`~network~taskを~queueする$( %~transport, 次の手続き ) ◎ Queue a network task with transport to\
手続きは: ◎ run the following steps:
- %統計 ~LET `新たな$ `WebTransportConnectionStats$I ~obj ◎ Let stats be a new WebTransportConnectionStats object\
- %統計 を成す各~memberを集められた統計を表現するよう設定する ◎ representing the gathered stats.
- `~promiseを解決する$( %~promise, %統計 ) ◎ Resolve p with stats.
- ~RET %~promise ◎ Return p.
- `createBidirectionalStream(options)@mT ◎ createBidirectionalStream()
- 流出~双方向~stream用の `WebTransportBidirectionalStream$I ~objを作成する。 ~streamの作成だけでは、 ~dataの送信に利用されるまでは, 即時に相手の端点から可視になることはないことに注意。 ◎ Creates a WebTransportBidirectionalStream object for an outgoing bidirectional stream. Note that the mere creation of a stream is not immediately visible to the peer until it is used to send data.
- 注記: 当の~stream上に~dataが送信されるまでは、 ~serverが当の~streamを自覚するようになることは期待されない。 ◎ Note: There is no expectation that the server will be aware of the stream until data is sent on it.
-
~method手続きは: ◎ When createBidirectionalStream is called, the user agent MUST run the following steps:
- %~transport ~LET コレ ◎ Let transport be this.
- ~IF[ %~transport . `State$sl ~IN { `closed^l, `failed^l } ] ⇒ ~RET `却下される~promise$( `InvalidStateError$E ) ◎ If transport.[[State]] is "closed" or "failed", return a new rejected promise with an InvalidStateError.
- %送信-~group ~LET %options[ "`sendGroup$mb" ] ◎ Let sendGroup be options's sendGroup.
- %送信-順序 ~LET %options[ "`sendOrder$mb" ] ◎ Let sendOrder be options's sendOrder.
- %可用になるまで待機するか ~LET %options[ "`waitUntilAvailable$mb" ] ◎ Let waitUntilAvailable be options's waitUntilAvailable.
- %~promise ~LET `新たな~promise$ ◎ Let p be a new promise.
-
この段は、 `並列的$に走らすことに加え: ◎ Run the following steps in parallel,\
- 次が満たされた`ときは中止する$ ⇒ %~transport . `State$sl ~IN { `closed^l, `failed^l } ◎ but abort when transport’s [[State]] becomes "closed" or "failed",\
-
`中止されたときは$ ⇒ `~network~taskを~queueする$( %~transport, 次の手続き ) ◎ and instead queue a network task with transport to\
手続きは ⇒ `~promiseを却下する$( %~promise, `InvalidStateError$E ) ◎ reject p with an InvalidStateError:
-
%~stream~ID ~LET %~transport . `Session$sl 用に妥当かつ一意な新たな~stream~ID — `QUIC$r `§ 19.11@~RFCx/rfc9000#section-19.11$ にて定義されるとおり
~IF[ 枯渇に因り,即時に可用な~stream~IDは無い ]:
- ~IF[ %可用になるまで待機するか ~EQ ~F ] ⇒# `~promiseを却下する$( %p, `QuotaExceededError$E 例外 ); ~RET
- ~stream~IDが可用になるまで待機する
- %~stream~ID ~SET 可用になった~stream~ID
- %内部~stream ~LET `双方向~streamを作成する$( %~transport . `Session$sl, %~stream~ID ) ◎ Let internalStream be the result of creating a bidirectional stream with transport.[[Session]] and streamId.
-
`~network~taskを~queueする$( %~transport, 次の手続き ) ◎ Queue a network task with transport to\
手続きは: ◎ run the following steps:
- ~IF[ %~transport . `State$sl ~IN { `closed^l, `failed^l } ] ⇒# `~promiseを却下する$( %~promise, `InvalidStateError$E ); ~RET ◎ If transport.[[State]] is "closed" or "failed", reject p with an InvalidStateError and abort these steps.
- %~stream ~LET `WebTransportBidirectionalStream$I を`作成する$wtB( %内部~stream, %~transport, %送信-~group, %送信-順序 ) ◎ Let stream be the result of creating a WebTransportBidirectionalStream with internalStream, transport, sendGroup, and sendOrder.
- `~promiseを解決する$( %~promise, %~stream ) ◎ Resolve p with stream.
- ~RET %~promise ◎ Return p.
- `createUnidirectionalStream(options)@mT ◎ createUnidirectionalStream()
- 流出~一方向~stream用の `WebTransportSendStream$I を作成する。 ~streamの作成だけでは、 ~dataの送信に利用されるまでは, ~serverからは即時に可視にならないことに注意。 ◎ Creates a WebTransportSendStream for an outgoing unidirectional stream. Note that the mere creation of a stream is not immediately visible to the server until it is used to send data.
- 注記: 当の~stream上に~dataが送信されるまでは、 ~serverが当の~streamを自覚するようになることは期待されない。 ◎ Note: There is no expectation that the server will be aware of the stream until data is sent on it.
-
~method手続きは: ◎ When createUnidirectionalStream() method is called, the user agent MUST run the following steps:
- %~transport ~LET コレ ◎ Let transport be this.
- ~IF[ %~transport . `State$sl ~IN { `closed^l, `failed^l } ] ⇒ ~RET `却下される~promise$( `InvalidStateError$E ) ◎ If transport.[[State]] is "closed" or "failed", return a new rejected promise with an InvalidStateError.
- %送信-~group ~LET %options[ "`sendGroup$mb" ] ◎ Let sendGroup be options's sendGroup.
- %送信-順序 ~LET %options[ "`sendOrder$mb" ] ◎ Let sendOrder be options's sendOrder.
- %可用になるまで待機するか ~LET %options[ "`waitUntilAvailable$mb" ] ◎ Let waitUntilAvailable be options's waitUntilAvailable.
- %~promise ~LET `新たな~promise$ ◎ Let p be a new promise.
-
この段は、 `並列的$に走らすことに加え: ◎ Run the following steps in parallel,\
- 次が満たされた`ときは中止する$ ⇒ %~transport . `State$sl ~IN { `closed^l, `failed^l } ◎ but abort when transport’s [[State]] becomes "closed" or "failed",\
-
`中止されたときは$ ⇒ `~network~taskを~queueする$( %~transport, 次の手続き ) ◎ and instead queue a network task with transport to\
手続きは ⇒ `~promiseを却下する$( %~promise, `InvalidStateError$E ) ◎ reject p with an InvalidStateError:
-
%~stream~ID ~LET %~transport . `Session$sl 用に妥当かつ一意な新たな~stream~ID — `QUIC$r `§ 19.11@~RFCx/rfc9000#section-19.11$ にて定義されるとおり
~IF[ 枯渇に因り,即時に可用な~stream~IDは無い ]:
- ~IF[ %可用になるまで待機するか ~EQ ~F ] ⇒# `~promiseを却下する$( %p, `QuotaExceededError$E 例外 ); ~RET
- ~stream~IDが可用になるまで待機する
- %~stream~ID ~SET 可用になった~stream~ID
-
%内部~stream ~LET `流出~一方向~streamを作成する$( %~transport . `Session$sl, %~stream~ID ) ◎ Let internalStream be the result of creating an outgoing unidirectional stream with transport.[[Session]] and streamId.
-
`~network~taskを~queueする$( %~transport, 次の手続き ) ◎ Queue a network task with transport to\
手続きは: ◎ run the following steps:
- ~IF[ %~transport . `State$sl ~IN { `closed^l, `failed^l } ] ⇒# `~promiseを却下する$( %~promise, `InvalidStateError$E ); ~RET ◎ If transport.[[State]] is "closed" or "failed", reject p with an InvalidStateError and abort these steps.
- %~stream ~LET `WebTransportSendStream$I を`作成する$wtS( %内部~stream, %~transport, %送信-~group, %送信-順序 ) ◎ Let stream be the result of creating a WebTransportSendStream with internalStream, transport, sendGroup, and sendOrder.
- `~promiseを解決する$( %~promise, %~stream ) ◎ Resolve p with stream.
- ~RET %~promise ◎ return p.
- `createSendGroup()@mT ◎ createSendGroup()
- `WebTransportSendGroup$I を作成する。 ◎ Creates a WebTransportSendGroup.
-
~method手続きは: ◎ When createSendGroup() method is called, the user agent MUST run the following steps:
- %~transport ~LET コレ ◎ Let transport be this.
- ~IF[ %~transport . `State$sl ~IN { `closed^l, `failed^l } ] ⇒ ~THROW `InvalidStateError$E ◎ If transport.[[State]] is "closed" or "failed", throw an InvalidStateError.
- ~RET `WebTransportSendGroup$I を`作成する$TSG( %~transport ) ◎ Return the result of creating a WebTransportSendGroup with transport.
5.5. 手続-
`~WebTransportを片付ける@ ときは、 所与の ( `WebTransport$I %~transport, %~error, %~close報(省略時は ε ) ) に対し,次の手続きを走らす: ◎ To cleanup a WebTransport transport with error and optionally closeInfo, run these steps:
- %送信-~stream群 ~LET %~transport . `SendStreams$sl の複製 ◎ Let sendStreams be a copy of transport.[[SendStreams]].
- %受信-~stream群 ~LET %~transport . `ReceiveStreams$sl の複製 ◎ Let receiveStreams be a copy of transport.[[ReceiveStreams]].
- %流出~datagram群 ~LET %~transport . `Datagrams$sl . `Writable$sl ◎ Let outgoingDatagrams be transport.[[Datagrams]].[[Writable]].
- %流入~datagram群 ~LET %~transport . `Datagrams$sl . `Readable$sl ◎ Let incomingDatagrams be transport.[[Datagrams]].[[Readable]].
- %準備済み時の~promise ~LET %~transport . `Ready$sl ◎ Let ready be transport.[[Ready]].
- %~close時の~promise ~LET %~transport . `Closed$sl ◎ Let closed be transport.[[Closed]].
- %流入~双方向~stream群 ~LET %~transport . `IncomingBidirectionalStreams$sl ◎ Let incomingBidirectionalStreams be transport.[[IncomingBidirectionalStreams]].
- %流入~一方向~stream群 ~LET %~transport . `IncomingUnidirectionalStreams$sl ◎ Let incomingUnidirectionalStreams be transport.[[IncomingUnidirectionalStreams]].
- %~transport . `SendStreams$sl ~SET 新たな`有順序~集合$ ◎ Set transport.[[SendStreams]] to an empty set.
- %~transport . `ReceiveStreams$sl ~SET 新たな`有順序~集合$ ◎ Set transport.[[ReceiveStreams]] to an empty set.
- %~transport . `Datagrams$sl . `OutgoingDatagramsQueue$sl ~SET 新たな`~queue$ ◎ Set transport.[[Datagrams]].[[OutgoingDatagramsQueue]] to an empty queue.
- %~transport . `Datagrams$sl . `IncomingDatagramsQueue$sl ~SET 新たな`~queue$ ◎ Set transport.[[Datagrams]].[[IncomingDatagramsQueue]] to an empty queue.
- %~transport . `State$sl ~SET %~close報 に応じて ⇒# ε ならば `failed^l / ~ELSE_ `closed^l ◎ If closeInfo is given, then set transport.[[State]] to "closed". Otherwise, set transport.[[State]] to "failed".
-
%送信-~stream群 を成す ~EACH( %~stream ) に対し: ◎ For each stream in sendStreams, run the following steps:
- ~IF[ %~stream . `PendingOperation$slS ~NEQ ~NULL ] ⇒ `~promiseを却下する$( %~stream . `PendingOperation$slS, %~error ) ◎ If stream.[[PendingOperation]] is not null, reject stream.[[PendingOperation]] with error.
- %~stream を`~errorにする$WS( %~error ) ◎ Error stream with error.
-
%受信-~stream群 を成す ~EACH( %~stream ) に対し ⇒ %受信-~stream を`~errorにする$RS( %~error ) ◎ For each stream in receiveStreams, error stream with error.
注記: ~script作者は[ ~promise解決~内で同期的に走る~code ]を注入できる。 よって,ここ以降は、 【仕様~策定者は】 %~transport には触れないこと — それは、 ~scriptにより予測-不能な仕方で変異されることもあるので。 このことは、 この手続-を~callしている~logicにも適用される。 ◎ Note: Script authors can inject code which runs in Promise resolution synchronously. Hence from here, do not touch transport as it may be mutated by scripts in an unpredictable way. This applies to logic calling this procedure, too.
-
~IF[ %~close報 ~NEQ ε ]: ◎ If closeInfo is given, then:
- `~promiseを解決する$( %~close時の~promise, %~close報 ) ◎ Resolve closed with closeInfo.
- ~Assert: %準備済み は`決着した@~ECMA262#sec-promise-objects$ ◎ Assert: ready is settled.
- %流入~双方向~stream群 を`~closeする$RS() ◎ Close incomingBidirectionalStreams.
- %流入~一方向~stream群 を`~closeする$RS() ◎ Close incomingUnidirectionalStreams.
- %流出~datagram群 を`~closeする$WS() ◎ Close outgoingDatagrams.
- %流入~datagram群 を`~closeする$RS() ◎ Close incomingDatagrams.
-
~ELSE: ◎ Otherwise:
- `~promiseを却下する$( %~close時の~promise, %~error ) ◎ Reject closed with error.
- %~close時の~promise . `PromiseIsHandled^sl ~SET ~T ◎ Set closed.[[PromiseIsHandled]] to true.
- `~promiseを却下する$( %準備済み時の~promise, %~error ) ◎ Reject ready with error.
- %準備済み時の~promise . `PromiseIsHandled^sl ~SET ~T ◎ Set ready.[[PromiseIsHandled]] to true.
- %流入~双方向~stream群 を`~errorにする$RS( %~error ) ◎ Error incomingBidirectionalStreams with error.
- %流入~一方向~stream群 を`~errorにする$RS( %~error ) ◎ Error incomingUnidirectionalStreams with error.
- %流出~datagram群 を`~errorにする$WS( %~error ) ◎ Error outgoingDatagrams with error.
- %流入~datagram群 を`~errorにする$RS( %~error ) ◎ Error incomingDatagrams with error.
5.6. ~clientにより起動されたものでない~sessionの終了n
ある `WebTransport$I %~transport に結付けられた`~WebTransport~session$ %~session 【すなわち %~transport . `Session$sl】 が`終了され$たときは、 所与の ( %~code (省略時は ε ), %事由~byte列 (省略時は ε ) ) に対し,次の手続きを走らす: ◎ Whenever a WebTransport session which is associated with a WebTransport transport is terminated with optionally code and reasonBytes, run these steps:
-
`~network~taskを~queueする$( %~transport, 次の手続き ) ◎ Queue a network task with transport to\
手続きは: ◎ run these steps:
- ~IF[ %~transport . `State$sl ~IN { `closed^l, `failed^l } ] ⇒ ~RET ◎ If transport.[[State]] is "closed" or "failed", abort these steps.
- %~error ~LET `~WebTransport用の例外を作成する$( `session^l ) ◎ Let error be a newly created WebTransportError whose source is "session".
- %~close報 ~LET `新たな$ `WebTransportCloseInfo$I ◎ Let closeInfo be a new WebTransportCloseInfo.
- ~IF[ %~code ~NEQ ε ] ⇒ %~close報[ "`closeCode$mb" ] ~SET %~code ◎ If code is given, set closeInfo’s closeCode to code.
-
~IF[ %事由~byte列 ~NEQ ε ] ⇒ %~close報[ "`reason$mb" ] ~SET `~UTF-8復号する$( %事由~byte列 ) ◎ If reasonBytes is given, set closeInfo’s reason to reasonBytes, UTF-8 decoded.
注記: %事由~byte列 に可用な[ 言語/方向 ] 【ヒトが話す言語/書字方向】 ~metadataは無い。 方向~用には、 値を表示するときに `first-strong@~TR/string-meta/#firststrong$en 経験則†を利用できる。 【† 最初に現れる `Strong^en 文字の方向に基づく(`参考@~HTMLdom#the-directionality$)】 ◎ Note: No language or direction metadata is available with reasonBytes. First-strong heuristics can be used for direction when displaying the value.
- `~WebTransportを片付ける$( %~transport, %~error, %~close報 ) ◎ Cleanup transport with error and closeInfo.
ある `WebTransport$I %~transport の`下層~接続$に接続~errorが生じたときは、 次の手続きを走らす: ◎ Whenever a WebTransport transport’s underlying connection gets a connection error, run these steps:
-
`~network~taskを~queueする$( %~transport, 次の手続き ) ◎ Queue a network task with transport to\
手続きは: ◎ run these steps:
- ~IF[ %~transport . `State$sl ~IN { `closed^l, `failed^l } ] ⇒ ~RET ◎ If transport.[[State]] is "closed" or "failed", abort these steps.
- %~error ~LET `~WebTransport用の例外を作成する$( `session^l ) ◎ Let error be a newly created WebTransportError whose source is "session".
- `~WebTransportを片付ける$( %~transport, %~error ) ◎ Cleanup transport with error.
5.7. 文脈を片付ける手続き
`文脈を片付ける手続き@ は、 所与の ( `WebTransport$I %~transport ) に対し: ◎ This specification defines context cleanup steps as the following steps, given WebTransport transport:
-
~IF[ %~transport . `State$sl ~EQ `connected^l ]: ◎ If transport.[[State]] is "connected", then:
- %~transport . `State$sl ~SET `failed^l ◎ Set transport.[[State]] to "failed".
- この段は`並列的$に走らす ⇒ `~WebTransport~sessionを終了する$( %~transport . `Session$sl ) ◎ In parallel, terminate transport.[[Session]].
-
`~network~taskを~queueする$( %~transport, 次の手続き ) ◎ Queue a network task with transport to\
手続きは: ◎ run the following steps:
- %~error ~LET `~WebTransport用の例外を作成する$( `session^l ) ◎ Let error be a newly created WebTransportError whose source is "session".
- `~WebTransportを片付ける$( %~transport, %~error ) ◎ Cleanup transport with error.
-
~IF[ %~transport . `State$sl ~EQ `connecting^l ] ⇒ %~transport . `State$sl ~SET `failed^l ◎ If transport.[[State]] is "connecting", set transport.[[State]] to "failed".
これは、 ~worker内でも行う必要がある。 `課題 #127@https://www.github.com/w3c/webtransport/issues/127$, `whatwg/html 課題 #6731@https://www.github.com/whatwg/html/issues/6831$ を見よ。 ◎ This needs to be done in workers too. See #127 and whatwg/html#6731.
【 この手続き(この仕様~内では利用されていない)は、 ~HTMLの`文書~unload時の片付け手続き@~HTMLlifecycle#unloading-document-cleanup-steps$から呼び出される。 】
5.8. ~garbage収集
~UAは、 所与の ( `WebTransport$I ~obj %~transport ) に対し, %~transport が ~OR↓ を満たす間は %~transport を~garbage収集しないモノトスル: ◎ ↓
-
~AND↓:
- %~transport . `State$sl ~IN { `connecting^l, `connected^l, `draining^l }
- [ 関連な~streamのうち`~lockされて$RSいるものがある ]~OR[ 関連な~promiseのうち観測されているものがある ]
上の条件において:
- 関連な~streamとは、 次に挙げる~streamの総称である ⇒# %~transport . `IncomingBidirectionalStreams$sl, %~transport . `IncomingUnidirectionalStreams$sl, 【%~transport . `ReceiveStreams$sl を成す】各 `WebTransportReceiveStream$I, %~transport . `Datagrams$sl . `Readable$sl
- 関連な~promiseとは、[ %~transport . `State$sl に応じて,次に挙げる %~transport の属性(たち) ]が返した~promiseの総称である ⇒# `connecting^l ならば[ `ready$mT, `draining$mT, `closed$mT ] / `connected^l ならば[ `draining$mT, `closed$mT ] / `draining^l ならば `closed$mT
-
~AND↓:
- `~WebTransport~session$を`確立した@#session-establish$
- ~networkへ伝送するよう~queueされた~dataがある — この~dataには、 %~transport . `Datagrams$sl . `OutgoingDatagramsQueue$sl 内の~datagramも含まれる。
`WebTransport$I ~objが,その`下層~接続$がまだ~openな間に~garbage収集された場合、 ~UAは,`~WebTransport~sessionを終了する@~WT-OVERVIEW#terminate-a-session$モノトスル — ( ~error~code 0, ~error~message 空~文字列 ) を与える下で ◎ If a WebTransport object is garbage collected while the underlying connection is still open, the user agent must terminate the WebTransport session with an Application Error Code of 0 and Application Error Message of "".
5.9. 環境設定
dictionary `WebTransportHash@I { `DOMString$ `algorithm@mH; `BufferSource$I `value@mH; }; dictionary `WebTransportOptions@I { `boolean$ `allowPooling$mb = false; `boolean$ `requireUnreliable$mb = false; `sequence$<`WebTransportHash$I> `serverCertificateHashes$mb; `WebTransportCongestionControl$I `congestionControl$mb = "default"; [`EnforceRange$] `unsigned short$? `anticipatedConcurrentIncomingUnidirectionalStreams$mb = null; [`EnforceRange$] `unsigned short$? `anticipatedConcurrentIncomingBidirectionalStreams$mb = null; `sequence$<`DOMString$> `protocols$mb = []; }; enum `WebTransportCongestionControl@I { `default@l, `throughput@l, `low-latency@l, };
`WebTransportOptions$I は、[ `~WebTransport~session$がどう確立され,どう利用されるか ]を決定する~parameterたちが成す辞書である。 ◎ WebTransportOptions is a dictionary of parameters that determine how the WebTransport session is established and used.
- `allowPooling@mb ◎ allowPooling, of type boolean, defaulting to false
- ~T に設定されたときは、 当の`~WebTransport~session$を~poolできる — すなわち、 その`下層~接続$は,他の`~WebTransport~session$と共有できるようになる。 ◎ When set to true, the WebTransport session can be pooled, that is, its underlying connection can be shared with other WebTransport sessions.
- `requireUnreliable@mb ◎ requireUnreliable, of type boolean, defaulting to false
- ~T に設定されたときは、 次を行えなくなる ⇒ ~HTTP3`接続$がアリでない場合に, `~WebTransport~session$を~HTTP2`接続$越しに確立する ◎ When set to true, the WebTransport session cannot be established over an HTTP/2 connection if an HTTP/3 connection is not possible.
- `serverCertificateHashes@mb ◎ serverCertificateHashes, of type sequence<WebTransportHash>
- この~optionは、 専用な接続を利用している~transport用に限り~supportされる。 ◎ This option is only supported for transports using dedicated connections.\
-
~UAは、 次に従うモノトスル — 以下における %~hash群 は、 この~fieldに与えた値を表すとする:
- [ ~transport~protocolが この特能を~supportしない ]~AND[ %~hash群 は空でない ]場合、 `NotSupportedError$E 例外を投出する。
-
[ ~transport~protocolが この特能を~supportする ]~AND[ %~hash群 は空でない ]場合、 ~server証明書は,[ ~AND↓ が満たされる場合,その場合に限り ]信用されるものと判断する:
- 次の結果 ~EQ ~T ⇒ `証明書~hashを検証yする$( 当の証明書, %~hash群 )
- 当の証明書は`~custom証明書~要件$を満足する
- %~hash群 を成す各~hashのうち未知な `algorithm$mH を利用するものは無視する。
- %~hash群 は空な場合、 通常の`~fetchする$ 演算~用に利用することになる証明書~検証y手続-を利用する。
- これは、 `allowPooling$mb と伴には利用できない。 ◎ This cannot be used with allowPooling.
- `congestionControl@mb ◎ congestionControl, of type WebTransportCongestionControl, defaulting to "default"
- 任意選択で, 次に関する応用の選好を指定する ⇒ [ ~throughputまたは短い待時間 ]用に調律された輻輳~制御~algoであって, この接続~越しに~dataを送信するとき利用されるもの。 ◎ Optionally specifies an application’s preference for a congestion control algorithm tuned for either throughput or low-latency to be used when sending data over this connection.\
- これは、 ~UA向けの~hintである。 ◎ This is a hint to the user agent.
- この環境設定~optionは、 ~browserにおける[ 短い待時間~用に最適化する輻輳~制御~algo ]用の実装の欠如に因り,~risk下にある特能と見なされる — これを書いた時点では。 ◎ This configuration option is considered a feature at risk due to the lack of implementation in browsers of a congestion control algorithm, at the time of writing, that optimizes for low latency.
- `anticipatedConcurrentIncomingUnidirectionalStreams@mb ◎ anticipatedConcurrentIncomingUnidirectionalStreams, of type unsigned short, nullable, defaulting to null
- [ 同時並行に~openな,`流入~一方向$な~streamたち ]として[ ~serverが作成するものと応用が見越す個数 ]を応用が任意選択で指定できるようにする。 ◎ Optionally lets an application specify the number of concurrently open incoming unidirectional streams it anticipates the server creating.\
- ~UAは、 初期~時は, ~serverからの`流入~一方向$な~streamを 100 個以上は許容するモノトスル。 ◎ The user agent MUST initially allow at least 100 incoming unidirectional streams from the server.\
- ~NULL でない場合、 ~UAは,[ 自身と~serverとの折衝において `AnticipatedConcurrentIncomingUnidirectionalStreams$sl を考慮に入れる ]ことにより[ 未来の往復-数を抑制するよう試みる ]ベキである。 ◎ If not null, the user agent SHOULD attempt to reduce round-trips by taking [[AnticipatedConcurrentIncomingUnidirectionalStreams]] into consideration in its negotiations with the server.
- `anticipatedConcurrentIncomingBidirectionalStreams@mb ◎ anticipatedConcurrentIncomingBidirectionalStreams, of type unsigned short, nullable, defaulting to null
- [ 同時並行に~openな,`双方向$な~streamたち ]として[ ~serverが作成するものと応用が見越す個数 ]を応用が任意選択で指定できるようにする。 ◎ Optionally lets an application specify the number of concurrently open bidirectional streams it anticipates a server creating.\
- ~UAは、 初期~時は, ~serverが作成する`双方向$な~streamとして 100 個以上は許容するモノトスル。 ◎ The user agent MUST initially allow the server to create at least 100 bidirectional streams.\
- ~NULL でない場合、 ~UAは,[ 自身と~serverとの折衝において `AnticipatedConcurrentIncomingBidirectionalStreams$sl を考慮に入れる ]ことにより[ 未来の往復-数を抑制するよう試みる ]ベキである。 ◎ If not null, the user agent SHOULD attempt to reduce round-trips by taking [[AnticipatedConcurrentIncomingBidirectionalStreams]] into consideration in its negotiations with the server.
- `protocols@mb ◎ protocols, of type sequence<DOMString>, defaulting to []
- 応用~levelの `~protocol名@ たちが成す連列 — 省略可能。 ◎ An optionally provided array of application-level protocol names.\
- 【空でない場合】 当の接続は、 次が生じた場合に限り,確立されることになる ⇒ ~serverは、[ これらが指示する応用~levelの~protocolのうちいずれか ]を選定して,それを【~clientへ】報告した。 ◎ The connection will only be established if the server reports that it has selected one of these application-level protocols.
`証明書~hashを算出する@ ときは、 所与の ( %証明書 ) に対し,次の手続きを遂行する: ◎ To compute a certificate hash, given a certificate, perform the following steps:
- %符号化した証明書 ~LET %証明書 に次を施した結果を表現するもの ⇒ `RFC5280$r にて定義される `Certificate^en【証明書】~messageを~DER符号化した結果 ◎ Let cert be certificate, represented as a DER encoding of Certificate message defined in [RFC5280].
- ~RET %符号化した証明書 の~SHA-256~hashを算出した結果 【!and return the computed value.】 ◎ Compute the SHA-256 hash of cert and return the computed value.
`証明書~hashを検証yする@ ときは、 所与の ( %証明書, `WebTransportHash$I ~hashたちが成す配列 %~hash群 ) に対し,次の手続きを遂行する: ◎ To verify a certificate hash, given a certificate and an array of hashes hashes, perform the following steps:
- %参照~hash ~LET `証明書~hashを算出する$( %証明書 ) ◎ Let referenceHash be the result of computing a certificate hash with certificate.
-
%~hash群 を成す ~EACH( %~hash ) に対し:
- %~hash~source ~LET %~hash[ "`value$mH" ]
- %~algo ~LET %~hash[ "`algorithm$mH" ]
- ~IF[ %~hash~source ~EQ ε【!~NULL】 ]~OR[ %~algo ~EQ ε ] ⇒ ~CONTINUE
-
~IF[ %~algo は`~ASCII大小無視$で `sha-256^l に合致する ]:
- %~hash値 ~LET %~hash~source が表現する~byte列
- ~IF[ %~hash値 ~EQ %参照~hash ] ⇒ ~RET ~T
- ~RET ~F ◎ Return false.
`~custom証明書~要件@ は、 次に従うモノトスル: ◎ The custom certificate requirements are as follows:\
- 当の証明書は、 `RFC5280$r にて定義されるとおり X.509v3 証明書である。 ◎ the certificate MUST be an X.509v3 certificate as defined in [RFC5280],\
- `Subject Public Key^en ~field内に利用される~keyは、 いずれかの`許容される公開鍵~algo$である。 ◎ the key used in the Subject Public Key field MUST be one of the allowed public key algorithms,\
- 現在の時刻は、 `RFC5280$r § 4.1.2.5 にて定義されるとおり, 証明書の妥当性~期間( `validity period^en )の中にある。 ◎ the current time MUST be within the validity period of the certificate as defined in Section 4.1.2.5 of [RFC5280]\
- 妥当性~期間を成す総-長さは、 2 週間を超過しない。 ◎ and the total length of the validity period MUST NOT exceed two weeks.\
~UAは、 当の証明書に対し,追加的な[ `実装定義$な要件 ]を課してもヨイ。 ◎ The user agent MAY impose additional implementation-defined requirements on the certificate.
`Subject Public Key Info^en ~field内 (したがって、 その帰結として, `TLS CertificateVerify^en ~message内) に利用される `許容される公開鍵~algo@ たちが成す正確な~listは、 `実装定義$とする — しかしながら、 それは: ◎ The exact list of allowed public key algorithms used in the Subject Public Key Info field (and, as a consequence, in the TLS CertificateVerify message) is implementation-defined; however,\
- 相互運用可能な既定を供するためとして、 `ECDSA with the secp256r1 (NIST P-256) named group^en ( `RFC3279$r § 2.3.5, `RFC8422$r ) を含むモノトスル。 ◎ it MUST include ECDSA with the secp256r1 (NIST P-256) named group ([RFC3279], Section 2.3.5; [RFC8422]) to provide an interoperable default.\
- ~RSA鍵( `RFC3279$r, § 2.3.1 )を包含しないモノトスル。 ◎ It MUST NOT contain RSA keys ([RFC3279], Section 2.3.1).
5.10. `WebTransportCloseInfo^I 辞書
`WebTransportCloseInfo$I 辞書は、 `WebTransport$I を~closeする際の~error~codeに関係している情報を含む。 この情報は、 `CONNECTION_CLOSE^ft ~frame用に[ ~error~code, 事由 ]を設定するために利用される。 ◎ The WebTransportCloseInfo dictionary includes information relating to the error code for closing a WebTransport. This information is used to set the error code and reason for a CONNECTION_CLOSE frame.
dictionary `WebTransportCloseInfo@I { `unsigned long$ `closeCode$mb = 0; `USVString$ `reason$mb = ""; };
この辞書が有する~memberは: ◎ The dictionary SHALL have the following attributes:
- `closeCode@mb ◎ closeCode, of type unsigned long, defaulting to 0
- 相手の端点へ通信される~error~code。 ◎ The error code communicated to the peer.
- `reason@mb ◎ reason, of type USVString, defaulting to ""
- `WebTransport$I を~closeする際の事由。 ◎ The reason for closing the WebTransport.
5.11. `WebTransportSendStreamOptions^I 辞書
`WebTransportSendStreamOptions$I は、[ `createUnidirectionalStream()$mT / `createBidirectionalStream()$mT ]により作成された `WebTransportSendStream$I — 以下 %~stream と記す — がどう挙動するかに影響する~parameterたちが成す辞書である。 ◎ The WebTransportSendStreamOptions is a dictionary of parameters that affect how WebTransportSendStreams created by createUnidirectionalStream and createBidirectionalStream behave.
dictionary `WebTransportSendStreamOptions@I { `WebTransportSendGroup$I? `sendGroup$mb = null; `long long$ `sendOrder$mb = 0; `boolean$ `waitUntilAvailable$mb = false; };
この辞書が有する~memberは: ◎ The dictionary SHALL have the following attributes:
- `sendGroup@mb ◎ sendGroup, of type WebTransportSendGroup, nullable, defaulting to null
- ~NULL (既定)/ ある `WebTransportSendGroup$I ◎ ↓
- ~NULL でない場合、 %~stream は,それが表現する`送信-~group$に属する。 ◎ An optional WebTransportSendGroup to group this WebTransportSendStream under, or null.
- `sendOrder@mb ◎ sendOrder, of type long long, defaulting to 0
- %~stream に与える送信-順序~番号(既定は 0 ) ◎ A send order number that,\
-
各 `WebTransportSendStream$I のうち:
- 送信-順序~番号が供されたものは、 `厳密な順序付け@ に関与するようになり【!opts】、 それらに~queueされた~byte列は, 送信-順序~番号が高いものほど先に送信されることになる。
- 送信-順序~番号が供されないものは、[ それと他の `WebTransportSendStream$I ]から~UAが送信する~byte列どうしの相対的な送信-順序は`実装定義$になる。
【 `sendOrder$mb の既定~値は,更新により ~NULL から 0 に改められたため、 上の条件が明示的に 0 を供した場合と省略した場合を区別するのかどうか不明瞭になっている。 】
◎ if provided, opts the created WebTransportSendStream in to participating in strict ordering. Bytes currently queued on strictly ordered WebTransportSendStreams will be sent ahead of bytes currently queued on other strictly ordered WebTransportSendStreams created with lower send order numbers. ◎ If no send order number is provided, then the order in which the user agent sends bytes from it relative to other WebTransportSendStreams is implementation-defined.\ - しかしながら,~UAには、 すべての~streamのうち[ より低い送信-順序~番号により後回されないもの ]の間で帯域幅を公平に分合うことが強く奨励される。 ◎ User agents are strongly encouraged however to divide bandwidth fairly between all streams that aren’t starved by lower send order numbers.
- 注記: これは、 送信者~側における~dataの優先度化であり, 受信される順序を保証するものではない。 ◎ Note: This is sender-side data prioritization which does not guarantee reception order.
- `waitUntilAvailable@mb ◎ waitUntilAvailable, of type boolean, defaulting to false
-
[ `createUnidirectionalStream()$mT / `createBidirectionalStream()$mT ]~callにより返される~promiseは、 この~memberの値に応じて:
- ~T の場合 ⇒ `下層~接続$が次に挙げる いずれかの状態に達しない限り,`決着しない@~ECMA262#sec-promise-objects$ことになる ⇒# ~streamを作成するために足る~flow制御~creditを有する/ 更なる流出~streamを作成することはアリでない
- ~F の場合 ⇒ ~callした時点で可用な~flow制御~窓が無い場合には、 `却下される@~ECMA262#sec-promise-objects$ことになる。 ◎ If true, the promise returned by the createUnidirectionalStream or createBidirectionalStream call will not be settled until either the underlying connection has sufficient flow control credit to create the stream, or the connection reaches a state in which no further outgoing streams are possible. If false, the promise will be rejected if no flow control window is available at the time of the call.
5.12. `WebTransportConnectionStats^I 辞書
`WebTransportConnectionStats$I 辞書は、 `~WebTransport~session$の`下層~接続$についての~WebTransportに特有な統計を含む。 ◎ The WebTransportConnectionStats dictionary includes information on WebTransport-specific stats about the WebTransport session's underlying connection.
注記: ~pool法が利用されるとき,同じ`接続$に~poolされた複数の`~WebTransport~session$は、 すべて同じ情報を受信する — すなわち、 当の情報は、[ ~poolされた`~WebTransport~session$たちのうち,同じ`~network区分~key$を保持しているもの ]にまたがって開示される。 ◎ Note: When pooling is used, multiple WebTransport sessions pooled on the same connection all receive the same information, i.e. the information is disclosed across pooled sessions holding the same network partition key.
注記: 各種~統計のうち可用でないものは、 `WebTransportConnectionStats$I 辞書~内には`包含され@~INFRA#map-exists$ない。 ◎ Note: Any unavailable stats will be absent from the WebTransportConnectionStats dictionary.
dictionary `WebTransportConnectionStats@I { `unsigned long long$ `bytesSent$mb = 0; `unsigned long long$ `packetsSent$mb = 0; `unsigned long long$ `bytesLost$mb = 0; `unsigned long long$ `packetsLost$mb = 0; `unsigned long long$ `bytesReceived$mb = 0; `unsigned long long$ `packetsReceived$mb = 0; required `DOMHighResTimeStamp$ `smoothedRtt$mb; required `DOMHighResTimeStamp$ `rttVariation$mb; required `DOMHighResTimeStamp$ `minRtt$mb; required `WebTransportDatagramStats$I `datagrams$mb; required `unsigned long long$? `estimatedSendRate$mb = null; `boolean$ `atSendCapacity$mb = false; };
この辞書が有する~memberは: ◎ The dictionary SHALL have the following attributes:
- `bytesSent@mb ◎ bytesSent, of type unsigned long long, defaulting to 0
- 当の`下層~接続$上に送信された~byteたちの個数 — 再-伝送も含むが,[ ~UDPその他の外縁~frame法 ]は含まない。 ◎ The number of bytes sent on the underlying connection, including retransmissions. Does not include UDP or any other outer framing.
- `packetsSent@mb ◎ packetsSent, of type unsigned long long, defaulting to 0
- 当の`下層~接続$上に送信された~packetの個数 — 喪失したものと決定されたものも含む。 ◎ The number of packets sent on the underlying connection, including those that are determined to have been lost.
- `bytesLost@mb ◎ bytesLost, of type unsigned long long, defaulting to 0
- 当の`下層~接続$上で喪失した~byteたちの個数 (単調増加しない — 喪失したものと宣言された~packetは,後続に受信され得るので) — 再-伝送も含むが,[ ~UDPその他の外縁~frame法 ]は含まない。 ◎ The number of bytes lost on the underlying connection (does not monotonically increase, because packets that are declared lost can subsequently be received). Does not include UDP or any other outer framing.
- `packetsLost@mb ◎ packetsLost, of type unsigned long long, defaulting to 0
- 当の`下層~接続$上で喪失した~packetの個数 (単調増加しない — 喪失したものと宣言された~packetは,後続に受信され得るので)。 ◎ The number of packets lost on the underlying connection (does not monotonically increase, because packets that are declared lost can subsequently be received).
- `bytesReceived@mb ◎ bytesReceived, of type unsigned long long, defaulting to 0
- 当の`下層~接続$上で受信された総-~byte数 — [ 各~stream用に重複した~data ]も含むが,[ ~UDPその他の外縁~frame法 ]は含まない。 ◎ The number of total bytes received on the underlying connection, including duplicate data for streams. Does not include UDP or any other outer framing.
- `packetsReceived@mb ◎ packetsReceived, of type unsigned long long
- 当の`下層~接続$上で受信された総-~packet数 — 処理-可能でなかった~packetも含む。 ◎ The number of total packets received on the underlying connection, including packets that were not processable.
- `smoothedRtt@mb ◎ smoothedRtt, of type DOMHighResTimeStamp
- 当の接続~上で現在に観測された `smoothed^en 往復-時間【 `smoothed_rtt^c 】 — `RFC9002$r `§ 5.3@~RFCx/rfc9002#section-5.3$ にて定義されるとおり。 ◎ The smoothed round-trip time (RTT) currently observed on the connection, as defined in [RFC9002] Section 5.3.
- `rttVariation@mb ◎ rttVariation, of type DOMHighResTimeStamp
- 接続~上で現在に観測された[ 往復-時間 標本 ]たちの平均~変動【 `rttvar^c 】 — `RFC9002$r `§ 5.3@~RFCx/rfc9002#section-5.3$ にて定義されるとおり。 ◎ The mean variation in round-trip time samples currently observed on the connection, as defined in [RFC9002] Section 5.3.
- `minRtt@mb ◎ minRtt, of type DOMHighResTimeStamp
- 接続~全体~上で観測された最小な往復-時間。 【 `min_rtt^c — `RFC9002$r `§ 5.2@~RFCx/rfc9002#section-5.2$】 ◎ The minimum round-trip time observed on the entire connection.
- `estimatedSendRate@mb ◎ estimatedSendRate, of type unsigned long long, nullable, defaulting to null
- [ ~UAが~queueされた~dataを送信することになる~rate ]として見積もられた毎秒あたりの~bit数。 この~rateは、 `~WebTransport~session$を共有するすべての[ ~stream, ~datagram ]に適用され, 輻輳~制御~algo ( `congestionControl$mT により選ばれるそれにもなり得る) により計算される。 ~UAが現在の見積もりを有さない場合、 この~memberの値は, ~NULL にするモノトスル。 この~memberは、 以前の結果では ~NULL でなかった場合でも, ~NULL になり得る。 ◎ The estimated rate at which queued data will be sent by the user agent, in bits per second. This rate applies to all streams and datagrams that share a WebTransport session and is calculated by the congestion control algorithm (potentially chosen by congestionControl). If the user agent does not currently have an estimate, the member MUST be the null value. The member can be null even if it was not null in previous results.
- `atSendCapacity@mb ◎ atSendCapacity, of type boolean, defaulting to false
- 値 ~F は、 `estimatedSendRate$mb は,応用により制限された — すなわち、 当の応用が送信している~dataは,輻輳~制御器が許容するよりも有意に少ない — かもしれないことを指示する。 その間は、[ 輻輳~制御器は,可用な~network容量として拙い見積もりを生産する ]かもしれない。 ◎ A value of false indicates the estimatedSendRate might be application limited, meaning the application is sending significantly less data than the congestion controller allows. A congestion controller might produce a poor estimate of the available network capacity while it is application limited.
- 値 ~T は、[ 当の応用は,~dataを~network容量ぎりぎりまで送信している ]ので[ `estimatedSendRate$mb は,応用に可用な~network容量を反映する ]ことを指示する。 ◎ A value of true indicates the application is sending data at network capacity, and the estimatedSendRate reflects the network capacity available to the application.
- 注記: `estimatedSendRate$mb は、 `atSendCapacity$mb が ~T をとる間は[ 応用の送信-~rateが支続される限り,~network条件に順応するよう天井を反映する ]ことになる — しかしながら、 その間でも ~NULL になることは許容される。 ◎ When atSendCapacity is true, the estimatedSendRate reflects a ceiling. As long as the application send rate is sustained, the estimatedSendRate will adapt to network conditions. However, estimatedSendRate is allowed to be null while atSendCapacity is true.
- `datagrams@mb ◎
- 【 この~memberについては、 原文には何も述べられていない。 】
5.13. `WebTransportDatagramStats^I 辞書
`WebTransportDatagramStats$I 辞書は、 `下層~接続$越しの~datagram伝送~上の統計を含む。 ◎ The WebTransportDatagramStats dictionary includes statistics on datagram transmission over the underlying connection.
dictionary `WebTransportDatagramStats@I { `unsigned long long$ `droppedIncoming$mbD = 0; `unsigned long long$ `expiredIncoming$mbD = 0; `unsigned long long$ `expiredOutgoing$mbD = 0; `unsigned long long$ `lostOutgoing$mbD = 0; };
この辞書が有する~memberは: ◎ The dictionary SHALL have the following attributes:
- `droppedIncoming@mbD ◎ droppedIncoming, of type unsigned long long, defaulting to 0
- 流入~datagramのうち,次に該当するものの個数 ⇒ 応用が `datagrams$mT の `readable$mD から読取る前に受信-~queueを~overflowしたことに因り,落とされた ◎ The number of incoming datagrams that were dropped due to the application not reading from datagrams' readable before new datagrams overflow the receive queue.
- `expiredIncoming@mbD ◎ expiredIncoming, of type unsigned long long, defaulting to 0
- 流入~datagramのうち,次に該当するものの個数 ⇒ `incomingMaxAge$mD より旧くなったことに因り, 応用が `datagrams$mT の `readable$mD から読取る前に落とされた ◎ The number of incoming datagrams that were dropped due to being older than incomingMaxAge before they were read from datagrams' readable.
- `expiredOutgoing@mbD ◎ expiredOutgoing, of type unsigned long long, defaulting to 0
- 送信~用に~queueされた~datagramのうち,次に該当するものの個数 ⇒ `outgoingMaxAge$mD より旧くなったことに因り,送信-可能になる前に落とされた ◎ The number of datagrams queued for sending that were dropped due to being older than outgoingMaxAge before they were able to be sent.
- `lostOutgoing@mbD ◎ lostOutgoing, of type unsigned long long, defaulting to 0
- 送信した~datagramのうち,次に該当するものの個数 ⇒ `RFC9002$r `§ 6.1@~RFCx/rfc9002#section-6.1$ にて定義されるおり, 喪失したものと宣言された ◎ The number of sent datagrams that were declared lost, as defined in [RFC9002] Section 6.1.
6. `WebTransportSendStream^I ~interface
`WebTransportSendStream$I は、 次のような `WritableStream$I である: ◎ ↓
- [ `流出~一方向$/`双方向$ ]な`~WebTransport~stream$を伴う,流出~stream用の特能を供する。 ◎ A WebTransportSendStream is a WritableStream providing outgoing streaming features with an outgoing unidirectional or bidirectional WebTransport stream.
- `Uint8Array$I を書込んで,~serverへ~dataを送信できる。 ◎ It is a WritableStream of Uint8Array that can be written to, to send data to the server.
[`Exposed$=(Window,Worker), `SecureContext$, `Transferable$] interface `WebTransportSendStream@I : `WritableStream$I { attribute `WebTransportSendGroup$I? `sendGroup$mS; attribute `long long$? `sendOrder$mS; `Promise$<`WebTransportSendStreamStats$I> `getStats$mS(); `WebTransportWriter$I `getWriter$mS(); };
`WebTransportSendStream$I は、 常に,`作成する$wtS手続-により作成される。 ◎ A WebTransportSendStream is always created by the create procedure.
`WebTransportSendStream$I の[ `転送-手続き$, `転送-受信-時の手続き$ ]は、 `WritableStream$I の`それら@~STREAMS#ws-transfer$に従う。 ◎ The WebTransportSendStream's transfer steps and transfer-receiving steps are those of WritableStream.
6.1. 属性
- `sendGroup@mS ◎ sendGroup, of type WebTransportSendGroup, nullable
- 取得子~手続きは ⇒ ~RET コレの `SendGroup$slS ◎ The getter steps are: • Return this's [[SendGroup]].
-
設定子~手続きは、 `所与の値$ %値 に対し: ◎ The setter steps, given value, are:
- ~IF[ %値 ~NEQ ~NULL ]~AND[ %値 . `Transport$slG ~NEQ コレ . `Transport$slS ] ⇒ ~THROW `InvalidStateError$E ◎ If value is non-null, and value.[[Transport]] is not this.[[Transport]], throw an InvalidStateError.
- コレ . `SendGroup$slS ~SET %値 ◎ Set this.[[SendGroup]] to value.
- `sendOrder@mS ◎ sendOrder, of type long long, nullable
- 取得子~手続きは ⇒ ~RET コレ . `SendOrder$slS ◎ The getter steps are: • Return this's [[SendOrder]].
- 設定子~手続きは、 `所与の値$ %値 に対し ⇒ コレ . `SendOrder$slS ~SET %値 ◎ The setter steps, given value, are: • Set this.[[SendOrder]] to value.
6.2. ~method
- `getStats()@mS ◎ getStats()
- この `WebTransportSendStream$I の処理能に特有な統計を集めて, その結果を非同期的に報告する。 ◎ Gathers stats specific to this WebTransportSendStream's performance, and reports the result asynchronously.
-
~method手続きは: ◎ When getStats is called, the user agent MUST run the following steps:
- %~promise ~LET `新たな~promise$ ◎ Let p be a new promise.
-
この段は`並列的$に走らす: ◎ Run the following steps in parallel:
- コレ【!この `WebTransportSendStream$I】に特有な統計を集める ◎ Gather the stats specific to this WebTransportSendStream.
-
`~network~taskを~queueする$( %~transport, 次の手続き ) ◎ Queue a network task with transport to\
手続きは: ◎ run the following steps:
- %統計 ~LET `新たな$ `WebTransportSendStreamStats$I ~obj ◎ Let stats be a new WebTransportSendStreamStats object\
- %統計 の各~memberを集められた統計を表現するよう設定する ◎ representing the gathered stats.
- `~promiseを解決する$( %~promise, %統計 ) ◎ Resolve p with stats.
- ~RET %~promise ◎ Return p.
- `getWriter()@mS
- この~methodは、 `WritableStream$I から継承した `getWriter()$ws と同じ方式で実装するモノトスル — ただし、 `WritableStreamDefaultWriter$I を作成する所では, 代わりに `WebTransportWriter$I を`作成する$TWモノトスル。 ◎ This method must be implemented in the same manner as getWriter inherited from WritableStream, except in place of creating a WritableStreamDefaultWriter, it must instead create a WebTransportWriter with this.
6.3. 内部~slot
各 `WebTransportSendStream$I は、 次に挙げる内部~slotを有する — 各項に与える記述は規範的ではない: ◎ A WebTransportSendStream has the following internal slots. ◎ Internal Slot|Description (non-normative)
- `InternalStream@slS
- [ `流出~一方向$/`双方向$ ]な`~WebTransport~stream$ ◎ An outgoing unidirectional or bidirectional WebTransport stream.
- `PendingOperation@slS
- ~NULL / 処理待ちな[ 書込n/~close ]演算を表現している~promise ◎ A promise representing a pending write or close operation, or null.
- `Transport@slS
- この `WebTransportSendStream$I を所有する `WebTransport$I ◎ A WebTransport which owns this WebTransportSendStream.
- `SendGroup@slS
- ~NULL (既定)/ ある `WebTransportSendGroup$I ◎ An optional WebTransportSendGroup, or null.
- `SendOrder@slS
- 送信-順序~番号 (既定は 0 ) ◎ An optional send order number, defaulting to 0.
- `AtomicWriteRequests@slS
- ~promiseたちが成す`有順序~集合$ — これは、[ `下層~sink$が処理するものとして~queueされた書込n要請のうち,不可分( `atomic^en )なもの ]たちが成す下位集合を追跡し続ける。 ◎ An ordered set of promises, keeping track of the subset of write requests that are atomic among those queued to be processed by the underlying sink.
6.4. 手続-
`WebTransportSendStream$I を `作成する@wtS ときは、 所与の ( [ `流出~一方向$/`双方向$ ]な`~WebTransport~stream$ %内部~stream, `WebTransport$I %~transport, %送信-~group, %送信-順序 ) に対し,次の手続きを走らす: ◎ To create a WebTransportSendStream, with an outgoing unidirectional or bidirectional WebTransport stream internalStream, a WebTransport transport, sendGroup, and a sendOrder, run these steps:
- %~stream ~LET `新たな$ `WebTransportSendStream$I — その ⇒# `InternalStream$slS ~SET %内部~stream, `PendingOperation$slS ~SET ~NULL, `Transport$slS ~SET %~transport, `SendGroup$slS ~SET %送信-~group, `SendOrder$slS ~SET %送信-順序, `AtomicWriteRequests$slS ~SET ~promiseたちが成す新たな`有順序~集合$ ◎ Let stream be a new WebTransportSendStream, with: • [[InternalStream]] •• internalStream • [[PendingOperation]] •• null • [[Transport]] •• transport • [[SendGroup]] •• sendGroup • [[SendOrder]] •• sendOrder • [[AtomicWriteRequests]] •• An empty ordered set of promises.
-
%~stream を`設定しておく$WS — 次を与える下で:
- `書込n~algo^i ~SET 所与の ( %~chunk ) に対し,次を走らす動作 ⇒ %~stream に`書込む$wtS( %~chunk )
- `~close~algo^i ~SET 次を走らす動作 ⇒ %~stream を`~closeする$wtS()
- `中止-~algo^i ~SET 所与の ( %事由 ) に対し,次を走らす動作 ⇒ %~stream を`中止する$wtS( %事由 )
- %中止-通達 ~LET %~stream . `controller^sl . `abortController^sl . `signal^sl ◎ Let abortSignal be stream’s [[controller]].[[abortController]].[[signal]].
-
`通達に~algoを追加する$( %中止-通達, 次の手続き ) ◎ Add the following steps to abortSignal. Add the following steps to stream’s [[controller]]'s [[signal]].
手続きは: ◎ ↑
- %処理待ち演算 ~LET %~stream . `PendingOperation$slS ◎ Let pendingOperation be stream.[[PendingOperation]].
- ~IF[ %処理待ち演算 ~EQ ~NULL ] ⇒ ~RET ◎ If pendingOperation is null, then abort these steps.
- %~stream . `PendingOperation$slS ~SET ~NULL ◎ Set stream.[[PendingOperation]] to null.
- %事由 ~LET %中止-通達 の`中止-事由$aB ◎ Let reason be abortSignal’s abort reason.
- %~promise ~LET %~stream を`中止する$wtS( %事由 ) ◎ Let promise be the result of aborting stream with reason.
- %~promise の`充足-時$には ⇒ `~promiseを却下する$( %処理待ち演算, %事由 ) ◎ Upon fulfillment of promise, reject pendingOperation with reason.
- %~transport . `SendStreams$sl に %~stream を`付加する$set ◎ Append stream to transport.[[SendStreams]].
- ~RET %~stream ◎ Return stream.
`WebTransportSendStream$I %~stream に `書込む@wtS ときは、 所与の ( %~chunk ) に対し,次の手続きを走らす: ◎ To write chunk to a WebTransportSendStream stream, run these steps:
- %~transport ~LET %~stream . `Transport$slS ◎ Let transport be stream.[[Transport]].
- ~IF[ %~chunk は `BufferSource$I でない ] ⇒ ~RET `却下される~promise$( `TypeError$E ) ◎ If chunk is not a BufferSource, return a promise rejected with a TypeError.
- %~promise ~LET `新たな~promise$ ◎ Let promise be a new promise.
- %~byte列 ~LET %~chunk に`保持された~byte列の複製を取得する$ ◎ Let bytes be a copy of the byte sequence which chunk represents.
- %~stream . `PendingOperation$slS ~SET %~promise ◎ Set stream.[[PendingOperation]] to promise.
- %~in-flight書込n要請 ~LET %~stream . `inFlightWriteRequest$wS ◎ Let inFlightWriteRequest be stream.inFlightWriteRequest.
- %不可分か ~LET ~IS[ %~in-flight書込n要請 ~IN %~stream 【!`~stream$bd】 . `AtomicWriteRequests$slS ] ◎ Let atomic be true if stream.[[AtomicWriteRequests]] contains inFlightWriteRequest, otherwise false.
-
この段は`並列的$に走らす: ◎ Run the following steps in parallel:
-
~IF[ %不可分か ~EQ ~T ]~AND[ 現在の~flow制御~窓は %~byte列 全体を送信するには小さ過ぎる ]:
-
`~network~taskを~queueする$( %~transport, 次の手続き )
手続きは:
- %~stream . `PendingOperation$slS ~SET ~NULL
- %~stream 上の`すべての不可分な書込n要請を中止する$wtS()
- ~RET
-
- %~stream . `InternalStream$slS に %~byte列 を`送信する$WT ◎ Otherwise, send bytes on stream.[[InternalStream]] and\
-
前~段の演算が完了するまで待機する — この送信は: ◎ wait for the operation to complete.\
- この時点ですでに~queueされたかどうかを問わず, この~transport越しに送信されることになる[ ~stream, ~datagram ]の送信と前後してもヨイ。 これらの送信においては、 ~streamよりも~datagramに高い優先度を — ただし,~streamの送信を後回しない所まで — 与えるベキである。 【!課題#451】 ◎ This sending MAY be interleaved with sending of previously queued streams and datagrams, as well as streams and datagrams yet to be queued to be sent over this transport. Datagrams SHOULD be given priority over this sending, but not to the point of starving it.
- ~UAは、 転送~処理能を改善するために~bufferしてもヨイ。 背圧~情報を `WebTransportSendStream$I の利用元へ運ぶため、 そのような~buffer【の~size】には固定的な上限があるベキである。 ◎ The user-agent MAY have a buffer to improve the transfer performance. Such a buffer SHOULD have a fixed upper limit, to carry the backpressure information to the user of the WebTransportSendStream.
-
[ ~AND↓ を満たす各 `WebTransportSendStream$I %送信-~stream ]上に送信するために~queueされたすべての~byteが送信されるまでは,後回するモノトスル: ◎ This sending MUST starve until all bytes queued for sending on WebTransportSendStreams with\
- %送信-~stream . `SendGroup$slS ~EQ %~stream . `SendGroup$slS ◎ the same [[SendGroup]] and\
- %送信-~stream . `SendOrder$slS ~GT %~stream . `SendOrder$slS ◎ a higher [[SendOrder]],\
- ~NOT↓ ⇒ [ `~error@~STREAMS#writablestream-error$WSした ]~OR[ `~flow制御$により阻まれた ] ◎ that are neither errored nor blocked by flow control, have been sent.
ここでは、 %~stream . `SendOrder$slS に対し`並列的$に~accessする。 ~UAは、 送信している間,この値の~liveな更新に応答するベキである — その詳細は、 `実装定義$であるが。 ◎ We access stream.[[SendOrder]] in parallel here. User agents SHOULD respond to live updates of these values during sending, though the details are implementation-defined.
注記: 再-伝送の順序付けは,`実装定義$であるが、 ~UAには,~dataの再-伝送を[ `SendOrder$slS 値が高いものほど優先する ]ことが強く奨励される。 ◎ Note: Ordering of retransmissions is implementation-defined, but user agents are strongly encouraged to prioritize retransmissions of data with higher [[SendOrder]] values.
- 前項により後回されるもの,および`~flow制御$の[ 事由/`~error@~STREAMS#writablestream-error$WS ]を除き、 後回しないモノトスル。 ◎ This sending MUST NOT starve otherwise, except for flow control reasons or error.
-
~UAは、[ 後回されていない~stream ]たちすべての間で,帯域幅を公平に分合うベキである。 ◎ The user agent SHOULD divide bandwidth fairly between all streams that aren’t starved.
注記: ここでの公平さを成す定義は、 `実装定義$である。 ◎ Note: The definition of fairness here is implementation-defined.
-
~IF[ 前~段は~network~errorに因り失敗した ] ⇒ ~RET ◎ If the previous step failed due to a network error, abort the remaining steps.
注記: ここでは %~promise を却下しない — ~network~errorは他所で取扱われ、 そこでの手続きが %~stream . `PendingOperation$slS を却下するので。 ◎ Note: We don’t reject promise here because we handle network errors elsewhere, and those steps reject stream.[[PendingOperation]].
-
`~network~taskを~queueする$( %~transport, 次の手続き ) ◎ Otherwise, queue a network task with transport to\
手続きは: ◎ run these steps:
- %~stream . `PendingOperation$slS ~SET ~NULL ◎ Set stream.[[PendingOperation]] to null.
- ~IF[ %~in-flight書込n要請 ~IN %~stream . `AtomicWriteRequests$slS ] ⇒ %~in-flight書込n要請 を`除去する$ ◎ If stream.[[AtomicWriteRequests]] contains inFlightWriteRequest, remove inFlightWriteRequest.
- `~promiseを解決する$( %~promise ) ◎ Resolve promise with undefined.
-
- ~RET %~promise ◎ Return promise.
注記: この~algo(あるいは `write()$dw )から返された~promiseが`充足されても@~ECMA262#sec-promise-objects$, ~chunkが~serverにより `ack^en されるとは限らない `QUIC$r — ~chunkが~bufferに付加されたことしか意味しないこともある。 当の~chunkが~serverに必ず到着するようにするためには、 ~serverは,応用~levelの承認( `acknowledgment^en )~messageを送信する必要がある。 ◎ Note: The fulfillment of the promise returned from this algorithm (or, write(chunk)) does NOT necessarily mean that the chunk is acked by the server [QUIC]. It may just mean that the chunk is appended to the buffer. To make sure that the chunk arrives at the server, the server needs to send an application-level acknowledgment message.
`WebTransportSendStream$I %~stream を `~closeする@wtS ときは、 次の手続きを走らす: ◎ To close a WebTransportSendStream stream, run these steps:
- %~transport ~LET %~stream . `Transport$slS ◎ Let transport be stream.[[Transport]].
- %~promise ~LET `新たな~promise$ ◎ Let promise be a new promise.
- %~transport . `SendStreams$sl から %~stream を`除去する$ ◎ Remove stream from transport.[[SendStreams]].
- %~stream . `PendingOperation$slS ~SET %~promise ◎ Set stream.[[PendingOperation]] to promise.
-
この段は`並列的$に走らす: ◎ Run the following steps in parallel:
- %~stream . `InternalStream$slS に~FINを`送信する$WT ◎ Send FIN on stream.[[InternalStream]] and\
- 前~段の演算が完了するまで待機する ◎ wait for the operation to complete.
- %~stream . `InternalStream$slS が `Data Recvd^i 状態に入るまで待機する `QUIC$r ◎ Wait for stream.[[InternalStream]] to enter the "Data Recvd" state. [QUIC]
-
`~network~taskを~queueする$( %~transport, 次の手続き ) ◎ Queue a network task with transport to\
手続きは: ◎ run these steps:
- %~stream . `PendingOperation$slS ~SET ~NULL ◎ Set stream.[[PendingOperation]] to null.
- `~promiseを解決する$( %~promise ) ◎ Resolve promise with undefined.
- ~RET %~promise ◎ Return promise.
`WebTransportSendStream$I %~stream を `中止する@wtS ときは、 所与の ( %事由 ) に対し,次の手続きを走らす: ◎ To abort a WebTransportSendStream stream with reason, run these steps:
- %~transport ~LET %~stream . `Transport$slS ◎ Let transport be stream.[[Transport]].
- %~promise ~LET `新たな~promise$ ◎ Let promise be a new promise.
- %~code ~LET 0 ◎ Let code be 0.
- %~transport . `SendStreams$sl から %~stream を`除去する$ ◎ Remove stream from transport.[[SendStreams]].
- ~IF[ %事由 は `WebTransportError$I である ]~AND[ %事由 . `StreamErrorCode$sl ~NEQ ~NULL ] ⇒ %~code ~SET %事由 . `StreamErrorCode$sl ◎ If reason is a WebTransportError and reason.[[StreamErrorCode]] is not null, then set code to reason.[[StreamErrorCode]].
- ~IF[ %~code ~LT 0 ] ⇒ %~code ~SET 0 ◎ If code < 0, then set code to 0.
-
~IF[ %~code ~GT 4294967295 ] ⇒ %~code ~SET 4294967295 ◎ If code > 4294967295, then set code to 4294967295.
注記: %~code 用の妥当な値は、 0 以上 4294967295 以下である。 `下層~接続$が~HTTP3を利用している場合、 `WEB-TRANSPORT-HTTP3$r にて述べられる【!decribe】とおり, ~codeは整数 ~IN { 0x52e4a40fa8db 〜 0x52e5ac983162 } に符号化されることになる。 ◎ Note: Valid values of code are from 0 to 4294967295 inclusive. If the underlying connection is using HTTP/3, the code will be encoded to a number in [0x52e4a40fa8db, 0x52e5ac983162] as decribed in [WEB-TRANSPORT-HTTP3].
-
この段は`並列的$に走らす: ◎ Run the following steps in parallel:
- %~stream . `InternalStream$slS を`設定し直す$WT( %~code ) ◎ Reset stream.[[InternalStream]] with code.
-
`~network~taskを~queueする$( %~transport, 次の手続き ) ◎ Queue a network task with transport to\
手続きは ⇒ `~promiseを解決する$( %~promise ) ◎ resolve promise with undefined.
- ~RET %~promise ◎ Return promise.
`WebTransportSendStream$I %~stream 上の `すべての不可分な書込n要請を中止する@wtS ときは、 次の手続きを走らす: ◎ To abort all atomic write requests on a WebTransportSendStream stream, run these steps:
- %書込n要請~群 ~LET %~stream . `writeRequests$wS ◎ Let writeRequests be stream.writeRequests.
- %中止する要請~群 ~LET %~stream【!`~stream$bd】 . `AtomicWriteRequests$slS ◎ Let requestsToAbort be stream.[[AtomicWriteRequests]].
- %書込n要請~群 を成す ~EACH( %~promise ) に対し ⇒ ~IF[ %~promise ~NIN %中止する要請~群 ] ⇒ %~stream を`~errorにする$WS( `AbortError$E 例外 ); ~RET ◎ If writeRequests contains a promise not in requestsToAbort, then error stream with AbortError, and abort these steps.
- %~stream【!`~stream$bd】 . `AtomicWriteRequests$slS を`空にする$ ◎ Empty stream.[[AtomicWriteRequests]].
- %中止する要請~群 を成す ~EACH( %~promise ) に対し ⇒ `~promiseを却下する$( %~promise, `AbortError$E 例外 ) ◎ For each promise in requestsToAbort, reject promise with AbortError.
- この段は`並列的$に走らす ⇒ %中止する要請~群 を成す ~EACH( %~promise ) に対し ⇒ 次を中止する ⇒ %~stream に[ %~promise に結付けられた~byte列 ]を`送信する$WT ◎ In parallel, for each promise in requestsToAbort, abort the sending of bytes associated with promise.
6.5. ~serverから来ている `STOP_SENDING^ft 通達
`WebTransportSendStream$I %~stream に結付けられた `~WebTransport~stream$が,~serverから `STOP_SENDING$ft ~frame %通達 を取得したときは、 次の手続きを走らす: ◎ Whenever a WebTransport stream associated with a WebTransportSendStream stream gets a STOP_SENDING signal from the server, run these steps:
- %~transport ~LET %~stream . `Transport$slS ◎ Let transport be stream.[[Transport]].
-
%~code ~LET %通達 に付された応用~protocol~error~code `QUIC$r ◎ Let code be the application protocol error code attached to the STOP_SENDING frame. [QUIC]
注記: %~code 用の妥当な値は、 0 以上 4294967295 以下である。 `下層~接続$が~HTTP3を利用している場合、 `WEB-TRANSPORT-HTTP3$r にて述べられる【!decribe】とおり, ~codeは整数 ~IN { 0x52e4a40fa8db 〜 0x52e5ac983162 } に符号化されることになる。 ◎ Note: Valid values of code are from 0 to 4294967295 inclusive. If the underlying connection is using HTTP/3, the code will be encoded to a number in [0x52e4a40fa8db, 0x52e5ac983162] as decribed in [WEB-TRANSPORT-HTTP3].
-
`~network~taskを~queueする$( %~transport, 次の手続き ) ◎ Queue a network task with transport to\
手続きは: ◎ run these steps:
- ~IF[ %~transport . `State$sl ~IN { `closed^l, `failed^l } ] ⇒ ~RET ◎ If transport.[[State]] is "closed" or "failed", abort these steps.
- %~transport . `SendStreams$sl から %~stream を`除去する$ ◎ Remove stream from transport.[[SendStreams]].
- %~error ~LET `~WebTransport用の例外を作成する$( `stream^l, %~code ) ◎ Let error be a newly created WebTransportError whose source is "stream" and streamErrorCode is code.
- ~IF[ %~stream . `PendingOperation$slS ~NEQ ~NULL ] ⇒ `~promiseを却下する$( %~stream . `PendingOperation$slS, %~error ) ◎ If stream.[[PendingOperation]] is not null, reject stream.[[PendingOperation]] with error.
- %~stream を`~errorにする$WS( %~error ) ◎ Error stream with error.
6.6. `WebTransportSendStreamStats^I 辞書
`WebTransportSendStreamStats$I 辞書は、 ある `WebTransportSendStream$I に特有な統計の情報を含む。 ◎ The WebTransportSendStreamStats dictionary includes information on stats specific to one WebTransportSendStream.
dictionary `WebTransportSendStreamStats@I { `unsigned long long$ `bytesWritten$mbS = 0; `unsigned long long$ `bytesSent$mbS = 0; `unsigned long long$ `bytesAcknowledged$mbS = 0; };
この辞書が有する~memberは: ◎ The dictionary SHALL have the following attributes:
- `bytesWritten@mbS ◎ bytesWritten, of type unsigned long long, defaulting to 0
- 当の応用が この `WebTransportSendStream$I に成功裡に書込んだ総~byte数。 この数は、 決して減少しない。 ◎ The total number of bytes the application has successfully written to this WebTransportSendStream. This number can only increase.
- `bytesSent@mbS ◎ bytesSent, of type unsigned long long, defaulting to 0
- 当の応用が この `WebTransportSendStream$I に書込んだ~byte列のうち, 何~byteが一回以上~送信されたかを指示する。 この数は、 決して減少しないことに加え, 常に `bytesWritten$mbS 以下になる。 ◎ An indicator of progress on how many of the application bytes written to this WebTransportSendStream has been sent at least once. This number can only increase, and is always less than or equal to bytesWritten.
- 注記: この進捗は、 単独の~streamに送信された応用~dataに限られ, ~network~overheadを含まない。 ◎ Note: this is progress of app data sent on a single stream only, and does not include any network overhead.
- `bytesAcknowledged@mbS ◎ bytesAcknowledged, of type unsigned long long, defaulting to 0
- 当の応用が この `WebTransportSendStream$I に書込んだ~byte列のうち, 何~byteが[ 送信され、 ~serverにより受信されるに伴い,~QUICの~ACK用の仕組みを利用して認知されたか ]を指示する。 数えられるのは、[ 認知されなかった最初の~byte ]の直前までに限られる。 この数は、 決して減少しないことに加え, 常に `bytesSent$mbS 以下になる。 ◎ An indicator of progress on how many of the application bytes written to this WebTransportSendStream have been sent and acknowledged as received by the server using QUIC’s ACK mechanism. Only sequential bytes up to, but not including, the first non-acknowledged byte, are counted. This number can only increase and is always less than or equal to bytesSent.
- 注記: この値は、 ~HTTP2越しの接続においては, `bytesSent$mbS に合致することになる。 ◎ Note: This value will match bytesSent when the connection is over HTTP/2.
7. ~interface `WebTransportSendGroup^I
`WebTransportSendGroup$I は、 任意選択な組織化用の~objであり, 多数の個々の(概して,`厳密に順序付けられた@#strict-ordering$) `WebTransportSendStream$I たちにわたる~dataの伝送を追跡する。 ◎ A WebTransportSendGroup is an optional organizational object that tracks transmission of data spread across many individual (typically strictly ordered) WebTransportSendStreams.
各 `WebTransportSendStream$I は、 その作成~時に,あるいは[ その `sendGroup$mS 設定子を通して,いつでも ],ある `WebTransportSendGroup$I が表現する `送信-~group@ に属するようにし得る。 既定では、 どの`送信-~group$にも `属さない@#ungrouped@ とする†。 ◎ WebTransportSendStreams can, at their creation or through assignment of their sendGroup attribute, be grouped under at most one WebTransportSendGroup at any time. By default, they are ungrouped.
【† そのような `WebTransportSendStream$I たちは、 次の段落に述べる目的においては, “匿名な送信-~group” に属するものとして扱うものと推定される。 】
~UAは、 各`送信-~group$を等しく考慮する下で, それらに属する `WebTransportSendStream$I の送信~用に帯域幅を割振る。 異なる`送信-~group$に属する `WebTransportSendStream$I どうしの `sendOrder$mb 番号は別々に評価される 【すなわち、互いの送信-順序には影響しない】。 ◎ The user agent considers WebTransportSendGroups as equals when allocating bandwidth for sending WebTransportSendStreams. Each WebTransportSendGroup also establishes a separate numberspace for evaluating sendOrder numbers.
[`Exposed$=(Window,Worker), `SecureContext$] interface `WebTransportSendGroup@I { `Promise$<`WebTransportSendStreamStats$I> `getStats$mG(); };
`WebTransportSendGroup$I は、 常に,`作成する$TSG 手続-により作成される。 ◎ A WebTransportSendGroup is always created by the create procedure.
7.1. ~method
- `getStats()@mG
- この`送信-~group$に属するすべての `WebTransportSendStream$I からの統計を集成して, その結果を非同期的に報告する。 ◎ Aggregates stats from all WebTransportSendStreams grouped under this sendGroup, and reports the result asynchronously.
-
~method手続きは: ◎ When getStats is called, the user agent MUST run the following steps:
- %p ~LET `新たな~promise$ ◎ Let p be a new promise.
- %~stream群 ~LET 次を満たす すべての `WebTransportSendStream$I たちが成す集合 ⇒ その `SendGroup$slS ~EQ コレ ◎ Let streams be all WebTransportSendStreams whose [[SendGroup]] is this.
-
この段は`並列的$に走らす: ◎ Run the following steps in parallel:
- %統計~data ~LET %~stream群 を成す すべての~streamから~stream統計を集めて集成された~data ◎ Gather stream statistics from all streams in streams.
-
`~network~taskを~queueする$( %~transport, 次の手続き ) ◎ Queue a network task with transport to\
手続きは: ◎ run the following steps:
- %統計 ~LET %統計~data を表現している`新たな$ `WebTransportSendStreamStats$I ~obj ◎ Let stats be a new WebTransportSendStreamStats object representing the aggregate numbers of the gathered stats.
- `~promiseを解決する$( %p, %統計 ) ◎ Resolve p with stats.
- ~RET %p ◎ Return p.
7.2. 内部~slot
各 `WebTransportSendGroup$I は、 次に挙げる内部~slotを有する — 各項に与える記述は規範的ではない: ◎ A WebTransportSendGroup has the following internal slots. ◎ Internal Slot|Description (non-normative)
- `Transport@slG
- この `WebTransportSendGroup$I を所有している `WebTransport$I ~obj ◎ [[Transport]] The WebTransport object owning this WebTransportSendGroup.
7.3. 手続-
`WebTransportSendGroup$I を `作成する@TSG ときは、 所与の ( `WebTransport$I %~transport ) に対し,次の手続きを走らす: ◎ To create a WebTransportSendGroup, with a WebTransport transport, run these steps:
- %送信-~group ~LET `新たな$ `WebTransportSendGroup$I — その ⇒# `Transport$slG ~SET %~transport ◎ Let sendGroup be a new WebTransportSendGroup, with: ◎ [[Transport]] • transport
- ~RET %送信-~group ◎ Return sendGroup.
8. `WebTransportReceiveStream^I ~interface
`WebTransportReceiveStream$I は、 次のような `ReadableStream$I である: ◎ ↓
- [ `流入~一方向$/`双方向$ ]な`~WebTransport~stream$を伴う流入~stream用の特能を供する。 ◎ A WebTransportReceiveStream is a ReadableStream providing incoming streaming features with an incoming unidirectional or bidirectional WebTransport stream.
- そこから `Uint8Array$I を読取って, ~serverから受信した~dataを消費できる。 ◎ It is a ReadableStream of Uint8Array that can be read from, to consume data received from the server.\
- `可読~byte~stream$でもある。 よって,それは、 `既定の読取器$のみならず, `~BYOB読取器$を利用することを消費器に許容する。 ◎ WebTransportReceiveStream is a readable byte stream, and hence it allows its consumers to use a BYOB reader as well as a default reader.
[`Exposed$=(Window,Worker), `SecureContext$, `Transferable$] interface `WebTransportReceiveStream@I : `ReadableStream$I { `Promise$<`WebTransportReceiveStreamStats$I> `getStats$mR(); };
`WebTransportReceiveStream$I は、 常に,それを`作成する$wtR手続-により作成される。 ◎ A WebTransportReceiveStream is always created by the create procedure.
`WebTransportReceiveStream$I の[ `転送-手続き$/`転送-受信-時の手続き$ ]は `ReadableStream$I の`それら@~STREAMS#rs-transfer$に従う。 ◎ The WebTransportReceiveStream's transfer steps and transfer-receiving steps are those of ReadableStream.
8.1. ~method
- `getStats()@mR ◎ getStats()
- この `WebTransportReceiveStream$I の処理能に特有な統計を集めて, その結果を非同期的に報告する。 ◎ Gathers stats specific to this WebTransportReceiveStream's performance, and reports the result asynchronously.
-
~method手続きは: ◎ When getStats is called, the user agent MUST run the following steps:
- %~promise ~LET `新たな~promise$ ◎ Let p be a new promise.
-
この段は`並列的$に走らす: ◎ Run the following steps in parallel:
- コレ【!この `WebTransportReceiveStream$I】に特有な統計を集める ◎ Gather the stats specific to this WebTransportReceiveStream.
- 前~段の統計が準備済みになるまで待機する ◎ Wait for the stats to be ready.
-
`~network~taskを~queueする$( %~transport, 次の手続き ) ◎ Queue a network task with transport to\
手続きは: ◎ run the following steps:
- %統計 ~LET `新たな$ `WebTransportReceiveStreamStats$I ~obj ◎ Let stats be a new WebTransportReceiveStreamStats object\
- %統計 の各~memberを集められた統計を表現するよう設定する ◎ representing the gathered stats.
- `~promiseを解決する$( %~promise, %統計 ) ◎ Resolve p with stats.
- ~RET %~promise ◎ Return p.
8.2. 内部~slot
各 `WebTransportReceiveStream$I は、 次に挙げる内部~slotを有する — 各項に与える記述は規範的ではない: ◎ A WebTransportReceiveStream has the following internal slots. ◎ Internal Slot|Description (non-normative)
- `InternalStream@slR
- [ `流入~一方向$/`双方向$ ]な`~WebTransport~stream$ ◎ An incoming unidirectional or bidirectional WebTransport stream.
- `Transport@slR
- この `WebTransportReceiveStream$I を所有している `WebTransport$I ~obj ◎ The WebTransport object owning this WebTransportReceiveStream.
8.3. 手続-
`WebTransportReceiveStream$I を `作成する@wtR ときは、 所与の ( [ `流入~一方向$/`双方向$ ]な`~WebTransport~stream$ %内部~stream, `WebTransport$I %~transport ) に対し,次の手続きを走らす: ◎ To create a WebTransportReceiveStream, with an incoming unidirectional or bidirectional WebTransport stream internalStream and a WebTransport transport, run these steps:
- %~stream ~LET `新たな$ `WebTransportReceiveStream$I — その ⇒# `InternalStream$slR ~SET %内部~stream, `Transport$slR ~SET %~transport ◎ Let stream be a new WebTransportReceiveStream, with: • [[InternalStream]] •• internalStream • [[Transport]] •• transport
-
%~stream を`~byte読取り~support付きで設定しておく$RS — 次を与える下で:
- `~pull~algo^i ~SET 次を走らす動作 ⇒ %~stream から`~byte列を~pullする$wtR
- `取消~algo^i ~SET 所与の ( %事由 ) に対し,次を走らす動作 ⇒ %~stream を`取消す$wtR( %事由 )
- %~transport . `ReceiveStreams$sl に %~stream を`付加する$set ◎ Append stream to transport.[[ReceiveStreams]].
- ~RET %~stream ◎ Return stream.
`WebTransportReceiveStream$I %~stream から `~byte列を~pullする@wtR ときは、 次の手続きを走らす: ◎ To pull bytes from a WebTransportReceiveStream stream, run these steps.
- %~transport ~LET %~stream . `Transport$slR ◎ Let transport be stream.[[Transport]].
- %内部~stream ~LET %~stream . `InternalStream$slR ◎ Let internalStream be stream.[[InternalStream]].
- %~promise ~LET `新たな~promise$ ◎ Let promise be a new promise.
- %~buffer ~LET ~NULL ◎ ↓
- %~offset ~LET ~NULL ◎ ↓
- %最大-~byte数 ~LET ~NULL ◎ Let buffer, offset, and maxBytes be null.
- %~view ~LET %~stream 用の`現在の~BYOB要請~view$RS ◎ ↓
-
~IF[ %~view ~NEQ ~NULL ]: ◎ If stream’s current BYOB request view for stream is not null:
- %~offset ~SET %~view . `ByteOffset^sl ◎ Set offset to stream’s current BYOB request view.[[ByteOffset]].
- %最大-~byte数 ~SET %~view の`~byte長さ$BS ◎ Set maxBytes to stream’s current BYOB request view's byte length.
- %~buffer ~SET %~view の`下層~buffer$BS ◎ Set buffer to stream’s current BYOB request view's underlying buffer.
-
~ELSE: ◎ Otherwise:
- %~offset ~SET 0 ◎ Set offset to 0.
- %最大-~byte数 ~SET `実装定義$な~size ◎ Set maxBytes to an implementation-defined size.
-
%~buffer ~SET `新たな$ `ArrayBuffer$I — ~size %最大-~byte数 の 【!`~buffer~sourceを~byte列から作成する$】
~IF[ `ArrayBuffer$I を割振ることに失敗した ] ⇒ ~RET `却下される~promise$( `RangeError$E )
◎ Set buffer be a new ArrayBuffer with maxBytes size. If allocating the ArrayBuffer fails, return a promise rejected with a RangeError.
-
この段は`並列的$に走らす: ◎ Run the following steps in parallel:
-
次を遂行する: ◎ ↓
- %内部~stream にて[ 1 個以上の~byteが読取られるか ~FIN が受信される ]まで待機する
- %~FINを受信したか ~LET ~IS[ 前~段にて ~FIN が受信された ]
- %~byte列 ~LET [ %内部~stream から %最大-~byte数 個までの~byteたち ]を読取った結果が成す~byte列
- `配列~bufferの中へ~byte列を書込む$( %~buffer, %~byte列, %~offset )
~UAは、 転送~処理能を改善するために~bufferしてもヨイ。 背圧~情報を~serverへ運ぶため、 そのような~buffer【の~size】には固定的な上限があるベキである。 ◎ The user-agent MAY have a buffer to improve the transfer performance. Such a buffer SHOULD have a fixed upper limit, to carry the backpressure information to the server.
注記: この演算は、 【 %~buffer を成す】すべての~byteたちが埋まる前に返ることもある。 ◎ Note: This operation may return before filling up all of bytes.
-
~IF[ 前~段は失敗した ] ⇒ ~RET ◎ If the previous step failed, abort the remaining steps.
注記: ここでは %~promise を却下しない — ~network~errorは他所で取扱われ、 そこでの手続きが %~stream を~errorにして, この~pullを待受けている読取n要請を却下するので。 ◎ Note: We don’t reject promise here because we handle network errors elsewhere, and those steps error stream, which rejects any read requests awaiting this pull.
-
`~network~taskを~queueする$( %~transport, 次の手続き ) ◎ Queue a network task with transport to\
手続きは: ◎ run these steps:
注記: %~buffer 【!the buffer described above】が, この手続-が走っている`~event~loop$aG内で可用である場合、 次の手続きは,即時に走れる/走らせてもヨイ。 ◎ Note: If the buffer described above is available in the event loop where this procedure is running, the following steps may run immediately.
- %長さ ~LET %~byte列 の`長さ$byte ◎ ↑
-
~IF[ %長さ ~GT 0 ]: ◎ If read > 0:
-
%~view ~SET 新たな `Uint8Array$I `with^en† %~buffer, %~offset, %長さ
【† %~buffer 内の[ %~offset から %長さ 個の~byteが成す~byte列 ]への~viewを表現している新たな `Uint8Array$I 】
◎ Set view to a new Uint8Array with buffer, offset and read. - %~stream の中へ`~chunkを~enqueueする$RS( %~view ) ◎ Enqueue view into stream.
-
-
~IF[ %~FINを受信したか ~EQ ~T ]: ◎ If hasReceivedFIN is true:
- %~transport . `ReceiveStreams$sl から %~stream を`除去する$ ◎ Remove stream from transport.[[ReceiveStreams]].
- %~stream を`~closeする$RS ◎ Close stream.
- `~promiseを解決する$( %~promise ) ◎ Resolve promise with undefined.
-
- ~RET %~promise ◎ Return promise.
`WebTransportReceiveStream$I %~stream を `取消す@wtR ときは、 所与の ( %事由 ) に対し, 次の手続きを走らす: ◎ To cancel a WebTransportReceiveStream stream with reason, run these steps.
- %~transport ~LET %~stream . `Transport$slR ◎ Let transport be stream.[[Transport]].
- %内部~stream ~LET %~stream . `InternalStream$slR ◎ Let internalStream be stream.[[InternalStream]].
- %~promise ~LET `新たな~promise$ ◎ Let promise be a new promise.
- %~code ~LET 0 ◎ Let code be 0.
- ~IF[ %事由 は `WebTransportError$I である ]~AND[ %事由 . `StreamErrorCode$sl ~NEQ ~NULL ] ⇒ %~code ~SET %事由 . `StreamErrorCode$sl ◎ If reason is a WebTransportError and reason.[[StreamErrorCode]] is not null, then set code to reason.[[StreamErrorCode]].
- ~IF[ %~code ~LT 0 ] ⇒ %~code ~SET 0 ◎ If code < 0, then set code to 0.
-
~IF[ %~code ~GT 4294967295 ] ⇒ %~code ~SET 4294967295 ◎ If code > 4294967295, then set code to 4294967295.
注記: %~code 用の妥当な値は、 0 以上 4294967295 以下である。 `下層~接続$が~HTTP3を利用している場合、 `WEB-TRANSPORT-HTTP3$r にて述べられる【!decribe】とおり, ~codeは整数 ~IN { 0x52e4a40fa8db 〜 0x52e5ac983162 } に符号化されることになる。 ◎ Note: Valid values of code are from 0 to 4294967295 inclusive. If the underlying connection is using HTTP/3, the code will be encoded to a number in [0x52e4a40fa8db, 0x52e5ac983162] as decribed in [WEB-TRANSPORT-HTTP3].
- %~transport . `SendStreams$sl から %~stream を`除去する$ ◎ Remove stream from transport.[[SendStreams]].
-
この段は`並列的$に走らす: ◎ Run the following steps in parallel:
- %内部~stream 上の`送信を停止させる$WT( %~code ) ◎ Send STOP_SENDING with internalStream and code.
-
`~network~taskを~queueする$( %~transport, 次の手続き ) ◎ Queue a network task with transport to\
手続きは: ◎ run these steps:
注記: %~buffer 【!the buffer described above】が, この手続-が走っている`~event~loop$aG内で可用である場合、 次の手続きは,即時に走れる/走らせてもヨイ。 ◎ Note: If the buffer described above is available in the event loop where this procedure is running, the following steps may run immediately.
- %~transport . `ReceiveStreams$sl から %~stream を`除去する$ ◎ Remove stream from transport.[[ReceiveStreams]].
- `~promiseを解決する$( %~promise ) ◎ Resolve promise with undefined.
- ~RET %~promise ◎ Return promise.
8.4. ~serverから来ている `RESET_STREAM^ft 通達
`WebTransportReceiveStream$I %~stream に結付けられた `~WebTransport~stream$が ~serverから `RESET_STREAM$ft ~frame %通達 を取得したときは,次の手続きを走らす: ◎ Whenever a WebTransport stream associated with a WebTransportReceiveStream stream gets a RESET_STREAM signal from the server, run these steps:
- %~transport ~LET %~stream . `Transport$slR ◎ Let transport be stream.[[Transport]].
-
%~code ~LET %通達 に付された応用~protocol~error~code `QUIC$r ◎ Let code be the application protocol error code attached to the RESET_STREAM frame. [QUIC]
注記: %~code 用の妥当な値は、 0 以上 4294967295 以下である。 `下層~接続$が~HTTP3を利用している場合、 `WEB-TRANSPORT-HTTP3$r にて述べられる【!decribe】とおり, ~codeは整数 ~IN { 0x52e4a40fa8db 〜 0x52e5ac983162 } に符号化されることになる。 ◎ Note: Valid values of code are from 0 to 4294967295 inclusive. If the underlying connection is using HTTP/3, the code will be encoded to a number in [0x52e4a40fa8db, 0x52e5ac983162] as decribed in [WEB-TRANSPORT-HTTP3].
-
`~network~taskを~queueする$( %~transport, 次の手続き ) ◎ Queue a network task with transport to\
手続きは: ◎ run these steps:
- ~IF[ %~transport . `State$sl ~IN { `closed^l, `failed^l } ] ⇒ ~RET ◎ If transport.[[State]] is "closed" or "failed", abort these steps.
- %~transport . `ReceiveStreams$sl から %~stream を`除去する$ ◎ Remove stream from transport.[[ReceiveStreams]].
- %~error ~LET `~WebTransport用の例外を作成する$( `stream^l, %~code ) ◎ Let error be a newly created WebTransportError whose source is "stream" and streamErrorCode is code.
- %~stream を`~errorにする$RS( %~error ) ◎ Error stream with error.
8.5. `WebTransportReceiveStreamStats^I 辞書
`WebTransportReceiveStreamStats$I 辞書は、 ある `WebTransportReceiveStream$I に特有な統計の情報を含む。 ◎ The WebTransportReceiveStreamStats dictionary includes information on stats specific to one WebTransportReceiveStream.
dictionary `WebTransportReceiveStreamStats@I { `unsigned long long$ `bytesReceived$mbR = 0; `unsigned long long$ `bytesRead$mbR = 0; };
この辞書が有する~memberは: ◎ The dictionary SHALL have the following attributes:
- `bytesReceived@mbR ◎ bytesReceived, of type unsigned long long, defaulting to 0
- 当の `WebTransportReceiveStream$I 用に意図された~server応用からの~byte列のうち, これまでに何~byteが受信されたかを指示する。 数えられるのは、 最初の欠落な~byteの直前までに限られる。 この数は、 決して減少しない。 ◎ An indicator of progress on how many of the server application’s bytes intended for this WebTransportReceiveStream have been received so far. Only sequential bytes up to, but not including, the first missing byte, are counted. This number can only increase.
- 注記: この進捗は、 単独の~streamに受信された応用~dataに限られ, ~network~overheadを含まない。 ◎ Note: this is progress of app data received on a single stream only, and does not include any network overhead.
- `bytesRead@mbR ◎ bytesRead, of type unsigned long long, defaulting to 0
- 当の応用が,この `WebTransportReceiveStream$I から成功裡に読取った総-~byte数。 この数は、 決して減少しないことに加え, 常に `bytesReceived$mbR 以下になる。 ◎ The total number of bytes the application has successfully read from this WebTransportReceiveStream. This number can only increase, and is always less than or equal to bytesReceived.
9. `WebTransportBidirectionalStream^I ~interface
[`Exposed$=(Window,Worker), `SecureContext$] interface `WebTransportBidirectionalStream@I { readonly attribute `WebTransportReceiveStream$I `readable$mB; readonly attribute `WebTransportSendStream$I `writable$mB; };
9.1. 内部~slot
各 `WebTransportBidirectionalStream$I は、 次に挙げる内部~slotを有する — 各項に与える記述は規範的ではない: ◎ A WebTransportBidirectionalStream has the following internal slots. ◎ Internal Slot|Description (non-normative)
- `Readable@slB
- ある `WebTransportReceiveStream$I ◎ A WebTransportReceiveStream.
- `Writable@slB
- ある `WebTransportSendStream$I ◎ A WebTransportSendStream.
- `Transport@slB
- この `WebTransportBidirectionalStream$I を所有している `WebTransport$I ~obj ◎ The WebTransport object owning this WebTransportBidirectionalStream.
9.2. 属性
- `readable@mB ◎ readable, of type WebTransportReceiveStream, readonly
- 取得子~手続きは ⇒ ~RET コレ . `Readable$slB ◎ The getter steps are to return this's [[Readable]].
- `writable@mB ◎ writable, of type WebTransportSendStream, readonly
- 取得子~手続きは ⇒ ~RET コレ . `Writable$slB ◎ The getter steps are to return this's [[Writable]].
9.3. 手続-
`WebTransportBidirectionalStream$I を `作成する@wtB ときは、 所与の ( `双方向$な`~WebTransport~stream$ %内部~stream, `WebTransport$I ~obj %~transport, %送信-順序 ) に対し, 次の手続きを走らす: ◎ To create a WebTransportBidirectionalStream with a bidirectional WebTransport stream internalStream, a WebTransport object transport, and a sendOrder, run these steps.
- %可読~stream ~LET `WebTransportReceiveStream$I を`作成する$wtR( %内部~stream, %~transport ) ◎ Let readable be the result of creating a WebTransportReceiveStream with internalStream and transport.
- %可書~stream ~LET `WebTransportSendStream$I を`作成する$wtS( %内部~stream, %~transport, %送信-順序 ) ◎ Let writable be the result of creating a WebTransportSendStream with internalStream, transport, and sendOrder.
- %~stream ~LET `新たな$ `WebTransportBidirectionalStream$I — その ⇒# `Readable$slB ~SET %可読~stream, `Writable$slB ~SET %可書~stream, `Transport$slB ~SET %~transport ◎ Let stream be a new WebTransportBidirectionalStream, with: • [[Readable]] •• readable • [[Writable]] •• writable • [[Transport]] •• transport
- ~RET %~stream ◎ Return stream.
10. `WebTransportWriter^I ~interface
`WebTransportWriter$I は、 `WritableStreamDefaultWriter$I の下位classであり, 1 個の~methodを追加する。 ◎ WebTransportWriter is a subclass of WritableStreamDefaultWriter that adds one method.
`WebTransportWriter$I は、 常に,`作成する$TW手続-により作成される。 ◎ A WebTransportWriter is always created by the create procedure.
[Exposed=*, `SecureContext$] interface `WebTransportWriter@I : `WritableStreamDefaultWriter$I { `Promise$<`undefined$> `atomicWrite$dw(optional `any$ %chunk); };
10.1. ~method
- `atomicWrite(chunk)@dw
- この~method【が返す~promise】は、[ 送信~時点における現在の~flow制御~窓 ]の中で %chunk 全体を送信できなかった場合には,却下されることになる。 この挙動は、[ `~flow制御$の~deadlockに敏感な,~dataを不可分的( `transactional^en )に送信する~~限定的な応用 ]を満足するために設計された ( `RFC9308$r `§ 4.4@~RFCx/rfc9308#section-4.4$ )。 ◎ The atomicWrite method will reject if the chunk given to it could not be sent in its entirety within the flow control window that is current at the time of sending. This behavior is designed to satisfy niche transactional applications sensitive to flow control deadlocks ([RFC9308] Section 4.4).
- 注記: この~methodは、 送信~後であっても,一部の~dataを却下し得る。 それは、 ~flow制御に関する不可分~性を供するが,他の~errorも生じ得る。 この~methodは、 ~dataが[ 複数の~packetに分割される/他の~dataと前後する ]ことを防止しない。 この~methodが可用な~flow制御~creditの欠如に因り失敗するか否かを知れるのは、 送信者に限られる。 ◎ Note: atomicWrite can still reject after sending some data. Though it provides atomicity with respect to flow control, other errors may occur. atomicWrite does not prevent data from being split between packets or being interleaved with other data. Only the sender learns if atomicWrite fails due to lack of available flow control credit.
- 注記: 不可分な書込nは、 不可分でない書込nに~~後続して~queueされた場合には,依然として阻まれる。 不可分な書込nが却下された場合、 その時点で それに~~後続して~queueされた書込nもすべて却下されることになる。 この仕方で却下された不可分でない書込nは、 当の~streamを`~errorにする$WSことになる。 したがって、 応用には,不可分な書込nを常に待受けることが奨励される。 ◎ Note: Atomic writes can still block if queued behind non-atomic writes. If the atomic write is rejected, everything queued behind it at that moment will be rejected as well. Any non-atomic writes rejected in this way will error the stream. Applications are therefore encouraged to always await atomic writes.
-
~method手続きは: ◎ When atomicWrite is called, the user agent MUST run the following steps:
- %p ~LET コレ上の `write$dw 手続き( %chunk ) ◎ Let p be the result of write(chunk) on WritableStreamDefaultWriter with chunk.
- %~stream . `AtomicWriteRequests$slS に %p を`付加する$set ◎ Append p to stream.[[AtomicWriteRequests]].
-
~RET `~promiseに反応する$( %p ) — 次を与える下で:
-
`充足~手続き^i は:
- %~stream . `AtomicWriteRequests$slS から %p を`除去する$
- ~RET `undefined^jv
-
`却下~手続き^i は、 所与の ( 事由 %r ) に対し:
- %~stream . `AtomicWriteRequests$slS から %p を`除去する$
- ~RET `却下される~promise$( %r )
-
10.2. 手続-
`WebTransportWriter$I を `作成する@TW ときは、 所与の ( `WebTransportSendStream$I %~stream ) に対し,次の手続きを走らす: ◎ To create a WebTransportWriter, with a WebTransportSendStream stream, run these steps:
- %書込器 ~LET `新たな$ `WebTransportWriter$I ◎ Let writer be a new WebTransportWriter.
- %書込器 上の `new WritableStreamDefaultWriter$m 構築子~手続き( %~stream ) ◎ Run the new WritableStreamDefaultWriter(stream) constructor steps passing writer as this, and stream as the constructor argument.
- ~RET %書込器 ◎ Return writer.
11. `WebTransportError^I ~interface
`WebTransportError@I は `DOMException$I の下位classであり, 次に挙げるいずれかを表現する: ◎ WebTransportError is a subclass of DOMException that represents
- [ ~server/~network ]から来ている~error ◎ An error coming from the server or the network, or
- ~clientが起動した中止-演算~用の事由 ◎ A reason for a client-initiated abort operation.
[`Exposed$=(Window,Worker), `Serializable$, `SecureContext$] interface `WebTransportError$I : `DOMException$I { `constructor@#dom-webtransporterror-webtransporterror$(optional `DOMString$ %message = "", optional `WebTransportErrorOptions$I %options = {}); readonly attribute `WebTransportErrorSource$I `source$mE; readonly attribute `unsigned long$? `streamErrorCode$mE; }; dictionary `WebTransportErrorOptions@I { `WebTransportErrorSource$I `source@mbE = "stream"; [`Clamp$] `unsigned long$? `streamErrorCode@mbE = null; }; enum `WebTransportErrorSource@I { `stream@l, `session@l, };
`~WebTransport用の例外を作成する@ ときは、 所与の ( %~source, %~code (省略時は ~NULL ) ) に対し:
- %~option群 ~LET 新たな `WebTransportErrorOptions$I — その ⇒# `source$mbE ~SET %~source, `streamErrorCode$mbE ~SET %~code
- %~error ~LET `新たな$ `WebTransportError$I
- %~error 上の `new WebTransportError$m 構築子~手続き( "", %~option群 )
- ~RET %~error
【 この手続きは、 他所を集約するための,この訳による追加。 原文は,構築子~手続きを利用していないが、 次節に述べられる各~内部~slotを初期化する必要があるはずなので,追加している — 原文は`~message$eXをどう初期化するか何も述べていないので、 %message 引数には,`とりあえず^em空~文字列を渡している (本当は、何らかの`実装定義$な値に初期化されるかもしれない)。 】
11.1. 内部~slot
各 `WebTransportError$I は、 次に挙げる内部~slotを有する — 各項に与える記述は規範的ではない: ◎ A WebTransportError has the following internal slots. ◎ Internal Slot|Description (non-normative)
- `Source@sl
- ある `WebTransportErrorSource$I — この~errorの~sourceを指示する。 ◎ A WebTransportErrorSource indicating the source of this error.
- `StreamErrorCode@sl
- ~NULL / この~error用の応用~protocol~error~code ◎ The application protocol error code for this error, or null.
11.2. 構築子
`new WebTransportError(message, options)@m 構築子~手続きは: ◎ The new WebTransportError(message, options) constructor steps are:
-
コレの ⇒# `名前$eX ~SET `WebTransportError^l, `~message$eX ~SET %message, `Source$sl ~SET %options[ "`source$mbE" ], `StreamErrorCode$sl ~SET %options[ "`streamErrorCode$mbE" ] ◎ Set this’s name to "WebTransportError". ◎ Set this’s message to message. ◎ Set this’s internal slots as follows: • [[Source]] •• options.source • [[StreamErrorCode]] •• options.streamErrorCode
注記: この名前に対応付けられる旧来の~codeは無いので、 コレの `code$m は 0 になる。 ◎ Note: This name does not have a mapping to a legacy code, so this's code is 0.
11.3. 属性
- `source@mE ◎ source, of type WebTransportErrorSource, readonly
- 取得子~手続きは ⇒ ~RET コレ . `Source$sl ◎ The getter steps are to return this's [[Source]].
- `streamErrorCode@mE ◎ streamErrorCode, of type unsigned long, readonly, nullable
- 取得子~手続きは ⇒ ~RET コレ . `StreamErrorCode$sl ◎ The getter steps are to return this's [[StreamErrorCode]].
11.4. 直列化
`WebTransportError$I ~objは`直列化-可能$である — その: ◎ WebTransportError objects are serializable objects.\
-
その`直列化~手続き$は、 所与の ( %値, %直列形 ) に対し: ◎ Their serialization steps, given value and serialized, are:
- `DOMException$I 用の`直列化~手続き$( %値, %直列形 ) ◎ Run the DOMException serialization steps given value and serialized.
- %直列形 . `Source^sl ~SET %値 . `Source$sl ◎ Set serialized.[[Source]] to value.[[Source]].
- %直列形 . `StreamErrorCode^sl ~SET %値 . `StreamErrorCode$sl ◎ Set serialized.[[StreamErrorCode]] to value.[[StreamErrorCode]].
-
その`逆直列化~手続き$は、 所与の ( %直列形, %値 ) に対し: ◎ Their deserialization steps, given serialized and value, are:
- `DOMException$I 用の`逆直列化~手続き$( %直列形, %値 ) ◎ Run the DOMException deserialization steps given serialized and value.
- %値 . `Source$sl ~SET %直列形 . `Source^sl ◎ Set value.[[Source]] to serialized.[[Source]].
- %値 . `StreamErrorCode$sl ~SET %直列形 . `StreamErrorCode^sl ◎ Set value.[[StreamErrorCode]] serialized.[[StreamErrorCode]].
12. ~protocol対応付け
◎非規範的この節では、 この仕様に定義した各~methodを成す下層~protocolの挙動を, `WEB-TRANSPORT-OVERVIEW$r を用立てる下で述べる。 ~buffer化に因り、 原因から即時に効果が生じるとは限らない。 【以下の各~表tの 1 列目に原因, 2 列目に効果が挙げられる。】 ◎ This section describes the underlying protocol behavior of methods defined in this specification, utilizing [WEB-TRANSPORT-OVERVIEW]. Cause and effect may not be immediate due to buffering.
~WebTransport~protocolにおける動作 | ~APIによる効果 |
---|---|
`DRAIN_WEBTRANSPORT_SESSION$ft を受信した |
await wt.`draining$mT
【に反映される】
|
当の`下層~接続$は~HTTP3を利用している場合、 以下に挙げる `WEB-TRANSPORT-HTTP3$r による~protocolの挙動が適用される。 ◎ If the underlying connection is using HTTP/3, the following protocol behaviors from [WEB-TRANSPORT-HTTP3] apply.
[ `WebTransportError$I ~error %error 内の応用 `streamErrorCode$mE %~code ]と[ 【~HTTP3における】 %~HTTP~error~code ]は、 `WEB-TRANSPORT-HTTP3$r `§ 4.3@~WT-HTTP3#resetting-data-streams$【!4.3】 にて指定されるとおりに,相互に変換される。 ◎ The application streamErrorCode in the WebTransportError error is converted to an httpErrorCode, and vice versa, as specified in [WEB-TRANSPORT-HTTP3] Section 4.3.
~API~method | ~QUIC~protocolにおける動作 |
---|---|
`writable$mB.`abort(error)$ws
| `設定し直す$WT( %~code ) — これは、 %~HTTP~error~code を伴う `RESET_STREAM$ft を送信する |
`writable$mB.`close$ws()
| ~FIN~bitを伴う `STREAM^ft を`送信する$WT |
`writable$mB.getWriter().`write(chunk)$dw
| `STREAM^ft を`送信する$WT |
`writable$mB.getWriter().`close()$dw
| ~FIN~bitを伴う `STREAM^ft を`送信する$WT |
`writable$mB.getWriter().`abort(error)$dw
| `設定し直す$WT( %~code ) — これは、 %~HTTP~error~code を伴う `RESET_STREAM$ft を送信する |
`readable$mB.`cancel(error)$rs
| `送信を停止させる$WT( %~code ) — これは, %~HTTP~error~code を伴う `STOP_SENDING$ft を送信する |
`readable$mB.getReader().`cancel(error)$gr
| `送信を停止させる$WT( %~code ) — これは, %~HTTP~error~code を伴う `STOP_SENDING$ft を送信する |
wt.`close(closeInfo)$mT
| `~WebTransport~sessionを終了する$( %~session, %closeInfo[ "`closeCode$mb" ], %closeInfo[ "`reason$mb" ] ) |
~QUIC~protocolにおける動作 | ~APIによる効果 |
---|---|
%~HTTP~error~code を伴う `STOP_SENDING$ft を受信した | `writable$mB を`~errorにする$WS( %~code ) |
`STREAM^ft を`受信-$WTした |
(await `readable$mB.getReader().`read()$dr).value
【に反映される】
|
~FIN~bitを伴う `STREAM^ft を`受信-$WTした |
(await `readable$mB.getReader().`read()$dr).done
【に反映される】
|
%~HTTP~error~code を伴う `RESET_STREAM$ft を受信した | `readable$mB を`~errorにする$RS( %~code ) |
~sessionは~cleanに`終了され$た( %~code, %事由 ) 【!with closeInfo】 |
(await wt.`closed$mT).closeInfo
【に反映されること】に加え,
~openな各~streamを`~errorにする$RS( )
|
~network~error |
(await wt.`closed$mT)
を却下することに加え,
~openな各~streamを`~errorにする$RS( )
|
注記: `QUIC$r § 3.2 にて論じられたとおり、 `RESET_STREAM$ft ~frameの受領は,応用に常に指示されるとは限らない。 `RESET_STREAM$ft の受領は、 即時に通達され得る — それに伴い、 ~stream~dataの送達は中断され,消費されてない~dataは破棄される。 しかしながら,即時に通達するよう要求されてはいない。 また、 ~stream~dataは完全に受信されたが,当の応用により まだ読取られてない場合、 `RESET_STREAM$ft 通達は,抑止され得る。 ◎ Note: As discussed in [QUIC] Section 3.2, receipt of a RESET_STREAM frame is not always indicated to the application. Receipt of the RESET_STREAM can be signaled immediately, interrupting delivery of stream data with any data not consumed being discarded. However, immediate signaling is not required. Also, if stream data is completely received but has not yet been read by the application, the RESET_STREAM signal can be suppressed.
~HTTP3~protocolにおける動作 | ~APIによる効果 |
---|---|
`GOAWAY$ft を受信した |
await wt.`draining$mT
【に反映される】
|
当の`下層~接続$は~HTTP2を利用している場合、 以下に挙げる `WEB-TRANSPORT-HTTP2$r による~protocolの挙動が適用される。 ~HTTP3と違って, [ `WebTransportError$I ~error %error 内の応用 `streamErrorCode$mE %~code ]と~HTTP~error~codeを相互に変換する必要は無いことに注意。 ◎ If the underlying connection is using HTTP/2, the following protocol behaviors from [WEB-TRANSPORT-HTTP2] apply. Note that, unlike for HTTP/3, the stream error code does not need to be converted to an HTTP error code, and vice versa.
~API~method | ~HTTP2~protocolにおける動作 |
---|---|
`writable$mB.`abort(error)$ws
| `設定し直す$WT( %~code ) |
`writable$mB.`close$ws()
| ~FIN~bitを伴う `WT_STREAM^ft を`送信する$WT |
`writable$mB.getWriter().`write()$dw
| `WT_STREAM^ft を`送信する$WT |
`writable$mB.getWriter().`close()$dw
| ~FIN~bitを伴う `WT_STREAM^ft を`送信する$WT |
`writable$mB.getWriter().`abort(error)$dw
| `設定し直す$WT( %~code ) |
`readable$mB.`cancel(error)$rs
| `送信を停止させる$WT( %~code ) |
`readable$mB.getReader().`cancel(error)$gr
| `送信を停止させる$WT( %~code ) |
wt.`close(closeInfo)$mT
| `~WebTransport~sessionを終了する$( %~session, %closeInfo[ "`closeCode$mb" ], %closeInfo[ "`reason$mb" ] ) |
~HTTP2~protocolにおける動作 | ~APIによる効果 |
---|---|
~errorを伴う `STOP_SENDING$ft を受信した | `writable$mB を`~errorにする$WS( %~code ) |
`WT_STREAM^ft を`受信-$WTした |
(await `readable$mB.getReader().`read()$dr).value
【に反映される】
|
~FIN~bitを伴う `WT_STREAM^ft を`受信-$WTした |
(await `readable$mB.getReader().`read()$dr).done
【に反映される】
|
~errorを伴う `RESET_STREAM$ft を受信した | `readable$mB を`~errorにする$RS( %~code ) |
~sessionは~cleanに`終了され$た( %~code, %事由 ) 【!with closeInfo】 |
(await wt.`closed$mT).closeInfo
【に反映されること】に加え,
~openな各~streamを`~errorにする$RS( )
|
~network~error |
(await wt.`closed$mT)
を却下することに加え,
~openな各~streamを`~errorにする$RS( )
|
`GOAWAY$ft を受信した |
await wt.`draining$mT
【に反映される】
|
13. ~privacy/~securityの考慮点
◎非規範的この節は、 新たな挙動を指定するものではなく, この仕様を成す他の各部にて すで呈示した情報を要約する。 ◎ it specifies no new behaviour, but instead summarizes information already present in other parts of the specification.
13.1. 通信の機密性
通信が場を占めている事実は、 ~networkを観測できる敵対者たちからは隠せないので, 公な情報とみなされる。 ◎ The fact that communication is taking place cannot be hidden from adversaries that can observe the network, so this has to be regarded as public information.
この文書~内で述べた~transport~protocolを成すすべては,[ ~TLS `RFC8446$r またはそれと意味論的に等価な~protocol ]を利用するので、 ~TLSを成すすべての~security~propを供する — 流通の[ 機密性と完全性 ]も含めて。 ~HTTP越しの~WebTransportは,`外方@~HTTPinfra#outbound$への~HTTP要請と同じ[ 証明書~検証y用の仕組み ]を利用するので、 ~remote~serverへの認証は,同じ公開鍵~基盤に依拠している。 ~WebTransportにおいては、 証明書~検証yにおける~errorは致命的であり,[ 証明書~検証を迂回することを許容する抜道 ]として可用なものは無い。 ◎ All of the transport protocols described in this document use either TLS [RFC8446] or a semantically equivalent protocol, thus providing all of the security properties of TLS, including confidentiality and integrity of the traffic. WebTransport over HTTP uses the same certificate verification mechanism as outbound HTTP requests, thus relying on the same public key infrastructure for authentication of the remote server. In WebTransport, certificate verification errors are fatal; no interstitial allowing bypassing certificate validation is available.
13.2. 状態の持続性
~WebTransport自体は、 新たな[ 【利用者に】一意な識別子/ 状態を持続的に格納する仕方 ]を作成するものでも, 既存の持続的な状態を~serverに自動的に公開するものでもない。 一例として、 `WEB-TRANSPORT-HTTP3$r, `WEB-TRANSPORT-HTTP2$r は,どちらも[ ~cookieを送信しない/ ~HTTP認証を~supportしない/ ~cache法を無効~化する仕組みは無い ]。 それらは,~TLSを利用するので、 ~TLSにおける持続的な状態 — ~TLS~session~ticketなど — を継承する。 そのような状態は、 受動的な~network観測者からは可視にならないが, ~serverにより[ 同じ~clientからの異なる接続どうしを相関する ]ためにも利用され得る。 ◎ WebTransport does not by itself create any new unique identifiers or new ways to persistently store state, nor does it automatically expose any of the existing persistent state to the server. For instance, neither [WEB-TRANSPORT-HTTP3] nor [WEB-TRANSPORT-HTTP2] send cookies or support HTTP authentication or caching invalidation mechanisms. Since they do use TLS, they inherit TLS persistent state such as TLS session tickets, which while not visible to passive network observers, could be used by the server to correlate different connections from the same client.
13.3. ~protocol~security
~WebTransportは、 `WEB-TRANSPORT-OVERVIEW$r にて述べられる要件の集合を課す — それは、 次に挙げるものを含む: ◎ WebTransport imposes a set of requirements as described in [WEB-TRANSPORT-OVERVIEW], including:
- ~remote~serverが[ ~WebTransport~protocolが利用-中にあることを自覚する ]ことを確保することに加え、 ~remote~serverには[ ~WebTransport~protocolを利用する用意がある ]ことを確認すること。 `WEB-TRANSPORT-HTTP3$r は、 ~WebTransport~protocolを識別するために[ ~ALPN `RFC7301$r, `~HTTP3設定@~HTTPv3#setting$, `:protocol^h `疑似-~header@~HTTPv3#pseudo-header$ ]が成す組合n利用する。 `WEB-TRANSPORT-HTTP2$r は、 ~WebTransport~protocolを識別するために[ ~ALPN `RFC7301$r, ~HTTP2設定, `:protocol^h 疑似-~header ]が成す組合n利用する。 【疑似-~header `:protocol^h は、 ~RFC 8441 に定義される。】 ◎ Ensuring that the remote server is aware that the WebTransport protocol is in use and confirming that the remote server is willing to use the WebTransport protocol. [WEB-TRANSPORT-HTTP3] uses a combination of ALPN [RFC7301], an HTTP/3 setting, and a :protocol pseudo-header to identify the WebTransport protocol. [WEB-TRANSPORT-HTTP2] uses a combination of ALPN, an HTTP/2 setting, and a :protocol pseudo-header to identify the WebTransport protocol.
- [ ~transport~sessionを出生した資源 ]の生成元に基づいて,接続を~filterすることを~serverに許容する。 この情報【生成元】は、 ~session確立~要請の `Origin$h ~header~fieldが運ぶ。 ◎ Allowing the server to filter connections based on the origin of the resource originating the transport session. The Origin header field on the session establishment request carries this information.
関係する~protocol~securityの考慮点は、[ `WEB-TRANSPORT-HTTP3$r `§ ~securityの考慮点@~WT-HTTP3#security-considerations$, `WEB-TRANSPORT-HTTP2$r `§ ~securityの考慮点@~WT-HTTP2#security-considerations$ ]にて述べられる。 ◎ Protocol security related considerations are described in the Security Considerations sections of [WEB-TRANSPORT-HTTP3] and [WEB-TRANSPORT-HTTP2].
~networking~APIは、 局所~networkで可用な~hostを走査するために共通的に利用され得るので,[ 指紋収集や他の形を成す攻撃 ]に利用される。 ~WebTransportは、 この問題に対し`~WebSocketによる~approach@~WEBSOCKET#feedback-from-the-protocol$に従う ⇒ 【~WebTransportに】特有な接続~errorは、 端点が~WebTransport端点であることが検証yされるまでは,返されない。 したがって、 ~Web応用は,所与の端点が[ 存在しないのか, ~Webからの接続を受容する用意がないのか ]を判別し得ない。 ◎ Networking APIs can be commonly used to scan the local network for available hosts, and thus be used for fingerprinting and other forms of attacks. WebTransport follows the WebSocket approach to this problem: the specific connection error is not returned until an endpoint is verified to be a WebTransport endpoint; thus, the Web application cannot distinguish between a non-existing endpoint and the endpoint that is not willing to accept connections from the Web.
13.4. 証明書~hash群を利用している認証
~UAは、 通常は,[ 自身 ↔ ~remote端点 ]間の~TLS接続を[ ~URL内の~server名に対し供された~TLS~server証明書 ]の妥当性を検証yすることにより認証する `RFC9525$r 。 これは、 ~server証明書を[ ~UAにより保守される信用-~anchorのうちいずれか ]へ連鎖することにより成遂げられる — 各~信用-~anchorは、 証明書~内の~server名を認証する責務がある。 この~systemは、 以下では,~Web~PKIと称される。 ◎ Normally, a user agent authenticates a TLS connection between itself and a remote endpoint by verifying the validity of the TLS server certificate provided against the server name in the URL [RFC9525]. This is accomplished by chaining server certificates to one of the trust anchors maintained by the user agent; the trust anchors in question are responsible for authenticating the server names in the certificates. We will refer to this system as Web PKI.
この~APIは, ~remote~network端点へ接続する能力を~web応用に供するが、 端点は[ その~server名ではなく,特定の~server証明書 ]により認証される。 この仕組みは、 長期的な証明書を取得するのは難題になり得るような端点 — その資質において短命な~host (例:その場限りの~virtual~machine)や, 公に~route可能でない~hostを含む — への接続を可能化する。 この仕組みは、 個々の接続~用に[ ~Web~PKIに基づく認証 ]を代用するので, 両者の~security~propを比較する必要がある。 ◎ This API provides web applications with a capability to connect to a remote network endpoint authenticated by a specific server certificate, rather than its server name. This mechanism enables connections to endpoints for which getting long-term certificates can be challenging, including hosts that are ephemeral in nature (e.g. short-lived virtual machines), or that are not publicly routable. Since this mechanism substitutes Web PKI-based authentication for an individual connection, we need to compare the security properties of both.
ある~remote~serverが, ~TLS~handshakeを成功裡に遂行-可能になるのは、[ それが,指定された証明書の公開鍵に対応している秘密鍵を所蔵している【!posess】 ]場合に限られる。 この~APIは、 それらの~hashを利用して証明書を識別する。 それが~secureになるのは、[ 利用された暗号用~hash関数が, 第二原像攻撃に対する耐性( `second-preimage resistance^en )を有する場合 ]に限られる。 この文書にて定義される関数は,~SHA-256に限られるが、 この~APIは,[ 新たな~hash関数を導入するための仕方 ]を[ 複数個の[ ( ~algo, ~hash ) が成す~pair ]を指定すること ]を許容することを通して供する。 ◎ A remote server will be able to successfully perform a TLS handshake only if it posesses the private key corresponding to the public key of the certificate specified. The API identifies the certificates using their hashes. That is only secure as long as the cryptographic hash function used has second-preimage resistance. The only function defined in this document is SHA-256; the API provides a way to introduce new hash functions through allowing multiple algorithm-hash pairs to be specified.
重要なこととして、 ~Web~PKIは,~security用に追加的な仕組みを供することに注意 — 単純に[ ある~server名に対し信用が成す連鎖を確立する ]ことに加えて。 それらのうち一つに,証明書~廃止の取扱いがある。 利用される証明書が短命である事例では、 そのような仕組みは必要yでない。 他の事例では、 ~Web応用は,証明書~hashを支給するための仕組みを考慮する必要がある — 一例として、 当の~hashが~cacheされた~HTTP資源として供された場合, 当の~cacheは[ 対応している証明書が,弱体化に因り交替された場合 ]には無効~化される必要がある。 ~Web~PKIにより供される別の~security特能は、 鍵~生成に伴われるある種の課題に抗する防護策である — 弱いことが既知な鍵を伴う証明書を却下するなど。 この仕様は,特有な指導を何も供さないが、 各~browserは,実装定義な挙動の一部として それらを却下してもヨイ。 ◎ It is important to note that Web PKI provides additional security mechanisms in addition to simply establishing a chain of trust for a server name. One of them is handling certificate revocation. In cases where the certificate used is ephemeral, such a mechanism is not necessary. In other cases, the Web application has to consider the mechanism by which the certificate hashes are provisioned; for instance, if the hash is provided as a cached HTTP resource, the cache needs to be invalidated if the corresponding certificate has been rotated due to compromise. Another security feature provided by the Web PKI are safeguards against certain issues with key generation, such as rejecting certificates with known weak keys; while this specification does not provide any specific guidance, browsers MAY reject those as a part of implementation-defined behavior.
~Web~PKIは、 各~証明書に対し,失効~期間~要件を施行する。 この要件は、 鍵が弱体化され得る視野を制限することに加え、[ 鍵~交替を~supportして,それを能動的に遂行する ]よう~systemを設計することを~server運用者に強制する。 この理由から、 ~WebTransportも,類似な失効~要件を課す — 証明書は,短命なことが予期されるので、 失効~期間は 2 週間に制限される。 2 週間の期限は、 次に挙げるものの間で~balanceをとった結果である: ◎ Web PKI enforces an expiry period requirement on the certificates. This requirement limits the scope of potential key compromise; it also forces server operators to design systems that support and actively perform key rotation. For this reason, WebTransport imposes a similar expiry requirement; as the certificates are expected to be ephemeral or short-lived, the expiry period is limited to two weeks. The two weeks limit is a balance between\
- 鍵~弱体化による帰結を最小~化するため, 失効~期限をアリな限り短く設定する。 ◎ setting the expiry limit as low as possible to minimize consequences of a key compromise,\
- 各~機器にまたがる時計のずれを収容するに足るまで,長く保守する。 ◎ and maintaining it sufficiently high to accomodate for clock skew across devices,\
- [ ~client側 ↔ ~server側 ]間で証明書を同期するための~costを なるべく下げる。 ◎ and to lower the costs of synchronizing certificates between the client and the server side.
~WebTransport~APIは、 応用が複数の証明書~hashをまとめて指定できるようにする。 それは、 次を~clientに許容する ⇒ 新たな証明書が行き渡るまでの期間において, 【それまでの証明書も可用になるよう】 複数の証明書を受容する。 ◎ The WebTransport API lets the application specify multiple certificate hashes at once, allowing the client to accept multiple certificates for a period in which a new certificate is being rolled out.
~WebRTCにおける`類似な仕組み@~CSP3#webrtc$と違って、 ~WebTransportにおける~server証明書~hash~APIは, ~clientを認証するための手段を何ら供さない — 事実、 ~clientが[ ~server証明書が何であるか/どう `contact^en するか ]を知るだけでは足らない。 応用は、 必要yなら, ~clientの識別情報を帯域内に確立する必要がある。 ◎ Unlike a similar mechanism in WebRTC, the server certificate hash API in WebTransport does not provide any means of authenticating the client; the fact that the client knows what the server certificate is or how to contact it is not sufficient. The application has to establish the identity of the client in-band if necessary.
13.5. 指紋収集と追跡
この~APIは、[ ~network活動を生成する能, この活動の効果を細かく観測する能 ]を~siteに供する。 この仕方で得される情報は, 【利用者を】`識別している@~INFRA#tracking-vector$かもしれない。 ◎ This API provides sites with the ability to generate network activity and closely observe the effect of this activity. The information obtained in this way might be identifying.
重要なこととして、 他の~web~platform~API — `FETCH$r, `WEBRTC$r など — も,ごく類似な~networking能力を供することを認識すること。 したがって、 ~WebTransport~APIを追加することに因る~privacyへの悪影響は, 実質無いに等しい。 この節における考慮点は、 他の~networking能力にも等しく適用される。 ◎ It is important to recognize that very similar networking capabilities are provided by other web platform APIs (such as fetch and [webrtc]). The net adverse effect on privacy due to adding WebTransport is therefore minimal. The considerations in this section applies equally to other networking capabilities.
~network特性を測定するためには、[ ~networkが利用されていて, その利用度が成す効果が測定される ]ことが要求される — この~APIはどちらも可能化する。 ~WebTransportは、[ ~siteが選んだ~serverへ向けて~network活動を生成する能, その効果を観測する能 ]を~siteに供する。 [ ~network経路の安定的な~prop, ~network利用度が成す動的な効果 ]どちらも観測nがアリになる。 ◎ Measuring network characteristics requires that the network be used and that the effect of that usage be measured, both of which are enabled by this API. WebTransport provides sites with an ability to generate network activity toward a server of their choice and observe the effects. Observations of both the stable properties of a network path and dynamic effect of network usage are possible.
~networkについての情報は、 次に挙げるものを通して,~serverに可用になる: ◎ Information about the network is available to the server either\
- ~server自前の~networking~stackを通して直に ◎ directly through its own networking stack,\
- ~clientにより~dataが[ 消費される/伝送される ]~rateを通して間接的に ◎ indirectly through the rate at which data is consumed or transmitted by the client,\
- この~APIにより供される統計の一部として ( § `WebTransportConnectionStats^I 辞書 を見よ) ◎ or as part of the statistics provided by the API (see § 5.12 WebTransportConnectionStats Dictionary).\
その帰結として、[ ~UAにおける情報に対する制約 ]は,[ これらの~privacy~riskを管理するために必要かもしれない仕組み ]として唯一のものではない。 ◎ Consequently, restrictions on information in user agents is not the only mechanism that might be needed to manage these privacy risks.
13.5.1. 静的な観測n
~siteは、[ ~UA ↔ 自身が選んだ~server ]間における[ 可用な~network容量/往復~時間(~RTT) ]を観測できる。 この情報は、[ 他の追跡~行路と組合されたとき ]に【利用者を】識別し得る。 ~RTTはまた、 ~UAの物理的な所在についての何かを露呈し得る — とりわけ、 複数の立地から複数の測定を為せる場合に。 ◎ A site can observe available network capacity or round trip time (RTT) between a user agent and a chosen server. This information can be identifying when combined with other tracking vectors. RTT can also reveal something about the physical location of a user agent, especially if multiple measurements can be made from multiple vantage points.
~networkingは共有されるが、 ~networkは散発的に利用されることが多い — そのことは、 ~siteは[ 他と競わない/負荷が軽い ]~network経路の[ 容量, 往復~時間 ]を観測-可能になることが多いことを意味する。 これらの~propは、 多くの人々において安定的である — ~network上での彼らの所在は変化しないことに加え、 ~network~bottleneck(それは可用な容量を決定する)の位置は,~UAに近いこともあるので。 ◎ Though networking is shared, network use is often sporadic, which means that sites are often able to observe the capacity and round trip times of an uncontested or lightly loaded network path. These properties are stable for many people as their network location does not change and the position of network bottlenecks--which determine available capacity--can be close to a user agent.
13.5.3. ~poolされた~session
~networkingが共有される局面と類似に、 同じ接続に複数の~sessionが~poolされたとき, ある~sessionからの情報は別の~sessionの活動により影響される。 ある~sessionは、 別の~sessionの活動についての情報 — 別の応用が~dataを送信している~rateなど — を推定することもできる。 ◎ Similar to shared networking scenarios, when sessions are pooled on a single connection, information from one session is affected by the activity of another session. One session could infer information about the activity of another session, such as the rate at which another application is sending data.
共有された接続の利用は、 すでに,~sessionどうしを相関することを~serverに許容している。 共有された~sessionの利用が, 求まれない非同一-~site認識を可能化するかもしれない所では、 `~network区分~key$の利用が, ~pool法を不能化する。 ◎ The use of a shared connection already allows the server to correlate sessions. Use of a network partition key disables pooling where use of a shared session might enable unwanted cross-site recognition.
14. 例
14.1. ~datagramたちが成す~bufferの送信-法
◎非規範的~datagramたちが成す~bufferの送信は、 `datagrams$mT の `writable$mD 属性を利用して達成できる。 次の例では、 ~datagramたちは, ~transportがそれを送信するに準備済みな場合に限り送信される。 ◎ Sending a buffer of datagrams can be achieved by using the datagrams' writable attribute. In the following example datagrams are only sent if the transport is ready to send.
async function sendDatagrams(%url, %datagrams) { const %wt = new WebTransport(%url); const %writer = %wt.datagrams.writable.getWriter(); for (const %bytes of %datagrams) { await %writer.ready; %writer.write(%bytes).catch(() => {}); } }
14.2. 固定的な~rateによる~datagram群の送信-法
◎非規範的~datagram群を[ ~transportがそれを送信するに準備済みか否か ]に関わらず固定的な~rateで送信することは、 単純に[ `datagrams$mT の `writable$mD を利用して, `ready$mT 属性を利用しないこと ]により達成できる。 もっと複階的な局面では、 `ready$mT 属性を用立てれる。 ◎ Sending datagrams at a fixed rate regardless if the transport is ready to send can be achieved by simply using datagrams' writable and not using the ready attribute. More complex scenarios can utilize the ready attribute.
/*
100 ~milli秒ごとに~datagramを送信する。
◎
Sends datagrams every 100 ms.
*/
async function sendFixedRate(%url, %createDatagram, %ms = 100) {
const %wt = new WebTransport(%url);
await %wt.ready;
const %writer = wt.datagrams.writable.getWriter();
const %bytes = createDatagram();
setInterval(() => %writer.write(%bytes).catch(() => {}), %ms);
}
14.3. ~datagramの受信-法
◎非規範的~datagramは、 `datagrams$mT の `readable$mD 属性から読取ることにより受信できる。 ~NULL値は、 ~packetが十分に素早く処理されていないことを指示し得る。 ◎ Datagrams can be received by reading from the transport.datagrams.readable attribute. Null values may indicate that packets are not being processed quickly enough.
async function receiveDatagrams(%url) {
const %wt = new WebTransport(%url);
for await (const %datagram of %wt.datagrams.readable) {
/*
%datagram を処理する
◎
Process the datagram
*/
}
}
14.4. ~BYOB読取器による~datagramの受信-法
◎非規範的`datagrams$mT は、 `可読~byte~stream$なので, それ用に`~BYOB読取器$を獲得できる — それは、 複製を避けるために,より精確な[ ~bufferの割振りに対する制御 ]を許容する。 この例は、 ~datagramを 64kB の~memory~bufferの中へ読取る。 ◎ As datagrams are readable byte streams, you can acquire a BYOB reader for them, which allows more precise control over buffer allocation in order to avoid copies. This example reads the datagram into a 64kB memory buffer.
const wt = new WebTransport(%url); for await (const %datagram of %wt.datagrams.readable) { const %reader = %datagram.getReader({ mode: "byob" }); let %array_buffer = new ArrayBuffer(65536); const %buffer = await readInto(%array_buffer); } async function readInto(%buffer) { let %offset = 0; while (%offset < %buffer.byteLength) { const {value: %view, %done} = await %reader.read( new Uint8Array(%buffer, %offset, %buffer.byteLength - %offset)); %buffer = %view.buffer; if (%done) { break; } %offset += %view.byteLength; } return %buffer; }
14.5. ~streamの送信-法
◎非規範的~dataを一方通行な~streamとして送信することは、 `createUnidirectionalStream()$mT 関数から返される~streamの書込器を利用して達成できる。 ◎ Sending data as a one-way stream can be achieved by using the createUnidirectionalStream function and the resulting stream’s writer.
async function sendData(%url, ...%data) { const %wt = new WebTransport(%url); const %writable = await %wt.createUnidirectionalStream(); const %writer = %writable.getWriter(); for (const %bytes of %data) { await %writer.ready; %writer.write(%bytes).catch(() => {}); } await %writer.close(); }
注記: `write()^c からの~promiseを待受けること( `await^c )は、 ~stream仕様により`忌避される@~STREAMS#example-manual-write-dont-await$。 ◎ The streams spec discourages awaiting the promise from write().
`ReadableStream$I から~pipeを通すことで,符号化も行える — 例えば, `TextEncoderStream$I を利用して。 ◎ Encoding can also be done through pipes from a ReadableStream, for example using 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); }
14.6. 流入~streamの受信-法
◎非規範的流入~streamを読取ることは、 次により達成できる ⇒ `incomingUnidirectionalStreams$mT 属性~上で 各 `WebTransportReceiveStream$I を反復して, そこからの各~chunkを反復して消費する。 ◎ Reading incoming streams can be achieved by iterating over the incomingUnidirectionalStreams attribute, and then consuming each WebTransportReceiveStream by iterating over its chunks.
async function receiveData(%url, %processTheData) {
const %wt = new WebTransport(%url);
for await (const %readable of %wt.incomingUnidirectionalStreams) {
/*
`IFFEs^en【?】 を個別に利用して各~streamを消費する,
~streamごとに~errorを報告する
◎
consume streams individually using IFFEs, reporting per-stream errors
*/
((async () => {
try {
for await (const %bytes of readable) {
processTheData(%bytes);
}
} catch (%e) {
console.error(%e);
}
})());
}
}
新たな `WritableStream$I へ~pipeすることを通して,復号も行える — 例えば, `TextDecoderStream$I を利用して。 この例では、 ~text出力は,他と前後されるべきでない — したがって,回ごとに 1 個の~streamに限り読取る — ものと見做す。 ◎ Decoding can also be done through pipes to new WritableStreams, for example using TextDecoderStream. This example assumes text output should not be interleaved, and therefore only reads one stream at a time.
async function receiveText(%url, %createWritableStreamForTextData) {
const %wt = new WebTransport(%url);
for await (const %readable of %wt.incomingUnidirectionalStreams) {
/*
出力を他と前後することなく,連列的に消費する。
~errorは~streamごとに報告する。
◎
consume sequentially to not interleave output, reporting per-stream errors
*/
try {
await %readable
.pipeThrough(new TextDecoderStream("utf-8"))
.pipeTo(%createWritableStreamForTextData());
} catch (%e) {
console.error(%e);
}
}
}
14.7. ~BYOB読取器による~streamの受信-法
◎非規範的`WebTransportReceiveStream$I は`可読~byte~stream$なので、 それ用に`~BYOB読取器$を獲得できる — それは、 複製を避けるために,より精確な[ ~bufferの割振りに対する制御 ]を許容する。 この例は、 `WebTransportReceiveStream$I から最初の 1024 ~byteを単独の~memory~bufferの中へ読取る。 ◎ As WebTransportReceiveStreams are readable byte streams, you can acquire a BYOB reader for them, which allows more precise control over buffer allocation in order to avoid copies. This example reads the first 1024 bytes from a WebTransportReceiveStream into a single memory buffer.
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; }
14.8. ~streamに対する不可分的な~chunkの送信-法
◎非規範的不可分的な一片を成す~dataを[ `~flow制御$により阻まれることなく,一度で行える場合 ]に限り,一方向な~stream上に送信することは、 `getWriter()$mS ~method【!関数】, その結果の書込器( %writer )を利用して達成できる。 ◎ Sending a transactional piece of data on a unidirectional stream, only if it can be done entirely without blocking on flow control, can be achieved by using the getWriter function and the resulting 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;
/*
~flow制御により阻まれるのを避けるため、
却下される。
%writable は、[
処理待ちな不可分でない書込n
]は無い限りにおいて,~errorしないままにあり続ける。
◎
rejected to avoid blocking on flow control
The writable remains un-errored provided no non-atomic writes are pending
*/
} finally {
%writer.releaseLock();
}
}
14.9. ~server証明書~hashの利用-法
◎非規範的~WebTransport~sessionは、[ ~clientにより遂行される既定の信用-評価 ]を[ ~serverへ供される証明書の~hashに対する検査 ]で上書きし得る。 次の例の %hashValue は、 ~server証明書の~SHA-256 ~hashを包含している `BufferSource$I であり, その妥当~性は`下層~接続$が考慮するべきものである。 ◎ A WebTransport session can override the default trust evaluation performed by the client with a check against the hash of the certificate provided to the server. In the example below, hashValue is a BufferSource containing the SHA-256 hash of a server certificate that the underlying connection should consider to be valid.
const %wt = new WebTransport(%url, { serverCertificateHashes: [ { algorithm: "sha-256", value: %hashValue, } ] }); await %wt.ready;
14.10. 完全な例
◎非規範的この例は、 次について~~説明する: ◎ This example illustrates\
- [ ~close時の~promise, 準備済み時の~promise ]の利用 ◎ use of the closed and ready promises,\
- [ ~client/~server ]による[ 一方向~stream, 双方向~stream ]の~open法 ◎ opening of uni-directional and bi-directional streams by either the client or the server,\
- ~datagramの[ 送信-法, 受信-法 ] ◎ and sending and receiving datagrams.
/* ~page上の~event~logに~entryを追加する。 【!余計?任意選択で,指定された~CSS~classを適用して】 ◎ Adds an entry to the event log on the page, optionally applying a specified CSS class. */ let %wt, %streamNumber, %datagramWriter; connect.onclick = async () => { try { const %url = document.getElementById('url').value; %wt = new WebTransport(%url); addToEventLog('接続を起動しています...'); await %wt.ready; addToEventLog(``^${(%wt.reliability == "reliable-only")? "TCP" : "UDP"} 接続は準備済み。``^); %wt.closed .then(() => addToEventLog('接続は正常に~closeされました。')) .catch(() => addToEventLog('接続は中途で~closeされました。', '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(``^~datagramを送信しました: ${%data} ``^); break; } case 'unidi': { const %writable = await %wt.createUnidirectionalStream(); const %writer = %writable.getWriter(); %writer.write(%bytes).catch(() => {}); await %writer.close(); addToEventLog(``^一方向~streamを~dataと伴に送信しました: ${%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(``^双方向~stream #${%n} を~dataと伴に送信しました: ${%data}``^); break; } } } catch (%e) { addToEventLog(``^~dataの送信-中に~error: ${%e}``^, 'error'); } } /* ~EOFに到達するまで、 ~datagram群を~event~logの中へ読取る。 ◎ Reads datagrams into the event log until EOF is reached. */ async function readDatagrams() { try { const %decoder = new TextDecoderStream('utf-8'); for await (const %data of %wt.datagrams.readable.pipeThrough(%decoder)) { addToEventLog(``^~datagramを受信しました: ${%data}``^); } addToEventLog('~datagramを読取りました。'); } catch (%e) { addToEventLog(``^~datagramの読取n中に~error: ${%e}``^, 'error'); } } async function acceptUnidirectionalStreams() { try { for await (const %readable of %wt.incomingUnidirectionalStreams) { const %number = %streamNumber++; addToEventLog(``^新たな流入~一方向~stream #${%number}``^); readFromIncomingStream(%readable, %number); } addToEventLog('一方向~streamを受容しました。'); } catch (%e) { addToEventLog(``^~stream ${%e} の受容-中に~error。``^, 'error'); } } async function readFromIncomingStream(%readable, %number) { try { const %decoder = new TextDecoderStream('utf-8'); for await (const %data of %readable.pipeThrough(%decoder)) { addToEventLog(``^~stream #${%number} 上で~dataを受信しました: ${%data}``^); } addToEventLog(``^~stream #${%number} は~closeされました。``^); } catch (%e) { addToEventLog(``^~stream #${%number} から読取n中に~error: ${%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); /* %log 内のそれまでの~entryが可視であった場合、 新たな要素へ~scrollする。 ◎ If the previous entry in the log was visible, scroll to the new element. */ if (%previous && %previous.getBoundingClientRect().top < %log.getBoundingClientRect().bottom) { %entry.scrollIntoView(); } }
謝辞
The editors wish to thank the Working Group chairs and Team Contact, Jan-Ivar Bruaroey, Will Law and Yves Lafon, for their support.
`WebTransport$I ~interfaceは、 `W3C ORTC CG@https://www.w3.org/community/ortc/$ にて初期に述べられた `QuicTransport^I ~interfaceに基づく — それから,この仕様における利用-用に順応された。 ◎ The WebTransport interface is based on the QuicTransport interface initially described in the W3C ORTC CG, and has been adapted for use in this specification.