1 #[cfg(feature = "serde")] 2 use serde::{Deserialize, Serialize}; 3 4 use crate::MediaTrackConstraint; 5 6 use super::track::GenericBoolOrMediaTrackConstraints; 7 8 /// The constraints for a [`MediaStream`][media_stream] object. 9 /// 10 /// # W3C Spec Compliance 11 /// 12 /// Corresponds to [`MediaStreamConstraints`][media_stream_constraints] 13 /// from the W3C ["Media Capture and Streams"][media_capture_and_streams_spec] spec. 14 /// 15 /// [media_stream]: https://www.w3.org/TR/mediacapture-streams/#dom-mediastream 16 /// [media_stream_constraints]: https://www.w3.org/TR/mediacapture-streams/#dom-mediastreamconstraints 17 /// [media_capture_and_streams_spec]: https://www.w3.org/TR/mediacapture-streams/ 18 pub type MediaStreamConstraints = GenericMediaStreamConstraints<MediaTrackConstraint>; 19 20 /// The constraints for a [`MediaStream`][media_stream] object. 21 /// 22 /// # W3C Spec Compliance 23 /// 24 /// Corresponds to [`MediaStreamConstraints`][media_stream_constraints] 25 /// from the W3C ["Media Capture and Streams"][media_capture_and_streams_spec] spec. 26 /// 27 /// [media_stream]: https://www.w3.org/TR/mediacapture-streams/#dom-mediastream 28 /// [media_stream_constraints]: https://www.w3.org/TR/mediacapture-streams/#dom-mediastreamconstraints 29 /// [media_capture_and_streams_spec]: https://www.w3.org/TR/mediacapture-streams/ 30 #[derive(Debug, Clone, Default, Eq, PartialEq)] 31 #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] 32 #[cfg_attr(feature = "serde", serde(rename_all = "camelCase"))] 33 pub struct GenericMediaStreamConstraints<T> { 34 #[cfg_attr(feature = "serde", serde(default))] 35 pub audio: GenericBoolOrMediaTrackConstraints<T>, 36 #[cfg_attr(feature = "serde", serde(default))] 37 pub video: GenericBoolOrMediaTrackConstraints<T>, 38 } 39 40 #[cfg(feature = "serde")] 41 #[cfg(test)] 42 mod tests { 43 use std::iter::FromIterator; 44 45 use crate::{ 46 constraints::{ 47 advanced::AdvancedMediaTrackConstraints, 48 mandatory::MandatoryMediaTrackConstraints, 49 track::{BoolOrMediaTrackConstraints, MediaTrackConstraints}, 50 }, 51 macros::test_serde_symmetry, 52 property::all::name::*, 53 MediaTrackConstraintSet, 54 }; 55 56 use super::*; 57 58 type Subject = MediaStreamConstraints; 59 60 #[test] default()61 fn default() { 62 let subject = Subject::default(); 63 let json = serde_json::json!({ 64 "audio": false, 65 "video": false, 66 }); 67 test_serde_symmetry!(subject: subject, json: json); 68 } 69 70 #[test] customized()71 fn customized() { 72 let subject = Subject { 73 audio: BoolOrMediaTrackConstraints::Constraints(MediaTrackConstraints { 74 mandatory: MandatoryMediaTrackConstraints::from_iter([ 75 (&DEVICE_ID, "microphone".into()), 76 (&CHANNEL_COUNT, 2.into()), 77 ]), 78 advanced: AdvancedMediaTrackConstraints::new(vec![ 79 MediaTrackConstraintSet::from_iter([(&LATENCY, 0.123.into())]), 80 ]), 81 }), 82 video: BoolOrMediaTrackConstraints::Bool(true), 83 }; 84 let json = serde_json::json!({ 85 "audio": { 86 "deviceId": "microphone", 87 "channelCount": 2_i64, 88 "advanced": [ 89 { "latency": 0.123_f64, } 90 ] 91 }, 92 "video": true, 93 }); 94 test_serde_symmetry!(subject: subject, json: json); 95 } 96 } 97