@webex/internal-media-core 0.0.16-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();
@@ -4857,7 +4925,12 @@ class LocalTrack extends EventEmitter$2 {
4857
4925
  * Cleanup local microphone track.
4858
4926
  */
4859
4927
  disposeEffects() {
4860
- 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
+ }
4861
4934
  }
4862
4935
  }
4863
4936
  LocalTrack.Events = LocalTrackEvents;
@@ -8265,6 +8338,17 @@ class PeerConnection extends EventEmitter$2 {
8265
8338
  getTransceivers() {
8266
8339
  return this.pc.getTransceivers();
8267
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
+ }
8268
8352
  /**
8269
8353
  * Returns a string that describes the connections' ICE gathering state.
8270
8354
  *
@@ -8850,7 +8934,11 @@ class JmpSession extends EventEmitter$4 {
8850
8934
  }
8851
8935
  updateSourceIndication(numTotalSources, numLiveSources, sources) {
8852
8936
  var _a;
8853
- 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);
8854
8942
  var jmpMsg = new JmpMsg(this.mediaFamily, this.mediaContent, {
8855
8943
  msgType: JmpMsgType$1.SourceIndication,
8856
8944
  payload: sourceIndicationMsg
@@ -8995,94 +9083,12 @@ class JmpSession extends EventEmitter$4 {
8995
9083
  (_a = this.txCallback) === null || _a === void 0 ? void 0 : _a.call(this, JSON.stringify(homerMsg));
8996
9084
  }
8997
9085
  }
8998
- var MediaCodecMimeType;
8999
- (function (MediaCodecMimeType) {
9000
- MediaCodecMimeType["H264"] = "video/H264";
9001
- MediaCodecMimeType["AV1"] = "video/AV1";
9002
- MediaCodecMimeType["OPUS"] = "audio/opus";
9003
- })(MediaCodecMimeType || (MediaCodecMimeType = {}));
9004
- var defaultGlobalMaxVideoFrameSize = 8160;
9005
- var defaultGlobalMaxVideoMbps = 244800;
9006
- var defaultMaxFrameSize = 3600;
9007
- var maxFrameSizeToMaxBitrateMap = new Map([[60, 99000], [240, 199000], [576, 300000], [920, 640000], [1296, 720000], [2304, 880000], [3600, 2500000], [8160, 4000000]]);
9008
- function parseFmtpParams(fmtpParams) {
9009
- fmtpParams = fmtpParams.replace(/^a=fmtp:\d+\x20/, '');
9010
- var fmtpObj = {};
9011
- fmtpParams.split(';').forEach(param => {
9012
- var paramArr = param && param.split('=');
9013
- if (paramArr.length !== 2 || !paramArr[0] || !paramArr[1]) {
9014
- throw new Error("Fmtp params is invalid with ".concat(fmtpParams));
9015
- }
9016
- fmtpObj[paramArr[0]] = paramArr[1];
9017
- });
9018
- return fmtpObj;
9019
- }
9020
- function areProfileLevelIdsCompatible(senderProfileLevelId, receiverProfileLevelId, levelAsymmetryAllowed) {
9021
- var senderProfile = Number.parseInt("0x".concat(senderProfileLevelId), 16);
9022
- var recvProfile = Number.parseInt("0x".concat(receiverProfileLevelId), 16);
9023
- var senderProfileIdc = senderProfile >> 16;
9024
- var recvProfileIdc = recvProfile >> 16;
9025
- var senderProfileIop = (senderProfile & 0x00ff00) >> 8;
9026
- var recvProfileIop = (recvProfile & 0x00ff00) >> 8;
9027
- var senderLevelIdc = senderProfile & 0x0000ff;
9028
- var recvLevelIdc = recvProfile & 0x0000ff;
9029
- var areProfileCompatible = senderProfileIdc === recvProfileIdc && senderProfileIop === recvProfileIop || senderProfileIdc === 0x42 && recvProfileIdc === 0x42 && (senderProfileIop & 0x40) === (recvProfileIop & 0x40);
9030
- var isLevelIdcCompatible = levelAsymmetryAllowed ? true : senderLevelIdc <= recvLevelIdc;
9031
- return areProfileCompatible && isLevelIdcCompatible;
9032
- }
9033
- function areCodecsCompatible(senderCodec, receiverCodec) {
9034
- return Object.keys(receiverCodec).every(key => {
9035
- if (!senderCodec[key] || !receiverCodec[key]) {
9036
- return false;
9037
- }
9038
- if (key === 'payloadType') {
9039
- return true;
9040
- }
9041
- if (key === 'sdpFmtpLine') {
9042
- var fmtpForSender = parseFmtpParams(senderCodec[key]);
9043
- var fmtpForReceiver = parseFmtpParams(receiverCodec[key]);
9044
- var levelAsymmetryAllowed = Object.keys(fmtpForSender).some(senderFmtpParamKey => {
9045
- return senderFmtpParamKey === 'level-asymmetry-allowed' && fmtpForReceiver[senderFmtpParamKey] === '1' && fmtpForSender[senderFmtpParamKey] === '1';
9046
- });
9047
- return Object.keys(fmtpForSender).every(senderFmtpParamKey => {
9048
- if (fmtpForReceiver[senderFmtpParamKey]) {
9049
- if (senderFmtpParamKey === 'profile-level-id') {
9050
- return areProfileLevelIdsCompatible(fmtpForSender[senderFmtpParamKey], fmtpForReceiver[senderFmtpParamKey], levelAsymmetryAllowed);
9051
- }
9052
- }
9053
- if (senderFmtpParamKey === 'packetization-mode') {
9054
- return fmtpForSender[senderFmtpParamKey] === fmtpForReceiver[senderFmtpParamKey];
9055
- }
9056
- return true;
9057
- });
9058
- }
9059
- return senderCodec[key] === receiverCodec[key];
9060
- });
9061
- }
9062
- function gcd(a, b) {
9063
- return b === 0 ? a : gcd(b, a % b);
9064
- }
9065
- function getFrameHeightByMaxFs(sourceAspectRatio, requestedMaxFs) {
9066
- var _gcd = gcd(sourceAspectRatio[0], sourceAspectRatio[1]);
9067
- var minNumberRatiosForWidth = sourceAspectRatio[0] / _gcd;
9068
- var minNumberRatiosForHeight = sourceAspectRatio[1] / _gcd;
9069
- return Math.floor(Math.sqrt(requestedMaxFs * 16 * 16 / (minNumberRatiosForWidth * minNumberRatiosForHeight))) * minNumberRatiosForHeight;
9070
- }
9071
- function getScaleDownRatio(sourceAspectRatio, sourceHeight, requestedMaxFs) {
9072
- return sourceHeight / getFrameHeightByMaxFs(sourceAspectRatio, requestedMaxFs);
9073
- }
9074
- function getMaxBitrate(requestedMaxFs) {
9075
- var maxFs = requestedMaxFs || defaultMaxFrameSize;
9076
- var expectedHeight = [...maxFrameSizeToMaxBitrateMap.keys()].sort((a, b) => b - a).find(h => maxFs >= h);
9077
- return maxFrameSizeToMaxBitrateMap.get(expectedHeight);
9078
- }
9079
9086
  class MediaRequest {
9080
- constructor(policy, policySpecificInfo, receiveSlots, codecInfos) {
9081
- var _a, _b;
9087
+ constructor(policy, policySpecificInfo, receiveSlots, maxPayloadBitsPerSecond, codecInfos) {
9082
9088
  this.policy = policy;
9083
9089
  this.policySpecificInfo = policySpecificInfo;
9084
9090
  this.receiveSlots = receiveSlots;
9085
- 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;
9086
9092
  this.codecInfos = codecInfos;
9087
9093
  }
9088
9094
  _toJmpScrRequest() {
@@ -9682,6 +9688,41 @@ var uuid_1 = require$$0;
9682
9688
  var deepCopy$1 = function deepCopy$1(value) {
9683
9689
  return JSON.parse(JSON.stringify(value));
9684
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
+ };
9685
9726
  /**
9686
9727
  * Translates a RTCStatsReport into an object.
9687
9728
  *
@@ -9698,6 +9739,18 @@ var map2obj = function map2obj(report) {
9698
9739
  });
9699
9740
  return o;
9700
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
+ };
9701
9754
  /**
9702
9755
  * Apply a delta compression to the stats report. Reduces size by ~90%.
9703
9756
  * To reduce further, report keys could be compressed.
@@ -9710,19 +9763,21 @@ var deltaCompression = function deltaCompression(oldStats, newStats) {
9710
9763
  var updatedStats = deepCopy$1(newStats);
9711
9764
  Object.keys(updatedStats).forEach(function (id) {
9712
9765
  var report = updatedStats[id];
9713
- delete report.id;
9714
9766
  if (!oldStats[id]) {
9715
9767
  return;
9716
9768
  }
9769
+ // Persist specific values beyond delta compression, as long as they
9770
+ // aren't the only non-deduped keys.
9717
9771
  Object.keys(report).forEach(function (name) {
9718
- if (report[name] === oldStats[id][name]) {
9772
+ if (deepEqual(report[name], oldStats[id][name]) && !persistedKeys.includes(name)) {
9719
9773
  delete updatedStats[id][name];
9720
9774
  }
9721
- if (Object.keys(report).length === 0 || Object.keys(report).length === 1 && report.timestamp) {
9775
+ if (!hasNonMetadata(report)) {
9722
9776
  delete updatedStats[id];
9723
9777
  }
9724
9778
  });
9725
9779
  });
9780
+ // Use the most recent timestamp.
9726
9781
  var timestamp = -Infinity;
9727
9782
  Object.keys(updatedStats).forEach(function (id) {
9728
9783
  var report = updatedStats[id];
@@ -9730,15 +9785,42 @@ var deltaCompression = function deltaCompression(oldStats, newStats) {
9730
9785
  timestamp = report.timestamp;
9731
9786
  }
9732
9787
  });
9788
+ // Delete the timestamps on each item.
9733
9789
  Object.keys(updatedStats).forEach(function (id) {
9734
9790
  var report = updatedStats[id];
9735
9791
  if (report.timestamp === timestamp) {
9736
- report.timestamp = 0;
9792
+ delete report.timestamp;
9737
9793
  }
9738
9794
  });
9739
9795
  updatedStats.timestamp = timestamp;
9740
9796
  return updatedStats;
9741
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
+ };
9742
9824
  /**
9743
9825
  * Attach a Peer Connection to periodically get updated on events and stats.
9744
9826
  *
@@ -9761,51 +9843,50 @@ var rtcStats = function rtcStats(pc, logger, intervalTime, id, statsPreProcessor
9761
9843
  /**
9762
9844
  * Log stats or event data with additional tracking information.
9763
9845
  *
9764
- * @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.
9765
9848
  */
9766
- var trace = function trace(eventName, data) {
9849
+ var trace = function trace(name, payload, timestamp) {
9767
9850
  logger({
9768
- name: '[rtcstats]',
9769
9851
  id: id,
9770
- eventName: eventName,
9771
- data: data
9852
+ timestamp: timestamp ? Math.round(timestamp) : Date.now(),
9853
+ name: name,
9854
+ payload: payload
9772
9855
  });
9773
9856
  };
9774
- trace('creating stats report');
9775
9857
  pc.addEventListener('icecandidate', function (e) {
9776
- trace('onicecandidate', e.candidate);
9858
+ if (e.candidate) {
9859
+ trace('onicecandidate', makeEvent(JSON.stringify(e.candidate)));
9860
+ }
9777
9861
  });
9778
9862
  pc.addEventListener('icecandidateerror', function (event) {
9779
9863
  var _a = event,
9780
9864
  errorCode = _a.errorCode,
9781
9865
  errorText = _a.errorText;
9782
- trace('onicecandidateerror', {
9783
- errorText: errorText,
9784
- errorCode: errorCode
9785
- });
9866
+ trace('onicecandidateerror', makeEvent("".concat(errorCode, ": ").concat(errorText)));
9786
9867
  });
9787
9868
  pc.addEventListener('track', function (e) {
9788
- 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) {
9789
9870
  return "stream:".concat(stream.id);
9790
- })));
9871
+ }).join(' '))));
9791
9872
  });
9792
9873
  pc.addEventListener('signalingstatechange', function () {
9793
- trace('onsignalingstatechange', pc.signalingState);
9874
+ trace('onsignalingstatechange', makeEvent(pc.signalingState));
9794
9875
  });
9795
9876
  pc.addEventListener('iceconnectionstatechange', function () {
9796
- trace('oniceconnectionstatechange', pc.iceConnectionState);
9877
+ trace('oniceconnectionstatechange', makeEvent(pc.iceConnectionState));
9797
9878
  });
9798
9879
  pc.addEventListener('icegatheringstatechange', function () {
9799
- trace('onicegatheringstatechange', pc.iceGatheringState);
9880
+ trace('onicegatheringstatechange', makeEvent(pc.iceGatheringState));
9800
9881
  });
