diff --git a/crates/backend/src/codegen.rs b/crates/backend/src/codegen.rs index 89a69e02..7bfbb2fb 100644 --- a/crates/backend/src/codegen.rs +++ b/crates/backend/src/codegen.rs @@ -844,6 +844,18 @@ impl ToTokens for ast::ImportEnum { } } + #[allow(clippy::all)] + impl ::wasm_bindgen::convert::OptionIntoWasmAbi for #name { + #[inline] + fn none() -> Self::Abi { Object::none() } + } + + #[allow(clippy::all)] + impl ::wasm_bindgen::convert::OptionFromWasmAbi for #name { + #[inline] + fn is_none(abi: &Self::Abi) -> bool { Object::is_none(abi) } + } + #[allow(clippy::all)] impl From<#name> for ::wasm_bindgen::JsValue { fn from(obj: #name) -> ::wasm_bindgen::JsValue { diff --git a/crates/web-sys/Cargo.toml b/crates/web-sys/Cargo.toml index 5956f168..931bb2b5 100644 --- a/crates/web-sys/Cargo.toml +++ b/crates/web-sys/Cargo.toml @@ -814,6 +814,9 @@ RtcRtpSender = [] RtcRtpSourceEntry = [] RtcRtpSourceEntryType = [] RtcRtpSynchronizationSource = [] +RtcRtpTransceiver = [] +RtcRtpTransceiverDirection = [] +RtcRtpTransceiverInit = [] RtcRtxParameters = [] RtcSdpType = [] RtcSessionDescription = [] @@ -826,6 +829,7 @@ RtcStatsReport = [] RtcStatsReportInternal = [] RtcStatsType = [] RtcTrackEvent = [] +RtcTrackEventInit = [] RtcTransportStats = [] RtcdtmfSender = [] RtcdtmfToneChangeEvent = [] diff --git a/crates/web-sys/tests/wasm/main.rs b/crates/web-sys/tests/wasm/main.rs index d4c01b8d..f27d6af7 100644 --- a/crates/web-sys/tests/wasm/main.rs +++ b/crates/web-sys/tests/wasm/main.rs @@ -48,6 +48,7 @@ pub mod pre_element; pub mod progress_element; pub mod quote_element; pub mod response; +pub mod rtc_rtp_transceiver_direction; pub mod script_element; pub mod select_element; pub mod slot_element; diff --git a/crates/web-sys/tests/wasm/rtc_rtp_transceiver_direction.rs b/crates/web-sys/tests/wasm/rtc_rtp_transceiver_direction.rs new file mode 100644 index 00000000..632e0c23 --- /dev/null +++ b/crates/web-sys/tests/wasm/rtc_rtp_transceiver_direction.rs @@ -0,0 +1,87 @@ +use wasm_bindgen::{prelude::*, JsCast}; +use wasm_bindgen_futures::JsFuture; +use wasm_bindgen_test::*; + +use futures::Future; + +use web_sys::{ + RtcPeerConnection, RtcRtpTransceiver, RtcRtpTransceiverDirection, RtcRtpTransceiverInit, + RtcSessionDescriptionInit, +}; + + +#[wasm_bindgen(inline_js = "export function is_unified_avail() { return Object.keys(RTCRtpTransceiver.prototype).indexOf('currentDirection')>-1; }")] +extern "C" { + /// Available in FF since forever, in Chrome since 72, in Safari since 12.1 + fn is_unified_avail() -> bool; +} + +#[wasm_bindgen_test(async)] +fn rtc_rtp_transceiver_direction() -> impl Future { + + if !is_unified_avail(){ + Ok(()) + } + + let mut tr_init: RtcRtpTransceiverInit = RtcRtpTransceiverInit::new(); + + let pc1: RtcPeerConnection = RtcPeerConnection::new().unwrap(); + + let tr1: RtcRtpTransceiver = pc1.add_transceiver_with_str_and_init( + "audio", + tr_init.direction(RtcRtpTransceiverDirection::Sendonly), + ); + assert_eq!(tr1.direction(), RtcRtpTransceiverDirection::Sendonly); + assert_eq!(tr1.current_direction(), None); + + let pc2: RtcPeerConnection = RtcPeerConnection::new().unwrap(); + + exchange_sdps(pc1, pc2).and_then(move |(_, p2)| { + assert_eq!(tr1.direction(), RtcRtpTransceiverDirection::Sendonly); + assert_eq!( + tr1.current_direction(), + Some(RtcRtpTransceiverDirection::Sendonly) + ); + + let tr2: RtcRtpTransceiver = js_sys::try_iter(&p2.get_transceivers()) + .unwrap() + .unwrap() + .next() + .unwrap() + .unwrap() + .unchecked_into(); + + assert_eq!(tr2.direction(), RtcRtpTransceiverDirection::Recvonly); + assert_eq!( + tr2.current_direction(), + Some(RtcRtpTransceiverDirection::Recvonly) + ); + + Ok(()) + }) +} + +fn exchange_sdps( + p1: RtcPeerConnection, + p2: RtcPeerConnection, +) -> impl Future { + JsFuture::from(p1.create_offer()) + .and_then(move |offer| { + let offer = offer.unchecked_into::(); + JsFuture::from(p1.set_local_description(&offer)).join4( + JsFuture::from(p2.set_remote_description(&offer)), + Ok(p1), + Ok(p2), + ) + }) + .and_then(|(_, _, p1, p2)| JsFuture::from(p2.create_answer()).join3(Ok(p1), Ok(p2))) + .and_then(|(answer, p1, p2)| { + let answer = answer.unchecked_into::(); + JsFuture::from(p2.set_local_description(&answer)).join4( + JsFuture::from(p1.set_remote_description(&answer)), + Ok(p1), + Ok(p2), + ) + }) + .and_then(|(_, _, p1, p2)| Ok((p1, p2))) +} diff --git a/crates/web-sys/webidls/unavailable_option_primitive/RTCRtpTransceiver.webidl b/crates/web-sys/webidls/enabled/RTCRtpTransceiver.webidl similarity index 100% rename from crates/web-sys/webidls/unavailable_option_primitive/RTCRtpTransceiver.webidl rename to crates/web-sys/webidls/enabled/RTCRtpTransceiver.webidl