diff --git a/Cargo.toml b/Cargo.toml index 78ea78a..73edab3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -336,7 +336,7 @@ use_web_notification = [ "web-sys/NotificationDirection", "web-sys/VisibilityState" ] -use_websocket = ["dep:codee"] +use_websocket = ["dep:web-sys", "dep:codee"] use_window = ["use_document", "dep:web-sys", "web-sys/Navigator", "web-sys/MediaQueryList"] use_window_focus = ["use_event_listener"] use_window_scroll = ["use_event_listener", "use_window"] diff --git a/src/use_websocket.rs b/src/use_websocket.rs index e7e420c..ea9ce38 100644 --- a/src/use_websocket.rs +++ b/src/use_websocket.rs @@ -344,17 +344,19 @@ where } let web_socket = { - protocols.as_ref().map_or_else( - || WebSocket::new(&url).unwrap_throw(), - |protocols| { - let array = protocols - .iter() - .map(|p| JsValue::from(p.clone())) - .collect::(); - WebSocket::new_with_str_sequence(&url, &JsValue::from(&array)) - .unwrap_throw() - }, - ) + protocols.with_untracked(|protocols| { + protocols.as_ref().map_or_else( + || WebSocket::new(&url).unwrap_throw(), + |protocols| { + let array = protocols + .iter() + .map(|p| JsValue::from(p.clone())) + .collect::(); + WebSocket::new_with_str_sequence(&url, &JsValue::from(&array)) + .unwrap_throw() + }, + ) + }) }; web_socket.set_binary_type(BinaryType::Arraybuffer); set_ready_state.set(ConnectionReadyState::Connecting); @@ -650,7 +652,13 @@ where /// Defaults to `true`. immediate: bool, /// Sub protocols. See [MDN Docs](https://developer.mozilla.org/en-US/docs/Web/API/WebSocket/WebSocket#protocols). - protocols: Option>, + /// + /// Can be set as a signal to support protocols only available after the initial render. + /// + /// Note that protocols are only updated on the next websocket open() call, not whenever the signal is updated. + /// Therefore "lazy" protocols should use the `immediate(false)` option and manually call `open()`. + #[builder(into)] + protocols: MaybeSignal>>, } impl UseWebSocketOptions {