Skip to content

Commit b0169f1

Browse files
committed
add disconnect reason to Room::close
1 parent 809b63e commit b0169f1

15 files changed

Lines changed: 82 additions & 11 deletions

File tree

livekit-ffi/protocol/participant.proto

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,7 @@ enum DisconnectReason {
8585
SIP_TRUNK_FAILURE = 13;
8686
CONNECTION_TIMEOUT = 14;
8787
MEDIA_FAILURE = 15;
88+
AGENT_ERROR = 16;
8889
}
8990

9091
// copied from livekit-protocol/protocol/protobufs/livekit_models.proto and removed deprecated fields

livekit-ffi/protocol/room.proto

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ message ConnectCallback {
6262
message DisconnectRequest {
6363
required uint64 room_handle = 1;
6464
optional uint64 request_async_id = 2;
65+
optional DisconnectReason reason = 3;
6566
}
6667
message DisconnectResponse { required uint64 async_id = 1; }
6768
message DisconnectCallback { required uint64 async_id = 1; }

livekit-ffi/src/conversion/participant.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@ impl From<DisconnectReason> for proto::DisconnectReason {
9696
DisconnectReason::SipTrunkFailure => proto::DisconnectReason::SipTrunkFailure,
9797
DisconnectReason::ConnectionTimeout => proto::DisconnectReason::ConnectionTimeout,
9898
DisconnectReason::MediaFailure => proto::DisconnectReason::MediaFailure,
99+
DisconnectReason::AgentError => proto::DisconnectReason::AgentError,
99100
}
100101
}
101102
}

livekit-ffi/src/conversion/room.rs

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,31 @@ impl From<DisconnectReason> for proto::DisconnectReason {
102102
DisconnectReason::SipTrunkFailure => Self::SipTrunkFailure,
103103
DisconnectReason::ConnectionTimeout => Self::ConnectionTimeout,
104104
DisconnectReason::MediaFailure => Self::MediaFailure,
105+
DisconnectReason::AgentError => Self::AgentError,
106+
}
107+
}
108+
}
109+
110+
impl From<proto::DisconnectReason> for DisconnectReason {
111+
fn from(value: proto::DisconnectReason) -> Self {
112+
match value {
113+
proto::DisconnectReason::UnknownReason => Self::UnknownReason,
114+
proto::DisconnectReason::ClientInitiated => Self::ClientInitiated,
115+
proto::DisconnectReason::DuplicateIdentity => Self::DuplicateIdentity,
116+
proto::DisconnectReason::ServerShutdown => Self::ServerShutdown,
117+
proto::DisconnectReason::ParticipantRemoved => Self::ParticipantRemoved,
118+
proto::DisconnectReason::RoomDeleted => Self::RoomDeleted,
119+
proto::DisconnectReason::StateMismatch => Self::StateMismatch,
120+
proto::DisconnectReason::JoinFailure => Self::JoinFailure,
121+
proto::DisconnectReason::Migration => Self::Migration,
122+
proto::DisconnectReason::SignalClose => Self::SignalClose,
123+
proto::DisconnectReason::RoomClosed => Self::RoomClosed,
124+
proto::DisconnectReason::UserUnavailable => Self::UserUnavailable,
125+
proto::DisconnectReason::UserRejected => Self::UserRejected,
126+
proto::DisconnectReason::SipTrunkFailure => Self::SipTrunkFailure,
127+
proto::DisconnectReason::ConnectionTimeout => Self::ConnectionTimeout,
128+
proto::DisconnectReason::MediaFailure => Self::MediaFailure,
129+
proto::DisconnectReason::AgentError => Self::AgentError,
105130
}
106131
}
107132
}

