feat: ✨ rtc peer connection offer
This commit is contained in:
parent
7434d131c4
commit
0aa65f0f60
17 changed files with 389 additions and 59 deletions
|
@ -1,20 +1,20 @@
|
|||
use leptos::{
|
||||
IntoView, ev,
|
||||
html::{ElementChild, button},
|
||||
IntoView,
|
||||
attr::Value,
|
||||
ev,
|
||||
html::{ElementChild, button, form, input},
|
||||
logging::log,
|
||||
prelude::{OnAttribute, Read, Show, ShowProps, ToChildren},
|
||||
prelude::{BindAttribute, Get, OnAttribute, Read, Show, ShowProps, ToChildren, signal},
|
||||
server::LocalResource,
|
||||
task::spawn_local,
|
||||
};
|
||||
use wasm_bindgen_futures::JsFuture;
|
||||
use web_sys::{
|
||||
HtmlAudioElement, MediaStream, MediaStreamConstraints, MediaStreamTrack, MediaTrackConstraints,
|
||||
wasm_bindgen::{JsCast, JsValue},
|
||||
window,
|
||||
};
|
||||
use web_sys::HtmlAudioElement;
|
||||
|
||||
use crate::{media::audio, rtc::offer, signal::start_signalling};
|
||||
|
||||
pub fn app() -> impl IntoView {
|
||||
let audio_stream = LocalResource::new(|| media());
|
||||
let audio_stream = LocalResource::new(|| audio());
|
||||
let props = ShowProps::builder()
|
||||
.when(move || audio_stream.read().is_some())
|
||||
.children(ToChildren::to_children(move || {
|
||||
|
@ -38,47 +38,42 @@ pub fn app() -> impl IntoView {
|
|||
}))
|
||||
.fallback(|| button().child("Sad Button"))
|
||||
.build();
|
||||
Show(props)
|
||||
(Show(props), signalling(), rtc())
|
||||
}
|
||||
|
||||
async fn media() -> MediaStream {
|
||||
let media_devices = window().unwrap().navigator().media_devices().unwrap();
|
||||
let media_stream_constraints = MediaStreamConstraints::new();
|
||||
let media_track_constraints = MediaTrackConstraints::new();
|
||||
fn signalling() -> impl IntoView {
|
||||
let signalling_server_input_data = signal(String::new());
|
||||
let signalling_trigger = move || {
|
||||
spawn_local(start_signalling(
|
||||
"Zurna Dürüm".to_string(),
|
||||
signalling_server_input_data.0.get(),
|
||||
))
|
||||
};
|
||||
let signalling_server_input = form()
|
||||
.child(
|
||||
input()
|
||||
.bind(Value, signalling_server_input_data)
|
||||
.placeholder("0.0.0.0:4546")
|
||||
.r#type("text"),
|
||||
)
|
||||
.on(ev::submit, move |event| {
|
||||
event.prevent_default();
|
||||
signalling_trigger()
|
||||
});
|
||||
|
||||
media_stream_constraints.set_audio(&JsValue::TRUE);
|
||||
|
||||
media_track_constraints.set_echo_cancellation(&JsValue::FALSE);
|
||||
media_track_constraints.set_noise_suppression(&JsValue::FALSE);
|
||||
media_track_constraints.set_auto_gain_control(&JsValue::FALSE);
|
||||
|
||||
let media_stream_promise = media_devices
|
||||
.get_user_media_with_constraints(&media_stream_constraints)
|
||||
.unwrap();
|
||||
let media_stream = JsFuture::from(media_stream_promise)
|
||||
.await
|
||||
.unwrap()
|
||||
.dyn_into::<MediaStream>()
|
||||
.unwrap();
|
||||
let audio_stream_tracks = media_stream.get_audio_tracks();
|
||||
let audio_stream_tracks = audio_stream_tracks
|
||||
.iter()
|
||||
.map(|audio_track| audio_track.dyn_into::<MediaStreamTrack>().unwrap())
|
||||
.collect::<Vec<_>>();
|
||||
log!(
|
||||
"{:#?}\n audio_stream_track_count = {}",
|
||||
audio_stream_tracks,
|
||||
audio_stream_tracks.len()
|
||||
);
|
||||
let audio_stream_track = audio_stream_tracks.first().unwrap();
|
||||
let audio_stream_track_apply_constraints_promise = audio_stream_track
|
||||
.apply_constraints_with_constraints(&media_track_constraints)
|
||||
.unwrap();
|
||||
JsFuture::from(audio_stream_track_apply_constraints_promise)
|
||||
.await
|
||||
.unwrap();
|
||||
let audio_stream = MediaStream::new().unwrap();
|
||||
log!("{:#?}", audio_stream_track.get_constraints());
|
||||
audio_stream.add_track(audio_stream_track);
|
||||
audio_stream
|
||||
let signalling_submit_button = button()
|
||||
.on(ev::click, move |_| signalling_trigger())
|
||||
.child("Signal");
|
||||
(signalling_server_input, signalling_submit_button)
|
||||
}
|
||||
|
||||
fn rtc() -> impl IntoView {
|
||||
let rtc_trigger = || {
|
||||
spawn_local(offer());
|
||||
};
|
||||
|
||||
let rtc_start_button = button()
|
||||
.on(ev::click, move |_| rtc_trigger())
|
||||
.child("RTC Offer");
|
||||
rtc_start_button
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue