@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 +168 -259
- package/dist/index.d.cts +22 -33
- package/dist/index.d.mts +22 -33
- package/dist/index.d.ts +22 -33
- package/dist/index.mjs +168 -259
- package/dist/legacy-esm.js +168 -259
- package/package.json +2 -2
package/dist/legacy-esm.js
CHANGED
|
@@ -2224,6 +2224,7 @@ class Session {
|
|
|
2224
2224
|
this.ipv6HostCandidateTeredoSeen = false;
|
|
2225
2225
|
this.ipv6HostCandidate6to4Seen = false;
|
|
2226
2226
|
this.mdnsHostCandidateSeen = false;
|
|
2227
|
+
this.pendingReplaceTrackActions = [];
|
|
2227
2228
|
this.peerConnectionConfig = peerConnectionConfig;
|
|
2228
2229
|
this.clientId = clientId;
|
|
2229
2230
|
this.pc = new RTCPeerConnection(this.peerConnectionConfig);
|
|
@@ -2300,22 +2301,16 @@ class Session {
|
|
|
2300
2301
|
if (streamIndex !== -1) {
|
|
2301
2302
|
this.streams.splice(streamIndex, 1);
|
|
2302
2303
|
}
|
|
2303
|
-
if (this.pc) {
|
|
2304
|
-
|
|
2305
|
-
|
|
2306
|
-
|
|
2307
|
-
|
|
2308
|
-
|
|
2309
|
-
|
|
2310
|
-
});
|
|
2311
|
-
}
|
|
2312
|
-
else if (this.pc.removeStream) {
|
|
2313
|
-
this.pc.removeStream(stream);
|
|
2314
|
-
}
|
|
2304
|
+
if (this.pc.removeTrack) {
|
|
2305
|
+
stream.getTracks().forEach((track) => {
|
|
2306
|
+
const sender = this.pc.getSenders().find((sender) => sender.track === track);
|
|
2307
|
+
if (sender) {
|
|
2308
|
+
this.pc.removeTrack(sender);
|
|
2309
|
+
}
|
|
2310
|
+
});
|
|
2315
2311
|
}
|
|
2316
|
-
else {
|
|
2317
|
-
|
|
2318
|
-
this._incrementAnalyticMetric("P2PRemoveStreamNoPC");
|
|
2312
|
+
else if (this.pc.removeStream) {
|
|
2313
|
+
this.pc.removeStream(stream);
|
|
2319
2314
|
}
|
|
2320
2315
|
}
|
|
2321
2316
|
_setRemoteDescription(desc) {
|
|
@@ -2409,86 +2404,77 @@ class Session {
|
|
|
2409
2404
|
}
|
|
2410
2405
|
}
|
|
2411
2406
|
hasConnectedPeerConnection() {
|
|
2412
|
-
return this.pc
|
|
2407
|
+
return this.pc.connectionState === "connected";
|
|
2413
2408
|
}
|
|
2414
2409
|
replaceTrack(oldTrack, newTrack) {
|
|
2415
|
-
|
|
2416
|
-
|
|
2417
|
-
|
|
2418
|
-
|
|
2419
|
-
|
|
2420
|
-
|
|
2421
|
-
|
|
2422
|
-
|
|
2423
|
-
|
|
2424
|
-
|
|
2425
|
-
|
|
2426
|
-
|
|
2427
|
-
|
|
2428
|
-
|
|
2429
|
-
|
|
2410
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
2411
|
+
logger$7.info("replacetrack() [oldTrackId: %s, newTrackId: %s]", oldTrack === null || oldTrack === void 0 ? void 0 : oldTrack.id, newTrack.id);
|
|
2412
|
+
if (newTrack.readyState === "ended") {
|
|
2413
|
+
rtcStats.sendEvent("P2PReplaceTrackNewTrackEnded", {
|
|
2414
|
+
newTrackId: newTrack.id,
|
|
2415
|
+
newTrackKind: newTrack.kind,
|
|
2416
|
+
newTrackIsEffect: trackAnnotations(newTrack).isEffectTrack,
|
|
2417
|
+
});
|
|
2418
|
+
this._incrementAnalyticMetric("P2PReplaceTrackNewTrackEnded");
|
|
2419
|
+
throw new Error(`refusing to replace track trackId: ${newTrack.id} kind: ${newTrack.kind} with readyState: ${newTrack.readyState}`);
|
|
2420
|
+
}
|
|
2421
|
+
const pc = this.pc;
|
|
2422
|
+
if (oldTrack) {
|
|
2423
|
+
const sender = pc.getSenders().find((s) => { var _a; return ((_a = s.track) === null || _a === void 0 ? void 0 : _a.id) === oldTrack.id; });
|
|
2424
|
+
if (sender) {
|
|
2425
|
+
return yield sender.replaceTrack(newTrack);
|
|
2426
|
+
}
|
|
2427
|
+
}
|
|
2428
|
+
const sender = pc.getSenders().find((s) => {
|
|
2429
|
+
const track = s.track;
|
|
2430
|
+
return (track === null || track === void 0 ? void 0 : track.kind) === newTrack.kind && !trackAnnotations(track).fromGetDisplayMedia;
|
|
2430
2431
|
});
|
|
2431
|
-
this._incrementAnalyticMetric("P2PReplaceTrackNewTrackEnded");
|
|
2432
|
-
return false;
|
|
2433
|
-
}
|
|
2434
|
-
const pc = this.pc;
|
|
2435
|
-
if (oldTrack) {
|
|
2436
|
-
const sender = pc.getSenders().find((s) => { var _a; return ((_a = s.track) === null || _a === void 0 ? void 0 : _a.id) === oldTrack.id; });
|
|
2437
2432
|
if (sender) {
|
|
2438
|
-
|
|
2439
|
-
|
|
2433
|
+
this._incrementAnalyticMetric("P2PReplaceTrackOldTrackNotFound");
|
|
2434
|
+
const track = sender.track;
|
|
2435
|
+
rtcStats.sendEvent("P2PReplaceTrackOldTrackNotFound", {
|
|
2436
|
+
targetTrackId: track === null || track === void 0 ? void 0 : track.id,
|
|
2437
|
+
targetTrackKind: track === null || track === void 0 ? void 0 : track.kind,
|
|
2438
|
+
targetTrackIsEffect: track && trackAnnotations(track).isEffectTrack,
|
|
2439
|
+
targetTrackReadyState: track === null || track === void 0 ? void 0 : track.readyState,
|
|
2440
|
+
newTrackId: newTrack.id,
|
|
2441
|
+
newTrackKind: newTrack.kind,
|
|
2442
|
+
newTrackIsEffect: trackAnnotations(newTrack).isEffectTrack,
|
|
2443
|
+
oldTrackId: oldTrack === null || oldTrack === void 0 ? void 0 : oldTrack.id,
|
|
2444
|
+
oldTrackKind: oldTrack === null || oldTrack === void 0 ? void 0 : oldTrack.kind,
|
|
2445
|
+
oldTrackIsEffect: oldTrack && trackAnnotations(oldTrack).isEffectTrack,
|
|
2446
|
+
});
|
|
2447
|
+
return yield sender.replaceTrack(newTrack);
|
|
2440
2448
|
}
|
|
2441
|
-
|
|
2442
|
-
|
|
2443
|
-
|
|
2444
|
-
|
|
2445
|
-
|
|
2446
|
-
|
|
2447
|
-
|
|
2448
|
-
|
|
2449
|
-
|
|
2450
|
-
|
|
2451
|
-
|
|
2452
|
-
|
|
2453
|
-
|
|
2454
|
-
|
|
2455
|
-
|
|
2456
|
-
|
|
2457
|
-
|
|
2458
|
-
|
|
2459
|
-
|
|
2460
|
-
});
|
|
2461
|
-
sender.replaceTrack(newTrack);
|
|
2462
|
-
return Promise.resolve(newTrack);
|
|
2463
|
-
}
|
|
2464
|
-
let stream = this.streams.find((s) => s.getTracks().find((t) => t.id === newTrack.id));
|
|
2465
|
-
if (!stream) {
|
|
2466
|
-
rtcStats.sendEvent("P2PReplaceTrackNewTrackNotInStream", {
|
|
2449
|
+
let stream = this.streams.find((s) => s.getTracks().find((t) => t.id === newTrack.id));
|
|
2450
|
+
if (!stream) {
|
|
2451
|
+
rtcStats.sendEvent("P2PReplaceTrackNewTrackNotInStream", {
|
|
2452
|
+
oldTrackId: oldTrack === null || oldTrack === void 0 ? void 0 : oldTrack.id,
|
|
2453
|
+
oldTrackKind: oldTrack === null || oldTrack === void 0 ? void 0 : oldTrack.kind,
|
|
2454
|
+
oldTrackIsEffect: oldTrack && trackAnnotations(oldTrack).isEffectTrack,
|
|
2455
|
+
newTrackId: newTrack.id,
|
|
2456
|
+
newTrackKind: newTrack.kind,
|
|
2457
|
+
newTrackIsEffect: trackAnnotations(newTrack).isEffectTrack,
|
|
2458
|
+
});
|
|
2459
|
+
this._incrementAnalyticMetric("P2PReplaceTrackNewTrackNotInStream");
|
|
2460
|
+
}
|
|
2461
|
+
stream = this.streams[0];
|
|
2462
|
+
if (!stream) {
|
|
2463
|
+
rtcStats.sendEvent("P2PReplaceTrackNoStream", {});
|
|
2464
|
+
this._incrementAnalyticMetric("P2PReplaceTrackNoStream");
|
|
2465
|
+
throw new Error("replaceTrack: No stream?");
|
|
2466
|
+
}
|
|
2467
|
+
rtcStats.sendEvent("P2PReplaceTrackSourceKindNotFound", {
|
|
2467
2468
|
oldTrackId: oldTrack === null || oldTrack === void 0 ? void 0 : oldTrack.id,
|
|
2468
2469
|
oldTrackKind: oldTrack === null || oldTrack === void 0 ? void 0 : oldTrack.kind,
|
|
2469
|
-
oldTrackIsEffect: oldTrack
|
|
2470
|
+
oldTrackIsEffect: oldTrack && trackAnnotations(oldTrack).isEffectTrack,
|
|
2470
2471
|
newTrackId: newTrack.id,
|
|
2471
2472
|
newTrackKind: newTrack.kind,
|
|
2472
|
-
newTrackIsEffect: newTrack.
|
|
2473
|
+
newTrackIsEffect: trackAnnotations(newTrack).isEffectTrack,
|
|
2473
2474
|
});
|
|
2474
|
-
this._incrementAnalyticMetric("
|
|
2475
|
-
|
|
2476
|
-
stream = this.streams[0];
|
|
2477
|
-
if (!stream) {
|
|
2478
|
-
rtcStats.sendEvent("P2PReplaceTrackNoStream", {});
|
|
2479
|
-
this._incrementAnalyticMetric("P2PReplaceTrackNoStream");
|
|
2480
|
-
return Promise.reject(new Error("replaceTrack: No stream?"));
|
|
2481
|
-
}
|
|
2482
|
-
rtcStats.sendEvent("P2PReplaceTrackSourceKindNotFound", {
|
|
2483
|
-
oldTrackId: oldTrack === null || oldTrack === void 0 ? void 0 : oldTrack.id,
|
|
2484
|
-
oldTrackKind: oldTrack === null || oldTrack === void 0 ? void 0 : oldTrack.kind,
|
|
2485
|
-
oldTrackIsEffect: oldTrack === null || oldTrack === void 0 ? void 0 : oldTrack.effectTrack,
|
|
2486
|
-
newTrackId: newTrack.id,
|
|
2487
|
-
newTrackKind: newTrack.kind,
|
|
2488
|
-
newTrackIsEffect: newTrack.effectTrack,
|
|
2475
|
+
this._incrementAnalyticMetric("P2PReplaceTrackSourceKindNotFound");
|
|
2476
|
+
pc.addTrack(newTrack, stream);
|
|
2489
2477
|
});
|
|
2490
|
-
this._incrementAnalyticMetric("P2PReplaceTrackSourceKindNotFound");
|
|
2491
|
-
return pc.addTrack(newTrack, stream);
|
|
2492
2478
|
}
|
|
2493
2479
|
changeBandwidth(bandwidth) {
|
|
2494
2480
|
var _a;
|
|
@@ -2525,39 +2511,6 @@ class Session {
|
|
|
2525
2511
|
|
|
2526
2512
|
const MEDIA_JITTER_BUFFER_TARGET = 400;
|
|
2527
2513
|
|
|
2528
|
-
var _a$3;
|
|
2529
|
-
const adapter$3 = (_a$3 = adapterRaw.default) !== null && _a$3 !== void 0 ? _a$3 : adapterRaw;
|
|
2530
|
-
function detectMicrophoneNotWorking(pc) {
|
|
2531
|
-
var _a, _b;
|
|
2532
|
-
if (((_a = adapter$3.browserDetails) === null || _a === void 0 ? void 0 : _a.browser) !== "chrome" ||
|
|
2533
|
-
((_b = adapter$3.browserDetails) === null || _b === void 0 ? void 0 : _b.browser) < 58 ||
|
|
2534
|
-
pc.signalingState === "closed") {
|
|
2535
|
-
return Promise.resolve(false);
|
|
2536
|
-
}
|
|
2537
|
-
const sendingAudio = pc.getSenders().some((sender) => sender.track && sender.track.kind === "audio");
|
|
2538
|
-
const receivingAudio = pc.getReceivers().some((receiver) => receiver.track && receiver.track.kind === "audio");
|
|
2539
|
-
return pc.getStats(null).then((result) => {
|
|
2540
|
-
let microphoneFailed = false;
|
|
2541
|
-
result.forEach((report) => {
|
|
2542
|
-
if (report.type === "outbound-rtp" &&
|
|
2543
|
-
(report.kind === "audio" || report.mediaType === "audio") &&
|
|
2544
|
-
sendingAudio) {
|
|
2545
|
-
if (report.bytesSent === 0) {
|
|
2546
|
-
microphoneFailed = "outbound";
|
|
2547
|
-
}
|
|
2548
|
-
}
|
|
2549
|
-
else if (report.type === "inbound-rtp" &&
|
|
2550
|
-
(report.kind === "audio" || report.mediaType === "audio") &&
|
|
2551
|
-
receivingAudio) {
|
|
2552
|
-
if (report.bytesReceived === 0) {
|
|
2553
|
-
microphoneFailed = "inbound";
|
|
2554
|
-
}
|
|
2555
|
-
}
|
|
2556
|
-
});
|
|
2557
|
-
return microphoneFailed;
|
|
2558
|
-
});
|
|
2559
|
-
}
|
|
2560
|
-
|
|
2561
2514
|
const EVENTS = {
|
|
2562
2515
|
CLIENT_CONNECTION_STATUS_CHANGED: "client_connection_status_changed",
|
|
2563
2516
|
STREAM_ADDED: "stream_added",
|
|
@@ -2595,14 +2548,14 @@ const STREAM_TYPES = {
|
|
|
2595
2548
|
screenshare: "screenshare",
|
|
2596
2549
|
};
|
|
2597
2550
|
|
|
2598
|
-
var _a$
|
|
2599
|
-
const adapter$
|
|
2551
|
+
var _a$3, _b$1, _c;
|
|
2552
|
+
const adapter$3 = (_a$3 = adapterRaw.default) !== null && _a$3 !== void 0 ? _a$3 : adapterRaw;
|
|
2600
2553
|
const logger$6 = new Logger();
|
|
2601
2554
|
const ICE_PUBLIC_IP_GATHERING_TIMEOUT = 3 * 1000;
|
|
2602
|
-
const browserName$1 = (_b$1 = adapter$
|
|
2603
|
-
const browserVersion = adapter$
|
|
2604
|
-
if (browserName$1 === "firefox" && adapter$
|
|
2605
|
-
(_c = adapter$
|
|
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");
|
|
2606
2559
|
}
|
|
2607
2560
|
let unloading$1 = false;
|
|
2608
2561
|
if (browserName$1 === "chrome") {
|
|
@@ -2630,7 +2583,6 @@ class P2pRtcManager {
|
|
|
2630
2583
|
this._closed = false;
|
|
2631
2584
|
this.skipEmittingServerMessageCount = 0;
|
|
2632
2585
|
this.offerOptions = { offerToReceiveAudio: true, offerToReceiveVideo: true };
|
|
2633
|
-
this._pendingActionsForConnectedPeerConnections = [];
|
|
2634
2586
|
this._audioTrackOnEnded = () => {
|
|
2635
2587
|
rtcStats.sendEvent("audio_ended", { unloading: unloading$1 });
|
|
2636
2588
|
this._emit(rtcManagerEvents.MICROPHONE_STOPPED_WORKING, {});
|
|
@@ -2663,10 +2615,8 @@ class P2pRtcManager {
|
|
|
2663
2615
|
numPcOnAnswerFailure: 0,
|
|
2664
2616
|
numPcOnOfferFailure: 0,
|
|
2665
2617
|
P2PChangeBandwidthEmptySDPType: 0,
|
|
2666
|
-
P2PNegotiationNeeded: 0,
|
|
2667
2618
|
P2PSessionAlreadyCreated: 0,
|
|
2668
2619
|
P2PReplaceTrackNoStream: 0,
|
|
2669
|
-
P2PReplaceTrackNoNewTrack: 0,
|
|
2670
2620
|
P2PReplaceTrackNewTrackEnded: 0,
|
|
2671
2621
|
P2PReplaceTrackNewTrackNotInStream: 0,
|
|
2672
2622
|
P2PReplaceTrackOldTrackNotFound: 0,
|
|
@@ -2700,7 +2650,7 @@ class P2pRtcManager {
|
|
|
2700
2650
|
const audioTrack = stream.getAudioTracks()[0];
|
|
2701
2651
|
const videoTrack = stream.getVideoTracks()[0];
|
|
2702
2652
|
if (audioTrack) {
|
|
2703
|
-
if (!audioTrack.
|
|
2653
|
+
if (!trackAnnotations(audioTrack).isEffectTrack) {
|
|
2704
2654
|
this._monitorAudioTrack(audioTrack);
|
|
2705
2655
|
}
|
|
2706
2656
|
const beforeEffectTrack = beforeEffectTracks.find((t) => t.kind === "audio");
|
|
@@ -2709,7 +2659,7 @@ class P2pRtcManager {
|
|
|
2709
2659
|
}
|
|
2710
2660
|
}
|
|
2711
2661
|
if (videoTrack) {
|
|
2712
|
-
if (!videoTrack.
|
|
2662
|
+
if (!trackAnnotations(videoTrack).isEffectTrack) {
|
|
2713
2663
|
this._monitorVideoTrack(videoTrack);
|
|
2714
2664
|
}
|
|
2715
2665
|
const beforeEffectTrack = beforeEffectTracks.find((t) => t.kind === "video");
|
|
@@ -2736,10 +2686,10 @@ class P2pRtcManager {
|
|
|
2736
2686
|
return;
|
|
2737
2687
|
}
|
|
2738
2688
|
replaceTrack(oldTrack, newTrack) {
|
|
2739
|
-
if (newTrack.kind === "audio" && !newTrack.
|
|
2689
|
+
if (newTrack.kind === "audio" && !trackAnnotations(newTrack).isEffectTrack) {
|
|
2740
2690
|
this._monitorAudioTrack(newTrack);
|
|
2741
2691
|
}
|
|
2742
|
-
if (newTrack.kind === "video" && !newTrack.
|
|
2692
|
+
if (newTrack.kind === "video" && !trackAnnotations(newTrack).isEffectTrack) {
|
|
2743
2693
|
this._monitorVideoTrack(newTrack);
|
|
2744
2694
|
}
|
|
2745
2695
|
return this._replaceTrackToPeerConnections(oldTrack, newTrack);
|
|
@@ -2830,25 +2780,6 @@ class P2pRtcManager {
|
|
|
2830
2780
|
this.analytics.numPcOnAnswerFailure++;
|
|
2831
2781
|
});
|
|
2832
2782
|
}),
|
|
2833
|
-
this._serverSocket.on(PROTOCOL_RESPONSES.ROOM_JOINED, (payload) => {
|
|
2834
|
-
if ("error" in payload || !this._wasScreenSharing) {
|
|
2835
|
-
return;
|
|
2836
|
-
}
|
|
2837
|
-
const screenShareStreamId = Object.keys(this.localStreams).find((id) => id !== CAMERA_STREAM_ID);
|
|
2838
|
-
if (!screenShareStreamId) {
|
|
2839
|
-
return;
|
|
2840
|
-
}
|
|
2841
|
-
const screenshareStream = this.localStreams[screenShareStreamId];
|
|
2842
|
-
if (!screenshareStream) {
|
|
2843
|
-
logger$6.warn("screenshare stream %s not found", screenShareStreamId);
|
|
2844
|
-
return;
|
|
2845
|
-
}
|
|
2846
|
-
const hasAudioTrack = screenshareStream.getAudioTracks().length > 0;
|
|
2847
|
-
this._emitServerEvent(PROTOCOL_REQUESTS.START_SCREENSHARE, {
|
|
2848
|
-
streamId: screenShareStreamId,
|
|
2849
|
-
hasAudioTrack,
|
|
2850
|
-
});
|
|
2851
|
-
}),
|
|
2852
2783
|
this._serverSocket.on(PROTOCOL_RESPONSES.SCREENSHARE_STOPPED, (payload) => {
|
|
2853
2784
|
const session = this._getSession(payload.clientId);
|
|
2854
2785
|
if (session) {
|
|
@@ -2966,31 +2897,6 @@ class P2pRtcManager {
|
|
|
2966
2897
|
}
|
|
2967
2898
|
return this.peerConnections[peerConnectionId];
|
|
2968
2899
|
}
|
|
2969
|
-
_getOrCreateSession({ peerConnectionId, clientId, initialBandwidth, peerConnectionConfig, }) {
|
|
2970
|
-
let session = this.peerConnections[peerConnectionId];
|
|
2971
|
-
if (session === undefined) {
|
|
2972
|
-
const deprioritizeH264Encoding = browserName$1 === "safari" &&
|
|
2973
|
-
browserVersion &&
|
|
2974
|
-
browserVersion >= 14 &&
|
|
2975
|
-
this._features.deprioritizeH264OnSafari;
|
|
2976
|
-
this.peerConnections[peerConnectionId] = session = new Session({
|
|
2977
|
-
peerConnectionId,
|
|
2978
|
-
clientId,
|
|
2979
|
-
peerConnectionConfig,
|
|
2980
|
-
bandwidth: initialBandwidth,
|
|
2981
|
-
deprioritizeH264Encoding,
|
|
2982
|
-
incrementAnalyticMetric: (metric) => this.analytics[metric]++,
|
|
2983
|
-
});
|
|
2984
|
-
}
|
|
2985
|
-
else {
|
|
2986
|
-
this.analytics.P2PSessionAlreadyCreated++;
|
|
2987
|
-
rtcStats.sendEvent("P2PSessionAlreadyCreated", {
|
|
2988
|
-
clientId,
|
|
2989
|
-
peerConnectionId,
|
|
2990
|
-
});
|
|
2991
|
-
}
|
|
2992
|
-
return session;
|
|
2993
|
-
}
|
|
2994
2900
|
_getLocalCameraStream() {
|
|
2995
2901
|
return this.localStreams[CAMERA_STREAM_ID];
|
|
2996
2902
|
}
|
|
@@ -3004,7 +2910,7 @@ class P2pRtcManager {
|
|
|
3004
2910
|
const streamIds = this._getNonLocalCameraStreamIds();
|
|
3005
2911
|
return streamIds.length === 0 ? null : this.localStreams[streamIds[0]];
|
|
3006
2912
|
}
|
|
3007
|
-
_createSession({ clientId, initialBandwidth, isOfferer, peerConnectionId
|
|
2913
|
+
_createSession({ clientId, initialBandwidth, isOfferer, peerConnectionId }) {
|
|
3008
2914
|
if (!peerConnectionId) {
|
|
3009
2915
|
throw new Error("peerConnectionId is missing");
|
|
3010
2916
|
}
|
|
@@ -3017,12 +2923,19 @@ class P2pRtcManager {
|
|
|
3017
2923
|
peerConnectionConfig.iceServers = turnServerOverride(peerConnectionConfig.iceServers, this._features.turnServerOverrideHost);
|
|
3018
2924
|
external_stun_servers(peerConnectionConfig, this._features);
|
|
3019
2925
|
maybeTurnOnly(peerConnectionConfig, this._features);
|
|
3020
|
-
const
|
|
2926
|
+
const deprioritizeH264Encoding = browserName$1 === "safari" &&
|
|
2927
|
+
browserVersion &&
|
|
2928
|
+
browserVersion >= 14 &&
|
|
2929
|
+
this._features.deprioritizeH264OnSafari;
|
|
2930
|
+
const session = new Session({
|
|
3021
2931
|
peerConnectionId,
|
|
3022
2932
|
clientId,
|
|
3023
|
-
initialBandwidth,
|
|
3024
2933
|
peerConnectionConfig,
|
|
2934
|
+
bandwidth: initialBandwidth,
|
|
2935
|
+
deprioritizeH264Encoding,
|
|
2936
|
+
incrementAnalyticMetric: (metric) => this.analytics[metric]++,
|
|
3025
2937
|
});
|
|
2938
|
+
this.peerConnections[peerConnectionId] = session;
|
|
3026
2939
|
setTimeout(() => this._emit(rtcManagerEvents.NEW_PC), 0);
|
|
3027
2940
|
this.analytics.numNewPc++;
|
|
3028
2941
|
const { pc } = session;
|
|
@@ -3045,6 +2958,7 @@ class P2pRtcManager {
|
|
|
3045
2958
|
}
|
|
3046
2959
|
};
|
|
3047
2960
|
pc.oniceconnectionstatechange = () => {
|
|
2961
|
+
var _a;
|
|
3048
2962
|
let newStatus;
|
|
3049
2963
|
const currentStatus = session.connectionStatus;
|
|
3050
2964
|
switch (pc.iceConnectionState) {
|
|
@@ -3054,14 +2968,10 @@ class P2pRtcManager {
|
|
|
3054
2968
|
case "connected":
|
|
3055
2969
|
case "completed":
|
|
3056
2970
|
newStatus = TYPES.CONNECTION_SUCCESSFUL;
|
|
3057
|
-
|
|
3058
|
-
|
|
3059
|
-
|
|
3060
|
-
|
|
3061
|
-
}
|
|
3062
|
-
});
|
|
3063
|
-
this._pendingActionsForConnectedPeerConnections = [];
|
|
3064
|
-
}
|
|
2971
|
+
session.pendingReplaceTrackActions.forEach((action) => __awaiter(this, void 0, void 0, function* () {
|
|
2972
|
+
yield action();
|
|
2973
|
+
}));
|
|
2974
|
+
session.pendingReplaceTrackActions = [];
|
|
3065
2975
|
if (!session.wasEverConnected &&
|
|
3066
2976
|
(pc.iceConnectionState.match(/connected|completed/) ||
|
|
3067
2977
|
(browserName$1 === "chrome" && pc.localDescription && pc.localDescription.type === "answer"))) {
|
|
@@ -3070,7 +2980,7 @@ class P2pRtcManager {
|
|
|
3070
2980
|
if (this._isAudioOnlyMode) {
|
|
3071
2981
|
session.setAudioOnly(true, this._screenshareVideoTrackIds);
|
|
3072
2982
|
}
|
|
3073
|
-
session.registerConnected();
|
|
2983
|
+
(_a = session.registerConnected) === null || _a === void 0 ? void 0 : _a.call(session, {});
|
|
3074
2984
|
break;
|
|
3075
2985
|
case "disconnected":
|
|
3076
2986
|
newStatus = TYPES.CONNECTION_DISCONNECTED;
|
|
@@ -3094,28 +3004,19 @@ class P2pRtcManager {
|
|
|
3094
3004
|
}
|
|
3095
3005
|
this._setConnectionStatus(session, newStatus, clientId);
|
|
3096
3006
|
};
|
|
3097
|
-
pc.
|
|
3007
|
+
pc.onconnectionstatechange = () => {
|
|
3008
|
+
var _a;
|
|
3098
3009
|
switch (pc.connectionState) {
|
|
3099
3010
|
case "connected":
|
|
3100
|
-
|
|
3101
|
-
detectMicrophoneNotWorking(session.pc).then((failureDirection) => {
|
|
3102
|
-
if (failureDirection !== false) {
|
|
3103
|
-
this._emit(rtcManagerEvents.MICROPHONE_NOT_WORKING, {
|
|
3104
|
-
failureDirection,
|
|
3105
|
-
clientId,
|
|
3106
|
-
});
|
|
3107
|
-
}
|
|
3108
|
-
});
|
|
3109
|
-
}, 3000);
|
|
3110
|
-
session.registerConnected();
|
|
3011
|
+
(_a = session.registerConnected) === null || _a === void 0 ? void 0 : _a.call(session, {});
|
|
3111
3012
|
break;
|
|
3112
3013
|
case "failed":
|
|
3113
3014
|
const newStatus = TYPES.CONNECTION_FAILED;
|
|
3114
|
-
if (session.relayCandidateSeen === null && !session.wasEverConnected) {
|
|
3115
|
-
this._emit(rtcManagerEvents.CONNECTION_BLOCKED_BY_NETWORK);
|
|
3116
|
-
}
|
|
3117
3015
|
this._setConnectionStatus(session, newStatus, clientId);
|
|
3118
3016
|
break;
|
|
3017
|
+
case "closed":
|
|
3018
|
+
this._cleanup(session.clientId);
|
|
3019
|
+
break;
|
|
3119
3020
|
}
|
|
3120
3021
|
};
|
|
3121
3022
|
const localCameraStream = this.localStreams[CAMERA_STREAM_ID];
|
|
@@ -3171,43 +3072,34 @@ class P2pRtcManager {
|
|
|
3171
3072
|
const promises = [];
|
|
3172
3073
|
this._forEachPeerConnection((session) => {
|
|
3173
3074
|
if (!session.hasConnectedPeerConnection()) {
|
|
3174
|
-
|
|
3175
|
-
this.analytics.P2PReplaceTrackWithoutPC++;
|
|
3176
|
-
logger$6.info("Session doesn't have a connected PeerConnection, adding pending action!");
|
|
3177
|
-
const pendingActions = this._pendingActionsForConnectedPeerConnections;
|
|
3178
|
-
if (!pendingActions) {
|
|
3179
|
-
rtcStats.sendEvent("P2PReplaceTrackToPCsPendingActionsNull", {});
|
|
3180
|
-
this.analytics.P2PReplaceTrackToPCsPendingActionsNull++;
|
|
3181
|
-
logger$6.warn(`No pending action is created to replace track, because the pending actions array is null`);
|
|
3075
|
+
if (session.pc.connectionState === "closed")
|
|
3182
3076
|
return;
|
|
3183
|
-
|
|
3077
|
+
logger$6.info("Session doesn't have a connected PeerConnection, adding pending action!");
|
|
3078
|
+
this.analytics.P2PReplaceTrackWithoutPC++;
|
|
3079
|
+
rtcStats.sendEvent("P2PReplaceTrackWithoutPC", {
|
|
3080
|
+
connectionState: session.pc.connectionState,
|
|
3081
|
+
iceConnectionState: session.pc.iceConnectionState,
|
|
3082
|
+
});
|
|
3184
3083
|
const promise = new Promise((resolve, reject) => {
|
|
3185
|
-
const action = () => {
|
|
3186
|
-
|
|
3187
|
-
|
|
3188
|
-
|
|
3189
|
-
this.analytics.P2PReplaceTrackReturnedFalse++;
|
|
3190
|
-
logger$6.error("replaceTrack returned false!");
|
|
3191
|
-
reject(`ReplaceTrack returned false`);
|
|
3192
|
-
return;
|
|
3084
|
+
const action = () => __awaiter(this, void 0, void 0, function* () {
|
|
3085
|
+
try {
|
|
3086
|
+
yield session.replaceTrack(oldTrack, newTrack);
|
|
3087
|
+
resolve({});
|
|
3193
3088
|
}
|
|
3194
|
-
|
|
3195
|
-
|
|
3196
|
-
|
|
3089
|
+
catch (error) {
|
|
3090
|
+
reject(error);
|
|
3091
|
+
}
|
|
3092
|
+
});
|
|
3093
|
+
session.pendingReplaceTrackActions.push(action);
|
|
3197
3094
|
});
|
|
3198
3095
|
promises.push(promise);
|
|
3199
3096
|
return;
|
|
3200
3097
|
}
|
|
3201
|
-
|
|
3202
|
-
|
|
3203
|
-
|
|
3204
|
-
|
|
3205
|
-
logger$6.error("replaceTrack returned false!");
|
|
3206
|
-
return;
|
|
3207
|
-
}
|
|
3208
|
-
promises.push(replacedTrackResult);
|
|
3098
|
+
promises.push(session.replaceTrack(oldTrack, newTrack));
|
|
3099
|
+
});
|
|
3100
|
+
return Promise.all(promises).catch((error) => {
|
|
3101
|
+
logger$6.error(String(error));
|
|
3209
3102
|
});
|
|
3210
|
-
return Promise.all(promises);
|
|
3211
3103
|
}
|
|
3212
3104
|
_removeStreamFromPeerConnections(stream) {
|
|
3213
3105
|
this._forEachPeerConnection((session) => {
|
|
@@ -3279,7 +3171,7 @@ class P2pRtcManager {
|
|
|
3279
3171
|
isOfferer: true,
|
|
3280
3172
|
});
|
|
3281
3173
|
this._negotiatePeerConnection(clientId, session);
|
|
3282
|
-
return
|
|
3174
|
+
return session;
|
|
3283
3175
|
}
|
|
3284
3176
|
_maybeRestartIce(clientId, session) {
|
|
3285
3177
|
const pc = session.pc;
|
|
@@ -3542,8 +3434,6 @@ class P2pRtcManager {
|
|
|
3542
3434
|
}
|
|
3543
3435
|
};
|
|
3544
3436
|
pc.onnegotiationneeded = () => {
|
|
3545
|
-
this.analytics.P2PNegotiationNeeded++;
|
|
3546
|
-
rtcStats.sendEvent("P2PNegotiationNeeded", {});
|
|
3547
3437
|
if (pc.iceConnectionState === "new" || !session.connectionStatus) {
|
|
3548
3438
|
return;
|
|
3549
3439
|
}
|
|
@@ -3558,7 +3448,6 @@ class P2pRtcManager {
|
|
|
3558
3448
|
}
|
|
3559
3449
|
let initialBandwidth = (session && session.bandwidth) || 0;
|
|
3560
3450
|
if (session) {
|
|
3561
|
-
logger$6.warn("Replacing peer session", clientId);
|
|
3562
3451
|
this._cleanup(clientId);
|
|
3563
3452
|
}
|
|
3564
3453
|
else {
|
|
@@ -3610,9 +3499,7 @@ class P2pRtcManager {
|
|
|
3610
3499
|
return;
|
|
3611
3500
|
}
|
|
3612
3501
|
if (enable === false) {
|
|
3613
|
-
const stopCameraDelay = ((_a = localStream.getVideoTracks().find((t) => !t.enabled)) === null || _a === void 0 ? void 0 : _a.readyState) === "ended"
|
|
3614
|
-
? 0
|
|
3615
|
-
: 5000;
|
|
3502
|
+
const stopCameraDelay = ((_a = localStream.getVideoTracks().find((t) => !t.enabled)) === null || _a === void 0 ? void 0 : _a.readyState) === "ended" ? 0 : 5000;
|
|
3616
3503
|
setTimeout(() => {
|
|
3617
3504
|
localStream.getVideoTracks().forEach((track) => {
|
|
3618
3505
|
if (track.enabled === false) {
|
|
@@ -4500,10 +4387,10 @@ function createVegaConnectionManager(config) {
|
|
|
4500
4387
|
return { connect, updateHostList, networkIsUp, networkIsPossiblyDown };
|
|
4501
4388
|
}
|
|
4502
4389
|
|
|
4503
|
-
var _a$
|
|
4504
|
-
const adapter$
|
|
4390
|
+
var _a$2;
|
|
4391
|
+
const adapter$2 = (_a$2 = adapterRaw.default) !== null && _a$2 !== void 0 ? _a$2 : adapterRaw;
|
|
4505
4392
|
const logger$2 = new Logger();
|
|
4506
|
-
const browserName = adapter$
|
|
4393
|
+
const browserName = adapter$2.browserDetails.browser;
|
|
4507
4394
|
let unloading = false;
|
|
4508
4395
|
const RESTARTICE_ERROR_RETRY_THRESHOLD_IN_MS = 3500;
|
|
4509
4396
|
const RESTARTICE_ERROR_MAX_RETRY_COUNT = 5;
|
|
@@ -5445,14 +5332,14 @@ class VegaRtcManager {
|
|
|
5445
5332
|
}
|
|
5446
5333
|
replaceTrack(oldTrack, track) {
|
|
5447
5334
|
if (track.kind === "audio") {
|
|
5448
|
-
if (!track.
|
|
5335
|
+
if (!trackAnnotations(track).isEffectTrack) {
|
|
5449
5336
|
this._monitorAudioTrack(track);
|
|
5450
5337
|
}
|
|
5451
5338
|
this._micTrack = track;
|
|
5452
5339
|
this._replaceMicTrack();
|
|
5453
5340
|
}
|
|
5454
5341
|
if (track.kind === "video") {
|
|
5455
|
-
if (!track.
|
|
5342
|
+
if (!trackAnnotations(track).isEffectTrack) {
|
|
5456
5343
|
this._monitorVideoTrack(track);
|
|
5457
5344
|
}
|
|
5458
5345
|
this._webcamTrack = track;
|
|
@@ -5485,7 +5372,7 @@ class VegaRtcManager {
|
|
|
5485
5372
|
const audioTrack = stream.getAudioTracks()[0];
|
|
5486
5373
|
if (videoTrack) {
|
|
5487
5374
|
this._sendWebcam(videoTrack);
|
|
5488
|
-
if (!videoTrack.
|
|
5375
|
+
if (!trackAnnotations(videoTrack).isEffectTrack) {
|
|
5489
5376
|
this._monitorVideoTrack(videoTrack);
|
|
5490
5377
|
}
|
|
5491
5378
|
const beforeEffectTrack = beforeEffectTracks.find((t) => t.kind === "video");
|
|
@@ -5496,7 +5383,7 @@ class VegaRtcManager {
|
|
|
5496
5383
|
if (audioTrack) {
|
|
5497
5384
|
this._sendMic(audioTrack);
|
|
5498
5385
|
this._syncMicAnalyser();
|
|
5499
|
-
if (!audioTrack.
|
|
5386
|
+
if (!trackAnnotations(audioTrack).isEffectTrack) {
|
|
5500
5387
|
this._monitorAudioTrack(audioTrack);
|
|
5501
5388
|
}
|
|
5502
5389
|
const beforeEffectTrack = beforeEffectTracks.find((t) => t.kind === "audio");
|
|
@@ -5570,9 +5457,7 @@ class VegaRtcManager {
|
|
|
5570
5457
|
}
|
|
5571
5458
|
if (!enable) {
|
|
5572
5459
|
clearTimeout(this._stopCameraTimeout);
|
|
5573
|
-
const stopCameraDelay = ((_a = localStream.getVideoTracks().find((t) => !t.enabled)) === null || _a === void 0 ? void 0 : _a.readyState) === "ended"
|
|
5574
|
-
? 0
|
|
5575
|
-
: 5000;
|
|
5460
|
+
const stopCameraDelay = ((_a = localStream.getVideoTracks().find((t) => !t.enabled)) === null || _a === void 0 ? void 0 : _a.readyState) === "ended" ? 0 : 5000;
|
|
5576
5461
|
this._stopCameraTimeout = setTimeout(() => {
|
|
5577
5462
|
localStream.getVideoTracks().forEach((track) => {
|
|
5578
5463
|
if (track.enabled === false) {
|
|
@@ -7116,6 +7001,39 @@ class BandwidthTester extends EventEmitter {
|
|
|
7116
7001
|
}
|
|
7117
7002
|
}
|
|
7118
7003
|
|
|
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
|
+
|
|
7119
7037
|
var _a, _b;
|
|
7120
7038
|
const adapter = (_a = adapterRaw.default) !== null && _a !== void 0 ? _a : adapterRaw;
|
|
7121
7039
|
const isSafari = ((_b = adapter.browserDetails) === null || _b === void 0 ? void 0 : _b.browser) === "safari";
|
|
@@ -7277,22 +7195,13 @@ function replaceTracksInStream(stream, newStream, only) {
|
|
|
7277
7195
|
const replacedTracks = [];
|
|
7278
7196
|
if (!only || only === "audio") {
|
|
7279
7197
|
replacedTracks.push(...stream.getAudioTracks());
|
|
7280
|
-
newStream.getAudioTracks().forEach((track) =>
|
|
7281
|
-
track.replacement = true;
|
|
7282
|
-
stream.addTrack(track);
|
|
7283
|
-
});
|
|
7198
|
+
newStream.getAudioTracks().forEach((track) => stream.addTrack(track));
|
|
7284
7199
|
}
|
|
7285
7200
|
if (!only || only === "video") {
|
|
7286
7201
|
replacedTracks.push(...stream.getVideoTracks());
|
|
7287
|
-
newStream.getVideoTracks().forEach((track) =>
|
|
7288
|
-
track.replacement = true;
|
|
7289
|
-
stream.addTrack(track);
|
|
7290
|
-
});
|
|
7202
|
+
newStream.getVideoTracks().forEach((track) => stream.addTrack(track));
|
|
7291
7203
|
}
|
|
7292
|
-
replacedTracks.forEach((track) =>
|
|
7293
|
-
track.replaced = true;
|
|
7294
|
-
stream.removeTrack(track);
|
|
7295
|
-
});
|
|
7204
|
+
replacedTracks.forEach((track) => stream.removeTrack(track));
|
|
7296
7205
|
return replacedTracks;
|
|
7297
7206
|
}
|
|
7298
7207
|
function getStream(constraintOpt_1) {
|