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