@flashphoner/websdk 2.0.211 → 2.0.216

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.
@@ -9555,8 +9555,9 @@ var constants = require("./constants");
9555
9555
 
9556
9556
  var util = require('./util');
9557
9557
 
9558
- var logger = require('./util').logger;
9558
+ var LoggerObject = require('./util').logger;
9559
9559
 
9560
+ var coreLogger;
9560
9561
  var loggerConf = {
9561
9562
  push: false,
9562
9563
  severity: "INFO"
@@ -9604,7 +9605,7 @@ var disableConnectionQualityCalculation;
9604
9605
  * @param {String=} options.decoderLocation Location of video-worker2.js file
9605
9606
  * @param {String=} options.screenSharingExtensionId Chrome screen sharing extension id
9606
9607
  * @param {Object=} options.constraints Default local media constraints
9607
- * @param {Object=} options.logger Enable logging
9608
+ * @param {Object=} options.logger Core logger options
9608
9609
  * @throws {Error} Error if none of MediaProviders available
9609
9610
  * @memberof Flashphoner
9610
9611
  */
@@ -9613,16 +9614,10 @@ var init = function init(options) {
9613
9614
  if (!initialized) {
9614
9615
  if (!options) {
9615
9616
  options = {};
9616
- }
9617
-
9618
- loggerConf = options.logger || loggerConf;
9617
+ } // init global logger
9619
9618
 
9620
- if (options.logger !== null) {
9621
- loggerConf.enableLogs = true;
9622
- } // init logger
9623
9619
 
9624
-
9625
- logger.init(loggerConf.severity || "INFO", loggerConf.push || false, loggerConf.customLogger, loggerConf.enableLogs);
9620
+ coreLogger = createLogger(options.logger);
9626
9621
  var waitingTemasys = false;
9627
9622
 
9628
9623
  try {
@@ -9643,7 +9638,7 @@ var init = function init(options) {
9643
9638
  constraints: options.constraints || getDefaultMediaConstraints(),
9644
9639
  extensionId: options.screenSharingExtensionId,
9645
9640
  audioContext: audioContext,
9646
- logger: logger,
9641
+ logger: coreLogger,
9647
9642
  createMicGainNode: enableGainNode
9648
9643
  };
9649
9644
  webRtcProvider.configure(webRtcConf);
@@ -9660,7 +9655,7 @@ var init = function init(options) {
9660
9655
  var webRtcConf = {
9661
9656
  constraints: options.constraints || getDefaultMediaConstraints(),
9662
9657
  extensionId: options.screenSharingExtensionId,
9663
- logger: logger
9658
+ logger: coreLogger
9664
9659
  };
9665
9660
  webRtcProvider.configure(webRtcConf); // Just reorder media provider list
9666
9661
 
@@ -9688,7 +9683,7 @@ var init = function init(options) {
9688
9683
  var flashConf = {
9689
9684
  constraints: options.constraints || getDefaultMediaConstraints(),
9690
9685
  flashMediaProviderSwfLocation: options.flashMediaProviderSwfLocation,
9691
- logger: logger
9686
+ logger: coreLogger
9692
9687
  };
9693
9688
  flashProvider.configure(flashConf);
9694
9689
  }
@@ -9712,7 +9707,7 @@ var init = function init(options) {
9712
9707
  receiverLocation: options.receiverLocation,
9713
9708
  decoderLocation: options.decoderLocation,
9714
9709
  audioContext: audioContext,
9715
- logger: logger
9710
+ logger: coreLogger
9716
9711
  };
9717
9712
  websocketProvider.configure(wsConf);
9718
9713
  } //check at least 1 provider available
@@ -9734,7 +9729,7 @@ var init = function init(options) {
9734
9729
  MediaProvider = _MediaProvider;
9735
9730
  }
9736
9731
  } else {
9737
- logger.warn(LOG_PREFIX, "Preferred media provider is not available.");
9732
+ corelogger.warn(LOG_PREFIX, "Preferred media provider is not available.");
9738
9733
  }
9739
9734
  }
9740
9735
 
@@ -9762,7 +9757,7 @@ var init = function init(options) {
9762
9757
  options.mediaProvidersReadyCallback(Object.keys(MediaProvider));
9763
9758
  }
9764
9759
 
9765
- logger.info(LOG_PREFIX, "Initialized");
9760
+ coreLogger.info(LOG_PREFIX, "Initialized");
9766
9761
  initialized = true;
9767
9762
  }
9768
9763
  };
@@ -9801,7 +9796,7 @@ var playFirstVideo = function playFirstVideo(display, isLocal, src) {
9801
9796
  }
9802
9797
  };
