[Exposed=(Window,Worker), SecureContext] interface WebTransportDatagramDuplexStream { readonly attribute ReadableStream readable; readonly attribute WritableStream writable; readonly attribute unsigned long maxDatagramSize; attribute unrestricted double? incomingMaxAge; attribute unrestricted double? outgoingMaxAge; attribute unrestricted double incomingHighWaterMark; attribute unrestricted double outgoingHighWaterMark; }; [Exposed=(Window,Worker), SecureContext] interface WebTransport { constructor(USVString url, optional WebTransportOptions options = {}); Promise getStats(); readonly attribute Promise ready; readonly attribute WebTransportReliabilityMode reliability; readonly attribute WebTransportCongestionControl congestionControl; readonly attribute Promise closed; readonly attribute Promise draining; undefined close(optional WebTransportCloseInfo closeInfo = {}); readonly attribute WebTransportDatagramDuplexStream datagrams; Promise createBidirectionalStream( optional WebTransportSendStreamOptions options = {}); /* a ReadableStream of WebTransportBidirectionalStream objects */ readonly attribute ReadableStream incomingBidirectionalStreams; Promise createUnidirectionalStream( optional WebTransportSendStreamOptions options = {}); /* a ReadableStream of WebTransportReceiveStream objects */ readonly attribute ReadableStream incomingUnidirectionalStreams; WebTransportSendGroup createSendGroup(); static readonly attribute boolean supportsReliableOnly; }; enum WebTransportReliabilityMode { "pending", "reliable-only", "supports-unreliable", }; dictionary WebTransportHash { DOMString algorithm; BufferSource value; }; dictionary WebTransportOptions { boolean allowPooling = false; boolean requireUnreliable = false; sequence serverCertificateHashes; WebTransportCongestionControl congestionControl = "default"; }; enum WebTransportCongestionControl { "default", "throughput", "low-latency", }; dictionary WebTransportCloseInfo { unsigned long closeCode = 0; USVString reason = ""; }; dictionary WebTransportSendStreamOptions { WebTransportSendGroup? sendGroup = null; long long sendOrder = 0; boolean waitUntilAvailable = false; }; dictionary WebTransportConnectionStats { unsigned long long bytesSent; unsigned long long packetsSent; unsigned long long bytesLost; unsigned long long packetsLost; unsigned long long bytesReceived; unsigned long long packetsReceived; DOMHighResTimeStamp smoothedRtt; DOMHighResTimeStamp rttVariation; DOMHighResTimeStamp minRtt; WebTransportDatagramStats datagrams; unsigned long long? estimatedSendRate; }; dictionary WebTransportDatagramStats { unsigned long long expiredOutgoing; unsigned long long droppedIncoming; unsigned long long lostOutgoing; }; [Exposed=(Window,Worker), SecureContext, Transferable] interface WebTransportSendStream : WritableStream { attribute WebTransportSendGroup? sendGroup; attribute long long sendOrder; Promise getStats(); }; dictionary WebTransportSendStreamStats { unsigned long long bytesWritten; unsigned long long bytesSent; unsigned long long bytesAcknowledged; }; [Exposed=(Window,Worker), SecureContext] interface WebTransportSendGroup { Promise getStats(); }; [Exposed=(Window,Worker), SecureContext, Transferable] interface WebTransportReceiveStream : ReadableStream { Promise getStats(); }; dictionary WebTransportReceiveStreamStats { unsigned long long bytesReceived; unsigned long long bytesRead; }; [Exposed=(Window,Worker), SecureContext] interface WebTransportBidirectionalStream { readonly attribute WebTransportReceiveStream readable; readonly attribute WebTransportSendStream writable; }; [Exposed=(Window,Worker), Serializable, SecureContext] interface WebTransportError : DOMException { constructor(optional DOMString message = "", optional WebTransportErrorOptions options = {}); readonly attribute WebTransportErrorSource source; readonly attribute unsigned long? streamErrorCode; }; dictionary WebTransportErrorOptions { WebTransportErrorSource source = "stream"; [Clamp] unsigned long? streamErrorCode = null; }; enum WebTransportErrorSource { "stream", "session", };