@whereby.com/media 2.9.0 → 2.9.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -2091,29 +2091,6 @@ function cleanSdp(sdp) {
2091
2091
  catch (_) { }
2092
2092
  return sdp;
2093
2093
  }
2094
- function maybeRejectNoH264(sdp) {
2095
- if (browserName$2 !== "safari") {
2096
- return sdp;
2097
- }
2098
- const sections = SDPUtils.splitSections(sdp);
2099
- for (let i = 1; i < sections.length; i++) {
2100
- if (SDPUtils.getKind(sections[i]) !== "video") {
2101
- continue;
2102
- }
2103
- const codecs = SDPUtils.matchPrefix(sections[i], "a=rtpmap:")
2104
- .map((line) => {
2105
- return SDPUtils.parseRtpMap(line);
2106
- })
2107
- .map((codec) => {
2108
- return codec.name.toUpperCase();
2109
- });
2110
- if (codecs.indexOf("H264") === -1 &&
2111
- sections[i][8] === "9") {
2112
- sections[i] = sections[i].replace("m=video 9 ", "m=video 0 ");
2113
- }
2114
- }
2115
- return sections.join("");
2116
- }
2117
2094
  function deprioritizeH264(sdp) {
2118
2095
  return SDPUtils.splitSections(sdp)
2119
2096
  .map((section) => {
@@ -2138,8 +2115,7 @@ function deprioritizeH264(sdp) {
2138
2115
  .join("");
2139
2116
  }
2140
2117
  function filterMidExtension(sdp) {
2141
- if (browserName$2 !== "safari" &&
2142
- (browserName$2 !== "firefox" || (browserVersion$1 && browserVersion$1 >= 63) || browserVersion$1 === 60)) {
2118
+ if (browserName$2 !== "firefox" || (browserVersion$1 && browserVersion$1 >= 63) || browserVersion$1 === 60) {
2143
2119
  return sdp;
2144
2120
  }
2145
2121
  return (SDPUtils.splitLines(sdp.trim())
@@ -2153,23 +2129,13 @@ function filterMidExtension(sdp) {
2153
2129
  .join("\r\n") + "\r\n");
2154
2130
  }
2155
2131
  function filterMsidSemantic(sdp) {
2156
- if (browserName$2 !== "firefox") {
2132
+ if (browserName$2 !== "firefox" && browserVersion$1 < 68) {
2157
2133
  return sdp;
2158
2134
  }
2159
2135
  return (SDPUtils.splitLines(sdp.trim())
2160
2136
  .map((line) => (line.startsWith("a=msid-semantic:") ? "a=msid-semantic: WMS *" : line))
2161
2137
  .join("\r\n") + "\r\n");
2162
2138
  }
2163
- function changeMediaDirection(sdp, active) {
2164
- const sections = SDPUtils.splitSections(sdp);
2165
- return (sections.shift() +
2166
- sections
2167
- .map((section) => {
2168
- const currentDirection = SDPUtils.getDirection(section, SDPUtils.getKind(section));
2169
- return section.replace("a=" + currentDirection, "a=" + (active ? "recvonly" : "inactive"));
2170
- })
2171
- .join(""));
2172
- }
2173
2139
  function addExtMap(sdp, extmapUri, modifyAudio = false, modifyVideo = false) {
2174
2140
  var _a, _b;
2175
2141
  try {
@@ -2532,6 +2498,39 @@ class Session {
2532
2498
 
2533
2499
  const MEDIA_JITTER_BUFFER_TARGET = 400;
2534
2500
 
2501
+ var _a$3;
2502
+ const adapter$3 = (_a$3 = adapterRaw.default) !== null && _a$3 !== void 0 ? _a$3 : adapterRaw;
2503
+ function detectMicrophoneNotWorking(pc) {
2504
+ var _a, _b;
2505
+ if (((_a = adapter$3.browserDetails) === null || _a === void 0 ? void 0 : _a.browser) !== "chrome" ||
2506
+ ((_b = adapter$3.browserDetails) === null || _b === void 0 ? void 0 : _b.browser) < 58 ||
2507
+ pc.signalingState === "closed") {
2508
+ return Promise.resolve("");
2509
+ }
2510
+ const sendingAudio = pc.getSenders().some((sender) => { var _a; return ((_a = sender.track) === null || _a === void 0 ? void 0 : _a.kind) === "audio"; });
2511
+ const receivingAudio = pc.getReceivers().some((receiver) => { var _a; return ((_a = receiver.track) === null || _a === void 0 ? void 0 : _a.kind) === "audio"; });
2512
+ return pc.getStats(null).then((result) => {
2513
+ let microphoneFailed = "";
2514
+ result.forEach((report) => {
2515
+ if (report.type === "outbound-rtp" &&
2516
+ (report.kind === "audio" || report.mediaType === "audio") &&
2517
+ sendingAudio) {
2518
+ if (report.bytesSent === 0) {
2519
+ microphoneFailed = "outbound";
2520
+ }
2521
+ }
2522
+ else if (report.type === "inbound-rtp" &&
2523
+ (report.kind === "audio" || report.mediaType === "audio") &&
2524
+ receivingAudio) {
2525
+ if (report.bytesReceived === 0) {
2526
+ microphoneFailed = "inbound";
2527
+ }
2528
+ }
2529
+ });
2530
+ return microphoneFailed;
2531
+ });
2532
+ }
2533
+
2535
2534
  const EVENTS = {
2536
2535
  CLIENT_CONNECTION_STATUS_CHANGED: "client_connection_status_changed",
2537
2536
  STREAM_ADDED: "stream_added",
@@ -2569,15 +2568,12 @@ const STREAM_TYPES = {
2569
2568
  screenshare: "screenshare",
2570
2569
  };
2571
2570
 
2572
- var _a$3, _b$1, _c;
2573
- const adapter$3 = (_a$3 = adapterRaw.default) !== null && _a$3 !== void 0 ? _a$3 : adapterRaw;
2571
+ var _a$2, _b$1;
2572
+ const adapter$2 = (_a$2 = adapterRaw.default) !== null && _a$2 !== void 0 ? _a$2 : adapterRaw;
2574
2573
  const logger$6 = new Logger();
2575
2574
  const ICE_PUBLIC_IP_GATHERING_TIMEOUT = 3 * 1000;
2576
- const browserName$1 = (_b$1 = adapter$3.browserDetails) === null || _b$1 === void 0 ? void 0 : _b$1.browser;
2577
- const browserVersion = adapter$3.browserDetails.version;
2578
- if (browserName$1 === "firefox" && adapter$3.browserShim && "shimGetDisplayMedia" in adapter$3.browserShim) {
2579
- (_c = adapter$3.browserShim) === null || _c === void 0 ? void 0 : _c.shimGetDisplayMedia(window, "screen");
2580
- }
2575
+ const browserName$1 = (_b$1 = adapter$2.browserDetails) === null || _b$1 === void 0 ? void 0 : _b$1.browser;
2576
+ const browserVersion = adapter$2.browserDetails.version;
2581
2577
  let unloading$1 = false;
2582
2578
  if (browserName$1 === "chrome") {
2583
2579
  window.document.addEventListener("beforeunload", () => {
@@ -2641,15 +2637,15 @@ class P2pRtcManager {
2641
2637
  P2PReplaceTrackNewTrackEnded: 0,
2642
2638
  P2PReplaceTrackNewTrackNotInStream: 0,
2643
2639
  P2PReplaceTrackOldTrackNotFound: 0,
2644
- P2PReplaceTrackToPCsPendingActionsNull: 0,
2645
- P2PReplaceTrackReturnedFalse: 0,
2646
2640
  P2PReplaceTrackWithoutPC: 0,
2647
2641
  P2PReplaceTrackSourceKindNotFound: 0,
2648
- P2PRemoveStreamNoPC: 0,
2649
2642
  P2POnTrackNoStream: 0,
2650
2643
  P2PSetCodecPreferenceError: 0,
2651
2644
  P2PCreateOfferNoSDP: 0,
2652
2645
  P2PCreateAnswerNoSDP: 0,
2646
+ P2PMicNotWorking: 0,
2647
+ P2PLocalNetworkFailed: 0,
2648
+ P2PRelayedIceCandidate: 0,
2653
2649
  };
2654
2650
  }
2655
2651
  numberOfPeerconnections() {
@@ -3016,7 +3012,12 @@ class P2pRtcManager {
3016
3012
  if (currentStatus !== newStatus) {
3017
3013
  this._maybeRestartIce(clientId, session);
3018
3014
  }
3019
- if (session.relayCandidateSeen === null && !session.wasEverConnected) {
3015
+ if (!session.relayCandidateSeen && !session.wasEverConnected) {
3016
+ this.analytics.P2PLocalNetworkFailed++;
3017
+ rtcStats.sendEvent("P2PLocalNetworkFailed", {
3018
+ from: "iceConnectionStateChange",
3019
+ clientId,
3020
+ });
3020
3021
  this._emit(rtcManagerEvents.CONNECTION_BLOCKED_BY_NETWORK);
3021
3022
  }
3022
3023
  break;
@@ -3029,10 +3030,26 @@ class P2pRtcManager {
3029
3030
  var _a;
3030
3031
  switch (pc.connectionState) {
3031
3032
  case "connected":
3033
+ setTimeout(() => {
3034
+ detectMicrophoneNotWorking(session.pc).then((failureDirection) => {
3035
+ if (failureDirection) {
3036
+ this.analytics.P2PMicNotWorking++;
3037
+ rtcStats.sendEvent("P2PMicNotWorking", { clientId, failureDirection });
3038
+ }
3039
+ });
3040
+ }, 3000);
3032
3041
  (_a = session.registerConnected) === null || _a === void 0 ? void 0 : _a.call(session, {});
3033
3042
  break;
3034
3043
  case "failed":
3035
3044
  const newStatus = TYPES.CONNECTION_FAILED;
3045
+ if (!session.relayCandidateSeen && !session.wasEverConnected) {
3046
+ this.analytics.P2PLocalNetworkFailed++;
3047
+ rtcStats.sendEvent("P2PLocalNetworkFailed", {
3048
+ from: "connectionStateChange",
3049
+ clientId,
3050
+ });
3051
+ this._emit(rtcManagerEvents.CONNECTION_BLOCKED_BY_NETWORK);
3052
+ }
3036
3053
  this._setConnectionStatus(session, newStatus, clientId);
3037
3054
  break;
3038
3055
  case "closed":
@@ -3384,11 +3401,16 @@ class P2pRtcManager {
3384
3401
  }
3385
3402
  };
3386
3403
  pc.onicecandidate = (event) => {
3387
- var _a, _b;
3388
3404
  if (event.candidate) {
3389
- switch ((_a = event.candidate) === null || _a === void 0 ? void 0 : _a.type) {
3405
+ if (event.candidate.type === "relayed") {
3406
+ this.analytics.P2PRelayedIceCandidate++;
3407
+ }
3408
+ switch (event.candidate.type) {
3390
3409
  case "host":
3391
- const address = (_b = event === null || event === void 0 ? void 0 : event.candidate) === null || _b === void 0 ? void 0 : _b.address;
3410
+ const address = event.candidate.address;
3411
+ if (!address) {
3412
+ break;
3413
+ }
3392
3414
  try {
3393
3415
  if (ipRegex.v4({ exact: true }).test(address)) {
3394
3416
  const ipv4 = checkIp(address);
@@ -3422,8 +3444,8 @@ class P2pRtcManager {
3422
3444
  case "srflx":
3423
3445
  session.serverReflexiveCandidateSeen = true;
3424
3446
  break;
3425
- case "relay":
3426
3447
  case "relayed":
3448
+ case "relay":
3427
3449
  session.relayCandidateSeen = true;
3428
3450
  break;
3429
3451
  }
@@ -4408,10 +4430,10 @@ function createVegaConnectionManager(config) {
4408
4430
  return { connect, updateHostList, networkIsUp, networkIsPossiblyDown };
4409
4431
  }
4410
4432
 
4411
- var _a$2;
4412
- const adapter$2 = (_a$2 = adapterRaw.default) !== null && _a$2 !== void 0 ? _a$2 : adapterRaw;
4433
+ var _a$1;
4434
+ const adapter$1 = (_a$1 = adapterRaw.default) !== null && _a$1 !== void 0 ? _a$1 : adapterRaw;
4413
4435
  const logger$2 = new Logger();
4414
- const browserName = adapter$2.browserDetails.browser;
4436
+ const browserName = adapter$1.browserDetails.browser;
4415
4437
  let unloading = false;
4416
4438
  const RESTARTICE_ERROR_RETRY_THRESHOLD_IN_MS = 3500;
4417
4439
  const RESTARTICE_ERROR_MAX_RETRY_COUNT = 5;
@@ -7022,39 +7044,6 @@ class BandwidthTester extends EventEmitter {
7022
7044
  }
7023
7045
  }
7024
7046
 
7025
- var _a$1;
7026
- const adapter$1 = (_a$1 = adapterRaw.default) !== null && _a$1 !== void 0 ? _a$1 : adapterRaw;
7027
- function detectMicrophoneNotWorking(pc) {
7028
- var _a, _b;
7029
- if (((_a = adapter$1.browserDetails) === null || _a === void 0 ? void 0 : _a.browser) !== "chrome" ||
7030
- ((_b = adapter$1.browserDetails) === null || _b === void 0 ? void 0 : _b.browser) < 58 ||
7031
- pc.signalingState === "closed") {
7032
- return Promise.resolve(false);
7033
- }
7034
- const sendingAudio = pc.getSenders().some((sender) => sender.track && sender.track.kind === "audio");
7035
- const receivingAudio = pc.getReceivers().some((receiver) => receiver.track && receiver.track.kind === "audio");
7036
- return pc.getStats(null).then((result) => {
7037
- let microphoneFailed = false;
7038
- result.forEach((report) => {
7039
- if (report.type === "outbound-rtp" &&
7040
- (report.kind === "audio" || report.mediaType === "audio") &&
7041
- sendingAudio) {
7042
- if (report.bytesSent === 0) {
7043
- microphoneFailed = "outbound";
7044
- }
7045
- }
7046
- else if (report.type === "inbound-rtp" &&
7047
- (report.kind === "audio" || report.mediaType === "audio") &&
7048
- receivingAudio) {
7049
- if (report.bytesReceived === 0) {
7050
- microphoneFailed = "inbound";
7051
- }
7052
- }
7053
- });
7054
- return microphoneFailed;
7055
- });
7056
- }
7057
-
7058
7047
  var _a, _b;
7059
7048
  const adapter = (_a = adapterRaw.default) !== null && _a !== void 0 ? _a : adapterRaw;
7060
7049
  const isSafari = ((_b = adapter.browserDetails) === null || _b === void 0 ? void 0 : _b.browser) === "safari";
@@ -7496,7 +7485,6 @@ exports.captureCandidatePairInfoMetrics = captureCandidatePairInfoMetrics;
7496
7485
  exports.captureCommonSsrcMetrics = captureCommonSsrcMetrics;
7497
7486
  exports.captureSsrcInfo = captureSsrcInfo;
7498
7487
  exports.captureVideoSsrcMetrics = captureVideoSsrcMetrics;
7499
- exports.changeMediaDirection = changeMediaDirection;
7500
7488
  exports.cleanSdp = cleanSdp;
7501
7489
  exports.compareLocalDevices = compareLocalDevices;
7502
7490
  exports.createACFCalculator = createACFCalculator;
@@ -7531,7 +7519,6 @@ exports.hasGetDisplayMedia = hasGetDisplayMedia;
7531
7519
  exports.ipRegex = ipRegex;
7532
7520
  exports.isMobile = isMobile;
7533
7521
  exports.issueDetectorOrMetricEnabled = issueDetectorOrMetricEnabled;
7534
- exports.maybeRejectNoH264 = maybeRejectNoH264;
7535
7522
  exports.maybeTurnOnly = maybeTurnOnly;
7536
7523
  exports.modifyMediaCapabilities = modifyMediaCapabilities;
7537
7524
  exports.removePeerConnection = removePeerConnection;
package/dist/index.d.cts CHANGED
@@ -311,7 +311,7 @@ declare class BandwidthTester extends EventEmitter {
311
311
  _clearTimeouts(): void;
312
312
  }
313
313
 
314
- declare function detectMicrophoneNotWorking(pc: any): any;
314
+ declare function detectMicrophoneNotWorking(pc: RTCPeerConnection): Promise<string>;
315
315
 
316
316
  declare const MEDIA_JITTER_BUFFER_TARGET = 400;
317
317
 
@@ -1245,15 +1245,15 @@ type P2PAnalytics = {
1245
1245
  P2PReplaceTrackNewTrackEnded: number;
1246
1246
  P2PReplaceTrackNewTrackNotInStream: number;
1247
1247
  P2PReplaceTrackOldTrackNotFound: number;
1248
- P2PReplaceTrackToPCsPendingActionsNull: number;
1249
- P2PReplaceTrackReturnedFalse: number;
1250
1248
  P2PReplaceTrackWithoutPC: number;
1251
1249
  P2PReplaceTrackSourceKindNotFound: number;
1252
- P2PRemoveStreamNoPC: number;
1253
1250
  P2POnTrackNoStream: number;
1254
1251
  P2PSetCodecPreferenceError: number;
1255
1252
  P2PCreateOfferNoSDP: number;
1256
1253
  P2PCreateAnswerNoSDP: number;
1254
+ P2PMicNotWorking: number;
1255
+ P2PLocalNetworkFailed: number;
1256
+ P2PRelayedIceCandidate: number;
1257
1257
  };
1258
1258
  type P2PAnalyticMetric = keyof P2PAnalytics;
1259
1259
  type P2PIncrementAnalyticMetric = (metric: P2PAnalyticMetric) => void;
@@ -1417,11 +1417,9 @@ interface SetCodecPreferenceSDPOptions {
1417
1417
  }
1418
1418
  declare function setCodecPreferenceSDP({ sdp, redOn, incrementAnalyticMetric }: SetCodecPreferenceSDPOptions): string;
1419
1419
  declare function cleanSdp(sdp: string): string;
1420
- declare function maybeRejectNoH264(sdp: any): any;
1421
1420
  declare function deprioritizeH264(sdp: any): string;
1422
1421
  declare function filterMidExtension(sdp: any): any;
1423
1422
  declare function filterMsidSemantic(sdp: any): any;
1424
- declare function changeMediaDirection(sdp: any, active: any): string;
1425
1423
  declare function addExtMap(sdp: any, extmapUri: any, modifyAudio?: any, modifyVideo?: any): any;
1426
1424
  declare function addAbsCaptureTimeExtMap(sdp: any): any;
1427
1425
 
@@ -1921,5 +1919,5 @@ declare const STREAM_TYPES: {
1921
1919
  screenshare: string;
1922
1920
  };
1923
1921
 
1924
- export { ADDITIONAL_SCREEN_SHARE_SETTINGS, AUDIO_SETTINGS, BandwidthTester, CAMERA_STREAM_ID, EVENTS, KNOCK_MESSAGES, KalmanFilter, Logger, MEDIA_JITTER_BUFFER_TARGET, NoDevicesError, P2pRtcManager, PROTOCOL_ERRORS, PROTOCOL_EVENTS, PROTOCOL_REQUESTS, PROTOCOL_RESPONSES, RELAY_MESSAGES, ReconnectManager, RtcEventNames, RtcManagerDispatcher, SCREEN_SHARE_SETTINGS, SCREEN_SHARE_SIMULCAST_SETTINGS, STREAM_TYPES, ServerSocket, Session, SfuV2Parser, TYPES, VIDEO_SETTINGS_HD, VIDEO_SETTINGS_SD, VIDEO_SETTINGS_VP9, VIDEO_SETTINGS_VP9_LOW_BANDWIDTH, VegaConnection, VegaMediaQualityMonitor, VegaRtcManager, addAbsCaptureTimeExtMap, addExtMap, assert, buildDeviceList, calculateStd, captureAudioSsrcMetrics, captureCandidatePairInfoMetrics, captureCommonSsrcMetrics, captureSsrcInfo, captureVideoSsrcMetrics, changeMediaDirection, cleanSdp, compareLocalDevices, createACFCalculator, createMicAnalyser, createWorker, deprioritizeH264, detectMicrophoneNotWorking, enumerate, external_stun_servers, filterMidExtension, filterMsidSemantic, fromLocation, generateByteString, getConstraints, getCurrentPeerConnections, getDeviceData, getDisplayMedia, getIssuesAndMetrics, getMediaConstraints, getMediaSettings, getMediasoupDeviceAsync, getNumFailedStatsReports, getNumFailedTrackSsrcLookups, getNumMissingTrackSsrcLookups, getPeerConnectionIndex, getStats, getStream, getUpdatedDevices, getUpdatedStats, getUserMedia, hasGetDisplayMedia, ipRegex, isMobile, issueDetectorOrMetricEnabled, maybeRejectNoH264, maybeTurnOnly, modifyMediaCapabilities, removePeerConnection, replaceTracksInStream, _default as rtcManagerEvents, rtcStats, setClientProvider, setCodecPreferenceSDP, setPeerConnectionsForTests, setVideoBandwidthUsingSetParameters, sortCodecs, standardDeviation, startPerformanceMonitor, stopStreamTracks, subscribeIssues, subscribeStats, trackAnnotations, turnServerOverride, variance };
1922
+ export { ADDITIONAL_SCREEN_SHARE_SETTINGS, AUDIO_SETTINGS, BandwidthTester, CAMERA_STREAM_ID, EVENTS, KNOCK_MESSAGES, KalmanFilter, Logger, MEDIA_JITTER_BUFFER_TARGET, NoDevicesError, P2pRtcManager, PROTOCOL_ERRORS, PROTOCOL_EVENTS, PROTOCOL_REQUESTS, PROTOCOL_RESPONSES, RELAY_MESSAGES, ReconnectManager, RtcEventNames, RtcManagerDispatcher, SCREEN_SHARE_SETTINGS, SCREEN_SHARE_SIMULCAST_SETTINGS, STREAM_TYPES, ServerSocket, Session, SfuV2Parser, TYPES, VIDEO_SETTINGS_HD, VIDEO_SETTINGS_SD, VIDEO_SETTINGS_VP9, VIDEO_SETTINGS_VP9_LOW_BANDWIDTH, VegaConnection, VegaMediaQualityMonitor, VegaRtcManager, addAbsCaptureTimeExtMap, addExtMap, assert, buildDeviceList, calculateStd, captureAudioSsrcMetrics, captureCandidatePairInfoMetrics, captureCommonSsrcMetrics, captureSsrcInfo, captureVideoSsrcMetrics, cleanSdp, compareLocalDevices, createACFCalculator, createMicAnalyser, createWorker, deprioritizeH264, detectMicrophoneNotWorking, enumerate, external_stun_servers, filterMidExtension, filterMsidSemantic, fromLocation, generateByteString, getConstraints, getCurrentPeerConnections, getDeviceData, getDisplayMedia, getIssuesAndMetrics, getMediaConstraints, getMediaSettings, getMediasoupDeviceAsync, getNumFailedStatsReports, getNumFailedTrackSsrcLookups, getNumMissingTrackSsrcLookups, getPeerConnectionIndex, getStats, getStream, getUpdatedDevices, getUpdatedStats, getUserMedia, hasGetDisplayMedia, ipRegex, isMobile, issueDetectorOrMetricEnabled, maybeTurnOnly, modifyMediaCapabilities, removePeerConnection, replaceTracksInStream, _default as rtcManagerEvents, rtcStats, setClientProvider, setCodecPreferenceSDP, setPeerConnectionsForTests, setVideoBandwidthUsingSetParameters, sortCodecs, standardDeviation, startPerformanceMonitor, stopStreamTracks, subscribeIssues, subscribeStats, trackAnnotations, turnServerOverride, variance };
1925
1923
  export type { AddSpotlightRequest, AudioEnableRequest, AudioEnableRequestedEvent, AudioEnabledEvent, BreakoutConfig, BreakoutGroupJoinedEvent, BreakoutSessionUpdatedEvent, CannotJoinUnclaimedRoomError, ChatMessage, ClientKickedEvent, ClientLeftEvent, ClientMetadataPayload, ClientMetadataReceivedEvent, ClientRole, ClientUnableToJoinEvent, CloudRecordingStartedEvent, Codec, Credentials, ForbiddenError, ForbiddenErrorNames, GetConstraintsOptions, GetDeviceDataResult, GetMediaConstraintsOptions, GetStreamOptions, GetStreamResult, GetUpdatedDevicesResult, HostPresenceControlsError, IdentifyDeviceRequest, InternalServerError, InvalidAssistantKeyError, IssuesAndMetricsByView, JoinRoomRequest, KnockAcceptedEvent, KnockRejectedEvent, KnockRoomRequest, KnockerLeftEvent, LiveTranscriptionStartedEvent, LiveTranscriptionStoppedEvent, MaxViewerLimitReachedError, Metric, NewClientEvent, OrganizationAssistantNotEnabledError, OrganizationAssistantNotFoundError, OrganizationPlanExhaustedError, RTCSessionDescription, RemoveSpotlightRequest, RoleName, RoomConcurrencyControlsError, RoomFullError, RoomJoinedErrors, RoomJoinedEvent, RoomJoinedSuccess, RoomKnockedEvent, RoomLockedError, RoomLockedEvent, RoomMeetingTimeExhaustedError, RoomMode, RoomSessionEndedEvent, RtcClientConnectionStatusChangedPayload, RtcEventEmitter, RtcEvents, RtcLocalStreamTrackAddedPayload, RtcLocalStreamTrackRemovedPayload, RtcManager, RtcManagerCreatedPayload, RtcManagerOptions, RtcStreamAddedPayload, SDPRelayMessage, ScreenshareStartedEvent, ScreenshareStoppedEvent, SendClientMetadataRequest, SignalClient, SignalEvents, SignalIceServer, SignalKnocker, SignalMediaServerConfig, SignalRequests, SignalRoom, SignalSFUServer, SignalTurnServer, SocketConf, SocketManager, Spotlight, SpotlightAddedEvent, SpotlightRemovedEvent, StatsMonitorOptions, StatsMonitorState, StatsSubscription, TurnTransportProtocol, UpdatedDeviceInfo, UpdatedDevicesInfo, VegaRtcManagerOptions, VideoEnableRequest, VideoEnableRequestedEvent, VideoEnabledEvent, WebRTCProvider };
package/dist/index.d.mts CHANGED
@@ -311,7 +311,7 @@ declare class BandwidthTester extends EventEmitter {
311
311
  _clearTimeouts(): void;
312
312
  }
313
313
 
314
- declare function detectMicrophoneNotWorking(pc: any): any;
314
+ declare function detectMicrophoneNotWorking(pc: RTCPeerConnection): Promise<string>;
315
315
 
316
316
  declare const MEDIA_JITTER_BUFFER_TARGET = 400;
317
317
 
@@ -1245,15 +1245,15 @@ type P2PAnalytics = {
1245
1245
  P2PReplaceTrackNewTrackEnded: number;
1246
1246
  P2PReplaceTrackNewTrackNotInStream: number;
1247
1247
  P2PReplaceTrackOldTrackNotFound: number;
1248
- P2PReplaceTrackToPCsPendingActionsNull: number;
1249
- P2PReplaceTrackReturnedFalse: number;
1250
1248
  P2PReplaceTrackWithoutPC: number;
1251
1249
  P2PReplaceTrackSourceKindNotFound: number;
1252
- P2PRemoveStreamNoPC: number;
1253
1250
  P2POnTrackNoStream: number;
1254
1251
  P2PSetCodecPreferenceError: number;
1255
1252
  P2PCreateOfferNoSDP: number;
1256
1253
  P2PCreateAnswerNoSDP: number;
1254
+ P2PMicNotWorking: number;
1255
+ P2PLocalNetworkFailed: number;
1256
+ P2PRelayedIceCandidate: number;
1257
1257
  };
1258
1258
  type P2PAnalyticMetric = keyof P2PAnalytics;
1259
1259
  type P2PIncrementAnalyticMetric = (metric: P2PAnalyticMetric) => void;
@@ -1417,11 +1417,9 @@ interface SetCodecPreferenceSDPOptions {
1417
1417
  }
1418
1418
  declare function setCodecPreferenceSDP({ sdp, redOn, incrementAnalyticMetric }: SetCodecPreferenceSDPOptions): string;
1419
1419
  declare function cleanSdp(sdp: string): string;
1420
- declare function maybeRejectNoH264(sdp: any): any;
1421
1420
  declare function deprioritizeH264(sdp: any): string;
1422
1421
  declare function filterMidExtension(sdp: any): any;
1423
1422
  declare function filterMsidSemantic(sdp: any): any;
1424
- declare function changeMediaDirection(sdp: any, active: any): string;
1425
1423
  declare function addExtMap(sdp: any, extmapUri: any, modifyAudio?: any, modifyVideo?: any): any;
1426
1424
  declare function addAbsCaptureTimeExtMap(sdp: any): any;
1427
1425
 
@@ -1921,5 +1919,5 @@ declare const STREAM_TYPES: {
1921
1919
  screenshare: string;
1922
1920
  };
1923
1921
 
1924
- export { ADDITIONAL_SCREEN_SHARE_SETTINGS, AUDIO_SETTINGS, BandwidthTester, CAMERA_STREAM_ID, EVENTS, KNOCK_MESSAGES, KalmanFilter, Logger, MEDIA_JITTER_BUFFER_TARGET, NoDevicesError, P2pRtcManager, PROTOCOL_ERRORS, PROTOCOL_EVENTS, PROTOCOL_REQUESTS, PROTOCOL_RESPONSES, RELAY_MESSAGES, ReconnectManager, RtcEventNames, RtcManagerDispatcher, SCREEN_SHARE_SETTINGS, SCREEN_SHARE_SIMULCAST_SETTINGS, STREAM_TYPES, ServerSocket, Session, SfuV2Parser, TYPES, VIDEO_SETTINGS_HD, VIDEO_SETTINGS_SD, VIDEO_SETTINGS_VP9, VIDEO_SETTINGS_VP9_LOW_BANDWIDTH, VegaConnection, VegaMediaQualityMonitor, VegaRtcManager, addAbsCaptureTimeExtMap, addExtMap, assert, buildDeviceList, calculateStd, captureAudioSsrcMetrics, captureCandidatePairInfoMetrics, captureCommonSsrcMetrics, captureSsrcInfo, captureVideoSsrcMetrics, changeMediaDirection, cleanSdp, compareLocalDevices, createACFCalculator, createMicAnalyser, createWorker, deprioritizeH264, detectMicrophoneNotWorking, enumerate, external_stun_servers, filterMidExtension, filterMsidSemantic, fromLocation, generateByteString, getConstraints, getCurrentPeerConnections, getDeviceData, getDisplayMedia, getIssuesAndMetrics, getMediaConstraints, getMediaSettings, getMediasoupDeviceAsync, getNumFailedStatsReports, getNumFailedTrackSsrcLookups, getNumMissingTrackSsrcLookups, getPeerConnectionIndex, getStats, getStream, getUpdatedDevices, getUpdatedStats, getUserMedia, hasGetDisplayMedia, ipRegex, isMobile, issueDetectorOrMetricEnabled, maybeRejectNoH264, maybeTurnOnly, modifyMediaCapabilities, removePeerConnection, replaceTracksInStream, _default as rtcManagerEvents, rtcStats, setClientProvider, setCodecPreferenceSDP, setPeerConnectionsForTests, setVideoBandwidthUsingSetParameters, sortCodecs, standardDeviation, startPerformanceMonitor, stopStreamTracks, subscribeIssues, subscribeStats, trackAnnotations, turnServerOverride, variance };
1922
+ export { ADDITIONAL_SCREEN_SHARE_SETTINGS, AUDIO_SETTINGS, BandwidthTester, CAMERA_STREAM_ID, EVENTS, KNOCK_MESSAGES, KalmanFilter, Logger, MEDIA_JITTER_BUFFER_TARGET, NoDevicesError, P2pRtcManager, PROTOCOL_ERRORS, PROTOCOL_EVENTS, PROTOCOL_REQUESTS, PROTOCOL_RESPONSES, RELAY_MESSAGES, ReconnectManager, RtcEventNames, RtcManagerDispatcher, SCREEN_SHARE_SETTINGS, SCREEN_SHARE_SIMULCAST_SETTINGS, STREAM_TYPES, ServerSocket, Session, SfuV2Parser, TYPES, VIDEO_SETTINGS_HD, VIDEO_SETTINGS_SD, VIDEO_SETTINGS_VP9, VIDEO_SETTINGS_VP9_LOW_BANDWIDTH, VegaConnection, VegaMediaQualityMonitor, VegaRtcManager, addAbsCaptureTimeExtMap, addExtMap, assert, buildDeviceList, calculateStd, captureAudioSsrcMetrics, captureCandidatePairInfoMetrics, captureCommonSsrcMetrics, captureSsrcInfo, captureVideoSsrcMetrics, cleanSdp, compareLocalDevices, createACFCalculator, createMicAnalyser, createWorker, deprioritizeH264, detectMicrophoneNotWorking, enumerate, external_stun_servers, filterMidExtension, filterMsidSemantic, fromLocation, generateByteString, getConstraints, getCurrentPeerConnections, getDeviceData, getDisplayMedia, getIssuesAndMetrics, getMediaConstraints, getMediaSettings, getMediasoupDeviceAsync, getNumFailedStatsReports, getNumFailedTrackSsrcLookups, getNumMissingTrackSsrcLookups, getPeerConnectionIndex, getStats, getStream, getUpdatedDevices, getUpdatedStats, getUserMedia, hasGetDisplayMedia, ipRegex, isMobile, issueDetectorOrMetricEnabled, maybeTurnOnly, modifyMediaCapabilities, removePeerConnection, replaceTracksInStream, _default as rtcManagerEvents, rtcStats, setClientProvider, setCodecPreferenceSDP, setPeerConnectionsForTests, setVideoBandwidthUsingSetParameters, sortCodecs, standardDeviation, startPerformanceMonitor, stopStreamTracks, subscribeIssues, subscribeStats, trackAnnotations, turnServerOverride, variance };
1925
1923
  export type { AddSpotlightRequest, AudioEnableRequest, AudioEnableRequestedEvent, AudioEnabledEvent, BreakoutConfig, BreakoutGroupJoinedEvent, BreakoutSessionUpdatedEvent, CannotJoinUnclaimedRoomError, ChatMessage, ClientKickedEvent, ClientLeftEvent, ClientMetadataPayload, ClientMetadataReceivedEvent, ClientRole, ClientUnableToJoinEvent, CloudRecordingStartedEvent, Codec, Credentials, ForbiddenError, ForbiddenErrorNames, GetConstraintsOptions, GetDeviceDataResult, GetMediaConstraintsOptions, GetStreamOptions, GetStreamResult, GetUpdatedDevicesResult, HostPresenceControlsError, IdentifyDeviceRequest, InternalServerError, InvalidAssistantKeyError, IssuesAndMetricsByView, JoinRoomRequest, KnockAcceptedEvent, KnockRejectedEvent, KnockRoomRequest, KnockerLeftEvent, LiveTranscriptionStartedEvent, LiveTranscriptionStoppedEvent, MaxViewerLimitReachedError, Metric, NewClientEvent, OrganizationAssistantNotEnabledError, OrganizationAssistantNotFoundError, OrganizationPlanExhaustedError, RTCSessionDescription, RemoveSpotlightRequest, RoleName, RoomConcurrencyControlsError, RoomFullError, RoomJoinedErrors, RoomJoinedEvent, RoomJoinedSuccess, RoomKnockedEvent, RoomLockedError, RoomLockedEvent, RoomMeetingTimeExhaustedError, RoomMode, RoomSessionEndedEvent, RtcClientConnectionStatusChangedPayload, RtcEventEmitter, RtcEvents, RtcLocalStreamTrackAddedPayload, RtcLocalStreamTrackRemovedPayload, RtcManager, RtcManagerCreatedPayload, RtcManagerOptions, RtcStreamAddedPayload, SDPRelayMessage, ScreenshareStartedEvent, ScreenshareStoppedEvent, SendClientMetadataRequest, SignalClient, SignalEvents, SignalIceServer, SignalKnocker, SignalMediaServerConfig, SignalRequests, SignalRoom, SignalSFUServer, SignalTurnServer, SocketConf, SocketManager, Spotlight, SpotlightAddedEvent, SpotlightRemovedEvent, StatsMonitorOptions, StatsMonitorState, StatsSubscription, TurnTransportProtocol, UpdatedDeviceInfo, UpdatedDevicesInfo, VegaRtcManagerOptions, VideoEnableRequest, VideoEnableRequestedEvent, VideoEnabledEvent, WebRTCProvider };
package/dist/index.d.ts CHANGED
@@ -311,7 +311,7 @@ declare class BandwidthTester extends EventEmitter {
311
311
  _clearTimeouts(): void;
312
312
  }
313
313
 
314
- declare function detectMicrophoneNotWorking(pc: any): any;
314
+ declare function detectMicrophoneNotWorking(pc: RTCPeerConnection): Promise<string>;
315
315
 
316
316
  declare const MEDIA_JITTER_BUFFER_TARGET = 400;
317
317
 
@@ -1245,15 +1245,15 @@ type P2PAnalytics = {
1245
1245
  P2PReplaceTrackNewTrackEnded: number;
1246
1246
  P2PReplaceTrackNewTrackNotInStream: number;
1247
1247
  P2PReplaceTrackOldTrackNotFound: number;
1248
- P2PReplaceTrackToPCsPendingActionsNull: number;
1249
- P2PReplaceTrackReturnedFalse: number;
1250
1248
  P2PReplaceTrackWithoutPC: number;
1251
1249
  P2PReplaceTrackSourceKindNotFound: number;
1252
- P2PRemoveStreamNoPC: number;
1253
1250
  P2POnTrackNoStream: number;
1254
1251
  P2PSetCodecPreferenceError: number;
1255
1252
  P2PCreateOfferNoSDP: number;
1256
1253
  P2PCreateAnswerNoSDP: number;
1254
+ P2PMicNotWorking: number;
1255
+ P2PLocalNetworkFailed: number;
1256
+ P2PRelayedIceCandidate: number;
1257
1257
  };
1258
1258
  type P2PAnalyticMetric = keyof P2PAnalytics;
1259
1259
  type P2PIncrementAnalyticMetric = (metric: P2PAnalyticMetric) => void;
@@ -1417,11 +1417,9 @@ interface SetCodecPreferenceSDPOptions {
1417
1417
  }
1418
1418
  declare function setCodecPreferenceSDP({ sdp, redOn, incrementAnalyticMetric }: SetCodecPreferenceSDPOptions): string;
1419
1419
  declare function cleanSdp(sdp: string): string;
1420
- declare function maybeRejectNoH264(sdp: any): any;
1421
1420
  declare function deprioritizeH264(sdp: any): string;
1422
1421
  declare function filterMidExtension(sdp: any): any;
1423
1422
  declare function filterMsidSemantic(sdp: any): any;
1424
- declare function changeMediaDirection(sdp: any, active: any): string;
1425
1423
  declare function addExtMap(sdp: any, extmapUri: any, modifyAudio?: any, modifyVideo?: any): any;
1426
1424
  declare function addAbsCaptureTimeExtMap(sdp: any): any;
1427
1425
 
@@ -1921,5 +1919,5 @@ declare const STREAM_TYPES: {
1921
1919
  screenshare: string;
1922
1920
  };
1923
1921
 
1924
- export { ADDITIONAL_SCREEN_SHARE_SETTINGS, AUDIO_SETTINGS, BandwidthTester, CAMERA_STREAM_ID, EVENTS, KNOCK_MESSAGES, KalmanFilter, Logger, MEDIA_JITTER_BUFFER_TARGET, NoDevicesError, P2pRtcManager, PROTOCOL_ERRORS, PROTOCOL_EVENTS, PROTOCOL_REQUESTS, PROTOCOL_RESPONSES, RELAY_MESSAGES, ReconnectManager, RtcEventNames, RtcManagerDispatcher, SCREEN_SHARE_SETTINGS, SCREEN_SHARE_SIMULCAST_SETTINGS, STREAM_TYPES, ServerSocket, Session, SfuV2Parser, TYPES, VIDEO_SETTINGS_HD, VIDEO_SETTINGS_SD, VIDEO_SETTINGS_VP9, VIDEO_SETTINGS_VP9_LOW_BANDWIDTH, VegaConnection, VegaMediaQualityMonitor, VegaRtcManager, addAbsCaptureTimeExtMap, addExtMap, assert, buildDeviceList, calculateStd, captureAudioSsrcMetrics, captureCandidatePairInfoMetrics, captureCommonSsrcMetrics, captureSsrcInfo, captureVideoSsrcMetrics, changeMediaDirection, cleanSdp, compareLocalDevices, createACFCalculator, createMicAnalyser, createWorker, deprioritizeH264, detectMicrophoneNotWorking, enumerate, external_stun_servers, filterMidExtension, filterMsidSemantic, fromLocation, generateByteString, getConstraints, getCurrentPeerConnections, getDeviceData, getDisplayMedia, getIssuesAndMetrics, getMediaConstraints, getMediaSettings, getMediasoupDeviceAsync, getNumFailedStatsReports, getNumFailedTrackSsrcLookups, getNumMissingTrackSsrcLookups, getPeerConnectionIndex, getStats, getStream, getUpdatedDevices, getUpdatedStats, getUserMedia, hasGetDisplayMedia, ipRegex, isMobile, issueDetectorOrMetricEnabled, maybeRejectNoH264, maybeTurnOnly, modifyMediaCapabilities, removePeerConnection, replaceTracksInStream, _default as rtcManagerEvents, rtcStats, setClientProvider, setCodecPreferenceSDP, setPeerConnectionsForTests, setVideoBandwidthUsingSetParameters, sortCodecs, standardDeviation, startPerformanceMonitor, stopStreamTracks, subscribeIssues, subscribeStats, trackAnnotations, turnServerOverride, variance };
1922
+ export { ADDITIONAL_SCREEN_SHARE_SETTINGS, AUDIO_SETTINGS, BandwidthTester, CAMERA_STREAM_ID, EVENTS, KNOCK_MESSAGES, KalmanFilter, Logger, MEDIA_JITTER_BUFFER_TARGET, NoDevicesError, P2pRtcManager, PROTOCOL_ERRORS, PROTOCOL_EVENTS, PROTOCOL_REQUESTS, PROTOCOL_RESPONSES, RELAY_MESSAGES, ReconnectManager, RtcEventNames, RtcManagerDispatcher, SCREEN_SHARE_SETTINGS, SCREEN_SHARE_SIMULCAST_SETTINGS, STREAM_TYPES, ServerSocket, Session, SfuV2Parser, TYPES, VIDEO_SETTINGS_HD, VIDEO_SETTINGS_SD, VIDEO_SETTINGS_VP9, VIDEO_SETTINGS_VP9_LOW_BANDWIDTH, VegaConnection, VegaMediaQualityMonitor, VegaRtcManager, addAbsCaptureTimeExtMap, addExtMap, assert, buildDeviceList, calculateStd, captureAudioSsrcMetrics, captureCandidatePairInfoMetrics, captureCommonSsrcMetrics, captureSsrcInfo, captureVideoSsrcMetrics, cleanSdp, compareLocalDevices, createACFCalculator, createMicAnalyser, createWorker, deprioritizeH264, detectMicrophoneNotWorking, enumerate, external_stun_servers, filterMidExtension, filterMsidSemantic, fromLocation, generateByteString, getConstraints, getCurrentPeerConnections, getDeviceData, getDisplayMedia, getIssuesAndMetrics, getMediaConstraints, getMediaSettings, getMediasoupDeviceAsync, getNumFailedStatsReports, getNumFailedTrackSsrcLookups, getNumMissingTrackSsrcLookups, getPeerConnectionIndex, getStats, getStream, getUpdatedDevices, getUpdatedStats, getUserMedia, hasGetDisplayMedia, ipRegex, isMobile, issueDetectorOrMetricEnabled, maybeTurnOnly, modifyMediaCapabilities, removePeerConnection, replaceTracksInStream, _default as rtcManagerEvents, rtcStats, setClientProvider, setCodecPreferenceSDP, setPeerConnectionsForTests, setVideoBandwidthUsingSetParameters, sortCodecs, standardDeviation, startPerformanceMonitor, stopStreamTracks, subscribeIssues, subscribeStats, trackAnnotations, turnServerOverride, variance };
1925
1923
  export type { AddSpotlightRequest, AudioEnableRequest, AudioEnableRequestedEvent, AudioEnabledEvent, BreakoutConfig, BreakoutGroupJoinedEvent, BreakoutSessionUpdatedEvent, CannotJoinUnclaimedRoomError, ChatMessage, ClientKickedEvent, ClientLeftEvent, ClientMetadataPayload, ClientMetadataReceivedEvent, ClientRole, ClientUnableToJoinEvent, CloudRecordingStartedEvent, Codec, Credentials, ForbiddenError, ForbiddenErrorNames, GetConstraintsOptions, GetDeviceDataResult, GetMediaConstraintsOptions, GetStreamOptions, GetStreamResult, GetUpdatedDevicesResult, HostPresenceControlsError, IdentifyDeviceRequest, InternalServerError, InvalidAssistantKeyError, IssuesAndMetricsByView, JoinRoomRequest, KnockAcceptedEvent, KnockRejectedEvent, KnockRoomRequest, KnockerLeftEvent, LiveTranscriptionStartedEvent, LiveTranscriptionStoppedEvent, MaxViewerLimitReachedError, Metric, NewClientEvent, OrganizationAssistantNotEnabledError, OrganizationAssistantNotFoundError, OrganizationPlanExhaustedError, RTCSessionDescription, RemoveSpotlightRequest, RoleName, RoomConcurrencyControlsError, RoomFullError, RoomJoinedErrors, RoomJoinedEvent, RoomJoinedSuccess, RoomKnockedEvent, RoomLockedError, RoomLockedEvent, RoomMeetingTimeExhaustedError, RoomMode, RoomSessionEndedEvent, RtcClientConnectionStatusChangedPayload, RtcEventEmitter, RtcEvents, RtcLocalStreamTrackAddedPayload, RtcLocalStreamTrackRemovedPayload, RtcManager, RtcManagerCreatedPayload, RtcManagerOptions, RtcStreamAddedPayload, SDPRelayMessage, ScreenshareStartedEvent, ScreenshareStoppedEvent, SendClientMetadataRequest, SignalClient, SignalEvents, SignalIceServer, SignalKnocker, SignalMediaServerConfig, SignalRequests, SignalRoom, SignalSFUServer, SignalTurnServer, SocketConf, SocketManager, Spotlight, SpotlightAddedEvent, SpotlightRemovedEvent, StatsMonitorOptions, StatsMonitorState, StatsSubscription, TurnTransportProtocol, UpdatedDeviceInfo, UpdatedDevicesInfo, VegaRtcManagerOptions, VideoEnableRequest, VideoEnableRequestedEvent, VideoEnabledEvent, WebRTCProvider };
package/dist/index.mjs CHANGED
@@ -2070,29 +2070,6 @@ function cleanSdp(sdp) {
2070
2070
  catch (_) { }
2071
2071
  return sdp;
2072
2072
  }
2073
- function maybeRejectNoH264(sdp) {
2074
- if (browserName$2 !== "safari") {
2075
- return sdp;
2076
- }
2077
- const sections = SDPUtils.splitSections(sdp);
2078
- for (let i = 1; i < sections.length; i++) {
2079
- if (SDPUtils.getKind(sections[i]) !== "video") {
2080
- continue;
2081
- }
2082
- const codecs = SDPUtils.matchPrefix(sections[i], "a=rtpmap:")
2083
- .map((line) => {
2084
- return SDPUtils.parseRtpMap(line);
2085
- })
2086
- .map((codec) => {
2087
- return codec.name.toUpperCase();
2088
- });
2089
- if (codecs.indexOf("H264") === -1 &&
2090
- sections[i][8] === "9") {
2091
- sections[i] = sections[i].replace("m=video 9 ", "m=video 0 ");
2092
- }
2093
- }
2094
- return sections.join("");
2095
- }
2096
2073
  function deprioritizeH264(sdp) {
2097
2074
  return SDPUtils.splitSections(sdp)
2098
2075
  .map((section) => {
@@ -2117,8 +2094,7 @@ function deprioritizeH264(sdp) {
2117
2094
  .join("");
2118
2095
  }
2119
2096
  function filterMidExtension(sdp) {
2120
- if (browserName$2 !== "safari" &&
2121
- (browserName$2 !== "firefox" || (browserVersion$1 && browserVersion$1 >= 63) || browserVersion$1 === 60)) {
2097
+ if (browserName$2 !== "firefox" || (browserVersion$1 && browserVersion$1 >= 63) || browserVersion$1 === 60) {
2122
2098
  return sdp;
2123
2099
  }
2124
2100
  return (SDPUtils.splitLines(sdp.trim())
@@ -2132,23 +2108,13 @@ function filterMidExtension(sdp) {
2132
2108
  .join("\r\n") + "\r\n");
2133
2109
  }
2134
2110
  function filterMsidSemantic(sdp) {
2135
- if (browserName$2 !== "firefox") {
2111
+ if (browserName$2 !== "firefox" && browserVersion$1 < 68) {
2136
2112
  return sdp;
2137
2113
  }
2138
2114
  return (SDPUtils.splitLines(sdp.trim())
2139
2115
  .map((line) => (line.startsWith("a=msid-semantic:") ? "a=msid-semantic: WMS *" : line))
2140
2116
  .join("\r\n") + "\r\n");
2141
2117
  }
2142
- function changeMediaDirection(sdp, active) {
2143
- const sections = SDPUtils.splitSections(sdp);
2144
- return (sections.shift() +
2145
- sections
2146
- .map((section) => {
2147
- const currentDirection = SDPUtils.getDirection(section, SDPUtils.getKind(section));
2148
- return section.replace("a=" + currentDirection, "a=" + (active ? "recvonly" : "inactive"));
2149
- })
2150
- .join(""));
2151
- }
2152
2118
  function addExtMap(sdp, extmapUri, modifyAudio = false, modifyVideo = false) {
2153
2119
  var _a, _b;
2154
2120
  try {
@@ -2511,6 +2477,39 @@ class Session {
2511
2477
 
2512
2478
  const MEDIA_JITTER_BUFFER_TARGET = 400;
2513
2479
 
2480
+ var _a$3;
2481
+ const adapter$3 = (_a$3 = adapterRaw.default) !== null && _a$3 !== void 0 ? _a$3 : adapterRaw;
2482
+ function detectMicrophoneNotWorking(pc) {
2483
+ var _a, _b;
2484
+ if (((_a = adapter$3.browserDetails) === null || _a === void 0 ? void 0 : _a.browser) !== "chrome" ||
2485
+ ((_b = adapter$3.browserDetails) === null || _b === void 0 ? void 0 : _b.browser) < 58 ||
2486
+ pc.signalingState === "closed") {
2487
+ return Promise.resolve("");
2488
+ }
2489
+ const sendingAudio = pc.getSenders().some((sender) => { var _a; return ((_a = sender.track) === null || _a === void 0 ? void 0 : _a.kind) === "audio"; });
2490
+ const receivingAudio = pc.getReceivers().some((receiver) => { var _a; return ((_a = receiver.track) === null || _a === void 0 ? void 0 : _a.kind) === "audio"; });
2491
+ return pc.getStats(null).then((result) => {
2492
+ let microphoneFailed = "";
2493
+ result.forEach((report) => {
2494
+ if (report.type === "outbound-rtp" &&
2495
+ (report.kind === "audio" || report.mediaType === "audio") &&
2496
+ sendingAudio) {
2497
+ if (report.bytesSent === 0) {
2498
+ microphoneFailed = "outbound";
2499
+ }
2500
+ }
2501
+ else if (report.type === "inbound-rtp" &&
2502
+ (report.kind === "audio" || report.mediaType === "audio") &&
2503
+ receivingAudio) {
2504
+ if (report.bytesReceived === 0) {
2505
+ microphoneFailed = "inbound";
2506
+ }
2507
+ }
2508
+ });
2509
+ return microphoneFailed;
2510
+ });
2511
+ }
2512
+
2514
2513
  const EVENTS = {
2515
2514
  CLIENT_CONNECTION_STATUS_CHANGED: "client_connection_status_changed",
2516
2515
  STREAM_ADDED: "stream_added",
@@ -2548,15 +2547,12 @@ const STREAM_TYPES = {
2548
2547
  screenshare: "screenshare",
2549
2548
  };
2550
2549
 
2551
- var _a$3, _b$1, _c;
2552
- const adapter$3 = (_a$3 = adapterRaw.default) !== null && _a$3 !== void 0 ? _a$3 : adapterRaw;
2550
+ var _a$2, _b$1;
2551
+ const adapter$2 = (_a$2 = adapterRaw.default) !== null && _a$2 !== void 0 ? _a$2 : adapterRaw;
2553
2552
  const logger$6 = new Logger();
2554
2553
  const ICE_PUBLIC_IP_GATHERING_TIMEOUT = 3 * 1000;
2555
- const browserName$1 = (_b$1 = adapter$3.browserDetails) === null || _b$1 === void 0 ? void 0 : _b$1.browser;
2556
- const browserVersion = adapter$3.browserDetails.version;
2557
- if (browserName$1 === "firefox" && adapter$3.browserShim && "shimGetDisplayMedia" in adapter$3.browserShim) {
2558
- (_c = adapter$3.browserShim) === null || _c === void 0 ? void 0 : _c.shimGetDisplayMedia(window, "screen");
2559
- }
2554
+ const browserName$1 = (_b$1 = adapter$2.browserDetails) === null || _b$1 === void 0 ? void 0 : _b$1.browser;
2555
+ const browserVersion = adapter$2.browserDetails.version;
2560
2556
  let unloading$1 = false;
2561
2557
  if (browserName$1 === "chrome") {
2562
2558
  window.document.addEventListener("beforeunload", () => {
@@ -2620,15 +2616,15 @@ class P2pRtcManager {
2620
2616
  P2PReplaceTrackNewTrackEnded: 0,
2621
2617
  P2PReplaceTrackNewTrackNotInStream: 0,
2622
2618
  P2PReplaceTrackOldTrackNotFound: 0,
2623
- P2PReplaceTrackToPCsPendingActionsNull: 0,
2624
- P2PReplaceTrackReturnedFalse: 0,
2625
2619
  P2PReplaceTrackWithoutPC: 0,
2626
2620
  P2PReplaceTrackSourceKindNotFound: 0,
2627
- P2PRemoveStreamNoPC: 0,
2628
2621
  P2POnTrackNoStream: 0,
2629
2622
  P2PSetCodecPreferenceError: 0,
2630
2623
  P2PCreateOfferNoSDP: 0,
2631
2624
  P2PCreateAnswerNoSDP: 0,
2625
+ P2PMicNotWorking: 0,
2626
+ P2PLocalNetworkFailed: 0,
2627
+ P2PRelayedIceCandidate: 0,
2632
2628
  };
2633
2629
  }
2634
2630
  numberOfPeerconnections() {
@@ -2995,7 +2991,12 @@ class P2pRtcManager {
2995
2991
  if (currentStatus !== newStatus) {
2996
2992
  this._maybeRestartIce(clientId, session);
2997
2993
  }
2998
- if (session.relayCandidateSeen === null && !session.wasEverConnected) {
2994
+ if (!session.relayCandidateSeen && !session.wasEverConnected) {
2995
+ this.analytics.P2PLocalNetworkFailed++;
2996
+ rtcStats.sendEvent("P2PLocalNetworkFailed", {
2997
+ from: "iceConnectionStateChange",
2998
+ clientId,
2999
+ });
2999
3000
  this._emit(rtcManagerEvents.CONNECTION_BLOCKED_BY_NETWORK);
3000
3001
  }
3001
3002
  break;
@@ -3008,10 +3009,26 @@ class P2pRtcManager {
3008
3009
  var _a;
3009
3010
  switch (pc.connectionState) {
3010
3011
  case "connected":
3012
+ setTimeout(() => {
3013
+ detectMicrophoneNotWorking(session.pc).then((failureDirection) => {
3014
+ if (failureDirection) {
3015
+ this.analytics.P2PMicNotWorking++;
3016
+ rtcStats.sendEvent("P2PMicNotWorking", { clientId, failureDirection });
3017
+ }
3018
+ });
3019
+ }, 3000);
3011
3020
  (_a = session.registerConnected) === null || _a === void 0 ? void 0 : _a.call(session, {});
3012
3021
  break;
3013
3022
  case "failed":
3014
3023
  const newStatus = TYPES.CONNECTION_FAILED;
3024
+ if (!session.relayCandidateSeen && !session.wasEverConnected) {
3025
+ this.analytics.P2PLocalNetworkFailed++;
3026
+ rtcStats.sendEvent("P2PLocalNetworkFailed", {
3027
+ from: "connectionStateChange",
3028
+ clientId,
3029
+ });
3030
+ this._emit(rtcManagerEvents.CONNECTION_BLOCKED_BY_NETWORK);
3031
+ }
3015
3032
  this._setConnectionStatus(session, newStatus, clientId);
3016
3033
  break;
3017
3034
  case "closed":
@@ -3363,11 +3380,16 @@ class P2pRtcManager {
3363
3380
  }
3364
3381
  };
3365
3382
  pc.onicecandidate = (event) => {
3366
- var _a, _b;
3367
3383
  if (event.candidate) {
3368
- switch ((_a = event.candidate) === null || _a === void 0 ? void 0 : _a.type) {
3384
+ if (event.candidate.type === "relayed") {
3385
+ this.analytics.P2PRelayedIceCandidate++;
3386
+ }
3387
+ switch (event.candidate.type) {
3369
3388
  case "host":
3370
- const address = (_b = event === null || event === void 0 ? void 0 : event.candidate) === null || _b === void 0 ? void 0 : _b.address;
3389
+ const address = event.candidate.address;
3390
+ if (!address) {
3391
+ break;
3392
+ }
3371
3393
  try {
3372
3394
  if (ipRegex.v4({ exact: true }).test(address)) {
3373
3395
  const ipv4 = checkIp(address);
@@ -3401,8 +3423,8 @@ class P2pRtcManager {
3401
3423
  case "srflx":
3402
3424
  session.serverReflexiveCandidateSeen = true;
3403
3425
  break;
3404
- case "relay":
3405
3426
  case "relayed":
3427
+ case "relay":
3406
3428
  session.relayCandidateSeen = true;
3407
3429
  break;
3408
3430
  }
@@ -4387,10 +4409,10 @@ function createVegaConnectionManager(config) {
4387
4409
  return { connect, updateHostList, networkIsUp, networkIsPossiblyDown };
4388
4410
  }
4389
4411
 
4390
- var _a$2;
4391
- const adapter$2 = (_a$2 = adapterRaw.default) !== null && _a$2 !== void 0 ? _a$2 : adapterRaw;
4412
+ var _a$1;
4413
+ const adapter$1 = (_a$1 = adapterRaw.default) !== null && _a$1 !== void 0 ? _a$1 : adapterRaw;
4392
4414
  const logger$2 = new Logger();
4393
- const browserName = adapter$2.browserDetails.browser;
4415
+ const browserName = adapter$1.browserDetails.browser;
4394
4416
  let unloading = false;
4395
4417
  const RESTARTICE_ERROR_RETRY_THRESHOLD_IN_MS = 3500;
4396
4418
  const RESTARTICE_ERROR_MAX_RETRY_COUNT = 5;
@@ -7001,39 +7023,6 @@ class BandwidthTester extends EventEmitter {
7001
7023
  }
7002
7024
  }
7003
7025
 
7004
- var _a$1;
7005
- const adapter$1 = (_a$1 = adapterRaw.default) !== null && _a$1 !== void 0 ? _a$1 : adapterRaw;
7006
- function detectMicrophoneNotWorking(pc) {
7007
- var _a, _b;
7008
- if (((_a = adapter$1.browserDetails) === null || _a === void 0 ? void 0 : _a.browser) !== "chrome" ||
7009
- ((_b = adapter$1.browserDetails) === null || _b === void 0 ? void 0 : _b.browser) < 58 ||
7010
- pc.signalingState === "closed") {
7011
- return Promise.resolve(false);
7012
- }
7013
- const sendingAudio = pc.getSenders().some((sender) => sender.track && sender.track.kind === "audio");
7014
- const receivingAudio = pc.getReceivers().some((receiver) => receiver.track && receiver.track.kind === "audio");
7015
- return pc.getStats(null).then((result) => {
7016
- let microphoneFailed = false;
7017
- result.forEach((report) => {
7018
- if (report.type === "outbound-rtp" &&
7019
- (report.kind === "audio" || report.mediaType === "audio") &&
7020
- sendingAudio) {
7021
- if (report.bytesSent === 0) {
7022
- microphoneFailed = "outbound";
7023
- }
7024
- }
7025
- else if (report.type === "inbound-rtp" &&
7026
- (report.kind === "audio" || report.mediaType === "audio") &&
7027
- receivingAudio) {
7028
- if (report.bytesReceived === 0) {
7029
- microphoneFailed = "inbound";
7030
- }
7031
- }
7032
- });
7033
- return microphoneFailed;
7034
- });
7035
- }
7036
-
7037
7026
  var _a, _b;
7038
7027
  const adapter = (_a = adapterRaw.default) !== null && _a !== void 0 ? _a : adapterRaw;
7039
7028
  const isSafari = ((_b = adapter.browserDetails) === null || _b === void 0 ? void 0 : _b.browser) === "safari";
@@ -7433,4 +7422,4 @@ var RtcEventNames;
7433
7422
  RtcEventNames["stream_added"] = "stream_added";
7434
7423
  })(RtcEventNames || (RtcEventNames = {}));
7435
7424
 
7436
- export { ADDITIONAL_SCREEN_SHARE_SETTINGS, AUDIO_SETTINGS, BandwidthTester, CAMERA_STREAM_ID, EVENTS, KNOCK_MESSAGES, KalmanFilter, Logger, MEDIA_JITTER_BUFFER_TARGET, NoDevicesError, P2pRtcManager, PROTOCOL_ERRORS, PROTOCOL_EVENTS, PROTOCOL_REQUESTS, PROTOCOL_RESPONSES, RELAY_MESSAGES, ReconnectManager, RtcEventNames, RtcManagerDispatcher, SCREEN_SHARE_SETTINGS, SCREEN_SHARE_SIMULCAST_SETTINGS, STREAM_TYPES, ServerSocket, Session, SfuV2Parser, TYPES, VIDEO_SETTINGS_HD, VIDEO_SETTINGS_SD, VIDEO_SETTINGS_VP9, VIDEO_SETTINGS_VP9_LOW_BANDWIDTH, VegaConnection, VegaMediaQualityMonitor, VegaRtcManager, addAbsCaptureTimeExtMap, addExtMap, assert, buildDeviceList, calculateStd, captureAudioSsrcMetrics, captureCandidatePairInfoMetrics, captureCommonSsrcMetrics, captureSsrcInfo, captureVideoSsrcMetrics, changeMediaDirection, cleanSdp, compareLocalDevices, createACFCalculator, createMicAnalyser, createWorker, deprioritizeH264, detectMicrophoneNotWorking, enumerate, external_stun_servers, filterMidExtension, filterMsidSemantic, fromLocation, generateByteString, getConstraints, getCurrentPeerConnections, getDeviceData, getDisplayMedia, getIssuesAndMetrics, getMediaConstraints, getMediaSettings, getMediasoupDeviceAsync, getNumFailedStatsReports, getNumFailedTrackSsrcLookups, getNumMissingTrackSsrcLookups, getPeerConnectionIndex, getStats, getStream, getUpdatedDevices, getUpdatedStats, getUserMedia, hasGetDisplayMedia, ipRegex, isMobile, issueDetectorOrMetricEnabled, maybeRejectNoH264, maybeTurnOnly, modifyMediaCapabilities, removePeerConnection, replaceTracksInStream, rtcManagerEvents, rtcStats, setClientProvider, setCodecPreferenceSDP, setPeerConnectionsForTests, setVideoBandwidthUsingSetParameters, sortCodecs, standardDeviation, startPerformanceMonitor, stopStreamTracks, subscribeIssues, subscribeStats, trackAnnotations, turnServerOverride, variance };
7425
+ export { ADDITIONAL_SCREEN_SHARE_SETTINGS, AUDIO_SETTINGS, BandwidthTester, CAMERA_STREAM_ID, EVENTS, KNOCK_MESSAGES, KalmanFilter, Logger, MEDIA_JITTER_BUFFER_TARGET, NoDevicesError, P2pRtcManager, PROTOCOL_ERRORS, PROTOCOL_EVENTS, PROTOCOL_REQUESTS, PROTOCOL_RESPONSES, RELAY_MESSAGES, ReconnectManager, RtcEventNames, RtcManagerDispatcher, SCREEN_SHARE_SETTINGS, SCREEN_SHARE_SIMULCAST_SETTINGS, STREAM_TYPES, ServerSocket, Session, SfuV2Parser, TYPES, VIDEO_SETTINGS_HD, VIDEO_SETTINGS_SD, VIDEO_SETTINGS_VP9, VIDEO_SETTINGS_VP9_LOW_BANDWIDTH, VegaConnection, VegaMediaQualityMonitor, VegaRtcManager, addAbsCaptureTimeExtMap, addExtMap, assert, buildDeviceList, calculateStd, captureAudioSsrcMetrics, captureCandidatePairInfoMetrics, captureCommonSsrcMetrics, captureSsrcInfo, captureVideoSsrcMetrics, cleanSdp, compareLocalDevices, createACFCalculator, createMicAnalyser, createWorker, deprioritizeH264, detectMicrophoneNotWorking, enumerate, external_stun_servers, filterMidExtension, filterMsidSemantic, fromLocation, generateByteString, getConstraints, getCurrentPeerConnections, getDeviceData, getDisplayMedia, getIssuesAndMetrics, getMediaConstraints, getMediaSettings, getMediasoupDeviceAsync, getNumFailedStatsReports, getNumFailedTrackSsrcLookups, getNumMissingTrackSsrcLookups, getPeerConnectionIndex, getStats, getStream, getUpdatedDevices, getUpdatedStats, getUserMedia, hasGetDisplayMedia, ipRegex, isMobile, issueDetectorOrMetricEnabled, maybeTurnOnly, modifyMediaCapabilities, removePeerConnection, replaceTracksInStream, rtcManagerEvents, rtcStats, setClientProvider, setCodecPreferenceSDP, setPeerConnectionsForTests, setVideoBandwidthUsingSetParameters, sortCodecs, standardDeviation, startPerformanceMonitor, stopStreamTracks, subscribeIssues, subscribeStats, trackAnnotations, turnServerOverride, variance };
@@ -2070,29 +2070,6 @@ function cleanSdp(sdp) {
2070
2070
  catch (_) { }
2071
2071
  return sdp;
2072
2072
  }
2073
- function maybeRejectNoH264(sdp) {
2074
- if (browserName$2 !== "safari") {
2075
- return sdp;
2076
- }
2077
- const sections = SDPUtils.splitSections(sdp);
2078
- for (let i = 1; i < sections.length; i++) {
2079
- if (SDPUtils.getKind(sections[i]) !== "video") {
2080
- continue;
2081
- }
2082
- const codecs = SDPUtils.matchPrefix(sections[i], "a=rtpmap:")
2083
- .map((line) => {
2084
- return SDPUtils.parseRtpMap(line);
2085
- })
2086
- .map((codec) => {
2087
- return codec.name.toUpperCase();
2088
- });
2089
- if (codecs.indexOf("H264") === -1 &&
2090
- sections[i][8] === "9") {
2091
- sections[i] = sections[i].replace("m=video 9 ", "m=video 0 ");
2092
- }
2093
- }
2094
- return sections.join("");
2095
- }
2096
2073
  function deprioritizeH264(sdp) {
2097
2074
  return SDPUtils.splitSections(sdp)
2098
2075
  .map((section) => {
@@ -2117,8 +2094,7 @@ function deprioritizeH264(sdp) {
2117
2094
  .join("");
2118
2095
  }
2119
2096
  function filterMidExtension(sdp) {
2120
- if (browserName$2 !== "safari" &&
2121
- (browserName$2 !== "firefox" || (browserVersion$1 && browserVersion$1 >= 63) || browserVersion$1 === 60)) {
2097
+ if (browserName$2 !== "firefox" || (browserVersion$1 && browserVersion$1 >= 63) || browserVersion$1 === 60) {
2122
2098
  return sdp;
2123
2099
  }
2124
2100
  return (SDPUtils.splitLines(sdp.trim())
@@ -2132,23 +2108,13 @@ function filterMidExtension(sdp) {
2132
2108
  .join("\r\n") + "\r\n");
2133
2109
  }
2134
2110
  function filterMsidSemantic(sdp) {
2135
- if (browserName$2 !== "firefox") {
2111
+ if (browserName$2 !== "firefox" && browserVersion$1 < 68) {
2136
2112
  return sdp;
2137
2113
  }
2138
2114
  return (SDPUtils.splitLines(sdp.trim())
2139
2115
  .map((line) => (line.startsWith("a=msid-semantic:") ? "a=msid-semantic: WMS *" : line))
2140
2116
  .join("\r\n") + "\r\n");
2141
2117
  }
2142
- function changeMediaDirection(sdp, active) {
2143
- const sections = SDPUtils.splitSections(sdp);
2144
- return (sections.shift() +
2145
- sections
2146
- .map((section) => {
2147
- const currentDirection = SDPUtils.getDirection(section, SDPUtils.getKind(section));
2148
- return section.replace("a=" + currentDirection, "a=" + (active ? "recvonly" : "inactive"));
2149
- })
2150
- .join(""));
2151
- }
2152
2118
  function addExtMap(sdp, extmapUri, modifyAudio = false, modifyVideo = false) {
2153
2119
  var _a, _b;
2154
2120
  try {
@@ -2511,6 +2477,39 @@ class Session {
2511
2477
 
2512
2478
  const MEDIA_JITTER_BUFFER_TARGET = 400;
2513
2479
 
2480
+ var _a$3;
2481
+ const adapter$3 = (_a$3 = adapterRaw.default) !== null && _a$3 !== void 0 ? _a$3 : adapterRaw;
2482
+ function detectMicrophoneNotWorking(pc) {
2483
+ var _a, _b;
2484
+ if (((_a = adapter$3.browserDetails) === null || _a === void 0 ? void 0 : _a.browser) !== "chrome" ||
2485
+ ((_b = adapter$3.browserDetails) === null || _b === void 0 ? void 0 : _b.browser) < 58 ||
2486
+ pc.signalingState === "closed") {
2487
+ return Promise.resolve("");
2488
+ }
2489
+ const sendingAudio = pc.getSenders().some((sender) => { var _a; return ((_a = sender.track) === null || _a === void 0 ? void 0 : _a.kind) === "audio"; });
2490
+ const receivingAudio = pc.getReceivers().some((receiver) => { var _a; return ((_a = receiver.track) === null || _a === void 0 ? void 0 : _a.kind) === "audio"; });
2491
+ return pc.getStats(null).then((result) => {
2492
+ let microphoneFailed = "";
2493
+ result.forEach((report) => {
2494
+ if (report.type === "outbound-rtp" &&
2495
+ (report.kind === "audio" || report.mediaType === "audio") &&
2496
+ sendingAudio) {
2497
+ if (report.bytesSent === 0) {
2498
+ microphoneFailed = "outbound";
2499
+ }
2500
+ }
2501
+ else if (report.type === "inbound-rtp" &&
2502
+ (report.kind === "audio" || report.mediaType === "audio") &&
2503
+ receivingAudio) {
2504
+ if (report.bytesReceived === 0) {
2505
+ microphoneFailed = "inbound";
2506
+ }
2507
+ }
2508
+ });
2509
+ return microphoneFailed;
2510
+ });
2511
+ }
2512
+
2514
2513
  const EVENTS = {
2515
2514
  CLIENT_CONNECTION_STATUS_CHANGED: "client_connection_status_changed",
2516
2515
  STREAM_ADDED: "stream_added",
@@ -2548,15 +2547,12 @@ const STREAM_TYPES = {
2548
2547
  screenshare: "screenshare",
2549
2548
  };
2550
2549
 
2551
- var _a$3, _b$1, _c;
2552
- const adapter$3 = (_a$3 = adapterRaw.default) !== null && _a$3 !== void 0 ? _a$3 : adapterRaw;
2550
+ var _a$2, _b$1;
2551
+ const adapter$2 = (_a$2 = adapterRaw.default) !== null && _a$2 !== void 0 ? _a$2 : adapterRaw;
2553
2552
  const logger$6 = new Logger();
2554
2553
  const ICE_PUBLIC_IP_GATHERING_TIMEOUT = 3 * 1000;
2555
- const browserName$1 = (_b$1 = adapter$3.browserDetails) === null || _b$1 === void 0 ? void 0 : _b$1.browser;
2556
- const browserVersion = adapter$3.browserDetails.version;
2557
- if (browserName$1 === "firefox" && adapter$3.browserShim && "shimGetDisplayMedia" in adapter$3.browserShim) {
2558
- (_c = adapter$3.browserShim) === null || _c === void 0 ? void 0 : _c.shimGetDisplayMedia(window, "screen");
2559
- }
2554
+ const browserName$1 = (_b$1 = adapter$2.browserDetails) === null || _b$1 === void 0 ? void 0 : _b$1.browser;
2555
+ const browserVersion = adapter$2.browserDetails.version;
2560
2556
  let unloading$1 = false;
2561
2557
  if (browserName$1 === "chrome") {
2562
2558
  window.document.addEventListener("beforeunload", () => {
@@ -2620,15 +2616,15 @@ class P2pRtcManager {
2620
2616
  P2PReplaceTrackNewTrackEnded: 0,
2621
2617
  P2PReplaceTrackNewTrackNotInStream: 0,
2622
2618
  P2PReplaceTrackOldTrackNotFound: 0,
2623
- P2PReplaceTrackToPCsPendingActionsNull: 0,
2624
- P2PReplaceTrackReturnedFalse: 0,
2625
2619
  P2PReplaceTrackWithoutPC: 0,
2626
2620
  P2PReplaceTrackSourceKindNotFound: 0,
2627
- P2PRemoveStreamNoPC: 0,
2628
2621
  P2POnTrackNoStream: 0,
2629
2622
  P2PSetCodecPreferenceError: 0,
2630
2623
  P2PCreateOfferNoSDP: 0,
2631
2624
  P2PCreateAnswerNoSDP: 0,
2625
+ P2PMicNotWorking: 0,
2626
+ P2PLocalNetworkFailed: 0,
2627
+ P2PRelayedIceCandidate: 0,
2632
2628
  };
2633
2629
  }
2634
2630
  numberOfPeerconnections() {
@@ -2995,7 +2991,12 @@ class P2pRtcManager {
2995
2991
  if (currentStatus !== newStatus) {
2996
2992
  this._maybeRestartIce(clientId, session);
2997
2993
  }
2998
- if (session.relayCandidateSeen === null && !session.wasEverConnected) {
2994
+ if (!session.relayCandidateSeen && !session.wasEverConnected) {
2995
+ this.analytics.P2PLocalNetworkFailed++;
2996
+ rtcStats.sendEvent("P2PLocalNetworkFailed", {
2997
+ from: "iceConnectionStateChange",
2998
+ clientId,
2999
+ });
2999
3000
  this._emit(rtcManagerEvents.CONNECTION_BLOCKED_BY_NETWORK);
3000
3001
  }
3001
3002
  break;
@@ -3008,10 +3009,26 @@ class P2pRtcManager {
3008
3009
  var _a;
3009
3010
  switch (pc.connectionState) {
3010
3011
  case "connected":
3012
+ setTimeout(() => {
3013
+ detectMicrophoneNotWorking(session.pc).then((failureDirection) => {
3014
+ if (failureDirection) {
3015
+ this.analytics.P2PMicNotWorking++;
3016
+ rtcStats.sendEvent("P2PMicNotWorking", { clientId, failureDirection });
3017
+ }
3018
+ });
3019
+ }, 3000);
3011
3020
  (_a = session.registerConnected) === null || _a === void 0 ? void 0 : _a.call(session, {});
3012
3021
  break;
3013
3022
  case "failed":
3014
3023
  const newStatus = TYPES.CONNECTION_FAILED;
3024
+ if (!session.relayCandidateSeen && !session.wasEverConnected) {
3025
+ this.analytics.P2PLocalNetworkFailed++;
3026
+ rtcStats.sendEvent("P2PLocalNetworkFailed", {
3027
+ from: "connectionStateChange",
3028
+ clientId,
3029
+ });
3030
+ this._emit(rtcManagerEvents.CONNECTION_BLOCKED_BY_NETWORK);
3031
+ }
3015
3032
  this._setConnectionStatus(session, newStatus, clientId);
3016
3033
  break;
3017
3034
  case "closed":
@@ -3363,11 +3380,16 @@ class P2pRtcManager {
3363
3380
  }
3364
3381
  };
3365
3382
  pc.onicecandidate = (event) => {
3366
- var _a, _b;
3367
3383
  if (event.candidate) {
3368
- switch ((_a = event.candidate) === null || _a === void 0 ? void 0 : _a.type) {
3384
+ if (event.candidate.type === "relayed") {
3385
+ this.analytics.P2PRelayedIceCandidate++;
3386
+ }
3387
+ switch (event.candidate.type) {
3369
3388
  case "host":
3370
- const address = (_b = event === null || event === void 0 ? void 0 : event.candidate) === null || _b === void 0 ? void 0 : _b.address;
3389
+ const address = event.candidate.address;
3390
+ if (!address) {
3391
+ break;
3392
+ }
3371
3393
  try {
3372
3394
  if (ipRegex.v4({ exact: true }).test(address)) {
3373
3395
  const ipv4 = checkIp(address);
@@ -3401,8 +3423,8 @@ class P2pRtcManager {
3401
3423
  case "srflx":
3402
3424
  session.serverReflexiveCandidateSeen = true;
3403
3425
  break;
3404
- case "relay":
3405
3426
  case "relayed":
3427
+ case "relay":
3406
3428
  session.relayCandidateSeen = true;
3407
3429
  break;
3408
3430
  }
@@ -4387,10 +4409,10 @@ function createVegaConnectionManager(config) {
4387
4409
  return { connect, updateHostList, networkIsUp, networkIsPossiblyDown };
4388
4410
  }
4389
4411
 
4390
- var _a$2;
4391
- const adapter$2 = (_a$2 = adapterRaw.default) !== null && _a$2 !== void 0 ? _a$2 : adapterRaw;
4412
+ var _a$1;
4413
+ const adapter$1 = (_a$1 = adapterRaw.default) !== null && _a$1 !== void 0 ? _a$1 : adapterRaw;
4392
4414
  const logger$2 = new Logger();
4393
- const browserName = adapter$2.browserDetails.browser;
4415
+ const browserName = adapter$1.browserDetails.browser;
4394
4416
  let unloading = false;
4395
4417
  const RESTARTICE_ERROR_RETRY_THRESHOLD_IN_MS = 3500;
4396
4418
  const RESTARTICE_ERROR_MAX_RETRY_COUNT = 5;
@@ -7001,39 +7023,6 @@ class BandwidthTester extends EventEmitter {
7001
7023
  }
7002
7024
  }
7003
7025
 
7004
- var _a$1;
7005
- const adapter$1 = (_a$1 = adapterRaw.default) !== null && _a$1 !== void 0 ? _a$1 : adapterRaw;
7006
- function detectMicrophoneNotWorking(pc) {
7007
- var _a, _b;
7008
- if (((_a = adapter$1.browserDetails) === null || _a === void 0 ? void 0 : _a.browser) !== "chrome" ||
7009
- ((_b = adapter$1.browserDetails) === null || _b === void 0 ? void 0 : _b.browser) < 58 ||
7010
- pc.signalingState === "closed") {
7011
- return Promise.resolve(false);
7012
- }
7013
- const sendingAudio = pc.getSenders().some((sender) => sender.track && sender.track.kind === "audio");
7014
- const receivingAudio = pc.getReceivers().some((receiver) => receiver.track && receiver.track.kind === "audio");
7015
- return pc.getStats(null).then((result) => {
7016
- let microphoneFailed = false;
7017
- result.forEach((report) => {
7018
- if (report.type === "outbound-rtp" &&
7019
- (report.kind === "audio" || report.mediaType === "audio") &&
7020
- sendingAudio) {
7021
- if (report.bytesSent === 0) {
7022
- microphoneFailed = "outbound";
7023
- }
7024
- }
7025
- else if (report.type === "inbound-rtp" &&
7026
- (report.kind === "audio" || report.mediaType === "audio") &&
7027
- receivingAudio) {
7028
- if (report.bytesReceived === 0) {
7029
- microphoneFailed = "inbound";
7030
- }
7031
- }
7032
- });
7033
- return microphoneFailed;
7034
- });
7035
- }
7036
-
7037
7026
  var _a, _b;
7038
7027
  const adapter = (_a = adapterRaw.default) !== null && _a !== void 0 ? _a : adapterRaw;
7039
7028
  const isSafari = ((_b = adapter.browserDetails) === null || _b === void 0 ? void 0 : _b.browser) === "safari";
@@ -7433,5 +7422,5 @@ var RtcEventNames;
7433
7422
  RtcEventNames["stream_added"] = "stream_added";
7434
7423
  })(RtcEventNames || (RtcEventNames = {}));
7435
7424
 
7436
- export { ADDITIONAL_SCREEN_SHARE_SETTINGS, AUDIO_SETTINGS, BandwidthTester, CAMERA_STREAM_ID, EVENTS, KNOCK_MESSAGES, KalmanFilter, Logger, MEDIA_JITTER_BUFFER_TARGET, NoDevicesError, P2pRtcManager, PROTOCOL_ERRORS, PROTOCOL_EVENTS, PROTOCOL_REQUESTS, PROTOCOL_RESPONSES, RELAY_MESSAGES, ReconnectManager, RtcEventNames, RtcManagerDispatcher, SCREEN_SHARE_SETTINGS, SCREEN_SHARE_SIMULCAST_SETTINGS, STREAM_TYPES, ServerSocket, Session, SfuV2Parser, TYPES, VIDEO_SETTINGS_HD, VIDEO_SETTINGS_SD, VIDEO_SETTINGS_VP9, VIDEO_SETTINGS_VP9_LOW_BANDWIDTH, VegaConnection, VegaMediaQualityMonitor, VegaRtcManager, addAbsCaptureTimeExtMap, addExtMap, assert, buildDeviceList, calculateStd, captureAudioSsrcMetrics, captureCandidatePairInfoMetrics, captureCommonSsrcMetrics, captureSsrcInfo, captureVideoSsrcMetrics, changeMediaDirection, cleanSdp, compareLocalDevices, createACFCalculator, createMicAnalyser, createWorker, deprioritizeH264, detectMicrophoneNotWorking, enumerate, external_stun_servers, filterMidExtension, filterMsidSemantic, fromLocation, generateByteString, getConstraints, getCurrentPeerConnections, getDeviceData, getDisplayMedia, getIssuesAndMetrics, getMediaConstraints, getMediaSettings, getMediasoupDeviceAsync, getNumFailedStatsReports, getNumFailedTrackSsrcLookups, getNumMissingTrackSsrcLookups, getPeerConnectionIndex, getStats, getStream, getUpdatedDevices, getUpdatedStats, getUserMedia, hasGetDisplayMedia, ipRegex, isMobile, issueDetectorOrMetricEnabled, maybeRejectNoH264, maybeTurnOnly, modifyMediaCapabilities, removePeerConnection, replaceTracksInStream, rtcManagerEvents, rtcStats, setClientProvider, setCodecPreferenceSDP, setPeerConnectionsForTests, setVideoBandwidthUsingSetParameters, sortCodecs, standardDeviation, startPerformanceMonitor, stopStreamTracks, subscribeIssues, subscribeStats, trackAnnotations, turnServerOverride, variance };
7425
+ export { ADDITIONAL_SCREEN_SHARE_SETTINGS, AUDIO_SETTINGS, BandwidthTester, CAMERA_STREAM_ID, EVENTS, KNOCK_MESSAGES, KalmanFilter, Logger, MEDIA_JITTER_BUFFER_TARGET, NoDevicesError, P2pRtcManager, PROTOCOL_ERRORS, PROTOCOL_EVENTS, PROTOCOL_REQUESTS, PROTOCOL_RESPONSES, RELAY_MESSAGES, ReconnectManager, RtcEventNames, RtcManagerDispatcher, SCREEN_SHARE_SETTINGS, SCREEN_SHARE_SIMULCAST_SETTINGS, STREAM_TYPES, ServerSocket, Session, SfuV2Parser, TYPES, VIDEO_SETTINGS_HD, VIDEO_SETTINGS_SD, VIDEO_SETTINGS_VP9, VIDEO_SETTINGS_VP9_LOW_BANDWIDTH, VegaConnection, VegaMediaQualityMonitor, VegaRtcManager, addAbsCaptureTimeExtMap, addExtMap, assert, buildDeviceList, calculateStd, captureAudioSsrcMetrics, captureCandidatePairInfoMetrics, captureCommonSsrcMetrics, captureSsrcInfo, captureVideoSsrcMetrics, cleanSdp, compareLocalDevices, createACFCalculator, createMicAnalyser, createWorker, deprioritizeH264, detectMicrophoneNotWorking, enumerate, external_stun_servers, filterMidExtension, filterMsidSemantic, fromLocation, generateByteString, getConstraints, getCurrentPeerConnections, getDeviceData, getDisplayMedia, getIssuesAndMetrics, getMediaConstraints, getMediaSettings, getMediasoupDeviceAsync, getNumFailedStatsReports, getNumFailedTrackSsrcLookups, getNumMissingTrackSsrcLookups, getPeerConnectionIndex, getStats, getStream, getUpdatedDevices, getUpdatedStats, getUserMedia, hasGetDisplayMedia, ipRegex, isMobile, issueDetectorOrMetricEnabled, maybeTurnOnly, modifyMediaCapabilities, removePeerConnection, replaceTracksInStream, rtcManagerEvents, rtcStats, setClientProvider, setCodecPreferenceSDP, setPeerConnectionsForTests, setVideoBandwidthUsingSetParameters, sortCodecs, standardDeviation, startPerformanceMonitor, stopStreamTracks, subscribeIssues, subscribeStats, trackAnnotations, turnServerOverride, variance };
7437
7426
  //# sourceMappingURL=legacy-esm.js.map
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": "2.9.0",
4
+ "version": "2.9.2",
5
5
  "license": "MIT",
6
6
  "homepage": "https://github.com/whereby/sdk",
7
7
  "repository": {
@@ -63,9 +63,9 @@
63
63
  "typescript": "^5.8.3",
64
64
  "@whereby.com/eslint-config": "0.1.0",
65
65
  "@whereby.com/jest-config": "0.1.0",
66
- "@whereby.com/prettier-config": "0.1.0",
66
+ "@whereby.com/tsconfig": "0.1.0",
67
67
  "@whereby.com/rollup-config": "0.1.1",
68
- "@whereby.com/tsconfig": "0.1.0"
68
+ "@whereby.com/prettier-config": "0.1.0"
69
69
  },
70
70
  "engines": {
71
71
  "node": ">=16.0.0"