Skip to main content

o_sfu/config/
settings.rs

1use std::{
2    net::{IpAddr, SocketAddr},
3    time::Duration,
4};
5
6use ipnet::IpNet;
7use o_sfu_core::prelude::{Bitrate, RtcTcpConfig};
8use secrecy::SecretString;
9
10use super::{
11    CodecPreferences, DeadlineDuration, MediaCodecFlags, RoomMediaLimits, RoomWorkerPolicy,
12    RtcPortRange, RtcUdpIoBackend, VideoAdaptationTuning, VideoBitrateLimits,
13    diagnostics::DiagnosticsConfig, feature_flags::RuntimeFeatureFlags, telemetry::TelemetryConfig,
14};
15
16pub const DEFAULT_AUTHENTICATION_TIMEOUT_MS: u64 = 10_000;
17pub const DEFAULT_MAX_PRE_AUTH_WEBSOCKET_SESSIONS: usize = 512;
18pub const DEFAULT_MAX_PRE_AUTH_WEBSOCKET_SESSIONS_PER_ORIGIN: usize = 16;
19
20#[derive(Debug, Clone)]
21pub struct Config {
22    pub auth: AuthConfig,
23    pub http: HttpConfig,
24    pub user: UserConfig,
25    pub transport: TransportConfig,
26    pub codecs: CodecConfig,
27    pub features: RuntimeFeatureFlags,
28    pub telemetry: TelemetryConfig,
29    pub diagnostics: DiagnosticsConfig,
30    pub runtime_thread_count: usize,
31}
32
33#[derive(Debug, Clone)]
34pub struct AuthConfig {
35    pub key: SecretString,
36    pub authentication_timeout: DeadlineDuration,
37    pub max_pre_auth_websocket_sessions: usize,
38    pub max_pre_auth_websocket_sessions_per_origin: usize,
39}
40
41#[derive(Debug, Clone, PartialEq, Eq)]
42pub struct HttpConfig {
43    pub bind_address: SocketAddr,
44    pub trust_proxy_headers: bool,
45    /// TCP peers permitted to supply forwarded request metadata when proxy mode is enabled.
46    pub trusted_proxies: Vec<IpNet>,
47    /// Maximum accepted HTTP sockets, including upgraded WebSocket connections.
48    /// Must be positive and no greater than [`tokio::sync::Semaphore::MAX_PERMITS`].
49    pub max_http_connections: usize,
50    /// Acceptance-to-first-header and subsequent HTTP/1 header deadline.
51    /// Must be between one second and one day.
52    pub header_read_timeout: Duration,
53    /// Deadline for listener, session, background and RTC worker drainage.
54    /// Loaded from `SHUTDOWN_TIMEOUT_MS` with a `10_000` default.
55    pub shutdown_timeout: DeadlineDuration,
56}
57
58#[derive(Debug, Clone, Copy, PartialEq, Eq)]
59pub struct UserConfig {
60    pub room_size: usize,
61    pub timeout: DeadlineDuration,
62    pub ping_interval: DeadlineDuration,
63    pub outbound_queue_capacity: usize,
64    pub outbound_queue_byte_capacity: usize,
65    pub room_reservation_ttl: Duration,
66    pub departure_grace: Duration,
67}
68
69#[derive(Debug, Clone, Copy, PartialEq, Eq)]
70pub struct TransportConfig {
71    pub announced_ip: IpAddr,
72    pub max_bitrate_in: Bitrate,
73    pub max_bitrate_out: Bitrate,
74    pub video_bitrate_limits: VideoBitrateLimits,
75    pub rtc_port_range: RtcPortRange,
76    pub rtc_tcp_config: Option<RtcTcpConfig>,
77    pub rtc_udp_io_backend: RtcUdpIoBackend,
78    pub rtc_media_worker_count: usize,
79    pub room_worker_policy: RoomWorkerPolicy,
80    pub room_media_limits: RoomMediaLimits,
81    pub video_adaptation_tuning: VideoAdaptationTuning,
82}
83
84#[derive(Debug, Clone, Copy, PartialEq, Eq)]
85pub struct CodecConfig {
86    pub flags: MediaCodecFlags,
87    pub preferences: CodecPreferences,
88}