@whereby.com/media 2.9.0 → 2.9.1

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
@@ -2153,7 +2153,7 @@ function filterMidExtension(sdp) {
2153
2153
  .join("\r\n") + "\r\n");
2154
2154
  }
2155
2155
  function filterMsidSemantic(sdp) {
2156
- if (browserName$2 !== "firefox") {
2156
+ if (browserName$2 !== "firefox" && browserVersion$1 < 68) {
2157
2157
  return sdp;
2158
2158
  }
2159
2159
  return (SDPUtils.splitLines(sdp.trim())
@@ -2532,6 +2532,39 @@ class Session {
2532
2532
 
2533
2533
  const MEDIA_JITTER_BUFFER_TARGET = 400;
2534
2534
 
2535
+ var _a$3;
2536
+ const adapter$3 = (_a$3 = adapterRaw.default) !== null && _a$3 !== void 0 ? _a$3 : adapterRaw;
2537
+ function detectMicrophoneNotWorking(pc) {
2538
+ var _a, _b;
2539
+ if (((_a = adapter$3.browserDetails) === null || _a === void 0 ? void 0 : _a.browser) !== "chrome" ||
2540
+ ((_b = adapter$3.browserDetails) === null || _b === void 0 ? void 0 : _b.browser) < 58 ||
2541
+ pc.signalingState === "closed") {
2542
+ return Promise.resolve("");
2543
+ }
2544
+ const sendingAudio = pc.getSenders().some((sender) => { var _a; return ((_a = sender.track) === null || _a === void 0 ? void 0 : _a.kind) === "audio"; });
2545
+ const receivingAudio = pc.getReceivers().some((receiver) => { var _a; return ((_a = receiver.track) === null || _a === void 0 ? void 0 : _a.kind) === "audio"; });
2546
+ return pc.getStats(null).then((result) => {
2547
+ let microphoneFailed = "";
2548
+ result.forEach((report) => {
2549
+ if (report.type === "outbound-rtp" &&
2550
+ (report.kind === "audio" || report.mediaType === "audio") &&
2551
+ sendingAudio) {
2552
+ if (report.bytesSent === 0) {
2553
+ microphoneFailed = "outbound";
2554
+ }
2555
+ }
2556
+ else if (report.type === "inbound-rtp" &&
2557
+ (report.kind === "audio" || report.mediaType === "audio") &&
2558
+ receivingAudio) {
2559
+ if (report.bytesReceived === 0) {
2560
+ microphoneFailed = "inbound";
2561
+ }
2562
+ }
2563
+ });
2564
+ return microphoneFailed;
2565
+ });
2566
+ }
2567
+
2535
2568
  const EVENTS = {
2536
2569
  CLIENT_CONNECTION_STATUS_CHANGED: "client_connection_status_changed",
2537
2570
  STREAM_ADDED: "stream_added",
@@ -2569,14 +2602,14 @@ const STREAM_TYPES = {
2569
2602
  screenshare: "screenshare",
2570
2603
  };
2571
2604
 
2572
- var _a$3, _b$1, _c;
2573
- const adapter$3 = (_a$3 = adapterRaw.default) !== null && _a$3 !== void 0 ? _a$3 : adapterRaw;
2605
+ var _a$2, _b$1, _c;
2606
+ const adapter$2 = (_a$2 = adapterRaw.default) !== null && _a$2 !== void 0 ? _a$2 : adapterRaw;
2574
2607
  const logger$6 = new Logger();
2575
2608
  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");
2609
+ const browserName$1 = (_b$1 = adapter$2.browserDetails) === null || _b$1 === void 0 ? void 0 : _b$1.browser;
2610
+ const browserVersion = adapter$2.browserDetails.version;
2611
+ if (browserName$1 === "firefox" && adapter$2.browserShim && "shimGetDisplayMedia" in adapter$2.browserShim) {
2612
+ (_c = adapter$2.browserShim) === null || _c === void 0 ? void 0 : _c.shimGetDisplayMedia(window, "screen");
2580
2613
  }
2581
2614
  let unloading$1 = false;
2582
2615
  if (browserName$1 === "chrome") {
@@ -2641,8 +2674,6 @@ class P2pRtcManager {
2641
2674
  P2PReplaceTrackNewTrackEnded: 0,
2642
2675
  P2PReplaceTrackNewTrackNotInStream: 0,
2643
2676
  P2PReplaceTrackOldTrackNotFound: 0,
2644
- P2PReplaceTrackToPCsPendingActionsNull: 0,
2645
- P2PReplaceTrackReturnedFalse: 0,
2646
2677
  P2PReplaceTrackWithoutPC: 0,
2647
2678
  P2PReplaceTrackSourceKindNotFound: 0,
2648
2679
  P2PRemoveStreamNoPC: 0,
@@ -2650,6 +2681,9 @@ class P2pRtcManager {
2650
2681
  P2PSetCodecPreferenceError: 0,
2651
2682
  P2PCreateOfferNoSDP: 0,
2652
2683
  P2PCreateAnswerNoSDP: 0,
2684
+ P2PMicNotWorking: 0,
2685
+ P2PLocalNetworkFailed: 0,
2686
+ P2PRelayedIceCandidate: 0,
2653
2687
  };
2654
2688
  }
2655
2689
  numberOfPeerconnections() {
@@ -3016,7 +3050,12 @@ class P2pRtcManager {
3016
3050
  if (currentStatus !== newStatus) {
3017
3051
  this._maybeRestartIce(clientId, session);
3018
3052
  }
3019
- if (session.relayCandidateSeen === null && !session.wasEverConnected) {
3053
+ if (!session.relayCandidateSeen && !session.wasEverConnected) {
3054
+ this.analytics.P2PLocalNetworkFailed++;
3055
+ rtcStats.sendEvent("P2PLocalNetworkFailed", {
3056
+ from: "iceConnectionStateChange",
3057
+ clientId,
3058
+ });
3020
3059
  this._emit(rtcManagerEvents.CONNECTION_BLOCKED_BY_NETWORK);
3021
3060
  }
3022
3061
  break;
@@ -3029,10 +3068,26 @@ class P2pRtcManager {
3029
3068
  var _a;
3030
3069
  switch (pc.connectionState) {
3031
3070
  case "connected":
3071
+ setTimeout(() => {
3072
+ detectMicrophoneNotWorking(session.pc).then((failureDirection) => {
3073
+ if (failureDirection) {
3074
+ this.analytics.P2PMicNotWorking++;
3075
+ rtcStats.sendEvent("P2PMicNotWorking", { clientId, failureDirection });
3076
+ }
3077
+ });
3078
+ }, 3000);
3032
3079
  (_a = session.registerConnected) === null || _a === void 0 ? void 0 : _a.call(session, {});
3033
3080
  break;
3034
3081
  case "failed":
3035
3082
  const newStatus = TYPES.CONNECTION_FAILED;
3083
+ if (!session.relayCandidateSeen && !session.wasEverConnected) {
3084
+ this.analytics.P2PLocalNetworkFailed++;
3085
+ rtcStats.sendEvent("P2PLocalNetworkFailed", {
3086
+ from: "connectionStateChange",
3087
+ clientId,
3088
+ });
3089
+ this._emit(rtcManagerEvents.CONNECTION_BLOCKED_BY_NETWORK);
3090
+ }
3036
3091
  this._setConnectionStatus(session, newStatus, clientId);
3037
3092
  break;
3038
3093
  case "closed":
@@ -3384,11 +3439,16 @@ class P2pRtcManager {
3384
3439
  }
3385
3440
  };
3386
3441
  pc.onicecandidate = (event) => {
3387
- var _a, _b;
3388
3442
  if (event.candidate) {
3389
- switch ((_a = event.candidate) === null || _a === void 0 ? void 0 : _a.type) {
3443
+ if (event.candidate.type === "relayed") {
3444
+ this.analytics.P2PRelayedIceCandidate++;
3445
+ }
3446
+ switch (event.candidate.type) {
3390
3447
  case "host":
3391
- const address = (_b = event === null || event === void 0 ? void 0 : event.candidate) === null || _b === void 0 ? void 0 : _b.address;
3448
+ const address = event.candidate.address;
3449
+ if (!address) {
3450
+ break;
3451
+ }
3392
3452
  try {
3393
3453
  if (ipRegex.v4({ exact: true }).test(address)) {
3394
3454
  const ipv4 = checkIp(address);
@@ -3422,8 +3482,8 @@ class P2pRtcManager {
3422
3482
  case "srflx":
3423
3483
  session.serverReflexiveCandidateSeen = true;
3424
3484
  break;
3425
- case "relay":
3426
3485
  case "relayed":
3486
+ case "relay":
3427
3487
  session.relayCandidateSeen = true;
3428
3488
  break;
3429
3489
  }
@@ -4408,10 +4468,10 @@ function createVegaConnectionManager(config) {
4408
4468
  return { connect, updateHostList, networkIsUp, networkIsPossiblyDown };
4409
4469
  }
4410
4470
 
4411
- var _a$2;
4412
- const adapter$2 = (_a$2 = adapterRaw.default) !== null && _a$2 !== void 0 ? _a$2 : adapterRaw;
4471
+ var _a$1;
4472
+ const adapter$1 = (_a$1 = adapterRaw.default) !== null && _a$1 !== void 0 ? _a$1 : adapterRaw;
4413
4473
  const logger$2 = new Logger();
4414
- const browserName = adapter$2.browserDetails.browser;
4474
+ const browserName = adapter$1.browserDetails.browser;
4415
4475
  let unloading = false;
4416
4476
  const RESTARTICE_ERROR_RETRY_THRESHOLD_IN_MS = 3500;
4417
4477
  const RESTARTICE_ERROR_MAX_RETRY_COUNT = 5;
@@ -7022,39 +7082,6 @@ class BandwidthTester extends EventEmitter {
7022
7082
  }
7023
7083
  }
7024
7084
 
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
7085
  var _a, _b;
7059
7086
  const adapter = (_a = adapterRaw.default) !== null && _a !== void 0 ? _a : adapterRaw;
7060
7087
  const isSafari = ((_b = adapter.browserDetails) === null || _b === void 0 ? void 0 : _b.browser) === "safari";
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,8 +1245,6 @@ 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
1250
  P2PRemoveStreamNoPC: number;
@@ -1254,6 +1252,9 @@ type P2PAnalytics = {
1254
1252
  P2PSetCodecPreferenceError: number;
1255
1253
  P2PCreateOfferNoSDP: number;
1256
1254
  P2PCreateAnswerNoSDP: number;
1255
+ P2PMicNotWorking: number;
1256
+ P2PLocalNetworkFailed: number;
1257
+ P2PRelayedIceCandidate: number;
1257
1258
  };
1258
1259
  type P2PAnalyticMetric = keyof P2PAnalytics;
1259
1260
  type P2PIncrementAnalyticMetric = (metric: P2PAnalyticMetric) => void;
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,8 +1245,6 @@ 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
1250
  P2PRemoveStreamNoPC: number;
@@ -1254,6 +1252,9 @@ type P2PAnalytics = {
1254
1252
  P2PSetCodecPreferenceError: number;
1255
1253
  P2PCreateOfferNoSDP: number;
1256
1254
  P2PCreateAnswerNoSDP: number;
1255
+ P2PMicNotWorking: number;
1256
+ P2PLocalNetworkFailed: number;
1257
+ P2PRelayedIceCandidate: number;
1257
1258
  };
1258
1259
  type P2PAnalyticMetric = keyof P2PAnalytics;
1259
1260
  type P2PIncrementAnalyticMetric = (metric: P2PAnalyticMetric) => void;
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,8 +1245,6 @@ 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
1250
  P2PRemoveStreamNoPC: number;
@@ -1254,6 +1252,9 @@ type P2PAnalytics = {
1254
1252
  P2PSetCodecPreferenceError: number;
1255
1253
  P2PCreateOfferNoSDP: number;
1256
1254
  P2PCreateAnswerNoSDP: number;
1255
+ P2PMicNotWorking: number;
1256
+ P2PLocalNetworkFailed: number;
1257
+ P2PRelayedIceCandidate: number;
1257
1258
  };
1258
1259
  type P2PAnalyticMetric = keyof P2PAnalytics;
1259
1260
  type P2PIncrementAnalyticMetric = (metric: P2PAnalyticMetric) => void;
package/dist/index.mjs CHANGED
@@ -2132,7 +2132,7 @@ function filterMidExtension(sdp) {
2132
2132
  .join("\r\n") + "\r\n");
2133
2133
  }
2134
2134
  function filterMsidSemantic(sdp) {
2135
- if (browserName$2 !== "firefox") {
2135
+ if (browserName$2 !== "firefox" && browserVersion$1 < 68) {
2136
2136
  return sdp;
2137
2137
  }
2138
2138
  return (SDPUtils.splitLines(sdp.trim())
@@ -2511,6 +2511,39 @@ class Session {
2511
2511
 
2512
2512
  const MEDIA_JITTER_BUFFER_TARGET = 400;
2513
2513
 
2514
+ var _a$3;
2515
+ const adapter$3 = (_a$3 = adapterRaw.default) !== null && _a$3 !== void 0 ? _a$3 : adapterRaw;
2516
+ function detectMicrophoneNotWorking(pc) {
2517
+ var _a, _b;
2518
+ if (((_a = adapter$3.browserDetails) === null || _a === void 0 ? void 0 : _a.browser) !== "chrome" ||
2519
+ ((_b = adapter$3.browserDetails) === null || _b === void 0 ? void 0 : _b.browser) < 58 ||
2520
+ pc.signalingState === "closed") {
2521
+ return Promise.resolve("");
2522
+ }
2523
+ const sendingAudio = pc.getSenders().some((sender) => { var _a; return ((_a = sender.track) === null || _a === void 0 ? void 0 : _a.kind) === "audio"; });
2524
+ const receivingAudio = pc.getReceivers().some((receiver) => { var _a; return ((_a = receiver.track) === null || _a === void 0 ? void 0 : _a.kind) === "audio"; });
2525
+ return pc.getStats(null).then((result) => {
2526
+ let microphoneFailed = "";
2527
+ result.forEach((report) => {
2528
+ if (report.type === "outbound-rtp" &&
2529
+ (report.kind === "audio" || report.mediaType === "audio") &&
2530
+ sendingAudio) {
2531
+ if (report.bytesSent === 0) {
2532
+ microphoneFailed = "outbound";
2533
+ }
2534
+ }
2535
+ else if (report.type === "inbound-rtp" &&
2536
+ (report.kind === "audio" || report.mediaType === "audio") &&
2537
+ receivingAudio) {
2538
+ if (report.bytesReceived === 0) {
2539
+ microphoneFailed = "inbound";
2540
+ }
2541
+ }
2542
+ });
2543
+ return microphoneFailed;
2544
+ });
2545
+ }
2546
+
2514
2547
  const EVENTS = {
2515
2548
  CLIENT_CONNECTION_STATUS_CHANGED: "client_connection_status_changed",
2516
2549
  STREAM_ADDED: "stream_added",
@@ -2548,14 +2581,14 @@ const STREAM_TYPES = {
2548
2581
  screenshare: "screenshare",
2549
2582
  };
2550
2583
 
2551
- var _a$3, _b$1, _c;
2552
- const adapter$3 = (_a$3 = adapterRaw.default) !== null && _a$3 !== void 0 ? _a$3 : adapterRaw;
2584
+ var _a$2, _b$1, _c;
2585
+ const adapter$2 = (_a$2 = adapterRaw.default) !== null && _a$2 !== void 0 ? _a$2 : adapterRaw;
2553
2586
  const logger$6 = new Logger();
2554
2587
  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");
2588
+ const browserName$1 = (_b$1 = adapter$2.browserDetails) === null || _b$1 === void 0 ? void 0 : _b$1.browser;
2589
+ const browserVersion = adapter$2.browserDetails.version;
2590
+ if (browserName$1 === "firefox" && adapter$2.browserShim && "shimGetDisplayMedia" in adapter$2.browserShim) {
2591
+ (_c = adapter$2.browserShim) === null || _c === void 0 ? void 0 : _c.shimGetDisplayMedia(window, "screen");
2559
2592
  }
2560
2593
  let unloading$1 = false;
2561
2594
  if (browserName$1 === "chrome") {
@@ -2620,8 +2653,6 @@ class P2pRtcManager {
2620
2653
  P2PReplaceTrackNewTrackEnded: 0,
2621
2654
  P2PReplaceTrackNewTrackNotInStream: 0,
2622
2655
  P2PReplaceTrackOldTrackNotFound: 0,
2623
- P2PReplaceTrackToPCsPendingActionsNull: 0,
2624
- P2PReplaceTrackReturnedFalse: 0,
2625
2656
  P2PReplaceTrackWithoutPC: 0,
2626
2657
  P2PReplaceTrackSourceKindNotFound: 0,
2627
2658
  P2PRemoveStreamNoPC: 0,
@@ -2629,6 +2660,9 @@ class P2pRtcManager {
2629
2660
  P2PSetCodecPreferenceError: 0,
2630
2661
  P2PCreateOfferNoSDP: 0,
2631
2662
  P2PCreateAnswerNoSDP: 0,
2663
+ P2PMicNotWorking: 0,
2664
+ P2PLocalNetworkFailed: 0,
2665
+ P2PRelayedIceCandidate: 0,
2632
2666
  };
2633
2667
  }
2634
2668
  numberOfPeerconnections() {
@@ -2995,7 +3029,12 @@ class P2pRtcManager {
2995
3029
  if (currentStatus !== newStatus) {
2996
3030
  this._maybeRestartIce(clientId, session);
2997
3031
  }
2998
- if (session.relayCandidateSeen === null && !session.wasEverConnected) {
3032
+ if (!session.relayCandidateSeen && !session.wasEverConnected) {
3033
+ this.analytics.P2PLocalNetworkFailed++;
3034
+ rtcStats.sendEvent("P2PLocalNetworkFailed", {
3035
+ from: "iceConnectionStateChange",
3036
+ clientId,
3037
+ });
2999
3038
  this._emit(rtcManagerEvents.CONNECTION_BLOCKED_BY_NETWORK);
3000
3039
  }
3001
3040
  break;
@@ -3008,10 +3047,26 @@ class P2pRtcManager {
3008
3047
  var _a;
3009
3048
  switch (pc.connectionState) {
3010
3049
  case "connected":
3050
+ setTimeout(() => {
3051
+ detectMicrophoneNotWorking(session.pc).then((failureDirection) => {
3052
+ if (failureDirection) {
3053
+ this.analytics.P2PMicNotWorking++;
3054
+ rtcStats.sendEvent("P2PMicNotWorking", { clientId, failureDirection });
3055
+ }
3056
+ });
3057
+ }, 3000);
3011
3058
  (_a = session.registerConnected) === null || _a === void 0 ? void 0 : _a.call(session, {});
3012
3059
  break;
3013
3060
  case "failed":
3014
3061
  const newStatus = TYPES.CONNECTION_FAILED;
3062
+ if (!session.relayCandidateSeen && !session.wasEverConnected) {
3063
+ this.analytics.P2PLocalNetworkFailed++;
3064
+ rtcStats.sendEvent("P2PLocalNetworkFailed", {
3065
+ from: "connectionStateChange",
3066
+ clientId,
3067
+ });
3068
+ this._emit(rtcManagerEvents.CONNECTION_BLOCKED_BY_NETWORK);
3069
+ }
3015
3070
  this._setConnectionStatus(session, newStatus, clientId);
3016
3071
  break;
3017
3072
  case "closed":
@@ -3363,11 +3418,16 @@ class P2pRtcManager {
3363
3418
  }
3364
3419
  };
3365
3420
  pc.onicecandidate = (event) => {
3366
- var _a, _b;
3367
3421
  if (event.candidate) {
3368
- switch ((_a = event.candidate) === null || _a === void 0 ? void 0 : _a.type) {
3422
+ if (event.candidate.type === "relayed") {
3423
+ this.analytics.P2PRelayedIceCandidate++;
3424
+ }
3425
+ switch (event.candidate.type) {
3369
3426
  case "host":
3370
- const address = (_b = event === null || event === void 0 ? void 0 : event.candidate) === null || _b === void 0 ? void 0 : _b.address;
3427
+ const address = event.candidate.address;
3428
+ if (!address) {
3429
+ break;
3430
+ }
3371
3431
  try {
3372
3432
  if (ipRegex.v4({ exact: true }).test(address)) {
3373
3433
  const ipv4 = checkIp(address);
@@ -3401,8 +3461,8 @@ class P2pRtcManager {
3401
3461
  case "srflx":
3402
3462
  session.serverReflexiveCandidateSeen = true;
3403
3463
  break;
3404
- case "relay":
3405
3464
  case "relayed":
3465
+ case "relay":
3406
3466
  session.relayCandidateSeen = true;
3407
3467
  break;
3408
3468
  }
@@ -4387,10 +4447,10 @@ function createVegaConnectionManager(config) {
4387
4447
  return { connect, updateHostList, networkIsUp, networkIsPossiblyDown };
4388
4448
  }
4389
4449
 
4390
- var _a$2;
4391
- const adapter$2 = (_a$2 = adapterRaw.default) !== null && _a$2 !== void 0 ? _a$2 : adapterRaw;
4450
+ var _a$1;
4451
+ const adapter$1 = (_a$1 = adapterRaw.default) !== null && _a$1 !== void 0 ? _a$1 : adapterRaw;
4392
4452
  const logger$2 = new Logger();
4393
- const browserName = adapter$2.browserDetails.browser;
4453
+ const browserName = adapter$1.browserDetails.browser;
4394
4454
  let unloading = false;
4395
4455
  const RESTARTICE_ERROR_RETRY_THRESHOLD_IN_MS = 3500;
4396
4456
  const RESTARTICE_ERROR_MAX_RETRY_COUNT = 5;
@@ -7001,39 +7061,6 @@ class BandwidthTester extends EventEmitter {
7001
7061
  }
7002
7062
  }
7003
7063
 
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
7064
  var _a, _b;
7038
7065
  const adapter = (_a = adapterRaw.default) !== null && _a !== void 0 ? _a : adapterRaw;
7039
7066
  const isSafari = ((_b = adapter.browserDetails) === null || _b === void 0 ? void 0 : _b.browser) === "safari";
@@ -2132,7 +2132,7 @@ function filterMidExtension(sdp) {
2132
2132
  .join("\r\n") + "\r\n");
2133
2133
  }
2134
2134
  function filterMsidSemantic(sdp) {
2135
- if (browserName$2 !== "firefox") {
2135
+ if (browserName$2 !== "firefox" && browserVersion$1 < 68) {
2136
2136
  return sdp;
2137
2137
  }
2138
2138
  return (SDPUtils.splitLines(sdp.trim())
@@ -2511,6 +2511,39 @@ class Session {
2511
2511
 
2512
2512
  const MEDIA_JITTER_BUFFER_TARGET = 400;
2513
2513
 
2514
+ var _a$3;
2515
+ const adapter$3 = (_a$3 = adapterRaw.default) !== null && _a$3 !== void 0 ? _a$3 : adapterRaw;
2516
+ function detectMicrophoneNotWorking(pc) {
2517
+ var _a, _b;
2518
+ if (((_a = adapter$3.browserDetails) === null || _a === void 0 ? void 0 : _a.browser) !== "chrome" ||
2519
+ ((_b = adapter$3.browserDetails) === null || _b === void 0 ? void 0 : _b.browser) < 58 ||
2520
+ pc.signalingState === "closed") {
2521
+ return Promise.resolve("");
2522
+ }
2523
+ const sendingAudio = pc.getSenders().some((sender) => { var _a; return ((_a = sender.track) === null || _a === void 0 ? void 0 : _a.kind) === "audio"; });
2524
+ const receivingAudio = pc.getReceivers().some((receiver) => { var _a; return ((_a = receiver.track) === null || _a === void 0 ? void 0 : _a.kind) === "audio"; });
2525
+ return pc.getStats(null).then((result) => {
2526
+ let microphoneFailed = "";
2527
+ result.forEach((report) => {
2528
+ if (report.type === "outbound-rtp" &&
2529
+ (report.kind === "audio" || report.mediaType === "audio") &&
2530
+ sendingAudio) {
2531
+ if (report.bytesSent === 0) {
2532
+ microphoneFailed = "outbound";
2533
+ }
2534
+ }
2535
+ else if (report.type === "inbound-rtp" &&
2536
+ (report.kind === "audio" || report.mediaType === "audio") &&
2537
+ receivingAudio) {
2538
+ if (report.bytesReceived === 0) {
2539
+ microphoneFailed = "inbound";
2540
+ }
2541
+ }
2542
+ });
2543
+ return microphoneFailed;
2544
+ });
2545
+ }
2546
+
2514
2547
  const EVENTS = {
2515
2548
  CLIENT_CONNECTION_STATUS_CHANGED: "client_connection_status_changed",
2516
2549
  STREAM_ADDED: "stream_added",
@@ -2548,14 +2581,14 @@ const STREAM_TYPES = {
2548
2581
  screenshare: "screenshare",
2549
2582
  };
2550
2583
 
2551
- var _a$3, _b$1, _c;
2552
- const adapter$3 = (_a$3 = adapterRaw.default) !== null && _a$3 !== void 0 ? _a$3 : adapterRaw;
2584
+ var _a$2, _b$1, _c;
2585
+ const adapter$2 = (_a$2 = adapterRaw.default) !== null && _a$2 !== void 0 ? _a$2 : adapterRaw;
2553
2586
  const logger$6 = new Logger();
2554
2587
  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");
2588
+ const browserName$1 = (_b$1 = adapter$2.browserDetails) === null || _b$1 === void 0 ? void 0 : _b$1.browser;
2589
+ const browserVersion = adapter$2.browserDetails.version;
2590
+ if (browserName$1 === "firefox" && adapter$2.browserShim && "shimGetDisplayMedia" in adapter$2.browserShim) {
2591
+ (_c = adapter$2.browserShim) === null || _c === void 0 ? void 0 : _c.shimGetDisplayMedia(window, "screen");
2559
2592
  }
2560
2593
  let unloading$1 = false;
2561
2594
  if (browserName$1 === "chrome") {
@@ -2620,8 +2653,6 @@ class P2pRtcManager {
2620
2653
  P2PReplaceTrackNewTrackEnded: 0,
2621
2654
  P2PReplaceTrackNewTrackNotInStream: 0,
2622
2655
  P2PReplaceTrackOldTrackNotFound: 0,
2623
- P2PReplaceTrackToPCsPendingActionsNull: 0,
2624
- P2PReplaceTrackReturnedFalse: 0,
2625
2656
  P2PReplaceTrackWithoutPC: 0,
2626
2657
  P2PReplaceTrackSourceKindNotFound: 0,
2627
2658
  P2PRemoveStreamNoPC: 0,
@@ -2629,6 +2660,9 @@ class P2pRtcManager {
2629
2660
  P2PSetCodecPreferenceError: 0,
2630
2661
  P2PCreateOfferNoSDP: 0,
2631
2662
  P2PCreateAnswerNoSDP: 0,
2663
+ P2PMicNotWorking: 0,
2664
+ P2PLocalNetworkFailed: 0,
2665
+ P2PRelayedIceCandidate: 0,
2632
2666
  };
2633
2667
  }
2634
2668
  numberOfPeerconnections() {
@@ -2995,7 +3029,12 @@ class P2pRtcManager {
2995
3029
  if (currentStatus !== newStatus) {
2996
3030
  this._maybeRestartIce(clientId, session);
2997
3031
  }
2998
- if (session.relayCandidateSeen === null && !session.wasEverConnected) {
3032
+ if (!session.relayCandidateSeen && !session.wasEverConnected) {
3033
+ this.analytics.P2PLocalNetworkFailed++;
3034
+ rtcStats.sendEvent("P2PLocalNetworkFailed", {
3035
+ from: "iceConnectionStateChange",
3036
+ clientId,
3037
+ });
2999
3038
  this._emit(rtcManagerEvents.CONNECTION_BLOCKED_BY_NETWORK);
3000
3039
  }
3001
3040
  break;
@@ -3008,10 +3047,26 @@ class P2pRtcManager {
3008
3047
  var _a;
3009
3048
  switch (pc.connectionState) {
3010
3049
  case "connected":
3050
+ setTimeout(() => {
3051
+ detectMicrophoneNotWorking(session.pc).then((failureDirection) => {
3052
+ if (failureDirection) {
3053
+ this.analytics.P2PMicNotWorking++;
3054
+ rtcStats.sendEvent("P2PMicNotWorking", { clientId, failureDirection });
3055
+ }
3056
+ });
3057
+ }, 3000);
3011
3058
  (_a = session.registerConnected) === null || _a === void 0 ? void 0 : _a.call(session, {});
3012
3059
  break;
3013
3060
  case "failed":
3014
3061
  const newStatus = TYPES.CONNECTION_FAILED;
3062
+ if (!session.relayCandidateSeen && !session.wasEverConnected) {
3063
+ this.analytics.P2PLocalNetworkFailed++;
3064
+ rtcStats.sendEvent("P2PLocalNetworkFailed", {
3065
+ from: "connectionStateChange",
3066
+ clientId,
3067
+ });
3068
+ this._emit(rtcManagerEvents.CONNECTION_BLOCKED_BY_NETWORK);
3069
+ }
3015
3070
  this._setConnectionStatus(session, newStatus, clientId);
3016
3071
  break;
3017
3072
  case "closed":
@@ -3363,11 +3418,16 @@ class P2pRtcManager {
3363
3418
  }
3364
3419
  };
3365
3420
  pc.onicecandidate = (event) => {
3366
- var _a, _b;
3367
3421
  if (event.candidate) {
3368
- switch ((_a = event.candidate) === null || _a === void 0 ? void 0 : _a.type) {
3422
+ if (event.candidate.type === "relayed") {
3423
+ this.analytics.P2PRelayedIceCandidate++;
3424
+ }
3425
+ switch (event.candidate.type) {
3369
3426
  case "host":
3370
- const address = (_b = event === null || event === void 0 ? void 0 : event.candidate) === null || _b === void 0 ? void 0 : _b.address;
3427
+ const address = event.candidate.address;
3428
+ if (!address) {
3429
+ break;
3430
+ }
3371
3431
  try {
3372
3432
  if (ipRegex.v4({ exact: true }).test(address)) {
3373
3433
  const ipv4 = checkIp(address);
@@ -3401,8 +3461,8 @@ class P2pRtcManager {
3401
3461
  case "srflx":
3402
3462
  session.serverReflexiveCandidateSeen = true;
3403
3463
  break;
3404
- case "relay":
3405
3464
  case "relayed":
3465
+ case "relay":
3406
3466
  session.relayCandidateSeen = true;
3407
3467
  break;
3408
3468
  }
@@ -4387,10 +4447,10 @@ function createVegaConnectionManager(config) {
4387
4447
  return { connect, updateHostList, networkIsUp, networkIsPossiblyDown };
4388
4448
  }
4389
4449
 
4390
- var _a$2;
4391
- const adapter$2 = (_a$2 = adapterRaw.default) !== null && _a$2 !== void 0 ? _a$2 : adapterRaw;
4450
+ var _a$1;
4451
+ const adapter$1 = (_a$1 = adapterRaw.default) !== null && _a$1 !== void 0 ? _a$1 : adapterRaw;
4392
4452
  const logger$2 = new Logger();
4393
- const browserName = adapter$2.browserDetails.browser;
4453
+ const browserName = adapter$1.browserDetails.browser;
4394
4454
  let unloading = false;
4395
4455
  const RESTARTICE_ERROR_RETRY_THRESHOLD_IN_MS = 3500;
4396
4456
  const RESTARTICE_ERROR_MAX_RETRY_COUNT = 5;
@@ -7001,39 +7061,6 @@ class BandwidthTester extends EventEmitter {
7001
7061
  }
7002
7062
  }
7003
7063
 
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
7064
  var _a, _b;
7038
7065
  const adapter = (_a = adapterRaw.default) !== null && _a !== void 0 ? _a : adapterRaw;
7039
7066
  const isSafari = ((_b = adapter.browserDetails) === null || _b === void 0 ? void 0 : _b.browser) === "safari";
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.1",
5
5
  "license": "MIT",
6
6
  "homepage": "https://github.com/whereby/sdk",
7
7
  "repository": {