9801
9882
  pc.addEventListener('connectionstatechange', function () {
9802
- trace('onconnectionstatechange', pc.connectionState);
9883
+ trace('onconnectionstatechange', makeEvent(pc.connectionState));
9803
9884
  });
9804
9885
  pc.addEventListener('negotiationneeded', function () {
9805
- trace('onnegotiationneeded');
9886
+ trace('onnegotiationneeded', makeEvent('negotiationneeded'));
9806
9887
  });
9807
9888
  pc.addEventListener('datachannel', function (event) {
9808
- trace('ondatachannel', [event.channel.id, event.channel.label]);
9889
+ trace('ondatachannel', makeEvent("".concat(event.channel.id, ": ").concat(event.channel.label)));
9809
9890
  });
9810
9891
  var interval = window.setInterval(function () {
9811
9892
  if (pc.signalingState === 'closed') {
@@ -9816,7 +9897,8 @@ var rtcStats = function rtcStats(pc, logger, intervalTime, id, statsPreProcessor
9816
9897
  var now = map2obj(res);
9817
9898
  statsPreProcessor(now).then(function () {
9818
9899
  var base = deepCopy$1(now); // our new prev
9819
- trace('stats-report', deltaCompression(prev, now));
9900
+ var compressed = deltaCompression(prev, now);
9901
+ trace('stats-report', formatStatsReport(compressed), compressed.timestamp !== -Infinity ? compressed.timestamp : undefined);
9820
9902
  prev = base;
9821
9903
  });
9822
9904
  });
@@ -11059,6 +11141,88 @@ function hasCodec(codecName, mLine) {
11059
11141
  return ((_a = ci.name) === null || _a === void 0 ? void 0 : _a.toLowerCase()) === codecName.toLowerCase();
11060
11142
  });
11061
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
+ }
11062
11226
  var events = {
11063
11227
  exports: {}
11064
11228
  };
@@ -11448,1894 +11612,1944 @@ function eventTargetAgnosticAddListener(emitter, name, listener, flags) {
11448
11612
  }
11449
11613
  }
11450
11614
  class EventEmitter extends events.exports.EventEmitter {}
