many-fall-81099
07/11/2025, 11:19 AMtall-airline-16756
07/11/2025, 11:20 AMtall-airline-16756
07/11/2025, 11:20 AMopen
state.
Here are examples for several SDKs:
• *Swift:*`let isRoomConnected = room.connectionState == .connected
let isDataChannelOpen = room.publisherDataChannel.isOpen
if isRoomConnected && isDataChannelOpen {
// Safe to send data
}`
• *JavaScript:*`const isRoomConnected = room.connectionState === 'connected';
const isDataChannelReady = engine.dataChannelForKind(kind)?.readyState === 'open';
if (isRoomConnected && isDataChannelReady) {
// Safe to send data
}`
• *Android:*`val isRoomConnected = room.connectionState == ConnectionState.CONNECTED
val dataChannel = engine.dataChannelForKind(kind)
val isDataChannelOpen = dataChannel?.state() == DataChannel.State.OPEN
if (isRoomConnected && isDataChannelOpen) {
// Safe to send data
}`
• *Flutter:*`final isRoomConnected = room.connectionState == ConnectionState.connected;
final dataChannel = engine._publisherDataChannel(reliability);
final isDataChannelOpen = dataChannel?.state == RTCDataChannelState.RTCDataChannelOpen;
if (isRoomConnected && isDataChannelOpen) {
// Safe to send data
}`
• *Rust:*`let is_room_connected = room.connection_state() == ConnectionState::Connected;
let data_channel = session.data_channel(SignalTarget::Publisher, kind);
let is_data_channel_open = data_channel.map(|dc| dc.state() == DataChannelState::Open).unwrap_or(false);
if is_room_connected && is_data_channel_open {
// Safe to send data
}`
Best practice: Always check both states before sending data, as the connection process may leave them in different states temporarily. Many SDKs also provide methods like ensurePublisherConnected
to handle readiness checking automatically.
Sources: Sources/LiveKit/Core/Room.swift | src/room/RTCEngine.ts | livekit-android-sdk/src/main/java/io/livekit/android/audio/PreconnectAudioB... | lib/src/core/engine.dart | livekit-ffi/src/server/room.rs | Web and mobile frontends | LiveKit Docs