@@ -8,11 +8,11 @@ use crate::data_channel::{DataChannel, DataChannelEvent, DataChannelImpl};
88use crate :: ice_gatherer:: { RTCIceGatherer , RTCIceGathererEvent } ;
99use crate :: peer_connection:: MessageInner ;
1010use crate :: peer_connection:: PeerConnectionRef ;
11- use crate :: runtime:: { AsyncUdpSocket , Receiver , channel} ;
11+ use crate :: runtime:: { AsyncUdpSocket , Receiver , TrySendError , channel} ;
1212use bytes:: BytesMut ;
1313use futures:: FutureExt ; // For .fuse() in futures::select!
1414use futures:: stream:: { FuturesUnordered , StreamExt } ;
15- use log:: { error, trace, warn } ;
15+ use log:: { error, trace} ;
1616use rtc:: interceptor:: { Interceptor , NoopInterceptor } ;
1717use rtc:: peer_connection:: event:: { RTCDataChannelEvent , RTCPeerConnectionEvent } ;
1818use rtc:: peer_connection:: message:: RTCMessage ;
@@ -28,7 +28,7 @@ use std::sync::Arc;
2828use std:: time:: { Duration , Instant } ;
2929
3030/// Capacity of the internal driver message channel (WriteNotify, IceGathering, Close, …).
31- pub ( crate ) const MSG_CHANNEL_CAPACITY : usize = 64 ;
31+ pub ( crate ) const MESSAGE_INNER_CHANNEL_CAPACITY : usize = 64 ;
3232
3333/// Capacity of each data-channel event channel (OnOpen, OnMessage, OnClose, …).
3434pub ( crate ) const DATA_CHANNEL_EVENT_CHANNEL_CAPACITY : usize = 256 ;
@@ -348,26 +348,38 @@ where
348348 if let Some ( evt_tx) = data_channels. get ( & channel_id) {
349349 let result = match evt {
350350 RTCDataChannelEvent :: OnOpen ( _) => {
351- evt_tx. send ( DataChannelEvent :: OnOpen ) . await
351+ evt_tx. try_send ( DataChannelEvent :: OnOpen )
352352 }
353353 RTCDataChannelEvent :: OnError ( _) => {
354- evt_tx. send ( DataChannelEvent :: OnError ) . await
354+ evt_tx. try_send ( DataChannelEvent :: OnError )
355355 }
356356 RTCDataChannelEvent :: OnClosing ( _) => {
357- evt_tx. send ( DataChannelEvent :: OnClosing ) . await
357+ evt_tx. try_send ( DataChannelEvent :: OnClosing )
358358 }
359359 RTCDataChannelEvent :: OnClose ( _) => {
360- evt_tx. send ( DataChannelEvent :: OnClose ) . await
360+ evt_tx. try_send ( DataChannelEvent :: OnClose )
361361 }
362362 RTCDataChannelEvent :: OnBufferedAmountLow ( _) => {
363- evt_tx. send ( DataChannelEvent :: OnBufferedAmountLow ) . await
363+ evt_tx. try_send ( DataChannelEvent :: OnBufferedAmountLow )
364364 }
365365 RTCDataChannelEvent :: OnBufferedAmountHigh ( _) => {
366- evt_tx. send ( DataChannelEvent :: OnBufferedAmountHigh ) . await
366+ evt_tx. try_send ( DataChannelEvent :: OnBufferedAmountHigh )
367367 }
368368 } ;
369369 if let Err ( err) = result {
370- warn ! ( "Failed to send to data channel {}: {:?}" , channel_id, err) ;
370+ match err {
371+ TrySendError :: Full ( _) => error ! (
372+ "Failed to send to data channel {} due to channel is full, {:?} is dropped" ,
373+ channel_id, evt
374+ ) ,
375+ TrySendError :: Disconnected ( _) => {
376+ error ! (
377+ "Failed to send to data channel {} due to channel is disconnected, {:?} is dropped, data channel {} got removed" ,
378+ channel_id, evt, channel_id
379+ ) ;
380+ data_channels. remove ( & channel_id) ;
381+ }
382+ }
371383 }
372384 }
373385 }
@@ -385,10 +397,22 @@ where
385397 async fn handle_rtc_message ( & mut self , message : RTCMessage ) {
386398 match message {
387399 RTCMessage :: DataChannelMessage ( channel_id, dc_message) => {
388- let data_channels = self . inner . data_channels . lock ( ) . await ;
400+ let mut data_channels = self . inner . data_channels . lock ( ) . await ;
389401 if let Some ( evt_tx) = data_channels. get ( & channel_id) {
390- if let Err ( err) = evt_tx. send ( DataChannelEvent :: OnMessage ( dc_message) ) . await {
391- warn ! ( "Failed to send to data channel {}: {:?}" , channel_id, err) ;
402+ if let Err ( err) = evt_tx. try_send ( DataChannelEvent :: OnMessage ( dc_message) ) {
403+ match err {
404+ TrySendError :: Full ( _) => error ! (
405+ "Failed to send to data channel {} due to channel is full, DataChannelMessage is dropped" ,
406+ channel_id
407+ ) ,
408+ TrySendError :: Disconnected ( _) => {
409+ error ! (
410+ "Failed to send to data channel {} due to channel is disconnected, DataChannelMessage is dropped, data channel {} got removed" ,
411+ channel_id, channel_id
412+ ) ;
413+ data_channels. remove ( & channel_id) ;
414+ }
415+ }
392416 }
393417 }
394418 }
0 commit comments