11451
- var es5 = {
11452
- exports: {}
11453
- };
11454
- (function (module, exports) {
11455
- !function (e, t) {
11456
- module.exports = t();
11457
- }(commonjsGlobal$3, function () {
11458
- return function (e) {
11459
- var t = {};
11460
- function r(n) {
11461
- if (t[n]) return t[n].exports;
11462
- var i = t[n] = {
11463
- i: n,
11464
- l: !1,
11465
- exports: {}
11466
- };
11467
- 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;
11468
11732
  }
11469
- return r.m = e, r.c = t, r.d = function (e, t, n) {
11470
- r.o(e, t) || Object.defineProperty(e, t, {
11471
- enumerable: !0,
11472
- get: n
11473
- });
11474
- }, r.r = function (e) {
11475
- "undefined" != typeof Symbol && Symbol.toStringTag && Object.defineProperty(e, Symbol.toStringTag, {
11476
- value: "Module"
11477
- }), Object.defineProperty(e, "__esModule", {
11478
- 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');
11479
11876
  });
11480
- }, r.t = function (e, t) {
11481
- if (1 & t && (e = r(e)), 8 & t) return e;
11482
- if (4 & t && "object" == typeof e && e && e.__esModule) return e;
11483
- var n = Object.create(null);
11484
- if (r.r(n), Object.defineProperty(n, "default", {
11485
- enumerable: !0,
11486
- value: e
11487
- }), 2 & t && "string" != typeof e) for (var i in e) {
11488
- r.d(n, i, function (t) {
11489
- return e[t];
11490
- }.bind(null, i));
11491
- }
11492
- return n;
11493
- }, r.n = function (e) {
11494
- var t = e && e.__esModule ? function () {
11495
- return e.default;
11496
- } : function () {
11497
- return e;
11498
- };
11499
- return r.d(t, "a", t), t;
11500
- }, r.o = function (e, t) {
11501
- return Object.prototype.hasOwnProperty.call(e, t);
11502
- }, r.p = "", r(r.s = 90);
11503
- }({
11504
- 17: function _(e, t, r) {
11505
- t.__esModule = !0, t.default = void 0;
11506
- var n = r(18),
11507
- i = function () {
11508
- function e() {}
11509
- return e.getFirstMatch = function (e, t) {
11510
- var r = t.match(e);
11511
- return r && r.length > 0 && r[1] || "";
11512
- }, e.getSecondMatch = function (e, t) {
11513
- var r = t.match(e);
11514
- return r && r.length > 1 && r[2] || "";
11515
- }, e.matchAndReturnConst = function (e, t, r) {
11516
- if (e.test(t)) return r;
11517
- }, e.getWindowsVersionName = function (e) {
11518
- switch (e) {
11519
- case "NT":
11520
- return "NT";
11521
- case "XP":
11522
- return "XP";
11523
- case "NT 5.0":
11524
- return "2000";
11525
- case "NT 5.1":
11526
- return "XP";
11527
- case "NT 5.2":
11528
- return "2003";
11529
- case "NT 6.0":
11530
- return "Vista";
11531
- case "NT 6.1":
11532
- return "7";
11533
- case "NT 6.2":
11534
- return "8";
11535
- case "NT 6.3":
11536
- return "8.1";
11537
- case "NT 10.0":
11538
- return "10";
11539
- default:
11540
- return;
11541
- }
11542
- }, e.getMacOSVersionName = function (e) {
11543
- var t = e.split(".").splice(0, 2).map(function (e) {
11544
- return parseInt(e, 10) || 0;
11545
- });
11546
- if (t.push(0), 10 === t[0]) switch (t[1]) {
11547
- case 5:
11548
- return "Leopard";
11549
- case 6:
11550
- return "Snow Leopard";
11551
- case 7:
11552
- return "Lion";
11553
- case 8:
11554
- return "Mountain Lion";
11555
- case 9:
11556
- return "Mavericks";
11557
- case 10:
11558
- return "Yosemite";
11559
- case 11:
11560
- return "El Capitan";
11561
- case 12:
11562
- return "Sierra";
11563
- case 13:
11564
- return "High Sierra";
11565
- case 14:
11566
- return "Mojave";
11567
- case 15:
11568
- return "Catalina";
11569
- default:
11570
- return;
11571
- }
11572
- }, e.getAndroidVersionName = function (e) {
11573
- var t = e.split(".").splice(0, 2).map(function (e) {
11574
- return parseInt(e, 10) || 0;
11575
- });
11576
- 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;
11577
- }, e.getVersionPrecision = function (e) {
11578
- return e.split(".").length;
11579
- }, e.compareVersions = function (t, r, n) {
11580
- void 0 === n && (n = !1);
11581
- var i = e.getVersionPrecision(t),
11582
- s = e.getVersionPrecision(r),
11583
- a = Math.max(i, s),
11584
- o = 0,
11585
- u = e.map([t, r], function (t) {
11586
- var r = a - e.getVersionPrecision(t),
11587
- n = t + new Array(r + 1).join(".0");
11588
- return e.map(n.split("."), function (e) {
11589
- return new Array(20 - e.length).join("0") + e;
11590
- }).reverse();
11591
- });
11592
- for (n && (o = a - Math.min(i, s)), a -= 1; a >= o;) {
11593
- if (u[0][a] > u[1][a]) return 1;
11594
- if (u[0][a] === u[1][a]) {
11595
- if (a === o) return 0;
11596
- a -= 1;
11597
- } else if (u[0][a] < u[1][a]) return -1;
11598
- }
11599
- }, e.map = function (e, t) {
11600
- var r,
11601
- n = [];
11602
- if (Array.prototype.map) return Array.prototype.map.call(e, t);
11603
- for (r = 0; r < e.length; r += 1) {
11604
- n.push(t(e[r]));
11605
- }
11606
- return n;
11607
- }, e.find = function (e, t) {
11608
- var r, n;
11609
- if (Array.prototype.find) return Array.prototype.find.call(e, t);
11610
- for (r = 0, n = e.length; r < n; r += 1) {
11611
- var i = e[r];
11612
- if (t(i, r)) return i;
11613
- }
11614
- }, e.assign = function (e) {
11615
- for (var t, r, n = e, i = arguments.length, s = new Array(i > 1 ? i - 1 : 0), a = 1; a < i; a++) {
11616
- s[a - 1] = arguments[a];
11617
- }
11618
- if (Object.assign) return Object.assign.apply(Object, [e].concat(s));
11619
- var o = function o() {
11620
- var e = s[t];
11621
- "object" == typeof e && null !== e && Object.keys(e).forEach(function (t) {
11622
- n[t] = e[t];
11623
- });
11624
- };
11625
- for (t = 0, r = s.length; t < r; t += 1) {
11626
- o();
11627
- }
11628
- return e;
11629
- }, e.getBrowserAlias = function (e) {
11630
- return n.BROWSER_ALIASES_MAP[e];
11631
- }, e.getBrowserTypeByAlias = function (e) {
11632
- return n.BROWSER_MAP[e] || "";
11633
- }, e;
11634
- }();
11635
- t.default = i, e.exports = t.default;
11636
- },
11637
- 18: function _(e, t, r) {
11638
- t.__esModule = !0, t.ENGINE_MAP = t.OS_MAP = t.PLATFORMS_MAP = t.BROWSER_MAP = t.BROWSER_ALIASES_MAP = void 0;
11639
- t.BROWSER_ALIASES_MAP = {
11640
- "Amazon Silk": "amazon_silk",
11641
- "Android Browser": "android",
11642
- Bada: "bada",
11643
- BlackBerry: "blackberry",
11644
- Chrome: "chrome",
11645
- Chromium: "chromium",
11646
- Electron: "electron",
11647
- Epiphany: "epiphany",
11648
- Firefox: "firefox",
11649
- Focus: "focus",
11650
- Generic: "generic",
11651
- "Google Search": "google_search",
11652
- Googlebot: "googlebot",
11653
- "Internet Explorer": "ie",
11654
- "K-Meleon": "k_meleon",
11655
- Maxthon: "maxthon",
11656
- "Microsoft Edge": "edge",
11657
- "MZ Browser": "mz",
11658
- "NAVER Whale Browser": "naver",
11659
- Opera: "opera",
11660
- "Opera Coast": "opera_coast",
11661
- PhantomJS: "phantomjs",
11662
- Puffin: "puffin",
11663
- QupZilla: "qupzilla",
11664
- QQ: "qq",
11665
- QQLite: "qqlite",
11666
- Safari: "safari",
11667
- Sailfish: "sailfish",
11668
- "Samsung Internet for Android": "samsung_internet",
11669
- SeaMonkey: "seamonkey",
11670
- Sleipnir: "sleipnir",
11671
- Swing: "swing",
11672
- Tizen: "tizen",
11673
- "UC Browser": "uc",
11674
- Vivaldi: "vivaldi",
11675
- "WebOS Browser": "webos",
11676
- WeChat: "wechat",
11677
- "Yandex Browser": "yandex",
11678
- Roku: "roku"
11679
- };
11680
- t.BROWSER_MAP = {
11681
- amazon_silk: "Amazon Silk",
11682
- android: "Android Browser",
11683
- bada: "Bada",
11684
- blackberry: "BlackBerry",
11685
- chrome: "Chrome",
11686
- chromium: "Chromium",
11687
- electron: "Electron",
11688
- epiphany: "Epiphany",
11689
- firefox: "Firefox",
11690
- focus: "Focus",
11691
- generic: "Generic",
11692
- googlebot: "Googlebot",
11693
- google_search: "Google Search",
11694
- ie: "Internet Explorer",
11695
- k_meleon: "K-Meleon",
11696
- maxthon: "Maxthon",
11697
- edge: "Microsoft Edge",
11698
- mz: "MZ Browser",
11699
- naver: "NAVER Whale Browser",
11700
- opera: "Opera",
11701
- opera_coast: "Opera Coast",
11702
- phantomjs: "PhantomJS",
11703
- puffin: "Puffin",
11704
- qupzilla: "QupZilla",
11705
- qq: "QQ Browser",
11706
- qqlite: "QQ Browser Lite",
11707
- safari: "Safari",
11708
- sailfish: "Sailfish",
11709
- samsung_internet: "Samsung Internet for Android",
11710
- seamonkey: "SeaMonkey",
11711
- sleipnir: "Sleipnir",
11712
- swing: "Swing",
11713
- tizen: "Tizen",
11714
- uc: "UC Browser",
11715
- vivaldi: "Vivaldi",
11716
- webos: "WebOS Browser",
11717
- wechat: "WeChat",
11718
- yandex: "Yandex Browser"
11719
- };
11720
- t.PLATFORMS_MAP = {
11721
- tablet: "tablet",
11722
- mobile: "mobile",
11723
- desktop: "desktop",
11724
- tv: "tv"
11725
- };
11726
- t.OS_MAP = {
11727
- WindowsPhone: "Windows Phone",
11728
- Windows: "Windows",
11729
- MacOS: "macOS",
11730
- iOS: "iOS",
11731
- Android: "Android",
11732
- WebOS: "WebOS",
11733
- BlackBerry: "BlackBerry",
11734
- Bada: "Bada",
11735
- Tizen: "Tizen",
11736
- Linux: "Linux",
11737
- ChromeOS: "Chrome OS",
11738
- PlayStation4: "PlayStation 4",
11739
- Roku: "Roku"
11740
- };
11741
- t.ENGINE_MAP = {
11742
- EdgeHTML: "EdgeHTML",
11743
- Blink: "Blink",
11744
- Trident: "Trident",
11745
- Presto: "Presto",
11746
- Gecko: "Gecko",
11747
- WebKit: "WebKit"
11748
- };
11749
- },
11750
- 90: function _(e, t, r) {
11751
- t.__esModule = !0, t.default = void 0;
11752
- var n,
11753
- i = (n = r(91)) && n.__esModule ? n : {
11754
- default: n
11755
- },
11756
- s = r(18);
11757
- function a(e, t) {
11758
- for (var r = 0; r < t.length; r++) {
11759
- var n = t[r];
11760
- n.enumerable = n.enumerable || !1, n.configurable = !0, "value" in n && (n.writable = !0), Object.defineProperty(e, n.key, n);
11761
- }
11762
- }
11763
- var o = function () {
11764
- function e() {}
11765
- var t, r, n;
11766
- return e.getParser = function (e, t) {
11767
- if (void 0 === t && (t = !1), "string" != typeof e) throw new Error("UserAgent should be a string");
11768
- return new i.default(e, t);
11769
- }, e.parse = function (e) {
11770
- return new i.default(e).getResult();
11771
- }, t = e, n = [{
11772
- key: "BROWSER_MAP",
11773
- get: function get() {
11774
- return s.BROWSER_MAP;
11775
- }
11776
- }, {
11777
- key: "ENGINE_MAP",
11778
- get: function get() {
11779
- return s.ENGINE_MAP;
11780
- }
11781
- }, {
11782
- key: "OS_MAP",
11783
- get: function get() {
11784
- return s.OS_MAP;
11785
- }
11786
- }, {
11787
- key: "PLATFORMS_MAP",
11788
- get: function get() {
11789
- return s.PLATFORMS_MAP;
11790
- }
11791
- }], (r = null) && a(t.prototype, r), n && a(t, n), e;
11792
- }();
11793
- t.default = o, e.exports = t.default;
11794
- },
11795
- 91: function _(e, t, r) {
11796
- t.__esModule = !0, t.default = void 0;
11797
- var n = u(r(92)),
11798
- i = u(r(93)),
11799
- s = u(r(94)),
11800
- a = u(r(95)),
11801
- o = u(r(17));
11802
- function u(e) {
11803
- return e && e.__esModule ? e : {
11804
- default: e
11805
- };
11806
- }
11807
- var d = function () {
11808
- function e(e, t) {
11809
- if (void 0 === t && (t = !1), null == e || "" === e) throw new Error("UserAgent parameter can't be empty");
11810
- this._ua = e, this.parsedResult = {}, !0 !== t && this.parse();
11811
- }
11812
- var t = e.prototype;
11813
- return t.getUA = function () {
11814
- return this._ua;
11815
- }, t.test = function (e) {
11816
- return e.test(this._ua);
11817
- }, t.parseBrowser = function () {
11818
- var e = this;
11819
- this.parsedResult.browser = {};
11820
- var t = o.default.find(n.default, function (t) {
11821
- if ("function" == typeof t.test) return t.test(e);
11822
- if (t.test instanceof Array) return t.test.some(function (t) {
11823
- return e.test(t);
11824
- });
11825
- throw new Error("Browser's test function is not valid");
11826
- });
11827
- return t && (this.parsedResult.browser = t.describe(this.getUA())), this.parsedResult.browser;
11828
- }, t.getBrowser = function () {
11829
- return this.parsedResult.browser ? this.parsedResult.browser : this.parseBrowser();
11830
- }, t.getBrowserName = function (e) {
11831
- return e ? String(this.getBrowser().name).toLowerCase() || "" : this.getBrowser().name || "";
11832
- }, t.getBrowserVersion = function () {
11833
- return this.getBrowser().version;
11834
- }, t.getOS = function () {
11835
- return this.parsedResult.os ? this.parsedResult.os : this.parseOS();
11836
- }, t.parseOS = function () {
11837
- var e = this;
11838
- this.parsedResult.os = {};
11839
- var t = o.default.find(i.default, function (t) {
11840
- if ("function" == typeof t.test) return t.test(e);
11841
- if (t.test instanceof Array) return t.test.some(function (t) {
11842
- return e.test(t);
11843
- });
11844
- throw new Error("Browser's test function is not valid");
11845
- });
11846
- return t && (this.parsedResult.os = t.describe(this.getUA())), this.parsedResult.os;
11847
- }, t.getOSName = function (e) {
11848
- var t = this.getOS().name;
11849
- return e ? String(t).toLowerCase() || "" : t || "";
11850
- }, t.getOSVersion = function () {
11851
- return this.getOS().version;
11852
- }, t.getPlatform = function () {
11853
- return this.parsedResult.platform ? this.parsedResult.platform : this.parsePlatform();
11854
- }, t.getPlatformType = function (e) {
11855
- void 0 === e && (e = !1);
11856
- var t = this.getPlatform().type;
11857
- return e ? String(t).toLowerCase() || "" : t || "";
11858
- }, t.parsePlatform = function () {
11859
- var e = this;
11860
- this.parsedResult.platform = {};
11861
- var t = o.default.find(s.default, function (t) {
11862
- if ("function" == typeof t.test) return t.test(e);
11863
- if (t.test instanceof Array) return t.test.some(function (t) {
11864
- return e.test(t);
11865
- });
11866
- throw new Error("Browser's test function is not valid");
11867
- });
11868
- return t && (this.parsedResult.platform = t.describe(this.getUA())), this.parsedResult.platform;
11869
- }, t.getEngine = function () {
11870
- return this.parsedResult.engine ? this.parsedResult.engine : this.parseEngine();
11871
- }, t.getEngineName = function (e) {
11872
- return e ? String(this.getEngine().name).toLowerCase() || "" : this.getEngine().name || "";
11873
- }, t.parseEngine = function () {
11874
- var e = this;
11875
- this.parsedResult.engine = {};
11876
- var t = o.default.find(a.default, function (t) {
11877
- if ("function" == typeof t.test) return t.test(e);
11878
- if (t.test instanceof Array) return t.test.some(function (t) {
11879
- return e.test(t);
11880
- });
11881
- throw new Error("Browser's test function is not valid");
11882
- });
11883
- return t && (this.parsedResult.engine = t.describe(this.getUA())), this.parsedResult.engine;
11884
- }, t.parse = function () {
11885
- return this.parseBrowser(), this.parseOS(), this.parsePlatform(), this.parseEngine(), this;
11886
- }, t.getResult = function () {
11887
- return o.default.assign({}, this.parsedResult);
11888
- }, t.satisfies = function (e) {
11889
- var t = this,
11890
- r = {},
11891
- n = 0,
11892
- i = {},
11893
- s = 0;
11894
- if (Object.keys(e).forEach(function (t) {
11895
- var a = e[t];
11896
- "string" == typeof a ? (i[t] = a, s += 1) : "object" == typeof a && (r[t] = a, n += 1);
11897
- }), n > 0) {
11898
- var a = Object.keys(r),
11899
- u = o.default.find(a, function (e) {
11900
- return t.isOS(e);
11901
- });
11902
- if (u) {
11903
- var d = this.satisfies(r[u]);
11904
- if (void 0 !== d) return d;
11905
- }
11906
- var c = o.default.find(a, function (e) {
11907
- return t.isPlatform(e);
11908
- });
11909
- if (c) {
11910
- var f = this.satisfies(r[c]);
11911
- if (void 0 !== f) return f;
11912
- }
11913
- }
11914
- if (s > 0) {
11915
- var l = Object.keys(i),
11916
- h = o.default.find(l, function (e) {
11917
- return t.isBrowser(e, !0);
11918
- });
11919
- if (void 0 !== h) return this.compareVersion(i[h]);
11920
- }
11921
- }, t.isBrowser = function (e, t) {
11922
- void 0 === t && (t = !1);
11923
- var r = this.getBrowserName().toLowerCase(),
11924
- n = e.toLowerCase(),
11925
- i = o.default.getBrowserTypeByAlias(n);
11926
- return t && i && (n = i.toLowerCase()), n === r;
11927
- }, t.compareVersion = function (e) {
11928
- var t = [0],
11929
- r = e,
11930
- n = !1,
11931
- i = this.getBrowserVersion();
11932
- 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;
11933
- }, t.isOS = function (e) {
11934
- return this.getOSName(!0) === String(e).toLowerCase();
11935
- }, t.isPlatform = function (e) {
11936
- return this.getPlatformType(!0) === String(e).toLowerCase();
11937
- }, t.isEngine = function (e) {
11938
- return this.getEngineName(!0) === String(e).toLowerCase();
11939
- }, t.is = function (e, t) {
11940
- return void 0 === t && (t = !1), this.isBrowser(e, t) || this.isOS(e) || this.isPlatform(e);
11941
- }, t.some = function (e) {
11942
- var t = this;
11943
- return void 0 === e && (e = []), e.some(function (e) {
11944
- return t.is(e);
11945
- });
11946
- }, e;
11947
- }();
11948
- t.default = d, e.exports = t.default;
11949
- },
11950
- 92: function _(e, t, r) {
11951
- t.__esModule = !0, t.default = void 0;
11952
- var n,
11953
- i = (n = r(17)) && n.__esModule ? n : {
11954
- default: n
11955
- };
11956
- var s = /version\/(\d+(\.?_?\d+)+)/i,
11957
- a = [{
11958
- test: [/googlebot/i],
11959
- describe: function describe(e) {
11960
- var t = {
11961
- name: "Googlebot"
11962
- },
11963
- r = i.default.getFirstMatch(/googlebot\/(\d+(\.\d+))/i, e) || i.default.getFirstMatch(s, e);
11964
- return r && (t.version = r), t;
11965
- }
11966
- }, {
11967
- test: [/opera/i],
11968
- describe: function describe(e) {
11969
- var t = {
11970
- name: "Opera"
11971
- },
11972
- r = i.default.getFirstMatch(s, e) || i.default.getFirstMatch(/(?:opera)[\s/](\d+(\.?_?\d+)+)/i, e);
11973
- return r && (t.version = r), t;
11974
- }
11975
- }, {
11976
- test: [/opr\/|opios/i],
11977
- describe: function describe(e) {
11978
- var t = {
11979
- name: "Opera"
11980
- },
11981
- r = i.default.getFirstMatch(/(?:opr|opios)[\s/](\S+)/i, e) || i.default.getFirstMatch(s, e);
11982
- return r && (t.version = r), t;
11983
- }
11984
- }, {
11985
- test: [/SamsungBrowser/i],
11986
- describe: function describe(e) {
11987
- var t = {
11988
- name: "Samsung Internet for Android"
11989
- },
11990
- r = i.default.getFirstMatch(s, e) || i.default.getFirstMatch(/(?:SamsungBrowser)[\s/](\d+(\.?_?\d+)+)/i, e);
11991
- return r && (t.version = r), t;
11992
- }
11993
- }, {
11994
- test: [/Whale/i],
11995
- describe: function describe(e) {
11996
- var t = {
11997
- name: "NAVER Whale Browser"
11998
- },
11999
- r = i.default.getFirstMatch(s, e) || i.default.getFirstMatch(/(?:whale)[\s/](\d+(?:\.\d+)+)/i, e);
12000
- return r && (t.version = r), t;
12001
- }
12002
- }, {
12003
- test: [/MZBrowser/i],
12004
- describe: function describe(e) {
12005
- var t = {
12006
- name: "MZ Browser"
12007
- },
12008
- r = i.default.getFirstMatch(/(?:MZBrowser)[\s/](\d+(?:\.\d+)+)/i, e) || i.default.getFirstMatch(s, e);
12009
- return r && (t.version = r), t;
12010
- }
12011
- }, {
12012
- test: [/focus/i],
12013
- describe: function describe(e) {
12014
- var t = {
12015
- name: "Focus"
12016
- },
12017
- r = i.default.getFirstMatch(/(?:focus)[\s/](\d+(?:\.\d+)+)/i, e) || i.default.getFirstMatch(s, e);
12018
- return r && (t.version = r), t;
12019
- }
12020
- }, {
12021
- test: [/swing/i],
12022
- describe: function describe(e) {
12023
- var t = {
12024
- name: "Swing"
12025
- },
12026
- r = i.default.getFirstMatch(/(?:swing)[\s/](\d+(?:\.\d+)+)/i, e) || i.default.getFirstMatch(s, e);
12027
- return r && (t.version = r), t;
12028
- }
12029
- }, {
12030
- test: [/coast/i],
12031
- describe: function describe(e) {
12032
- var t = {
12033
- name: "Opera Coast"
12034
- },
12035
- r = i.default.getFirstMatch(s, e) || i.default.getFirstMatch(/(?:coast)[\s/](\d+(\.?_?\d+)+)/i, e);
12036
- return r && (t.version = r), t;
12037
- }
12038
- }, {
12039
- test: [/opt\/\d+(?:.?_?\d+)+/i],
12040
- describe: function describe(e) {
12041
- var t = {
12042
- name: "Opera Touch"
12043
- },
12044
- r = i.default.getFirstMatch(/(?:opt)[\s/](\d+(\.?_?\d+)+)/i, e) || i.default.getFirstMatch(s, e);
12045
- return r && (t.version = r), t;
12046
- }
12047
- }, {
12048
- test: [/yabrowser/i],
12049
- describe: function describe(e) {
12050
- var t = {
12051
- name: "Yandex Browser"
12052
- },
12053
- r = i.default.getFirstMatch(/(?:yabrowser)[\s/](\d+(\.?_?\d+)+)/i, e) || i.default.getFirstMatch(s, e);
12054
- return r && (t.version = r), t;
12055
- }
12056
- }, {
12057
- test: [/ucbrowser/i],
12058
- describe: function describe(e) {
12059
- var t = {
12060
- name: "UC Browser"
12061
- },
12062
- r = i.default.getFirstMatch(s, e) || i.default.getFirstMatch(/(?:ucbrowser)[\s/](\d+(\.?_?\d+)+)/i, e);
12063
- return r && (t.version = r), t;
12064
- }
12065
- }, {
12066
- test: [/Maxthon|mxios/i],
12067
- describe: function describe(e) {
12068
- var t = {
12069
- name: "Maxthon"
12070
- },
12071
- r = i.default.getFirstMatch(s, e) || i.default.getFirstMatch(/(?:Maxthon|mxios)[\s/](\d+(\.?_?\d+)+)/i, e);
12072
- return r && (t.version = r), t;
12073
- }
12074
- }, {
12075
- test: [/epiphany/i],
12076
- describe: function describe(e) {
12077
- var t = {
12078
- name: "Epiphany"
12079
- },
12080
- r = i.default.getFirstMatch(s, e) || i.default.getFirstMatch(/(?:epiphany)[\s/](\d+(\.?_?\d+)+)/i, e);
12081
- return r && (t.version = r), t;
12082
- }
12083
- }, {
12084
- test: [/puffin/i],
12085
- describe: function describe(e) {
12086
- var t = {
12087
- name: "Puffin"
12088
- },
12089
- r = i.default.getFirstMatch(s, e) || i.default.getFirstMatch(/(?:puffin)[\s/](\d+(\.?_?\d+)+)/i, e);
12090
- return r && (t.version = r), t;
12091
- }
12092
- }, {
12093
- test: [/sleipnir/i],
12094
- describe: function describe(e) {
12095
- var t = {
12096
- name: "Sleipnir"
12097
- },
12098
- r = i.default.getFirstMatch(s, e) || i.default.getFirstMatch(/(?:sleipnir)[\s/](\d+(\.?_?\d+)+)/i, e);
12099
- return r && (t.version = r), t;
12100
- }
12101
- }, {
12102
- test: [/k-meleon/i],
12103
- describe: function describe(e) {
12104
- var t = {
12105
- name: "K-Meleon"
12106
- },
12107
- r = i.default.getFirstMatch(s, e) || i.default.getFirstMatch(/(?:k-meleon)[\s/](\d+(\.?_?\d+)+)/i, e);
12108
- return r && (t.version = r), t;
12109
- }
12110
- }, {
12111
- test: [/micromessenger/i],
12112
- describe: function describe(e) {
12113
- var t = {
12114
- name: "WeChat"
12115
- },
12116
- r = i.default.getFirstMatch(/(?:micromessenger)[\s/](\d+(\.?_?\d+)+)/i, e) || i.default.getFirstMatch(s, e);
12117
- return r && (t.version = r), t;
12118
- }
12119
- }, {
12120
- test: [/qqbrowser/i],
12121
- describe: function describe(e) {
12122
- var t = {
12123
- name: /qqbrowserlite/i.test(e) ? "QQ Browser Lite" : "QQ Browser"
12124
- },
12125
- r = i.default.getFirstMatch(/(?:qqbrowserlite|qqbrowser)[/](\d+(\.?_?\d+)+)/i, e) || i.default.getFirstMatch(s, e);
12126
- return r && (t.version = r), t;
12127
- }
12128
- }, {
12129
- test: [/msie|trident/i],
12130
- describe: function describe(e) {
12131
- var t = {
12132
- name: "Internet Explorer"
12133
- },
12134
- r = i.default.getFirstMatch(/(?:msie |rv:)(\d+(\.?_?\d+)+)/i, e);
12135
- return r && (t.version = r), t;
12136
- }
12137
- }, {
12138
- test: [/\sedg\//i],
12139
- describe: function describe(e) {
12140
- var t = {
12141
- name: "Microsoft Edge"
12142
- },
12143
- r = i.default.getFirstMatch(/\sedg\/(\d+(\.?_?\d+)+)/i, e);
12144
- return r && (t.version = r), t;
12145
- }
12146
- }, {
12147
- test: [/edg([ea]|ios)/i],
12148
- describe: function describe(e) {
12149
- var t = {
12150
- name: "Microsoft Edge"
12151
- },
12152
- r = i.default.getSecondMatch(/edg([ea]|ios)\/(\d+(\.?_?\d+)+)/i, e);
12153
- return r && (t.version = r), t;
12154
- }
12155
- }, {
12156
- test: [/vivaldi/i],
12157
- describe: function describe(e) {
12158
- var t = {
12159
- name: "Vivaldi"
12160
- },
12161
- r = i.default.getFirstMatch(/vivaldi\/(\d+(\.?_?\d+)+)/i, e);
12162
- return r && (t.version = r), t;
12163
- }
12164
- }, {
12165
- test: [/seamonkey/i],
12166
- describe: function describe(e) {
12167
- var t = {
12168
- name: "SeaMonkey"
12169
- },
12170
- r = i.default.getFirstMatch(/seamonkey\/(\d+(\.?_?\d+)+)/i, e);
12171
- return r && (t.version = r), t;
12172
- }
12173
- }, {
12174
- test: [/sailfish/i],
12175
- describe: function describe(e) {
12176
- var t = {
12177
- name: "Sailfish"
12178
- },
12179
- r = i.default.getFirstMatch(/sailfish\s?browser\/(\d+(\.\d+)?)/i, e);
12180
- return r && (t.version = r), t;
12181
- }
12182
- }, {
12183
- test: [/silk/i],
12184
- describe: function describe(e) {
12185
- var t = {
12186
- name: "Amazon Silk"
12187
- },
12188
- r = i.default.getFirstMatch(/silk\/(\d+(\.?_?\d+)+)/i, e);
12189
- return r && (t.version = r), t;
12190
- }
12191
- }, {
12192
- test: [/phantom/i],
12193
- describe: function describe(e) {
12194
- var t = {
12195
- name: "PhantomJS"
12196
- },
12197
- r = i.default.getFirstMatch(/phantomjs\/(\d+(\.?_?\d+)+)/i, e);
12198
- return r && (t.version = r), t;
12199
- }
12200
- }, {
12201
- test: [/slimerjs/i],
12202
- describe: function describe(e) {
12203
- var t = {
12204
- name: "SlimerJS"
12205
- },
12206
- r = i.default.getFirstMatch(/slimerjs\/(\d+(\.?_?\d+)+)/i, e);
12207
- return r && (t.version = r), t;
12208
- }
12209
- }, {
12210
- test: [/blackberry|\bbb\d+/i, /rim\stablet/i],
12211
- describe: function describe(e) {
12212
- var t = {
12213
- name: "BlackBerry"
12214
- },
12215
- r = i.default.getFirstMatch(s, e) || i.default.getFirstMatch(/blackberry[\d]+\/(\d+(\.?_?\d+)+)/i, e);
12216
- return r && (t.version = r), t;
12217
- }
12218
- }, {
12219
- test: [/(web|hpw)[o0]s/i],
12220
- describe: function describe(e) {
12221
- var t = {
12222
- name: "WebOS Browser"
12223
- },
12224
- r = i.default.getFirstMatch(s, e) || i.default.getFirstMatch(/w(?:eb)?[o0]sbrowser\/(\d+(\.?_?\d+)+)/i, e);
12225
- return r && (t.version = r), t;
12226
- }
12227
- }, {
12228
- test: [/bada/i],
12229
- describe: function describe(e) {
12230
- var t = {
12231
- name: "Bada"
12232
- },
12233
- r = i.default.getFirstMatch(/dolfin\/(\d+(\.?_?\d+)+)/i, e);
12234
- return r && (t.version = r), t;
12235
- }
12236
- }, {
12237
- test: [/tizen/i],
12238
- describe: function describe(e) {
12239
- var t = {
12240
- name: "Tizen"
12241
- },
12242
- r = i.default.getFirstMatch(/(?:tizen\s?)?browser\/(\d+(\.?_?\d+)+)/i, e) || i.default.getFirstMatch(s, e);
12243
- return r && (t.version = r), t;
12244
- }
12245
- }, {
12246
- test: [/qupzilla/i],
12247
- describe: function describe(e) {
12248
- var t = {
12249
- name: "QupZilla"
12250
- },
12251
- r = i.default.getFirstMatch(/(?:qupzilla)[\s/](\d+(\.?_?\d+)+)/i, e) || i.default.getFirstMatch(s, e);
12252
- return r && (t.version = r), t;
12253
- }
12254
- }, {
12255
- test: [/firefox|iceweasel|fxios/i],
12256
- describe: function describe(e) {
12257
- var t = {
12258
- name: "Firefox"
12259
- },
12260
- r = i.default.getFirstMatch(/(?:firefox|iceweasel|fxios)[\s/](\d+(\.?_?\d+)+)/i, e);
12261
- return r && (t.version = r), t;
12262
- }
12263
- }, {
12264
- test: [/electron/i],
12265
- describe: function describe(e) {
12266
- var t = {
12267
- name: "Electron"
12268
- },
12269
- r = i.default.getFirstMatch(/(?:electron)\/(\d+(\.?_?\d+)+)/i, e);
12270
- return r && (t.version = r), t;
12271
- }
12272
- }, {
12273
- test: [/MiuiBrowser/i],
12274
- describe: function describe(e) {
12275
- var t = {
12276
- name: "Miui"
12277
- },
12278
- r = i.default.getFirstMatch(/(?:MiuiBrowser)[\s/](\d+(\.?_?\d+)+)/i, e);
12279
- return r && (t.version = r), t;
12280
- }
12281
- }, {
12282
- test: [/chromium/i],
12283
- describe: function describe(e) {
12284
- var t = {
12285
- name: "Chromium"
12286
- },
12287
- r = i.default.getFirstMatch(/(?:chromium)[\s/](\d+(\.?_?\d+)+)/i, e) || i.default.getFirstMatch(s, e);
12288
- return r && (t.version = r), t;
12289
- }
12290
- }, {
12291
- test: [/chrome|crios|crmo/i],
12292
- describe: function describe(e) {
12293
- var t = {
12294
- name: "Chrome"
12295
- },
12296
- r = i.default.getFirstMatch(/(?:chrome|crios|crmo)\/(\d+(\.?_?\d+)+)/i, e);
12297
- return r && (t.version = r), t;
12298
- }
12299
- }, {
12300
- test: [/GSA/i],
12301
- describe: function describe(e) {
12302
- var t = {
12303
- name: "Google Search"
12304
- },
12305
- r = i.default.getFirstMatch(/(?:GSA)\/(\d+(\.?_?\d+)+)/i, e);
12306
- return r && (t.version = r), t;
12307
- }
12308
- }, {
12309
- test: function test(e) {
12310
- var t = !e.test(/like android/i),
12311
- r = e.test(/android/i);
12312
- return t && r;
12313
- },
12314
- describe: function describe(e) {
12315
- var t = {
12316
- name: "Android Browser"
12317
- },
12318
- r = i.default.getFirstMatch(s, e);
12319
- return r && (t.version = r), t;
12320
- }
12321
- }, {
12322
- test: [/playstation 4/i],
12323
- describe: function describe(e) {
12324
- var t = {
12325
- name: "PlayStation 4"
12326
- },
12327
- r = i.default.getFirstMatch(s, e);
12328
- return r && (t.version = r), t;
12329
- }
12330
- }, {
12331
- test: [/safari|applewebkit/i],
12332
- describe: function describe(e) {
12333
- var t = {
12334
- name: "Safari"
12335
- },
12336
- r = i.default.getFirstMatch(s, e);
12337
- return r && (t.version = r), t;
12338
- }
12339
- }, {
12340
- test: [/.*/i],
12341
- describe: function describe(e) {
12342
- var t = -1 !== e.search("\\(") ? /^(.*)\/(.*)[ \t]\((.*)/ : /^(.*)\/(.*) /;
12343
- return {
12344
- name: i.default.getFirstMatch(t, e),
12345
- version: i.default.getSecondMatch(t, e)
12346
- };
12347
- }
12348
- }];
12349
- t.default = a, e.exports = t.default;
12350
- },
12351
- 93: function _(e, t, r) {
12352
- t.__esModule = !0, t.default = void 0;
12353
- var n,
12354
- i = (n = r(17)) && n.__esModule ? n : {
12355
- default: n
12356
- },
12357
- s = r(18);
12358
- var a = [{
12359
- test: [/Roku\/DVP/],
12360
- describe: function describe(e) {
12361
- var t = i.default.getFirstMatch(/Roku\/DVP-(\d+\.\d+)/i, e);
12362
- return {
12363
- name: s.OS_MAP.Roku,
12364
- version: t
12365
- };
12366
- }
12367
- }, {
12368
- test: [/windows phone/i],
12369
- describe: function describe(e) {
12370
- var t = i.default.getFirstMatch(/windows phone (?:os)?\s?(\d+(\.\d+)*)/i, e);
12371
- return {
12372
- name: s.OS_MAP.WindowsPhone,
12373
- version: t
12374
- };
12375
- }
12376
- }, {
12377
- test: [/windows /i],
12378
- describe: function describe(e) {
12379
- var t = i.default.getFirstMatch(/Windows ((NT|XP)( \d\d?.\d)?)/i, e),
12380
- r = i.default.getWindowsVersionName(t);
12381
- return {
12382
- name: s.OS_MAP.Windows,
12383
- version: t,
12384
- versionName: r
12385
- };
12386
- }
12387
- }, {
12388
- test: [/Macintosh(.*?) FxiOS(.*?)\//],
12389
- describe: function describe(e) {
12390
- var t = {
12391
- name: s.OS_MAP.iOS
12392
- },
12393
- r = i.default.getSecondMatch(/(Version\/)(\d[\d.]+)/, e);
12394
- return r && (t.version = r), t;
12395
- }
12396
- }, {
12397
- test: [/macintosh/i],
12398
- describe: function describe(e) {
12399
- var t = i.default.getFirstMatch(/mac os x (\d+(\.?_?\d+)+)/i, e).replace(/[_\s]/g, "."),
12400
- r = i.default.getMacOSVersionName(t),
12401
- n = {
12402
- name: s.OS_MAP.MacOS,
12403
- version: t
12404
- };
12405
- return r && (n.versionName = r), n;
12406
- }
12407
- }, {
12408
- test: [/(ipod|iphone|ipad)/i],
12409
- describe: function describe(e) {
12410
- var t = i.default.getFirstMatch(/os (\d+([_\s]\d+)*) like mac os x/i, e).replace(/[_\s]/g, ".");
12411
- return {
12412
- name: s.OS_MAP.iOS,
12413
- version: t
12414
- };
12415
- }
12416
- }, {
12417
- test: function test(e) {
12418
- var t = !e.test(/like android/i),
12419
- r = e.test(/android/i);
12420
- return t && r;
12421
- },
12422
- describe: function describe(e) {
12423
- var t = i.default.getFirstMatch(/android[\s/-](\d+(\.\d+)*)/i, e),
12424
- r = i.default.getAndroidVersionName(t),
12425
- n = {
12426
- name: s.OS_MAP.Android,
12427
- version: t
12428
- };
12429
- return r && (n.versionName = r), n;
12430
- }
12431
- }, {
12432
- test: [/(web|hpw)[o0]s/i],
12433
- describe: function describe(e) {
12434
- var t = i.default.getFirstMatch(/(?:web|hpw)[o0]s\/(\d+(\.\d+)*)/i, e),
12435
- r = {
12436
- name: s.OS_MAP.WebOS
12437
- };
12438
- return t && t.length && (r.version = t), r;
12439
- }
12440
- }, {
12441
- test: [/blackberry|\bbb\d+/i, /rim\stablet/i],
12442
- describe: function describe(e) {
12443
- 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);
12444
- return {
12445
- name: s.OS_MAP.BlackBerry,
12446
- version: t
12447
- };
12448
- }
12449
- }, {
12450
- test: [/bada/i],
12451
- describe: function describe(e) {
12452
- var t = i.default.getFirstMatch(/bada\/(\d+(\.\d+)*)/i, e);
12453
- return {
12454
- name: s.OS_MAP.Bada,
12455
- version: t
12456
- };
12457
- }
12458
- }, {
12459
- test: [/tizen/i],
12460
- describe: function describe(e) {
12461
- var t = i.default.getFirstMatch(/tizen[/\s](\d+(\.\d+)*)/i, e);
12462
- return {
12463
- name: s.OS_MAP.Tizen,
12464
- version: t
12465
- };
12466
- }
12467
- }, {
12468
- test: [/linux/i],
12469
- describe: function describe() {
12470
- return {
12471
- name: s.OS_MAP.Linux
12472
- };
12473
- }
12474
- }, {
12475
- test: [/CrOS/],
12476
- describe: function describe() {
12477
- return {
12478
- name: s.OS_MAP.ChromeOS
12479
- };
12480
- }
12481
- }, {
12482
- test: [/PlayStation 4/],
12483
- describe: function describe(e) {
12484
- var t = i.default.getFirstMatch(/PlayStation 4[/\s](\d+(\.\d+)*)/i, e);
12485
- return {
12486
- name: s.OS_MAP.PlayStation4,
12487
- version: t
12488
- };
12489
- }
12490
- }];
12491
- t.default = a, e.exports = t.default;
12492
- },
12493
- 94: function _(e, t, r) {
12494
- t.__esModule = !0, t.default = void 0;
12495
- var n,
12496
- i = (n = r(17)) && n.__esModule ? n : {
12497
- default: n
12498
- },
12499
- s = r(18);
12500
- var a = [{
12501
- test: [/googlebot/i],
12502
- describe: function describe() {
12503
- return {
12504
- type: "bot",
12505
- vendor: "Google"
12506
- };
12507
- }
12508
- }, {
12509
- test: [/huawei/i],
12510
- describe: function describe(e) {
12511
- var t = i.default.getFirstMatch(/(can-l01)/i, e) && "Nova",
12512
- r = {
12513
- type: s.PLATFORMS_MAP.mobile,
12514
- vendor: "Huawei"
12515
- };
12516
- return t && (r.model = t), r;
12517
- }
12518
- }, {
12519
- test: [/nexus\s*(?:7|8|9|10).*/i],
12520
- describe: function describe() {
12521
- return {
12522
- type: s.PLATFORMS_MAP.tablet,
12523
- vendor: "Nexus"
12524
- };
12525
- }
12526
- }, {
12527
- test: [/ipad/i],
12528
- describe: function describe() {
12529
- return {
12530
- type: s.PLATFORMS_MAP.tablet,
12531
- vendor: "Apple",
12532
- model: "iPad"
12533
- };
12534
- }
12535
- }, {
12536
- test: [/Macintosh(.*?) FxiOS(.*?)\//],
12537
- describe: function describe() {
12538
- return {
12539
- type: s.PLATFORMS_MAP.tablet,
12540
- vendor: "Apple",
12541
- model: "iPad"
12542
- };
12543
- }
12544
- }, {
12545
- test: [/kftt build/i],
12546
- describe: function describe() {
12547
- return {
12548
- type: s.PLATFORMS_MAP.tablet,
12549
- vendor: "Amazon",
12550
- model: "Kindle Fire HD 7"
12551
- };
12552
- }
12553
- }, {
12554
- test: [/silk/i],
12555
- describe: function describe() {
12556
- return {
12557
- type: s.PLATFORMS_MAP.tablet,
12558
- vendor: "Amazon"
12559
- };
12560
- }
12561
- }, {
12562
- test: [/tablet(?! pc)/i],
12563
- describe: function describe() {
12564
- return {
12565
- type: s.PLATFORMS_MAP.tablet
12566
- };
12567
- }
12568
- }, {
12569
- test: function test(e) {
12570
- var t = e.test(/ipod|iphone/i),
12571
- r = e.test(/like (ipod|iphone)/i);
12572
- return t && !r;
12573
- },
12574
- describe: function describe(e) {
12575
- var t = i.default.getFirstMatch(/(ipod|iphone)/i, e);
12576
- return {
12577
- type: s.PLATFORMS_MAP.mobile,
12578
- vendor: "Apple",
12579
- model: t
12580
- };
12581
- }
12582
- }, {
12583
- test: [/nexus\s*[0-6].*/i, /galaxy nexus/i],
12584
- describe: function describe() {
12585
- return {
12586
- type: s.PLATFORMS_MAP.mobile,
12587
- vendor: "Nexus"
12588
- };
12589
- }
12590
- }, {
12591
- test: [/[^-]mobi/i],
12592
- describe: function describe() {
12593
- return {
12594
- type: s.PLATFORMS_MAP.mobile
12595
- };
12596
- }
12597
- }, {
12598
- test: function test(e) {
12599
- return "blackberry" === e.getBrowserName(!0);
12600
- },
12601
- describe: function describe() {
12602
- return {
12603
- type: s.PLATFORMS_MAP.mobile,
12604
- vendor: "BlackBerry"
12605
- };
12606
- }
12607
- }, {
12608
- test: function test(e) {
12609
- return "bada" === e.getBrowserName(!0);
12610
- },
12611
- describe: function describe() {
12612
- return {
12613
- type: s.PLATFORMS_MAP.mobile
12614
- };
12615
- }
12616
- }, {
12617
- test: function test(e) {
12618
- return "windows phone" === e.getBrowserName();
12619
- },
12620
- describe: function describe() {
12621
- return {
12622
- type: s.PLATFORMS_MAP.mobile,
12623
- vendor: "Microsoft"
12624
- };
12625
- }
12626
- }, {
12627
- test: function test(e) {
12628
- var t = Number(String(e.getOSVersion()).split(".")[0]);
12629
- return "android" === e.getOSName(!0) && t >= 3;
12630
- },
12631
- describe: function describe() {
12632
- return {
12633
- type: s.PLATFORMS_MAP.tablet
12634
- };
12635
- }
12636
- }, {
12637
- test: function test(e) {
12638
- return "android" === e.getOSName(!0);
12639
- },
12640
- describe: function describe() {
12641
- return {
12642
- type: s.PLATFORMS_MAP.mobile
12643
- };
12644
- }
12645
- }, {
12646
- test: function test(e) {
12647
- return "macos" === e.getOSName(!0);
12648
- },
12649
- describe: function describe() {
12650
- return {
12651
- type: s.PLATFORMS_MAP.desktop,
12652
- vendor: "Apple"
12653
- };
12654
- }
12655
- }, {
12656
- test: function test(e) {
12657
- return "windows" === e.getOSName(!0);
12658
- },
12659
- describe: function describe() {
12660
- return {
12661
- type: s.PLATFORMS_MAP.desktop
12662
- };
12663
- }
12664
- }, {
12665
- test: function test(e) {
12666
- return "linux" === e.getOSName(!0);
12667
- },
12668
- describe: function describe() {
12669
- return {
12670
- type: s.PLATFORMS_MAP.desktop
12671
- };
12672
- }
12673
- }, {
12674
- test: function test(e) {
12675
- return "playstation 4" === e.getOSName(!0);
12676
- },
12677
- describe: function describe() {
12678
- return {
12679
- type: s.PLATFORMS_MAP.tv
12680
- };
12681
- }
12682
- }, {
12683
- test: function test(e) {
12684
- return "roku" === e.getOSName(!0);
12685
- },
12686
- describe: function describe() {
12687
- return {
12688
- type: s.PLATFORMS_MAP.tv
12689
- };
12690
- }
12691
- }];
12692
- t.default = a, e.exports = t.default;
12693
- },
12694
- 95: function _(e, t, r) {
12695
- t.__esModule = !0, t.default = void 0;
12696
- var n,
12697
- i = (n = r(17)) && n.__esModule ? n : {
12698
- default: n
12699
- },
12700
- s = r(18);
12701
- var a = [{
12702
- test: function test(e) {
12703
- return "microsoft edge" === e.getBrowserName(!0);
12704
- },
12705
- describe: function describe(e) {
12706
- if (/\sedg\//i.test(e)) return {
12707
- name: s.ENGINE_MAP.Blink
12708
- };
12709
- var t = i.default.getFirstMatch(/edge\/(\d+(\.?_?\d+)+)/i, e);
12710
- return {
12711
- name: s.ENGINE_MAP.EdgeHTML,
12712
- version: t
12713
- };
12714
- }
12715
- }, {
12716
- test: [/trident/i],
12717
- describe: function describe(e) {
12718
- var t = {
12719
- name: s.ENGINE_MAP.Trident
12720
- },
12721
- r = i.default.getFirstMatch(/trident\/(\d+(\.?_?\d+)+)/i, e);
12722
- return r && (t.version = r), t;
12723
- }
12724
- }, {
12725
- test: function test(e) {
12726
- return e.test(/presto/i);
12727
- },
12728
- describe: function describe(e) {
12729
- var t = {
12730
- name: s.ENGINE_MAP.Presto
12731
- },
12732
- r = i.default.getFirstMatch(/presto\/(\d+(\.?_?\d+)+)/i, e);
12733
- return r && (t.version = r), t;
12734
- }
12735
- }, {
12736
- test: function test(e) {
12737
- var t = e.test(/gecko/i),
12738
- r = e.test(/like gecko/i);
12739
- return t && !r;
12740
- },
12741
- describe: function describe(e) {
12742
- var t = {
12743
- name: s.ENGINE_MAP.Gecko
12744
- },
12745
- r = i.default.getFirstMatch(/gecko\/(\d+(\.?_?\d+)+)/i, e);
12746
- return r && (t.version = r), t;
12747
- }
12748
- }, {
12749
- test: [/(apple)?webkit\/537\.36/i],
12750
- describe: function describe() {
12751
- return {
12752
- name: s.ENGINE_MAP.Blink
12753
- };
12754
- }
12755
- }, {
12756
- test: [/(apple)?webkit/i],
12757
- describe: function describe(e) {
12758
- var t = {
12759
- name: s.ENGINE_MAP.WebKit
12760
- },
12761
- r = i.default.getFirstMatch(/webkit\/(\d+(\.?_?\d+)+)/i, e);
12762
- return r && (t.version = r), t;
12763
- }
12764
- }];
12765
- t.default = a, e.exports = t.default;
12766
11877
  }
12767
- });
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;
12768
11899
  });
12769
- })(es5);
12770
- var Bowser = /*@__PURE__*/getDefaultExportFromCjs(es5.exports);
12771
- function getBrowserDetails() {
12772
- var browser = Bowser.getParser(window.navigator.userAgent);
12773
- return browser.getBrowser();
12774
11900
  }
12775
- var ReceiveSlotEvents;
12776
- (function (ReceiveSlotEvents) {
12777
- ReceiveSlotEvents["MediaStarted"] = "media-started";
12778
- ReceiveSlotEvents["MediaStopped"] = "media-stopped";
12779
- ReceiveSlotEvents["SourceUpdate"] = "source-update";
12780
- })(ReceiveSlotEvents || (ReceiveSlotEvents = {}));
12781
- class ReceiveSlot extends EventEmitter {
12782
- constructor(idGetter, track) {
12783
- super();
12784
- this._idGetter = idGetter;
12785
- this.handleTrackMuted = this.handleTrackMuted.bind(this);
12786
- this.handleTrackUnmuted = this.handleTrackUnmuted.bind(this);
12787
- this._stream = new MediaStream([track]);
12788
- this.addTrackHandlers(track);
12789
- }
12790
- addTrackHandlers(track) {
12791
- track.addEventListener('mute', this.handleTrackMuted);
12792
- track.addEventListener('unmute', this.handleTrackUnmuted);
12793
- }
12794
- handleTrackMuted() {
12795
- this.emit(ReceiveSlotEvents.MediaStopped);
12796
- }
12797
- handleTrackUnmuted() {
12798
- this.emit(ReceiveSlotEvents.MediaStarted);
12799
- }
12800
- removeTrackHandlers(track) {
12801
- track.removeEventListener('mute', this.handleTrackMuted);
12802
- track.removeEventListener('unmute', this.handleTrackUnmuted);
12803
- }
12804
- replaceTrack(newTrack) {
12805
- var _a;
12806
- var trackToRemove = (_a = this._stream.getTracks()) === null || _a === void 0 ? void 0 : _a[0];
12807
- if (trackToRemove) {
12808
- this._stream.removeTrack(trackToRemove);
12809
- 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"));
12810
11906
  }
12811
- this.addTrackHandlers(newTrack);
12812
- this._stream.addTrack(newTrack);
12813
- }
12814
- _updateSource(state, csi) {
12815
- this.currentRxCsi = csi;
12816
- this.emit(ReceiveSlotEvents.SourceUpdate, state, csi);
12817
- }
12818
- close() {
12819
- this._stream.getTracks().forEach(t => {
12820
- this.removeTrackHandlers(t);
12821
- });
12822
- }
12823
- get id() {
12824
- return this._idGetter();
12825
- }
12826
- get stream() {
12827
- return this._stream;
12828
- }
11907
+ if (mediaContent === MediaContent$1.Slides) {
11908
+ mline.addLine(new ContentLine(['slides']));
11909
+ }
11910
+ });
12829
11911
  }
12830
- ReceiveSlot.Events = ReceiveSlotEvents;
12831
- class Transceiver {
12832
- constructor(rtcRtpTransceiver) {
12833
- this._rtcRtpTransceiver = rtcRtpTransceiver;
12834
- }
12835
- replaceTransceiver(newRtcRtpTransceiver) {
12836
- this._rtcRtpTransceiver = newRtcRtpTransceiver;
12837
- }
12838
- getReceiverStats() {
12839
- return this._rtcRtpTransceiver.receiver.getStats();
12840
- }
12841
- getSenderStats() {
12842
- return this._rtcRtpTransceiver.sender.getStats();
12843
- }
12844
- get receiver() {
12845
- return this._rtcRtpTransceiver.receiver;
12846
- }
12847
- get sender() {
12848
- return this._rtcRtpTransceiver.sender;
12849
- }
12850
- get mid() {
12851
- return this._rtcRtpTransceiver.mid;
12852
- }
12853
- close() {
12854
- this._rtcRtpTransceiver.stop();
12855
- }
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
+ });
12856
11929
  }
