mirror of
https://github.com/adoyle0/leptos-use.git
synced 2025-01-23 00:59:22 -05:00
added relative urls to use_websocket
This commit is contained in:
parent
e5dc5a0233
commit
66cdfab719
2 changed files with 58 additions and 3 deletions
|
@ -39,6 +39,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
||||||
|
|
||||||
### Other Changes 🔥
|
### Other Changes 🔥
|
||||||
|
|
||||||
|
- `use_websocket` can use relative urls now
|
||||||
- Callbacks in options don't require to be cloneable anymore
|
- Callbacks in options don't require to be cloneable anymore
|
||||||
- Callback in `use_raf_fn` doesn't require to be cloneable anymore
|
- Callback in `use_raf_fn` doesn't require to be cloneable anymore
|
||||||
- All (!) functions can now be safely called on the server. Specifically this includes the following that
|
- All (!) functions can now be safely called on the server. Specifically this includes the following that
|
||||||
|
|
|
@ -74,9 +74,22 @@ use web_sys::{BinaryType, CloseEvent, Event, MessageEvent, WebSocket};
|
||||||
/// # }
|
/// # }
|
||||||
/// ```
|
/// ```
|
||||||
///
|
///
|
||||||
|
/// ## Relative Paths
|
||||||
|
///
|
||||||
|
/// If the provided `url` is relative, it will be resolved relative to the current page.
|
||||||
|
/// Urls will be resolved like this:
|
||||||
|
///
|
||||||
|
/// | Current Page | Relative Url | Resolved Url |
|
||||||
|
/// |--------------------------------|--------------------------|-------------------------------------|
|
||||||
|
/// | http://example.com/some/where | /api/ws | ws://example.com/api/ws |
|
||||||
|
/// | https://example.com/some/where | /api/ws | wss://example.com/api/ws |
|
||||||
|
/// | https://example.com/some/where | api/ws | wss://example.com/some/where/api/ws |
|
||||||
|
/// | https://example.com/some/where | //otherdomain.com/api/ws | wss://otherdomain.com/api/ws |
|
||||||
|
///
|
||||||
|
///
|
||||||
/// ## Server-Side Rendering
|
/// ## Server-Side Rendering
|
||||||
///
|
///
|
||||||
/// On the server the returned functions amount to noops.
|
/// On the server the returned functions amount to no-ops.
|
||||||
pub fn use_websocket(
|
pub fn use_websocket(
|
||||||
url: &str,
|
url: &str,
|
||||||
) -> UseWebsocketReturn<
|
) -> UseWebsocketReturn<
|
||||||
|
@ -98,8 +111,8 @@ pub fn use_websocket_with_options(
|
||||||
impl Fn(String) + Clone + 'static,
|
impl Fn(String) + Clone + 'static,
|
||||||
impl Fn(Vec<u8>) + Clone,
|
impl Fn(Vec<u8>) + Clone,
|
||||||
> {
|
> {
|
||||||
let url = url.to_string();
|
let url = normalize_url(url);
|
||||||
|
logging::log!("{}", url);
|
||||||
let UseWebSocketOptions {
|
let UseWebSocketOptions {
|
||||||
on_open,
|
on_open,
|
||||||
on_message,
|
on_message,
|
||||||
|
@ -419,3 +432,44 @@ where
|
||||||
/// Sends binary data
|
/// Sends binary data
|
||||||
pub send_bytes: SendBytesFn,
|
pub send_bytes: SendBytesFn,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn normalize_url(url: &str) -> String {
|
||||||
|
cfg_if! { if #[cfg(feature = "ssr")] {
|
||||||
|
url.to_string()
|
||||||
|
} else {
|
||||||
|
if url.starts_with("ws://") || url.starts_with("wss://") {
|
||||||
|
url.to_string()
|
||||||
|
} else if url.starts_with("http://") || url.starts_with("https://") {
|
||||||
|
url.replacen("http", "ws", 1)
|
||||||
|
} else if url.starts_with("//") {
|
||||||
|
format!("{}{}", detect_protocol(), url)
|
||||||
|
} else if url.starts_with('/') {
|
||||||
|
format!(
|
||||||
|
"{}//{}{}",
|
||||||
|
detect_protocol(),
|
||||||
|
window().location().host().expect("Host not found"),
|
||||||
|
url
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
let mut path = window().location().pathname().expect("Pathname not found");
|
||||||
|
if !path.ends_with('/') {
|
||||||
|
path.push('/')
|
||||||
|
}
|
||||||
|
format!(
|
||||||
|
"{}//{}{}{}",
|
||||||
|
detect_protocol(),
|
||||||
|
window().location().host().expect("Host not found"),
|
||||||
|
path,
|
||||||
|
url
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn detect_protocol() -> String {
|
||||||
|
cfg_if! { if #[cfg(feature = "ssr")] {
|
||||||
|
"ws".to_string()
|
||||||
|
} else {
|
||||||
|
window().location().protocol().expect("Protocol not found").replace("http", "ws")
|
||||||
|
}}
|
||||||
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue