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;
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}
31
32#[derive(Debug, Clone)]
33pub struct AuthConfig {
34    pub key: SecretString,
35    pub authentication_timeout: DeadlineDuration,
36    pub max_pre_auth_websocket_sessions: usize,
37    pub max_pre_auth_websocket_sessions_per_origin: usize,
38}
39
40#[derive(Debug, Clone, PartialEq, Eq)]
41pub struct HttpConfig {
42    pub bind_address: SocketAddr,
43    pub trust_proxy_headers: bool,
44    /// TCP peers permitted to supply forwarded request metadata when proxy mode is enabled.
45    pub trusted_proxies: Vec<IpNet>,
46    /// Maximum accepted HTTP sockets, including upgraded WebSocket connections.
47    /// Must be positive and no greater than [`tokio::sync::Semaphore::MAX_PERMITS`].
48    pub max_http_connections: usize,
49    /// Acceptance-to-first-header and subsequent HTTP/1 header deadline.
50    /// Must be between one second and one day.
51    pub header_read_timeout: Duration,
52    /// Deadline for listener, session, background and RTC worker drainage.
53    /// Loaded from `SHUTDOWN_TIMEOUT_MS` with a `10_000` default.
54    pub shutdown_timeout: DeadlineDuration,
55}
56
57#[derive(Debug, Clone, Copy, PartialEq, Eq)]
58pub struct UserConfig {
59    pub room_size: usize,
60    pub timeout: DeadlineDuration,
61    pub ping_interval: DeadlineDuration,
62    pub outbound_queue_capacity: usize,
63    pub outbound_queue_byte_capacity: usize,
64    pub room_reservation_ttl: Duration,
65    pub departure_grace: Duration,
66}
67
68#[derive(Debug, Clone, Copy, PartialEq, Eq)]
69pub struct TransportConfig {
70    pub announced_ip: IpAddr,
71    pub max_bitrate_in: Bitrate,
72    pub max_bitrate_out: Bitrate,
73    pub video_bitrate_limits: VideoBitrateLimits,
74    pub rtc_port_range: RtcPortRange,
75    pub rtc_udp_io_backend: RtcUdpIoBackend,
76    pub rtc_media_worker_count: usize,
77    pub room_worker_policy: RoomWorkerPolicy,
78    pub room_media_limits: RoomMediaLimits,
79    pub video_adaptation_tuning: VideoAdaptationTuning,
80}
81
82#[derive(Debug, Clone, Copy, PartialEq, Eq)]
83pub struct CodecConfig {
84    pub flags: MediaCodecFlags,
85    pub preferences: CodecPreferences,
86}