Skip to content

Commit d52b862

Browse files
committed
fix: invalid stats panic
1 parent cb2697b commit d52b862

File tree

10 files changed

+41
-16
lines changed

10 files changed

+41
-16
lines changed

libwebrtc/src/native/peer_connection.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -452,6 +452,11 @@ impl PeerConnection {
452452
.downcast::<oneshot::Sender<Result<Vec<RtcStats>, RtcError>>>()
453453
.unwrap();
454454

455+
if stats.is_empty() {
456+
let _ = tx.send(Ok(vec![]));
457+
return;
458+
}
459+
455460
// Unwrap because it should not happens
456461
let vec = serde_json::from_str(&stats).unwrap();
457462
let _ = tx.send(Ok(vec));

libwebrtc/src/native/rtp_receiver.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,11 @@ impl RtpReceiver {
4646
.downcast::<oneshot::Sender<Result<Vec<RtcStats>, RtcError>>>()
4747
.unwrap();
4848

49+
if stats.is_empty() {
50+
let _ = tx.send(Ok(vec![]));
51+
return;
52+
}
53+
4954
// Unwrap because it should not happens
5055
let vec = serde_json::from_str(&stats).unwrap();
5156
let _ = tx.send(Ok(vec));

libwebrtc/src/native/rtp_sender.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,11 @@ impl RtpSender {
4646
.downcast::<oneshot::Sender<Result<Vec<RtcStats>, RtcError>>>()
4747
.unwrap();
4848

49+
if stats.is_empty() {
50+
let _ = tx.send(Ok(vec![]));
51+
return;
52+
}
53+
4954
// Unwrap because it should not happens
5055
let vec = serde_json::from_str(&stats).unwrap();
5156
let _ = tx.send(Ok(vec));

livekit/src/room/track/local_audio_track.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ impl LocalAudioTrack {
121121
}
122122

123123
pub async fn get_stats(&self) -> RoomResult<Vec<RtcStats>> {
124-
super::get_stats(&self.inner).await
124+
super::local_track::get_stats(&self.inner).await
125125
}
126126

127127
pub(crate) fn on_muted(&self, f: impl Fn(Track) + Send + 'static) {

livekit/src/room/track/local_track.rs

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,12 @@
1212
// See the License for the specific language governing permissions and
1313
// limitations under the License.
1414

15-
use super::track_dispatch;
15+
use std::sync::Arc;
16+
17+
use super::{track_dispatch, TrackInner};
1618
use crate::prelude::*;
1719
use libwebrtc::prelude::*;
20+
use libwebrtc::stats::RtcStats;
1821
use livekit_protocol as proto;
1922
use livekit_protocol::enum_dispatch;
2023

@@ -61,3 +64,12 @@ impl TryFrom<Track> for LocalTrack {
6164
}
6265
}
6366
}
67+
68+
pub(super) async fn get_stats(inner: &Arc<TrackInner>) -> RoomResult<Vec<RtcStats>> {
69+
let transceiver = inner.info.read().transceiver.clone();
70+
let Some(transceiver) = transceiver.as_ref() else {
71+
return Err(RoomError::Internal("no transceiver found for track".into()));
72+
};
73+
74+
Ok(transceiver.sender().get_stats().await?)
75+
}

livekit/src/room/track/local_video_track.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ impl LocalVideoTrack {
121121
}
122122

123123
pub async fn get_stats(&self) -> RoomResult<Vec<RtcStats>> {
124-
super::get_stats(&self.inner).await
124+
super::local_track::get_stats(&self.inner).await
125125
}
126126

127127
pub(crate) fn on_muted(&self, f: impl Fn(Track) + Send + 'static) {

livekit/src/room/track/mod.rs

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -173,16 +173,6 @@ pub(super) fn new_inner(
173173
}
174174
}
175175

176-
pub(super) async fn get_stats(inner: &Arc<TrackInner>) -> RoomResult<Vec<RtcStats>> {
177-
let transceiver = inner.info.read().transceiver.clone();
178-
let Some(transceiver) = transceiver.as_ref() else {
179-
return Err(RoomError::Internal("no transceiver found for track".into()));
180-
};
181-
182-
let rtp_receiver = transceiver.receiver();
183-
Ok(rtp_receiver.get_stats().await?)
184-
}
185-
186176
/// This is only called for local tracks
187177
pub(super) fn set_muted(inner: &Arc<TrackInner>, track: &Track, muted: bool) {
188178
let info = inner.info.read();

livekit/src/room/track/remote_audio_track.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ impl RemoteAudioTrack {
9191
}
9292

9393
pub async fn get_stats(&self) -> RoomResult<Vec<RtcStats>> {
94-
super::get_stats(&self.inner).await
94+
super::remote_track::get_stats(&self.inner).await
9595
}
9696

9797
pub(crate) fn on_muted(&self, f: impl Fn(Track) + Send + 'static) {

livekit/src/room/track/remote_track.rs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ use super::track_dispatch;
1616
use super::TrackInner;
1717
use crate::prelude::*;
1818
use libwebrtc::prelude::*;
19-
use libwebrtc::stats::InboundRtpStats;
2019
use libwebrtc::stats::RtcStats;
2120
use livekit_protocol as proto;
2221
use livekit_protocol::enum_dispatch;
@@ -40,6 +39,15 @@ impl RemoteTrack {
4039
}
4140
}
4241

42+
pub(super) async fn get_stats(inner: &Arc<TrackInner>) -> RoomResult<Vec<RtcStats>> {
43+
let transceiver = inner.info.read().transceiver.clone();
44+
let Some(transceiver) = transceiver.as_ref() else {
45+
return Err(RoomError::Internal("no transceiver found for track".into()));
46+
};
47+
48+
Ok(transceiver.receiver().get_stats().await?)
49+
}
50+
4351
pub(super) fn update_info(inner: &Arc<TrackInner>, track: &Track, new_info: proto::TrackInfo) {
4452
super::update_info(inner, track, new_info.clone());
4553
super::set_muted(inner, track, new_info.muted);

livekit/src/room/track/remote_video_track.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ impl RemoteVideoTrack {
9292
}
9393

9494
pub async fn get_stats(&self) -> RoomResult<Vec<RtcStats>> {
95-
super::get_stats(&self.inner).await
95+
super::remote_track::get_stats(&self.inner).await
9696
}
9797

9898
pub(crate) fn on_muted(&self, f: impl Fn(Track) + Send + 'static) {

0 commit comments

Comments
 (0)