leptos-use/examples/use_webtransport/src/main.rs

112 lines
3.2 KiB
Rust
Raw Normal View History

use leptos::*;
2023-08-31 18:26:03 +01:00
use leptos_use::core::ConnectionReadyState;
use leptos_use::docs::demo_or_body;
2023-08-31 18:26:03 +01:00
use leptos_use::{use_webtransport_with_options, UseWebTransportOptions};
2023-08-31 20:12:48 +01:00
mod log_display;
mod stream_bidir;
mod stream_send;
use log_display::*;
use stream_bidir::*;
use stream_send::*;
#[component]
fn Demo() -> impl IntoView {
2023-08-31 18:40:03 +01:00
let (datagrams_log, set_datagrams_log) = create_signal(vec![]);
2023-08-31 18:26:03 +01:00
2023-08-31 20:12:48 +01:00
let id = store_value(0);
2023-08-31 18:26:03 +01:00
let transport = use_webtransport_with_options(
"https://echo.webtransport.day",
UseWebTransportOptions::default()
2023-08-31 18:46:43 +01:00
.on_open(move || {
set_datagrams_log.update(|log| log.push("Connection opened".to_string()))
})
.on_close(move || {
set_datagrams_log.update(|log| log.push("Connection closed".to_string()))
2023-08-31 20:12:48 +01:00
}),
2023-08-31 18:26:03 +01:00
);
2023-08-31 04:42:01 +01:00
let (text, set_text) = create_signal("".to_string());
2023-08-31 20:12:48 +01:00
let on_send_datagrams = {
2023-08-31 04:42:01 +01:00
let transport = transport.clone();
2023-08-31 20:12:48 +01:00
move |_| {
2023-08-31 18:40:03 +01:00
set_datagrams_log.update(|log| log.push(format!("Sent datagram: '{}'", text())));
2023-08-31 18:26:03 +01:00
2023-08-31 04:42:01 +01:00
transport.send_datagrams(text().as_bytes());
2023-08-31 18:46:43 +01:00
set_text("".to_string());
2023-08-31 04:42:01 +01:00
}
};
2023-08-31 18:26:03 +01:00
let _ = watch(
transport.datagrams,
move |grams, _, _| {
if let Some(grams) = grams {
2023-08-31 18:40:03 +01:00
set_datagrams_log.update(|log| {
2023-08-31 18:26:03 +01:00
log.push(format!(
"Received datagrams: '{}'",
String::from_utf8(grams.clone()).expect("valid utf8")
))
});
}
},
false,
);
2023-08-31 20:12:48 +01:00
let (bidir_streams, set_bidir_streams) = create_signal(vec![]);
let on_open_bidir_stream = {
let transport = transport.clone();
move |_| {
let transport = transport.clone();
spawn_local(async move {
2023-09-14 15:24:54 +01:00
match transport.open_bidir_stream().await {
2023-08-31 20:12:48 +01:00
Ok(bidir_stream) => {
let i = id.get_value();
id.set_value(i + 1);
set_bidir_streams.update(|s| s.push((i, bidir_stream)));
}
Err(e) => {
set_datagrams_log.update(|log| {
log.push(format!("Failed to open bidir stream: {:?}", e))
});
}
}
});
}
};
2023-08-31 18:40:03 +01:00
let ready_state = transport.ready_state;
2023-08-31 04:42:01 +01:00
view! {
2023-08-31 20:12:48 +01:00
<button on:click=on_open_bidir_stream>"Open Bidir Stream"</button>
2023-08-31 18:26:03 +01:00
<h2>Datagrams</h2>
2023-08-31 18:46:43 +01:00
<textarea on:change=move |e| set_text(event_target_value(&e)) prop:value=text />
2023-08-31 20:12:48 +01:00
<button on:click=on_send_datagrams disabled=move || ready_state() != ConnectionReadyState::Open>"Send"</button>
<LogDisplay log=datagrams_log />
2023-08-31 18:26:03 +01:00
2023-08-31 20:12:48 +01:00
<h2>Bidir Streams</h2>
<For
each=bidir_streams
key=|(i, _)| *i
view=move |(_, bidir_stream)| view! { <StreamBidir ready_state=ready_state stream=bidir_stream.clone() /> }
/>
2023-08-31 04:42:01 +01:00
}
}
fn main() {
_ = console_log::init_with_level(log::Level::Debug);
console_error_panic_hook::set_once();
mount_to(demo_or_body(), || {
view! { <Demo/> }
})
}