fix: reocnnects

This commit is contained in:
Evan Carroll 2026-01-23 13:48:56 -06:00
parent 9acb688379
commit af89394df1

View file

@ -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<dyn FnMut(ErrorEvent)>);
}) as Box<dyn FnMut(web_sys::Event)>);
ws.set_onerror(Some(onerror.as_ref().unchecked_ref()));
onerror.forget();