livekit-ffi/src/server/mod.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ use std::{
2424

2525
use dashmap::{mapref::one::MappedRef, DashMap};
2626
use downcast_rs::{impl_downcast, Downcast};
27+
use livekit::prelude::DisconnectReason;
2728
use livekit::webrtc::{
2829
native::apm::AudioProcessingModule, native::audio_resampler::AudioResampler, prelude::*,
2930
};
@@ -169,7 +170,7 @@ impl FfiServer {
169170
}
170171

171172
for room in rooms {
172-
room.close(self).await;
173+
room.close(self, DisconnectReason::ClientInitiated).await;
173174
}
174175

175176
// Drop all handles

livekit-ffi/src/server/requests.rs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,11 +65,16 @@ fn on_disconnect(
6565
disconnect: proto::DisconnectRequest,
6666
) -> FfiResult<proto::DisconnectResponse> {
6767
let async_id = server.resolve_async_id(disconnect.request_async_id);
68+
let reason = disconnect
69+
.reason
70+
.and_then(|r| proto::DisconnectReason::try_from(r).ok())
71+
.map(DisconnectReason::from)
72+
.unwrap_or(DisconnectReason::ClientInitiated);
6873
let handle = server.async_runtime.spawn(async move {
6974
let ffi_room =
7075
server.retrieve_handle::<room::FfiRoom>(disconnect.room_handle).unwrap().clone();
7176

72-
ffi_room.close(server).await;
77+
ffi_room.close(server, reason).await;
7378

7479
let _ = server.send_event(proto::DisconnectCallback { async_id }.into());
7580
});

livekit-ffi/src/server/room.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -301,7 +301,7 @@ impl FfiRoom {
301301
}
302302

303303
/// Close the room and stop the tasks
304-
pub async fn close(&self, server: &'static FfiServer) {
304+
pub async fn close(&self, server: &'static FfiServer, reason: DisconnectReason) {
305305
// drop associated track handles
306306
for (_, &handle) in self.inner.track_handle_lookup.lock().iter() {
307307
if server.drop_handle(handle) {
@@ -310,7 +310,7 @@ impl FfiRoom {
310310
}
311311
}
312312

313-
let _ = self.inner.room.close().await;
313+
let _ = self.inner.room.close_with_reason(reason.into()).await;
314314

315315
let handle = self.handle.lock().await.take();
316316
if let Some(handle) = handle {

livekit-protocol/src/livekit.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1887,6 +1887,8 @@ pub enum DisconnectReason {
18871887
ConnectionTimeout = 14,
18881888
/// media stream failure or media timeout
18891889
MediaFailure = 15,
1890+
/// agent encountered an error
1891+
AgentError = 16,
18901892
}
18911893
impl DisconnectReason {
18921894
/// String value of the enum field names used in the ProtoBuf definition.
@@ -1911,6 +1913,7 @@ impl DisconnectReason {
19111913
DisconnectReason::SipTrunkFailure => "SIP_TRUNK_FAILURE",
19121914
DisconnectReason::ConnectionTimeout => "CONNECTION_TIMEOUT",
19131915
DisconnectReason::MediaFailure => "MEDIA_FAILURE",
1916+
DisconnectReason::AgentError => "AGENT_ERROR",
19141917
}
19151918
}
19161919
/// Creates an enum from field names used in the ProtoBuf definition.
@@ -1932,6 +1935,7 @@ impl DisconnectReason {
19321935
"SIP_TRUNK_FAILURE" => Some(Self::SipTrunkFailure),
19331936
"CONNECTION_TIMEOUT" => Some(Self::ConnectionTimeout),
19341937
"MEDIA_FAILURE" => Some(Self::MediaFailure),
1938+
"AGENT_ERROR" => Some(Self::AgentError),
19351939
_ => None,
19361940
}
19371941
}

livekit-protocol/src/livekit.serde.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10412,6 +10412,7 @@ impl serde::Serialize for DisconnectReason {
1041210412
Self::SipTrunkFailure => "SIP_TRUNK_FAILURE",
1041310413
Self::ConnectionTimeout => "CONNECTION_TIMEOUT",
1041410414
Self::MediaFailure => "MEDIA_FAILURE",
10415+
Self::AgentError => "AGENT_ERROR",
1041510416
};
1041610417
serializer.serialize_str(variant)
1041710418
}
@@ -10439,6 +10440,7 @@ impl<'de> serde::Deserialize<'de> for DisconnectReason {
1043910440
"SIP_TRUNK_FAILURE",
1044010441
"CONNECTION_TIMEOUT",
1044110442
"MEDIA_FAILURE",
10443+
"AGENT_ERROR",
1044210444
];
1044310445

1044410446
struct GeneratedVisitor;
@@ -10495,6 +10497,7 @@ impl<'de> serde::Deserialize<'de> for DisconnectReason {
1049510497
"SIP_TRUNK_FAILURE" => Ok(DisconnectReason::SipTrunkFailure),
1049610498
"CONNECTION_TIMEOUT" => Ok(DisconnectReason::ConnectionTimeout),
1049710499
"MEDIA_FAILURE" => Ok(DisconnectReason::MediaFailure),
10500+
"AGENT_ERROR" => Ok(DisconnectReason::AgentError),
1049810501
_ => Err(serde::de::Error::unknown_variant(value, FIELDS)),
1049910502
}
1050010503
}

0 commit comments

Comments
 (0)