Delete room when no participants are left

Antonio Scandurra created

Change summary

Cargo.lock                        | 1 +
crates/collab/src/rpc.rs          | 7 ++++++-
crates/collab/src/rpc/store.rs    | 2 +-
crates/live_kit_server/Cargo.toml | 1 +
crates/live_kit_server/src/api.rs | 4 ++++
5 files changed, 13 insertions(+), 2 deletions(-)

Detailed changes

Cargo.lock 🔗

@@ -3197,6 +3197,7 @@ dependencies = [
  "futures 0.3.24",
  "hmac 0.12.1",
  "jwt",
+ "log",
  "prost 0.8.0",
  "prost-build",
  "prost-types 0.8.0",

crates/collab/src/rpc.rs 🔗

@@ -890,11 +890,16 @@ impl Server {
     ) -> impl Future<Output = Result<()>> {
         let client = self.app_state.live_kit_client.clone();
         let room_name = room.live_kit_room.clone();
+        let participant_count = room.participants.len();
         async move {
             if let Some(client) = client {
                 client
-                    .remove_participant(room_name, connection_id.to_string())
+                    .remove_participant(room_name.clone(), connection_id.to_string())
                     .await?;
+
+                if participant_count == 0 {
+                    client.delete_room(room_name).await?;
+                }
             }
 
             Ok(())

crates/collab/src/rpc/store.rs 🔗

@@ -495,7 +495,7 @@ impl Store {
                 }
             });
 
-        let room = if room.participants.is_empty() && room.pending_participant_user_ids.is_empty() {
+        let room = if room.participants.is_empty() {
             Cow::Owned(self.rooms.remove(&room_id).unwrap())
         } else {
             Cow::Borrowed(self.rooms.get(&room_id).unwrap())

crates/live_kit_server/src/api.rs 🔗

@@ -110,6 +110,7 @@ impl Client {
         let client = self.http.clone();
         let token = token::create(&self.key, &self.secret, None, grant);
         let url = format!("{}/{}", self.url, path);
+        log::info!("Request {}: {:?}", url, body);
         async move {
             let token = token?;
             let response = client
@@ -119,9 +120,12 @@ impl Client {
                 .body(body.encode_to_vec())
                 .send()
                 .await?;
+
             if response.status().is_success() {
+                log::info!("Response {}: {:?}", url, response.status());
                 Ok(Res::decode(response.bytes().await?)?)
             } else {
+                log::error!("Response {}: {:?}", url, response.status());
                 Err(anyhow!(
                     "POST {} failed with status code {:?}, {:?}",
                     url,