9803
9798
  /**
9804
- * Get logger
9799
+ * Get core logger
9805
9800
  *
9806
9801
  * @returns {Object} Logger
9807
9802
  * @memberof Flashphoner
@@ -9812,7 +9807,7 @@ var getLogger = function getLogger() {
9812
9807
  if (!initialized) {
9813
9808
  console.warn("Initialize API first.");
9814
9809
  } else {
9815
- return logger;
9810
+ return coreLogger;
9816
9811
  }
9817
9812
  };
9818
9813
  /**
@@ -9985,6 +9980,31 @@ var getSessions = function getSessions() {
9985
9980
 
9986
9981
  var getSession = function getSession(id) {
9987
9982
  return sessions[id];
9983
+ }; // Get logger configuration from options
9984
+
9985
+
9986
+ var getLoggerConf = function getLoggerConf(loggerOptions) {
9987
+ var conf = loggerOptions || loggerConf;
9988
+
9989
+ if (loggerOptions !== null) {
9990
+ conf.enableLogs = true;
9991
+ }
9992
+
9993
+ return conf;
9994
+ }; // Create a new logger object
9995
+
9996
+
9997
+ var createLogger = function createLogger(loggerOptions) {
9998
+ var parentLogger = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : coreLogger;
9999
+ var newLogger = parentLogger;
10000
+
10001
+ if (newLogger === undefined || loggerOptions != undefined) {
10002
+ var loggerConf = getLoggerConf(loggerOptions);
10003
+ newLogger = new LoggerObject();
10004
+ newLogger.init(loggerConf.severity || "INFO", loggerConf.push || false, loggerConf.customLogger, loggerConf.enableLogs);
10005
+ }
10006
+
10007
+ return newLogger;
9988
10008
  };
9989
10009
  /**
9990
10010
  * Create new session and connect to server.
@@ -10004,6 +10024,7 @@ var getSession = function getSession(id) {
10004
10024
  * @param {Integer=} options.pingInterval Server ping interval in milliseconds [0]
10005
10025
  * @param {Integer=} options.receiveProbes A maximum subsequental pings received missing count [0]
10006
10026
  * @param {Integer=} options.probesInterval Interval to check subsequental pings received [0]
10027
+ * @param {Object=} options.logger Session logger options
10007
10028
  * @returns {Session} Created session
10008
10029
  * @throws {Error} Error if API is not initialized
10009
10030
  * @throws {TypeError} Error if options.urlServer is not specified
@@ -10018,8 +10039,12 @@ var createSession = function createSession(options) {
10018
10039
 
10019
10040
  if (!options || !options.urlServer) {
10020
10041
  throw new TypeError("options.urlServer must be provided");
10021
- }
10042
+ } // Set session logger #WCS-2434
10022
10043
 
10044
+
10045
+ var sessionLogger = createLogger(options.logger); // Override logger for all low level operations
10046
+
10047
+ var logger = sessionLogger;
10023
10048
  var id_ = uuid_v1();
10024
10049
  var sessionStatus = SESSION_STATUS.PENDING;
10025
10050
  var urlServer = options.urlServer;
@@ -10125,7 +10150,7 @@ var createSession = function createSession(options) {
10125
10150
  if (timeout != undefined && timeout > 0) {
10126
10151
  connectionTimeout = setTimeout(function () {
10127
10152
  if (wsConnection.readyState == 0) {
10128
- console.log("WS connection timeout");
10153
+ logger.warn(LOG_PREFIX, "WS connection timeout");
10129
10154
  wsConnection.close();
10130
10155
  }
10131
10156
  }, timeout);
@@ -10149,7 +10174,7 @@ var createSession = function createSession(options) {
10149
10174
  mediaProviders: Object.keys(MediaProvider),
10150
10175
  keepAlive: keepAlive,
10151
10176
  authToken: authToken,
10152
- clientVersion: "2.0.211",
10177
+ clientVersion: "2.0.216",
10153
10178
  clientOSVersion: window.navigator.appVersion,
10154
10179
  clientBrowserVersion: window.navigator.userAgent,
10155
10180
  msePacketizationVersion: 2,
@@ -10455,6 +10480,7 @@ var createSession = function createSession(options) {
10455
10480
  * @param {Array<string>=} options.sipSDP Array of custom SDP params (ex. bandwidth (b=))
10456
10481
  * @param {Array<string>=} options.sipHeaders Array of custom SIP headers
10457
10482
  * @param {string=} options.videoContentHint Video content hint for browser ('detail' by default to maintain resolution), {@link Flashphoner.constants.CONTENT_HINT_TYPE}
10483
+ * @param {Object=} options.logger Call logger options
10458
10484
  * @param {sdpHook} sdpHook The callback that handles sdp from the server
10459
10485
  * @returns {Call} Call
10460
10486
  * @throws {TypeError} Error if no options provided
@@ -10467,15 +10493,18 @@ var createSession = function createSession(options) {
10467
10493
  var createCall = function createCall(options) {
10468
10494
  //check session state
10469
10495
  if (sessionStatus !== SESSION_STATUS.REGISTERED && sessionStatus !== SESSION_STATUS.ESTABLISHED) {
10470
- logger.info(LOG_PREFIX, "Status is " + sessionStatus);
10471
- throw new Error('Invalid session state');
10496
+ throw new Error('Invalid session state ' + sessionStatus);
10472
10497
  } //check options
10473
10498
 
10474
10499
 
10475
10500
  if (!options) {
10476
10501
  throw new TypeError("options must be provided");
10477
- }
10502
+ } // Set call logger #WCS-2434
10478
10503
 
10504
+
10505
+ var callLogger = createLogger(options.logger, sessionLogger); // Override logger for all low level operations
10506
+
10507
+ var logger = callLogger;
10479
10508
  var login = appKey == 'clickToCallApp' ? '' : cConfig.sipLogin;
10480
10509
  var caller_ = options.incoming ? options.caller : login;
10481
10510
  var callee_ = options.callee;
@@ -10621,7 +10650,8 @@ var createSession = function createSession(options) {
10621
10650
  constraints: constraints,
10622
10651
  connectionConfig: mediaOptions,
10623
10652
  audioOutputId: audioOutputId,
10624
- videoContentHint: videoContentHint
10653
+ videoContentHint: videoContentHint,
10654
+ logger: logger
10625
10655
  }).then(function (newConnection) {
10626
10656
  mediaConnection = newConnection;
10627
10657
  return mediaConnection.createOffer({
@@ -11207,7 +11237,7 @@ var createSession = function createSession(options) {
11207
11237
  /**
11208
11238
  * Get call info
11209
11239
  * @returns {string} Info
11210
- * @memberof Stream
11240
+ * @memberof Call
11211
11241
  * @inner
11212
11242
  */
