@whereby.com/media 1.6.1 → 1.6.2

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
@@ -3478,6 +3478,7 @@ var rtcManagerEvents = {
3478
3478
  ICE_RESTART: "ice_restart",
3479
3479
  MICROPHONE_NOT_WORKING: "microphone_not_working",
3480
3480
  MICROPHONE_STOPPED_WORKING: "microphone_stopped_working",
3481
+ CAMERA_STOPPED_WORKING: "camera_stopped_working",
3481
3482
  NEW_PC: "new_pc",
3482
3483
  SFU_CONNECTION_OPEN: "sfu_connection_open",
3483
3484
  SFU_CONNECTION_CLOSED: "sfu_connection_closed",
@@ -3524,6 +3525,10 @@ class P2pRtcManager {
3524
3525
  rtcStats.sendEvent("audio_ended", { unloading: unloading$1 });
3525
3526
  this._emit(rtcManagerEvents.MICROPHONE_STOPPED_WORKING, {});
3526
3527
  };
3528
+ this._videoTrackOnEnded = () => {
3529
+ rtcStats.sendEvent("video_ended", { unloading: unloading$1 });
3530
+ this._emit(rtcManagerEvents.CAMERA_STOPPED_WORKING, {});
3531
+ };
3527
3532
  this._updateAndScheduleMediaServersRefresh({
3528
3533
  sfuServer,
3529
3534
  iceServers: iceServers.iceServers || [],
@@ -3551,9 +3556,13 @@ class P2pRtcManager {
3551
3556
  if (streamId === CAMERA_STREAM_ID) {
3552
3557
  this._addStreamToPeerConnections(stream);
3553
3558
  const [audioTrack] = stream.getAudioTracks();
3559
+ const videoTrack = stream.getVideoTracks()[0];
3554
3560
  if (audioTrack) {
3555
3561
  this._startMonitoringAudioTrack(audioTrack);
3556
3562
  }
3563
+ if (videoTrack && !videoTrack.replacement) {
3564
+ this._startMonitoringVideoTrack(videoTrack);
3565
+ }
3557
3566
  if (this._localStreamDeregisterFunction) {
3558
3567
  this._localStreamDeregisterFunction();
3559
3568
  this._localStreamDeregisterFunction = null;
@@ -3576,9 +3585,15 @@ class P2pRtcManager {
3576
3585
  if (oldTrack && oldTrack.kind === "audio") {
3577
3586
  this._stopMonitoringAudioTrack(oldTrack);
3578
3587
  }
3588
+ if (oldTrack && oldTrack.kind === "video" && !newTrack.replacement) {
3589
+ this._stopMonitoringVideoTrack(oldTrack);
3590
+ }
3579
3591
  if (newTrack && newTrack.kind === "audio") {
3580
3592
  this._startMonitoringAudioTrack(newTrack);
3581
3593
  }
3594
+ if (newTrack.kind === "video" && !newTrack.replacement) {
3595
+ this._startMonitoringVideoTrack(newTrack);
3596
+ }
3582
3597
  return this._replaceTrackToPeerConnections(oldTrack, newTrack);
3583
3598
  }
3584
3599
  accept({ clientId, shouldAddLocalVideo }) {
@@ -4097,6 +4112,12 @@ class P2pRtcManager {
4097
4112
  _stopMonitoringAudioTrack(track) {
4098
4113
  track.removeEventListener("ended", this._audioTrackOnEnded);
4099
4114
  }
4115
+ _startMonitoringVideoTrack(track) {
4116
+ track.addEventListener("ended", this._videoTrackOnEnded);
4117
+ }
4118
+ _stopMonitoringVideoTrack(track) {
4119
+ track.removeEventListener("ended", this._videoTrackOnEnded);
4120
+ }
4100
4121
  _connect(clientId) {
4101
4122
  this.rtcStatsReconnect();
4102
4123
  const shouldAddLocalVideo = true;
@@ -4450,10 +4471,12 @@ class P2pRtcManager {
4450
4471
  }
4451
4472
  }
4452
4473
  stopOrResumeVideo(localStream, enable) {
4474
+ var _a;
4453
4475
  if (!["chrome", "safari"].includes(browserName$1)) {
4454
4476
  return;
4455
4477
  }
4456
4478
  if (enable === false) {
4479
+ const stopCameraDelay = ((_a = localStream.getVideoTracks().find((t) => !t.enabled)) === null || _a === void 0 ? void 0 : _a.readyState) === "ended" ? 0 : 5000;
4457
4480
  setTimeout(() => {
4458
4481
  localStream.getVideoTracks().forEach((track) => {
4459
4482
  if (track.enabled === false) {
@@ -4466,7 +4489,7 @@ class P2pRtcManager {
4466
4489
  this._handleStopOrResumeVideo({ enable, track });
4467
4490
  }
4468
4491
  });
4469
- }, 5000);
4492
+ }, stopCameraDelay);
4470
4493
  }
4471
4494
  else {
4472
4495
  if (localStream.getVideoTracks().length === 0) {
@@ -4477,6 +4500,7 @@ class P2pRtcManager {
4477
4500
  navigator.mediaDevices.getUserMedia({ video: constraints }).then((stream) => {
4478
4501
  const track = stream.getVideoTracks()[0];
4479
4502
  localStream.addTrack(track);
4503
+ this._startMonitoringVideoTrack(track);
4480
4504
  this._emit(EVENTS.LOCAL_STREAM_TRACK_ADDED, {
4481
4505
  streamId: localStream.id,
4482
4506
  tracks: [track],
@@ -4990,6 +5014,10 @@ class VegaRtcManager {
4990
5014
  rtcStats.sendEvent("audio_ended", { unloading });
4991
5015
  this._emitToPWA(rtcManagerEvents.MICROPHONE_STOPPED_WORKING, {});
4992
5016
  };
5017
+ this._videoTrackOnEnded = () => {
5018
+ rtcStats.sendEvent("video_ended", { unloading });
5019
+ this._emitToPWA(rtcManagerEvents.CAMERA_STOPPED_WORKING, {});
5020
+ };
4993
5021
  this._updateAndScheduleMediaServersRefresh({
4994
5022
  sfuServer,
4995
5023
  iceServers: iceServers.iceServers || [],
@@ -5700,12 +5728,18 @@ class VegaRtcManager {
5700
5728
  if (oldTrack && oldTrack.kind === "audio") {
5701
5729
  this._stopMonitoringAudioTrack(oldTrack);
5702
5730
  }
5731
+ if (oldTrack && oldTrack.kind === "video" && !track.replacement) {
5732
+ this._stopMonitoringVideoTrack(oldTrack);
5733
+ }
5703
5734
  if (track.kind === "audio") {
5704
5735
  this._startMonitoringAudioTrack(track);
5705
5736
  this._micTrack = track;
5706
5737
  this._replaceMicTrack();
5707
5738
  }
5708
5739
  if (track.kind === "video") {
5740
+ if (!track.replacement) {
5741
+ this._startMonitoringVideoTrack(track);
5742
+ }
5709
5743
  this._webcamTrack = track;
5710
5744
  this._replaceWebcamTrack();
5711
5745
  }
@@ -5734,8 +5768,12 @@ class VegaRtcManager {
5734
5768
  this._webcamPaused = videoPaused;
5735
5769
  const videoTrack = stream.getVideoTracks()[0];
5736
5770
  const audioTrack = stream.getAudioTracks()[0];
5737
- if (videoTrack)
5771
+ if (videoTrack) {
5738
5772
  this._sendWebcam(videoTrack);
5773
+ if (!videoTrack.replacement) {
5774
+ this._startMonitoringVideoTrack(videoTrack);
5775
+ }
5776
+ }
5739
5777
  if (audioTrack) {
5740
5778
  this._sendMic(audioTrack);
5741
5779
  this._syncMicAnalyser();
@@ -5798,6 +5836,7 @@ class VegaRtcManager {
5798
5836
  }
5799
5837
  }
5800
5838
  stopOrResumeVideo(localStream, enable) {
5839
+ var _a;
5801
5840
  logger$1.info("stopOrResumeVideo() [enable:%s]", enable);
5802
5841
  this._webcamPaused = !enable;
5803
5842
  this._pauseResumeWebcam();
@@ -5806,6 +5845,7 @@ class VegaRtcManager {
5806
5845
  }
5807
5846
  if (!enable) {
5808
5847
  clearTimeout(this._stopCameraTimeout);
5848
+ const stopCameraDelay = ((_a = localStream.getVideoTracks().find((t) => !t.enabled)) === null || _a === void 0 ? void 0 : _a.readyState) === "ended" ? 0 : 5000;
5809
5849
  this._stopCameraTimeout = setTimeout(() => {
5810
5850
  localStream.getVideoTracks().forEach((track) => {
5811
5851
  if (track.enabled === false) {
@@ -5818,13 +5858,14 @@ class VegaRtcManager {
5818
5858
  this._handleStopOrResumeVideo({ enable, track });
5819
5859
  }
5820
5860
  });
5821
- }, 5000);
5861
+ }, stopCameraDelay);
5822
5862
  }
5823
5863
  else if (localStream.getVideoTracks().length === 0) {
5824
5864
  const constraints = this._webrtcProvider.getMediaConstraints().video;
5825
5865
  navigator.mediaDevices.getUserMedia({ video: constraints }).then((stream) => {
5826
5866
  const track = stream.getVideoTracks()[0];
5827
5867
  localStream.addTrack(track);
5868
+ this._startMonitoringVideoTrack(track);
5828
5869
  this._emitToPWA(EVENTS.LOCAL_STREAM_TRACK_ADDED, {
5829
5870
  streamId: localStream.id,
5830
5871
  tracks: [track],
@@ -5925,6 +5966,12 @@ class VegaRtcManager {
5925
5966
  _stopMonitoringAudioTrack(track) {
5926
5967
  track.removeEventListener("ended", this._audioTrackOnEnded);
5927
5968
  }
5969
+ _startMonitoringVideoTrack(track) {
5970
+ track.addEventListener("ended", this._videoTrackOnEnded);
5971
+ }
5972
+ _stopMonitoringVideoTrack(track) {
5973
+ track.removeEventListener("ended", this._videoTrackOnEnded);
5974
+ }
5928
5975
  _onMessage(message) {
5929
5976
  return __awaiter(this, void 0, void 0, function* () {
5930
5977
  const { method, data } = message;
package/dist/index.d.cts CHANGED
@@ -128,7 +128,7 @@ interface RtcManager {
128
128
  addNewStream(streamId: string, stream: MediaStream, isAudioEnabled: boolean, isVideoEnabled: boolean): void;
129
129
  disconnect(streamId: string, activeBreakout: boolean | null, eventClaim?: string): void;
130
130
  disconnectAll(): void;
131
- replaceTrack(oldTrack: MediaStreamTrack, newTrack: MediaStreamTrack): void;
131
+ replaceTrack(oldTrack: CustomMediaStreamTrack, newTrack: CustomMediaStreamTrack): void;
132
132
  removeStream(streamId: string, _stream: MediaStream, requestedByClientId: string | null): void;
133
133
  shouldAcceptStreamsFromBothSides?: () => boolean;
134
134
  updateStreamResolution(streamId: string, ignored: null, resolution: {
@@ -263,6 +263,9 @@ type GetDeviceDataResult = {
263
263
  kind: string;
264
264
  };
265
265
  };
266
+ interface CustomMediaStreamTrack extends MediaStreamTrack {
267
+ replacement?: boolean;
268
+ }
266
269
 
267
270
  declare function getMediaConstraints({ disableAEC, disableAGC, hd, lax, lowDataMode, preferredDeviceIds, resolution, simulcast, widescreen, }: GetMediaConstraintsOptions): any;
268
271
  declare function getConstraints({ devices, videoId, audioId, options, type }: GetConstraintsOptions): any;
@@ -327,6 +330,7 @@ declare class P2pRtcManager implements RtcManager {
327
330
  };
328
331
  _pendingActionsForConnectedPeerConnections: any[];
329
332
  _audioTrackOnEnded: () => void;
333
+ _videoTrackOnEnded: () => void;
330
334
  totalSessionsCreated: number;
331
335
  _iceServers: any;
332
336
  _sfuServer: any;
@@ -356,7 +360,7 @@ declare class P2pRtcManager implements RtcManager {
356
360
  supportsScreenShareAudio(): boolean;
357
361
  maybeRestrictRelayBandwidth(session: any): void;
358
362
  addNewStream(streamId: string, stream: MediaStream): void;
359
- replaceTrack(oldTrack: MediaStreamTrack, newTrack: MediaStreamTrack): Promise<any[]>;
363
+ replaceTrack(oldTrack: CustomMediaStreamTrack, newTrack: CustomMediaStreamTrack): Promise<any[]>;
360
364
  accept({ clientId, shouldAddLocalVideo }: {
361
365
  clientId: string;
362
366
  shouldAddLocalVideo?: boolean;
@@ -412,6 +416,8 @@ declare class P2pRtcManager implements RtcManager {
412
416
  _clearMediaServersRefresh(): void;
413
417
  _startMonitoringAudioTrack(track: any): void;
414
418
  _stopMonitoringAudioTrack(track: any): void;
419
+ _startMonitoringVideoTrack(track: CustomMediaStreamTrack): void;
420
+ _stopMonitoringVideoTrack(track: CustomMediaStreamTrack): void;
415
421
  _connect(clientId: string): Promise<any>;
416
422
  _maybeRestartIce(clientId: string, session: any): void;
417
423
  _setCodecPreferences(pc: any, vp9On: any, av1On: any, redOn: any): void;
@@ -841,6 +847,7 @@ declare const _default: {
841
847
  ICE_RESTART: string;
842
848
  MICROPHONE_NOT_WORKING: string;
843
849
  MICROPHONE_STOPPED_WORKING: string;
850
+ CAMERA_STOPPED_WORKING: string;
844
851
  NEW_PC: string;
845
852
  SFU_CONNECTION_OPEN: string;
846
853
  SFU_CONNECTION_CLOSED: string;
@@ -1090,6 +1097,7 @@ declare class VegaRtcManager implements RtcManager {
1090
1097
  _colocation: any;
1091
1098
  _stopCameraTimeout: any;
1092
1099
  _audioTrackOnEnded: any;
1100
+ _videoTrackOnEnded: any;
1093
1101
  _socketListenerDeregisterFunctions: any;
1094
1102
  _reconnect: any;
1095
1103
  _reconnectTimeOut: any;
@@ -1150,7 +1158,7 @@ declare class VegaRtcManager implements RtcManager {
1150
1158
  setRemoteScreenshareVideoTrackIds(): void;
1151
1159
  setRoomSessionId(roomSessionId: string): void;
1152
1160
  disconnect(clientIdOrStreamId: string, _activeBreakout: any, eventClaim?: string): void;
1153
- replaceTrack(oldTrack: MediaStreamTrack | null, track: MediaStreamTrack): void;
1161
+ replaceTrack(oldTrack: CustomMediaStreamTrack | null, track: CustomMediaStreamTrack): void;
1154
1162
  removeStream(streamId: string, _stream: MediaStream, requestedByClientId: string): void;
1155
1163
  _onMicAnalyserScoreUpdated(data: any): void;
1156
1164
  addNewStream(streamId: string, stream: MediaStream, audioPaused: boolean, videoPaused: boolean): void;
@@ -1178,6 +1186,8 @@ declare class VegaRtcManager implements RtcManager {
1178
1186
  rtcStatsReconnect(): void;
1179
1187
  _startMonitoringAudioTrack(track: MediaStreamTrack): void;
1180
1188
  _stopMonitoringAudioTrack(track: MediaStreamTrack): void;
1189
+ _startMonitoringVideoTrack(track: CustomMediaStreamTrack): void;
1190
+ _stopMonitoringVideoTrack(track: CustomMediaStreamTrack): void;
1181
1191
  _onMessage(message: any): Promise<void>;
1182
1192
  _onConsumerReady(options: any): Promise<void>;
1183
1193
  _onConsumerClosed({ consumerId, reason }: {
@@ -1380,4 +1390,4 @@ declare class RtcStream {
1380
1390
  static getTypeFromId(id: string): string;
1381
1391
  }
1382
1392
 
1383
- export { type AddSpotlightRequest, type AudioEnableRequest, type AudioEnableRequestedEvent, type AudioEnabledEvent, BandwidthTester, type ChatMessage, type ClientKickedEvent, type ClientLeftEvent, type ClientMetadataPayload, type ClientMetadataReceivedEvent, type ClientRole, type CloudRecordingStartedEvent, type Credentials, EVENTS, type GetConstraintsOptions, type GetDeviceDataResult, type GetMediaConstraintsOptions, type GetStreamOptions, type GetStreamResult, type GetUpdatedDevicesResult, type IdentifyDeviceRequest, type JoinRoomRequest, KNOCK_MESSAGES, KalmanFilter, type KnockAcceptedEvent, type KnockRejectedEvent, type KnockRoomRequest, type KnockerLeftEvent, Logger, MAXIMUM_TURN_BANDWIDTH, MAXIMUM_TURN_BANDWIDTH_UNLIMITED, MEDIA_JITTER_BUFFER_TARGET, type NewClientEvent, NoDevicesError, P2pRtcManager, PROTOCOL_ERRORS, PROTOCOL_EVENTS, PROTOCOL_REQUESTS, PROTOCOL_RESPONSES, RELAY_MESSAGES, ReconnectManager, type RemoveSpotlightRequest, type RoleName, type RoomJoinedEvent, type RoomKnockedEvent, type RoomLockedEvent, type RoomSessionEndedEvent, type RtcClientConnectionStatusChangedPayload, RtcEventNames, type RtcEvents, type RtcLocalStreamTrackAddedPayload, type RtcLocalStreamTrackRemovedPayload, type RtcManager, type RtcManagerCreatedPayload, RtcManagerDispatcher, RtcStream, type RtcStreamAddedPayload, STREAM_TYPES, type ScreenshareStartedEvent, type ScreenshareStoppedEvent, type SendClientMetadataRequest, ServerSocket, Session, SfuV2Parser, type SignalClient, type SignalEvents, type SignalKnocker, type SignalRequests, type SocketConf, type SocketManager, type Spotlight, type SpotlightAddedEvent, type SpotlightRemovedEvent, type StatsMonitorOptions, type StatsMonitorState, TYPES, VegaConnection, VegaMediaQualityMonitor, VegaRtcManager, type VideoEnabledEvent, addAbsCaptureTimeExtMap, addExtMap, assert, buildDeviceList, calculateStd, captureAudioSsrcMetrics, captureCandidatePairInfoMetrics, captureCommonSsrcMetrics, captureSsrcInfo, captureVideoSsrcMetrics, changeMediaDirection, compareLocalDevices, createACFCalculator, createMicAnalyser, createWorker, deprioritizeH264, detectMicrophoneNotWorking, enumerate, filterMidExtension, filterMsidSemantic, fromLocation, generateByteString, getConstraints, getCurrentPeerConnections, getDeviceData, getDisplayMedia, getHandler, getIssuesAndMetrics, getMediaConstraints, getMediaSettings, getOptimalBitrate, getPeerConnectionIndex, getStats, getStream, getStream2, getUpdatedDevices, getUpdatedStats, getUserMedia, hasGetDisplayMedia, ipRegex, isMobile, isRelayed, maybeRejectNoH264, maybeTurnOnly, modifyMediaCapabilities, removePeerConnection, replaceSSRCs, replaceTracksInStream, _default as rtcManagerEvents, rtcStats, setClientProvider, setCodecPreferenceSDP, setPeerConnectionsForTests, setVideoBandwidthUsingSetParameters, standardDeviation, startPerformanceMonitor, stopStreamTracks, subscribeIssues, subscribeStats, variance };
1393
+ export { type AddSpotlightRequest, type AudioEnableRequest, type AudioEnableRequestedEvent, type AudioEnabledEvent, BandwidthTester, type ChatMessage, type ClientKickedEvent, type ClientLeftEvent, type ClientMetadataPayload, type ClientMetadataReceivedEvent, type ClientRole, type CloudRecordingStartedEvent, type Credentials, type CustomMediaStreamTrack, EVENTS, type GetConstraintsOptions, type GetDeviceDataResult, type GetMediaConstraintsOptions, type GetStreamOptions, type GetStreamResult, type GetUpdatedDevicesResult, type IdentifyDeviceRequest, type JoinRoomRequest, KNOCK_MESSAGES, KalmanFilter, type KnockAcceptedEvent, type KnockRejectedEvent, type KnockRoomRequest, type KnockerLeftEvent, Logger, MAXIMUM_TURN_BANDWIDTH, MAXIMUM_TURN_BANDWIDTH_UNLIMITED, MEDIA_JITTER_BUFFER_TARGET, type NewClientEvent, NoDevicesError, P2pRtcManager, PROTOCOL_ERRORS, PROTOCOL_EVENTS, PROTOCOL_REQUESTS, PROTOCOL_RESPONSES, RELAY_MESSAGES, ReconnectManager, type RemoveSpotlightRequest, type RoleName, type RoomJoinedEvent, type RoomKnockedEvent, type RoomLockedEvent, type RoomSessionEndedEvent, type RtcClientConnectionStatusChangedPayload, RtcEventNames, type RtcEvents, type RtcLocalStreamTrackAddedPayload, type RtcLocalStreamTrackRemovedPayload, type RtcManager, type RtcManagerCreatedPayload, RtcManagerDispatcher, RtcStream, type RtcStreamAddedPayload, STREAM_TYPES, type ScreenshareStartedEvent, type ScreenshareStoppedEvent, type SendClientMetadataRequest, ServerSocket, Session, SfuV2Parser, type SignalClient, type SignalEvents, type SignalKnocker, type SignalRequests, type SocketConf, type SocketManager, type Spotlight, type SpotlightAddedEvent, type SpotlightRemovedEvent, type StatsMonitorOptions, type StatsMonitorState, TYPES, VegaConnection, VegaMediaQualityMonitor, VegaRtcManager, type VideoEnabledEvent, addAbsCaptureTimeExtMap, addExtMap, assert, buildDeviceList, calculateStd, captureAudioSsrcMetrics, captureCandidatePairInfoMetrics, captureCommonSsrcMetrics, captureSsrcInfo, captureVideoSsrcMetrics, changeMediaDirection, compareLocalDevices, createACFCalculator, createMicAnalyser, createWorker, deprioritizeH264, detectMicrophoneNotWorking, enumerate, filterMidExtension, filterMsidSemantic, fromLocation, generateByteString, getConstraints, getCurrentPeerConnections, getDeviceData, getDisplayMedia, getHandler, getIssuesAndMetrics, getMediaConstraints, getMediaSettings, getOptimalBitrate, getPeerConnectionIndex, getStats, getStream, getStream2, getUpdatedDevices, getUpdatedStats, getUserMedia, hasGetDisplayMedia, ipRegex, isMobile, isRelayed, maybeRejectNoH264, maybeTurnOnly, modifyMediaCapabilities, removePeerConnection, replaceSSRCs, replaceTracksInStream, _default as rtcManagerEvents, rtcStats, setClientProvider, setCodecPreferenceSDP, setPeerConnectionsForTests, setVideoBandwidthUsingSetParameters, standardDeviation, startPerformanceMonitor, stopStreamTracks, subscribeIssues, subscribeStats, variance };
package/dist/index.d.mts CHANGED
@@ -128,7 +128,7 @@ interface RtcManager {
128
128
  addNewStream(streamId: string, stream: MediaStream, isAudioEnabled: boolean, isVideoEnabled: boolean): void;
129
129
  disconnect(streamId: string, activeBreakout: boolean | null, eventClaim?: string): void;
130
130
  disconnectAll(): void;
131
- replaceTrack(oldTrack: MediaStreamTrack, newTrack: MediaStreamTrack): void;
131
+ replaceTrack(oldTrack: CustomMediaStreamTrack, newTrack: CustomMediaStreamTrack): void;
132
132
  removeStream(streamId: string, _stream: MediaStream, requestedByClientId: string | null): void;
133
133
  shouldAcceptStreamsFromBothSides?: () => boolean;
134
134
  updateStreamResolution(streamId: string, ignored: null, resolution: {
@@ -263,6 +263,9 @@ type GetDeviceDataResult = {
263
263
  kind: string;
264
264
  };
265
265
  };
266
+ interface CustomMediaStreamTrack extends MediaStreamTrack {
267
+ replacement?: boolean;
268
+ }
266
269
 
267
270
  declare function getMediaConstraints({ disableAEC, disableAGC, hd, lax, lowDataMode, preferredDeviceIds, resolution, simulcast, widescreen, }: GetMediaConstraintsOptions): any;
268
271
  declare function getConstraints({ devices, videoId, audioId, options, type }: GetConstraintsOptions): any;
@@ -327,6 +330,7 @@ declare class P2pRtcManager implements RtcManager {
327
330
  };
328
331
  _pendingActionsForConnectedPeerConnections: any[];
329
332
  _audioTrackOnEnded: () => void;
333
+ _videoTrackOnEnded: () => void;
330
334
  totalSessionsCreated: number;
331
335
  _iceServers: any;
332
336
  _sfuServer: any;
@@ -356,7 +360,7 @@ declare class P2pRtcManager implements RtcManager {
356
360
  supportsScreenShareAudio(): boolean;
357
361
  maybeRestrictRelayBandwidth(session: any): void;
358
362
  addNewStream(streamId: string, stream: MediaStream): void;
359
- replaceTrack(oldTrack: MediaStreamTrack, newTrack: MediaStreamTrack): Promise<any[]>;
363
+ replaceTrack(oldTrack: CustomMediaStreamTrack, newTrack: CustomMediaStreamTrack): Promise<any[]>;
360
364
  accept({ clientId, shouldAddLocalVideo }: {
361
365
  clientId: string;
362
366
  shouldAddLocalVideo?: boolean;
@@ -412,6 +416,8 @@ declare class P2pRtcManager implements RtcManager {
412
416
  _clearMediaServersRefresh(): void;
413
417
  _startMonitoringAudioTrack(track: any): void;
414
418
  _stopMonitoringAudioTrack(track: any): void;
419
+ _startMonitoringVideoTrack(track: CustomMediaStreamTrack): void;
420
+ _stopMonitoringVideoTrack(track: CustomMediaStreamTrack): void;
415
421
  _connect(clientId: string): Promise<any>;
416
422
  _maybeRestartIce(clientId: string, session: any): void;
417
423
  _setCodecPreferences(pc: any, vp9On: any, av1On: any, redOn: any): void;
@@ -841,6 +847,7 @@ declare const _default: {
841
847
  ICE_RESTART: string;
842
848
  MICROPHONE_NOT_WORKING: string;
843
849
  MICROPHONE_STOPPED_WORKING: string;
850
+ CAMERA_STOPPED_WORKING: string;
844
851
  NEW_PC: string;
845
852
  SFU_CONNECTION_OPEN: string;
846
853
  SFU_CONNECTION_CLOSED: string;
@@ -1090,6 +1097,7 @@ declare class VegaRtcManager implements RtcManager {
1090
1097
  _colocation: any;
1091
1098
  _stopCameraTimeout: any;
1092
1099
  _audioTrackOnEnded: any;
1100
+ _videoTrackOnEnded: any;
1093
1101
  _socketListenerDeregisterFunctions: any;
1094
1102
  _reconnect: any;
1095
1103
  _reconnectTimeOut: any;
@@ -1150,7 +1158,7 @@ declare class VegaRtcManager implements RtcManager {
1150
1158
  setRemoteScreenshareVideoTrackIds(): void;
1151
1159
  setRoomSessionId(roomSessionId: string): void;
1152
1160
  disconnect(clientIdOrStreamId: string, _activeBreakout: any, eventClaim?: string): void;
1153
- replaceTrack(oldTrack: MediaStreamTrack | null, track: MediaStreamTrack): void;
1161
+ replaceTrack(oldTrack: CustomMediaStreamTrack | null, track: CustomMediaStreamTrack): void;
1154
1162
  removeStream(streamId: string, _stream: MediaStream, requestedByClientId: string): void;
1155
1163
  _onMicAnalyserScoreUpdated(data: any): void;
1156
1164
  addNewStream(streamId: string, stream: MediaStream, audioPaused: boolean, videoPaused: boolean): void;
@@ -1178,6 +1186,8 @@ declare class VegaRtcManager implements RtcManager {
1178
1186
  rtcStatsReconnect(): void;
1179
1187
  _startMonitoringAudioTrack(track: MediaStreamTrack): void;
1180
1188
  _stopMonitoringAudioTrack(track: MediaStreamTrack): void;
1189
+ _startMonitoringVideoTrack(track: CustomMediaStreamTrack): void;
1190
+ _stopMonitoringVideoTrack(track: CustomMediaStreamTrack): void;
1181
1191
  _onMessage(message: any): Promise<void>;
1182
1192
  _onConsumerReady(options: any): Promise<void>;
1183
1193
  _onConsumerClosed({ consumerId, reason }: {
@@ -1380,4 +1390,4 @@ declare class RtcStream {
1380
1390
  static getTypeFromId(id: string): string;
1381
1391
  }
1382
1392
 
1383
- export { type AddSpotlightRequest, type AudioEnableRequest, type AudioEnableRequestedEvent, type AudioEnabledEvent, BandwidthTester, type ChatMessage, type ClientKickedEvent, type ClientLeftEvent, type ClientMetadataPayload, type ClientMetadataReceivedEvent, type ClientRole, type CloudRecordingStartedEvent, type Credentials, EVENTS, type GetConstraintsOptions, type GetDeviceDataResult, type GetMediaConstraintsOptions, type GetStreamOptions, type GetStreamResult, type GetUpdatedDevicesResult, type IdentifyDeviceRequest, type JoinRoomRequest, KNOCK_MESSAGES, KalmanFilter, type KnockAcceptedEvent, type KnockRejectedEvent, type KnockRoomRequest, type KnockerLeftEvent, Logger, MAXIMUM_TURN_BANDWIDTH, MAXIMUM_TURN_BANDWIDTH_UNLIMITED, MEDIA_JITTER_BUFFER_TARGET, type NewClientEvent, NoDevicesError, P2pRtcManager, PROTOCOL_ERRORS, PROTOCOL_EVENTS, PROTOCOL_REQUESTS, PROTOCOL_RESPONSES, RELAY_MESSAGES, ReconnectManager, type RemoveSpotlightRequest, type RoleName, type RoomJoinedEvent, type RoomKnockedEvent, type RoomLockedEvent, type RoomSessionEndedEvent, type RtcClientConnectionStatusChangedPayload, RtcEventNames, type RtcEvents, type RtcLocalStreamTrackAddedPayload, type RtcLocalStreamTrackRemovedPayload, type RtcManager, type RtcManagerCreatedPayload, RtcManagerDispatcher, RtcStream, type RtcStreamAddedPayload, STREAM_TYPES, type ScreenshareStartedEvent, type ScreenshareStoppedEvent, type SendClientMetadataRequest, ServerSocket, Session, SfuV2Parser, type SignalClient, type SignalEvents, type SignalKnocker, type SignalRequests, type SocketConf, type SocketManager, type Spotlight, type SpotlightAddedEvent, type SpotlightRemovedEvent, type StatsMonitorOptions, type StatsMonitorState, TYPES, VegaConnection, VegaMediaQualityMonitor, VegaRtcManager, type VideoEnabledEvent, addAbsCaptureTimeExtMap, addExtMap, assert, buildDeviceList, calculateStd, captureAudioSsrcMetrics, captureCandidatePairInfoMetrics, captureCommonSsrcMetrics, captureSsrcInfo, captureVideoSsrcMetrics, changeMediaDirection, compareLocalDevices, createACFCalculator, createMicAnalyser, createWorker, deprioritizeH264, detectMicrophoneNotWorking, enumerate, filterMidExtension, filterMsidSemantic, fromLocation, generateByteString, getConstraints, getCurrentPeerConnections, getDeviceData, getDisplayMedia, getHandler, getIssuesAndMetrics, getMediaConstraints, getMediaSettings, getOptimalBitrate, getPeerConnectionIndex, getStats, getStream, getStream2, getUpdatedDevices, getUpdatedStats, getUserMedia, hasGetDisplayMedia, ipRegex, isMobile, isRelayed, maybeRejectNoH264, maybeTurnOnly, modifyMediaCapabilities, removePeerConnection, replaceSSRCs, replaceTracksInStream, _default as rtcManagerEvents, rtcStats, setClientProvider, setCodecPreferenceSDP, setPeerConnectionsForTests, setVideoBandwidthUsingSetParameters, standardDeviation, startPerformanceMonitor, stopStreamTracks, subscribeIssues, subscribeStats, variance };
1393
+ export { type AddSpotlightRequest, type AudioEnableRequest, type AudioEnableRequestedEvent, type AudioEnabledEvent, BandwidthTester, type ChatMessage, type ClientKickedEvent, type ClientLeftEvent, type ClientMetadataPayload, type ClientMetadataReceivedEvent, type ClientRole, type CloudRecordingStartedEvent, type Credentials, type CustomMediaStreamTrack, EVENTS, type GetConstraintsOptions, type GetDeviceDataResult, type GetMediaConstraintsOptions, type GetStreamOptions, type GetStreamResult, type GetUpdatedDevicesResult, type IdentifyDeviceRequest, type JoinRoomRequest, KNOCK_MESSAGES, KalmanFilter, type KnockAcceptedEvent, type KnockRejectedEvent, type KnockRoomRequest, type KnockerLeftEvent, Logger, MAXIMUM_TURN_BANDWIDTH, MAXIMUM_TURN_BANDWIDTH_UNLIMITED, MEDIA_JITTER_BUFFER_TARGET, type NewClientEvent, NoDevicesError, P2pRtcManager, PROTOCOL_ERRORS, PROTOCOL_EVENTS, PROTOCOL_REQUESTS, PROTOCOL_RESPONSES, RELAY_MESSAGES, ReconnectManager, type RemoveSpotlightRequest, type RoleName, type RoomJoinedEvent, type RoomKnockedEvent, type RoomLockedEvent, type RoomSessionEndedEvent, type RtcClientConnectionStatusChangedPayload, RtcEventNames, type RtcEvents, type RtcLocalStreamTrackAddedPayload, type RtcLocalStreamTrackRemovedPayload, type RtcManager, type RtcManagerCreatedPayload, RtcManagerDispatcher, RtcStream, type RtcStreamAddedPayload, STREAM_TYPES, type ScreenshareStartedEvent, type ScreenshareStoppedEvent, type SendClientMetadataRequest, ServerSocket, Session, SfuV2Parser, type SignalClient, type SignalEvents, type SignalKnocker, type SignalRequests, type SocketConf, type SocketManager, type Spotlight, type SpotlightAddedEvent, type SpotlightRemovedEvent, type StatsMonitorOptions, type StatsMonitorState, TYPES, VegaConnection, VegaMediaQualityMonitor, VegaRtcManager, type VideoEnabledEvent, addAbsCaptureTimeExtMap, addExtMap, assert, buildDeviceList, calculateStd, captureAudioSsrcMetrics, captureCandidatePairInfoMetrics, captureCommonSsrcMetrics, captureSsrcInfo, captureVideoSsrcMetrics, changeMediaDirection, compareLocalDevices, createACFCalculator, createMicAnalyser, createWorker, deprioritizeH264, detectMicrophoneNotWorking, enumerate, filterMidExtension, filterMsidSemantic, fromLocation, generateByteString, getConstraints, getCurrentPeerConnections, getDeviceData, getDisplayMedia, getHandler, getIssuesAndMetrics, getMediaConstraints, getMediaSettings, getOptimalBitrate, getPeerConnectionIndex, getStats, getStream, getStream2, getUpdatedDevices, getUpdatedStats, getUserMedia, hasGetDisplayMedia, ipRegex, isMobile, isRelayed, maybeRejectNoH264, maybeTurnOnly, modifyMediaCapabilities, removePeerConnection, replaceSSRCs, replaceTracksInStream, _default as rtcManagerEvents, rtcStats, setClientProvider, setCodecPreferenceSDP, setPeerConnectionsForTests, setVideoBandwidthUsingSetParameters, standardDeviation, startPerformanceMonitor, stopStreamTracks, subscribeIssues, subscribeStats, variance };
package/dist/index.d.ts CHANGED
@@ -128,7 +128,7 @@ interface RtcManager {
128
128
  addNewStream(streamId: string, stream: MediaStream, isAudioEnabled: boolean, isVideoEnabled: boolean): void;
129
129
  disconnect(streamId: string, activeBreakout: boolean | null, eventClaim?: string): void;
130
130
  disconnectAll(): void;
131
- replaceTrack(oldTrack: MediaStreamTrack, newTrack: MediaStreamTrack): void;
131
+ replaceTrack(oldTrack: CustomMediaStreamTrack, newTrack: CustomMediaStreamTrack): void;
132
132
  removeStream(streamId: string, _stream: MediaStream, requestedByClientId: string | null): void;
133
133
  shouldAcceptStreamsFromBothSides?: () => boolean;
134
134
  updateStreamResolution(streamId: string, ignored: null, resolution: {
@@ -263,6 +263,9 @@ type GetDeviceDataResult = {
263
263
  kind: string;
264
264
  };
265
265
  };
266
+ interface CustomMediaStreamTrack extends MediaStreamTrack {
267
+ replacement?: boolean;
268
+ }
266
269
 
267
270
  declare function getMediaConstraints({ disableAEC, disableAGC, hd, lax, lowDataMode, preferredDeviceIds, resolution, simulcast, widescreen, }: GetMediaConstraintsOptions): any;
268
271
  declare function getConstraints({ devices, videoId, audioId, options, type }: GetConstraintsOptions): any;
@@ -327,6 +330,7 @@ declare class P2pRtcManager implements RtcManager {
327
330
  };
328
331
  _pendingActionsForConnectedPeerConnections: any[];
329
332
  _audioTrackOnEnded: () => void;
333
+ _videoTrackOnEnded: () => void;
330
334
  totalSessionsCreated: number;
331
335
  _iceServers: any;
332
336
  _sfuServer: any;
@@ -356,7 +360,7 @@ declare class P2pRtcManager implements RtcManager {
356
360
  supportsScreenShareAudio(): boolean;
357
361
  maybeRestrictRelayBandwidth(session: any): void;
358
362
  addNewStream(streamId: string, stream: MediaStream): void;
359
- replaceTrack(oldTrack: MediaStreamTrack, newTrack: MediaStreamTrack): Promise<any[]>;
363
+ replaceTrack(oldTrack: CustomMediaStreamTrack, newTrack: CustomMediaStreamTrack): Promise<any[]>;
360
364
  accept({ clientId, shouldAddLocalVideo }: {
361
365
  clientId: string;
362
366
  shouldAddLocalVideo?: boolean;
@@ -412,6 +416,8 @@ declare class P2pRtcManager implements RtcManager {
412
416
  _clearMediaServersRefresh(): void;
413
417
  _startMonitoringAudioTrack(track: any): void;
414
418
  _stopMonitoringAudioTrack(track: any): void;
419
+ _startMonitoringVideoTrack(track: CustomMediaStreamTrack): void;
420
+ _stopMonitoringVideoTrack(track: CustomMediaStreamTrack): void;
415
421
  _connect(clientId: string): Promise<any>;
416
422
  _maybeRestartIce(clientId: string, session: any): void;
417
423
  _setCodecPreferences(pc: any, vp9On: any, av1On: any, redOn: any): void;
@@ -841,6 +847,7 @@ declare const _default: {
841
847
  ICE_RESTART: string;
842
848
  MICROPHONE_NOT_WORKING: string;
843
849
  MICROPHONE_STOPPED_WORKING: string;
850
+ CAMERA_STOPPED_WORKING: string;
844
851
  NEW_PC: string;
845
852
  SFU_CONNECTION_OPEN: string;
846
853
  SFU_CONNECTION_CLOSED: string;
@@ -1090,6 +1097,7 @@ declare class VegaRtcManager implements RtcManager {
1090
1097
  _colocation: any;
1091
1098
  _stopCameraTimeout: any;
1092
1099
  _audioTrackOnEnded: any;
1100
+ _videoTrackOnEnded: any;
1093
1101
  _socketListenerDeregisterFunctions: any;
1094
1102
  _reconnect: any;
1095
1103
  _reconnectTimeOut: any;
@@ -1150,7 +1158,7 @@ declare class VegaRtcManager implements RtcManager {
1150
1158
  setRemoteScreenshareVideoTrackIds(): void;
1151
1159
  setRoomSessionId(roomSessionId: string): void;
1152
1160
  disconnect(clientIdOrStreamId: string, _activeBreakout: any, eventClaim?: string): void;
1153
- replaceTrack(oldTrack: MediaStreamTrack | null, track: MediaStreamTrack): void;
1161
+ replaceTrack(oldTrack: CustomMediaStreamTrack | null, track: CustomMediaStreamTrack): void;
1154
1162
  removeStream(streamId: string, _stream: MediaStream, requestedByClientId: string): void;
1155
1163
  _onMicAnalyserScoreUpdated(data: any): void;
1156
1164
  addNewStream(streamId: string, stream: MediaStream, audioPaused: boolean, videoPaused: boolean): void;
@@ -1178,6 +1186,8 @@ declare class VegaRtcManager implements RtcManager {
1178
1186
  rtcStatsReconnect(): void;
1179
1187
  _startMonitoringAudioTrack(track: MediaStreamTrack): void;
1180
1188
  _stopMonitoringAudioTrack(track: MediaStreamTrack): void;
1189
+ _startMonitoringVideoTrack(track: CustomMediaStreamTrack): void;
1190
+ _stopMonitoringVideoTrack(track: CustomMediaStreamTrack): void;
1181
1191
  _onMessage(message: any): Promise<void>;
1182
1192
  _onConsumerReady(options: any): Promise<void>;
1183
1193
  _onConsumerClosed({ consumerId, reason }: {
@@ -1380,4 +1390,4 @@ declare class RtcStream {
1380
1390
  static getTypeFromId(id: string): string;
1381
1391
  }
1382
1392
 
1383
- export { type AddSpotlightRequest, type AudioEnableRequest, type AudioEnableRequestedEvent, type AudioEnabledEvent, BandwidthTester, type ChatMessage, type ClientKickedEvent, type ClientLeftEvent, type ClientMetadataPayload, type ClientMetadataReceivedEvent, type ClientRole, type CloudRecordingStartedEvent, type Credentials, EVENTS, type GetConstraintsOptions, type GetDeviceDataResult, type GetMediaConstraintsOptions, type GetStreamOptions, type GetStreamResult, type GetUpdatedDevicesResult, type IdentifyDeviceRequest, type JoinRoomRequest, KNOCK_MESSAGES, KalmanFilter, type KnockAcceptedEvent, type KnockRejectedEvent, type KnockRoomRequest, type KnockerLeftEvent, Logger, MAXIMUM_TURN_BANDWIDTH, MAXIMUM_TURN_BANDWIDTH_UNLIMITED, MEDIA_JITTER_BUFFER_TARGET, type NewClientEvent, NoDevicesError, P2pRtcManager, PROTOCOL_ERRORS, PROTOCOL_EVENTS, PROTOCOL_REQUESTS, PROTOCOL_RESPONSES, RELAY_MESSAGES, ReconnectManager, type RemoveSpotlightRequest, type RoleName, type RoomJoinedEvent, type RoomKnockedEvent, type RoomLockedEvent, type RoomSessionEndedEvent, type RtcClientConnectionStatusChangedPayload, RtcEventNames, type RtcEvents, type RtcLocalStreamTrackAddedPayload, type RtcLocalStreamTrackRemovedPayload, type RtcManager, type RtcManagerCreatedPayload, RtcManagerDispatcher, RtcStream, type RtcStreamAddedPayload, STREAM_TYPES, type ScreenshareStartedEvent, type ScreenshareStoppedEvent, type SendClientMetadataRequest, ServerSocket, Session, SfuV2Parser, type SignalClient, type SignalEvents, type SignalKnocker, type SignalRequests, type SocketConf, type SocketManager, type Spotlight, type SpotlightAddedEvent, type SpotlightRemovedEvent, type StatsMonitorOptions, type StatsMonitorState, TYPES, VegaConnection, VegaMediaQualityMonitor, VegaRtcManager, type VideoEnabledEvent, addAbsCaptureTimeExtMap, addExtMap, assert, buildDeviceList, calculateStd, captureAudioSsrcMetrics, captureCandidatePairInfoMetrics, captureCommonSsrcMetrics, captureSsrcInfo, captureVideoSsrcMetrics, changeMediaDirection, compareLocalDevices, createACFCalculator, createMicAnalyser, createWorker, deprioritizeH264, detectMicrophoneNotWorking, enumerate, filterMidExtension, filterMsidSemantic, fromLocation, generateByteString, getConstraints, getCurrentPeerConnections, getDeviceData, getDisplayMedia, getHandler, getIssuesAndMetrics, getMediaConstraints, getMediaSettings, getOptimalBitrate, getPeerConnectionIndex, getStats, getStream, getStream2, getUpdatedDevices, getUpdatedStats, getUserMedia, hasGetDisplayMedia, ipRegex, isMobile, isRelayed, maybeRejectNoH264, maybeTurnOnly, modifyMediaCapabilities, removePeerConnection, replaceSSRCs, replaceTracksInStream, _default as rtcManagerEvents, rtcStats, setClientProvider, setCodecPreferenceSDP, setPeerConnectionsForTests, setVideoBandwidthUsingSetParameters, standardDeviation, startPerformanceMonitor, stopStreamTracks, subscribeIssues, subscribeStats, variance };
1393
+ export { type AddSpotlightRequest, type AudioEnableRequest, type AudioEnableRequestedEvent, type AudioEnabledEvent, BandwidthTester, type ChatMessage, type ClientKickedEvent, type ClientLeftEvent, type ClientMetadataPayload, type ClientMetadataReceivedEvent, type ClientRole, type CloudRecordingStartedEvent, type Credentials, type CustomMediaStreamTrack, EVENTS, type GetConstraintsOptions, type GetDeviceDataResult, type GetMediaConstraintsOptions, type GetStreamOptions, type GetStreamResult, type GetUpdatedDevicesResult, type IdentifyDeviceRequest, type JoinRoomRequest, KNOCK_MESSAGES, KalmanFilter, type KnockAcceptedEvent, type KnockRejectedEvent, type KnockRoomRequest, type KnockerLeftEvent, Logger, MAXIMUM_TURN_BANDWIDTH, MAXIMUM_TURN_BANDWIDTH_UNLIMITED, MEDIA_JITTER_BUFFER_TARGET, type NewClientEvent, NoDevicesError, P2pRtcManager, PROTOCOL_ERRORS, PROTOCOL_EVENTS, PROTOCOL_REQUESTS, PROTOCOL_RESPONSES, RELAY_MESSAGES, ReconnectManager, type RemoveSpotlightRequest, type RoleName, type RoomJoinedEvent, type RoomKnockedEvent, type RoomLockedEvent, type RoomSessionEndedEvent, type RtcClientConnectionStatusChangedPayload, RtcEventNames, type RtcEvents, type RtcLocalStreamTrackAddedPayload, type RtcLocalStreamTrackRemovedPayload, type RtcManager, type RtcManagerCreatedPayload, RtcManagerDispatcher, RtcStream, type RtcStreamAddedPayload, STREAM_TYPES, type ScreenshareStartedEvent, type ScreenshareStoppedEvent, type SendClientMetadataRequest, ServerSocket, Session, SfuV2Parser, type SignalClient, type SignalEvents, type SignalKnocker, type SignalRequests, type SocketConf, type SocketManager, type Spotlight, type SpotlightAddedEvent, type SpotlightRemovedEvent, type StatsMonitorOptions, type StatsMonitorState, TYPES, VegaConnection, VegaMediaQualityMonitor, VegaRtcManager, type VideoEnabledEvent, addAbsCaptureTimeExtMap, addExtMap, assert, buildDeviceList, calculateStd, captureAudioSsrcMetrics, captureCandidatePairInfoMetrics, captureCommonSsrcMetrics, captureSsrcInfo, captureVideoSsrcMetrics, changeMediaDirection, compareLocalDevices, createACFCalculator, createMicAnalyser, createWorker, deprioritizeH264, detectMicrophoneNotWorking, enumerate, filterMidExtension, filterMsidSemantic, fromLocation, generateByteString, getConstraints, getCurrentPeerConnections, getDeviceData, getDisplayMedia, getHandler, getIssuesAndMetrics, getMediaConstraints, getMediaSettings, getOptimalBitrate, getPeerConnectionIndex, getStats, getStream, getStream2, getUpdatedDevices, getUpdatedStats, getUserMedia, hasGetDisplayMedia, ipRegex, isMobile, isRelayed, maybeRejectNoH264, maybeTurnOnly, modifyMediaCapabilities, removePeerConnection, replaceSSRCs, replaceTracksInStream, _default as rtcManagerEvents, rtcStats, setClientProvider, setCodecPreferenceSDP, setPeerConnectionsForTests, setVideoBandwidthUsingSetParameters, standardDeviation, startPerformanceMonitor, stopStreamTracks, subscribeIssues, subscribeStats, variance };
package/dist/index.mjs CHANGED
@@ -3457,6 +3457,7 @@ var rtcManagerEvents = {
3457
3457
  ICE_RESTART: "ice_restart",
3458
3458
  MICROPHONE_NOT_WORKING: "microphone_not_working",
3459
3459
  MICROPHONE_STOPPED_WORKING: "microphone_stopped_working",
3460
+ CAMERA_STOPPED_WORKING: "camera_stopped_working",
3460
3461
  NEW_PC: "new_pc",
3461
3462
  SFU_CONNECTION_OPEN: "sfu_connection_open",
3462
3463
  SFU_CONNECTION_CLOSED: "sfu_connection_closed",
@@ -3503,6 +3504,10 @@ class P2pRtcManager {
3503
3504
  rtcStats.sendEvent("audio_ended", { unloading: unloading$1 });
3504
3505
  this._emit(rtcManagerEvents.MICROPHONE_STOPPED_WORKING, {});
3505
3506
  };
3507
+ this._videoTrackOnEnded = () => {
3508
+ rtcStats.sendEvent("video_ended", { unloading: unloading$1 });
3509
+ this._emit(rtcManagerEvents.CAMERA_STOPPED_WORKING, {});
3510
+ };
3506
3511
  this._updateAndScheduleMediaServersRefresh({
3507
3512
  sfuServer,
3508
3513
  iceServers: iceServers.iceServers || [],
@@ -3530,9 +3535,13 @@ class P2pRtcManager {
3530
3535
  if (streamId === CAMERA_STREAM_ID) {
3531
3536
  this._addStreamToPeerConnections(stream);
3532
3537
  const [audioTrack] = stream.getAudioTracks();
3538
+ const videoTrack = stream.getVideoTracks()[0];
3533
3539
  if (audioTrack) {
3534
3540
  this._startMonitoringAudioTrack(audioTrack);
3535
3541
  }
3542
+ if (videoTrack && !videoTrack.replacement) {
3543
+ this._startMonitoringVideoTrack(videoTrack);
3544
+ }
3536
3545
  if (this._localStreamDeregisterFunction) {
3537
3546
  this._localStreamDeregisterFunction();
3538
3547
  this._localStreamDeregisterFunction = null;
@@ -3555,9 +3564,15 @@ class P2pRtcManager {
3555
3564
  if (oldTrack && oldTrack.kind === "audio") {
3556
3565
  this._stopMonitoringAudioTrack(oldTrack);
3557
3566
  }
3567
+ if (oldTrack && oldTrack.kind === "video" && !newTrack.replacement) {
3568
+ this._stopMonitoringVideoTrack(oldTrack);
3569
+ }
3558
3570
  if (newTrack && newTrack.kind === "audio") {
3559
3571
  this._startMonitoringAudioTrack(newTrack);
3560
3572
  }
3573
+ if (newTrack.kind === "video" && !newTrack.replacement) {
3574
+ this._startMonitoringVideoTrack(newTrack);
3575
+ }
3561
3576
  return this._replaceTrackToPeerConnections(oldTrack, newTrack);
3562
3577
  }
3563
3578
  accept({ clientId, shouldAddLocalVideo }) {
@@ -4076,6 +4091,12 @@ class P2pRtcManager {
4076
4091
  _stopMonitoringAudioTrack(track) {
4077
4092
  track.removeEventListener("ended", this._audioTrackOnEnded);
4078
4093
  }
4094
+ _startMonitoringVideoTrack(track) {
4095
+ track.addEventListener("ended", this._videoTrackOnEnded);
4096
+ }
4097
+ _stopMonitoringVideoTrack(track) {
4098
+ track.removeEventListener("ended", this._videoTrackOnEnded);
4099
+ }
4079
4100
  _connect(clientId) {
4080
4101
  this.rtcStatsReconnect();
4081
4102
  const shouldAddLocalVideo = true;
@@ -4429,10 +4450,12 @@ class P2pRtcManager {
4429
4450
  }
4430
4451
  }
4431
4452
  stopOrResumeVideo(localStream, enable) {
4453
+ var _a;
4432
4454
  if (!["chrome", "safari"].includes(browserName$1)) {
4433
4455
  return;
4434
4456
  }
4435
4457
  if (enable === false) {
4458
+ const stopCameraDelay = ((_a = localStream.getVideoTracks().find((t) => !t.enabled)) === null || _a === void 0 ? void 0 : _a.readyState) === "ended" ? 0 : 5000;
4436
4459
  setTimeout(() => {
4437
4460
  localStream.getVideoTracks().forEach((track) => {
4438
4461
  if (track.enabled === false) {
@@ -4445,7 +4468,7 @@ class P2pRtcManager {
4445
4468
  this._handleStopOrResumeVideo({ enable, track });
4446
4469
  }
4447
4470
  });
4448
- }, 5000);
4471
+ }, stopCameraDelay);
4449
4472
  }
4450
4473
  else {
4451
4474
  if (localStream.getVideoTracks().length === 0) {
@@ -4456,6 +4479,7 @@ class P2pRtcManager {
4456
4479
  navigator.mediaDevices.getUserMedia({ video: constraints }).then((stream) => {
4457
4480
  const track = stream.getVideoTracks()[0];
4458
4481
  localStream.addTrack(track);
4482
+ this._startMonitoringVideoTrack(track);
4459
4483
  this._emit(EVENTS.LOCAL_STREAM_TRACK_ADDED, {
4460
4484
  streamId: localStream.id,
4461
4485
  tracks: [track],
@@ -4969,6 +4993,10 @@ class VegaRtcManager {
4969
4993
  rtcStats.sendEvent("audio_ended", { unloading });
4970
4994
  this._emitToPWA(rtcManagerEvents.MICROPHONE_STOPPED_WORKING, {});
4971
4995
  };
4996
+ this._videoTrackOnEnded = () => {
4997
+ rtcStats.sendEvent("video_ended", { unloading });
4998
+ this._emitToPWA(rtcManagerEvents.CAMERA_STOPPED_WORKING, {});
4999
+ };
4972
5000
  this._updateAndScheduleMediaServersRefresh({
4973
5001
  sfuServer,
4974
5002
  iceServers: iceServers.iceServers || [],
@@ -5679,12 +5707,18 @@ class VegaRtcManager {
5679
5707
  if (oldTrack && oldTrack.kind === "audio") {
5680
5708
  this._stopMonitoringAudioTrack(oldTrack);
5681
5709
  }
5710
+ if (oldTrack && oldTrack.kind === "video" && !track.replacement) {
5711
+ this._stopMonitoringVideoTrack(oldTrack);
5712
+ }
5682
5713
  if (track.kind === "audio") {
5683
5714
  this._startMonitoringAudioTrack(track);
5684
5715
  this._micTrack = track;
5685
5716
  this._replaceMicTrack();
5686
5717
  }
5687
5718
  if (track.kind === "video") {
5719
+ if (!track.replacement) {
5720
+ this._startMonitoringVideoTrack(track);
5721
+ }
5688
5722
  this._webcamTrack = track;
5689
5723
  this._replaceWebcamTrack();
5690
5724
  }
@@ -5713,8 +5747,12 @@ class VegaRtcManager {
5713
5747
  this._webcamPaused = videoPaused;
5714
5748
  const videoTrack = stream.getVideoTracks()[0];
5715
5749
  const audioTrack = stream.getAudioTracks()[0];
5716
- if (videoTrack)
5750
+ if (videoTrack) {
5717
5751
  this._sendWebcam(videoTrack);
5752
+ if (!videoTrack.replacement) {
5753
+ this._startMonitoringVideoTrack(videoTrack);
5754
+ }
5755
+ }
5718
5756
  if (audioTrack) {
5719
5757
  this._sendMic(audioTrack);
5720
5758
  this._syncMicAnalyser();
@@ -5777,6 +5815,7 @@ class VegaRtcManager {
5777
5815
  }
5778
5816
  }
5779
5817
  stopOrResumeVideo(localStream, enable) {
5818
+ var _a;
5780
5819
  logger$1.info("stopOrResumeVideo() [enable:%s]", enable);
5781
5820
  this._webcamPaused = !enable;
5782
5821
  this._pauseResumeWebcam();
@@ -5785,6 +5824,7 @@ class VegaRtcManager {
5785
5824
  }
5786
5825
  if (!enable) {
5787
5826
  clearTimeout(this._stopCameraTimeout);
5827
+ const stopCameraDelay = ((_a = localStream.getVideoTracks().find((t) => !t.enabled)) === null || _a === void 0 ? void 0 : _a.readyState) === "ended" ? 0 : 5000;
5788
5828
  this._stopCameraTimeout = setTimeout(() => {
5789
5829
  localStream.getVideoTracks().forEach((track) => {
5790
5830
  if (track.enabled === false) {
@@ -5797,13 +5837,14 @@ class VegaRtcManager {
5797
5837
  this._handleStopOrResumeVideo({ enable, track });
5798
5838
  }
5799
5839
  });
5800
- }, 5000);
5840
+ }, stopCameraDelay);
5801
5841
  }
5802
5842
  else if (localStream.getVideoTracks().length === 0) {
5803
5843
  const constraints = this._webrtcProvider.getMediaConstraints().video;
5804
5844
  navigator.mediaDevices.getUserMedia({ video: constraints }).then((stream) => {
5805
5845
  const track = stream.getVideoTracks()[0];
5806
5846
  localStream.addTrack(track);
5847
+ this._startMonitoringVideoTrack(track);
5807
5848
  this._emitToPWA(EVENTS.LOCAL_STREAM_TRACK_ADDED, {
5808
5849
  streamId: localStream.id,
5809
5850
  tracks: [track],
@@ -5904,6 +5945,12 @@ class VegaRtcManager {
5904
5945
  _stopMonitoringAudioTrack(track) {
5905
5946
  track.removeEventListener("ended", this._audioTrackOnEnded);
5906
5947
  }
5948
+ _startMonitoringVideoTrack(track) {
5949
+ track.addEventListener("ended", this._videoTrackOnEnded);
5950
+ }
5951
+ _stopMonitoringVideoTrack(track) {
5952
+ track.removeEventListener("ended", this._videoTrackOnEnded);
5953
+ }
5907
5954
  _onMessage(message) {
5908
5955
  return __awaiter(this, void 0, void 0, function* () {
5909
5956
  const { method, data } = message;
@@ -3457,6 +3457,7 @@ var rtcManagerEvents = {
3457
3457
  ICE_RESTART: "ice_restart",
3458
3458
  MICROPHONE_NOT_WORKING: "microphone_not_working",
3459
3459
  MICROPHONE_STOPPED_WORKING: "microphone_stopped_working",
3460
+ CAMERA_STOPPED_WORKING: "camera_stopped_working",
3460
3461
  NEW_PC: "new_pc",
3461
3462
  SFU_CONNECTION_OPEN: "sfu_connection_open",
3462
3463
  SFU_CONNECTION_CLOSED: "sfu_connection_closed",
@@ -3503,6 +3504,10 @@ class P2pRtcManager {
3503
3504
  rtcStats.sendEvent("audio_ended", { unloading: unloading$1 });
3504
3505
  this._emit(rtcManagerEvents.MICROPHONE_STOPPED_WORKING, {});
3505
3506
  };
3507
+ this._videoTrackOnEnded = () => {
3508
+ rtcStats.sendEvent("video_ended", { unloading: unloading$1 });
3509
+ this._emit(rtcManagerEvents.CAMERA_STOPPED_WORKING, {});
3510
+ };
3506
3511
  this._updateAndScheduleMediaServersRefresh({
3507
3512
  sfuServer,
3508
3513
  iceServers: iceServers.iceServers || [],
@@ -3530,9 +3535,13 @@ class P2pRtcManager {
3530
3535
  if (streamId === CAMERA_STREAM_ID) {
3531
3536
  this._addStreamToPeerConnections(stream);
3532
3537
  const [audioTrack] = stream.getAudioTracks();
3538
+ const videoTrack = stream.getVideoTracks()[0];
3533
3539
  if (audioTrack) {
3534
3540
  this._startMonitoringAudioTrack(audioTrack);
3535
3541
  }
3542
+ if (videoTrack && !videoTrack.replacement) {
3543
+ this._startMonitoringVideoTrack(videoTrack);
3544
+ }
3536
3545
  if (this._localStreamDeregisterFunction) {
3537
3546
  this._localStreamDeregisterFunction();
3538
3547
  this._localStreamDeregisterFunction = null;
@@ -3555,9 +3564,15 @@ class P2pRtcManager {
3555
3564
  if (oldTrack && oldTrack.kind === "audio") {
3556
3565
  this._stopMonitoringAudioTrack(oldTrack);
3557
3566
  }
3567
+ if (oldTrack && oldTrack.kind === "video" && !newTrack.replacement) {
3568
+ this._stopMonitoringVideoTrack(oldTrack);
3569
+ }
3558
3570
  if (newTrack && newTrack.kind === "audio") {
3559
3571
  this._startMonitoringAudioTrack(newTrack);
3560
3572
  }
3573
+ if (newTrack.kind === "video" && !newTrack.replacement) {
3574
+ this._startMonitoringVideoTrack(newTrack);
3575
+ }
3561
3576
  return this._replaceTrackToPeerConnections(oldTrack, newTrack);
3562
3577
  }
3563
3578
  accept({ clientId, shouldAddLocalVideo }) {
@@ -4076,6 +4091,12 @@ class P2pRtcManager {
4076
4091
  _stopMonitoringAudioTrack(track) {
4077
4092
  track.removeEventListener("ended", this._audioTrackOnEnded);
4078
4093
  }
4094
+ _startMonitoringVideoTrack(track) {
4095
+ track.addEventListener("ended", this._videoTrackOnEnded);
4096
+ }
4097
+ _stopMonitoringVideoTrack(track) {
4098
+ track.removeEventListener("ended", this._videoTrackOnEnded);
4099
+ }
4079
4100
  _connect(clientId) {
4080
4101
  this.rtcStatsReconnect();
4081
4102
  const shouldAddLocalVideo = true;
@@ -4429,10 +4450,12 @@ class P2pRtcManager {
4429
4450
  }
4430
4451
  }
4431
4452
  stopOrResumeVideo(localStream, enable) {
4453
+ var _a;
4432
4454
  if (!["chrome", "safari"].includes(browserName$1)) {
4433
4455
  return;
4434
4456
  }
4435
4457
  if (enable === false) {
4458
+ const stopCameraDelay = ((_a = localStream.getVideoTracks().find((t) => !t.enabled)) === null || _a === void 0 ? void 0 : _a.readyState) === "ended" ? 0 : 5000;
4436
4459
  setTimeout(() => {
4437
4460
  localStream.getVideoTracks().forEach((track) => {
4438
4461
  if (track.enabled === false) {
@@ -4445,7 +4468,7 @@ class P2pRtcManager {
4445
4468
  this._handleStopOrResumeVideo({ enable, track });
4446
4469
  }
4447
4470
  });
4448
- }, 5000);
4471
+ }, stopCameraDelay);
4449
4472
  }
4450
4473
  else {
4451
4474
  if (localStream.getVideoTracks().length === 0) {
@@ -4456,6 +4479,7 @@ class P2pRtcManager {
4456
4479
  navigator.mediaDevices.getUserMedia({ video: constraints }).then((stream) => {
4457
4480
  const track = stream.getVideoTracks()[0];
4458
4481
  localStream.addTrack(track);
4482
+ this._startMonitoringVideoTrack(track);
4459
4483
  this._emit(EVENTS.LOCAL_STREAM_TRACK_ADDED, {
4460
4484
  streamId: localStream.id,
4461
4485
  tracks: [track],
@@ -4969,6 +4993,10 @@ class VegaRtcManager {
4969
4993
  rtcStats.sendEvent("audio_ended", { unloading });
4970
4994
  this._emitToPWA(rtcManagerEvents.MICROPHONE_STOPPED_WORKING, {});
4971
4995
  };
4996
+ this._videoTrackOnEnded = () => {
4997
+ rtcStats.sendEvent("video_ended", { unloading });
4998
+ this._emitToPWA(rtcManagerEvents.CAMERA_STOPPED_WORKING, {});
4999
+ };
4972
5000
  this._updateAndScheduleMediaServersRefresh({
4973
5001
  sfuServer,
4974
5002
  iceServers: iceServers.iceServers || [],
@@ -5679,12 +5707,18 @@ class VegaRtcManager {
5679
5707
  if (oldTrack && oldTrack.kind === "audio") {
5680
5708
  this._stopMonitoringAudioTrack(oldTrack);
5681
5709
  }
5710
+ if (oldTrack && oldTrack.kind === "video" && !track.replacement) {
5711
+ this._stopMonitoringVideoTrack(oldTrack);
5712
+ }
5682
5713
  if (track.kind === "audio") {
5683
5714
  this._startMonitoringAudioTrack(track);
5684
5715
  this._micTrack = track;
5685
5716
  this._replaceMicTrack();
5686
5717
  }
5687
5718
  if (track.kind === "video") {
5719
+ if (!track.replacement) {
5720
+ this._startMonitoringVideoTrack(track);
5721
+ }
5688
5722
  this._webcamTrack = track;
5689
5723
  this._replaceWebcamTrack();
5690
5724
  }
@@ -5713,8 +5747,12 @@ class VegaRtcManager {
5713
5747
  this._webcamPaused = videoPaused;
5714
5748
  const videoTrack = stream.getVideoTracks()[0];
5715
5749
  const audioTrack = stream.getAudioTracks()[0];
5716
- if (videoTrack)
5750
+ if (videoTrack) {
5717
5751
  this._sendWebcam(videoTrack);
5752
+ if (!videoTrack.replacement) {
5753
+ this._startMonitoringVideoTrack(videoTrack);
5754
+ }
5755
+ }
5718
5756
  if (audioTrack) {
5719
5757
  this._sendMic(audioTrack);
5720
5758
  this._syncMicAnalyser();
@@ -5777,6 +5815,7 @@ class VegaRtcManager {
5777
5815
  }
5778
5816
  }
5779
5817
  stopOrResumeVideo(localStream, enable) {
5818
+ var _a;
5780
5819
  logger$1.info("stopOrResumeVideo() [enable:%s]", enable);
5781
5820
  this._webcamPaused = !enable;
5782
5821
  this._pauseResumeWebcam();
@@ -5785,6 +5824,7 @@ class VegaRtcManager {
5785
5824
  }
5786
5825
  if (!enable) {
5787
5826
  clearTimeout(this._stopCameraTimeout);
5827
+ const stopCameraDelay = ((_a = localStream.getVideoTracks().find((t) => !t.enabled)) === null || _a === void 0 ? void 0 : _a.readyState) === "ended" ? 0 : 5000;
5788
5828
  this._stopCameraTimeout = setTimeout(() => {
5789
5829
  localStream.getVideoTracks().forEach((track) => {
5790
5830
  if (track.enabled === false) {
@@ -5797,13 +5837,14 @@ class VegaRtcManager {
5797
5837
  this._handleStopOrResumeVideo({ enable, track });
5798
5838
  }
5799
5839
  });
5800
- }, 5000);
5840
+ }, stopCameraDelay);
5801
5841
  }
5802
5842
  else if (localStream.getVideoTracks().length === 0) {
5803
5843
  const constraints = this._webrtcProvider.getMediaConstraints().video;
5804
5844
  navigator.mediaDevices.getUserMedia({ video: constraints }).then((stream) => {
5805
5845
  const track = stream.getVideoTracks()[0];
5806
5846
  localStream.addTrack(track);
5847
+ this._startMonitoringVideoTrack(track);
5807
5848
  this._emitToPWA(EVENTS.LOCAL_STREAM_TRACK_ADDED, {
5808
5849
  streamId: localStream.id,
5809
5850
  tracks: [track],
@@ -5904,6 +5945,12 @@ class VegaRtcManager {
5904
5945
  _stopMonitoringAudioTrack(track) {
5905
5946
  track.removeEventListener("ended", this._audioTrackOnEnded);
5906
5947
  }
5948
+ _startMonitoringVideoTrack(track) {
5949
+ track.addEventListener("ended", this._videoTrackOnEnded);
5950
+ }
5951
+ _stopMonitoringVideoTrack(track) {
5952
+ track.removeEventListener("ended", this._videoTrackOnEnded);
5953
+ }
5907
5954
  _onMessage(message) {
5908
5955
  return __awaiter(this, void 0, void 0, function* () {
5909
5956
  const { method, data } = message;
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.1",
4
+ "version": "1.6.2",
5
5
  "license": "MIT",
6
6
  "homepage": "https://github.com/whereby/sdk",
7
7
  "repository": {
@@ -51,7 +51,7 @@
51
51
  "check-ip": "^1.1.1",
52
52
  "events": "^3.3.0",
53
53
  "ip-address": "^9.0.5",
54
- "mediasoup-client": "3.7.3",
54
+ "mediasoup-client": "3.7.12",
55
55
  "rtcstats": "github:whereby/rtcstats#5.4.0",
56
56
  "sdp": "^3.2.0",
57
57
  "sdp-transform": "^2.14.2",