WebTransport
============

Limited availability
--------------------

This feature is not Baseline because it does not work in some of the most widely-used browsers.

* Learn more
* See full compatibility
* Report feedback
**Secure context:** This feature is available only in secure contexts (HTTPS), in some or all supporting browsers.

The **`WebTransport`** interface of the WebTransport API provides functionality to enable a user agent to connect to an HTTP/3 server, initiate reliable and unreliable transport in either or both directions, and close the connection once it is no longer needed.

**Note:** This feature is available in Web Workers

Constructor
-----------

`WebTransport()`

Creates a new `WebTransport` object instance.

Instance properties
-------------------

`closed` Read only 

Returns a promise that resolves when the transport is closed.

`datagrams` Read only 

Returns a `WebTransportDatagramDuplexStream` instance that can be used to send and receive datagrams.

`congestionControl` Read only  
Experimental

Returns a string that indicates the application preference for either high throughput or low-latency when sending data.

`incomingBidirectionalStreams` Read only 

Represents one or more bidirectional streams opened by the server. Returns a `ReadableStream` of `WebTransportBidirectionalStream` objects. Each one can be used to read data from the server and write data back to it.

`incomingUnidirectionalStreams` Read only 

Represents one or more unidirectional streams opened by the server. Returns a `ReadableStream` of `WebTransportReceiveStream` objects. Each one can be used to read data from the server.

`ready` Read only 

Returns a promise that resolves when the transport is ready to use.

`reliability` Read only  
Experimental

Returns a string that indicates whether the connection supports reliable transports only, or whether it also supports unreliable transports (such as UDP).

Instance methods
----------------

`close()`

Closes an ongoing WebTransport session.

`createBidirectionalStream()`

Asynchronously opens a bidirectional stream (`WebTransportBidirectionalStream`) that can be used to read from and write to the server.

`createUnidirectionalStream()`

Asynchronously opens a unidirectional stream (`WritableStream`) that can be used to write to the server.

`getStats()` 
Experimental

Asynchronously returns a `Promise` that fulfills with an object containing HTTP/3 connection statistics.

Examples
--------

 The example code below shows how you'd connect to an HTTP/3 server by passing its URL to the `WebTransport()` constructor.
 Note that the scheme needs to be HTTPS, and the port number needs to be explicitly specified.
 Once the `WebTransport.ready` promise fulfills, you can start using the connection.


```js
async function initTransport(url) {
  // Initialize transport connection
  const transport = new WebTransport(url);

  // The connection can be used once ready fulfills
  await transport.ready;
  return transport;
}
```


 You can respond to the connection closing by waiting for the `WebTransport.closed` promise to fulfill.
 Errors returned by `WebTransport` operations are of type `WebTransportError`, and contain additional data on top of the standard `DOMException` set.

 The `closeTransport()` method below shows a possible implementation.
 Within a `try...catch` block it uses `await` to wait for the `closed` promise to fulfill or reject, and then reports whether or not the connection closed intentionally or due to error.


```js
async function closeTransport(transport) {
  // Respond to connection closing
  try {
    await transport.closed;
    console.log(`The HTTP/3 connection to ${url} closed gracefully.`);
  } catch (error) {
    console.error(`The HTTP/3 connection to ${url} closed due to ${error}.`);
  }
}
```


We might call the asynchronous functions above in their own asynchronous function, as shown below.


```js
// Use the transport
async function useTransport(url) {
  const transport = await initTransport(url);

  // Use the transport object to send and receive data
  // ...

  // When done, close the transport
  await closeTransport(transport);
}

const url = "https://example.com:4999/wt";
useTransport(url);
```


For other example code, see the individual property and method pages.

Specifications
--------------

| Specification |
| --- |
| WebTransport # web-transport |

Browser compatibility
---------------------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

See also
--------

* Using WebTransport
* WebSockets API
* Streams API
* WebTransport over HTTP/3