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#[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;