Skip to main content

o_sfu/runtime/
options.rs

1use secrecy::SecretSlice;
2
3use super::auth::{AuthenticationError, decode_signing_key};
4use crate::config::{
5    Config, DeadlineDuration, DiagnosticsConfig, HttpConfig, RuntimeFeatureFlags, UserConfig,
6};
7
8#[derive(Debug, Clone)]
9pub(crate) struct RuntimeConfig {
10    pub(crate) auth: RuntimeAuthConfig,
11    pub(crate) http: HttpConfig,
12    pub(crate) user: UserConfig,
13    pub(crate) diagnostics: DiagnosticsConfig,
14}
15
16/// Decoded credentials and admission limits used after configuration loading.
17#[derive(Debug, Clone)]
18pub(crate) struct RuntimeAuthConfig {
19    pub(crate) key: SecretSlice<u8>,
20    pub(crate) authentication_timeout: DeadlineDuration,
21    pub(crate) max_pre_auth_websocket_sessions: usize,
22    pub(crate) max_pre_auth_websocket_sessions_per_origin: usize,
23}
24
25impl RuntimeConfig {
26    pub(crate) fn from_config(config: &Config) -> Result<Self, AuthenticationError> {
27        Ok(Self {
28            auth: RuntimeAuthConfig {
29                key: decode_signing_key(&config.auth.key)?,
30                authentication_timeout: config.auth.authentication_timeout,
31                max_pre_auth_websocket_sessions: config.auth.max_pre_auth_websocket_sessions,
32                max_pre_auth_websocket_sessions_per_origin: config
33                    .auth
34                    .max_pre_auth_websocket_sessions_per_origin,
35            },
36            http: config.http.clone(),
37            user: config.user,
38            diagnostics: config.diagnostics.clone(),
39        })
40    }
41}
42
43pub(crate) const fn effective_feature_flags(features: RuntimeFeatureFlags) -> RuntimeFeatureFlags {
44    RuntimeFeatureFlags {
45        transcription: features.transcription
46            && (features.audio_recording || features.video_recording),
47        audio_recording: features.audio_recording,
48        video_recording: features.video_recording,
49    }
50}
51
52#[cfg(test)]
53#[path = "TESTS/options.rs"]
54mod tests;