@whereby.com/media 1.10.0 → 1.11.0

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
@@ -182,8 +182,11 @@ function captureCommonSsrcMetrics(ssrcMetrics, currentSsrcStats, prevSsrcStats,
182
182
  ssrcMetrics.lossRatio = (1000 * (packetLossCountDiff / (packetLossCountDiff + packetCountDiff))) / timeDiff;
183
183
  const byteCountDiff = currentSsrcStats.bytesReceived - ((prevSsrcStats === null || prevSsrcStats === void 0 ? void 0 : prevSsrcStats.bytesReceived) || 0);
184
184
  ssrcMetrics.byteCount = (ssrcMetrics.byteCount || 0) + byteCountDiff;
185
- const headerByteCountDiff = currentSsrcStats.headerBytesReceived - ((prevSsrcStats === null || prevSsrcStats === void 0 ? void 0 : prevSsrcStats.headerBytesReceived) || 0);
186
- ssrcMetrics.headerByteCount = (ssrcMetrics.headerByteCount || 0) + headerByteCountDiff;
185
+ let headerByteCountDiff = 0;
186
+ if (currentSsrcStats.headerBytesReceived) {
187
+ headerByteCountDiff = currentSsrcStats.headerBytesReceived - ((prevSsrcStats === null || prevSsrcStats === void 0 ? void 0 : prevSsrcStats.headerBytesReceived) || 0);
188
+ ssrcMetrics.headerByteCount = (ssrcMetrics.headerByteCount || 0) + headerByteCountDiff;
189
+ }
187
190
  const totalBytesDiff = byteCountDiff + headerByteCountDiff;
188
191
  ssrcMetrics.bitrate = (8000 * totalBytesDiff) / timeDiff;
189
192
  ssrcMetrics.mediaRatio = byteCountDiff / totalBytesDiff;
@@ -201,8 +204,11 @@ function captureCommonSsrcMetrics(ssrcMetrics, currentSsrcStats, prevSsrcStats,
201
204
  ssrcMetrics.packetRate = (1000 * packetCountDiff) / timeDiff;
202
205
  const byteCountDiff = currentSsrcStats.bytesSent - ((prevSsrcStats === null || prevSsrcStats === void 0 ? void 0 : prevSsrcStats.bytesSent) || 0);
203
206
  ssrcMetrics.byteCount = (ssrcMetrics.byteCount || 0) + byteCountDiff;
204
- const headerByteCountDiff = currentSsrcStats.headerBytesSent - ((prevSsrcStats === null || prevSsrcStats === void 0 ? void 0 : prevSsrcStats.headerBytesSent) || 0);
205
- ssrcMetrics.headerByteCount = (ssrcMetrics.headerByteCount || 0) + headerByteCountDiff;
207
+ let headerByteCountDiff = 0;
208
+ if (currentSsrcStats.headerBytesSent) {
209
+ headerByteCountDiff = currentSsrcStats.headerBytesSent - ((prevSsrcStats === null || prevSsrcStats === void 0 ? void 0 : prevSsrcStats.headerBytesSent) || 0);
210
+ ssrcMetrics.headerByteCount = (ssrcMetrics.headerByteCount || 0) + headerByteCountDiff;
211
+ }
206
212
  const totalBytesDiff = byteCountDiff + headerByteCountDiff;
207
213
  ssrcMetrics.bitrate = (8000 * totalBytesDiff) / timeDiff;
208
214
  ssrcMetrics.mediaRatio = byteCountDiff / totalBytesDiff;
@@ -451,7 +457,7 @@ function collectStats(state, { logger, interval }, immediate) {
451
457
  pcData.previousSSRCs = pcData.currentSSRCs || {};
452
458
  pcData.currentSSRCs = {};
453
459
  report.forEach((currentRtcStats) => {
454
- var _a, _b;
460
+ var _a, _b, _c;
455
461
  if (currentRtcStats.type === "candidate-pair" && /inprogress|succeeded/.test(currentRtcStats.state)) {
456
462
  const prevRtcStats = (_a = pcData._oldReport) === null || _a === void 0 ? void 0 : _a.get(currentRtcStats.id);
457
463
  const timeDiff = prevRtcStats ? currentRtcStats.timestamp - prevRtcStats.timestamp : interval;
@@ -477,6 +483,13 @@ function collectStats(state, { logger, interval }, immediate) {
477
483
  }
478
484
  }
479
485
  const client = clients.find((c) => { var _a; return ((_a = c[kind].track) === null || _a === void 0 ? void 0 : _a.id) === trackId; }) || defaultClient;
486
+ if (!currentRtcStats.trackIdentifier &&
487
+ pcData.ssrcToTrackId[ssrc] &&
488
+ ((_c = client[kind].track) === null || _c === void 0 ? void 0 : _c.id) &&
489
+ client[kind].track.id !== pcData.ssrcToTrackId[ssrc]) {
490
+ trackId = client[kind].track.id;
491
+ pcData.ssrcToTrackId[ssrc] = client[kind].track.id;
492
+ }
480
493
  pcData.currentSSRCs[ssrc] = client.id;
481
494
  if (prevRtcStats) {
482
495
  const newTransport = report.get(currentRtcStats.transportId);
@@ -1408,6 +1421,10 @@ class VegaConnection extends EventEmitter.EventEmitter {
1408
1421
  var _a;
1409
1422
  (_a = this.socket) === null || _a === void 0 ? void 0 : _a.close();
1410
1423
  }
1424
+ isConnected() {
1425
+ var _a, _b;
1426
+ return ((_a = this.socket) === null || _a === void 0 ? void 0 : _a.readyState) === WebSocket.OPEN || ((_b = this.socket) === null || _b === void 0 ? void 0 : _b.readyState) === WebSocket.CONNECTING;
1427
+ }
1411
1428
  _onOpen() {
1412
1429
  logger$9.info("Connected");
1413
1430
  this.emit("open");
@@ -5087,6 +5104,9 @@ class VegaRtcManager {
5087
5104
  }), this._serverSocket.on(PROTOCOL_RESPONSES.ROOM_JOINED, () => {
5088
5105
  if (this._screenVideoTrack)
5089
5106
  this._emitScreenshareStarted();
5107
+ if (!this._vegaConnection.isConnected() && this._reconnect) {
5108
+ this._connect();
5109
+ }
5090
5110
  }));
5091
5111
  this._connect();
5092
5112
  }
@@ -5097,6 +5117,13 @@ class VegaRtcManager {
5097
5117
  });
5098
5118
  }
5099
5119
  _connect() {
5120
+ if (!this._serverSocket.isConnected()) {
5121
+ const reconnectThresholdInMs = this._serverSocket.getReconnectThreshold();
5122
+ if (!reconnectThresholdInMs)
5123
+ return;
5124
+ if (Date.now() > (this._serverSocket.disconnectTimestamp || 0) + reconnectThresholdInMs)
5125
+ return;
5126
+ }
5100
5127
  const host = this._features.sfuServerOverrideHost || [this._sfuServer.url];
5101
5128
  const searchParams = new URLSearchParams(Object.assign({ clientId: this._selfId, organizationId: this._room.organizationId, roomName: this._room.name, eventClaim: this._room.isClaimed ? this._eventClaim : null, lowBw: "true" }, Object.keys(this._features || {})
5102
5129
  .filter((featureKey) => this._features[featureKey] && /^sfu/.test(featureKey))
@@ -5807,7 +5834,7 @@ class VegaRtcManager {
5807
5834
  if (!videoTrack.effectTrack) {
5808
5835
  this._monitorVideoTrack(videoTrack);
5809
5836
  }
5810
- const beforeEffectTrack = beforeEffectTracks.find(t => t.kind === "video");
5837
+ const beforeEffectTrack = beforeEffectTracks.find((t) => t.kind === "video");
5811
5838
  if (beforeEffectTrack) {
5812
5839
  this._monitorVideoTrack(beforeEffectTrack);
5813
5840
  }
@@ -5818,7 +5845,7 @@ class VegaRtcManager {
5818
5845
  if (!audioTrack.effectTrack) {
5819
5846
  this._monitorAudioTrack(audioTrack);
5820
5847
  }
5821
- const beforeEffectTrack = beforeEffectTracks.find(t => t.kind === "audio");
5848
+ const beforeEffectTrack = beforeEffectTracks.find((t) => t.kind === "audio");
5822
5849
  if (beforeEffectTrack) {
5823
5850
  this._monitorAudioTrack(beforeEffectTrack);
5824
5851
  }
@@ -5889,7 +5916,9 @@ class VegaRtcManager {
5889
5916
  }
5890
5917
  if (!enable) {
5891
5918
  clearTimeout(this._stopCameraTimeout);
5892
- const stopCameraDelay = ((_a = localStream.getVideoTracks().find((t) => !t.enabled)) === null || _a === void 0 ? void 0 : _a.readyState) === "ended" ? 0 : 5000;
5919
+ const stopCameraDelay = ((_a = localStream.getVideoTracks().find((t) => !t.enabled)) === null || _a === void 0 ? void 0 : _a.readyState) === "ended"
5920
+ ? 0
5921
+ : 5000;
5893
5922
  this._stopCameraTimeout = setTimeout(() => {
5894
5923
  localStream.getVideoTracks().forEach((track) => {
5895
5924
  if (track.enabled === false) {
@@ -6441,6 +6470,7 @@ const logger = new Logger();
6441
6470
  class ReconnectManager extends EventEmitter {
6442
6471
  constructor(socket) {
6443
6472
  super();
6473
+ this.reconnectThresholdInMs = 0;
6444
6474
  this._socket = socket;
6445
6475
  this._clients = {};
6446
6476
  this._signalDisconnectTime = undefined;
@@ -6466,6 +6496,7 @@ class ReconnectManager extends EventEmitter {
6466
6496
  _onRoomJoined(payload) {
6467
6497
  var _a, _b;
6468
6498
  return __awaiter(this, void 0, void 0, function* () {
6499
+ this.reconnectThresholdInMs = (payload.disconnectTimeout || 0) * 0.8 || 0;
6469
6500
  if (!((_a = payload.room) === null || _a === void 0 ? void 0 : _a.clients)) {
6470
6501
  this.emit(PROTOCOL_RESPONSES.ROOM_JOINED, payload);
6471
6502
  return;
@@ -6719,6 +6750,7 @@ class ServerSocket {
6719
6750
  }
6720
6751
  });
6721
6752
  this._socket.on("disconnect", () => {
6753
+ this.disconnectTimestamp = Date.now();
6722
6754
  if (this.noopKeepaliveInterval) {
6723
6755
  clearInterval(this.noopKeepaliveInterval);
6724
6756
  this.noopKeepaliveInterval = null;
@@ -6802,6 +6834,10 @@ class ServerSocket {
6802
6834
  var _a;
6803
6835
  return (_a = this._reconnectManager) === null || _a === void 0 ? void 0 : _a.metrics;
6804
6836
  }
6837
+ getReconnectThreshold() {
6838
+ var _a;
6839
+ return (_a = this._reconnectManager) === null || _a === void 0 ? void 0 : _a.reconnectThresholdInMs;
6840
+ }
6805
6841
  }
6806
6842
 
6807
6843
  const defaultSubdomainPattern = /^(?:([^.]+)[.])?((:?[^.]+[.]){1,}[^.]+)$/;
package/dist/index.d.cts CHANGED
@@ -488,6 +488,7 @@ declare class ReconnectManager extends EventEmitter {
488
488
  evaluationFailed: number;
489
489
  roomJoined: number;
490
490
  };
491
+ reconnectThresholdInMs: number;
491
492
  constructor(socket: any);
492
493
  _onRoomJoined(payload: any): Promise<void>;
493
494
  _onClientLeft(payload: any): void;
@@ -516,6 +517,7 @@ declare class ServerSocket {
516
517
  _reconnectManager?: ReconnectManager | null;
517
518
  noopKeepaliveInterval: any;
518
519
  _wasConnectedUsingWebsocket?: boolean;
520
+ disconnectTimestamp: number | undefined;
519
521
  constructor(hostName: string, optionsOverrides?: any, glitchFree?: boolean);
520
522
  setRtcManager(rtcManager?: RtcManager): void;
521
523
  connect(): void;
@@ -525,8 +527,8 @@ declare class ServerSocket {
525
527
  emitIfConnected(eventName: string, data: any): void;
526
528
  getTransport(): any;
527
529
  getManager(): any;
528
- isConnecting(): any;
529
- isConnected(): any;
530
+ isConnecting(): boolean;
531
+ isConnected(): boolean;
530
532
  on(eventName: string, handler: Function): () => void;
531
533
  once(eventName: string, handler: Function): void;
532
534
  off(eventName: string, handler: Function): void;
@@ -537,6 +539,7 @@ declare class ServerSocket {
537
539
  evaluationFailed: number;
538
540
  roomJoined: number;
539
541
  } | undefined;
542
+ getReconnectThreshold(): number | undefined;
540
543
  }
541
544
 
542
545
  declare const maybeTurnOnly: (transportConfig: any, features: {
@@ -692,6 +695,10 @@ interface ClientMetadataReceivedEvent {
692
695
  clientId: string;
693
696
  };
694
697
  }
698
+ interface ClientUnableToJoinEvent {
699
+ displayName: string;
700
+ error: string;
701
+ }
695
702
  interface AudioEnableRequestedEvent {
696
703
  requestedByClientId: string;
697
704
  enable: boolean;
@@ -719,6 +726,7 @@ interface SignalEvents {
719
726
  client_left: ClientLeftEvent;
720
727
  client_kicked: ClientKickedEvent;
721
728
  client_metadata_received: ClientMetadataReceivedEvent;
729
+ client_unable_to_join: ClientUnableToJoinEvent;
722
730
  cloud_recording_started: CloudRecordingStartedEvent;
723
731
  cloud_recording_stopped: void;
724
732
  chat_message: ChatMessage;
@@ -995,6 +1003,7 @@ declare class VegaConnection extends EventEmitter$1 {
995
1003
  _setupSocket(): void;
996
1004
  _tearDown(): void;
997
1005
  close(): void;
1006
+ isConnected(): boolean;
998
1007
  _onOpen(): void;
999
1008
  _onMessage(event: MessageEvent): void;
1000
1009
  _onClose(): void;
@@ -1070,7 +1079,7 @@ declare class VegaRtcManager implements RtcManager {
1070
1079
  _room: any;
1071
1080
  _roomSessionId: any;
1072
1081
  _emitter: any;
1073
- _serverSocket: any;
1082
+ _serverSocket: ServerSocket;
1074
1083
  _webrtcProvider: any;
1075
1084
  _features: any;
1076
1085
  _eventClaim?: any;
@@ -1405,4 +1414,4 @@ declare class RtcStream {
1405
1414
  static getTypeFromId(id: string): string;
1406
1415
  }
1407
1416
 
1408
- 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, type LiveTranscriptionStartedEvent, type LiveTranscriptionStoppedEvent, 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 };
1417
+ export { type AddSpotlightRequest, type AudioEnableRequest, type AudioEnableRequestedEvent, type AudioEnabledEvent, BandwidthTester, type ChatMessage, type ClientKickedEvent, type ClientLeftEvent, type ClientMetadataPayload, type ClientMetadataReceivedEvent, type ClientRole, type ClientUnableToJoinEvent, 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, type LiveTranscriptionStartedEvent, type LiveTranscriptionStoppedEvent, 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
@@ -488,6 +488,7 @@ declare class ReconnectManager extends EventEmitter {
488
488
  evaluationFailed: number;
489
489
  roomJoined: number;
490
490
  };
491
+ reconnectThresholdInMs: number;
491
492
  constructor(socket: any);
492
493
  _onRoomJoined(payload: any): Promise<void>;
493
494
  _onClientLeft(payload: any): void;
@@ -516,6 +517,7 @@ declare class ServerSocket {
516
517
  _reconnectManager?: ReconnectManager | null;
517
518
  noopKeepaliveInterval: any;
518
519
  _wasConnectedUsingWebsocket?: boolean;
520
+ disconnectTimestamp: number | undefined;
519
521
  constructor(hostName: string, optionsOverrides?: any, glitchFree?: boolean);
520
522
  setRtcManager(rtcManager?: RtcManager): void;
521
523
  connect(): void;
@@ -525,8 +527,8 @@ declare class ServerSocket {
525
527
  emitIfConnected(eventName: string, data: any): void;
526
528
  getTransport(): any;
527
529
  getManager(): any;
528
- isConnecting(): any;
529
- isConnected(): any;
530
+ isConnecting(): boolean;
531
+ isConnected(): boolean;
530
532
  on(eventName: string, handler: Function): () => void;
531
533
  once(eventName: string, handler: Function): void;
532
534
  off(eventName: string, handler: Function): void;
@@ -537,6 +539,7 @@ declare class ServerSocket {
537
539
  evaluationFailed: number;
538
540
  roomJoined: number;
539
541
  } | undefined;
542
+ getReconnectThreshold(): number | undefined;
540
543
  }
541
544
 
542
545
  declare const maybeTurnOnly: (transportConfig: any, features: {
@@ -692,6 +695,10 @@ interface ClientMetadataReceivedEvent {
692
695
  clientId: string;
693
696
  };
694
697
  }
698
+ interface ClientUnableToJoinEvent {
699
+ displayName: string;
700
+ error: string;
701
+ }
695
702
  interface AudioEnableRequestedEvent {
696
703
  requestedByClientId: string;
697
704
  enable: boolean;
@@ -719,6 +726,7 @@ interface SignalEvents {
719
726
  client_left: ClientLeftEvent;
720
727
  client_kicked: ClientKickedEvent;
721
728
  client_metadata_received: ClientMetadataReceivedEvent;
729
+ client_unable_to_join: ClientUnableToJoinEvent;
722
730
  cloud_recording_started: CloudRecordingStartedEvent;
723
731
  cloud_recording_stopped: void;
724
732
  chat_message: ChatMessage;
@@ -995,6 +1003,7 @@ declare class VegaConnection extends EventEmitter$1 {
995
1003
  _setupSocket(): void;
996
1004
  _tearDown(): void;
997
1005
  close(): void;
1006
+ isConnected(): boolean;
998
1007
  _onOpen(): void;
999
1008
  _onMessage(event: MessageEvent): void;
1000
1009
  _onClose(): void;
@@ -1070,7 +1079,7 @@ declare class VegaRtcManager implements RtcManager {
1070
1079
  _room: any;
1071
1080
  _roomSessionId: any;
1072
1081
  _emitter: any;
1073
- _serverSocket: any;
1082
+ _serverSocket: ServerSocket;
1074
1083
  _webrtcProvider: any;
1075
1084
  _features: any;
1076
1085
  _eventClaim?: any;
@@ -1405,4 +1414,4 @@ declare class RtcStream {
1405
1414
  static getTypeFromId(id: string): string;
1406
1415
  }
1407
1416
 
1408
- 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, type LiveTranscriptionStartedEvent, type LiveTranscriptionStoppedEvent, 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 };
1417
+ export { type AddSpotlightRequest, type AudioEnableRequest, type AudioEnableRequestedEvent, type AudioEnabledEvent, BandwidthTester, type ChatMessage, type ClientKickedEvent, type ClientLeftEvent, type ClientMetadataPayload, type ClientMetadataReceivedEvent, type ClientRole, type ClientUnableToJoinEvent, 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, type LiveTranscriptionStartedEvent, type LiveTranscriptionStoppedEvent, 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
@@ -488,6 +488,7 @@ declare class ReconnectManager extends EventEmitter {
488
488
  evaluationFailed: number;
489
489
  roomJoined: number;
490
490
  };
491
+ reconnectThresholdInMs: number;
491
492
  constructor(socket: any);
492
493
  _onRoomJoined(payload: any): Promise<void>;
493
494
  _onClientLeft(payload: any): void;
@@ -516,6 +517,7 @@ declare class ServerSocket {
516
517
  _reconnectManager?: ReconnectManager | null;
517
518
  noopKeepaliveInterval: any;
518
519
  _wasConnectedUsingWebsocket?: boolean;
520
+ disconnectTimestamp: number | undefined;
519
521
  constructor(hostName: string, optionsOverrides?: any, glitchFree?: boolean);
520
522
  setRtcManager(rtcManager?: RtcManager): void;
521
523
  connect(): void;
@@ -525,8 +527,8 @@ declare class ServerSocket {
525
527
  emitIfConnected(eventName: string, data: any): void;
526
528
  getTransport(): any;
527
529
  getManager(): any;
528
- isConnecting(): any;
529
- isConnected(): any;
530
+ isConnecting(): boolean;
531
+ isConnected(): boolean;
530
532
  on(eventName: string, handler: Function): () => void;
531
533
  once(eventName: string, handler: Function): void;
532
534
  off(eventName: string, handler: Function): void;
@@ -537,6 +539,7 @@ declare class ServerSocket {
537
539
  evaluationFailed: number;
538
540
  roomJoined: number;
539
541
  } | undefined;
542
+ getReconnectThreshold(): number | undefined;
540
543
  }
541
544
 
542
545
  declare const maybeTurnOnly: (transportConfig: any, features: {
@@ -692,6 +695,10 @@ interface ClientMetadataReceivedEvent {
692
695
  clientId: string;
693
696
  };
694
697
  }
698
+ interface ClientUnableToJoinEvent {
699
+ displayName: string;
700
+ error: string;
701
+ }
695
702
  interface AudioEnableRequestedEvent {
696
703
  requestedByClientId: string;
697
704
  enable: boolean;
@@ -719,6 +726,7 @@ interface SignalEvents {
719
726
  client_left: ClientLeftEvent;
720
727
  client_kicked: ClientKickedEvent;
721
728
  client_metadata_received: ClientMetadataReceivedEvent;
729
+ client_unable_to_join: ClientUnableToJoinEvent;
722
730
  cloud_recording_started: CloudRecordingStartedEvent;
723
731
  cloud_recording_stopped: void;
724
732
  chat_message: ChatMessage;
@@ -995,6 +1003,7 @@ declare class VegaConnection extends EventEmitter$1 {
995
1003
  _setupSocket(): void;
996
1004
  _tearDown(): void;
997
1005
  close(): void;
1006
+ isConnected(): boolean;
998
1007
  _onOpen(): void;
999
1008
  _onMessage(event: MessageEvent): void;
1000
1009
  _onClose(): void;
@@ -1070,7 +1079,7 @@ declare class VegaRtcManager implements RtcManager {
1070
1079
  _room: any;
1071
1080
  _roomSessionId: any;
1072
1081
  _emitter: any;
1073
- _serverSocket: any;
1082
+ _serverSocket: ServerSocket;
1074
1083
  _webrtcProvider: any;
1075
1084
  _features: any;
1076
1085
  _eventClaim?: any;
@@ -1405,4 +1414,4 @@ declare class RtcStream {
1405
1414
  static getTypeFromId(id: string): string;
1406
1415
  }
1407
1416
 
1408
- 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, type LiveTranscriptionStartedEvent, type LiveTranscriptionStoppedEvent, 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 };
1417
+ export { type AddSpotlightRequest, type AudioEnableRequest, type AudioEnableRequestedEvent, type AudioEnabledEvent, BandwidthTester, type ChatMessage, type ClientKickedEvent, type ClientLeftEvent, type ClientMetadataPayload, type ClientMetadataReceivedEvent, type ClientRole, type ClientUnableToJoinEvent, 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, type LiveTranscriptionStartedEvent, type LiveTranscriptionStoppedEvent, 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
@@ -161,8 +161,11 @@ function captureCommonSsrcMetrics(ssrcMetrics, currentSsrcStats, prevSsrcStats,
161
161
  ssrcMetrics.lossRatio = (1000 * (packetLossCountDiff / (packetLossCountDiff + packetCountDiff))) / timeDiff;
162
162
  const byteCountDiff = currentSsrcStats.bytesReceived - ((prevSsrcStats === null || prevSsrcStats === void 0 ? void 0 : prevSsrcStats.bytesReceived) || 0);
163
163
  ssrcMetrics.byteCount = (ssrcMetrics.byteCount || 0) + byteCountDiff;
164
- const headerByteCountDiff = currentSsrcStats.headerBytesReceived - ((prevSsrcStats === null || prevSsrcStats === void 0 ? void 0 : prevSsrcStats.headerBytesReceived) || 0);
165
- ssrcMetrics.headerByteCount = (ssrcMetrics.headerByteCount || 0) + headerByteCountDiff;
164
+ let headerByteCountDiff = 0;
165
+ if (currentSsrcStats.headerBytesReceived) {
166
+ headerByteCountDiff = currentSsrcStats.headerBytesReceived - ((prevSsrcStats === null || prevSsrcStats === void 0 ? void 0 : prevSsrcStats.headerBytesReceived) || 0);
167
+ ssrcMetrics.headerByteCount = (ssrcMetrics.headerByteCount || 0) + headerByteCountDiff;
168
+ }
166
169
  const totalBytesDiff = byteCountDiff + headerByteCountDiff;
167
170
  ssrcMetrics.bitrate = (8000 * totalBytesDiff) / timeDiff;
168
171
  ssrcMetrics.mediaRatio = byteCountDiff / totalBytesDiff;
@@ -180,8 +183,11 @@ function captureCommonSsrcMetrics(ssrcMetrics, currentSsrcStats, prevSsrcStats,
180
183
  ssrcMetrics.packetRate = (1000 * packetCountDiff) / timeDiff;
181
184
  const byteCountDiff = currentSsrcStats.bytesSent - ((prevSsrcStats === null || prevSsrcStats === void 0 ? void 0 : prevSsrcStats.bytesSent) || 0);
182
185
  ssrcMetrics.byteCount = (ssrcMetrics.byteCount || 0) + byteCountDiff;
183
- const headerByteCountDiff = currentSsrcStats.headerBytesSent - ((prevSsrcStats === null || prevSsrcStats === void 0 ? void 0 : prevSsrcStats.headerBytesSent) || 0);
184
- ssrcMetrics.headerByteCount = (ssrcMetrics.headerByteCount || 0) + headerByteCountDiff;
186
+ let headerByteCountDiff = 0;
187
+ if (currentSsrcStats.headerBytesSent) {
188
+ headerByteCountDiff = currentSsrcStats.headerBytesSent - ((prevSsrcStats === null || prevSsrcStats === void 0 ? void 0 : prevSsrcStats.headerBytesSent) || 0);
189
+ ssrcMetrics.headerByteCount = (ssrcMetrics.headerByteCount || 0) + headerByteCountDiff;
190
+ }
185
191
  const totalBytesDiff = byteCountDiff + headerByteCountDiff;
186
192
  ssrcMetrics.bitrate = (8000 * totalBytesDiff) / timeDiff;
187
193
  ssrcMetrics.mediaRatio = byteCountDiff / totalBytesDiff;
@@ -430,7 +436,7 @@ function collectStats(state, { logger, interval }, immediate) {
430
436
  pcData.previousSSRCs = pcData.currentSSRCs || {};
431
437
  pcData.currentSSRCs = {};
432
438
  report.forEach((currentRtcStats) => {
433
- var _a, _b;
439
+ var _a, _b, _c;
434
440
  if (currentRtcStats.type === "candidate-pair" && /inprogress|succeeded/.test(currentRtcStats.state)) {
435
441
  const prevRtcStats = (_a = pcData._oldReport) === null || _a === void 0 ? void 0 : _a.get(currentRtcStats.id);
436
442
  const timeDiff = prevRtcStats ? currentRtcStats.timestamp - prevRtcStats.timestamp : interval;
@@ -456,6 +462,13 @@ function collectStats(state, { logger, interval }, immediate) {
456
462
  }
457
463
  }
458
464
  const client = clients.find((c) => { var _a; return ((_a = c[kind].track) === null || _a === void 0 ? void 0 : _a.id) === trackId; }) || defaultClient;
465
+ if (!currentRtcStats.trackIdentifier &&
466
+ pcData.ssrcToTrackId[ssrc] &&
467
+ ((_c = client[kind].track) === null || _c === void 0 ? void 0 : _c.id) &&
468
+ client[kind].track.id !== pcData.ssrcToTrackId[ssrc]) {
469
+ trackId = client[kind].track.id;
470
+ pcData.ssrcToTrackId[ssrc] = client[kind].track.id;
471
+ }
459
472
  pcData.currentSSRCs[ssrc] = client.id;
460
473
  if (prevRtcStats) {
461
474
  const newTransport = report.get(currentRtcStats.transportId);
@@ -1387,6 +1400,10 @@ class VegaConnection extends EventEmitter {
1387
1400
  var _a;
1388
1401
  (_a = this.socket) === null || _a === void 0 ? void 0 : _a.close();
1389
1402
  }
1403
+ isConnected() {
1404
+ var _a, _b;
1405
+ return ((_a = this.socket) === null || _a === void 0 ? void 0 : _a.readyState) === WebSocket.OPEN || ((_b = this.socket) === null || _b === void 0 ? void 0 : _b.readyState) === WebSocket.CONNECTING;
1406
+ }
1390
1407
  _onOpen() {
1391
1408
  logger$9.info("Connected");
1392
1409
  this.emit("open");
@@ -5066,6 +5083,9 @@ class VegaRtcManager {
5066
5083
  }), this._serverSocket.on(PROTOCOL_RESPONSES.ROOM_JOINED, () => {
5067
5084
  if (this._screenVideoTrack)
5068
5085
  this._emitScreenshareStarted();
5086
+ if (!this._vegaConnection.isConnected() && this._reconnect) {
5087
+ this._connect();
5088
+ }
5069
5089
  }));
5070
5090
  this._connect();
5071
5091
  }
@@ -5076,6 +5096,13 @@ class VegaRtcManager {
5076
5096
  });
5077
5097
  }
5078
5098
  _connect() {
5099
+ if (!this._serverSocket.isConnected()) {
5100
+ const reconnectThresholdInMs = this._serverSocket.getReconnectThreshold();
5101
+ if (!reconnectThresholdInMs)
5102
+ return;
5103
+ if (Date.now() > (this._serverSocket.disconnectTimestamp || 0) + reconnectThresholdInMs)
5104
+ return;
5105
+ }
5079
5106
  const host = this._features.sfuServerOverrideHost || [this._sfuServer.url];
5080
5107
  const searchParams = new URLSearchParams(Object.assign({ clientId: this._selfId, organizationId: this._room.organizationId, roomName: this._room.name, eventClaim: this._room.isClaimed ? this._eventClaim : null, lowBw: "true" }, Object.keys(this._features || {})
5081
5108
  .filter((featureKey) => this._features[featureKey] && /^sfu/.test(featureKey))
@@ -5786,7 +5813,7 @@ class VegaRtcManager {
5786
5813
  if (!videoTrack.effectTrack) {
5787
5814
  this._monitorVideoTrack(videoTrack);
5788
5815
  }
5789
- const beforeEffectTrack = beforeEffectTracks.find(t => t.kind === "video");
5816
+ const beforeEffectTrack = beforeEffectTracks.find((t) => t.kind === "video");
5790
5817
  if (beforeEffectTrack) {
5791
5818
  this._monitorVideoTrack(beforeEffectTrack);
5792
5819
  }
@@ -5797,7 +5824,7 @@ class VegaRtcManager {
5797
5824
  if (!audioTrack.effectTrack) {
5798
5825
  this._monitorAudioTrack(audioTrack);
5799
5826
  }
5800
- const beforeEffectTrack = beforeEffectTracks.find(t => t.kind === "audio");
5827
+ const beforeEffectTrack = beforeEffectTracks.find((t) => t.kind === "audio");
5801
5828
  if (beforeEffectTrack) {
5802
5829
  this._monitorAudioTrack(beforeEffectTrack);
5803
5830
  }
@@ -5868,7 +5895,9 @@ class VegaRtcManager {
5868
5895
  }
5869
5896
  if (!enable) {
5870
5897
  clearTimeout(this._stopCameraTimeout);
5871
- const stopCameraDelay = ((_a = localStream.getVideoTracks().find((t) => !t.enabled)) === null || _a === void 0 ? void 0 : _a.readyState) === "ended" ? 0 : 5000;
5898
+ const stopCameraDelay = ((_a = localStream.getVideoTracks().find((t) => !t.enabled)) === null || _a === void 0 ? void 0 : _a.readyState) === "ended"
5899
+ ? 0
5900
+ : 5000;
5872
5901
  this._stopCameraTimeout = setTimeout(() => {
5873
5902
  localStream.getVideoTracks().forEach((track) => {
5874
5903
  if (track.enabled === false) {
@@ -6420,6 +6449,7 @@ const logger = new Logger();
6420
6449
  class ReconnectManager extends EventEmitter$1 {
6421
6450
  constructor(socket) {
6422
6451
  super();
6452
+ this.reconnectThresholdInMs = 0;
6423
6453
  this._socket = socket;
6424
6454
  this._clients = {};
6425
6455
  this._signalDisconnectTime = undefined;
@@ -6445,6 +6475,7 @@ class ReconnectManager extends EventEmitter$1 {
6445
6475
  _onRoomJoined(payload) {
6446
6476
  var _a, _b;
6447
6477
  return __awaiter(this, void 0, void 0, function* () {
6478
+ this.reconnectThresholdInMs = (payload.disconnectTimeout || 0) * 0.8 || 0;
6448
6479
  if (!((_a = payload.room) === null || _a === void 0 ? void 0 : _a.clients)) {
6449
6480
  this.emit(PROTOCOL_RESPONSES.ROOM_JOINED, payload);
6450
6481
  return;
@@ -6698,6 +6729,7 @@ class ServerSocket {
6698
6729
  }
6699
6730
  });
6700
6731
  this._socket.on("disconnect", () => {
6732
+ this.disconnectTimestamp = Date.now();
6701
6733
  if (this.noopKeepaliveInterval) {
6702
6734
  clearInterval(this.noopKeepaliveInterval);
6703
6735
  this.noopKeepaliveInterval = null;
@@ -6781,6 +6813,10 @@ class ServerSocket {
6781
6813
  var _a;
6782
6814
  return (_a = this._reconnectManager) === null || _a === void 0 ? void 0 : _a.metrics;
6783
6815
  }
6816
+ getReconnectThreshold() {
6817
+ var _a;
6818
+ return (_a = this._reconnectManager) === null || _a === void 0 ? void 0 : _a.reconnectThresholdInMs;
6819
+ }
6784
6820
  }
6785
6821
 
6786
6822
  const defaultSubdomainPattern = /^(?:([^.]+)[.])?((:?[^.]+[.]){1,}[^.]+)$/;
@@ -161,8 +161,11 @@ function captureCommonSsrcMetrics(ssrcMetrics, currentSsrcStats, prevSsrcStats,
161
161
  ssrcMetrics.lossRatio = (1000 * (packetLossCountDiff / (packetLossCountDiff + packetCountDiff))) / timeDiff;
162
162
  const byteCountDiff = currentSsrcStats.bytesReceived - ((prevSsrcStats === null || prevSsrcStats === void 0 ? void 0 : prevSsrcStats.bytesReceived) || 0);
163
163
  ssrcMetrics.byteCount = (ssrcMetrics.byteCount || 0) + byteCountDiff;
164
- const headerByteCountDiff = currentSsrcStats.headerBytesReceived - ((prevSsrcStats === null || prevSsrcStats === void 0 ? void 0 : prevSsrcStats.headerBytesReceived) || 0);
165
- ssrcMetrics.headerByteCount = (ssrcMetrics.headerByteCount || 0) + headerByteCountDiff;
164
+ let headerByteCountDiff = 0;
165
+ if (currentSsrcStats.headerBytesReceived) {
166
+ headerByteCountDiff = currentSsrcStats.headerBytesReceived - ((prevSsrcStats === null || prevSsrcStats === void 0 ? void 0 : prevSsrcStats.headerBytesReceived) || 0);
167
+ ssrcMetrics.headerByteCount = (ssrcMetrics.headerByteCount || 0) + headerByteCountDiff;
168
+ }
166
169
  const totalBytesDiff = byteCountDiff + headerByteCountDiff;
167
170
  ssrcMetrics.bitrate = (8000 * totalBytesDiff) / timeDiff;
168
171
  ssrcMetrics.mediaRatio = byteCountDiff / totalBytesDiff;
@@ -180,8 +183,11 @@ function captureCommonSsrcMetrics(ssrcMetrics, currentSsrcStats, prevSsrcStats,
180
183
  ssrcMetrics.packetRate = (1000 * packetCountDiff) / timeDiff;
181
184
  const byteCountDiff = currentSsrcStats.bytesSent - ((prevSsrcStats === null || prevSsrcStats === void 0 ? void 0 : prevSsrcStats.bytesSent) || 0);
182
185
  ssrcMetrics.byteCount = (ssrcMetrics.byteCount || 0) + byteCountDiff;
183
- const headerByteCountDiff = currentSsrcStats.headerBytesSent - ((prevSsrcStats === null || prevSsrcStats === void 0 ? void 0 : prevSsrcStats.headerBytesSent) || 0);
184
- ssrcMetrics.headerByteCount = (ssrcMetrics.headerByteCount || 0) + headerByteCountDiff;
186
+ let headerByteCountDiff = 0;
187
+ if (currentSsrcStats.headerBytesSent) {
188
+ headerByteCountDiff = currentSsrcStats.headerBytesSent - ((prevSsrcStats === null || prevSsrcStats === void 0 ? void 0 : prevSsrcStats.headerBytesSent) || 0);
189
+ ssrcMetrics.headerByteCount = (ssrcMetrics.headerByteCount || 0) + headerByteCountDiff;
190
+ }
185
191
  const totalBytesDiff = byteCountDiff + headerByteCountDiff;
186
192
  ssrcMetrics.bitrate = (8000 * totalBytesDiff) / timeDiff;
187
193
  ssrcMetrics.mediaRatio = byteCountDiff / totalBytesDiff;
@@ -430,7 +436,7 @@ function collectStats(state, { logger, interval }, immediate) {
430
436
  pcData.previousSSRCs = pcData.currentSSRCs || {};
431
437
  pcData.currentSSRCs = {};
432
438
  report.forEach((currentRtcStats) => {
433
- var _a, _b;
439
+ var _a, _b, _c;
434
440
  if (currentRtcStats.type === "candidate-pair" && /inprogress|succeeded/.test(currentRtcStats.state)) {
435
441
  const prevRtcStats = (_a = pcData._oldReport) === null || _a === void 0 ? void 0 : _a.get(currentRtcStats.id);
436
442
  const timeDiff = prevRtcStats ? currentRtcStats.timestamp - prevRtcStats.timestamp : interval;
@@ -456,6 +462,13 @@ function collectStats(state, { logger, interval }, immediate) {
456
462
  }
457
463
  }
458
464
  const client = clients.find((c) => { var _a; return ((_a = c[kind].track) === null || _a === void 0 ? void 0 : _a.id) === trackId; }) || defaultClient;
465
+ if (!currentRtcStats.trackIdentifier &&
466
+ pcData.ssrcToTrackId[ssrc] &&
467
+ ((_c = client[kind].track) === null || _c === void 0 ? void 0 : _c.id) &&
468
+ client[kind].track.id !== pcData.ssrcToTrackId[ssrc]) {
469
+ trackId = client[kind].track.id;
470
+ pcData.ssrcToTrackId[ssrc] = client[kind].track.id;
471
+ }
459
472
  pcData.currentSSRCs[ssrc] = client.id;
460
473
  if (prevRtcStats) {
461
474
  const newTransport = report.get(currentRtcStats.transportId);
@@ -1387,6 +1400,10 @@ class VegaConnection extends EventEmitter {
1387
1400
  var _a;
1388
1401
  (_a = this.socket) === null || _a === void 0 ? void 0 : _a.close();
1389
1402
  }
1403
+ isConnected() {
1404
+ var _a, _b;
1405
+ return ((_a = this.socket) === null || _a === void 0 ? void 0 : _a.readyState) === WebSocket.OPEN || ((_b = this.socket) === null || _b === void 0 ? void 0 : _b.readyState) === WebSocket.CONNECTING;
1406
+ }
1390
1407
  _onOpen() {
1391
1408
  logger$9.info("Connected");
1392
1409
  this.emit("open");
@@ -5066,6 +5083,9 @@ class VegaRtcManager {
5066
5083
  }), this._serverSocket.on(PROTOCOL_RESPONSES.ROOM_JOINED, () => {
5067
5084
  if (this._screenVideoTrack)
5068
5085
  this._emitScreenshareStarted();
5086
+ if (!this._vegaConnection.isConnected() && this._reconnect) {
5087
+ this._connect();
5088
+ }
5069
5089
  }));
5070
5090
  this._connect();
5071
5091
  }
@@ -5076,6 +5096,13 @@ class VegaRtcManager {
5076
5096
  });
5077
5097
  }
5078
5098
  _connect() {
5099
+ if (!this._serverSocket.isConnected()) {
5100
+ const reconnectThresholdInMs = this._serverSocket.getReconnectThreshold();
5101
+ if (!reconnectThresholdInMs)
5102
+ return;
5103
+ if (Date.now() > (this._serverSocket.disconnectTimestamp || 0) + reconnectThresholdInMs)
5104
+ return;
5105
+ }
5079
5106
  const host = this._features.sfuServerOverrideHost || [this._sfuServer.url];
5080
5107
  const searchParams = new URLSearchParams(Object.assign({ clientId: this._selfId, organizationId: this._room.organizationId, roomName: this._room.name, eventClaim: this._room.isClaimed ? this._eventClaim : null, lowBw: "true" }, Object.keys(this._features || {})
5081
5108
  .filter((featureKey) => this._features[featureKey] && /^sfu/.test(featureKey))
@@ -5786,7 +5813,7 @@ class VegaRtcManager {
5786
5813
  if (!videoTrack.effectTrack) {
5787
5814
  this._monitorVideoTrack(videoTrack);
5788
5815
  }
5789
- const beforeEffectTrack = beforeEffectTracks.find(t => t.kind === "video");
5816
+ const beforeEffectTrack = beforeEffectTracks.find((t) => t.kind === "video");
5790
5817
  if (beforeEffectTrack) {
5791
5818
  this._monitorVideoTrack(beforeEffectTrack);
5792
5819
  }
@@ -5797,7 +5824,7 @@ class VegaRtcManager {
5797
5824
  if (!audioTrack.effectTrack) {
5798
5825
  this._monitorAudioTrack(audioTrack);
5799
5826
  }
5800
- const beforeEffectTrack = beforeEffectTracks.find(t => t.kind === "audio");
5827
+ const beforeEffectTrack = beforeEffectTracks.find((t) => t.kind === "audio");
5801
5828
  if (beforeEffectTrack) {
5802
5829
  this._monitorAudioTrack(beforeEffectTrack);
5803
5830
  }
@@ -5868,7 +5895,9 @@ class VegaRtcManager {
5868
5895
  }
5869
5896
  if (!enable) {
5870
5897
  clearTimeout(this._stopCameraTimeout);
5871
- const stopCameraDelay = ((_a = localStream.getVideoTracks().find((t) => !t.enabled)) === null || _a === void 0 ? void 0 : _a.readyState) === "ended" ? 0 : 5000;
5898
+ const stopCameraDelay = ((_a = localStream.getVideoTracks().find((t) => !t.enabled)) === null || _a === void 0 ? void 0 : _a.readyState) === "ended"
5899
+ ? 0
5900
+ : 5000;
5872
5901
  this._stopCameraTimeout = setTimeout(() => {
5873
5902
  localStream.getVideoTracks().forEach((track) => {
5874
5903
  if (track.enabled === false) {
@@ -6420,6 +6449,7 @@ const logger = new Logger();
6420
6449
  class ReconnectManager extends EventEmitter$1 {
6421
6450
  constructor(socket) {
6422
6451
  super();
6452
+ this.reconnectThresholdInMs = 0;
6423
6453
  this._socket = socket;
6424
6454
  this._clients = {};
6425
6455
  this._signalDisconnectTime = undefined;
@@ -6445,6 +6475,7 @@ class ReconnectManager extends EventEmitter$1 {
6445
6475
  _onRoomJoined(payload) {
6446
6476
  var _a, _b;
6447
6477
  return __awaiter(this, void 0, void 0, function* () {
6478
+ this.reconnectThresholdInMs = (payload.disconnectTimeout || 0) * 0.8 || 0;
6448
6479
  if (!((_a = payload.room) === null || _a === void 0 ? void 0 : _a.clients)) {
6449
6480
  this.emit(PROTOCOL_RESPONSES.ROOM_JOINED, payload);
6450
6481
  return;
@@ -6698,6 +6729,7 @@ class ServerSocket {
6698
6729
  }
6699
6730
  });
6700
6731
  this._socket.on("disconnect", () => {
6732
+ this.disconnectTimestamp = Date.now();
6701
6733
  if (this.noopKeepaliveInterval) {
6702
6734
  clearInterval(this.noopKeepaliveInterval);
6703
6735
  this.noopKeepaliveInterval = null;
@@ -6781,6 +6813,10 @@ class ServerSocket {
6781
6813
  var _a;
6782
6814
  return (_a = this._reconnectManager) === null || _a === void 0 ? void 0 : _a.metrics;
6783
6815
  }
6816
+ getReconnectThreshold() {
6817
+ var _a;
6818
+ return (_a = this._reconnectManager) === null || _a === void 0 ? void 0 : _a.reconnectThresholdInMs;
6819
+ }
6784
6820
  }
6785
6821
 
6786
6822
  const defaultSubdomainPattern = /^(?:([^.]+)[.])?((:?[^.]+[.]){1,}[^.]+)$/;
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.10.0",
4
+ "version": "1.11.0",
5
5
  "license": "MIT",
6
6
  "homepage": "https://github.com/whereby/sdk",
7
7
  "repository": {