@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.
@@ -1,9 +1,9 @@
1
- import { detectDevice, Device } from 'mediasoup-client';
2
- import EventEmitter, { EventEmitter as EventEmitter$1 } from 'events';
3
- import { io } from 'socket.io-client';
4
1
  import adapterRaw from 'webrtc-adapter';
5
2
  import rtcstats from 'rtcstats';
6
3
  import { v4 as v4$1 } from 'uuid';
4
+ import { detectDevice, Device } from 'mediasoup-client';
5
+ import EventEmitter, { EventEmitter as EventEmitter$1 } from 'events';
6
+ import { io } from 'socket.io-client';
7
7
  import SDPUtils from 'sdp';
8
8
  import * as sdpTransform from 'sdp-transform';
9
9
  import { Address6 } from 'ip-address';
@@ -97,6 +97,178 @@ typeof SuppressedError === "function" ? SuppressedError : function (error, suppr
97
97
  return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
98
98
  };
99
99
 
100
+ var _a$7;
101
+ (_a$7 = adapterRaw.default) !== null && _a$7 !== void 0 ? _a$7 : adapterRaw;
102
+ const RTCSTATS_PROTOCOL_VERSION = "1.0";
103
+ const GETSTATS_BUFFER_SIZE = 20;
104
+ const clientInfo = {
105
+ id: v4$1(),
106
+ connectionNumber: 0,
107
+ };
108
+ const noop = () => { };
109
+ let resetDelta = noop;
110
+ function rtcStatsConnection(wsURL, logger = console) {
111
+ const buffer = [];
112
+ let ws;
113
+ let organizationId;
114
+ let clientId;
115
+ let displayName;
116
+ let userRole;
117
+ let roomSessionId;
118
+ let connectionShouldBeOpen;
119
+ let connectionAttempt = 0;
120
+ let hasPassedOnRoomSessionId = false;
121
+ let getStatsBufferUsed = 0;
122
+ let deviceId;
123
+ let roomProduct;
124
+ let roomMode;
125
+ let sfuServer;
126
+ let featureFlags;
127
+ const connection = {
128
+ connected: false,
129
+ trace: (...args) => {
130
+ args.push(Date.now());
131
+ if (args[0] === "customEvent" && args[2].type === "roomSessionId") {
132
+ const oldRoomSessionIdValue = roomSessionId && roomSessionId[2].value.roomSessionId;
133
+ const newRoomSessionIdValue = args[2].value.roomSessionId;
134
+ roomSessionId = args;
135
+ if (hasPassedOnRoomSessionId &&
136
+ newRoomSessionIdValue &&
137
+ newRoomSessionIdValue !== oldRoomSessionIdValue) {
138
+ ws === null || ws === void 0 ? void 0 : ws.close();
139
+ }
140
+ if (newRoomSessionIdValue)
141
+ hasPassedOnRoomSessionId = true;
142
+ }
143
+ else if (args[0] === "customEvent" && args[2].type === "clientId") {
144
+ clientId = args;
145
+ }
146
+ else if (args[0] === "customEvent" && args[2].type === "organizationId") {
147
+ organizationId = args;
148
+ }
149
+ else if (args[0] === "customEvent" && args[2].type === "displayName") {
150
+ displayName = args;
151
+ }
152
+ else if (args[0] === "customEvent" && args[2].type === "userRole") {
153
+ userRole = args;
154
+ }
155
+ else if (args[0] === "customEvent" && args[2].type === "deviceId") {
156
+ deviceId = args;
157
+ }
158
+ else if (args[0] === "customEvent" && args[2].type === "roomProduct") {
159
+ roomProduct = args;
160
+ }
161
+ else if (args[0] === "customEvent" && args[2].type === "roomMode") {
162
+ roomMode = args;
163
+ }
164
+ else if (args[0] === "customEvent" && args[2].type === "sfuServer") {
165
+ sfuServer = args;
166
+ }
167
+ else if (args[0] === "customEvent" && args[2].type === "featureFlags") {
168
+ featureFlags = args;
169
+ }
170
+ if ((ws === null || ws === void 0 ? void 0 : ws.readyState) === WebSocket.OPEN) {
171
+ connectionAttempt = 0;
172
+ ws.send(JSON.stringify(args));
173
+ }
174
+ else if (args[0] === "getstats") {
175
+ if (getStatsBufferUsed < GETSTATS_BUFFER_SIZE) {
176
+ getStatsBufferUsed++;
177
+ buffer.push(args);
178
+ }
179
+ }
180
+ else if (args[0] === "customEvent" && args[2].type === "insightsStats") ;
181
+ else {
182
+ buffer.push(args);
183
+ }
184
+ if ((ws === null || ws === void 0 ? void 0 : ws.readyState) === WebSocket.CLOSED && connectionShouldBeOpen) {
185
+ setTimeout(() => {
186
+ if (ws.readyState === WebSocket.CLOSED && connectionShouldBeOpen) {
187
+ connection.connect();
188
+ }
189
+ }, 1000 * connectionAttempt);
190
+ }
191
+ },
192
+ close: () => {
193
+ connectionShouldBeOpen = false;
194
+ ws === null || ws === void 0 ? void 0 : ws.close();
195
+ },
196
+ connect: () => {
197
+ connectionShouldBeOpen = true;
198
+ connectionAttempt += 1;
199
+ ws === null || ws === void 0 ? void 0 : ws.close();
200
+ connection.connected = true;
201
+ ws = new WebSocket(wsURL + window.location.pathname, RTCSTATS_PROTOCOL_VERSION);
202
+ ws.onerror = (e) => {
203
+ connection.connected = false;
204
+ logger.warn(`[RTCSTATS] WebSocket error`, e);
205
+ };
206
+ ws.onclose = (e) => {
207
+ connection.connected = false;
208
+ logger.info(`[RTCSTATS] Closed ${e.code}`);
209
+ resetDelta();
210
+ };
211
+ ws.onopen = () => {
212
+ clientInfo.connectionNumber++;
213
+ ws.send(JSON.stringify(["clientInfo", null, clientInfo]));
214
+ if (organizationId) {
215
+ ws.send(JSON.stringify(organizationId));
216
+ }
217
+ if (clientId) {
218
+ ws.send(JSON.stringify(clientId));
219
+ }
220
+ if (roomSessionId) {
221
+ ws.send(JSON.stringify(roomSessionId));
222
+ }
223
+ if (displayName) {
224
+ ws.send(JSON.stringify(displayName));
225
+ }
226
+ if (userRole) {
227
+ ws.send(JSON.stringify(userRole));
228
+ }
229
+ if (deviceId) {
230
+ ws.send(JSON.stringify(deviceId));
231
+ }
232
+ if (roomMode) {
233
+ ws.send(JSON.stringify(roomMode));
234
+ }
235
+ if (roomProduct) {
236
+ ws.send(JSON.stringify(roomProduct));
237
+ }
238
+ if (sfuServer) {
239
+ ws.send(JSON.stringify(sfuServer));
240
+ }
241
+ if (featureFlags) {
242
+ ws.send(JSON.stringify(featureFlags));
243
+ }
244
+ while (buffer.length) {
245
+ ws.send(JSON.stringify(buffer.shift()));
246
+ }
247
+ getStatsBufferUsed = 0;
248
+ };
249
+ },
250
+ };
251
+ return connection;
252
+ }
253
+ const server = rtcStatsConnection(process.env.RTCSTATS_URL || "wss://rtcstats.srv.whereby.com");
254
+ const stats = rtcstats(server.trace, 10000, [""]);
255
+ resetDelta = (stats === null || stats === void 0 ? void 0 : stats.resetDelta) || noop;
256
+ const rtcStats = {
257
+ sendEvent: (type, value) => {
258
+ server.trace("customEvent", null, {
259
+ type,
260
+ value,
261
+ });
262
+ },
263
+ sendAudioMuted: (muted) => {
264
+ rtcStats.sendEvent("audio_muted", { muted });
265
+ },
266
+ sendVideoMuted: (muted) => {
267
+ rtcStats.sendEvent("video_muted", { muted });
268
+ },
269
+ server,
270
+ };
271
+
100
272
  function captureCandidatePairInfoMetrics(cpMetrics, currentCptats, prevCptats, timeDiff, report) {
101
273
  const bytesReceivedDiff = currentCptats.bytesReceived - ((prevCptats === null || prevCptats === void 0 ? void 0 : prevCptats.bytesReceived) || 0);
102
274
  const bytesSentDiff = currentCptats.bytesSent - ((prevCptats === null || prevCptats === void 0 ? void 0 : prevCptats.bytesSent) || 0);
@@ -532,8 +704,14 @@ function collectStats(state, { logger, interval }, immediate) {
532
704
  state.subscriptions.forEach((subscription) => { var _a; return (_a = subscription.onUpdatedStats) === null || _a === void 0 ? void 0 : _a.call(subscription, state.statsByView, clients); });
533
705
  }
534
706
  }
