fix: reocnnects
This commit is contained in:
parent
9acb688379
commit
af89394df1
1 changed files with 9 additions and 4 deletions
|
|
@ -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();
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue