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