12857
- class ReceiveOnlyTransceiver extends Transceiver {
12858
- constructor(rtcRtpTransceiver, idGetter) {
12859
- super(rtcRtpTransceiver);
12860
- this._receiveSlot = new ReceiveSlot(() => {
12861
- if (!this._rtcRtpTransceiver.mid) {
12862
- 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);
12863
11942
  }
12864
- return idGetter(this._rtcRtpTransceiver.mid);
12865
- }, this._rtcRtpTransceiver.receiver.track);
11943
+ });
12866
11944
  }
12867
- replaceTransceiver(newRtcRtpTransceiver) {
12868
- super.replaceTransceiver(newRtcRtpTransceiver);
12869
- 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
+ });
12870
11957
  }
12871
- close() {
12872
- super.close();
12873
- 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
+ });
12874
11967
  }
12875
- get receiveSlot() {
12876
- 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
+ });
12877
11985
  }
12878
- }
12879
- ReceiveOnlyTransceiver.rid = '1';
12880
- class JmpLine extends Line {
12881
- static fromSdpLine(line) {
12882
- if (!JmpLine.regex.test(line)) {
12883
- return undefined;
11986
+ getScaleDownRatio(expectedMaxFs) {
11987
+ var _a;
11988
+ if (!expectedMaxFs) {
11989
+ return -1;
12884
11990
  }
12885
- 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);
12886
12001
  }
12887
- toSdpLine() {
12888
- return "a=jmp";
12002
+ publishTrack(track) {
12003
+ return this.replacePublishedTrack(track);
12889
12004
  }
12890
- }
12891
- JmpLine.regex = /^jmp$/;
12892
- class JmpStreamIdModeLine extends Line {
12893
- constructor(streamIdMode) {
12894
- super();
12895
- this.streamIdMode = streamIdMode;
12005
+ unpublishTrack() {
12006
+ return this.replacePublishedTrack();
12896
12007
  }
12897
- static fromSdpLine(line) {
12898
- if (!JmpStreamIdModeLine.regex.test(line)) {
12899
- 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");
12900
12018
  }
12901
- var tokens = line.match(JmpStreamIdModeLine.regex);
12902
- var mode = tokens[1];
12903
- 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;
12904
12027
  }
12905
- toSdpLine() {
12906
- return "a=jmp-stream-id-mode:".concat(this.streamIdMode);
12028
+ getStats() {
12029
+ return this.sender.getStats();
12907
12030
  }
12908
12031
  }
12909
- JmpStreamIdModeLine.regex = /^jmp-stream-id-mode:(MID-RID|SSRC)$/;
12910
- class JmpSourceLine extends Line {
12911
- constructor(source, csi) {
12912
- super();
12913
- this.source = source;
12914
- this.csi = csi;
12915
- }
12916
- static fromSdpLine(line) {
12917
- if (!JmpSourceLine.regex.test(line)) {
12918
- return undefined;
12919
- }
12920
- var tokens = line.match(JmpSourceLine.regex);
12921
- var source = tokens[1];
12922
- var csi = tokens[2];
12923
- 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;
12924
12037
  }
12925
- toSdpLine() {
12926
- var line = "a=jmp-source:".concat(this.source);
12927
- if (this.csi) {
12928
- line += " csi=".concat(this.csi);
12929
- }
12930
- 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
+ });
12931
12048
  }
12932
12049
  }
12933
- JmpSourceLine.regex = new RegExp("^jmp-source:(".concat(ANY_NON_WS, ") (?:csi=(").concat(ANY_NON_WS, "))"));
12934
- DefaultSdpGrammar.addParser('a', JmpLine.fromSdpLine);
12935
- DefaultSdpGrammar.addParser('a', JmpSourceLine.fromSdpLine);
12936
- DefaultSdpGrammar.addParser('a', JmpStreamIdModeLine.fromSdpLine);
12937
- function deepCopy(source) {
12938
- 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) => {
12939
- Object.defineProperty(o, prop, Object.getOwnPropertyDescriptor(source, prop));
12940
- o[prop] = deepCopy(source[prop]);
12941
- return o;
12942
- }, Object.create(Object.getPrototypeOf(source))) : source;
12943
- }
12944
- function getMediaTypeForMline(mLine) {
12945
- var _a, _b;
12946
- var mediaFamily;
12947
- if (mLine.type.toLowerCase() === MediaFamily$1.Audio.toLowerCase()) {
12948
- mediaFamily = MediaFamily$1.Audio;
12949
- } else if (mLine.type.toLowerCase() === MediaFamily$1.Video.toLowerCase()) {
12950
- mediaFamily = MediaFamily$1.Video;
12951
- } else {
12952
- 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;
12953
12058
  }
12954
- var mediaContent;
12955
- 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')) {
12956
- mediaContent = MediaContent$1.Slides;
12957
- } else {
12958
- mediaContent = MediaContent$1.Main;
12059
+ getReceiverId() {
12060
+ return {
12061
+ mid: this.mid,
12062
+ rid: '1'
12063
+ };
12959
12064
  }
12960
- return getMediaType(mediaFamily, mediaContent);
12961
- }
12962
- function filterCodecs(parsedSdp, allowedCodecs) {
12963
- var allowedLowerCase = allowedCodecs.map(s => s.toLowerCase());
12964
- parsedSdp.avMedia.map(m => [...m.codecs.values()].map(c => c.name)).flat().filter(codecName => !allowedLowerCase.includes(codecName.toLowerCase())).forEach(c => removeCodec(parsedSdp, c));
12965
- }
12966
- function setMaxBandwidth(parsedSdp, maxBandwidth) {
12967
- parsedSdp.avMedia.forEach(mline => {
12968
- mline.bandwidth = new BandwidthLine('TIAS', maxBandwidth);
12969
- });
12065
+ signalLocalStreams(mLine) {}
12066
+ signalRemoteStreams(mLine) {}
12970
12067
  }
