From acdae3f1562857d593dfe3bfb40b0b26f83a3e15 Mon Sep 17 00:00:00 2001 From: Oscar Beaumont Date: Thu, 23 Oct 2025 19:30:59 +0800 Subject: [PATCH 1/6] fix --- apps/desktop/src-tauri/src/lib.rs | 26 +++++++----- apps/desktop/src-tauri/src/posthog.rs | 58 +++++++++++++++++++-------- 2 files changed, 58 insertions(+), 26 deletions(-) diff --git a/apps/desktop/src-tauri/src/lib.rs b/apps/desktop/src-tauri/src/lib.rs index 2a0eb78225..f51d48bf75 100644 --- a/apps/desktop/src-tauri/src/lib.rs +++ b/apps/desktop/src-tauri/src/lib.rs @@ -1880,7 +1880,10 @@ async fn check_notification_permissions(app: AppHandle) { #[specta::specta] #[instrument(skip(app))] async fn set_server_url(app: MutableState<'_, App>, server_url: String) -> Result<(), ()> { - app.write().await.server_url = server_url; + let mut app = app.write().await; + posthog::set_server_url(&server_url); + app.server_url = server_url; + Ok(()) } @@ -2223,6 +2226,17 @@ pub async fn run(recording_logging_handle: LoggingHandle, logs_dir: PathBuf) { }); { + let server_url = std::option_env!("VITE_SERVER_URL") + .map(|s| s.to_string()) + .or_else(|| { + GeneralSettingsStore::get(&app) + .ok() + .flatten() + .map(|v| v.server_url.clone()) + }) + .unwrap_or_else(|| "https://cap.so".to_string()); + posthog::set_server_url(&server_url); + app.manage(Arc::new(RwLock::new(App { camera_ws_port, handle: app.clone(), @@ -2231,15 +2245,7 @@ pub async fn run(recording_logging_handle: LoggingHandle, logs_dir: PathBuf) { recording_logging_handle, mic_feed, camera_feed, - server_url: std::option_env!("VITE_SERVER_URL") - .map(|s| s.to_string()) - .or_else(|| { - GeneralSettingsStore::get(&app) - .ok() - .flatten() - .map(|v| v.server_url.clone()) - }) - .unwrap_or_else(|| "https://cap.so".to_string()), + server_url, logs_dir: logs_dir.clone(), }))); diff --git a/apps/desktop/src-tauri/src/posthog.rs b/apps/desktop/src-tauri/src/posthog.rs index d260e0c8b2..80cf77e4e1 100644 --- a/apps/desktop/src-tauri/src/posthog.rs +++ b/apps/desktop/src-tauri/src/posthog.rs @@ -1,4 +1,7 @@ -use std::time::Duration; +use std::{ + sync::{OnceLock, PoisonError, RwLock}, + time::Duration, +}; use tracing::error; #[derive(Debug)] @@ -21,7 +24,7 @@ pub enum PostHogEvent { impl From for posthog_rs::Event { fn from(event: PostHogEvent) -> Self { - let mut e = match event { + match event { PostHogEvent::MultipartUploadComplete { duration, length, @@ -49,19 +52,7 @@ impl From for posthog_rs::Event { .ok(); e } - }; - - e.insert_prop("cap_version", env!("CARGO_PKG_VERSION")) - .map_err(|err| error!("Error adding PostHog property: {err:?}")) - .ok(); - e.insert_prop("os", std::env::consts::OS) - .map_err(|err| error!("Error adding PostHog property: {err:?}")) - .ok(); - e.insert_prop("arch", std::env::consts::ARCH) - .map_err(|err| error!("Error adding PostHog property: {err:?}")) - .ok(); - - e + } } } @@ -76,10 +67,45 @@ pub fn init() { } } +pub fn set_server_url(url: &str) { + *API_SERVER_IS_CAP_CLOUD + .get_or_init(Default::default) + .write() + .unwrap_or_else(PoisonError::into_inner) = Some(url.contains("https://cap.so")); +} + +static API_SERVER_IS_CAP_CLOUD: OnceLock>> = OnceLock::new(); + pub fn async_capture_event(event: PostHogEvent) { if option_env!("VITE_POSTHOG_KEY").is_some() { tokio::spawn(async move { - posthog_rs::capture(event.into()) + let mut e: posthog_rs::Event = event.into(); + + e.insert_prop("cap_version", env!("CARGO_PKG_VERSION")) + .map_err(|err| error!("Error adding PostHog property: {err:?}")) + .ok(); + e.insert_prop( + "cap_backend", + match *API_SERVER_IS_CAP_CLOUD + .get_or_init(Default::default) + .read() + .unwrap_or_else(PoisonError::into_inner) + { + Some(true) => "cloud", + Some(false) => "self_hosted", + None => "unknown", + }, + ) + .map_err(|err| error!("Error adding PostHog property: {err:?}")) + .ok(); + e.insert_prop("os", std::env::consts::OS) + .map_err(|err| error!("Error adding PostHog property: {err:?}")) + .ok(); + e.insert_prop("arch", std::env::consts::ARCH) + .map_err(|err| error!("Error adding PostHog property: {err:?}")) + .ok(); + + posthog_rs::capture(e) .await .map_err(|err| error!("Error sending event to PostHog: {err:?}")) .ok(); From 79d33da72496e6120af030fc5a456db7bd24ad4b Mon Sep 17 00:00:00 2001 From: Oscar Beaumont Date: Thu, 23 Oct 2025 19:36:21 +0800 Subject: [PATCH 2/6] fixes --- apps/desktop/src-tauri/src/lib.rs | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/apps/desktop/src-tauri/src/lib.rs b/apps/desktop/src-tauri/src/lib.rs index f51d48bf75..e73d367ef2 100644 --- a/apps/desktop/src-tauri/src/lib.rs +++ b/apps/desktop/src-tauri/src/lib.rs @@ -2227,7 +2227,17 @@ pub async fn run(recording_logging_handle: LoggingHandle, logs_dir: PathBuf) { { let server_url = std::option_env!("VITE_SERVER_URL") - .map(|s| s.to_string()) + .map(|s| { + GeneralSettingsStore::update(&app, |state| { + state.server_url = s.to_string(); + }) + .map_err(|err| { + error!("Error updating server URL to match value from env: {err}") + }) + .ok(); + + s.to_string() + }) .or_else(|| { GeneralSettingsStore::get(&app) .ok() From b6da141bfe0898d9c38e67196cbcf3dd7e68b405 Mon Sep 17 00:00:00 2001 From: Oscar Beaumont Date: Thu, 23 Oct 2025 19:59:34 +0800 Subject: [PATCH 3/6] safer comparision --- apps/desktop/src-tauri/src/posthog.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/desktop/src-tauri/src/posthog.rs b/apps/desktop/src-tauri/src/posthog.rs index 80cf77e4e1..068b925054 100644 --- a/apps/desktop/src-tauri/src/posthog.rs +++ b/apps/desktop/src-tauri/src/posthog.rs @@ -71,7 +71,7 @@ pub fn set_server_url(url: &str) { *API_SERVER_IS_CAP_CLOUD .get_or_init(Default::default) .write() - .unwrap_or_else(PoisonError::into_inner) = Some(url.contains("https://cap.so")); + .unwrap_or_else(PoisonError::into_inner) = Some(url == "https://cap.so"); } static API_SERVER_IS_CAP_CLOUD: OnceLock>> = OnceLock::new(); From 9a5d32effc3a764a896e65b35318ae40652da0aa Mon Sep 17 00:00:00 2001 From: Oscar Beaumont Date: Thu, 23 Oct 2025 20:48:37 +0800 Subject: [PATCH 4/6] fix --- apps/desktop/src-tauri/src/lib.rs | 38 +++++++++++++++++-------------- 1 file changed, 21 insertions(+), 17 deletions(-) diff --git a/apps/desktop/src-tauri/src/lib.rs b/apps/desktop/src-tauri/src/lib.rs index e73d367ef2..0b4cc342e2 100644 --- a/apps/desktop/src-tauri/src/lib.rs +++ b/apps/desktop/src-tauri/src/lib.rs @@ -2226,25 +2226,29 @@ pub async fn run(recording_logging_handle: LoggingHandle, logs_dir: PathBuf) { }); { - let server_url = std::option_env!("VITE_SERVER_URL") - .map(|s| { - GeneralSettingsStore::update(&app, |state| { - state.server_url = s.to_string(); - }) - .map_err(|err| { - error!("Error updating server URL to match value from env: {err}") - }) - .ok(); + let (server_url, should_update) = if cfg!(debug_assertions) + && let Ok(url) = std::env::var("VITE_SERVER_URL") + { + (url, true) + } else if let Some(url) = GeneralSettingsStore::get(&app) + .ok() + .flatten() + .map(|v| v.server_url.clone()) + { + (url, false) + } else { + (env!("VITE_SERVER_URL").to_string(), true) + }; - s.to_string() + // This ensures settings reflects the correct value if it's set at startup + if should_update { + GeneralSettingsStore::update(&app, |mut s| { + s.server_url = server_url.clone(); }) - .or_else(|| { - GeneralSettingsStore::get(&app) - .ok() - .flatten() - .map(|v| v.server_url.clone()) - }) - .unwrap_or_else(|| "https://cap.so".to_string()); + .map_err(|err| warn!("Error updating server URL into settings store: {err}")) + .ok(); + } + posthog::set_server_url(&server_url); app.manage(Arc::new(RwLock::new(App { From 0e2cf9c298b1e834a615ece5cce6222d6f556779 Mon Sep 17 00:00:00 2001 From: Oscar Beaumont Date: Thu, 23 Oct 2025 20:57:14 +0800 Subject: [PATCH 5/6] fallback to cap.so --- apps/desktop/src-tauri/src/lib.rs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/apps/desktop/src-tauri/src/lib.rs b/apps/desktop/src-tauri/src/lib.rs index 0b4cc342e2..659c72326e 100644 --- a/apps/desktop/src-tauri/src/lib.rs +++ b/apps/desktop/src-tauri/src/lib.rs @@ -2237,7 +2237,12 @@ pub async fn run(recording_logging_handle: LoggingHandle, logs_dir: PathBuf) { { (url, false) } else { - (env!("VITE_SERVER_URL").to_string(), true) + ( + optional_env!("VITE_SERVER_URL") + .unwrap_or("https://cap.so") + .to_string(), + true, + ) }; // This ensures settings reflects the correct value if it's set at startup From bcf8ab6f93adbfa63cde2a1270e64ee0abcea14e Mon Sep 17 00:00:00 2001 From: Oscar Beaumont Date: Thu, 23 Oct 2025 20:57:25 +0800 Subject: [PATCH 6/6] Rust properly --- apps/desktop/src-tauri/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/desktop/src-tauri/src/lib.rs b/apps/desktop/src-tauri/src/lib.rs index 659c72326e..ee87156701 100644 --- a/apps/desktop/src-tauri/src/lib.rs +++ b/apps/desktop/src-tauri/src/lib.rs @@ -2238,7 +2238,7 @@ pub async fn run(recording_logging_handle: LoggingHandle, logs_dir: PathBuf) { (url, false) } else { ( - optional_env!("VITE_SERVER_URL") + option_env!("VITE_SERVER_URL") .unwrap_or("https://cap.so") .to_string(), true,