@whereby.com/media 2.8.7 → 2.8.9
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 +168 -259
- package/dist/index.d.cts +28 -36
- package/dist/index.d.mts +28 -36
- package/dist/index.d.ts +28 -36
- package/dist/index.mjs +168 -259
- package/dist/legacy-esm.js +168 -259
- package/package.json +4 -4
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
|
-
|
|
2326
|
-
|
|
2327
|
-
|
|
2328
|
-
|
|
2329
|
-
|
|
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
|
-
|
|
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
|
|
2428
|
+
return this.pc.connectionState === "connected";
|
|
2434
2429
|
}
|
|
2435
2430
|
replaceTrack(oldTrack, newTrack) {
|
|
2436
|
-
|
|
2437
|
-
|
|
2438
|
-
|
|
2439
|
-
|
|
2440
|
-
|
|
2441
|
-
|
|
2442
|
-
|
|
2443
|
-
|
|
2444
|
-
|
|
2445
|
-
|
|
2446
|
-
|
|
2447
|
-
|
|
2448
|
-
|
|
2449
|
-
|
|
2450
|
-
|
|
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
|
-
|
|
2460
|
-
|
|
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
|
-
|
|
2464
|
-
|
|
2465
|
-
|
|
2466
|
-
|
|
2467
|
-
|
|
2468
|
-
|
|
2469
|
-
|
|
2470
|
-
|
|
2471
|
-
|
|
2472
|
-
|
|
2473
|
-
|
|
2474
|
-
|
|
2475
|
-
|
|
2476
|
-
|
|
2477
|
-
|
|
2478
|
-
|
|
2479
|
-
|
|
2480
|
-
|
|
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
|
|
2491
|
+
oldTrackIsEffect: oldTrack && trackAnnotations(oldTrack).isEffectTrack,
|
|
2491
2492
|
newTrackId: newTrack.id,
|
|
2492
2493
|
newTrackKind: newTrack.kind,
|
|
2493
|
-
newTrackIsEffect: newTrack.
|
|
2494
|
+
newTrackIsEffect: trackAnnotations(newTrack).isEffectTrack,
|
|
2494
2495
|
});
|
|
2495
|
-
this._incrementAnalyticMetric("
|
|
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$
|
|
2620
|
-
const adapter$
|
|
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$
|
|
2624
|
-
const browserVersion = adapter$
|
|
2625
|
-
if (browserName$1 === "firefox" && adapter$
|
|
2626
|
-
(_c = adapter$
|
|
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.
|
|
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.
|
|
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.
|
|
2710
|
+
if (newTrack.kind === "audio" && !trackAnnotations(newTrack).isEffectTrack) {
|
|
2761
2711
|
this._monitorAudioTrack(newTrack);
|
|
2762
2712
|
}
|
|
2763
|
-
if (newTrack.kind === "video" && !newTrack.
|
|
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
|
|
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
|
-
|
|
3079
|
-
|
|
3080
|
-
|
|
3081
|
-
|
|
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.
|
|
3028
|
+
pc.onconnectionstatechange = () => {
|
|
3029
|
+
var _a;
|
|
3119
3030
|
switch (pc.connectionState) {
|
|
3120
3031
|
case "connected":
|
|
3121
|
-
|
|
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
|
-
|
|
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
|
-
|
|
3208
|
-
|
|
3209
|
-
|
|
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
|
-
|
|
3216
|
-
|
|
3217
|
-
|
|
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
|
-
|
|
3223
|
-
|
|
3224
|
-
|
|
3225
|
-
|
|
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
|
|
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$
|
|
4525
|
-
const adapter$
|
|
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$
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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) {
|