@whereby.com/media 1.17.2 → 1.17.4

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
@@ -1,11 +1,11 @@
1
1
  'use strict';
2
2
 
3
- var mediasoupClient = require('mediasoup-client');
4
- var EventEmitter = require('events');
5
- var socket_ioClient = require('socket.io-client');
6
3
  var adapterRaw = require('webrtc-adapter');
7
4
  var rtcstats = require('rtcstats');
8
5
  var uuid = require('uuid');
6
+ var mediasoupClient = require('mediasoup-client');
7
+ var EventEmitter = require('events');
8
+ var socket_ioClient = require('socket.io-client');
9
9
  var SDPUtils = require('sdp');
10
10
  var sdpTransform = require('sdp-transform');
11
11
  var ipAddress = require('ip-address');
@@ -118,6 +118,178 @@ typeof SuppressedError === "function" ? SuppressedError : function (error, suppr
118
118
  return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
119
119
  };
120
120
 
121
+ var _a$7;
122
+ (_a$7 = adapterRaw.default) !== null && _a$7 !== void 0 ? _a$7 : adapterRaw;
123
+ const RTCSTATS_PROTOCOL_VERSION = "1.0";
124
+ const GETSTATS_BUFFER_SIZE = 20;
125
+ const clientInfo = {
126
+ id: uuid.v4(),
127
+ connectionNumber: 0,
128
+ };
129
+ const noop = () => { };
130
+ let resetDelta = noop;
131
+ function rtcStatsConnection(wsURL, logger = console) {
132
+ const buffer = [];
133
+ let ws;
134
+ let organizationId;
135
+ let clientId;
136
+ let displayName;
137
+ let userRole;
138
+ let roomSessionId;
139
+ let connectionShouldBeOpen;
140
+ let connectionAttempt = 0;
141
+ let hasPassedOnRoomSessionId = false;
142
+ let getStatsBufferUsed = 0;
143
+ let deviceId;
144
+ let roomProduct;
145
+ let roomMode;
146
+ let sfuServer;
147
+ let featureFlags;
148
+ const connection = {
149
+ connected: false,
150
+ trace: (...args) => {
151
+ args.push(Date.now());
152
+ if (args[0] === "customEvent" && args[2].type === "roomSessionId") {
153
+ const oldRoomSessionIdValue = roomSessionId && roomSessionId[2].value.roomSessionId;
154
+ const newRoomSessionIdValue = args[2].value.roomSessionId;
155
+ roomSessionId = args;
156
+ if (hasPassedOnRoomSessionId &&
157
+ newRoomSessionIdValue &&
158
+ newRoomSessionIdValue !== oldRoomSessionIdValue) {
159
+ ws === null || ws === void 0 ? void 0 : ws.close();
160
+ }
161
+ if (newRoomSessionIdValue)
162
+ hasPassedOnRoomSessionId = true;
163
+ }
164
+ else if (args[0] === "customEvent" && args[2].type === "clientId") {
165
+ clientId = args;
166
+ }
167
+ else if (args[0] === "customEvent" && args[2].type === "organizationId") {
168
+ organizationId = args;
169
+ }
170
+ else if (args[0] === "customEvent" && args[2].type === "displayName") {
171
+ displayName = args;
172
+ }
173
+ else if (args[0] === "customEvent" && args[2].type === "userRole") {
174
+ userRole = args;
175
+ }
176
+ else if (args[0] === "customEvent" && args[2].type === "deviceId") {
177
+ deviceId = args;
178
+ }
179
+ else if (args[0] === "customEvent" && args[2].type === "roomProduct") {
180
+ roomProduct = args;
181
+ }
182
+ else if (args[0] === "customEvent" && args[2].type === "roomMode") {
183
+ roomMode = args;
184
+ }
185
+ else if (args[0] === "customEvent" && args[2].type === "sfuServer") {
186
+ sfuServer = args;
187
+ }
188
+ else if (args[0] === "customEvent" && args[2].type === "featureFlags") {
189
+ featureFlags = args;
190
+ }
191
+ if ((ws === null || ws === void 0 ? void 0 : ws.readyState) === WebSocket.OPEN) {
192
+ connectionAttempt = 0;
193
+ ws.send(JSON.stringify(args));
194
+ }
195
+ else if (args[0] === "getstats") {
196
+ if (getStatsBufferUsed < GETSTATS_BUFFER_SIZE) {
197
+ getStatsBufferUsed++;
198
+ buffer.push(args);
199
+ }
200
+ }
201
+ else if (args[0] === "customEvent" && args[2].type === "insightsStats") ;
202
+ else {
203
+ buffer.push(args);
204
+ }
205
+ if ((ws === null || ws === void 0 ? void 0 : ws.readyState) === WebSocket.CLOSED && connectionShouldBeOpen) {
206
+ setTimeout(() => {
207
+ if (ws.readyState === WebSocket.CLOSED && connectionShouldBeOpen) {
208
+ connection.connect();
209
+ }
210
+ }, 1000 * connectionAttempt);
211
+ }
212
+ },
213
+ close: () => {
214
+ connectionShouldBeOpen = false;
215
+ ws === null || ws === void 0 ? void 0 : ws.close();
216
+ },
217
+ connect: () => {
218
+ connectionShouldBeOpen = true;
219
+ connectionAttempt += 1;
220
+ ws === null || ws === void 0 ? void 0 : ws.close();
221
+ connection.connected = true;
222
+ ws = new WebSocket(wsURL + window.location.pathname, RTCSTATS_PROTOCOL_VERSION);
223
+ ws.onerror = (e) => {
224
+ connection.connected = false;
225
+ logger.warn(`[RTCSTATS] WebSocket error`, e);
226
+ };
227
+ ws.onclose = (e) => {
228
+ connection.connected = false;
229
+ logger.info(`[RTCSTATS] Closed ${e.code}`);
230
+ resetDelta();
231
+ };
232
+ ws.onopen = () => {
233
+ clientInfo.connectionNumber++;
234
+ ws.send(JSON.stringify(["clientInfo", null, clientInfo]));
235
+ if (organizationId) {
236
+ ws.send(JSON.stringify(organizationId));
237
+ }
238
+ if (clientId) {
239
+ ws.send(JSON.stringify(clientId));
240
+ }
241
+ if (roomSessionId) {
242
+ ws.send(JSON.stringify(roomSessionId));
243
+ }
244
+ if (displayName) {
245
+ ws.send(JSON.stringify(displayName));
246
+ }
247
+ if (userRole) {
248
+ ws.send(JSON.stringify(userRole));
249
+ }
250
+ if (deviceId) {
251
+ ws.send(JSON.stringify(deviceId));
252
+ }
253
+ if (roomMode) {
254
+ ws.send(JSON.stringify(roomMode));
255
+ }
256
+ if (roomProduct) {
257
+ ws.send(JSON.stringify(roomProduct));
258
+ }
259
+ if (sfuServer) {
260
+ ws.send(JSON.stringify(sfuServer));
261
+ }
262
+ if (featureFlags) {
263
+ ws.send(JSON.stringify(featureFlags));
264
+ }
265
+ while (buffer.length) {
266
+ ws.send(JSON.stringify(buffer.shift()));
267
+ }
268
+ getStatsBufferUsed = 0;
269
+ };
270
+ },
271
+ };
272
+ return connection;
273
+ }
274
+ const server = rtcStatsConnection(process.env.RTCSTATS_URL || "wss://rtcstats.srv.whereby.com");
275
+ const stats = rtcstats(server.trace, 10000, [""]);
276
+ resetDelta = (stats === null || stats === void 0 ? void 0 : stats.resetDelta) || noop;
277
+ const rtcStats = {
278
+ sendEvent: (type, value) => {
279
+ server.trace("customEvent", null, {
280
+ type,
281
+ value,
282
+ });
283
+ },
284
+ sendAudioMuted: (muted) => {
285
+ rtcStats.sendEvent("audio_muted", { muted });
286
+ },
287
+ sendVideoMuted: (muted) => {
288
+ rtcStats.sendEvent("video_muted", { muted });
289
+ },
290
+ server,
291
+ };
292
+
121
293
  function captureCandidatePairInfoMetrics(cpMetrics, currentCptats, prevCptats, timeDiff, report) {
122
294
  const bytesReceivedDiff = currentCptats.bytesReceived - ((prevCptats === null || prevCptats === void 0 ? void 0 : prevCptats.bytesReceived) || 0);
123
295
  const bytesSentDiff = currentCptats.bytesSent - ((prevCptats === null || prevCptats === void 0 ? void 0 : prevCptats.bytesSent) || 0);
@@ -553,8 +725,14 @@ function collectStats(state, { logger, interval }, immediate) {
553
725
  state.subscriptions.forEach((subscription) => { var _a; return (_a = subscription.onUpdatedStats) === null || _a === void 0 ? void 0 : _a.call(subscription, state.statsByView, clients); });
554
726
  }
555
727
  }
