@webex/internal-media-core 2.18.4 → 2.19.0

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/dist/cjs/index.js CHANGED
@@ -3427,7 +3427,7 @@ if(context.level===Logger.WARN&&console.warn){hdlr=console.warn;}else if(context
3427
3427
  // `options` hash can be used to configure the default logLevel and provide a custom message formatter.
3428
3428
  Logger.useDefaults=function(options){Logger.setLevel(options&&options.defaultLevel||Logger.DEBUG);Logger.setHandler(Logger.createDefaultHandler(options));};// Createa an alias to useDefaults to avoid reaking a react-hooks rule.
3429
3429
  Logger.setDefaults=Logger.useDefaults;// Export to popular environments boilerplate.
3430
- if(module.exports){module.exports=Logger;}else {Logger._prevLogger=global.Logger;Logger.noConflict=function(){global.Logger=Logger._prevLogger;return Logger;};global.Logger=Logger;}})(commonjsGlobal$1);})(logger$1);var Logger=logger$1.exports;var DEFAULT_LOGGER_NAME='web-client-media-engine';var logger=Logger.get(DEFAULT_LOGGER_NAME);logger.setLevel(Logger.DEBUG);function logErrorAndThrow(errorType,message){logger.error(message);throw new WcmeError(errorType,message);}function setLogHandler(logHandler){Logger.setHandler(logHandler);Logger$1.setHandler(logHandler);Logger$2.setHandler(logHandler);}var MediaCodecMimeType;(function(MediaCodecMimeType){MediaCodecMimeType["H264"]="video/H264";MediaCodecMimeType["AV1"]="video/AV1";MediaCodecMimeType["OPUS"]="audio/opus";})(MediaCodecMimeType||(MediaCodecMimeType={}));var defaultMaxVideoEncodeFrameSize=8160;var defaultMaxVideoEncodeMbps=244800;var defaultStartBitrateKbps=3000;exports.RecommendedOpusBitrates = void 0;(function(RecommendedOpusBitrates){RecommendedOpusBitrates[RecommendedOpusBitrates["NB"]=12000]="NB";RecommendedOpusBitrates[RecommendedOpusBitrates["WB"]=20000]="WB";RecommendedOpusBitrates[RecommendedOpusBitrates["FB"]=40000]="FB";RecommendedOpusBitrates[RecommendedOpusBitrates["FB_MONO_MUSIC"]=64000]="FB_MONO_MUSIC";RecommendedOpusBitrates[RecommendedOpusBitrates["FB_STEREO_MUSIC"]=128000]="FB_STEREO_MUSIC";})(exports.RecommendedOpusBitrates||(exports.RecommendedOpusBitrates={}));var maxFrameSizeToMaxBitrateMap=new Map([[60,99000],[240,199000],[576,300000],[920,640000],[1296,720000],[2304,880000],[3600,2500000],[8160,4000000]]);var defaultVideoMainRtxTime='300';var defaultVideoSlidesRtxTime='1000';function areProfileLevelIdsCompatible(senderProfileLevelId,receiverProfileLevelId,levelAsymmetryAllowed){var senderProfile=Number.parseInt("0x".concat(senderProfileLevelId),16);var recvProfile=Number.parseInt("0x".concat(receiverProfileLevelId),16);var senderProfileIdc=senderProfile>>16;var recvProfileIdc=recvProfile>>16;var senderProfileIop=(senderProfile&0x00ff00)>>8;var recvProfileIop=(recvProfile&0x00ff00)>>8;var senderLevelIdc=senderProfile&0x0000ff;var recvLevelIdc=recvProfile&0x0000ff;var areProfileCompatible=senderProfileIdc===recvProfileIdc&&senderProfileIop===recvProfileIop||senderProfileIdc===0x42&&recvProfileIdc===0x42&&(senderProfileIop&0x40)===(recvProfileIop&0x40);var isLevelIdcCompatible=levelAsymmetryAllowed?true:senderLevelIdc<=recvLevelIdc;return areProfileCompatible&&isLevelIdcCompatible;}function areCodecsCompatible(senderCodec,receiverCodec){return Object.keys(receiverCodec).every(key=>{if(key==='clockRate'||key==='name'){return senderCodec[key]===receiverCodec[key];}if(key==='fmtParams'){var fmtpForSender=senderCodec[key];var fmtpForReceiver=receiverCodec[key];var levelAsymmetryAllowed=[...fmtpForSender.keys()].some(senderFmtpParamKey=>{return senderFmtpParamKey==='level-asymmetry-allowed'&&fmtpForReceiver.get(senderFmtpParamKey)==='1'&&fmtpForSender.get(senderFmtpParamKey)==='1';});return [...fmtpForSender.keys()].every(senderFmtpParamKey=>{if(fmtpForReceiver.get(senderFmtpParamKey)){if(senderFmtpParamKey==='profile-level-id'){return areProfileLevelIdsCompatible(fmtpForSender.get(senderFmtpParamKey),fmtpForReceiver.get(senderFmtpParamKey),levelAsymmetryAllowed);}}if(senderFmtpParamKey==='packetization-mode'){return fmtpForSender.get(senderFmtpParamKey)===fmtpForReceiver.get(senderFmtpParamKey);}return true;});}return true;});}function gcd(a,b){return b===0?a:gcd(b,a%b);}function getFrameHeightByMaxFs(sourceAspectRatio,requestedMaxFs){var _gcd=gcd(sourceAspectRatio[0],sourceAspectRatio[1]);var minNumberRatiosForWidth=sourceAspectRatio[0]/_gcd;var minNumberRatiosForHeight=sourceAspectRatio[1]/_gcd;var macroBlockSize=16*16;var minRatioNumberByMaxFs=Math.sqrt(requestedMaxFs*macroBlockSize/(minNumberRatiosForWidth*minNumberRatiosForHeight));var roundedMinRatioNumberByMaxFs=Math.max(Math.floor(minRatioNumberByMaxFs),1.0);return roundedMinRatioNumberByMaxFs*minNumberRatiosForHeight;}function getScaleDownRatio(sourceWidth,sourceHeight,maxFs,maxWidth,maxHeight){if(!sourceWidth||!sourceHeight||!maxFs){return undefined;}var scaleDownRatio=Math.max(sourceHeight/getFrameHeightByMaxFs([sourceWidth,sourceHeight],maxFs),1.0);if(maxWidth&&maxHeight){scaleDownRatio=Math.max(sourceWidth/maxWidth,sourceHeight/maxHeight,scaleDownRatio);}return scaleDownRatio;}function getRecommendedMaxBitrateForFrameSize(requestedMaxFs){if(requestedMaxFs<60){logErrorAndThrow(exports.WcmeErrorType.GET_MAX_BITRATE_FAILED,"Requested max video frame size cannot be less than 60.");}var expectedHeight=[...maxFrameSizeToMaxBitrateMap.keys()].sort((a,b)=>b-a).find(h=>requestedMaxFs>=h);return maxFrameSizeToMaxBitrateMap.get(expectedHeight);}/******************************************************************************
3430
+ if(module.exports){module.exports=Logger;}else {Logger._prevLogger=global.Logger;Logger.noConflict=function(){global.Logger=Logger._prevLogger;return Logger;};global.Logger=Logger;}})(commonjsGlobal$1);})(logger$1);var Logger=logger$1.exports;var DEFAULT_LOGGER_NAME='web-client-media-engine';var logger=Logger.get(DEFAULT_LOGGER_NAME);logger.setLevel(Logger.DEBUG);function logErrorAndThrow(errorType,message){logger.error(message);throw new WcmeError(errorType,message);}function setLogHandler(logHandler){Logger.setHandler(logHandler);Logger$1.setHandler(logHandler);Logger$2.setHandler(logHandler);}var MediaCodecMimeType;(function(MediaCodecMimeType){MediaCodecMimeType["H264"]="video/H264";MediaCodecMimeType["AV1"]="video/AV1";MediaCodecMimeType["OPUS"]="audio/opus";})(MediaCodecMimeType||(MediaCodecMimeType={}));var defaultMaxVideoEncodeFrameSize=8160;var defaultMaxVideoEncodeMbps=244800;var defaultStartBitrateKbps=3000;exports.RecommendedOpusBitrates = void 0;(function(RecommendedOpusBitrates){RecommendedOpusBitrates[RecommendedOpusBitrates["NB"]=12000]="NB";RecommendedOpusBitrates[RecommendedOpusBitrates["WB"]=20000]="WB";RecommendedOpusBitrates[RecommendedOpusBitrates["FB"]=40000]="FB";RecommendedOpusBitrates[RecommendedOpusBitrates["FB_MONO_MUSIC"]=64000]="FB_MONO_MUSIC";RecommendedOpusBitrates[RecommendedOpusBitrates["FB_STEREO_MUSIC"]=128000]="FB_STEREO_MUSIC";})(exports.RecommendedOpusBitrates||(exports.RecommendedOpusBitrates={}));var maxFrameSizeToMaxBitrateMap=new Map([[60,99000],[240,199000],[576,300000],[920,640000],[1296,720000],[2040,880000],[3600,2500000],[8160,4000000]]);var defaultVideoMainRtxTime='300';var defaultVideoSlidesRtxTime='1000';function areProfileLevelIdsCompatible(senderProfileLevelId,receiverProfileLevelId,levelAsymmetryAllowed){var senderProfile=Number.parseInt("0x".concat(senderProfileLevelId),16);var recvProfile=Number.parseInt("0x".concat(receiverProfileLevelId),16);var senderProfileIdc=senderProfile>>16;var recvProfileIdc=recvProfile>>16;var senderProfileIop=(senderProfile&0x00ff00)>>8;var recvProfileIop=(recvProfile&0x00ff00)>>8;var senderLevelIdc=senderProfile&0x0000ff;var recvLevelIdc=recvProfile&0x0000ff;var areProfileCompatible=senderProfileIdc===recvProfileIdc&&senderProfileIop===recvProfileIop||senderProfileIdc===0x42&&recvProfileIdc===0x42&&(senderProfileIop&0x40)===(recvProfileIop&0x40);var isLevelIdcCompatible=levelAsymmetryAllowed?true:senderLevelIdc<=recvLevelIdc;return areProfileCompatible&&isLevelIdcCompatible;}function areCodecsCompatible(senderCodec,receiverCodec){return Object.keys(receiverCodec).every(key=>{if(key==='clockRate'||key==='name'){return senderCodec[key]===receiverCodec[key];}if(key==='fmtParams'){var fmtpForSender=senderCodec[key];var fmtpForReceiver=receiverCodec[key];var levelAsymmetryAllowed=[...fmtpForSender.keys()].some(senderFmtpParamKey=>{return senderFmtpParamKey==='level-asymmetry-allowed'&&fmtpForReceiver.get(senderFmtpParamKey)==='1'&&fmtpForSender.get(senderFmtpParamKey)==='1';});return [...fmtpForSender.keys()].every(senderFmtpParamKey=>{if(fmtpForReceiver.get(senderFmtpParamKey)){if(senderFmtpParamKey==='profile-level-id'){return areProfileLevelIdsCompatible(fmtpForSender.get(senderFmtpParamKey),fmtpForReceiver.get(senderFmtpParamKey),levelAsymmetryAllowed);}}if(senderFmtpParamKey==='packetization-mode'){return fmtpForSender.get(senderFmtpParamKey)===fmtpForReceiver.get(senderFmtpParamKey);}return true;});}return true;});}function gcd(a,b){return b===0?a:gcd(b,a%b);}function getFrameHeightByMaxFs(sourceAspectRatio,requestedMaxFs){var _gcd=gcd(sourceAspectRatio[0],sourceAspectRatio[1]);var minNumberRatiosForWidth=sourceAspectRatio[0]/_gcd;var minNumberRatiosForHeight=sourceAspectRatio[1]/_gcd;var macroBlockSize=16*16;var minRatioNumberByMaxFs=Math.sqrt(requestedMaxFs*macroBlockSize/(minNumberRatiosForWidth*minNumberRatiosForHeight));var roundedMinRatioNumberByMaxFs=Math.max(Math.floor(minRatioNumberByMaxFs),1.0);return roundedMinRatioNumberByMaxFs*minNumberRatiosForHeight;}function getScaleDownRatio(sourceWidth,sourceHeight,maxFs,maxWidth,maxHeight){if(!sourceWidth||!sourceHeight||!maxFs){return undefined;}var scaleDownRatio=Math.max(sourceHeight/getFrameHeightByMaxFs([sourceWidth,sourceHeight],maxFs),1.0);if(maxWidth&&maxHeight){scaleDownRatio=Math.max(sourceWidth/maxWidth,sourceHeight/maxHeight,scaleDownRatio);}return scaleDownRatio;}function getRecommendedMaxBitrateForFrameSize(requestedMaxFs){if(requestedMaxFs<60){logErrorAndThrow(exports.WcmeErrorType.GET_MAX_BITRATE_FAILED,"Requested max video frame size cannot be less than 60.");}var expectedHeight=[...maxFrameSizeToMaxBitrateMap.keys()].sort((a,b)=>b-a).find(h=>requestedMaxFs>=h);return maxFrameSizeToMaxBitrateMap.get(expectedHeight);}/******************************************************************************
3431
3431
  Copyright (c) Microsoft Corporation.
3432
3432
 
3433
3433
  Permission to use, copy, modify, and/or distribute this software for any
@@ -18703,6 +18703,15 @@ exports.NetworkQualityEventNames = void 0;
18703
18703
  (function (NetworkQualityEventNames) {
18704
18704
  NetworkQualityEventNames["NETWORK_QUALITY"] = "NETWORK_QUALITY";
18705
18705
  })(exports.NetworkQualityEventNames || (exports.NetworkQualityEventNames = {}));
18706
+ exports.StatsMonitorEventNames = void 0;
18707
+ (function (StatsMonitorEventNames) {
18708
+ StatsMonitorEventNames["INBOUND_AUDIO_ISSUE"] = "INBOUND_AUDIO_ISSUE";
18709
+ })(exports.StatsMonitorEventNames || (exports.StatsMonitorEventNames = {}));
18710
+ exports.InboundAudioIssueSubTypes = void 0;
18711
+ (function (InboundAudioIssueSubTypes) {
18712
+ InboundAudioIssueSubTypes["DECODE_RESULTS_IN_ZERO_AUDIO_LEVEL"] = "DECODE_RESULTS_IN_ZERO_AUDIO_LEVEL";
18713
+ InboundAudioIssueSubTypes["ALL_PACKETS_DISCARDED"] = "ALL_PACKETS_DISCARDED";
18714
+ })(exports.InboundAudioIssueSubTypes || (exports.InboundAudioIssueSubTypes = {}));
18706
18715
 
18707
18716
  function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
18708
18717
  function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
@@ -18711,6 +18720,7 @@ class StatsAnalyzer extends EventEmitter$5 {
18711
18720
  var {
18712
18721
  config,
18713
18722
  networkQualityMonitor,
18723
+ statsMonitor,
18714
18724
  isMultistream = false
18715
18725
  } = _ref;
18716
18726
  super();
@@ -18722,6 +18732,7 @@ class StatsAnalyzer extends EventEmitter$5 {
18722
18732
  _defineProperty(this, "mqeInterval", void 0);
18723
18733
  _defineProperty(this, "mqeSentCount", 0);
18724
18734
  _defineProperty(this, "networkQualityMonitor", void 0);
18735
+ _defineProperty(this, "statsMonitor", void 0);
18725
18736
  _defineProperty(this, "mediaConnection", null);
18726
18737
  _defineProperty(this, "statsStarted", false);
18727
18738
  _defineProperty(this, "mqeIntervalSessionReceiveAudioMainBuilder", void 0);
@@ -18763,6 +18774,7 @@ class StatsAnalyzer extends EventEmitter$5 {
18763
18774
  });
18764
18775
  this.config = config;
18765
18776
  this.networkQualityMonitor = networkQualityMonitor;
18777
+ this.statsMonitor = statsMonitor;
18766
18778
  this.mqeIntervalSessionReceiveAudioMainBuilder = new MqeIntervalSessionReceiveAudioBuilder({
18767
18779
  isMain: true,
18768
18780
  multistreamEnabled: isMultistream
@@ -18981,7 +18993,7 @@ class StatsAnalyzer extends EventEmitter$5 {
18981
18993
  })();
18982
18994
  }
18983
18995
  monitorStats(transceiverStats) {
18984
- var _this$meetingMediaSta3, _this$meetingMediaSta4, _this$meetingMediaSta5, _this$meetingMediaSta6, _this$meetingMediaSta7, _this$previousTransce, _this$previousTransce2, _this$previousTransce3, _this$previousTransce4, _this$previousTransce5, _this$previousTransce6, _this$previousTransce7, _this$previousTransce8, _this$previousTransce9, _this$previousTransce10, _this$previousTransce11, _this$previousTransce12;
18996
+ var _this$meetingMediaSta3, _this$meetingMediaSta4, _this$meetingMediaSta5, _this$meetingMediaSta6, _this$meetingMediaSta7, _this$meetingMediaSta8, _this$previousTransce, _this$previousTransce2, _this$previousTransce3, _this$previousTransce4, _this$previousTransce5, _this$previousTransce6, _this$previousTransce7, _this$previousTransce8, _this$previousTransce9, _this$previousTransce10, _this$previousTransce11, _this$previousTransce12;
18985
18997
  var emitNetworkQualityEvents = (mediaType, intervalStats) => {
18986
18998
  var roundTripTimeArray = getPropertyFromStatsByTypeInArray(intervalStats, 'remote-inbound-rtp', 'roundTripTime');
18987
18999
  var jitterArray = getPropertyFromStatsByTypeInArray(intervalStats, 'remote-inbound-rtp', 'jitter');
@@ -18997,129 +19009,45 @@ class StatsAnalyzer extends EventEmitter$5 {
18997
19009
  var current = convertToStatsMap(transceiverStats.audio.senders);
18998
19010
  if (this.previousTransceiverStats) {
18999
19011
  var previous = convertToStatsMap(this.previousTransceiverStats.audio.senders);
19000
- var currentPacketsSent = getSumFromStatsByType(current, 'outbound-rtp', 'packetsSent');
19001
- var previousPacketsSent = getSumFromStatsByType(previous, 'outbound-rtp', 'packetsSent');
19002
- if (currentPacketsSent === previousPacketsSent) {
19003
- getLogger().info("StatsAnalyzer#monitorStats --> No audio packets sent, last packets sent count: ".concat(currentPacketsSent, "."));
19004
- }
19005
- var totalAudioEnergyExists = getPropertyFromStatsByType(current, 'media-source', 'totalAudioEnergy') !== undefined;
19006
- if (totalAudioEnergyExists) {
19007
- var currentTotalAudioEnergy = getSumFromStatsByType(current, 'media-source', 'totalAudioEnergy');
19008
- var previousTotalAudioEnergy = getSumFromStatsByType(previous, 'media-source', 'totalAudioEnergy');
19009
- if (currentTotalAudioEnergy === previousTotalAudioEnergy) {
19010
- getLogger().info("StatsAnalyzer#monitorStats --> No audio energy, last total audio energy: ".concat(currentTotalAudioEnergy, "."));
19011
- }
19012
- }
19013
- var audioLevelExists = getPropertyFromStatsByType(current, 'media-source', 'audioLevel') !== undefined;
19014
- if (audioLevelExists) {
19015
- var currentAudioLevel = getSumFromStatsByType(current, 'media-source', 'audioLevel');
19016
- if (currentAudioLevel === 0) {
19017
- getLogger().info("StatsAnalyzer#monitorStats --> Audio level is 0.");
19018
- }
19019
- }
19012
+ this.statsMonitor.checkOutboundAudio(previous, current);
19020
19013
  }
19021
19014
  emitNetworkQualityEvents('audio', current);
19022
19015
  }
19023
- if ((_this$meetingMediaSta4 = this.meetingMediaStatus) !== null && _this$meetingMediaSta4 !== void 0 && _this$meetingMediaSta4.expected.sendVideo) {
19024
- var _current = convertToStatsMap(transceiverStats.video.senders);
19016
+ if ((_this$meetingMediaSta4 = this.meetingMediaStatus) !== null && _this$meetingMediaSta4 !== void 0 && _this$meetingMediaSta4.expected.receiveAudio) {
19017
+ var _current = convertToStatsMap(transceiverStats.audio.receivers);
19025
19018
  if (this.previousTransceiverStats) {
19026
- var _previous = convertToStatsMap(this.previousTransceiverStats.video.senders);
19027
- var _currentPacketsSent = getSumFromStatsByType(_current, 'outbound-rtp', 'packetsSent');
19028
- var _previousPacketsSent = getSumFromStatsByType(_previous, 'outbound-rtp', 'packetsSent');
19029
- if (_currentPacketsSent === _previousPacketsSent) {
19030
- getLogger().info("StatsAnalyzer#monitorStats --> No video packets sent, last packets sent count: ".concat(_currentPacketsSent, "."));
19031
- }
19032
- var currentFramesEncoded = getSumFromStatsByType(_current, 'outbound-rtp', 'framesEncoded');
19033
- var previousFramesEncoded = getSumFromStatsByType(_previous, 'outbound-rtp', 'framesEncoded');
19034
- if (currentFramesEncoded === previousFramesEncoded) {
19035
- getLogger().info("StatsAnalyzer#monitorStats --> No video frames encoded, last frames encoded count: ".concat(currentFramesEncoded, "."));
19036
- }
19037
- var currentFramesSent = getSumFromStatsByType(_current, 'outbound-rtp', 'framesSent');
19038
- var previousFramesSent = getSumFromStatsByType(_previous, 'outbound-rtp', 'framesSent');
19039
- if (currentFramesSent === previousFramesSent) {
19040
- getLogger().info("StatsAnalyzer#monitorStats --> No video frames sent, last frames sent count: ".concat(currentFramesSent, "."));
19041
- }
19019
+ var _previous = convertToStatsMap(this.previousTransceiverStats.audio.receivers);
19020
+ this.statsMonitor.checkInboundAudio(_previous, _current);
19042
19021
  }
19043
- emitNetworkQualityEvents('video', _current);
19044
19022
  }
19045
- if ((_this$meetingMediaSta5 = this.meetingMediaStatus) !== null && _this$meetingMediaSta5 !== void 0 && _this$meetingMediaSta5.expected.receiveVideo) {
19046
- var _current2 = convertToStatsMap(transceiverStats.video.receivers);
19023
+ if ((_this$meetingMediaSta5 = this.meetingMediaStatus) !== null && _this$meetingMediaSta5 !== void 0 && _this$meetingMediaSta5.expected.sendVideo) {
19024
+ var _current2 = convertToStatsMap(transceiverStats.video.senders);
19047
19025
  if (this.previousTransceiverStats) {
19048
- var currentSourceStateArray = getPropertyFromStatsByTypeInArray(_current2, 'inbound-rtp', 'sourceState');
19049
- if (currentSourceStateArray.includes('live')) {
19050
- var _previous2 = convertToStatsMap(this.previousTransceiverStats.video.receivers);
19051
- var currentPacketsReceived = getSumFromStatsByType(_current2, 'inbound-rtp', 'packetsReceived');
19052
- var previousPacketsReceived = getSumFromStatsByType(_previous2, 'inbound-rtp', 'packetsReceived');
19053
- if (currentPacketsReceived === previousPacketsReceived) {
19054
- getLogger().info("StatsAnalyzer#monitorStats --> No video packets received, last packets received count: ".concat(currentPacketsReceived, "."));
19055
- }
19056
- var currentFramesDecoded = getSumFromStatsByType(_current2, 'inbound-rtp', 'framesDecoded');
19057
- var previousFramesDecoded = getSumFromStatsByType(_previous2, 'inbound-rtp', 'framesDecoded');
19058
- if (currentFramesDecoded === previousFramesDecoded) {
19059
- getLogger().info("StatsAnalyzer#monitorStats --> No video frames decoded, last frames decoded count: ".concat(currentFramesDecoded, "."));
19060
- }
19061
- var currentFramesReceived = getSumFromStatsByType(_current2, 'inbound-rtp', 'framesReceived');
19062
- var previousFramesReceived = getSumFromStatsByType(_previous2, 'inbound-rtp', 'framesReceived');
19063
- if (currentFramesReceived === previousFramesReceived) {
19064
- getLogger().info("StatsAnalyzer#monitorStats --> No video frames received, last frames received count: ".concat(currentFramesReceived, "."));
19065
- }
19066
- var currentFramesDropped = getSumFromStatsByType(_current2, 'inbound-rtp', 'framesDropped');
19067
- var previousFramesDropped = getSumFromStatsByType(_previous2, 'inbound-rtp', 'framesDropped');
19068
- if (currentFramesDropped - previousFramesDropped > 10) {
19069
- getLogger().info("StatsAnalyzer#monitorStats --> Too many video frames dropped, total frames dropped count: ".concat(currentFramesDropped, "."));
19070
- }
19071
- }
19026
+ var _previous2 = convertToStatsMap(this.previousTransceiverStats.video.senders);
19027
+ this.statsMonitor.checkOutboundVideo(_previous2, _current2);
19072
19028
  }
19029
+ emitNetworkQualityEvents('video', _current2);
19073
19030
  }
19074
- if ((_this$meetingMediaSta6 = this.meetingMediaStatus) !== null && _this$meetingMediaSta6 !== void 0 && _this$meetingMediaSta6.expected.sendShare) {
19075
- var _current3 = convertToStatsMap(transceiverStats.screenShareVideo.senders);
19031
+ if ((_this$meetingMediaSta6 = this.meetingMediaStatus) !== null && _this$meetingMediaSta6 !== void 0 && _this$meetingMediaSta6.expected.receiveVideo) {
19032
+ var _current3 = convertToStatsMap(transceiverStats.video.receivers);
19076
19033
  if (this.previousTransceiverStats) {
19077
- var _previous3 = convertToStatsMap(this.previousTransceiverStats.screenShareVideo.senders);
19078
- var _currentPacketsSent2 = getSumFromStatsByType(_current3, 'outbound-rtp', 'packetsSent');
19079
- var _previousPacketsSent2 = getSumFromStatsByType(_previous3, 'outbound-rtp', 'packetsSent');
19080
- if (_currentPacketsSent2 === _previousPacketsSent2) {
19081
- getLogger().info("StatsAnalyzer#monitorStats --> No share packets sent, last packets sent count: ".concat(_currentPacketsSent2, "."));
19082
- }
19083
- var _currentFramesEncoded = getSumFromStatsByType(_current3, 'outbound-rtp', 'framesEncoded');
19084
- var _previousFramesEncoded = getSumFromStatsByType(_previous3, 'outbound-rtp', 'framesEncoded');
19085
- if (_currentFramesEncoded === _previousFramesEncoded) {
19086
- getLogger().info("StatsAnalyzer#monitorStats --> No share frames encoded, last frames encoded count: ".concat(_currentFramesEncoded, "."));
19087
- }
19088
- var _currentFramesSent = getSumFromStatsByType(_current3, 'outbound-rtp', 'framesSent');
19089
- var _previousFramesSent = getSumFromStatsByType(_previous3, 'outbound-rtp', 'framesSent');
19090
- if (_currentFramesSent === _previousFramesSent) {
19091
- getLogger().info("StatsAnalyzer#monitorStats --> No share frames sent, last frames sent count: ".concat(_currentFramesSent, "."));
19092
- }
19034
+ var _previous3 = convertToStatsMap(this.previousTransceiverStats.video.receivers);
19035
+ this.statsMonitor.checkInboundVideo(_previous3, _current3);
19093
19036
  }
19094
- emitNetworkQualityEvents('share', _current3);
19095
19037
  }
19096
- if ((_this$meetingMediaSta7 = this.meetingMediaStatus) !== null && _this$meetingMediaSta7 !== void 0 && _this$meetingMediaSta7.expected.receiveShare) {
19097
- var _current4 = convertToStatsMap(transceiverStats.screenShareVideo.receivers);
19038
+ if ((_this$meetingMediaSta7 = this.meetingMediaStatus) !== null && _this$meetingMediaSta7 !== void 0 && _this$meetingMediaSta7.expected.sendShare) {
19039
+ var _current4 = convertToStatsMap(transceiverStats.screenShareVideo.senders);
19098
19040
  if (this.previousTransceiverStats) {
19099
- var _currentSourceStateArray = getPropertyFromStatsByTypeInArray(_current4, 'inbound-rtp', 'sourceState');
19100
- if (_currentSourceStateArray.includes('live')) {
19101
- var _previous4 = convertToStatsMap(this.previousTransceiverStats.screenShareVideo.receivers);
19102
- var _currentPacketsReceived = getSumFromStatsByType(_current4, 'inbound-rtp', 'packetsReceived');
19103
- var _previousPacketsReceived = getSumFromStatsByType(_previous4, 'inbound-rtp', 'packetsReceived');
19104
- if (_currentPacketsReceived === _previousPacketsReceived) {
19105
- getLogger().info("StatsAnalyzer#monitorStats --> No share packets received, last packets received count: ".concat(_currentPacketsReceived, "."));
19106
- }
19107
- var _currentFramesDecoded = getSumFromStatsByType(_current4, 'inbound-rtp', 'framesDecoded');
19108
- var _previousFramesDecoded = getSumFromStatsByType(_previous4, 'inbound-rtp', 'framesDecoded');
19109
- if (_currentFramesDecoded === _previousFramesDecoded) {
19110
- getLogger().info("StatsAnalyzer#monitorStats --> No share frames decoded, last frames decoded count: ".concat(_currentFramesDecoded, "."));
19111
- }
19112
- var _currentFramesReceived = getSumFromStatsByType(_current4, 'inbound-rtp', 'framesReceived');
19113
- var _previousFramesReceived = getSumFromStatsByType(_previous4, 'inbound-rtp', 'framesReceived');
19114
- if (_currentFramesReceived === _previousFramesReceived) {
19115
- getLogger().info("StatsAnalyzer#monitorStats --> No share frames received, last frames received count: ".concat(_currentFramesReceived, "."));
19116
- }
19117
- var _currentFramesDropped = getSumFromStatsByType(_current4, 'inbound-rtp', 'framesDropped');
19118
- var _previousFramesDropped = getSumFromStatsByType(_previous4, 'inbound-rtp', 'framesDropped');
19119
- if (_currentFramesDropped - _previousFramesDropped > 10) {
19120
- getLogger().info("StatsAnalyzer#monitorStats --> Too many share frames dropped, total frames dropped count: ".concat(_currentFramesDropped, "."));
19121
- }
19122
- }
19041
+ var _previous4 = convertToStatsMap(this.previousTransceiverStats.screenShareVideo.senders);
19042
+ this.statsMonitor.checkOutboundShare(_previous4, _current4);
19043
+ }
19044
+ emitNetworkQualityEvents('share', _current4);
19045
+ }
19046
+ if ((_this$meetingMediaSta8 = this.meetingMediaStatus) !== null && _this$meetingMediaSta8 !== void 0 && _this$meetingMediaSta8.expected.receiveShare) {
19047
+ var _current5 = convertToStatsMap(transceiverStats.screenShareVideo.receivers);
19048
+ if (this.previousTransceiverStats) {
19049
+ var _previous5 = convertToStatsMap(this.previousTransceiverStats.screenShareVideo.receivers);
19050
+ this.statsMonitor.checkInboundShare(_previous5, _current5);
19123
19051
  }
19124
19052
  }
19125
19053
  this.emitStartStopEvents('audio', getSumFromStatsByType(convertToStatsMap((_this$previousTransce = (_this$previousTransce2 = this.previousTransceiverStats) === null || _this$previousTransce2 === void 0 ? void 0 : _this$previousTransce2.audio.senders) !== null && _this$previousTransce !== void 0 ? _this$previousTransce : []), 'outbound-rtp', 'packetsSent'), getSumFromStatsByType(convertToStatsMap(transceiverStats.audio.senders), 'outbound-rtp', 'packetsSent'), true);
@@ -19232,6 +19160,155 @@ class NetworkQualityMonitor extends EventEmitter$5 {
19232
19160
  }
19233
19161
  }
19234
19162
 
19163
+ var MIN_AUDIO_PACKETS_RECEIVER_THRESHOLD = 500;
19164
+ var InboundAudioThresholds = {
19165
+ DecodeResultsInZeroAudioLevel: {
19166
+ concealedRatio: 0.7,
19167
+ lossRatio: 0.2,
19168
+ discardedRatio: 0.5
19169
+ },
19170
+ AllPacketsDiscarded: {
19171
+ discardedRatio: 0.9
19172
+ }
19173
+ };
19174
+ class StatsMonitor extends EventEmitter$5 {
19175
+ hasAudioDecodeIssue(totalAudioEnergy, totalSamplesReceived, concealedRatio, lossRatio, discardedRatio) {
19176
+ var thresholds = InboundAudioThresholds.DecodeResultsInZeroAudioLevel;
19177
+ return totalAudioEnergy === 0 && totalSamplesReceived > 0 && concealedRatio < thresholds.concealedRatio && lossRatio < thresholds.lossRatio && discardedRatio < thresholds.discardedRatio;
19178
+ }
19179
+ checkInboundAudio(previous, current) {
19180
+ var previousPacketsReceived = getSumFromStatsByType(previous, 'inbound-rtp', 'packetsReceived');
19181
+ var packetsReceived = getSumFromStatsByType(current, 'inbound-rtp', 'packetsReceived');
19182
+ var totalSamplesReceived = getSumFromStatsByType(current, 'inbound-rtp', 'totalSamplesReceived');
19183
+ var totalAudioEnergy = getSumFromStatsByType(current, 'inbound-rtp', 'totalAudioEnergy');
19184
+ var packetsDiscarded = getSumFromStatsByType(current, 'inbound-rtp', 'packetsDiscarded');
19185
+ var concealedSamples = getSumFromStatsByType(current, 'inbound-rtp', 'concealedSamples');
19186
+ var packetsLost = getSumFromStatsByType(current, 'inbound-rtp', 'packetsLost');
19187
+ var concealedRatio = totalSamplesReceived > 0 ? concealedSamples / totalSamplesReceived : 0;
19188
+ var lossRatio = packetsReceived + packetsLost > 0 ? packetsLost / (packetsReceived + packetsLost) : 0;
19189
+ var discardedRatio = packetsReceived > 0 ? packetsDiscarded / packetsReceived : 0;
19190
+ if (packetsReceived > MIN_AUDIO_PACKETS_RECEIVER_THRESHOLD && packetsReceived > previousPacketsReceived) {
19191
+ if (this.hasAudioDecodeIssue(totalAudioEnergy, totalSamplesReceived, concealedRatio, lossRatio, discardedRatio)) {
19192
+ getLogger().info("StatsMonitor#checkInboundAudio --> Incoming audio from all streams is not being decoded correctly, totalAudioEnergy: ".concat(totalAudioEnergy, ", totalSamplesReceived: ").concat(totalSamplesReceived, ", packetsReceived: ").concat(packetsReceived, ", concealedRatio: ").concat(concealedRatio, ", lossRatio: ").concat(lossRatio, ", discardedRatio: ").concat(discardedRatio, "."));
19193
+ this.emit(exports.StatsMonitorEventNames.INBOUND_AUDIO_ISSUE, {
19194
+ issueSubType: exports.InboundAudioIssueSubTypes.DECODE_RESULTS_IN_ZERO_AUDIO_LEVEL
19195
+ });
19196
+ } else if (discardedRatio >= InboundAudioThresholds.AllPacketsDiscarded.discardedRatio) {
19197
+ getLogger().info("StatsMonitor#checkInboundAudio --> Incoming audio packets from all streams are being discarded, packetsReceived: ".concat(packetsReceived, ", packetsDiscarded: ").concat(packetsDiscarded, ", discardedRatio: ").concat(discardedRatio, "."));
19198
+ this.emit(exports.StatsMonitorEventNames.INBOUND_AUDIO_ISSUE, {
19199
+ issueSubType: exports.InboundAudioIssueSubTypes.ALL_PACKETS_DISCARDED
19200
+ });
19201
+ }
19202
+ }
19203
+ }
19204
+ checkOutboundAudio(previous, current) {
19205
+ var currentPacketsSent = getSumFromStatsByType(current, 'outbound-rtp', 'packetsSent');
19206
+ var previousPacketsSent = getSumFromStatsByType(previous, 'outbound-rtp', 'packetsSent');
19207
+ if (currentPacketsSent === previousPacketsSent) {
19208
+ getLogger().info("StatsMonitor#checkOutboundAudio --> No audio packets sent, last packets sent count: ".concat(currentPacketsSent, "."));
19209
+ }
19210
+ var totalAudioEnergyExists = getPropertyFromStatsByType(current, 'media-source', 'totalAudioEnergy') !== undefined;
19211
+ if (totalAudioEnergyExists) {
19212
+ var currentTotalAudioEnergy = getSumFromStatsByType(current, 'media-source', 'totalAudioEnergy');
19213
+ var previousTotalAudioEnergy = getSumFromStatsByType(previous, 'media-source', 'totalAudioEnergy');
19214
+ if (currentTotalAudioEnergy === previousTotalAudioEnergy) {
19215
+ getLogger().info("StatsMonitor#checkOutboundAudio --> No audio energy from local audio source, last total audio energy: ".concat(currentTotalAudioEnergy, "."));
19216
+ }
19217
+ }
19218
+ var audioLevelExists = getPropertyFromStatsByType(current, 'media-source', 'audioLevel') !== undefined;
19219
+ if (audioLevelExists) {
19220
+ var currentAudioLevel = getSumFromStatsByType(current, 'media-source', 'audioLevel');
19221
+ if (currentAudioLevel === 0) {
19222
+ getLogger().info("StatsMonitor#checkOutboundAudio --> Audio level in local audio source is 0.");
19223
+ }
19224
+ }
19225
+ }
19226
+ checkInboundVideo(previous, current) {
19227
+ var currentSourceStateArray = getPropertyFromStatsByTypeInArray(current, 'inbound-rtp', 'sourceState');
19228
+ if (currentSourceStateArray.includes('live')) {
19229
+ var currentPacketsReceived = getSumFromStatsByType(current, 'inbound-rtp', 'packetsReceived');
19230
+ var previousPacketsReceived = getSumFromStatsByType(previous, 'inbound-rtp', 'packetsReceived');
19231
+ if (currentPacketsReceived === previousPacketsReceived) {
19232
+ getLogger().info("StatsMonitor#checkInboundVideo --> No video packets received, last packets received count: ".concat(currentPacketsReceived, "."));
19233
+ }
19234
+ var currentFramesDecoded = getSumFromStatsByType(current, 'inbound-rtp', 'framesDecoded');
19235
+ var previousFramesDecoded = getSumFromStatsByType(previous, 'inbound-rtp', 'framesDecoded');
19236
+ if (currentFramesDecoded === previousFramesDecoded) {
19237
+ getLogger().info("StatsMonitor#checkInboundVideo --> No video frames decoded, last frames decoded count: ".concat(currentFramesDecoded, "."));
19238
+ }
19239
+ var currentFramesReceived = getSumFromStatsByType(current, 'inbound-rtp', 'framesReceived');
19240
+ var previousFramesReceived = getSumFromStatsByType(previous, 'inbound-rtp', 'framesReceived');
19241
+ if (currentFramesReceived === previousFramesReceived) {
19242
+ getLogger().info("StatsMonitor#checkInboundVideo --> No video frames received, last frames received count: ".concat(currentFramesReceived, "."));
19243
+ }
19244
+ var currentFramesDropped = getSumFromStatsByType(current, 'inbound-rtp', 'framesDropped');
19245
+ var previousFramesDropped = getSumFromStatsByType(previous, 'inbound-rtp', 'framesDropped');
19246
+ if (currentFramesDropped - previousFramesDropped > 10) {
19247
+ getLogger().info("StatsMonitor#checkInboundVideo --> Too many inbound video frames dropped, total frames dropped count: ".concat(currentFramesDropped, "."));
19248
+ }
19249
+ }
19250
+ }
19251
+ checkOutboundVideo(previous, current) {
19252
+ var currentPacketsSent = getSumFromStatsByType(current, 'outbound-rtp', 'packetsSent');
19253
+ var previousPacketsSent = getSumFromStatsByType(previous, 'outbound-rtp', 'packetsSent');
19254
+ if (currentPacketsSent === previousPacketsSent) {
19255
+ getLogger().info("StatsMonitor#checkOutboundVideo --> No video packets sent, last packets sent count: ".concat(currentPacketsSent, "."));
19256
+ }
19257
+ var currentFramesEncoded = getSumFromStatsByType(current, 'outbound-rtp', 'framesEncoded');
19258
+ var previousFramesEncoded = getSumFromStatsByType(previous, 'outbound-rtp', 'framesEncoded');
19259
+ if (currentFramesEncoded === previousFramesEncoded) {
19260
+ getLogger().info("StatsMonitor#checkOutboundVideo --> No video frames encoded, last frames encoded count: ".concat(currentFramesEncoded, "."));
19261
+ }
19262
+ var currentFramesSent = getSumFromStatsByType(current, 'outbound-rtp', 'framesSent');
19263
+ var previousFramesSent = getSumFromStatsByType(previous, 'outbound-rtp', 'framesSent');
19264
+ if (currentFramesSent === previousFramesSent) {
19265
+ getLogger().info("StatsMonitor#checkOutboundVideo --> No video frames sent, last frames sent count: ".concat(currentFramesSent, "."));
19266
+ }
19267
+ }
19268
+ checkInboundShare(previous, current) {
19269
+ var currentSourceStateArray = getPropertyFromStatsByTypeInArray(current, 'inbound-rtp', 'sourceState');
19270
+ if (currentSourceStateArray.includes('live')) {
19271
+ var currentPacketsReceived = getSumFromStatsByType(current, 'inbound-rtp', 'packetsReceived');
19272
+ var previousPacketsReceived = getSumFromStatsByType(previous, 'inbound-rtp', 'packetsReceived');
19273
+ if (currentPacketsReceived === previousPacketsReceived) {
19274
+ getLogger().info("StatsMonitor#checkInboundShare --> No share packets received, last packets received count: ".concat(currentPacketsReceived, "."));
19275
+ }
19276
+ var currentFramesDecoded = getSumFromStatsByType(current, 'inbound-rtp', 'framesDecoded');
19277
+ var previousFramesDecoded = getSumFromStatsByType(previous, 'inbound-rtp', 'framesDecoded');
19278
+ if (currentFramesDecoded === previousFramesDecoded) {
19279
+ getLogger().info("StatsMonitor#checkInboundShare --> No share frames decoded, last frames decoded count: ".concat(currentFramesDecoded, "."));
19280
+ }
19281
+ var currentFramesReceived = getSumFromStatsByType(current, 'inbound-rtp', 'framesReceived');
19282
+ var previousFramesReceived = getSumFromStatsByType(previous, 'inbound-rtp', 'framesReceived');
19283
+ if (currentFramesReceived === previousFramesReceived) {
19284
+ getLogger().info("StatsMonitor#checkInboundShare --> No share frames received, last frames received count: ".concat(currentFramesReceived, "."));
19285
+ }
19286
+ var currentFramesDropped = getSumFromStatsByType(current, 'inbound-rtp', 'framesDropped');
19287
+ var previousFramesDropped = getSumFromStatsByType(previous, 'inbound-rtp', 'framesDropped');
19288
+ if (currentFramesDropped - previousFramesDropped > 10) {
19289
+ getLogger().info("StatsMonitor#checkInboundShare --> Too many inbound share frames dropped, total frames dropped count: ".concat(currentFramesDropped, "."));
19290
+ }
19291
+ }
19292
+ }
19293
+ checkOutboundShare(previous, current) {
19294
+ var currentPacketsSent = getSumFromStatsByType(current, 'outbound-rtp', 'packetsSent');
19295
+ var previousPacketsSent = getSumFromStatsByType(previous, 'outbound-rtp', 'packetsSent');
19296
+ if (currentPacketsSent === previousPacketsSent) {
19297
+ getLogger().info("StatsMonitor#checkOutboundShare --> No share packets sent, last packets sent count: ".concat(currentPacketsSent, "."));
19298
+ }
19299
+ var currentFramesEncoded = getSumFromStatsByType(current, 'outbound-rtp', 'framesEncoded');
19300
+ var previousFramesEncoded = getSumFromStatsByType(previous, 'outbound-rtp', 'framesEncoded');
19301
+ if (currentFramesEncoded === previousFramesEncoded) {
19302
+ getLogger().info("StatsMonitor#checkOutboundShare --> No share frames encoded, last frames encoded count: ".concat(currentFramesEncoded, "."));
19303
+ }
19304
+ var currentFramesSent = getSumFromStatsByType(current, 'outbound-rtp', 'framesSent');
19305
+ var previousFramesSent = getSumFromStatsByType(previous, 'outbound-rtp', 'framesSent');
19306
+ if (currentFramesSent === previousFramesSent) {
19307
+ getLogger().info("StatsMonitor#checkOutboundShare --> No share frames sent, last frames sent count: ".concat(currentFramesSent, "."));
19308
+ }
19309
+ }
19310
+ }
19311
+
19235
19312
  var Media = {
19236
19313
  createAudioTrack: createAudioTrack,
19237
19314
  createVideoTrack: createVideoTrack,
@@ -19268,6 +19345,7 @@ exports.RemoteStream = RemoteStream;
19268
19345
  exports.RoapMediaConnection = RoapMediaConnection;
19269
19346
  exports.SendSlot = SendSlot;
19270
19347
  exports.StatsAnalyzer = StatsAnalyzer;
19348
+ exports.StatsMonitor = StatsMonitor;
19271
19349
  exports.StreamRequest = StreamRequest;
19272
19350
  exports.WcmeError = WcmeError;
19273
19351
  exports.configureWcmeLogger = configureWcmeLogger;
package/dist/esm/index.js CHANGED
@@ -3423,7 +3423,7 @@ if(context.level===Logger.WARN&&console.warn){hdlr=console.warn;}else if(context
3423
3423
  // `options` hash can be used to configure the default logLevel and provide a custom message formatter.
3424
3424
  Logger.useDefaults=function(options){Logger.setLevel(options&&options.defaultLevel||Logger.DEBUG);Logger.setHandler(Logger.createDefaultHandler(options));};// Createa an alias to useDefaults to avoid reaking a react-hooks rule.
3425
3425
  Logger.setDefaults=Logger.useDefaults;// Export to popular environments boilerplate.
3426
- if(module.exports){module.exports=Logger;}else {Logger._prevLogger=global.Logger;Logger.noConflict=function(){global.Logger=Logger._prevLogger;return Logger;};global.Logger=Logger;}})(commonjsGlobal$1);})(logger$1);var Logger=logger$1.exports;var DEFAULT_LOGGER_NAME='web-client-media-engine';var logger=Logger.get(DEFAULT_LOGGER_NAME);logger.setLevel(Logger.DEBUG);function logErrorAndThrow(errorType,message){logger.error(message);throw new WcmeError(errorType,message);}function setLogHandler(logHandler){Logger.setHandler(logHandler);Logger$1.setHandler(logHandler);Logger$2.setHandler(logHandler);}var MediaCodecMimeType;(function(MediaCodecMimeType){MediaCodecMimeType["H264"]="video/H264";MediaCodecMimeType["AV1"]="video/AV1";MediaCodecMimeType["OPUS"]="audio/opus";})(MediaCodecMimeType||(MediaCodecMimeType={}));var defaultMaxVideoEncodeFrameSize=8160;var defaultMaxVideoEncodeMbps=244800;var defaultStartBitrateKbps=3000;var RecommendedOpusBitrates;(function(RecommendedOpusBitrates){RecommendedOpusBitrates[RecommendedOpusBitrates["NB"]=12000]="NB";RecommendedOpusBitrates[RecommendedOpusBitrates["WB"]=20000]="WB";RecommendedOpusBitrates[RecommendedOpusBitrates["FB"]=40000]="FB";RecommendedOpusBitrates[RecommendedOpusBitrates["FB_MONO_MUSIC"]=64000]="FB_MONO_MUSIC";RecommendedOpusBitrates[RecommendedOpusBitrates["FB_STEREO_MUSIC"]=128000]="FB_STEREO_MUSIC";})(RecommendedOpusBitrates||(RecommendedOpusBitrates={}));var maxFrameSizeToMaxBitrateMap=new Map([[60,99000],[240,199000],[576,300000],[920,640000],[1296,720000],[2304,880000],[3600,2500000],[8160,4000000]]);var defaultVideoMainRtxTime='300';var defaultVideoSlidesRtxTime='1000';function areProfileLevelIdsCompatible(senderProfileLevelId,receiverProfileLevelId,levelAsymmetryAllowed){var senderProfile=Number.parseInt("0x".concat(senderProfileLevelId),16);var recvProfile=Number.parseInt("0x".concat(receiverProfileLevelId),16);var senderProfileIdc=senderProfile>>16;var recvProfileIdc=recvProfile>>16;var senderProfileIop=(senderProfile&0x00ff00)>>8;var recvProfileIop=(recvProfile&0x00ff00)>>8;var senderLevelIdc=senderProfile&0x0000ff;var recvLevelIdc=recvProfile&0x0000ff;var areProfileCompatible=senderProfileIdc===recvProfileIdc&&senderProfileIop===recvProfileIop||senderProfileIdc===0x42&&recvProfileIdc===0x42&&(senderProfileIop&0x40)===(recvProfileIop&0x40);var isLevelIdcCompatible=levelAsymmetryAllowed?true:senderLevelIdc<=recvLevelIdc;return areProfileCompatible&&isLevelIdcCompatible;}function areCodecsCompatible(senderCodec,receiverCodec){return Object.keys(receiverCodec).every(key=>{if(key==='clockRate'||key==='name'){return senderCodec[key]===receiverCodec[key];}if(key==='fmtParams'){var fmtpForSender=senderCodec[key];var fmtpForReceiver=receiverCodec[key];var levelAsymmetryAllowed=[...fmtpForSender.keys()].some(senderFmtpParamKey=>{return senderFmtpParamKey==='level-asymmetry-allowed'&&fmtpForReceiver.get(senderFmtpParamKey)==='1'&&fmtpForSender.get(senderFmtpParamKey)==='1';});return [...fmtpForSender.keys()].every(senderFmtpParamKey=>{if(fmtpForReceiver.get(senderFmtpParamKey)){if(senderFmtpParamKey==='profile-level-id'){return areProfileLevelIdsCompatible(fmtpForSender.get(senderFmtpParamKey),fmtpForReceiver.get(senderFmtpParamKey),levelAsymmetryAllowed);}}if(senderFmtpParamKey==='packetization-mode'){return fmtpForSender.get(senderFmtpParamKey)===fmtpForReceiver.get(senderFmtpParamKey);}return true;});}return true;});}function gcd(a,b){return b===0?a:gcd(b,a%b);}function getFrameHeightByMaxFs(sourceAspectRatio,requestedMaxFs){var _gcd=gcd(sourceAspectRatio[0],sourceAspectRatio[1]);var minNumberRatiosForWidth=sourceAspectRatio[0]/_gcd;var minNumberRatiosForHeight=sourceAspectRatio[1]/_gcd;var macroBlockSize=16*16;var minRatioNumberByMaxFs=Math.sqrt(requestedMaxFs*macroBlockSize/(minNumberRatiosForWidth*minNumberRatiosForHeight));var roundedMinRatioNumberByMaxFs=Math.max(Math.floor(minRatioNumberByMaxFs),1.0);return roundedMinRatioNumberByMaxFs*minNumberRatiosForHeight;}function getScaleDownRatio(sourceWidth,sourceHeight,maxFs,maxWidth,maxHeight){if(!sourceWidth||!sourceHeight||!maxFs){return undefined;}var scaleDownRatio=Math.max(sourceHeight/getFrameHeightByMaxFs([sourceWidth,sourceHeight],maxFs),1.0);if(maxWidth&&maxHeight){scaleDownRatio=Math.max(sourceWidth/maxWidth,sourceHeight/maxHeight,scaleDownRatio);}return scaleDownRatio;}function getRecommendedMaxBitrateForFrameSize(requestedMaxFs){if(requestedMaxFs<60){logErrorAndThrow(WcmeErrorType.GET_MAX_BITRATE_FAILED,"Requested max video frame size cannot be less than 60.");}var expectedHeight=[...maxFrameSizeToMaxBitrateMap.keys()].sort((a,b)=>b-a).find(h=>requestedMaxFs>=h);return maxFrameSizeToMaxBitrateMap.get(expectedHeight);}/******************************************************************************
3426
+ if(module.exports){module.exports=Logger;}else {Logger._prevLogger=global.Logger;Logger.noConflict=function(){global.Logger=Logger._prevLogger;return Logger;};global.Logger=Logger;}})(commonjsGlobal$1);})(logger$1);var Logger=logger$1.exports;var DEFAULT_LOGGER_NAME='web-client-media-engine';var logger=Logger.get(DEFAULT_LOGGER_NAME);logger.setLevel(Logger.DEBUG);function logErrorAndThrow(errorType,message){logger.error(message);throw new WcmeError(errorType,message);}function setLogHandler(logHandler){Logger.setHandler(logHandler);Logger$1.setHandler(logHandler);Logger$2.setHandler(logHandler);}var MediaCodecMimeType;(function(MediaCodecMimeType){MediaCodecMimeType["H264"]="video/H264";MediaCodecMimeType["AV1"]="video/AV1";MediaCodecMimeType["OPUS"]="audio/opus";})(MediaCodecMimeType||(MediaCodecMimeType={}));var defaultMaxVideoEncodeFrameSize=8160;var defaultMaxVideoEncodeMbps=244800;var defaultStartBitrateKbps=3000;var RecommendedOpusBitrates;(function(RecommendedOpusBitrates){RecommendedOpusBitrates[RecommendedOpusBitrates["NB"]=12000]="NB";RecommendedOpusBitrates[RecommendedOpusBitrates["WB"]=20000]="WB";RecommendedOpusBitrates[RecommendedOpusBitrates["FB"]=40000]="FB";RecommendedOpusBitrates[RecommendedOpusBitrates["FB_MONO_MUSIC"]=64000]="FB_MONO_MUSIC";RecommendedOpusBitrates[RecommendedOpusBitrates["FB_STEREO_MUSIC"]=128000]="FB_STEREO_MUSIC";})(RecommendedOpusBitrates||(RecommendedOpusBitrates={}));var maxFrameSizeToMaxBitrateMap=new Map([[60,99000],[240,199000],[576,300000],[920,640000],[1296,720000],[2040,880000],[3600,2500000],[8160,4000000]]);var defaultVideoMainRtxTime='300';var defaultVideoSlidesRtxTime='1000';function areProfileLevelIdsCompatible(senderProfileLevelId,receiverProfileLevelId,levelAsymmetryAllowed){var senderProfile=Number.parseInt("0x".concat(senderProfileLevelId),16);var recvProfile=Number.parseInt("0x".concat(receiverProfileLevelId),16);var senderProfileIdc=senderProfile>>16;var recvProfileIdc=recvProfile>>16;var senderProfileIop=(senderProfile&0x00ff00)>>8;var recvProfileIop=(recvProfile&0x00ff00)>>8;var senderLevelIdc=senderProfile&0x0000ff;var recvLevelIdc=recvProfile&0x0000ff;var areProfileCompatible=senderProfileIdc===recvProfileIdc&&senderProfileIop===recvProfileIop||senderProfileIdc===0x42&&recvProfileIdc===0x42&&(senderProfileIop&0x40)===(recvProfileIop&0x40);var isLevelIdcCompatible=levelAsymmetryAllowed?true:senderLevelIdc<=recvLevelIdc;return areProfileCompatible&&isLevelIdcCompatible;}function areCodecsCompatible(senderCodec,receiverCodec){return Object.keys(receiverCodec).every(key=>{if(key==='clockRate'||key==='name'){return senderCodec[key]===receiverCodec[key];}if(key==='fmtParams'){var fmtpForSender=senderCodec[key];var fmtpForReceiver=receiverCodec[key];var levelAsymmetryAllowed=[...fmtpForSender.keys()].some(senderFmtpParamKey=>{return senderFmtpParamKey==='level-asymmetry-allowed'&&fmtpForReceiver.get(senderFmtpParamKey)==='1'&&fmtpForSender.get(senderFmtpParamKey)==='1';});return [...fmtpForSender.keys()].every(senderFmtpParamKey=>{if(fmtpForReceiver.get(senderFmtpParamKey)){if(senderFmtpParamKey==='profile-level-id'){return areProfileLevelIdsCompatible(fmtpForSender.get(senderFmtpParamKey),fmtpForReceiver.get(senderFmtpParamKey),levelAsymmetryAllowed);}}if(senderFmtpParamKey==='packetization-mode'){return fmtpForSender.get(senderFmtpParamKey)===fmtpForReceiver.get(senderFmtpParamKey);}return true;});}return true;});}function gcd(a,b){return b===0?a:gcd(b,a%b);}function getFrameHeightByMaxFs(sourceAspectRatio,requestedMaxFs){var _gcd=gcd(sourceAspectRatio[0],sourceAspectRatio[1]);var minNumberRatiosForWidth=sourceAspectRatio[0]/_gcd;var minNumberRatiosForHeight=sourceAspectRatio[1]/_gcd;var macroBlockSize=16*16;var minRatioNumberByMaxFs=Math.sqrt(requestedMaxFs*macroBlockSize/(minNumberRatiosForWidth*minNumberRatiosForHeight));var roundedMinRatioNumberByMaxFs=Math.max(Math.floor(minRatioNumberByMaxFs),1.0);return roundedMinRatioNumberByMaxFs*minNumberRatiosForHeight;}function getScaleDownRatio(sourceWidth,sourceHeight,maxFs,maxWidth,maxHeight){if(!sourceWidth||!sourceHeight||!maxFs){return undefined;}var scaleDownRatio=Math.max(sourceHeight/getFrameHeightByMaxFs([sourceWidth,sourceHeight],maxFs),1.0);if(maxWidth&&maxHeight){scaleDownRatio=Math.max(sourceWidth/maxWidth,sourceHeight/maxHeight,scaleDownRatio);}return scaleDownRatio;}function getRecommendedMaxBitrateForFrameSize(requestedMaxFs){if(requestedMaxFs<60){logErrorAndThrow(WcmeErrorType.GET_MAX_BITRATE_FAILED,"Requested max video frame size cannot be less than 60.");}var expectedHeight=[...maxFrameSizeToMaxBitrateMap.keys()].sort((a,b)=>b-a).find(h=>requestedMaxFs>=h);return maxFrameSizeToMaxBitrateMap.get(expectedHeight);}/******************************************************************************
3427
3427
  Copyright (c) Microsoft Corporation.
3428
3428
 
3429
3429
  Permission to use, copy, modify, and/or distribute this software for any
@@ -18699,6 +18699,15 @@ var NetworkQualityEventNames;
18699
18699
  (function (NetworkQualityEventNames) {
18700
18700
  NetworkQualityEventNames["NETWORK_QUALITY"] = "NETWORK_QUALITY";
18701
18701
  })(NetworkQualityEventNames || (NetworkQualityEventNames = {}));
18702
+ var StatsMonitorEventNames;
18703
+ (function (StatsMonitorEventNames) {
18704
+ StatsMonitorEventNames["INBOUND_AUDIO_ISSUE"] = "INBOUND_AUDIO_ISSUE";
18705
+ })(StatsMonitorEventNames || (StatsMonitorEventNames = {}));
18706
+ var InboundAudioIssueSubTypes;
18707
+ (function (InboundAudioIssueSubTypes) {
18708
+ InboundAudioIssueSubTypes["DECODE_RESULTS_IN_ZERO_AUDIO_LEVEL"] = "DECODE_RESULTS_IN_ZERO_AUDIO_LEVEL";
18709
+ InboundAudioIssueSubTypes["ALL_PACKETS_DISCARDED"] = "ALL_PACKETS_DISCARDED";
18710
+ })(InboundAudioIssueSubTypes || (InboundAudioIssueSubTypes = {}));
18702
18711
 
18703
18712
  function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
18704
18713
  function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
@@ -18707,6 +18716,7 @@ class StatsAnalyzer extends EventEmitter$5 {
18707
18716
  var {
18708
18717
  config,
18709
18718
  networkQualityMonitor,
18719
+ statsMonitor,
18710
18720
  isMultistream = false
18711
18721
  } = _ref;
18712
18722
  super();
@@ -18718,6 +18728,7 @@ class StatsAnalyzer extends EventEmitter$5 {
18718
18728
  _defineProperty(this, "mqeInterval", void 0);
18719
18729
  _defineProperty(this, "mqeSentCount", 0);
18720
18730
  _defineProperty(this, "networkQualityMonitor", void 0);
18731
+ _defineProperty(this, "statsMonitor", void 0);
18721
18732
  _defineProperty(this, "mediaConnection", null);
18722
18733
  _defineProperty(this, "statsStarted", false);
18723
18734
  _defineProperty(this, "mqeIntervalSessionReceiveAudioMainBuilder", void 0);
@@ -18759,6 +18770,7 @@ class StatsAnalyzer extends EventEmitter$5 {
18759
18770
  });
18760
18771
  this.config = config;
18761
18772
  this.networkQualityMonitor = networkQualityMonitor;
18773
+ this.statsMonitor = statsMonitor;
18762
18774
  this.mqeIntervalSessionReceiveAudioMainBuilder = new MqeIntervalSessionReceiveAudioBuilder({
18763
18775
  isMain: true,
18764
18776
  multistreamEnabled: isMultistream
@@ -18977,7 +18989,7 @@ class StatsAnalyzer extends EventEmitter$5 {
18977
18989
  })();
18978
18990
  }
18979
18991
  monitorStats(transceiverStats) {
18980
- var _this$meetingMediaSta3, _this$meetingMediaSta4, _this$meetingMediaSta5, _this$meetingMediaSta6, _this$meetingMediaSta7, _this$previousTransce, _this$previousTransce2, _this$previousTransce3, _this$previousTransce4, _this$previousTransce5, _this$previousTransce6, _this$previousTransce7, _this$previousTransce8, _this$previousTransce9, _this$previousTransce10, _this$previousTransce11, _this$previousTransce12;
18992
+ var _this$meetingMediaSta3, _this$meetingMediaSta4, _this$meetingMediaSta5, _this$meetingMediaSta6, _this$meetingMediaSta7, _this$meetingMediaSta8, _this$previousTransce, _this$previousTransce2, _this$previousTransce3, _this$previousTransce4, _this$previousTransce5, _this$previousTransce6, _this$previousTransce7, _this$previousTransce8, _this$previousTransce9, _this$previousTransce10, _this$previousTransce11, _this$previousTransce12;
18981
18993
  var emitNetworkQualityEvents = (mediaType, intervalStats) => {
18982
18994
  var roundTripTimeArray = getPropertyFromStatsByTypeInArray(intervalStats, 'remote-inbound-rtp', 'roundTripTime');
18983
18995
  var jitterArray = getPropertyFromStatsByTypeInArray(intervalStats, 'remote-inbound-rtp', 'jitter');
@@ -18993,129 +19005,45 @@ class StatsAnalyzer extends EventEmitter$5 {
18993
19005
  var current = convertToStatsMap(transceiverStats.audio.senders);
18994
19006
  if (this.previousTransceiverStats) {
18995
19007
  var previous = convertToStatsMap(this.previousTransceiverStats.audio.senders);
18996
- var currentPacketsSent = getSumFromStatsByType(current, 'outbound-rtp', 'packetsSent');
18997
- var previousPacketsSent = getSumFromStatsByType(previous, 'outbound-rtp', 'packetsSent');
18998
- if (currentPacketsSent === previousPacketsSent) {
18999
- getLogger().info("StatsAnalyzer#monitorStats --> No audio packets sent, last packets sent count: ".concat(currentPacketsSent, "."));
19000
- }
19001
- var totalAudioEnergyExists = getPropertyFromStatsByType(current, 'media-source', 'totalAudioEnergy') !== undefined;
19002
- if (totalAudioEnergyExists) {
19003
- var currentTotalAudioEnergy = getSumFromStatsByType(current, 'media-source', 'totalAudioEnergy');
19004
- var previousTotalAudioEnergy = getSumFromStatsByType(previous, 'media-source', 'totalAudioEnergy');
19005
- if (currentTotalAudioEnergy === previousTotalAudioEnergy) {
19006
- getLogger().info("StatsAnalyzer#monitorStats --> No audio energy, last total audio energy: ".concat(currentTotalAudioEnergy, "."));
19007
- }
19008
- }
19009
- var audioLevelExists = getPropertyFromStatsByType(current, 'media-source', 'audioLevel') !== undefined;
19010
- if (audioLevelExists) {
19011
- var currentAudioLevel = getSumFromStatsByType(current, 'media-source', 'audioLevel');
19012
- if (currentAudioLevel === 0) {
19013
- getLogger().info("StatsAnalyzer#monitorStats --> Audio level is 0.");
19014
- }
19015
- }
19008
+ this.statsMonitor.checkOutboundAudio(previous, current);
19016
19009
  }
19017
19010
  emitNetworkQualityEvents('audio', current);
19018
19011
  }
19019
- if ((_this$meetingMediaSta4 = this.meetingMediaStatus) !== null && _this$meetingMediaSta4 !== void 0 && _this$meetingMediaSta4.expected.sendVideo) {
19020
- var _current = convertToStatsMap(transceiverStats.video.senders);
19012
+ if ((_this$meetingMediaSta4 = this.meetingMediaStatus) !== null && _this$meetingMediaSta4 !== void 0 && _this$meetingMediaSta4.expected.receiveAudio) {
19013
+ var _current = convertToStatsMap(transceiverStats.audio.receivers);
19021
19014
  if (this.previousTransceiverStats) {
19022
- var _previous = convertToStatsMap(this.previousTransceiverStats.video.senders);
19023
- var _currentPacketsSent = getSumFromStatsByType(_current, 'outbound-rtp', 'packetsSent');
19024
- var _previousPacketsSent = getSumFromStatsByType(_previous, 'outbound-rtp', 'packetsSent');
19025
- if (_currentPacketsSent === _previousPacketsSent) {
19026
- getLogger().info("StatsAnalyzer#monitorStats --> No video packets sent, last packets sent count: ".concat(_currentPacketsSent, "."));
19027
- }
19028
- var currentFramesEncoded = getSumFromStatsByType(_current, 'outbound-rtp', 'framesEncoded');
19029
- var previousFramesEncoded = getSumFromStatsByType(_previous, 'outbound-rtp', 'framesEncoded');
19030
- if (currentFramesEncoded === previousFramesEncoded) {
19031
- getLogger().info("StatsAnalyzer#monitorStats --> No video frames encoded, last frames encoded count: ".concat(currentFramesEncoded, "."));
19032
- }
19033
- var currentFramesSent = getSumFromStatsByType(_current, 'outbound-rtp', 'framesSent');
19034
- var previousFramesSent = getSumFromStatsByType(_previous, 'outbound-rtp', 'framesSent');
19035
- if (currentFramesSent === previousFramesSent) {
19036
- getLogger().info("StatsAnalyzer#monitorStats --> No video frames sent, last frames sent count: ".concat(currentFramesSent, "."));
19037
- }
19015
+ var _previous = convertToStatsMap(this.previousTransceiverStats.audio.receivers);
19016
+ this.statsMonitor.checkInboundAudio(_previous, _current);
19038
19017
  }
19039
- emitNetworkQualityEvents('video', _current);
19040
19018
  }
19041
- if ((_this$meetingMediaSta5 = this.meetingMediaStatus) !== null && _this$meetingMediaSta5 !== void 0 && _this$meetingMediaSta5.expected.receiveVideo) {
19042
- var _current2 = convertToStatsMap(transceiverStats.video.receivers);
19019
+ if ((_this$meetingMediaSta5 = this.meetingMediaStatus) !== null && _this$meetingMediaSta5 !== void 0 && _this$meetingMediaSta5.expected.sendVideo) {
19020
+ var _current2 = convertToStatsMap(transceiverStats.video.senders);
19043
19021
  if (this.previousTransceiverStats) {
19044
- var currentSourceStateArray = getPropertyFromStatsByTypeInArray(_current2, 'inbound-rtp', 'sourceState');
19045
- if (currentSourceStateArray.includes('live')) {
19046
- var _previous2 = convertToStatsMap(this.previousTransceiverStats.video.receivers);
19047
- var currentPacketsReceived = getSumFromStatsByType(_current2, 'inbound-rtp', 'packetsReceived');
19048
- var previousPacketsReceived = getSumFromStatsByType(_previous2, 'inbound-rtp', 'packetsReceived');
19049
- if (currentPacketsReceived === previousPacketsReceived) {
19050
- getLogger().info("StatsAnalyzer#monitorStats --> No video packets received, last packets received count: ".concat(currentPacketsReceived, "."));
19051
- }
19052
- var currentFramesDecoded = getSumFromStatsByType(_current2, 'inbound-rtp', 'framesDecoded');
19053
- var previousFramesDecoded = getSumFromStatsByType(_previous2, 'inbound-rtp', 'framesDecoded');
19054
- if (currentFramesDecoded === previousFramesDecoded) {
19055
- getLogger().info("StatsAnalyzer#monitorStats --> No video frames decoded, last frames decoded count: ".concat(currentFramesDecoded, "."));
19056
- }
19057
- var currentFramesReceived = getSumFromStatsByType(_current2, 'inbound-rtp', 'framesReceived');
19058
- var previousFramesReceived = getSumFromStatsByType(_previous2, 'inbound-rtp', 'framesReceived');
19059
- if (currentFramesReceived === previousFramesReceived) {
19060
- getLogger().info("StatsAnalyzer#monitorStats --> No video frames received, last frames received count: ".concat(currentFramesReceived, "."));
19061
- }
19062
- var currentFramesDropped = getSumFromStatsByType(_current2, 'inbound-rtp', 'framesDropped');
19063
- var previousFramesDropped = getSumFromStatsByType(_previous2, 'inbound-rtp', 'framesDropped');
19064
- if (currentFramesDropped - previousFramesDropped > 10) {
19065
- getLogger().info("StatsAnalyzer#monitorStats --> Too many video frames dropped, total frames dropped count: ".concat(currentFramesDropped, "."));
19066
- }
19067
- }
19022
+ var _previous2 = convertToStatsMap(this.previousTransceiverStats.video.senders);
19023
+ this.statsMonitor.checkOutboundVideo(_previous2, _current2);
19068
19024
  }
19025
+ emitNetworkQualityEvents('video', _current2);
19069
19026
  }
19070
- if ((_this$meetingMediaSta6 = this.meetingMediaStatus) !== null && _this$meetingMediaSta6 !== void 0 && _this$meetingMediaSta6.expected.sendShare) {
19071
- var _current3 = convertToStatsMap(transceiverStats.screenShareVideo.senders);
19027
+ if ((_this$meetingMediaSta6 = this.meetingMediaStatus) !== null && _this$meetingMediaSta6 !== void 0 && _this$meetingMediaSta6.expected.receiveVideo) {
19028
+ var _current3 = convertToStatsMap(transceiverStats.video.receivers);
19072
19029
  if (this.previousTransceiverStats) {
19073
- var _previous3 = convertToStatsMap(this.previousTransceiverStats.screenShareVideo.senders);
19074
- var _currentPacketsSent2 = getSumFromStatsByType(_current3, 'outbound-rtp', 'packetsSent');
19075
- var _previousPacketsSent2 = getSumFromStatsByType(_previous3, 'outbound-rtp', 'packetsSent');
19076
- if (_currentPacketsSent2 === _previousPacketsSent2) {
19077
- getLogger().info("StatsAnalyzer#monitorStats --> No share packets sent, last packets sent count: ".concat(_currentPacketsSent2, "."));
19078
- }
19079
- var _currentFramesEncoded = getSumFromStatsByType(_current3, 'outbound-rtp', 'framesEncoded');
19080
- var _previousFramesEncoded = getSumFromStatsByType(_previous3, 'outbound-rtp', 'framesEncoded');
19081
- if (_currentFramesEncoded === _previousFramesEncoded) {
19082
- getLogger().info("StatsAnalyzer#monitorStats --> No share frames encoded, last frames encoded count: ".concat(_currentFramesEncoded, "."));
19083
- }
19084
- var _currentFramesSent = getSumFromStatsByType(_current3, 'outbound-rtp', 'framesSent');
19085
- var _previousFramesSent = getSumFromStatsByType(_previous3, 'outbound-rtp', 'framesSent');
19086
- if (_currentFramesSent === _previousFramesSent) {
19087
- getLogger().info("StatsAnalyzer#monitorStats --> No share frames sent, last frames sent count: ".concat(_currentFramesSent, "."));
19088
- }
19030
+ var _previous3 = convertToStatsMap(this.previousTransceiverStats.video.receivers);
19031
+ this.statsMonitor.checkInboundVideo(_previous3, _current3);
19089
19032
  }
19090
- emitNetworkQualityEvents('share', _current3);
19091
19033
  }
19092
- if ((_this$meetingMediaSta7 = this.meetingMediaStatus) !== null && _this$meetingMediaSta7 !== void 0 && _this$meetingMediaSta7.expected.receiveShare) {
19093
- var _current4 = convertToStatsMap(transceiverStats.screenShareVideo.receivers);
19034
+ if ((_this$meetingMediaSta7 = this.meetingMediaStatus) !== null && _this$meetingMediaSta7 !== void 0 && _this$meetingMediaSta7.expected.sendShare) {
19035
+ var _current4 = convertToStatsMap(transceiverStats.screenShareVideo.senders);
19094
19036
  if (this.previousTransceiverStats) {
19095
- var _currentSourceStateArray = getPropertyFromStatsByTypeInArray(_current4, 'inbound-rtp', 'sourceState');
19096
- if (_currentSourceStateArray.includes('live')) {
19097
- var _previous4 = convertToStatsMap(this.previousTransceiverStats.screenShareVideo.receivers);
19098
- var _currentPacketsReceived = getSumFromStatsByType(_current4, 'inbound-rtp', 'packetsReceived');
19099
- var _previousPacketsReceived = getSumFromStatsByType(_previous4, 'inbound-rtp', 'packetsReceived');
19100
- if (_currentPacketsReceived === _previousPacketsReceived) {
19101
- getLogger().info("StatsAnalyzer#monitorStats --> No share packets received, last packets received count: ".concat(_currentPacketsReceived, "."));
19102
- }
19103
- var _currentFramesDecoded = getSumFromStatsByType(_current4, 'inbound-rtp', 'framesDecoded');
19104
- var _previousFramesDecoded = getSumFromStatsByType(_previous4, 'inbound-rtp', 'framesDecoded');
19105
- if (_currentFramesDecoded === _previousFramesDecoded) {
19106
- getLogger().info("StatsAnalyzer#monitorStats --> No share frames decoded, last frames decoded count: ".concat(_currentFramesDecoded, "."));
19107
- }
19108
- var _currentFramesReceived = getSumFromStatsByType(_current4, 'inbound-rtp', 'framesReceived');
19109
- var _previousFramesReceived = getSumFromStatsByType(_previous4, 'inbound-rtp', 'framesReceived');
19110
- if (_currentFramesReceived === _previousFramesReceived) {
19111
- getLogger().info("StatsAnalyzer#monitorStats --> No share frames received, last frames received count: ".concat(_currentFramesReceived, "."));
19112
- }
19113
- var _currentFramesDropped = getSumFromStatsByType(_current4, 'inbound-rtp', 'framesDropped');
19114
- var _previousFramesDropped = getSumFromStatsByType(_previous4, 'inbound-rtp', 'framesDropped');
19115
- if (_currentFramesDropped - _previousFramesDropped > 10) {
19116
- getLogger().info("StatsAnalyzer#monitorStats --> Too many share frames dropped, total frames dropped count: ".concat(_currentFramesDropped, "."));
19117
- }
19118
- }
19037
+ var _previous4 = convertToStatsMap(this.previousTransceiverStats.screenShareVideo.senders);
19038
+ this.statsMonitor.checkOutboundShare(_previous4, _current4);
19039
+ }
19040
+ emitNetworkQualityEvents('share', _current4);
19041
+ }
19042
+ if ((_this$meetingMediaSta8 = this.meetingMediaStatus) !== null && _this$meetingMediaSta8 !== void 0 && _this$meetingMediaSta8.expected.receiveShare) {
19043
+ var _current5 = convertToStatsMap(transceiverStats.screenShareVideo.receivers);
19044
+ if (this.previousTransceiverStats) {
19045
+ var _previous5 = convertToStatsMap(this.previousTransceiverStats.screenShareVideo.receivers);
19046
+ this.statsMonitor.checkInboundShare(_previous5, _current5);
19119
19047
  }
19120
19048
  }
19121
19049
  this.emitStartStopEvents('audio', getSumFromStatsByType(convertToStatsMap((_this$previousTransce = (_this$previousTransce2 = this.previousTransceiverStats) === null || _this$previousTransce2 === void 0 ? void 0 : _this$previousTransce2.audio.senders) !== null && _this$previousTransce !== void 0 ? _this$previousTransce : []), 'outbound-rtp', 'packetsSent'), getSumFromStatsByType(convertToStatsMap(transceiverStats.audio.senders), 'outbound-rtp', 'packetsSent'), true);
@@ -19228,6 +19156,155 @@ class NetworkQualityMonitor extends EventEmitter$5 {
19228
19156
  }
19229
19157
  }
19230
19158
 
19159
+ var MIN_AUDIO_PACKETS_RECEIVER_THRESHOLD = 500;
19160
+ var InboundAudioThresholds = {
19161
+ DecodeResultsInZeroAudioLevel: {
19162
+ concealedRatio: 0.7,
19163
+ lossRatio: 0.2,
19164
+ discardedRatio: 0.5
19165
+ },
19166
+ AllPacketsDiscarded: {
19167
+ discardedRatio: 0.9
19168
+ }
19169
+ };
19170
+ class StatsMonitor extends EventEmitter$5 {
19171
+ hasAudioDecodeIssue(totalAudioEnergy, totalSamplesReceived, concealedRatio, lossRatio, discardedRatio) {
19172
+ var thresholds = InboundAudioThresholds.DecodeResultsInZeroAudioLevel;
19173
+ return totalAudioEnergy === 0 && totalSamplesReceived > 0 && concealedRatio < thresholds.concealedRatio && lossRatio < thresholds.lossRatio && discardedRatio < thresholds.discardedRatio;
19174
+ }
19175
+ checkInboundAudio(previous, current) {
19176
+ var previousPacketsReceived = getSumFromStatsByType(previous, 'inbound-rtp', 'packetsReceived');
19177
+ var packetsReceived = getSumFromStatsByType(current, 'inbound-rtp', 'packetsReceived');
19178
+ var totalSamplesReceived = getSumFromStatsByType(current, 'inbound-rtp', 'totalSamplesReceived');
19179
+ var totalAudioEnergy = getSumFromStatsByType(current, 'inbound-rtp', 'totalAudioEnergy');
19180
+ var packetsDiscarded = getSumFromStatsByType(current, 'inbound-rtp', 'packetsDiscarded');
19181
+ var concealedSamples = getSumFromStatsByType(current, 'inbound-rtp', 'concealedSamples');
19182
+ var packetsLost = getSumFromStatsByType(current, 'inbound-rtp', 'packetsLost');
19183
+ var concealedRatio = totalSamplesReceived > 0 ? concealedSamples / totalSamplesReceived : 0;
19184
+ var lossRatio = packetsReceived + packetsLost > 0 ? packetsLost / (packetsReceived + packetsLost) : 0;
19185
+ var discardedRatio = packetsReceived > 0 ? packetsDiscarded / packetsReceived : 0;
19186
+ if (packetsReceived > MIN_AUDIO_PACKETS_RECEIVER_THRESHOLD && packetsReceived > previousPacketsReceived) {
19187
+ if (this.hasAudioDecodeIssue(totalAudioEnergy, totalSamplesReceived, concealedRatio, lossRatio, discardedRatio)) {
19188
+ getLogger().info("StatsMonitor#checkInboundAudio --> Incoming audio from all streams is not being decoded correctly, totalAudioEnergy: ".concat(totalAudioEnergy, ", totalSamplesReceived: ").concat(totalSamplesReceived, ", packetsReceived: ").concat(packetsReceived, ", concealedRatio: ").concat(concealedRatio, ", lossRatio: ").concat(lossRatio, ", discardedRatio: ").concat(discardedRatio, "."));
19189
+ this.emit(StatsMonitorEventNames.INBOUND_AUDIO_ISSUE, {
19190
+ issueSubType: InboundAudioIssueSubTypes.DECODE_RESULTS_IN_ZERO_AUDIO_LEVEL
19191
+ });
19192
+ } else if (discardedRatio >= InboundAudioThresholds.AllPacketsDiscarded.discardedRatio) {
19193
+ getLogger().info("StatsMonitor#checkInboundAudio --> Incoming audio packets from all streams are being discarded, packetsReceived: ".concat(packetsReceived, ", packetsDiscarded: ").concat(packetsDiscarded, ", discardedRatio: ").concat(discardedRatio, "."));
19194
+ this.emit(StatsMonitorEventNames.INBOUND_AUDIO_ISSUE, {
19195
+ issueSubType: InboundAudioIssueSubTypes.ALL_PACKETS_DISCARDED
19196
+ });
19197
+ }
19198
+ }
19199
+ }
19200
+ checkOutboundAudio(previous, current) {
19201
+ var currentPacketsSent = getSumFromStatsByType(current, 'outbound-rtp', 'packetsSent');
19202
+ var previousPacketsSent = getSumFromStatsByType(previous, 'outbound-rtp', 'packetsSent');
19203
+ if (currentPacketsSent === previousPacketsSent) {
19204
+ getLogger().info("StatsMonitor#checkOutboundAudio --> No audio packets sent, last packets sent count: ".concat(currentPacketsSent, "."));
19205
+ }
19206
+ var totalAudioEnergyExists = getPropertyFromStatsByType(current, 'media-source', 'totalAudioEnergy') !== undefined;
19207
+ if (totalAudioEnergyExists) {
19208
+ var currentTotalAudioEnergy = getSumFromStatsByType(current, 'media-source', 'totalAudioEnergy');
19209
+ var previousTotalAudioEnergy = getSumFromStatsByType(previous, 'media-source', 'totalAudioEnergy');
19210
+ if (currentTotalAudioEnergy === previousTotalAudioEnergy) {
19211
+ getLogger().info("StatsMonitor#checkOutboundAudio --> No audio energy from local audio source, last total audio energy: ".concat(currentTotalAudioEnergy, "."));
19212
+ }
19213
+ }
19214
+ var audioLevelExists = getPropertyFromStatsByType(current, 'media-source', 'audioLevel') !== undefined;
19215
+ if (audioLevelExists) {
19216
+ var currentAudioLevel = getSumFromStatsByType(current, 'media-source', 'audioLevel');
19217
+ if (currentAudioLevel === 0) {
19218
+ getLogger().info("StatsMonitor#checkOutboundAudio --> Audio level in local audio source is 0.");
19219
+ }
19220
+ }
19221
+ }
19222
+ checkInboundVideo(previous, current) {
19223
+ var currentSourceStateArray = getPropertyFromStatsByTypeInArray(current, 'inbound-rtp', 'sourceState');
19224
+ if (currentSourceStateArray.includes('live')) {
19225
+ var currentPacketsReceived = getSumFromStatsByType(current, 'inbound-rtp', 'packetsReceived');
19226
+ var previousPacketsReceived = getSumFromStatsByType(previous, 'inbound-rtp', 'packetsReceived');
19227
+ if (currentPacketsReceived === previousPacketsReceived) {
19228
+ getLogger().info("StatsMonitor#checkInboundVideo --> No video packets received, last packets received count: ".concat(currentPacketsReceived, "."));
19229
+ }
19230
+ var currentFramesDecoded = getSumFromStatsByType(current, 'inbound-rtp', 'framesDecoded');
19231
+ var previousFramesDecoded = getSumFromStatsByType(previous, 'inbound-rtp', 'framesDecoded');
19232
+ if (currentFramesDecoded === previousFramesDecoded) {
19233
+ getLogger().info("StatsMonitor#checkInboundVideo --> No video frames decoded, last frames decoded count: ".concat(currentFramesDecoded, "."));
19234
+ }
19235
+ var currentFramesReceived = getSumFromStatsByType(current, 'inbound-rtp', 'framesReceived');
19236
+ var previousFramesReceived = getSumFromStatsByType(previous, 'inbound-rtp', 'framesReceived');
19237
+ if (currentFramesReceived === previousFramesReceived) {
19238
+ getLogger().info("StatsMonitor#checkInboundVideo --> No video frames received, last frames received count: ".concat(currentFramesReceived, "."));
19239
+ }
19240
+ var currentFramesDropped = getSumFromStatsByType(current, 'inbound-rtp', 'framesDropped');
19241
+ var previousFramesDropped = getSumFromStatsByType(previous, 'inbound-rtp', 'framesDropped');
19242
+ if (currentFramesDropped - previousFramesDropped > 10) {
19243
+ getLogger().info("StatsMonitor#checkInboundVideo --> Too many inbound video frames dropped, total frames dropped count: ".concat(currentFramesDropped, "."));
19244
+ }
19245
+ }
19246
+ }
19247
+ checkOutboundVideo(previous, current) {
19248
+ var currentPacketsSent = getSumFromStatsByType(current, 'outbound-rtp', 'packetsSent');
19249
+ var previousPacketsSent = getSumFromStatsByType(previous, 'outbound-rtp', 'packetsSent');
19250
+ if (currentPacketsSent === previousPacketsSent) {
19251
+ getLogger().info("StatsMonitor#checkOutboundVideo --> No video packets sent, last packets sent count: ".concat(currentPacketsSent, "."));
19252
+ }
19253
+ var currentFramesEncoded = getSumFromStatsByType(current, 'outbound-rtp', 'framesEncoded');
19254
+ var previousFramesEncoded = getSumFromStatsByType(previous, 'outbound-rtp', 'framesEncoded');
19255
+ if (currentFramesEncoded === previousFramesEncoded) {
19256
+ getLogger().info("StatsMonitor#checkOutboundVideo --> No video frames encoded, last frames encoded count: ".concat(currentFramesEncoded, "."));
19257
+ }
19258
+ var currentFramesSent = getSumFromStatsByType(current, 'outbound-rtp', 'framesSent');
19259
+ var previousFramesSent = getSumFromStatsByType(previous, 'outbound-rtp', 'framesSent');
19260
+ if (currentFramesSent === previousFramesSent) {
19261
+ getLogger().info("StatsMonitor#checkOutboundVideo --> No video frames sent, last frames sent count: ".concat(currentFramesSent, "."));
19262
+ }
19263
+ }
19264
+ checkInboundShare(previous, current) {
19265
+ var currentSourceStateArray = getPropertyFromStatsByTypeInArray(current, 'inbound-rtp', 'sourceState');
19266
+ if (currentSourceStateArray.includes('live')) {
19267
+ var currentPacketsReceived = getSumFromStatsByType(current, 'inbound-rtp', 'packetsReceived');
19268
+ var previousPacketsReceived = getSumFromStatsByType(previous, 'inbound-rtp', 'packetsReceived');
19269
+ if (currentPacketsReceived === previousPacketsReceived) {
19270
+ getLogger().info("StatsMonitor#checkInboundShare --> No share packets received, last packets received count: ".concat(currentPacketsReceived, "."));
19271
+ }
19272
+ var currentFramesDecoded = getSumFromStatsByType(current, 'inbound-rtp', 'framesDecoded');
19273
+ var previousFramesDecoded = getSumFromStatsByType(previous, 'inbound-rtp', 'framesDecoded');
19274
+ if (currentFramesDecoded === previousFramesDecoded) {
19275
+ getLogger().info("StatsMonitor#checkInboundShare --> No share frames decoded, last frames decoded count: ".concat(currentFramesDecoded, "."));
19276
+ }
19277
+ var currentFramesReceived = getSumFromStatsByType(current, 'inbound-rtp', 'framesReceived');
19278
+ var previousFramesReceived = getSumFromStatsByType(previous, 'inbound-rtp', 'framesReceived');
19279
+ if (currentFramesReceived === previousFramesReceived) {
19280
+ getLogger().info("StatsMonitor#checkInboundShare --> No share frames received, last frames received count: ".concat(currentFramesReceived, "."));
19281
+ }
19282
+ var currentFramesDropped = getSumFromStatsByType(current, 'inbound-rtp', 'framesDropped');
19283
+ var previousFramesDropped = getSumFromStatsByType(previous, 'inbound-rtp', 'framesDropped');
19284
+ if (currentFramesDropped - previousFramesDropped > 10) {
19285
+ getLogger().info("StatsMonitor#checkInboundShare --> Too many inbound share frames dropped, total frames dropped count: ".concat(currentFramesDropped, "."));
19286
+ }
19287
+ }
19288
+ }
19289
+ checkOutboundShare(previous, current) {
19290
+ var currentPacketsSent = getSumFromStatsByType(current, 'outbound-rtp', 'packetsSent');
19291
+ var previousPacketsSent = getSumFromStatsByType(previous, 'outbound-rtp', 'packetsSent');
19292
+ if (currentPacketsSent === previousPacketsSent) {
19293
+ getLogger().info("StatsMonitor#checkOutboundShare --> No share packets sent, last packets sent count: ".concat(currentPacketsSent, "."));
19294
+ }
19295
+ var currentFramesEncoded = getSumFromStatsByType(current, 'outbound-rtp', 'framesEncoded');
19296
+ var previousFramesEncoded = getSumFromStatsByType(previous, 'outbound-rtp', 'framesEncoded');
19297
+ if (currentFramesEncoded === previousFramesEncoded) {
19298
+ getLogger().info("StatsMonitor#checkOutboundShare --> No share frames encoded, last frames encoded count: ".concat(currentFramesEncoded, "."));
19299
+ }
19300
+ var currentFramesSent = getSumFromStatsByType(current, 'outbound-rtp', 'framesSent');
19301
+ var previousFramesSent = getSumFromStatsByType(previous, 'outbound-rtp', 'framesSent');
19302
+ if (currentFramesSent === previousFramesSent) {
19303
+ getLogger().info("StatsMonitor#checkOutboundShare --> No share frames sent, last frames sent count: ".concat(currentFramesSent, "."));
19304
+ }
19305
+ }
19306
+ }
19307
+
19231
19308
  var Media = {
19232
19309
  createAudioTrack: createAudioTrack,
19233
19310
  createVideoTrack: createVideoTrack,
@@ -19245,4 +19322,4 @@ var Media = {
19245
19322
  }
19246
19323
  };
19247
19324
 
19248
- export { ActiveSpeakerInfo, CodecInfo$1 as CodecInfo, ConnectionState, ErrorType, Errors, H264Codec, LocalCameraStream, LocalDisplayStream, LocalMicrophoneStream, LocalStream, LocalStreamEventNames, LocalSystemAudioStream, Media, MediaConnectionEventNames, MediaContent, MediaFamily, MediaStreamTrackKind, MediaType, MultistreamRoapMediaConnection, NetworkQualityEventNames, NetworkQualityMonitor, PeerConnection, Policy, ReceiveSlot, ReceiveSlotEvents, ReceiverSelectedInfo, RecommendedOpusBitrates, RemoteStream, RemoteStreamEventNames, RemoteTrackType, RoapMediaConnection, SendSlot, StatsAnalyzer, StatsAnalyzerEventNames, StreamEventNames, StreamRequest, WcmeError, WcmeErrorType, configureWcmeLogger, createCameraAndMicrophoneStreams, createCameraStream, createDisplayMedia, createDisplayStream, createDisplayStreamWithAudio, createMicrophoneStream, getAudioInputDevices, getAudioOutputDevices, getDevices, getErrorDescription, getLogger, getMediaFamily, getRecommendedMaxBitrateForFrameSize, getVideoInputDevices, setLogger, setOnDeviceChangeHandler };
19325
+ export { ActiveSpeakerInfo, CodecInfo$1 as CodecInfo, ConnectionState, ErrorType, Errors, H264Codec, InboundAudioIssueSubTypes, LocalCameraStream, LocalDisplayStream, LocalMicrophoneStream, LocalStream, LocalStreamEventNames, LocalSystemAudioStream, Media, MediaConnectionEventNames, MediaContent, MediaFamily, MediaStreamTrackKind, MediaType, MultistreamRoapMediaConnection, NetworkQualityEventNames, NetworkQualityMonitor, PeerConnection, Policy, ReceiveSlot, ReceiveSlotEvents, ReceiverSelectedInfo, RecommendedOpusBitrates, RemoteStream, RemoteStreamEventNames, RemoteTrackType, RoapMediaConnection, SendSlot, StatsAnalyzer, StatsAnalyzerEventNames, StatsMonitor, StatsMonitorEventNames, StreamEventNames, StreamRequest, WcmeError, WcmeErrorType, configureWcmeLogger, createCameraAndMicrophoneStreams, createCameraStream, createDisplayMedia, createDisplayStream, createDisplayStreamWithAudio, createMicrophoneStream, getAudioInputDevices, getAudioOutputDevices, getDevices, getErrorDescription, getLogger, getMediaFamily, getRecommendedMaxBitrateForFrameSize, getVideoInputDevices, setLogger, setOnDeviceChangeHandler };
@@ -80,8 +80,7 @@ export interface Typegen0 {
80
80
  };
81
81
  eventsCausingGuards: {
82
82
  isHandlingOfferRequest: 'REMOTE_OFFER_REQUEST_ARRIVED' | 'done.invoke.roap.creatingLocalOffer:invocation[0]';
83
- isOkInTransaction: 'done.invoke.roap.settingRemoteAnswer:invocation[0]';
84
- isOkNotInTransaction: 'REMOTE_OFFER_ARRIVED' | 'REMOTE_OFFER_REQUEST_ARRIVED';
83
+ isOkInTransaction: 'REMOTE_OFFER_ARRIVED' | 'REMOTE_OFFER_REQUEST_ARRIVED' | 'done.invoke.roap.settingRemoteAnswer:invocation[0]';
85
84
  isPendingLocalOffer: '' | 'done.invoke.roap.creatingLocalOffer:invocation[0]';
86
85
  isSameSeq: 'ERROR_ARRIVED' | 'REMOTE_ANSWER_ARRIVED' | 'REMOTE_OFFER_ARRIVED' | 'REMOTE_OFFER_REQUEST_ARRIVED';
87
86
  shouldErrorTriggerOfferRetry: 'ERROR_ARRIVED';
@@ -1 +1 @@
1
- {"version":3,"file":"roap.typegen.d.ts","sourceRoot":"","sources":["../../../src/MediaConnection/roap.typegen.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"roap.typegen.d.ts","sourceRoot":"","sources":["../../../src/MediaConnection/roap.typegen.ts"],"names":[],"mappings":"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"}
@@ -3,6 +3,7 @@ import { MultistreamRoapMediaConnection, RoapMediaConnection } from '../MediaCon
3
3
  import { NetworkQualityMonitor } from './NetworkQualityMonitor';
4
4
  import { StatsAnalyzerEvents } from './eventTypes';
5
5
  import { ActualExpectedMediaStatus, StatsAnalyzerConfig } from './types';
6
+ import { StatsMonitor } from './StatsMonitor';
6
7
  export declare class StatsAnalyzer extends EventEmitter<StatsAnalyzerEvents> {
7
8
  private config;
8
9
  private lastEmittedStartStopEvents;
@@ -12,6 +13,7 @@ export declare class StatsAnalyzer extends EventEmitter<StatsAnalyzerEvents> {
12
13
  private mqeInterval?;
13
14
  private mqeSentCount;
14
15
  private networkQualityMonitor;
16
+ private statsMonitor;
15
17
  private mediaConnection;
16
18
  private statsStarted;
17
19
  private mqeIntervalSessionReceiveAudioMainBuilder;
@@ -23,9 +25,10 @@ export declare class StatsAnalyzer extends EventEmitter<StatsAnalyzerEvents> {
23
25
  private mqeIntervalSessionTransmitVideoMainBuilder;
24
26
  private mqeIntervalSessionTransmitVideoSlidesBuilder;
25
27
  private intervalMetadata;
26
- constructor({ config, networkQualityMonitor, isMultistream, }: {
28
+ constructor({ config, networkQualityMonitor, statsMonitor, isMultistream, }: {
27
29
  config: StatsAnalyzerConfig;
28
30
  networkQualityMonitor: NetworkQualityMonitor;
31
+ statsMonitor: StatsMonitor;
29
32
  isMultistream?: boolean;
30
33
  });
31
34
  private get builders();
@@ -1 +1 @@
1
- {"version":3,"file":"StatsAnalyzer.d.ts","sourceRoot":"","sources":["../../../src/StatsAnalyzer/StatsAnalyzer.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAE/C,OAAO,EAAE,8BAA8B,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAQzF,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAGL,mBAAmB,EAEpB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,yBAAyB,EAAE,mBAAmB,EAAkB,MAAM,SAAS,CAAC;AAkBzF,qBAAa,aAAc,SAAQ,YAAY,CAAC,mBAAmB,CAAC;IAClE,OAAO,CAAC,MAAM,CAAsB;IAEpC,OAAO,CAAC,0BAA0B,CAAkC;IAEpE,OAAO,CAAC,wBAAwB,CAAC,CAAmB;IAEpD,OAAO,CAAC,kBAAkB,CAAC,CAA4B;IAEvD,OAAO,CAAC,aAAa,CAAC,CAAgC;IAEtD,OAAO,CAAC,WAAW,CAAC,CAAgC;IAEpD,OAAO,CAAC,YAAY,CAAK;IAEzB,OAAO,CAAC,qBAAqB,CAAwB;IAErD,OAAO,CAAC,eAAe,CAAqE;IAE5F,OAAO,CAAC,YAAY,CAAS;IAE7B,OAAO,CAAC,yCAAyC,CAAwC;IAEzF,OAAO,CAAC,2CAA2C,CAAwC;IAE3F,OAAO,CAAC,0CAA0C,CAAyC;IAE3F,OAAO,CAAC,4CAA4C,CAAyC;IAE7F,OAAO,CAAC,yCAAyC,CAAwC;IAEzF,OAAO,CAAC,2CAA2C,CAAwC;IAE3F,OAAO,CAAC,0CAA0C,CAAyC;IAE3F,OAAO,CAAC,4CAA4C,CAAyC;IAG7F,OAAO,CAAC,gBAAgB,CAItB;gBAUU,EACV,MAAM,EACN,qBAAqB,EACrB,aAAqB,GACtB,EAAE;QACD,MAAM,EAAE,mBAAmB,CAAC;QAC5B,qBAAqB,EAAE,qBAAqB,CAAC;QAC7C,aAAa,CAAC,EAAE,OAAO,CAAC;KACzB;IA6CD,OAAO,KAAK,QAAQ,GAWnB;IAeM,iBAAiB,IAAI,MAAM,GAAG,SAAS;IAqEvC,cAAc,IAAI,MAAM,GAAG,SAAS;IA0B3C,IAAI,+BAA+B,IAAI,MAAM,GAAG,SAAS,CAQxD;IAQD,OAAO,KAAK,eAAe,GAY1B;IASD,OAAO,KAAK,aAAa,GAmBxB;IAOM,iBAAiB,CAAC,MAAM,EAAE,OAAO,CAAC,yBAAyB,CAAC;IAsBnE,OAAO,CAAC,WAAW;IAuFN,aAAa,CACxB,eAAe,EAAE,8BAA8B,GAAG,mBAAmB;IA6B1D,YAAY;IAkCzB,OAAO,CAAC,mBAAmB,CAkDzB;YAKY,iBAAiB;IAqE/B,OAAO,CAAC,YAAY;CAscrB"}
1
+ {"version":3,"file":"StatsAnalyzer.d.ts","sourceRoot":"","sources":["../../../src/StatsAnalyzer/StatsAnalyzer.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAE/C,OAAO,EAAE,8BAA8B,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAQzF,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAGL,mBAAmB,EAEpB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,yBAAyB,EAAE,mBAAmB,EAAkB,MAAM,SAAS,CAAC;AAczF,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAK9C,qBAAa,aAAc,SAAQ,YAAY,CAAC,mBAAmB,CAAC;IAClE,OAAO,CAAC,MAAM,CAAsB;IAEpC,OAAO,CAAC,0BAA0B,CAAkC;IAEpE,OAAO,CAAC,wBAAwB,CAAC,CAAmB;IAEpD,OAAO,CAAC,kBAAkB,CAAC,CAA4B;IAEvD,OAAO,CAAC,aAAa,CAAC,CAAgC;IAEtD,OAAO,CAAC,WAAW,CAAC,CAAgC;IAEpD,OAAO,CAAC,YAAY,CAAK;IAEzB,OAAO,CAAC,qBAAqB,CAAwB;IAErD,OAAO,CAAC,YAAY,CAAe;IAEnC,OAAO,CAAC,eAAe,CAAqE;IAE5F,OAAO,CAAC,YAAY,CAAS;IAE7B,OAAO,CAAC,yCAAyC,CAAwC;IAEzF,OAAO,CAAC,2CAA2C,CAAwC;IAE3F,OAAO,CAAC,0CAA0C,CAAyC;IAE3F,OAAO,CAAC,4CAA4C,CAAyC;IAE7F,OAAO,CAAC,yCAAyC,CAAwC;IAEzF,OAAO,CAAC,2CAA2C,CAAwC;IAE3F,OAAO,CAAC,0CAA0C,CAAyC;IAE3F,OAAO,CAAC,4CAA4C,CAAyC;IAG7F,OAAO,CAAC,gBAAgB,CAItB;gBAUU,EACV,MAAM,EACN,qBAAqB,EACrB,YAAY,EACZ,aAAqB,GACtB,EAAE;QACD,MAAM,EAAE,mBAAmB,CAAC;QAC5B,qBAAqB,EAAE,qBAAqB,CAAC;QAC7C,YAAY,EAAE,YAAY,CAAC;QAC3B,aAAa,CAAC,EAAE,OAAO,CAAC;KACzB;IA8CD,OAAO,KAAK,QAAQ,GAWnB;IAeM,iBAAiB,IAAI,MAAM,GAAG,SAAS;IAqEvC,cAAc,IAAI,MAAM,GAAG,SAAS;IA0B3C,IAAI,+BAA+B,IAAI,MAAM,GAAG,SAAS,CAQxD;IAQD,OAAO,KAAK,eAAe,GAY1B;IASD,OAAO,KAAK,aAAa,GAmBxB;IAOM,iBAAiB,CAAC,MAAM,EAAE,OAAO,CAAC,yBAAyB,CAAC;IAsBnE,OAAO,CAAC,WAAW;IAuFN,aAAa,CACxB,eAAe,EAAE,8BAA8B,GAAG,mBAAmB;IA6B1D,YAAY;IAkCzB,OAAO,CAAC,mBAAmB,CAkDzB;YAKY,iBAAiB;IAiE/B,OAAO,CAAC,YAAY;CA6LrB"}
@@ -0,0 +1,13 @@
1
+ import { StatsMap } from './types';
2
+ import { StatsMonitorEvents } from './eventTypes';
3
+ import { EventEmitter } from '../EventEmitter';
4
+ export declare class StatsMonitor extends EventEmitter<StatsMonitorEvents> {
5
+ private hasAudioDecodeIssue;
6
+ checkInboundAudio(previous: StatsMap, current: StatsMap): void;
7
+ checkOutboundAudio(previous: StatsMap, current: StatsMap): void;
8
+ checkInboundVideo(previous: StatsMap, current: StatsMap): void;
9
+ checkOutboundVideo(previous: StatsMap, current: StatsMap): void;
10
+ checkInboundShare(previous: StatsMap, current: StatsMap): void;
11
+ checkOutboundShare(previous: StatsMap, current: StatsMap): void;
12
+ }
13
+ //# sourceMappingURL=StatsMonitor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StatsMonitor.d.ts","sourceRoot":"","sources":["../../../src/StatsAnalyzer/StatsMonitor.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EAGL,kBAAkB,EACnB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAe/C,qBAAa,YAAa,SAAQ,YAAY,CAAC,kBAAkB,CAAC;IAChE,OAAO,CAAC,mBAAmB;IAuB3B,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ;IA0DvD,kBAAkB,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ;IAwDxD,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ;IAoEvD,kBAAkB,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ;IAqCxD,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ;IAoEvD,kBAAkB,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ;CA+BzD"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=StatsMonitor.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StatsMonitor.test.d.ts","sourceRoot":"","sources":["../../../src/StatsAnalyzer/StatsMonitor.test.ts"],"names":[],"mappings":""}
@@ -40,5 +40,18 @@ interface NetworkQualityEvent {
40
40
  export interface NetworkQualityMonitorEvents extends EventMap {
41
41
  [NetworkQualityEventNames.NETWORK_QUALITY]: (event: NetworkQualityEvent) => void;
42
42
  }
43
+ export declare enum StatsMonitorEventNames {
44
+ INBOUND_AUDIO_ISSUE = "INBOUND_AUDIO_ISSUE"
45
+ }
46
+ export declare enum InboundAudioIssueSubTypes {
47
+ DECODE_RESULTS_IN_ZERO_AUDIO_LEVEL = "DECODE_RESULTS_IN_ZERO_AUDIO_LEVEL",
48
+ ALL_PACKETS_DISCARDED = "ALL_PACKETS_DISCARDED"
49
+ }
50
+ export interface InboundAudioIssueEvent {
51
+ issueSubType: InboundAudioIssueSubTypes;
52
+ }
53
+ export interface StatsMonitorEvents extends EventMap {
54
+ [StatsMonitorEventNames.INBOUND_AUDIO_ISSUE]: (event: InboundAudioIssueEvent) => void;
55
+ }
43
56
  export {};
44
57
  //# sourceMappingURL=eventTypes.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"eventTypes.d.ts","sourceRoot":"","sources":["../../../src/StatsAnalyzer/eventTypes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzC,oBAAY,uBAAuB;IACjC,aAAa,kBAAkB;IAC/B,mBAAmB,wBAAwB;IAC3C,mBAAmB,wBAAwB;IAC3C,oBAAoB,yBAAyB;IAC7C,oBAAoB,yBAAyB;CAC9C;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,WAAW,CAAC;CACnB;AAED,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,cAAc,CAAC;CAC3B;AAED,MAAM,WAAW,mBAAoB,SAAQ,QAAQ;IACnD,CAAC,uBAAuB,CAAC,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,IAAI,CAAC;IAC5E,CAAC,uBAAuB,CAAC,mBAAmB,CAAC,EAAE,CAAC,KAAK,EAAE,mBAAmB,KAAK,IAAI,CAAC;IACpF,CAAC,uBAAuB,CAAC,mBAAmB,CAAC,EAAE,CAAC,KAAK,EAAE,mBAAmB,KAAK,IAAI,CAAC;IACpF,CAAC,uBAAuB,CAAC,oBAAoB,CAAC,EAAE,CAAC,KAAK,EAAE,mBAAmB,KAAK,IAAI,CAAC;IACrF,CAAC,uBAAuB,CAAC,oBAAoB,CAAC,EAAE,CAAC,KAAK,EAAE,mBAAmB,KAAK,IAAI,CAAC;CACtF;AAED,oBAAY,8BAA8B,GAAG;IAC3C,KAAK,EAAE,uBAAuB,CAAC,mBAAmB,GAAG,uBAAuB,CAAC,mBAAmB,CAAC;IACjG,MAAM,EACF,uBAAuB,CAAC,oBAAoB,GAC5C,uBAAuB,CAAC,oBAAoB,CAAC;CAClD,CAAC;AAEF,oBAAY,0BAA0B,GAAG,OAAO,CAAC;IAC/C,KAAK,EAAE,OAAO,CAAC,8BAA8B,CAAC,CAAC;IAC/C,KAAK,EAAE,OAAO,CAAC,8BAA8B,CAAC,CAAC;IAC/C,KAAK,EAAE,OAAO,CAAC,8BAA8B,CAAC,CAAC;CAChD,CAAC,CAAC;AAEH,oBAAY,wBAAwB;IAClC,eAAe,oBAAoB;CACpC;AAED,UAAU,mBAAmB;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,mBAAmB,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,2BAA4B,SAAQ,QAAQ;IAC3D,CAAC,wBAAwB,CAAC,eAAe,CAAC,EAAE,CAAC,KAAK,EAAE,mBAAmB,KAAK,IAAI,CAAC;CAClF"}
1
+ {"version":3,"file":"eventTypes.d.ts","sourceRoot":"","sources":["../../../src/StatsAnalyzer/eventTypes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzC,oBAAY,uBAAuB;IACjC,aAAa,kBAAkB;IAC/B,mBAAmB,wBAAwB;IAC3C,mBAAmB,wBAAwB;IAC3C,oBAAoB,yBAAyB;IAC7C,oBAAoB,yBAAyB;CAC9C;AACD,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,WAAW,CAAC;CACnB;AAED,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,cAAc,CAAC;CAC3B;AAED,MAAM,WAAW,mBAAoB,SAAQ,QAAQ;IACnD,CAAC,uBAAuB,CAAC,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,IAAI,CAAC;IAC5E,CAAC,uBAAuB,CAAC,mBAAmB,CAAC,EAAE,CAAC,KAAK,EAAE,mBAAmB,KAAK,IAAI,CAAC;IACpF,CAAC,uBAAuB,CAAC,mBAAmB,CAAC,EAAE,CAAC,KAAK,EAAE,mBAAmB,KAAK,IAAI,CAAC;IACpF,CAAC,uBAAuB,CAAC,oBAAoB,CAAC,EAAE,CAAC,KAAK,EAAE,mBAAmB,KAAK,IAAI,CAAC;IACrF,CAAC,uBAAuB,CAAC,oBAAoB,CAAC,EAAE,CAAC,KAAK,EAAE,mBAAmB,KAAK,IAAI,CAAC;CACtF;AAED,oBAAY,8BAA8B,GAAG;IAC3C,KAAK,EAAE,uBAAuB,CAAC,mBAAmB,GAAG,uBAAuB,CAAC,mBAAmB,CAAC;IACjG,MAAM,EACF,uBAAuB,CAAC,oBAAoB,GAC5C,uBAAuB,CAAC,oBAAoB,CAAC;CAClD,CAAC;AAEF,oBAAY,0BAA0B,GAAG,OAAO,CAAC;IAC/C,KAAK,EAAE,OAAO,CAAC,8BAA8B,CAAC,CAAC;IAC/C,KAAK,EAAE,OAAO,CAAC,8BAA8B,CAAC,CAAC;IAC/C,KAAK,EAAE,OAAO,CAAC,8BAA8B,CAAC,CAAC;CAChD,CAAC,CAAC;AAEH,oBAAY,wBAAwB;IAClC,eAAe,oBAAoB;CACpC;AAED,UAAU,mBAAmB;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,mBAAmB,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,2BAA4B,SAAQ,QAAQ;IAC3D,CAAC,wBAAwB,CAAC,eAAe,CAAC,EAAE,CAAC,KAAK,EAAE,mBAAmB,KAAK,IAAI,CAAC;CAClF;AAED,oBAAY,sBAAsB;IAChC,mBAAmB,wBAAwB;CAC5C;AAED,oBAAY,yBAAyB;IACnC,kCAAkC,uCAAuC;IACzE,qBAAqB,0BAA0B;CAChD;AAED,MAAM,WAAW,sBAAsB;IACrC,YAAY,EAAE,yBAAyB,CAAC;CACzC;AAED,MAAM,WAAW,kBAAmB,SAAQ,QAAQ;IAClD,CAAC,sBAAsB,CAAC,mBAAmB,CAAC,EAAE,CAAC,KAAK,EAAE,sBAAsB,KAAK,IAAI,CAAC;CACvF"}
@@ -1,5 +1,6 @@
1
1
  export * from './StatsAnalyzer';
2
2
  export * from './NetworkQualityMonitor';
3
3
  export * from './eventTypes';
4
+ export * from './StatsMonitor';
4
5
  export { ActualExpectedMediaStatus } from './types';
5
6
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/StatsAnalyzer/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,yBAAyB,CAAC;AACxC,cAAc,cAAc,CAAC;AAC7B,OAAO,EAAE,yBAAyB,EAAE,MAAM,SAAS,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/StatsAnalyzer/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,yBAAyB,CAAC;AACxC,cAAc,cAAc,CAAC;AAC7B,cAAc,gBAAgB,CAAC;AAC/B,OAAO,EAAE,yBAAyB,EAAE,MAAM,SAAS,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@webex/internal-media-core",
3
- "version": "2.18.4",
3
+ "version": "2.19.0",
4
4
  "files": [
5
5
  "dist/cjs",
6
6
  "dist/esm",
@@ -60,7 +60,7 @@
60
60
  "@webex/rtcstats": "^1.5.5",
61
61
  "@webex/ts-sdp": "1.8.2",
62
62
  "@webex/web-capabilities": "^1.6.1",
63
- "@webex/web-client-media-engine": "3.33.4",
63
+ "@webex/web-client-media-engine": "3.34.0",
64
64
  "events": "^3.3.0",
65
65
  "ip-anonymize": "^0.1.0",
66
66
  "typed-emitter": "^2.1.0",