From 17e85fcfa4227df87d514fbacf0982f34fa03bcb Mon Sep 17 00:00:00 2001 From: euzu Date: Tue, 18 Nov 2025 21:52:09 +0100 Subject: [PATCH] =?UTF-8?q?-=20Added=20detailed=20shared-stream/buffer/pro?= =?UTF-8?q?vider=20logging=20to=20trace=20lag,=20cache=20persistence,=20an?= =?UTF-8?q?d=20session/provider=20lifecycle=20events.=20-=20Connection=20r?= =?UTF-8?q?egistration=20failures=20now=20trigger=20an=20explicit=20discon?= =?UTF-8?q?nect=20so=20zombie=20sockets=20don=E2=80=99t=20linger.=20-=20Sh?= =?UTF-8?q?ared=20stream=20shutdown=20now=20drops=20registry=20locks=20bef?= =?UTF-8?q?ore=20releasing=20provider=20handles=20to=20prevent=20cross-loc?= =?UTF-8?q?k=20stalls.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Cargo.lock | 6 +++--- backend/Cargo.toml | 2 +- backend/src/api/api_utils.rs | 2 +- backend/src/api/model/active_user_manager.rs | 15 +++++---------- backend/src/api/model/connection_manager.rs | 2 +- .../src/api/model/streams/persist_pipe_stream.rs | 4 ++-- backend/src/model/config/input.rs | 2 +- backend/src/utils/network/xtream.rs | 2 +- frontend/Cargo.toml | 4 ++-- shared/Cargo.toml | 2 +- 10 files changed, 18 insertions(+), 23 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index b39068668..4e39012f9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1096,7 +1096,7 @@ dependencies = [ [[package]] name = "frontend" -version = "3.2.3" +version = "3.2.4" dependencies = [ "anyhow", "base64", @@ -3765,7 +3765,7 @@ dependencies = [ [[package]] name = "shared" -version = "3.2.3" +version = "3.2.4" dependencies = [ "base64", "bitflags 2.10.0", @@ -4314,7 +4314,7 @@ checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" [[package]] name = "tuliprox" -version = "3.2.3" +version = "3.2.4" dependencies = [ "arc-swap", "async-compression", diff --git a/backend/Cargo.toml b/backend/Cargo.toml index 2a13255e6..e1ee10a31 100644 --- a/backend/Cargo.toml +++ b/backend/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "tuliprox" -version = "3.2.3" +version = "3.2.4" edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/backend/src/api/api_utils.rs b/backend/src/api/api_utils.rs index df2d1d1e1..6f075ef00 100644 --- a/backend/src/api/api_utils.rs +++ b/backend/src/api/api_utils.rs @@ -22,7 +22,7 @@ use axum::response::IntoResponse; use chrono::{DateTime, Utc}; use futures::{StreamExt, TryStreamExt}; use jsonwebtoken::{decode, Algorithm, DecodingKey, Validation}; -use log::{debug, error, info, log_enabled, trace, warn}; +use log::{debug, error, log_enabled, trace, warn}; use reqwest::header::RETRY_AFTER; use serde::Serialize; use shared::model::{Claims, InputFetchMethod, PlaylistEntry, PlaylistItemType, StreamChannel, TargetType, UserConnectionPermission, XtreamCluster}; diff --git a/backend/src/api/model/active_user_manager.rs b/backend/src/api/model/active_user_manager.rs index e6b2319b8..7242c8f5b 100644 --- a/backend/src/api/model/active_user_manager.rs +++ b/backend/src/api/model/active_user_manager.rs @@ -260,14 +260,11 @@ impl ActiveUserManager { let mut user_connections = self.connections.write().await; // needs to be registered through socket connection to avoid race time conditions through short disconnect - if !user_connections - .key_by_addr - .contains_key(&fingerprint.addr) { + if !user_connections.key_by_addr.contains_key(&fingerprint.addr) { return None; } - user_connections - .key_by_addr.insert(fingerprint.addr, username.to_string()); + user_connections.key_by_addr.insert(fingerprint.addr, username.to_string()); let connection_data = user_connections.by_key .entry(username.to_string()) @@ -304,12 +301,10 @@ impl ActiveUserManager { country, ); connection_data.connections += 1; + let connections = connection_data.connections; connection_data.streams.push(stream_info.clone()); - user_connections - .key_by_addr - .insert(fingerprint.addr, username.to_string()); - debug!( "Added new connection for {username} at {} (active_user_connections={})", - fingerprint.addr, connection_data.connections); + user_connections.key_by_addr.insert(fingerprint.addr, username.to_string()); + debug!( "Added new connection for {username} at {} (active_user_connections={connections})", fingerprint.addr); stream_info } diff --git a/backend/src/api/model/connection_manager.rs b/backend/src/api/model/connection_manager.rs index 6d10c7792..d62acd2c0 100644 --- a/backend/src/api/model/connection_manager.rs +++ b/backend/src/api/model/connection_manager.rs @@ -74,7 +74,7 @@ impl ConnectionManager { self.event_manager.send_event(EventMessage::ActiveUser(ActiveUserConnectionChange::Updated(stream_info))); } else { warn!("Failed to register connection for user {username} at {}; disconnecting client", fingerprint.addr); - let _ = self.kick_connection(&fingerprint.addr).await; + let _ = self.kick_connection(&fingerprint.addr); } } diff --git a/backend/src/api/model/streams/persist_pipe_stream.rs b/backend/src/api/model/streams/persist_pipe_stream.rs index 8de72eec5..106d30740 100644 --- a/backend/src/api/model/streams/persist_pipe_stream.rs +++ b/backend/src/api/model/streams/persist_pipe_stream.rs @@ -1,6 +1,6 @@ use crate::api::model::StreamError; use bytes::Bytes; -use log::{debug, error, info, warn}; +use log::{debug, error, warn}; use std::collections::VecDeque; use std::pin::Pin; use std::sync::atomic::{AtomicUsize, Ordering}; @@ -97,7 +97,7 @@ where if !self.completed { self.completed = true; let size = self.size.load(Ordering::SeqCst); - debug!("Persisted {} bytes to cache resource", size); + debug!("Persisted {size} bytes to cache resource"); (self.callback)(size); } } diff --git a/backend/src/model/config/input.rs b/backend/src/model/config/input.rs index 3f7dc98df..4524b66c9 100644 --- a/backend/src/model/config/input.rs +++ b/backend/src/model/config/input.rs @@ -109,7 +109,7 @@ impl From<&ConfigInputAliasDto> for ConfigInputAlias { Self { id: dto.id, name: dto.name.clone(), - url: get_base_url_from_str(&dto.url).map_or_else(|| dto.url.clone(), |base_url| base_url), + url: get_base_url_from_str(&dto.url).unwrap_or_else(|| dto.url.clone()), username: dto.username.clone(), password: dto.password.clone(), priority: dto.priority, diff --git a/backend/src/utils/network/xtream.rs b/backend/src/utils/network/xtream.rs index 723b434ce..dc9134c1b 100644 --- a/backend/src/utils/network/xtream.rs +++ b/backend/src/utils/network/xtream.rs @@ -256,7 +256,7 @@ pub fn create_vod_info_from_item(target: &ConfigTarget, user: &ProxyUserCredenti let name = &pli.name; let extension = pli.get_additional_property("container_extension") .map_or_else(|| extract_extension_from_url(&pli.url).map_or_else(String::new, std::string::ToString::to_string), - |v| get_string_from_serde_value(&v).map_or_else(String::new, |v| v)); + |v| get_string_from_serde_value(&v).unwrap_or_default()); let added = last_updated / 1000; format!(r#"{{ "info": {{}}, diff --git a/frontend/Cargo.toml b/frontend/Cargo.toml index 123f5a7a3..6b000ba9f 100644 --- a/frontend/Cargo.toml +++ b/frontend/Cargo.toml @@ -1,10 +1,10 @@ [package] name = "frontend" -version = "3.2.3" +version = "3.2.4" edition = "2021" [dependencies] -shared = { version = "3.2.3", path = "../shared" } +shared = { version = "3.2.4", path = "../shared" } chrono = "0" yew = "0.21" yew-router = "0.18" diff --git a/shared/Cargo.toml b/shared/Cargo.toml index 3e30a1de4..bc200e218 100644 --- a/shared/Cargo.toml +++ b/shared/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "shared" -version = "3.2.3" +version = "3.2.4" edition = "2021" [dependencies]