2023-07-28 21:04:44 +01:00
|
|
|
use leptos::*;
|
2023-08-31 18:26:03 +01:00
|
|
|
use leptos_use::core::ConnectionReadyState;
|
2023-07-28 21:04:44 +01:00
|
|
|
use leptos_use::docs::demo_or_body;
|
2023-08-31 18:26:03 +01:00
|
|
|
use leptos_use::{use_webtransport_with_options, UseWebTransportOptions};
|
2023-07-28 21:04:44 +01:00
|
|
|
|
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::*;
|
|
|
|
|
2023-07-28 21:04:44 +01:00
|
|
|
#[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-07-28 21:04:44 +01:00
|
|
|
|
2023-08-31 04:42:01 +01:00
|
|
|
let (text, set_text) = create_signal("".to_string());
|
2023-07-28 21:04:44 +01:00
|
|
|
|
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 {
|
|
|
|
match transport.create_bidir_stream().await {
|
|
|
|
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
|
|
|
}
|
2023-07-28 21:04:44 +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/> }
|
|
|
|
})
|
|
|
|
}
|