webrtc_constraints/constraints/
stream.rs

1#[cfg(feature = "serde")]
2use serde::{Deserialize, Serialize};
3
4use crate::MediaTrackConstraint;
5
6use 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/
18pub 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"))]
33pub 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)]
42mod 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]
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]
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}