11213
11243
 
@@ -11218,7 +11248,7 @@ var createSession = function createSession(options) {
11218
11248
  /**
11219
11249
  * Get stream error info
11220
11250
  * @returns {string} Error info
11221
- * @memberof Stream
11251
+ * @memberof Call
11222
11252
  * @inner
11223
11253
  */
11224
11254
 
@@ -11226,6 +11256,17 @@ var createSession = function createSession(options) {
11226
11256
  var getErrorInfo = function getErrorInfo() {
11227
11257
  return errorInfo_;
11228
11258
  };
11259
+ /**
11260
+ * Get call logger
11261
+ *
11262
+ * @returns {Object} Logger
11263
+ * @memberof Call
11264
+ */
11265
+
11266
+
11267
+ var getLogger = function getLogger() {
11268
+ return callLogger;
11269
+ };
11229
11270
 
11230
11271
  call.call = call_;
11231
11272
  call.answer = answer;
@@ -11257,6 +11298,7 @@ var createSession = function createSession(options) {
11257
11298
  call.switchMic = switchMic;
11258
11299
  call.switchToScreen = switchToScreen;
11259
11300
  call.switchToCam = switchToCam;
11301
+ call.getLogger = getLogger;
11260
11302
  calls[id_] = call;
11261
11303
  return call;
11262
11304
  };
@@ -11303,6 +11345,7 @@ var createSession = function createSession(options) {
11303
11345
  * @param {string=} options.useCanvasMediaStream EXPERIMENTAL: when publish bind browser's media stream to the canvas. It can be useful for image filtering
11304
11346
  * @param {string=} options.videoContentHint Video content hint for browser ('detail' by default to maintain resolution), {@link Flashphoner.constants.CONTENT_HINT_TYPE}
11305
11347
  * @param {Boolean=} options.unmutePlayOnStart Unmute playback on start. May be used after user gesture only, so set 'unmutePlayOnStart: false' for autoplay
11348
+ * @param {Object=} options.logger Stream logger options
11306
11349
  * @param {sdpHook} sdpHook The callback that handles sdp from the server
11307
11350
  * @returns {Stream} Stream
11308
11351
  * @throws {TypeError} Error if no options provided
@@ -11318,7 +11361,7 @@ var createSession = function createSession(options) {
11318
11361
  var availableCallbacks = []; //check session state
11319
11362
 
11320
11363
  if (sessionStatus !== SESSION_STATUS.ESTABLISHED) {
11321
- throw new Error('Invalid session state');
11364
+ throw new Error('Invalid session state ' + sessionStatus);
11322
11365
  } //check options
11323
11366
 
11324
11367
 
@@ -11328,8 +11371,12 @@ var createSession = function createSession(options) {
11328
11371
 
11329
11372
  if (!options.name) {
11330
11373
  throw new TypeError("options.name must be provided");
11331
- }
11374
+ } // Set stream logger #WCS-2434
11375
+
11376
+
11377
+ var streamLogger = createLogger(options.logger, sessionLogger); // Override logger for all low level operations
11332
11378
 
11379
+ var logger = streamLogger;
11333
11380
  var clientKf = new KalmanFilter();
11334
11381
  var serverKf = new KalmanFilter();
11335
11382
  var id_ = uuid_v1();
@@ -11573,7 +11620,7 @@ var createSession = function createSession(options) {
11573
11620
  logger.debug(LOG_PREFIX, "Play stream " + name_);
11574
11621
 
11575
11622
  if (status_ !== STREAM_STATUS.NEW) {
11576
- throw new Error("Invalid stream state");
11623
+ throw new Error("Invalid stream state " + status_);
11577
11624
  }
11578
11625
 
11579
11626
  status_ = STREAM_STATUS.PENDING; //create mediaProvider connection
@@ -11592,7 +11639,8 @@ var createSession = function createSession(options) {
11592
11639
  audioOutputId: audioOutputId,
11593
11640
  remoteVideo: remoteVideo,
11594
11641
  playoutDelay: playoutDelay,
11595
- unmutePlayOnStart: unmutePlayOnStart
11642
+ unmutePlayOnStart: unmutePlayOnStart,
11643
+ logger: logger
11596
11644
  }, streamRefreshHandlers[id_]).then(function (newConnection) {
11597
11645
  mediaConnection = newConnection;
11598
11646
 
@@ -11656,7 +11704,7 @@ var createSession = function createSession(options) {
11656
11704
  logger.debug(LOG_PREFIX, "Publish stream " + name_);
11657
11705
 
11658
11706
  if (status_ !== STREAM_STATUS.NEW) {
11659
- throw new Error("Invalid stream state");
11707
+ throw new Error("Invalid stream state " + status_);
11660
11708
  }
11661
11709
 
11662
11710
  status_ = STREAM_STATUS.PENDING;
@@ -11690,7 +11738,8 @@ var createSession = function createSession(options) {
11690
11738
  connectionConfig: mediaOptions,
11691
11739
  connectionConstraints: mediaConnectionConstraints,
11692
11740
  customStream: constraints && constraints.customStream ? constraints.customStream : false,
11693
- videoContentHint: videoContentHint
11741
+ videoContentHint: videoContentHint,
11742
+ logger: logger
11694
11743
  }).then(function (newConnection) {
11695
11744
  mediaConnection = newConnection;
11696
11745
  return mediaConnection.createOffer({
@@ -12320,6 +12369,17 @@ var createSession = function createSession(options) {
12320
12369
  availableCallbacks.push(promise);
12321
12370
  });
12322
12371
  };
12372
+ /**
12373
+ * Get stream logger
12374
+ *
12375
+ * @returns {Object} Logger
12376
+ * @memberof Stream
12377
+ */
12378
+
12379
+
12380
+ var getLogger = function getLogger() {
12381
+ return streamLogger;
12382
+ };
12323
12383
 
12324
12384
  stream.play = play;
12325
12385
  stream.publish = publish;
@@ -12359,6 +12419,7 @@ var createSession = function createSession(options) {
12359
12419
  stream.switchToScreen = switchToScreen;
12360
12420
  stream.switchToCam = switchToCam;
12361
12421
  stream.sendData = sendData;
12422
+ stream.getLogger = getLogger;
12362
12423
  streams[id_] = stream;
12363
12424
  return stream;
12364
12425
  };
@@ -12567,6 +12628,17 @@ var createSession = function createSession(options) {
12567
12628
  }
12568
12629
 
12569
12630
  return sdp;
12631
+ };
12632
+ /**
12633
+ * Get session logger
12634
+ *
12635
+ * @returns {Object} Logger
12636
+ * @memberof Session
12637
+ */
12638
+
12639
+
12640
+ var getLogger = function getLogger() {
12641
+ return sessionLogger;
12570
12642
  }; //export Session
12571
12643
 
12572
12644
 
@@ -12582,7 +12654,8 @@ var createSession = function createSession(options) {
12582
12654
  session.submitBugReport = submitBugReport;
12583
12655
  session.startDebug = startDebug;
12584
12656
  session.stopDebug = stopDebug;
12585
- session.on = on; //save interface to global map
12657
+ session.on = on;
12658
+ session.getLogger = getLogger; //save interface to global map
12586
12659
 
12587
12660
  sessions[id_] = session;
12588
12661
  return session;
@@ -12628,165 +12701,171 @@ function _typeof(obj){"@babel/helpers - typeof";return _typeof="function"==typeo
12628
12701
  },{}],42:[function(require,module,exports){
12629
12702
  'use strict';
12630
12703
 
12631
- module.exports = {
12632
- isEmptyObject: function isEmptyObject(obj) {
12633
- for (var name in obj) {
12634
- return false;
12635
- }
12704
+ var isEmptyObject = function isEmptyObject(obj) {
12705
+ for (var name in obj) {
12706
+ return false;
12707
+ }
12636
12708
 
12637
- return true;
12638
- },
12709
+ return true;
12710
+ };
12711
+ /**
12712
+ * Copy values of object own properties to array.
12713
+ *
12714
+ * @param obj
12715
+ * @returns {Array}
12716
+ */
12639
12717
 
12640
- /**
12641
- * Copy values of object own properties to array.
12642
- *
12643
- * @param obj
12644
- * @returns {Array}
12645
- */
12646
- copyObjectToArray: function copyObjectToArray(obj) {
12647
- var ret = [];
12648
12718
 
12649
- for (var prop in obj) {
12650
- if (obj.hasOwnProperty(prop)) {
12651
- ret.push(obj[prop]);
12652
- }
12719
+ var copyObjectToArray = function copyObjectToArray(obj) {
12720
+ var ret = [];
12721
+
12722
+ for (var prop in obj) {
12723
+ if (obj.hasOwnProperty(prop)) {
12724
+ ret.push(obj[prop]);
12653
12725
  }
12726
+ }
12654
12727
 
12655
- return ret;
12656
- },
12728
+ return ret;
12729
+ };
12730
+ /**
12731
+ * Copy src properties to dst object.
12732
+ * Will overwrite dst prop with src prop in case of dst prop exist.
12733
+ */
12657
12734
 
12658
- /**
12659
- * Copy src properties to dst object.
12660
- * Will overwrite dst prop with src prop in case of dst prop exist.
12661
- */
12662
- copyObjectPropsToAnotherObject: function copyObjectPropsToAnotherObject(src, dst) {
12663
- for (var prop in src) {
12664
- if (src.hasOwnProperty(prop)) {
12665
- dst[prop] = src[prop];
12666
- }
12735
+
12736
+ var copyObjectPropsToAnotherObject = function copyObjectPropsToAnotherObject(src, dst) {
12737
+ for (var prop in src) {
12738
+ if (src.hasOwnProperty(prop)) {
12739
+ dst[prop] = src[prop];
12667
12740
  }
12668
- },
12669
- processRtcStatsReport: function processRtcStatsReport(browser, report) {
12670
- var result = {};
12741
+ }
12742
+ };
12671
12743
 
12672
- if (browser == "chrome") {
12673
- /**
12674
- * Report types: googComponent, googCandidatePair, googCertificate, googLibjingleSession, googTrack, ssrc
12675
- */
12676
- var gotResult = false;
12744
+ var processRtcStatsReport = function processRtcStatsReport(browser, report) {
12745
+ var result = {};
12677
12746
 
12678
- if (report.type && report.type == "googCandidatePair") {
12679
- //check if this is active pair
12680
- if (report.googActiveConnection == "true") {
12681
- gotResult = true;
12682
- }
12683
- }
12747
+ if (browser == "chrome") {
12748
+ /**
12749
+ * Report types: googComponent, googCandidatePair, googCertificate, googLibjingleSession, googTrack, ssrc
12750
+ */
12751
+ var gotResult = false;
12684
12752
 
12685
- if (report.type && report.type == "ssrc") {
12753
+ if (report.type && report.type == "googCandidatePair") {
12754
+ //check if this is active pair
12755
+ if (report.googActiveConnection == "true") {
12686
12756
  gotResult = true;
12687
12757
  }
12758
+ }
12688
12759
 
12689
- if (gotResult) {
12690
- for (var k in report) {
12691
- if (report.hasOwnProperty(k)) {
12692
- result[k] = report[k];
12693
- }
12760
+ if (report.type && report.type == "ssrc") {
12761
+ gotResult = true;
12762
+ }
12763
+
12764
+ if (gotResult) {
12765
+ for (var k in report) {
12766
+ if (report.hasOwnProperty(k)) {
12767
+ result[k] = report[k];
12694
12768
  }
12695
12769
  }
12770
+ }
12696
12771
 
12697
- return result;
12698
- } else if (browser == "firefox") {
12699
- /**
12700
- * RTCStatsReport http://mxr.mozilla.org/mozilla-central/source/dom/webidl/RTCStatsReport.webidl
12701
- */
12702
- if (report.type && (report.type == "outboundrtp" || report.type == "inboundrtp") && report.id.indexOf("rtcp") == -1) {
12703
- result = {};
12772
+ return result;
12773
+ } else if (browser == "firefox") {
12774
+ /**
12775
+ * RTCStatsReport http://mxr.mozilla.org/mozilla-central/source/dom/webidl/RTCStatsReport.webidl
12776
+ */
12777
+ if (report.type && (report.type == "outboundrtp" || report.type == "inboundrtp") && report.id.indexOf("rtcp") == -1) {
12778
+ result = {};
12704
12779
 
12705
- for (var k in report) {
12706
- if (report.hasOwnProperty(k)) {
12707
- result[k] = report[k];
12708
- }
12780
+ for (var k in report) {
12781
+ if (report.hasOwnProperty(k)) {
12782
+ result[k] = report[k];
12709
12783
  }
12710
12784
  }
12711
-
12712
- return result;
12713
- } else {
12714
- return result;
12715
12785
  }
12716
12786
 
12717
- ;
12787
+ return result;
12788
+ } else {
12789
+ return result;
12790
+ }
12791
+ };
12792
+
12793
+ var Browser = {
12794
+ isIE: function isIE() {
12795
+ return (
12796
+ /*@cc_on!@*/
12797
+ false || !!document.documentMode
12798
+ );
12718
12799
  },
12719
- Browser: {
12720
- isIE: function isIE() {
12721
- return (
12722
- /*@cc_on!@*/
12723
- false || !!document.documentMode
12724
- );
12725
- },
12726
- isFirefox: function isFirefox() {
12727
- return typeof InstallTrigger !== 'undefined';
12728
- },
12729
- isChrome: function isChrome() {
12730
- return !!window.chrome && /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor) && !/OPR/.test(navigator.userAgent);
12731
- },
12732
- isEdge: function isEdge() {
12733
- return !isIE && !!window.StyleMedia;
12734
- },
12735
- isOpera: function isOpera() {
12736
- return !!window.opr && !!opr.addons || !!window.opera || navigator.userAgent.indexOf(' OPR/') >= 0;
12737
- },
12738
- isiOS: function isiOS() {
12739
- return /iPad|iPhone|iPod/.test(navigator.userAgent) && !window.MSStream;
12740
- },
12741
- isSafari: function isSafari() {
12742
- var userAgent = navigator.userAgent.toLowerCase();
12743
- return /(safari|applewebkit)/i.test(userAgent) && !userAgent.includes("chrome") && !userAgent.includes("android");
12744
- },
12745
- isAndroid: function isAndroid() {
12746
- return navigator.userAgent.toLowerCase().indexOf("android") > -1;
12747
- },
12748
- isSafariWebRTC: function isSafariWebRTC() {
12749
- return navigator.mediaDevices && this.isSafari();
12750
- },
12751
- isSamsungBrowser: function isSamsungBrowser() {
12752
- return /SamsungBrowser/i.test(navigator.userAgent);
12753
- },
12754
- isAndroidFirefox: function isAndroidFirefox() {
12755
- return this.isAndroid() && /Firefox/i.test(navigator.userAgent);
12756
- }
12800
+ isFirefox: function isFirefox() {
12801
+ return typeof InstallTrigger !== 'undefined';
12757
12802
  },
12758
- SDP: {
12759
- matchPrefix: function matchPrefix(sdp, prefix) {
12760
- var parts = sdp.trim().split('\n').map(function (line) {
12761
- return line.trim();
12762
- });
12763
- return parts.filter(function (line) {
12764
- return line.indexOf(prefix) === 0;
12765
- });
12766
- },
12767
- writeFmtp: function writeFmtp(sdp, param, codec) {
12768
- var sdpArray = sdp.split("\n");
12769
- var i;
12803
+ isChrome: function isChrome() {
12804
+ return !!window.chrome && /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor) && !/OPR/.test(navigator.userAgent);
12805
+ },
12806
+ isEdge: function isEdge() {
12807
+ return !isIE && !!window.StyleMedia;
12808
+ },
12809
+ isOpera: function isOpera() {
12810
+ return !!window.opr && !!opr.addons || !!window.opera || navigator.userAgent.indexOf(' OPR/') >= 0;
12811
+ },
12812
+ isiOS: function isiOS() {
12813
+ return /iPad|iPhone|iPod/.test(navigator.userAgent) && !window.MSStream;
12814
+ },
12815
+ isSafari: function isSafari() {
12816
+ var userAgent = navigator.userAgent.toLowerCase();
12817
+ return /(safari|applewebkit)/i.test(userAgent) && !userAgent.includes("chrome") && !userAgent.includes("android");
12818
+ },
12819
+ isAndroid: function isAndroid() {
12820
+ return navigator.userAgent.toLowerCase().indexOf("android") > -1;
12821
+ },
12822
+ isSafariWebRTC: function isSafariWebRTC() {
12823
+ return navigator.mediaDevices && this.isSafari();
12824
+ },
12825
+ isSamsungBrowser: function isSamsungBrowser() {
12826
+ return /SamsungBrowser/i.test(navigator.userAgent);
12827
+ },
12828
+ isAndroidFirefox: function isAndroidFirefox() {
12829
+ return this.isAndroid() && /Firefox/i.test(navigator.userAgent);
12830
+ },
12831
+ isChromiumEdge: function isChromiumEdge() {
12832
+ return /Chrome/i.test(navigator.userAgent) && /Edg/i.test(navigator.userAgent);
12833
+ }
12834
+ };
12835
+ var SDP = {
12836
+ matchPrefix: function matchPrefix(sdp, prefix) {
12837
+ var parts = sdp.trim().split('\n').map(function (line) {
12838
+ return line.trim();
12839
+ });
12840
+ return parts.filter(function (line) {
12841
+ return line.indexOf(prefix) === 0;
12842
+ });
12843
+ },
12844
+ writeFmtp: function writeFmtp(sdp, param, codec) {
12845
+ var sdpArray = sdp.split("\n");
12846
+ var i;
12770
12847
 
12771
- for (i = 0; i < sdpArray.length; i++) {
12772
- if (sdpArray[i].search(codec) != -1 && sdpArray[i].indexOf("a=rtpmap") == 0) {
12773
- sdpArray[i] += "\na=fmtp:" + sdpArray[i].match(/[0-9]+/)[0] + " " + param + "\r";
12774
- }
12775
- } //normalize sdp after modifications
12848
+ for (i = 0; i < sdpArray.length; i++) {
12849
+ if (sdpArray[i].search(codec) != -1 && sdpArray[i].indexOf("a=rtpmap") == 0) {
12850
+ sdpArray[i] += "\na=fmtp:" + sdpArray[i].match(/[0-9]+/)[0] + " " + param + "\r";
12851
+ }
12852
+ } //normalize sdp after modifications
12776
12853
 
12777
12854
 
12778
- var result = "";
12855
+ var result = "";
12779
12856
 
12780
- for (i = 0; i < sdpArray.length; i++) {
12781
- if (sdpArray[i] != "") {
12782
- result += sdpArray[i] + "\n";
12783
- }
12857
+ for (i = 0; i < sdpArray.length; i++) {
12858
+ if (sdpArray[i] != "") {
12859
+ result += sdpArray[i] + "\n";
12784
12860
  }
12785
-
12786
- return result;
12787
12861
  }
12788
- },
12789
- logger: {
12862
+
12863
+ return result;
12864
+ }
12865
+ };
12866
+
12867
+ var logger = function logger() {
12868
+ return {
12790
12869
  init: function init(verbosity, enablePushLogs, customLogger, enableLogs) {
12791
12870
  switch (verbosity.toUpperCase()) {
12792
12871
  case "DEBUG":
@@ -12967,92 +13046,104 @@ module.exports = {
12967
13046
  default:
12968
13047
  this.verbosity = 2;
12969
13048
  }
12970
-
12971
- ;
12972
13049
  }
12973
- },
12974
- stripCodecs: function stripCodecs(sdp, codecs) {
12975
- if (!codecs.length) return sdp;
12976
- var sdpArray = sdp.split("\n");
12977
- var codecsArray = codecs.split(","); //search and delete codecs line
13050
+ };
13051
+ };
12978
13052
 
12979
- var pt = [];
12980
- var i;
13053
+ var stripCodecs = function stripCodecs(sdp, codecs) {
13054
+ if (!codecs.length) return sdp;
13055
+ var sdpArray = sdp.split("\n");
13056
+ var codecsArray = codecs.split(","); //search and delete codecs line
12981
13057
 
12982
- for (var p = 0; p < codecsArray.length; p++) {
12983
- console.log("Searching for codec " + codecsArray[p]);
13058
+ var pt = [];
13059
+ var i;
12984
13060
 
12985
- for (i = 0; i < sdpArray.length; i++) {
12986
- if (sdpArray[i].search(new RegExp(codecsArray[p], 'i')) != -1 && sdpArray[i].indexOf("a=rtpmap") == 0) {
12987
- console.log(codecsArray[p] + " detected");
12988
- pt.push(sdpArray[i].match(/[0-9]+/)[0]);
12989
- sdpArray[i] = "";
12990
- }
13061
+ for (var p = 0; p < codecsArray.length; p++) {
13062
+ console.log("Searching for codec " + codecsArray[p]);
13063
+
13064
+ for (i = 0; i < sdpArray.length; i++) {
13065
+ if (sdpArray[i].search(new RegExp(codecsArray[p], 'i')) != -1 && sdpArray[i].indexOf("a=rtpmap") == 0) {
13066
+ console.log(codecsArray[p] + " detected");
13067
+ pt.push(sdpArray[i].match(/[0-9]+/)[0]);
13068
+ sdpArray[i] = "";
12991
13069
  }
12992
13070
  }
13071
+ }
12993
13072
 
12994
- if (pt.length) {
12995
- //searching for fmtp
12996
- for (p = 0; p < pt.length; p++) {
12997
- for (i = 0; i < sdpArray.length; i++) {
12998
- if (sdpArray[i].search("a=fmtp:" + pt[p]) != -1 || sdpArray[i].search("a=rtcp-fb:" + pt[p]) != -1) {
12999
- sdpArray[i] = "";
13000
- }
13073
+ if (pt.length) {
13074
+ //searching for fmtp
13075
+ for (p = 0; p < pt.length; p++) {
13076
+ for (i = 0; i < sdpArray.length; i++) {
13077
+ if (sdpArray[i].search("a=fmtp:" + pt[p]) != -1 || sdpArray[i].search("a=rtcp-fb:" + pt[p]) != -1) {
13078
+ sdpArray[i] = "";
13001
13079
  }
13002
- } //delete entries from m= line
13080
+ }
13081
+ } //delete entries from m= line
13003
13082
 
13004
13083
 
13005
- for (i = 0; i < sdpArray.length; i++) {
13006
- if (sdpArray[i].search("m=audio") != -1 || sdpArray[i].search("m=video") != -1) {
13007
- var mLineSplitted = sdpArray[i].split(" ");
13008
- var newMLine = "";
13084
+ for (i = 0; i < sdpArray.length; i++) {
13085
+ if (sdpArray[i].search("m=audio") != -1 || sdpArray[i].search("m=video") != -1) {
13086
+ var mLineSplitted = sdpArray[i].split(" ");
13087
+ var newMLine = "";
13009
13088
 
13010
- for (var m = 0; m < mLineSplitted.length; m++) {
13011
- if (pt.indexOf(mLineSplitted[m].trim()) == -1 || m <= 2) {
13012
- newMLine += mLineSplitted[m];
13089
+ for (var m = 0; m < mLineSplitted.length; m++) {
13090
+ if (pt.indexOf(mLineSplitted[m].trim()) == -1 || m <= 2) {
13091
+ newMLine += mLineSplitted[m];
13013
13092
 
13014
- if (m < mLineSplitted.length - 1) {
13015
- newMLine = newMLine + " ";
13016
- }
13093
+ if (m < mLineSplitted.length - 1) {
13094
+ newMLine = newMLine + " ";
13017
13095
  }
13018
13096
  }
13019
-
13020
- sdpArray[i] = newMLine;
13021
13097
  }
13098
+
13099
+ sdpArray[i] = newMLine;
13022
13100
  }
13023
- } //normalize sdp after modifications
13101
+ }
13102
+ } //normalize sdp after modifications
13024
13103
 
13025
13104
 
13026
- var result = "";
13105
+ var result = "";
13027
13106
 
13028
- for (i = 0; i < sdpArray.length; i++) {
13029
- if (sdpArray[i] != "") {
13030
- result += sdpArray[i] + "\n";
13031
- }
13107
+ for (i = 0; i < sdpArray.length; i++) {
13108
+ if (sdpArray[i] != "") {
13109
+ result += sdpArray[i] + "\n";
13032
13110
  }
13111
+ }
13033
13112
 
13034
- return result;
13035
- },
13036
- getCurrentCodecAndSampleRate: function getCurrentCodecAndSampleRate(sdp, mediaType) {
13037
- var rows = sdp.split("\n");
13038
- var codecPt;
13113
+ return result;
13114
+ };
13039
13115
 
13040
- for (var i = 0; i < rows.length; i++) {
13041
- if (codecPt && rows[i].indexOf("a=rtpmap:" + codecPt) != -1) {
13042
- var ret = {};
13043
- ret.name = rows[i].split(" ")[1].split("/")[0];
13044
- ret.sampleRate = rows[i].split(" ")[1].split("/")[1];
13045
- return ret;
13046
- } //WCS-2136. WebRTC statistics doesn't work for VP8
13116
+ var getCurrentCodecAndSampleRate = function getCurrentCodecAndSampleRate(sdp, mediaType) {
13117
+ var rows = sdp.split("\n");
13118
+ var codecPt;
13047
13119
 
13120
+ for (var i = 0; i < rows.length; i++) {
13121
+ if (codecPt && rows[i].indexOf("a=rtpmap:" + codecPt) != -1) {
13122
+ var ret = {};
13123
+ ret.name = rows[i].split(" ")[1].split("/")[0];
13124
+ ret.sampleRate = rows[i].split(" ")[1].split("/")[1];
13125
+ return ret;
13126
+ } //WCS-2136. WebRTC statistics doesn't work for VP8
13048
13127
 
13049
- if (rows[i].indexOf("m=" + mediaType) != -1) {
13050
- codecPt = rows[i].split(" ")[3].trim();
13051
- }
13128
+
13129
+ if (rows[i].indexOf("m=" + mediaType) != -1) {
13130
+ codecPt = rows[i].split(" ")[3].trim();
13052
13131
  }
13053
13132
  }
13054
13133
  };
13055
13134
 
13135
+ module.exports = {
13136
+ isEmptyObject: isEmptyObject,
13137
+ copyObjectToArray: copyObjectToArray,
13138
+ copyObjectPropsToAnotherObject: copyObjectPropsToAnotherObject,
13139
+ processRtcStatsReport: processRtcStatsReport,
13140
+ Browser: Browser,
13141
+ SDP: SDP,
13142
+ logger: logger,
13143
+ stripCodecs: stripCodecs,
13144
+ getCurrentCodecAndSampleRate: getCurrentCodecAndSampleRate
13145
+ };
13146
+
13056
13147
  },{}],43:[function(require,module,exports){
13057
13148
  'use strict';
13058
13149
 
@@ -13086,6 +13177,11 @@ var mics = [];
13086
13177
 
13087
13178
  var createConnection = function createConnection(options) {
13088
13179
  return new Promise(function (resolve, reject) {
13180
+ // Set connection logger #WCS-2434
13181
+ if (options.logger) {
13182
+ logger = options.logger;
13183
+ }
13184
+
13089
13185
  var id = options.id;
13090
13186
  var connectionConfig = options.connectionConfig || {
13091
13187
  "iceServers": []
@@ -13216,9 +13312,9 @@ var createConnection = function createConnection(options) {
13216
13312
  function setContentHint(stream, hint) {
13217
13313
  stream.getVideoTracks().forEach(function (track) {
13218
13314
  if (track.contentHint === undefined) {
13219
- logger.warn("contentHint unsupported");
13315
+ logger.warn(LOG_PREFIX, "Track contentHint unsupported");
13220
13316
  } else {
13221
- logger.info("Set video track contentHint to " + hint);
13317
+ logger.info(LOG_PREFIX, "Set video track contentHint to " + hint);
13222
13318
  track.contentHint = hint;
13223
13319
  }
13224
13320
  });
@@ -13255,7 +13351,7 @@ var createConnection = function createConnection(options) {
13255
13351
  //WCS-2771 add playback delay
13256
13352
  connection.getReceivers().forEach(function (track) {
13257
13353
  if (track.playoutDelayHint === undefined) {
13258
- logger.warn("playout delay unsupported");
13354
+ logger.warn(LOG_PREFIX, "Playout delay unsupported");
13259
13355
  }
13260
13356
 
13261
13357
  track.playoutDelayHint = playoutDelay;
@@ -13648,7 +13744,7 @@ var createConnection = function createConnection(options) {
13648
13744
  localVideo.srcObject.addTrack(audioTrack);
13649
13745
  }
13650
13746
 
13651
- logger.info("Switch camera to " + cam);
13747
+ logger.info(LOG_PREFIX, "Switch camera to " + cam);
13652
13748
  resolve(cam);
13653
13749
  })["catch"](function (reason) {
13654
13750
  logger.error(LOG_PREFIX, reason);
@@ -13706,7 +13802,7 @@ var createConnection = function createConnection(options) {
13706
13802
  localVideo.srcObject.addTrack(videoTrack);
13707
13803
  }
13708
13804
 
13709
- logger.info("Switch mic to " + mic);
13805
+ logger.info(LOG_PREFIX, "Switch mic to " + mic);
13710
13806
  resolve(mic);
13711
13807
  })["catch"](function (reason) {
13712
13808
  logger.error(LOG_PREFIX, reason);
@@ -13800,7 +13896,7 @@ var createConnection = function createConnection(options) {
13800
13896
  localVideo.srcObject.addTrack(currentAudioTrack);
13801
13897
  }
13802
13898
  });
13803
- logger.info("Switch to screen");
13899
+ logger.info(LOG_PREFIX, "Switch to screen");
13804
13900
  screenShare = true;
13805
13901
  resolve();
13806
13902
  };
@@ -13832,7 +13928,7 @@ var createConnection = function createConnection(options) {
13832
13928
  });
13833
13929
  }
13834
13930
 
13835
- logger.info("Switch to cam");
13931
+ logger.info(LOG_PREFIX, "Switch to cam");
13836
13932
  screenShare = false;
13837
13933
  };
13838
13934
 
@@ -14631,7 +14727,9 @@ var playFirstVideo = function playFirstVideo(display, isLocal, src) {
14631
14727
  if (!getCacheInstance(display)) {
14632
14728
  var video = document.createElement('video');
14633
14729
  video.setAttribute("playsinline", "");
14634
- video.setAttribute("webkit-playsinline", "");
14730
+ video.setAttribute("webkit-playsinline", ""); //Mute video tag to prevent local audio playback in Safari #WCS-3430
14731
+
14732
+ video.muted = true;
14635
14733
  video.id = uuid_v1() + (isLocal ? LOCAL_CACHED_VIDEO : REMOTE_CACHED_VIDEO); //in WCS-1560 we removed video.play() call, because it triggers the “Unhandled Promise Rejection” exception in iOS Safari
14636
14734
  //in WCS-2160 we rolled back the changes made in WCS-1560 due to no audio on first playback in iOS Safari
14637
14735
 
@@ -14702,7 +14800,12 @@ var audioContext;
14702
14800
  var createConnection = function createConnection(options, handlers) {
14703
14801
  return new Promise(function (resolve, reject) {
14704
14802
  var id = options.id;
14705
- var display = options.display;
14803
+ var display = options.display; // Set connection logger #WCS-2434
14804
+
14805
+ if (options.logger) {
14806
+ logger = options.logger;
14807
+ }
14808
+
14706
14809
  var canvas = document.createElement("canvas");
14707
14810
  display.appendChild(canvas);
14708
14811
  canvas.id = id;