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