12971
- function setupBundle(parsedSdp, bundlePolicy) {
12972
- if (bundlePolicy === 'compat') {
12973
- var audioMids = parsedSdp.avMedia.filter(m => m.type === 'audio').map(m => m.mid);
12974
- var videoMids = parsedSdp.avMedia.filter(m => m.type === 'video').map(m => m.mid);
12975
- parsedSdp.session.groups.splice(0, parsedSdp.session.groups.length);
12976
- parsedSdp.session.groups.push(new BundleGroupLine(audioMids));
12977
- parsedSdp.session.groups.push(new BundleGroupLine(videoMids));
12068
+ class RidEgressStreamSignaler {
12069
+ constructor(mid) {
12070
+ this.streamIds = [];
12071
+ this.mid = mid;
12978
12072
  }
12979
- }
12980
- function filterRecvOnlyMlines(parsedSdp) {
12981
- var filteredMids = [];
12982
- parsedSdp.media = parsedSdp.media.filter(mLine => {
12983
- if (mLine instanceof ApplicationMediaDescription || mLine instanceof AvMediaDescription && mLine.direction !== 'recvonly') {
12984
- filteredMids.push(mLine.mid);
12985
- return true;
12986
- }
12987
- return false;
12988
- });
12989
- parsedSdp.session.groups.forEach(g => {
12990
- g.mids = g.mids.filter(m => filteredMids.includes(m));
12991
- });
12992
- }
12993
- function matchMlinesInAnswer(parsedOffer, parsedAnswer, streamSignalerManager) {
12994
- parsedAnswer.session.groups = parsedOffer.session.groups;
12995
- parsedAnswer.media = parsedOffer.media.map(offerMline => {
12996
- if (!offerMline.mid) {
12997
- throw new Error("Offer mline is missing MID");
12998
- }
12999
- var answerMline = parsedAnswer.media.find(m => m.mid === offerMline.mid);
13000
- if (answerMline) {
13001
- if (answerMline instanceof AvMediaDescription) {
13002
- [...answerMline.codecs.values()].forEach(ci => {
13003
- ci.fmtParams.push('x-google-start-bitrate=60000');
13004
- });
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
+ }];
13005
12091
  }
13006
- return answerMline;
13007
12092
  }
13008
- if (!(offerMline instanceof AvMediaDescription)) {
13009
- 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());
13010
12096
  }
13011
- var startingMline = parsedAnswer.avMedia.find(m => m.type === offerMline.type);
13012
- if (!startingMline) {
13013
- 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]));
13014
12128
  }
