From aa1d4e8f67e402790b46b82b403a8207569f4e4d Mon Sep 17 00:00:00 2001 From: Doloro1978 Date: Fri, 7 Aug 2026 17:21:15 +0100 Subject: [PATCH] fix: WHIP not cleaning up --- Cargo.lock | 2 +- crates/server/src/http.rs | 1 - crates/server/src/webrtc_ingest.rs | 20 +++++++++++++------- 3 files changed, 14 insertions(+), 9 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 8516648..f2d3980 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2906,7 +2906,7 @@ dependencies = [ [[package]] name = "server" -version = "0.3.0" +version = "0.4.0" dependencies = [ "argon2", "async-broadcast", diff --git a/crates/server/src/http.rs b/crates/server/src/http.rs index b5cfc1d..7659ad6 100644 --- a/crates/server/src/http.rs +++ b/crates/server/src/http.rs @@ -201,7 +201,6 @@ async fn catalog_handler( user: x.stream_key_user.clone(), started_at: x.started_at, }) - .into_iter() .collect::>(); Ok(Json(catalog)) } diff --git a/crates/server/src/webrtc_ingest.rs b/crates/server/src/webrtc_ingest.rs index eea4d4b..9ee1a2a 100644 --- a/crates/server/src/webrtc_ingest.rs +++ b/crates/server/src/webrtc_ingest.rs @@ -28,6 +28,7 @@ use crate::{ pub async fn handle_whip_injest_delete( State(state): State>, ConnectInfo(remote): ConnectInfo, + Path(_slug): Path, headers: HeaderMap, ) -> Result { let token = headers @@ -44,14 +45,19 @@ pub async fn handle_whip_injest_delete( .await? .ok_or(HttpError::Unauthorized)?; - let active_session = stream_session::Model::get_active_by_stream_key_id(&state.db, key.id) - .await? - .ok_or(HttpError::NotFound)?; + // The detach task may have already cleaned up the session when ICE + // disconnected (OBS closes the PeerConnection before sending DELETE). + // Deleting an already-gone session is still a successful delete. + if let Some(active_session) = + stream_session::Model::get_active_by_stream_key_id(&state.db, key.id).await? + { + active_session + .into_active_model() + .finish_stream_session(&state.db, Utc::now()) + .await?; + } - active_session - .into_active_model() - .finish_stream_session(&state.db, Utc::now()) - .await?; + state.appstate.lock().await.stream_sessions.remove(&key.id); Ok(StatusCode::OK) }