diff --git a/packages/ts-client/src/FishjamClient.ts b/packages/ts-client/src/FishjamClient.ts index 992bc862f..f78cea3c0 100644 --- a/packages/ts-client/src/FishjamClient.ts +++ b/packages/ts-client/src/FishjamClient.ts @@ -99,6 +99,10 @@ export class FishjamClient = new Map(); + constructor(config?: CreateConfig) { super(); @@ -407,12 +411,24 @@ export class FishjamClient { + this.trackIdToTrack.set(event.trackId, [event.track, event.stream]); this.emit('localTrackAdded', event); }); this.webrtc?.on('localTrackRemoved', (event) => { + const [track, stream] = this.trackIdToTrack.get(event.trackId)!; + + if (track) stream.removeTrack(track); + + this.trackIdToTrack.delete(event.trackId); this.emit('localTrackRemoved', event); }); this.webrtc?.on('localTrackReplaced', (event) => { + const [oldTrack, stream] = this.trackIdToTrack.get(event.trackId)!; + + if (oldTrack) stream.removeTrack(oldTrack); + if (event.track) stream.addTrack(event.track); + + this.trackIdToTrack.set(event.trackId, [event.track, stream]); this.emit('localTrackReplaced', event); }); this.webrtc?.on('localTrackBandwidthSet', (event) => { @@ -571,7 +587,20 @@ export class FishjamClient { - stream?.removeTrack(track); - }); + if (oldTrack) { + stream?.removeTrack(oldTrack); + } if (newTrack) { stream?.addTrack(newTrack); diff --git a/packages/webrtc-client/src/webRTCEndpoint.ts b/packages/webrtc-client/src/webRTCEndpoint.ts index b2e9aeb87..b25d5dad1 100644 --- a/packages/webrtc-client/src/webRTCEndpoint.ts +++ b/packages/webrtc-client/src/webRTCEndpoint.ts @@ -400,10 +400,11 @@ export class WebRTCEndpoint extends (EventEmitter as new () => TypedEmitter { const resolutionNotifier = new Deferred(); const trackId = this.getTrackId(uuidv4()); - const stream = new MediaStream(); + const trackStream = stream ?? new MediaStream(); // TODO: Simulcast is disabled manually, enable it once bandwidth estimation is implemented or we add manual track selection support. const simulcastConfig: MediaEvent_Track_SimulcastConfig = { @@ -416,11 +417,18 @@ export class WebRTCEndpoint extends (EventEmitter as new () => TypedEmitter 0 ? _maxBandwidth : 0; try { - stream.addTrack(track); + if (!stream) trackStream.addTrack(track); this.commandsQueue.pushCommand({ handler: async () => - this.localTrackManager.addTrackHandler(trackId, track, stream, trackMetadata, simulcastConfig, maxBandwidth), + this.localTrackManager.addTrackHandler( + trackId, + track, + trackStream, + trackMetadata, + simulcastConfig, + maxBandwidth, + ), parse: () => this.localTrackManager.parseAddTrack(track, simulcastConfig, maxBandwidth), resolve: 'after-renegotiation', resolutionNotifier, @@ -433,7 +441,7 @@ export class WebRTCEndpoint extends (EventEmitter as new () => TypedEmitter