@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
  }
@@ -10530,6 +10554,62 @@ var SDP = {
10530
10554
  }
10531
10555
  }
10532
10556
  return result;
10557
+ },
10558
+ setPublishingBitrate: function setPublishingBitrate(sdp, minBitrate, maxBitrate) {
10559
+ if (sdp && (minBitrate || maxBitrate)) {
10560
+ var sdpArray = sdp.split("\n");
10561
+ var i;
10562
+ var rtpmap = -1,
10563
+ codec = "";
10564
+ var matches;
10565
+ var bitrateString = "";
10566
+ for (i = 0; i < sdpArray.length; i++) {
10567
+ if (sdpArray[i].startsWith("a=rtpmap")) {
10568
+ matches = sdpArray[i].match("a=rtpmap:(.+) (.+)/.*");
10569
+ if (matches && matches.length > 2) {
10570
+ rtpmap = parseInt(matches[1], 10);
10571
+ codec = matches[2];
10572
+ }
10573
+ } else {
10574
+ if (codec === "H264" || codec === "VP8") {
10575
+ if (sdpArray[i].startsWith("a=fmtp:" + rtpmap)) {
10576
+ bitrateString = this.getBitrateString(sdpArray[i], minBitrate, maxBitrate);
10577
+ if (bitrateString) {
10578
+ sdpArray[i] += ";" + bitrateString;
10579
+ }
10580
+ } else {
10581
+ bitrateString = this.getBitrateString("", minBitrate, maxBitrate);
10582
+ if (bitrateString) {
10583
+ sdpArray[i] = "a=fmtp:" + rtpmap + " " + bitrateString + "\r\n" + sdpArray[i];
10584
+ }
10585
+ }
10586
+ codec = "";
10587
+ rtpmap = -1;
10588
+ }
10589
+ }
10590
+ }
10591
+ var newSDP = "";
10592
+ for (i = 0; i < sdpArray.length; i++) {
10593
+ if (sdpArray[i] != "") {
10594
+ newSDP += sdpArray[i] + "\n";
10595
+ }
10596
+ }
10597
+ return newSDP;
10598
+ }
10599
+ return sdp;
10600
+ },
10601
+ getBitrateString: function getBitrateString(string, minBitrate, maxBitrate) {
10602
+ var bitrateString = "";
10603
+ if (minBitrate && string.indexOf("x-google-min-bitrate") == -1) {
10604
+ bitrateString += "x-google-min-bitrate=" + minBitrate;
10605
+ }
10606
+ if (maxBitrate && string.indexOf("x-google-max-bitrate") == -1) {
10607
+ if (bitrateString) {
10608
+ bitrateString += ";";
10609
+ }
10610
+ bitrateString += "x-google-max-bitrate=" + maxBitrate;
10611
+ }
10612
+ return bitrateString;
10533
10613
  }
10534
10614
  };
10535
10615
  var logger = function logger() {
@@ -10773,6 +10853,18 @@ var isPromise = function isPromise(object) {
10773
10853
  }
10774
10854
  return false;
10775
10855
  };
10856
+ var setPublishingBitrate = function setPublishingBitrate(sdp, mediaConnection, minBitrate, maxBitrate) {
10857
+ if (minBitrate || maxBitrate) {
10858
+ if (sdp && Browser.isChrome() || Browser.isSafariWebRTC()) {
10859
+ // Set publishing bitrate constraints via remote SDP
10860
+ sdp = SDP.setPublishingBitrate(sdp, minBitrate, maxBitrate);
10861
+ } else if (mediaConnection) {
10862
+ // Set publishing bitrate via sender encodings if SDP feature is not supported
10863
+ mediaConnection.setPublishingBitrate(minBitrate, maxBitrate);
10864
+ }
10865
+ }
10866
+ return sdp;
10867
+ };
10776
10868
  module.exports = {
10777
10869
  isEmptyObject: isEmptyObject,
10778
10870
  copyObjectToArray: copyObjectToArray,
@@ -10783,7 +10875,8 @@ module.exports = {
10783
10875
  logger: logger,
10784
10876
  stripCodecs: stripCodecs,
10785
10877
  getCurrentCodecAndSampleRate: getCurrentCodecAndSampleRate,
10786
- isPromise: isPromise
10878
+ isPromise: isPromise,
10879
+ setPublishingBitrate: setPublishingBitrate
10787
10880
  };
10788
10881
 
10789
10882
  },{}],42:[function(require,module,exports){
@@ -10859,7 +10952,7 @@ var createConnection = function createConnection(options) {
10859
10952
  if (localVideo.srcObject) {
10860
10953
  localVideo.id = id + "-local";
10861
10954
  setContentHint(localVideo.srcObject, videoContentHint);
10862
- connection.addStream(localVideo.srcObject);
10955
+ addStreamTracks(connection, localVideo.srcObject);
10863
10956
  } else {
10864
10957
  localVideo = null;
10865
10958
  }
@@ -10902,7 +10995,7 @@ var createConnection = function createConnection(options) {
10902
10995
  localVideo = cachedVideo;
10903
10996
  localVideo.id = id;
10904
10997
  setContentHint(localVideo.srcObject, videoContentHint);
10905
- connection.addStream(localVideo.srcObject);
10998
+ addStreamTracks(connection, localVideo.srcObject);
10906
10999
  }
10907
11000
  } else {
10908
11001
  // There is a custom video element, get its id if set #WCS-3606
@@ -10949,6 +11042,11 @@ var createConnection = function createConnection(options) {
10949
11042
  }
10950
11043
  });
10951
11044
  }
11045
+ function addStreamTracks(pc, stream) {
11046
+ stream.getTracks().forEach(function (track) {
11047
+ pc.addTrack(track, stream);
11048
+ });
11049
+ }
10952
11050
  connection.ontrack = function (event) {
10953
11051
  if (remoteVideo) {
10954
11052
  remoteVideo.srcObject = event.streams[0];
@@ -11542,6 +11640,20 @@ var createConnection = function createConnection(options) {
11542
11640
  logger.info(LOG_PREFIX, "Switch to cam");
11543
11641
  screenShare = false;
11544
11642
  };
11643
+ var setPublishingBitrate = function setPublishingBitrate(minBitrate, maxBitrate) {
11644
+ var senders = connection.getSenders();
11645
+ senders.forEach(function (sender) {
11646
+ if (sender.track.kind == "video" && maxBitrate) {
11647
+ var parameters = sender.getParameters();
11648
+ for (var i = 0; i < parameters.encodings.length; i++) {
11649
+ if (!parameters.encodings[i].maxBitrate) {
11650
+ parameters.encodings[i].maxBitrate = maxBitrate * 1000;
11651
+ }
11652
+ }
11653
+ sender.setParameters(parameters).then(function () {});
11654
+ }
11655
+ });
11656
+ };
11545
11657
  var exports = {};
11546
11658
  exports.state = state;
11547
11659
  exports.createOffer = createOffer;
@@ -11568,6 +11680,7 @@ var createConnection = function createConnection(options) {
11568
11680
  exports.switchMic = switchMic;
11569
11681
  exports.switchToScreen = switchToScreen;
11570
11682
  exports.switchToCam = switchToCam;
11683
+ exports.setPublishingBitrate = setPublishingBitrate;
11571
11684
  connections[id] = exports;
11572
11685
  resolve(exports);
11573
11686
  });