535
- catch (ex) {
536
- logger.warn(ex);
707
+ catch (e) {
708
+ logger.warn(e);
709
+ state.numFailedStatsReports++;
710
+ rtcStats.sendEvent("collectStatsFailed", {
711
+ name: e === null || e === void 0 ? void 0 : e.name,
712
+ cause: e === null || e === void 0 ? void 0 : e.cause,
713
+ message: e === null || e === void 0 ? void 0 : e.message,
714
+ });
537
715
  }
538
716
  state.nextTimeout = setTimeout(collectStatsBound, interval);
539
717
  });
@@ -589,6 +767,7 @@ const STATE = {
589
767
  lastUpdateTime: 0,
590
768
  statsByView: {},
591
769
  subscriptions: [],
770
+ numFailedStatsReports: 0,
592
771
  };
593
772
  const OPTIONS = {
594
773
  interval: 2000,
@@ -597,6 +776,9 @@ const OPTIONS = {
597
776
  const getStats = () => {
598
777
  return Object.assign({}, STATE.statsByView);
599
778
  };
779
+ const getNumFailedStatsReports = () => {
780
+ return STATE.numFailedStatsReports;
781
+ };
600
782
  const getUpdatedStats = () => { var _a; return (_a = STATE.currentMonitor) === null || _a === void 0 ? void 0 : _a.getUpdatedStats(); };
601
783
  const setClientProvider = (provider) => (STATE.getClients = provider);
602
784
  function startStatsMonitor(state, { interval, logger }) {
@@ -1259,8 +1441,8 @@ class ReconnectManager extends EventEmitter {
1259
1441
  }
1260
1442
  }
1261
1443
 
1262
- var _a$7;
1263
- const adapter$6 = (_a$7 = adapterRaw.default) !== null && _a$7 !== void 0 ? _a$7 : adapterRaw;
1444
+ var _a$6;
1445
+ const adapter$6 = (_a$6 = adapterRaw.default) !== null && _a$6 !== void 0 ? _a$6 : adapterRaw;
1264
1446
  const DEFAULT_SOCKET_PATH = "/protocol/socket.io/v4";
1265
1447
  const NOOP_KEEPALIVE_INTERVAL = 2000;
1266
1448
  class ServerSocket {
@@ -1553,9 +1735,15 @@ const packetLossAnalyser = new PacketLossAnalyser();
1553
1735
  const periodicPacketLossDetector = {
1554
1736
  id: "periodic-packet-loss",
1555
1737
  enabled: ({ client, hasLiveTrack, ssrc0 }) => {
1556
- return client.isLocalClient && hasLiveTrack && ssrc0.direction === "out" && ssrc0.bitrate;
1738
+ return (client.isLocalClient &&
1739
+ hasLiveTrack &&
1740
+ !!(ssrc0 === null || ssrc0 === void 0 ? void 0 : ssrc0.ssrc) &&
1741
+ (ssrc0 === null || ssrc0 === void 0 ? void 0 : ssrc0.direction) === "out" &&
1742
+ ((ssrc0 === null || ssrc0 === void 0 ? void 0 : ssrc0.bitrate) || 0) > 0);
1557
1743
  },
1558
1744
  check: ({ ssrc0 }) => {
1745
+ if (!ssrc0 || !ssrc0.ssrc)
1746
+ return false;
1559
1747
  packetLossAnalyser.addPacketLossMeasurement(ssrc0.ssrc, ssrc0.fractionLost || 0, Date.now());
1560
1748
  return packetLossAnalyser.hasPeriodicPacketLoss(ssrc0.ssrc, Date.now());
1561
1749
  },
@@ -1661,8 +1849,12 @@ const issueDetectors = [
1661
1849
  dryTrackIssueDetector,
1662
1850
  {
1663
1851
  id: "low-layer0-bitrate",
1664
- enabled: ({ hasLiveTrack, ssrc0, kind, client }) => hasLiveTrack && kind === "video" && ssrc0 && ssrc0.height && !client.isPresentation,
1665
- check: ({ ssrc0 }) => ssrc0.height < 200 && ssrc0.bitrate < 30000,
1852
+ enabled: ({ hasLiveTrack, ssrc0, kind, client }) => hasLiveTrack && kind === "video" && !!ssrc0 && !!(ssrc0 === null || ssrc0 === void 0 ? void 0 : ssrc0.height) && !client.isPresentation,
1853
+ check: ({ ssrc0 }) => {
1854
+ if (!(ssrc0 === null || ssrc0 === void 0 ? void 0 : ssrc0.bitrate))
1855
+ return false;
1856
+ return ((ssrc0 === null || ssrc0 === void 0 ? void 0 : ssrc0.height) || 0) < 200 && ssrc0.bitrate < 30000;
1857
+ },
1666
1858
  },
1667
1859
  {
1668
1860
  id: "quality-limitation-bw",
@@ -1676,43 +1868,43 @@ const issueDetectors = [
1676
1868
  },
1677
1869
  {
1678
1870
  id: "high-plirate",
1679
- enabled: ({ hasLiveTrack, ssrc0 }) => hasLiveTrack && ssrc0 && ssrc0.height,
1680
- check: ({ ssrc0 }) => ssrc0.pliRate > 2,
1871
+ enabled: ({ hasLiveTrack, ssrc0 }) => hasLiveTrack && !!ssrc0 && !!ssrc0.height,
1872
+ check: ({ ssrc0 }) => ((ssrc0 === null || ssrc0 === void 0 ? void 0 : ssrc0.pliRate) || 0) > 2,
1681
1873
  },
1682
1874
  {
1683
1875
  id: "extreme-plirate",
1684
- enabled: ({ hasLiveTrack, ssrc0 }) => hasLiveTrack && ssrc0 && ssrc0.height,
1685
- check: ({ ssrc0 }) => ssrc0.pliRate > 5,
1876
+ enabled: ({ hasLiveTrack, ssrc0 }) => hasLiveTrack && !!ssrc0 && !!ssrc0.height,
1877
+ check: ({ ssrc0 }) => ((ssrc0 === null || ssrc0 === void 0 ? void 0 : ssrc0.pliRate) || 0) > 5,
1686
1878
  },
1687
1879
  {
1688
1880
  id: "high-packetloss",
1689
- enabled: ({ hasLiveTrack, ssrc0 }) => hasLiveTrack && ssrc0 && ssrc0.direction === "in",
1690
- check: ({ ssrc0 }) => ssrc0.lossRatio > 0.02,
1881
+ enabled: ({ hasLiveTrack, ssrc0 }) => hasLiveTrack && !!ssrc0 && ssrc0.direction === "in",
1882
+ check: ({ ssrc0 }) => ((ssrc0 === null || ssrc0 === void 0 ? void 0 : ssrc0.lossRatio) || 0) > 0.02,
1691
1883
  },
1692
1884
  {
1693
1885
  id: "extreme-packetloss",
1694
- enabled: ({ hasLiveTrack, ssrc0 }) => hasLiveTrack && ssrc0 && ssrc0.direction === "in",
1695
- check: ({ ssrc0 }) => ssrc0.lossRatio > 0.1,
1886
+ enabled: ({ hasLiveTrack, ssrc0 }) => hasLiveTrack && !!ssrc0 && ssrc0.direction === "in",
1887
+ check: ({ ssrc0 }) => ((ssrc0 === null || ssrc0 === void 0 ? void 0 : ssrc0.lossRatio) || 0) > 0.1,
1696
1888
  },
1697
1889
  {
1698
1890
  id: "high-packetloss",
1699
- enabled: ({ hasLiveTrack, ssrc0 }) => hasLiveTrack && ssrc0 && ssrc0.direction === "out",
1700
- check: ({ ssrc0 }) => (ssrc0.fractionLost || 0) > 0.02,
1891
+ enabled: ({ hasLiveTrack, ssrc0 }) => hasLiveTrack && !!ssrc0 && ssrc0.direction === "out",
1892
+ check: ({ ssrc0 }) => ((ssrc0 === null || ssrc0 === void 0 ? void 0 : ssrc0.fractionLost) || 0) > 0.02,
1701
1893
  },
1702
1894
  {
1703
1895
  id: "extreme-packetloss",
1704
- enabled: ({ hasLiveTrack, ssrc0 }) => hasLiveTrack && ssrc0 && ssrc0.direction === "out",
1705
- check: ({ ssrc0 }) => (ssrc0.fractionLost || 0) > 0.1,
1896
+ enabled: ({ hasLiveTrack, ssrc0 }) => hasLiveTrack && !!ssrc0 && ssrc0.direction === "out",
1897
+ check: ({ ssrc0 }) => ((ssrc0 === null || ssrc0 === void 0 ? void 0 : ssrc0.fractionLost) || 0) > 0.1,
1706
1898
  },
1707
1899
  {
1708
1900
  id: "fps-below-20",
1709
- enabled: ({ hasLiveTrack, ssrc0, kind, client }) => hasLiveTrack && ssrc0 && ssrc0.height && kind === "video" && !client.isPresentation,
1710
- check: ({ ssrc0 }) => ssrc0.height > 180 && ssrc0.fps < 20,
1901
+ enabled: ({ hasLiveTrack, ssrc0, kind, client }) => hasLiveTrack && !!ssrc0 && !!ssrc0.height && kind === "video" && !client.isPresentation,
1902
+ check: ({ ssrc0 }) => ((ssrc0 === null || ssrc0 === void 0 ? void 0 : ssrc0.height) || 0) > 180 && ((ssrc0 === null || ssrc0 === void 0 ? void 0 : ssrc0.fps) || 0) < 20,
1711
1903
  },
1712
1904
  {
1713
1905
  id: "fps-below-10",
1714
- enabled: ({ hasLiveTrack, ssrc0, kind, client }) => hasLiveTrack && ssrc0 && ssrc0.height && kind === "video" && !client.isPresentation,
1715
- check: ({ ssrc0 }) => ssrc0.fps < 10,
1906
+ enabled: ({ hasLiveTrack, ssrc0, kind, client }) => hasLiveTrack && !!ssrc0 && !!ssrc0.height && kind === "video" && !client.isPresentation,
1907
+ check: ({ ssrc0 }) => ((ssrc0 === null || ssrc0 === void 0 ? void 0 : ssrc0.fps) || 0) < 10,
1716
1908
  },
1717
1909
  badNetworkIssueDetector,
1718
1910
  periodicPacketLossDetector,
@@ -1730,18 +1922,27 @@ const issueDetectors = [
1730
1922
  },
1731
1923
  {
1732
1924
  id: "concealed",
1733
- enabled: ({ hasLiveTrack, ssrc0, kind }) => hasLiveTrack && ssrc0 && kind === "audio",
1734
- check: ({ ssrc0 }) => ssrc0.bitrate && ssrc0.direction === "in" && ssrc0.audioLevel >= 0.001 && ssrc0.audioConcealment >= 0.1,
1925
+ enabled: ({ hasLiveTrack, ssrc0, kind }) => hasLiveTrack && !!ssrc0 && kind === "audio",
1926
+ check: ({ ssrc0 }) => !!(ssrc0 === null || ssrc0 === void 0 ? void 0 : ssrc0.bitrate) &&
1927
+ (ssrc0 === null || ssrc0 === void 0 ? void 0 : ssrc0.direction) === "in" &&
1928
+ ((ssrc0 === null || ssrc0 === void 0 ? void 0 : ssrc0.audioLevel) || 0) >= 0.001 &&
1929
+ ((ssrc0 === null || ssrc0 === void 0 ? void 0 : ssrc0.audioConcealment) || 0) >= 0.1,
1735
1930
  },
1736
1931
  {
1737
1932
  id: "decelerated",
1738
- enabled: ({ hasLiveTrack, ssrc0, kind }) => hasLiveTrack && ssrc0 && kind === "audio",
1739
- check: ({ ssrc0 }) => ssrc0.bitrate && ssrc0.direction === "in" && ssrc0.audioLevel >= 0.001 && ssrc0.audioDeceleration >= 0.1,
1933
+ enabled: ({ hasLiveTrack, ssrc0, kind }) => hasLiveTrack && !!ssrc0 && kind === "audio",
1934
+ check: ({ ssrc0 }) => !!(ssrc0 === null || ssrc0 === void 0 ? void 0 : ssrc0.bitrate) &&
1935
+ ssrc0.direction === "in" &&
1936
+ (ssrc0.audioLevel || 0) >= 0.001 &&
1937
+ ((ssrc0 === null || ssrc0 === void 0 ? void 0 : ssrc0.audioDeceleration) || 0) >= 0.1,
1740
1938
  },
1741
1939
  {
1742
1940
  id: "accelerated",
1743
- enabled: ({ hasLiveTrack, ssrc0, kind }) => hasLiveTrack && ssrc0 && kind === "audio",
1744
- check: ({ ssrc0 }) => ssrc0.bitrate && ssrc0.direction === "in" && ssrc0.audioLevel >= 0.001 && ssrc0.audioAcceleration >= 0.1,
1941
+ enabled: ({ hasLiveTrack, ssrc0, kind }) => hasLiveTrack && !!ssrc0 && kind === "audio",
1942
+ check: ({ ssrc0 }) => !!(ssrc0 === null || ssrc0 === void 0 ? void 0 : ssrc0.bitrate) &&
1943
+ ssrc0.direction === "in" &&
1944
+ (ssrc0.audioLevel || 0) >= 0.001 &&
1945
+ (ssrc0.audioAcceleration || 0) >= 0.1,
1745
1946
  },
1746
1947
  ];
1747
1948
 
@@ -1750,41 +1951,41 @@ let stopStats = null;
1750
1951
  const metrics = [
1751
1952
  {
1752
1953
  id: "bitrate",
1753
- enabled: ({ hasLiveTrack, track, ssrc0 }) => hasLiveTrack && track && ssrc0,
1954
+ enabled: ({ hasLiveTrack, track, ssrc0 }) => hasLiveTrack && !!track && !!ssrc0,
1754
1955
  value: ({ trackStats }) => Object.values(trackStats.ssrcs).reduce((sum, ssrc) => sum + ssrc.bitrate, 0),
1755
1956
  },
1756
1957
  {
1757
1958
  id: "pixelrate",
1758
- enabled: ({ hasLiveTrack, track, ssrc0, kind }) => hasLiveTrack && kind === "video" && track && ssrc0 && ssrc0.height,
1959
+ enabled: ({ hasLiveTrack, track, ssrc0, kind }) => hasLiveTrack && kind === "video" && !!track && !!ssrc0 && !!ssrc0.height,
1759
1960
  value: ({ trackStats }) => Object.values(trackStats.ssrcs).reduce((sum, ssrc) => sum + (ssrc.fps || 0) * (ssrc.width || 0) * (ssrc.height || 0), 0),
1760
1961
  },
1761
1962
  {
1762
1963
  id: "height",
1763
- enabled: ({ hasLiveTrack, track, ssrc0, kind }) => hasLiveTrack && kind === "video" && track && ssrc0 && ssrc0.height,
1964
+ enabled: ({ hasLiveTrack, track, ssrc0, kind }) => hasLiveTrack && kind === "video" && !!track && !!ssrc0 && !!ssrc0.height,
1764
1965
  value: ({ trackStats }) => Object.values(trackStats.ssrcs).reduce((max, ssrc) => Math.max(max, ssrc.fps > 0 ? ssrc.height : 0), 0),
1765
1966
  },
1766
1967
  {
1767
1968
  id: "sourceHeight",
1768
- enabled: ({ hasLiveTrack, track, ssrc0, kind }) => hasLiveTrack && kind === "video" && track && ssrc0 && ssrc0.sourceHeight && ssrc0.direction === "out",
1769
- value: ({ ssrc0 }) => ssrc0.sourceHeight,
1969
+ enabled: ({ hasLiveTrack, track, ssrc0, kind }) => hasLiveTrack && kind === "video" && !!track && !!ssrc0 && !!ssrc0.sourceHeight && ssrc0.direction === "out",
1970
+ value: ({ ssrc0 }) => ssrc0 === null || ssrc0 === void 0 ? void 0 : ssrc0.sourceHeight,
1770
1971
  },
1771
1972
  {
1772
1973
  id: "packetloss",
1773
- enabled: ({ hasLiveTrack, ssrc0 }) => hasLiveTrack && ssrc0 && ssrc0.bitrate,
1774
- value: ({ ssrc0 }) => (ssrc0.direction === "in" ? ssrc0.lossRatio : ssrc0.fractionLost) || 0,
1974
+ enabled: ({ hasLiveTrack, ssrc0 }) => hasLiveTrack && !!ssrc0 && !!ssrc0.bitrate,
1975
+ value: ({ ssrc0 }) => ((ssrc0 === null || ssrc0 === void 0 ? void 0 : ssrc0.direction) === "in" ? ssrc0.lossRatio : ssrc0 === null || ssrc0 === void 0 ? void 0 : ssrc0.fractionLost) || 0,
1775
1976
  },
1776
1977
  {
1777
1978
  id: "jitter",
1778
- enabled: ({ hasLiveTrack, ssrc0 }) => hasLiveTrack && ssrc0 && ssrc0.bitrate && ssrc0.direction === "in",
1779
- value: ({ ssrc0 }) => ssrc0.jitter,
1979
+ enabled: ({ hasLiveTrack, ssrc0 }) => hasLiveTrack && !!ssrc0 && !!ssrc0.bitrate && ssrc0.direction === "in",
1980
+ value: ({ ssrc0 }) => ssrc0 === null || ssrc0 === void 0 ? void 0 : ssrc0.jitter,
1780
1981
  },
1781
1982
  {
1782
1983
  id: "mos",
1783
- enabled: ({ hasLiveTrack, ssrc0 }) => hasLiveTrack && ssrc0 && ssrc0.bitrate && ssrc0.direction === "out",
1984
+ enabled: ({ hasLiveTrack, ssrc0 }) => hasLiveTrack && !!ssrc0 && !!ssrc0.bitrate && ssrc0.direction === "out",
1784
1985
  value: ({ ssrc0 }) => {
1785
- const averageLatency = ssrc0.roundTripTime || 0;
1786
- const jitter = ssrc0.jitter || 0;
1787
- const packetLoss = (ssrc0.fractionLost || 0) * 100;
1986
+ const averageLatency = (ssrc0 === null || ssrc0 === void 0 ? void 0 : ssrc0.roundTripTime) || 0;
1987
+ const jitter = (ssrc0 === null || ssrc0 === void 0 ? void 0 : ssrc0.jitter) || 0;
1988
+ const packetLoss = ((ssrc0 === null || ssrc0 === void 0 ? void 0 : ssrc0.fractionLost) || 0) * 100;
1788
1989
  const effectiveLatency = averageLatency + jitter * 2 + 10;
1789
1990
  let r = effectiveLatency < 160 ? 93.2 - effectiveLatency / 40 : 93.2 - (effectiveLatency - 120) / 10;
1790
1991
  r = r - packetLoss * 2.5;
@@ -1821,36 +2022,36 @@ const metrics = [
1821
2022
  {
1822
2023
  id: "concealment",
1823
2024
  enabled: ({ hasLiveTrack, ssrc0, kind }) => hasLiveTrack &&
1824
- ssrc0 &&
1825
- ssrc0.bitrate &&
2025
+ !!ssrc0 &&
2026
+ !!ssrc0.bitrate &&
1826
2027
  ssrc0.direction === "in" &&
1827
2028
  kind === "audio" &&
1828
- ssrc0.audioLevel >= 0.001,
1829
- value: ({ ssrc0 }) => ssrc0.audioConcealment,
2029
+ (ssrc0.audioLevel || 0) >= 0.001,
2030
+ value: ({ ssrc0 }) => ssrc0 === null || ssrc0 === void 0 ? void 0 : ssrc0.audioConcealment,
1830
2031
  },
1831
2032
  {
1832
2033
  id: "deceleration",
1833
2034
  enabled: ({ hasLiveTrack, ssrc0, kind }) => hasLiveTrack &&
1834
- ssrc0 &&
1835
- ssrc0.bitrate &&
2035
+ !!ssrc0 &&
2036
+ !!ssrc0.bitrate &&
1836
2037
  ssrc0.direction === "in" &&
1837
2038
  kind === "audio" &&
1838
- ssrc0.audioLevel >= 0.001,
1839
- value: ({ ssrc0 }) => ssrc0.audioDeceleration,
2039
+ (ssrc0.audioLevel || 0) >= 0.001,
2040
+ value: ({ ssrc0 }) => ssrc0 === null || ssrc0 === void 0 ? void 0 : ssrc0.audioDeceleration,
1840
2041
  },
1841
2042
  {
1842
2043
  id: "acceleration",
1843
2044
  enabled: ({ hasLiveTrack, ssrc0, kind }) => hasLiveTrack &&
1844
- ssrc0 &&
1845
- ssrc0.bitrate &&
2045
+ !!ssrc0 &&
2046
+ !!ssrc0.bitrate &&
1846
2047
  ssrc0.direction === "in" &&
1847
2048
  kind === "audio" &&
1848
- ssrc0.audioLevel >= 0.001,
1849
- value: ({ ssrc0 }) => ssrc0.audioAcceleration,
2049
+ (ssrc0.audioLevel || 0) >= 0.001,
2050
+ value: ({ ssrc0 }) => ssrc0 === null || ssrc0 === void 0 ? void 0 : ssrc0.audioAcceleration,
1850
2051
  },
1851
2052
  {
1852
2053
  id: "qpf",
1853
- enabled: ({ hasLiveTrack, track, ssrc0, kind }) => hasLiveTrack && kind === "video" && track && ssrc0 && ssrc0.height,
2054
+ enabled: ({ hasLiveTrack, track, ssrc0, kind }) => hasLiveTrack && kind === "video" && !!track && !!ssrc0 && !!ssrc0.height,
1854
2055
  value: ({ trackStats }) => Object.values(trackStats.ssrcs).reduce((sum, ssrc) => sum + (ssrc.qpf || 0), 0),
1855
2056
  },
1856
2057
  ];
@@ -2755,8 +2956,8 @@ class BandwidthTester extends EventEmitter {
2755
2956
  }
2756
2957
  }
2757
2958
 
2758
- var _a$6;
2759
- const adapter$5 = (_a$6 = adapterRaw.default) !== null && _a$6 !== void 0 ? _a$6 : adapterRaw;
2959
+ var _a$5;
2960
+ const adapter$5 = (_a$5 = adapterRaw.default) !== null && _a$5 !== void 0 ? _a$5 : adapterRaw;
2760
2961
  function detectMicrophoneNotWorking(pc) {
2761
2962
  if (adapter$5.browserDetails.browser !== "chrome" ||
2762
2963
  adapter$5.browserDetails.browser < 58 ||
@@ -2791,8 +2992,8 @@ const MAXIMUM_TURN_BANDWIDTH = 1280;
2791
2992
  const MAXIMUM_TURN_BANDWIDTH_UNLIMITED = -1;
2792
2993
  const MEDIA_JITTER_BUFFER_TARGET = 400;
2793
2994
 
2794
- var _a$5;
2795
- const adapter$4 = (_a$5 = adapterRaw.default) !== null && _a$5 !== void 0 ? _a$5 : adapterRaw;
2995
+ var _a$4;
2996
+ const adapter$4 = (_a$4 = adapterRaw.default) !== null && _a$4 !== void 0 ? _a$4 : adapterRaw;
2796
2997
  const isSafari = adapter$4.browserDetails.browser === "safari";
2797
2998
  const parseResolution = (res) => res.split(/[^\d]/g).map((n) => parseInt(n, 10));
2798
2999
  function getMediaConstraints({ disableAEC, disableAGC, hd, lax, lowDataMode, preferredDeviceIds, resolution, simulcast, widescreen, }) {
@@ -2970,153 +3171,6 @@ function replaceTracksInStream(stream, newStream, only) {
2970
3171
  });
2971
3172
  return replacedTracks;
2972
3173
  }
2973
- function getTrack({ kind, deviceId, type, fallback = true, primerTrack, }) {
2974
- return __awaiter(this, void 0, void 0, function* () {
2975
- const devId = (deviceId) => (type === "exact" ? { deviceId: { exact: deviceId } } : { deviceId });
2976
- const constraints = {
2977
- [kind]: deviceId ? devId(deviceId) : kind === "video" ? { facingMode: "user" } : true,
2978
- };
2979
- let stream;
2980
- try {
2981
- stream = yield getUserMedia(constraints);
2982
- }
2983
- catch (e) {
2984
- if (!fallback) {
2985
- e.details = { constraints, constraint: e.constraint };
2986
- throw e;
2987
- }
2988
- if (primerTrack) {
2989
- return primerTrack;
2990
- }
2991
- stream = yield getUserMedia({ [kind]: true });
2992
- }
2993
- return stream.getTracks()[0];
2994
- });
2995
- }
2996
- function constrainTrack(track, constraints) {
2997
- return __awaiter(this, void 0, void 0, function* () {
2998
- while (constraints.length) {
2999
- try {
3000
- yield track.applyConstraints(Object.assign({}, ...constraints));
3001
- break;
3002
- }
3003
- catch (e) {
3004
- const c = constraints.pop();
3005
- logger$6.warn(`unable to apply ${JSON.stringify(c)}`, e);
3006
- }
3007
- }
3008
- });
3009
- }
3010
- function getStream2(constraintOpt, additionalOpts = {}) {
3011
- return __awaiter(this, void 0, void 0, function* () {
3012
- const { audioId, videoId, devices, type, options } = constraintOpt;
3013
- const { replaceStream, fallback } = additionalOpts;
3014
- const hasGrantedPermissions = !!devices.find((d) => d.label !== "");
3015
- let audioPrimerTrack;
3016
- let videoPrimerTrack;
3017
- if (!hasGrantedPermissions) {
3018
- try {
3019
- const primerStream = yield getUserMedia({
3020
- audio: constraintOpt.audioId !== false,
3021
- video: constraintOpt.videoId !== false,
3022
- });
3023
- audioPrimerTrack = primerStream.getAudioTracks()[0];
3024
- videoPrimerTrack = primerStream.getVideoTracks()[0];
3025
- }
3026
- catch (err) {
3027
- if (err.name === "NotAllowedError") {
3028
- throw err;
3029
- }
3030
- }
3031
- }
3032
- const getAudio = () => __awaiter(this, void 0, void 0, function* () {
3033
- if (audioId === false)
3034
- return false;
3035
- if (replaceStream)
3036
- stopStreamTracks(replaceStream, "audio");
3037
- const audioTrack = yield getTrack({
3038
- deviceId: audioId,
3039
- type,
3040
- kind: "audio",
3041
- fallback,
3042
- primerTrack: audioPrimerTrack,
3043
- });
3044
- if (audioPrimerTrack && audioTrack !== audioPrimerTrack) {
3045
- audioPrimerTrack.stop();
3046
- }
3047
- const { disableAEC, disableAGC } = options;
3048
- const changes = [];
3049
- if (disableAGC) {
3050
- changes.push({ autoGainControl: false });
3051
- }
3052
- if (disableAEC) {
3053
- changes.push({ echoCancellation: false });
3054
- }
3055
- yield constrainTrack(audioTrack, changes);
3056
- return audioTrack;
3057
- });
3058
- const getVideo = () => __awaiter(this, void 0, void 0, function* () {
3059
- if (videoId === false)
3060
- return false;
3061
- if (replaceStream)
3062
- stopStreamTracks(replaceStream, "video");
3063
- const videoTrack = yield getTrack({
3064
- deviceId: videoId,
3065
- type,
3066
- kind: "video",
3067
- fallback,
3068
- primerTrack: videoPrimerTrack,
3069
- });
3070
- if (videoPrimerTrack && videoTrack !== videoPrimerTrack) {
3071
- videoPrimerTrack.stop();
3072
- }
3073
- const { lowDataMode, simulcast, usingAspectRatio16x9 } = options;
3074
- const changes = [];
3075
- if (lowDataMode) {
3076
- changes.push({ frameRate: simulcast ? 30 : 15 });
3077
- }
3078
- if (usingAspectRatio16x9) {
3079
- changes.push({ aspectRatio: 16 / 9 });
3080
- }
3081
- if (lowDataMode) {
3082
- changes.push({ width: { max: simulcast ? 640 : 320 } });
3083
- }
3084
- else {
3085
- changes.push({ width: { max: 1280 } });
3086
- }
3087
- yield constrainTrack(videoTrack, changes);
3088
- return videoTrack;
3089
- });
3090
- const audioPromise = getAudio();
3091
- const videoPromise = getVideo();
3092
- let audioTrack;
3093
- let videoTrack;
3094
- let error;
3095
- try {
3096
- audioTrack = yield audioPromise;
3097
- }
3098
- catch (e) {
3099
- error = e;
3100
- if (type === "exact")
3101
- throw e;
3102
- }
3103
- try {
3104
- videoTrack = yield videoPromise;
3105
- }
3106
- catch (e) {
3107
- error = e;
3108
- if (type === "exact")
3109
- throw e;
3110
- }
3111
- const newStream = new MediaStream([audioTrack, videoTrack].filter(Boolean));
3112
- let replacedTracks;
3113
- if (replaceStream) {
3114
- const only = (audioId === false && "video") || (videoId === false && "audio") || "audio";
3115
- replacedTracks = replaceTracksInStream(replaceStream, newStream, only);
3116
- }
3117
- return { stream: replaceStream || newStream, error, replacedTracks };
3118
- });
3119
- }
3120
3174
  function getStream(constraintOpt, { replaceStream, fallback = true } = {}) {
3121
3175
  var _a;
3122
3176
  return __awaiter(this, void 0, void 0, function* () {
@@ -3318,178 +3372,6 @@ function getUpdatedDevices({ oldDevices, newDevices, currentAudioId, currentVide
3318
3372
  return { addedDevices, changedDevices };
3319
3373
  }
3320
3374
 
3321
- var _a$4;
3322
- (_a$4 = adapterRaw.default) !== null && _a$4 !== void 0 ? _a$4 : adapterRaw;
3323
- const RTCSTATS_PROTOCOL_VERSION = "1.0";
3324
- const GETSTATS_BUFFER_SIZE = 20;
3325
- const clientInfo = {
3326
- id: v4$1(),
3327
- connectionNumber: 0,
3328
- };
3329
- const noop = () => { };
3330
- let resetDelta = noop;
3331
- function rtcStatsConnection(wsURL, logger = console) {
3332
- const buffer = [];
3333
- let ws;
3334
- let organizationId;
3335
- let clientId;
3336
- let displayName;
3337
- let userRole;
3338
- let roomSessionId;
3339
- let connectionShouldBeOpen;
3340
- let connectionAttempt = 0;
3341
- let hasPassedOnRoomSessionId = false;
3342
- let getStatsBufferUsed = 0;
3343
- let deviceId;
3344
- let roomProduct;
3345
- let roomMode;
3346
- let sfuServer;
3347
- let featureFlags;
3348
- const connection = {
3349
- connected: false,
3350
- trace: (...args) => {
3351
- args.push(Date.now());
3352
- if (args[0] === "customEvent" && args[2].type === "roomSessionId") {
3353
- const oldRoomSessionIdValue = roomSessionId && roomSessionId[2].value.roomSessionId;
3354
- const newRoomSessionIdValue = args[2].value.roomSessionId;
3355
- roomSessionId = args;
3356
- if (hasPassedOnRoomSessionId &&
3357
- newRoomSessionIdValue &&
3358
- newRoomSessionIdValue !== oldRoomSessionIdValue) {
3359
- ws === null || ws === void 0 ? void 0 : ws.close();
3360
- }
3361
- if (newRoomSessionIdValue)
3362
- hasPassedOnRoomSessionId = true;
3363
- }
3364
- else if (args[0] === "customEvent" && args[2].type === "clientId") {
3365
- clientId = args;
3366
- }
3367
- else if (args[0] === "customEvent" && args[2].type === "organizationId") {
3368
- organizationId = args;
3369
- }
3370
- else if (args[0] === "customEvent" && args[2].type === "displayName") {
3371
- displayName = args;
3372
- }
3373
- else if (args[0] === "customEvent" && args[2].type === "userRole") {
3374
- userRole = args;
3375
- }
3376
- else if (args[0] === "customEvent" && args[2].type === "deviceId") {
3377
- deviceId = args;
3378
- }
3379
- else if (args[0] === "customEvent" && args[2].type === "roomProduct") {
3380
- roomProduct = args;
3381
- }
3382
- else if (args[0] === "customEvent" && args[2].type === "roomMode") {
3383
- roomMode = args;
3384
- }
3385
- else if (args[0] === "customEvent" && args[2].type === "sfuServer") {
3386
- sfuServer = args;
3387
- }
3388
- else if (args[0] === "customEvent" && args[2].type === "featureFlags") {
3389
- featureFlags = args;
3390
- }
3391
- if ((ws === null || ws === void 0 ? void 0 : ws.readyState) === WebSocket.OPEN) {
3392
- connectionAttempt = 0;
3393
- ws.send(JSON.stringify(args));
3394
- }
3395
- else if (args[0] === "getstats") {
3396
- if (getStatsBufferUsed < GETSTATS_BUFFER_SIZE) {
3397
- getStatsBufferUsed++;
3398
- buffer.push(args);
3399
- }
3400
- }
3401
- else if (args[0] === "customEvent" && args[2].type === "insightsStats") ;
3402
- else {
3403
- buffer.push(args);
3404
- }
3405
- if ((ws === null || ws === void 0 ? void 0 : ws.readyState) === WebSocket.CLOSED && connectionShouldBeOpen) {
3406
- setTimeout(() => {
3407
- if (ws.readyState === WebSocket.CLOSED && connectionShouldBeOpen) {
3408
- connection.connect();
3409
- }
3410
- }, 1000 * connectionAttempt);
3411
- }
3412
- },
3413
- close: () => {
3414
- connectionShouldBeOpen = false;
3415
- ws === null || ws === void 0 ? void 0 : ws.close();
3416
- },
3417
- connect: () => {
3418
- connectionShouldBeOpen = true;
3419
- connectionAttempt += 1;
3420
- ws === null || ws === void 0 ? void 0 : ws.close();
3421
- connection.connected = true;
3422
- ws = new WebSocket(wsURL + window.location.pathname, RTCSTATS_PROTOCOL_VERSION);
3423
- ws.onerror = (e) => {
3424
- connection.connected = false;
3425
- logger.warn(`[RTCSTATS] WebSocket error`, e);
3426
- };
3427
- ws.onclose = (e) => {
3428
- connection.connected = false;
3429
- logger.info(`[RTCSTATS] Closed ${e.code}`);
3430
- resetDelta();
3431
- };
3432
- ws.onopen = () => {
3433
- clientInfo.connectionNumber++;
3434
- ws.send(JSON.stringify(["clientInfo", null, clientInfo]));
3435
- if (organizationId) {
3436
- ws.send(JSON.stringify(organizationId));
3437
- }
3438
- if (clientId) {
3439
- ws.send(JSON.stringify(clientId));
3440
- }
3441
- if (roomSessionId) {
3442
- ws.send(JSON.stringify(roomSessionId));
3443
- }
3444
- if (displayName) {
3445
- ws.send(JSON.stringify(displayName));
3446
- }
3447
- if (userRole) {
3448
- ws.send(JSON.stringify(userRole));
3449
- }
3450
- if (deviceId) {
3451
- ws.send(JSON.stringify(deviceId));
3452
- }
3453
- if (roomMode) {
3454
- ws.send(JSON.stringify(roomMode));
3455
- }
3456
- if (roomProduct) {
3457
- ws.send(JSON.stringify(roomProduct));
3458
- }
3459
- if (sfuServer) {
3460
- ws.send(JSON.stringify(sfuServer));
3461
- }
3462
- if (featureFlags) {
3463
- ws.send(JSON.stringify(featureFlags));
3464
- }
3465
- while (buffer.length) {
3466
- ws.send(JSON.stringify(buffer.shift()));
3467
- }
3468
- getStatsBufferUsed = 0;
3469
- };
3470
- },
3471
- };
3472
- return connection;
3473
- }
3474
- const server = rtcStatsConnection(process.env.RTCSTATS_URL || "wss://rtcstats.srv.whereby.com");
3475
- const stats = rtcstats(server.trace, 10000, [""]);
3476
- resetDelta = (stats === null || stats === void 0 ? void 0 : stats.resetDelta) || noop;
3477
- const rtcStats = {
3478
- sendEvent: (type, value) => {
3479
- server.trace("customEvent", null, {
3480
- type,
3481
- value,
3482
- });
3483
- },
3484
- sendAudioMuted: (muted) => {
3485
- rtcStats.sendEvent("audio_muted", { muted });
3486
- },
3487
- sendVideoMuted: (muted) => {
3488
- rtcStats.sendEvent("video_muted", { muted });
3489
- },
3490
- server,
3491
- };
3492
-
3493
3375
  var _a$3;
3494
3376
  const adapter$3 = (_a$3 = adapterRaw.default) !== null && _a$3 !== void 0 ? _a$3 : adapterRaw;
3495
3377
  const logger$5 = new Logger();
@@ -7045,5 +6927,5 @@ var RtcEventNames;
7045
6927
  RtcEventNames["stream_added"] = "stream_added";
7046
6928
  })(RtcEventNames || (RtcEventNames = {}));
7047
6929
 
7048
- export { BandwidthTester, EVENTS, KNOCK_MESSAGES, KalmanFilter, Logger, MAXIMUM_TURN_BANDWIDTH, MAXIMUM_TURN_BANDWIDTH_UNLIMITED, MEDIA_JITTER_BUFFER_TARGET, NoDevicesError, P2pRtcManager, PROTOCOL_ERRORS, PROTOCOL_EVENTS, PROTOCOL_REQUESTS, PROTOCOL_RESPONSES, RELAY_MESSAGES, ReconnectManager, RtcEventNames, RtcManagerDispatcher, RtcStream, STREAM_TYPES, ServerSocket, Session, SfuV2Parser, TYPES, VegaConnection, VegaMediaQualityMonitor, VegaRtcManager, addAbsCaptureTimeExtMap, addExtMap, assert, buildDeviceList, calculateStd, captureAudioSsrcMetrics, captureCandidatePairInfoMetrics, captureCommonSsrcMetrics, captureSsrcInfo, captureVideoSsrcMetrics, changeMediaDirection, cleanSdp, 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, rtcManagerEvents, rtcStats, setClientProvider, setCodecPreferenceSDP, setPeerConnectionsForTests, setVideoBandwidthUsingSetParameters, standardDeviation, startPerformanceMonitor, stopStreamTracks, subscribeIssues, subscribeStats, variance };
6930
+ export { BandwidthTester, EVENTS, KNOCK_MESSAGES, KalmanFilter, Logger, MAXIMUM_TURN_BANDWIDTH, MAXIMUM_TURN_BANDWIDTH_UNLIMITED, MEDIA_JITTER_BUFFER_TARGET, NoDevicesError, P2pRtcManager, PROTOCOL_ERRORS, PROTOCOL_EVENTS, PROTOCOL_REQUESTS, PROTOCOL_RESPONSES, RELAY_MESSAGES, ReconnectManager, RtcEventNames, RtcManagerDispatcher, RtcStream, STREAM_TYPES, ServerSocket, Session, SfuV2Parser, TYPES, VegaConnection, VegaMediaQualityMonitor, VegaRtcManager, addAbsCaptureTimeExtMap, addExtMap, assert, buildDeviceList, calculateStd, captureAudioSsrcMetrics, captureCandidatePairInfoMetrics, captureCommonSsrcMetrics, captureSsrcInfo, captureVideoSsrcMetrics, changeMediaDirection, cleanSdp, compareLocalDevices, createACFCalculator, createMicAnalyser, createWorker, deprioritizeH264, detectMicrophoneNotWorking, enumerate, filterMidExtension, filterMsidSemantic, fromLocation, generateByteString, getConstraints, getCurrentPeerConnections, getDeviceData, getDisplayMedia, getHandler, getIssuesAndMetrics, getMediaConstraints, getMediaSettings, getNumFailedStatsReports, getOptimalBitrate, getPeerConnectionIndex, getStats, getStream, getUpdatedDevices, getUpdatedStats, getUserMedia, hasGetDisplayMedia, ipRegex, isMobile, isRelayed, maybeRejectNoH264, maybeTurnOnly, modifyMediaCapabilities, removePeerConnection, replaceSSRCs, replaceTracksInStream, rtcManagerEvents, rtcStats, setClientProvider, setCodecPreferenceSDP, setPeerConnectionsForTests, setVideoBandwidthUsingSetParameters, standardDeviation, startPerformanceMonitor, stopStreamTracks, subscribeIssues, subscribeStats, variance };
7049
6931
  //# sourceMappingURL=legacy-esm.js.map