556
- catch (ex) {
557
- logger.warn(ex);
728
+ catch (e) {
729
+ logger.warn(e);
730
+ state.numFailedStatsReports++;
731
+ rtcStats.sendEvent("collectStatsFailed", {
732
+ name: e === null || e === void 0 ? void 0 : e.name,
733
+ cause: e === null || e === void 0 ? void 0 : e.cause,
734
+ message: e === null || e === void 0 ? void 0 : e.message,
735
+ });
558
736
  }
559
737
  state.nextTimeout = setTimeout(collectStatsBound, interval);
560
738
  });
@@ -610,6 +788,7 @@ const STATE = {
610
788
  lastUpdateTime: 0,
611
789
  statsByView: {},
612
790
  subscriptions: [],
791
+ numFailedStatsReports: 0,
613
792
  };
614
793
  const OPTIONS = {
615
794
  interval: 2000,
@@ -618,6 +797,9 @@ const OPTIONS = {
618
797
  const getStats = () => {
619
798
  return Object.assign({}, STATE.statsByView);
620
799
  };
800
+ const getNumFailedStatsReports = () => {
801
+ return STATE.numFailedStatsReports;
802
+ };
621
803
  const getUpdatedStats = () => { var _a; return (_a = STATE.currentMonitor) === null || _a === void 0 ? void 0 : _a.getUpdatedStats(); };
622
804
  const setClientProvider = (provider) => (STATE.getClients = provider);
623
805
  function startStatsMonitor(state, { interval, logger }) {
@@ -1280,8 +1462,8 @@ class ReconnectManager extends EventEmitter {
1280
1462
  }
1281
1463
  }
1282
1464
 
1283
- var _a$7;
1284
- const adapter$6 = (_a$7 = adapterRaw.default) !== null && _a$7 !== void 0 ? _a$7 : adapterRaw;
1465
+ var _a$6;
1466
+ const adapter$6 = (_a$6 = adapterRaw.default) !== null && _a$6 !== void 0 ? _a$6 : adapterRaw;
1285
1467
  const DEFAULT_SOCKET_PATH = "/protocol/socket.io/v4";
1286
1468
  const NOOP_KEEPALIVE_INTERVAL = 2000;
1287
1469
  class ServerSocket {
@@ -1574,9 +1756,15 @@ const packetLossAnalyser = new PacketLossAnalyser();
1574
1756
  const periodicPacketLossDetector = {
1575
1757
  id: "periodic-packet-loss",
1576
1758
  enabled: ({ client, hasLiveTrack, ssrc0 }) => {
1577
- return client.isLocalClient && hasLiveTrack && ssrc0.direction === "out" && ssrc0.bitrate;
1759
+ return (client.isLocalClient &&
1760
+ hasLiveTrack &&
1761
+ !!(ssrc0 === null || ssrc0 === void 0 ? void 0 : ssrc0.ssrc) &&
1762
+ (ssrc0 === null || ssrc0 === void 0 ? void 0 : ssrc0.direction) === "out" &&
1763
+ ((ssrc0 === null || ssrc0 === void 0 ? void 0 : ssrc0.bitrate) || 0) > 0);
1578
1764
  },
1579
1765
  check: ({ ssrc0 }) => {
1766
+ if (!ssrc0 || !ssrc0.ssrc)
1767
+ return false;
1580
1768
  packetLossAnalyser.addPacketLossMeasurement(ssrc0.ssrc, ssrc0.fractionLost || 0, Date.now());
1581
1769
  return packetLossAnalyser.hasPeriodicPacketLoss(ssrc0.ssrc, Date.now());
1582
1770
  },
@@ -1682,8 +1870,12 @@ const issueDetectors = [
1682
1870
  dryTrackIssueDetector,
1683
1871
  {
1684
1872
  id: "low-layer0-bitrate",
1685
- enabled: ({ hasLiveTrack, ssrc0, kind, client }) => hasLiveTrack && kind === "video" && ssrc0 && ssrc0.height && !client.isPresentation,
1686
- check: ({ ssrc0 }) => ssrc0.height < 200 && ssrc0.bitrate < 30000,
1873
+ enabled: ({ hasLiveTrack, ssrc0, kind, client }) => hasLiveTrack && kind === "video" && !!ssrc0 && !!(ssrc0 === null || ssrc0 === void 0 ? void 0 : ssrc0.height) && !client.isPresentation,
1874
+ check: ({ ssrc0 }) => {
1875
+ if (!(ssrc0 === null || ssrc0 === void 0 ? void 0 : ssrc0.bitrate))
1876
+ return false;
1877
+ return ((ssrc0 === null || ssrc0 === void 0 ? void 0 : ssrc0.height) || 0) < 200 && ssrc0.bitrate < 30000;
1878
+ },
1687
1879
  },
1688
1880
  {
1689
1881
  id: "quality-limitation-bw",
@@ -1697,43 +1889,43 @@ const issueDetectors = [
1697
1889
  },
1698
1890
  {
1699
1891
  id: "high-plirate",
1700
- enabled: ({ hasLiveTrack, ssrc0 }) => hasLiveTrack && ssrc0 && ssrc0.height,
1701
- check: ({ ssrc0 }) => ssrc0.pliRate > 2,
1892
+ enabled: ({ hasLiveTrack, ssrc0 }) => hasLiveTrack && !!ssrc0 && !!ssrc0.height,
1893
+ check: ({ ssrc0 }) => ((ssrc0 === null || ssrc0 === void 0 ? void 0 : ssrc0.pliRate) || 0) > 2,
1702
1894
  },
1703
1895
  {
1704
1896
  id: "extreme-plirate",
1705
- enabled: ({ hasLiveTrack, ssrc0 }) => hasLiveTrack && ssrc0 && ssrc0.height,
1706
- check: ({ ssrc0 }) => ssrc0.pliRate > 5,
1897
+ enabled: ({ hasLiveTrack, ssrc0 }) => hasLiveTrack && !!ssrc0 && !!ssrc0.height,
1898
+ check: ({ ssrc0 }) => ((ssrc0 === null || ssrc0 === void 0 ? void 0 : ssrc0.pliRate) || 0) > 5,
1707
1899
  },
1708
1900
  {
1709
1901
  id: "high-packetloss",
1710
- enabled: ({ hasLiveTrack, ssrc0 }) => hasLiveTrack && ssrc0 && ssrc0.direction === "in",
1711
- check: ({ ssrc0 }) => ssrc0.lossRatio > 0.02,
1902
+ enabled: ({ hasLiveTrack, ssrc0 }) => hasLiveTrack && !!ssrc0 && ssrc0.direction === "in",
1903
+ check: ({ ssrc0 }) => ((ssrc0 === null || ssrc0 === void 0 ? void 0 : ssrc0.lossRatio) || 0) > 0.02,
1712
1904
  },
1713
1905
  {
1714
1906
  id: "extreme-packetloss",
1715
- enabled: ({ hasLiveTrack, ssrc0 }) => hasLiveTrack && ssrc0 && ssrc0.direction === "in",
1716
- check: ({ ssrc0 }) => ssrc0.lossRatio > 0.1,
1907
+ enabled: ({ hasLiveTrack, ssrc0 }) => hasLiveTrack && !!ssrc0 && ssrc0.direction === "in",
1908
+ check: ({ ssrc0 }) => ((ssrc0 === null || ssrc0 === void 0 ? void 0 : ssrc0.lossRatio) || 0) > 0.1,
1717
1909
  },
1718
1910
  {
1719
1911
  id: "high-packetloss",
1720
- enabled: ({ hasLiveTrack, ssrc0 }) => hasLiveTrack && ssrc0 && ssrc0.direction === "out",
1721
- check: ({ ssrc0 }) => (ssrc0.fractionLost || 0) > 0.02,
1912
+ enabled: ({ hasLiveTrack, ssrc0 }) => hasLiveTrack && !!ssrc0 && ssrc0.direction === "out",
1913
+ check: ({ ssrc0 }) => ((ssrc0 === null || ssrc0 === void 0 ? void 0 : ssrc0.fractionLost) || 0) > 0.02,
1722
1914
  },
1723
1915
  {
1724
1916
  id: "extreme-packetloss",
1725
- enabled: ({ hasLiveTrack, ssrc0 }) => hasLiveTrack && ssrc0 && ssrc0.direction === "out",
1726
- check: ({ ssrc0 }) => (ssrc0.fractionLost || 0) > 0.1,
1917
+ enabled: ({ hasLiveTrack, ssrc0 }) => hasLiveTrack && !!ssrc0 && ssrc0.direction === "out",
1918
+ check: ({ ssrc0 }) => ((ssrc0 === null || ssrc0 === void 0 ? void 0 : ssrc0.fractionLost) || 0) > 0.1,
1727
1919
  },
1728
1920
  {
1729
1921
  id: "fps-below-20",
1730
- enabled: ({ hasLiveTrack, ssrc0, kind, client }) => hasLiveTrack && ssrc0 && ssrc0.height && kind === "video" && !client.isPresentation,
1731
- check: ({ ssrc0 }) => ssrc0.height > 180 && ssrc0.fps < 20,
1922
+ enabled: ({ hasLiveTrack, ssrc0, kind, client }) => hasLiveTrack && !!ssrc0 && !!ssrc0.height && kind === "video" && !client.isPresentation,
1923
+ check: ({ ssrc0 }) => ((ssrc0 === null || ssrc0 === void 0 ? void 0 : ssrc0.height) || 0) > 180 && ((ssrc0 === null || ssrc0 === void 0 ? void 0 : ssrc0.fps) || 0) < 20,
1732
1924
  },
1733
1925
  {
1734
1926
  id: "fps-below-10",
1735
- enabled: ({ hasLiveTrack, ssrc0, kind, client }) => hasLiveTrack && ssrc0 && ssrc0.height && kind === "video" && !client.isPresentation,
1736
- check: ({ ssrc0 }) => ssrc0.fps < 10,
1927
+ enabled: ({ hasLiveTrack, ssrc0, kind, client }) => hasLiveTrack && !!ssrc0 && !!ssrc0.height && kind === "video" && !client.isPresentation,
1928
+ check: ({ ssrc0 }) => ((ssrc0 === null || ssrc0 === void 0 ? void 0 : ssrc0.fps) || 0) < 10,
1737
1929
  },
1738
1930
  badNetworkIssueDetector,
1739
1931
  periodicPacketLossDetector,
@@ -1751,18 +1943,27 @@ const issueDetectors = [
1751
1943
  },
1752
1944
  {
1753
1945
  id: "concealed",
1754
- enabled: ({ hasLiveTrack, ssrc0, kind }) => hasLiveTrack && ssrc0 && kind === "audio",
1755
- check: ({ ssrc0 }) => ssrc0.bitrate && ssrc0.direction === "in" && ssrc0.audioLevel >= 0.001 && ssrc0.audioConcealment >= 0.1,
1946
+ enabled: ({ hasLiveTrack, ssrc0, kind }) => hasLiveTrack && !!ssrc0 && kind === "audio",
1947
+ check: ({ ssrc0 }) => !!(ssrc0 === null || ssrc0 === void 0 ? void 0 : ssrc0.bitrate) &&
1948
+ (ssrc0 === null || ssrc0 === void 0 ? void 0 : ssrc0.direction) === "in" &&
1949
+ ((ssrc0 === null || ssrc0 === void 0 ? void 0 : ssrc0.audioLevel) || 0) >= 0.001 &&
1950
+ ((ssrc0 === null || ssrc0 === void 0 ? void 0 : ssrc0.audioConcealment) || 0) >= 0.1,
1756
1951
  },
1757
1952
  {
1758
1953
  id: "decelerated",
1759
- enabled: ({ hasLiveTrack, ssrc0, kind }) => hasLiveTrack && ssrc0 && kind === "audio",
1760
- check: ({ ssrc0 }) => ssrc0.bitrate && ssrc0.direction === "in" && ssrc0.audioLevel >= 0.001 && ssrc0.audioDeceleration >= 0.1,
1954
+ enabled: ({ hasLiveTrack, ssrc0, kind }) => hasLiveTrack && !!ssrc0 && kind === "audio",
1955
+ check: ({ ssrc0 }) => !!(ssrc0 === null || ssrc0 === void 0 ? void 0 : ssrc0.bitrate) &&
1956
+ ssrc0.direction === "in" &&
1957
+ (ssrc0.audioLevel || 0) >= 0.001 &&
1958
+ ((ssrc0 === null || ssrc0 === void 0 ? void 0 : ssrc0.audioDeceleration) || 0) >= 0.1,
1761
1959
  },
1762
1960
  {
1763
1961
  id: "accelerated",
1764
- enabled: ({ hasLiveTrack, ssrc0, kind }) => hasLiveTrack && ssrc0 && kind === "audio",
1765
- check: ({ ssrc0 }) => ssrc0.bitrate && ssrc0.direction === "in" && ssrc0.audioLevel >= 0.001 && ssrc0.audioAcceleration >= 0.1,
1962
+ enabled: ({ hasLiveTrack, ssrc0, kind }) => hasLiveTrack && !!ssrc0 && kind === "audio",
1963
+ check: ({ ssrc0 }) => !!(ssrc0 === null || ssrc0 === void 0 ? void 0 : ssrc0.bitrate) &&
1964
+ ssrc0.direction === "in" &&
1965
+ (ssrc0.audioLevel || 0) >= 0.001 &&
1966
+ (ssrc0.audioAcceleration || 0) >= 0.1,
1766
1967
  },
1767
1968
  ];
1768
1969
 
@@ -1771,41 +1972,41 @@ let stopStats = null;
1771
1972
  const metrics = [
1772
1973
  {
1773
1974
  id: "bitrate",
1774
- enabled: ({ hasLiveTrack, track, ssrc0 }) => hasLiveTrack && track && ssrc0,
1975
+ enabled: ({ hasLiveTrack, track, ssrc0 }) => hasLiveTrack && !!track && !!ssrc0,
1775
1976
  value: ({ trackStats }) => Object.values(trackStats.ssrcs).reduce((sum, ssrc) => sum + ssrc.bitrate, 0),
1776
1977
  },
1777
1978
  {
1778
1979
  id: "pixelrate",
1779
- enabled: ({ hasLiveTrack, track, ssrc0, kind }) => hasLiveTrack && kind === "video" && track && ssrc0 && ssrc0.height,
1980
+ enabled: ({ hasLiveTrack, track, ssrc0, kind }) => hasLiveTrack && kind === "video" && !!track && !!ssrc0 && !!ssrc0.height,
1780
1981
  value: ({ trackStats }) => Object.values(trackStats.ssrcs).reduce((sum, ssrc) => sum + (ssrc.fps || 0) * (ssrc.width || 0) * (ssrc.height || 0), 0),
1781
1982
  },
1782
1983
  {
1783
1984
  id: "height",
1784
- enabled: ({ hasLiveTrack, track, ssrc0, kind }) => hasLiveTrack && kind === "video" && track && ssrc0 && ssrc0.height,
1985
+ enabled: ({ hasLiveTrack, track, ssrc0, kind }) => hasLiveTrack && kind === "video" && !!track && !!ssrc0 && !!ssrc0.height,
1785
1986
  value: ({ trackStats }) => Object.values(trackStats.ssrcs).reduce((max, ssrc) => Math.max(max, ssrc.fps > 0 ? ssrc.height : 0), 0),
1786
1987
  },
1787
1988
  {
1788
1989
  id: "sourceHeight",
1789
- enabled: ({ hasLiveTrack, track, ssrc0, kind }) => hasLiveTrack && kind === "video" && track && ssrc0 && ssrc0.sourceHeight && ssrc0.direction === "out",
1790
- value: ({ ssrc0 }) => ssrc0.sourceHeight,
1990
+ enabled: ({ hasLiveTrack, track, ssrc0, kind }) => hasLiveTrack && kind === "video" && !!track && !!ssrc0 && !!ssrc0.sourceHeight && ssrc0.direction === "out",
1991
+ value: ({ ssrc0 }) => ssrc0 === null || ssrc0 === void 0 ? void 0 : ssrc0.sourceHeight,
1791
1992
  },
1792
1993
  {
1793
1994
  id: "packetloss",
1794
- enabled: ({ hasLiveTrack, ssrc0 }) => hasLiveTrack && ssrc0 && ssrc0.bitrate,
1795
- value: ({ ssrc0 }) => (ssrc0.direction === "in" ? ssrc0.lossRatio : ssrc0.fractionLost) || 0,
1995
+ enabled: ({ hasLiveTrack, ssrc0 }) => hasLiveTrack && !!ssrc0 && !!ssrc0.bitrate,
1996
+ value: ({ ssrc0 }) => ((ssrc0 === null || ssrc0 === void 0 ? void 0 : ssrc0.direction) === "in" ? ssrc0.lossRatio : ssrc0 === null || ssrc0 === void 0 ? void 0 : ssrc0.fractionLost) || 0,
1796
1997
  },
1797
1998
  {
1798
1999
  id: "jitter",
1799
- enabled: ({ hasLiveTrack, ssrc0 }) => hasLiveTrack && ssrc0 && ssrc0.bitrate && ssrc0.direction === "in",
1800
- value: ({ ssrc0 }) => ssrc0.jitter,
2000
+ enabled: ({ hasLiveTrack, ssrc0 }) => hasLiveTrack && !!ssrc0 && !!ssrc0.bitrate && ssrc0.direction === "in",
2001
+ value: ({ ssrc0 }) => ssrc0 === null || ssrc0 === void 0 ? void 0 : ssrc0.jitter,
1801
2002
  },
1802
2003
  {
1803
2004
  id: "mos",
1804
- enabled: ({ hasLiveTrack, ssrc0 }) => hasLiveTrack && ssrc0 && ssrc0.bitrate && ssrc0.direction === "out",
2005
+ enabled: ({ hasLiveTrack, ssrc0 }) => hasLiveTrack && !!ssrc0 && !!ssrc0.bitrate && ssrc0.direction === "out",
1805
2006
  value: ({ ssrc0 }) => {
1806
- const averageLatency = ssrc0.roundTripTime || 0;
1807
- const jitter = ssrc0.jitter || 0;
1808
- const packetLoss = (ssrc0.fractionLost || 0) * 100;
2007
+ const averageLatency = (ssrc0 === null || ssrc0 === void 0 ? void 0 : ssrc0.roundTripTime) || 0;
2008
+ const jitter = (ssrc0 === null || ssrc0 === void 0 ? void 0 : ssrc0.jitter) || 0;
2009
+ const packetLoss = ((ssrc0 === null || ssrc0 === void 0 ? void 0 : ssrc0.fractionLost) || 0) * 100;
1809
2010
  const effectiveLatency = averageLatency + jitter * 2 + 10;
1810
2011
  let r = effectiveLatency < 160 ? 93.2 - effectiveLatency / 40 : 93.2 - (effectiveLatency - 120) / 10;
1811
2012
  r = r - packetLoss * 2.5;
@@ -1842,36 +2043,36 @@ const metrics = [
1842
2043
  {
1843
2044
  id: "concealment",
1844
2045
  enabled: ({ hasLiveTrack, ssrc0, kind }) => hasLiveTrack &&
1845
- ssrc0 &&
1846
- ssrc0.bitrate &&
2046
+ !!ssrc0 &&
2047
+ !!ssrc0.bitrate &&
1847
2048
  ssrc0.direction === "in" &&
1848
2049
  kind === "audio" &&
1849
- ssrc0.audioLevel >= 0.001,
1850
- value: ({ ssrc0 }) => ssrc0.audioConcealment,
2050
+ (ssrc0.audioLevel || 0) >= 0.001,
2051
+ value: ({ ssrc0 }) => ssrc0 === null || ssrc0 === void 0 ? void 0 : ssrc0.audioConcealment,
1851
2052
  },
1852
2053
  {
1853
2054
  id: "deceleration",
1854
2055
  enabled: ({ hasLiveTrack, ssrc0, kind }) => hasLiveTrack &&
1855
- ssrc0 &&
1856
- ssrc0.bitrate &&
2056
+ !!ssrc0 &&
2057
+ !!ssrc0.bitrate &&
1857
2058
  ssrc0.direction === "in" &&
1858
2059
  kind === "audio" &&
1859
- ssrc0.audioLevel >= 0.001,
1860
- value: ({ ssrc0 }) => ssrc0.audioDeceleration,
2060
+ (ssrc0.audioLevel || 0) >= 0.001,
2061
+ value: ({ ssrc0 }) => ssrc0 === null || ssrc0 === void 0 ? void 0 : ssrc0.audioDeceleration,
1861
2062
  },
1862
2063
  {
1863
2064
  id: "acceleration",
1864
2065
  enabled: ({ hasLiveTrack, ssrc0, kind }) => hasLiveTrack &&
1865
- ssrc0 &&
1866
- ssrc0.bitrate &&
2066
+ !!ssrc0 &&
2067
+ !!ssrc0.bitrate &&
1867
2068
  ssrc0.direction === "in" &&
1868
2069
  kind === "audio" &&
1869
- ssrc0.audioLevel >= 0.001,
1870
- value: ({ ssrc0 }) => ssrc0.audioAcceleration,
2070
+ (ssrc0.audioLevel || 0) >= 0.001,
2071
+ value: ({ ssrc0 }) => ssrc0 === null || ssrc0 === void 0 ? void 0 : ssrc0.audioAcceleration,
1871
2072
  },
1872
2073
  {
1873
2074
  id: "qpf",
1874
- enabled: ({ hasLiveTrack, track, ssrc0, kind }) => hasLiveTrack && kind === "video" && track && ssrc0 && ssrc0.height,
2075
+ enabled: ({ hasLiveTrack, track, ssrc0, kind }) => hasLiveTrack && kind === "video" && !!track && !!ssrc0 && !!ssrc0.height,
1875
2076
  value: ({ trackStats }) => Object.values(trackStats.ssrcs).reduce((sum, ssrc) => sum + (ssrc.qpf || 0), 0),
1876
2077
  },
1877
2078
  ];
@@ -2776,8 +2977,8 @@ class BandwidthTester extends EventEmitter {
2776
2977
  }
2777
2978
  }
2778
2979
 
2779
- var _a$6;
2780
- const adapter$5 = (_a$6 = adapterRaw.default) !== null && _a$6 !== void 0 ? _a$6 : adapterRaw;
2980
+ var _a$5;
2981
+ const adapter$5 = (_a$5 = adapterRaw.default) !== null && _a$5 !== void 0 ? _a$5 : adapterRaw;
2781
2982
  function detectMicrophoneNotWorking(pc) {
2782
2983
  if (adapter$5.browserDetails.browser !== "chrome" ||
2783
2984
  adapter$5.browserDetails.browser < 58 ||
@@ -2812,8 +3013,8 @@ const MAXIMUM_TURN_BANDWIDTH = 1280;
2812
3013
  const MAXIMUM_TURN_BANDWIDTH_UNLIMITED = -1;
2813
3014
  const MEDIA_JITTER_BUFFER_TARGET = 400;
2814
3015
 
2815
- var _a$5;
2816
- const adapter$4 = (_a$5 = adapterRaw.default) !== null && _a$5 !== void 0 ? _a$5 : adapterRaw;
3016
+ var _a$4;
3017
+ const adapter$4 = (_a$4 = adapterRaw.default) !== null && _a$4 !== void 0 ? _a$4 : adapterRaw;
2817
3018
  const isSafari = adapter$4.browserDetails.browser === "safari";
2818
3019
  const parseResolution = (res) => res.split(/[^\d]/g).map((n) => parseInt(n, 10));
2819
3020
  function getMediaConstraints({ disableAEC, disableAGC, hd, lax, lowDataMode, preferredDeviceIds, resolution, simulcast, widescreen, }) {
@@ -2991,153 +3192,6 @@ function replaceTracksInStream(stream, newStream, only) {
2991
3192
  });
2992
3193
  return replacedTracks;
2993
3194
  }
2994
- function getTrack({ kind, deviceId, type, fallback = true, primerTrack, }) {
2995
- return __awaiter(this, void 0, void 0, function* () {
2996
- const devId = (deviceId) => (type === "exact" ? { deviceId: { exact: deviceId } } : { deviceId });
2997
- const constraints = {
2998
- [kind]: deviceId ? devId(deviceId) : kind === "video" ? { facingMode: "user" } : true,
2999
- };
3000
- let stream;
3001
- try {
3002
- stream = yield getUserMedia(constraints);
3003
- }
3004
- catch (e) {
3005
- if (!fallback) {
3006
- e.details = { constraints, constraint: e.constraint };
3007
- throw e;
3008
- }
3009
- if (primerTrack) {
3010
- return primerTrack;
3011
- }
3012
- stream = yield getUserMedia({ [kind]: true });
3013
- }
3014
- return stream.getTracks()[0];
3015
- });
3016
- }
3017
- function constrainTrack(track, constraints) {
3018
- return __awaiter(this, void 0, void 0, function* () {
3019
- while (constraints.length) {
3020
- try {
3021
- yield track.applyConstraints(Object.assign({}, ...constraints));
3022
- break;
3023
- }
3024
- catch (e) {
3025
- const c = constraints.pop();
3026
- logger$6.warn(`unable to apply ${JSON.stringify(c)}`, e);
3027
- }
3028
- }
3029
- });
3030
- }
3031
- function getStream2(constraintOpt, additionalOpts = {}) {
3032
- return __awaiter(this, void 0, void 0, function* () {
3033
- const { audioId, videoId, devices, type, options } = constraintOpt;
3034
- const { replaceStream, fallback } = additionalOpts;
3035
- const hasGrantedPermissions = !!devices.find((d) => d.label !== "");
3036
- let audioPrimerTrack;
3037
- let videoPrimerTrack;
3038
- if (!hasGrantedPermissions) {
3039
- try {
3040
- const primerStream = yield getUserMedia({
3041
- audio: constraintOpt.audioId !== false,
3042
- video: constraintOpt.videoId !== false,
3043
- });
3044
- audioPrimerTrack = primerStream.getAudioTracks()[0];
3045
- videoPrimerTrack = primerStream.getVideoTracks()[0];
3046
- }
3047
- catch (err) {
3048
- if (err.name === "NotAllowedError") {
3049
- throw err;
3050
- }
3051
- }
3052
- }
3053
- const getAudio = () => __awaiter(this, void 0, void 0, function* () {
3054
- if (audioId === false)
3055
- return false;
3056
- if (replaceStream)
3057
- stopStreamTracks(replaceStream, "audio");
3058
- const audioTrack = yield getTrack({
3059
- deviceId: audioId,
3060
- type,
3061
- kind: "audio",
3062
- fallback,
3063
- primerTrack: audioPrimerTrack,
3064
- });
3065
- if (audioPrimerTrack && audioTrack !== audioPrimerTrack) {
3066
- audioPrimerTrack.stop();
3067
- }
3068
- const { disableAEC, disableAGC } = options;
3069
- const changes = [];
3070
- if (disableAGC) {
3071
- changes.push({ autoGainControl: false });
3072
- }
3073
- if (disableAEC) {
3074
- changes.push({ echoCancellation: false });
3075
- }
3076
- yield constrainTrack(audioTrack, changes);
3077
- return audioTrack;
3078
- });
3079
- const getVideo = () => __awaiter(this, void 0, void 0, function* () {
3080
- if (videoId === false)
3081
- return false;
3082
- if (replaceStream)
3083
- stopStreamTracks(replaceStream, "video");
3084
- const videoTrack = yield getTrack({
3085
- deviceId: videoId,
3086
- type,
3087
- kind: "video",
3088
- fallback,
3089
- primerTrack: videoPrimerTrack,
3090
- });
3091
- if (videoPrimerTrack && videoTrack !== videoPrimerTrack) {
3092
- videoPrimerTrack.stop();
3093
- }
3094
- const { lowDataMode, simulcast, usingAspectRatio16x9 } = options;
3095
- const changes = [];
3096
- if (lowDataMode) {
3097
- changes.push({ frameRate: simulcast ? 30 : 15 });
3098
- }
3099
- if (usingAspectRatio16x9) {
3100
- changes.push({ aspectRatio: 16 / 9 });
3101
- }
3102
- if (lowDataMode) {
3103
- changes.push({ width: { max: simulcast ? 640 : 320 } });
3104
- }
3105
- else {
3106
- changes.push({ width: { max: 1280 } });
3107
- }
3108
- yield constrainTrack(videoTrack, changes);
3109
- return videoTrack;
3110
- });
3111
- const audioPromise = getAudio();
3112
- const videoPromise = getVideo();
3113
- let audioTrack;
3114
- let videoTrack;
3115
- let error;
3116
- try {
3117
- audioTrack = yield audioPromise;
3118
- }
3119
- catch (e) {
3120
- error = e;
3121
- if (type === "exact")
3122
- throw e;
3123
- }
3124
- try {
3125
- videoTrack = yield videoPromise;
3126
- }
3127
- catch (e) {
3128
- error = e;
3129
- if (type === "exact")
3130
- throw e;
3131
- }
3132
- const newStream = new MediaStream([audioTrack, videoTrack].filter(Boolean));
3133
- let replacedTracks;
3134
- if (replaceStream) {
3135
- const only = (audioId === false && "video") || (videoId === false && "audio") || "audio";
3136
- replacedTracks = replaceTracksInStream(replaceStream, newStream, only);
3137
- }
3138
- return { stream: replaceStream || newStream, error, replacedTracks };
3139
- });
3140
- }
3141
3195
  function getStream(constraintOpt, { replaceStream, fallback = true } = {}) {
3142
3196
  var _a;
3143
3197
  return __awaiter(this, void 0, void 0, function* () {
@@ -3339,178 +3393,6 @@ function getUpdatedDevices({ oldDevices, newDevices, currentAudioId, currentVide
3339
3393
  return { addedDevices, changedDevices };
3340
3394
  }
3341
3395
 
3342
- var _a$4;
3343
- (_a$4 = adapterRaw.default) !== null && _a$4 !== void 0 ? _a$4 : adapterRaw;
3344
- const RTCSTATS_PROTOCOL_VERSION = "1.0";
3345
- const GETSTATS_BUFFER_SIZE = 20;
3346
- const clientInfo = {
3347
- id: uuid.v4(),
3348
- connectionNumber: 0,
3349
- };
3350
- const noop = () => { };
3351
- let resetDelta = noop;
3352
- function rtcStatsConnection(wsURL, logger = console) {
3353
- const buffer = [];
3354
- let ws;
3355
- let organizationId;
3356
- let clientId;
3357
- let displayName;
3358
- let userRole;
3359
- let roomSessionId;
3360
- let connectionShouldBeOpen;
3361
- let connectionAttempt = 0;
3362
- let hasPassedOnRoomSessionId = false;
3363
- let getStatsBufferUsed = 0;
3364
- let deviceId;
3365
- let roomProduct;
3366
- let roomMode;
3367
- let sfuServer;
3368
- let featureFlags;
3369
- const connection = {
3370
- connected: false,
3371
- trace: (...args) => {
3372
- args.push(Date.now());
3373
- if (args[0] === "customEvent" && args[2].type === "roomSessionId") {
3374
- const oldRoomSessionIdValue = roomSessionId && roomSessionId[2].value.roomSessionId;
3375
- const newRoomSessionIdValue = args[2].value.roomSessionId;
3376
- roomSessionId = args;
3377
- if (hasPassedOnRoomSessionId &&
3378
- newRoomSessionIdValue &&
3379
- newRoomSessionIdValue !== oldRoomSessionIdValue) {
3380
- ws === null || ws === void 0 ? void 0 : ws.close();
3381
- }
3382
- if (newRoomSessionIdValue)
3383
- hasPassedOnRoomSessionId = true;
3384
- }
3385
- else if (args[0] === "customEvent" && args[2].type === "clientId") {
3386
- clientId = args;
3387
- }
3388
- else if (args[0] === "customEvent" && args[2].type === "organizationId") {
3389
- organizationId = args;
3390
- }
3391
- else if (args[0] === "customEvent" && args[2].type === "displayName") {
3392
- displayName = args;
3393
- }
3394
- else if (args[0] === "customEvent" && args[2].type === "userRole") {
3395
- userRole = args;
3396
- }
3397
- else if (args[0] === "customEvent" && args[2].type === "deviceId") {
3398
- deviceId = args;
3399
- }
3400
- else if (args[0] === "customEvent" && args[2].type === "roomProduct") {
3401
- roomProduct = args;
3402
- }
3403
- else if (args[0] === "customEvent" && args[2].type === "roomMode") {
3404
- roomMode = args;
3405
- }
3406
- else if (args[0] === "customEvent" && args[2].type === "sfuServer") {
3407
- sfuServer = args;
3408
- }
3409
- else if (args[0] === "customEvent" && args[2].type === "featureFlags") {
3410
- featureFlags = args;
3411
- }
3412
- if ((ws === null || ws === void 0 ? void 0 : ws.readyState) === WebSocket.OPEN) {
3413
- connectionAttempt = 0;
3414
- ws.send(JSON.stringify(args));
3415
- }
3416
- else if (args[0] === "getstats") {
3417
- if (getStatsBufferUsed < GETSTATS_BUFFER_SIZE) {
3418
- getStatsBufferUsed++;
3419
- buffer.push(args);
3420
- }
3421
- }
3422
- else if (args[0] === "customEvent" && args[2].type === "insightsStats") ;
3423
- else {
3424
- buffer.push(args);
3425
- }
3426
- if ((ws === null || ws === void 0 ? void 0 : ws.readyState) === WebSocket.CLOSED && connectionShouldBeOpen) {
3427
- setTimeout(() => {
3428
- if (ws.readyState === WebSocket.CLOSED && connectionShouldBeOpen) {
3429
- connection.connect();
3430
- }
3431
- }, 1000 * connectionAttempt);
3432
- }
3433
- },
3434
- close: () => {
3435
- connectionShouldBeOpen = false;
3436
- ws === null || ws === void 0 ? void 0 : ws.close();
3437
- },
3438
- connect: () => {
3439
- connectionShouldBeOpen = true;
3440
- connectionAttempt += 1;
3441
- ws === null || ws === void 0 ? void 0 : ws.close();
3442
- connection.connected = true;
3443
- ws = new WebSocket(wsURL + window.location.pathname, RTCSTATS_PROTOCOL_VERSION);
3444
- ws.onerror = (e) => {
3445
- connection.connected = false;
3446
- logger.warn(`[RTCSTATS] WebSocket error`, e);
3447
- };
3448
- ws.onclose = (e) => {
3449
- connection.connected = false;
3450
- logger.info(`[RTCSTATS] Closed ${e.code}`);
3451
- resetDelta();
3452
- };
3453
- ws.onopen = () => {
3454
- clientInfo.connectionNumber++;
3455
- ws.send(JSON.stringify(["clientInfo", null, clientInfo]));
3456
- if (organizationId) {
3457
- ws.send(JSON.stringify(organizationId));
3458
- }
3459
- if (clientId) {
3460
- ws.send(JSON.stringify(clientId));
3461
- }
3462
- if (roomSessionId) {
3463
- ws.send(JSON.stringify(roomSessionId));
3464
- }
3465
- if (displayName) {
3466
- ws.send(JSON.stringify(displayName));
3467
- }
3468
- if (userRole) {
3469
- ws.send(JSON.stringify(userRole));
3470
- }
3471
- if (deviceId) {
3472
- ws.send(JSON.stringify(deviceId));
3473
- }
3474
- if (roomMode) {
3475
- ws.send(JSON.stringify(roomMode));
3476
- }
3477
- if (roomProduct) {
3478
- ws.send(JSON.stringify(roomProduct));
3479
- }
3480
- if (sfuServer) {
3481
- ws.send(JSON.stringify(sfuServer));
3482
- }
3483
- if (featureFlags) {
3484
- ws.send(JSON.stringify(featureFlags));
3485
- }
3486
- while (buffer.length) {
3487
- ws.send(JSON.stringify(buffer.shift()));
3488
- }
3489
- getStatsBufferUsed = 0;
3490
- };
3491
- },
3492
- };
3493
- return connection;
3494
- }
3495
- const server = rtcStatsConnection(process.env.RTCSTATS_URL || "wss://rtcstats.srv.whereby.com");
3496
- const stats = rtcstats(server.trace, 10000, [""]);
3497
- resetDelta = (stats === null || stats === void 0 ? void 0 : stats.resetDelta) || noop;
3498
- const rtcStats = {
3499
- sendEvent: (type, value) => {
3500
- server.trace("customEvent", null, {
3501
- type,
3502
- value,
3503
- });
3504
- },
3505
- sendAudioMuted: (muted) => {
3506
- rtcStats.sendEvent("audio_muted", { muted });
3507
- },
3508
- sendVideoMuted: (muted) => {
3509
- rtcStats.sendEvent("video_muted", { muted });
3510
- },
3511
- server,
3512
- };
3513
-
3514
3396
  var _a$3;
3515
3397
  const adapter$3 = (_a$3 = adapterRaw.default) !== null && _a$3 !== void 0 ? _a$3 : adapterRaw;
3516
3398
  const logger$5 = new Logger();
@@ -7123,11 +7005,11 @@ exports.getHandler = getHandler;
7123
7005
  exports.getIssuesAndMetrics = getIssuesAndMetrics;
7124
7006
  exports.getMediaConstraints = getMediaConstraints;
7125
7007
  exports.getMediaSettings = getMediaSettings;
7008
+ exports.getNumFailedStatsReports = getNumFailedStatsReports;
7126
7009
  exports.getOptimalBitrate = getOptimalBitrate;
7127
7010
  exports.getPeerConnectionIndex = getPeerConnectionIndex;
7128
7011
  exports.getStats = getStats;
7129
7012
  exports.getStream = getStream;
7130
- exports.getStream2 = getStream2;
7131
7013
  exports.getUpdatedDevices = getUpdatedDevices;
7132
7014
  exports.getUpdatedStats = getUpdatedStats;
7133
7015
  exports.getUserMedia = getUserMedia;