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}