13015
- var fakeCorrespondingMline = deepCopy(startingMline);
13016
- fakeCorrespondingMline.mid = offerMline.mid;
13017
- fakeCorrespondingMline.simulcast = undefined;
13018
- if (offerMline.direction === 'sendrecv' || offerMline.direction === 'sendonly') {
13019
- 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
+ });
13020
12151
  }
13021
- if (offerMline.direction === 'recvonly') {
13022
- fakeCorrespondingMline.direction = 'sendonly';
13023
- var ingressSignaler = streamSignalerManager.getIngressStreamSignalerOrThrow(offerMline.mid);
13024
- 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)));
13025
12165
  }
13026
- return fakeCorrespondingMline;
13027
- });
12166
+ }
12167
+ getSenderIds() {
12168
+ return this.streamIds;
12169
+ }
12170
+ getEncodingIndexForStreamId(streamId) {
12171
+ return this.streamIds.findIndex(currStreamId => compareStreamIds(currStreamId, streamId));
12172
+ }
13028
12173
  }
13029
- function injectContentTypes(sdp, contentTypeMap) {
13030
- contentTypeMap.forEach((mediaContent, mid) => {
13031
- var mline = sdp.media.find(m => m.mid === mid);
13032
- if (!mline) {
13033
- 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;
13034
12185
  }
13035
- if (mediaContent === MediaContent$1.Slides) {
13036
- 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();
13037
12191
  }
13038
- });
13039
- }
13040
- function injectJmpAttributes(parsedSdp, csiMap, streamSignalingMode) {
13041
- parsedSdp.avMedia.filter(mLine => mLine.direction === 'sendrecv' || mLine.direction === 'sendonly').forEach(mLine => {
13042
- if (!mLine.otherLines.find(line => line instanceof JmpLine)) {
13043
- 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));
13044
12199
  }
13045
- if (!mLine.otherLines.find(line => line instanceof JmpSourceLine)) {
13046
- var mediaType = getMediaTypeForMline(mLine);
13047
- var csi = csiMap.get(mediaType);
13048
- if (!csi) {
13049
- throw new Error("Unable to find CSI for MediaType ".concat(mediaType));
13050
- }
13051
- 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;
13052
12209
  }
13053
- if (!mLine.otherLines.find(line => line instanceof JmpStreamIdModeLine)) {
13054
- 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();
13055
12215
  }
13056
- });
13057
- }
13058
- class SendOnlyTransceiver extends Transceiver {
13059
- constructor(rtcpRtpTransceiver, csi) {
13060
- super(rtcpRtpTransceiver);
13061
- this.requested = false;
13062
- this.csi = csi;
13063
- this.handleTrackChange = this.handleTrackChange.bind(this);
12216
+ this.ingressStreamsSignalersByMid.set(mid, newSignaler);
12217
+ return newSignaler;
13064
12218
  }
13065
- handleTrackChange() {
13066
- var _a;
13067
- return __awaiter(this, void 0, void 0, function* () {
13068
- if (this.requested) {
13069
- yield this.sender.replaceTrack(((_a = this.publishedTrack) === null || _a === void 0 ? void 0 : _a.underlyingTrack) || null);
13070
- }
13071
- });
12219
+ getIngressStreamSignaler(mid) {
12220
+ return this.ingressStreamsSignalersByMid.get(mid);
13072
12221
  }
13073
- replacePublishedTrack(newTrack) {
13074
- var _a, _b;
13075
- return __awaiter(this, void 0, void 0, function* () {
13076
- (_a = this.publishedTrack) === null || _a === void 0 ? void 0 : _a.off(LocalTrackEvents.UnderlyingTrackChange, this.handleTrackChange);
13077
- (_b = this.publishedTrack) === null || _b === void 0 ? void 0 : _b.setPublished(false);
13078
- if (this.requested) {
13079
- yield this.sender.replaceTrack((newTrack === null || newTrack === void 0 ? void 0 : newTrack.underlyingTrack) || null);
13080
- }
13081
- this.publishedTrack = newTrack;
13082
- newTrack === null || newTrack === void 0 ? void 0 : newTrack.on(LocalTrackEvents.UnderlyingTrackChange, this.handleTrackChange);
13083
- newTrack === null || newTrack === void 0 ? void 0 : newTrack.setPublished(true);
13084
- });
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;
13085
12228
  }
13086
- setTrackRequested(requested) {
13087
- var _a;
13088
- return __awaiter(this, void 0, void 0, function* () {
13089
- if (this.requested !== requested) {
13090
- this.requested = requested;
13091
- var newTrack = requested ? ((_a = this.publishedTrack) === null || _a === void 0 ? void 0 : _a.underlyingTrack) || null : null;
13092
- 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;
13093
12247
  }
13094
- });
13095
- }
13096
- updateSimulcastStreamStates(requestedIdEncodingParamsMap) {
13097
- return __awaiter(this, void 0, void 0, function* () {
13098
- var sendParameters = this.sender.getParameters();
13099
- sendParameters.encodings.forEach((encoding, index) => {
13100
- var encodingParams = requestedIdEncodingParamsMap.get(index);
13101
- encoding.active = Boolean(encodingParams);
13102
- if (encodingParams) {
13103
- if (encodingParams.scaleDownRatio >= 1 && encoding.scaleResolutionDownBy !== encodingParams.scaleDownRatio) {
13104
- 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
+ };
13105
13304
  }
13106
- if (encodingParams.maxPayloadBitsPerSecond) {
13107
- 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
+ };
13108
13493
  }
13109
- }
13110
- });
13111
- yield this.sender.setParameters(sendParameters);
13112
- });
13113
- }
13114
- getScaleDownRatio(expectedMaxFs) {
13115
- var _a;
13116
- if (!expectedMaxFs) {
13117
- return -1;
13118
- }
13119
- if (!this.publishedTrack) {
13120
- return -1;
13121
- }
13122
- var setting = (_a = this.publishedTrack) === null || _a === void 0 ? void 0 : _a.underlyingTrack.getSettings();
13123
- var sourceHeight = setting === null || setting === void 0 ? void 0 : setting.height;
13124
- var sourceWidth = setting === null || setting === void 0 ? void 0 : setting.width;
13125
- if (!sourceWidth || !sourceHeight) {
13126
- return -1;
13127
- }
13128
- return getScaleDownRatio([sourceWidth, sourceHeight], sourceHeight, expectedMaxFs);
13129
- }
13130
- publishTrack(track) {
13131
- return this.replacePublishedTrack(track);
13132
- }
13133
- unpublishTrack() {
13134
- return this.replacePublishedTrack();
13135
- }
13136
- setActive(enabled) {
13137
- var direction = enabled ? 'sendrecv' : 'inactive';
13138
- this._rtcRtpTransceiver.direction = direction;
13139
- return this._rtcRtpTransceiver.direction !== this._rtcRtpTransceiver.currentDirection;
13140
- }
13141
- getIngressPayloadType(mimeType) {
13142
- var senderCodecs = this.sender.getParameters().codecs.filter(codec => codec.mimeType === mimeType);
13143
- var receiverCodecs = this.receiver.getParameters().codecs.filter(codec => codec.mimeType === mimeType);
13144
- if (!senderCodecs || !receiverCodecs || senderCodecs.length === 0 || receiverCodecs.length === 0) {
13145
- throw new Error("sender codecs or receiver codecs is undefined or empty");
13146
- }
13147
- var senderCodec = senderCodecs[0];
13148
- var targetCodec = receiverCodecs.find(receiverCodec => {
13149
- return areCodecsCompatible(senderCodec, receiverCodec);
13150
- });
13151
- if (!targetCodec || !targetCodec.payloadType) {
13152
- throw new Error("ingress payload type is not well defined in receiver codecs");
13153
- }
13154
- return targetCodec.payloadType;
13155
- }
13156
- }
13157
- var simulcastMaxFrameSizes = {
13158
- 0: '240',
13159
- 1: '2304',
13160
- 2: '8160'
13161
- };
13162
- class RidIngressStreamSignaler {
13163
- constructor(mid) {
13164
- this.mid = mid;
13165
- }
13166
- getReceiverId() {
13167
- return {
13168
- mid: this.mid,
13169
- rid: '1'
13170
- };
13171
- }
13172
- signalLocalStreams(mLine) {}
13173
- signalRemoteStreams(mLine) {}
13174
- }
13175
- class RidEgressStreamSignaler {
13176
- constructor(mid) {
13177
- this.streamIds = [];
13178
- this.mid = mid;
13179
- }
13180
- signalStreams(simulcastEnabled, _rtxEnabled, mLine) {
13181
- mLine.ssrcGroups = [];
13182
- if (this.streamIds.length === 0) {
13183
- if (simulcastEnabled) {
13184
- this.streamIds = [{
13185
- mid: this.mid,
13186
- rid: 'low'
13187
13494
  }, {
13188
- mid: this.mid,
13189
- 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
+ }
13190
13503
  }, {
13191
- mid: this.mid,
13192
- rid: 'high'
13193
- }];
13194
- } else {
13195
- this.streamIds = [{
13196
- 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
+ }
13197
13543
  }];
13198
- }
13199
- }
13200
- if (simulcastEnabled) {
13201
- mLine.rids = this.streamIds.map((streamId, index) => new RidLine(streamId.rid, 'send', "max-fs=".concat(simulcastMaxFrameSizes[index])));
13202
- mLine.simulcast = new SimulcastLine(SimulcastLayerList.fromString('low;medium;high'), new SimulcastLayerList());
13203
- }
13204
- }
13205
- getSenderIds() {
13206
- return this.streamIds;
13207
- }
13208
- getEncodingIndexForStreamId(streamId) {
13209
- return this.streamIds.findIndex(currStreamId => compareStreamIds(currStreamId, streamId));
13210
- }
13211
- }
13212
- function generateSsrc() {
13213
- return Math.floor(Math.random() * 0xffffffff);
13214
- }
13215
- class SsrcIngressStreamSignaler {
13216
- constructor() {
13217
- this.ssrc = generateSsrc();
13218
- }
13219
- getReceiverId() {
13220
- return Object.assign({
13221
- ssrc: this.ssrc
13222
- }, this.rtxSsrc ? {
13223
- rtxSsrc: this.rtxSsrc
13224
- } : {});
13225
- }
13226
- signalLocalStreams(_mLine) {}
13227
- signalRemoteStreams(mLine) {
13228
- mLine.addLine(new SsrcLine(this.ssrc, 'cname', "".concat(this.ssrc, "-cname")));
13229
- mLine.addLine(new SsrcLine(this.ssrc, 'msid', '-', '1'));
13230
- if (hasCodec('rtx', mLine)) {
13231
- this.rtxSsrc = generateSsrc();
13232
- mLine.addLine(new SsrcLine(this.rtxSsrc, 'cname', "".concat(this.ssrc, "-cname")));
13233
- mLine.addLine(new SsrcLine(this.rtxSsrc, 'msid', '-', '1'));
13234
- mLine.addLine(new SsrcGroupLine('FID', [this.ssrc, this.rtxSsrc]));
13235
- }
13236
- }
13237
- }
13238
- class SsrcEgressStreamSignaler {
13239
- constructor() {
13240
- this.streamIds = [];
13241
- }
13242
- signalStreams(simulcastEnabled, rtxEnabled, mLine) {
13243
- mLine.rids = [];
13244
- mLine.simulcast = undefined;
13245
- mLine.ssrcs = [];
13246
- mLine.ssrcGroups = [];
13247
- if (this.streamIds.length === 0) {
13248
- var numStreams = simulcastEnabled ? 3 : 1;
13249
- [...Array(numStreams).keys()].forEach(() => {
13250
- var newStreamId = {
13251
- ssrc: generateSsrc()
13252
- };
13253
- if (rtxEnabled) {
13254
- newStreamId.rtxSsrc = generateSsrc();
13255
- }
13256
- this.streamIds.push(newStreamId);
13257
- });
13258
- }
13259
- this.streamIds.forEach((streamId, index) => {
13260
- var rtpSsrc = streamId.ssrc;
13261
- mLine.addLine(new SsrcLine(rtpSsrc, 'cname', "".concat(rtpSsrc, "-cname")));
13262
- mLine.addLine(new SsrcLine(rtpSsrc, 'msid', '-', '1'));
13263
- if (simulcastEnabled) {
13264
- mLine.addLine(new SsrcLine(rtpSsrc, 'fmtp', "* max-fs=".concat(simulcastMaxFrameSizes[index])));
13265
- }
13266
- if (rtxEnabled) {
13267
- var rtxSsrc = streamId.rtxSsrc;
13268
- mLine.addLine(new SsrcLine(rtxSsrc, 'cname', "".concat(rtpSsrc, "-cname")));
13269
- mLine.addLine(new SsrcLine(rtxSsrc, 'msid', '-', '1'));
13270
- mLine.addLine(new SsrcGroupLine('FID', [rtpSsrc, rtxSsrc]));
13544
+ t.default = a, e.exports = t.default;
13271
13545
  }
13272
13546
  });
13273
- if (simulcastEnabled) {
13274
- mLine.addLine(new SsrcGroupLine('SIM', this.streamIds.map(streamId => streamId.ssrc)));
13275
- }
13276
- }
13277
- getSenderIds() {
13278
- return this.streamIds;
13279
- }
13280
- getEncodingIndexForStreamId(streamId) {
13281
- return this.streamIds.findIndex(currStreamId => compareStreamIds(currStreamId, streamId));
13282
- }
13283
- }
13284
- class StreamSignalerManager {
13285
- constructor(streamSignalingMode) {
13286
- this.egressStreamSignalersByMid = new Map();
13287
- this.ingressStreamsSignalersByMid = new Map();
13288
- this.ingressStreamSignalingMode = streamSignalingMode;
13289
- this.egressStreamSignalingMode = streamSignalingMode;
13290
- }
13291
- getOrCreateEgressStreamSignaler(mid) {
13292
- var existing = this.getEgressStreamSignaler(mid);
13293
- if (existing) {
13294
- return existing;
13295
- }
13296
- var newSignaler;
13297
- if (this.egressStreamSignalingMode === 'MID-RID') {
13298
- newSignaler = new RidEgressStreamSignaler(mid);
13299
- } else {
13300
- newSignaler = new SsrcEgressStreamSignaler();
13301
- }
13302
- this.egressStreamSignalersByMid.set(mid, newSignaler);
13303
- return newSignaler;
13304
- }
13305
- getEgressStreamSignalerOrThrow(mid) {
13306
- var existing = this.getEgressStreamSignaler(mid);
13307
- if (!existing) {
13308
- throw new Error("Couldn't find EgressStreamSignaler for mid ".concat(mid));
13309
- }
13310
- return existing;
13311
- }
13312
- getEgressStreamSignaler(mid) {
13313
- return this.egressStreamSignalersByMid.get(mid);
13314
- }
13315
- getOrCreateIngressStreamSignaler(mid) {
13316
- var existing = this.getIngressStreamSignaler(mid);
13317
- if (existing) {
13318
- return existing;
13319
- }
13320
- var newSignaler;
13321
- if (this.ingressStreamSignalingMode === 'MID-RID') {
13322
- newSignaler = new RidIngressStreamSignaler(mid);
13323
- } else {
13324
- newSignaler = new SsrcIngressStreamSignaler();
13325
- }
13326
- this.ingressStreamsSignalersByMid.set(mid, newSignaler);
13327
- return newSignaler;
13328
- }
13329
- getIngressStreamSignaler(mid) {
13330
- return this.ingressStreamsSignalersByMid.get(mid);
13331
- }
13332
- getIngressStreamSignalerOrThrow(mid) {
13333
- var existing = this.getIngressStreamSignaler(mid);
13334
- if (!existing) {
13335
- throw new Error("Couldn't find IngressStreamSignaler for mid ".concat(mid));
13336
- }
13337
- return existing;
13338
- }
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();
13339
13553
  }
