v153 · webtransport · send streams
Three interfaces, one contract
The feature is spread across three surfaces: a method on WebTransport (createSendGroup), a WritableStream subclass for every outgoing stream (WebTransportSendStream), and a small grouping interface (WebTransportSendGroup). Each has an exact IDL shape — this page reads all of it off the real objects.
Chrome targets this for Chrome 153 behind the WebTransportSendGroup runtime flag — launch with --enable-blink-features=WebTransportSendGroup, or flip chrome://flags/#enable-experimental-web-platform-features and relaunch. Rows about objects this build does not have report that absence; nothing is inferred.
The IDL, checked member by member
| check | this build | IDL says |
|---|---|---|
| Press the button. | ||
One stats dictionary, two scopes
Both WebTransportSendStream.getStats() and WebTransportSendGroup.getStats() resolve the same WebTransportSendStreamStats shape — per-stream in one case, aggregated across the group's streams in the other:
{
bytesWritten: /* what the app has written into the stream */
bytesSent: /* what has actually left for the network */
bytesAcknowledged: /* what the peer's QUIC stack has confirmed */
}
// bytesAcknowledged ≤ bytesSent ≤ bytesWritten — three positions of
// the same high-water mark, which is how you see WHERE bytes are stuck.
Calling either needs an instance, and instances need an established session — the workbench makes the group-level call for real on builds that can.
code path
'createSendGroup' in WebTransport.prototype; // the method
typeof WebTransportSendGroup; // the group type
typeof WebTransportSendStream; // the stream type
const p = WebTransportSendStream.prototype;
Object.getPrototypeOf(p) === WritableStream.prototype; // direct subclass
['sendGroup', 'sendOrder', 'getStats', 'getWriter']
.every((m) => Object.prototype.hasOwnProperty.call(p, m)); // its additions
new WebTransportSendStream(); // TypeError — session-only instances
new WebTransportSendGroup(); // TypeError — createSendGroup() only