1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
//! WebRTC real-time media extension for channel adapters.
//!
//! Provides:
//! - [`WebRtcChannel`] — extension trait for adapters that support real-time media
//! - [`WebRtcSession`] — manages a single `RTCPeerConnection` (offer/answer, ICE, tracks)
//! - [`WebRtcConfig`] — serde-serializable peer connection configuration
//! - [`WebRtcSignaling`] — abstraction over the SDP/ICE exchange channel
//! - [`AudioTrack`] / [`VideoTrack`] / [`DataChannel`] — media handles
//!
//! # Feature flag
//!
//! This entire module requires the `webrtc` Cargo feature:
//! ```toml
//! brainwires-channels = { ..., features = ["webrtc"] }
//! ```
//!
//! # Quick start
//!
//! ```rust,ignore
//! use std::sync::Arc;
//! use crate::channels::webrtc::{
//! WebRtcChannel, WebRtcConfig, WebRtcSession, SdpType,
//! AudioCodec, BroadcastSignaling, WebRtcSignaling, SignalingMessage,
//! };
//!
//! // 1. Create session
//! let session = Arc::new(WebRtcSession::new(WebRtcConfig::default(), conv.clone()).await?);
//! session.open().await?;
//!
//! // 2. Add tracks before creating the offer
//! let audio = session.add_audio_track(AudioCodec::Opus).await?;
//!
//! // 3. Create offer and send via signaling
//! let sdp = session.create_offer().await?;
//! signaling.send_signaling(&conv, SignalingMessage::Offer { session_id: session.id.clone(), sdp }).await?;
//!
//! // 4. Apply remote answer
//! session.set_remote_description(answer_sdp, SdpType::Answer).await?;
//!
//! // 5. Write audio frames
//! audio.write_sample(&sample).await?;
//! ```
// ── Public re-exports ─────────────────────────────────────────────────────────
pub use ;
pub use StatsSelector;
pub use RTCStatsReport;
pub use ;
pub use ;
pub use ;
// ── WebRtcChannel trait ───────────────────────────────────────────────────────
use Arc;
use Result;
use async_trait;
use ChannelCapabilities;
use ConversationId;
/// Extension trait for channel adapters that support real-time WebRTC media.
///
/// Implementors also implement [`Channel`](crate::traits::Channel).
/// The framework identifies WebRTC-capable channels by checking
/// `capabilities().contains(ChannelCapabilities::VOICE | ChannelCapabilities::VIDEO)`.
///
/// # Session management
///
/// Adapters are responsible for storing sessions (e.g. in an
/// `Arc<RwLock<HashMap<WebRtcSessionId, Arc<WebRtcSession>>>>`).
///
/// # Signaling
///
/// Return a [`WebRtcSignaling`] impl from [`signaling`](Self::signaling), or `None`
/// if the adapter handles signaling internally (e.g. encodes SDP into regular messages
/// and drives the state machine itself).