@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.
package/flashphoner.js CHANGED
@@ -8342,15 +8342,15 @@ var _require = require('uuid'),
8342
8342
  var constants = require("./constants");
8343
8343
  var util = require('./util');
8344
8344
  var LoggerObject = require('./util').logger;
8345
+ var Promise = require('promise-polyfill');
8346
+ var KalmanFilter = require('kalmanjs');
8347
+ var browserDetails = require('webrtc-adapter')["default"].browserDetails;
8348
+ var LOG_PREFIX = "core";
8345
8349
  var coreLogger;
8346
8350
  var loggerConf = {
8347
8351
  push: false,
8348
8352
  severity: "INFO"
8349
8353
  };
8350
- var Promise = require('promise-polyfill');
8351
- var KalmanFilter = require('kalmanjs');
8352
- var browserDetails = require('webrtc-adapter')["default"].browserDetails;
8353
- var LOG_PREFIX = "core";
8354
8354
  var isUsingTemasysPlugin = false;
8355
8355
 
8356
8356
  /**
@@ -8362,7 +8362,6 @@ var STREAM_EVENT = constants.STREAM_EVENT;
8362
8362
  var STREAM_EVENT_TYPE = constants.STREAM_EVENT_TYPE;
8363
8363
  var STREAM_STATUS = constants.STREAM_STATUS;
8364
8364
  var CALL_STATUS = constants.CALL_STATUS;
8365
- var TRANSPORT_TYPE = constants.TRANSPORT_TYPE;
8366
8365
  var CONNECTION_QUALITY = constants.CONNECTION_QUALITY;
8367
8366
  var ERROR_INFO = constants.ERROR_INFO;
8368
8367
  var VIDEO_RATE_GOOD_QUALITY_PERCENT_DIFFERENCE = 20;
@@ -8371,6 +8370,18 @@ var LOW_VIDEO_RATE_THRESHOLD_BAD_PERFECT = 50000;
8371
8370
  var LOW_VIDEO_RATE_BAD_QUALITY_PERCENT_DIFFERENCE = 150;
8372
8371
  var OUTBOUND_VIDEO_RATE = "outboundVideoRate";
8373
8372
  var INBOUND_VIDEO_RATE = "inboundVideoRate";
8373
+ var CONSTRAINT_AUDIO = "audio";
8374
+ var CONSTRAINT_AUDIO_STEREO = "stereo";
8375
+ var CONSTRAINT_AUDIO_BITRATE = "bitrate";
8376
+ var CONSTRAINT_AUDIO_FEC = "fec";
8377
+ var CONSTRAINT_AUDIO_OUTPUT_ID = "outputId";
8378
+ var CONSTRAINT_VIDEO = "video";
8379
+ var CONSTRAINT_VIDEO_BITRATE = "video.bitrate";
8380
+ var CONSTRAINT_VIDEO_MIN_BITRATE = "video.minBitrate";
8381
+ var CONSTRAINT_VIDEO_MAX_BITRATE = "video.maxBitrate";
8382
+ var CONSTRAINT_VIDEO_QUALITY = "video.quality";
8383
+ var CONSTRAINT_VIDEO_WIDTH = "video.width";
8384
+ var CONSTRAINT_VIDEO_HEIGHT = "video.height";
8374
8385
  var MediaProvider = {};
8375
8386
  var sessions = {};
8376
8387
  var initialized = false;
@@ -9200,9 +9211,9 @@ var createSession = function createSession(options) {
9200
9211
  var disableConstraintsNormalization = options.disableConstraintsNormalization;
9201
9212
  }
9202
9213
  var audioOutputId;
9203
- var audioProperty = getConstraintsProperty(constraints, "audio", undefined);
9214
+ var audioProperty = getConstraintsProperty(constraints, CONSTRAINT_AUDIO, undefined);
9204
9215
  if (_typeof(audioProperty) === 'object') {
9205
- audioOutputId = getConstraintsProperty(audioProperty, "outputId", 0);
9216
+ audioOutputId = getConstraintsProperty(audioProperty, CONSTRAINT_AUDIO_OUTPUT_ID, 0);
9206
9217
  }
9207
9218
  var stripCodecs = options.stripCodecs || [];
9208
9219
  // Receive media
@@ -9217,6 +9228,9 @@ var createSession = function createSession(options) {
9217
9228
  var sipHeaders = options.sipHeaders;
9218
9229
  var videoContentHint = options.videoContentHint;
9219
9230
  var useControls = options.useControls;
9231
+ var minBitrate = getConstraintsProperty(constraints, CONSTRAINT_VIDEO_MIN_BITRATE, 0);
9232
+ var maxBitrate = getConstraintsProperty(constraints, CONSTRAINT_VIDEO_MAX_BITRATE, 0);
9233
+
9220
9234
  /**
9221
9235
  * Represents sip call.
9222
9236
  *
@@ -9253,6 +9267,8 @@ var createSession = function createSession(options) {
9253
9267
  //set remote sdp
9254
9268
  if (sdp && sdp !== '') {
9255
9269
  sdp = sdpHookHandler(sdp, sdpHook);
9270
+ // Adjust publishing bitrate #WCS-4013
9271
+ sdp = util.setPublishingBitrate(sdp, mediaConnection, minBitrate, maxBitrate);
9256
9272
  mediaConnection.setRemoteSdp(sdp, hasTransferredCall, id_).then(function () {});
9257
9273
  return;
9258
9274
  }
@@ -9418,6 +9434,8 @@ var createSession = function createSession(options) {
9418
9434
  status_ = CALL_STATUS.PENDING;
9419
9435
  var sdp;
9420
9436
  var sdpHook = answerOptions.sdpHook;
9437
+ var minBitrate = getConstraintsProperty(constraints, CONSTRAINT_VIDEO_MIN_BITRATE, 0);
9438
+ var maxBitrate = getConstraintsProperty(constraints, CONSTRAINT_VIDEO_MAX_BITRATE, 0);
9421
9439
  sipSDP = answerOptions.sipSDP;
9422
9440
  sipHeaders = answerOptions.sipHeaders;
9423
9441
  if (!remoteSdpCache[id_]) {
@@ -9425,6 +9443,8 @@ var createSession = function createSession(options) {
9425
9443
  throw new Error("No remote sdp available");
9426
9444
  } else {
9427
9445
  sdp = sdpHookHandler(remoteSdpCache[id_], sdpHook);
9446
+ // Adjust publishing bitrate #WCS-4013
9447
+ sdp = util.setPublishingBitrate(sdp, null, minBitrate, maxBitrate);
9428
9448
  delete remoteSdpCache[id_];
9429
9449
  }
9430
9450
  if (util.SDP.matchPrefix(sdp, "m=video").length == 0) {
@@ -9458,6 +9478,8 @@ var createSession = function createSession(options) {
9458
9478
  useControls: useControls
9459
9479
  }).then(function (newConnection) {
9460
9480
  mediaConnection = newConnection;
9481
+ // Set publishing bitrate via sender encodings if SDP feature is not supported
9482
+ mediaConnection.setPublishingBitrate(minBitrate, maxBitrate);
9461
9483
  return mediaConnection.setRemoteSdp(sdp);
9462
9484
  }).then(function () {
9463
9485
  return mediaConnection.createAnswer({
@@ -9992,15 +10014,15 @@ var createSession = function createSession(options) {
9992
10014
  // Receive media
9993
10015
  var receiveAudio;
9994
10016
  var audioOutputId;
9995
- var audioProperty = getConstraintsProperty(constraints, "audio", undefined);
10017
+ var audioProperty = getConstraintsProperty(constraints, CONSTRAINT_AUDIO, undefined);
9996
10018
  if (typeof audioProperty === 'boolean') {
9997
10019
  receiveAudio = audioProperty;
9998
10020
  } else if (_typeof(audioProperty) === 'object') {
9999
10021
  receiveAudio = true;
10000
- var _stereo = getConstraintsProperty(audioProperty, "stereo", 0);
10001
- var _bitrate = getConstraintsProperty(audioProperty, "bitrate", 0);
10002
- var _fec = getConstraintsProperty(audioProperty, "fec", 0);
10003
- audioOutputId = getConstraintsProperty(audioProperty, "outputId", 0);
10022
+ var _stereo = getConstraintsProperty(audioProperty, CONSTRAINT_AUDIO_STEREO, 0);
10023
+ var _bitrate = getConstraintsProperty(audioProperty, CONSTRAINT_AUDIO_BITRATE, 0);
10024
+ var _fec = getConstraintsProperty(audioProperty, CONSTRAINT_AUDIO_FEC, 0);
10025
+ audioOutputId = getConstraintsProperty(audioProperty, CONSTRAINT_AUDIO_OUTPUT_ID, 0);
10004
10026
  var _codecOptions = "";
10005
10027
  if (_bitrate) _codecOptions += "maxaveragebitrate=" + _bitrate + ";";
10006
10028
  if (_stereo) _codecOptions += "stereo=1;sprop-stereo=1;";
@@ -10009,7 +10031,7 @@ var createSession = function createSession(options) {
10009
10031
  receiveAudio = typeof options.receiveAudio !== 'undefined' ? options.receiveAudio : true;
10010
10032
  }
10011
10033
  var receiveVideo;
10012
- var videoProperty = getConstraintsProperty(constraints, "video", undefined);
10034
+ var videoProperty = getConstraintsProperty(constraints, CONSTRAINT_VIDEO, undefined);
10013
10035
  if (typeof videoProperty === 'boolean') {
10014
10036
  receiveVideo = videoProperty;
10015
10037
  } else if (_typeof(videoProperty) === 'object') {
@@ -10018,16 +10040,16 @@ var createSession = function createSession(options) {
10018
10040
  receiveVideo = typeof options.receiveVideo !== 'undefined' ? options.receiveVideo : true;
10019
10041
  }
10020
10042
  // Bitrate
10021
- var bitrate = getConstraintsProperty(constraints, "video.bitrate", 0);
10022
- var minBitrate = getConstraintsProperty(constraints, "video.minBitrate", 0);
10023
- var maxBitrate = getConstraintsProperty(constraints, "video.maxBitrate", 0);
10043
+ var bitrate = getConstraintsProperty(constraints, CONSTRAINT_VIDEO_BITRATE, 0);
10044
+ var minBitrate = getConstraintsProperty(constraints, CONSTRAINT_VIDEO_MIN_BITRATE, 0);
10045
+ var maxBitrate = getConstraintsProperty(constraints, CONSTRAINT_VIDEO_MAX_BITRATE, 0);
10024
10046
 
10025
10047
  // Quality
10026
- var quality = getConstraintsProperty(constraints, "video.quality", 0);
10048
+ var quality = getConstraintsProperty(constraints, CONSTRAINT_VIDEO_QUALITY, 0);
10027
10049
  if (quality > 100) quality = 100;
10028
10050
  // Play resolution
10029
- var playWidth = typeof options.playWidth !== 'undefined' ? options.playWidth : getConstraintsProperty(constraints, "video.width", 0);
10030
- var playHeight = typeof options.playHeight !== 'undefined' ? options.playHeight : getConstraintsProperty(constraints, "video.height", 0);
10051
+ var playWidth = typeof options.playWidth !== 'undefined' ? options.playWidth : getConstraintsProperty(constraints, CONSTRAINT_VIDEO_WIDTH, 0);
10052
+ var playHeight = typeof options.playHeight !== 'undefined' ? options.playHeight : getConstraintsProperty(constraints, CONSTRAINT_VIDEO_HEIGHT, 0);
10031
10053
  var stripCodecs = options.stripCodecs || [];
10032
10054
  var resolution = {};
10033
10055
  var published_ = false;
@@ -10082,6 +10104,8 @@ var createSession = function createSession(options) {
10082
10104
  var _sdp = sdp;
10083
10105
  if (_codecOptions) _sdp = util.SDP.writeFmtp(sdp, _codecOptions, "opus");
10084
10106
  _sdp = sdpHookHandler(_sdp, sdpHook);
10107
+ // Adjust publishing bitrate #WCS-4013
10108
+ _sdp = util.setPublishingBitrate(_sdp, mediaConnection, minBitrate, maxBitrate);
10085
10109
  mediaConnection.setRemoteSdp(_sdp).then(function () {});
10086
10110
  return;
10087
10111
  }
@@ -11358,6 +11382,62 @@ var SDP = {
11358
11382
  }
11359
11383
  }
11360
11384
  return result;
11385
+ },
11386
+ setPublishingBitrate: function setPublishingBitrate(sdp, minBitrate, maxBitrate) {
11387
+ if (sdp && (minBitrate || maxBitrate)) {
11388
+ var sdpArray = sdp.split("\n");
11389
+ var i;
11390
+ var rtpmap = -1,
11391
+ codec = "";
11392
+ var matches;
11393
+ var bitrateString = "";
11394
+ for (i = 0; i < sdpArray.length; i++) {
11395
+ if (sdpArray[i].startsWith("a=rtpmap")) {
11396
+ matches = sdpArray[i].match("a=rtpmap:(.+) (.+)/.*");
11397
+ if (matches && matches.length > 2) {
11398
+ rtpmap = parseInt(matches[1], 10);
11399
+ codec = matches[2];
11400
+ }
11401
+ } else {
11402
+ if (codec === "H264" || codec === "VP8") {
11403
+ if (sdpArray[i].startsWith("a=fmtp:" + rtpmap)) {
11404
+ bitrateString = this.getBitrateString(sdpArray[i], minBitrate, maxBitrate);
11405
+ if (bitrateString) {
11406
+ sdpArray[i] += ";" + bitrateString;
11407
+ }
11408
+ } else {
11409
+ bitrateString = this.getBitrateString("", minBitrate, maxBitrate);
11410
+ if (bitrateString) {
11411
+ sdpArray[i] = "a=fmtp:" + rtpmap + " " + bitrateString + "\r\n" + sdpArray[i];
11412
+ }
11413
+ }
11414
+ codec = "";
11415
+ rtpmap = -1;
11416
+ }
11417
+ }
11418
+ }
11419
+ var newSDP = "";
11420
+ for (i = 0; i < sdpArray.length; i++) {
11421
+ if (sdpArray[i] != "") {
11422
+ newSDP += sdpArray[i] + "\n";
11423
+ }
11424
+ }
11425
+ return newSDP;
11426
+ }
11427
+ return sdp;
11428
+ },
11429
+ getBitrateString: function getBitrateString(string, minBitrate, maxBitrate) {
11430
+ var bitrateString = "";
11431
+ if (minBitrate && string.indexOf("x-google-min-bitrate") == -1) {
11432
+ bitrateString += "x-google-min-bitrate=" + minBitrate;
11433
+ }
11434
+ if (maxBitrate && string.indexOf("x-google-max-bitrate") == -1) {
11435
+ if (bitrateString) {
11436
+ bitrateString += ";";
11437
+ }
11438
+ bitrateString += "x-google-max-bitrate=" + maxBitrate;
11439
+ }
11440
+ return bitrateString;
11361
11441
  }
11362
11442
  };
11363
11443
  var logger = function logger() {
@@ -11601,6 +11681,18 @@ var isPromise = function isPromise(object) {
11601
11681
  }
11602
11682
  return false;
11603
11683
  };
11684
+ var setPublishingBitrate = function setPublishingBitrate(sdp, mediaConnection, minBitrate, maxBitrate) {
11685
+ if (minBitrate || maxBitrate) {
11686
+ if (sdp && Browser.isChrome() || Browser.isSafariWebRTC()) {
11687
+ // Set publishing bitrate constraints via remote SDP
11688
+ sdp = SDP.setPublishingBitrate(sdp, minBitrate, maxBitrate);
11689
+ } else if (mediaConnection) {
11690
+ // Set publishing bitrate via sender encodings if SDP feature is not supported
11691
+ mediaConnection.setPublishingBitrate(minBitrate, maxBitrate);
11692
+ }
11693
+ }
11694
+ return sdp;
11695
+ };
11604
11696
  module.exports = {
11605
11697
  isEmptyObject: isEmptyObject,
11606
11698
  copyObjectToArray: copyObjectToArray,
@@ -11611,7 +11703,8 @@ module.exports = {
11611
11703
  logger: logger,
11612
11704
  stripCodecs: stripCodecs,
11613
11705
  getCurrentCodecAndSampleRate: getCurrentCodecAndSampleRate,
11614
- isPromise: isPromise
11706
+ isPromise: isPromise,
11707
+ setPublishingBitrate: setPublishingBitrate
11615
11708
  };
11616
11709
 
11617
11710
  },{}],43:[function(require,module,exports){
@@ -11687,7 +11780,7 @@ var createConnection = function createConnection(options) {
11687
11780
  if (localVideo.srcObject) {
11688
11781
  localVideo.id = id + "-local";
11689
11782
  setContentHint(localVideo.srcObject, videoContentHint);
11690
- connection.addStream(localVideo.srcObject);
11783
+ addStreamTracks(connection, localVideo.srcObject);
11691
11784
  } else {
11692
11785
  localVideo = null;
11693
11786
  }
@@ -11730,7 +11823,7 @@ var createConnection = function createConnection(options) {
11730
11823
  localVideo = cachedVideo;
11731
11824
  localVideo.id = id;
11732
11825
  setContentHint(localVideo.srcObject, videoContentHint);
11733
- connection.addStream(localVideo.srcObject);
11826
+ addStreamTracks(connection, localVideo.srcObject);
11734
11827
  }
11735
11828
  } else {
11736
11829
  // There is a custom video element, get its id if set #WCS-3606
@@ -11777,6 +11870,11 @@ var createConnection = function createConnection(options) {
11777
11870
  }
11778
11871
  });
11779
11872
  }
11873
+ function addStreamTracks(pc, stream) {
11874
+ stream.getTracks().forEach(function (track) {
11875
+ pc.addTrack(track, stream);
11876
+ });
11877
+ }
11780
11878
  connection.ontrack = function (event) {
11781
11879
  if (remoteVideo) {
11782
11880
  remoteVideo.srcObject = event.streams[0];
@@ -12370,6 +12468,20 @@ var createConnection = function createConnection(options) {
12370
12468
  logger.info(LOG_PREFIX, "Switch to cam");
12371
12469
  screenShare = false;
12372
12470
  };
12471
+ var setPublishingBitrate = function setPublishingBitrate(minBitrate, maxBitrate) {
12472
+ var senders = connection.getSenders();
12473
+ senders.forEach(function (sender) {
12474
+ if (sender.track.kind == "video" && maxBitrate) {
12475
+ var parameters = sender.getParameters();
12476
+ for (var i = 0; i < parameters.encodings.length; i++) {
12477
+ if (!parameters.encodings[i].maxBitrate) {
12478
+ parameters.encodings[i].maxBitrate = maxBitrate * 1000;
12479
+ }
12480
+ }
12481
+ sender.setParameters(parameters).then(function () {});
12482
+ }
12483
+ });
12484
+ };
12373
12485
  var exports = {};
12374
12486
  exports.state = state;
12375
12487
  exports.createOffer = createOffer;
@@ -12396,6 +12508,7 @@ var createConnection = function createConnection(options) {
12396
12508
  exports.switchMic = switchMic;
12397
12509
  exports.switchToScreen = switchToScreen;
12398
12510
  exports.switchToCam = switchToCam;
12511
+ exports.setPublishingBitrate = setPublishingBitrate;
12399
12512
  connections[id] = exports;
12400
12513
  resolve(exports);
12401
12514
  });