use wasm_bindgen::{prelude::*, JsCast}; use wasm_bindgen_futures::JsFuture; use wasm_bindgen_test::*; 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() { if !is_unified_avail() { return; } 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(); let (_, p2) = exchange_sdps(pc1, pc2).await; 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) ); } async fn exchange_sdps( p1: RtcPeerConnection, p2: RtcPeerConnection, ) -> (RtcPeerConnection, RtcPeerConnection) { let offer = JsFuture::from(p1.create_offer()).await.unwrap(); let offer = offer.unchecked_into::(); JsFuture::from(p1.set_local_description(&offer)) .await .unwrap(); JsFuture::from(p2.set_remote_description(&offer)) .await .unwrap(); let answer = JsFuture::from(p2.create_answer()).await.unwrap(); let answer = answer.unchecked_into::(); JsFuture::from(p2.set_local_description(&answer)) .await .unwrap(); JsFuture::from(p1.set_remote_description(&answer)) .await .unwrap(); (p1, p2) }