Skip to content

Commit ae42338

Browse files
committed
Fixing memory leak when removing tracks / streams
The _senderMap keeps references to no more used MediaStream / MediaTracks. In an application where many tracks will be added/removed from a remote peer, the "dead" tracks keep accumulating in _senderMap. To avoid this, we turn _senderMap and its inner map into WeakMap. This way, if the track is never used anymore, it will be freed from memory.
1 parent 08eab06 commit ae42338

File tree

1 file changed

+3
-3
lines changed

1 file changed

+3
-3
lines changed

index.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,14 @@ import { MediaStream, MediaStreamTrack, RTCRtpSender, RTCRtpTransceiver } from '
99
*/
1010
class Peer extends Lite {
1111
streams: MediaStream[]
12-
_senderMap: Map<MediaStreamTrack, Map<MediaStream, RTCRtpSender>>
12+
_senderMap: WeakMap<MediaStreamTrack, WeakMap<MediaStream, RTCRtpSender>>
1313

1414
constructor (opts: PeerOptions = {}) {
1515
super(opts)
1616
if (!this._pc) return
1717

1818
this.streams = opts.streams || (opts.stream ? [opts.stream] : []) // support old "stream" option
19-
this._senderMap = new Map()
19+
this._senderMap = new WeakMap()
2020

2121
if (this.streams) {
2222
this.streams.forEach(stream => {
@@ -72,7 +72,7 @@ class Peer extends Lite {
7272
if (this.destroyed) throw errCode(new Error('cannot addTrack after peer is destroyed'), 'ERR_DESTROYED')
7373
this._debug('addTrack()')
7474

75-
const submap = this._senderMap.get(track) || new Map() // nested Maps map [track, stream] to sender
75+
const submap = this._senderMap.get(track) || new WeakMap() // nested Maps map [track, stream] to sender
7676
let sender = submap.get(stream)
7777
if (!sender) {
7878
sender = this._pc!.addTrack(track, stream)

0 commit comments

Comments
 (0)