13340
13554
  var logger$1 = {
13341
13555
  exports: {}
@@ -13628,7 +13842,7 @@ var MultistreamConnectionEventNames;
13628
13842
  var defaultMultistreamConnectionOptions = {
13629
13843
  floorControlledPresentation: false,
13630
13844
  disableSimulcast: false,
13631
- streamSignalingMode: 'MID-RID',
13845
+ streamSignalingMode: 'SSRC',
13632
13846
  bundlePolicy: 'compat'
13633
13847
  };
13634
13848
  class MultistreamConnection extends EventEmitter {
@@ -13640,43 +13854,49 @@ class MultistreamConnection extends EventEmitter {
13640
13854
  this.jmpSessions = new Map();
13641
13855
  this.pendingJmpTasks = [];
13642
13856
  this.metricsCallback = () => {};
13857
+ this.overuseUpdateCallback = () => {};
13643
13858
  this.options = Object.assign(Object.assign({}, defaultMultistreamConnectionOptions), userOptions);
13644
13859
  logger$4.info("Creating multistream connection with options ".concat(JSON.stringify(this.options)));
13645
- this.pc = new PeerConnection();
13646
- this.pc.on(PeerConnection.Events.ConnectionStateChange, state => this.emit(MultistreamConnectionEventNames.ConnectionStateUpdate, state));
13860
+ this.initializePeerConnection();
13647
13861
  this.streamSignalerManager = new StreamSignalerManager(this.options.streamSignalingMode);
13648
- 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));
13649
13865
  var mainSceneId = generateSceneId();
13650
- var videoMainEncodingOptions = !this.options.disableSimulcast ? [{
13651
- scaleResolutionDownBy: 4,
13652
- active: true
13653
- }, {
13654
- scaleResolutionDownBy: 2,
13655
- active: true
13656
- }, {
13657
- active: true
13658
- }] : [];
13866
+ var videoMainEncodingOptions = this.getVideoEncodingOptions();
13659
13867
  this.createSendTransceiver(MediaType$1.VideoMain, mainSceneId, videoMainEncodingOptions);
13660
13868
  this.createSendTransceiver(MediaType$1.AudioMain, mainSceneId);
13661
13869
  if (this.options.floorControlledPresentation) {
13662
- var videoPresentationEncodingOptions = !this.options.disableSimulcast ? [{
13663
- scaleResolutionDownBy: 4,
13664
- active: true
13665
- }, {
13666
- scaleResolutionDownBy: 2,
13667
- active: true
13668
- }, {
13669
- active: true
13670
- }] : [];
13870
+ var videoPresentationEncodingOptions = this.getVideoEncodingOptions();
13671
13871
  var contentSceneId = generateSceneId();
13672
13872
  this.createSendTransceiver(MediaType$1.VideoSlides, contentSceneId, videoPresentationEncodingOptions);
13673
13873
  this.createSendTransceiver(MediaType$1.AudioSlides, contentSceneId);
13674
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();
13675
13882
  this.createDataChannel();
13676
13883
  }
13677
13884
  getConnectionState() {
13678
13885
  return this.pc.getConnectionState();
13679
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
+ }
13680
13900
  createSendTransceiver(mediaType, sceneId, sendEncodingsOptions) {
13681
13901
  var rtcTransceiver = this.pc.addTransceiver(toMediaStreamTrackKind(mediaType), {
13682
13902
  direction: 'sendrecv',
@@ -13684,6 +13904,9 @@ class MultistreamConnection extends EventEmitter {
13684
13904
  });
13685
13905
  var csi = generateCsi(getMediaFamily(mediaType), sceneId);
13686
13906
  this.sendTransceivers.set(mediaType, new SendOnlyTransceiver(rtcTransceiver, csi));
13907
+ this.createJmpSession(mediaType);
13908
+ }
13909
+ createJmpSession(mediaType) {
13687
13910
  var jmpSession = new JmpSession(getMediaFamily(mediaType), getMediaContent(mediaType));
13688
13911
  jmpSession.setTxCallback(msg => {
13689
13912
  var _a;
@@ -13802,14 +14025,16 @@ class MultistreamConnection extends EventEmitter {
13802
14025
  maxPayloadBitsPerSecond
13803
14026
  });
13804
14027
  } else {
13805
- 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)));
13806
14029
  }
