use crate::media::{
constraints::{ConstrainBoolean, ConstrainString, ConstrainU32},
AudioTrackConstraints, DeviceVideoTrackConstraints,
DisplayVideoTrackConstraints,
};
use derive_more::{AsRef, Into};
use web_sys::{
ConstrainBooleanParameters, ConstrainDomStringParameters,
ConstrainDoubleRange, MediaTrackConstraints,
};
#[derive(AsRef, Debug, Into)]
pub struct MediaStreamConstraints(web_sys::MediaStreamConstraints);
impl MediaStreamConstraints {
#[must_use]
pub fn new() -> Self {
Self(web_sys::MediaStreamConstraints::new())
}
pub fn audio(&mut self, audio: AudioTrackConstraints) {
_ = self.0.audio(&MediaTrackConstraints::from(audio).into());
}
pub fn video(&mut self, video: DeviceVideoTrackConstraints) {
_ = self.0.video(&MediaTrackConstraints::from(video).into());
}
}
impl Default for MediaStreamConstraints {
fn default() -> Self {
Self::new()
}
}
impl From<AudioTrackConstraints> for MediaTrackConstraints {
fn from(track_constraints: AudioTrackConstraints) -> Self {
let mut constraints = Self::new();
if let Some(auto_gain_control) = track_constraints.auto_gain_control {
_ = constraints.auto_gain_control(
&ConstrainBooleanParameters::from(auto_gain_control),
);
}
if let Some(device_id) = track_constraints.device_id {
_ = constraints
.device_id(&ConstrainDomStringParameters::from(&device_id));
}
constraints
}
}
impl From<DeviceVideoTrackConstraints> for MediaTrackConstraints {
fn from(track_constraints: DeviceVideoTrackConstraints) -> Self {
let mut constraints = Self::new();
if let Some(device_id) = track_constraints.device_id {
_ = constraints
.device_id(&ConstrainDomStringParameters::from(&device_id));
}
if let Some(facing_mode) = track_constraints.facing_mode {
_ = constraints
.facing_mode(&ConstrainDomStringParameters::from(&facing_mode));
}
if let Some(width) = track_constraints.width {
_ = constraints.width(&ConstrainDoubleRange::from(width));
}
if let Some(height) = track_constraints.height {
_ = constraints.height(&ConstrainDoubleRange::from(height));
}
constraints
}
}
impl From<ConstrainU32> for ConstrainDoubleRange {
fn from(from: ConstrainU32) -> Self {
let mut constraint = Self::new();
_ = match from {
ConstrainU32::Exact(val) => constraint.exact(f64::from(val)),
ConstrainU32::Ideal(val) => constraint.ideal(f64::from(val)),
ConstrainU32::Range(min, max) => {
constraint.min(f64::from(min)).max(f64::from(max))
}
};
constraint
}
}
impl From<ConstrainBoolean> for ConstrainBooleanParameters {
fn from(from: ConstrainBoolean) -> Self {
let mut constraint = Self::new();
_ = match from {
ConstrainBoolean::Exact(val) => constraint.exact(val),
ConstrainBoolean::Ideal(val) => constraint.ideal(val),
};
constraint
}
}
impl<T: AsRef<str>> From<&ConstrainString<T>> for ConstrainDomStringParameters {
fn from(from: &ConstrainString<T>) -> Self {
let mut constraint = Self::new();
_ =
match from {
ConstrainString::Exact(val) => constraint
.exact(&wasm_bindgen::JsValue::from_str(val.as_ref())),
ConstrainString::Ideal(val) => constraint
.ideal(&wasm_bindgen::JsValue::from_str(val.as_ref())),
};
constraint
}
}
#[derive(AsRef, Debug, Into)]
pub struct DisplayMediaStreamConstraints(
web_sys::DisplayMediaStreamConstraints,
);
impl Default for DisplayMediaStreamConstraints {
fn default() -> Self {
Self::new()
}
}
impl DisplayMediaStreamConstraints {
#[must_use]
pub fn new() -> Self {
Self(web_sys::DisplayMediaStreamConstraints::new())
}
pub fn video(&mut self, video: DisplayVideoTrackConstraints) {
_ = self.0.video(&MediaTrackConstraints::from(video).into());
}
}
impl From<DisplayVideoTrackConstraints> for MediaTrackConstraints {
fn from(track_constraints: DisplayVideoTrackConstraints) -> Self {
let mut constraints = Self::new();
if let Some(width) = track_constraints.width {
_ = constraints.width(&ConstrainDoubleRange::from(width));
}
if let Some(height) = track_constraints.height {
_ = constraints.height(&ConstrainDoubleRange::from(height));
}
if let Some(frame_rate) = track_constraints.frame_rate {
_ = constraints.frame_rate(&ConstrainDoubleRange::from(frame_rate));
}
constraints
}
}