@flashphoner/websdk 2.0.238 → 2.0.239

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.
@@ -7514,15 +7514,15 @@ var _require = require('uuid'),
7514
7514
  var constants = require("./constants");
7515
7515
  var util = require('./util');
7516
7516
  var LoggerObject = require('./util').logger;
7517
+ var Promise = require('promise-polyfill');
7518
+ var KalmanFilter = require('kalmanjs');
7519
+ var browserDetails = require('webrtc-adapter')["default"].browserDetails;
7520
+ var LOG_PREFIX = "core";
7517
7521
  var coreLogger;
7518
7522
  var loggerConf = {
7519
7523
  push: false,
7520
7524
  severity: "INFO"
7521
7525
  };
7522
- var Promise = require('promise-polyfill');
7523
- var KalmanFilter = require('kalmanjs');
7524
- var browserDetails = require('webrtc-adapter')["default"].browserDetails;
7525
- var LOG_PREFIX = "core";
7526
7526
  var isUsingTemasysPlugin = false;
7527
7527
 
7528
7528
  /**
@@ -7534,7 +7534,6 @@ var STREAM_EVENT = constants.STREAM_EVENT;
7534
7534
  var STREAM_EVENT_TYPE = constants.STREAM_EVENT_TYPE;
7535
7535
  var STREAM_STATUS = constants.STREAM_STATUS;
7536
7536
  var CALL_STATUS = constants.CALL_STATUS;
7537
- var TRANSPORT_TYPE = constants.TRANSPORT_TYPE;
7538
7537
  var CONNECTION_QUALITY = constants.CONNECTION_QUALITY;
7539
7538
  var ERROR_INFO = constants.ERROR_INFO;
7540
7539
  var VIDEO_RATE_GOOD_QUALITY_PERCENT_DIFFERENCE = 20;
@@ -7543,6 +7542,18 @@ var LOW_VIDEO_RATE_THRESHOLD_BAD_PERFECT = 50000;
7543
7542
  var LOW_VIDEO_RATE_BAD_QUALITY_PERCENT_DIFFERENCE = 150;
7544
7543
  var OUTBOUND_VIDEO_RATE = "outboundVideoRate";
7545
7544
  var INBOUND_VIDEO_RATE = "inboundVideoRate";
7545
+ var CONSTRAINT_AUDIO = "audio";
7546
+ var CONSTRAINT_AUDIO_STEREO = "stereo";
7547
+ var CONSTRAINT_AUDIO_BITRATE = "bitrate";
7548
+ var CONSTRAINT_AUDIO_FEC = "fec";
7549
+ var CONSTRAINT_AUDIO_OUTPUT_ID = "outputId";
7550
+ var CONSTRAINT_VIDEO = "video";
7551
+ var CONSTRAINT_VIDEO_BITRATE = "video.bitrate";
7552
+ var CONSTRAINT_VIDEO_MIN_BITRATE = "video.minBitrate";
7553
+ var CONSTRAINT_VIDEO_MAX_BITRATE = "video.maxBitrate";
7554
+ var CONSTRAINT_VIDEO_QUALITY = "video.quality";
7555
+ var CONSTRAINT_VIDEO_WIDTH = "video.width";
7556
+ var CONSTRAINT_VIDEO_HEIGHT = "video.height";
7546
7557
  var MediaProvider = {};
7547
7558
  var sessions = {};
7548
7559
  var initialized = false;
@@ -8372,9 +8383,9 @@ var createSession = function createSession(options) {
8372
8383
  var disableConstraintsNormalization = options.disableConstraintsNormalization;
8373
8384
  }
8374
8385
  var audioOutputId;
8375
- var audioProperty = getConstraintsProperty(constraints, "audio", undefined);
8386
+ var audioProperty = getConstraintsProperty(constraints, CONSTRAINT_AUDIO, undefined);
8376
8387
  if (_typeof(audioProperty) === 'object') {
8377
- audioOutputId = getConstraintsProperty(audioProperty, "outputId", 0);
8388
+ audioOutputId = getConstraintsProperty(audioProperty, CONSTRAINT_AUDIO_OUTPUT_ID, 0);
8378
8389
  }
8379
8390
  var stripCodecs = options.stripCodecs || [];
8380
8391
  // Receive media
@@ -8389,6 +8400,9 @@ var createSession = function createSession(options) {
8389
8400
  var sipHeaders = options.sipHeaders;
8390
8401
  var videoContentHint = options.videoContentHint;
8391
8402
  var useControls = options.useControls;
8403
+ var minBitrate = getConstraintsProperty(constraints, CONSTRAINT_VIDEO_MIN_BITRATE, 0);
8404
+ var maxBitrate = getConstraintsProperty(constraints, CONSTRAINT_VIDEO_MAX_BITRATE, 0);
8405
+
8392
8406
  /**
8393
8407
  * Represents sip call.
8394
8408
  *
@@ -8425,6 +8439,8 @@ var createSession = function createSession(options) {
8425
8439
  //set remote sdp
8426
8440
  if (sdp && sdp !== '') {
8427
8441
  sdp = sdpHookHandler(sdp, sdpHook);
8442
+ // Adjust publishing bitrate #WCS-4013
8443
+ sdp = util.setPublishingBitrate(sdp, mediaConnection, minBitrate, maxBitrate);
8428
8444
  mediaConnection.setRemoteSdp(sdp, hasTransferredCall, id_).then(function () {});
8429
8445
  return;
8430
8446
  }
@@ -8590,6 +8606,8 @@ var createSession = function createSession(options) {
8590
8606
  status_ = CALL_STATUS.PENDING;
8591
8607
  var sdp;
8592
8608
  var sdpHook = answerOptions.sdpHook;
8609
+ var minBitrate = getConstraintsProperty(constraints, CONSTRAINT_VIDEO_MIN_BITRATE, 0);
8610
+ var maxBitrate = getConstraintsProperty(constraints, CONSTRAINT_VIDEO_MAX_BITRATE, 0);
8593
8611
  sipSDP = answerOptions.sipSDP;
8594
8612
  sipHeaders = answerOptions.sipHeaders;
8595
8613
  if (!remoteSdpCache[id_]) {
@@ -8597,6 +8615,8 @@ var createSession = function createSession(options) {
8597
8615
  throw new Error("No remote sdp available");
8598
8616
  } else {
8599
8617
  sdp = sdpHookHandler(remoteSdpCache[id_], sdpHook);
8618
+ // Adjust publishing bitrate #WCS-4013
8619
+ sdp = util.setPublishingBitrate(sdp, null, minBitrate, maxBitrate);
8600
8620
  delete remoteSdpCache[id_];
8601
8621
  }
8602
8622
  if (util.SDP.matchPrefix(sdp, "m=video").length == 0) {
@@ -8630,6 +8650,8 @@ var createSession = function createSession(options) {
8630
8650
  useControls: useControls
8631
8651
  }).then(function (newConnection) {
8632
8652
  mediaConnection = newConnection;
8653
+ // Set publishing bitrate via sender encodings if SDP feature is not supported
8654
+ mediaConnection.setPublishingBitrate(minBitrate, maxBitrate);
8633
8655
  return mediaConnection.setRemoteSdp(sdp);
8634
8656
  }).then(function () {
8635
8657
  return mediaConnection.createAnswer({
@@ -9164,15 +9186,15 @@ var createSession = function createSession(options) {
9164
9186
  // Receive media
9165
9187
  var receiveAudio;
9166
9188
  var audioOutputId;
9167
- var audioProperty = getConstraintsProperty(constraints, "audio", undefined);
9189
+ var audioProperty = getConstraintsProperty(constraints, CONSTRAINT_AUDIO, undefined);
9168
9190
  if (typeof audioProperty === 'boolean') {
9169
9191
  receiveAudio = audioProperty;
9170
9192
  } else if (_typeof(audioProperty) === 'object') {
9171
9193
  receiveAudio = true;
9172
- var _stereo = getConstraintsProperty(audioProperty, "stereo", 0);
9173
- var _bitrate = getConstraintsProperty(audioProperty, "bitrate", 0);
9174
- var _fec = getConstraintsProperty(audioProperty, "fec", 0);
9175
- audioOutputId = getConstraintsProperty(audioProperty, "outputId", 0);
9194
+ var _stereo = getConstraintsProperty(audioProperty, CONSTRAINT_AUDIO_STEREO, 0);
9195
+ var _bitrate = getConstraintsProperty(audioProperty, CONSTRAINT_AUDIO_BITRATE, 0);
9196
+ var _fec = getConstraintsProperty(audioProperty, CONSTRAINT_AUDIO_FEC, 0);
9197
+ audioOutputId = getConstraintsProperty(audioProperty, CONSTRAINT_AUDIO_OUTPUT_ID, 0);
9176
9198
  var _codecOptions = "";
9177
9199
  if (_bitrate) _codecOptions += "maxaveragebitrate=" + _bitrate + ";";
9178
9200
  if (_stereo) _codecOptions += "stereo=1;sprop-stereo=1;";
@@ -9181,7 +9203,7 @@ var createSession = function createSession(options) {
9181
9203
  receiveAudio = typeof options.receiveAudio !== 'undefined' ? options.receiveAudio : true;
9182
9204
  }
9183
9205
  var receiveVideo;
9184
- var videoProperty = getConstraintsProperty(constraints, "video", undefined);
9206
+ var videoProperty = getConstraintsProperty(constraints, CONSTRAINT_VIDEO, undefined);
9185
9207
  if (typeof videoProperty === 'boolean') {
9186
9208
  receiveVideo = videoProperty;
9187
9209
  } else if (_typeof(videoProperty) === 'object') {
@@ -9190,16 +9212,16 @@ var createSession = function createSession(options) {
9190
9212
  receiveVideo = typeof options.receiveVideo !== 'undefined' ? options.receiveVideo : true;
9191
9213
  }
9192
9214
  // Bitrate
9193
- var bitrate = getConstraintsProperty(constraints, "video.bitrate", 0);
9194
- var minBitrate = getConstraintsProperty(constraints, "video.minBitrate", 0);
9195
- var maxBitrate = getConstraintsProperty(constraints, "video.maxBitrate", 0);
9215
+ var bitrate = getConstraintsProperty(constraints, CONSTRAINT_VIDEO_BITRATE, 0);
9216
+ var minBitrate = getConstraintsProperty(constraints, CONSTRAINT_VIDEO_MIN_BITRATE, 0);
9217
+ var maxBitrate = getConstraintsProperty(constraints, CONSTRAINT_VIDEO_MAX_BITRATE, 0);
9196
9218
 
9197
9219
  // Quality
9198
- var quality = getConstraintsProperty(constraints, "video.quality", 0);
9220
+ var quality = getConstraintsProperty(constraints, CONSTRAINT_VIDEO_QUALITY, 0);
9199
9221
  if (quality > 100) quality = 100;
9200
9222
  // Play resolution
9201
- var playWidth = typeof options.playWidth !== 'undefined' ? options.playWidth : getConstraintsProperty(constraints, "video.width", 0);
9202
- var playHeight = typeof options.playHeight !== 'undefined' ? options.playHeight : getConstraintsProperty(constraints, "video.height", 0);
9223
+ var playWidth = typeof options.playWidth !== 'undefined' ? options.playWidth : getConstraintsProperty(constraints, CONSTRAINT_VIDEO_WIDTH, 0);
9224
+ var playHeight = typeof options.playHeight !== 'undefined' ? options.playHeight : getConstraintsProperty(constraints, CONSTRAINT_VIDEO_HEIGHT, 0);
9203
9225
  var stripCodecs = options.stripCodecs || [];
9204
9226
  var resolution = {};
9205
9227
  var published_ = false;
@@ -9254,6 +9276,8 @@ var createSession = function createSession(options) {
9254
9276
  var _sdp = sdp;
9255
9277
  if (_codecOptions) _sdp = util.SDP.writeFmtp(sdp, _codecOptions, "opus");
9256
9278
  _sdp = sdpHookHandler(_sdp, sdpHook);
9279
+ // Adjust publishing bitrate #WCS-4013
9280
+ _sdp = util.setPublishingBitrate(_sdp, mediaConnection, minBitrate, maxBitrate);
9257
9281
  mediaConnection.setRemoteSdp(_sdp).then(function () {});
9258
9282
  return;
9259
9283
  }
@@ -10520,6 +10544,62 @@ var SDP = {
10520
10544
  }
10521
10545
  }
10522
10546
  return result;
10547
+ },
10548
+ setPublishingBitrate: function setPublishingBitrate(sdp, minBitrate, maxBitrate) {
10549
+ if (sdp && (minBitrate || maxBitrate)) {
10550
+ var sdpArray = sdp.split("\n");
10551
+ var i;
10552
+ var rtpmap = -1,
10553
+ codec = "";
10554
+ var matches;
10555
+ var bitrateString = "";
10556
+ for (i = 0; i < sdpArray.length; i++) {
10557
+ if (sdpArray[i].startsWith("a=rtpmap")) {
10558
+ matches = sdpArray[i].match("a=rtpmap:(.+) (.+)/.*");
10559
+ if (matches && matches.length > 2) {
10560
+ rtpmap = parseInt(matches[1], 10);
10561
+ codec = matches[2];
10562
+ }
10563
+ } else {
10564
+ if (codec === "H264" || codec === "VP8") {
10565
+ if (sdpArray[i].startsWith("a=fmtp:" + rtpmap)) {
10566
+ bitrateString = this.getBitrateString(sdpArray[i], minBitrate, maxBitrate);
10567
+ if (bitrateString) {
10568
+ sdpArray[i] += ";" + bitrateString;
10569
+ }
10570
+ } else {
10571
+ bitrateString = this.getBitrateString("", minBitrate, maxBitrate);
10572
+ if (bitrateString) {
10573
+ sdpArray[i] = "a=fmtp:" + rtpmap + " " + bitrateString + "\r\n" + sdpArray[i];
10574
+ }
10575
+ }
10576
+ codec = "";
10577
+ rtpmap = -1;
10578
+ }
10579
+ }
10580
+ }
10581
+ var newSDP = "";
10582
+ for (i = 0; i < sdpArray.length; i++) {
10583
+ if (sdpArray[i] != "") {
10584
+ newSDP += sdpArray[i] + "\n";
10585
+ }
10586
+ }
10587
+ return newSDP;
10588
+ }
10589
+ return sdp;
10590
+ },
10591
+ getBitrateString: function getBitrateString(string, minBitrate, maxBitrate) {
10592
+ var bitrateString = "";
10593
+ if (minBitrate && string.indexOf("x-google-min-bitrate") == -1) {
10594
+ bitrateString += "x-google-min-bitrate=" + minBitrate;
10595
+ }
10596
+ if (maxBitrate && string.indexOf("x-google-max-bitrate") == -1) {
10597
+ if (bitrateString) {
10598
+ bitrateString += ";";
10599
+ }
10600
+ bitrateString += "x-google-max-bitrate=" + maxBitrate;
10601
+ }
10602
+ return bitrateString;
10523
10603
  }
10524
10604
  };
10525
10605
  var logger = function logger() {
@@ -10763,6 +10843,18 @@ var isPromise = function isPromise(object) {
10763
10843
  }
10764
10844
  return false;
10765
10845
  };
10846
+ var setPublishingBitrate = function setPublishingBitrate(sdp, mediaConnection, minBitrate, maxBitrate) {
10847
+ if (minBitrate || maxBitrate) {
10848
+ if (sdp && Browser.isChrome() || Browser.isSafariWebRTC()) {
10849
+ // Set publishing bitrate constraints via remote SDP
10850
+ sdp = SDP.setPublishingBitrate(sdp, minBitrate, maxBitrate);
10851
+ } else if (mediaConnection) {
10852
+ // Set publishing bitrate via sender encodings if SDP feature is not supported
10853
+ mediaConnection.setPublishingBitrate(minBitrate, maxBitrate);
10854
+ }
10855
+ }
10856
+ return sdp;
10857
+ };
10766
10858
  module.exports = {
10767
10859
  isEmptyObject: isEmptyObject,
10768
10860
  copyObjectToArray: copyObjectToArray,
@@ -10773,7 +10865,8 @@ module.exports = {
10773
10865
  logger: logger,
10774
10866
  stripCodecs: stripCodecs,
10775
10867
  getCurrentCodecAndSampleRate: getCurrentCodecAndSampleRate,
10776
- isPromise: isPromise
10868
+ isPromise: isPromise,
10869
+ setPublishingBitrate: setPublishingBitrate
10777
10870
  };
10778
10871
 
10779
10872
  },{}],41:[function(require,module,exports){
@@ -10849,7 +10942,7 @@ var createConnection = function createConnection(options) {
10849
10942
  if (localVideo.srcObject) {
10850
10943
  localVideo.id = id + "-local";
10851
10944
  setContentHint(localVideo.srcObject, videoContentHint);
10852
- connection.addStream(localVideo.srcObject);
10945
+ addStreamTracks(connection, localVideo.srcObject);
10853
10946
  } else {
10854
10947
  localVideo = null;
10855
10948
  }
@@ -10892,7 +10985,7 @@ var createConnection = function createConnection(options) {
10892
10985
  localVideo = cachedVideo;
10893
10986
  localVideo.id = id;
10894
10987
  setContentHint(localVideo.srcObject, videoContentHint);
10895
- connection.addStream(localVideo.srcObject);
10988
+ addStreamTracks(connection, localVideo.srcObject);
10896
10989
  }
10897
10990
  } else {
10898
10991
  // There is a custom video element, get its id if set #WCS-3606
@@ -10939,6 +11032,11 @@ var createConnection = function createConnection(options) {
10939
11032
  }
10940
11033
  });
10941
11034
  }
11035
+ function addStreamTracks(pc, stream) {
11036
+ stream.getTracks().forEach(function (track) {
11037
+ pc.addTrack(track, stream);
11038
+ });
11039
+ }
10942
11040
  connection.ontrack = function (event) {
10943
11041
  if (remoteVideo) {
10944
11042
  remoteVideo.srcObject = event.streams[0];
@@ -11532,6 +11630,20 @@ var createConnection = function createConnection(options) {
11532
11630
  logger.info(LOG_PREFIX, "Switch to cam");
11533
11631
  screenShare = false;
11534
11632
  };
11633
+ var setPublishingBitrate = function setPublishingBitrate(minBitrate, maxBitrate) {
11634
+ var senders = connection.getSenders();
11635
+ senders.forEach(function (sender) {
11636
+ if (sender.track.kind == "video" && maxBitrate) {
11637
+ var parameters = sender.getParameters();
11638
+ for (var i = 0; i < parameters.encodings.length; i++) {
11639
+ if (!parameters.encodings[i].maxBitrate) {
11640
+ parameters.encodings[i].maxBitrate = maxBitrate * 1000;
11641
+ }
11642
+ }
11643
+ sender.setParameters(parameters).then(function () {});
11644
+ }
11645
+ });
11646
+ };
11535
11647
  var exports = {};
11536
11648
  exports.state = state;
11537
11649
  exports.createOffer = createOffer;
@@ -11558,6 +11670,7 @@ var createConnection = function createConnection(options) {
11558
11670
  exports.switchMic = switchMic;
11559
11671
  exports.switchToScreen = switchToScreen;
11560
11672
  exports.switchToCam = switchToCam;
11673
+ exports.setPublishingBitrate = setPublishingBitrate;
11561
11674
  connections[id] = exports;
11562
11675
  resolve(exports);
11563
11676
  });