@flashphoner/websdk 2.0.210 → 2.0.215

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.
@@ -9071,6 +9071,11 @@ var createConnection = function(options) {
9071
9071
  var display = options.display || options.localDisplay;
9072
9072
  var flashBufferTime = options.flashBufferTime || 0;
9073
9073
 
9074
+ // Set connection logger #WCS-2434
9075
+ if (options.logger) {
9076
+ logger = options.logger;
9077
+ }
9078
+
9074
9079
  var url = getConnectionUrl(options.mainUrl, options.flashProto, options.flashPort);
9075
9080
 
9076
9081
  //todo state from flash instance
@@ -9635,7 +9640,8 @@ module.exports = {
9635
9640
  const { v1: uuid_v1 } = require('uuid');
9636
9641
  var constants = require("./constants");
9637
9642
  var util = require('./util');
9638
- var logger = require('./util').logger;
9643
+ var LoggerObject = require('./util').logger;
9644
+ var coreLogger;
9639
9645
  var loggerConf = {push: false, severity: "INFO"};
9640
9646
  var Promise = require('promise-polyfill');
9641
9647
  var KalmanFilter = require('kalmanjs');
@@ -9678,7 +9684,7 @@ var disableConnectionQualityCalculation;
9678
9684
  * @param {String=} options.decoderLocation Location of video-worker2.js file
9679
9685
  * @param {String=} options.screenSharingExtensionId Chrome screen sharing extension id
9680
9686
  * @param {Object=} options.constraints Default local media constraints
9681
- * @param {Object=} options.logger Enable logging
9687
+ * @param {Object=} options.logger Core logger options
9682
9688
  * @throws {Error} Error if none of MediaProviders available
9683
9689
  * @memberof Flashphoner
9684
9690
  */
@@ -9687,12 +9693,8 @@ var init = function (options) {
9687
9693
  if (!options) {
9688
9694
  options = {};
9689
9695
  }
9690
- loggerConf = options.logger || loggerConf;
9691
- if (options.logger !== null) {
9692
- loggerConf.enableLogs = true;
9693
- }
9694
- // init logger
9695
- logger.init(loggerConf.severity || "INFO", loggerConf.push || false, loggerConf.customLogger, loggerConf.enableLogs);
9696
+ // init global logger
9697
+ coreLogger = createLogger(options.logger);
9696
9698
  var waitingTemasys = false;
9697
9699
  try {
9698
9700
  var audioContext = new (window.AudioContext || window.webkitAudioContext)();
@@ -9709,7 +9711,7 @@ var init = function (options) {
9709
9711
  constraints: options.constraints || getDefaultMediaConstraints(),
9710
9712
  extensionId: options.screenSharingExtensionId,
9711
9713
  audioContext: audioContext,
9712
- logger: logger,
9714
+ logger: coreLogger,
9713
9715
  createMicGainNode: enableGainNode
9714
9716
  };
9715
9717
  webRtcProvider.configure(webRtcConf);
@@ -9724,7 +9726,7 @@ var init = function (options) {
9724
9726
  var webRtcConf = {
9725
9727
  constraints: options.constraints || getDefaultMediaConstraints(),
9726
9728
  extensionId: options.screenSharingExtensionId,
9727
- logger: logger
9729
+ logger: coreLogger
9728
9730
  };
9729
9731
  webRtcProvider.configure(webRtcConf);
9730
9732
 
@@ -9750,7 +9752,7 @@ var init = function (options) {
9750
9752
  var flashConf = {
9751
9753
  constraints: options.constraints || getDefaultMediaConstraints(),
9752
9754
  flashMediaProviderSwfLocation: options.flashMediaProviderSwfLocation,
9753
- logger: logger
9755
+ logger: coreLogger
9754
9756
  };
9755
9757
  flashProvider.configure(flashConf);
9756
9758
  }
@@ -9770,7 +9772,7 @@ var init = function (options) {
9770
9772
  receiverLocation: options.receiverLocation,
9771
9773
  decoderLocation: options.decoderLocation,
9772
9774
  audioContext: audioContext,
9773
- logger: logger
9775
+ logger: coreLogger
9774
9776
  };
9775
9777
  websocketProvider.configure(wsConf);
9776
9778
  }
@@ -9790,7 +9792,7 @@ var init = function (options) {
9790
9792
  MediaProvider = _MediaProvider;
9791
9793
  }
9792
9794
  } else {
9793
- logger.warn(LOG_PREFIX, "Preferred media provider is not available.");
9795
+ corelogger.warn(LOG_PREFIX, "Preferred media provider is not available.");
9794
9796
  }
9795
9797
  }
9796
9798
  if (options.preferredMediaProviders && options.preferredMediaProviders.length > 0) {
@@ -9813,7 +9815,7 @@ var init = function (options) {
9813
9815
  if (!waitingTemasys && options.mediaProvidersReadyCallback) {
9814
9816
  options.mediaProvidersReadyCallback(Object.keys(MediaProvider));
9815
9817
  }
9816
- logger.info(LOG_PREFIX, "Initialized");
9818
+ coreLogger.info(LOG_PREFIX, "Initialized");
9817
9819
  initialized = true;
9818
9820
  }
9819
9821
  };
@@ -9851,17 +9853,16 @@ var playFirstVideo = function (display, isLocal, src) {
9851
9853
  };
9852
9854
 
9853
9855
  /**
9854
- * Get logger
9856
+ * Get core logger
9855
9857
  *
9856
9858
  * @returns {Object} Logger
9857
9859
  * @memberof Flashphoner
9858
9860
  */
9859
-
9860
9861
  var getLogger = function () {
9861
9862
  if (!initialized) {
9862
9863
  console.warn("Initialize API first.");
9863
9864
  } else {
9864
- return logger;
9865
+ return coreLogger;
9865
9866
  }
9866
9867
  }
9867
9868
 
@@ -10020,6 +10021,26 @@ var getSession = function (id) {
10020
10021
  return sessions[id];
10021
10022
  };
10022
10023
 
10024
+ // Get logger configuration from options
10025
+ var getLoggerConf = function(loggerOptions) {
10026
+ var conf = loggerOptions || loggerConf;
10027
+ if (loggerOptions !== null) {
10028
+ conf.enableLogs = true;
10029
+ }
10030
+ return conf;
10031
+ }
10032
+
10033
+ // Create a new logger object
10034
+ var createLogger = function(loggerOptions, parentLogger = coreLogger) {
10035
+ var newLogger = parentLogger;
10036
+ if (newLogger === undefined || loggerOptions != undefined) {
10037
+ var loggerConf = getLoggerConf(loggerOptions);
10038
+ newLogger = new LoggerObject;
10039
+ newLogger.init(loggerConf.severity || "INFO", loggerConf.push || false, loggerConf.customLogger, loggerConf.enableLogs);
10040
+ }
10041
+ return newLogger;
10042
+ }
10043
+
10023
10044
  /**
10024
10045
  * Create new session and connect to server.
10025
10046
  *
@@ -10038,6 +10059,7 @@ var getSession = function (id) {
10038
10059
  * @param {Integer=} options.pingInterval Server ping interval in milliseconds [0]
10039
10060
  * @param {Integer=} options.receiveProbes A maximum subsequental pings received missing count [0]
10040
10061
  * @param {Integer=} options.probesInterval Interval to check subsequental pings received [0]
10062
+ * @param {Object=} options.logger Session logger options
10041
10063
  * @returns {Session} Created session
10042
10064
  * @throws {Error} Error if API is not initialized
10043
10065
  * @throws {TypeError} Error if options.urlServer is not specified
@@ -10052,6 +10074,11 @@ var createSession = function (options) {
10052
10074
  throw new TypeError("options.urlServer must be provided");
10053
10075
  }
10054
10076
 
10077
+ // Set session logger #WCS-2434
10078
+ var sessionLogger = createLogger(options.logger)
10079
+ // Override logger for all low level operations
10080
+ var logger = sessionLogger;
10081
+
10055
10082
  var id_ = uuid_v1();
10056
10083
  var sessionStatus = SESSION_STATUS.PENDING;
10057
10084
  var urlServer = options.urlServer;
@@ -10150,7 +10177,7 @@ var createSession = function (options) {
10150
10177
  if (timeout != undefined && timeout > 0) {
10151
10178
  connectionTimeout = setTimeout(function() {
10152
10179
  if (wsConnection.readyState == 0) {
10153
- console.log("WS connection timeout");
10180
+ logger.warn(LOG_PREFIX, "WS connection timeout");
10154
10181
  wsConnection.close();
10155
10182
  }
10156
10183
  }, timeout);
@@ -10171,7 +10198,7 @@ var createSession = function (options) {
10171
10198
  mediaProviders: Object.keys(MediaProvider),
10172
10199
  keepAlive: keepAlive,
10173
10200
  authToken:authToken,
10174
- clientVersion: "2.0.210",
10201
+ clientVersion: "2.0.215",
10175
10202
  clientOSVersion: window.navigator.appVersion,
10176
10203
  clientBrowserVersion: window.navigator.userAgent,
10177
10204
  msePacketizationVersion: 2,
@@ -10428,6 +10455,7 @@ var createSession = function (options) {
10428
10455
  * @param {Array<string>=} options.sipSDP Array of custom SDP params (ex. bandwidth (b=))
10429
10456
  * @param {Array<string>=} options.sipHeaders Array of custom SIP headers
10430
10457
  * @param {string=} options.videoContentHint Video content hint for browser ('detail' by default to maintain resolution), {@link Flashphoner.constants.CONTENT_HINT_TYPE}
10458
+ * @param {Object=} options.logger Call logger options
10431
10459
  * @param {sdpHook} sdpHook The callback that handles sdp from the server
10432
10460
  * @returns {Call} Call
10433
10461
  * @throws {TypeError} Error if no options provided
@@ -10438,14 +10466,19 @@ var createSession = function (options) {
10438
10466
  var createCall = function (options) {
10439
10467
  //check session state
10440
10468
  if (sessionStatus !== SESSION_STATUS.REGISTERED && sessionStatus !== SESSION_STATUS.ESTABLISHED) {
10441
- logger.info(LOG_PREFIX, "Status is " + sessionStatus);
10442
- throw new Error('Invalid session state');
10469
+ throw new Error('Invalid session state ' + sessionStatus);
10443
10470
  }
10444
10471
 
10445
10472
  //check options
10446
10473
  if (!options) {
10447
10474
  throw new TypeError("options must be provided");
10448
10475
  }
10476
+
10477
+ // Set call logger #WCS-2434
10478
+ var callLogger = createLogger(options.logger, sessionLogger);
10479
+ // Override logger for all low level operations
10480
+ var logger = callLogger;
10481
+
10449
10482
  var login = (appKey == 'clickToCallApp') ? '' : cConfig.sipLogin;
10450
10483
  var caller_ = (options.incoming) ? options.caller : login;
10451
10484
  var callee_ = options.callee;
@@ -10581,7 +10614,8 @@ var createSession = function (options) {
10581
10614
  constraints: constraints,
10582
10615
  connectionConfig: mediaOptions,
10583
10616
  audioOutputId: audioOutputId,
10584
- videoContentHint: videoContentHint
10617
+ videoContentHint: videoContentHint,
10618
+ logger: logger
10585
10619
  }).then(function (newConnection) {
10586
10620
  mediaConnection = newConnection;
10587
10621
  return mediaConnection.createOffer({
@@ -11092,7 +11126,7 @@ var createSession = function (options) {
11092
11126
  /**
11093
11127
  * Get call info
11094
11128
  * @returns {string} Info
11095
- * @memberof Stream
11129
+ * @memberof Call
11096
11130
  * @inner
11097
11131
  */
11098
11132
  var getInfo = function () {
@@ -11102,13 +11136,22 @@ var createSession = function (options) {
11102
11136
  /**
11103
11137
  * Get stream error info
11104
11138
  * @returns {string} Error info
11105
- * @memberof Stream
11139
+ * @memberof Call
11106
11140
  * @inner
11107
11141
  */
11108
11142
  var getErrorInfo = function () {
11109
11143
  return errorInfo_;
11110
11144
  };
11111
11145
 
11146
+ /**
11147
+ * Get call logger
11148
+ *
11149
+ * @returns {Object} Logger
11150
+ * @memberof Call
11151
+ */
11152
+ var getLogger = function () {
11153
+ return callLogger;
11154
+ };
11112
11155
 
11113
11156
  call.call = call_;
11114
11157
  call.answer = answer;
@@ -11140,6 +11183,7 @@ var createSession = function (options) {
11140
11183
  call.switchMic = switchMic;
11141
11184
  call.switchToScreen = switchToScreen;
11142
11185
  call.switchToCam = switchToCam;
11186
+ call.getLogger = getLogger;
11143
11187
  calls[id_] = call;
11144
11188
  return call;
11145
11189
  };
@@ -11187,6 +11231,7 @@ var createSession = function (options) {
11187
11231
  * @param {string=} options.useCanvasMediaStream EXPERIMENTAL: when publish bind browser's media stream to the canvas. It can be useful for image filtering
11188
11232
  * @param {string=} options.videoContentHint Video content hint for browser ('detail' by default to maintain resolution), {@link Flashphoner.constants.CONTENT_HINT_TYPE}
11189
11233
  * @param {Boolean=} options.unmutePlayOnStart Unmute playback on start. May be used after user gesture only, so set 'unmutePlayOnStart: false' for autoplay
11234
+ * @param {Object=} options.logger Stream logger options
11190
11235
  * @param {sdpHook} sdpHook The callback that handles sdp from the server
11191
11236
  * @returns {Stream} Stream
11192
11237
  * @throws {TypeError} Error if no options provided
@@ -11201,7 +11246,7 @@ var createSession = function (options) {
11201
11246
  var availableCallbacks = [];
11202
11247
  //check session state
11203
11248
  if (sessionStatus !== SESSION_STATUS.ESTABLISHED) {
11204
- throw new Error('Invalid session state');
11249
+ throw new Error('Invalid session state ' + sessionStatus);
11205
11250
  }
11206
11251
 
11207
11252
  //check options
@@ -11212,6 +11257,11 @@ var createSession = function (options) {
11212
11257
  throw new TypeError("options.name must be provided");
11213
11258
  }
11214
11259
 
11260
+ // Set stream logger #WCS-2434
11261
+ var streamLogger = createLogger(options.logger, sessionLogger);
11262
+ // Override logger for all low level operations
11263
+ var logger = streamLogger;
11264
+
11215
11265
  var clientKf = new KalmanFilter();
11216
11266
  var serverKf = new KalmanFilter();
11217
11267
 
@@ -11448,7 +11498,7 @@ var createSession = function (options) {
11448
11498
  var play = function () {
11449
11499
  logger.debug(LOG_PREFIX, "Play stream " + name_);
11450
11500
  if (status_ !== STREAM_STATUS.NEW) {
11451
- throw new Error("Invalid stream state");
11501
+ throw new Error("Invalid stream state " + status_);
11452
11502
  }
11453
11503
  status_ = STREAM_STATUS.PENDING;
11454
11504
  //create mediaProvider connection
@@ -11466,7 +11516,8 @@ var createSession = function (options) {
11466
11516
  audioOutputId: audioOutputId,
11467
11517
  remoteVideo: remoteVideo,
11468
11518
  playoutDelay: playoutDelay,
11469
- unmutePlayOnStart: unmutePlayOnStart
11519
+ unmutePlayOnStart: unmutePlayOnStart,
11520
+ logger: logger
11470
11521
  }, streamRefreshHandlers[id_]).then(function (newConnection) {
11471
11522
  mediaConnection = newConnection;
11472
11523
  try {
@@ -11523,7 +11574,7 @@ var createSession = function (options) {
11523
11574
  var publish = function () {
11524
11575
  logger.debug(LOG_PREFIX, "Publish stream " + name_);
11525
11576
  if (status_ !== STREAM_STATUS.NEW) {
11526
- throw new Error("Invalid stream state");
11577
+ throw new Error("Invalid stream state " + status_);
11527
11578
  }
11528
11579
  status_ = STREAM_STATUS.PENDING;
11529
11580
  published_ = true;
@@ -11554,7 +11605,8 @@ var createSession = function (options) {
11554
11605
  connectionConfig: mediaOptions,
11555
11606
  connectionConstraints: mediaConnectionConstraints,
11556
11607
  customStream: constraints && constraints.customStream ? constraints.customStream : false,
11557
- videoContentHint: videoContentHint
11608
+ videoContentHint: videoContentHint,
11609
+ logger: logger
11558
11610
  }).then(function (newConnection) {
11559
11611
  mediaConnection = newConnection;
11560
11612
  return mediaConnection.createOffer({
@@ -12133,6 +12185,16 @@ var createSession = function (options) {
12133
12185
  });
12134
12186
  };
12135
12187
 
12188
+ /**
12189
+ * Get stream logger
12190
+ *
12191
+ * @returns {Object} Logger
12192
+ * @memberof Stream
12193
+ */
12194
+ var getLogger = function () {
12195
+ return streamLogger;
12196
+ };
12197
+
12136
12198
  stream.play = play;
12137
12199
  stream.publish = publish;
12138
12200
  stream.stop = stop;
@@ -12171,6 +12233,7 @@ var createSession = function (options) {
12171
12233
  stream.switchToScreen = switchToScreen;
12172
12234
  stream.switchToCam = switchToCam;
12173
12235
  stream.sendData = sendData;
12236
+ stream.getLogger = getLogger;
12174
12237
 
12175
12238
  streams[id_] = stream;
12176
12239
  return stream;
@@ -12361,6 +12424,16 @@ var createSession = function (options) {
12361
12424
  return sdp;
12362
12425
  }
12363
12426
 
12427
+ /**
12428
+ * Get session logger
12429
+ *
12430
+ * @returns {Object} Logger
12431
+ * @memberof Session
12432
+ */
12433
+ var getLogger = function () {
12434
+ return sessionLogger;
12435
+ };
12436
+
12364
12437
  //export Session
12365
12438
  session.id = id;
12366
12439
  session.status = status;
@@ -12375,6 +12448,7 @@ var createSession = function (options) {
12375
12448
  session.startDebug = startDebug;
12376
12449
  session.stopDebug = stopDebug;
12377
12450
  session.on = on;
12451
+ session.getLogger = getLogger;
12378
12452
 
12379
12453
  //save interface to global map
12380
12454
  sessions[id_] = session;
@@ -12877,8 +12951,15 @@ var appSession = function (options) {
12877
12951
 
12878
12952
  //participant helpers
12879
12953
  function play(streamName) {
12880
- return function (display) {
12881
- var stream = session.createStream({name: streamName, display: display, custom: {name: name_}});
12954
+ // Pass stream options to play #WCS-3445
12955
+ return function (display, options = {}) {
12956
+ var streamOptions = {
12957
+ ...options,
12958
+ name: streamName,
12959
+ display: display,
12960
+ custom: {name: name_}
12961
+ };
12962
+ var stream = session.createStream(streamOptions);
12882
12963
  stream.play();
12883
12964
  return stream;
12884
12965
  }
@@ -12992,6 +13073,11 @@ var Promise = require('es6-promise').Promise;
12992
13073
 
12993
13074
  var createConnection = function (options) {
12994
13075
  return new Promise(function (resolve, reject) {
13076
+ // Set connection logger #WCS-2434
13077
+ if (options.logger) {
13078
+ logger = options.logger;
13079
+ }
13080
+
12995
13081
  var id = options.id;
12996
13082
  var connectionConfig = options.connectionConfig || {"iceServers": []};
12997
13083
  var connection = new RTCPeerConnection(connectionConfig, {
@@ -13547,148 +13633,154 @@ module.exports = {
13547
13633
  },{"./util":46,"es6-promise":1,"uuid":9,"webrtc-adapter":24}],46:[function(require,module,exports){
13548
13634
  'use strict';
13549
13635
 
13550
- module.exports = {
13636
+ const isEmptyObject = function( obj ) {
13637
+ for ( var name in obj ) {
13638
+ return false;
13639
+ }
13640
+ return true;
13641
+ };
13551
13642
 
13552
- isEmptyObject: function( obj ) {
13553
- for ( var name in obj ) {
13554
- return false;
13643
+ /**
13644
+ * Copy values of object own properties to array.
13645
+ *
13646
+ * @param obj
13647
+ * @returns {Array}
13648
+ */
13649
+ const copyObjectToArray = function(obj) {
13650
+ var ret = [];
13651
+ for (var prop in obj) {
13652
+ if(obj.hasOwnProperty(prop)) {
13653
+ ret.push(obj[prop]);
13555
13654
  }
13556
- return true;
13557
- },
13655
+ }
13656
+ return ret;
13657
+ };
13558
13658
 
13559
- /**
13560
- * Copy values of object own properties to array.
13561
- *
13562
- * @param obj
13563
- * @returns {Array}
13564
- */
13565
- copyObjectToArray: function(obj) {
13566
- var ret = [];
13567
- for (var prop in obj) {
13568
- if(obj.hasOwnProperty(prop)) {
13569
- ret.push(obj[prop]);
13570
- }
13571
- }
13572
- return ret;
13573
- },
13574
- /**
13575
- * Copy src properties to dst object.
13576
- * Will overwrite dst prop with src prop in case of dst prop exist.
13577
- */
13578
- copyObjectPropsToAnotherObject: function(src, dst) {
13579
- for (var prop in src) {
13580
- if(src.hasOwnProperty(prop)) {
13581
- dst[prop] = src[prop];
13582
- }
13659
+ /**
13660
+ * Copy src properties to dst object.
13661
+ * Will overwrite dst prop with src prop in case of dst prop exist.
13662
+ */
13663
+ const copyObjectPropsToAnotherObject = function(src, dst) {
13664
+ for (var prop in src) {
13665
+ if(src.hasOwnProperty(prop)) {
13666
+ dst[prop] = src[prop];
13583
13667
  }
13584
- },
13585
- processRtcStatsReport: function(browser, report) {
13586
- var result = {};
13587
- if (browser == "chrome") {
13588
- /**
13589
- * Report types: googComponent, googCandidatePair, googCertificate, googLibjingleSession, googTrack, ssrc
13590
- */
13591
- var gotResult = false;
13592
- if (report.type && report.type == "googCandidatePair") {
13593
- //check if this is active pair
13594
- if (report.googActiveConnection == "true") {
13595
- gotResult = true;
13596
- }
13597
- }
13668
+ }
13669
+ };
13598
13670
 
13599
- if (report.type && report.type == "ssrc") {
13671
+ const processRtcStatsReport = function(browser, report) {
13672
+ var result = {};
13673
+ if (browser == "chrome") {
13674
+ /**
13675
+ * Report types: googComponent, googCandidatePair, googCertificate, googLibjingleSession, googTrack, ssrc
13676
+ */
13677
+ var gotResult = false;
13678
+ if (report.type && report.type == "googCandidatePair") {
13679
+ //check if this is active pair
13680
+ if (report.googActiveConnection == "true") {
13600
13681
  gotResult = true;
13601
13682
  }
13683
+ }
13602
13684
 
13603
- if (gotResult) {
13604
- for (var k in report) {
13605
- if (report.hasOwnProperty(k)) {
13606
- result[k] = report[k];
13607
- }
13685
+ if (report.type && report.type == "ssrc") {
13686
+ gotResult = true;
13687
+ }
13688
+
13689
+ if (gotResult) {
13690
+ for (var k in report) {
13691
+ if (report.hasOwnProperty(k)) {
13692
+ result[k] = report[k];
13608
13693
  }
13609
13694
  }
13610
- return result;
13611
- } else if (browser == "firefox") {
13612
- /**
13613
- * RTCStatsReport http://mxr.mozilla.org/mozilla-central/source/dom/webidl/RTCStatsReport.webidl
13614
- */
13695
+ }
13696
+ return result;
13697
+ } else if (browser == "firefox") {
13698
+ /**
13699
+ * RTCStatsReport http://mxr.mozilla.org/mozilla-central/source/dom/webidl/RTCStatsReport.webidl
13700
+ */
13615
13701
 
13616
- if (report.type && (report.type == "outboundrtp" || report.type == "inboundrtp") && report.id.indexOf("rtcp") == -1) {
13617
- result = {};
13618
- for (var k in report) {
13619
- if (report.hasOwnProperty(k)) {
13620
- result[k] = report[k];
13621
- }
13702
+ if (report.type && (report.type == "outboundrtp" || report.type == "inboundrtp") && report.id.indexOf("rtcp") == -1) {
13703
+ result = {};
13704
+ for (var k in report) {
13705
+ if (report.hasOwnProperty(k)) {
13706
+ result[k] = report[k];
13622
13707
  }
13623
13708
  }
13709
+ }
13624
13710
 
13625
- return result;
13626
- } else { return result };
13711
+ return result;
13712
+ } else {
13713
+ return result
13714
+ }
13715
+ };
13716
+
13717
+ const Browser = {
13718
+ isIE: function () {
13719
+ return /*@cc_on!@*/false || !!document.documentMode;
13627
13720
  },
13628
- Browser: {
13629
- isIE: function () {
13630
- return /*@cc_on!@*/false || !!document.documentMode;
13631
- },
13632
- isFirefox: function () {
13633
- return typeof InstallTrigger !== 'undefined';
13634
- },
13635
- isChrome: function () {
13636
- return !!window.chrome && /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor) && !/OPR/.test(navigator.userAgent);
13637
- },
13638
- isEdge: function () {
13639
- return !isIE && !!window.StyleMedia;
13640
- },
13641
- isOpera: function () {
13642
- return (!!window.opr && !!opr.addons) || !!window.opera || navigator.userAgent.indexOf(' OPR/') >= 0;
13643
- },
13644
- isiOS: function () {
13645
- return /iPad|iPhone|iPod/.test(navigator.userAgent) && !window.MSStream;
13646
- },
13647
- isSafari: function () {
13648
- var userAgent = navigator.userAgent.toLowerCase();
13649
- return /(safari|applewebkit)/i.test(userAgent) && !userAgent.includes("chrome") && !userAgent.includes("android");
13650
- },
13651
- isAndroid: function () {
13652
- return navigator.userAgent.toLowerCase().indexOf("android") > -1;
13653
- },
13654
- isSafariWebRTC: function () {
13655
- return navigator.mediaDevices && this.isSafari();
13656
- },
13657
- isSamsungBrowser: function() {
13658
- return /SamsungBrowser/i.test(navigator.userAgent);
13659
- },
13660
- isAndroidFirefox: function () {
13661
- return this.isAndroid() && /Firefox/i.test(navigator.userAgent);
13662
- }
13721
+ isFirefox: function () {
13722
+ return typeof InstallTrigger !== 'undefined';
13663
13723
  },
13664
- SDP: {
13665
- matchPrefix: function(sdp,prefix) {
13666
- var parts = sdp.trim().split('\n').map(function(line) {
13667
- return line.trim();
13668
- });
13669
- return parts.filter(function(line) {
13670
- return line.indexOf(prefix) === 0;
13671
- });
13672
- },
13673
- writeFmtp: function (sdp, param, codec) {
13674
- var sdpArray = sdp.split("\n");
13675
- var i;
13676
- for (i = 0; i < sdpArray.length; i++) {
13677
- if (sdpArray[i].search(codec) != -1 && sdpArray[i].indexOf("a=rtpmap") == 0) {
13678
- sdpArray[i] += "\na=fmtp:" + sdpArray[i].match(/[0-9]+/)[0] + " " + param + "\r";
13679
- }
13724
+ isChrome: function () {
13725
+ return !!window.chrome && /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor) && !/OPR/.test(navigator.userAgent);
13726
+ },
13727
+ isEdge: function () {
13728
+ return !isIE && !!window.StyleMedia;
13729
+ },
13730
+ isOpera: function () {
13731
+ return (!!window.opr && !!opr.addons) || !!window.opera || navigator.userAgent.indexOf(' OPR/') >= 0;
13732
+ },
13733
+ isiOS: function () {
13734
+ return /iPad|iPhone|iPod/.test(navigator.userAgent) && !window.MSStream;
13735
+ },
13736
+ isSafari: function () {
13737
+ var userAgent = navigator.userAgent.toLowerCase();
13738
+ return /(safari|applewebkit)/i.test(userAgent) && !userAgent.includes("chrome") && !userAgent.includes("android");
13739
+ },
13740
+ isAndroid: function () {
13741
+ return navigator.userAgent.toLowerCase().indexOf("android") > -1;
13742
+ },
13743
+ isSafariWebRTC: function () {
13744
+ return navigator.mediaDevices && this.isSafari();
13745
+ },
13746
+ isSamsungBrowser: function() {
13747
+ return /SamsungBrowser/i.test(navigator.userAgent);
13748
+ },
13749
+ isAndroidFirefox: function () {
13750
+ return this.isAndroid() && /Firefox/i.test(navigator.userAgent);
13751
+ }
13752
+ };
13753
+
13754
+ const SDP = {
13755
+ matchPrefix: function(sdp,prefix) {
13756
+ var parts = sdp.trim().split('\n').map(function(line) {
13757
+ return line.trim();
13758
+ });
13759
+ return parts.filter(function(line) {
13760
+ return line.indexOf(prefix) === 0;
13761
+ });
13762
+ },
13763
+ writeFmtp: function (sdp, param, codec) {
13764
+ var sdpArray = sdp.split("\n");
13765
+ var i;
13766
+ for (i = 0; i < sdpArray.length; i++) {
13767
+ if (sdpArray[i].search(codec) != -1 && sdpArray[i].indexOf("a=rtpmap") == 0) {
13768
+ sdpArray[i] += "\na=fmtp:" + sdpArray[i].match(/[0-9]+/)[0] + " " + param + "\r";
13680
13769
  }
13681
- //normalize sdp after modifications
13682
- var result = "";
13683
- for (i = 0; i < sdpArray.length; i++) {
13684
- if (sdpArray[i] != "") {
13685
- result += sdpArray[i] + "\n";
13686
- }
13770
+ }
13771
+ //normalize sdp after modifications
13772
+ var result = "";
13773
+ for (i = 0; i < sdpArray.length; i++) {
13774
+ if (sdpArray[i] != "") {
13775
+ result += sdpArray[i] + "\n";
13687
13776
  }
13688
- return result;
13689
13777
  }
13690
- },
13691
- logger: {
13778
+ return result;
13779
+ }
13780
+ };
13781
+
13782
+ const logger = function() {
13783
+ return {
13692
13784
  init: function (verbosity, enablePushLogs, customLogger, enableLogs) {
13693
13785
  switch (verbosity.toUpperCase()) {
13694
13786
  case "DEBUG":
@@ -13725,7 +13817,6 @@ module.exports = {
13725
13817
  data: [{logs: delayedLogs[i]}]
13726
13818
  }));
13727
13819
  }
13728
-
13729
13820
  }
13730
13821
  delayedLogs = [];
13731
13822
  this.wsConnection.send(JSON.stringify({
@@ -13749,7 +13840,7 @@ module.exports = {
13749
13840
  this.customLogger.info(text);
13750
13841
  } else {
13751
13842
  console.log(prefix,text);
13752
- }
13843
+ }
13753
13844
  }
13754
13845
  },
13755
13846
  debug: function (src, text) {
@@ -13770,7 +13861,7 @@ module.exports = {
13770
13861
  if (!this.enableLogs){
13771
13862
  return;
13772
13863
  }
13773
- var prefix = this.date() + " TRACE " + src + " - ";
13864
+ var prefix = this.date() + " TRACE " + src + " - ";
13774
13865
  this.pushLogs(prefix + JSON.stringify(text) + '\n');
13775
13866
  if (this.verbosity >= 4) {
13776
13867
  if (this.customLogger != null) {
@@ -13784,7 +13875,7 @@ module.exports = {
13784
13875
  if (!this.enableLogs){
13785
13876
  return;
13786
13877
  }
13787
- var prefix = this.date() + " WARN " + src + " - ";
13878
+ var prefix = this.date() + " WARN " + src + " - ";
13788
13879
  this.pushLogs(prefix + JSON.stringify(text) + '\n');
13789
13880
  if (this.verbosity >= 1) {
13790
13881
  if (this.customLogger != null) {
@@ -13798,7 +13889,7 @@ module.exports = {
13798
13889
  if (!this.enableLogs){
13799
13890
  return;
13800
13891
  }
13801
- var prefix = this.date() + " ERROR " + src + " - ";
13892
+ var prefix = this.date() + " ERROR " + src + " - ";
13802
13893
  this.pushLogs(prefix + JSON.stringify(text) + '\n');
13803
13894
  if (this.verbosity >= 0) {
13804
13895
  if (this.customLogger != null) {
@@ -13840,82 +13931,96 @@ module.exports = {
13840
13931
  break;
13841
13932
  default :
13842
13933
  this.verbosity = 2;
13843
- };
13934
+ }
13844
13935
  }
13845
- },
13846
- stripCodecs: function(sdp, codecs) {
13847
- if (!codecs.length) return sdp;
13936
+ }
13937
+ };
13848
13938
 
13849
- var sdpArray = sdp.split("\n");
13850
- var codecsArray = codecs.split(",");
13939
+ const stripCodecs = function(sdp, codecs) {
13940
+ if (!codecs.length) return sdp;
13851
13941
 
13852
- //search and delete codecs line
13853
- var pt = [];
13854
- var i;
13855
- for (var p = 0; p < codecsArray.length; p++) {
13856
- console.log("Searching for codec " + codecsArray[p]);
13942
+ var sdpArray = sdp.split("\n");
13943
+ var codecsArray = codecs.split(",");
13944
+
13945
+ //search and delete codecs line
13946
+ var pt = [];
13947
+ var i;
13948
+ for (var p = 0; p < codecsArray.length; p++) {
13949
+ console.log("Searching for codec " + codecsArray[p]);
13950
+ for (i = 0; i < sdpArray.length; i++) {
13951
+ if (sdpArray[i].search(new RegExp(codecsArray[p],'i')) != -1 && sdpArray[i].indexOf("a=rtpmap") == 0) {
13952
+ console.log(codecsArray[p] + " detected");
13953
+ pt.push(sdpArray[i].match(/[0-9]+/)[0]);
13954
+ sdpArray[i] = "";
13955
+ }
13956
+ }
13957
+ }
13958
+ if (pt.length) {
13959
+ //searching for fmtp
13960
+ for (p = 0; p < pt.length; p++) {
13857
13961
  for (i = 0; i < sdpArray.length; i++) {
13858
- if (sdpArray[i].search(new RegExp(codecsArray[p],'i')) != -1 && sdpArray[i].indexOf("a=rtpmap") == 0) {
13859
- console.log(codecsArray[p] + " detected");
13860
- pt.push(sdpArray[i].match(/[0-9]+/)[0]);
13962
+ if (sdpArray[i].search("a=fmtp:" + pt[p]) != -1 || sdpArray[i].search("a=rtcp-fb:" + pt[p]) != -1) {
13861
13963
  sdpArray[i] = "";
13862
13964
  }
13863
13965
  }
13864
13966
  }
13865
- if (pt.length) {
13866
- //searching for fmtp
13867
- for (p = 0; p < pt.length; p++) {
13868
- for (i = 0; i < sdpArray.length; i++) {
13869
- if (sdpArray[i].search("a=fmtp:" + pt[p]) != -1 || sdpArray[i].search("a=rtcp-fb:" + pt[p]) != -1) {
13870
- sdpArray[i] = "";
13871
- }
13872
- }
13873
- }
13874
13967
 
13875
- //delete entries from m= line
13876
- for (i = 0; i < sdpArray.length; i++) {
13877
- if (sdpArray[i].search("m=audio") != -1 || sdpArray[i].search("m=video") != -1) {
13878
- var mLineSplitted = sdpArray[i].split(" ");
13879
- var newMLine = "";
13880
- for (var m = 0; m < mLineSplitted.length; m++) {
13881
- if (pt.indexOf(mLineSplitted[m].trim()) == -1 || m <= 2) {
13882
- newMLine += mLineSplitted[m];
13883
- if (m < mLineSplitted.length - 1) {
13884
- newMLine = newMLine + " ";
13885
- }
13968
+ //delete entries from m= line
13969
+ for (i = 0; i < sdpArray.length; i++) {
13970
+ if (sdpArray[i].search("m=audio") != -1 || sdpArray[i].search("m=video") != -1) {
13971
+ var mLineSplitted = sdpArray[i].split(" ");
13972
+ var newMLine = "";
13973
+ for (var m = 0; m < mLineSplitted.length; m++) {
13974
+ if (pt.indexOf(mLineSplitted[m].trim()) == -1 || m <= 2) {
13975
+ newMLine += mLineSplitted[m];
13976
+ if (m < mLineSplitted.length - 1) {
13977
+ newMLine = newMLine + " ";
13886
13978
  }
13887
13979
  }
13888
- sdpArray[i] = newMLine;
13889
13980
  }
13981
+ sdpArray[i] = newMLine;
13890
13982
  }
13891
13983
  }
13984
+ }
13892
13985
 
13893
- //normalize sdp after modifications
13894
- var result = "";
13895
- for (i = 0; i < sdpArray.length; i++) {
13896
- if (sdpArray[i] != "") {
13897
- result += sdpArray[i] + "\n";
13898
- }
13986
+ //normalize sdp after modifications
13987
+ var result = "";
13988
+ for (i = 0; i < sdpArray.length; i++) {
13989
+ if (sdpArray[i] != "") {
13990
+ result += sdpArray[i] + "\n";
13899
13991
  }
13900
- return result;
13901
- },
13902
- getCurrentCodecAndSampleRate: function(sdp, mediaType) {
13903
- var rows = sdp.split("\n");
13904
- var codecPt;
13905
- for (var i = 0; i < rows.length ; i++) {
13906
- if (codecPt && rows[i].indexOf("a=rtpmap:" + codecPt) != -1) {
13907
- var ret = {};
13908
- ret.name = rows[i].split(" ")[1].split("/")[0];
13909
- ret.sampleRate = rows[i].split(" ")[1].split("/")[1];
13910
- return ret;
13911
- }
13912
- //WCS-2136. WebRTC statistics doesn't work for VP8
13913
- if (rows[i].indexOf("m=" + mediaType) != -1) {
13914
- codecPt = rows[i].split(" ")[3].trim();
13915
- }
13992
+ }
13993
+ return result;
13994
+ };
13995
+
13996
+ const getCurrentCodecAndSampleRate = function(sdp, mediaType) {
13997
+ var rows = sdp.split("\n");
13998
+ var codecPt;
13999
+ for (var i = 0; i < rows.length ; i++) {
14000
+ if (codecPt && rows[i].indexOf("a=rtpmap:" + codecPt) != -1) {
14001
+ var ret = {};
14002
+ ret.name = rows[i].split(" ")[1].split("/")[0];
14003
+ ret.sampleRate = rows[i].split(" ")[1].split("/")[1];
14004
+ return ret;
14005
+ }
14006
+ //WCS-2136. WebRTC statistics doesn't work for VP8
14007
+ if (rows[i].indexOf("m=" + mediaType) != -1) {
14008
+ codecPt = rows[i].split(" ")[3].trim();
13916
14009
  }
13917
14010
  }
14011
+ };
14012
+
13918
14013
 
14014
+ module.exports = {
14015
+ isEmptyObject,
14016
+ copyObjectToArray,
14017
+ copyObjectPropsToAnotherObject,
14018
+ processRtcStatsReport,
14019
+ Browser,
14020
+ SDP,
14021
+ logger,
14022
+ stripCodecs,
14023
+ getCurrentCodecAndSampleRate
13919
14024
  };
13920
14025
 
13921
14026
  },{}],47:[function(require,module,exports){
@@ -13944,6 +14049,11 @@ var mics = [];
13944
14049
  var createConnection = function (options) {
13945
14050
  return new Promise(function (resolve, reject) {
13946
14051
 
14052
+ // Set connection logger #WCS-2434
14053
+ if (options.logger) {
14054
+ logger = options.logger;
14055
+ }
14056
+
13947
14057
  var id = options.id;
13948
14058
  var connectionConfig = options.connectionConfig || {"iceServers": []};
13949
14059
  var connectionConstraints = options.connectionConstraints || {};
@@ -14052,9 +14162,9 @@ var createConnection = function (options) {
14052
14162
  function setContentHint(stream, hint) {
14053
14163
  stream.getVideoTracks().forEach(function(track) {
14054
14164
  if(track.contentHint === undefined) {
14055
- logger.warn("contentHint unsupported");
14165
+ logger.warn(LOG_PREFIX, "Track contentHint unsupported");
14056
14166
  } else {
14057
- logger.info("Set video track contentHint to " + hint);
14167
+ logger.info(LOG_PREFIX, "Set video track contentHint to " + hint);
14058
14168
  track.contentHint = hint;
14059
14169
  }
14060
14170
  });
@@ -14089,7 +14199,7 @@ var createConnection = function (options) {
14089
14199
  //WCS-2771 add playback delay
14090
14200
  connection.getReceivers().forEach((track) => {
14091
14201
  if (track.playoutDelayHint === undefined) {
14092
- logger.warn("playout delay unsupported");
14202
+ logger.warn(LOG_PREFIX, "Playout delay unsupported");
14093
14203
  }
14094
14204
  track.playoutDelayHint = playoutDelay;
14095
14205
  });
@@ -14439,7 +14549,7 @@ var createConnection = function (options) {
14439
14549
  if (localVideo.srcObject.getAudioTracks().length == 0 && audioTrack) {
14440
14550
  localVideo.srcObject.addTrack(audioTrack);
14441
14551
  }
14442
- logger.info("Switch camera to " + cam);
14552
+ logger.info(LOG_PREFIX, "Switch camera to " + cam);
14443
14553
  resolve(cam);
14444
14554
  }).catch(function (reason) {
14445
14555
  logger.error(LOG_PREFIX, reason);
@@ -14490,7 +14600,7 @@ var createConnection = function (options) {
14490
14600
  if (videoTrack) {
14491
14601
  localVideo.srcObject.addTrack(videoTrack);
14492
14602
  }
14493
- logger.info("Switch mic to " + mic);
14603
+ logger.info(LOG_PREFIX, "Switch mic to " + mic);
14494
14604
  resolve(mic);
14495
14605
  }).catch(function (reason) {
14496
14606
  logger.error(LOG_PREFIX, reason);
@@ -14578,7 +14688,7 @@ var createConnection = function (options) {
14578
14688
  localVideo.srcObject.addTrack(currentAudioTrack);
14579
14689
  }
14580
14690
  });
14581
- logger.info("Switch to screen");
14691
+ logger.info(LOG_PREFIX, "Switch to screen");
14582
14692
  screenShare = true;
14583
14693
  resolve();
14584
14694
  };
@@ -14606,7 +14716,7 @@ var createConnection = function (options) {
14606
14716
  }
14607
14717
  });
14608
14718
  }
14609
- logger.info("Switch to cam");
14719
+ logger.info(LOG_PREFIX, "Switch to cam");
14610
14720
  screenShare = false;
14611
14721
  };
14612
14722
 
@@ -15320,6 +15430,8 @@ var playFirstVideo = function (display, isLocal, src) {
15320
15430
  var video = document.createElement('video');
15321
15431
  video.setAttribute("playsinline", "");
15322
15432
  video.setAttribute("webkit-playsinline", "");
15433
+ //Mute video tag to prevent local audio playback in Safari #WCS-3430
15434
+ video.muted = true;
15323
15435
  video.id = uuid_v1() + (isLocal ? LOCAL_CACHED_VIDEO : REMOTE_CACHED_VIDEO);
15324
15436
 
15325
15437
  //in WCS-1560 we removed video.play() call, because it triggers the “Unhandled Promise Rejection” exception in iOS Safari
@@ -15400,6 +15512,11 @@ var createConnection = function(options, handlers) {
15400
15512
  var id = options.id;
15401
15513
  var display = options.display;
15402
15514
 
15515
+ // Set connection logger #WCS-2434
15516
+ if (options.logger) {
15517
+ logger = options.logger;
15518
+ }
15519
+
15403
15520
  var canvas = document.createElement("canvas");
15404
15521
  display.appendChild(canvas);
15405
15522
  canvas.id = id;