From bd7e6fdb16ccc557d764baec681cbb9a2598e90d Mon Sep 17 00:00:00 2001 From: Rohan Paranjpe Date: Sun, 30 Aug 2026 13:08:13 -0700 Subject: [PATCH 1/3] Avoid a strong Arc cycle in RoomSession --- livekit/src/room/mod.rs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) 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() From 4c3b857f534cad9887a8d193698fd425d0bb4b7c Mon Sep 17 00:00:00 2001 From: Rohan Paranjpe Date: Sun, 30 Aug 2026 13:19:52 -0700 Subject: [PATCH 2/3] Avoid a circular arc ref for DataChannel --- livekit/src/rtc_engine/rtc_events.rs | 7 ++----- livekit/src/rtc_engine/rtc_session.rs | 2 +- 2 files changed, 3 insertions(+), 6 deletions(-) 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), From 55defc67b9e0a969a92c463f9dbe8353a379ceac Mon Sep 17 00:00:00 2001 From: Rohan Paranjpe Date: Wed, 2 Sep 2026 09:40:24 -0700 Subject: [PATCH 3/3] Changeset --- .changeset/break_arc_cycles.md | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 .changeset/break_arc_cycles.md 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