diff --git a/.changeset/break_arc_cycles.md b/.changeset/break_arc_cycles.md new file mode 100644 index 000000000..7b4212152 --- /dev/null +++ b/.changeset/break_arc_cycles.md @@ -0,0 +1,6 @@ +--- +livekit: patch +livekit-ffi: patch +--- + +Break two arc cycles between RoomSession and itself and DataChannel and itself introduced via closures. \ No newline at end of file diff --git a/livekit/src/room/mod.rs b/livekit/src/room/mod.rs index 100f02e26..c64038293 100644 --- a/livekit/src/room/mod.rs +++ b/livekit/src/room/mod.rs @@ -759,10 +759,14 @@ impl Room { e2ee_manager.on_state_changed({ let dispatcher = dispatcher.clone(); - let inner = inner.clone(); + let inner = Arc::downgrade(&inner); move |participant_identity, state| { // Forward e2ee events to the room // (Ignore if the participant is not in the room anymore) + let Some(inner) = inner.upgrade() else { + // RoomSession is gone, nothing left to forward the events to. + return; + }; let participant = if participant_identity.as_str() == inner.local_participant.identity().as_str() diff --git a/livekit/src/rtc_engine/rtc_events.rs b/livekit/src/rtc_engine/rtc_events.rs index a59aab58f..2f052a0ba 100644 --- a/livekit/src/rtc_engine/rtc_events.rs +++ b/livekit/src/rtc_engine/rtc_events.rs @@ -60,7 +60,6 @@ pub enum RtcEvent { }, DataChannelBufferedAmountChange { sent: u64, - amount: u64, kind: DataPacketKind, }, } @@ -166,16 +165,14 @@ fn on_message(emitter: RtcEmitter, kind: DataPacketKind) -> rtc::data_channel::O fn on_buffered_amount_change( emitter: RtcEmitter, - dc: DataChannel, kind: DataPacketKind, ) -> rtc::data_channel::OnBufferedAmountChange { Box::new(move |sent| { - let amount = dc.buffered_amount(); - let _ = emitter.send(RtcEvent::DataChannelBufferedAmountChange { sent, amount, kind }); + let _ = emitter.send(RtcEvent::DataChannelBufferedAmountChange { sent, kind }); }) } pub fn forward_dc_events(dc: &mut DataChannel, kind: DataPacketKind, rtc_emitter: RtcEmitter) { dc.on_message(Some(on_message(rtc_emitter.clone(), kind))); - dc.on_buffered_amount_change(Some(on_buffered_amount_change(rtc_emitter, dc.clone(), kind))); + dc.on_buffered_amount_change(Some(on_buffered_amount_change(rtc_emitter, kind))); } diff --git a/livekit/src/rtc_engine/rtc_session.rs b/livekit/src/rtc_engine/rtc_session.rs index 6613682f7..4dc6bc955 100644 --- a/livekit/src/rtc_engine/rtc_session.rs +++ b/livekit/src/rtc_engine/rtc_session.rs @@ -1677,7 +1677,7 @@ impl SessionInner { ); } } - RtcEvent::DataChannelBufferedAmountChange { sent, amount: _, kind } => { + RtcEvent::DataChannelBufferedAmountChange { sent, kind } => { let ev = DataChannelEvent { kind, detail: DataChannelEventDetail::BufferedAmountChange(sent),