@whereby.com/media 1.6.3 → 1.6.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -3548,20 +3548,32 @@ class P2pRtcManager {
3548
3548
  maybeRestrictRelayBandwidth(session) {
3549
3549
  session.maybeRestrictRelayBandwidth();
3550
3550
  }
3551
- addNewStream(streamId, stream) {
3551
+ addNewStream(streamId, stream, audioPaused, videoPaused, beforeEffectTracks = []) {
3552
3552
  if (stream === this.localStreams[streamId]) {
3553
3553
  return;
3554
3554
  }
3555
3555
  this._addLocalStream(streamId, stream);
3556
3556
  if (streamId === CAMERA_STREAM_ID) {
3557
3557
  this._addStreamToPeerConnections(stream);
3558
- const [audioTrack] = stream.getAudioTracks();
3558
+ const audioTrack = stream.getAudioTracks()[0];
3559
3559
  const videoTrack = stream.getVideoTracks()[0];
3560
3560
  if (audioTrack) {
3561
- this._startMonitoringAudioTrack(audioTrack);
3561
+ if (!audioTrack.effectTrack) {
3562
+ this._monitorAudioTrack(audioTrack);
3563
+ }
3564
+ const beforeEffectTrack = beforeEffectTracks.find((t) => t.kind === "audio");
3565
+ if (beforeEffectTrack) {
3566
+ this._monitorAudioTrack(beforeEffectTrack);
3567
+ }
3562
3568
  }
3563
- if (videoTrack && !videoTrack.replacement) {
3564
- this._startMonitoringVideoTrack(videoTrack);
3569
+ if (videoTrack) {
3570
+ if (!videoTrack.effectTrack) {
3571
+ this._monitorVideoTrack(videoTrack);
3572
+ }
3573
+ const beforeEffectTrack = beforeEffectTracks.find((t) => t.kind === "video");
3574
+ if (beforeEffectTrack) {
3575
+ this._monitorVideoTrack(beforeEffectTrack);
3576
+ }
3565
3577
  }
3566
3578
  if (this._localStreamDeregisterFunction) {
3567
3579
  this._localStreamDeregisterFunction();
@@ -3582,17 +3594,11 @@ class P2pRtcManager {
3582
3594
  return;
3583
3595
  }
3584
3596
  replaceTrack(oldTrack, newTrack) {
3585
- if (oldTrack && oldTrack.kind === "audio") {
3586
- this._stopMonitoringAudioTrack(oldTrack);
3587
- }
3588
- if (oldTrack && oldTrack.kind === "video" && !newTrack.replacement) {
3589
- this._stopMonitoringVideoTrack(oldTrack);
3590
- }
3591
- if (newTrack && newTrack.kind === "audio") {
3592
- this._startMonitoringAudioTrack(newTrack);
3597
+ if (newTrack.kind === "audio" && !newTrack.effectTrack) {
3598
+ this._monitorAudioTrack(newTrack);
3593
3599
  }
3594
- if (newTrack.kind === "video" && !newTrack.replacement) {
3595
- this._startMonitoringVideoTrack(newTrack);
3600
+ if (newTrack.kind === "video" && !newTrack.effectTrack) {
3601
+ this._monitorVideoTrack(newTrack);
3596
3602
  }
3597
3603
  return this._replaceTrackToPeerConnections(oldTrack, newTrack);
3598
3604
  }
@@ -4106,17 +4112,21 @@ class P2pRtcManager {
4106
4112
  clearTimeout(this._fetchMediaServersTimer);
4107
4113
  this._fetchMediaServersTimer = null;
4108
4114
  }
4109
- _startMonitoringAudioTrack(track) {
4115
+ _monitorAudioTrack(track) {
4116
+ var _a, _b;
4117
+ if (((_a = this._audioTrackBeingMonitored) === null || _a === void 0 ? void 0 : _a.id) === track.id)
4118
+ return;
4119
+ (_b = this._audioTrackBeingMonitored) === null || _b === void 0 ? void 0 : _b.removeEventListener("ended", this._audioTrackOnEnded);
4110
4120
  track.addEventListener("ended", this._audioTrackOnEnded);
4121
+ this._audioTrackBeingMonitored = track;
4111
4122
  }
4112
- _stopMonitoringAudioTrack(track) {
4113
- track.removeEventListener("ended", this._audioTrackOnEnded);
4114
- }
4115
- _startMonitoringVideoTrack(track) {
4123
+ _monitorVideoTrack(track) {
4124
+ var _a, _b;
4125
+ if (((_a = this._videoTrackBeingMonitored) === null || _a === void 0 ? void 0 : _a.id) === track.id)
4126
+ return;
4127
+ (_b = this._videoTrackBeingMonitored) === null || _b === void 0 ? void 0 : _b.removeEventListener("ended", this._videoTrackOnEnded);
4116
4128
  track.addEventListener("ended", this._videoTrackOnEnded);
4117
- }
4118
- _stopMonitoringVideoTrack(track) {
4119
- track.removeEventListener("ended", this._videoTrackOnEnded);
4129
+ this._videoTrackBeingMonitored = track;
4120
4130
  }
4121
4131
  _connect(clientId) {
4122
4132
  this.rtcStatsReconnect();
@@ -4476,7 +4486,9 @@ class P2pRtcManager {
4476
4486
  return;
4477
4487
  }
4478
4488
  if (enable === false) {
4479
- const stopCameraDelay = ((_a = localStream.getVideoTracks().find((t) => !t.enabled)) === null || _a === void 0 ? void 0 : _a.readyState) === "ended" ? 0 : 5000;
4489
+ const stopCameraDelay = ((_a = localStream.getVideoTracks().find((t) => !t.enabled)) === null || _a === void 0 ? void 0 : _a.readyState) === "ended"
4490
+ ? 0
4491
+ : 5000;
4480
4492
  setTimeout(() => {
4481
4493
  localStream.getVideoTracks().forEach((track) => {
4482
4494
  if (track.enabled === false) {
@@ -4500,7 +4512,7 @@ class P2pRtcManager {
4500
4512
  navigator.mediaDevices.getUserMedia({ video: constraints }).then((stream) => {
4501
4513
  const track = stream.getVideoTracks()[0];
4502
4514
  localStream.addTrack(track);
4503
- this._startMonitoringVideoTrack(track);
4515
+ this._monitorVideoTrack(track);
4504
4516
  this._emit(EVENTS.LOCAL_STREAM_TRACK_ADDED, {
4505
4517
  streamId: localStream.id,
4506
4518
  tracks: [track],
@@ -4987,6 +4999,7 @@ class VegaRtcManager {
4987
4999
  this._receiveTransport = null;
4988
5000
  this._clientStates = new Map();
4989
5001
  this._streamIdToVideoConsumerId = new Map();
5002
+ this._streamIdToVideoResolution = new Map();
4990
5003
  this._consumers = new Map();
4991
5004
  this._dataConsumers = new Map();
4992
5005
  this._localStreamDeregisterFunction = null;
@@ -5089,6 +5102,7 @@ class VegaRtcManager {
5089
5102
  this._sendTransport = null;
5090
5103
  this._receiveTransport = null;
5091
5104
  this._streamIdToVideoConsumerId.clear();
5105
+ this._streamIdToVideoResolution.clear();
5092
5106
  if (this._reconnect) {
5093
5107
  this._reconnectTimeOut = setTimeout(() => this._connect(), 1000);
5094
5108
  }
@@ -5725,20 +5739,16 @@ class VegaRtcManager {
5725
5739
  }
5726
5740
  }
5727
5741
  replaceTrack(oldTrack, track) {
5728
- if (oldTrack && oldTrack.kind === "audio") {
5729
- this._stopMonitoringAudioTrack(oldTrack);
5730
- }
5731
- if (oldTrack && oldTrack.kind === "video" && !track.replacement) {
5732
- this._stopMonitoringVideoTrack(oldTrack);
5733
- }
5734
5742
  if (track.kind === "audio") {
5735
- this._startMonitoringAudioTrack(track);
5743
+ if (!track.effectTrack) {
5744
+ this._monitorAudioTrack(track);
5745
+ }
5736
5746
  this._micTrack = track;
5737
5747
  this._replaceMicTrack();
5738
5748
  }
5739
5749
  if (track.kind === "video") {
5740
- if (!track.replacement) {
5741
- this._startMonitoringVideoTrack(track);
5750
+ if (!track.effectTrack) {
5751
+ this._monitorVideoTrack(track);
5742
5752
  }
5743
5753
  this._webcamTrack = track;
5744
5754
  this._replaceWebcamTrack();
@@ -5762,7 +5772,7 @@ class VegaRtcManager {
5762
5772
  (_b = (_a = this._micAnalyserDebugger) === null || _a === void 0 ? void 0 : _a.onScoreUpdated) === null || _b === void 0 ? void 0 : _b.call(_a, data);
5763
5773
  this._sendMicScore(this._micPaused ? 0 : data.out);
5764
5774
  }
5765
- addNewStream(streamId, stream, audioPaused, videoPaused) {
5775
+ addNewStream(streamId, stream, audioPaused, videoPaused, beforeEffectTracks = []) {
5766
5776
  if (streamId === "0") {
5767
5777
  this._micPaused = audioPaused;
5768
5778
  this._webcamPaused = videoPaused;
@@ -5770,14 +5780,24 @@ class VegaRtcManager {
5770
5780
  const audioTrack = stream.getAudioTracks()[0];
5771
5781
  if (videoTrack) {
5772
5782
  this._sendWebcam(videoTrack);
5773
- if (!videoTrack.replacement) {
5774
- this._startMonitoringVideoTrack(videoTrack);
5783
+ if (!videoTrack.effectTrack) {
5784
+ this._monitorVideoTrack(videoTrack);
5785
+ }
5786
+ const beforeEffectTrack = beforeEffectTracks.find(t => t.kind === "video");
5787
+ if (beforeEffectTrack) {
5788
+ this._monitorVideoTrack(beforeEffectTrack);
5775
5789
  }
5776
5790
  }
5777
5791
  if (audioTrack) {
5778
5792
  this._sendMic(audioTrack);
5779
5793
  this._syncMicAnalyser();
5780
- this._startMonitoringAudioTrack(audioTrack);
5794
+ if (!audioTrack.effectTrack) {
5795
+ this._monitorAudioTrack(audioTrack);
5796
+ }
5797
+ const beforeEffectTrack = beforeEffectTracks.find(t => t.kind === "audio");
5798
+ if (beforeEffectTrack) {
5799
+ this._monitorAudioTrack(beforeEffectTrack);
5800
+ }
5781
5801
  }
5782
5802
  if (this._localStreamDeregisterFunction) {
5783
5803
  this._localStreamDeregisterFunction();
@@ -5865,7 +5885,7 @@ class VegaRtcManager {
5865
5885
  navigator.mediaDevices.getUserMedia({ video: constraints }).then((stream) => {
5866
5886
  const track = stream.getVideoTracks()[0];
5867
5887
  localStream.addTrack(track);
5868
- this._startMonitoringVideoTrack(track);
5888
+ this._monitorVideoTrack(track);
5869
5889
  this._emitToPWA(EVENTS.LOCAL_STREAM_TRACK_ADDED, {
5870
5890
  streamId: localStream.id,
5871
5891
  tracks: [track],
@@ -5898,8 +5918,10 @@ class VegaRtcManager {
5898
5918
  logger$1.info("updateStreamResolution()", { streamId, width, height });
5899
5919
  const consumerId = this._streamIdToVideoConsumerId.get(streamId);
5900
5920
  const consumer = this._consumers.get(consumerId);
5901
- if (!consumer)
5921
+ if (!consumer) {
5922
+ this._streamIdToVideoResolution.set(streamId, { width, height });
5902
5923
  return;
5924
+ }
5903
5925
  const numberOfActiveVideos = getNumberOfActiveVideos(this._consumers);
5904
5926
  const numberOfTemporalLayers = getNumberOfTemporalLayers(consumer);
5905
5927
  const { spatialLayer, temporalLayer } = getLayers({ width, height }, {
@@ -5960,17 +5982,21 @@ class VegaRtcManager {
5960
5982
  rtcStats.server.connect();
5961
5983
  }
5962
5984
  }
5963
- _startMonitoringAudioTrack(track) {
5985
+ _monitorAudioTrack(track) {
5986
+ var _a, _b;
5987
+ if (((_a = this._audioTrackBeingMonitored) === null || _a === void 0 ? void 0 : _a.id) === track.id)
5988
+ return;
5989
+ (_b = this._audioTrackBeingMonitored) === null || _b === void 0 ? void 0 : _b.removeEventListener("ended", this._audioTrackOnEnded);
5964
5990
  track.addEventListener("ended", this._audioTrackOnEnded);
5991
+ this._audioTrackBeingMonitored = track;
5965
5992
  }
5966
- _stopMonitoringAudioTrack(track) {
5967
- track.removeEventListener("ended", this._audioTrackOnEnded);
5968
- }
5969
- _startMonitoringVideoTrack(track) {
5993
+ _monitorVideoTrack(track) {
5994
+ var _a, _b;
5995
+ if (((_a = this._videoTrackBeingMonitored) === null || _a === void 0 ? void 0 : _a.id) === track.id)
5996
+ return;
5997
+ (_b = this._videoTrackBeingMonitored) === null || _b === void 0 ? void 0 : _b.removeEventListener("ended", this._videoTrackOnEnded);
5970
5998
  track.addEventListener("ended", this._videoTrackOnEnded);
5971
- }
5972
- _stopMonitoringVideoTrack(track) {
5973
- track.removeEventListener("ended", this._videoTrackOnEnded);
5999
+ this._videoTrackBeingMonitored = track;
5974
6000
  }
5975
6001
  _onMessage(message) {
5976
6002
  return __awaiter(this, void 0, void 0, function* () {
@@ -6050,6 +6076,11 @@ class VegaRtcManager {
6050
6076
  }
6051
6077
  stream.addTrack(consumer.track);
6052
6078
  this._syncIncomingStreamsWithPWA(clientId);
6079
+ const resolution = this._streamIdToVideoResolution.get(stream.id);
6080
+ if (resolution) {
6081
+ this.updateStreamResolution(stream.id, null, resolution);
6082
+ this._streamIdToVideoResolution.delete(stream.id);
6083
+ }
6053
6084
  });
6054
6085
  }
6055
6086
  _onConsumerClosed({ consumerId, reason }) {
@@ -6138,6 +6169,7 @@ class VegaRtcManager {
6138
6169
  stream.removeTrack(consumer.track);
6139
6170
  if (stream.getTracks().length === 0) {
6140
6171
  this._streamIdToVideoConsumerId.delete(stream.id);
6172
+ this._streamIdToVideoResolution.delete(stream.id);
6141
6173
  if (screenShare) {
6142
6174
  clientState.screenStream = null;
6143
6175
  clientState.hasEmittedScreenStream = false;
package/dist/index.d.cts CHANGED
@@ -264,7 +264,7 @@ type GetDeviceDataResult = {
264
264
  };
265
265
  };
266
266
  interface CustomMediaStreamTrack extends MediaStreamTrack {
267
- replacement?: boolean;
267
+ effectTrack?: boolean;
268
268
  }
269
269
 
270
270
  declare function getMediaConstraints({ disableAEC, disableAGC, hd, lax, lowDataMode, preferredDeviceIds, resolution, simulcast, widescreen, }: GetMediaConstraintsOptions): any;
@@ -343,6 +343,8 @@ declare class P2pRtcManager implements RtcManager {
343
343
  _lastReverseDirectionAttemptByClientId: any;
344
344
  _stoppedVideoTrack: any;
345
345
  icePublicIPGatheringTimeoutID: any;
346
+ _videoTrackBeingMonitored?: CustomMediaStreamTrack;
347
+ _audioTrackBeingMonitored?: CustomMediaStreamTrack;
346
348
  constructor({ selfId, room, emitter, serverSocket, webrtcProvider, features, }: {
347
349
  selfId: any;
348
350
  room: any;
@@ -359,8 +361,8 @@ declare class P2pRtcManager implements RtcManager {
359
361
  }): boolean;
360
362
  supportsScreenShareAudio(): boolean;
361
363
  maybeRestrictRelayBandwidth(session: any): void;
362
- addNewStream(streamId: string, stream: MediaStream): void;
363
- replaceTrack(oldTrack: CustomMediaStreamTrack, newTrack: CustomMediaStreamTrack): Promise<any[]>;
364
+ addNewStream(streamId: string, stream: MediaStream, audioPaused: boolean, videoPaused: boolean, beforeEffectTracks?: CustomMediaStreamTrack[]): void;
365
+ replaceTrack(oldTrack: CustomMediaStreamTrack | null, newTrack: CustomMediaStreamTrack): Promise<any[]>;
364
366
  accept({ clientId, shouldAddLocalVideo }: {
365
367
  clientId: string;
366
368
  shouldAddLocalVideo?: boolean;
@@ -414,10 +416,8 @@ declare class P2pRtcManager implements RtcManager {
414
416
  _removeLocalStream(streamId: string): void;
415
417
  _updateAndScheduleMediaServersRefresh({ iceServers, sfuServer, mediaserverConfigTtlSeconds }: any): void;
416
418
  _clearMediaServersRefresh(): void;
417
- _startMonitoringAudioTrack(track: any): void;
418
- _stopMonitoringAudioTrack(track: any): void;
419
- _startMonitoringVideoTrack(track: CustomMediaStreamTrack): void;
420
- _stopMonitoringVideoTrack(track: CustomMediaStreamTrack): void;
419
+ _monitorAudioTrack(track: any): void;
420
+ _monitorVideoTrack(track: CustomMediaStreamTrack): void;
421
421
  _connect(clientId: string): Promise<any>;
422
422
  _maybeRestartIce(clientId: string, session: any): void;
423
423
  _setCodecPreferences(pc: any, vp9On: any, av1On: any, redOn: any): void;
@@ -1073,6 +1073,10 @@ declare class VegaRtcManager implements RtcManager {
1073
1073
  _receiveTransport: any;
1074
1074
  _clientStates: any;
1075
1075
  _streamIdToVideoConsumerId: any;
1076
+ _streamIdToVideoResolution: Map<string, {
1077
+ width: number;
1078
+ height: number;
1079
+ }>;
1076
1080
  _consumers: any;
1077
1081
  _dataConsumers: any;
1078
1082
  _localStreamDeregisterFunction: any;
@@ -1106,6 +1110,8 @@ declare class VegaRtcManager implements RtcManager {
1106
1110
  _iceServers: any;
1107
1111
  _sfuServer: any;
1108
1112
  _mediaserverConfigTtlSeconds: any;
1113
+ _videoTrackBeingMonitored?: CustomMediaStreamTrack;
1114
+ _audioTrackBeingMonitored?: CustomMediaStreamTrack;
1109
1115
  constructor({ selfId, room, emitter, serverSocket, webrtcProvider, features, eventClaim, deviceHandlerFactory, }: {
1110
1116
  selfId: any;
1111
1117
  room: any;
@@ -1161,7 +1167,7 @@ declare class VegaRtcManager implements RtcManager {
1161
1167
  replaceTrack(oldTrack: CustomMediaStreamTrack | null, track: CustomMediaStreamTrack): void;
1162
1168
  removeStream(streamId: string, _stream: MediaStream, requestedByClientId: string): void;
1163
1169
  _onMicAnalyserScoreUpdated(data: any): void;
1164
- addNewStream(streamId: string, stream: MediaStream, audioPaused: boolean, videoPaused: boolean): void;
1170
+ addNewStream(streamId: string, stream: MediaStream, audioPaused: boolean, videoPaused: boolean, beforeEffectTracks?: CustomMediaStreamTrack[]): void;
1165
1171
  _syncMicAnalyser(): void;
1166
1172
  stopOrResumeAudio(stream: MediaStream, enabled: boolean): void;
1167
1173
  _handleStopOrResumeVideo({ enable, track }: {
@@ -1184,10 +1190,8 @@ declare class VegaRtcManager implements RtcManager {
1184
1190
  sendStatsCustomEvent(eventName: string, data?: any): void;
1185
1191
  rtcStatsDisconnect(): void;
1186
1192
  rtcStatsReconnect(): void;
1187
- _startMonitoringAudioTrack(track: MediaStreamTrack): void;
1188
- _stopMonitoringAudioTrack(track: MediaStreamTrack): void;
1189
- _startMonitoringVideoTrack(track: CustomMediaStreamTrack): void;
1190
- _stopMonitoringVideoTrack(track: CustomMediaStreamTrack): void;
1193
+ _monitorAudioTrack(track: any): void;
1194
+ _monitorVideoTrack(track: CustomMediaStreamTrack): void;
1191
1195
  _onMessage(message: any): Promise<void>;
1192
1196
  _onConsumerReady(options: any): Promise<void>;
1193
1197
  _onConsumerClosed({ consumerId, reason }: {
package/dist/index.d.mts CHANGED
@@ -264,7 +264,7 @@ type GetDeviceDataResult = {
264
264
  };
265
265
  };
266
266
  interface CustomMediaStreamTrack extends MediaStreamTrack {
267
- replacement?: boolean;
267
+ effectTrack?: boolean;
268
268
  }
269
269
 
270
270
  declare function getMediaConstraints({ disableAEC, disableAGC, hd, lax, lowDataMode, preferredDeviceIds, resolution, simulcast, widescreen, }: GetMediaConstraintsOptions): any;
@@ -343,6 +343,8 @@ declare class P2pRtcManager implements RtcManager {
343
343
  _lastReverseDirectionAttemptByClientId: any;
344
344
  _stoppedVideoTrack: any;
345
345
  icePublicIPGatheringTimeoutID: any;
346
+ _videoTrackBeingMonitored?: CustomMediaStreamTrack;
347
+ _audioTrackBeingMonitored?: CustomMediaStreamTrack;
346
348
  constructor({ selfId, room, emitter, serverSocket, webrtcProvider, features, }: {
347
349
  selfId: any;
348
350
  room: any;
@@ -359,8 +361,8 @@ declare class P2pRtcManager implements RtcManager {
359
361
  }): boolean;
360
362
  supportsScreenShareAudio(): boolean;
361
363
  maybeRestrictRelayBandwidth(session: any): void;
362
- addNewStream(streamId: string, stream: MediaStream): void;
363
- replaceTrack(oldTrack: CustomMediaStreamTrack, newTrack: CustomMediaStreamTrack): Promise<any[]>;
364
+ addNewStream(streamId: string, stream: MediaStream, audioPaused: boolean, videoPaused: boolean, beforeEffectTracks?: CustomMediaStreamTrack[]): void;
365
+ replaceTrack(oldTrack: CustomMediaStreamTrack | null, newTrack: CustomMediaStreamTrack): Promise<any[]>;
364
366
  accept({ clientId, shouldAddLocalVideo }: {
365
367
  clientId: string;
366
368
  shouldAddLocalVideo?: boolean;
@@ -414,10 +416,8 @@ declare class P2pRtcManager implements RtcManager {
414
416
  _removeLocalStream(streamId: string): void;
415
417
  _updateAndScheduleMediaServersRefresh({ iceServers, sfuServer, mediaserverConfigTtlSeconds }: any): void;
416
418
  _clearMediaServersRefresh(): void;
417
- _startMonitoringAudioTrack(track: any): void;
418
- _stopMonitoringAudioTrack(track: any): void;
419
- _startMonitoringVideoTrack(track: CustomMediaStreamTrack): void;
420
- _stopMonitoringVideoTrack(track: CustomMediaStreamTrack): void;
419
+ _monitorAudioTrack(track: any): void;
420
+ _monitorVideoTrack(track: CustomMediaStreamTrack): void;
421
421
  _connect(clientId: string): Promise<any>;
422
422
  _maybeRestartIce(clientId: string, session: any): void;
423
423
  _setCodecPreferences(pc: any, vp9On: any, av1On: any, redOn: any): void;
@@ -1073,6 +1073,10 @@ declare class VegaRtcManager implements RtcManager {
1073
1073
  _receiveTransport: any;
1074
1074
  _clientStates: any;
1075
1075
  _streamIdToVideoConsumerId: any;
1076
+ _streamIdToVideoResolution: Map<string, {
1077
+ width: number;
1078
+ height: number;
1079
+ }>;
1076
1080
  _consumers: any;
1077
1081
  _dataConsumers: any;
1078
1082
  _localStreamDeregisterFunction: any;
@@ -1106,6 +1110,8 @@ declare class VegaRtcManager implements RtcManager {
1106
1110
  _iceServers: any;
1107
1111
  _sfuServer: any;
1108
1112
  _mediaserverConfigTtlSeconds: any;
1113
+ _videoTrackBeingMonitored?: CustomMediaStreamTrack;
1114
+ _audioTrackBeingMonitored?: CustomMediaStreamTrack;
1109
1115
  constructor({ selfId, room, emitter, serverSocket, webrtcProvider, features, eventClaim, deviceHandlerFactory, }: {
1110
1116
  selfId: any;
1111
1117
  room: any;
@@ -1161,7 +1167,7 @@ declare class VegaRtcManager implements RtcManager {
1161
1167
  replaceTrack(oldTrack: CustomMediaStreamTrack | null, track: CustomMediaStreamTrack): void;
1162
1168
  removeStream(streamId: string, _stream: MediaStream, requestedByClientId: string): void;
1163
1169
  _onMicAnalyserScoreUpdated(data: any): void;
1164
- addNewStream(streamId: string, stream: MediaStream, audioPaused: boolean, videoPaused: boolean): void;
1170
+ addNewStream(streamId: string, stream: MediaStream, audioPaused: boolean, videoPaused: boolean, beforeEffectTracks?: CustomMediaStreamTrack[]): void;
1165
1171
  _syncMicAnalyser(): void;
1166
1172
  stopOrResumeAudio(stream: MediaStream, enabled: boolean): void;
1167
1173
  _handleStopOrResumeVideo({ enable, track }: {
@@ -1184,10 +1190,8 @@ declare class VegaRtcManager implements RtcManager {
1184
1190
  sendStatsCustomEvent(eventName: string, data?: any): void;
1185
1191
  rtcStatsDisconnect(): void;
1186
1192
  rtcStatsReconnect(): void;
1187
- _startMonitoringAudioTrack(track: MediaStreamTrack): void;
1188
- _stopMonitoringAudioTrack(track: MediaStreamTrack): void;
1189
- _startMonitoringVideoTrack(track: CustomMediaStreamTrack): void;
1190
- _stopMonitoringVideoTrack(track: CustomMediaStreamTrack): void;
1193
+ _monitorAudioTrack(track: any): void;
1194
+ _monitorVideoTrack(track: CustomMediaStreamTrack): void;
1191
1195
  _onMessage(message: any): Promise<void>;
1192
1196
  _onConsumerReady(options: any): Promise<void>;
1193
1197
  _onConsumerClosed({ consumerId, reason }: {
package/dist/index.d.ts CHANGED
@@ -264,7 +264,7 @@ type GetDeviceDataResult = {
264
264
  };
265
265
  };
266
266
  interface CustomMediaStreamTrack extends MediaStreamTrack {
267
- replacement?: boolean;
267
+ effectTrack?: boolean;
268
268
  }
269
269
 
270
270
  declare function getMediaConstraints({ disableAEC, disableAGC, hd, lax, lowDataMode, preferredDeviceIds, resolution, simulcast, widescreen, }: GetMediaConstraintsOptions): any;
@@ -343,6 +343,8 @@ declare class P2pRtcManager implements RtcManager {
343
343
  _lastReverseDirectionAttemptByClientId: any;
344
344
  _stoppedVideoTrack: any;
345
345
  icePublicIPGatheringTimeoutID: any;
346
+ _videoTrackBeingMonitored?: CustomMediaStreamTrack;
347
+ _audioTrackBeingMonitored?: CustomMediaStreamTrack;
346
348
  constructor({ selfId, room, emitter, serverSocket, webrtcProvider, features, }: {
347
349
  selfId: any;
348
350
  room: any;
@@ -359,8 +361,8 @@ declare class P2pRtcManager implements RtcManager {
359
361
  }): boolean;
360
362
  supportsScreenShareAudio(): boolean;
361
363
  maybeRestrictRelayBandwidth(session: any): void;
362
- addNewStream(streamId: string, stream: MediaStream): void;
363
- replaceTrack(oldTrack: CustomMediaStreamTrack, newTrack: CustomMediaStreamTrack): Promise<any[]>;
364
+ addNewStream(streamId: string, stream: MediaStream, audioPaused: boolean, videoPaused: boolean, beforeEffectTracks?: CustomMediaStreamTrack[]): void;
365
+ replaceTrack(oldTrack: CustomMediaStreamTrack | null, newTrack: CustomMediaStreamTrack): Promise<any[]>;
364
366
  accept({ clientId, shouldAddLocalVideo }: {
365
367
  clientId: string;
366
368
  shouldAddLocalVideo?: boolean;
@@ -414,10 +416,8 @@ declare class P2pRtcManager implements RtcManager {
414
416
  _removeLocalStream(streamId: string): void;
415
417
  _updateAndScheduleMediaServersRefresh({ iceServers, sfuServer, mediaserverConfigTtlSeconds }: any): void;
416
418
  _clearMediaServersRefresh(): void;
417
- _startMonitoringAudioTrack(track: any): void;
418
- _stopMonitoringAudioTrack(track: any): void;
419
- _startMonitoringVideoTrack(track: CustomMediaStreamTrack): void;
420
- _stopMonitoringVideoTrack(track: CustomMediaStreamTrack): void;
419
+ _monitorAudioTrack(track: any): void;
420
+ _monitorVideoTrack(track: CustomMediaStreamTrack): void;
421
421
  _connect(clientId: string): Promise<any>;
422
422
  _maybeRestartIce(clientId: string, session: any): void;
423
423
  _setCodecPreferences(pc: any, vp9On: any, av1On: any, redOn: any): void;
@@ -1073,6 +1073,10 @@ declare class VegaRtcManager implements RtcManager {
1073
1073
  _receiveTransport: any;
1074
1074
  _clientStates: any;
1075
1075
  _streamIdToVideoConsumerId: any;
1076
+ _streamIdToVideoResolution: Map<string, {
1077
+ width: number;
1078
+ height: number;
1079
+ }>;
1076
1080
  _consumers: any;
1077
1081
  _dataConsumers: any;
1078
1082
  _localStreamDeregisterFunction: any;
@@ -1106,6 +1110,8 @@ declare class VegaRtcManager implements RtcManager {
1106
1110
  _iceServers: any;
1107
1111
  _sfuServer: any;
1108
1112
  _mediaserverConfigTtlSeconds: any;
1113
+ _videoTrackBeingMonitored?: CustomMediaStreamTrack;
1114
+ _audioTrackBeingMonitored?: CustomMediaStreamTrack;
1109
1115
  constructor({ selfId, room, emitter, serverSocket, webrtcProvider, features, eventClaim, deviceHandlerFactory, }: {
1110
1116
  selfId: any;
1111
1117
  room: any;
@@ -1161,7 +1167,7 @@ declare class VegaRtcManager implements RtcManager {
1161
1167
  replaceTrack(oldTrack: CustomMediaStreamTrack | null, track: CustomMediaStreamTrack): void;
1162
1168
  removeStream(streamId: string, _stream: MediaStream, requestedByClientId: string): void;
1163
1169
  _onMicAnalyserScoreUpdated(data: any): void;
1164
- addNewStream(streamId: string, stream: MediaStream, audioPaused: boolean, videoPaused: boolean): void;
1170
+ addNewStream(streamId: string, stream: MediaStream, audioPaused: boolean, videoPaused: boolean, beforeEffectTracks?: CustomMediaStreamTrack[]): void;
1165
1171
  _syncMicAnalyser(): void;
1166
1172
  stopOrResumeAudio(stream: MediaStream, enabled: boolean): void;
1167
1173
  _handleStopOrResumeVideo({ enable, track }: {
@@ -1184,10 +1190,8 @@ declare class VegaRtcManager implements RtcManager {
1184
1190
  sendStatsCustomEvent(eventName: string, data?: any): void;
1185
1191
  rtcStatsDisconnect(): void;
1186
1192
  rtcStatsReconnect(): void;
1187
- _startMonitoringAudioTrack(track: MediaStreamTrack): void;
1188
- _stopMonitoringAudioTrack(track: MediaStreamTrack): void;
1189
- _startMonitoringVideoTrack(track: CustomMediaStreamTrack): void;
1190
- _stopMonitoringVideoTrack(track: CustomMediaStreamTrack): void;
1193
+ _monitorAudioTrack(track: any): void;
1194
+ _monitorVideoTrack(track: CustomMediaStreamTrack): void;
1191
1195
  _onMessage(message: any): Promise<void>;
1192
1196
  _onConsumerReady(options: any): Promise<void>;
1193
1197
  _onConsumerClosed({ consumerId, reason }: {
package/dist/index.mjs CHANGED
@@ -3527,20 +3527,32 @@ class P2pRtcManager {
3527
3527
  maybeRestrictRelayBandwidth(session) {
3528
3528
  session.maybeRestrictRelayBandwidth();
3529
3529
  }
3530
- addNewStream(streamId, stream) {
3530
+ addNewStream(streamId, stream, audioPaused, videoPaused, beforeEffectTracks = []) {
3531
3531
  if (stream === this.localStreams[streamId]) {
3532
3532
  return;
3533
3533
  }
3534
3534
  this._addLocalStream(streamId, stream);
3535
3535
  if (streamId === CAMERA_STREAM_ID) {
3536
3536
  this._addStreamToPeerConnections(stream);
3537
- const [audioTrack] = stream.getAudioTracks();
3537
+ const audioTrack = stream.getAudioTracks()[0];
3538
3538
  const videoTrack = stream.getVideoTracks()[0];
3539
3539
  if (audioTrack) {
3540
- this._startMonitoringAudioTrack(audioTrack);
3540
+ if (!audioTrack.effectTrack) {
3541
+ this._monitorAudioTrack(audioTrack);
3542
+ }
3543
+ const beforeEffectTrack = beforeEffectTracks.find((t) => t.kind === "audio");
3544
+ if (beforeEffectTrack) {
3545
+ this._monitorAudioTrack(beforeEffectTrack);
3546
+ }
3541
3547
  }
3542
- if (videoTrack && !videoTrack.replacement) {
3543
- this._startMonitoringVideoTrack(videoTrack);
3548
+ if (videoTrack) {
3549
+ if (!videoTrack.effectTrack) {
3550
+ this._monitorVideoTrack(videoTrack);
3551
+ }
3552
+ const beforeEffectTrack = beforeEffectTracks.find((t) => t.kind === "video");
3553
+ if (beforeEffectTrack) {
3554
+ this._monitorVideoTrack(beforeEffectTrack);
3555
+ }
3544
3556
  }
3545
3557
  if (this._localStreamDeregisterFunction) {
3546
3558
  this._localStreamDeregisterFunction();
@@ -3561,17 +3573,11 @@ class P2pRtcManager {
3561
3573
  return;
3562
3574
  }
3563
3575
  replaceTrack(oldTrack, newTrack) {
3564
- if (oldTrack && oldTrack.kind === "audio") {
3565
- this._stopMonitoringAudioTrack(oldTrack);
3566
- }
3567
- if (oldTrack && oldTrack.kind === "video" && !newTrack.replacement) {
3568
- this._stopMonitoringVideoTrack(oldTrack);
3569
- }
3570
- if (newTrack && newTrack.kind === "audio") {
3571
- this._startMonitoringAudioTrack(newTrack);
3576
+ if (newTrack.kind === "audio" && !newTrack.effectTrack) {
3577
+ this._monitorAudioTrack(newTrack);
3572
3578
  }
3573
- if (newTrack.kind === "video" && !newTrack.replacement) {
3574
- this._startMonitoringVideoTrack(newTrack);
3579
+ if (newTrack.kind === "video" && !newTrack.effectTrack) {
3580
+ this._monitorVideoTrack(newTrack);
3575
3581
  }
3576
3582
  return this._replaceTrackToPeerConnections(oldTrack, newTrack);
3577
3583
  }
@@ -4085,17 +4091,21 @@ class P2pRtcManager {
4085
4091
  clearTimeout(this._fetchMediaServersTimer);
4086
4092
  this._fetchMediaServersTimer = null;
4087
4093
  }
4088
- _startMonitoringAudioTrack(track) {
4094
+ _monitorAudioTrack(track) {
4095
+ var _a, _b;
4096
+ if (((_a = this._audioTrackBeingMonitored) === null || _a === void 0 ? void 0 : _a.id) === track.id)
4097
+ return;
4098
+ (_b = this._audioTrackBeingMonitored) === null || _b === void 0 ? void 0 : _b.removeEventListener("ended", this._audioTrackOnEnded);
4089
4099
  track.addEventListener("ended", this._audioTrackOnEnded);
4100
+ this._audioTrackBeingMonitored = track;
4090
4101
  }
4091
- _stopMonitoringAudioTrack(track) {
4092
- track.removeEventListener("ended", this._audioTrackOnEnded);
4093
- }
4094
- _startMonitoringVideoTrack(track) {
4102
+ _monitorVideoTrack(track) {
4103
+ var _a, _b;
4104
+ if (((_a = this._videoTrackBeingMonitored) === null || _a === void 0 ? void 0 : _a.id) === track.id)
4105
+ return;
4106
+ (_b = this._videoTrackBeingMonitored) === null || _b === void 0 ? void 0 : _b.removeEventListener("ended", this._videoTrackOnEnded);
4095
4107
  track.addEventListener("ended", this._videoTrackOnEnded);
4096
- }
4097
- _stopMonitoringVideoTrack(track) {
4098
- track.removeEventListener("ended", this._videoTrackOnEnded);
4108
+ this._videoTrackBeingMonitored = track;
4099
4109
  }
4100
4110
  _connect(clientId) {
4101
4111
  this.rtcStatsReconnect();
@@ -4455,7 +4465,9 @@ class P2pRtcManager {
4455
4465
  return;
4456
4466
  }
4457
4467
  if (enable === false) {
4458
- const stopCameraDelay = ((_a = localStream.getVideoTracks().find((t) => !t.enabled)) === null || _a === void 0 ? void 0 : _a.readyState) === "ended" ? 0 : 5000;
4468
+ const stopCameraDelay = ((_a = localStream.getVideoTracks().find((t) => !t.enabled)) === null || _a === void 0 ? void 0 : _a.readyState) === "ended"
4469
+ ? 0
4470
+ : 5000;
4459
4471
  setTimeout(() => {
4460
4472
  localStream.getVideoTracks().forEach((track) => {
4461
4473
  if (track.enabled === false) {
@@ -4479,7 +4491,7 @@ class P2pRtcManager {
4479
4491
  navigator.mediaDevices.getUserMedia({ video: constraints }).then((stream) => {
4480
4492
  const track = stream.getVideoTracks()[0];
4481
4493
  localStream.addTrack(track);
4482
- this._startMonitoringVideoTrack(track);
4494
+ this._monitorVideoTrack(track);
4483
4495
  this._emit(EVENTS.LOCAL_STREAM_TRACK_ADDED, {
4484
4496
  streamId: localStream.id,
4485
4497
  tracks: [track],
@@ -4966,6 +4978,7 @@ class VegaRtcManager {
4966
4978
  this._receiveTransport = null;
4967
4979
  this._clientStates = new Map();
4968
4980
  this._streamIdToVideoConsumerId = new Map();
4981
+ this._streamIdToVideoResolution = new Map();
4969
4982
  this._consumers = new Map();
4970
4983
  this._dataConsumers = new Map();
4971
4984
  this._localStreamDeregisterFunction = null;
@@ -5068,6 +5081,7 @@ class VegaRtcManager {
5068
5081
  this._sendTransport = null;
5069
5082
  this._receiveTransport = null;
5070
5083
  this._streamIdToVideoConsumerId.clear();
5084
+ this._streamIdToVideoResolution.clear();
5071
5085
  if (this._reconnect) {
5072
5086
  this._reconnectTimeOut = setTimeout(() => this._connect(), 1000);
5073
5087
  }
@@ -5704,20 +5718,16 @@ class VegaRtcManager {
5704
5718
  }
5705
5719
  }
5706
5720
  replaceTrack(oldTrack, track) {
5707
- if (oldTrack && oldTrack.kind === "audio") {
5708
- this._stopMonitoringAudioTrack(oldTrack);
5709
- }
5710
- if (oldTrack && oldTrack.kind === "video" && !track.replacement) {
5711
- this._stopMonitoringVideoTrack(oldTrack);
5712
- }
5713
5721
  if (track.kind === "audio") {
5714
- this._startMonitoringAudioTrack(track);
5722
+ if (!track.effectTrack) {
5723
+ this._monitorAudioTrack(track);
5724
+ }
5715
5725
  this._micTrack = track;
5716
5726
  this._replaceMicTrack();
5717
5727
  }
5718
5728
  if (track.kind === "video") {
5719
- if (!track.replacement) {
5720
- this._startMonitoringVideoTrack(track);
5729
+ if (!track.effectTrack) {
5730
+ this._monitorVideoTrack(track);
5721
5731
  }
5722
5732
  this._webcamTrack = track;
5723
5733
  this._replaceWebcamTrack();
@@ -5741,7 +5751,7 @@ class VegaRtcManager {
5741
5751
  (_b = (_a = this._micAnalyserDebugger) === null || _a === void 0 ? void 0 : _a.onScoreUpdated) === null || _b === void 0 ? void 0 : _b.call(_a, data);
5742
5752
  this._sendMicScore(this._micPaused ? 0 : data.out);
5743
5753
  }
5744
- addNewStream(streamId, stream, audioPaused, videoPaused) {
5754
+ addNewStream(streamId, stream, audioPaused, videoPaused, beforeEffectTracks = []) {
5745
5755
  if (streamId === "0") {
5746
5756
  this._micPaused = audioPaused;
5747
5757
  this._webcamPaused = videoPaused;
@@ -5749,14 +5759,24 @@ class VegaRtcManager {
5749
5759
  const audioTrack = stream.getAudioTracks()[0];
5750
5760
  if (videoTrack) {
5751
5761
  this._sendWebcam(videoTrack);
5752
- if (!videoTrack.replacement) {
5753
- this._startMonitoringVideoTrack(videoTrack);
5762
+ if (!videoTrack.effectTrack) {
5763
+ this._monitorVideoTrack(videoTrack);
5764
+ }
5765
+ const beforeEffectTrack = beforeEffectTracks.find(t => t.kind === "video");
5766
+ if (beforeEffectTrack) {
5767
+ this._monitorVideoTrack(beforeEffectTrack);
5754
5768
  }
5755
5769
  }
5756
5770
  if (audioTrack) {
5757
5771
  this._sendMic(audioTrack);
5758
5772
  this._syncMicAnalyser();
5759
- this._startMonitoringAudioTrack(audioTrack);
5773
+ if (!audioTrack.effectTrack) {
5774
+ this._monitorAudioTrack(audioTrack);
5775
+ }
5776
+ const beforeEffectTrack = beforeEffectTracks.find(t => t.kind === "audio");
5777
+ if (beforeEffectTrack) {
5778
+ this._monitorAudioTrack(beforeEffectTrack);
5779
+ }
5760
5780
  }
5761
5781
  if (this._localStreamDeregisterFunction) {
5762
5782
  this._localStreamDeregisterFunction();
@@ -5844,7 +5864,7 @@ class VegaRtcManager {
5844
5864
  navigator.mediaDevices.getUserMedia({ video: constraints }).then((stream) => {
5845
5865
  const track = stream.getVideoTracks()[0];
5846
5866
  localStream.addTrack(track);
5847
- this._startMonitoringVideoTrack(track);
5867
+ this._monitorVideoTrack(track);
5848
5868
  this._emitToPWA(EVENTS.LOCAL_STREAM_TRACK_ADDED, {
5849
5869
  streamId: localStream.id,
5850
5870
  tracks: [track],
@@ -5877,8 +5897,10 @@ class VegaRtcManager {
5877
5897
  logger$1.info("updateStreamResolution()", { streamId, width, height });
5878
5898
  const consumerId = this._streamIdToVideoConsumerId.get(streamId);
5879
5899
  const consumer = this._consumers.get(consumerId);
5880
- if (!consumer)
5900
+ if (!consumer) {
5901
+ this._streamIdToVideoResolution.set(streamId, { width, height });
5881
5902
  return;
5903
+ }
5882
5904
  const numberOfActiveVideos = getNumberOfActiveVideos(this._consumers);
5883
5905
  const numberOfTemporalLayers = getNumberOfTemporalLayers(consumer);
5884
5906
  const { spatialLayer, temporalLayer } = getLayers({ width, height }, {
@@ -5939,17 +5961,21 @@ class VegaRtcManager {
5939
5961
  rtcStats.server.connect();
5940
5962
  }
5941
5963
  }
5942
- _startMonitoringAudioTrack(track) {
5964
+ _monitorAudioTrack(track) {
5965
+ var _a, _b;
5966
+ if (((_a = this._audioTrackBeingMonitored) === null || _a === void 0 ? void 0 : _a.id) === track.id)
5967
+ return;
5968
+ (_b = this._audioTrackBeingMonitored) === null || _b === void 0 ? void 0 : _b.removeEventListener("ended", this._audioTrackOnEnded);
5943
5969
  track.addEventListener("ended", this._audioTrackOnEnded);
5970
+ this._audioTrackBeingMonitored = track;
5944
5971
  }
5945
- _stopMonitoringAudioTrack(track) {
5946
- track.removeEventListener("ended", this._audioTrackOnEnded);
5947
- }
5948
- _startMonitoringVideoTrack(track) {
5972
+ _monitorVideoTrack(track) {
5973
+ var _a, _b;
5974
+ if (((_a = this._videoTrackBeingMonitored) === null || _a === void 0 ? void 0 : _a.id) === track.id)
5975
+ return;
5976
+ (_b = this._videoTrackBeingMonitored) === null || _b === void 0 ? void 0 : _b.removeEventListener("ended", this._videoTrackOnEnded);
5949
5977
  track.addEventListener("ended", this._videoTrackOnEnded);
5950
- }
5951
- _stopMonitoringVideoTrack(track) {
5952
- track.removeEventListener("ended", this._videoTrackOnEnded);
5978
+ this._videoTrackBeingMonitored = track;
5953
5979
  }
5954
5980
  _onMessage(message) {
5955
5981
  return __awaiter(this, void 0, void 0, function* () {
@@ -6029,6 +6055,11 @@ class VegaRtcManager {
6029
6055
  }
6030
6056
  stream.addTrack(consumer.track);
6031
6057
  this._syncIncomingStreamsWithPWA(clientId);
6058
+ const resolution = this._streamIdToVideoResolution.get(stream.id);
6059
+ if (resolution) {
6060
+ this.updateStreamResolution(stream.id, null, resolution);
6061
+ this._streamIdToVideoResolution.delete(stream.id);
6062
+ }
6032
6063
  });
6033
6064
  }
6034
6065
  _onConsumerClosed({ consumerId, reason }) {
@@ -6117,6 +6148,7 @@ class VegaRtcManager {
6117
6148
  stream.removeTrack(consumer.track);
6118
6149
  if (stream.getTracks().length === 0) {
6119
6150
  this._streamIdToVideoConsumerId.delete(stream.id);
6151
+ this._streamIdToVideoResolution.delete(stream.id);
6120
6152
  if (screenShare) {
6121
6153
  clientState.screenStream = null;
6122
6154
  clientState.hasEmittedScreenStream = false;
@@ -3527,20 +3527,32 @@ class P2pRtcManager {
3527
3527
  maybeRestrictRelayBandwidth(session) {
3528
3528
  session.maybeRestrictRelayBandwidth();
3529
3529
  }
3530
- addNewStream(streamId, stream) {
3530
+ addNewStream(streamId, stream, audioPaused, videoPaused, beforeEffectTracks = []) {
3531
3531
  if (stream === this.localStreams[streamId]) {
3532
3532
  return;
3533
3533
  }
3534
3534
  this._addLocalStream(streamId, stream);
3535
3535
  if (streamId === CAMERA_STREAM_ID) {
3536
3536
  this._addStreamToPeerConnections(stream);
3537
- const [audioTrack] = stream.getAudioTracks();
3537
+ const audioTrack = stream.getAudioTracks()[0];
3538
3538
  const videoTrack = stream.getVideoTracks()[0];
3539
3539
  if (audioTrack) {
3540
- this._startMonitoringAudioTrack(audioTrack);
3540
+ if (!audioTrack.effectTrack) {
3541
+ this._monitorAudioTrack(audioTrack);
3542
+ }
3543
+ const beforeEffectTrack = beforeEffectTracks.find((t) => t.kind === "audio");
3544
+ if (beforeEffectTrack) {
3545
+ this._monitorAudioTrack(beforeEffectTrack);
3546
+ }
3541
3547
  }
3542
- if (videoTrack && !videoTrack.replacement) {
3543
- this._startMonitoringVideoTrack(videoTrack);
3548
+ if (videoTrack) {
3549
+ if (!videoTrack.effectTrack) {
3550
+ this._monitorVideoTrack(videoTrack);
3551
+ }
3552
+ const beforeEffectTrack = beforeEffectTracks.find((t) => t.kind === "video");
3553
+ if (beforeEffectTrack) {
3554
+ this._monitorVideoTrack(beforeEffectTrack);
3555
+ }
3544
3556
  }
3545
3557
  if (this._localStreamDeregisterFunction) {
3546
3558
  this._localStreamDeregisterFunction();
@@ -3561,17 +3573,11 @@ class P2pRtcManager {
3561
3573
  return;
3562
3574
  }
3563
3575
  replaceTrack(oldTrack, newTrack) {
3564
- if (oldTrack && oldTrack.kind === "audio") {
3565
- this._stopMonitoringAudioTrack(oldTrack);
3566
- }
3567
- if (oldTrack && oldTrack.kind === "video" && !newTrack.replacement) {
3568
- this._stopMonitoringVideoTrack(oldTrack);
3569
- }
3570
- if (newTrack && newTrack.kind === "audio") {
3571
- this._startMonitoringAudioTrack(newTrack);
3576
+ if (newTrack.kind === "audio" && !newTrack.effectTrack) {
3577
+ this._monitorAudioTrack(newTrack);
3572
3578
  }
3573
- if (newTrack.kind === "video" && !newTrack.replacement) {
3574
- this._startMonitoringVideoTrack(newTrack);
3579
+ if (newTrack.kind === "video" && !newTrack.effectTrack) {
3580
+ this._monitorVideoTrack(newTrack);
3575
3581
  }
3576
3582
  return this._replaceTrackToPeerConnections(oldTrack, newTrack);
3577
3583
  }
@@ -4085,17 +4091,21 @@ class P2pRtcManager {
4085
4091
  clearTimeout(this._fetchMediaServersTimer);
4086
4092
  this._fetchMediaServersTimer = null;
4087
4093
  }
4088
- _startMonitoringAudioTrack(track) {
4094
+ _monitorAudioTrack(track) {
4095
+ var _a, _b;
4096
+ if (((_a = this._audioTrackBeingMonitored) === null || _a === void 0 ? void 0 : _a.id) === track.id)
4097
+ return;
4098
+ (_b = this._audioTrackBeingMonitored) === null || _b === void 0 ? void 0 : _b.removeEventListener("ended", this._audioTrackOnEnded);
4089
4099
  track.addEventListener("ended", this._audioTrackOnEnded);
4100
+ this._audioTrackBeingMonitored = track;
4090
4101
  }
4091
- _stopMonitoringAudioTrack(track) {
4092
- track.removeEventListener("ended", this._audioTrackOnEnded);
4093
- }
4094
- _startMonitoringVideoTrack(track) {
4102
+ _monitorVideoTrack(track) {
4103
+ var _a, _b;
4104
+ if (((_a = this._videoTrackBeingMonitored) === null || _a === void 0 ? void 0 : _a.id) === track.id)
4105
+ return;
4106
+ (_b = this._videoTrackBeingMonitored) === null || _b === void 0 ? void 0 : _b.removeEventListener("ended", this._videoTrackOnEnded);
4095
4107
  track.addEventListener("ended", this._videoTrackOnEnded);
4096
- }
4097
- _stopMonitoringVideoTrack(track) {
4098
- track.removeEventListener("ended", this._videoTrackOnEnded);
4108
+ this._videoTrackBeingMonitored = track;
4099
4109
  }
4100
4110
  _connect(clientId) {
4101
4111
  this.rtcStatsReconnect();
@@ -4455,7 +4465,9 @@ class P2pRtcManager {
4455
4465
  return;
4456
4466
  }
4457
4467
  if (enable === false) {
4458
- const stopCameraDelay = ((_a = localStream.getVideoTracks().find((t) => !t.enabled)) === null || _a === void 0 ? void 0 : _a.readyState) === "ended" ? 0 : 5000;
4468
+ const stopCameraDelay = ((_a = localStream.getVideoTracks().find((t) => !t.enabled)) === null || _a === void 0 ? void 0 : _a.readyState) === "ended"
4469
+ ? 0
4470
+ : 5000;
4459
4471
  setTimeout(() => {
4460
4472
  localStream.getVideoTracks().forEach((track) => {
4461
4473
  if (track.enabled === false) {
@@ -4479,7 +4491,7 @@ class P2pRtcManager {
4479
4491
  navigator.mediaDevices.getUserMedia({ video: constraints }).then((stream) => {
4480
4492
  const track = stream.getVideoTracks()[0];
4481
4493
  localStream.addTrack(track);
4482
- this._startMonitoringVideoTrack(track);
4494
+ this._monitorVideoTrack(track);
4483
4495
  this._emit(EVENTS.LOCAL_STREAM_TRACK_ADDED, {
4484
4496
  streamId: localStream.id,
4485
4497
  tracks: [track],
@@ -4966,6 +4978,7 @@ class VegaRtcManager {
4966
4978
  this._receiveTransport = null;
4967
4979
  this._clientStates = new Map();
4968
4980
  this._streamIdToVideoConsumerId = new Map();
4981
+ this._streamIdToVideoResolution = new Map();
4969
4982
  this._consumers = new Map();
4970
4983
  this._dataConsumers = new Map();
4971
4984
  this._localStreamDeregisterFunction = null;
@@ -5068,6 +5081,7 @@ class VegaRtcManager {
5068
5081
  this._sendTransport = null;
5069
5082
  this._receiveTransport = null;
5070
5083
  this._streamIdToVideoConsumerId.clear();
5084
+ this._streamIdToVideoResolution.clear();
5071
5085
  if (this._reconnect) {
5072
5086
  this._reconnectTimeOut = setTimeout(() => this._connect(), 1000);
5073
5087
  }
@@ -5704,20 +5718,16 @@ class VegaRtcManager {
5704
5718
  }
5705
5719
  }
5706
5720
  replaceTrack(oldTrack, track) {
5707
- if (oldTrack && oldTrack.kind === "audio") {
5708
- this._stopMonitoringAudioTrack(oldTrack);
5709
- }
5710
- if (oldTrack && oldTrack.kind === "video" && !track.replacement) {
5711
- this._stopMonitoringVideoTrack(oldTrack);
5712
- }
5713
5721
  if (track.kind === "audio") {
5714
- this._startMonitoringAudioTrack(track);
5722
+ if (!track.effectTrack) {
5723
+ this._monitorAudioTrack(track);
5724
+ }
5715
5725
  this._micTrack = track;
5716
5726
  this._replaceMicTrack();
5717
5727
  }
5718
5728
  if (track.kind === "video") {
5719
- if (!track.replacement) {
5720
- this._startMonitoringVideoTrack(track);
5729
+ if (!track.effectTrack) {
5730
+ this._monitorVideoTrack(track);
5721
5731
  }
5722
5732
  this._webcamTrack = track;
5723
5733
  this._replaceWebcamTrack();
@@ -5741,7 +5751,7 @@ class VegaRtcManager {
5741
5751
  (_b = (_a = this._micAnalyserDebugger) === null || _a === void 0 ? void 0 : _a.onScoreUpdated) === null || _b === void 0 ? void 0 : _b.call(_a, data);
5742
5752
  this._sendMicScore(this._micPaused ? 0 : data.out);
5743
5753
  }
5744
- addNewStream(streamId, stream, audioPaused, videoPaused) {
5754
+ addNewStream(streamId, stream, audioPaused, videoPaused, beforeEffectTracks = []) {
5745
5755
  if (streamId === "0") {
5746
5756
  this._micPaused = audioPaused;
5747
5757
  this._webcamPaused = videoPaused;
@@ -5749,14 +5759,24 @@ class VegaRtcManager {
5749
5759
  const audioTrack = stream.getAudioTracks()[0];
5750
5760
  if (videoTrack) {
5751
5761
  this._sendWebcam(videoTrack);
5752
- if (!videoTrack.replacement) {
5753
- this._startMonitoringVideoTrack(videoTrack);
5762
+ if (!videoTrack.effectTrack) {
5763
+ this._monitorVideoTrack(videoTrack);
5764
+ }
5765
+ const beforeEffectTrack = beforeEffectTracks.find(t => t.kind === "video");
5766
+ if (beforeEffectTrack) {
5767
+ this._monitorVideoTrack(beforeEffectTrack);
5754
5768
  }
5755
5769
  }
5756
5770
  if (audioTrack) {
5757
5771
  this._sendMic(audioTrack);
5758
5772
  this._syncMicAnalyser();
5759
- this._startMonitoringAudioTrack(audioTrack);
5773
+ if (!audioTrack.effectTrack) {
5774
+ this._monitorAudioTrack(audioTrack);
5775
+ }
5776
+ const beforeEffectTrack = beforeEffectTracks.find(t => t.kind === "audio");
5777
+ if (beforeEffectTrack) {
5778
+ this._monitorAudioTrack(beforeEffectTrack);
5779
+ }
5760
5780
  }
5761
5781
  if (this._localStreamDeregisterFunction) {
5762
5782
  this._localStreamDeregisterFunction();
@@ -5844,7 +5864,7 @@ class VegaRtcManager {
5844
5864
  navigator.mediaDevices.getUserMedia({ video: constraints }).then((stream) => {
5845
5865
  const track = stream.getVideoTracks()[0];
5846
5866
  localStream.addTrack(track);
5847
- this._startMonitoringVideoTrack(track);
5867
+ this._monitorVideoTrack(track);
5848
5868
  this._emitToPWA(EVENTS.LOCAL_STREAM_TRACK_ADDED, {
5849
5869
  streamId: localStream.id,
5850
5870
  tracks: [track],
@@ -5877,8 +5897,10 @@ class VegaRtcManager {
5877
5897
  logger$1.info("updateStreamResolution()", { streamId, width, height });
5878
5898
  const consumerId = this._streamIdToVideoConsumerId.get(streamId);
5879
5899
  const consumer = this._consumers.get(consumerId);
5880
- if (!consumer)
5900
+ if (!consumer) {
5901
+ this._streamIdToVideoResolution.set(streamId, { width, height });
5881
5902
  return;
5903
+ }
5882
5904
  const numberOfActiveVideos = getNumberOfActiveVideos(this._consumers);
5883
5905
  const numberOfTemporalLayers = getNumberOfTemporalLayers(consumer);
5884
5906
  const { spatialLayer, temporalLayer } = getLayers({ width, height }, {
@@ -5939,17 +5961,21 @@ class VegaRtcManager {
5939
5961
  rtcStats.server.connect();
5940
5962
  }
5941
5963
  }
5942
- _startMonitoringAudioTrack(track) {
5964
+ _monitorAudioTrack(track) {
5965
+ var _a, _b;
5966
+ if (((_a = this._audioTrackBeingMonitored) === null || _a === void 0 ? void 0 : _a.id) === track.id)
5967
+ return;
5968
+ (_b = this._audioTrackBeingMonitored) === null || _b === void 0 ? void 0 : _b.removeEventListener("ended", this._audioTrackOnEnded);
5943
5969
  track.addEventListener("ended", this._audioTrackOnEnded);
5970
+ this._audioTrackBeingMonitored = track;
5944
5971
  }
5945
- _stopMonitoringAudioTrack(track) {
5946
- track.removeEventListener("ended", this._audioTrackOnEnded);
5947
- }
5948
- _startMonitoringVideoTrack(track) {
5972
+ _monitorVideoTrack(track) {
5973
+ var _a, _b;
5974
+ if (((_a = this._videoTrackBeingMonitored) === null || _a === void 0 ? void 0 : _a.id) === track.id)
5975
+ return;
5976
+ (_b = this._videoTrackBeingMonitored) === null || _b === void 0 ? void 0 : _b.removeEventListener("ended", this._videoTrackOnEnded);
5949
5977
  track.addEventListener("ended", this._videoTrackOnEnded);
5950
- }
5951
- _stopMonitoringVideoTrack(track) {
5952
- track.removeEventListener("ended", this._videoTrackOnEnded);
5978
+ this._videoTrackBeingMonitored = track;
5953
5979
  }
5954
5980
  _onMessage(message) {
5955
5981
  return __awaiter(this, void 0, void 0, function* () {
@@ -6029,6 +6055,11 @@ class VegaRtcManager {
6029
6055
  }
6030
6056
  stream.addTrack(consumer.track);
6031
6057
  this._syncIncomingStreamsWithPWA(clientId);
6058
+ const resolution = this._streamIdToVideoResolution.get(stream.id);
6059
+ if (resolution) {
6060
+ this.updateStreamResolution(stream.id, null, resolution);
6061
+ this._streamIdToVideoResolution.delete(stream.id);
6062
+ }
6032
6063
  });
6033
6064
  }
6034
6065
  _onConsumerClosed({ consumerId, reason }) {
@@ -6117,6 +6148,7 @@ class VegaRtcManager {
6117
6148
  stream.removeTrack(consumer.track);
6118
6149
  if (stream.getTracks().length === 0) {
6119
6150
  this._streamIdToVideoConsumerId.delete(stream.id);
6151
+ this._streamIdToVideoResolution.delete(stream.id);
6120
6152
  if (screenShare) {
6121
6153
  clientState.screenStream = null;
6122
6154
  clientState.hasEmittedScreenStream = false;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@whereby.com/media",
3
3
  "description": "Media library for Whereby",
4
- "version": "1.6.3",
4
+ "version": "1.6.5",
5
5
  "license": "MIT",
6
6
  "homepage": "https://github.com/whereby/sdk",
7
7
  "repository": {