@whereby.com/media 2.8.7 → 2.8.8

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
@@ -2245,6 +2245,7 @@ class Session {
2245
2245
  this.ipv6HostCandidateTeredoSeen = false;
2246
2246
  this.ipv6HostCandidate6to4Seen = false;
2247
2247
  this.mdnsHostCandidateSeen = false;
2248
+ this.pendingReplaceTrackActions = [];
2248
2249
  this.peerConnectionConfig = peerConnectionConfig;
2249
2250
  this.clientId = clientId;
2250
2251
  this.pc = new RTCPeerConnection(this.peerConnectionConfig);
@@ -2321,22 +2322,16 @@ class Session {
2321
2322
  if (streamIndex !== -1) {
2322
2323
  this.streams.splice(streamIndex, 1);
2323
2324
  }
2324
- if (this.pc) {
2325
- if (this.pc.removeTrack) {
2326
- stream.getTracks().forEach((track) => {
2327
- const sender = this.pc.getSenders().find((sender) => sender.track === track);
2328
- if (sender) {
2329
- this.pc.removeTrack(sender);
2330
- }
2331
- });
2332
- }
2333
- else if (this.pc.removeStream) {
2334
- this.pc.removeStream(stream);
2335
- }
2325
+ if (this.pc.removeTrack) {
2326
+ stream.getTracks().forEach((track) => {
2327
+ const sender = this.pc.getSenders().find((sender) => sender.track === track);
2328
+ if (sender) {
2329
+ this.pc.removeTrack(sender);
2330
+ }
2331
+ });
2336
2332
  }
2337
- else {
2338
- rtcStats.sendEvent("P2PRemoveStreamNoPC", {});
2339
- this._incrementAnalyticMetric("P2PRemoveStreamNoPC");
2333
+ else if (this.pc.removeStream) {
2334
+ this.pc.removeStream(stream);
2340
2335
  }
2341
2336
  }
2342
2337
  _setRemoteDescription(desc) {
@@ -2430,86 +2425,77 @@ class Session {
2430
2425
  }
2431
2426
  }
2432
2427
  hasConnectedPeerConnection() {
2433
- return this.pc && this.pc.connectionState === "connected";
2428
+ return this.pc.connectionState === "connected";
2434
2429
  }
2435
2430
  replaceTrack(oldTrack, newTrack) {
2436
- logger$7.info("replacetrack() [oldTrackId: %s, newTrackId: %s]", oldTrack === null || oldTrack === void 0 ? void 0 : oldTrack.id, newTrack === null || newTrack === void 0 ? void 0 : newTrack.id);
2437
- if (!newTrack) {
2438
- rtcStats.sendEvent("P2PReplaceTrackNoNewTrack", {
2439
- oldTrackId: oldTrack === null || oldTrack === void 0 ? void 0 : oldTrack.id,
2440
- oldTrackKind: oldTrack === null || oldTrack === void 0 ? void 0 : oldTrack.kind,
2441
- oldTrackIsEffect: oldTrack === null || oldTrack === void 0 ? void 0 : oldTrack.effectTrack,
2442
- });
2443
- this._incrementAnalyticMetric("P2PReplaceTrackNoNewTrack");
2444
- return false;
2445
- }
2446
- if (newTrack.readyState === "ended") {
2447
- rtcStats.sendEvent("P2PReplaceTrackNewTrackEnded", {
2448
- newTrackId: newTrack.id,
2449
- newTrackKind: newTrack.kind,
2450
- newTrackIsEffect: newTrack.effectTrack,
2431
+ return __awaiter(this, void 0, void 0, function* () {
2432
+ logger$7.info("replacetrack() [oldTrackId: %s, newTrackId: %s]", oldTrack === null || oldTrack === void 0 ? void 0 : oldTrack.id, newTrack.id);
2433
+ if (newTrack.readyState === "ended") {
2434
+ rtcStats.sendEvent("P2PReplaceTrackNewTrackEnded", {
2435
+ newTrackId: newTrack.id,
2436
+ newTrackKind: newTrack.kind,
2437
+ newTrackIsEffect: trackAnnotations(newTrack).isEffectTrack,
2438
+ });
2439
+ this._incrementAnalyticMetric("P2PReplaceTrackNewTrackEnded");
2440
+ throw new Error(`refusing to replace track trackId: ${newTrack.id} kind: ${newTrack.kind} with readyState: ${newTrack.readyState}`);
2441
+ }
2442
+ const pc = this.pc;
2443
+ if (oldTrack) {
2444
+ const sender = pc.getSenders().find((s) => { var _a; return ((_a = s.track) === null || _a === void 0 ? void 0 : _a.id) === oldTrack.id; });
2445
+ if (sender) {
2446
+ return yield sender.replaceTrack(newTrack);
2447
+ }
2448
+ }
2449
+ const sender = pc.getSenders().find((s) => {
2450
+ const track = s.track;
2451
+ return (track === null || track === void 0 ? void 0 : track.kind) === newTrack.kind && !trackAnnotations(track).fromGetDisplayMedia;
2451
2452
  });
2452
- this._incrementAnalyticMetric("P2PReplaceTrackNewTrackEnded");
2453
- return false;
2454
- }
2455
- const pc = this.pc;
2456
- if (oldTrack) {
2457
- const sender = pc.getSenders().find((s) => { var _a; return ((_a = s.track) === null || _a === void 0 ? void 0 : _a.id) === oldTrack.id; });
2458
2453
  if (sender) {
2459
- sender.replaceTrack(newTrack);
2460
- return Promise.resolve(newTrack);
2454
+ this._incrementAnalyticMetric("P2PReplaceTrackOldTrackNotFound");
2455
+ const track = sender.track;
2456
+ rtcStats.sendEvent("P2PReplaceTrackOldTrackNotFound", {
2457
+ targetTrackId: track === null || track === void 0 ? void 0 : track.id,
2458
+ targetTrackKind: track === null || track === void 0 ? void 0 : track.kind,
2459
+ targetTrackIsEffect: track && trackAnnotations(track).isEffectTrack,
2460
+ targetTrackReadyState: track === null || track === void 0 ? void 0 : track.readyState,
2461
+ newTrackId: newTrack.id,
2462
+ newTrackKind: newTrack.kind,
2463
+ newTrackIsEffect: trackAnnotations(newTrack).isEffectTrack,
2464
+ oldTrackId: oldTrack === null || oldTrack === void 0 ? void 0 : oldTrack.id,
2465
+ oldTrackKind: oldTrack === null || oldTrack === void 0 ? void 0 : oldTrack.kind,
2466
+ oldTrackIsEffect: oldTrack && trackAnnotations(oldTrack).isEffectTrack,
2467
+ });
2468
+ return yield sender.replaceTrack(newTrack);
2461
2469
  }
2462
- }
2463
- const sender = pc.getSenders().find((s) => {
2464
- const track = s.track;
2465
- return (track === null || track === void 0 ? void 0 : track.kind) === newTrack.kind && !trackAnnotations(track).fromGetDisplayMedia;
2466
- });
2467
- if (sender) {
2468
- this._incrementAnalyticMetric("P2PReplaceTrackOldTrackNotFound");
2469
- const track = sender.track;
2470
- rtcStats.sendEvent("P2PReplaceTrackOldTrackNotFound", {
2471
- targetTrackId: track === null || track === void 0 ? void 0 : track.id,
2472
- targetTrackKind: track === null || track === void 0 ? void 0 : track.kind,
2473
- targetTrackIsEffect: track === null || track === void 0 ? void 0 : track.effectTrack,
2474
- targetTrackReadyState: track === null || track === void 0 ? void 0 : track.readyState,
2475
- newTrackId: newTrack.id,
2476
- newTrackKind: newTrack.kind,
2477
- newTrackIsEffect: newTrack.effectTrack,
2478
- oldTrackId: oldTrack === null || oldTrack === void 0 ? void 0 : oldTrack.id,
2479
- oldTrackKind: oldTrack === null || oldTrack === void 0 ? void 0 : oldTrack.kind,
2480
- oldTrackIsEffect: oldTrack === null || oldTrack === void 0 ? void 0 : oldTrack.effectTrack,
2481
- });
2482
- sender.replaceTrack(newTrack);
2483
- return Promise.resolve(newTrack);
2484
- }
2485
- let stream = this.streams.find((s) => s.getTracks().find((t) => t.id === newTrack.id));
2486
- if (!stream) {
2487
- rtcStats.sendEvent("P2PReplaceTrackNewTrackNotInStream", {
2470
+ let stream = this.streams.find((s) => s.getTracks().find((t) => t.id === newTrack.id));
2471
+ if (!stream) {
2472
+ rtcStats.sendEvent("P2PReplaceTrackNewTrackNotInStream", {
2473
+ oldTrackId: oldTrack === null || oldTrack === void 0 ? void 0 : oldTrack.id,
2474
+ oldTrackKind: oldTrack === null || oldTrack === void 0 ? void 0 : oldTrack.kind,
2475
+ oldTrackIsEffect: oldTrack && trackAnnotations(oldTrack).isEffectTrack,
2476
+ newTrackId: newTrack.id,
2477
+ newTrackKind: newTrack.kind,
2478
+ newTrackIsEffect: trackAnnotations(newTrack).isEffectTrack,
2479
+ });
2480
+ this._incrementAnalyticMetric("P2PReplaceTrackNewTrackNotInStream");
2481
+ }
2482
+ stream = this.streams[0];
2483
+ if (!stream) {
2484
+ rtcStats.sendEvent("P2PReplaceTrackNoStream", {});
2485
+ this._incrementAnalyticMetric("P2PReplaceTrackNoStream");
2486
+ throw new Error("replaceTrack: No stream?");
2487
+ }
2488
+ rtcStats.sendEvent("P2PReplaceTrackSourceKindNotFound", {
2488
2489
  oldTrackId: oldTrack === null || oldTrack === void 0 ? void 0 : oldTrack.id,
2489
2490
  oldTrackKind: oldTrack === null || oldTrack === void 0 ? void 0 : oldTrack.kind,
2490
- oldTrackIsEffect: oldTrack === null || oldTrack === void 0 ? void 0 : oldTrack.effectTrack,
2491
+ oldTrackIsEffect: oldTrack && trackAnnotations(oldTrack).isEffectTrack,
2491
2492
  newTrackId: newTrack.id,
2492
2493
  newTrackKind: newTrack.kind,
2493
- newTrackIsEffect: newTrack.effectTrack,
2494
+ newTrackIsEffect: trackAnnotations(newTrack).isEffectTrack,
2494
2495
  });
2495
- this._incrementAnalyticMetric("P2PReplaceTrackNewTrackNotInStream");
2496
- }
2497
- stream = this.streams[0];
2498
- if (!stream) {
2499
- rtcStats.sendEvent("P2PReplaceTrackNoStream", {});
2500
- this._incrementAnalyticMetric("P2PReplaceTrackNoStream");
2501
- return Promise.reject(new Error("replaceTrack: No stream?"));
2502
- }
2503
- rtcStats.sendEvent("P2PReplaceTrackSourceKindNotFound", {
2504
- oldTrackId: oldTrack === null || oldTrack === void 0 ? void 0 : oldTrack.id,
2505
- oldTrackKind: oldTrack === null || oldTrack === void 0 ? void 0 : oldTrack.kind,
2506
- oldTrackIsEffect: oldTrack === null || oldTrack === void 0 ? void 0 : oldTrack.effectTrack,
2507
- newTrackId: newTrack.id,
2508
- newTrackKind: newTrack.kind,
2509
- newTrackIsEffect: newTrack.effectTrack,
2496
+ this._incrementAnalyticMetric("P2PReplaceTrackSourceKindNotFound");
2497
+ pc.addTrack(newTrack, stream);
2510
2498
  });
2511
- this._incrementAnalyticMetric("P2PReplaceTrackSourceKindNotFound");
2512
- return pc.addTrack(newTrack, stream);
2513
2499
  }
2514
2500
  changeBandwidth(bandwidth) {
2515
2501
  var _a;
@@ -2546,39 +2532,6 @@ class Session {
2546
2532
 
2547
2533
  const MEDIA_JITTER_BUFFER_TARGET = 400;
2548
2534
 
2549
- var _a$3;
2550
- const adapter$3 = (_a$3 = adapterRaw.default) !== null && _a$3 !== void 0 ? _a$3 : adapterRaw;
2551
- function detectMicrophoneNotWorking(pc) {
2552
- var _a, _b;
2553
- if (((_a = adapter$3.browserDetails) === null || _a === void 0 ? void 0 : _a.browser) !== "chrome" ||
2554
- ((_b = adapter$3.browserDetails) === null || _b === void 0 ? void 0 : _b.browser) < 58 ||
2555
- pc.signalingState === "closed") {
2556
- return Promise.resolve(false);
2557
- }
2558
- const sendingAudio = pc.getSenders().some((sender) => sender.track && sender.track.kind === "audio");
2559
- const receivingAudio = pc.getReceivers().some((receiver) => receiver.track && receiver.track.kind === "audio");
2560
- return pc.getStats(null).then((result) => {
2561
- let microphoneFailed = false;
2562
- result.forEach((report) => {
2563
- if (report.type === "outbound-rtp" &&
2564
- (report.kind === "audio" || report.mediaType === "audio") &&
2565
- sendingAudio) {
2566
- if (report.bytesSent === 0) {
2567
- microphoneFailed = "outbound";
2568
- }
2569
- }
2570
- else if (report.type === "inbound-rtp" &&
2571
- (report.kind === "audio" || report.mediaType === "audio") &&
2572
- receivingAudio) {
2573
- if (report.bytesReceived === 0) {
2574
- microphoneFailed = "inbound";
2575
- }
2576
- }
2577
- });
2578
- return microphoneFailed;
2579
- });
2580
- }
2581
-
2582
2535
  const EVENTS = {
2583
2536
  CLIENT_CONNECTION_STATUS_CHANGED: "client_connection_status_changed",
2584
2537
  STREAM_ADDED: "stream_added",
@@ -2616,14 +2569,14 @@ const STREAM_TYPES = {
2616
2569
  screenshare: "screenshare",
2617
2570
  };
2618
2571
 
2619
- var _a$2, _b$1, _c;
2620
- const adapter$2 = (_a$2 = adapterRaw.default) !== null && _a$2 !== void 0 ? _a$2 : adapterRaw;
2572
+ var _a$3, _b$1, _c;
2573
+ const adapter$3 = (_a$3 = adapterRaw.default) !== null && _a$3 !== void 0 ? _a$3 : adapterRaw;
2621
2574
  const logger$6 = new Logger();
2622
2575
  const ICE_PUBLIC_IP_GATHERING_TIMEOUT = 3 * 1000;
2623
- const browserName$1 = (_b$1 = adapter$2.browserDetails) === null || _b$1 === void 0 ? void 0 : _b$1.browser;
2624
- const browserVersion = adapter$2.browserDetails.version;
2625
- if (browserName$1 === "firefox" && adapter$2.browserShim && "shimGetDisplayMedia" in adapter$2.browserShim) {
2626
- (_c = adapter$2.browserShim) === null || _c === void 0 ? void 0 : _c.shimGetDisplayMedia(window, "screen");
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");
2627
2580
  }
2628
2581
  let unloading$1 = false;
2629
2582
  if (browserName$1 === "chrome") {
@@ -2651,7 +2604,6 @@ class P2pRtcManager {
2651
2604
  this._closed = false;
2652
2605
  this.skipEmittingServerMessageCount = 0;
2653
2606
  this.offerOptions = { offerToReceiveAudio: true, offerToReceiveVideo: true };
2654
- this._pendingActionsForConnectedPeerConnections = [];
2655
2607
  this._audioTrackOnEnded = () => {
2656
2608
  rtcStats.sendEvent("audio_ended", { unloading: unloading$1 });
2657
2609
  this._emit(rtcManagerEvents.MICROPHONE_STOPPED_WORKING, {});
@@ -2684,10 +2636,8 @@ class P2pRtcManager {
2684
2636
  numPcOnAnswerFailure: 0,
2685
2637
  numPcOnOfferFailure: 0,
2686
2638
  P2PChangeBandwidthEmptySDPType: 0,
2687
- P2PNegotiationNeeded: 0,
2688
2639
  P2PSessionAlreadyCreated: 0,
2689
2640
  P2PReplaceTrackNoStream: 0,
2690
- P2PReplaceTrackNoNewTrack: 0,
2691
2641
  P2PReplaceTrackNewTrackEnded: 0,
2692
2642
  P2PReplaceTrackNewTrackNotInStream: 0,
2693
2643
  P2PReplaceTrackOldTrackNotFound: 0,
@@ -2721,7 +2671,7 @@ class P2pRtcManager {
2721
2671
  const audioTrack = stream.getAudioTracks()[0];
2722
2672
  const videoTrack = stream.getVideoTracks()[0];
2723
2673
  if (audioTrack) {
2724
- if (!audioTrack.effectTrack) {
2674
+ if (!trackAnnotations(audioTrack).isEffectTrack) {
2725
2675
  this._monitorAudioTrack(audioTrack);
2726
2676
  }
2727
2677
  const beforeEffectTrack = beforeEffectTracks.find((t) => t.kind === "audio");
@@ -2730,7 +2680,7 @@ class P2pRtcManager {
2730
2680
  }
2731
2681
  }
2732
2682
  if (videoTrack) {
2733
- if (!videoTrack.effectTrack) {
2683
+ if (!trackAnnotations(videoTrack).isEffectTrack) {
2734
2684
  this._monitorVideoTrack(videoTrack);
2735
2685
  }
2736
2686
  const beforeEffectTrack = beforeEffectTracks.find((t) => t.kind === "video");
@@ -2757,10 +2707,10 @@ class P2pRtcManager {
2757
2707
  return;
2758
2708
  }
2759
2709
  replaceTrack(oldTrack, newTrack) {
2760
- if (newTrack.kind === "audio" && !newTrack.effectTrack) {
2710
+ if (newTrack.kind === "audio" && !trackAnnotations(newTrack).isEffectTrack) {
2761
2711
  this._monitorAudioTrack(newTrack);
2762
2712
  }
2763
- if (newTrack.kind === "video" && !newTrack.effectTrack) {
2713
+ if (newTrack.kind === "video" && !trackAnnotations(newTrack).isEffectTrack) {
2764
2714
  this._monitorVideoTrack(newTrack);
2765
2715
  }
2766
2716
  return this._replaceTrackToPeerConnections(oldTrack, newTrack);
@@ -2851,25 +2801,6 @@ class P2pRtcManager {
2851
2801
  this.analytics.numPcOnAnswerFailure++;
2852
2802
  });
2853
2803
  }),
2854
- this._serverSocket.on(PROTOCOL_RESPONSES.ROOM_JOINED, (payload) => {
2855
- if ("error" in payload || !this._wasScreenSharing) {
2856
- return;
2857
- }
2858
- const screenShareStreamId = Object.keys(this.localStreams).find((id) => id !== CAMERA_STREAM_ID);
2859
- if (!screenShareStreamId) {
2860
- return;
2861
- }
2862
- const screenshareStream = this.localStreams[screenShareStreamId];
2863
- if (!screenshareStream) {
2864
- logger$6.warn("screenshare stream %s not found", screenShareStreamId);
2865
- return;
2866
- }
2867
- const hasAudioTrack = screenshareStream.getAudioTracks().length > 0;
2868
- this._emitServerEvent(PROTOCOL_REQUESTS.START_SCREENSHARE, {
2869
- streamId: screenShareStreamId,
2870
- hasAudioTrack,
2871
- });
2872
- }),
2873
2804
  this._serverSocket.on(PROTOCOL_RESPONSES.SCREENSHARE_STOPPED, (payload) => {
2874
2805
  const session = this._getSession(payload.clientId);
2875
2806
  if (session) {
@@ -2987,31 +2918,6 @@ class P2pRtcManager {
2987
2918
  }
2988
2919
  return this.peerConnections[peerConnectionId];
2989
2920
  }
2990
- _getOrCreateSession({ peerConnectionId, clientId, initialBandwidth, peerConnectionConfig, }) {
2991
- let session = this.peerConnections[peerConnectionId];
2992
- if (session === undefined) {
2993
- const deprioritizeH264Encoding = browserName$1 === "safari" &&
2994
- browserVersion &&
2995
- browserVersion >= 14 &&
2996
- this._features.deprioritizeH264OnSafari;
2997
- this.peerConnections[peerConnectionId] = session = new Session({
2998
- peerConnectionId,
2999
- clientId,
3000
- peerConnectionConfig,
3001
- bandwidth: initialBandwidth,
3002
- deprioritizeH264Encoding,
3003
- incrementAnalyticMetric: (metric) => this.analytics[metric]++,
3004
- });
3005
- }
3006
- else {
3007
- this.analytics.P2PSessionAlreadyCreated++;
3008
- rtcStats.sendEvent("P2PSessionAlreadyCreated", {
3009
- clientId,
3010
- peerConnectionId,
3011
- });
3012
- }
3013
- return session;
3014
- }
3015
2921
  _getLocalCameraStream() {
3016
2922
  return this.localStreams[CAMERA_STREAM_ID];
3017
2923
  }
@@ -3025,7 +2931,7 @@ class P2pRtcManager {
3025
2931
  const streamIds = this._getNonLocalCameraStreamIds();
3026
2932
  return streamIds.length === 0 ? null : this.localStreams[streamIds[0]];
3027
2933
  }
3028
- _createSession({ clientId, initialBandwidth, isOfferer, peerConnectionId, }) {
2934
+ _createSession({ clientId, initialBandwidth, isOfferer, peerConnectionId }) {
3029
2935
  if (!peerConnectionId) {
3030
2936
  throw new Error("peerConnectionId is missing");
3031
2937
  }
@@ -3038,12 +2944,19 @@ class P2pRtcManager {
3038
2944
  peerConnectionConfig.iceServers = turnServerOverride(peerConnectionConfig.iceServers, this._features.turnServerOverrideHost);
3039
2945
  external_stun_servers(peerConnectionConfig, this._features);
3040
2946
  maybeTurnOnly(peerConnectionConfig, this._features);
3041
- const session = this._getOrCreateSession({
2947
+ const deprioritizeH264Encoding = browserName$1 === "safari" &&
2948
+ browserVersion &&
2949
+ browserVersion >= 14 &&
2950
+ this._features.deprioritizeH264OnSafari;
2951
+ const session = new Session({
3042
2952
  peerConnectionId,
3043
2953
  clientId,
3044
- initialBandwidth,
3045
2954
  peerConnectionConfig,
2955
+ bandwidth: initialBandwidth,
2956
+ deprioritizeH264Encoding,
2957
+ incrementAnalyticMetric: (metric) => this.analytics[metric]++,
3046
2958
  });
2959
+ this.peerConnections[peerConnectionId] = session;
3047
2960
  setTimeout(() => this._emit(rtcManagerEvents.NEW_PC), 0);
3048
2961
  this.analytics.numNewPc++;
3049
2962
  const { pc } = session;
@@ -3066,6 +2979,7 @@ class P2pRtcManager {
3066
2979
  }
3067
2980
  };
3068
2981
  pc.oniceconnectionstatechange = () => {
2982
+ var _a;
3069
2983
  let newStatus;
3070
2984
  const currentStatus = session.connectionStatus;
3071
2985
  switch (pc.iceConnectionState) {
@@ -3075,14 +2989,10 @@ class P2pRtcManager {
3075
2989
  case "connected":
3076
2990
  case "completed":
3077
2991
  newStatus = TYPES.CONNECTION_SUCCESSFUL;
3078
- if (!session.wasEverConnected) {
3079
- this._pendingActionsForConnectedPeerConnections.forEach((action) => {
3080
- if (typeof action === "function") {
3081
- action();
3082
- }
3083
- });
3084
- this._pendingActionsForConnectedPeerConnections = [];
3085
- }
2992
+ session.pendingReplaceTrackActions.forEach((action) => __awaiter(this, void 0, void 0, function* () {
2993
+ yield action();
2994
+ }));
2995
+ session.pendingReplaceTrackActions = [];
3086
2996
  if (!session.wasEverConnected &&
3087
2997
  (pc.iceConnectionState.match(/connected|completed/) ||
3088
2998
  (browserName$1 === "chrome" && pc.localDescription && pc.localDescription.type === "answer"))) {
@@ -3091,7 +3001,7 @@ class P2pRtcManager {
3091
3001
  if (this._isAudioOnlyMode) {
3092
3002
  session.setAudioOnly(true, this._screenshareVideoTrackIds);
3093
3003
  }
3094
- session.registerConnected();
3004
+ (_a = session.registerConnected) === null || _a === void 0 ? void 0 : _a.call(session, {});
3095
3005
  break;
3096
3006
  case "disconnected":
3097
3007
  newStatus = TYPES.CONNECTION_DISCONNECTED;
@@ -3115,28 +3025,19 @@ class P2pRtcManager {
3115
3025
  }
3116
3026
  this._setConnectionStatus(session, newStatus, clientId);
3117
3027
  };
3118
- pc.onconnectionstate = () => {
3028
+ pc.onconnectionstatechange = () => {
3029
+ var _a;
3119
3030
  switch (pc.connectionState) {
3120
3031
  case "connected":
3121
- setTimeout(() => {
3122
- detectMicrophoneNotWorking(session.pc).then((failureDirection) => {
3123
- if (failureDirection !== false) {
3124
- this._emit(rtcManagerEvents.MICROPHONE_NOT_WORKING, {
3125
- failureDirection,
3126
- clientId,
3127
- });
3128
- }
3129
- });
3130
- }, 3000);
3131
- session.registerConnected();
3032
+ (_a = session.registerConnected) === null || _a === void 0 ? void 0 : _a.call(session, {});
3132
3033
  break;
3133
3034
  case "failed":
3134
3035
  const newStatus = TYPES.CONNECTION_FAILED;
3135
- if (session.relayCandidateSeen === null && !session.wasEverConnected) {
3136
- this._emit(rtcManagerEvents.CONNECTION_BLOCKED_BY_NETWORK);
3137
- }
3138
3036
  this._setConnectionStatus(session, newStatus, clientId);
3139
3037
  break;
3038
+ case "closed":
3039
+ this._cleanup(session.clientId);
3040
+ break;
3140
3041
  }
3141
3042
  };
3142
3043
  const localCameraStream = this.localStreams[CAMERA_STREAM_ID];
@@ -3192,43 +3093,34 @@ class P2pRtcManager {
3192
3093
  const promises = [];
3193
3094
  this._forEachPeerConnection((session) => {
3194
3095
  if (!session.hasConnectedPeerConnection()) {
3195
- rtcStats.sendEvent("P2PReplaceTrackWithoutPC", {});
3196
- this.analytics.P2PReplaceTrackWithoutPC++;
3197
- logger$6.info("Session doesn't have a connected PeerConnection, adding pending action!");
3198
- const pendingActions = this._pendingActionsForConnectedPeerConnections;
3199
- if (!pendingActions) {
3200
- rtcStats.sendEvent("P2PReplaceTrackToPCsPendingActionsNull", {});
3201
- this.analytics.P2PReplaceTrackToPCsPendingActionsNull++;
3202
- logger$6.warn(`No pending action is created to replace track, because the pending actions array is null`);
3096
+ if (session.pc.connectionState === "closed")
3203
3097
  return;
3204
- }
3098
+ logger$6.info("Session doesn't have a connected PeerConnection, adding pending action!");
3099
+ this.analytics.P2PReplaceTrackWithoutPC++;
3100
+ rtcStats.sendEvent("P2PReplaceTrackWithoutPC", {
3101
+ connectionState: session.pc.connectionState,
3102
+ iceConnectionState: session.pc.iceConnectionState,
3103
+ });
3205
3104
  const promise = new Promise((resolve, reject) => {
3206
- const action = () => {
3207
- const replacedTrackPromise = session.replaceTrack(oldTrack, newTrack);
3208
- if (!replacedTrackPromise) {
3209
- rtcStats.sendEvent("P2PReplaceTrackReturnedFalse", {});
3210
- this.analytics.P2PReplaceTrackReturnedFalse++;
3211
- logger$6.error("replaceTrack returned false!");
3212
- reject(`ReplaceTrack returned false`);
3213
- return;
3105
+ const action = () => __awaiter(this, void 0, void 0, function* () {
3106
+ try {
3107
+ yield session.replaceTrack(oldTrack, newTrack);
3108
+ resolve({});
3214
3109
  }
3215
- replacedTrackPromise.then((track) => resolve(track)).catch((error) => reject(error));
3216
- };
3217
- pendingActions.push(action);
3110
+ catch (error) {
3111
+ reject(error);
3112
+ }
3113
+ });
3114
+ session.pendingReplaceTrackActions.push(action);
3218
3115
  });
3219
3116
  promises.push(promise);
3220
3117
  return;
3221
3118
  }
3222
- const replacedTrackResult = session.replaceTrack(oldTrack, newTrack);
3223
- if (!replacedTrackResult) {
3224
- rtcStats.sendEvent("P2PReplaceTrackReturnedFalse", {});
3225
- this.analytics.P2PReplaceTrackReturnedFalse++;
3226
- logger$6.error("replaceTrack returned false!");
3227
- return;
3228
- }
3229
- promises.push(replacedTrackResult);
3119
+ promises.push(session.replaceTrack(oldTrack, newTrack));
3120
+ });
3121
+ return Promise.all(promises).catch((error) => {
3122
+ logger$6.error(String(error));
3230
3123
  });
3231
- return Promise.all(promises);
3232
3124
  }
3233
3125
  _removeStreamFromPeerConnections(stream) {
3234
3126
  this._forEachPeerConnection((session) => {
@@ -3300,7 +3192,7 @@ class P2pRtcManager {
3300
3192
  isOfferer: true,
3301
3193
  });
3302
3194
  this._negotiatePeerConnection(clientId, session);
3303
- return Promise.resolve(session);
3195
+ return session;
3304
3196
  }
3305
3197
  _maybeRestartIce(clientId, session) {
3306
3198
  const pc = session.pc;
@@ -3563,8 +3455,6 @@ class P2pRtcManager {
3563
3455
  }
3564
3456
  };
3565
3457
  pc.onnegotiationneeded = () => {
3566
- this.analytics.P2PNegotiationNeeded++;
3567
- rtcStats.sendEvent("P2PNegotiationNeeded", {});
3568
3458
  if (pc.iceConnectionState === "new" || !session.connectionStatus) {
3569
3459
  return;
3570
3460
  }
@@ -3579,7 +3469,6 @@ class P2pRtcManager {
3579
3469
  }
3580
3470
  let initialBandwidth = (session && session.bandwidth) || 0;
3581
3471
  if (session) {
3582
- logger$6.warn("Replacing peer session", clientId);
3583
3472
  this._cleanup(clientId);
3584
3473
  }
3585
3474
  else {
@@ -3631,9 +3520,7 @@ class P2pRtcManager {
3631
3520
  return;
3632
3521
  }
3633
3522
  if (enable === false) {
3634
- const stopCameraDelay = ((_a = localStream.getVideoTracks().find((t) => !t.enabled)) === null || _a === void 0 ? void 0 : _a.readyState) === "ended"
3635
- ? 0
3636
- : 5000;
3523
+ const stopCameraDelay = ((_a = localStream.getVideoTracks().find((t) => !t.enabled)) === null || _a === void 0 ? void 0 : _a.readyState) === "ended" ? 0 : 5000;
3637
3524
  setTimeout(() => {
3638
3525
  localStream.getVideoTracks().forEach((track) => {
3639
3526
  if (track.enabled === false) {
@@ -4521,10 +4408,10 @@ function createVegaConnectionManager(config) {
4521
4408
  return { connect, updateHostList, networkIsUp, networkIsPossiblyDown };
4522
4409
  }
4523
4410
 
4524
- var _a$1;
4525
- const adapter$1 = (_a$1 = adapterRaw.default) !== null && _a$1 !== void 0 ? _a$1 : adapterRaw;
4411
+ var _a$2;
4412
+ const adapter$2 = (_a$2 = adapterRaw.default) !== null && _a$2 !== void 0 ? _a$2 : adapterRaw;
4526
4413
  const logger$2 = new Logger();
4527
- const browserName = adapter$1.browserDetails.browser;
4414
+ const browserName = adapter$2.browserDetails.browser;
4528
4415
  let unloading = false;
4529
4416
  const RESTARTICE_ERROR_RETRY_THRESHOLD_IN_MS = 3500;
4530
4417
  const RESTARTICE_ERROR_MAX_RETRY_COUNT = 5;
@@ -5466,14 +5353,14 @@ class VegaRtcManager {
5466
5353
  }
5467
5354
  replaceTrack(oldTrack, track) {
5468
5355
  if (track.kind === "audio") {
5469
- if (!track.effectTrack) {
5356
+ if (!trackAnnotations(track).isEffectTrack) {
5470
5357
  this._monitorAudioTrack(track);
5471
5358
  }
5472
5359
  this._micTrack = track;
5473
5360
  this._replaceMicTrack();
5474
5361
  }
5475
5362
  if (track.kind === "video") {
5476
- if (!track.effectTrack) {
5363
+ if (!trackAnnotations(track).isEffectTrack) {
5477
5364
  this._monitorVideoTrack(track);
5478
5365
  }
5479
5366
  this._webcamTrack = track;
@@ -5506,7 +5393,7 @@ class VegaRtcManager {
5506
5393
  const audioTrack = stream.getAudioTracks()[0];
5507
5394
  if (videoTrack) {
5508
5395
  this._sendWebcam(videoTrack);
5509
- if (!videoTrack.effectTrack) {
5396
+ if (!trackAnnotations(videoTrack).isEffectTrack) {
5510
5397
  this._monitorVideoTrack(videoTrack);
5511
5398
  }
5512
5399
  const beforeEffectTrack = beforeEffectTracks.find((t) => t.kind === "video");
@@ -5517,7 +5404,7 @@ class VegaRtcManager {
5517
5404
  if (audioTrack) {
5518
5405
  this._sendMic(audioTrack);
5519
5406
  this._syncMicAnalyser();
5520
- if (!audioTrack.effectTrack) {
5407
+ if (!trackAnnotations(audioTrack).isEffectTrack) {
5521
5408
  this._monitorAudioTrack(audioTrack);
5522
5409
  }
5523
5410
  const beforeEffectTrack = beforeEffectTracks.find((t) => t.kind === "audio");
@@ -5591,9 +5478,7 @@ class VegaRtcManager {
5591
5478
  }
5592
5479
  if (!enable) {
5593
5480
  clearTimeout(this._stopCameraTimeout);
5594
- const stopCameraDelay = ((_a = localStream.getVideoTracks().find((t) => !t.enabled)) === null || _a === void 0 ? void 0 : _a.readyState) === "ended"
5595
- ? 0
5596
- : 5000;
5481
+ const stopCameraDelay = ((_a = localStream.getVideoTracks().find((t) => !t.enabled)) === null || _a === void 0 ? void 0 : _a.readyState) === "ended" ? 0 : 5000;
5597
5482
  this._stopCameraTimeout = setTimeout(() => {
5598
5483
  localStream.getVideoTracks().forEach((track) => {
5599
5484
  if (track.enabled === false) {
@@ -7137,6 +7022,39 @@ class BandwidthTester extends EventEmitter {
7137
7022
  }
7138
7023
  }
7139
7024
 
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
+
7140
7058
  var _a, _b;
7141
7059
  const adapter = (_a = adapterRaw.default) !== null && _a !== void 0 ? _a : adapterRaw;
7142
7060
  const isSafari = ((_b = adapter.browserDetails) === null || _b === void 0 ? void 0 : _b.browser) === "safari";
@@ -7298,22 +7216,13 @@ function replaceTracksInStream(stream, newStream, only) {
7298
7216
  const replacedTracks = [];
7299
7217
  if (!only || only === "audio") {
7300
7218
  replacedTracks.push(...stream.getAudioTracks());
7301
- newStream.getAudioTracks().forEach((track) => {
7302
- track.replacement = true;
7303
- stream.addTrack(track);
7304
- });
7219
+ newStream.getAudioTracks().forEach((track) => stream.addTrack(track));
7305
7220
  }
7306
7221
  if (!only || only === "video") {
7307
7222
  replacedTracks.push(...stream.getVideoTracks());
7308
- newStream.getVideoTracks().forEach((track) => {
7309
- track.replacement = true;
7310
- stream.addTrack(track);
7311
- });
7223
+ newStream.getVideoTracks().forEach((track) => stream.addTrack(track));
7312
7224
  }
7313
- replacedTracks.forEach((track) => {
7314
- track.replaced = true;
7315
- stream.removeTrack(track);
7316
- });
7225
+ replacedTracks.forEach((track) => stream.removeTrack(track));
7317
7226
  return replacedTracks;
7318
7227
  }
7319
7228
  function getStream(constraintOpt_1) {