Skip to main content

o_sfu_core/
server.rs

1//! Server-runtime integration surface.
2//!
3//! The top-level runtime uses these facades for diagnostics, metrics, room
4//! management, transport construction and packet sinks. The caller-facing
5//! session API remains under [`crate::prelude`].
6
7/// diagnostics response types used by runtime inspection endpoints
8pub mod diagnostics {
9    pub use o_sfu_telemetry::diagnostics::*;
10}
11
12/// process-local metric catalog and typed recorders
13///
14/// runtime edges record through this facade instead of assembling metric names
15/// or label sets manually
16/// the Prometheus renderer reads the catalog declared by these types
17pub mod metrics {
18    pub use crate::engine::metrics::*;
19}
20
21/// recording sink trait used by media routing code
22///
23/// recording integrations register packet sinks through the packet-sink
24/// registry while transport code only depends on this narrow sink contract
25pub mod recording {
26    pub use crate::engine::recording::MediaPacketSink;
27}
28
29/// room packet-sink registry shared by transport workers
30///
31/// packet sinks are looked up by room when media has to fan out to recording or
32/// other non-local destinations
33/// the registry keeps that routing concern out of packet-loop callers
34pub mod packet_sinks {
35    pub use crate::engine::packet_sink_registry::{
36        PacketSink, RegisteredPacketSink, RoomPacketSinkRegistry,
37    };
38}
39
40/// room manager, room runtime and user-session integration types
41///
42/// this facade is the server crate's entry point for admitting users, sending
43/// outbound messages and reading room statistics
44/// pure routing and transport details remain behind the room API
45///
46/// # Slow-consumer shutdown
47///
48/// [`room::UserOutboundSender::send`] queues output without waiting for
49/// capacity
50/// when the queue is full it also records an overflow sentinel
51/// [`room::UserOutboundReceiver::recv_event`] returns that sentinel before
52/// output that was already queued
53/// the caller should stop normal draining after
54/// [`room::UserOutboundEvent::Overflow`]
55///
56/// ```
57/// # use std::sync::Arc;
58/// # use o_sfu_core::server::{
59/// #     metrics::RuntimeMetrics,
60/// #     room::{
61/// #         RoomEventMessage, UserOutbound, UserOutboundEvent, UserOutboundSendError,
62/// #         UserOutboundSender,
63/// #     },
64/// #     session::UserId,
65/// # };
66/// # #[tokio::main(flavor = "current_thread")]
67/// # async fn main() {
68/// let (sender, mut receiver) =
69///     UserOutboundSender::channel(1, Arc::new(RuntimeMetrics::default()));
70/// let departed = |id| {
71///     UserOutbound::Message(RoomEventMessage::UserDeparted {
72///         user_id: UserId::Integer(id),
73///     })
74/// };
75/// let queued_output = departed(1);
76/// assert!(sender.send(queued_output).is_ok());
77///
78/// assert!(matches!(
79///     sender.send(departed(2)),
80///     Err(UserOutboundSendError::Full(_))
81/// ));
82/// assert!(matches!(
83///     receiver.recv_event().await,
84///     UserOutboundEvent::Overflow(_)
85/// ));
86/// # }
87/// ```
88pub mod room {
89    #[cfg(any(test, feature = "testing-transport"))]
90    pub mod test_support {
91        pub use crate::engine::{
92            room::{
93                NegotiatedPublish, RoomManagerTestApi, RoomTestApi, RoomTestInspect,
94                RoomTestLifecycle, RoomTestMedia,
95            },
96            source_model::test_support::{
97                TestSourceKind, TestSubscriptionStates, source_kind_for_stream_id,
98                source_publish_intent_for_source, stream_id_for_source,
99                subscription_intents_from_test_states,
100            },
101        };
102    }
103
104    #[cfg(feature = "internal-benchmarks")]
105    pub mod benchmark_support {
106        pub use crate::engine::room::run_source_policy_turn_for_benchmark;
107    }
108
109    #[cfg(any(test, feature = "testing-transport"))]
110    pub use crate::engine::room::{ConsumerRouteState, JoinPlacementTestGate};
111    pub use crate::{
112        MediaWorkerId,
113        engine::room::{
114            BroadcastPayload, BroadcastPayloadError, DEFAULT_USER_OUTBOUND_QUEUE_BYTE_CAPACITY,
115            DEFAULT_USER_OUTBOUND_QUEUE_CAPACITY, IncomingBitrateSnapshot, JoinUserRequest,
116            MAX_BROADCAST_PAYLOAD_BYTES, RemoteTrackProjection, RemoteTrackSnapshot, Room,
117            RoomAdmissionPolicy, RoomConfig, RoomDetailCapture, RoomEventMessage, RoomJoinError,
118            RoomManager, RoomManagerJoinError, RoomManagerServeError, RoomMediaCounts,
119            RoomOverviewCapture, RoomRuntimeContext, RoomRuntimePolicy, RoomUserAdmission,
120            RoomUserCapture, RoomUserPermissions, RoomUserStatsSnapshot, RoomUsersCapture,
121            RouterPlacement, RouterPlacements, RouterPlacementsError, RuntimeRoomDirectorySnapshot,
122            RuntimeRoomStatsSnapshot, UserCloseReason, UserOutbound, UserOutboundEvent,
123            UserOutboundOverflow, UserOutboundOverflowKind, UserOutboundQueueLimits,
124            UserOutboundReceiver, UserOutboundSendError, UserOutboundSender,
125        },
126    };
127}
128
129/// signaling-domain payloads shared by rooms and WebSocket sessions
130///
131/// these types describe users, features, permissionsm recording state and
132/// host-visible close codes
133/// they are re-exported here so the runtime does not import private room or
134/// engine modules for protocol payload construction
135pub mod session {
136    pub use crate::engine::{
137        AvailableFeatures, JsonPayload, PeerSnapshot, RecordingOptions, RecordingState,
138        RecordingStateUpdate, StopCode, UserId, UserInfo, UserPermissions, VideoLayoutIntent,
139        WebSocketCloseCode,
140    };
141}
142
143/// source descriptor model accepted by publication and subscription flows
144///
145/// source-model types make published media identity explicit before it reaches
146/// room routing or transport negotiation
147pub mod source_model {
148    pub use crate::engine::source_model::{
149        PublishedSourceDescriptor, PublishedSourceDescriptorParts, PublishedSourceId,
150        PublishedSourceOwner, SourceEncodingDescriptor, SourceEncodingDescriptorParts,
151        SourceEncodingId, SourceModelError,
152    };
153}
154
155/// media transport construction and extension boundary
156///
157/// the runtime builds one `MediaTransport` from owner configuration and process
158/// services then room code uses the opaque handle for media operations
159///
160/// code above this module should not branch on RTC worker internals
161pub mod transport {
162
163    #[cfg(any(test, feature = "testing-transport"))]
164    pub mod test_support {
165        //! non-production media transport route inspectors
166
167        pub use crate::engine::media_transport::test_support::*;
168    }
169
170    #[cfg(feature = "internal-benchmarks")]
171    pub mod benchmark_support {
172        //! feature-gated packet-loop benchmark fixtures
173
174        pub use crate::engine::media_transport::benchmark_support::*;
175    }
176
177    #[cfg(any(test, fuzzing))]
178    pub mod fuzz_support {
179        pub use crate::engine::media_transport::fuzz_support::{
180            client_rtp_capabilities_from_answer, route_packet_loop_ingress_demux,
181        };
182    }
183
184    pub use crate::{
185        MediaWorkerId,
186        engine::media_transport::{
187            ActiveSpeakerActivityReason, ActiveSpeakerActivityState, ActiveSpeakerSource,
188            ActiveSpeakerSourceDiagnostic, AppliedProducer, AppliedSessionAnswer, ConsumerActivity,
189            MediaTransport, MediaTransportBuildError, MediaTransportConfig, MediaTransportDeps,
190            ProducerActivity, ReceiverBandwidthSnapshot, RelayRouteActivity, SessionOffer,
191            SessionUploadEncoding, SessionUploadSlot, SourcePacketGate, SourcePolicySignal,
192            SourcePolicyUpdateSubscription, TransportAdapterError, TransportBitrateSnapshot,
193            TransportConsumerRoute, TransportHealthSnapshot, TransportMediaId,
194            TransportQualitySample, TransportQualitySnapshot, TransportRelayRouteAction,
195            TransportRelayRouteEffect, TransportResult, TransportSessionHealth,
196            TransportSessionKey, TransportSourceDiagnosticsSnapshot, TransportSourceKey,
197            TransportWorkerPressureSnapshot,
198        },
199        prelude::SessionBitrateLimits,
200    };
201}