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::Arc;
|
||||||
use std::sync::atomic::{AtomicBool, Ordering};
|
use std::sync::atomic::{AtomicBool, Ordering};
|
||||||
use wasm_bindgen::{JsCast, closure::Closure};
|
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);
|
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
|
// 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");
|
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 {
|
let Some(ch_id) = ch_id else {
|
||||||
|
|
@ -376,17 +379,19 @@ pub fn use_channel_websocket(
|
||||||
onmessage.forget();
|
onmessage.forget();
|
||||||
|
|
||||||
// onerror
|
// 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 set_ws_state_err = set_ws_state;
|
||||||
let ws_state_for_err = ws_state;
|
let ws_state_for_err = ws_state;
|
||||||
let reconnect_trigger_for_error = reconnect_trigger;
|
let reconnect_trigger_for_error = reconnect_trigger;
|
||||||
let is_disposed_for_err = is_disposed_for_effect.clone();
|
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
|
// Skip if component has been disposed
|
||||||
if is_disposed_for_err.load(Ordering::Relaxed) {
|
if is_disposed_for_err.load(Ordering::Relaxed) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
#[cfg(debug_assertions)]
|
#[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
|
// Check if we're in silent reconnection mode
|
||||||
let current_state = ws_state_for_err.get_untracked();
|
let current_state = ws_state_for_err.get_untracked();
|
||||||
|
|
@ -420,7 +425,7 @@ pub fn use_channel_websocket(
|
||||||
} else {
|
} else {
|
||||||
set_ws_state_err.set(WsState::Error);
|
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()));
|
ws.set_onerror(Some(onerror.as_ref().unchecked_ref()));
|
||||||
onerror.forget();
|
onerror.forget();
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue