refactor: ♻️ media stream

This commit is contained in:
Ahmet Kaan Gümüş 2025-05-01 16:57:03 +03:00
parent 53a73285b9
commit 87f7d0763f
3 changed files with 27 additions and 23 deletions

View file

@ -25,7 +25,7 @@ pub fn app() -> impl IntoView {
}) })
.children(ToChildren::to_children(move || { .children(ToChildren::to_children(move || {
let audio_stream = audio_stream.read(); let audio_stream = audio_stream.read();
let audio_stream = audio_stream.as_deref().unwrap().clone(); let audio_stream = audio_stream.as_deref().unwrap().as_ref().unwrap().clone();
let webrtc = WebRTC::new(Some(audio_stream), None, None).unwrap(); let webrtc = WebRTC::new(Some(audio_stream), None, None).unwrap();
let webrtc_state = webrtc.clone(); let webrtc_state = webrtc.clone();

View file

@ -1,4 +1,4 @@
use leptos::logging::log; use protocol::Error;
use wasm_bindgen_futures::JsFuture; use wasm_bindgen_futures::JsFuture;
use web_sys::{ use web_sys::{
MediaStream, MediaStreamConstraints, MediaStreamTrack, MediaTrackConstraints, MediaStream, MediaStreamConstraints, MediaStreamTrack, MediaTrackConstraints,
@ -6,44 +6,48 @@ use web_sys::{
window, window,
}; };
pub async fn audio() -> MediaStream { pub async fn audio() -> Result<MediaStream, Error> {
let media_devices = window().unwrap().navigator().media_devices().unwrap(); let media_devices = window()
.ok_or(Error::MediaStream("Accessing Window".to_owned()))?
.navigator()
.media_devices()
.map_err(|err_val| Error::MediaStream(format!("{:?}", err_val)))?;
let media_stream_constraints = MediaStreamConstraints::new(); let media_stream_constraints = MediaStreamConstraints::new();
let media_track_constraints = MediaTrackConstraints::new(); let media_track_constraints = MediaTrackConstraints::new();
media_stream_constraints.set_audio(&JsValue::TRUE); media_stream_constraints.set_audio(&JsValue::TRUE);
media_track_constraints.set_echo_cancellation(&JsValue::FALSE); media_track_constraints.set_echo_cancellation(&JsValue::FALSE);
media_track_constraints.set_noise_suppression(&JsValue::FALSE); media_track_constraints.set_noise_suppression(&JsValue::FALSE);
media_track_constraints.set_auto_gain_control(&JsValue::FALSE); media_track_constraints.set_auto_gain_control(&JsValue::FALSE);
let media_stream_promise = media_devices let media_stream_promise = media_devices
.get_user_media_with_constraints(&media_stream_constraints) .get_user_media_with_constraints(&media_stream_constraints)
.unwrap(); .map_err(|err_val| Error::MediaStream(format!("{:?}", err_val)))?;
let media_stream = JsFuture::from(media_stream_promise) let media_stream = JsFuture::from(media_stream_promise)
.await .await
.unwrap() .map_err(|err_val| Error::MediaStream(format!("{:?}", err_val)))?;
.dyn_into::<MediaStream>() let media_stream = media_stream.unchecked_ref::<MediaStream>();
.unwrap();
let audio_stream_tracks = media_stream.get_audio_tracks(); let audio_stream_tracks = media_stream.get_audio_tracks();
let audio_stream_tracks = audio_stream_tracks let audio_stream_tracks = audio_stream_tracks
.iter() .iter()
.map(|audio_track| audio_track.dyn_into::<MediaStreamTrack>().unwrap()) .map(|audio_track| MediaStreamTrack::from(audio_track))
.collect::<Vec<_>>(); .collect::<Vec<_>>();
log!( let audio_stream_track = audio_stream_tracks
"{:#?}\n audio_stream_track_count = {}", .first()
audio_stream_tracks, .ok_or(Error::MediaStream("Get First Media Track".to_owned()))?;
audio_stream_tracks.len()
);
let audio_stream_track = audio_stream_tracks.first().unwrap();
let audio_stream_track_apply_constraints_promise = audio_stream_track let audio_stream_track_apply_constraints_promise = audio_stream_track
.apply_constraints_with_constraints(&media_track_constraints) .apply_constraints_with_constraints(&media_track_constraints)
.unwrap(); .map_err(|err_val| Error::MediaStream(format!("{:?}", err_val)))?;
JsFuture::from(audio_stream_track_apply_constraints_promise) JsFuture::from(audio_stream_track_apply_constraints_promise)
.await .await
.unwrap(); .map_err(|err_val| Error::MediaStream(format!("{:?}", err_val)))?;
let audio_stream = MediaStream::new().unwrap();
log!("{:#?}", audio_stream_track.get_constraints()); let audio_stream =
MediaStream::new().map_err(|err_val| Error::MediaStream(format!("{:?}", err_val)))?;
audio_stream.add_track(audio_stream_track); audio_stream.add_track(audio_stream_track);
audio_stream
Ok(audio_stream)
} }

View file

@ -10,6 +10,7 @@ pub struct User {
#[derive(Debug, Clone, Serialize, Deserialize)] #[derive(Debug, Clone, Serialize, Deserialize)]
pub enum Error { pub enum Error {
MediaStream(String),
InvalidSignalType(String), InvalidSignalType(String),
UnexpectedSignalType(SignalType), UnexpectedSignalType(SignalType),
WebSocketInitialization, WebSocketInitialization,
@ -39,14 +40,13 @@ impl std::error::Error for Error {
impl Display for Error { impl Display for Error {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self { match self {
Error::MediaStream(err_val) => write!(f, "Media Stream | {}", err_val),
Error::InvalidSignalType(invalid_signal_type) => { Error::InvalidSignalType(invalid_signal_type) => {
write!(f, "Invalid Signal Type: {}", invalid_signal_type) write!(f, "Invalid Signal Type: {}", invalid_signal_type)
} }
Error::UnexpectedSignalType(signal_type) => { Error::UnexpectedSignalType(signal_type) => {
write!(f, "Unexpected Signal Type: {}", signal_type) write!(f, "Unexpected Signal Type: {}", signal_type)
} }
Error::WebSocketInitialization => write!(f, "WebSocket Initialization"), Error::WebSocketInitialization => write!(f, "WebSocket Initialization"),
Error::WebSocketAuth => write!(f, "WebSocket Auth"), Error::WebSocketAuth => write!(f, "WebSocket Auth"),
Error::WebSocketSend(send_error) => write!(f, "WebSocket Send: {}", send_error), Error::WebSocketSend(send_error) => write!(f, "WebSocket Send: {}", send_error),