Skip to main content

o_sfu/config/
loader.rs

1use std::{env, fs, num::NonZeroUsize, thread};
2
3use anyhow::Result;
4
5use super::{
6    AuthConfig, CodecConfig, HttpConfig, TransportConfig, UserConfig,
7    codec_flags::load_media_codec_flags,
8    codec_preferences::load_codec_preferences,
9    diagnostics::DiagnosticsConfig,
10    env::{Env, positive},
11    feature_flags::load_runtime_feature_flags,
12    settings::Config,
13    telemetry::load_telemetry_config,
14};
15
16impl Config {
17    /// # Errors
18    ///
19    /// Returns an error when a required operator environment variable is
20    /// missing, an environment value cannot be parsed, a constrained value is
21    /// outside its accepted range, telemetry export is requested without the
22    /// required cargo feature, or transport cross-field validation rejects the
23    /// advertised address, RTC port range, worker count, or room policy.
24    pub fn from_env() -> Result<Self> {
25        Self::from_var_lookup(|key| env::var(key).ok())
26    }
27
28    fn from_var_lookup(get_var: impl Fn(&str) -> Option<String>) -> Result<Self> {
29        let env = Env::new(get_var, |path| fs::read_to_string(path));
30        let http = HttpConfig::from_env(&env)?;
31        let auth = AuthConfig::from_env(&env)?;
32        let user = UserConfig::from_env(&env)?;
33        let feature_flags = load_runtime_feature_flags(&env)?;
34        let codec_flags = load_media_codec_flags(&env)?;
35        let codec_preferences = load_codec_preferences(&env)?;
36        let diagnostics = DiagnosticsConfig::from_env(&env)?;
37        let telemetry = load_telemetry_config(&env)?;
38        let transport = TransportConfig::from_env(&env)?;
39        let runtime_thread_count = env.var("RUNTIME_THREAD_COUNT").check(positive).default(
40            thread::available_parallelism()
41                .map_or(1, NonZeroUsize::get)
42                .min(4),
43        )?;
44        Ok(Self {
45            auth,
46            http,
47            user,
48            transport,
49            codecs: CodecConfig {
50                flags: codec_flags,
51                preferences: codec_preferences,
52            },
53            features: feature_flags,
54            telemetry,
55            diagnostics,
56            runtime_thread_count,
57        })
58    }
59}
60
61#[cfg(test)]
62#[path = "TESTS/loader.rs"]
63mod tests;