v153 · webtransport · send streams

The workbench: groups and stream options, called for real

Everything here is a genuine call against a real transport object connecting to a dead endpoint. createSendGroup() is synchronous and legal while connecting; the group's getStats() returns a real promise; createUnidirectionalStream() converts its options dictionary at call time even though the stream itself can only arrive after establishment. Each step reports exactly what this build did.

Chrome targets this for Chrome 153 behind WebTransportSendGroup (--enable-blink-features=WebTransportSendGroup, or chrome://flags/#enable-experimental-web-platform-features). No HTTP/3 endpoint is reachable from this showcase, so the stream-creation promise can never resolve with a stream — what it does instead (stay pending, then reject when the connection fails) is itself the spec's behaviour, and the page labels it as such.

Four steps

transport

not yet

the group

not yet

group stats

not yet

the stream attempt — and which option members were really converted

not yet

code path

const t = new WebTransport("https://127.0.0.1:44443/never");
const group = t.createSendGroup();      // synchronous, legal while connecting

await group.getStats();                 // { bytesWritten: 0, bytesSent: 0,
                                        //   bytesAcknowledged: 0 } — no
                                        //   streams in the group yet

const pending = t.createUnidirectionalStream({
  sendGroup: group,                     // read NOW (dictionary conversion)
  sendOrder: 7,                         // read NOW
});                                     // …but resolves only after ready
pending.catch((e) => { /* WebTransportError when the connection dies */ });

see also