Transports are the means by which PipecatClients communicate with their bot services. Transports implement the underlying device management, connectivity, media transmission, and state logic that manage the lifecycle of your session.

All transport packages (such as DailyTransport) extend from the Transport base class defined in the client-js library. You can extend this class if you are looking to implement your own or add additional functionality.

Transport lifecycle

Each Pipecat client instance is associated with a transport instance. The instance will re-use the transport instance across multiple calls to connect(), allowing you to connect to different bot services without needing to create a new transport or client each time.

import { PipecatClient } from "@pipecat-ai/client-js";
import { DailyTransport } from "@pipecat-ai/daily-transport";

const pcClient = new PipecatClient({
  transport: new DailyTransport(),
  ...
});

await pcClient.connect({endpoint: "https://your-server-url/connect"});
await pcClient.disconnect();
await pcClient.connect(); // re-uses url returned from previous connect call, skipping the endpoint

Transport states

TransportState

Your transport instance goes through a series of states during its lifecycle. These states are:

1

Disconnected

Transport is idle and has not yet been initialized (default state).

2

Initializing

Transport is being initialized. This occurs in response to a pcClient.initDevices() call, where the transport is being set up in order to enumerate local media devices. If you call connect() and bypass initDevices(), the transport will skip this state and go directly to Authenticating or Connecting.

3

Initialized

Transport has been initialized and is ready to connect. This state is reached after a successful pcClient.initDevices() call and skipped if initDevices() is not used.

4

Authenticating

Your client has called pcClient.connect() with a ConnectionEndpoint and is waiting for a response from your server containing connection details for your transport (such as a session URL and token). Note: If you provide the TransportConnectionParams directly, the transport will skip this state and go directly to Connecting.

5

Authenticated

Your client has called pcClient.connect() with a ConnectionEndpoint and has successfully received a response. It will quickly move into the Connecting state.

6

Connecting

The transport is connecting to the server.

7

Connected

The transport has successfully connected to the session and is awaiting a client-ready signal (indicated audio and video tracks are ready to be sent and received).

8

Ready

Transport is ready and the session can begin.
9

Disconnecting

Transport is disconnecting from the session.

10

Error

An error occurred during the transport lifecycle. This indicates a fatal error and the transport should move quickly into the Disconnected state.

You can access the current transport state via pcClient.state, or by defining a callback or event:

// Callback
const pcClient = new PipecatClient({
  transport: new DailyTransport(),
  callbacks: {
    onTransportStateChange: (state) => {
      console.log(state);
    }
  //...
});

// Event
pcClient.on(RTVIEvent.TransportStateChanged, (e) => console.log(e));

// Client getter
console.log(pcClient.state); // Disconnected <TransportState>