13807
14030
  } else {
13808
- 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)));
13809
14032
  }
13810
14033
  });
13811
14034
  sendTransceiver.setTrackRequested(requestedIdEncodingParamsMap.size > 0);
13812
- sendTransceiver.updateSimulcastStreamStates(requestedIdEncodingParamsMap);
14035
+ if (getMediaFamily(mediaType) === MediaFamily$1.Video) {
14036
+ sendTransceiver.updateSimulcastStreamStates(requestedIdEncodingParamsMap);
14037
+ }
13813
14038
  }
13814
14039
  createDataChannel() {
13815
14040
  var dataChannel = this.pc.createDataChannel('datachannel', {});
@@ -14051,8 +14276,8 @@ class MultistreamConnection extends EventEmitter {
14051
14276
  egressSignaler.signalStreams(simulcastEnabled, rtxEnabled, av);
14052
14277
  if (av.type === 'video') {
14053
14278
  [...av.codecs.values()].filter(ci => ci.name === 'H264').forEach(ci => {
14054
- ci.fmtParams.push("max-mbps=".concat(defaultGlobalMaxVideoMbps));
14055
- ci.fmtParams.push("max-fs=".concat(defaultGlobalMaxVideoFrameSize));
14279
+ ci.fmtParams.push("max-mbps=".concat(defaultMaxVideoEncodeMbps));
14280
+ ci.fmtParams.push("max-fs=".concat(defaultMaxVideoEncodeFrameSize));
14056
14281
  });
14057
14282
  }
14058
14283
  });
@@ -14074,6 +14299,14 @@ class MultistreamConnection extends EventEmitter {
14074
14299
  });
14075
14300
  injectJmpAttributes(parsed, csiMap, this.options.streamSignalingMode);
14076
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
+ });
14077
14310
  return parsed.toString();
14078
14311
  }
14079
14312
  preProcessRemoteAnswer(answer) {
@@ -14116,13 +14349,24 @@ class MultistreamConnection extends EventEmitter {
14116
14349
  this.pendingJmpTasks.push(task);
14117
14350
  }
14118
14351
  }
14119
- renewPeerConnection() {
14120
- var _a;
14121
- (_a = this.pc) === null || _a === void 0 ? void 0 : _a.close();
14122
- this.pc = new PeerConnection();
14123
- this.attachMetricsObserver();
14124
- this.createDataChannel();
14125
- 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
+ });
14126
14370
  this.recvTransceivers.forEach((transceivers, mediaType) => {
14127
14371
  transceivers.forEach(t => {
14128
14372
  t.replaceTransceiver(this.pc.addTransceiver(toMediaStreamTrackKind(mediaType), {
@@ -14137,17 +14381,25 @@ class MultistreamConnection extends EventEmitter {
14137
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]);
14138
14382
  });
14139
14383
  }
14384
+ getStats() {
14385
+ return this.statsManager.getStats();
14386
+ }
14140
14387
  preProcessStats(stats) {
14141
14388
  return __awaiter(this, void 0, void 0, function* () {
14142
14389
  yield Promise.all([...this.sendTransceivers.entries()].map(_ref5 => {
14143
14390
  var [mediaType, transceiver] = _ref5;
14144
14391
  return __awaiter(this, void 0, void 0, function* () {
14145
- (yield transceiver.getSenderStats()).forEach(senderStats => {
14392
+ (yield transceiver.getStats()).forEach(senderStats => {
14393
+ var _a;
14146
14394
  if (senderStats.type === 'outbound-rtp') {
14147
14395
  var statsToModify = stats[senderStats.id];
14148
14396
  statsToModify.mid = transceiver.mid;
14149
14397
  statsToModify.csi = transceiver.csi;
14150
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
+ }
14151
14403
  }
14152
14404
  });
14153
14405
  });
@@ -14156,7 +14408,7 @@ class MultistreamConnection extends EventEmitter {
14156
14408
  var [mediaType, transceivers] = _ref6;
14157
14409
  return __awaiter(this, void 0, void 0, function* () {
14158
14410
  yield Promise.all(transceivers.map(transceiver => __awaiter(this, void 0, void 0, function* () {
14159
- (yield transceiver.getReceiverStats()).forEach(receiverStats => {
14411
+ (yield transceiver.getStats()).forEach(receiverStats => {
14160
14412
  var _a;
14161
14413
  if (receiverStats.type === 'inbound-rtp') {
14162
14414
  var statsToModify = stats[receiverStats.id];
@@ -14180,6 +14432,9 @@ class MultistreamConnection extends EventEmitter {
14180
14432
  setMetricsCallback(callback) {
14181
14433
  this.metricsCallback = callback;
14182
14434
  }
14435
+ setOveruseUpdateCallback(callback) {
14436
+ this.overuseUpdateCallback = callback;
14437
+ }
14183
14438
  getCsiByMediaType(mediaType) {
14184
14439
  var _a;
14185
14440
  return (_a = this.sendTransceivers.get(mediaType)) === null || _a === void 0 ? void 0 : _a.csi;
@@ -23213,6 +23468,9 @@ class MultistreamRoapMediaConnection extends EventEmitter$4 {
23213
23468
  this.log('getConnectionState()', "called, returning ".concat(connectionState));
23214
23469
  return connectionState;
23215
23470
  }
23471
+ getStats() {
23472
+ return this.multistreamConnection.getStats();
23473
+ }
23216
23474
  roapMessageReceived(roapMessage) {
23217
23475
  this.log('roapMessageReceived()', "called with messageType=".concat(roapMessage.messageType, ", seq=").concat(roapMessage.seq));
23218
23476
  if (!this.sdpNegotiationStarted && roapMessage.messageType === 'OFFER') {