From af89394df1b05c121a7458ff65c573c52c09c45bbddfc31d7d33e401d4a3c927 Mon Sep 17 00:00:00 2001 From: Evan Carroll Date: Fri, 23 Jan 2026 13:48:56 -0600 Subject: [PATCH] fix: reocnnects --- .../chattyness-user-ui/src/components/ws_client.rs | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/crates/chattyness-user-ui/src/components/ws_client.rs b/crates/chattyness-user-ui/src/components/ws_client.rs index 9e47baf..f79663a 100644 --- a/crates/chattyness-user-ui/src/components/ws_client.rs +++ b/crates/chattyness-user-ui/src/components/ws_client.rs @@ -196,7 +196,7 @@ pub fn use_channel_websocket( use std::sync::Arc; use std::sync::atomic::{AtomicBool, Ordering}; use wasm_bindgen::{JsCast, closure::Closure}; - use web_sys::{CloseEvent, ErrorEvent, MessageEvent, WebSocket}; + use web_sys::{CloseEvent, MessageEvent, WebSocket}; let (ws_state, set_ws_state) = signal(WsState::Disconnected); @@ -254,6 +254,9 @@ pub fn use_channel_websocket( // Close with SCENE_CHANGE code so onclose handler knows this was intentional let _ = old_ws.close_with_code_and_reason(close_codes::SCENE_CHANGE, "scene change"); } + // Reset the intentional close flag for the new connection. + // This ensures the new connection's handlers don't see a stale flag. + state.is_intentional_close = false; } let Some(ch_id) = ch_id else { @@ -376,17 +379,19 @@ pub fn use_channel_websocket( onmessage.forget(); // onerror + // Note: WebSocket.onerror receives a generic Event, not ErrorEvent. + // The event has no useful error details - just indicates an error occurred. let set_ws_state_err = set_ws_state; let ws_state_for_err = ws_state; let reconnect_trigger_for_error = reconnect_trigger; let is_disposed_for_err = is_disposed_for_effect.clone(); - let onerror = Closure::wrap(Box::new(move |e: ErrorEvent| { + let onerror = Closure::wrap(Box::new(move |_e: web_sys::Event| { // Skip if component has been disposed if is_disposed_for_err.load(Ordering::Relaxed) { return; } #[cfg(debug_assertions)] - web_sys::console::error_1(&format!("[WS] Error: {:?}", e.message()).into()); + web_sys::console::error_1(&"[WS] Error occurred".into()); // Check if we're in silent reconnection mode let current_state = ws_state_for_err.get_untracked(); @@ -420,7 +425,7 @@ pub fn use_channel_websocket( } else { set_ws_state_err.set(WsState::Error); } - }) as Box); + }) as Box); ws.set_onerror(Some(onerror.as_ref().unchecked_ref())); onerror.forget();