From d5ae31aa1b541584755261ab46e213decbf992e9 Mon Sep 17 00:00:00 2001 From: vicrodh <103399283+vicrodh@users.noreply.github.com> Date: Fri, 1 May 2026 12:37:48 -0600 Subject: [PATCH] fix(qconnect): move startup auto-connect to end of setup hook The auto-connect spawn was running on a worker thread before CoreBridge inner init completed, risking undefined behavior in service.connect. Moving it to the end of setup ensures all init runs first. cc --- src-tauri/src/lib.rs | 100 ++++++++++++++++++++++--------------------- 1 file changed, 51 insertions(+), 49 deletions(-) diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index 0c4813710..1377345b5 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -1007,55 +1007,6 @@ pub fn run(qconnect_cli_override: Option) { } } - // QConnect auto-connect-on-startup decision. - { - use qconnect_app::compute_effective_startup; - let mode = crate::qconnect::startup::load_startup_mode(); - let last = crate::qconnect::startup::load_last_known_state(); - let should_connect = compute_effective_startup(mode, qconnect_cli_override, last); - - log::info!( - "[QConnect] startup decision: mode={} cli_override={:?} last_known={:?} -> {}", - mode.as_str(), - qconnect_cli_override, - last, - should_connect - ); - - if should_connect { - let app_handle = app.handle().clone(); - tauri::async_runtime::spawn(async move { - // Best-effort: pull the managed states by handle. - let service = app_handle.state::(); - let core_bridge = app_handle.state::(); - let app_state = app_handle.state::(); - - // Use default options; auto-discovery via qws/createToken resolves - // endpoint+JWT (see transport.rs::resolve_transport_config). - let config = match crate::qconnect::transport::resolve_transport_config( - Default::default(), - &app_state, - ) - .await - { - Ok(c) => c, - Err(e) => { - log::warn!("[QConnect] startup auto-connect transport resolve failed: {e}"); - return; - } - }; - - if let Err(e) = service.connect(app_handle.clone(), core_bridge.0.clone(), config).await { - log::warn!("[QConnect] startup auto-connect failed: {e}"); - // Lifecycle stays Off; existing reconnect loop only fires for - // established sessions, not for failed initial connects. - } else { - log::info!("[QConnect] startup auto-connect succeeded"); - } - }); - } - } - // Initialize CoreBridge (new multi-crate architecture) // Store V2 player state for event loop access let v2_player_state: Arc>> = @@ -1310,6 +1261,57 @@ pub fn run(qconnect_cli_override: Option) { } }); + // QConnect auto-connect-on-startup decision. + // Placed last so CoreBridge and all other managed state is initialized + // before the spawned task runs service.connect. + { + use qconnect_app::compute_effective_startup; + let mode = crate::qconnect::startup::load_startup_mode(); + let last = crate::qconnect::startup::load_last_known_state(); + let should_connect = compute_effective_startup(mode, qconnect_cli_override, last); + + log::info!( + "[QConnect] startup decision: mode={} cli_override={:?} last_known={:?} -> {}", + mode.as_str(), + qconnect_cli_override, + last, + should_connect + ); + + if should_connect { + let app_handle = app.handle().clone(); + tauri::async_runtime::spawn(async move { + // Best-effort: pull the managed states by handle. + let service = app_handle.state::(); + let core_bridge = app_handle.state::(); + let app_state = app_handle.state::(); + + // Use default options; auto-discovery via qws/createToken resolves + // endpoint+JWT (see transport.rs::resolve_transport_config). + let config = match crate::qconnect::transport::resolve_transport_config( + Default::default(), + &app_state, + ) + .await + { + Ok(c) => c, + Err(e) => { + log::warn!("[QConnect] startup auto-connect transport resolve failed: {e}"); + return; + } + }; + + if let Err(e) = service.connect(app_handle.clone(), core_bridge.0.clone(), config).await { + log::warn!("[QConnect] startup auto-connect failed: {e}"); + // Lifecycle stays Off; existing reconnect loop only fires for + // established sessions, not for failed initial connects. + } else { + log::info!("[QConnect] startup auto-connect succeeded"); + } + }); + } + } + Ok(()) }) .on_window_event(move |window, event| {