From 0a503a57f6028060ba3fcb5c5ef123459c4bb05c Mon Sep 17 00:00:00 2001 From: Raja Subramanian Date: Sat, 4 Apr 2026 17:09:02 +0530 Subject: [PATCH] Add `Close` method for UpDataTrackManager and call it on participant (#4432) * Add `Close` method for UpDataTrackManager and call it on participant close. * include out-of-order packets in total packets --- pkg/rtc/datatrack_stats.go | 1 + pkg/rtc/participant.go | 1 + pkg/rtc/updatatrackmanager.go | 19 +++++++++++++++++++ 3 files changed, 21 insertions(+) diff --git a/pkg/rtc/datatrack_stats.go b/pkg/rtc/datatrack_stats.go index 7c3f2034c..06a73ee2e 100644 --- a/pkg/rtc/datatrack_stats.go +++ b/pkg/rtc/datatrack_stats.go @@ -65,6 +65,7 @@ func (d *dataTrackStats) Update(packet *datatrack.Packet, arrivalTime int64) { return case diff > (1 << 15): // out of order + d.numPackets++ d.numPacketsOutOfOrder++ if d.numPacketsLost > 0 { d.numPacketsLost-- diff --git a/pkg/rtc/participant.go b/pkg/rtc/participant.go index 62f579677..a3da1f2dc 100644 --- a/pkg/rtc/participant.go +++ b/pkg/rtc/participant.go @@ -1427,6 +1427,7 @@ func (p *ParticipantImpl) Close(sendLeave bool, reason types.ParticipantCloseRea p.pendingTracksLock.Unlock() p.UpTrackManager.Close(isExpectedToResume) + p.UpDataTrackManager.Close() p.rpcLock.Lock() clear(p.rpcPendingAcks) diff --git a/pkg/rtc/updatatrackmanager.go b/pkg/rtc/updatatrackmanager.go index c23c8d256..12059731f 100644 --- a/pkg/rtc/updatatrackmanager.go +++ b/pkg/rtc/updatatrackmanager.go @@ -34,6 +34,7 @@ type UpDataTrackManager struct { lock sync.RWMutex dataTracks map[uint16]types.DataTrack + closed bool onDataTrackPublished func(types.Participant, types.DataTrack) onDataTrackUnpublished func(types.Participant, types.DataTrack) @@ -46,6 +47,24 @@ func NewUpDataTrackManager(params UpDataTrackManagerParams) *UpDataTrackManager } } +func (u *UpDataTrackManager) Close() { + u.lock.Lock() + if u.closed { + u.lock.Unlock() + return + } + + u.closed = true + + dataTracks := u.dataTracks + u.dataTracks = make(map[uint16]types.DataTrack) + u.lock.Unlock() + + for _, t := range dataTracks { + t.Close() + } +} + func (u *UpDataTrackManager) AddPublishedDataTrack(dt types.DataTrack) { u.lock.Lock() u.dataTracks[dt.PubHandle()] = dt