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
//! Data channel event types.
//!
//! Events related to RTCDataChannel lifecycle and buffering state changes.
use crateRTCDataChannelId;
/// Events that can be emitted by an RTCDataChannel.
///
/// These events track the lifecycle and buffer state of data channels.
/// Applications should poll these events from `RTCPeerConnectionEvent::OnDataChannel`
/// to manage data channel connections and implement flow control.
///
/// # Lifecycle Events
///
/// Data channels go through the following lifecycle:
/// 1. `OnOpen` - Channel is ready for data transmission
/// 2. `OnClosing` - Channel is starting to close
/// 3. `OnClose` - Channel is fully closed
/// 4. `OnError` - An error occurred
///
/// # Buffer Events
///
/// - `OnBufferedAmountLow` - Buffer dropped below low-water mark (safe to send more)
/// - `OnBufferedAmountHigh` - Buffer exceeded high-water mark (should pause sending)
///
/// # Examples
///
/// ## Handling data channel events in event loop
///
/// ```
/// use rtc::peer_connection::event::{RTCPeerConnectionEvent, RTCDataChannelEvent};
///
/// # fn example(event: RTCPeerConnectionEvent) {
/// match event {
/// RTCPeerConnectionEvent::OnDataChannel(dc_event) => {
/// match dc_event {
/// RTCDataChannelEvent::OnOpen(channel_id) => {
/// println!("Data channel opened: {:?}", channel_id);
/// }
/// RTCDataChannelEvent::OnClose(channel_id) => {
/// println!("Data channel closed: {:?}", channel_id);
/// }
/// RTCDataChannelEvent::OnError(channel_id) => {
/// eprintln!("Data channel error: {:?}", channel_id);
/// }
/// _ => {}
/// }
/// }
/// _ => {}
/// }
/// # }
/// ```
///
/// ## Implementing flow control with buffer events
///
/// ```
/// use rtc::peer_connection::event::{RTCPeerConnectionEvent, RTCDataChannelEvent};
///
/// # fn example(event: RTCPeerConnectionEvent, paused: &mut bool) {
/// match event {
/// RTCPeerConnectionEvent::OnDataChannel(dc_event) => {
/// match dc_event {
/// RTCDataChannelEvent::OnBufferedAmountLow(channel_id) => {
/// println!("Buffer low - resume sending");
/// *paused = false;
/// }
/// RTCDataChannelEvent::OnBufferedAmountHigh(channel_id) => {
/// println!("Buffer high - pause sending");
/// *paused = true;
/// }
/// _ => {}
/// }
/// }
/// _ => {}
/// }
/// # }
/// ```
///
/// # See Also
///
/// - [W3C RTCDataChannel](https://www.w3.org/TR/webrtc/#rtcdatachannel)