feat: rtc peer connection offer

This commit is contained in:
Ahmet Kaan Gümüş 2025-04-11 04:58:16 +03:00
parent 7434d131c4
commit 0aa65f0f60
17 changed files with 389 additions and 59 deletions

View file

@ -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
}