@webex/internal-media-core 0.0.15-beta → 0.0.17-beta

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/cjs/index.js CHANGED
@@ -2533,7 +2533,8 @@ var getErrorDescription = error => {
2533
2533
  };
2534
2534
 
2535
2535
  var NUM$1 = '\\d+';
2536
- var TOKEN = '\\S+';
2536
+ var SDP_TOKEN$1 = "[!#$%&'*+\\-.^_`{|}~a-zA-Z0-9]+";
2537
+ var ANY_NON_WS$1 = '\\S+';
2537
2538
  var SP$1 = '\\s';
2538
2539
  var REST$1 = '.+';
2539
2540
  class Line$1 {}
@@ -2627,7 +2628,7 @@ class CandidateLine$1 extends Line$1 {
2627
2628
  }
2628
2629
  _a$4$1 = CandidateLine$1;
2629
2630
  CandidateLine$1.ICE_CHARS = "[a-zA-Z0-9+/]+";
2630
- CandidateLine$1.regex = new RegExp("^candidate:(".concat(_a$4$1.ICE_CHARS, ") (").concat(NUM$1, ") (").concat(TOKEN, ") (").concat(NUM$1, ") (").concat(TOKEN, ") (").concat(NUM$1, ") typ (").concat(TOKEN, ")(?: raddr (").concat(TOKEN, "))?(?: rport (").concat(NUM$1, "))?(?: (").concat(REST$1, "))?"));
2631
+ CandidateLine$1.regex = new RegExp("^candidate:(".concat(_a$4$1.ICE_CHARS, ") (").concat(NUM$1, ") (").concat(ANY_NON_WS$1, ") (").concat(NUM$1, ") (").concat(ANY_NON_WS$1, ") (").concat(NUM$1, ") typ (").concat(ANY_NON_WS$1, ")(?: raddr (").concat(ANY_NON_WS$1, "))?(?: rport (").concat(NUM$1, "))?(?: (").concat(REST$1, "))?"));
2631
2632
  class ConnectionLine$1 extends Line$1 {
2632
2633
  constructor(netType, addrType, ipAddr) {
2633
2634
  super();
@@ -2649,7 +2650,7 @@ class ConnectionLine$1 extends Line$1 {
2649
2650
  return "c=".concat(this.netType, " ").concat(this.addrType, " ").concat(this.ipAddr);
2650
2651
  }
2651
2652
  }
2652
- ConnectionLine$1.regex = new RegExp("^(".concat(TOKEN, ") (").concat(TOKEN, ") (").concat(TOKEN, ")"));
2653
+ ConnectionLine$1.regex = new RegExp("^(".concat(ANY_NON_WS$1, ") (").concat(ANY_NON_WS$1, ") (").concat(ANY_NON_WS$1, ")"));
2653
2654
  class ContentLine$1 extends Line$1 {
2654
2655
  constructor(values) {
2655
2656
  super();
@@ -2721,7 +2722,7 @@ class ExtMapLine$1 extends Line$1 {
2721
2722
  }
2722
2723
  _a$3$1 = ExtMapLine$1;
2723
2724
  ExtMapLine$1.EXTMAP_DIRECTION = "sendonly|recvonly|sendrecv|inactive";
2724
- ExtMapLine$1.regex = new RegExp("^extmap:(".concat(NUM$1, ")(?:/(").concat(_a$3$1.EXTMAP_DIRECTION, "))? (").concat(TOKEN, ")(?: (").concat(REST$1, "))?"));
2725
+ ExtMapLine$1.regex = new RegExp("^extmap:(".concat(NUM$1, ")(?:/(").concat(_a$3$1.EXTMAP_DIRECTION, "))? (").concat(ANY_NON_WS$1, ")(?: (").concat(REST$1, "))?"));
2725
2726
  class FingerprintLine$1 extends Line$1 {
2726
2727
  constructor(fingerprint) {
2727
2728
  super();
@@ -2795,7 +2796,7 @@ class IcePwdLine$1 extends Line$1 {
2795
2796
  return "a=ice-pwd:".concat(this.pwd);
2796
2797
  }
2797
2798
  }
2798
- IcePwdLine$1.regex = new RegExp("^ice-pwd:(".concat(TOKEN, ")$"));
2799
+ IcePwdLine$1.regex = new RegExp("^ice-pwd:(".concat(ANY_NON_WS$1, ")$"));
2799
2800
  class IceUfragLine$1 extends Line$1 {
2800
2801
  constructor(ufrag) {
2801
2802
  super();
@@ -2813,7 +2814,7 @@ class IceUfragLine$1 extends Line$1 {
2813
2814
  return "a=ice-ufrag:".concat(this.ufrag);
2814
2815
  }
2815
2816
  }
2816
- IceUfragLine$1.regex = new RegExp("^ice-ufrag:(".concat(TOKEN, ")$"));
2817
+ IceUfragLine$1.regex = new RegExp("^ice-ufrag:(".concat(ANY_NON_WS$1, ")$"));
2817
2818
  class MaxMessageSizeLine$1 extends Line$1 {
2818
2819
  constructor(maxMessageSize) {
2819
2820
  super();
@@ -2858,7 +2859,7 @@ class MediaLine$1 extends Line$1 {
2858
2859
  }
2859
2860
  _a$2$1 = MediaLine$1;
2860
2861
  MediaLine$1.MEDIA_TYPE = 'audio|video|application';
2861
- MediaLine$1.regex = new RegExp("^(".concat(_a$2$1.MEDIA_TYPE, ") (").concat(NUM$1, ") (").concat(TOKEN, ") (").concat(REST$1, ")"));
2862
+ MediaLine$1.regex = new RegExp("^(".concat(_a$2$1.MEDIA_TYPE, ") (").concat(NUM$1, ") (").concat(ANY_NON_WS$1, ") (").concat(REST$1, ")"));
2862
2863
  class MidLine$1 extends Line$1 {
2863
2864
  constructor(mid) {
2864
2865
  super();
@@ -2876,7 +2877,7 @@ class MidLine$1 extends Line$1 {
2876
2877
  return "a=mid:".concat(this.mid);
2877
2878
  }
2878
2879
  }
2879
- MidLine$1.regex = new RegExp("^mid:(".concat(TOKEN, ")$"));
2880
+ MidLine$1.regex = new RegExp("^mid:(".concat(ANY_NON_WS$1, ")$"));
2880
2881
  class OriginLine$1 extends Line$1 {
2881
2882
  constructor(username, sessionId, sessionVersion, netType, addrType, ipAddr) {
2882
2883
  super();
@@ -2904,7 +2905,7 @@ class OriginLine$1 extends Line$1 {
2904
2905
  return "o=".concat(this.username, " ").concat(this.sessionId, " ").concat(this.sessionVersion, " ").concat(this.netType, " ").concat(this.addrType, " ").concat(this.ipAddr);
2905
2906
  }
2906
2907
  }
2907
- OriginLine$1.regex = new RegExp("^(".concat(TOKEN, ") (").concat(TOKEN, ") (").concat(NUM$1, ") (").concat(TOKEN, ") (").concat(TOKEN, ") (").concat(TOKEN, ")"));
2908
+ OriginLine$1.regex = new RegExp("^(".concat(ANY_NON_WS$1, ") (").concat(ANY_NON_WS$1, ") (").concat(NUM$1, ") (").concat(ANY_NON_WS$1, ") (").concat(ANY_NON_WS$1, ") (").concat(ANY_NON_WS$1, ")"));
2908
2909
  var _a$1$1;
2909
2910
  class RidLine$1 extends Line$1 {
2910
2911
  constructor(id, direction, params) {
@@ -3172,7 +3173,60 @@ class SimulcastLine$1 extends Line$1 {
3172
3173
  return str;
3173
3174
  }
3174
3175
  }
3175
- SimulcastLine$1.regex = new RegExp("^simulcast:(send|recv) (".concat(TOKEN, ")(?: (send|recv) (").concat(TOKEN, "))?"));
3176
+ SimulcastLine$1.regex = new RegExp("^simulcast:(send|recv) (".concat(ANY_NON_WS$1, ")(?: (send|recv) (").concat(ANY_NON_WS$1, "))?"));
3177
+ class SsrcLine$1 extends Line$1 {
3178
+ constructor(ssrcId, attribute) {
3179
+ var attributeValue = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : undefined;
3180
+ var attributeData = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : undefined;
3181
+ super();
3182
+ this.ssrcId = ssrcId;
3183
+ this.attribute = attribute;
3184
+ this.attributeValue = attributeValue;
3185
+ this.attributeData = attributeData;
3186
+ }
3187
+ static fromSdpLine(line) {
3188
+ if (!SsrcLine$1.regex.test(line)) {
3189
+ return undefined;
3190
+ }
3191
+ var tokens = line.match(SsrcLine$1.regex);
3192
+ var ssrcId = parseInt(tokens[1], 10);
3193
+ var attribute = tokens[2];
3194
+ var attributeValue = tokens[3];
3195
+ var attributeData = tokens[4];
3196
+ return new SsrcLine$1(ssrcId, attribute, attributeValue, attributeData);
3197
+ }
3198
+ toSdpLine() {
3199
+ var str = "a=ssrc:".concat(this.ssrcId, " ").concat(this.attribute);
3200
+ if (this.attributeValue) {
3201
+ str += ":".concat(this.attributeValue);
3202
+ }
3203
+ if (this.attributeData) {
3204
+ str += " ".concat(this.attributeData);
3205
+ }
3206
+ return str;
3207
+ }
3208
+ }
3209
+ SsrcLine$1.regex = new RegExp("^ssrc:(".concat(NUM$1, ") (").concat(SDP_TOKEN$1, ")(?::(").concat(SDP_TOKEN$1, ")?(?: (").concat(ANY_NON_WS$1, "))?)?$"));
3210
+ class SsrcGroupLine$1 extends Line$1 {
3211
+ constructor(semantics, ssrcs) {
3212
+ super();
3213
+ this.semantics = semantics;
3214
+ this.ssrcs = ssrcs;
3215
+ }
3216
+ static fromSdpLine(line) {
3217
+ if (!SsrcGroupLine$1.regex.test(line)) {
3218
+ return undefined;
3219
+ }
3220
+ var tokens = line.match(SsrcGroupLine$1.regex);
3221
+ var semantics = tokens[1];
3222
+ var ssrcs = tokens[2].split(' ').map(ssrcStr => parseInt(ssrcStr, 10));
3223
+ return new SsrcGroupLine$1(semantics, ssrcs);
3224
+ }
3225
+ toSdpLine() {
3226
+ return "a=ssrc-group:".concat(this.semantics, " ").concat(this.ssrcs.join(' '));
3227
+ }
3228
+ }
3229
+ SsrcGroupLine$1.regex = new RegExp("^ssrc-group:(SIM|FID|FEC) ((?:".concat(NUM$1).concat(SP$1, "*)+)"));
3176
3230
  class TimingLine$1 extends Line$1 {
3177
3231
  constructor(startTime, stopTime) {
3178
3232
  super();
@@ -3409,6 +3463,8 @@ class AvMediaDescription$1 extends MediaDescription$1 {
3409
3463
  this.rids = [];
3410
3464
  this.codecs = new Map();
3411
3465
  this.rtcpMux = false;
3466
+ this.ssrcs = [];
3467
+ this.ssrcGroups = [];
3412
3468
  this.pts = mediaLine.formats.map(fmt => {
3413
3469
  return parseInt(fmt, 10);
3414
3470
  });
@@ -3448,6 +3504,8 @@ class AvMediaDescription$1 extends MediaDescription$1 {
3448
3504
  lines.push(new DirectionLine$1(this.direction));
3449
3505
  }
3450
3506
  this.codecs.forEach(codec => lines.push(...codec.toLines()));
3507
+ lines.push(...this.ssrcs);
3508
+ lines.push(...this.ssrcGroups);
3451
3509
  lines.push(...this.otherLines);
3452
3510
  return lines;
3453
3511
  }
@@ -3486,6 +3544,14 @@ class AvMediaDescription$1 extends MediaDescription$1 {
3486
3544
  codec.addLine(line);
3487
3545
  return true;
3488
3546
  }
3547
+ if (line instanceof SsrcLine$1) {
3548
+ this.ssrcs.push(line);
3549
+ return true;
3550
+ }
3551
+ if (line instanceof SsrcGroupLine$1) {
3552
+ this.ssrcGroups.push(line);
3553
+ return true;
3554
+ }
3489
3555
  this.otherLines.push(line);
3490
3556
  return true;
3491
3557
  }
@@ -3630,6 +3696,8 @@ class SdpGrammar$1 extends Grammar$1 {
3630
3696
  this.addParser('a', RidLine$1.fromSdpLine);
3631
3697
  this.addParser('a', CandidateLine$1.fromSdpLine);
3632
3698
  this.addParser('a', SimulcastLine$1.fromSdpLine);
3699
+ this.addParser('a', SsrcLine$1.fromSdpLine);
3700
+ this.addParser('a', SsrcGroupLine$1.fromSdpLine);
3633
3701
  }
3634
3702
  }
3635
3703
  var DefaultSdpGrammar$1 = new SdpGrammar$1();
@@ -3796,7 +3864,7 @@ function appendToH264fmtpParams(sdp, paramsToAppend) {
3796
3864
  }
3797
3865
  });
3798
3866
  }
3799
- function setH264MaxFs(sdp, maxFsValue) {
3867
+ function adjustH264Profile(sdp, maxFsValue) {
3800
3868
  var maxFsForProfileLevel = {
3801
3869
  10: 99,
3802
3870
  11: 396,
@@ -3818,6 +3886,7 @@ function setH264MaxFs(sdp, maxFsValue) {
3818
3886
  61: 139264,
3819
3887
  62: 139264
3820
3888
  };
3889
+ var framesPerSecond = 30;
3821
3890
  sdp.avMedia.forEach(media => {
3822
3891
  if (media.type === 'video') {
3823
3892
  media.codecs.forEach(codec => {
@@ -3837,12 +3906,13 @@ function setH264MaxFs(sdp, maxFsValue) {
3837
3906
  return fmtp;
3838
3907
  }
3839
3908
  if (maxFsForProfileLevel[levelId] < maxFsValue) {
3840
- return "".concat(fmtp, ";max-fs=").concat(maxFsValue);
3909
+ return "".concat(fmtp, ";max-fs=").concat(maxFsValue, ";max-mbps=").concat(maxFsValue * framesPerSecond);
3841
3910
  }
3842
3911
  var newLevelId = Object.keys(maxFsForProfileLevel).reverse().find(key => maxFsForProfileLevel[key] === maxFsValue);
3843
3912
  if (newLevelId) {
3844
3913
  var newLevelIdHex = parseInt(newLevelId, 10).toString(16);
3845
- return "".concat(stuffBeforeProfileLevelId, "profile-level-id=").concat(profile).concat(newLevelIdHex).concat(stuffAfterProfileLevelId);
3914
+ var maxMbps = "max-mbps=".concat(maxFsValue * framesPerSecond);
3915
+ return "".concat(stuffBeforeProfileLevelId, "profile-level-id=").concat(profile).concat(newLevelIdHex, ";").concat(maxMbps).concat(stuffAfterProfileLevelId);
3846
3916
  }
3847
3917
  throw new Error("unsupported maxFsValue: ".concat(maxFsValue));
3848
3918
  }
@@ -3893,7 +3963,7 @@ function mungeLocalSdp(config, sdp) {
3893
3963
  disableExtmap(parsedSdp);
3894
3964
  }
3895
3965
  if (config.h264MaxFs) {
3896
- setH264MaxFs(parsedSdp, config.h264MaxFs);
3966
+ adjustH264Profile(parsedSdp, config.h264MaxFs);
3897
3967
  }
3898
3968
  return parsedSdp.toString();
3899
3969
  }
@@ -4855,7 +4925,12 @@ class LocalTrack extends EventEmitter$2 {
4855
4925
  * Cleanup local microphone track.
4856
4926
  */
4857
4927
  disposeEffects() {
4858
- this.effects.forEach(effect => effect.dispose());
4928
+ if (this.effects.size > 0) {
4929
+ this.effects.forEach(effect => effect.dispose());
4930
+ this.effects.clear();
4931
+ this.underlyingStream = this.originalStream;
4932
+ this.emit(LocalTrackEvents.UnderlyingTrackChange);
4933
+ }
4859
4934
  }
4860
4935
  }
4861
4936
  LocalTrack.Events = LocalTrackEvents;
@@ -8263,6 +8338,17 @@ class PeerConnection extends EventEmitter$2 {
8263
8338
  getTransceivers() {
8264
8339
  return this.pc.getTransceivers();
8265
8340
  }
8341
+ /**
8342
+ * Get statistics about either the overall connection or about the specified MediaStreamTrack.
8343
+ *
8344
+ * @param selector - An optional MediaStreamTrack for which to gather statistics. If not provided,
8345
+ * statistics will be gathered for the entire underlying RTCPeerConnection.
8346
+ * @returns - A Promise which resolves with an RTCStatsReport object providing connection
8347
+ * statistics.
8348
+ */
8349
+ getStats(selector) {
8350
+ return this.pc.getStats(selector);
8351
+ }
8266
8352
  /**
8267
8353
  * Returns a string that describes the connections' ICE gathering state.
8268
8354
  *
@@ -8848,7 +8934,11 @@ class JmpSession extends EventEmitter$4 {
8848
8934
  }
8849
8935
  updateSourceIndication(numTotalSources, numLiveSources, sources) {
8850
8936
  var _a;
8851
- var sourceIndicationMsg = new SourceIndicationMsg(this.currSourceIndicationSeqNum++, numTotalSources, numLiveSources, sources);
8937
+ var filteredSources = sources.filter(source => {
8938
+ var _a;
8939
+ return (_a = this.lastReceivedScr) === null || _a === void 0 ? void 0 : _a.requests.some(req => req.ids.find(streamId => compareStreamIds(streamId, source.id)));
8940
+ });
8941
+ var sourceIndicationMsg = new SourceIndicationMsg(this.currSourceIndicationSeqNum++, numTotalSources, numLiveSources, filteredSources);
8852
8942
  var jmpMsg = new JmpMsg(this.mediaFamily, this.mediaContent, {
8853
8943
  msgType: JmpMsgType$1.SourceIndication,
8854
8944
  payload: sourceIndicationMsg
@@ -8993,94 +9083,12 @@ class JmpSession extends EventEmitter$4 {
8993
9083
  (_a = this.txCallback) === null || _a === void 0 ? void 0 : _a.call(this, JSON.stringify(homerMsg));
8994
9084
  }
8995
9085
  }
8996
- var MediaCodecMimeType;
8997
- (function (MediaCodecMimeType) {
8998
- MediaCodecMimeType["H264"] = "video/H264";
8999
- MediaCodecMimeType["AV1"] = "video/AV1";
9000
- MediaCodecMimeType["OPUS"] = "audio/opus";
9001
- })(MediaCodecMimeType || (MediaCodecMimeType = {}));
9002
- var defaultGlobalMaxVideoFrameSize = 8160;
9003
- var defaultGlobalMaxVideoMbps = 244800;
9004
- var defaultMaxFrameSize = 3600;
9005
- var maxFrameSizeToMaxBitrateMap = new Map([[60, 99000], [240, 199000], [576, 300000], [920, 640000], [1296, 720000], [2304, 880000], [3600, 2500000], [8160, 4000000]]);
9006
- function parseFmtpParams(fmtpParams) {
9007
- fmtpParams = fmtpParams.replace(/^a=fmtp:\d+\x20/, '');
9008
- var fmtpObj = {};
9009
- fmtpParams.split(';').forEach(param => {
9010
- var paramArr = param && param.split('=');
9011
- if (paramArr.length !== 2 || !paramArr[0] || !paramArr[1]) {
9012
- throw new Error("Fmtp params is invalid with ".concat(fmtpParams));
9013
- }
9014
- fmtpObj[paramArr[0]] = paramArr[1];
9015
- });
9016
- return fmtpObj;
9017
- }
9018
- function areProfileLevelIdsCompatible(senderProfileLevelId, receiverProfileLevelId, levelAsymmetryAllowed) {
9019
- var senderProfile = Number.parseInt("0x".concat(senderProfileLevelId), 16);
9020
- var recvProfile = Number.parseInt("0x".concat(receiverProfileLevelId), 16);
9021
- var senderProfileIdc = senderProfile >> 16;
9022
- var recvProfileIdc = recvProfile >> 16;
9023
- var senderProfileIop = (senderProfile & 0x00ff00) >> 8;
9024
- var recvProfileIop = (recvProfile & 0x00ff00) >> 8;
9025
- var senderLevelIdc = senderProfile & 0x0000ff;
9026
- var recvLevelIdc = recvProfile & 0x0000ff;
9027
- var areProfileCompatible = senderProfileIdc === recvProfileIdc && senderProfileIop === recvProfileIop || senderProfileIdc === 0x42 && recvProfileIdc === 0x42 && (senderProfileIop & 0x40) === (recvProfileIop & 0x40);
9028
- var isLevelIdcCompatible = levelAsymmetryAllowed ? true : senderLevelIdc <= recvLevelIdc;
9029
- return areProfileCompatible && isLevelIdcCompatible;
9030
- }
9031
- function areCodecsCompatible(senderCodec, receiverCodec) {
9032
- return Object.keys(receiverCodec).every(key => {
9033
- if (!senderCodec[key] || !receiverCodec[key]) {
9034
- return false;
9035
- }
9036
- if (key === 'payloadType') {
9037
- return true;
9038
- }
9039
- if (key === 'sdpFmtpLine') {
9040
- var fmtpForSender = parseFmtpParams(senderCodec[key]);
9041
- var fmtpForReceiver = parseFmtpParams(receiverCodec[key]);
9042
- var levelAsymmetryAllowed = Object.keys(fmtpForSender).some(senderFmtpParamKey => {
9043
- return senderFmtpParamKey === 'level-asymmetry-allowed' && fmtpForReceiver[senderFmtpParamKey] === '1' && fmtpForSender[senderFmtpParamKey] === '1';
9044
- });
9045
- return Object.keys(fmtpForSender).every(senderFmtpParamKey => {
9046
- if (fmtpForReceiver[senderFmtpParamKey]) {
9047
- if (senderFmtpParamKey === 'profile-level-id') {
9048
- return areProfileLevelIdsCompatible(fmtpForSender[senderFmtpParamKey], fmtpForReceiver[senderFmtpParamKey], levelAsymmetryAllowed);
9049
- }
9050
- }
9051
- if (senderFmtpParamKey === 'packetization-mode') {
9052
- return fmtpForSender[senderFmtpParamKey] === fmtpForReceiver[senderFmtpParamKey];
9053
- }
9054
- return true;
9055
- });
9056
- }
9057
- return senderCodec[key] === receiverCodec[key];
9058
- });
9059
- }
9060
- function gcd(a, b) {
9061
- return b === 0 ? a : gcd(b, a % b);
9062
- }
9063
- function getFrameHeightByMaxFs(sourceAspectRatio, requestedMaxFs) {
9064
- var _gcd = gcd(sourceAspectRatio[0], sourceAspectRatio[1]);
9065
- var minNumberRatiosForWidth = sourceAspectRatio[0] / _gcd;
9066
- var minNumberRatiosForHeight = sourceAspectRatio[1] / _gcd;
9067
- return Math.floor(Math.sqrt(requestedMaxFs * 16 * 16 / (minNumberRatiosForWidth * minNumberRatiosForHeight))) * minNumberRatiosForHeight;
9068
- }
9069
- function getScaleDownRatio(sourceAspectRatio, sourceHeight, requestedMaxFs) {
9070
- return sourceHeight / getFrameHeightByMaxFs(sourceAspectRatio, requestedMaxFs);
9071
- }
9072
- function getMaxBitrate(requestedMaxFs) {
9073
- var maxFs = requestedMaxFs || defaultMaxFrameSize;
9074
- var expectedHeight = [...maxFrameSizeToMaxBitrateMap.keys()].sort((a, b) => b - a).find(h => maxFs >= h);
9075
- return maxFrameSizeToMaxBitrateMap.get(expectedHeight);
9076
- }
9077
9086
  class MediaRequest {
9078
- constructor(policy, policySpecificInfo, receiveSlots, codecInfos) {
9079
- var _a, _b;
9087
+ constructor(policy, policySpecificInfo, receiveSlots, maxPayloadBitsPerSecond, codecInfos) {
9080
9088
  this.policy = policy;
9081
9089
  this.policySpecificInfo = policySpecificInfo;
9082
9090
  this.receiveSlots = receiveSlots;
9083
- this.maxPayloadBitsPerSecond = getMaxBitrate((_b = (_a = codecInfos === null || codecInfos === void 0 ? void 0 : codecInfos[0]) === null || _a === void 0 ? void 0 : _a.h264) === null || _b === void 0 ? void 0 : _b.maxFs);
9091
+ this.maxPayloadBitsPerSecond = maxPayloadBitsPerSecond;
9084
9092
  this.codecInfos = codecInfos;
9085
9093
  }
9086
9094
  _toJmpScrRequest() {
@@ -9680,6 +9688,41 @@ var uuid_1 = require$$0;
9680
9688
  var deepCopy$1 = function deepCopy$1(value) {
9681
9689
  return JSON.parse(JSON.stringify(value));
9682
9690
  };
9691
+ /**
9692
+ * Check deep equality between two values.
9693
+ *
9694
+ * @param value1 - First value to check.
9695
+ * @param value2 - Second value to check.
9696
+ * @returns True if values are deeply equal, false otherwise.
9697
+ */
9698
+ var deepEqual = function deepEqual(value1, value2) {
9699
+ // If both immutable values are equal, return true.
9700
+ if (value1 === value2) {
9701
+ return true;
9702
+ }
9703
+ // If both are objects, we check the length and properties of each.
9704
+ if (value1 && value2 && typeof value1 === 'object' && typeof value2 === 'object') {
9705
+ if (value1.constructor !== value2.constructor) return false;
9706
+ // Return false if the objects are of different sizes.
9707
+ if (Object.keys(value1).length !== Object.keys(value2).length) {
9708
+ return false;
9709
+ }
9710
+ // Deep equal check each property in the opject.
9711
+ for (var prop in value1) {
9712
+ if (value2.hasOwnProperty(prop)) {
9713
+ if (!deepEqual(value1[prop], value2[prop])) {
9714
+ return false;
9715
+ }
9716
+ } else {
9717
+ return false;
9718
+ }
9719
+ }
9720
+ // Return true if we found no differing properties.
9721
+ return true;
9722
+ }
9723
+ // Return false if no other conditions are met.
9724
+ return false;
9725
+ };
9683
9726
  /**
9684
9727
  * Translates a RTCStatsReport into an object.
9685
9728
  *
@@ -9696,6 +9739,18 @@ var map2obj = function map2obj(report) {
9696
9739
  });
9697
9740
  return o;
9698
9741
  };
9742
+ var persistedKeys = ['type', 'id', 'timestamp'];
9743
+ /**
9744
+ * Check to see if the report consists of more than just the persisted metadata.
9745
+ *
9746
+ * @param report - The report line being checked.
9747
+ * @returns True if the report item contains non-persisted keys, false otherwise.
9748
+ */
9749
+ var hasNonMetadata = function hasNonMetadata(report) {
9750
+ return !!Object.keys(report).filter(function (key) {
9751
+ return !persistedKeys.includes(key);
9752
+ }).length;
9753
+ };
9699
9754
  /**
9700
9755
  * Apply a delta compression to the stats report. Reduces size by ~90%.
9701
9756
  * To reduce further, report keys could be compressed.
@@ -9708,19 +9763,21 @@ var deltaCompression = function deltaCompression(oldStats, newStats) {
9708
9763
  var updatedStats = deepCopy$1(newStats);
9709
9764
  Object.keys(updatedStats).forEach(function (id) {
9710
9765
  var report = updatedStats[id];
9711
- delete report.id;
9712
9766
  if (!oldStats[id]) {
9713
9767
  return;
9714
9768
  }
9769
+ // Persist specific values beyond delta compression, as long as they
9770
+ // aren't the only non-deduped keys.
9715
9771
  Object.keys(report).forEach(function (name) {
9716
- if (report[name] === oldStats[id][name]) {
9772
+ if (deepEqual(report[name], oldStats[id][name]) && !persistedKeys.includes(name)) {
9717
9773
  delete updatedStats[id][name];
9718
9774
  }
9719
- if (Object.keys(report).length === 0 || Object.keys(report).length === 1 && report.timestamp) {
9775
+ if (!hasNonMetadata(report)) {
9720
9776
  delete updatedStats[id];
9721
9777
  }
9722
9778
  });
9723
9779
  });
9780
+ // Use the most recent timestamp.
9724
9781
  var timestamp = -Infinity;
9725
9782
  Object.keys(updatedStats).forEach(function (id) {
9726
9783
  var report = updatedStats[id];
@@ -9728,15 +9785,42 @@ var deltaCompression = function deltaCompression(oldStats, newStats) {
9728
9785
  timestamp = report.timestamp;
9729
9786
  }
9730
9787
  });
9788
+ // Delete the timestamps on each item.
9731
9789
  Object.keys(updatedStats).forEach(function (id) {
9732
9790
  var report = updatedStats[id];
9733
9791
  if (report.timestamp === timestamp) {
9734
- report.timestamp = 0;
9792
+ delete report.timestamp;
9735
9793
  }
9736
9794
  });
9737
9795
  updatedStats.timestamp = timestamp;
9738
9796
  return updatedStats;
9739
9797
  };
9798
+ /**
9799
+ * Format the stats report into an array.
9800
+ *
9801
+ * @param report - A WebRTC stats report.
9802
+ * @returns - An array of Stats Report items.
9803
+ */
9804
+ var formatStatsReport = function formatStatsReport(report) {
9805
+ return Object.keys(report).filter(function (name) {
9806
+ return name !== 'timestamp';
9807
+ }).map(function (name) {
9808
+ return report[name];
9809
+ });
9810
+ };
9811
+ /**
9812
+ * Parametrize a single string event to contain type and an (empty) id.
9813
+ *
9814
+ * @param value - The value to parametrize.
9815
+ * @returns An event object.
9816
+ */
9817
+ var makeEvent = function makeEvent(value) {
9818
+ return [{
9819
+ value: value,
9820
+ type: 'string',
9821
+ id: ''
9822
+ }];
9823
+ };
9740
9824
  /**
9741
9825
  * Attach a Peer Connection to periodically get updated on events and stats.
9742
9826
  *
@@ -9759,51 +9843,50 @@ var rtcStats = function rtcStats(pc, logger, intervalTime, id, statsPreProcessor
9759
9843
  /**
9760
9844
  * Log stats or event data with additional tracking information.
9761
9845
  *
9762
- * @param args - Array of parameters to log of any type.
9846
+ * @param name - Name of the event to log.
9847
+ * @param payload - Log data pertaining to the event.
9763
9848
  */
9764
- var trace = function trace(eventName, data) {
9849
+ var trace = function trace(name, payload, timestamp) {
9765
9850
  logger({
9766
- name: '[rtcstats]',
9767
9851
  id: id,
9768
- eventName: eventName,
9769
- data: data
9852
+ timestamp: timestamp ? Math.round(timestamp) : Date.now(),
9853
+ name: name,
9854
+ payload: payload
9770
9855
  });
9771
9856
  };
9772
- trace('creating stats report');
9773
9857
  pc.addEventListener('icecandidate', function (e) {
9774
- trace('onicecandidate', e.candidate);
9858
+ if (e.candidate) {
9859
+ trace('onicecandidate', makeEvent(JSON.stringify(e.candidate)));
9860
+ }
9775
9861
  });
9776
9862
  pc.addEventListener('icecandidateerror', function (event) {
9777
9863
  var _a = event,
9778
9864
  errorCode = _a.errorCode,
9779
9865
  errorText = _a.errorText;
9780
- trace('onicecandidateerror', {
9781
- errorText: errorText,
9782
- errorCode: errorCode
9783
- });
9866
+ trace('onicecandidateerror', makeEvent("".concat(errorCode, ": ").concat(errorText)));
9784
9867
  });
9785
9868
  pc.addEventListener('track', function (e) {
9786
- trace('ontrack', "".concat(e.track.kind, ":").concat(e.track.id, " ").concat(e.streams.map(function (stream) {
9869
+ trace('ontrack', makeEvent("".concat(e.track.kind, ":").concat(e.track.id, " ").concat(e.streams.map(function (stream) {
9787
9870
  return "stream:".concat(stream.id);
9788
- })));
9871
+ }).join(' '))));
9789
9872
  });
9790
9873
  pc.addEventListener('signalingstatechange', function () {
9791
- trace('onsignalingstatechange', pc.signalingState);
9874
+ trace('onsignalingstatechange', makeEvent(pc.signalingState));
9792
9875
  });
9793
9876
  pc.addEventListener('iceconnectionstatechange', function () {
9794
- trace('oniceconnectionstatechange', pc.iceConnectionState);
9877
+ trace('oniceconnectionstatechange', makeEvent(pc.iceConnectionState));
9795
9878
  });
9796
9879
  pc.addEventListener('icegatheringstatechange', function () {
9797
- trace('onicegatheringstatechange', pc.iceGatheringState);
9880
+ trace('onicegatheringstatechange', makeEvent(pc.iceGatheringState));
9798
9881
  });
9799
9882
  pc.addEventListener('connectionstatechange', function () {
9800
- trace('onconnectionstatechange', pc.connectionState);
9883
+ trace('onconnectionstatechange', makeEvent(pc.connectionState));
9801
9884
  });
9802
9885
  pc.addEventListener('negotiationneeded', function () {
9803
- trace('onnegotiationneeded');
9886
+ trace('onnegotiationneeded', makeEvent('negotiationneeded'));
9804
9887
  });
9805
9888
  pc.addEventListener('datachannel', function (event) {
9806
- trace('ondatachannel', [event.channel.id, event.channel.label]);
9889
+ trace('ondatachannel', makeEvent("".concat(event.channel.id, ": ").concat(event.channel.label)));
9807
9890
  });
9808
9891
  var interval = window.setInterval(function () {
9809
9892
  if (pc.signalingState === 'closed') {
@@ -9814,7 +9897,8 @@ var rtcStats = function rtcStats(pc, logger, intervalTime, id, statsPreProcessor
9814
9897
  var now = map2obj(res);
9815
9898
  statsPreProcessor(now).then(function () {
9816
9899
  var base = deepCopy$1(now); // our new prev
9817
- trace('stats-report', deltaCompression(prev, now));
9900
+ var compressed = deltaCompression(prev, now);
9901
+ trace('stats-report', formatStatsReport(compressed), compressed.timestamp !== -Infinity ? compressed.timestamp : undefined);
9818
9902
  prev = base;
9819
9903
  });
9820
9904
  });
@@ -11057,6 +11141,88 @@ function hasCodec(codecName, mLine) {
11057
11141
  return ((_a = ci.name) === null || _a === void 0 ? void 0 : _a.toLowerCase()) === codecName.toLowerCase();
11058
11142
  });
11059
11143
  }
11144
+ var MediaCodecMimeType;
11145
+ (function (MediaCodecMimeType) {
11146
+ MediaCodecMimeType["H264"] = "video/H264";
11147
+ MediaCodecMimeType["AV1"] = "video/AV1";
11148
+ MediaCodecMimeType["OPUS"] = "audio/opus";
11149
+ })(MediaCodecMimeType || (MediaCodecMimeType = {}));
11150
+ var defaultMaxVideoEncodeFrameSize = 8160;
11151
+ var defaultMaxVideoEncodeMbps = 244800;
11152
+ var RecommendedOpusBitrates;
11153
+ (function (RecommendedOpusBitrates) {
11154
+ RecommendedOpusBitrates[RecommendedOpusBitrates["NB"] = 12000] = "NB";
11155
+ RecommendedOpusBitrates[RecommendedOpusBitrates["WB"] = 20000] = "WB";
11156
+ RecommendedOpusBitrates[RecommendedOpusBitrates["FB"] = 40000] = "FB";
11157
+ RecommendedOpusBitrates[RecommendedOpusBitrates["FB_MONO_MUSIC"] = 64000] = "FB_MONO_MUSIC";
11158
+ RecommendedOpusBitrates[RecommendedOpusBitrates["FB_STEREO_MUSIC"] = 128000] = "FB_STEREO_MUSIC";
11159
+ })(RecommendedOpusBitrates || (RecommendedOpusBitrates = {}));
11160
+ function parseFmtpParams(fmtpParams) {
11161
+ fmtpParams = fmtpParams.replace(/^a=fmtp:\d+\x20/, '');
11162
+ var fmtpObj = {};
11163
+ fmtpParams.split(';').forEach(param => {
11164
+ var paramArr = param && param.split('=');
11165
+ if (paramArr.length !== 2 || !paramArr[0] || !paramArr[1]) {
11166
+ throw new Error("Fmtp params is invalid with ".concat(fmtpParams));
11167
+ }
11168
+ fmtpObj[paramArr[0]] = paramArr[1];
11169
+ });
11170
+ return fmtpObj;
11171
+ }
11172
+ function areProfileLevelIdsCompatible(senderProfileLevelId, receiverProfileLevelId, levelAsymmetryAllowed) {
11173
+ var senderProfile = Number.parseInt("0x".concat(senderProfileLevelId), 16);
11174
+ var recvProfile = Number.parseInt("0x".concat(receiverProfileLevelId), 16);
11175
+ var senderProfileIdc = senderProfile >> 16;
11176
+ var recvProfileIdc = recvProfile >> 16;
11177
+ var senderProfileIop = (senderProfile & 0x00ff00) >> 8;
11178
+ var recvProfileIop = (recvProfile & 0x00ff00) >> 8;
11179
+ var senderLevelIdc = senderProfile & 0x0000ff;
11180
+ var recvLevelIdc = recvProfile & 0x0000ff;
11181
+ var areProfileCompatible = senderProfileIdc === recvProfileIdc && senderProfileIop === recvProfileIop || senderProfileIdc === 0x42 && recvProfileIdc === 0x42 && (senderProfileIop & 0x40) === (recvProfileIop & 0x40);
11182
+ var isLevelIdcCompatible = levelAsymmetryAllowed ? true : senderLevelIdc <= recvLevelIdc;
11183
+ return areProfileCompatible && isLevelIdcCompatible;
11184
+ }
11185
+ function areCodecsCompatible(senderCodec, receiverCodec) {
11186
+ return Object.keys(receiverCodec).every(key => {
11187
+ if (!senderCodec[key] || !receiverCodec[key]) {
11188
+ return false;
11189
+ }
11190
+ if (key === 'payloadType') {
11191
+ return true;
11192
+ }
11193
+ if (key === 'sdpFmtpLine') {
11194
+ var fmtpForSender = parseFmtpParams(senderCodec[key]);
11195
+ var fmtpForReceiver = parseFmtpParams(receiverCodec[key]);
11196
+ var levelAsymmetryAllowed = Object.keys(fmtpForSender).some(senderFmtpParamKey => {
11197
+ return senderFmtpParamKey === 'level-asymmetry-allowed' && fmtpForReceiver[senderFmtpParamKey] === '1' && fmtpForSender[senderFmtpParamKey] === '1';
11198
+ });
11199
+ return Object.keys(fmtpForSender).every(senderFmtpParamKey => {
11200
+ if (fmtpForReceiver[senderFmtpParamKey]) {
11201
+ if (senderFmtpParamKey === 'profile-level-id') {
11202
+ return areProfileLevelIdsCompatible(fmtpForSender[senderFmtpParamKey], fmtpForReceiver[senderFmtpParamKey], levelAsymmetryAllowed);
11203
+ }
11204
+ }
11205
+ if (senderFmtpParamKey === 'packetization-mode') {
11206
+ return fmtpForSender[senderFmtpParamKey] === fmtpForReceiver[senderFmtpParamKey];
11207
+ }
11208
+ return true;
11209
+ });
11210
+ }
11211
+ return senderCodec[key] === receiverCodec[key];
11212
+ });
11213
+ }
11214
+ function gcd(a, b) {
11215
+ return b === 0 ? a : gcd(b, a % b);
11216
+ }
11217
+ function getFrameHeightByMaxFs(sourceAspectRatio, requestedMaxFs) {
11218
+ var _gcd = gcd(sourceAspectRatio[0], sourceAspectRatio[1]);
11219
+ var minNumberRatiosForWidth = sourceAspectRatio[0] / _gcd;
11220
+ var minNumberRatiosForHeight = sourceAspectRatio[1] / _gcd;
11221
+ return Math.floor(Math.sqrt(requestedMaxFs * 16 * 16 / (minNumberRatiosForWidth * minNumberRatiosForHeight))) * minNumberRatiosForHeight;
11222
+ }
11223
+ function getScaleDownRatio(sourceAspectRatio, sourceHeight, requestedMaxFs) {
11224
+ return sourceHeight / getFrameHeightByMaxFs(sourceAspectRatio, requestedMaxFs);
11225
+ }
11060
11226
  var events = {
11061
11227
  exports: {}
11062
11228
  };
@@ -11446,1894 +11612,1944 @@ function eventTargetAgnosticAddListener(emitter, name, listener, flags) {
11446
11612
  }
11447
11613
  }
11448
11614
  class EventEmitter extends events.exports.EventEmitter {}
11449
- var es5 = {
11450
- exports: {}
11451
- };
11452
- (function (module, exports) {
11453
- !function (e, t) {
11454
- module.exports = t();
11455
- }(commonjsGlobal$3, function () {
11456
- return function (e) {
11457
- var t = {};
11458
- function r(n) {
11459
- if (t[n]) return t[n].exports;
11460
- var i = t[n] = {
11461
- i: n,
11462
- l: !1,
11463
- exports: {}
11464
- };
11465
- return e[n].call(i.exports, i, i.exports, r), i.l = !0, i.exports;
11615
+ var OveruseState;
11616
+ (function (OveruseState) {
11617
+ OveruseState[OveruseState["NOT_OVERUSED"] = 0] = "NOT_OVERUSED";
11618
+ OveruseState[OveruseState["OVERUSED"] = 1] = "OVERUSED";
11619
+ })(OveruseState || (OveruseState = {}));
11620
+ class OveruseStateManager {
11621
+ constructor(callback) {
11622
+ this.monitors = [];
11623
+ this.lastOverallOveruseState = OveruseState.NOT_OVERUSED;
11624
+ this.isRunning = false;
11625
+ this.overuseUpdateCallback = callback;
11626
+ }
11627
+ addMonitor(monitor) {
11628
+ this.monitors.push(monitor);
11629
+ if (this.isRunning) {
11630
+ monitor.startMonitoring(() => this.onMonitorOveruseUpdate());
11631
+ }
11632
+ }
11633
+ start() {
11634
+ this.isRunning = true;
11635
+ this.monitors.forEach(monitor => monitor.startMonitoring(() => this.onMonitorOveruseUpdate()));
11636
+ }
11637
+ stop() {
11638
+ this.isRunning = false;
11639
+ this.monitors.forEach(monitor => monitor.stopMonitoring());
11640
+ }
11641
+ onMonitorOveruseUpdate() {
11642
+ var overuseStates = this.monitors.map(monitor => monitor.getLastOveruseState());
11643
+ var overallOveruseState = overuseStates.some(overuseState => overuseState === OveruseState.OVERUSED) ? OveruseState.OVERUSED : OveruseState.NOT_OVERUSED;
11644
+ if (overallOveruseState !== this.lastOverallOveruseState) {
11645
+ this.lastOverallOveruseState = overallOveruseState;
11646
+ this.overuseUpdateCallback(overallOveruseState);
11647
+ }
11648
+ }
11649
+ }
11650
+ var ReceiveSlotEvents;
11651
+ (function (ReceiveSlotEvents) {
11652
+ ReceiveSlotEvents["MediaStarted"] = "media-started";
11653
+ ReceiveSlotEvents["MediaStopped"] = "media-stopped";
11654
+ ReceiveSlotEvents["SourceUpdate"] = "source-update";
11655
+ })(ReceiveSlotEvents || (ReceiveSlotEvents = {}));
11656
+ class ReceiveSlot extends EventEmitter {
11657
+ constructor(idGetter, track) {
11658
+ super();
11659
+ this._idGetter = idGetter;
11660
+ this.handleTrackMuted = this.handleTrackMuted.bind(this);
11661
+ this.handleTrackUnmuted = this.handleTrackUnmuted.bind(this);
11662
+ this._stream = new MediaStream([track]);
11663
+ this.addTrackHandlers(track);
11664
+ }
11665
+ addTrackHandlers(track) {
11666
+ track.addEventListener('mute', this.handleTrackMuted);
11667
+ track.addEventListener('unmute', this.handleTrackUnmuted);
11668
+ }
11669
+ handleTrackMuted() {
11670
+ this.emit(ReceiveSlotEvents.MediaStopped);
11671
+ }
11672
+ handleTrackUnmuted() {
11673
+ this.emit(ReceiveSlotEvents.MediaStarted);
11674
+ }
11675
+ removeTrackHandlers(track) {
11676
+ track.removeEventListener('mute', this.handleTrackMuted);
11677
+ track.removeEventListener('unmute', this.handleTrackUnmuted);
11678
+ }
11679
+ replaceTrack(newTrack) {
11680
+ var _a;
11681
+ var trackToRemove = (_a = this._stream.getTracks()) === null || _a === void 0 ? void 0 : _a[0];
11682
+ if (trackToRemove) {
11683
+ this._stream.removeTrack(trackToRemove);
11684
+ this.removeTrackHandlers(trackToRemove);
11685
+ }
11686
+ this.addTrackHandlers(newTrack);
11687
+ this._stream.addTrack(newTrack);
11688
+ }
11689
+ _updateSource(state, csi) {
11690
+ this.currentRxCsi = csi;
11691
+ this.emit(ReceiveSlotEvents.SourceUpdate, state, csi);
11692
+ }
11693
+ close() {
11694
+ this._stream.getTracks().forEach(t => {
11695
+ this.removeTrackHandlers(t);
11696
+ });
11697
+ }
11698
+ get id() {
11699
+ return this._idGetter();
11700
+ }
11701
+ get stream() {
11702
+ return this._stream;
11703
+ }
11704
+ }
11705
+ ReceiveSlot.Events = ReceiveSlotEvents;
11706
+ class Transceiver {
11707
+ constructor(rtcRtpTransceiver) {
11708
+ this._rtcRtpTransceiver = rtcRtpTransceiver;
11709
+ }
11710
+ replaceTransceiver(newRtcRtpTransceiver) {
11711
+ this._rtcRtpTransceiver = newRtcRtpTransceiver;
11712
+ }
11713
+ get receiver() {
11714
+ return this._rtcRtpTransceiver.receiver;
11715
+ }
11716
+ get sender() {
11717
+ return this._rtcRtpTransceiver.sender;
11718
+ }
11719
+ get mid() {
11720
+ return this._rtcRtpTransceiver.mid;
11721
+ }
11722
+ close() {
11723
+ this._rtcRtpTransceiver.stop();
11724
+ }
11725
+ }
11726
+ class ReceiveOnlyTransceiver extends Transceiver {
11727
+ constructor(rtcRtpTransceiver, idGetter) {
11728
+ super(rtcRtpTransceiver);
11729
+ this._receiveSlot = new ReceiveSlot(() => {
11730
+ if (!this._rtcRtpTransceiver.mid) {
11731
+ return null;
11466
11732
  }
11467
- return r.m = e, r.c = t, r.d = function (e, t, n) {
11468
- r.o(e, t) || Object.defineProperty(e, t, {
11469
- enumerable: !0,
11470
- get: n
11471
- });
11472
- }, r.r = function (e) {
11473
- "undefined" != typeof Symbol && Symbol.toStringTag && Object.defineProperty(e, Symbol.toStringTag, {
11474
- value: "Module"
11475
- }), Object.defineProperty(e, "__esModule", {
11476
- value: !0
11733
+ return idGetter(this._rtcRtpTransceiver.mid);
11734
+ }, this._rtcRtpTransceiver.receiver.track);
11735
+ }
11736
+ replaceTransceiver(newRtcRtpTransceiver) {
11737
+ super.replaceTransceiver(newRtcRtpTransceiver);
11738
+ this._receiveSlot.replaceTrack(newRtcRtpTransceiver.receiver.track);
11739
+ }
11740
+ close() {
11741
+ super.close();
11742
+ this._receiveSlot.close();
11743
+ }
11744
+ get receiveSlot() {
11745
+ return this._receiveSlot;
11746
+ }
11747
+ getStats() {
11748
+ return this.receiver.getStats();
11749
+ }
11750
+ }
11751
+ ReceiveOnlyTransceiver.rid = '1';
11752
+ class JmpLine extends Line {
11753
+ static fromSdpLine(line) {
11754
+ if (!JmpLine.regex.test(line)) {
11755
+ return undefined;
11756
+ }
11757
+ return new JmpLine();
11758
+ }
11759
+ toSdpLine() {
11760
+ return "a=jmp";
11761
+ }
11762
+ }
11763
+ JmpLine.regex = /^jmp$/;
11764
+ class JmpStreamIdModeLine extends Line {
11765
+ constructor(streamIdMode) {
11766
+ super();
11767
+ this.streamIdMode = streamIdMode;
11768
+ }
11769
+ static fromSdpLine(line) {
11770
+ if (!JmpStreamIdModeLine.regex.test(line)) {
11771
+ return undefined;
11772
+ }
11773
+ var tokens = line.match(JmpStreamIdModeLine.regex);
11774
+ var mode = tokens[1];
11775
+ return new JmpStreamIdModeLine(mode);
11776
+ }
11777
+ toSdpLine() {
11778
+ return "a=jmp-stream-id-mode:".concat(this.streamIdMode);
11779
+ }
11780
+ }
11781
+ JmpStreamIdModeLine.regex = /^jmp-stream-id-mode:(MID-RID|SSRC)$/;
11782
+ class JmpSourceLine extends Line {
11783
+ constructor(source, csi) {
11784
+ super();
11785
+ this.source = source;
11786
+ this.csi = csi;
11787
+ }
11788
+ static fromSdpLine(line) {
11789
+ if (!JmpSourceLine.regex.test(line)) {
11790
+ return undefined;
11791
+ }
11792
+ var tokens = line.match(JmpSourceLine.regex);
11793
+ var source = tokens[1];
11794
+ var csi = tokens[2];
11795
+ return new JmpSourceLine(source, csi);
11796
+ }
11797
+ toSdpLine() {
11798
+ var line = "a=jmp-source:".concat(this.source);
11799
+ if (this.csi) {
11800
+ line += " csi=".concat(this.csi);
11801
+ }
11802
+ return line;
11803
+ }
11804
+ }
11805
+ JmpSourceLine.regex = new RegExp("^jmp-source:(".concat(ANY_NON_WS, ") (?:csi=(").concat(ANY_NON_WS, "))"));
11806
+ DefaultSdpGrammar.addParser('a', JmpLine.fromSdpLine);
11807
+ DefaultSdpGrammar.addParser('a', JmpSourceLine.fromSdpLine);
11808
+ DefaultSdpGrammar.addParser('a', JmpStreamIdModeLine.fromSdpLine);
11809
+ function deepCopy(source) {
11810
+ return Array.isArray(source) ? source.map(item => deepCopy(item)) : source instanceof Map ? new Map(source) : source instanceof Date ? new Date(source.getTime()) : source && typeof source === 'object' ? Object.getOwnPropertyNames(source).reduce((o, prop) => {
11811
+ Object.defineProperty(o, prop, Object.getOwnPropertyDescriptor(source, prop));
11812
+ o[prop] = deepCopy(source[prop]);
11813
+ return o;
11814
+ }, Object.create(Object.getPrototypeOf(source))) : source;
11815
+ }
11816
+ function getMediaTypeForMline(mLine) {
11817
+ var _a, _b;
11818
+ var mediaFamily;
11819
+ if (mLine.type.toLowerCase() === MediaFamily$1.Audio.toLowerCase()) {
11820
+ mediaFamily = MediaFamily$1.Audio;
11821
+ } else if (mLine.type.toLowerCase() === MediaFamily$1.Video.toLowerCase()) {
11822
+ mediaFamily = MediaFamily$1.Video;
11823
+ } else {
11824
+ throw Error("Mline type doesn't match any known MediaFamily: ".concat(mLine.type));
11825
+ }
11826
+ var mediaContent;
11827
+ if ((_b = (_a = mLine.content) === null || _a === void 0 ? void 0 : _a.values) === null || _b === void 0 ? void 0 : _b.some(v => v.toLowerCase() === 'slides')) {
11828
+ mediaContent = MediaContent$1.Slides;
11829
+ } else {
11830
+ mediaContent = MediaContent$1.Main;
11831
+ }
11832
+ return getMediaType(mediaFamily, mediaContent);
11833
+ }
11834
+ function filterCodecs(parsedSdp, allowedCodecs) {
11835
+ var allowedLowerCase = allowedCodecs.map(s => s.toLowerCase());
11836
+ parsedSdp.avMedia.map(m => [...m.codecs.values()].map(c => c.name)).flat().filter(codecName => !allowedLowerCase.includes(codecName.toLowerCase())).forEach(c => removeCodec(parsedSdp, c));
11837
+ }
11838
+ function setMaxBandwidth(parsedSdp, maxBandwidth) {
11839
+ parsedSdp.avMedia.forEach(mline => {
11840
+ mline.bandwidth = new BandwidthLine('TIAS', maxBandwidth);
11841
+ });
11842
+ }
11843
+ function setupBundle(parsedSdp, bundlePolicy) {
11844
+ if (bundlePolicy === 'compat') {
11845
+ var audioMids = parsedSdp.avMedia.filter(m => m.type === 'audio').map(m => m.mid);
11846
+ var videoMids = parsedSdp.avMedia.filter(m => m.type === 'video').map(m => m.mid);
11847
+ parsedSdp.session.groups.splice(0, parsedSdp.session.groups.length);
11848
+ parsedSdp.session.groups.push(new BundleGroupLine(audioMids));
11849
+ parsedSdp.session.groups.push(new BundleGroupLine(videoMids));
11850
+ }
11851
+ }
11852
+ function filterRecvOnlyMlines(parsedSdp) {
11853
+ var filteredMids = [];
11854
+ parsedSdp.media = parsedSdp.media.filter(mLine => {
11855
+ if (mLine instanceof ApplicationMediaDescription || mLine instanceof AvMediaDescription && mLine.direction !== 'recvonly') {
11856
+ filteredMids.push(mLine.mid);
11857
+ return true;
11858
+ }
11859
+ return false;
11860
+ });
11861
+ parsedSdp.session.groups.forEach(g => {
11862
+ g.mids = g.mids.filter(m => filteredMids.includes(m));
11863
+ });
11864
+ }
11865
+ function matchMlinesInAnswer(parsedOffer, parsedAnswer, streamSignalerManager) {
11866
+ parsedAnswer.session.groups = parsedOffer.session.groups;
11867
+ parsedAnswer.media = parsedOffer.media.map(offerMline => {
11868
+ if (!offerMline.mid) {
11869
+ throw new Error("Offer mline is missing MID");
11870
+ }
11871
+ var answerMline = parsedAnswer.media.find(m => m.mid === offerMline.mid);
11872
+ if (answerMline) {
11873
+ if (answerMline instanceof AvMediaDescription) {
11874
+ [...answerMline.codecs.values()].forEach(ci => {
11875
+ ci.fmtParams.push('x-google-start-bitrate=60000');
11477
11876
  });
11478
- }, r.t = function (e, t) {
11479
- if (1 & t && (e = r(e)), 8 & t) return e;
11480
- if (4 & t && "object" == typeof e && e && e.__esModule) return e;
11481
- var n = Object.create(null);
11482
- if (r.r(n), Object.defineProperty(n, "default", {
11483
- enumerable: !0,
11484
- value: e
11485
- }), 2 & t && "string" != typeof e) for (var i in e) {
11486
- r.d(n, i, function (t) {
11487
- return e[t];
11488
- }.bind(null, i));
11489
- }
11490
- return n;
11491
- }, r.n = function (e) {
11492
- var t = e && e.__esModule ? function () {
11493
- return e.default;
11494
- } : function () {
11495
- return e;
11496
- };
11497
- return r.d(t, "a", t), t;
11498
- }, r.o = function (e, t) {
11499
- return Object.prototype.hasOwnProperty.call(e, t);
11500
- }, r.p = "", r(r.s = 90);
11501
- }({
11502
- 17: function _(e, t, r) {
11503
- t.__esModule = !0, t.default = void 0;
11504
- var n = r(18),
11505
- i = function () {
11506
- function e() {}
11507
- return e.getFirstMatch = function (e, t) {
11508
- var r = t.match(e);
11509
- return r && r.length > 0 && r[1] || "";
11510
- }, e.getSecondMatch = function (e, t) {
11511
- var r = t.match(e);
11512
- return r && r.length > 1 && r[2] || "";
11513
- }, e.matchAndReturnConst = function (e, t, r) {
11514
- if (e.test(t)) return r;
11515
- }, e.getWindowsVersionName = function (e) {
11516
- switch (e) {
11517
- case "NT":
11518
- return "NT";
11519
- case "XP":
11520
- return "XP";
11521
- case "NT 5.0":
11522
- return "2000";
11523
- case "NT 5.1":
11524
- return "XP";
11525
- case "NT 5.2":
11526
- return "2003";
11527
- case "NT 6.0":
11528
- return "Vista";
11529
- case "NT 6.1":
11530
- return "7";
11531
- case "NT 6.2":
11532
- return "8";
11533
- case "NT 6.3":
11534
- return "8.1";
11535
- case "NT 10.0":
11536
- return "10";
11537
- default:
11538
- return;
11539
- }
11540
- }, e.getMacOSVersionName = function (e) {
11541
- var t = e.split(".").splice(0, 2).map(function (e) {
11542
- return parseInt(e, 10) || 0;
11543
- });
11544
- if (t.push(0), 10 === t[0]) switch (t[1]) {
11545
- case 5:
11546
- return "Leopard";
11547
- case 6:
11548
- return "Snow Leopard";
11549
- case 7:
11550
- return "Lion";
11551
- case 8:
11552
- return "Mountain Lion";
11553
- case 9:
11554
- return "Mavericks";
11555
- case 10:
11556
- return "Yosemite";
11557
- case 11:
11558
- return "El Capitan";
11559
- case 12:
11560
- return "Sierra";
11561
- case 13:
11562
- return "High Sierra";
11563
- case 14:
11564
- return "Mojave";
11565
- case 15:
11566
- return "Catalina";
11567
- default:
11568
- return;
11569
- }
11570
- }, e.getAndroidVersionName = function (e) {
11571
- var t = e.split(".").splice(0, 2).map(function (e) {
11572
- return parseInt(e, 10) || 0;
11573
- });
11574
- if (t.push(0), !(1 === t[0] && t[1] < 5)) return 1 === t[0] && t[1] < 6 ? "Cupcake" : 1 === t[0] && t[1] >= 6 ? "Donut" : 2 === t[0] && t[1] < 2 ? "Eclair" : 2 === t[0] && 2 === t[1] ? "Froyo" : 2 === t[0] && t[1] > 2 ? "Gingerbread" : 3 === t[0] ? "Honeycomb" : 4 === t[0] && t[1] < 1 ? "Ice Cream Sandwich" : 4 === t[0] && t[1] < 4 ? "Jelly Bean" : 4 === t[0] && t[1] >= 4 ? "KitKat" : 5 === t[0] ? "Lollipop" : 6 === t[0] ? "Marshmallow" : 7 === t[0] ? "Nougat" : 8 === t[0] ? "Oreo" : 9 === t[0] ? "Pie" : void 0;
11575
- }, e.getVersionPrecision = function (e) {
11576
- return e.split(".").length;
11577
- }, e.compareVersions = function (t, r, n) {
11578
- void 0 === n && (n = !1);
11579
- var i = e.getVersionPrecision(t),
11580
- s = e.getVersionPrecision(r),
11581
- a = Math.max(i, s),
11582
- o = 0,
11583
- u = e.map([t, r], function (t) {
11584
- var r = a - e.getVersionPrecision(t),
11585
- n = t + new Array(r + 1).join(".0");
11586
- return e.map(n.split("."), function (e) {
11587
- return new Array(20 - e.length).join("0") + e;
11588
- }).reverse();
11589
- });
11590
- for (n && (o = a - Math.min(i, s)), a -= 1; a >= o;) {
11591
- if (u[0][a] > u[1][a]) return 1;
11592
- if (u[0][a] === u[1][a]) {
11593
- if (a === o) return 0;
11594
- a -= 1;
11595
- } else if (u[0][a] < u[1][a]) return -1;
11596
- }
11597
- }, e.map = function (e, t) {
11598
- var r,
11599
- n = [];
11600
- if (Array.prototype.map) return Array.prototype.map.call(e, t);
11601
- for (r = 0; r < e.length; r += 1) {
11602
- n.push(t(e[r]));
11603
- }
11604
- return n;
11605
- }, e.find = function (e, t) {
11606
- var r, n;
11607
- if (Array.prototype.find) return Array.prototype.find.call(e, t);
11608
- for (r = 0, n = e.length; r < n; r += 1) {
11609
- var i = e[r];
11610
- if (t(i, r)) return i;
11611
- }
11612
- }, e.assign = function (e) {
11613
- for (var t, r, n = e, i = arguments.length, s = new Array(i > 1 ? i - 1 : 0), a = 1; a < i; a++) {
11614
- s[a - 1] = arguments[a];
11615
- }
11616
- if (Object.assign) return Object.assign.apply(Object, [e].concat(s));
11617
- var o = function o() {
11618
- var e = s[t];
11619
- "object" == typeof e && null !== e && Object.keys(e).forEach(function (t) {
11620
- n[t] = e[t];
11621
- });
11622
- };
11623
- for (t = 0, r = s.length; t < r; t += 1) {
11624
- o();
11625
- }
11626
- return e;
11627
- }, e.getBrowserAlias = function (e) {
11628
- return n.BROWSER_ALIASES_MAP[e];
11629
- }, e.getBrowserTypeByAlias = function (e) {
11630
- return n.BROWSER_MAP[e] || "";
11631
- }, e;
11632
- }();
11633
- t.default = i, e.exports = t.default;
11634
- },
11635
- 18: function _(e, t, r) {
11636
- t.__esModule = !0, t.ENGINE_MAP = t.OS_MAP = t.PLATFORMS_MAP = t.BROWSER_MAP = t.BROWSER_ALIASES_MAP = void 0;
11637
- t.BROWSER_ALIASES_MAP = {
11638
- "Amazon Silk": "amazon_silk",
11639
- "Android Browser": "android",
11640
- Bada: "bada",
11641
- BlackBerry: "blackberry",
11642
- Chrome: "chrome",
11643
- Chromium: "chromium",
11644
- Electron: "electron",
11645
- Epiphany: "epiphany",
11646
- Firefox: "firefox",
11647
- Focus: "focus",
11648
- Generic: "generic",
11649
- "Google Search": "google_search",
11650
- Googlebot: "googlebot",
11651
- "Internet Explorer": "ie",
11652
- "K-Meleon": "k_meleon",
11653
- Maxthon: "maxthon",
11654
- "Microsoft Edge": "edge",
11655
- "MZ Browser": "mz",
11656
- "NAVER Whale Browser": "naver",
11657
- Opera: "opera",
11658
- "Opera Coast": "opera_coast",
11659
- PhantomJS: "phantomjs",
11660
- Puffin: "puffin",
11661
- QupZilla: "qupzilla",
11662
- QQ: "qq",
11663
- QQLite: "qqlite",
11664
- Safari: "safari",
11665
- Sailfish: "sailfish",
11666
- "Samsung Internet for Android": "samsung_internet",
11667
- SeaMonkey: "seamonkey",
11668
- Sleipnir: "sleipnir",
11669
- Swing: "swing",
11670
- Tizen: "tizen",
11671
- "UC Browser": "uc",
11672
- Vivaldi: "vivaldi",
11673
- "WebOS Browser": "webos",
11674
- WeChat: "wechat",
11675
- "Yandex Browser": "yandex",
11676
- Roku: "roku"
11677
- };
11678
- t.BROWSER_MAP = {
11679
- amazon_silk: "Amazon Silk",
11680
- android: "Android Browser",
11681
- bada: "Bada",
11682
- blackberry: "BlackBerry",
11683
- chrome: "Chrome",
11684
- chromium: "Chromium",
11685
- electron: "Electron",
11686
- epiphany: "Epiphany",
11687
- firefox: "Firefox",
11688
- focus: "Focus",
11689
- generic: "Generic",
11690
- googlebot: "Googlebot",
11691
- google_search: "Google Search",
11692
- ie: "Internet Explorer",
11693
- k_meleon: "K-Meleon",
11694
- maxthon: "Maxthon",
11695
- edge: "Microsoft Edge",
11696
- mz: "MZ Browser",
11697
- naver: "NAVER Whale Browser",
11698
- opera: "Opera",
11699
- opera_coast: "Opera Coast",
11700
- phantomjs: "PhantomJS",
11701
- puffin: "Puffin",
11702
- qupzilla: "QupZilla",
11703
- qq: "QQ Browser",
11704
- qqlite: "QQ Browser Lite",
11705
- safari: "Safari",
11706
- sailfish: "Sailfish",
11707
- samsung_internet: "Samsung Internet for Android",
11708
- seamonkey: "SeaMonkey",
11709
- sleipnir: "Sleipnir",
11710
- swing: "Swing",
11711
- tizen: "Tizen",
11712
- uc: "UC Browser",
11713
- vivaldi: "Vivaldi",
11714
- webos: "WebOS Browser",
11715
- wechat: "WeChat",
11716
- yandex: "Yandex Browser"
11717
- };
11718
- t.PLATFORMS_MAP = {
11719
- tablet: "tablet",
11720
- mobile: "mobile",
11721
- desktop: "desktop",
11722
- tv: "tv"
11723
- };
11724
- t.OS_MAP = {
11725
- WindowsPhone: "Windows Phone",
11726
- Windows: "Windows",
11727
- MacOS: "macOS",
11728
- iOS: "iOS",
11729
- Android: "Android",
11730
- WebOS: "WebOS",
11731
- BlackBerry: "BlackBerry",
11732
- Bada: "Bada",
11733
- Tizen: "Tizen",
11734
- Linux: "Linux",
11735
- ChromeOS: "Chrome OS",
11736
- PlayStation4: "PlayStation 4",
11737
- Roku: "Roku"
11738
- };
11739
- t.ENGINE_MAP = {
11740
- EdgeHTML: "EdgeHTML",
11741
- Blink: "Blink",
11742
- Trident: "Trident",
11743
- Presto: "Presto",
11744
- Gecko: "Gecko",
11745
- WebKit: "WebKit"
11746
- };
11747
- },
11748
- 90: function _(e, t, r) {
11749
- t.__esModule = !0, t.default = void 0;
11750
- var n,
11751
- i = (n = r(91)) && n.__esModule ? n : {
11752
- default: n
11753
- },
11754
- s = r(18);
11755
- function a(e, t) {
11756
- for (var r = 0; r < t.length; r++) {
11757
- var n = t[r];
11758
- n.enumerable = n.enumerable || !1, n.configurable = !0, "value" in n && (n.writable = !0), Object.defineProperty(e, n.key, n);
11759
- }
11760
- }
11761
- var o = function () {
11762
- function e() {}
11763
- var t, r, n;
11764
- return e.getParser = function (e, t) {
11765
- if (void 0 === t && (t = !1), "string" != typeof e) throw new Error("UserAgent should be a string");
11766
- return new i.default(e, t);
11767
- }, e.parse = function (e) {
11768
- return new i.default(e).getResult();
11769
- }, t = e, n = [{
11770
- key: "BROWSER_MAP",
11771
- get: function get() {
11772
- return s.BROWSER_MAP;
11773
- }
11774
- }, {
11775
- key: "ENGINE_MAP",
11776
- get: function get() {
11777
- return s.ENGINE_MAP;
11778
- }
11779
- }, {
11780
- key: "OS_MAP",
11781
- get: function get() {
11782
- return s.OS_MAP;
11783
- }
11784
- }, {
11785
- key: "PLATFORMS_MAP",
11786
- get: function get() {
11787
- return s.PLATFORMS_MAP;
11788
- }
11789
- }], (r = null) && a(t.prototype, r), n && a(t, n), e;
11790
- }();
11791
- t.default = o, e.exports = t.default;
11792
- },
11793
- 91: function _(e, t, r) {
11794
- t.__esModule = !0, t.default = void 0;
11795
- var n = u(r(92)),
11796
- i = u(r(93)),
11797
- s = u(r(94)),
11798
- a = u(r(95)),
11799
- o = u(r(17));
11800
- function u(e) {
11801
- return e && e.__esModule ? e : {
11802
- default: e
11803
- };
11804
- }
11805
- var d = function () {
11806
- function e(e, t) {
11807
- if (void 0 === t && (t = !1), null == e || "" === e) throw new Error("UserAgent parameter can't be empty");
11808
- this._ua = e, this.parsedResult = {}, !0 !== t && this.parse();
11809
- }
11810
- var t = e.prototype;
11811
- return t.getUA = function () {
11812
- return this._ua;
11813
- }, t.test = function (e) {
11814
- return e.test(this._ua);
11815
- }, t.parseBrowser = function () {
11816
- var e = this;
11817
- this.parsedResult.browser = {};
11818
- var t = o.default.find(n.default, function (t) {
11819
- if ("function" == typeof t.test) return t.test(e);
11820
- if (t.test instanceof Array) return t.test.some(function (t) {
11821
- return e.test(t);
11822
- });
11823
- throw new Error("Browser's test function is not valid");
11824
- });
11825
- return t && (this.parsedResult.browser = t.describe(this.getUA())), this.parsedResult.browser;
11826
- }, t.getBrowser = function () {
11827
- return this.parsedResult.browser ? this.parsedResult.browser : this.parseBrowser();
11828
- }, t.getBrowserName = function (e) {
11829
- return e ? String(this.getBrowser().name).toLowerCase() || "" : this.getBrowser().name || "";
11830
- }, t.getBrowserVersion = function () {
11831
- return this.getBrowser().version;
11832
- }, t.getOS = function () {
11833
- return this.parsedResult.os ? this.parsedResult.os : this.parseOS();
11834
- }, t.parseOS = function () {
11835
- var e = this;
11836
- this.parsedResult.os = {};
11837
- var t = o.default.find(i.default, function (t) {
11838
- if ("function" == typeof t.test) return t.test(e);
11839
- if (t.test instanceof Array) return t.test.some(function (t) {
11840
- return e.test(t);
11841
- });
11842
- throw new Error("Browser's test function is not valid");
11843
- });
11844
- return t && (this.parsedResult.os = t.describe(this.getUA())), this.parsedResult.os;
11845
- }, t.getOSName = function (e) {
11846
- var t = this.getOS().name;
11847
- return e ? String(t).toLowerCase() || "" : t || "";
11848
- }, t.getOSVersion = function () {
11849
- return this.getOS().version;
11850
- }, t.getPlatform = function () {
11851
- return this.parsedResult.platform ? this.parsedResult.platform : this.parsePlatform();
11852
- }, t.getPlatformType = function (e) {
11853
- void 0 === e && (e = !1);
11854
- var t = this.getPlatform().type;
11855
- return e ? String(t).toLowerCase() || "" : t || "";
11856
- }, t.parsePlatform = function () {
11857
- var e = this;
11858
- this.parsedResult.platform = {};
11859
- var t = o.default.find(s.default, function (t) {
11860
- if ("function" == typeof t.test) return t.test(e);
11861
- if (t.test instanceof Array) return t.test.some(function (t) {
11862
- return e.test(t);
11863
- });
11864
- throw new Error("Browser's test function is not valid");
11865
- });
11866
- return t && (this.parsedResult.platform = t.describe(this.getUA())), this.parsedResult.platform;
11867
- }, t.getEngine = function () {
11868
- return this.parsedResult.engine ? this.parsedResult.engine : this.parseEngine();
11869
- }, t.getEngineName = function (e) {
11870
- return e ? String(this.getEngine().name).toLowerCase() || "" : this.getEngine().name || "";
11871
- }, t.parseEngine = function () {
11872
- var e = this;
11873
- this.parsedResult.engine = {};
11874
- var t = o.default.find(a.default, function (t) {
11875
- if ("function" == typeof t.test) return t.test(e);
11876
- if (t.test instanceof Array) return t.test.some(function (t) {
11877
- return e.test(t);
11878
- });
11879
- throw new Error("Browser's test function is not valid");
11880
- });
11881
- return t && (this.parsedResult.engine = t.describe(this.getUA())), this.parsedResult.engine;
11882
- }, t.parse = function () {
11883
- return this.parseBrowser(), this.parseOS(), this.parsePlatform(), this.parseEngine(), this;
11884
- }, t.getResult = function () {
11885
- return o.default.assign({}, this.parsedResult);
11886
- }, t.satisfies = function (e) {
11887
- var t = this,
11888
- r = {},
11889
- n = 0,
11890
- i = {},
11891
- s = 0;
11892
- if (Object.keys(e).forEach(function (t) {
11893
- var a = e[t];
11894
- "string" == typeof a ? (i[t] = a, s += 1) : "object" == typeof a && (r[t] = a, n += 1);
11895
- }), n > 0) {
11896
- var a = Object.keys(r),
11897
- u = o.default.find(a, function (e) {
11898
- return t.isOS(e);
11899
- });
11900
- if (u) {
11901
- var d = this.satisfies(r[u]);
11902
- if (void 0 !== d) return d;
11903
- }
11904
- var c = o.default.find(a, function (e) {
11905
- return t.isPlatform(e);
11906
- });
11907
- if (c) {
11908
- var f = this.satisfies(r[c]);
11909
- if (void 0 !== f) return f;
11910
- }
11911
- }
11912
- if (s > 0) {
11913
- var l = Object.keys(i),
11914
- h = o.default.find(l, function (e) {
11915
- return t.isBrowser(e, !0);
11916
- });
11917
- if (void 0 !== h) return this.compareVersion(i[h]);
11918
- }
11919
- }, t.isBrowser = function (e, t) {
11920
- void 0 === t && (t = !1);
11921
- var r = this.getBrowserName().toLowerCase(),
11922
- n = e.toLowerCase(),
11923
- i = o.default.getBrowserTypeByAlias(n);
11924
- return t && i && (n = i.toLowerCase()), n === r;
11925
- }, t.compareVersion = function (e) {
11926
- var t = [0],
11927
- r = e,
11928
- n = !1,
11929
- i = this.getBrowserVersion();
11930
- if ("string" == typeof i) return ">" === e[0] || "<" === e[0] ? (r = e.substr(1), "=" === e[1] ? (n = !0, r = e.substr(2)) : t = [], ">" === e[0] ? t.push(1) : t.push(-1)) : "=" === e[0] ? r = e.substr(1) : "~" === e[0] && (n = !0, r = e.substr(1)), t.indexOf(o.default.compareVersions(i, r, n)) > -1;
11931
- }, t.isOS = function (e) {
11932
- return this.getOSName(!0) === String(e).toLowerCase();
11933
- }, t.isPlatform = function (e) {
11934
- return this.getPlatformType(!0) === String(e).toLowerCase();
11935
- }, t.isEngine = function (e) {
11936
- return this.getEngineName(!0) === String(e).toLowerCase();
11937
- }, t.is = function (e, t) {
11938
- return void 0 === t && (t = !1), this.isBrowser(e, t) || this.isOS(e) || this.isPlatform(e);
11939
- }, t.some = function (e) {
11940
- var t = this;
11941
- return void 0 === e && (e = []), e.some(function (e) {
11942
- return t.is(e);
11943
- });
11944
- }, e;
11945
- }();
11946
- t.default = d, e.exports = t.default;
11947
- },
11948
- 92: function _(e, t, r) {
11949
- t.__esModule = !0, t.default = void 0;
11950
- var n,
11951
- i = (n = r(17)) && n.__esModule ? n : {
11952
- default: n
11953
- };
11954
- var s = /version\/(\d+(\.?_?\d+)+)/i,
11955
- a = [{
11956
- test: [/googlebot/i],
11957
- describe: function describe(e) {
11958
- var t = {
11959
- name: "Googlebot"
11960
- },
11961
- r = i.default.getFirstMatch(/googlebot\/(\d+(\.\d+))/i, e) || i.default.getFirstMatch(s, e);
11962
- return r && (t.version = r), t;
11963
- }
11964
- }, {
11965
- test: [/opera/i],
11966
- describe: function describe(e) {
11967
- var t = {
11968
- name: "Opera"
11969
- },
11970
- r = i.default.getFirstMatch(s, e) || i.default.getFirstMatch(/(?:opera)[\s/](\d+(\.?_?\d+)+)/i, e);
11971
- return r && (t.version = r), t;
11972
- }
11973
- }, {
11974
- test: [/opr\/|opios/i],
11975
- describe: function describe(e) {
11976
- var t = {
11977
- name: "Opera"
11978
- },
11979
- r = i.default.getFirstMatch(/(?:opr|opios)[\s/](\S+)/i, e) || i.default.getFirstMatch(s, e);
11980
- return r && (t.version = r), t;
11981
- }
11982
- }, {
11983
- test: [/SamsungBrowser/i],
11984
- describe: function describe(e) {
11985
- var t = {
11986
- name: "Samsung Internet for Android"
11987
- },
11988
- r = i.default.getFirstMatch(s, e) || i.default.getFirstMatch(/(?:SamsungBrowser)[\s/](\d+(\.?_?\d+)+)/i, e);
11989
- return r && (t.version = r), t;
11990
- }
11991
- }, {
11992
- test: [/Whale/i],
11993
- describe: function describe(e) {
11994
- var t = {
11995
- name: "NAVER Whale Browser"
11996
- },
11997
- r = i.default.getFirstMatch(s, e) || i.default.getFirstMatch(/(?:whale)[\s/](\d+(?:\.\d+)+)/i, e);
11998
- return r && (t.version = r), t;
11999
- }
12000
- }, {
12001
- test: [/MZBrowser/i],
12002
- describe: function describe(e) {
12003
- var t = {
12004
- name: "MZ Browser"
12005
- },
12006
- r = i.default.getFirstMatch(/(?:MZBrowser)[\s/](\d+(?:\.\d+)+)/i, e) || i.default.getFirstMatch(s, e);
12007
- return r && (t.version = r), t;
12008
- }
12009
- }, {
12010
- test: [/focus/i],
12011
- describe: function describe(e) {
12012
- var t = {
12013
- name: "Focus"
12014
- },
12015
- r = i.default.getFirstMatch(/(?:focus)[\s/](\d+(?:\.\d+)+)/i, e) || i.default.getFirstMatch(s, e);
12016
- return r && (t.version = r), t;
12017
- }
12018
- }, {
12019
- test: [/swing/i],
12020
- describe: function describe(e) {
12021
- var t = {
12022
- name: "Swing"
12023
- },
12024
- r = i.default.getFirstMatch(/(?:swing)[\s/](\d+(?:\.\d+)+)/i, e) || i.default.getFirstMatch(s, e);
12025
- return r && (t.version = r), t;
12026
- }
12027
- }, {
12028
- test: [/coast/i],
12029
- describe: function describe(e) {
12030
- var t = {
12031
- name: "Opera Coast"
12032
- },
12033
- r = i.default.getFirstMatch(s, e) || i.default.getFirstMatch(/(?:coast)[\s/](\d+(\.?_?\d+)+)/i, e);
12034
- return r && (t.version = r), t;
12035
- }
12036
- }, {
12037
- test: [/opt\/\d+(?:.?_?\d+)+/i],
12038
- describe: function describe(e) {
12039
- var t = {
12040
- name: "Opera Touch"
12041
- },
12042
- r = i.default.getFirstMatch(/(?:opt)[\s/](\d+(\.?_?\d+)+)/i, e) || i.default.getFirstMatch(s, e);
12043
- return r && (t.version = r), t;
12044
- }
12045
- }, {
12046
- test: [/yabrowser/i],
12047
- describe: function describe(e) {
12048
- var t = {
12049
- name: "Yandex Browser"
12050
- },
12051
- r = i.default.getFirstMatch(/(?:yabrowser)[\s/](\d+(\.?_?\d+)+)/i, e) || i.default.getFirstMatch(s, e);
12052
- return r && (t.version = r), t;
12053
- }
12054
- }, {
12055
- test: [/ucbrowser/i],
12056
- describe: function describe(e) {
12057
- var t = {
12058
- name: "UC Browser"
12059
- },
12060
- r = i.default.getFirstMatch(s, e) || i.default.getFirstMatch(/(?:ucbrowser)[\s/](\d+(\.?_?\d+)+)/i, e);
12061
- return r && (t.version = r), t;
12062
- }
12063
- }, {
12064
- test: [/Maxthon|mxios/i],
12065
- describe: function describe(e) {
12066
- var t = {
12067
- name: "Maxthon"
12068
- },
12069
- r = i.default.getFirstMatch(s, e) || i.default.getFirstMatch(/(?:Maxthon|mxios)[\s/](\d+(\.?_?\d+)+)/i, e);
12070
- return r && (t.version = r), t;
12071
- }
12072
- }, {
12073
- test: [/epiphany/i],
12074
- describe: function describe(e) {
12075
- var t = {
12076
- name: "Epiphany"
12077
- },
12078
- r = i.default.getFirstMatch(s, e) || i.default.getFirstMatch(/(?:epiphany)[\s/](\d+(\.?_?\d+)+)/i, e);
12079
- return r && (t.version = r), t;
12080
- }
12081
- }, {
12082
- test: [/puffin/i],
12083
- describe: function describe(e) {
12084
- var t = {
12085
- name: "Puffin"
12086
- },
12087
- r = i.default.getFirstMatch(s, e) || i.default.getFirstMatch(/(?:puffin)[\s/](\d+(\.?_?\d+)+)/i, e);
12088
- return r && (t.version = r), t;
12089
- }
12090
- }, {
12091
- test: [/sleipnir/i],
12092
- describe: function describe(e) {
12093
- var t = {
12094
- name: "Sleipnir"
12095
- },
12096
- r = i.default.getFirstMatch(s, e) || i.default.getFirstMatch(/(?:sleipnir)[\s/](\d+(\.?_?\d+)+)/i, e);
12097
- return r && (t.version = r), t;
12098
- }
12099
- }, {
12100
- test: [/k-meleon/i],
12101
- describe: function describe(e) {
12102
- var t = {
12103
- name: "K-Meleon"
12104
- },
12105
- r = i.default.getFirstMatch(s, e) || i.default.getFirstMatch(/(?:k-meleon)[\s/](\d+(\.?_?\d+)+)/i, e);
12106
- return r && (t.version = r), t;
12107
- }
12108
- }, {
12109
- test: [/micromessenger/i],
12110
- describe: function describe(e) {
12111
- var t = {
12112
- name: "WeChat"
12113
- },
12114
- r = i.default.getFirstMatch(/(?:micromessenger)[\s/](\d+(\.?_?\d+)+)/i, e) || i.default.getFirstMatch(s, e);
12115
- return r && (t.version = r), t;
12116
- }
12117
- }, {
12118
- test: [/qqbrowser/i],
12119
- describe: function describe(e) {
12120
- var t = {
12121
- name: /qqbrowserlite/i.test(e) ? "QQ Browser Lite" : "QQ Browser"
12122
- },
12123
- r = i.default.getFirstMatch(/(?:qqbrowserlite|qqbrowser)[/](\d+(\.?_?\d+)+)/i, e) || i.default.getFirstMatch(s, e);
12124
- return r && (t.version = r), t;
12125
- }
12126
- }, {
12127
- test: [/msie|trident/i],
12128
- describe: function describe(e) {
12129
- var t = {
12130
- name: "Internet Explorer"
12131
- },
12132
- r = i.default.getFirstMatch(/(?:msie |rv:)(\d+(\.?_?\d+)+)/i, e);
12133
- return r && (t.version = r), t;
12134
- }
12135
- }, {
12136
- test: [/\sedg\//i],
12137
- describe: function describe(e) {
12138
- var t = {
12139
- name: "Microsoft Edge"
12140
- },
12141
- r = i.default.getFirstMatch(/\sedg\/(\d+(\.?_?\d+)+)/i, e);
12142
- return r && (t.version = r), t;
12143
- }
12144
- }, {
12145
- test: [/edg([ea]|ios)/i],
12146
- describe: function describe(e) {
12147
- var t = {
12148
- name: "Microsoft Edge"
12149
- },
12150
- r = i.default.getSecondMatch(/edg([ea]|ios)\/(\d+(\.?_?\d+)+)/i, e);
12151
- return r && (t.version = r), t;
12152
- }
12153
- }, {
12154
- test: [/vivaldi/i],
12155
- describe: function describe(e) {
12156
- var t = {
12157
- name: "Vivaldi"
12158
- },
12159
- r = i.default.getFirstMatch(/vivaldi\/(\d+(\.?_?\d+)+)/i, e);
12160
- return r && (t.version = r), t;
12161
- }
12162
- }, {
12163
- test: [/seamonkey/i],
12164
- describe: function describe(e) {
12165
- var t = {
12166
- name: "SeaMonkey"
12167
- },
12168
- r = i.default.getFirstMatch(/seamonkey\/(\d+(\.?_?\d+)+)/i, e);
12169
- return r && (t.version = r), t;
12170
- }
12171
- }, {
12172
- test: [/sailfish/i],
12173
- describe: function describe(e) {
12174
- var t = {
12175
- name: "Sailfish"
12176
- },
12177
- r = i.default.getFirstMatch(/sailfish\s?browser\/(\d+(\.\d+)?)/i, e);
12178
- return r && (t.version = r), t;
12179
- }
12180
- }, {
12181
- test: [/silk/i],
12182
- describe: function describe(e) {
12183
- var t = {
12184
- name: "Amazon Silk"
12185
- },
12186
- r = i.default.getFirstMatch(/silk\/(\d+(\.?_?\d+)+)/i, e);
12187
- return r && (t.version = r), t;
12188
- }
12189
- }, {
12190
- test: [/phantom/i],
12191
- describe: function describe(e) {
12192
- var t = {
12193
- name: "PhantomJS"
12194
- },
12195
- r = i.default.getFirstMatch(/phantomjs\/(\d+(\.?_?\d+)+)/i, e);
12196
- return r && (t.version = r), t;
12197
- }
12198
- }, {
12199
- test: [/slimerjs/i],
12200
- describe: function describe(e) {
12201
- var t = {
12202
- name: "SlimerJS"
12203
- },
12204
- r = i.default.getFirstMatch(/slimerjs\/(\d+(\.?_?\d+)+)/i, e);
12205
- return r && (t.version = r), t;
12206
- }
12207
- }, {
12208
- test: [/blackberry|\bbb\d+/i, /rim\stablet/i],
12209
- describe: function describe(e) {
12210
- var t = {
12211
- name: "BlackBerry"
12212
- },
12213
- r = i.default.getFirstMatch(s, e) || i.default.getFirstMatch(/blackberry[\d]+\/(\d+(\.?_?\d+)+)/i, e);
12214
- return r && (t.version = r), t;
12215
- }
12216
- }, {
12217
- test: [/(web|hpw)[o0]s/i],
12218
- describe: function describe(e) {
12219
- var t = {
12220
- name: "WebOS Browser"
12221
- },
12222
- r = i.default.getFirstMatch(s, e) || i.default.getFirstMatch(/w(?:eb)?[o0]sbrowser\/(\d+(\.?_?\d+)+)/i, e);
12223
- return r && (t.version = r), t;
12224
- }
12225
- }, {
12226
- test: [/bada/i],
12227
- describe: function describe(e) {
12228
- var t = {
12229
- name: "Bada"
12230
- },
12231
- r = i.default.getFirstMatch(/dolfin\/(\d+(\.?_?\d+)+)/i, e);
12232
- return r && (t.version = r), t;
12233
- }
12234
- }, {
12235
- test: [/tizen/i],
12236
- describe: function describe(e) {
12237
- var t = {
12238
- name: "Tizen"
12239
- },
12240
- r = i.default.getFirstMatch(/(?:tizen\s?)?browser\/(\d+(\.?_?\d+)+)/i, e) || i.default.getFirstMatch(s, e);
12241
- return r && (t.version = r), t;
12242
- }
12243
- }, {
12244
- test: [/qupzilla/i],
12245
- describe: function describe(e) {
12246
- var t = {
12247
- name: "QupZilla"
12248
- },
12249
- r = i.default.getFirstMatch(/(?:qupzilla)[\s/](\d+(\.?_?\d+)+)/i, e) || i.default.getFirstMatch(s, e);
12250
- return r && (t.version = r), t;
12251
- }
12252
- }, {
12253
- test: [/firefox|iceweasel|fxios/i],
12254
- describe: function describe(e) {
12255
- var t = {
12256
- name: "Firefox"
12257
- },
12258
- r = i.default.getFirstMatch(/(?:firefox|iceweasel|fxios)[\s/](\d+(\.?_?\d+)+)/i, e);
12259
- return r && (t.version = r), t;
12260
- }
12261
- }, {
12262
- test: [/electron/i],
12263
- describe: function describe(e) {
12264
- var t = {
12265
- name: "Electron"
12266
- },
12267
- r = i.default.getFirstMatch(/(?:electron)\/(\d+(\.?_?\d+)+)/i, e);
12268
- return r && (t.version = r), t;
12269
- }
12270
- }, {
12271
- test: [/MiuiBrowser/i],
12272
- describe: function describe(e) {
12273
- var t = {
12274
- name: "Miui"
12275
- },
12276
- r = i.default.getFirstMatch(/(?:MiuiBrowser)[\s/](\d+(\.?_?\d+)+)/i, e);
12277
- return r && (t.version = r), t;
12278
- }
12279
- }, {
12280
- test: [/chromium/i],
12281
- describe: function describe(e) {
12282
- var t = {
12283
- name: "Chromium"
12284
- },
12285
- r = i.default.getFirstMatch(/(?:chromium)[\s/](\d+(\.?_?\d+)+)/i, e) || i.default.getFirstMatch(s, e);
12286
- return r && (t.version = r), t;
12287
- }
12288
- }, {
12289
- test: [/chrome|crios|crmo/i],
12290
- describe: function describe(e) {
12291
- var t = {
12292
- name: "Chrome"
12293
- },
12294
- r = i.default.getFirstMatch(/(?:chrome|crios|crmo)\/(\d+(\.?_?\d+)+)/i, e);
12295
- return r && (t.version = r), t;
12296
- }
12297
- }, {
12298
- test: [/GSA/i],
12299
- describe: function describe(e) {
12300
- var t = {
12301
- name: "Google Search"
12302
- },
12303
- r = i.default.getFirstMatch(/(?:GSA)\/(\d+(\.?_?\d+)+)/i, e);
12304
- return r && (t.version = r), t;
12305
- }
12306
- }, {
12307
- test: function test(e) {
12308
- var t = !e.test(/like android/i),
12309
- r = e.test(/android/i);
12310
- return t && r;
12311
- },
12312
- describe: function describe(e) {
12313
- var t = {
12314
- name: "Android Browser"
12315
- },
12316
- r = i.default.getFirstMatch(s, e);
12317
- return r && (t.version = r), t;
12318
- }
12319
- }, {
12320
- test: [/playstation 4/i],
12321
- describe: function describe(e) {
12322
- var t = {
12323
- name: "PlayStation 4"
12324
- },
12325
- r = i.default.getFirstMatch(s, e);
12326
- return r && (t.version = r), t;
12327
- }
12328
- }, {
12329
- test: [/safari|applewebkit/i],
12330
- describe: function describe(e) {
12331
- var t = {
12332
- name: "Safari"
12333
- },
12334
- r = i.default.getFirstMatch(s, e);
12335
- return r && (t.version = r), t;
12336
- }
12337
- }, {
12338
- test: [/.*/i],
12339
- describe: function describe(e) {
12340
- var t = -1 !== e.search("\\(") ? /^(.*)\/(.*)[ \t]\((.*)/ : /^(.*)\/(.*) /;
12341
- return {
12342
- name: i.default.getFirstMatch(t, e),
12343
- version: i.default.getSecondMatch(t, e)
12344
- };
12345
- }
12346
- }];
12347
- t.default = a, e.exports = t.default;
12348
- },
12349
- 93: function _(e, t, r) {
12350
- t.__esModule = !0, t.default = void 0;
12351
- var n,
12352
- i = (n = r(17)) && n.__esModule ? n : {
12353
- default: n
12354
- },
12355
- s = r(18);
12356
- var a = [{
12357
- test: [/Roku\/DVP/],
12358
- describe: function describe(e) {
12359
- var t = i.default.getFirstMatch(/Roku\/DVP-(\d+\.\d+)/i, e);
12360
- return {
12361
- name: s.OS_MAP.Roku,
12362
- version: t
12363
- };
12364
- }
12365
- }, {
12366
- test: [/windows phone/i],
12367
- describe: function describe(e) {
12368
- var t = i.default.getFirstMatch(/windows phone (?:os)?\s?(\d+(\.\d+)*)/i, e);
12369
- return {
12370
- name: s.OS_MAP.WindowsPhone,
12371
- version: t
12372
- };
12373
- }
12374
- }, {
12375
- test: [/windows /i],
12376
- describe: function describe(e) {
12377
- var t = i.default.getFirstMatch(/Windows ((NT|XP)( \d\d?.\d)?)/i, e),
12378
- r = i.default.getWindowsVersionName(t);
12379
- return {
12380
- name: s.OS_MAP.Windows,
12381
- version: t,
12382
- versionName: r
12383
- };
12384
- }
12385
- }, {
12386
- test: [/Macintosh(.*?) FxiOS(.*?)\//],
12387
- describe: function describe(e) {
12388
- var t = {
12389
- name: s.OS_MAP.iOS
12390
- },
12391
- r = i.default.getSecondMatch(/(Version\/)(\d[\d.]+)/, e);
12392
- return r && (t.version = r), t;
12393
- }
12394
- }, {
12395
- test: [/macintosh/i],
12396
- describe: function describe(e) {
12397
- var t = i.default.getFirstMatch(/mac os x (\d+(\.?_?\d+)+)/i, e).replace(/[_\s]/g, "."),
12398
- r = i.default.getMacOSVersionName(t),
12399
- n = {
12400
- name: s.OS_MAP.MacOS,
12401
- version: t
12402
- };
12403
- return r && (n.versionName = r), n;
12404
- }
12405
- }, {
12406
- test: [/(ipod|iphone|ipad)/i],
12407
- describe: function describe(e) {
12408
- var t = i.default.getFirstMatch(/os (\d+([_\s]\d+)*) like mac os x/i, e).replace(/[_\s]/g, ".");
12409
- return {
12410
- name: s.OS_MAP.iOS,
12411
- version: t
12412
- };
12413
- }
12414
- }, {
12415
- test: function test(e) {
12416
- var t = !e.test(/like android/i),
12417
- r = e.test(/android/i);
12418
- return t && r;
12419
- },
12420
- describe: function describe(e) {
12421
- var t = i.default.getFirstMatch(/android[\s/-](\d+(\.\d+)*)/i, e),
12422
- r = i.default.getAndroidVersionName(t),
12423
- n = {
12424
- name: s.OS_MAP.Android,
12425
- version: t
12426
- };
12427
- return r && (n.versionName = r), n;
12428
- }
12429
- }, {
12430
- test: [/(web|hpw)[o0]s/i],
12431
- describe: function describe(e) {
12432
- var t = i.default.getFirstMatch(/(?:web|hpw)[o0]s\/(\d+(\.\d+)*)/i, e),
12433
- r = {
12434
- name: s.OS_MAP.WebOS
12435
- };
12436
- return t && t.length && (r.version = t), r;
12437
- }
12438
- }, {
12439
- test: [/blackberry|\bbb\d+/i, /rim\stablet/i],
12440
- describe: function describe(e) {
12441
- var t = i.default.getFirstMatch(/rim\stablet\sos\s(\d+(\.\d+)*)/i, e) || i.default.getFirstMatch(/blackberry\d+\/(\d+([_\s]\d+)*)/i, e) || i.default.getFirstMatch(/\bbb(\d+)/i, e);
12442
- return {
12443
- name: s.OS_MAP.BlackBerry,
12444
- version: t
12445
- };
12446
- }
12447
- }, {
12448
- test: [/bada/i],
12449
- describe: function describe(e) {
12450
- var t = i.default.getFirstMatch(/bada\/(\d+(\.\d+)*)/i, e);
12451
- return {
12452
- name: s.OS_MAP.Bada,
12453
- version: t
12454
- };
12455
- }
12456
- }, {
12457
- test: [/tizen/i],
12458
- describe: function describe(e) {
12459
- var t = i.default.getFirstMatch(/tizen[/\s](\d+(\.\d+)*)/i, e);
12460
- return {
12461
- name: s.OS_MAP.Tizen,
12462
- version: t
12463
- };
12464
- }
12465
- }, {
12466
- test: [/linux/i],
12467
- describe: function describe() {
12468
- return {
12469
- name: s.OS_MAP.Linux
12470
- };
12471
- }
12472
- }, {
12473
- test: [/CrOS/],
12474
- describe: function describe() {
12475
- return {
12476
- name: s.OS_MAP.ChromeOS
12477
- };
12478
- }
12479
- }, {
12480
- test: [/PlayStation 4/],
12481
- describe: function describe(e) {
12482
- var t = i.default.getFirstMatch(/PlayStation 4[/\s](\d+(\.\d+)*)/i, e);
12483
- return {
12484
- name: s.OS_MAP.PlayStation4,
12485
- version: t
12486
- };
12487
- }
12488
- }];
12489
- t.default = a, e.exports = t.default;
12490
- },
12491
- 94: function _(e, t, r) {
12492
- t.__esModule = !0, t.default = void 0;
12493
- var n,
12494
- i = (n = r(17)) && n.__esModule ? n : {
12495
- default: n
12496
- },
12497
- s = r(18);
12498
- var a = [{
12499
- test: [/googlebot/i],
12500
- describe: function describe() {
12501
- return {
12502
- type: "bot",
12503
- vendor: "Google"
12504
- };
12505
- }
12506
- }, {
12507
- test: [/huawei/i],
12508
- describe: function describe(e) {
12509
- var t = i.default.getFirstMatch(/(can-l01)/i, e) && "Nova",
12510
- r = {
12511
- type: s.PLATFORMS_MAP.mobile,
12512
- vendor: "Huawei"
12513
- };
12514
- return t && (r.model = t), r;
12515
- }
12516
- }, {
12517
- test: [/nexus\s*(?:7|8|9|10).*/i],
12518
- describe: function describe() {
12519
- return {
12520
- type: s.PLATFORMS_MAP.tablet,
12521
- vendor: "Nexus"
12522
- };
12523
- }
12524
- }, {
12525
- test: [/ipad/i],
12526
- describe: function describe() {
12527
- return {
12528
- type: s.PLATFORMS_MAP.tablet,
12529
- vendor: "Apple",
12530
- model: "iPad"
12531
- };
12532
- }
12533
- }, {
12534
- test: [/Macintosh(.*?) FxiOS(.*?)\//],
12535
- describe: function describe() {
12536
- return {
12537
- type: s.PLATFORMS_MAP.tablet,
12538
- vendor: "Apple",
12539
- model: "iPad"
12540
- };
12541
- }
12542
- }, {
12543
- test: [/kftt build/i],
12544
- describe: function describe() {
12545
- return {
12546
- type: s.PLATFORMS_MAP.tablet,
12547
- vendor: "Amazon",
12548
- model: "Kindle Fire HD 7"
12549
- };
12550
- }
12551
- }, {
12552
- test: [/silk/i],
12553
- describe: function describe() {
12554
- return {
12555
- type: s.PLATFORMS_MAP.tablet,
12556
- vendor: "Amazon"
12557
- };
12558
- }
12559
- }, {
12560
- test: [/tablet(?! pc)/i],
12561
- describe: function describe() {
12562
- return {
12563
- type: s.PLATFORMS_MAP.tablet
12564
- };
12565
- }
12566
- }, {
12567
- test: function test(e) {
12568
- var t = e.test(/ipod|iphone/i),
12569
- r = e.test(/like (ipod|iphone)/i);
12570
- return t && !r;
12571
- },
12572
- describe: function describe(e) {
12573
- var t = i.default.getFirstMatch(/(ipod|iphone)/i, e);
12574
- return {
12575
- type: s.PLATFORMS_MAP.mobile,
12576
- vendor: "Apple",
12577
- model: t
12578
- };
12579
- }
12580
- }, {
12581
- test: [/nexus\s*[0-6].*/i, /galaxy nexus/i],
12582
- describe: function describe() {
12583
- return {
12584
- type: s.PLATFORMS_MAP.mobile,
12585
- vendor: "Nexus"
12586
- };
12587
- }
12588
- }, {
12589
- test: [/[^-]mobi/i],
12590
- describe: function describe() {
12591
- return {
12592
- type: s.PLATFORMS_MAP.mobile
12593
- };
12594
- }
12595
- }, {
12596
- test: function test(e) {
12597
- return "blackberry" === e.getBrowserName(!0);
12598
- },
12599
- describe: function describe() {
12600
- return {
12601
- type: s.PLATFORMS_MAP.mobile,
12602
- vendor: "BlackBerry"
12603
- };
12604
- }
12605
- }, {
12606
- test: function test(e) {
12607
- return "bada" === e.getBrowserName(!0);
12608
- },
12609
- describe: function describe() {
12610
- return {
12611
- type: s.PLATFORMS_MAP.mobile
12612
- };
12613
- }
12614
- }, {
12615
- test: function test(e) {
12616
- return "windows phone" === e.getBrowserName();
12617
- },
12618
- describe: function describe() {
12619
- return {
12620
- type: s.PLATFORMS_MAP.mobile,
12621
- vendor: "Microsoft"
12622
- };
12623
- }
12624
- }, {
12625
- test: function test(e) {
12626
- var t = Number(String(e.getOSVersion()).split(".")[0]);
12627
- return "android" === e.getOSName(!0) && t >= 3;
12628
- },
12629
- describe: function describe() {
12630
- return {
12631
- type: s.PLATFORMS_MAP.tablet
12632
- };
12633
- }
12634
- }, {
12635
- test: function test(e) {
12636
- return "android" === e.getOSName(!0);
12637
- },
12638
- describe: function describe() {
12639
- return {
12640
- type: s.PLATFORMS_MAP.mobile
12641
- };
12642
- }
12643
- }, {
12644
- test: function test(e) {
12645
- return "macos" === e.getOSName(!0);
12646
- },
12647
- describe: function describe() {
12648
- return {
12649
- type: s.PLATFORMS_MAP.desktop,
12650
- vendor: "Apple"
12651
- };
12652
- }
12653
- }, {
12654
- test: function test(e) {
12655
- return "windows" === e.getOSName(!0);
12656
- },
12657
- describe: function describe() {
12658
- return {
12659
- type: s.PLATFORMS_MAP.desktop
12660
- };
12661
- }
12662
- }, {
12663
- test: function test(e) {
12664
- return "linux" === e.getOSName(!0);
12665
- },
12666
- describe: function describe() {
12667
- return {
12668
- type: s.PLATFORMS_MAP.desktop
12669
- };
12670
- }
12671
- }, {
12672
- test: function test(e) {
12673
- return "playstation 4" === e.getOSName(!0);
12674
- },
12675
- describe: function describe() {
12676
- return {
12677
- type: s.PLATFORMS_MAP.tv
12678
- };
12679
- }
12680
- }, {
12681
- test: function test(e) {
12682
- return "roku" === e.getOSName(!0);
12683
- },
12684
- describe: function describe() {
12685
- return {
12686
- type: s.PLATFORMS_MAP.tv
12687
- };
12688
- }
12689
- }];
12690
- t.default = a, e.exports = t.default;
12691
- },
12692
- 95: function _(e, t, r) {
12693
- t.__esModule = !0, t.default = void 0;
12694
- var n,
12695
- i = (n = r(17)) && n.__esModule ? n : {
12696
- default: n
12697
- },
12698
- s = r(18);
12699
- var a = [{
12700
- test: function test(e) {
12701
- return "microsoft edge" === e.getBrowserName(!0);
12702
- },
12703
- describe: function describe(e) {
12704
- if (/\sedg\//i.test(e)) return {
12705
- name: s.ENGINE_MAP.Blink
12706
- };
12707
- var t = i.default.getFirstMatch(/edge\/(\d+(\.?_?\d+)+)/i, e);
12708
- return {
12709
- name: s.ENGINE_MAP.EdgeHTML,
12710
- version: t
12711
- };
12712
- }
12713
- }, {
12714
- test: [/trident/i],
12715
- describe: function describe(e) {
12716
- var t = {
12717
- name: s.ENGINE_MAP.Trident
12718
- },
12719
- r = i.default.getFirstMatch(/trident\/(\d+(\.?_?\d+)+)/i, e);
12720
- return r && (t.version = r), t;
12721
- }
12722
- }, {
12723
- test: function test(e) {
12724
- return e.test(/presto/i);
12725
- },
12726
- describe: function describe(e) {
12727
- var t = {
12728
- name: s.ENGINE_MAP.Presto
12729
- },
12730
- r = i.default.getFirstMatch(/presto\/(\d+(\.?_?\d+)+)/i, e);
12731
- return r && (t.version = r), t;
12732
- }
12733
- }, {
12734
- test: function test(e) {
12735
- var t = e.test(/gecko/i),
12736
- r = e.test(/like gecko/i);
12737
- return t && !r;
12738
- },
12739
- describe: function describe(e) {
12740
- var t = {
12741
- name: s.ENGINE_MAP.Gecko
12742
- },
12743
- r = i.default.getFirstMatch(/gecko\/(\d+(\.?_?\d+)+)/i, e);
12744
- return r && (t.version = r), t;
12745
- }
12746
- }, {
12747
- test: [/(apple)?webkit\/537\.36/i],
12748
- describe: function describe() {
12749
- return {
12750
- name: s.ENGINE_MAP.Blink
12751
- };
12752
- }
12753
- }, {
12754
- test: [/(apple)?webkit/i],
12755
- describe: function describe(e) {
12756
- var t = {
12757
- name: s.ENGINE_MAP.WebKit
12758
- },
12759
- r = i.default.getFirstMatch(/webkit\/(\d+(\.?_?\d+)+)/i, e);
12760
- return r && (t.version = r), t;
12761
- }
12762
- }];
12763
- t.default = a, e.exports = t.default;
12764
11877
  }
12765
- });
11878
+ return answerMline;
11879
+ }
11880
+ if (!(offerMline instanceof AvMediaDescription)) {
11881
+ throw new Error("Answer is missing a non-media mline: ".concat(offerMline.mid));
11882
+ }
11883
+ var startingMline = parsedAnswer.avMedia.find(m => m.type === offerMline.type);
11884
+ if (!startingMline) {
11885
+ throw new Error("Answer has no mline of type ".concat(offerMline.type, ", can't generate synthetic answer mline for mid ").concat(offerMline.mid));
11886
+ }
11887
+ var fakeCorrespondingMline = deepCopy(startingMline);
11888
+ fakeCorrespondingMline.mid = offerMline.mid;
11889
+ fakeCorrespondingMline.simulcast = undefined;
11890
+ if (offerMline.direction === 'sendrecv' || offerMline.direction === 'sendonly') {
11891
+ fakeCorrespondingMline.direction = 'recvonly';
11892
+ }
11893
+ if (offerMline.direction === 'recvonly') {
11894
+ fakeCorrespondingMline.direction = 'sendonly';
11895
+ var ingressSignaler = streamSignalerManager.getIngressStreamSignalerOrThrow(offerMline.mid);
11896
+ ingressSignaler.signalRemoteStreams(fakeCorrespondingMline);
11897
+ }
11898
+ return fakeCorrespondingMline;
12766
11899
  });
12767
- })(es5);
12768
- var Bowser = /*@__PURE__*/getDefaultExportFromCjs(es5.exports);
12769
- function getBrowserDetails() {
12770
- var browser = Bowser.getParser(window.navigator.userAgent);
12771
- return browser.getBrowser();
12772
11900
  }
12773
- var ReceiveSlotEvents;
12774
- (function (ReceiveSlotEvents) {
12775
- ReceiveSlotEvents["MediaStarted"] = "media-started";
12776
- ReceiveSlotEvents["MediaStopped"] = "media-stopped";
12777
- ReceiveSlotEvents["SourceUpdate"] = "source-update";
12778
- })(ReceiveSlotEvents || (ReceiveSlotEvents = {}));
12779
- class ReceiveSlot extends EventEmitter {
12780
- constructor(idGetter, track) {
12781
- super();
12782
- this._idGetter = idGetter;
12783
- this.handleTrackMuted = this.handleTrackMuted.bind(this);
12784
- this.handleTrackUnmuted = this.handleTrackUnmuted.bind(this);
12785
- this._stream = new MediaStream([track]);
12786
- this.addTrackHandlers(track);
12787
- }
12788
- addTrackHandlers(track) {
12789
- track.addEventListener('mute', this.handleTrackMuted);
12790
- track.addEventListener('unmute', this.handleTrackUnmuted);
12791
- }
12792
- handleTrackMuted() {
12793
- this.emit(ReceiveSlotEvents.MediaStopped);
12794
- }
12795
- handleTrackUnmuted() {
12796
- this.emit(ReceiveSlotEvents.MediaStarted);
12797
- }
12798
- removeTrackHandlers(track) {
12799
- track.removeEventListener('mute', this.handleTrackMuted);
12800
- track.removeEventListener('unmute', this.handleTrackUnmuted);
12801
- }
12802
- replaceTrack(newTrack) {
12803
- var _a;
12804
- var trackToRemove = (_a = this._stream.getTracks()) === null || _a === void 0 ? void 0 : _a[0];
12805
- if (trackToRemove) {
12806
- this._stream.removeTrack(trackToRemove);
12807
- this.removeTrackHandlers(trackToRemove);
11901
+ function injectContentTypes(sdp, contentTypeMap) {
11902
+ contentTypeMap.forEach((mediaContent, mid) => {
11903
+ var mline = sdp.media.find(m => m.mid === mid);
11904
+ if (!mline) {
11905
+ throw new Error("Error trying to set content type for mid ".concat(mid, ": not found in SDP"));
12808
11906
  }
12809
- this.addTrackHandlers(newTrack);
12810
- this._stream.addTrack(newTrack);
12811
- }
12812
- _updateSource(state, csi) {
12813
- this.currentRxCsi = csi;
12814
- this.emit(ReceiveSlotEvents.SourceUpdate, state, csi);
12815
- }
12816
- close() {
12817
- this._stream.getTracks().forEach(t => {
12818
- this.removeTrackHandlers(t);
12819
- });
12820
- }
12821
- get id() {
12822
- return this._idGetter();
12823
- }
12824
- get stream() {
12825
- return this._stream;
12826
- }
11907
+ if (mediaContent === MediaContent$1.Slides) {
11908
+ mline.addLine(new ContentLine(['slides']));
11909
+ }
11910
+ });
12827
11911
  }
12828
- ReceiveSlot.Events = ReceiveSlotEvents;
12829
- class Transceiver {
12830
- constructor(rtcRtpTransceiver) {
12831
- this._rtcRtpTransceiver = rtcRtpTransceiver;
12832
- }
12833
- replaceTransceiver(newRtcRtpTransceiver) {
12834
- this._rtcRtpTransceiver = newRtcRtpTransceiver;
12835
- }
12836
- getReceiverStats() {
12837
- return this._rtcRtpTransceiver.receiver.getStats();
12838
- }
12839
- getSenderStats() {
12840
- return this._rtcRtpTransceiver.sender.getStats();
12841
- }
12842
- get receiver() {
12843
- return this._rtcRtpTransceiver.receiver;
12844
- }
12845
- get sender() {
12846
- return this._rtcRtpTransceiver.sender;
12847
- }
12848
- get mid() {
12849
- return this._rtcRtpTransceiver.mid;
12850
- }
12851
- close() {
12852
- this._rtcRtpTransceiver.stop();
12853
- }
11912
+ function injectJmpAttributes(parsedSdp, csiMap, streamSignalingMode) {
11913
+ parsedSdp.avMedia.filter(mLine => mLine.direction === 'sendrecv' || mLine.direction === 'sendonly').forEach(mLine => {
11914
+ if (!mLine.otherLines.find(line => line instanceof JmpLine)) {
11915
+ mLine.addLine(new JmpLine());
11916
+ }
11917
+ if (!mLine.otherLines.find(line => line instanceof JmpSourceLine)) {
11918
+ var mediaType = getMediaTypeForMline(mLine);
11919
+ var csi = csiMap.get(mediaType);
11920
+ if (!csi) {
11921
+ throw new Error("Unable to find CSI for MediaType ".concat(mediaType));
11922
+ }
11923
+ mLine.addLine(new JmpSourceLine(mLine.mid, csi.toString()));
11924
+ }
11925
+ if (!mLine.otherLines.find(line => line instanceof JmpStreamIdModeLine)) {
11926
+ mLine.addLine(new JmpStreamIdModeLine(streamSignalingMode));
11927
+ }
11928
+ });
12854
11929
  }
12855
- class ReceiveOnlyTransceiver extends Transceiver {
12856
- constructor(rtcRtpTransceiver, idGetter) {
12857
- super(rtcRtpTransceiver);
12858
- this._receiveSlot = new ReceiveSlot(() => {
12859
- if (!this._rtcRtpTransceiver.mid) {
12860
- return null;
11930
+ class SendOnlyTransceiver extends Transceiver {
11931
+ constructor(rtcpRtpTransceiver, csi) {
11932
+ super(rtcpRtpTransceiver);
11933
+ this.requested = false;
11934
+ this.csi = csi;
11935
+ this.handleTrackChange = this.handleTrackChange.bind(this);
11936
+ }
11937
+ handleTrackChange() {
11938
+ var _a;
11939
+ return __awaiter(this, void 0, void 0, function* () {
11940
+ if (this.requested) {
11941
+ yield this.sender.replaceTrack(((_a = this.publishedTrack) === null || _a === void 0 ? void 0 : _a.underlyingTrack) || null);
12861
11942
  }
12862
- return idGetter(this._rtcRtpTransceiver.mid);
12863
- }, this._rtcRtpTransceiver.receiver.track);
11943
+ });
12864
11944
  }
12865
- replaceTransceiver(newRtcRtpTransceiver) {
12866
- super.replaceTransceiver(newRtcRtpTransceiver);
12867
- this._receiveSlot.replaceTrack(newRtcRtpTransceiver.receiver.track);
11945
+ replacePublishedTrack(newTrack) {
11946
+ var _a, _b;
11947
+ return __awaiter(this, void 0, void 0, function* () {
11948
+ (_a = this.publishedTrack) === null || _a === void 0 ? void 0 : _a.off(LocalTrackEvents.UnderlyingTrackChange, this.handleTrackChange);
11949
+ (_b = this.publishedTrack) === null || _b === void 0 ? void 0 : _b.setPublished(false);
11950
+ if (this.requested) {
11951
+ yield this.sender.replaceTrack((newTrack === null || newTrack === void 0 ? void 0 : newTrack.underlyingTrack) || null);
11952
+ }
11953
+ this.publishedTrack = newTrack;
11954
+ newTrack === null || newTrack === void 0 ? void 0 : newTrack.on(LocalTrackEvents.UnderlyingTrackChange, this.handleTrackChange);
11955
+ newTrack === null || newTrack === void 0 ? void 0 : newTrack.setPublished(true);
11956
+ });
12868
11957
  }
12869
- close() {
12870
- super.close();
12871
- this._receiveSlot.close();
11958
+ setTrackRequested(requested) {
11959
+ var _a;
11960
+ return __awaiter(this, void 0, void 0, function* () {
11961
+ if (this.requested !== requested) {
11962
+ this.requested = requested;
11963
+ var newTrack = requested ? ((_a = this.publishedTrack) === null || _a === void 0 ? void 0 : _a.underlyingTrack) || null : null;
11964
+ yield this.sender.replaceTrack(newTrack);
11965
+ }
11966
+ });
12872
11967
  }
12873
- get receiveSlot() {
12874
- return this._receiveSlot;
11968
+ updateSimulcastStreamStates(requestedIdEncodingParamsMap) {
11969
+ return __awaiter(this, void 0, void 0, function* () {
11970
+ var sendParameters = this.sender.getParameters();
11971
+ sendParameters.encodings.forEach((encoding, index) => {
11972
+ var encodingParams = requestedIdEncodingParamsMap.get(index);
11973
+ encoding.active = Boolean(encodingParams);
11974
+ if (encodingParams) {
11975
+ if (encodingParams.scaleDownRatio >= 1 && encoding.scaleResolutionDownBy !== encodingParams.scaleDownRatio) {
11976
+ encoding.scaleResolutionDownBy = encodingParams.scaleDownRatio;
11977
+ }
11978
+ if (encodingParams.maxPayloadBitsPerSecond) {
11979
+ encoding.maxBitrate = encodingParams.maxPayloadBitsPerSecond;
11980
+ }
11981
+ }
11982
+ });
11983
+ yield this.sender.setParameters(sendParameters);
11984
+ });
12875
11985
  }
12876
- }
12877
- ReceiveOnlyTransceiver.rid = '1';
12878
- class JmpLine extends Line {
12879
- static fromSdpLine(line) {
12880
- if (!JmpLine.regex.test(line)) {
12881
- return undefined;
11986
+ getScaleDownRatio(expectedMaxFs) {
11987
+ var _a;
11988
+ if (!expectedMaxFs) {
11989
+ return -1;
12882
11990
  }
12883
- return new JmpLine();
11991
+ if (!this.publishedTrack) {
11992
+ return -1;
11993
+ }
11994
+ var setting = (_a = this.publishedTrack) === null || _a === void 0 ? void 0 : _a.underlyingTrack.getSettings();
11995
+ var sourceHeight = setting === null || setting === void 0 ? void 0 : setting.height;
11996
+ var sourceWidth = setting === null || setting === void 0 ? void 0 : setting.width;
11997
+ if (!sourceWidth || !sourceHeight) {
11998
+ return -1;
11999
+ }
12000
+ return Math.max(getScaleDownRatio([sourceWidth, sourceHeight], sourceHeight, expectedMaxFs), 1.0);
12884
12001
  }
12885
- toSdpLine() {
12886
- return "a=jmp";
12002
+ publishTrack(track) {
12003
+ return this.replacePublishedTrack(track);
12887
12004
  }
12888
- }
12889
- JmpLine.regex = /^jmp$/;
12890
- class JmpStreamIdModeLine extends Line {
12891
- constructor(streamIdMode) {
12892
- super();
12893
- this.streamIdMode = streamIdMode;
12005
+ unpublishTrack() {
12006
+ return this.replacePublishedTrack();
12894
12007
  }
12895
- static fromSdpLine(line) {
12896
- if (!JmpStreamIdModeLine.regex.test(line)) {
12897
- return undefined;
12008
+ setActive(enabled) {
12009
+ var direction = enabled ? 'sendrecv' : 'inactive';
12010
+ this._rtcRtpTransceiver.direction = direction;
12011
+ return this._rtcRtpTransceiver.direction !== this._rtcRtpTransceiver.currentDirection;
12012
+ }
12013
+ getIngressPayloadType(mimeType) {
12014
+ var senderCodecs = this.sender.getParameters().codecs.filter(codec => codec.mimeType === mimeType);
12015
+ var receiverCodecs = this.receiver.getParameters().codecs.filter(codec => codec.mimeType === mimeType);
12016
+ if (!senderCodecs || !receiverCodecs || senderCodecs.length === 0 || receiverCodecs.length === 0) {
12017
+ throw new Error("sender codecs or receiver codecs is undefined or empty");
12898
12018
  }
12899
- var tokens = line.match(JmpStreamIdModeLine.regex);
12900
- var mode = tokens[1];
12901
- return new JmpStreamIdModeLine(mode);
12019
+ var senderCodec = senderCodecs[0];
12020
+ var targetCodec = receiverCodecs.find(receiverCodec => {
12021
+ return areCodecsCompatible(senderCodec, receiverCodec);
12022
+ });
12023
+ if (!targetCodec || !targetCodec.payloadType) {
12024
+ throw new Error("ingress payload type is not well defined in receiver codecs");
12025
+ }
12026
+ return targetCodec.payloadType;
12902
12027
  }
12903
- toSdpLine() {
12904
- return "a=jmp-stream-id-mode:".concat(this.streamIdMode);
12028
+ getStats() {
12029
+ return this.sender.getStats();
12905
12030
  }
12906
12031
  }
12907
- JmpStreamIdModeLine.regex = /^jmp-stream-id-mode:(MID-RID|SSRC)$/;
12908
- class JmpSourceLine extends Line {
12909
- constructor(source, csi) {
12910
- super();
12911
- this.source = source;
12912
- this.csi = csi;
12913
- }
12914
- static fromSdpLine(line) {
12915
- if (!JmpSourceLine.regex.test(line)) {
12916
- return undefined;
12917
- }
12918
- var tokens = line.match(JmpSourceLine.regex);
12919
- var source = tokens[1];
12920
- var csi = tokens[2];
12921
- return new JmpSourceLine(source, csi);
12032
+ class StatsManager {
12033
+ constructor(statsGetter) {
12034
+ var statsPreprocessor = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : () => __awaiter(this, void 0, void 0, function* () {});
12035
+ this.statsGetter = statsGetter;
12036
+ this.statsPreProcessor = statsPreprocessor;
12922
12037
  }
12923
- toSdpLine() {
12924
- var line = "a=jmp-source:".concat(this.source);
12925
- if (this.csi) {
12926
- line += " csi=".concat(this.csi);
12927
- }
12928
- return line;
12038
+ getStats() {
12039
+ return __awaiter(this, void 0, void 0, function* () {
12040
+ var statsReport = yield this.statsGetter();
12041
+ var statsObject = {};
12042
+ statsReport.forEach((value, key) => {
12043
+ statsObject[key] = value;
12044
+ });
12045
+ yield this.statsPreProcessor(statsObject);
12046
+ return statsObject;
12047
+ });
12929
12048
  }
12930
12049
  }
12931
- JmpSourceLine.regex = new RegExp("^jmp-source:(".concat(ANY_NON_WS, ") (?:csi=(").concat(ANY_NON_WS, "))"));
12932
- DefaultSdpGrammar.addParser('a', JmpLine.fromSdpLine);
12933
- DefaultSdpGrammar.addParser('a', JmpSourceLine.fromSdpLine);
12934
- DefaultSdpGrammar.addParser('a', JmpStreamIdModeLine.fromSdpLine);
12935
- function deepCopy(source) {
12936
- return Array.isArray(source) ? source.map(item => deepCopy(item)) : source instanceof Map ? new Map(source) : source instanceof Date ? new Date(source.getTime()) : source && typeof source === 'object' ? Object.getOwnPropertyNames(source).reduce((o, prop) => {
12937
- Object.defineProperty(o, prop, Object.getOwnPropertyDescriptor(source, prop));
12938
- o[prop] = deepCopy(source[prop]);
12939
- return o;
12940
- }, Object.create(Object.getPrototypeOf(source))) : source;
12941
- }
12942
- function getMediaTypeForMline(mLine) {
12943
- var _a, _b;
12944
- var mediaFamily;
12945
- if (mLine.type.toLowerCase() === MediaFamily$1.Audio.toLowerCase()) {
12946
- mediaFamily = MediaFamily$1.Audio;
12947
- } else if (mLine.type.toLowerCase() === MediaFamily$1.Video.toLowerCase()) {
12948
- mediaFamily = MediaFamily$1.Video;
12949
- } else {
12950
- throw Error("Mline type doesn't match any known MediaFamily: ".concat(mLine.type));
12050
+ var simulcastMaxFrameSizes = {
12051
+ 0: '240',
12052
+ 1: '2304',
12053
+ 2: '8160'
12054
+ };
12055
+ class RidIngressStreamSignaler {
12056
+ constructor(mid) {
12057
+ this.mid = mid;
12951
12058
  }
12952
- var mediaContent;
12953
- if ((_b = (_a = mLine.content) === null || _a === void 0 ? void 0 : _a.values) === null || _b === void 0 ? void 0 : _b.some(v => v.toLowerCase() === 'slides')) {
12954
- mediaContent = MediaContent$1.Slides;
12955
- } else {
12956
- mediaContent = MediaContent$1.Main;
12059
+ getReceiverId() {
12060
+ return {
12061
+ mid: this.mid,
12062
+ rid: '1'
12063
+ };
12957
12064
  }
12958
- return getMediaType(mediaFamily, mediaContent);
12959
- }
12960
- function filterCodecs(parsedSdp, allowedCodecs) {
12961
- var allowedLowerCase = allowedCodecs.map(s => s.toLowerCase());
12962
- parsedSdp.avMedia.map(m => [...m.codecs.values()].map(c => c.name)).flat().filter(codecName => !allowedLowerCase.includes(codecName.toLowerCase())).forEach(c => removeCodec(parsedSdp, c));
12963
- }
12964
- function setMaxBandwidth(parsedSdp, maxBandwidth) {
12965
- parsedSdp.avMedia.forEach(mline => {
12966
- mline.bandwidth = new BandwidthLine('TIAS', maxBandwidth);
12967
- });
12065
+ signalLocalStreams(mLine) {}
12066
+ signalRemoteStreams(mLine) {}
12968
12067
  }
12969
- function setupBundle(parsedSdp, bundlePolicy) {
12970
- if (bundlePolicy === 'compat') {
12971
- var audioMids = parsedSdp.avMedia.filter(m => m.type === 'audio').map(m => m.mid);
12972
- var videoMids = parsedSdp.avMedia.filter(m => m.type === 'video').map(m => m.mid);
12973
- parsedSdp.session.groups.splice(0, parsedSdp.session.groups.length);
12974
- parsedSdp.session.groups.push(new BundleGroupLine(audioMids));
12975
- parsedSdp.session.groups.push(new BundleGroupLine(videoMids));
12068
+ class RidEgressStreamSignaler {
12069
+ constructor(mid) {
12070
+ this.streamIds = [];
12071
+ this.mid = mid;
12976
12072
  }
12977
- }
12978
- function filterRecvOnlyMlines(parsedSdp) {
12979
- var filteredMids = [];
12980
- parsedSdp.media = parsedSdp.media.filter(mLine => {
12981
- if (mLine instanceof ApplicationMediaDescription || mLine instanceof AvMediaDescription && mLine.direction !== 'recvonly') {
12982
- filteredMids.push(mLine.mid);
12983
- return true;
12984
- }
12985
- return false;
12986
- });
12987
- parsedSdp.session.groups.forEach(g => {
12988
- g.mids = g.mids.filter(m => filteredMids.includes(m));
12989
- });
12990
- }
12991
- function matchMlinesInAnswer(parsedOffer, parsedAnswer, streamSignalerManager) {
12992
- parsedAnswer.session.groups = parsedOffer.session.groups;
12993
- parsedAnswer.media = parsedOffer.media.map(offerMline => {
12994
- if (!offerMline.mid) {
12995
- throw new Error("Offer mline is missing MID");
12996
- }
12997
- var answerMline = parsedAnswer.media.find(m => m.mid === offerMline.mid);
12998
- if (answerMline) {
12999
- if (answerMline instanceof AvMediaDescription) {
13000
- [...answerMline.codecs.values()].forEach(ci => {
13001
- ci.fmtParams.push('x-google-start-bitrate=60000');
13002
- });
12073
+ signalStreams(simulcastEnabled, _rtxEnabled, mLine) {
12074
+ mLine.ssrcGroups = [];
12075
+ if (this.streamIds.length === 0) {
12076
+ if (simulcastEnabled) {
12077
+ this.streamIds = [{
12078
+ mid: this.mid,
12079
+ rid: 'low'
12080
+ }, {
12081
+ mid: this.mid,
12082
+ rid: 'medium'
12083
+ }, {
12084
+ mid: this.mid,
12085
+ rid: 'high'
12086
+ }];
12087
+ } else {
12088
+ this.streamIds = [{
12089
+ mid: this.mid
12090
+ }];
13003
12091
  }
13004
- return answerMline;
13005
12092
  }
13006
- if (!(offerMline instanceof AvMediaDescription)) {
13007
- throw new Error("Answer is missing a non-media mline: ".concat(offerMline.mid));
12093
+ if (simulcastEnabled) {
12094
+ mLine.rids = this.streamIds.map((streamId, index) => new RidLine(streamId.rid, 'send', "max-fs=".concat(simulcastMaxFrameSizes[index])));
12095
+ mLine.simulcast = new SimulcastLine(SimulcastLayerList.fromString('low;medium;high'), new SimulcastLayerList());
13008
12096
  }
13009
- var startingMline = parsedAnswer.avMedia.find(m => m.type === offerMline.type);
13010
- if (!startingMline) {
13011
- throw new Error("Answer has no mline of type ".concat(offerMline.type, ", can't generate synthetic answer mline for mid ").concat(offerMline.mid));
12097
+ }
12098
+ getSenderIds() {
12099
+ return this.streamIds;
12100
+ }
12101
+ getEncodingIndexForStreamId(streamId) {
12102
+ return this.streamIds.findIndex(currStreamId => compareStreamIds(currStreamId, streamId));
12103
+ }
12104
+ }
12105
+ function generateSsrc() {
12106
+ return Math.floor(Math.random() * 0xffffffff);
12107
+ }
12108
+ class SsrcIngressStreamSignaler {
12109
+ constructor() {
12110
+ this.ssrc = generateSsrc();
12111
+ }
12112
+ getReceiverId() {
12113
+ return Object.assign({
12114
+ ssrc: this.ssrc
12115
+ }, this.rtxSsrc ? {
12116
+ rtxSsrc: this.rtxSsrc
12117
+ } : {});
12118
+ }
12119
+ signalLocalStreams(_mLine) {}
12120
+ signalRemoteStreams(mLine) {
12121
+ mLine.addLine(new SsrcLine(this.ssrc, 'cname', "".concat(this.ssrc, "-cname")));
12122
+ mLine.addLine(new SsrcLine(this.ssrc, 'msid', '-', '1'));
12123
+ if (hasCodec('rtx', mLine)) {
12124
+ this.rtxSsrc = generateSsrc();
12125
+ mLine.addLine(new SsrcLine(this.rtxSsrc, 'cname', "".concat(this.ssrc, "-cname")));
12126
+ mLine.addLine(new SsrcLine(this.rtxSsrc, 'msid', '-', '1'));
12127
+ mLine.addLine(new SsrcGroupLine('FID', [this.ssrc, this.rtxSsrc]));
13012
12128
  }
13013
- var fakeCorrespondingMline = deepCopy(startingMline);
13014
- fakeCorrespondingMline.mid = offerMline.mid;
13015
- fakeCorrespondingMline.simulcast = undefined;
13016
- if (offerMline.direction === 'sendrecv' || offerMline.direction === 'sendonly') {
13017
- fakeCorrespondingMline.direction = 'recvonly';
12129
+ }
12130
+ }
12131
+ class SsrcEgressStreamSignaler {
12132
+ constructor() {
12133
+ this.streamIds = [];
12134
+ }
12135
+ signalStreams(simulcastEnabled, rtxEnabled, mLine) {
12136
+ mLine.rids = [];
12137
+ mLine.simulcast = undefined;
12138
+ mLine.ssrcs = [];
12139
+ mLine.ssrcGroups = [];
12140
+ if (this.streamIds.length === 0) {
12141
+ var numStreams = simulcastEnabled ? 3 : 1;
12142
+ [...Array(numStreams).keys()].forEach(() => {
12143
+ var newStreamId = {
12144
+ ssrc: generateSsrc()
12145
+ };
12146
+ if (rtxEnabled) {
12147
+ newStreamId.rtxSsrc = generateSsrc();
12148
+ }
12149
+ this.streamIds.push(newStreamId);
12150
+ });
13018
12151
  }
13019
- if (offerMline.direction === 'recvonly') {
13020
- fakeCorrespondingMline.direction = 'sendonly';
13021
- var ingressSignaler = streamSignalerManager.getIngressStreamSignalerOrThrow(offerMline.mid);
13022
- ingressSignaler.signalRemoteStreams(fakeCorrespondingMline);
12152
+ this.streamIds.forEach(streamId => {
12153
+ var rtpSsrc = streamId.ssrc;
12154
+ mLine.addLine(new SsrcLine(rtpSsrc, 'cname', "".concat(rtpSsrc, "-cname")));
12155
+ mLine.addLine(new SsrcLine(rtpSsrc, 'msid', '-', '1'));
12156
+ if (rtxEnabled) {
12157
+ var rtxSsrc = streamId.rtxSsrc;
12158
+ mLine.addLine(new SsrcLine(rtxSsrc, 'cname', "".concat(rtpSsrc, "-cname")));
12159
+ mLine.addLine(new SsrcLine(rtxSsrc, 'msid', '-', '1'));
12160
+ mLine.addLine(new SsrcGroupLine('FID', [rtpSsrc, rtxSsrc]));
12161
+ }
12162
+ });
12163
+ if (simulcastEnabled) {
12164
+ mLine.addLine(new SsrcGroupLine('SIM', this.streamIds.map(streamId => streamId.ssrc)));
13023
12165
  }
13024
- return fakeCorrespondingMline;
13025
- });
12166
+ }
12167
+ getSenderIds() {
12168
+ return this.streamIds;
12169
+ }
12170
+ getEncodingIndexForStreamId(streamId) {
12171
+ return this.streamIds.findIndex(currStreamId => compareStreamIds(currStreamId, streamId));
12172
+ }
13026
12173
  }
13027
- function injectContentTypes(sdp, contentTypeMap) {
13028
- contentTypeMap.forEach((mediaContent, mid) => {
13029
- var mline = sdp.media.find(m => m.mid === mid);
13030
- if (!mline) {
13031
- throw new Error("Error trying to set content type for mid ".concat(mid, ": not found in SDP"));
12174
+ class StreamSignalerManager {
12175
+ constructor(streamSignalingMode) {
12176
+ this.egressStreamSignalersByMid = new Map();
12177
+ this.ingressStreamsSignalersByMid = new Map();
12178
+ this.ingressStreamSignalingMode = streamSignalingMode;
12179
+ this.egressStreamSignalingMode = streamSignalingMode;
12180
+ }
12181
+ getOrCreateEgressStreamSignaler(mid) {
12182
+ var existing = this.getEgressStreamSignaler(mid);
12183
+ if (existing) {
12184
+ return existing;
13032
12185
  }
13033
- if (mediaContent === MediaContent$1.Slides) {
13034
- mline.addLine(new ContentLine(['slides']));
12186
+ var newSignaler;
12187
+ if (this.egressStreamSignalingMode === 'MID-RID') {
12188
+ newSignaler = new RidEgressStreamSignaler(mid);
12189
+ } else {
12190
+ newSignaler = new SsrcEgressStreamSignaler();
13035
12191
  }
13036
- });
13037
- }
13038
- function injectJmpAttributes(parsedSdp, csiMap, streamSignalingMode) {
13039
- parsedSdp.avMedia.filter(mLine => mLine.direction === 'sendrecv' || mLine.direction === 'sendonly').forEach(mLine => {
13040
- if (!mLine.otherLines.find(line => line instanceof JmpLine)) {
13041
- mLine.addLine(new JmpLine());
12192
+ this.egressStreamSignalersByMid.set(mid, newSignaler);
12193
+ return newSignaler;
12194
+ }
12195
+ getEgressStreamSignalerOrThrow(mid) {
12196
+ var existing = this.getEgressStreamSignaler(mid);
12197
+ if (!existing) {
12198
+ throw new Error("Couldn't find EgressStreamSignaler for mid ".concat(mid));
13042
12199
  }
13043
- if (!mLine.otherLines.find(line => line instanceof JmpSourceLine)) {
13044
- var mediaType = getMediaTypeForMline(mLine);
13045
- var csi = csiMap.get(mediaType);
13046
- if (!csi) {
13047
- throw new Error("Unable to find CSI for MediaType ".concat(mediaType));
13048
- }
13049
- mLine.addLine(new JmpSourceLine(mLine.mid, csi.toString()));
12200
+ return existing;
12201
+ }
12202
+ getEgressStreamSignaler(mid) {
12203
+ return this.egressStreamSignalersByMid.get(mid);
12204
+ }
12205
+ getOrCreateIngressStreamSignaler(mid) {
12206
+ var existing = this.getIngressStreamSignaler(mid);
12207
+ if (existing) {
12208
+ return existing;
13050
12209
  }
13051
- if (!mLine.otherLines.find(line => line instanceof JmpStreamIdModeLine)) {
13052
- mLine.addLine(new JmpStreamIdModeLine(streamSignalingMode));
12210
+ var newSignaler;
12211
+ if (this.ingressStreamSignalingMode === 'MID-RID') {
12212
+ newSignaler = new RidIngressStreamSignaler(mid);
12213
+ } else {
12214
+ newSignaler = new SsrcIngressStreamSignaler();
13053
12215
  }
13054
- });
13055
- }
13056
- class SendOnlyTransceiver extends Transceiver {
13057
- constructor(rtcpRtpTransceiver, csi) {
13058
- super(rtcpRtpTransceiver);
13059
- this.requested = false;
13060
- this.csi = csi;
13061
- this.handleTrackChange = this.handleTrackChange.bind(this);
12216
+ this.ingressStreamsSignalersByMid.set(mid, newSignaler);
12217
+ return newSignaler;
13062
12218
  }
13063
- handleTrackChange() {
13064
- var _a;
13065
- return __awaiter(this, void 0, void 0, function* () {
13066
- if (this.requested) {
13067
- yield this.sender.replaceTrack(((_a = this.publishedTrack) === null || _a === void 0 ? void 0 : _a.underlyingTrack) || null);
13068
- }
13069
- });
12219
+ getIngressStreamSignaler(mid) {
12220
+ return this.ingressStreamsSignalersByMid.get(mid);
13070
12221
  }
13071
- replacePublishedTrack(newTrack) {
13072
- var _a, _b;
13073
- return __awaiter(this, void 0, void 0, function* () {
13074
- (_a = this.publishedTrack) === null || _a === void 0 ? void 0 : _a.off(LocalTrackEvents.UnderlyingTrackChange, this.handleTrackChange);
13075
- (_b = this.publishedTrack) === null || _b === void 0 ? void 0 : _b.setPublished(false);
13076
- if (this.requested) {
13077
- yield this.sender.replaceTrack((newTrack === null || newTrack === void 0 ? void 0 : newTrack.underlyingTrack) || null);
13078
- }
13079
- this.publishedTrack = newTrack;
13080
- newTrack === null || newTrack === void 0 ? void 0 : newTrack.on(LocalTrackEvents.UnderlyingTrackChange, this.handleTrackChange);
13081
- newTrack === null || newTrack === void 0 ? void 0 : newTrack.setPublished(true);
13082
- });
12222
+ getIngressStreamSignalerOrThrow(mid) {
12223
+ var existing = this.getIngressStreamSignaler(mid);
12224
+ if (!existing) {
12225
+ throw new Error("Couldn't find IngressStreamSignaler for mid ".concat(mid));
12226
+ }
12227
+ return existing;
13083
12228
  }
13084
- setTrackRequested(requested) {
13085
- var _a;
13086
- return __awaiter(this, void 0, void 0, function* () {
13087
- if (this.requested !== requested) {
13088
- this.requested = requested;
13089
- var newTrack = requested ? ((_a = this.publishedTrack) === null || _a === void 0 ? void 0 : _a.underlyingTrack) || null : null;
13090
- yield this.sender.replaceTrack(newTrack);
12229
+ }
12230
+ var es5 = {
12231
+ exports: {}
12232
+ };
12233
+ (function (module, exports) {
12234
+ !function (e, t) {
12235
+ module.exports = t();
12236
+ }(commonjsGlobal$3, function () {
12237
+ return function (e) {
12238
+ var t = {};
12239
+ function r(n) {
12240
+ if (t[n]) return t[n].exports;
12241
+ var i = t[n] = {
12242
+ i: n,
12243
+ l: !1,
12244
+ exports: {}
12245
+ };
12246
+ return e[n].call(i.exports, i, i.exports, r), i.l = !0, i.exports;
13091
12247
  }
13092
- });
13093
- }
13094
- updateSimulcastStreamStates(requestedIdEncodingParamsMap) {
13095
- return __awaiter(this, void 0, void 0, function* () {
13096
- var sendParameters = this.sender.getParameters();
13097
- sendParameters.encodings.forEach((encoding, index) => {
13098
- var encodingParams = requestedIdEncodingParamsMap.get(index);
13099
- encoding.active = Boolean(encodingParams);
13100
- if (encodingParams) {
13101
- if (encodingParams.scaleDownRatio >= 1 && encoding.scaleResolutionDownBy !== encodingParams.scaleDownRatio) {
13102
- encoding.scaleResolutionDownBy = encodingParams.scaleDownRatio;
12248
+ return r.m = e, r.c = t, r.d = function (e, t, n) {
12249
+ r.o(e, t) || Object.defineProperty(e, t, {
12250
+ enumerable: !0,
12251
+ get: n
12252
+ });
12253
+ }, r.r = function (e) {
12254
+ "undefined" != typeof Symbol && Symbol.toStringTag && Object.defineProperty(e, Symbol.toStringTag, {
12255
+ value: "Module"
12256
+ }), Object.defineProperty(e, "__esModule", {
12257
+ value: !0
12258
+ });
12259
+ }, r.t = function (e, t) {
12260
+ if (1 & t && (e = r(e)), 8 & t) return e;
12261
+ if (4 & t && "object" == typeof e && e && e.__esModule) return e;
12262
+ var n = Object.create(null);
12263
+ if (r.r(n), Object.defineProperty(n, "default", {
12264
+ enumerable: !0,
12265
+ value: e
12266
+ }), 2 & t && "string" != typeof e) for (var i in e) {
12267
+ r.d(n, i, function (t) {
12268
+ return e[t];
12269
+ }.bind(null, i));
12270
+ }
12271
+ return n;
12272
+ }, r.n = function (e) {
12273
+ var t = e && e.__esModule ? function () {
12274
+ return e.default;
12275
+ } : function () {
12276
+ return e;
12277
+ };
12278
+ return r.d(t, "a", t), t;
12279
+ }, r.o = function (e, t) {
12280
+ return Object.prototype.hasOwnProperty.call(e, t);
12281
+ }, r.p = "", r(r.s = 90);
12282
+ }({
12283
+ 17: function _(e, t, r) {
12284
+ t.__esModule = !0, t.default = void 0;
12285
+ var n = r(18),
12286
+ i = function () {
12287
+ function e() {}
12288
+ return e.getFirstMatch = function (e, t) {
12289
+ var r = t.match(e);
12290
+ return r && r.length > 0 && r[1] || "";
12291
+ }, e.getSecondMatch = function (e, t) {
12292
+ var r = t.match(e);
12293
+ return r && r.length > 1 && r[2] || "";
12294
+ }, e.matchAndReturnConst = function (e, t, r) {
12295
+ if (e.test(t)) return r;
12296
+ }, e.getWindowsVersionName = function (e) {
12297
+ switch (e) {
12298
+ case "NT":
12299
+ return "NT";
12300
+ case "XP":
12301
+ return "XP";
12302
+ case "NT 5.0":
12303
+ return "2000";
12304
+ case "NT 5.1":
12305
+ return "XP";
12306
+ case "NT 5.2":
12307
+ return "2003";
12308
+ case "NT 6.0":
12309
+ return "Vista";
12310
+ case "NT 6.1":
12311
+ return "7";
12312
+ case "NT 6.2":
12313
+ return "8";
12314
+ case "NT 6.3":
12315
+ return "8.1";
12316
+ case "NT 10.0":
12317
+ return "10";
12318
+ default:
12319
+ return;
12320
+ }
12321
+ }, e.getMacOSVersionName = function (e) {
12322
+ var t = e.split(".").splice(0, 2).map(function (e) {
12323
+ return parseInt(e, 10) || 0;
12324
+ });
12325
+ if (t.push(0), 10 === t[0]) switch (t[1]) {
12326
+ case 5:
12327
+ return "Leopard";
12328
+ case 6:
12329
+ return "Snow Leopard";
12330
+ case 7:
12331
+ return "Lion";
12332
+ case 8:
12333
+ return "Mountain Lion";
12334
+ case 9:
12335
+ return "Mavericks";
12336
+ case 10:
12337
+ return "Yosemite";
12338
+ case 11:
12339
+ return "El Capitan";
12340
+ case 12:
12341
+ return "Sierra";
12342
+ case 13:
12343
+ return "High Sierra";
12344
+ case 14:
12345
+ return "Mojave";
12346
+ case 15:
12347
+ return "Catalina";
12348
+ default:
12349
+ return;
12350
+ }
12351
+ }, e.getAndroidVersionName = function (e) {
12352
+ var t = e.split(".").splice(0, 2).map(function (e) {
12353
+ return parseInt(e, 10) || 0;
12354
+ });
12355
+ if (t.push(0), !(1 === t[0] && t[1] < 5)) return 1 === t[0] && t[1] < 6 ? "Cupcake" : 1 === t[0] && t[1] >= 6 ? "Donut" : 2 === t[0] && t[1] < 2 ? "Eclair" : 2 === t[0] && 2 === t[1] ? "Froyo" : 2 === t[0] && t[1] > 2 ? "Gingerbread" : 3 === t[0] ? "Honeycomb" : 4 === t[0] && t[1] < 1 ? "Ice Cream Sandwich" : 4 === t[0] && t[1] < 4 ? "Jelly Bean" : 4 === t[0] && t[1] >= 4 ? "KitKat" : 5 === t[0] ? "Lollipop" : 6 === t[0] ? "Marshmallow" : 7 === t[0] ? "Nougat" : 8 === t[0] ? "Oreo" : 9 === t[0] ? "Pie" : void 0;
12356
+ }, e.getVersionPrecision = function (e) {
12357
+ return e.split(".").length;
12358
+ }, e.compareVersions = function (t, r, n) {
12359
+ void 0 === n && (n = !1);
12360
+ var i = e.getVersionPrecision(t),
12361
+ s = e.getVersionPrecision(r),
12362
+ a = Math.max(i, s),
12363
+ o = 0,
12364
+ u = e.map([t, r], function (t) {
12365
+ var r = a - e.getVersionPrecision(t),
12366
+ n = t + new Array(r + 1).join(".0");
12367
+ return e.map(n.split("."), function (e) {
12368
+ return new Array(20 - e.length).join("0") + e;
12369
+ }).reverse();
12370
+ });
12371
+ for (n && (o = a - Math.min(i, s)), a -= 1; a >= o;) {
12372
+ if (u[0][a] > u[1][a]) return 1;
12373
+ if (u[0][a] === u[1][a]) {
12374
+ if (a === o) return 0;
12375
+ a -= 1;
12376
+ } else if (u[0][a] < u[1][a]) return -1;
12377
+ }
12378
+ }, e.map = function (e, t) {
12379
+ var r,
12380
+ n = [];
12381
+ if (Array.prototype.map) return Array.prototype.map.call(e, t);
12382
+ for (r = 0; r < e.length; r += 1) {
12383
+ n.push(t(e[r]));
12384
+ }
12385
+ return n;
12386
+ }, e.find = function (e, t) {
12387
+ var r, n;
12388
+ if (Array.prototype.find) return Array.prototype.find.call(e, t);
12389
+ for (r = 0, n = e.length; r < n; r += 1) {
12390
+ var i = e[r];
12391
+ if (t(i, r)) return i;
12392
+ }
12393
+ }, e.assign = function (e) {
12394
+ for (var t, r, n = e, i = arguments.length, s = new Array(i > 1 ? i - 1 : 0), a = 1; a < i; a++) {
12395
+ s[a - 1] = arguments[a];
12396
+ }
12397
+ if (Object.assign) return Object.assign.apply(Object, [e].concat(s));
12398
+ var o = function o() {
12399
+ var e = s[t];
12400
+ "object" == typeof e && null !== e && Object.keys(e).forEach(function (t) {
12401
+ n[t] = e[t];
12402
+ });
12403
+ };
12404
+ for (t = 0, r = s.length; t < r; t += 1) {
12405
+ o();
12406
+ }
12407
+ return e;
12408
+ }, e.getBrowserAlias = function (e) {
12409
+ return n.BROWSER_ALIASES_MAP[e];
12410
+ }, e.getBrowserTypeByAlias = function (e) {
12411
+ return n.BROWSER_MAP[e] || "";
12412
+ }, e;
12413
+ }();
12414
+ t.default = i, e.exports = t.default;
12415
+ },
12416
+ 18: function _(e, t, r) {
12417
+ t.__esModule = !0, t.ENGINE_MAP = t.OS_MAP = t.PLATFORMS_MAP = t.BROWSER_MAP = t.BROWSER_ALIASES_MAP = void 0;
12418
+ t.BROWSER_ALIASES_MAP = {
12419
+ "Amazon Silk": "amazon_silk",
12420
+ "Android Browser": "android",
12421
+ Bada: "bada",
12422
+ BlackBerry: "blackberry",
12423
+ Chrome: "chrome",
12424
+ Chromium: "chromium",
12425
+ Electron: "electron",
12426
+ Epiphany: "epiphany",
12427
+ Firefox: "firefox",
12428
+ Focus: "focus",
12429
+ Generic: "generic",
12430
+ "Google Search": "google_search",
12431
+ Googlebot: "googlebot",
12432
+ "Internet Explorer": "ie",
12433
+ "K-Meleon": "k_meleon",
12434
+ Maxthon: "maxthon",
12435
+ "Microsoft Edge": "edge",
12436
+ "MZ Browser": "mz",
12437
+ "NAVER Whale Browser": "naver",
12438
+ Opera: "opera",
12439
+ "Opera Coast": "opera_coast",
12440
+ PhantomJS: "phantomjs",
12441
+ Puffin: "puffin",
12442
+ QupZilla: "qupzilla",
12443
+ QQ: "qq",
12444
+ QQLite: "qqlite",
12445
+ Safari: "safari",
12446
+ Sailfish: "sailfish",
12447
+ "Samsung Internet for Android": "samsung_internet",
12448
+ SeaMonkey: "seamonkey",
12449
+ Sleipnir: "sleipnir",
12450
+ Swing: "swing",
12451
+ Tizen: "tizen",
12452
+ "UC Browser": "uc",
12453
+ Vivaldi: "vivaldi",
12454
+ "WebOS Browser": "webos",
12455
+ WeChat: "wechat",
12456
+ "Yandex Browser": "yandex",
12457
+ Roku: "roku"
12458
+ };
12459
+ t.BROWSER_MAP = {
12460
+ amazon_silk: "Amazon Silk",
12461
+ android: "Android Browser",
12462
+ bada: "Bada",
12463
+ blackberry: "BlackBerry",
12464
+ chrome: "Chrome",
12465
+ chromium: "Chromium",
12466
+ electron: "Electron",
12467
+ epiphany: "Epiphany",
12468
+ firefox: "Firefox",
12469
+ focus: "Focus",
12470
+ generic: "Generic",
12471
+ googlebot: "Googlebot",
12472
+ google_search: "Google Search",
12473
+ ie: "Internet Explorer",
12474
+ k_meleon: "K-Meleon",
12475
+ maxthon: "Maxthon",
12476
+ edge: "Microsoft Edge",
12477
+ mz: "MZ Browser",
12478
+ naver: "NAVER Whale Browser",
12479
+ opera: "Opera",
12480
+ opera_coast: "Opera Coast",
12481
+ phantomjs: "PhantomJS",
12482
+ puffin: "Puffin",
12483
+ qupzilla: "QupZilla",
12484
+ qq: "QQ Browser",
12485
+ qqlite: "QQ Browser Lite",
12486
+ safari: "Safari",
12487
+ sailfish: "Sailfish",
12488
+ samsung_internet: "Samsung Internet for Android",
12489
+ seamonkey: "SeaMonkey",
12490
+ sleipnir: "Sleipnir",
12491
+ swing: "Swing",
12492
+ tizen: "Tizen",
12493
+ uc: "UC Browser",
12494
+ vivaldi: "Vivaldi",
12495
+ webos: "WebOS Browser",
12496
+ wechat: "WeChat",
12497
+ yandex: "Yandex Browser"
12498
+ };
12499
+ t.PLATFORMS_MAP = {
12500
+ tablet: "tablet",
12501
+ mobile: "mobile",
12502
+ desktop: "desktop",
12503
+ tv: "tv"
12504
+ };
12505
+ t.OS_MAP = {
12506
+ WindowsPhone: "Windows Phone",
12507
+ Windows: "Windows",
12508
+ MacOS: "macOS",
12509
+ iOS: "iOS",
12510
+ Android: "Android",
12511
+ WebOS: "WebOS",
12512
+ BlackBerry: "BlackBerry",
12513
+ Bada: "Bada",
12514
+ Tizen: "Tizen",
12515
+ Linux: "Linux",
12516
+ ChromeOS: "Chrome OS",
12517
+ PlayStation4: "PlayStation 4",
12518
+ Roku: "Roku"
12519
+ };
12520
+ t.ENGINE_MAP = {
12521
+ EdgeHTML: "EdgeHTML",
12522
+ Blink: "Blink",
12523
+ Trident: "Trident",
12524
+ Presto: "Presto",
12525
+ Gecko: "Gecko",
12526
+ WebKit: "WebKit"
12527
+ };
12528
+ },
12529
+ 90: function _(e, t, r) {
12530
+ t.__esModule = !0, t.default = void 0;
12531
+ var n,
12532
+ i = (n = r(91)) && n.__esModule ? n : {
12533
+ default: n
12534
+ },
12535
+ s = r(18);
12536
+ function a(e, t) {
12537
+ for (var r = 0; r < t.length; r++) {
12538
+ var n = t[r];
12539
+ n.enumerable = n.enumerable || !1, n.configurable = !0, "value" in n && (n.writable = !0), Object.defineProperty(e, n.key, n);
12540
+ }
12541
+ }
12542
+ var o = function () {
12543
+ function e() {}
12544
+ var t, r, n;
12545
+ return e.getParser = function (e, t) {
12546
+ if (void 0 === t && (t = !1), "string" != typeof e) throw new Error("UserAgent should be a string");
12547
+ return new i.default(e, t);
12548
+ }, e.parse = function (e) {
12549
+ return new i.default(e).getResult();
12550
+ }, t = e, n = [{
12551
+ key: "BROWSER_MAP",
12552
+ get: function get() {
12553
+ return s.BROWSER_MAP;
12554
+ }
12555
+ }, {
12556
+ key: "ENGINE_MAP",
12557
+ get: function get() {
12558
+ return s.ENGINE_MAP;
12559
+ }
12560
+ }, {
12561
+ key: "OS_MAP",
12562
+ get: function get() {
12563
+ return s.OS_MAP;
12564
+ }
12565
+ }, {
12566
+ key: "PLATFORMS_MAP",
12567
+ get: function get() {
12568
+ return s.PLATFORMS_MAP;
12569
+ }
12570
+ }], (r = null) && a(t.prototype, r), n && a(t, n), e;
12571
+ }();
12572
+ t.default = o, e.exports = t.default;
12573
+ },
12574
+ 91: function _(e, t, r) {
12575
+ t.__esModule = !0, t.default = void 0;
12576
+ var n = u(r(92)),
12577
+ i = u(r(93)),
12578
+ s = u(r(94)),
12579
+ a = u(r(95)),
12580
+ o = u(r(17));
12581
+ function u(e) {
12582
+ return e && e.__esModule ? e : {
12583
+ default: e
12584
+ };
12585
+ }
12586
+ var d = function () {
12587
+ function e(e, t) {
12588
+ if (void 0 === t && (t = !1), null == e || "" === e) throw new Error("UserAgent parameter can't be empty");
12589
+ this._ua = e, this.parsedResult = {}, !0 !== t && this.parse();
12590
+ }
12591
+ var t = e.prototype;
12592
+ return t.getUA = function () {
12593
+ return this._ua;
12594
+ }, t.test = function (e) {
12595
+ return e.test(this._ua);
12596
+ }, t.parseBrowser = function () {
12597
+ var e = this;
12598
+ this.parsedResult.browser = {};
12599
+ var t = o.default.find(n.default, function (t) {
12600
+ if ("function" == typeof t.test) return t.test(e);
12601
+ if (t.test instanceof Array) return t.test.some(function (t) {
12602
+ return e.test(t);
12603
+ });
12604
+ throw new Error("Browser's test function is not valid");
12605
+ });
12606
+ return t && (this.parsedResult.browser = t.describe(this.getUA())), this.parsedResult.browser;
12607
+ }, t.getBrowser = function () {
12608
+ return this.parsedResult.browser ? this.parsedResult.browser : this.parseBrowser();
12609
+ }, t.getBrowserName = function (e) {
12610
+ return e ? String(this.getBrowser().name).toLowerCase() || "" : this.getBrowser().name || "";
12611
+ }, t.getBrowserVersion = function () {
12612
+ return this.getBrowser().version;
12613
+ }, t.getOS = function () {
12614
+ return this.parsedResult.os ? this.parsedResult.os : this.parseOS();
12615
+ }, t.parseOS = function () {
12616
+ var e = this;
12617
+ this.parsedResult.os = {};
12618
+ var t = o.default.find(i.default, function (t) {
12619
+ if ("function" == typeof t.test) return t.test(e);
12620
+ if (t.test instanceof Array) return t.test.some(function (t) {
12621
+ return e.test(t);
12622
+ });
12623
+ throw new Error("Browser's test function is not valid");
12624
+ });
12625
+ return t && (this.parsedResult.os = t.describe(this.getUA())), this.parsedResult.os;
12626
+ }, t.getOSName = function (e) {
12627
+ var t = this.getOS().name;
12628
+ return e ? String(t).toLowerCase() || "" : t || "";
12629
+ }, t.getOSVersion = function () {
12630
+ return this.getOS().version;
12631
+ }, t.getPlatform = function () {
12632
+ return this.parsedResult.platform ? this.parsedResult.platform : this.parsePlatform();
12633
+ }, t.getPlatformType = function (e) {
12634
+ void 0 === e && (e = !1);
12635
+ var t = this.getPlatform().type;
12636
+ return e ? String(t).toLowerCase() || "" : t || "";
12637
+ }, t.parsePlatform = function () {
12638
+ var e = this;
12639
+ this.parsedResult.platform = {};
12640
+ var t = o.default.find(s.default, function (t) {
12641
+ if ("function" == typeof t.test) return t.test(e);
12642
+ if (t.test instanceof Array) return t.test.some(function (t) {
12643
+ return e.test(t);
12644
+ });
12645
+ throw new Error("Browser's test function is not valid");
12646
+ });
12647
+ return t && (this.parsedResult.platform = t.describe(this.getUA())), this.parsedResult.platform;
12648
+ }, t.getEngine = function () {
12649
+ return this.parsedResult.engine ? this.parsedResult.engine : this.parseEngine();
12650
+ }, t.getEngineName = function (e) {
12651
+ return e ? String(this.getEngine().name).toLowerCase() || "" : this.getEngine().name || "";
12652
+ }, t.parseEngine = function () {
12653
+ var e = this;
12654
+ this.parsedResult.engine = {};
12655
+ var t = o.default.find(a.default, function (t) {
12656
+ if ("function" == typeof t.test) return t.test(e);
12657
+ if (t.test instanceof Array) return t.test.some(function (t) {
12658
+ return e.test(t);
12659
+ });
12660
+ throw new Error("Browser's test function is not valid");
12661
+ });
12662
+ return t && (this.parsedResult.engine = t.describe(this.getUA())), this.parsedResult.engine;
12663
+ }, t.parse = function () {
12664
+ return this.parseBrowser(), this.parseOS(), this.parsePlatform(), this.parseEngine(), this;
12665
+ }, t.getResult = function () {
12666
+ return o.default.assign({}, this.parsedResult);
12667
+ }, t.satisfies = function (e) {
12668
+ var t = this,
12669
+ r = {},
12670
+ n = 0,
12671
+ i = {},
12672
+ s = 0;
12673
+ if (Object.keys(e).forEach(function (t) {
12674
+ var a = e[t];
12675
+ "string" == typeof a ? (i[t] = a, s += 1) : "object" == typeof a && (r[t] = a, n += 1);
12676
+ }), n > 0) {
12677
+ var a = Object.keys(r),
12678
+ u = o.default.find(a, function (e) {
12679
+ return t.isOS(e);
12680
+ });
12681
+ if (u) {
12682
+ var d = this.satisfies(r[u]);
12683
+ if (void 0 !== d) return d;
12684
+ }
12685
+ var c = o.default.find(a, function (e) {
12686
+ return t.isPlatform(e);
12687
+ });
12688
+ if (c) {
12689
+ var f = this.satisfies(r[c]);
12690
+ if (void 0 !== f) return f;
12691
+ }
12692
+ }
12693
+ if (s > 0) {
12694
+ var l = Object.keys(i),
12695
+ h = o.default.find(l, function (e) {
12696
+ return t.isBrowser(e, !0);
12697
+ });
12698
+ if (void 0 !== h) return this.compareVersion(i[h]);
12699
+ }
12700
+ }, t.isBrowser = function (e, t) {
12701
+ void 0 === t && (t = !1);
12702
+ var r = this.getBrowserName().toLowerCase(),
12703
+ n = e.toLowerCase(),
12704
+ i = o.default.getBrowserTypeByAlias(n);
12705
+ return t && i && (n = i.toLowerCase()), n === r;
12706
+ }, t.compareVersion = function (e) {
12707
+ var t = [0],
12708
+ r = e,
12709
+ n = !1,
12710
+ i = this.getBrowserVersion();
12711
+ if ("string" == typeof i) return ">" === e[0] || "<" === e[0] ? (r = e.substr(1), "=" === e[1] ? (n = !0, r = e.substr(2)) : t = [], ">" === e[0] ? t.push(1) : t.push(-1)) : "=" === e[0] ? r = e.substr(1) : "~" === e[0] && (n = !0, r = e.substr(1)), t.indexOf(o.default.compareVersions(i, r, n)) > -1;
12712
+ }, t.isOS = function (e) {
12713
+ return this.getOSName(!0) === String(e).toLowerCase();
12714
+ }, t.isPlatform = function (e) {
12715
+ return this.getPlatformType(!0) === String(e).toLowerCase();
12716
+ }, t.isEngine = function (e) {
12717
+ return this.getEngineName(!0) === String(e).toLowerCase();
12718
+ }, t.is = function (e, t) {
12719
+ return void 0 === t && (t = !1), this.isBrowser(e, t) || this.isOS(e) || this.isPlatform(e);
12720
+ }, t.some = function (e) {
12721
+ var t = this;
12722
+ return void 0 === e && (e = []), e.some(function (e) {
12723
+ return t.is(e);
12724
+ });
12725
+ }, e;
12726
+ }();
12727
+ t.default = d, e.exports = t.default;
12728
+ },
12729
+ 92: function _(e, t, r) {
12730
+ t.__esModule = !0, t.default = void 0;
12731
+ var n,
12732
+ i = (n = r(17)) && n.__esModule ? n : {
12733
+ default: n
12734
+ };
12735
+ var s = /version\/(\d+(\.?_?\d+)+)/i,
12736
+ a = [{
12737
+ test: [/googlebot/i],
12738
+ describe: function describe(e) {
12739
+ var t = {
12740
+ name: "Googlebot"
12741
+ },
12742
+ r = i.default.getFirstMatch(/googlebot\/(\d+(\.\d+))/i, e) || i.default.getFirstMatch(s, e);
12743
+ return r && (t.version = r), t;
12744
+ }
12745
+ }, {
12746
+ test: [/opera/i],
12747
+ describe: function describe(e) {
12748
+ var t = {
12749
+ name: "Opera"
12750
+ },
12751
+ r = i.default.getFirstMatch(s, e) || i.default.getFirstMatch(/(?:opera)[\s/](\d+(\.?_?\d+)+)/i, e);
12752
+ return r && (t.version = r), t;
12753
+ }
12754
+ }, {
12755
+ test: [/opr\/|opios/i],
12756
+ describe: function describe(e) {
12757
+ var t = {
12758
+ name: "Opera"
12759
+ },
12760
+ r = i.default.getFirstMatch(/(?:opr|opios)[\s/](\S+)/i, e) || i.default.getFirstMatch(s, e);
12761
+ return r && (t.version = r), t;
12762
+ }
12763
+ }, {
12764
+ test: [/SamsungBrowser/i],
12765
+ describe: function describe(e) {
12766
+ var t = {
12767
+ name: "Samsung Internet for Android"
12768
+ },
12769
+ r = i.default.getFirstMatch(s, e) || i.default.getFirstMatch(/(?:SamsungBrowser)[\s/](\d+(\.?_?\d+)+)/i, e);
12770
+ return r && (t.version = r), t;
12771
+ }
12772
+ }, {
12773
+ test: [/Whale/i],
12774
+ describe: function describe(e) {
12775
+ var t = {
12776
+ name: "NAVER Whale Browser"
12777
+ },
12778
+ r = i.default.getFirstMatch(s, e) || i.default.getFirstMatch(/(?:whale)[\s/](\d+(?:\.\d+)+)/i, e);
12779
+ return r && (t.version = r), t;
12780
+ }
12781
+ }, {
12782
+ test: [/MZBrowser/i],
12783
+ describe: function describe(e) {
12784
+ var t = {
12785
+ name: "MZ Browser"
12786
+ },
12787
+ r = i.default.getFirstMatch(/(?:MZBrowser)[\s/](\d+(?:\.\d+)+)/i, e) || i.default.getFirstMatch(s, e);
12788
+ return r && (t.version = r), t;
12789
+ }
12790
+ }, {
12791
+ test: [/focus/i],
12792
+ describe: function describe(e) {
12793
+ var t = {
12794
+ name: "Focus"
12795
+ },
12796
+ r = i.default.getFirstMatch(/(?:focus)[\s/](\d+(?:\.\d+)+)/i, e) || i.default.getFirstMatch(s, e);
12797
+ return r && (t.version = r), t;
12798
+ }
12799
+ }, {
12800
+ test: [/swing/i],
12801
+ describe: function describe(e) {
12802
+ var t = {
12803
+ name: "Swing"
12804
+ },
12805
+ r = i.default.getFirstMatch(/(?:swing)[\s/](\d+(?:\.\d+)+)/i, e) || i.default.getFirstMatch(s, e);
12806
+ return r && (t.version = r), t;
12807
+ }
12808
+ }, {
12809
+ test: [/coast/i],
12810
+ describe: function describe(e) {
12811
+ var t = {
12812
+ name: "Opera Coast"
12813
+ },
12814
+ r = i.default.getFirstMatch(s, e) || i.default.getFirstMatch(/(?:coast)[\s/](\d+(\.?_?\d+)+)/i, e);
12815
+ return r && (t.version = r), t;
12816
+ }
12817
+ }, {
12818
+ test: [/opt\/\d+(?:.?_?\d+)+/i],
12819
+ describe: function describe(e) {
12820
+ var t = {
12821
+ name: "Opera Touch"
12822
+ },
12823
+ r = i.default.getFirstMatch(/(?:opt)[\s/](\d+(\.?_?\d+)+)/i, e) || i.default.getFirstMatch(s, e);
12824
+ return r && (t.version = r), t;
12825
+ }
12826
+ }, {
12827
+ test: [/yabrowser/i],
12828
+ describe: function describe(e) {
12829
+ var t = {
12830
+ name: "Yandex Browser"
12831
+ },
12832
+ r = i.default.getFirstMatch(/(?:yabrowser)[\s/](\d+(\.?_?\d+)+)/i, e) || i.default.getFirstMatch(s, e);
12833
+ return r && (t.version = r), t;
12834
+ }
12835
+ }, {
12836
+ test: [/ucbrowser/i],
12837
+ describe: function describe(e) {
12838
+ var t = {
12839
+ name: "UC Browser"
12840
+ },
12841
+ r = i.default.getFirstMatch(s, e) || i.default.getFirstMatch(/(?:ucbrowser)[\s/](\d+(\.?_?\d+)+)/i, e);
12842
+ return r && (t.version = r), t;
12843
+ }
12844
+ }, {
12845
+ test: [/Maxthon|mxios/i],
12846
+ describe: function describe(e) {
12847
+ var t = {
12848
+ name: "Maxthon"
12849
+ },
12850
+ r = i.default.getFirstMatch(s, e) || i.default.getFirstMatch(/(?:Maxthon|mxios)[\s/](\d+(\.?_?\d+)+)/i, e);
12851
+ return r && (t.version = r), t;
12852
+ }
12853
+ }, {
12854
+ test: [/epiphany/i],
12855
+ describe: function describe(e) {
12856
+ var t = {
12857
+ name: "Epiphany"
12858
+ },
12859
+ r = i.default.getFirstMatch(s, e) || i.default.getFirstMatch(/(?:epiphany)[\s/](\d+(\.?_?\d+)+)/i, e);
12860
+ return r && (t.version = r), t;
12861
+ }
12862
+ }, {
12863
+ test: [/puffin/i],
12864
+ describe: function describe(e) {
12865
+ var t = {
12866
+ name: "Puffin"
12867
+ },
12868
+ r = i.default.getFirstMatch(s, e) || i.default.getFirstMatch(/(?:puffin)[\s/](\d+(\.?_?\d+)+)/i, e);
12869
+ return r && (t.version = r), t;
12870
+ }
12871
+ }, {
12872
+ test: [/sleipnir/i],
12873
+ describe: function describe(e) {
12874
+ var t = {
12875
+ name: "Sleipnir"
12876
+ },
12877
+ r = i.default.getFirstMatch(s, e) || i.default.getFirstMatch(/(?:sleipnir)[\s/](\d+(\.?_?\d+)+)/i, e);
12878
+ return r && (t.version = r), t;
12879
+ }
12880
+ }, {
12881
+ test: [/k-meleon/i],
12882
+ describe: function describe(e) {
12883
+ var t = {
12884
+ name: "K-Meleon"
12885
+ },
12886
+ r = i.default.getFirstMatch(s, e) || i.default.getFirstMatch(/(?:k-meleon)[\s/](\d+(\.?_?\d+)+)/i, e);
12887
+ return r && (t.version = r), t;
12888
+ }
12889
+ }, {
12890
+ test: [/micromessenger/i],
12891
+ describe: function describe(e) {
12892
+ var t = {
12893
+ name: "WeChat"
12894
+ },
12895
+ r = i.default.getFirstMatch(/(?:micromessenger)[\s/](\d+(\.?_?\d+)+)/i, e) || i.default.getFirstMatch(s, e);
12896
+ return r && (t.version = r), t;
12897
+ }
12898
+ }, {
12899
+ test: [/qqbrowser/i],
12900
+ describe: function describe(e) {
12901
+ var t = {
12902
+ name: /qqbrowserlite/i.test(e) ? "QQ Browser Lite" : "QQ Browser"
12903
+ },
12904
+ r = i.default.getFirstMatch(/(?:qqbrowserlite|qqbrowser)[/](\d+(\.?_?\d+)+)/i, e) || i.default.getFirstMatch(s, e);
12905
+ return r && (t.version = r), t;
12906
+ }
12907
+ }, {
12908
+ test: [/msie|trident/i],
12909
+ describe: function describe(e) {
12910
+ var t = {
12911
+ name: "Internet Explorer"
12912
+ },
12913
+ r = i.default.getFirstMatch(/(?:msie |rv:)(\d+(\.?_?\d+)+)/i, e);
12914
+ return r && (t.version = r), t;
12915
+ }
12916
+ }, {
12917
+ test: [/\sedg\//i],
12918
+ describe: function describe(e) {
12919
+ var t = {
12920
+ name: "Microsoft Edge"
12921
+ },
12922
+ r = i.default.getFirstMatch(/\sedg\/(\d+(\.?_?\d+)+)/i, e);
12923
+ return r && (t.version = r), t;
12924
+ }
12925
+ }, {
12926
+ test: [/edg([ea]|ios)/i],
12927
+ describe: function describe(e) {
12928
+ var t = {
12929
+ name: "Microsoft Edge"
12930
+ },
12931
+ r = i.default.getSecondMatch(/edg([ea]|ios)\/(\d+(\.?_?\d+)+)/i, e);
12932
+ return r && (t.version = r), t;
12933
+ }
12934
+ }, {
12935
+ test: [/vivaldi/i],
12936
+ describe: function describe(e) {
12937
+ var t = {
12938
+ name: "Vivaldi"
12939
+ },
12940
+ r = i.default.getFirstMatch(/vivaldi\/(\d+(\.?_?\d+)+)/i, e);
12941
+ return r && (t.version = r), t;
12942
+ }
12943
+ }, {
12944
+ test: [/seamonkey/i],
12945
+ describe: function describe(e) {
12946
+ var t = {
12947
+ name: "SeaMonkey"
12948
+ },
12949
+ r = i.default.getFirstMatch(/seamonkey\/(\d+(\.?_?\d+)+)/i, e);
12950
+ return r && (t.version = r), t;
12951
+ }
12952
+ }, {
12953
+ test: [/sailfish/i],
12954
+ describe: function describe(e) {
12955
+ var t = {
12956
+ name: "Sailfish"
12957
+ },
12958
+ r = i.default.getFirstMatch(/sailfish\s?browser\/(\d+(\.\d+)?)/i, e);
12959
+ return r && (t.version = r), t;
12960
+ }
12961
+ }, {
12962
+ test: [/silk/i],
12963
+ describe: function describe(e) {
12964
+ var t = {
12965
+ name: "Amazon Silk"
12966
+ },
12967
+ r = i.default.getFirstMatch(/silk\/(\d+(\.?_?\d+)+)/i, e);
12968
+ return r && (t.version = r), t;
12969
+ }
12970
+ }, {
12971
+ test: [/phantom/i],
12972
+ describe: function describe(e) {
12973
+ var t = {
12974
+ name: "PhantomJS"
12975
+ },
12976
+ r = i.default.getFirstMatch(/phantomjs\/(\d+(\.?_?\d+)+)/i, e);
12977
+ return r && (t.version = r), t;
12978
+ }
12979
+ }, {
12980
+ test: [/slimerjs/i],
12981
+ describe: function describe(e) {
12982
+ var t = {
12983
+ name: "SlimerJS"
12984
+ },
12985
+ r = i.default.getFirstMatch(/slimerjs\/(\d+(\.?_?\d+)+)/i, e);
12986
+ return r && (t.version = r), t;
12987
+ }
12988
+ }, {
12989
+ test: [/blackberry|\bbb\d+/i, /rim\stablet/i],
12990
+ describe: function describe(e) {
12991
+ var t = {
12992
+ name: "BlackBerry"
12993
+ },
12994
+ r = i.default.getFirstMatch(s, e) || i.default.getFirstMatch(/blackberry[\d]+\/(\d+(\.?_?\d+)+)/i, e);
12995
+ return r && (t.version = r), t;
12996
+ }
12997
+ }, {
12998
+ test: [/(web|hpw)[o0]s/i],
12999
+ describe: function describe(e) {
13000
+ var t = {
13001
+ name: "WebOS Browser"
13002
+ },
13003
+ r = i.default.getFirstMatch(s, e) || i.default.getFirstMatch(/w(?:eb)?[o0]sbrowser\/(\d+(\.?_?\d+)+)/i, e);
13004
+ return r && (t.version = r), t;
13005
+ }
13006
+ }, {
13007
+ test: [/bada/i],
13008
+ describe: function describe(e) {
13009
+ var t = {
13010
+ name: "Bada"
13011
+ },
13012
+ r = i.default.getFirstMatch(/dolfin\/(\d+(\.?_?\d+)+)/i, e);
13013
+ return r && (t.version = r), t;
13014
+ }
13015
+ }, {
13016
+ test: [/tizen/i],
13017
+ describe: function describe(e) {
13018
+ var t = {
13019
+ name: "Tizen"
13020
+ },
13021
+ r = i.default.getFirstMatch(/(?:tizen\s?)?browser\/(\d+(\.?_?\d+)+)/i, e) || i.default.getFirstMatch(s, e);
13022
+ return r && (t.version = r), t;
13023
+ }
13024
+ }, {
13025
+ test: [/qupzilla/i],
13026
+ describe: function describe(e) {
13027
+ var t = {
13028
+ name: "QupZilla"
13029
+ },
13030
+ r = i.default.getFirstMatch(/(?:qupzilla)[\s/](\d+(\.?_?\d+)+)/i, e) || i.default.getFirstMatch(s, e);
13031
+ return r && (t.version = r), t;
13032
+ }
13033
+ }, {
13034
+ test: [/firefox|iceweasel|fxios/i],
13035
+ describe: function describe(e) {
13036
+ var t = {
13037
+ name: "Firefox"
13038
+ },
13039
+ r = i.default.getFirstMatch(/(?:firefox|iceweasel|fxios)[\s/](\d+(\.?_?\d+)+)/i, e);
13040
+ return r && (t.version = r), t;
13041
+ }
13042
+ }, {
13043
+ test: [/electron/i],
13044
+ describe: function describe(e) {
13045
+ var t = {
13046
+ name: "Electron"
13047
+ },
13048
+ r = i.default.getFirstMatch(/(?:electron)\/(\d+(\.?_?\d+)+)/i, e);
13049
+ return r && (t.version = r), t;
13050
+ }
13051
+ }, {
13052
+ test: [/MiuiBrowser/i],
13053
+ describe: function describe(e) {
13054
+ var t = {
13055
+ name: "Miui"
13056
+ },
13057
+ r = i.default.getFirstMatch(/(?:MiuiBrowser)[\s/](\d+(\.?_?\d+)+)/i, e);
13058
+ return r && (t.version = r), t;
13059
+ }
13060
+ }, {
13061
+ test: [/chromium/i],
13062
+ describe: function describe(e) {
13063
+ var t = {
13064
+ name: "Chromium"
13065
+ },
13066
+ r = i.default.getFirstMatch(/(?:chromium)[\s/](\d+(\.?_?\d+)+)/i, e) || i.default.getFirstMatch(s, e);
13067
+ return r && (t.version = r), t;
13068
+ }
13069
+ }, {
13070
+ test: [/chrome|crios|crmo/i],
13071
+ describe: function describe(e) {
13072
+ var t = {
13073
+ name: "Chrome"
13074
+ },
13075
+ r = i.default.getFirstMatch(/(?:chrome|crios|crmo)\/(\d+(\.?_?\d+)+)/i, e);
13076
+ return r && (t.version = r), t;
13077
+ }
13078
+ }, {
13079
+ test: [/GSA/i],
13080
+ describe: function describe(e) {
13081
+ var t = {
13082
+ name: "Google Search"
13083
+ },
13084
+ r = i.default.getFirstMatch(/(?:GSA)\/(\d+(\.?_?\d+)+)/i, e);
13085
+ return r && (t.version = r), t;
13086
+ }
13087
+ }, {
13088
+ test: function test(e) {
13089
+ var t = !e.test(/like android/i),
13090
+ r = e.test(/android/i);
13091
+ return t && r;
13092
+ },
13093
+ describe: function describe(e) {
13094
+ var t = {
13095
+ name: "Android Browser"
13096
+ },
13097
+ r = i.default.getFirstMatch(s, e);
13098
+ return r && (t.version = r), t;
13099
+ }
13100
+ }, {
13101
+ test: [/playstation 4/i],
13102
+ describe: function describe(e) {
13103
+ var t = {
13104
+ name: "PlayStation 4"
13105
+ },
13106
+ r = i.default.getFirstMatch(s, e);
13107
+ return r && (t.version = r), t;
13108
+ }
13109
+ }, {
13110
+ test: [/safari|applewebkit/i],
13111
+ describe: function describe(e) {
13112
+ var t = {
13113
+ name: "Safari"
13114
+ },
13115
+ r = i.default.getFirstMatch(s, e);
13116
+ return r && (t.version = r), t;
13117
+ }
13118
+ }, {
13119
+ test: [/.*/i],
13120
+ describe: function describe(e) {
13121
+ var t = -1 !== e.search("\\(") ? /^(.*)\/(.*)[ \t]\((.*)/ : /^(.*)\/(.*) /;
13122
+ return {
13123
+ name: i.default.getFirstMatch(t, e),
13124
+ version: i.default.getSecondMatch(t, e)
13125
+ };
13126
+ }
13127
+ }];
13128
+ t.default = a, e.exports = t.default;
13129
+ },
13130
+ 93: function _(e, t, r) {
13131
+ t.__esModule = !0, t.default = void 0;
13132
+ var n,
13133
+ i = (n = r(17)) && n.__esModule ? n : {
13134
+ default: n
13135
+ },
13136
+ s = r(18);
13137
+ var a = [{
13138
+ test: [/Roku\/DVP/],
13139
+ describe: function describe(e) {
13140
+ var t = i.default.getFirstMatch(/Roku\/DVP-(\d+\.\d+)/i, e);
13141
+ return {
13142
+ name: s.OS_MAP.Roku,
13143
+ version: t
13144
+ };
13145
+ }
13146
+ }, {
13147
+ test: [/windows phone/i],
13148
+ describe: function describe(e) {
13149
+ var t = i.default.getFirstMatch(/windows phone (?:os)?\s?(\d+(\.\d+)*)/i, e);
13150
+ return {
13151
+ name: s.OS_MAP.WindowsPhone,
13152
+ version: t
13153
+ };
13154
+ }
13155
+ }, {
13156
+ test: [/windows /i],
13157
+ describe: function describe(e) {
13158
+ var t = i.default.getFirstMatch(/Windows ((NT|XP)( \d\d?.\d)?)/i, e),
13159
+ r = i.default.getWindowsVersionName(t);
13160
+ return {
13161
+ name: s.OS_MAP.Windows,
13162
+ version: t,
13163
+ versionName: r
13164
+ };
13165
+ }
13166
+ }, {
13167
+ test: [/Macintosh(.*?) FxiOS(.*?)\//],
13168
+ describe: function describe(e) {
13169
+ var t = {
13170
+ name: s.OS_MAP.iOS
13171
+ },
13172
+ r = i.default.getSecondMatch(/(Version\/)(\d[\d.]+)/, e);
13173
+ return r && (t.version = r), t;
13174
+ }
13175
+ }, {
13176
+ test: [/macintosh/i],
13177
+ describe: function describe(e) {
13178
+ var t = i.default.getFirstMatch(/mac os x (\d+(\.?_?\d+)+)/i, e).replace(/[_\s]/g, "."),
13179
+ r = i.default.getMacOSVersionName(t),
13180
+ n = {
13181
+ name: s.OS_MAP.MacOS,
13182
+ version: t
13183
+ };
13184
+ return r && (n.versionName = r), n;
13185
+ }
13186
+ }, {
13187
+ test: [/(ipod|iphone|ipad)/i],
13188
+ describe: function describe(e) {
13189
+ var t = i.default.getFirstMatch(/os (\d+([_\s]\d+)*) like mac os x/i, e).replace(/[_\s]/g, ".");
13190
+ return {
13191
+ name: s.OS_MAP.iOS,
13192
+ version: t
13193
+ };
13194
+ }
13195
+ }, {
13196
+ test: function test(e) {
13197
+ var t = !e.test(/like android/i),
13198
+ r = e.test(/android/i);
13199
+ return t && r;
13200
+ },
13201
+ describe: function describe(e) {
13202
+ var t = i.default.getFirstMatch(/android[\s/-](\d+(\.\d+)*)/i, e),
13203
+ r = i.default.getAndroidVersionName(t),
13204
+ n = {
13205
+ name: s.OS_MAP.Android,
13206
+ version: t
13207
+ };
13208
+ return r && (n.versionName = r), n;
13209
+ }
13210
+ }, {
13211
+ test: [/(web|hpw)[o0]s/i],
13212
+ describe: function describe(e) {
13213
+ var t = i.default.getFirstMatch(/(?:web|hpw)[o0]s\/(\d+(\.\d+)*)/i, e),
13214
+ r = {
13215
+ name: s.OS_MAP.WebOS
13216
+ };
13217
+ return t && t.length && (r.version = t), r;
13218
+ }
13219
+ }, {
13220
+ test: [/blackberry|\bbb\d+/i, /rim\stablet/i],
13221
+ describe: function describe(e) {
13222
+ var t = i.default.getFirstMatch(/rim\stablet\sos\s(\d+(\.\d+)*)/i, e) || i.default.getFirstMatch(/blackberry\d+\/(\d+([_\s]\d+)*)/i, e) || i.default.getFirstMatch(/\bbb(\d+)/i, e);
13223
+ return {
13224
+ name: s.OS_MAP.BlackBerry,
13225
+ version: t
13226
+ };
13227
+ }
13228
+ }, {
13229
+ test: [/bada/i],
13230
+ describe: function describe(e) {
13231
+ var t = i.default.getFirstMatch(/bada\/(\d+(\.\d+)*)/i, e);
13232
+ return {
13233
+ name: s.OS_MAP.Bada,
13234
+ version: t
13235
+ };
13236
+ }
13237
+ }, {
13238
+ test: [/tizen/i],
13239
+ describe: function describe(e) {
13240
+ var t = i.default.getFirstMatch(/tizen[/\s](\d+(\.\d+)*)/i, e);
13241
+ return {
13242
+ name: s.OS_MAP.Tizen,
13243
+ version: t
13244
+ };
13245
+ }
13246
+ }, {
13247
+ test: [/linux/i],
13248
+ describe: function describe() {
13249
+ return {
13250
+ name: s.OS_MAP.Linux
13251
+ };
13252
+ }
13253
+ }, {
13254
+ test: [/CrOS/],
13255
+ describe: function describe() {
13256
+ return {
13257
+ name: s.OS_MAP.ChromeOS
13258
+ };
13259
+ }
13260
+ }, {
13261
+ test: [/PlayStation 4/],
13262
+ describe: function describe(e) {
13263
+ var t = i.default.getFirstMatch(/PlayStation 4[/\s](\d+(\.\d+)*)/i, e);
13264
+ return {
13265
+ name: s.OS_MAP.PlayStation4,
13266
+ version: t
13267
+ };
13268
+ }
13269
+ }];
13270
+ t.default = a, e.exports = t.default;
13271
+ },
13272
+ 94: function _(e, t, r) {
13273
+ t.__esModule = !0, t.default = void 0;
13274
+ var n,
13275
+ i = (n = r(17)) && n.__esModule ? n : {
13276
+ default: n
13277
+ },
13278
+ s = r(18);
13279
+ var a = [{
13280
+ test: [/googlebot/i],
13281
+ describe: function describe() {
13282
+ return {
13283
+ type: "bot",
13284
+ vendor: "Google"
13285
+ };
13286
+ }
13287
+ }, {
13288
+ test: [/huawei/i],
13289
+ describe: function describe(e) {
13290
+ var t = i.default.getFirstMatch(/(can-l01)/i, e) && "Nova",
13291
+ r = {
13292
+ type: s.PLATFORMS_MAP.mobile,
13293
+ vendor: "Huawei"
13294
+ };
13295
+ return t && (r.model = t), r;
13296
+ }
13297
+ }, {
13298
+ test: [/nexus\s*(?:7|8|9|10).*/i],
13299
+ describe: function describe() {
13300
+ return {
13301
+ type: s.PLATFORMS_MAP.tablet,
13302
+ vendor: "Nexus"
13303
+ };
13103
13304
  }
13104
- if (encodingParams.maxPayloadBitsPerSecond) {
13105
- encoding.maxBitrate = encodingParams.maxPayloadBitsPerSecond;
13305
+ }, {
13306
+ test: [/ipad/i],
13307
+ describe: function describe() {
13308
+ return {
13309
+ type: s.PLATFORMS_MAP.tablet,
13310
+ vendor: "Apple",
13311
+ model: "iPad"
13312
+ };
13313
+ }
13314
+ }, {
13315
+ test: [/Macintosh(.*?) FxiOS(.*?)\//],
13316
+ describe: function describe() {
13317
+ return {
13318
+ type: s.PLATFORMS_MAP.tablet,
13319
+ vendor: "Apple",
13320
+ model: "iPad"
13321
+ };
13322
+ }
13323
+ }, {
13324
+ test: [/kftt build/i],
13325
+ describe: function describe() {
13326
+ return {
13327
+ type: s.PLATFORMS_MAP.tablet,
13328
+ vendor: "Amazon",
13329
+ model: "Kindle Fire HD 7"
13330
+ };
13331
+ }
13332
+ }, {
13333
+ test: [/silk/i],
13334
+ describe: function describe() {
13335
+ return {
13336
+ type: s.PLATFORMS_MAP.tablet,
13337
+ vendor: "Amazon"
13338
+ };
13339
+ }
13340
+ }, {
13341
+ test: [/tablet(?! pc)/i],
13342
+ describe: function describe() {
13343
+ return {
13344
+ type: s.PLATFORMS_MAP.tablet
13345
+ };
13346
+ }
13347
+ }, {
13348
+ test: function test(e) {
13349
+ var t = e.test(/ipod|iphone/i),
13350
+ r = e.test(/like (ipod|iphone)/i);
13351
+ return t && !r;
13352
+ },
13353
+ describe: function describe(e) {
13354
+ var t = i.default.getFirstMatch(/(ipod|iphone)/i, e);
13355
+ return {
13356
+ type: s.PLATFORMS_MAP.mobile,
13357
+ vendor: "Apple",
13358
+ model: t
13359
+ };
13360
+ }
13361
+ }, {
13362
+ test: [/nexus\s*[0-6].*/i, /galaxy nexus/i],
13363
+ describe: function describe() {
13364
+ return {
13365
+ type: s.PLATFORMS_MAP.mobile,
13366
+ vendor: "Nexus"
13367
+ };
13368
+ }
13369
+ }, {
13370
+ test: [/[^-]mobi/i],
13371
+ describe: function describe() {
13372
+ return {
13373
+ type: s.PLATFORMS_MAP.mobile
13374
+ };
13375
+ }
13376
+ }, {
13377
+ test: function test(e) {
13378
+ return "blackberry" === e.getBrowserName(!0);
13379
+ },
13380
+ describe: function describe() {
13381
+ return {
13382
+ type: s.PLATFORMS_MAP.mobile,
13383
+ vendor: "BlackBerry"
13384
+ };
13385
+ }
13386
+ }, {
13387
+ test: function test(e) {
13388
+ return "bada" === e.getBrowserName(!0);
13389
+ },
13390
+ describe: function describe() {
13391
+ return {
13392
+ type: s.PLATFORMS_MAP.mobile
13393
+ };
13394
+ }
13395
+ }, {
13396
+ test: function test(e) {
13397
+ return "windows phone" === e.getBrowserName();
13398
+ },
13399
+ describe: function describe() {
13400
+ return {
13401
+ type: s.PLATFORMS_MAP.mobile,
13402
+ vendor: "Microsoft"
13403
+ };
13404
+ }
13405
+ }, {
13406
+ test: function test(e) {
13407
+ var t = Number(String(e.getOSVersion()).split(".")[0]);
13408
+ return "android" === e.getOSName(!0) && t >= 3;
13409
+ },
13410
+ describe: function describe() {
13411
+ return {
13412
+ type: s.PLATFORMS_MAP.tablet
13413
+ };
13414
+ }
13415
+ }, {
13416
+ test: function test(e) {
13417
+ return "android" === e.getOSName(!0);
13418
+ },
13419
+ describe: function describe() {
13420
+ return {
13421
+ type: s.PLATFORMS_MAP.mobile
13422
+ };
13423
+ }
13424
+ }, {
13425
+ test: function test(e) {
13426
+ return "macos" === e.getOSName(!0);
13427
+ },
13428
+ describe: function describe() {
13429
+ return {
13430
+ type: s.PLATFORMS_MAP.desktop,
13431
+ vendor: "Apple"
13432
+ };
13433
+ }
13434
+ }, {
13435
+ test: function test(e) {
13436
+ return "windows" === e.getOSName(!0);
13437
+ },
13438
+ describe: function describe() {
13439
+ return {
13440
+ type: s.PLATFORMS_MAP.desktop
13441
+ };
13442
+ }
13443
+ }, {
13444
+ test: function test(e) {
13445
+ return "linux" === e.getOSName(!0);
13446
+ },
13447
+ describe: function describe() {
13448
+ return {
13449
+ type: s.PLATFORMS_MAP.desktop
13450
+ };
13451
+ }
13452
+ }, {
13453
+ test: function test(e) {
13454
+ return "playstation 4" === e.getOSName(!0);
13455
+ },
13456
+ describe: function describe() {
13457
+ return {
13458
+ type: s.PLATFORMS_MAP.tv
13459
+ };
13460
+ }
13461
+ }, {
13462
+ test: function test(e) {
13463
+ return "roku" === e.getOSName(!0);
13464
+ },
13465
+ describe: function describe() {
13466
+ return {
13467
+ type: s.PLATFORMS_MAP.tv
13468
+ };
13469
+ }
13470
+ }];
13471
+ t.default = a, e.exports = t.default;
13472
+ },
13473
+ 95: function _(e, t, r) {
13474
+ t.__esModule = !0, t.default = void 0;
13475
+ var n,
13476
+ i = (n = r(17)) && n.__esModule ? n : {
13477
+ default: n
13478
+ },
13479
+ s = r(18);
13480
+ var a = [{
13481
+ test: function test(e) {
13482
+ return "microsoft edge" === e.getBrowserName(!0);
13483
+ },
13484
+ describe: function describe(e) {
13485
+ if (/\sedg\//i.test(e)) return {
13486
+ name: s.ENGINE_MAP.Blink
13487
+ };
13488
+ var t = i.default.getFirstMatch(/edge\/(\d+(\.?_?\d+)+)/i, e);
13489
+ return {
13490
+ name: s.ENGINE_MAP.EdgeHTML,
13491
+ version: t
13492
+ };
13106
13493
  }
13107
- }
13108
- });
13109
- yield this.sender.setParameters(sendParameters);
13110
- });
13111
- }
13112
- getScaleDownRatio(expectedMaxFs) {
13113
- var _a;
13114
- if (!expectedMaxFs) {
13115
- return -1;
13116
- }
13117
- if (!this.publishedTrack) {
13118
- return -1;
13119
- }
13120
- var setting = (_a = this.publishedTrack) === null || _a === void 0 ? void 0 : _a.underlyingTrack.getSettings();
13121
- var sourceHeight = setting === null || setting === void 0 ? void 0 : setting.height;
13122
- var sourceWidth = setting === null || setting === void 0 ? void 0 : setting.width;
13123
- if (!sourceWidth || !sourceHeight) {
13124
- return -1;
13125
- }
13126
- return getScaleDownRatio([sourceWidth, sourceHeight], sourceHeight, expectedMaxFs);
13127
- }
13128
- publishTrack(track) {
13129
- return this.replacePublishedTrack(track);
13130
- }
13131
- unpublishTrack() {
13132
- return this.replacePublishedTrack();
13133
- }
13134
- setActive(enabled) {
13135
- var direction = enabled ? 'sendrecv' : 'inactive';
13136
- this._rtcRtpTransceiver.direction = direction;
13137
- return this._rtcRtpTransceiver.direction !== this._rtcRtpTransceiver.currentDirection;
13138
- }
13139
- getIngressPayloadType(mimeType) {
13140
- var senderCodecs = this.sender.getParameters().codecs.filter(codec => codec.mimeType === mimeType);
13141
- var receiverCodecs = this.receiver.getParameters().codecs.filter(codec => codec.mimeType === mimeType);
13142
- if (!senderCodecs || !receiverCodecs || senderCodecs.length === 0 || receiverCodecs.length === 0) {
13143
- throw new Error("sender codecs or receiver codecs is undefined or empty");
13144
- }
13145
- var senderCodec = senderCodecs[0];
13146
- var targetCodec = receiverCodecs.find(receiverCodec => {
13147
- return areCodecsCompatible(senderCodec, receiverCodec);
13148
- });
13149
- if (!targetCodec || !targetCodec.payloadType) {
13150
- throw new Error("ingress payload type is not well defined in receiver codecs");
13151
- }
13152
- return targetCodec.payloadType;
13153
- }
13154
- }
13155
- var simulcastMaxFrameSizes = {
13156
- 0: '240',
13157
- 1: '2304',
13158
- 2: '8160'
13159
- };
13160
- class RidIngressStreamSignaler {
13161
- constructor(mid) {
13162
- this.mid = mid;
13163
- }
13164
- getReceiverId() {
13165
- return {
13166
- mid: this.mid,
13167
- rid: '1'
13168
- };
13169
- }
13170
- signalLocalStreams(mLine) {}
13171
- signalRemoteStreams(mLine) {}
13172
- }
13173
- class RidEgressStreamSignaler {
13174
- constructor(mid) {
13175
- this.streamIds = [];
13176
- this.mid = mid;
13177
- }
13178
- signalStreams(simulcastEnabled, _rtxEnabled, mLine) {
13179
- mLine.ssrcGroups = [];
13180
- if (this.streamIds.length === 0) {
13181
- if (simulcastEnabled) {
13182
- this.streamIds = [{
13183
- mid: this.mid,
13184
- rid: 'low'
13185
13494
  }, {
13186
- mid: this.mid,
13187
- rid: 'medium'
13495
+ test: [/trident/i],
13496
+ describe: function describe(e) {
13497
+ var t = {
13498
+ name: s.ENGINE_MAP.Trident
13499
+ },
13500
+ r = i.default.getFirstMatch(/trident\/(\d+(\.?_?\d+)+)/i, e);
13501
+ return r && (t.version = r), t;
13502
+ }
13188
13503
  }, {
13189
- mid: this.mid,
13190
- rid: 'high'
13191
- }];
13192
- } else {
13193
- this.streamIds = [{
13194
- mid: this.mid
13504
+ test: function test(e) {
13505
+ return e.test(/presto/i);
13506
+ },
13507
+ describe: function describe(e) {
13508
+ var t = {
13509
+ name: s.ENGINE_MAP.Presto
13510
+ },
13511
+ r = i.default.getFirstMatch(/presto\/(\d+(\.?_?\d+)+)/i, e);
13512
+ return r && (t.version = r), t;
13513
+ }
13514
+ }, {
13515
+ test: function test(e) {
13516
+ var t = e.test(/gecko/i),
13517
+ r = e.test(/like gecko/i);
13518
+ return t && !r;
13519
+ },
13520
+ describe: function describe(e) {
13521
+ var t = {
13522
+ name: s.ENGINE_MAP.Gecko
13523
+ },
13524
+ r = i.default.getFirstMatch(/gecko\/(\d+(\.?_?\d+)+)/i, e);
13525
+ return r && (t.version = r), t;
13526
+ }
13527
+ }, {
13528
+ test: [/(apple)?webkit\/537\.36/i],
13529
+ describe: function describe() {
13530
+ return {
13531
+ name: s.ENGINE_MAP.Blink
13532
+ };
13533
+ }
13534
+ }, {
13535
+ test: [/(apple)?webkit/i],
13536
+ describe: function describe(e) {
13537
+ var t = {
13538
+ name: s.ENGINE_MAP.WebKit
13539
+ },
13540
+ r = i.default.getFirstMatch(/webkit\/(\d+(\.?_?\d+)+)/i, e);
13541
+ return r && (t.version = r), t;
13542
+ }
13195
13543
  }];
13196
- }
13197
- }
13198
- if (simulcastEnabled) {
13199
- mLine.rids = this.streamIds.map((streamId, index) => new RidLine(streamId.rid, 'send', "max-fs=".concat(simulcastMaxFrameSizes[index])));
13200
- mLine.simulcast = new SimulcastLine(SimulcastLayerList.fromString('low;medium;high'), new SimulcastLayerList());
13201
- }
13202
- }
13203
- getSenderIds() {
13204
- return this.streamIds;
13205
- }
13206
- getEncodingIndexForStreamId(streamId) {
13207
- return this.streamIds.findIndex(currStreamId => compareStreamIds(currStreamId, streamId));
13208
- }
13209
- }
13210
- function generateSsrc() {
13211
- return Math.floor(Math.random() * 0xffffffff);
13212
- }
13213
- class SsrcIngressStreamSignaler {
13214
- constructor() {
13215
- this.ssrc = generateSsrc();
13216
- }
13217
- getReceiverId() {
13218
- return Object.assign({
13219
- ssrc: this.ssrc
13220
- }, this.rtxSsrc ? {
13221
- rtxSsrc: this.rtxSsrc
13222
- } : {});
13223
- }
13224
- signalLocalStreams(_mLine) {}
13225
- signalRemoteStreams(mLine) {
13226
- mLine.addLine(new SsrcLine(this.ssrc, 'cname', "".concat(this.ssrc, "-cname")));
13227
- mLine.addLine(new SsrcLine(this.ssrc, 'msid', '-', '1'));
13228
- if (hasCodec('rtx', mLine)) {
13229
- this.rtxSsrc = generateSsrc();
13230
- mLine.addLine(new SsrcLine(this.rtxSsrc, 'cname', "".concat(this.ssrc, "-cname")));
13231
- mLine.addLine(new SsrcLine(this.rtxSsrc, 'msid', '-', '1'));
13232
- mLine.addLine(new SsrcGroupLine('FID', [this.ssrc, this.rtxSsrc]));
13233
- }
13234
- }
13235
- }
13236
- class SsrcEgressStreamSignaler {
13237
- constructor() {
13238
- this.streamIds = [];
13239
- }
13240
- signalStreams(simulcastEnabled, rtxEnabled, mLine) {
13241
- mLine.rids = [];
13242
- mLine.simulcast = undefined;
13243
- mLine.ssrcs = [];
13244
- mLine.ssrcGroups = [];
13245
- if (this.streamIds.length === 0) {
13246
- var numStreams = simulcastEnabled ? 3 : 1;
13247
- [...Array(numStreams).keys()].forEach(() => {
13248
- var newStreamId = {
13249
- ssrc: generateSsrc()
13250
- };
13251
- if (rtxEnabled) {
13252
- newStreamId.rtxSsrc = generateSsrc();
13253
- }
13254
- this.streamIds.push(newStreamId);
13255
- });
13256
- }
13257
- this.streamIds.forEach((streamId, index) => {
13258
- var rtpSsrc = streamId.ssrc;
13259
- mLine.addLine(new SsrcLine(rtpSsrc, 'cname', "".concat(rtpSsrc, "-cname")));
13260
- mLine.addLine(new SsrcLine(rtpSsrc, 'msid', '-', '1'));
13261
- if (simulcastEnabled) {
13262
- mLine.addLine(new SsrcLine(rtpSsrc, 'fmtp', "* max-fs=".concat(simulcastMaxFrameSizes[index])));
13263
- }
13264
- if (rtxEnabled) {
13265
- var rtxSsrc = streamId.rtxSsrc;
13266
- mLine.addLine(new SsrcLine(rtxSsrc, 'cname', "".concat(rtpSsrc, "-cname")));
13267
- mLine.addLine(new SsrcLine(rtxSsrc, 'msid', '-', '1'));
13268
- mLine.addLine(new SsrcGroupLine('FID', [rtpSsrc, rtxSsrc]));
13544
+ t.default = a, e.exports = t.default;
13269
13545
  }
13270
13546
  });
13271
- if (simulcastEnabled) {
13272
- mLine.addLine(new SsrcGroupLine('SIM', this.streamIds.map(streamId => streamId.ssrc)));
13273
- }
13274
- }
13275
- getSenderIds() {
13276
- return this.streamIds;
13277
- }
13278
- getEncodingIndexForStreamId(streamId) {
13279
- return this.streamIds.findIndex(currStreamId => compareStreamIds(currStreamId, streamId));
13280
- }
13281
- }
13282
- class StreamSignalerManager {
13283
- constructor(streamSignalingMode) {
13284
- this.egressStreamSignalersByMid = new Map();
13285
- this.ingressStreamsSignalersByMid = new Map();
13286
- this.ingressStreamSignalingMode = streamSignalingMode;
13287
- this.egressStreamSignalingMode = streamSignalingMode;
13288
- }
13289
- getOrCreateEgressStreamSignaler(mid) {
13290
- var existing = this.getEgressStreamSignaler(mid);
13291
- if (existing) {
13292
- return existing;
13293
- }
13294
- var newSignaler;
13295
- if (this.egressStreamSignalingMode === 'MID-RID') {
13296
- newSignaler = new RidEgressStreamSignaler(mid);
13297
- } else {
13298
- newSignaler = new SsrcEgressStreamSignaler();
13299
- }
13300
- this.egressStreamSignalersByMid.set(mid, newSignaler);
13301
- return newSignaler;
13302
- }
13303
- getEgressStreamSignalerOrThrow(mid) {
13304
- var existing = this.getEgressStreamSignaler(mid);
13305
- if (!existing) {
13306
- throw new Error("Couldn't find EgressStreamSignaler for mid ".concat(mid));
13307
- }
13308
- return existing;
13309
- }
13310
- getEgressStreamSignaler(mid) {
13311
- return this.egressStreamSignalersByMid.get(mid);
13312
- }
13313
- getOrCreateIngressStreamSignaler(mid) {
13314
- var existing = this.getIngressStreamSignaler(mid);
13315
- if (existing) {
13316
- return existing;
13317
- }
13318
- var newSignaler;
13319
- if (this.ingressStreamSignalingMode === 'MID-RID') {
13320
- newSignaler = new RidIngressStreamSignaler(mid);
13321
- } else {
13322
- newSignaler = new SsrcIngressStreamSignaler();
13323
- }
13324
- this.ingressStreamsSignalersByMid.set(mid, newSignaler);
13325
- return newSignaler;
13326
- }
13327
- getIngressStreamSignaler(mid) {
13328
- return this.ingressStreamsSignalersByMid.get(mid);
13329
- }
13330
- getIngressStreamSignalerOrThrow(mid) {
13331
- var existing = this.getIngressStreamSignaler(mid);
13332
- if (!existing) {
13333
- throw new Error("Couldn't find IngressStreamSignaler for mid ".concat(mid));
13334
- }
13335
- return existing;
13336
- }
13547
+ });
13548
+ })(es5);
13549
+ var Bowser = /*@__PURE__*/getDefaultExportFromCjs(es5.exports);
13550
+ function getBrowserDetails() {
13551
+ var browser = Bowser.getParser(window.navigator.userAgent);
13552
+ return browser.getBrowser();
13337
13553
  }
13338
13554
  var logger$1 = {
13339
13555
  exports: {}
@@ -13626,7 +13842,7 @@ var MultistreamConnectionEventNames;
13626
13842
  var defaultMultistreamConnectionOptions = {
13627
13843
  floorControlledPresentation: false,
13628
13844
  disableSimulcast: false,
13629
- streamSignalingMode: 'MID-RID',
13845
+ streamSignalingMode: 'SSRC',
13630
13846
  bundlePolicy: 'compat'
13631
13847
  };
13632
13848
  class MultistreamConnection extends EventEmitter {
@@ -13638,43 +13854,49 @@ class MultistreamConnection extends EventEmitter {
13638
13854
  this.jmpSessions = new Map();
13639
13855
  this.pendingJmpTasks = [];
13640
13856
  this.metricsCallback = () => {};
13857
+ this.overuseUpdateCallback = () => {};
13641
13858
  this.options = Object.assign(Object.assign({}, defaultMultistreamConnectionOptions), userOptions);
13642
13859
  logger$4.info("Creating multistream connection with options ".concat(JSON.stringify(this.options)));
13643
- this.pc = new PeerConnection();
13644
- this.pc.on(PeerConnection.Events.ConnectionStateChange, state => this.emit(MultistreamConnectionEventNames.ConnectionStateUpdate, state));
13860
+ this.initializePeerConnection();
13645
13861
  this.streamSignalerManager = new StreamSignalerManager(this.options.streamSignalingMode);
13646
- this.attachMetricsObserver();
13862
+ this.overuseStateManager = new OveruseStateManager(overuseState => this.overuseUpdateCallback(overuseState));
13863
+ this.overuseStateManager.start();
13864
+ this.statsManager = new StatsManager(() => this.pc.getStats(), stats => this.preProcessStats(stats));
13647
13865
  var mainSceneId = generateSceneId();
13648
- var videoMainEncodingOptions = !this.options.disableSimulcast ? [{
13649
- scaleResolutionDownBy: 4,
13650
- active: true
13651
- }, {
13652
- scaleResolutionDownBy: 2,
13653
- active: true
13654
- }, {
13655
- active: true
13656
- }] : [];
13866
+ var videoMainEncodingOptions = this.getVideoEncodingOptions();
13657
13867
  this.createSendTransceiver(MediaType$1.VideoMain, mainSceneId, videoMainEncodingOptions);
13658
13868
  this.createSendTransceiver(MediaType$1.AudioMain, mainSceneId);
13659
13869
  if (this.options.floorControlledPresentation) {
13660
- var videoPresentationEncodingOptions = !this.options.disableSimulcast ? [{
13661
- scaleResolutionDownBy: 4,
13662
- active: true
13663
- }, {
13664
- scaleResolutionDownBy: 2,
13665
- active: true
13666
- }, {
13667
- active: true
13668
- }] : [];
13870
+ var videoPresentationEncodingOptions = this.getVideoEncodingOptions();
13669
13871
  var contentSceneId = generateSceneId();
13670
13872
  this.createSendTransceiver(MediaType$1.VideoSlides, contentSceneId, videoPresentationEncodingOptions);
13671
13873
  this.createSendTransceiver(MediaType$1.AudioSlides, contentSceneId);
13672
13874
  }
13875
+ }
13876
+ initializePeerConnection() {
13877
+ var _a;
13878
+ (_a = this.pc) === null || _a === void 0 ? void 0 : _a.close();
13879
+ this.pc = new PeerConnection();
13880
+ this.pc.on(PeerConnection.Events.ConnectionStateChange, state => this.emit(MultistreamConnectionEventNames.ConnectionStateUpdate, state));
13881
+ this.attachMetricsObserver();
13673
13882
  this.createDataChannel();
13674
13883
  }
13675
13884
  getConnectionState() {
13676
13885
  return this.pc.getConnectionState();
13677
13886
  }
13887
+ getVideoEncodingOptions() {
13888
+ return !this.options.disableSimulcast ? [{
13889
+ scaleResolutionDownBy: 4,
13890
+ active: false
13891
+ }, {
13892
+ scaleResolutionDownBy: 2,
13893
+ active: false
13894
+ }, {
13895
+ active: false
13896
+ }] : [{
13897
+ active: false
13898
+ }];
13899
+ }
13678
13900
  createSendTransceiver(mediaType, sceneId, sendEncodingsOptions) {
13679
13901
  var rtcTransceiver = this.pc.addTransceiver(toMediaStreamTrackKind(mediaType), {
13680
13902
  direction: 'sendrecv',
@@ -13682,6 +13904,9 @@ class MultistreamConnection extends EventEmitter {
13682
13904
  });
13683
13905
  var csi = generateCsi(getMediaFamily(mediaType), sceneId);
13684
13906
  this.sendTransceivers.set(mediaType, new SendOnlyTransceiver(rtcTransceiver, csi));
13907
+ this.createJmpSession(mediaType);
13908
+ }
13909
+ createJmpSession(mediaType) {
13685
13910
  var jmpSession = new JmpSession(getMediaFamily(mediaType), getMediaContent(mediaType));
13686
13911
  jmpSession.setTxCallback(msg => {
13687
13912
  var _a;
@@ -13800,14 +14025,16 @@ class MultistreamConnection extends EventEmitter {
13800
14025
  maxPayloadBitsPerSecond
13801
14026
  });
13802
14027
  } else {
13803
- logger$4.warn("Unable to get encoding index for stream ID: ".concat(JSON.stringify(id)));
14028
+ logger$4.warn("".concat(mediaType, ": Unable to get encoding index for stream ID: ").concat(JSON.stringify(id)));
13804
14029
  }
13805
14030
  } else {
13806
- logger$4.warn("Unable to find matching stream ID for requested ID: ".concat(JSON.stringify(id)));
14031
+ logger$4.warn("".concat(mediaType, ": Unable to find matching stream ID for requested ID: ").concat(JSON.stringify(id)));
13807
14032
  }
13808
14033
  });
13809
14034
  sendTransceiver.setTrackRequested(requestedIdEncodingParamsMap.size > 0);
13810
- sendTransceiver.updateSimulcastStreamStates(requestedIdEncodingParamsMap);
14035
+ if (getMediaFamily(mediaType) === MediaFamily$1.Video) {
14036
+ sendTransceiver.updateSimulcastStreamStates(requestedIdEncodingParamsMap);
14037
+ }
13811
14038
  }
13812
14039
  createDataChannel() {
13813
14040
  var dataChannel = this.pc.createDataChannel('datachannel', {});
@@ -14049,8 +14276,8 @@ class MultistreamConnection extends EventEmitter {
14049
14276
  egressSignaler.signalStreams(simulcastEnabled, rtxEnabled, av);
14050
14277
  if (av.type === 'video') {
14051
14278
  [...av.codecs.values()].filter(ci => ci.name === 'H264').forEach(ci => {
14052
- ci.fmtParams.push("max-mbps=".concat(defaultGlobalMaxVideoMbps));
14053
- ci.fmtParams.push("max-fs=".concat(defaultGlobalMaxVideoFrameSize));
14279
+ ci.fmtParams.push("max-mbps=".concat(defaultMaxVideoEncodeMbps));
14280
+ ci.fmtParams.push("max-fs=".concat(defaultMaxVideoEncodeFrameSize));
14054
14281
  });
14055
14282
  }
14056
14283
  });
@@ -14072,6 +14299,14 @@ class MultistreamConnection extends EventEmitter {
14072
14299
  });
14073
14300
  injectJmpAttributes(parsed, csiMap, this.options.streamSignalingMode);
14074
14301
  filterRecvOnlyMlines(parsed);
14302
+ parsed.avMedia.filter(av => av.direction === 'sendrecv' && av.type === 'video').forEach(av => {
14303
+ var ssrcGroup = av.ssrcGroups.find(sg => sg.semantics === 'SIM');
14304
+ if (ssrcGroup) {
14305
+ ssrcGroup.ssrcs.forEach((ssrc, index) => {
14306
+ av.addLine(new SsrcLine(ssrc, 'fmtp', "* max-fs=".concat(simulcastMaxFrameSizes[index])));
14307
+ });
14308
+ }
14309
+ });
14075
14310
  return parsed.toString();
14076
14311
  }
14077
14312
  preProcessRemoteAnswer(answer) {
@@ -14114,13 +14349,24 @@ class MultistreamConnection extends EventEmitter {
14114
14349
  this.pendingJmpTasks.push(task);
14115
14350
  }
14116
14351
  }
14117
- renewPeerConnection() {
14118
- var _a;
14119
- (_a = this.pc) === null || _a === void 0 ? void 0 : _a.close();
14120
- this.pc = new PeerConnection();
14121
- this.attachMetricsObserver();
14122
- this.createDataChannel();
14123
- this.sendTransceivers.forEach((transceiver, mediaType) => transceiver.replaceTransceiver(this.pc.addTransceiver(toMediaStreamTrackKind(mediaType))));
14352
+ renewPeerConnection(userOptions) {
14353
+ if (userOptions) {
14354
+ this.options = Object.assign(Object.assign({}, defaultMultistreamConnectionOptions), userOptions);
14355
+ }
14356
+ logger$4.info("Renewing multistream connection with options ".concat(JSON.stringify(this.options)));
14357
+ this.initializePeerConnection();
14358
+ this.streamSignalerManager = new StreamSignalerManager(this.options.streamSignalingMode);
14359
+ var mainSceneId = generateSceneId();
14360
+ this.sendTransceivers.forEach((transceiver, mediaType) => {
14361
+ var _a;
14362
+ transceiver.replaceTransceiver(this.pc.addTransceiver(toMediaStreamTrackKind(mediaType), {
14363
+ direction: 'sendrecv',
14364
+ sendEncodings: getMediaFamily(mediaType) === MediaFamily$1.Video ? this.getVideoEncodingOptions() : undefined
14365
+ }));
14366
+ transceiver.csi = generateCsi(getMediaFamily(mediaType), mainSceneId);
14367
+ (_a = this.jmpSessions.get(mediaType)) === null || _a === void 0 ? void 0 : _a.close();
14368
+ this.createJmpSession(mediaType);
14369
+ });
14124
14370
  this.recvTransceivers.forEach((transceivers, mediaType) => {
14125
14371
  transceivers.forEach(t => {
14126
14372
  t.replaceTransceiver(this.pc.addTransceiver(toMediaStreamTrackKind(mediaType), {
@@ -14135,17 +14381,25 @@ class MultistreamConnection extends EventEmitter {
14135
14381
  return Object.keys(receiveSlotId).length === Object.keys(id).length && Object.keys(receiveSlotId).every(key => Object.prototype.hasOwnProperty.call(id, key) && receiveSlotId[key] === id[key]);
14136
14382
  });
14137
14383
  }
14384
+ getStats() {
14385
+ return this.statsManager.getStats();
14386
+ }
14138
14387
  preProcessStats(stats) {
14139
14388
  return __awaiter(this, void 0, void 0, function* () {
14140
14389
  yield Promise.all([...this.sendTransceivers.entries()].map(_ref5 => {
14141
14390
  var [mediaType, transceiver] = _ref5;
14142
14391
  return __awaiter(this, void 0, void 0, function* () {
14143
- (yield transceiver.getSenderStats()).forEach(senderStats => {
14392
+ (yield transceiver.getStats()).forEach(senderStats => {
14393
+ var _a;
14144
14394
  if (senderStats.type === 'outbound-rtp') {
14145
14395
  var statsToModify = stats[senderStats.id];
14146
14396
  statsToModify.mid = transceiver.mid;
14147
14397
  statsToModify.csi = transceiver.csi;
14148
14398
  statsToModify.mediaType = mediaType;
14399
+ var trackSettings = (_a = transceiver.publishedTrack) === null || _a === void 0 ? void 0 : _a.underlyingTrack.getSettings();
14400
+ if (trackSettings === null || trackSettings === void 0 ? void 0 : trackSettings.frameRate) {
14401
+ statsToModify.targetFrameRate = trackSettings === null || trackSettings === void 0 ? void 0 : trackSettings.frameRate;
14402
+ }
14149
14403
  }
14150
14404
  });
14151
14405
  });
@@ -14154,7 +14408,7 @@ class MultistreamConnection extends EventEmitter {
14154
14408
  var [mediaType, transceivers] = _ref6;
14155
14409
  return __awaiter(this, void 0, void 0, function* () {
14156
14410
  yield Promise.all(transceivers.map(transceiver => __awaiter(this, void 0, void 0, function* () {
14157
- (yield transceiver.getReceiverStats()).forEach(receiverStats => {
14411
+ (yield transceiver.getStats()).forEach(receiverStats => {
14158
14412
  var _a;
14159
14413
  if (receiverStats.type === 'inbound-rtp') {
14160
14414
  var statsToModify = stats[receiverStats.id];
@@ -14178,6 +14432,9 @@ class MultistreamConnection extends EventEmitter {
14178
14432
  setMetricsCallback(callback) {
14179
14433
  this.metricsCallback = callback;
14180
14434
  }
14435
+ setOveruseUpdateCallback(callback) {
14436
+ this.overuseUpdateCallback = callback;
14437
+ }
14181
14438
  getCsiByMediaType(mediaType) {
14182
14439
  var _a;
14183
14440
  return (_a = this.sendTransceivers.get(mediaType)) === null || _a === void 0 ? void 0 : _a.csi;
@@ -23211,6 +23468,9 @@ class MultistreamRoapMediaConnection extends EventEmitter$4 {
23211
23468
  this.log('getConnectionState()', "called, returning ".concat(connectionState));
23212
23469
  return connectionState;
23213
23470
  }
23471
+ getStats() {
23472
+ return this.multistreamConnection.getStats();
23473
+ }
23214
23474
  roapMessageReceived(roapMessage) {
23215
23475
  this.log('roapMessageReceived()', "called with messageType=".concat(roapMessage.messageType, ", seq=").concat(roapMessage.seq));
23216
23476
  if (!this.sdpNegotiationStarted && roapMessage.messageType === 'OFFER') {