@webex/plugin-meetings 2.60.1-next.16 → 2.60.1-next.18
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/breakouts/breakout.js +1 -1
- package/dist/breakouts/index.js +1 -1
- package/dist/constants.d.ts +1 -0
- package/dist/constants.js +1 -0
- package/dist/constants.js.map +1 -1
- package/dist/interpretation/index.js +1 -1
- package/dist/interpretation/siLanguage.js +1 -1
- package/dist/locus-info/index.js +4 -1
- package/dist/locus-info/index.js.map +1 -1
- package/dist/meeting/index.js +27 -8
- package/dist/meeting/index.js.map +1 -1
- package/dist/meetings/index.d.ts +1 -1
- package/dist/meetings/index.js +6 -20
- package/dist/meetings/index.js.map +1 -1
- package/dist/reconnection-manager/index.js +22 -26
- package/dist/reconnection-manager/index.js.map +1 -1
- package/dist/statsAnalyzer/index.d.ts +5 -1
- package/dist/statsAnalyzer/index.js +75 -88
- package/dist/statsAnalyzer/index.js.map +1 -1
- package/dist/webinar/index.js +1 -1
- package/package.json +22 -23
- package/src/constants.ts +1 -0
- package/src/locus-info/index.ts +4 -1
- package/src/meeting/index.ts +25 -1
- package/src/meetings/index.ts +10 -23
- package/src/reconnection-manager/index.ts +11 -13
- package/src/statsAnalyzer/index.ts +131 -153
- package/test/integration/spec/journey.js +2 -2
- package/test/integration/spec/space-meeting.js +1 -1
- package/test/unit/spec/locus-info/index.js +13 -6
- package/test/unit/spec/meeting/index.js +49 -1
- package/test/unit/spec/meetings/index.js +21 -0
- package/test/unit/spec/metrics/index.js +1 -2
- package/test/unit/spec/reconnection-manager/index.js +1 -11
- package/test/unit/spec/stats-analyzer/index.js +686 -493
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_lodash","require","_internalMediaCore","_eventsScope","_interopRequireDefault","_constants","_config","_loggerProxy","_global","_mqaUtil","_createSuper","Derived","hasNativeReflectConstruct","_isNativeReflectConstruct","_createSuperInternal","Super","_getPrototypeOf2","default","result","NewTarget","constructor","_Reflect$construct","arguments","apply","_possibleConstructorReturn2","Reflect","sham","Proxy","Boolean","prototype","valueOf","call","e","EVENTS","exports","MEDIA_QUALITY","LOCAL_MEDIA_STARTED","LOCAL_MEDIA_STOPPED","REMOTE_MEDIA_STARTED","REMOTE_MEDIA_STOPPED","emptySender","trackLabel","maxPacketLossRatio","availableBandwidth","bytesSent","meanRemoteJitter","meanRoundTripTime","emptyReceiver","bytesReceived","meanRtpJitter","StatsAnalyzer","_EventsScope","_inherits2","_super","config","_this","receiveSlotCallback","length","undefined","networkQualityMonitor","statsResults","defaultStats","_classCallCheck2","_defineProperty2","_assertThisInitialized2","mediaType","previousValue","currentValue","isLocal","Error","concat","lastEmittedStartStopEvent","lastEmittedEvent","local","remote","newEvent","emit","file","function","type","successfulCandidatePairId","candidates","newIpAddress","isEmpty","localCandidate","candidateType","address","relayProtocol","relatedAddress","localIpAddress","isSender","isRemote","_this$successfulCandi","id","successfulCandidatePair","localCandidateId","transport","toUpperCase","protocol","sendRecvType","STATS","SEND_DIRECTION","RECEIVE_DIRECTION","ipType","REMOTE","LOCAL","ipAddress","ip","relatedPort","portNumber","port","networkType","priority","timestamp","time","connectionType","NETWORK_TYPE","VPN","UNKNOWN","totalRoundTripTime","statsStarted","lastStatsResults","correlationId","mqaSentCount","lastMqaDataSent","_createClass2","key","value","resetStatsResults","_this2","_keys","forEach","includes","recv","send","updateMediaStatus","status","meetingMediaStatus","sendMqaData","_this3","newMqa","cloneDeep","emptyMqaInterval","audioSender","emptyAudioTransmit","audioShareSender","audioReceiver","emptyAudioReceive","audioShareReceiver","videoSender","emptyVideoTransmit","videoShareSender","videoReceiver","emptyVideoReceive","videoShareReceiver","getAudioSenderMqa","baseMediaType","audioTransmit","push","getAudioReceiverMqa","audioReceive","getVideoSenderMqa","videoTransmit","getVideoReceiverMqa","videoReceive","audioSenderStream","emptyAudioTransmitStream","getAudioSenderStreamMqa","streams","audioReceiverStream","emptyAudioReceiveStream","getAudioReceiverStreamMqa","videoSenderStream","emptyVideoTransmitStream","getVideoSenderStreamMqa","videoReceiverStream","emptyVideoReceiveStream","getVideoReceiverStreamMqa","intervalMetadata","peerReflexiveIP","peripherals","information","_UNKNOWN_","name","MEDIA_DEVICES","SPEAKER","MICROPHONE","CAMERA","intervalNumber","data","updateMediaConnection","mediaConnection","getLocalIpAddress","startAnalyzer","_this4","getStatsAndParse","then","statsInterval","setInterval","analyzerInterval","mqaInterval","MQA_INTERVAL","_promise","resolve","stopAnalyzer","_this5","sendOneLastMqa","clearInterval","parseGetStatsResult","getStatsResult","processOutboundRTPResult","processInboundRTPResult","compareSentAndReceived","parseCandidate","parseAudioSource","filterAndParseGetStatsResults","statsItem","_this6","types","DEFAULT_GET_STATS_FILTER","report","state","_this$successfulCandi2","_this$statsResults","direction","currentDirection","localTrackLabel","csi","extractAndSetLocalIpAddressInfoForDiagnostics","audioLevel","totalAudioEnergy","compareLastStatsResult","_this7","getCurrentStatsTotals","keyPrefix","filter","startsWith","reduce","prev","cur","_this7$statsResults$c","getPreviousStatsTotals","_this7$lastStatsResul","expected","sendAudio","currentStats","previousStats","totalPacketsSent","LoggerProxy","logger","info","emitStartStopEvents","receiveAudio","currentPacketsReceived","previousPacketsReceived","currentSamplesReceived","previousSamplesReceived","sendVideo","framesEncoded","framesSent","receiveVideo","currentFramesReceived","previousFramesReceived","currentFramesDecoded","previousFramesDecoded","currentFramesDropped","previousFramesDropped","sendShare","_this8","getConnectionState","ConnectionState","Failed","trace","getTransceiverStats","transceiverStats","video","receivers","receiver","i","audio","screenShareVideo","screenShareAudio","senders","sender","JSON","parse","_stringify","sendrecvType","kilobytes","frameWidth","frameHeight","width","height","hugeFramesSent","toFixed","keyFramesEncoded","packetsSent","totalKeyFramesEncoded","totalNackCount","nackCount","totalPliCount","pliCount","totalFirCount","firCount","encoderImplementation","qualityLimitationReason","qualityLimitationResolutionChanges","retransmittedPacketsSent","totalBytesSent","headerBytesSent","retransmittedBytesSent","receiveSlot","ssrc","sourceState","idAndCsi","framesReceived","bytes","totalBytesReceived","currentPacketsLost","packetsLost","totalPacketsLost","packetsReceived","totalPacketsReceived","currentPacketLossRatio","lastPacketReceivedTimestamp","framesDecoded","keyFramesDecoded","decoderImplementation","fecPacketsDiscarded","fecPacketsReceived","headerBytesReceived","jitter","totalSamplesReceived","totalSamplesDecoded","concealedSamples","currentPacketLoss","totalPacketsLostOnReceiver","packetsLostOnReceiver","roundTripTime","reportsReceived","overAllPacketLossRatio","determineUplinkNetworkQuality","remoteRtpResults","statsAnalyzerCurrentStats","EventsScope"],"sources":["index.ts"],"sourcesContent":["/* eslint-disable prefer-destructuring */\n\nimport {cloneDeep, isEmpty} from 'lodash';\nimport {ConnectionState} from '@webex/internal-media-core';\n\nimport EventsScope from '../common/events/events-scope';\nimport {\n DEFAULT_GET_STATS_FILTER,\n STATS,\n MQA_INTERVAL,\n NETWORK_TYPE,\n MEDIA_DEVICES,\n _UNKNOWN_,\n} from '../constants';\nimport {\n emptyAudioReceive,\n emptyAudioTransmit,\n emptyMqaInterval,\n emptyVideoReceive,\n emptyVideoTransmit,\n emptyAudioReceiveStream,\n emptyAudioTransmitStream,\n emptyVideoReceiveStream,\n emptyVideoTransmitStream,\n} from '../mediaQualityMetrics/config';\nimport LoggerProxy from '../common/logs/logger-proxy';\n\nimport defaultStats from './global';\nimport {\n getAudioSenderMqa,\n getAudioReceiverMqa,\n getVideoSenderMqa,\n getVideoReceiverMqa,\n getAudioSenderStreamMqa,\n getAudioReceiverStreamMqa,\n getVideoSenderStreamMqa,\n getVideoReceiverStreamMqa,\n} from './mqaUtil';\nimport {ReceiveSlot} from '../multistream/receiveSlot';\n\nexport const EVENTS = {\n MEDIA_QUALITY: 'MEDIA_QUALITY',\n LOCAL_MEDIA_STARTED: 'LOCAL_MEDIA_STARTED',\n LOCAL_MEDIA_STOPPED: 'LOCAL_MEDIA_STOPPED',\n REMOTE_MEDIA_STARTED: 'REMOTE_MEDIA_STARTED',\n REMOTE_MEDIA_STOPPED: 'REMOTE_MEDIA_STOPPED',\n};\n\nconst emptySender = {\n trackLabel: '',\n maxPacketLossRatio: 0,\n availableBandwidth: 0,\n bytesSent: 0,\n meanRemoteJitter: [],\n meanRoundTripTime: [],\n};\n\nconst emptyReceiver = {\n availableBandwidth: 0,\n bytesReceived: 0,\n meanRtpJitter: [],\n meanRoundTripTime: [],\n};\n\ntype ReceiveSlotCallback = (csi: number) => ReceiveSlot | undefined;\n\n/**\n * Stats Analyzer class that will emit events based on detected quality\n *\n * @export\n * @class StatsAnalyzer\n * @extends {EventsScope}\n */\nexport class StatsAnalyzer extends EventsScope {\n config: any;\n correlationId: any;\n lastEmittedStartStopEvent: any;\n lastMqaDataSent: any;\n lastStatsResults: any;\n meetingMediaStatus: any;\n mqaInterval: NodeJS.Timeout;\n mqaSentCount: any;\n networkQualityMonitor: any;\n mediaConnection: any;\n statsInterval: NodeJS.Timeout;\n statsResults: any;\n statsStarted: any;\n successfulCandidatePair: any;\n localIpAddress: string; // Returns the local IP address for diagnostics. this is the local IP of the interface used for the current media connection a host can have many local Ip Addresses\n receiveSlotCallback: ReceiveSlotCallback;\n\n /**\n * Creates a new instance of StatsAnalyzer\n * @constructor\n * @public\n * @param {Object} config SDK Configuration Object\n * @param {Function} receiveSlotCallback Callback used to access receive slots.\n * @param {Object} networkQualityMonitor class for assessing network characteristics (jitter, packetLoss, latency)\n * @param {Object} statsResults Default properties for stats\n */\n constructor(\n config: any,\n receiveSlotCallback: ReceiveSlotCallback = () => undefined,\n networkQualityMonitor: object = {},\n statsResults: object = defaultStats\n ) {\n super();\n this.statsStarted = false;\n this.statsResults = statsResults;\n this.lastStatsResults = null;\n this.config = config;\n this.networkQualityMonitor = networkQualityMonitor;\n this.correlationId = config.correlationId;\n this.mqaSentCount = -1;\n this.lastMqaDataSent = {};\n this.lastEmittedStartStopEvent = {};\n this.receiveSlotCallback = receiveSlotCallback;\n this.successfulCandidatePair = {};\n this.localIpAddress = '';\n }\n\n /**\n * Resets cumulative stats arrays.\n *\n * @public\n * @memberof StatsAnalyzer\n * @returns {void}\n */\n resetStatsResults() {\n Object.keys(this.statsResults).forEach((mediaType) => {\n if (mediaType.includes('recv')) {\n this.statsResults[mediaType].recv.meanRtpJitter = [];\n }\n\n if (mediaType.includes('send')) {\n this.statsResults[mediaType].send.meanRemoteJitter = [];\n this.statsResults[mediaType].send.meanRoundTripTime = [];\n }\n });\n }\n\n /**\n * sets mediaStatus status for analyzing metrics\n *\n * @public\n * @param {Object} status for the audio and video\n * @memberof StatsAnalyzer\n * @returns {void}\n */\n public updateMediaStatus(status: object) {\n this.meetingMediaStatus = status;\n }\n\n /**\n * captures MQA data from media connection\n *\n * @public\n * @memberof StatsAnalyzer\n * @returns {void}\n */\n sendMqaData() {\n const newMqa = cloneDeep(emptyMqaInterval);\n\n // Fill in empty stats items for lastMqaDataSent\n Object.keys(this.statsResults).forEach((mediaType) => {\n if (!this.lastMqaDataSent[mediaType]) {\n this.lastMqaDataSent[mediaType] = {};\n }\n\n if (!this.lastMqaDataSent[mediaType].send && mediaType.includes('-send')) {\n this.lastMqaDataSent[mediaType].send = {};\n }\n\n if (!this.lastMqaDataSent[mediaType].recv && mediaType.includes('-recv')) {\n this.lastMqaDataSent[mediaType].recv = {};\n }\n });\n\n // Create stats the first level, totals for senders and receivers\n const audioSender = cloneDeep(emptyAudioTransmit);\n const audioShareSender = cloneDeep(emptyAudioTransmit);\n const audioReceiver = cloneDeep(emptyAudioReceive);\n const audioShareReceiver = cloneDeep(emptyAudioReceive);\n const videoSender = cloneDeep(emptyVideoTransmit);\n const videoShareSender = cloneDeep(emptyVideoTransmit);\n const videoReceiver = cloneDeep(emptyVideoReceive);\n const videoShareReceiver = cloneDeep(emptyVideoReceive);\n\n getAudioSenderMqa({\n audioSender,\n statsResults: this.statsResults,\n lastMqaDataSent: this.lastMqaDataSent,\n baseMediaType: 'audio-send',\n });\n newMqa.audioTransmit.push(audioSender);\n\n getAudioSenderMqa({\n audioSender: audioShareSender,\n statsResults: this.statsResults,\n lastMqaDataSent: this.lastMqaDataSent,\n baseMediaType: 'audio-share-send',\n });\n newMqa.audioTransmit.push(audioShareSender);\n\n getAudioReceiverMqa({\n audioReceiver,\n statsResults: this.statsResults,\n lastMqaDataSent: this.lastMqaDataSent,\n baseMediaType: 'audio-recv',\n });\n newMqa.audioReceive.push(audioReceiver);\n\n getAudioReceiverMqa({\n audioReceiver: audioShareReceiver,\n statsResults: this.statsResults,\n lastMqaDataSent: this.lastMqaDataSent,\n baseMediaType: 'audio-share-recv',\n });\n newMqa.audioReceive.push(audioShareReceiver);\n\n getVideoSenderMqa({\n videoSender,\n statsResults: this.statsResults,\n lastMqaDataSent: this.lastMqaDataSent,\n baseMediaType: 'video-send',\n });\n newMqa.videoTransmit.push(videoSender);\n\n getVideoSenderMqa({\n videoSender: videoShareSender,\n statsResults: this.statsResults,\n lastMqaDataSent: this.lastMqaDataSent,\n baseMediaType: 'video-share-send',\n });\n newMqa.videoTransmit.push(videoShareSender);\n\n getVideoReceiverMqa({\n videoReceiver,\n statsResults: this.statsResults,\n lastMqaDataSent: this.lastMqaDataSent,\n baseMediaType: 'video-recv',\n });\n newMqa.videoReceive.push(videoReceiver);\n\n getVideoReceiverMqa({\n videoReceiver: videoShareReceiver,\n statsResults: this.statsResults,\n lastMqaDataSent: this.lastMqaDataSent,\n baseMediaType: 'video-share-recv',\n });\n newMqa.videoReceive.push(videoShareReceiver);\n\n // Add stats for individual streams\n Object.keys(this.statsResults).forEach((mediaType) => {\n if (mediaType.includes('audio-send')) {\n const audioSenderStream = cloneDeep(emptyAudioTransmitStream);\n\n getAudioSenderStreamMqa({\n audioSenderStream,\n statsResults: this.statsResults,\n lastMqaDataSent: this.lastMqaDataSent,\n mediaType,\n });\n newMqa.audioTransmit[0].streams.push(audioSenderStream);\n\n this.lastMqaDataSent[mediaType].send = cloneDeep(this.statsResults[mediaType].send);\n } else if (mediaType.includes('audio-share-send')) {\n const audioSenderStream = cloneDeep(emptyAudioTransmitStream);\n\n getAudioSenderStreamMqa({\n audioSenderStream,\n statsResults: this.statsResults,\n lastMqaDataSent: this.lastMqaDataSent,\n mediaType,\n });\n newMqa.audioTransmit[1].streams.push(audioSenderStream);\n\n this.lastMqaDataSent[mediaType].send = cloneDeep(this.statsResults[mediaType].send);\n } else if (mediaType.includes('audio-recv')) {\n const audioReceiverStream = cloneDeep(emptyAudioReceiveStream);\n\n getAudioReceiverStreamMqa({\n audioReceiverStream,\n statsResults: this.statsResults,\n lastMqaDataSent: this.lastMqaDataSent,\n mediaType,\n });\n newMqa.audioReceive[0].streams.push(audioReceiverStream);\n\n this.lastMqaDataSent[mediaType].recv = cloneDeep(this.statsResults[mediaType].recv);\n } else if (mediaType.includes('audio-share-recv')) {\n const audioReceiverStream = cloneDeep(emptyAudioReceiveStream);\n\n getAudioReceiverStreamMqa({\n audioReceiverStream,\n statsResults: this.statsResults,\n lastMqaDataSent: this.lastMqaDataSent,\n mediaType,\n });\n newMqa.audioReceive[1].streams.push(audioReceiverStream);\n\n this.lastMqaDataSent[mediaType].recv = cloneDeep(this.statsResults[mediaType].recv);\n } else if (mediaType.includes('video-send')) {\n const videoSenderStream = cloneDeep(emptyVideoTransmitStream);\n\n getVideoSenderStreamMqa({\n videoSenderStream,\n statsResults: this.statsResults,\n lastMqaDataSent: this.lastMqaDataSent,\n mediaType,\n });\n newMqa.videoTransmit[0].streams.push(videoSenderStream);\n\n this.lastMqaDataSent[mediaType].send = cloneDeep(this.statsResults[mediaType].send);\n } else if (mediaType.includes('video-share-send')) {\n const videoSenderStream = cloneDeep(emptyVideoTransmitStream);\n\n getVideoSenderStreamMqa({\n videoSenderStream,\n statsResults: this.statsResults,\n lastMqaDataSent: this.lastMqaDataSent,\n mediaType,\n });\n newMqa.videoTransmit[1].streams.push(videoSenderStream);\n\n this.lastMqaDataSent[mediaType].send = cloneDeep(this.statsResults[mediaType].send);\n } else if (mediaType.includes('video-recv')) {\n const videoReceiverStream = cloneDeep(emptyVideoReceiveStream);\n\n getVideoReceiverStreamMqa({\n videoReceiverStream,\n statsResults: this.statsResults,\n lastMqaDataSent: this.lastMqaDataSent,\n mediaType,\n });\n newMqa.videoReceive[0].streams.push(videoReceiverStream);\n\n this.lastMqaDataSent[mediaType].recv = cloneDeep(this.statsResults[mediaType].recv);\n } else if (mediaType.includes('video-share-recv')) {\n const videoReceiverStream = cloneDeep(emptyVideoReceiveStream);\n\n getVideoReceiverStreamMqa({\n videoReceiverStream,\n statsResults: this.statsResults,\n lastMqaDataSent: this.lastMqaDataSent,\n mediaType,\n });\n newMqa.videoReceive[1].streams.push(videoReceiverStream);\n\n this.lastMqaDataSent[mediaType].recv = cloneDeep(this.statsResults[mediaType].recv);\n }\n });\n\n newMqa.intervalMetadata.peerReflexiveIP = this.statsResults.connectionType.local.ipAddress;\n\n // Adding peripheral information\n newMqa.intervalMetadata.peripherals.push({information: _UNKNOWN_, name: MEDIA_DEVICES.SPEAKER});\n if (this.statsResults['audio-send']) {\n newMqa.intervalMetadata.peripherals.push({\n information: this.statsResults['audio-send'].trackLabel || _UNKNOWN_,\n name: MEDIA_DEVICES.MICROPHONE,\n });\n }\n if (this.statsResults['video-send']) {\n newMqa.intervalMetadata.peripherals.push({\n information: this.statsResults['video-send'].trackLabel || _UNKNOWN_,\n name: MEDIA_DEVICES.CAMERA,\n });\n }\n\n newMqa.networkType = this.statsResults.connectionType.local.networkType;\n\n this.mqaSentCount += 1;\n\n newMqa.intervalNumber = this.mqaSentCount;\n\n this.resetStatsResults();\n\n this.emit(\n {\n file: 'statsAnalyzer',\n function: 'sendMqaData',\n },\n EVENTS.MEDIA_QUALITY,\n {\n data: newMqa,\n // @ts-ignore\n networkType: newMqa.networkType,\n }\n );\n }\n\n /**\n * updated the media connection when changed\n *\n * @private\n * @memberof StatsAnalyzer\n * @param {RoapMediaConnection} mediaConnection\n * @returns {void}\n */\n updateMediaConnection(mediaConnection: any) {\n this.mediaConnection = mediaConnection;\n }\n\n /**\n * Returns the local IP address for diagnostics.\n * this is the local IP of the interface used for the current media connection\n * a host can have many local Ip Addresses\n * @returns {string | undefined} The local IP address.\n */\n getLocalIpAddress(): string {\n return this.localIpAddress;\n }\n\n /**\n * Starts the stats analyzer on interval\n *\n * @public\n * @memberof StatsAnalyzer\n * @param {RoapMediaConnection} mediaConnection\n * @returns {Promise}\n */\n public startAnalyzer(mediaConnection: any) {\n if (!this.statsStarted) {\n this.statsStarted = true;\n this.mediaConnection = mediaConnection;\n\n return this.getStatsAndParse().then(() => {\n this.statsInterval = setInterval(() => {\n this.getStatsAndParse();\n }, this.config.analyzerInterval);\n // Trigger initial fetch\n this.sendMqaData();\n this.mqaInterval = setInterval(() => {\n this.sendMqaData();\n }, MQA_INTERVAL);\n });\n }\n\n return Promise.resolve();\n }\n\n /**\n * Cleans up the analyzer when done\n *\n * @public\n * @memberof StatsAnalyzer\n * @returns {void}\n */\n public stopAnalyzer() {\n const sendOneLastMqa = this.mqaInterval && this.statsInterval;\n\n if (this.statsInterval) {\n clearInterval(this.statsInterval);\n this.statsInterval = undefined;\n }\n\n if (this.mqaInterval) {\n clearInterval(this.mqaInterval);\n this.mqaInterval = undefined;\n }\n\n if (sendOneLastMqa) {\n return this.getStatsAndParse().then(() => {\n this.sendMqaData();\n this.mediaConnection = null;\n });\n }\n\n return Promise.resolve();\n }\n\n /**\n * Parse a single result of get stats\n *\n * @private\n * @param {*} getStatsResult\n * @param {String} type\n * @param {boolean} isSender\n * @returns {void}\n * @memberof StatsAnalyzer\n */\n private parseGetStatsResult(getStatsResult: any, type: string, isSender: boolean) {\n if (!getStatsResult) {\n return;\n }\n\n // Generate empty stats results\n if (!this.statsResults[type]) {\n this.statsResults[type] = {};\n }\n\n if (isSender && !this.statsResults[type].send) {\n this.statsResults[type].send = cloneDeep(emptySender);\n } else if (!isSender && !this.statsResults[type].recv) {\n this.statsResults[type].recv = cloneDeep(emptyReceiver);\n }\n\n switch (getStatsResult.type) {\n case 'outbound-rtp':\n this.processOutboundRTPResult(getStatsResult, type);\n break;\n case 'inbound-rtp':\n this.processInboundRTPResult(getStatsResult, type);\n break;\n case 'remote-inbound-rtp':\n case 'remote-outbound-rtp':\n this.compareSentAndReceived(getStatsResult, type);\n break;\n case 'remotecandidate':\n case 'remote-candidate':\n this.parseCandidate(getStatsResult, type, isSender, true);\n break;\n case 'local-candidate':\n this.parseCandidate(getStatsResult, type, isSender, false);\n break;\n case 'media-source':\n this.parseAudioSource(getStatsResult, type);\n break;\n default:\n break;\n }\n }\n\n /**\n * Filters the get stats results for types\n * @private\n * @param {Array} statsItem\n * @param {String} type\n * @param {boolean} isSender\n * @returns {void}\n */\n filterAndParseGetStatsResults(statsItem: any, type: string, isSender: boolean) {\n const {types} = DEFAULT_GET_STATS_FILTER;\n\n // get the successful candidate pair before parsing stats.\n statsItem.report.forEach((report) => {\n if (report.type === 'candidate-pair' && report.state === 'succeeded') {\n this.successfulCandidatePair = report;\n }\n });\n\n statsItem.report.forEach((result) => {\n if (types.includes(result.type)) {\n this.parseGetStatsResult(result, type, isSender);\n }\n });\n\n if (this.statsResults[type]) {\n this.statsResults[type].direction = statsItem.currentDirection;\n this.statsResults[type].trackLabel = statsItem.localTrackLabel;\n this.statsResults[type].csi = statsItem.csi;\n this.extractAndSetLocalIpAddressInfoForDiagnostics(\n this.successfulCandidatePair?.localCandidateId,\n this.statsResults?.candidates\n );\n // reset the successful candidate pair.\n this.successfulCandidatePair = {};\n }\n }\n\n /**\n * parse the audio\n * @param {String} result\n * @param {boolean} type\n * @returns {void}\n */\n parseAudioSource(result: any, type: any) {\n if (!result) {\n return;\n }\n\n if (type.includes('audio-send')) {\n this.statsResults[type].send.audioLevel = result.audioLevel;\n this.statsResults[type].send.totalAudioEnergy = result.totalAudioEnergy;\n }\n }\n\n /**\n * emits started/stopped events for local/remote media by checking\n * if given values are increasing or not. The previousValue, currentValue\n * params can be any numerical value like number of receive packets or\n * decoded frames, etc.\n *\n * @private\n * @param {string} mediaType\n * @param {number} previousValue - value to compare\n * @param {number} currentValue - value to compare (must be same type of value as previousValue)\n * @param {boolean} isLocal - true if stats are for local media being sent out, false for remote media being received\n * @memberof StatsAnalyzer\n * @returns {void}\n */\n emitStartStopEvents = (\n mediaType: string,\n previousValue: number,\n currentValue: number,\n isLocal: boolean\n ) => {\n if (mediaType !== 'audio' && mediaType !== 'video' && mediaType !== 'share') {\n throw new Error(`Unsupported mediaType: ${mediaType}`);\n }\n\n // eslint-disable-next-line no-param-reassign\n if (previousValue === undefined) previousValue = 0;\n // eslint-disable-next-line no-param-reassign\n if (currentValue === undefined) currentValue = 0;\n\n if (!this.lastEmittedStartStopEvent[mediaType]) {\n this.lastEmittedStartStopEvent[mediaType] = {};\n }\n\n const lastEmittedEvent = isLocal\n ? this.lastEmittedStartStopEvent[mediaType].local\n : this.lastEmittedStartStopEvent[mediaType].remote;\n\n let newEvent;\n\n if (currentValue - previousValue > 0) {\n newEvent = isLocal ? EVENTS.LOCAL_MEDIA_STARTED : EVENTS.REMOTE_MEDIA_STARTED;\n } else if (currentValue === previousValue && currentValue > 0) {\n newEvent = isLocal ? EVENTS.LOCAL_MEDIA_STOPPED : EVENTS.REMOTE_MEDIA_STOPPED;\n }\n\n if (newEvent && lastEmittedEvent !== newEvent) {\n if (isLocal) {\n this.lastEmittedStartStopEvent[mediaType].local = newEvent;\n } else {\n this.lastEmittedStartStopEvent[mediaType].remote = newEvent;\n }\n this.emit(\n {\n file: 'statsAnalyzer/index',\n function: 'compareLastStatsResult',\n },\n newEvent,\n {\n type: mediaType,\n }\n );\n }\n };\n\n /**\n * compares current and previous stats to check if packets are not sent\n *\n * @private\n * @memberof StatsAnalyzer\n * @returns {void}\n */\n private compareLastStatsResult() {\n if (this.lastStatsResults !== null && this.meetingMediaStatus) {\n const getCurrentStatsTotals = (keyPrefix: string, value: string): number =>\n Object.keys(this.statsResults)\n .filter((key) => key.startsWith(keyPrefix))\n .reduce((prev, cur) => prev + (this.statsResults[cur]?.recv[value] || 0), 0);\n\n const getPreviousStatsTotals = (keyPrefix: string, value: string): number =>\n Object.keys(this.statsResults)\n .filter((key) => key.startsWith(keyPrefix))\n .reduce((prev, cur) => prev + (this.lastStatsResults[cur]?.recv[value] || 0), 0);\n\n if (this.meetingMediaStatus.expected.sendAudio && this.lastStatsResults['audio-send']) {\n // compare audio stats sent\n // NOTE: relies on there being only one sender.\n const currentStats = this.statsResults['audio-send'].send;\n const previousStats = this.lastStatsResults['audio-send'].send;\n\n if (\n currentStats.totalPacketsSent === previousStats.totalPacketsSent ||\n currentStats.totalPacketsSent === 0\n ) {\n LoggerProxy.logger.info(\n `StatsAnalyzer:index#compareLastStatsResult --> No audio RTP packets sent`,\n currentStats.totalPacketsSent\n );\n } else {\n if (\n currentStats.totalAudioEnergy === previousStats.totalAudioEnergy ||\n currentStats.totalAudioEnergy === 0\n ) {\n LoggerProxy.logger.info(\n `StatsAnalyzer:index#compareLastStatsResult --> No audio Energy present`,\n currentStats.totalAudioEnergy\n );\n }\n\n if (currentStats.audioLevel === 0) {\n LoggerProxy.logger.info(\n `StatsAnalyzer:index#compareLastStatsResult --> audio level is 0 for the user`\n );\n }\n }\n\n this.emitStartStopEvents(\n 'audio',\n previousStats.totalPacketsSent,\n currentStats.totalPacketsSent,\n true\n );\n }\n\n if (this.meetingMediaStatus.expected.receiveAudio) {\n // compare audio stats received\n const currentPacketsReceived = getCurrentStatsTotals('audio-recv', 'totalPacketsReceived');\n const previousPacketsReceived = getPreviousStatsTotals(\n 'audio-recv',\n 'totalPacketsReceived'\n );\n const currentSamplesReceived = getCurrentStatsTotals('audio-recv', 'totalSamplesReceived');\n const previousSamplesReceived = getPreviousStatsTotals(\n 'audio-recv',\n 'totalSamplesReceived'\n );\n\n if (currentPacketsReceived === previousPacketsReceived || currentPacketsReceived === 0) {\n LoggerProxy.logger.info(\n `StatsAnalyzer:index#compareLastStatsResult --> No audio RTP packets received`,\n currentPacketsReceived\n );\n } else if (\n currentSamplesReceived === previousSamplesReceived ||\n currentSamplesReceived === 0\n ) {\n LoggerProxy.logger.info(\n `StatsAnalyzer:index#compareLastStatsResult --> No audio samples received`,\n currentSamplesReceived\n );\n }\n\n this.emitStartStopEvents('audio', previousPacketsReceived, currentPacketsReceived, false);\n }\n\n if (this.meetingMediaStatus.expected.sendVideo && this.lastStatsResults['video-send']) {\n // compare video stats sent\n const currentStats = this.statsResults['video-send'].send;\n const previousStats = this.lastStatsResults['video-send'].send;\n\n if (\n currentStats.totalPacketsSent === previousStats.totalPacketsSent ||\n currentStats.totalPacketsSent === 0\n ) {\n LoggerProxy.logger.info(\n `StatsAnalyzer:index#compareLastStatsResult --> No video RTP packets sent`,\n currentStats.totalPacketsSent\n );\n } else {\n if (\n currentStats.framesEncoded === previousStats.framesEncoded ||\n currentStats.framesEncoded === 0\n ) {\n LoggerProxy.logger.info(\n `StatsAnalyzer:index#compareLastStatsResult --> No video Frames Encoded`,\n currentStats.framesEncoded\n );\n }\n\n if (\n this.statsResults['video-send'].send.framesSent ===\n this.lastStatsResults['video-send'].send.framesSent ||\n this.statsResults['video-send'].send.framesSent === 0\n ) {\n LoggerProxy.logger.info(\n `StatsAnalyzer:index#compareLastStatsResult --> No video Frames sent`,\n this.statsResults['video-send'].send.framesSent\n );\n }\n }\n\n this.emitStartStopEvents('video', previousStats.framesSent, currentStats.framesSent, true);\n }\n\n if (this.meetingMediaStatus.expected.receiveVideo) {\n // compare video stats received\n const currentPacketsReceived = getCurrentStatsTotals('video-recv', 'totalPacketsReceived');\n const previousPacketsReceived = getPreviousStatsTotals(\n 'video-recv',\n 'totalPacketsReceived'\n );\n const currentFramesReceived = getCurrentStatsTotals('video-recv', 'framesReceived');\n const previousFramesReceived = getPreviousStatsTotals('video-recv', 'framesReceived');\n const currentFramesDecoded = getCurrentStatsTotals('video-recv', 'framesDecoded');\n const previousFramesDecoded = getPreviousStatsTotals('video-recv', 'framesDecoded');\n const currentFramesDropped = getCurrentStatsTotals('video-recv', 'framesDropped');\n const previousFramesDropped = getPreviousStatsTotals('video-recv', 'framesDropped');\n\n if (currentPacketsReceived === previousPacketsReceived || currentPacketsReceived === 0) {\n LoggerProxy.logger.info(\n `StatsAnalyzer:index#compareLastStatsResult --> No video RTP packets received`,\n currentPacketsReceived\n );\n } else {\n if (currentFramesReceived === previousFramesReceived || currentFramesReceived === 0) {\n LoggerProxy.logger.info(\n `StatsAnalyzer:index#compareLastStatsResult --> No video frames received`,\n currentFramesReceived\n );\n }\n\n if (currentFramesDecoded === previousFramesDecoded || currentFramesDecoded === 0) {\n LoggerProxy.logger.info(\n `StatsAnalyzer:index#compareLastStatsResult --> No video frames decoded`,\n currentFramesDecoded\n );\n }\n\n if (currentFramesDropped - previousFramesDropped > 10) {\n LoggerProxy.logger.info(\n `StatsAnalyzer:index#compareLastStatsResult --> video frames are getting dropped`,\n currentFramesDropped - previousFramesDropped\n );\n }\n }\n\n this.emitStartStopEvents('video', previousFramesDecoded, currentFramesDecoded, false);\n }\n\n if (this.meetingMediaStatus.expected.sendShare && this.lastStatsResults['video-share-send']) {\n // compare share stats sent\n\n const currentStats = this.statsResults['video-share-send'].send;\n const previousStats = this.lastStatsResults['video-share-send'].send;\n\n if (\n currentStats.totalPacketsSent === previousStats.totalPacketsSent ||\n currentStats.totalPacketsSent === 0\n ) {\n LoggerProxy.logger.info(\n `StatsAnalyzer:index#compareLastStatsResult --> No share RTP packets sent`,\n currentStats.totalPacketsSent\n );\n } else {\n if (\n currentStats.framesEncoded === previousStats.framesEncoded ||\n currentStats.framesEncoded === 0\n ) {\n LoggerProxy.logger.info(\n `StatsAnalyzer:index#compareLastStatsResult --> No share frames getting encoded`,\n currentStats.framesEncoded\n );\n }\n\n if (\n this.statsResults['video-share-send'].send.framesSent ===\n this.lastStatsResults['video-share-send'].send.framesSent ||\n this.statsResults['video-share-send'].send.framesSent === 0\n ) {\n LoggerProxy.logger.info(\n `StatsAnalyzer:index#compareLastStatsResult --> No share frames sent`,\n this.statsResults['video-share-send'].send.framesSent\n );\n }\n }\n }\n\n if (this.meetingMediaStatus.expected.sendShare) {\n // TODO:need to check receive share value\n // compare share stats received\n const currentPacketsReceived = getCurrentStatsTotals(\n 'video-share-recv',\n 'totalPacketsReceived'\n );\n const previousPacketsReceived = getPreviousStatsTotals(\n 'video-share-recv',\n 'totalPacketsReceived'\n );\n const currentFramesReceived = getCurrentStatsTotals('video-share-recv', 'framesReceived');\n const previousFramesReceived = getPreviousStatsTotals('video-share-recv', 'framesReceived');\n const currentFramesDecoded = getCurrentStatsTotals('video-share-recv', 'framesDecoded');\n const previousFramesDecoded = getPreviousStatsTotals('video-share-recv', 'framesDecoded');\n const currentFramesDropped = getCurrentStatsTotals('video-share-recv', 'framesDropped');\n const previousFramesDropped = getPreviousStatsTotals('video-share-recv', 'framesDropped');\n\n if (currentPacketsReceived === previousPacketsReceived || currentPacketsReceived === 0) {\n LoggerProxy.logger.info(\n `StatsAnalyzer:index#compareLastStatsResult --> No share RTP packets received`,\n currentPacketsReceived\n );\n } else {\n if (currentFramesReceived === previousFramesReceived || currentFramesReceived === 0) {\n LoggerProxy.logger.info(\n `StatsAnalyzer:index#compareLastStatsResult --> No share frames received`,\n currentFramesReceived\n );\n }\n\n if (currentFramesDecoded === previousFramesDecoded || currentFramesDecoded === 0) {\n LoggerProxy.logger.info(\n `StatsAnalyzer:index#compareLastStatsResult --> No share frames decoded`,\n currentFramesDecoded\n );\n }\n\n if (currentFramesDropped - previousFramesDropped > 10) {\n LoggerProxy.logger.info(\n `StatsAnalyzer:index#compareLastStatsResult --> share frames are getting dropped`,\n currentFramesDropped - previousFramesDropped\n );\n }\n }\n\n // we are not calling emitStartStopEvents() for sending or receiving share because sharing is often started and stopped\n // in meetings and this.meetingMediaStatus.expected values can be out of sync with the actual packet flow\n // so we would send \"sharing stopped\" events incorrectly\n }\n }\n }\n\n /**\n * Does a `getStats` on all the transceivers and parses the results\n *\n * @private\n * @memberof StatsAnalyzer\n * @returns {Promise}\n */\n private getStatsAndParse() {\n if (!this.mediaConnection) {\n return Promise.resolve();\n }\n\n if (\n this.mediaConnection &&\n this.mediaConnection.getConnectionState() === ConnectionState.Failed\n ) {\n LoggerProxy.logger.trace(\n 'StatsAnalyzer:index#getStatsAndParse --> media connection is in failed state'\n );\n\n return Promise.resolve();\n }\n\n LoggerProxy.logger.trace('StatsAnalyzer:index#getStatsAndParse --> Collecting Stats');\n\n return this.mediaConnection.getTransceiverStats().then((transceiverStats) => {\n transceiverStats.video.receivers.forEach((receiver, i) =>\n this.filterAndParseGetStatsResults(receiver, `video-recv-${i}`, false)\n );\n transceiverStats.audio.receivers.forEach((receiver, i) =>\n this.filterAndParseGetStatsResults(receiver, `audio-recv-${i}`, false)\n );\n transceiverStats.screenShareVideo.receivers.forEach((receiver, i) =>\n this.filterAndParseGetStatsResults(receiver, `video-share-recv-${i}`, false)\n );\n transceiverStats.screenShareAudio.receivers.forEach((receiver, i) =>\n this.filterAndParseGetStatsResults(receiver, `audio-share-recv-${i}`, false)\n );\n\n transceiverStats.video.senders.forEach((sender, i) => {\n if (i > 0) {\n throw new Error('Stats Analyzer does not support multiple senders.');\n }\n this.filterAndParseGetStatsResults(sender, 'video-send', true);\n });\n transceiverStats.audio.senders.forEach((sender, i) => {\n if (i > 0) {\n throw new Error('Stats Analyzer does not support multiple senders.');\n }\n this.filterAndParseGetStatsResults(sender, 'audio-send', true);\n });\n transceiverStats.screenShareVideo.senders.forEach((sender, i) => {\n if (i > 0) {\n throw new Error('Stats Analyzer does not support multiple senders.');\n }\n this.filterAndParseGetStatsResults(sender, 'video-share-send', true);\n });\n transceiverStats.screenShareAudio.senders.forEach((sender, i) => {\n if (i > 0) {\n throw new Error('Stats Analyzer does not support multiple senders.');\n }\n this.filterAndParseGetStatsResults(sender, 'audio-share-send', true);\n });\n\n this.compareLastStatsResult();\n\n // Save the last results to compare with the current\n // DO Deep copy, for some reason it takes the reference all the time rather then old value set\n this.lastStatsResults = JSON.parse(JSON.stringify(this.statsResults));\n\n LoggerProxy.logger.trace(\n 'StatsAnalyzer:index#getStatsAndParse --> Finished Collecting Stats'\n );\n });\n }\n\n /**\n * Processes OutboundRTP stats result and stores\n * @private\n * @param {*} result\n * @param {*} mediaType\n * @returns {void}\n */\n private processOutboundRTPResult(result: any, mediaType: any) {\n const sendrecvType = STATS.SEND_DIRECTION;\n\n if (result.bytesSent) {\n const kilobytes = 0;\n\n if (result.frameWidth && result.frameHeight) {\n this.statsResults[mediaType][sendrecvType].width = result.frameWidth;\n this.statsResults[mediaType][sendrecvType].height = result.frameHeight;\n this.statsResults[mediaType][sendrecvType].framesSent = result.framesSent;\n this.statsResults[mediaType][sendrecvType].hugeFramesSent = result.hugeFramesSent;\n }\n\n this.statsResults[mediaType][sendrecvType].availableBandwidth = kilobytes.toFixed(1);\n\n this.statsResults[mediaType][sendrecvType].framesEncoded = result.framesEncoded;\n this.statsResults[mediaType][sendrecvType].keyFramesEncoded = result.keyFramesEncoded;\n this.statsResults[mediaType][sendrecvType].packetsSent = result.packetsSent;\n\n // Data saved to send MQA metrics\n\n this.statsResults[mediaType][sendrecvType].totalKeyFramesEncoded = result.keyFramesEncoded;\n this.statsResults[mediaType][sendrecvType].totalNackCount = result.nackCount;\n this.statsResults[mediaType][sendrecvType].totalPliCount = result.pliCount;\n this.statsResults[mediaType][sendrecvType].totalPacketsSent = result.packetsSent;\n this.statsResults[mediaType][sendrecvType].totalFirCount = result.firCount;\n this.statsResults[mediaType][sendrecvType].framesSent = result.framesSent;\n this.statsResults[mediaType][sendrecvType].framesEncoded = result.framesEncoded;\n this.statsResults[mediaType][sendrecvType].encoderImplementation =\n result.encoderImplementation;\n this.statsResults[mediaType][sendrecvType].qualityLimitationReason =\n result.qualityLimitationReason;\n this.statsResults[mediaType][sendrecvType].qualityLimitationResolutionChanges =\n result.qualityLimitationResolutionChanges;\n this.statsResults[mediaType][sendrecvType].retransmittedPacketsSent =\n result.retransmittedPacketsSent;\n this.statsResults[mediaType][sendrecvType].totalBytesSent = result.bytesSent;\n this.statsResults[mediaType][sendrecvType].headerBytesSent = result.headerBytesSent;\n this.statsResults[mediaType][sendrecvType].retransmittedBytesSent =\n result.retransmittedBytesSent;\n }\n }\n\n /**\n * Processes InboundRTP stats result and stores\n * @private\n * @param {*} result\n * @param {*} mediaType\n * @returns {void}\n */\n private processInboundRTPResult(result: any, mediaType: any) {\n const sendrecvType = STATS.RECEIVE_DIRECTION;\n\n if (result.bytesReceived) {\n let kilobytes = 0;\n const receiveSlot = this.receiveSlotCallback(result.ssrc);\n const sourceState = receiveSlot?.sourceState;\n const idAndCsi = receiveSlot\n ? `id: \"${receiveSlot.id || ''}\"${receiveSlot.csi ? ` and csi: ${receiveSlot.csi}` : ''}`\n : '';\n\n if (result.frameWidth && result.frameHeight) {\n this.statsResults[mediaType][sendrecvType].width = result.frameWidth;\n this.statsResults[mediaType][sendrecvType].height = result.frameHeight;\n this.statsResults[mediaType][sendrecvType].framesReceived = result.framesReceived;\n }\n\n const bytes =\n result.bytesReceived - this.statsResults[mediaType][sendrecvType].totalBytesReceived;\n\n kilobytes = bytes / 1024;\n this.statsResults[mediaType][sendrecvType].availableBandwidth = kilobytes.toFixed(1);\n\n let currentPacketsLost =\n result.packetsLost - this.statsResults[mediaType][sendrecvType].totalPacketsLost;\n if (currentPacketsLost < 0) {\n currentPacketsLost = 0;\n }\n\n const currentPacketsReceived =\n result.packetsReceived - this.statsResults[mediaType][sendrecvType].totalPacketsReceived;\n this.statsResults[mediaType][sendrecvType].totalPacketsReceived = result.packetsReceived;\n\n if (currentPacketsReceived === 0) {\n if (receiveSlot && sourceState === 'live') {\n LoggerProxy.logger.info(\n `StatsAnalyzer:index#processInboundRTPResult --> No packets received for receive slot ${idAndCsi}. Total packets received on slot: `,\n result.packetsReceived\n );\n }\n }\n\n // Check the over all packet Lost ratio\n this.statsResults[mediaType][sendrecvType].currentPacketLossRatio =\n currentPacketsLost > 0\n ? currentPacketsLost / (currentPacketsReceived + currentPacketsLost)\n : 0;\n if (this.statsResults[mediaType][sendrecvType].currentPacketLossRatio > 3) {\n LoggerProxy.logger.info(\n `StatsAnalyzer:index#processInboundRTPResult --> Packets getting lost from the receiver with slot ${idAndCsi}`,\n this.statsResults[mediaType][sendrecvType].currentPacketLossRatio\n );\n }\n\n // TODO: check the packet loss value is negative values here\n\n if (result.packetsLost) {\n this.statsResults[mediaType][sendrecvType].totalPacketsLost =\n result.packetsLost > 0 ? result.packetsLost : -result.packetsLost;\n } else {\n this.statsResults[mediaType][sendrecvType].totalPacketsLost = 0;\n }\n\n this.statsResults[mediaType][sendrecvType].lastPacketReceivedTimestamp =\n result.lastPacketReceivedTimestamp;\n\n // From Thin\n this.statsResults[mediaType][sendrecvType].totalNackCount = result.nackCount;\n this.statsResults[mediaType][sendrecvType].totalPliCount = result.pliCount;\n this.statsResults[mediaType][sendrecvType].framesDecoded = result.framesDecoded;\n this.statsResults[mediaType][sendrecvType].keyFramesDecoded = result.keyFramesDecoded;\n\n this.statsResults[mediaType][sendrecvType].decoderImplementation =\n result.decoderImplementation;\n this.statsResults[mediaType][sendrecvType].totalPacketsReceived = result.packetsReceived;\n\n this.statsResults[mediaType][sendrecvType].fecPacketsDiscarded = result.fecPacketsDiscarded;\n this.statsResults[mediaType][sendrecvType].fecPacketsReceived = result.fecPacketsReceived;\n this.statsResults[mediaType][sendrecvType].totalBytesReceived = result.bytesReceived;\n this.statsResults[mediaType][sendrecvType].headerBytesReceived = result.headerBytesReceived;\n\n this.statsResults[mediaType][sendrecvType].meanRtpJitter.push(result.jitter);\n\n // Audio stats\n\n this.statsResults[mediaType][sendrecvType].audioLevel = result.audioLevel;\n this.statsResults[mediaType][sendrecvType].totalAudioEnergy = result.totalAudioEnergy;\n this.statsResults[mediaType][sendrecvType].totalSamplesReceived =\n result.totalSamplesReceived || 0;\n this.statsResults[mediaType][sendrecvType].totalSamplesDecoded =\n result.totalSamplesDecoded || 0;\n this.statsResults[mediaType][sendrecvType].concealedSamples = result.concealedSamples || 0;\n }\n }\n\n /**\n * extracts the local Ip address from the statsResult object by looking at stats results candidates\n * and matches that ID with the successful candidate pair. It looks at the type of local candidate it is\n * and then extracts the IP address from the relatedAddress or address property based on conditions known in webrtc\n * note, there are known incompatibilities and it is possible for this to set undefined, or for the IP address to be the public IP address\n * for example, firefox does not set the relayProtocol, and if the user is behind a NAT it might be the public IP\n * @private\n * @param {string} successfulCandidatePairId - The ID of the successful candidate pair.\n * @param {Object} candidates - the stats result candidates\n * @returns {void}\n */\n extractAndSetLocalIpAddressInfoForDiagnostics = (\n successfulCandidatePairId: string,\n candidates: {[key: string]: Record<string, unknown>}\n ) => {\n let newIpAddress = '';\n if (successfulCandidatePairId && !isEmpty(candidates)) {\n const localCandidate = candidates[successfulCandidatePairId];\n if (localCandidate) {\n if (localCandidate.candidateType === 'host') {\n // if it's a host candidate, use the address property - it will be the local IP\n newIpAddress = `${localCandidate.address}`;\n } else if (localCandidate.candidateType === 'prflx') {\n // if it's a peer reflexive candidate and we're not using a relay (there is no relayProtocol set)\n // then look at the relatedAddress - it will be the local\n //\n // Firefox doesn't populate the relayProtocol property\n if (!localCandidate.relayProtocol) {\n newIpAddress = `${localCandidate.relatedAddress}`;\n } else {\n // if it's a peer reflexive candidate and we are using a relay -\n // in that case the relatedAddress will be the IP of the TURN server (Linus),\n // so we can only look at the address, but it might be local IP or public IP,\n // depending on if the user is behind a NAT or not\n newIpAddress = `${localCandidate.address}`;\n }\n }\n }\n }\n this.localIpAddress = newIpAddress;\n };\n\n /**\n * Processes remote and local candidate result and stores\n * @private\n * @param {*} result\n * @param {*} type\n * @param {boolean} isSender\n * @param {boolean} isRemote\n *\n * @returns {void}\n */\n parseCandidate = (result: any, type: any, isSender: boolean, isRemote: boolean) => {\n if (!result || !result.id) {\n return;\n }\n\n // We only care about the successful local candidate\n if (this.successfulCandidatePair?.localCandidateId !== result.id) {\n return;\n }\n\n let transport;\n if (result.relayProtocol) {\n transport = result.relayProtocol.toUpperCase();\n } else if (result.protocol) {\n transport = result.protocol.toUpperCase();\n }\n\n const sendRecvType = isSender ? STATS.SEND_DIRECTION : STATS.RECEIVE_DIRECTION;\n const ipType = isRemote ? STATS.REMOTE : STATS.LOCAL;\n\n if (!this.statsResults.candidates) {\n this.statsResults.candidates = {};\n }\n\n this.statsResults.candidates[result.id] = {\n candidateType: result.candidateType,\n ipAddress: result.ip, // TODO: add ports\n relatedAddress: result.relatedAddress,\n relatedPort: result.relatedPort,\n relayProtocol: result.relayProtocol,\n protocol: result.protocol,\n address: result.address,\n portNumber: result.port,\n networkType: result.networkType,\n priority: result.priority,\n transport,\n timestamp: result.time,\n id: result.id,\n type: result.type,\n };\n\n this.statsResults.connectionType[ipType].candidateType = result.candidateType;\n this.statsResults.connectionType[ipType].ipAddress = result.ipAddress;\n\n this.statsResults.connectionType[ipType].networkType =\n result.networkType === NETWORK_TYPE.VPN ? NETWORK_TYPE.UNKNOWN : result.networkType;\n this.statsResults.connectionType[ipType].transport = transport;\n\n this.statsResults[type][sendRecvType].totalRoundTripTime = result.totalRoundTripTime;\n };\n\n /**\n *\n * @private\n * @param {*} result\n * @param {*} type\n * @returns {void}\n * @memberof StatsAnalyzer\n */\n compareSentAndReceived(result, type) {\n // Don't compare on transceivers without a sender.\n if (!type || !this.statsResults[type].send) {\n return;\n }\n\n const mediaType = type;\n\n const currentPacketLoss =\n result.packetsLost - this.statsResults[mediaType].send.totalPacketsLostOnReceiver;\n\n this.statsResults[mediaType].send.packetsLostOnReceiver = currentPacketLoss;\n this.statsResults[mediaType].send.totalPacketsLostOnReceiver = result.packetsLost;\n\n this.statsResults[mediaType].send.meanRemoteJitter.push(result.jitter);\n this.statsResults[mediaType].send.meanRoundTripTime.push(result.roundTripTime);\n\n this.statsResults[mediaType].send.timestamp = result.timestamp;\n this.statsResults[mediaType].send.ssrc = result.ssrc;\n this.statsResults[mediaType].send.reportsReceived = result.reportsReceived;\n\n // Total packloss ratio on this video section of the call\n this.statsResults[mediaType].send.overAllPacketLossRatio =\n this.statsResults[mediaType].send.totalPacketsLostOnReceiver > 0\n ? this.statsResults[mediaType].send.totalPacketsLostOnReceiver /\n this.statsResults[mediaType].send.totalPacketsSent\n : 0;\n this.statsResults[mediaType].send.currentPacketLossRatio =\n this.statsResults[mediaType].send.packetsLostOnReceiver > 0\n ? (this.statsResults[mediaType].send.packetsLostOnReceiver * 100) /\n (this.statsResults[mediaType].send.packetsSent +\n this.statsResults[mediaType].send.packetsLostOnReceiver)\n : 0;\n\n if (\n this.statsResults[mediaType].send.maxPacketLossRatio <\n this.statsResults[mediaType].send.currentPacketLossRatio\n ) {\n this.statsResults[mediaType].send.maxPacketLossRatio =\n this.statsResults[mediaType].send.currentPacketLossRatio;\n }\n\n if (result.type === 'remote-inbound-rtp') {\n this.networkQualityMonitor.determineUplinkNetworkQuality({\n mediaType,\n remoteRtpResults: result,\n statsAnalyzerCurrentStats: this.statsResults,\n });\n }\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAEA,IAAAA,OAAA,GAAAC,OAAA;AACA,IAAAC,kBAAA,GAAAD,OAAA;AAEA,IAAAE,YAAA,GAAAC,sBAAA,CAAAH,OAAA;AACA,IAAAI,UAAA,GAAAJ,OAAA;AAQA,IAAAK,OAAA,GAAAL,OAAA;AAWA,IAAAM,YAAA,GAAAH,sBAAA,CAAAH,OAAA;AAEA,IAAAO,OAAA,GAAAJ,sBAAA,CAAAH,OAAA;AACA,IAAAQ,QAAA,GAAAR,OAAA;AASmB,SAAAS,aAAAC,OAAA,QAAAC,yBAAA,GAAAC,yBAAA,oBAAAC,qBAAA,QAAAC,KAAA,OAAAC,gBAAA,CAAAC,OAAA,EAAAN,OAAA,GAAAO,MAAA,MAAAN,yBAAA,QAAAO,SAAA,OAAAH,gBAAA,CAAAC,OAAA,QAAAG,WAAA,EAAAF,MAAA,GAAAG,kBAAA,CAAAN,KAAA,EAAAO,SAAA,EAAAH,SAAA,YAAAD,MAAA,GAAAH,KAAA,CAAAQ,KAAA,OAAAD,SAAA,gBAAAE,2BAAA,CAAAP,OAAA,QAAAC,MAAA;AAAA,SAAAL,0BAAA,eAAAY,OAAA,qBAAAJ,kBAAA,oBAAAA,kBAAA,CAAAK,IAAA,2BAAAC,KAAA,oCAAAC,OAAA,CAAAC,SAAA,CAAAC,OAAA,CAAAC,IAAA,CAAAV,kBAAA,CAAAO,OAAA,8CAAAI,CAAA,sBArCnB;AAwCO,IAAMC,MAAM,GAAAC,OAAA,CAAAD,MAAA,GAAG;EACpBE,aAAa,EAAE,eAAe;EAC9BC,mBAAmB,EAAE,qBAAqB;EAC1CC,mBAAmB,EAAE,qBAAqB;EAC1CC,oBAAoB,EAAE,sBAAsB;EAC5CC,oBAAoB,EAAE;AACxB,CAAC;AAED,IAAMC,WAAW,GAAG;EAClBC,UAAU,EAAE,EAAE;EACdC,kBAAkB,EAAE,CAAC;EACrBC,kBAAkB,EAAE,CAAC;EACrBC,SAAS,EAAE,CAAC;EACZC,gBAAgB,EAAE,EAAE;EACpBC,iBAAiB,EAAE;AACrB,CAAC;AAED,IAAMC,aAAa,GAAG;EACpBJ,kBAAkB,EAAE,CAAC;EACrBK,aAAa,EAAE,CAAC;EAChBC,aAAa,EAAE,EAAE;EACjBH,iBAAiB,EAAE;AACrB,CAAC;AAID;AACA;AACA;AACA;AACA;AACA;AACA;AANA,IAOaI,aAAa,GAAAhB,OAAA,CAAAgB,aAAA,0BAAAC,YAAA;EAAA,IAAAC,UAAA,CAAAnC,OAAA,EAAAiC,aAAA,EAAAC,YAAA;EAAA,IAAAE,MAAA,GAAA3C,YAAA,CAAAwC,aAAA;EAkBxB;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACE,SAAAA,cACEI,MAAW,EAIX;IAAA,IAAAC,KAAA;IAAA,IAHAC,mBAAwC,GAAAlC,SAAA,CAAAmC,MAAA,QAAAnC,SAAA,QAAAoC,SAAA,GAAApC,SAAA,MAAG;MAAA,OAAMoC,SAAS;IAAA;IAAA,IAC1DC,qBAA6B,GAAArC,SAAA,CAAAmC,MAAA,QAAAnC,SAAA,QAAAoC,SAAA,GAAApC,SAAA,MAAG,CAAC,CAAC;IAAA,IAClCsC,YAAoB,GAAAtC,SAAA,CAAAmC,MAAA,QAAAnC,SAAA,QAAAoC,SAAA,GAAApC,SAAA,MAAGuC,eAAY;IAAA,IAAAC,gBAAA,CAAA7C,OAAA,QAAAiC,aAAA;IAEnCK,KAAA,GAAAF,MAAA,CAAAtB,IAAA;IAAQ,IAAAgC,gBAAA,CAAA9C,OAAA,MAAA+C,uBAAA,CAAA/C,OAAA,EAAAsC,KAAA;IAAA,IAAAQ,gBAAA,CAAA9C,OAAA,MAAA+C,uBAAA,CAAA/C,OAAA,EAAAsC,KAAA;IAAA,IAAAQ,gBAAA,CAAA9C,OAAA,MAAA+C,uBAAA,CAAA/C,OAAA,EAAAsC,KAAA;IAAA,IAAAQ,gBAAA,CAAA9C,OAAA,MAAA+C,uBAAA,CAAA/C,OAAA,EAAAsC,KAAA;IAAA,IAAAQ,gBAAA,CAAA9C,OAAA,MAAA+C,uBAAA,CAAA/C,OAAA,EAAAsC,KAAA;IAAA,IAAAQ,gBAAA,CAAA9C,OAAA,MAAA+C,uBAAA,CAAA/C,OAAA,EAAAsC,KAAA;IAAA,IAAAQ,gBAAA,CAAA9C,OAAA,MAAA+C,uBAAA,CAAA/C,OAAA,EAAAsC,KAAA;IAAA,IAAAQ,gBAAA,CAAA9C,OAAA,MAAA+C,uBAAA,CAAA/C,OAAA,EAAAsC,KAAA;IAAA,IAAAQ,gBAAA,CAAA9C,OAAA,MAAA+C,uBAAA,CAAA/C,OAAA,EAAAsC,KAAA;IAAA,IAAAQ,gBAAA,CAAA9C,OAAA,MAAA+C,uBAAA,CAAA/C,OAAA,EAAAsC,KAAA;IAAA,IAAAQ,gBAAA,CAAA9C,OAAA,MAAA+C,uBAAA,CAAA/C,OAAA,EAAAsC,KAAA;IAAA,IAAAQ,gBAAA,CAAA9C,OAAA,MAAA+C,uBAAA,CAAA/C,OAAA,EAAAsC,KAAA;IAAA,IAAAQ,gBAAA,CAAA9C,OAAA,MAAA+C,uBAAA,CAAA/C,OAAA,EAAAsC,KAAA;IAAA,IAAAQ,gBAAA,CAAA9C,OAAA,MAAA+C,uBAAA,CAAA/C,OAAA,EAAAsC,KAAA;IAAA,IAAAQ,gBAAA,CAAA9C,OAAA,MAAA+C,uBAAA,CAAA/C,OAAA,EAAAsC,KAAA;IAlBc;IAAA,IAAAQ,gBAAA,CAAA9C,OAAA,MAAA+C,uBAAA,CAAA/C,OAAA,EAAAsC,KAAA;IA0exB;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;IAbE,IAAAQ,gBAAA,CAAA9C,OAAA,MAAA+C,uBAAA,CAAA/C,OAAA,EAAAsC,KAAA,0BAcsB,UACpBU,SAAiB,EACjBC,aAAqB,EACrBC,YAAoB,EACpBC,OAAgB,EACb;MACH,IAAIH,SAAS,KAAK,OAAO,IAAIA,SAAS,KAAK,OAAO,IAAIA,SAAS,KAAK,OAAO,EAAE;QAC3E,MAAM,IAAII,KAAK,2BAAAC,MAAA,CAA2BL,SAAS,CAAE,CAAC;MACxD;;MAEA;MACA,IAAIC,aAAa,KAAKR,SAAS,EAAEQ,aAAa,GAAG,CAAC;MAClD;MACA,IAAIC,YAAY,KAAKT,SAAS,EAAES,YAAY,GAAG,CAAC;MAEhD,IAAI,CAACZ,KAAA,CAAKgB,yBAAyB,CAACN,SAAS,CAAC,EAAE;QAC9CV,KAAA,CAAKgB,yBAAyB,CAACN,SAAS,CAAC,GAAG,CAAC,CAAC;MAChD;MAEA,IAAMO,gBAAgB,GAAGJ,OAAO,GAC5Bb,KAAA,CAAKgB,yBAAyB,CAACN,SAAS,CAAC,CAACQ,KAAK,GAC/ClB,KAAA,CAAKgB,yBAAyB,CAACN,SAAS,CAAC,CAACS,MAAM;MAEpD,IAAIC,QAAQ;MAEZ,IAAIR,YAAY,GAAGD,aAAa,GAAG,CAAC,EAAE;QACpCS,QAAQ,GAAGP,OAAO,GAAGnC,MAAM,CAACG,mBAAmB,GAAGH,MAAM,CAACK,oBAAoB;MAC/E,CAAC,MAAM,IAAI6B,YAAY,KAAKD,aAAa,IAAIC,YAAY,GAAG,CAAC,EAAE;QAC7DQ,QAAQ,GAAGP,OAAO,GAAGnC,MAAM,CAACI,mBAAmB,GAAGJ,MAAM,CAACM,oBAAoB;MAC/E;MAEA,IAAIoC,QAAQ,IAAIH,gBAAgB,KAAKG,QAAQ,EAAE;QAC7C,IAAIP,OAAO,EAAE;UACXb,KAAA,CAAKgB,yBAAyB,CAACN,SAAS,CAAC,CAACQ,KAAK,GAAGE,QAAQ;QAC5D,CAAC,MAAM;UACLpB,KAAA,CAAKgB,yBAAyB,CAACN,SAAS,CAAC,CAACS,MAAM,GAAGC,QAAQ;QAC7D;QACApB,KAAA,CAAKqB,IAAI,CACP;UACEC,IAAI,EAAE,qBAAqB;UAC3BC,QAAQ,EAAE;QACZ,CAAC,EACDH,QAAQ,EACR;UACEI,IAAI,EAAEd;QACR,CACF,CAAC;MACH;IACF,CAAC;IA+eD;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;IAVE,IAAAF,gBAAA,CAAA9C,OAAA,MAAA+C,uBAAA,CAAA/C,OAAA,EAAAsC,KAAA,oDAWgD,UAC9CyB,yBAAiC,EACjCC,UAAoD,EACjD;MACH,IAAIC,YAAY,GAAG,EAAE;MACrB,IAAIF,yBAAyB,IAAI,CAAC,IAAAG,eAAO,EAACF,UAAU,CAAC,EAAE;QACrD,IAAMG,cAAc,GAAGH,UAAU,CAACD,yBAAyB,CAAC;QAC5D,IAAII,cAAc,EAAE;UAClB,IAAIA,cAAc,CAACC,aAAa,KAAK,MAAM,EAAE;YAC3C;YACAH,YAAY,MAAAZ,MAAA,CAAMc,cAAc,CAACE,OAAO,CAAE;UAC5C,CAAC,MAAM,IAAIF,cAAc,CAACC,aAAa,KAAK,OAAO,EAAE;YACnD;YACA;YACA;YACA;YACA,IAAI,CAACD,cAAc,CAACG,aAAa,EAAE;cACjCL,YAAY,MAAAZ,MAAA,CAAMc,cAAc,CAACI,cAAc,CAAE;YACnD,CAAC,MAAM;cACL;cACA;cACA;cACA;cACAN,YAAY,MAAAZ,MAAA,CAAMc,cAAc,CAACE,OAAO,CAAE;YAC5C;UACF;QACF;MACF;MACA/B,KAAA,CAAKkC,cAAc,GAAGP,YAAY;IACpC,CAAC;IAED;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;IATE,IAAAnB,gBAAA,CAAA9C,OAAA,MAAA+C,uBAAA,CAAA/C,OAAA,EAAAsC,KAAA,qBAUiB,UAACrC,MAAW,EAAE6D,IAAS,EAAEW,QAAiB,EAAEC,QAAiB,EAAK;MAAA,IAAAC,qBAAA;MACjF,IAAI,CAAC1E,MAAM,IAAI,CAACA,MAAM,CAAC2E,EAAE,EAAE;QACzB;MACF;;MAEA;MACA,IAAI,EAAAD,qBAAA,GAAArC,KAAA,CAAKuC,uBAAuB,cAAAF,qBAAA,uBAA5BA,qBAAA,CAA8BG,gBAAgB,MAAK7E,MAAM,CAAC2E,EAAE,EAAE;QAChE;MACF;MAEA,IAAIG,SAAS;MACb,IAAI9E,MAAM,CAACqE,aAAa,EAAE;QACxBS,SAAS,GAAG9E,MAAM,CAACqE,aAAa,CAACU,WAAW,CAAC,CAAC;MAChD,CAAC,MAAM,IAAI/E,MAAM,CAACgF,QAAQ,EAAE;QAC1BF,SAAS,GAAG9E,MAAM,CAACgF,QAAQ,CAACD,WAAW,CAAC,CAAC;MAC3C;MAEA,IAAME,YAAY,GAAGT,QAAQ,GAAGU,gBAAK,CAACC,cAAc,GAAGD,gBAAK,CAACE,iBAAiB;MAC9E,IAAMC,MAAM,GAAGZ,QAAQ,GAAGS,gBAAK,CAACI,MAAM,GAAGJ,gBAAK,CAACK,KAAK;MAEpD,IAAI,CAAClD,KAAA,CAAKK,YAAY,CAACqB,UAAU,EAAE;QACjC1B,KAAA,CAAKK,YAAY,CAACqB,UAAU,GAAG,CAAC,CAAC;MACnC;MAEA1B,KAAA,CAAKK,YAAY,CAACqB,UAAU,CAAC/D,MAAM,CAAC2E,EAAE,CAAC,GAAG;QACxCR,aAAa,EAAEnE,MAAM,CAACmE,aAAa;QACnCqB,SAAS,EAAExF,MAAM,CAACyF,EAAE;QAAE;QACtBnB,cAAc,EAAEtE,MAAM,CAACsE,cAAc;QACrCoB,WAAW,EAAE1F,MAAM,CAAC0F,WAAW;QAC/BrB,aAAa,EAAErE,MAAM,CAACqE,aAAa;QACnCW,QAAQ,EAAEhF,MAAM,CAACgF,QAAQ;QACzBZ,OAAO,EAAEpE,MAAM,CAACoE,OAAO;QACvBuB,UAAU,EAAE3F,MAAM,CAAC4F,IAAI;QACvBC,WAAW,EAAE7F,MAAM,CAAC6F,WAAW;QAC/BC,QAAQ,EAAE9F,MAAM,CAAC8F,QAAQ;QACzBhB,SAAS,EAATA,SAAS;QACTiB,SAAS,EAAE/F,MAAM,CAACgG,IAAI;QACtBrB,EAAE,EAAE3E,MAAM,CAAC2E,EAAE;QACbd,IAAI,EAAE7D,MAAM,CAAC6D;MACf,CAAC;MAEDxB,KAAA,CAAKK,YAAY,CAACuD,cAAc,CAACZ,MAAM,CAAC,CAAClB,aAAa,GAAGnE,MAAM,CAACmE,aAAa;MAC7E9B,KAAA,CAAKK,YAAY,CAACuD,cAAc,CAACZ,MAAM,CAAC,CAACG,SAAS,GAAGxF,MAAM,CAACwF,SAAS;MAErEnD,KAAA,CAAKK,YAAY,CAACuD,cAAc,CAACZ,MAAM,CAAC,CAACQ,WAAW,GAClD7F,MAAM,CAAC6F,WAAW,KAAKK,uBAAY,CAACC,GAAG,GAAGD,uBAAY,CAACE,OAAO,GAAGpG,MAAM,CAAC6F,WAAW;MACrFxD,KAAA,CAAKK,YAAY,CAACuD,cAAc,CAACZ,MAAM,CAAC,CAACP,SAAS,GAAGA,SAAS;MAE9DzC,KAAA,CAAKK,YAAY,CAACmB,IAAI,CAAC,CAACoB,YAAY,CAAC,CAACoB,kBAAkB,GAAGrG,MAAM,CAACqG,kBAAkB;IACtF,CAAC;IAzmCChE,KAAA,CAAKiE,YAAY,GAAG,KAAK;IACzBjE,KAAA,CAAKK,YAAY,GAAGA,YAAY;IAChCL,KAAA,CAAKkE,gBAAgB,GAAG,IAAI;IAC5BlE,KAAA,CAAKD,MAAM,GAAGA,MAAM;IACpBC,KAAA,CAAKI,qBAAqB,GAAGA,qBAAqB;IAClDJ,KAAA,CAAKmE,aAAa,GAAGpE,MAAM,CAACoE,aAAa;IACzCnE,KAAA,CAAKoE,YAAY,GAAG,CAAC,CAAC;IACtBpE,KAAA,CAAKqE,eAAe,GAAG,CAAC,CAAC;IACzBrE,KAAA,CAAKgB,yBAAyB,GAAG,CAAC,CAAC;IACnChB,KAAA,CAAKC,mBAAmB,GAAGA,mBAAmB;IAC9CD,KAAA,CAAKuC,uBAAuB,GAAG,CAAC,CAAC;IACjCvC,KAAA,CAAKkC,cAAc,GAAG,EAAE;IAAC,OAAAlC,KAAA;EAC3B;;EAEA;AACF;AACA;AACA;AACA;AACA;AACA;EANE,IAAAsE,aAAA,CAAA5G,OAAA,EAAAiC,aAAA;IAAA4E,GAAA;IAAAC,KAAA,EAOA,SAAAC,kBAAA,EAAoB;MAAA,IAAAC,MAAA;MAClB,IAAAC,KAAA,CAAAjH,OAAA,EAAY,IAAI,CAAC2C,YAAY,CAAC,CAACuE,OAAO,CAAC,UAAClE,SAAS,EAAK;QACpD,IAAIA,SAAS,CAACmE,QAAQ,CAAC,MAAM,CAAC,EAAE;UAC9BH,MAAI,CAACrE,YAAY,CAACK,SAAS,CAAC,CAACoE,IAAI,CAACpF,aAAa,GAAG,EAAE;QACtD;QAEA,IAAIgB,SAAS,CAACmE,QAAQ,CAAC,MAAM,CAAC,EAAE;UAC9BH,MAAI,CAACrE,YAAY,CAACK,SAAS,CAAC,CAACqE,IAAI,CAACzF,gBAAgB,GAAG,EAAE;UACvDoF,MAAI,CAACrE,YAAY,CAACK,SAAS,CAAC,CAACqE,IAAI,CAACxF,iBAAiB,GAAG,EAAE;QAC1D;MACF,CAAC,CAAC;IACJ;;IAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;EAPE;IAAAgF,GAAA;IAAAC,KAAA,EAQA,SAAAQ,kBAAyBC,MAAc,EAAE;MACvC,IAAI,CAACC,kBAAkB,GAAGD,MAAM;IAClC;;IAEA;AACF;AACA;AACA;AACA;AACA;AACA;EANE;IAAAV,GAAA;IAAAC,KAAA,EAOA,SAAAW,YAAA,EAAc;MAAA,IAAAC,MAAA;MACZ,IAAMC,MAAM,GAAG,IAAAC,iBAAS,EAACC,wBAAgB,CAAC;;MAE1C;MACA,IAAAZ,KAAA,CAAAjH,OAAA,EAAY,IAAI,CAAC2C,YAAY,CAAC,CAACuE,OAAO,CAAC,UAAClE,SAAS,EAAK;QACpD,IAAI,CAAC0E,MAAI,CAACf,eAAe,CAAC3D,SAAS,CAAC,EAAE;UACpC0E,MAAI,CAACf,eAAe,CAAC3D,SAAS,CAAC,GAAG,CAAC,CAAC;QACtC;QAEA,IAAI,CAAC0E,MAAI,CAACf,eAAe,CAAC3D,SAAS,CAAC,CAACqE,IAAI,IAAIrE,SAAS,CAACmE,QAAQ,CAAC,OAAO,CAAC,EAAE;UACxEO,MAAI,CAACf,eAAe,CAAC3D,SAAS,CAAC,CAACqE,IAAI,GAAG,CAAC,CAAC;QAC3C;QAEA,IAAI,CAACK,MAAI,CAACf,eAAe,CAAC3D,SAAS,CAAC,CAACoE,IAAI,IAAIpE,SAAS,CAACmE,QAAQ,CAAC,OAAO,CAAC,EAAE;UACxEO,MAAI,CAACf,eAAe,CAAC3D,SAAS,CAAC,CAACoE,IAAI,GAAG,CAAC,CAAC;QAC3C;MACF,CAAC,CAAC;;MAEF;MACA,IAAMU,WAAW,GAAG,IAAAF,iBAAS,EAACG,0BAAkB,CAAC;MACjD,IAAMC,gBAAgB,GAAG,IAAAJ,iBAAS,EAACG,0BAAkB,CAAC;MACtD,IAAME,aAAa,GAAG,IAAAL,iBAAS,EAACM,yBAAiB,CAAC;MAClD,IAAMC,kBAAkB,GAAG,IAAAP,iBAAS,EAACM,yBAAiB,CAAC;MACvD,IAAME,WAAW,GAAG,IAAAR,iBAAS,EAACS,0BAAkB,CAAC;MACjD,IAAMC,gBAAgB,GAAG,IAAAV,iBAAS,EAACS,0BAAkB,CAAC;MACtD,IAAME,aAAa,GAAG,IAAAX,iBAAS,EAACY,yBAAiB,CAAC;MAClD,IAAMC,kBAAkB,GAAG,IAAAb,iBAAS,EAACY,yBAAiB,CAAC;MAEvD,IAAAE,0BAAiB,EAAC;QAChBZ,WAAW,EAAXA,WAAW;QACXnF,YAAY,EAAE,IAAI,CAACA,YAAY;QAC/BgE,eAAe,EAAE,IAAI,CAACA,eAAe;QACrCgC,aAAa,EAAE;MACjB,CAAC,CAAC;MACFhB,MAAM,CAACiB,aAAa,CAACC,IAAI,CAACf,WAAW,CAAC;MAEtC,IAAAY,0BAAiB,EAAC;QAChBZ,WAAW,EAAEE,gBAAgB;QAC7BrF,YAAY,EAAE,IAAI,CAACA,YAAY;QAC/BgE,eAAe,EAAE,IAAI,CAACA,eAAe;QACrCgC,aAAa,EAAE;MACjB,CAAC,CAAC;MACFhB,MAAM,CAACiB,aAAa,CAACC,IAAI,CAACb,gBAAgB,CAAC;MAE3C,IAAAc,4BAAmB,EAAC;QAClBb,aAAa,EAAbA,aAAa;QACbtF,YAAY,EAAE,IAAI,CAACA,YAAY;QAC/BgE,eAAe,EAAE,IAAI,CAACA,eAAe;QACrCgC,aAAa,EAAE;MACjB,CAAC,CAAC;MACFhB,MAAM,CAACoB,YAAY,CAACF,IAAI,CAACZ,aAAa,CAAC;MAEvC,IAAAa,4BAAmB,EAAC;QAClBb,aAAa,EAAEE,kBAAkB;QACjCxF,YAAY,EAAE,IAAI,CAACA,YAAY;QAC/BgE,eAAe,EAAE,IAAI,CAACA,eAAe;QACrCgC,aAAa,EAAE;MACjB,CAAC,CAAC;MACFhB,MAAM,CAACoB,YAAY,CAACF,IAAI,CAACV,kBAAkB,CAAC;MAE5C,IAAAa,0BAAiB,EAAC;QAChBZ,WAAW,EAAXA,WAAW;QACXzF,YAAY,EAAE,IAAI,CAACA,YAAY;QAC/BgE,eAAe,EAAE,IAAI,CAACA,eAAe;QACrCgC,aAAa,EAAE;MACjB,CAAC,CAAC;MACFhB,MAAM,CAACsB,aAAa,CAACJ,IAAI,CAACT,WAAW,CAAC;MAEtC,IAAAY,0BAAiB,EAAC;QAChBZ,WAAW,EAAEE,gBAAgB;QAC7B3F,YAAY,EAAE,IAAI,CAACA,YAAY;QAC/BgE,eAAe,EAAE,IAAI,CAACA,eAAe;QACrCgC,aAAa,EAAE;MACjB,CAAC,CAAC;MACFhB,MAAM,CAACsB,aAAa,CAACJ,IAAI,CAACP,gBAAgB,CAAC;MAE3C,IAAAY,4BAAmB,EAAC;QAClBX,aAAa,EAAbA,aAAa;QACb5F,YAAY,EAAE,IAAI,CAACA,YAAY;QAC/BgE,eAAe,EAAE,IAAI,CAACA,eAAe;QACrCgC,aAAa,EAAE;MACjB,CAAC,CAAC;MACFhB,MAAM,CAACwB,YAAY,CAACN,IAAI,CAACN,aAAa,CAAC;MAEvC,IAAAW,4BAAmB,EAAC;QAClBX,aAAa,EAAEE,kBAAkB;QACjC9F,YAAY,EAAE,IAAI,CAACA,YAAY;QAC/BgE,eAAe,EAAE,IAAI,CAACA,eAAe;QACrCgC,aAAa,EAAE;MACjB,CAAC,CAAC;MACFhB,MAAM,CAACwB,YAAY,CAACN,IAAI,CAACJ,kBAAkB,CAAC;;MAE5C;MACA,IAAAxB,KAAA,CAAAjH,OAAA,EAAY,IAAI,CAAC2C,YAAY,CAAC,CAACuE,OAAO,CAAC,UAAClE,SAAS,EAAK;QACpD,IAAIA,SAAS,CAACmE,QAAQ,CAAC,YAAY,CAAC,EAAE;UACpC,IAAMiC,iBAAiB,GAAG,IAAAxB,iBAAS,EAACyB,gCAAwB,CAAC;UAE7D,IAAAC,gCAAuB,EAAC;YACtBF,iBAAiB,EAAjBA,iBAAiB;YACjBzG,YAAY,EAAE+E,MAAI,CAAC/E,YAAY;YAC/BgE,eAAe,EAAEe,MAAI,CAACf,eAAe;YACrC3D,SAAS,EAATA;UACF,CAAC,CAAC;UACF2E,MAAM,CAACiB,aAAa,CAAC,CAAC,CAAC,CAACW,OAAO,CAACV,IAAI,CAACO,iBAAiB,CAAC;UAEvD1B,MAAI,CAACf,eAAe,CAAC3D,SAAS,CAAC,CAACqE,IAAI,GAAG,IAAAO,iBAAS,EAACF,MAAI,CAAC/E,YAAY,CAACK,SAAS,CAAC,CAACqE,IAAI,CAAC;QACrF,CAAC,MAAM,IAAIrE,SAAS,CAACmE,QAAQ,CAAC,kBAAkB,CAAC,EAAE;UACjD,IAAMiC,kBAAiB,GAAG,IAAAxB,iBAAS,EAACyB,gCAAwB,CAAC;UAE7D,IAAAC,gCAAuB,EAAC;YACtBF,iBAAiB,EAAjBA,kBAAiB;YACjBzG,YAAY,EAAE+E,MAAI,CAAC/E,YAAY;YAC/BgE,eAAe,EAAEe,MAAI,CAACf,eAAe;YACrC3D,SAAS,EAATA;UACF,CAAC,CAAC;UACF2E,MAAM,CAACiB,aAAa,CAAC,CAAC,CAAC,CAACW,OAAO,CAACV,IAAI,CAACO,kBAAiB,CAAC;UAEvD1B,MAAI,CAACf,eAAe,CAAC3D,SAAS,CAAC,CAACqE,IAAI,GAAG,IAAAO,iBAAS,EAACF,MAAI,CAAC/E,YAAY,CAACK,SAAS,CAAC,CAACqE,IAAI,CAAC;QACrF,CAAC,MAAM,IAAIrE,SAAS,CAACmE,QAAQ,CAAC,YAAY,CAAC,EAAE;UAC3C,IAAMqC,mBAAmB,GAAG,IAAA5B,iBAAS,EAAC6B,+BAAuB,CAAC;UAE9D,IAAAC,kCAAyB,EAAC;YACxBF,mBAAmB,EAAnBA,mBAAmB;YACnB7G,YAAY,EAAE+E,MAAI,CAAC/E,YAAY;YAC/BgE,eAAe,EAAEe,MAAI,CAACf,eAAe;YACrC3D,SAAS,EAATA;UACF,CAAC,CAAC;UACF2E,MAAM,CAACoB,YAAY,CAAC,CAAC,CAAC,CAACQ,OAAO,CAACV,IAAI,CAACW,mBAAmB,CAAC;UAExD9B,MAAI,CAACf,eAAe,CAAC3D,SAAS,CAAC,CAACoE,IAAI,GAAG,IAAAQ,iBAAS,EAACF,MAAI,CAAC/E,YAAY,CAACK,SAAS,CAAC,CAACoE,IAAI,CAAC;QACrF,CAAC,MAAM,IAAIpE,SAAS,CAACmE,QAAQ,CAAC,kBAAkB,CAAC,EAAE;UACjD,IAAMqC,oBAAmB,GAAG,IAAA5B,iBAAS,EAAC6B,+BAAuB,CAAC;UAE9D,IAAAC,kCAAyB,EAAC;YACxBF,mBAAmB,EAAnBA,oBAAmB;YACnB7G,YAAY,EAAE+E,MAAI,CAAC/E,YAAY;YAC/BgE,eAAe,EAAEe,MAAI,CAACf,eAAe;YACrC3D,SAAS,EAATA;UACF,CAAC,CAAC;UACF2E,MAAM,CAACoB,YAAY,CAAC,CAAC,CAAC,CAACQ,OAAO,CAACV,IAAI,CAACW,oBAAmB,CAAC;UAExD9B,MAAI,CAACf,eAAe,CAAC3D,SAAS,CAAC,CAACoE,IAAI,GAAG,IAAAQ,iBAAS,EAACF,MAAI,CAAC/E,YAAY,CAACK,SAAS,CAAC,CAACoE,IAAI,CAAC;QACrF,CAAC,MAAM,IAAIpE,SAAS,CAACmE,QAAQ,CAAC,YAAY,CAAC,EAAE;UAC3C,IAAMwC,iBAAiB,GAAG,IAAA/B,iBAAS,EAACgC,gCAAwB,CAAC;UAE7D,IAAAC,gCAAuB,EAAC;YACtBF,iBAAiB,EAAjBA,iBAAiB;YACjBhH,YAAY,EAAE+E,MAAI,CAAC/E,YAAY;YAC/BgE,eAAe,EAAEe,MAAI,CAACf,eAAe;YACrC3D,SAAS,EAATA;UACF,CAAC,CAAC;UACF2E,MAAM,CAACsB,aAAa,CAAC,CAAC,CAAC,CAACM,OAAO,CAACV,IAAI,CAACc,iBAAiB,CAAC;UAEvDjC,MAAI,CAACf,eAAe,CAAC3D,SAAS,CAAC,CAACqE,IAAI,GAAG,IAAAO,iBAAS,EAACF,MAAI,CAAC/E,YAAY,CAACK,SAAS,CAAC,CAACqE,IAAI,CAAC;QACrF,CAAC,MAAM,IAAIrE,SAAS,CAACmE,QAAQ,CAAC,kBAAkB,CAAC,EAAE;UACjD,IAAMwC,kBAAiB,GAAG,IAAA/B,iBAAS,EAACgC,gCAAwB,CAAC;UAE7D,IAAAC,gCAAuB,EAAC;YACtBF,iBAAiB,EAAjBA,kBAAiB;YACjBhH,YAAY,EAAE+E,MAAI,CAAC/E,YAAY;YAC/BgE,eAAe,EAAEe,MAAI,CAACf,eAAe;YACrC3D,SAAS,EAATA;UACF,CAAC,CAAC;UACF2E,MAAM,CAACsB,aAAa,CAAC,CAAC,CAAC,CAACM,OAAO,CAACV,IAAI,CAACc,kBAAiB,CAAC;UAEvDjC,MAAI,CAACf,eAAe,CAAC3D,SAAS,CAAC,CAACqE,IAAI,GAAG,IAAAO,iBAAS,EAACF,MAAI,CAAC/E,YAAY,CAACK,SAAS,CAAC,CAACqE,IAAI,CAAC;QACrF,CAAC,MAAM,IAAIrE,SAAS,CAACmE,QAAQ,CAAC,YAAY,CAAC,EAAE;UAC3C,IAAM2C,mBAAmB,GAAG,IAAAlC,iBAAS,EAACmC,+BAAuB,CAAC;UAE9D,IAAAC,kCAAyB,EAAC;YACxBF,mBAAmB,EAAnBA,mBAAmB;YACnBnH,YAAY,EAAE+E,MAAI,CAAC/E,YAAY;YAC/BgE,eAAe,EAAEe,MAAI,CAACf,eAAe;YACrC3D,SAAS,EAATA;UACF,CAAC,CAAC;UACF2E,MAAM,CAACwB,YAAY,CAAC,CAAC,CAAC,CAACI,OAAO,CAACV,IAAI,CAACiB,mBAAmB,CAAC;UAExDpC,MAAI,CAACf,eAAe,CAAC3D,SAAS,CAAC,CAACoE,IAAI,GAAG,IAAAQ,iBAAS,EAACF,MAAI,CAAC/E,YAAY,CAACK,SAAS,CAAC,CAACoE,IAAI,CAAC;QACrF,CAAC,MAAM,IAAIpE,SAAS,CAACmE,QAAQ,CAAC,kBAAkB,CAAC,EAAE;UACjD,IAAM2C,oBAAmB,GAAG,IAAAlC,iBAAS,EAACmC,+BAAuB,CAAC;UAE9D,IAAAC,kCAAyB,EAAC;YACxBF,mBAAmB,EAAnBA,oBAAmB;YACnBnH,YAAY,EAAE+E,MAAI,CAAC/E,YAAY;YAC/BgE,eAAe,EAAEe,MAAI,CAACf,eAAe;YACrC3D,SAAS,EAATA;UACF,CAAC,CAAC;UACF2E,MAAM,CAACwB,YAAY,CAAC,CAAC,CAAC,CAACI,OAAO,CAACV,IAAI,CAACiB,oBAAmB,CAAC;UAExDpC,MAAI,CAACf,eAAe,CAAC3D,SAAS,CAAC,CAACoE,IAAI,GAAG,IAAAQ,iBAAS,EAACF,MAAI,CAAC/E,YAAY,CAACK,SAAS,CAAC,CAACoE,IAAI,CAAC;QACrF;MACF,CAAC,CAAC;MAEFO,MAAM,CAACsC,gBAAgB,CAACC,eAAe,GAAG,IAAI,CAACvH,YAAY,CAACuD,cAAc,CAAC1C,KAAK,CAACiC,SAAS;;MAE1F;MACAkC,MAAM,CAACsC,gBAAgB,CAACE,WAAW,CAACtB,IAAI,CAAC;QAACuB,WAAW,EAAEC,oBAAS;QAAEC,IAAI,EAAEC,wBAAa,CAACC;MAAO,CAAC,CAAC;MAC/F,IAAI,IAAI,CAAC7H,YAAY,CAAC,YAAY,CAAC,EAAE;QACnCgF,MAAM,CAACsC,gBAAgB,CAACE,WAAW,CAACtB,IAAI,CAAC;UACvCuB,WAAW,EAAE,IAAI,CAACzH,YAAY,CAAC,YAAY,CAAC,CAACnB,UAAU,IAAI6I,oBAAS;UACpEC,IAAI,EAAEC,wBAAa,CAACE;QACtB,CAAC,CAAC;MACJ;MACA,IAAI,IAAI,CAAC9H,YAAY,CAAC,YAAY,CAAC,EAAE;QACnCgF,MAAM,CAACsC,gBAAgB,CAACE,WAAW,CAACtB,IAAI,CAAC;UACvCuB,WAAW,EAAE,IAAI,CAACzH,YAAY,CAAC,YAAY,CAAC,CAACnB,UAAU,IAAI6I,oBAAS;UACpEC,IAAI,EAAEC,wBAAa,CAACG;QACtB,CAAC,CAAC;MACJ;MAEA/C,MAAM,CAAC7B,WAAW,GAAG,IAAI,CAACnD,YAAY,CAACuD,cAAc,CAAC1C,KAAK,CAACsC,WAAW;MAEvE,IAAI,CAACY,YAAY,IAAI,CAAC;MAEtBiB,MAAM,CAACgD,cAAc,GAAG,IAAI,CAACjE,YAAY;MAEzC,IAAI,CAACK,iBAAiB,CAAC,CAAC;MAExB,IAAI,CAACpD,IAAI,CACP;QACEC,IAAI,EAAE,eAAe;QACrBC,QAAQ,EAAE;MACZ,CAAC,EACD7C,MAAM,CAACE,aAAa,EACpB;QACE0J,IAAI,EAAEjD,MAAM;QACZ;QACA7B,WAAW,EAAE6B,MAAM,CAAC7B;MACtB,CACF,CAAC;IACH;;IAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;EAPE;IAAAe,GAAA;IAAAC,KAAA,EAQA,SAAA+D,sBAAsBC,eAAoB,EAAE;MAC1C,IAAI,CAACA,eAAe,GAAGA,eAAe;IACxC;;IAEA;AACF;AACA;AACA;AACA;AACA;EALE;IAAAjE,GAAA;IAAAC,KAAA,EAMA,SAAAiE,kBAAA,EAA4B;MAC1B,OAAO,IAAI,CAACvG,cAAc;IAC5B;;IAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;EAPE;IAAAqC,GAAA;IAAAC,KAAA,EAQA,SAAAkE,cAAqBF,eAAoB,EAAE;MAAA,IAAAG,MAAA;MACzC,IAAI,CAAC,IAAI,CAAC1E,YAAY,EAAE;QACtB,IAAI,CAACA,YAAY,GAAG,IAAI;QACxB,IAAI,CAACuE,eAAe,GAAGA,eAAe;QAEtC,OAAO,IAAI,CAACI,gBAAgB,CAAC,CAAC,CAACC,IAAI,CAAC,YAAM;UACxCF,MAAI,CAACG,aAAa,GAAGC,WAAW,CAAC,YAAM;YACrCJ,MAAI,CAACC,gBAAgB,CAAC,CAAC;UACzB,CAAC,EAAED,MAAI,CAAC5I,MAAM,CAACiJ,gBAAgB,CAAC;UAChC;UACAL,MAAI,CAACxD,WAAW,CAAC,CAAC;UAClBwD,MAAI,CAACM,WAAW,GAAGF,WAAW,CAAC,YAAM;YACnCJ,MAAI,CAACxD,WAAW,CAAC,CAAC;UACpB,CAAC,EAAE+D,uBAAY,CAAC;QAClB,CAAC,CAAC;MACJ;MAEA,OAAOC,QAAA,CAAAzL,OAAA,CAAQ0L,OAAO,CAAC,CAAC;IAC1B;;IAEA;AACF;AACA;AACA;AACA;AACA;AACA;EANE;IAAA7E,GAAA;IAAAC,KAAA,EAOA,SAAA6E,aAAA,EAAsB;MAAA,IAAAC,MAAA;MACpB,IAAMC,cAAc,GAAG,IAAI,CAACN,WAAW,IAAI,IAAI,CAACH,aAAa;MAE7D,IAAI,IAAI,CAACA,aAAa,EAAE;QACtBU,aAAa,CAAC,IAAI,CAACV,aAAa,CAAC;QACjC,IAAI,CAACA,aAAa,GAAG3I,SAAS;MAChC;MAEA,IAAI,IAAI,CAAC8I,WAAW,EAAE;QACpBO,aAAa,CAAC,IAAI,CAACP,WAAW,CAAC;QAC/B,IAAI,CAACA,WAAW,GAAG9I,SAAS;MAC9B;MAEA,IAAIoJ,cAAc,EAAE;QAClB,OAAO,IAAI,CAACX,gBAAgB,CAAC,CAAC,CAACC,IAAI,CAAC,YAAM;UACxCS,MAAI,CAACnE,WAAW,CAAC,CAAC;UAClBmE,MAAI,CAACd,eAAe,GAAG,IAAI;QAC7B,CAAC,CAAC;MACJ;MAEA,OAAOW,QAAA,CAAAzL,OAAA,CAAQ0L,OAAO,CAAC,CAAC;IAC1B;;IAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EATE;IAAA7E,GAAA;IAAAC,KAAA,EAUA,SAAAiF,oBAA4BC,cAAmB,EAAElI,IAAY,EAAEW,QAAiB,EAAE;MAChF,IAAI,CAACuH,cAAc,EAAE;QACnB;MACF;;MAEA;MACA,IAAI,CAAC,IAAI,CAACrJ,YAAY,CAACmB,IAAI,CAAC,EAAE;QAC5B,IAAI,CAACnB,YAAY,CAACmB,IAAI,CAAC,GAAG,CAAC,CAAC;MAC9B;MAEA,IAAIW,QAAQ,IAAI,CAAC,IAAI,CAAC9B,YAAY,CAACmB,IAAI,CAAC,CAACuD,IAAI,EAAE;QAC7C,IAAI,CAAC1E,YAAY,CAACmB,IAAI,CAAC,CAACuD,IAAI,GAAG,IAAAO,iBAAS,EAACrG,WAAW,CAAC;MACvD,CAAC,MAAM,IAAI,CAACkD,QAAQ,IAAI,CAAC,IAAI,CAAC9B,YAAY,CAACmB,IAAI,CAAC,CAACsD,IAAI,EAAE;QACrD,IAAI,CAACzE,YAAY,CAACmB,IAAI,CAAC,CAACsD,IAAI,GAAG,IAAAQ,iBAAS,EAAC9F,aAAa,CAAC;MACzD;MAEA,QAAQkK,cAAc,CAAClI,IAAI;QACzB,KAAK,cAAc;UACjB,IAAI,CAACmI,wBAAwB,CAACD,cAAc,EAAElI,IAAI,CAAC;UACnD;QACF,KAAK,aAAa;UAChB,IAAI,CAACoI,uBAAuB,CAACF,cAAc,EAAElI,IAAI,CAAC;UAClD;QACF,KAAK,oBAAoB;QACzB,KAAK,qBAAqB;UACxB,IAAI,CAACqI,sBAAsB,CAACH,cAAc,EAAElI,IAAI,CAAC;UACjD;QACF,KAAK,iBAAiB;QACtB,KAAK,kBAAkB;UACrB,IAAI,CAACsI,cAAc,CAACJ,cAAc,EAAElI,IAAI,EAAEW,QAAQ,EAAE,IAAI,CAAC;UACzD;QACF,KAAK,iBAAiB;UACpB,IAAI,CAAC2H,cAAc,CAACJ,cAAc,EAAElI,IAAI,EAAEW,QAAQ,EAAE,KAAK,CAAC;UAC1D;QACF,KAAK,cAAc;UACjB,IAAI,CAAC4H,gBAAgB,CAACL,cAAc,EAAElI,IAAI,CAAC;UAC3C;QACF;UACE;MACJ;IACF;;IAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;EAPE;IAAA+C,GAAA;IAAAC,KAAA,EAQA,SAAAwF,8BAA8BC,SAAc,EAAEzI,IAAY,EAAEW,QAAiB,EAAE;MAAA,IAAA+H,MAAA;MAC7E,IAAOC,KAAK,GAAIC,mCAAwB,CAAjCD,KAAK;;MAEZ;MACAF,SAAS,CAACI,MAAM,CAACzF,OAAO,CAAC,UAACyF,MAAM,EAAK;QACnC,IAAIA,MAAM,CAAC7I,IAAI,KAAK,gBAAgB,IAAI6I,MAAM,CAACC,KAAK,KAAK,WAAW,EAAE;UACpEJ,MAAI,CAAC3H,uBAAuB,GAAG8H,MAAM;QACvC;MACF,CAAC,CAAC;MAEFJ,SAAS,CAACI,MAAM,CAACzF,OAAO,CAAC,UAACjH,MAAM,EAAK;QACnC,IAAIwM,KAAK,CAACtF,QAAQ,CAAClH,MAAM,CAAC6D,IAAI,CAAC,EAAE;UAC/B0I,MAAI,CAACT,mBAAmB,CAAC9L,MAAM,EAAE6D,IAAI,EAAEW,QAAQ,CAAC;QAClD;MACF,CAAC,CAAC;MAEF,IAAI,IAAI,CAAC9B,YAAY,CAACmB,IAAI,CAAC,EAAE;QAAA,IAAA+I,sBAAA,EAAAC,kBAAA;QAC3B,IAAI,CAACnK,YAAY,CAACmB,IAAI,CAAC,CAACiJ,SAAS,GAAGR,SAAS,CAACS,gBAAgB;QAC9D,IAAI,CAACrK,YAAY,CAACmB,IAAI,CAAC,CAACtC,UAAU,GAAG+K,SAAS,CAACU,eAAe;QAC9D,IAAI,CAACtK,YAAY,CAACmB,IAAI,CAAC,CAACoJ,GAAG,GAAGX,SAAS,CAACW,GAAG;QAC3C,IAAI,CAACC,6CAA6C,EAAAN,sBAAA,GAChD,IAAI,CAAChI,uBAAuB,cAAAgI,sBAAA,uBAA5BA,sBAAA,CAA8B/H,gBAAgB,GAAAgI,kBAAA,GAC9C,IAAI,CAACnK,YAAY,cAAAmK,kBAAA,uBAAjBA,kBAAA,CAAmB9I,UACrB,CAAC;QACD;QACA,IAAI,CAACa,uBAAuB,GAAG,CAAC,CAAC;MACnC;IACF;;IAEA;AACF;AACA;AACA;AACA;AACA;EALE;IAAAgC,GAAA;IAAAC,KAAA,EAMA,SAAAuF,iBAAiBpM,MAAW,EAAE6D,IAAS,EAAE;MACvC,IAAI,CAAC7D,MAAM,EAAE;QACX;MACF;MAEA,IAAI6D,IAAI,CAACqD,QAAQ,CAAC,YAAY,CAAC,EAAE;QAC/B,IAAI,CAACxE,YAAY,CAACmB,IAAI,CAAC,CAACuD,IAAI,CAAC+F,UAAU,GAAGnN,MAAM,CAACmN,UAAU;QAC3D,IAAI,CAACzK,YAAY,CAACmB,IAAI,CAAC,CAACuD,IAAI,CAACgG,gBAAgB,GAAGpN,MAAM,CAACoN,gBAAgB;MACzE;IACF;EAAC;IAAAxG,GAAA;IAAAC,KAAA;IAkED;AACF;AACA;AACA;AACA;AACA;AACA;IACE,SAAAwG,uBAAA,EAAiC;MAAA,IAAAC,MAAA;MAC/B,IAAI,IAAI,CAAC/G,gBAAgB,KAAK,IAAI,IAAI,IAAI,CAACgB,kBAAkB,EAAE;QAC7D,IAAMgG,qBAAqB,GAAG,SAAxBA,qBAAqBA,CAAIC,SAAiB,EAAE3G,KAAa;UAAA,OAC7D,IAAAG,KAAA,CAAAjH,OAAA,EAAYuN,MAAI,CAAC5K,YAAY,CAAC,CAC3B+K,MAAM,CAAC,UAAC7G,GAAG;YAAA,OAAKA,GAAG,CAAC8G,UAAU,CAACF,SAAS,CAAC;UAAA,EAAC,CAC1CG,MAAM,CAAC,UAACC,IAAI,EAAEC,GAAG;YAAA,IAAAC,qBAAA;YAAA,OAAKF,IAAI,IAAI,EAAAE,qBAAA,GAAAR,MAAI,CAAC5K,YAAY,CAACmL,GAAG,CAAC,cAAAC,qBAAA,uBAAtBA,qBAAA,CAAwB3G,IAAI,CAACN,KAAK,CAAC,KAAI,CAAC,CAAC;UAAA,GAAE,CAAC,CAAC;QAAA;QAEhF,IAAMkH,sBAAsB,GAAG,SAAzBA,sBAAsBA,CAAIP,SAAiB,EAAE3G,KAAa;UAAA,OAC9D,IAAAG,KAAA,CAAAjH,OAAA,EAAYuN,MAAI,CAAC5K,YAAY,CAAC,CAC3B+K,MAAM,CAAC,UAAC7G,GAAG;YAAA,OAAKA,GAAG,CAAC8G,UAAU,CAACF,SAAS,CAAC;UAAA,EAAC,CAC1CG,MAAM,CAAC,UAACC,IAAI,EAAEC,GAAG;YAAA,IAAAG,qBAAA;YAAA,OAAKJ,IAAI,IAAI,EAAAI,qBAAA,GAAAV,MAAI,CAAC/G,gBAAgB,CAACsH,GAAG,CAAC,cAAAG,qBAAA,uBAA1BA,qBAAA,CAA4B7G,IAAI,CAACN,KAAK,CAAC,KAAI,CAAC,CAAC;UAAA,GAAE,CAAC,CAAC;QAAA;QAEpF,IAAI,IAAI,CAACU,kBAAkB,CAAC0G,QAAQ,CAACC,SAAS,IAAI,IAAI,CAAC3H,gBAAgB,CAAC,YAAY,CAAC,EAAE;UACrF;UACA;UACA,IAAM4H,YAAY,GAAG,IAAI,CAACzL,YAAY,CAAC,YAAY,CAAC,CAAC0E,IAAI;UACzD,IAAMgH,aAAa,GAAG,IAAI,CAAC7H,gBAAgB,CAAC,YAAY,CAAC,CAACa,IAAI;UAE9D,IACE+G,YAAY,CAACE,gBAAgB,KAAKD,aAAa,CAACC,gBAAgB,IAChEF,YAAY,CAACE,gBAAgB,KAAK,CAAC,EACnC;YACAC,oBAAW,CAACC,MAAM,CAACC,IAAI,6EAErBL,YAAY,CAACE,gBACf,CAAC;UACH,CAAC,MAAM;YACL,IACEF,YAAY,CAACf,gBAAgB,KAAKgB,aAAa,CAAChB,gBAAgB,IAChEe,YAAY,CAACf,gBAAgB,KAAK,CAAC,EACnC;cACAkB,oBAAW,CAACC,MAAM,CAACC,IAAI,2EAErBL,YAAY,CAACf,gBACf,CAAC;YACH;YAEA,IAAIe,YAAY,CAAChB,UAAU,KAAK,CAAC,EAAE;cACjCmB,oBAAW,CAACC,MAAM,CAACC,IAAI,+EAEvB,CAAC;YACH;UACF;UAEA,IAAI,CAACC,mBAAmB,CACtB,OAAO,EACPL,aAAa,CAACC,gBAAgB,EAC9BF,YAAY,CAACE,gBAAgB,EAC7B,IACF,CAAC;QACH;QAEA,IAAI,IAAI,CAAC9G,kBAAkB,CAAC0G,QAAQ,CAACS,YAAY,EAAE;UACjD;UACA,IAAMC,sBAAsB,GAAGpB,qBAAqB,CAAC,YAAY,EAAE,sBAAsB,CAAC;UAC1F,IAAMqB,uBAAuB,GAAGb,sBAAsB,CACpD,YAAY,EACZ,sBACF,CAAC;UACD,IAAMc,sBAAsB,GAAGtB,qBAAqB,CAAC,YAAY,EAAE,sBAAsB,CAAC;UAC1F,IAAMuB,uBAAuB,GAAGf,sBAAsB,CACpD,YAAY,EACZ,sBACF,CAAC;UAED,IAAIY,sBAAsB,KAAKC,uBAAuB,IAAID,sBAAsB,KAAK,CAAC,EAAE;YACtFL,oBAAW,CAACC,MAAM,CAACC,IAAI,iFAErBG,sBACF,CAAC;UACH,CAAC,MAAM,IACLE,sBAAsB,KAAKC,uBAAuB,IAClDD,sBAAsB,KAAK,CAAC,EAC5B;YACAP,oBAAW,CAACC,MAAM,CAACC,IAAI,6EAErBK,sBACF,CAAC;UACH;UAEA,IAAI,CAACJ,mBAAmB,CAAC,OAAO,EAAEG,uBAAuB,EAAED,sBAAsB,EAAE,KAAK,CAAC;QAC3F;QAEA,IAAI,IAAI,CAACpH,kBAAkB,CAAC0G,QAAQ,CAACc,SAAS,IAAI,IAAI,CAACxI,gBAAgB,CAAC,YAAY,CAAC,EAAE;UACrF;UACA,IAAM4H,aAAY,GAAG,IAAI,CAACzL,YAAY,CAAC,YAAY,CAAC,CAAC0E,IAAI;UACzD,IAAMgH,cAAa,GAAG,IAAI,CAAC7H,gBAAgB,CAAC,YAAY,CAAC,CAACa,IAAI;UAE9D,IACE+G,aAAY,CAACE,gBAAgB,KAAKD,cAAa,CAACC,gBAAgB,IAChEF,aAAY,CAACE,gBAAgB,KAAK,CAAC,EACnC;YACAC,oBAAW,CAACC,MAAM,CAACC,IAAI,6EAErBL,aAAY,CAACE,gBACf,CAAC;UACH,CAAC,MAAM;YACL,IACEF,aAAY,CAACa,aAAa,KAAKZ,cAAa,CAACY,aAAa,IAC1Db,aAAY,CAACa,aAAa,KAAK,CAAC,EAChC;cACAV,oBAAW,CAACC,MAAM,CAACC,IAAI,2EAErBL,aAAY,CAACa,aACf,CAAC;YACH;YAEA,IACE,IAAI,CAACtM,YAAY,CAAC,YAAY,CAAC,CAAC0E,IAAI,CAAC6H,UAAU,KAC7C,IAAI,CAAC1I,gBAAgB,CAAC,YAAY,CAAC,CAACa,IAAI,CAAC6H,UAAU,IACrD,IAAI,CAACvM,YAAY,CAAC,YAAY,CAAC,CAAC0E,IAAI,CAAC6H,UAAU,KAAK,CAAC,EACrD;cACAX,oBAAW,CAACC,MAAM,CAACC,IAAI,wEAErB,IAAI,CAAC9L,YAAY,CAAC,YAAY,CAAC,CAAC0E,IAAI,CAAC6H,UACvC,CAAC;YACH;UACF;UAEA,IAAI,CAACR,mBAAmB,CAAC,OAAO,EAAEL,cAAa,CAACa,UAAU,EAAEd,aAAY,CAACc,UAAU,EAAE,IAAI,CAAC;QAC5F;QAEA,IAAI,IAAI,CAAC1H,kBAAkB,CAAC0G,QAAQ,CAACiB,YAAY,EAAE;UACjD;UACA,IAAMP,uBAAsB,GAAGpB,qBAAqB,CAAC,YAAY,EAAE,sBAAsB,CAAC;UAC1F,IAAMqB,wBAAuB,GAAGb,sBAAsB,CACpD,YAAY,EACZ,sBACF,CAAC;UACD,IAAMoB,qBAAqB,GAAG5B,qBAAqB,CAAC,YAAY,EAAE,gBAAgB,CAAC;UACnF,IAAM6B,sBAAsB,GAAGrB,sBAAsB,CAAC,YAAY,EAAE,gBAAgB,CAAC;UACrF,IAAMsB,oBAAoB,GAAG9B,qBAAqB,CAAC,YAAY,EAAE,eAAe,CAAC;UACjF,IAAM+B,qBAAqB,GAAGvB,sBAAsB,CAAC,YAAY,EAAE,eAAe,CAAC;UACnF,IAAMwB,oBAAoB,GAAGhC,qBAAqB,CAAC,YAAY,EAAE,eAAe,CAAC;UACjF,IAAMiC,qBAAqB,GAAGzB,sBAAsB,CAAC,YAAY,EAAE,eAAe,CAAC;UAEnF,IAAIY,uBAAsB,KAAKC,wBAAuB,IAAID,uBAAsB,KAAK,CAAC,EAAE;YACtFL,oBAAW,CAACC,MAAM,CAACC,IAAI,iFAErBG,uBACF,CAAC;UACH,CAAC,MAAM;YACL,IAAIQ,qBAAqB,KAAKC,sBAAsB,IAAID,qBAAqB,KAAK,CAAC,EAAE;cACnFb,oBAAW,CAACC,MAAM,CAACC,IAAI,4EAErBW,qBACF,CAAC;YACH;YAEA,IAAIE,oBAAoB,KAAKC,qBAAqB,IAAID,oBAAoB,KAAK,CAAC,EAAE;cAChFf,oBAAW,CAACC,MAAM,CAACC,IAAI,2EAErBa,oBACF,CAAC;YACH;YAEA,IAAIE,oBAAoB,GAAGC,qBAAqB,GAAG,EAAE,EAAE;cACrDlB,oBAAW,CAACC,MAAM,CAACC,IAAI,oFAErBe,oBAAoB,GAAGC,qBACzB,CAAC;YACH;UACF;UAEA,IAAI,CAACf,mBAAmB,CAAC,OAAO,EAAEa,qBAAqB,EAAED,oBAAoB,EAAE,KAAK,CAAC;QACvF;QAEA,IAAI,IAAI,CAAC9H,kBAAkB,CAAC0G,QAAQ,CAACwB,SAAS,IAAI,IAAI,CAAClJ,gBAAgB,CAAC,kBAAkB,CAAC,EAAE;UAC3F;;UAEA,IAAM4H,cAAY,GAAG,IAAI,CAACzL,YAAY,CAAC,kBAAkB,CAAC,CAAC0E,IAAI;UAC/D,IAAMgH,eAAa,GAAG,IAAI,CAAC7H,gBAAgB,CAAC,kBAAkB,CAAC,CAACa,IAAI;UAEpE,IACE+G,cAAY,CAACE,gBAAgB,KAAKD,eAAa,CAACC,gBAAgB,IAChEF,cAAY,CAACE,gBAAgB,KAAK,CAAC,EACnC;YACAC,oBAAW,CAACC,MAAM,CAACC,IAAI,6EAErBL,cAAY,CAACE,gBACf,CAAC;UACH,CAAC,MAAM;YACL,IACEF,cAAY,CAACa,aAAa,KAAKZ,eAAa,CAACY,aAAa,IAC1Db,cAAY,CAACa,aAAa,KAAK,CAAC,EAChC;cACAV,oBAAW,CAACC,MAAM,CAACC,IAAI,mFAErBL,cAAY,CAACa,aACf,CAAC;YACH;YAEA,IACE,IAAI,CAACtM,YAAY,CAAC,kBAAkB,CAAC,CAAC0E,IAAI,CAAC6H,UAAU,KACnD,IAAI,CAAC1I,gBAAgB,CAAC,kBAAkB,CAAC,CAACa,IAAI,CAAC6H,UAAU,IAC3D,IAAI,CAACvM,YAAY,CAAC,kBAAkB,CAAC,CAAC0E,IAAI,CAAC6H,UAAU,KAAK,CAAC,EAC3D;cACAX,oBAAW,CAACC,MAAM,CAACC,IAAI,wEAErB,IAAI,CAAC9L,YAAY,CAAC,kBAAkB,CAAC,CAAC0E,IAAI,CAAC6H,UAC7C,CAAC;YACH;UACF;QACF;QAEA,IAAI,IAAI,CAAC1H,kBAAkB,CAAC0G,QAAQ,CAACwB,SAAS,EAAE;UAC9C;UACA;UACA,IAAMd,wBAAsB,GAAGpB,qBAAqB,CAClD,kBAAkB,EAClB,sBACF,CAAC;UACD,IAAMqB,yBAAuB,GAAGb,sBAAsB,CACpD,kBAAkB,EAClB,sBACF,CAAC;UACD,IAAMoB,sBAAqB,GAAG5B,qBAAqB,CAAC,kBAAkB,EAAE,gBAAgB,CAAC;UACzF,IAAM6B,uBAAsB,GAAGrB,sBAAsB,CAAC,kBAAkB,EAAE,gBAAgB,CAAC;UAC3F,IAAMsB,qBAAoB,GAAG9B,qBAAqB,CAAC,kBAAkB,EAAE,eAAe,CAAC;UACvF,IAAM+B,sBAAqB,GAAGvB,sBAAsB,CAAC,kBAAkB,EAAE,eAAe,CAAC;UACzF,IAAMwB,qBAAoB,GAAGhC,qBAAqB,CAAC,kBAAkB,EAAE,eAAe,CAAC;UACvF,IAAMiC,sBAAqB,GAAGzB,sBAAsB,CAAC,kBAAkB,EAAE,eAAe,CAAC;UAEzF,IAAIY,wBAAsB,KAAKC,yBAAuB,IAAID,wBAAsB,KAAK,CAAC,EAAE;YACtFL,oBAAW,CAACC,MAAM,CAACC,IAAI,iFAErBG,wBACF,CAAC;UACH,CAAC,MAAM;YACL,IAAIQ,sBAAqB,KAAKC,uBAAsB,IAAID,sBAAqB,KAAK,CAAC,EAAE;cACnFb,oBAAW,CAACC,MAAM,CAACC,IAAI,4EAErBW,sBACF,CAAC;YACH;YAEA,IAAIE,qBAAoB,KAAKC,sBAAqB,IAAID,qBAAoB,KAAK,CAAC,EAAE;cAChFf,oBAAW,CAACC,MAAM,CAACC,IAAI,2EAErBa,qBACF,CAAC;YACH;YAEA,IAAIE,qBAAoB,GAAGC,sBAAqB,GAAG,EAAE,EAAE;cACrDlB,oBAAW,CAACC,MAAM,CAACC,IAAI,oFAErBe,qBAAoB,GAAGC,sBACzB,CAAC;YACH;UACF;;UAEA;UACA;UACA;QACF;MACF;IACF;;IAEA;AACF;AACA;AACA;AACA;AACA;AACA;EANE;IAAA5I,GAAA;IAAAC,KAAA,EAOA,SAAAoE,iBAAA,EAA2B;MAAA,IAAAyE,MAAA;MACzB,IAAI,CAAC,IAAI,CAAC7E,eAAe,EAAE;QACzB,OAAOW,QAAA,CAAAzL,OAAA,CAAQ0L,OAAO,CAAC,CAAC;MAC1B;MAEA,IACE,IAAI,CAACZ,eAAe,IACpB,IAAI,CAACA,eAAe,CAAC8E,kBAAkB,CAAC,CAAC,KAAKC,kCAAe,CAACC,MAAM,EACpE;QACAvB,oBAAW,CAACC,MAAM,CAACuB,KAAK,CACtB,8EACF,CAAC;QAED,OAAOtE,QAAA,CAAAzL,OAAA,CAAQ0L,OAAO,CAAC,CAAC;MAC1B;MAEA6C,oBAAW,CAACC,MAAM,CAACuB,KAAK,CAAC,2DAA2D,CAAC;MAErF,OAAO,IAAI,CAACjF,eAAe,CAACkF,mBAAmB,CAAC,CAAC,CAAC7E,IAAI,CAAC,UAAC8E,gBAAgB,EAAK;QAC3EA,gBAAgB,CAACC,KAAK,CAACC,SAAS,CAACjJ,OAAO,CAAC,UAACkJ,QAAQ,EAAEC,CAAC;UAAA,OACnDV,MAAI,CAACrD,6BAA6B,CAAC8D,QAAQ,gBAAA/M,MAAA,CAAgBgN,CAAC,GAAI,KAAK,CAAC;QAAA,CACxE,CAAC;QACDJ,gBAAgB,CAACK,KAAK,CAACH,SAAS,CAACjJ,OAAO,CAAC,UAACkJ,QAAQ,EAAEC,CAAC;UAAA,OACnDV,MAAI,CAACrD,6BAA6B,CAAC8D,QAAQ,gBAAA/M,MAAA,CAAgBgN,CAAC,GAAI,KAAK,CAAC;QAAA,CACxE,CAAC;QACDJ,gBAAgB,CAACM,gBAAgB,CAACJ,SAAS,CAACjJ,OAAO,CAAC,UAACkJ,QAAQ,EAAEC,CAAC;UAAA,OAC9DV,MAAI,CAACrD,6BAA6B,CAAC8D,QAAQ,sBAAA/M,MAAA,CAAsBgN,CAAC,GAAI,KAAK,CAAC;QAAA,CAC9E,CAAC;QACDJ,gBAAgB,CAACO,gBAAgB,CAACL,SAAS,CAACjJ,OAAO,CAAC,UAACkJ,QAAQ,EAAEC,CAAC;UAAA,OAC9DV,MAAI,CAACrD,6BAA6B,CAAC8D,QAAQ,sBAAA/M,MAAA,CAAsBgN,CAAC,GAAI,KAAK,CAAC;QAAA,CAC9E,CAAC;QAEDJ,gBAAgB,CAACC,KAAK,CAACO,OAAO,CAACvJ,OAAO,CAAC,UAACwJ,MAAM,EAAEL,CAAC,EAAK;UACpD,IAAIA,CAAC,GAAG,CAAC,EAAE;YACT,MAAM,IAAIjN,KAAK,CAAC,mDAAmD,CAAC;UACtE;UACAuM,MAAI,CAACrD,6BAA6B,CAACoE,MAAM,EAAE,YAAY,EAAE,IAAI,CAAC;QAChE,CAAC,CAAC;QACFT,gBAAgB,CAACK,KAAK,CAACG,OAAO,CAACvJ,OAAO,CAAC,UAACwJ,MAAM,EAAEL,CAAC,EAAK;UACpD,IAAIA,CAAC,GAAG,CAAC,EAAE;YACT,MAAM,IAAIjN,KAAK,CAAC,mDAAmD,CAAC;UACtE;UACAuM,MAAI,CAACrD,6BAA6B,CAACoE,MAAM,EAAE,YAAY,EAAE,IAAI,CAAC;QAChE,CAAC,CAAC;QACFT,gBAAgB,CAACM,gBAAgB,CAACE,OAAO,CAACvJ,OAAO,CAAC,UAACwJ,MAAM,EAAEL,CAAC,EAAK;UAC/D,IAAIA,CAAC,GAAG,CAAC,EAAE;YACT,MAAM,IAAIjN,KAAK,CAAC,mDAAmD,CAAC;UACtE;UACAuM,MAAI,CAACrD,6BAA6B,CAACoE,MAAM,EAAE,kBAAkB,EAAE,IAAI,CAAC;QACtE,CAAC,CAAC;QACFT,gBAAgB,CAACO,gBAAgB,CAACC,OAAO,CAACvJ,OAAO,CAAC,UAACwJ,MAAM,EAAEL,CAAC,EAAK;UAC/D,IAAIA,CAAC,GAAG,CAAC,EAAE;YACT,MAAM,IAAIjN,KAAK,CAAC,mDAAmD,CAAC;UACtE;UACAuM,MAAI,CAACrD,6BAA6B,CAACoE,MAAM,EAAE,kBAAkB,EAAE,IAAI,CAAC;QACtE,CAAC,CAAC;QAEFf,MAAI,CAACrC,sBAAsB,CAAC,CAAC;;QAE7B;QACA;QACAqC,MAAI,CAACnJ,gBAAgB,GAAGmK,IAAI,CAACC,KAAK,CAAC,IAAAC,UAAA,CAAA7Q,OAAA,EAAe2P,MAAI,CAAChN,YAAY,CAAC,CAAC;QAErE4L,oBAAW,CAACC,MAAM,CAACuB,KAAK,CACtB,oEACF,CAAC;MACH,CAAC,CAAC;IACJ;;IAEA;AACF;AACA;AACA;AACA;AACA;AACA;EANE;IAAAlJ,GAAA;IAAAC,KAAA,EAOA,SAAAmF,yBAAiChM,MAAW,EAAE+C,SAAc,EAAE;MAC5D,IAAM8N,YAAY,GAAG3L,gBAAK,CAACC,cAAc;MAEzC,IAAInF,MAAM,CAAC0B,SAAS,EAAE;QACpB,IAAMoP,SAAS,GAAG,CAAC;QAEnB,IAAI9Q,MAAM,CAAC+Q,UAAU,IAAI/Q,MAAM,CAACgR,WAAW,EAAE;UAC3C,IAAI,CAACtO,YAAY,CAACK,SAAS,CAAC,CAAC8N,YAAY,CAAC,CAACI,KAAK,GAAGjR,MAAM,CAAC+Q,UAAU;UACpE,IAAI,CAACrO,YAAY,CAACK,SAAS,CAAC,CAAC8N,YAAY,CAAC,CAACK,MAAM,GAAGlR,MAAM,CAACgR,WAAW;UACtE,IAAI,CAACtO,YAAY,CAACK,SAAS,CAAC,CAAC8N,YAAY,CAAC,CAAC5B,UAAU,GAAGjP,MAAM,CAACiP,UAAU;UACzE,IAAI,CAACvM,YAAY,CAACK,SAAS,CAAC,CAAC8N,YAAY,CAAC,CAACM,cAAc,GAAGnR,MAAM,CAACmR,cAAc;QACnF;QAEA,IAAI,CAACzO,YAAY,CAACK,SAAS,CAAC,CAAC8N,YAAY,CAAC,CAACpP,kBAAkB,GAAGqP,SAAS,CAACM,OAAO,CAAC,CAAC,CAAC;QAEpF,IAAI,CAAC1O,YAAY,CAACK,SAAS,CAAC,CAAC8N,YAAY,CAAC,CAAC7B,aAAa,GAAGhP,MAAM,CAACgP,aAAa;QAC/E,IAAI,CAACtM,YAAY,CAACK,SAAS,CAAC,CAAC8N,YAAY,CAAC,CAACQ,gBAAgB,GAAGrR,MAAM,CAACqR,gBAAgB;QACrF,IAAI,CAAC3O,YAAY,CAACK,SAAS,CAAC,CAAC8N,YAAY,CAAC,CAACS,WAAW,GAAGtR,MAAM,CAACsR,WAAW;;QAE3E;;QAEA,IAAI,CAAC5O,YAAY,CAACK,SAAS,CAAC,CAAC8N,YAAY,CAAC,CAACU,qBAAqB,GAAGvR,MAAM,CAACqR,gBAAgB;QAC1F,IAAI,CAAC3O,YAAY,CAACK,SAAS,CAAC,CAAC8N,YAAY,CAAC,CAACW,cAAc,GAAGxR,MAAM,CAACyR,SAAS;QAC5E,IAAI,CAAC/O,YAAY,CAACK,SAAS,CAAC,CAAC8N,YAAY,CAAC,CAACa,aAAa,GAAG1R,MAAM,CAAC2R,QAAQ;QAC1E,IAAI,CAACjP,YAAY,CAACK,SAAS,CAAC,CAAC8N,YAAY,CAAC,CAACxC,gBAAgB,GAAGrO,MAAM,CAACsR,WAAW;QAChF,IAAI,CAAC5O,YAAY,CAACK,SAAS,CAAC,CAAC8N,YAAY,CAAC,CAACe,aAAa,GAAG5R,MAAM,CAAC6R,QAAQ;QAC1E,IAAI,CAACnP,YAAY,CAACK,SAAS,CAAC,CAAC8N,YAAY,CAAC,CAAC5B,UAAU,GAAGjP,MAAM,CAACiP,UAAU;QACzE,IAAI,CAACvM,YAAY,CAACK,SAAS,CAAC,CAAC8N,YAAY,CAAC,CAAC7B,aAAa,GAAGhP,MAAM,CAACgP,aAAa;QAC/E,IAAI,CAACtM,YAAY,CAACK,SAAS,CAAC,CAAC8N,YAAY,CAAC,CAACiB,qBAAqB,GAC9D9R,MAAM,CAAC8R,qBAAqB;QAC9B,IAAI,CAACpP,YAAY,CAACK,SAAS,CAAC,CAAC8N,YAAY,CAAC,CAACkB,uBAAuB,GAChE/R,MAAM,CAAC+R,uBAAuB;QAChC,IAAI,CAACrP,YAAY,CAACK,SAAS,CAAC,CAAC8N,YAAY,CAAC,CAACmB,kCAAkC,GAC3EhS,MAAM,CAACgS,kCAAkC;QAC3C,IAAI,CAACtP,YAAY,CAACK,SAAS,CAAC,CAAC8N,YAAY,CAAC,CAACoB,wBAAwB,GACjEjS,MAAM,CAACiS,wBAAwB;QACjC,IAAI,CAACvP,YAAY,CAACK,SAAS,CAAC,CAAC8N,YAAY,CAAC,CAACqB,cAAc,GAAGlS,MAAM,CAAC0B,SAAS;QAC5E,IAAI,CAACgB,YAAY,CAACK,SAAS,CAAC,CAAC8N,YAAY,CAAC,CAACsB,eAAe,GAAGnS,MAAM,CAACmS,eAAe;QACnF,IAAI,CAACzP,YAAY,CAACK,SAAS,CAAC,CAAC8N,YAAY,CAAC,CAACuB,sBAAsB,GAC/DpS,MAAM,CAACoS,sBAAsB;MACjC;IACF;;IAEA;AACF;AACA;AACA;AACA;AACA;AACA;EANE;IAAAxL,GAAA;IAAAC,KAAA,EAOA,SAAAoF,wBAAgCjM,MAAW,EAAE+C,SAAc,EAAE;MAC3D,IAAM8N,YAAY,GAAG3L,gBAAK,CAACE,iBAAiB;MAE5C,IAAIpF,MAAM,CAAC8B,aAAa,EAAE;QACxB,IAAIgP,SAAS,GAAG,CAAC;QACjB,IAAMuB,WAAW,GAAG,IAAI,CAAC/P,mBAAmB,CAACtC,MAAM,CAACsS,IAAI,CAAC;QACzD,IAAMC,WAAW,GAAGF,WAAW,aAAXA,WAAW,uBAAXA,WAAW,CAAEE,WAAW;QAC5C,IAAMC,QAAQ,GAAGH,WAAW,YAAAjP,MAAA,CAChBiP,WAAW,CAAC1N,EAAE,IAAI,EAAE,QAAAvB,MAAA,CAAIiP,WAAW,CAACpF,GAAG,gBAAA7J,MAAA,CAAgBiP,WAAW,CAACpF,GAAG,IAAK,EAAE,IACrF,EAAE;QAEN,IAAIjN,MAAM,CAAC+Q,UAAU,IAAI/Q,MAAM,CAACgR,WAAW,EAAE;UAC3C,IAAI,CAACtO,YAAY,CAACK,SAAS,CAAC,CAAC8N,YAAY,CAAC,CAACI,KAAK,GAAGjR,MAAM,CAAC+Q,UAAU;UACpE,IAAI,CAACrO,YAAY,CAACK,SAAS,CAAC,CAAC8N,YAAY,CAAC,CAACK,MAAM,GAAGlR,MAAM,CAACgR,WAAW;UACtE,IAAI,CAACtO,YAAY,CAACK,SAAS,CAAC,CAAC8N,YAAY,CAAC,CAAC4B,cAAc,GAAGzS,MAAM,CAACyS,cAAc;QACnF;QAEA,IAAMC,KAAK,GACT1S,MAAM,CAAC8B,aAAa,GAAG,IAAI,CAACY,YAAY,CAACK,SAAS,CAAC,CAAC8N,YAAY,CAAC,CAAC8B,kBAAkB;QAEtF7B,SAAS,GAAG4B,KAAK,GAAG,IAAI;QACxB,IAAI,CAAChQ,YAAY,CAACK,SAAS,CAAC,CAAC8N,YAAY,CAAC,CAACpP,kBAAkB,GAAGqP,SAAS,CAACM,OAAO,CAAC,CAAC,CAAC;QAEpF,IAAIwB,kBAAkB,GACpB5S,MAAM,CAAC6S,WAAW,GAAG,IAAI,CAACnQ,YAAY,CAACK,SAAS,CAAC,CAAC8N,YAAY,CAAC,CAACiC,gBAAgB;QAClF,IAAIF,kBAAkB,GAAG,CAAC,EAAE;UAC1BA,kBAAkB,GAAG,CAAC;QACxB;QAEA,IAAMjE,sBAAsB,GAC1B3O,MAAM,CAAC+S,eAAe,GAAG,IAAI,CAACrQ,YAAY,CAACK,SAAS,CAAC,CAAC8N,YAAY,CAAC,CAACmC,oBAAoB;QAC1F,IAAI,CAACtQ,YAAY,CAACK,SAAS,CAAC,CAAC8N,YAAY,CAAC,CAACmC,oBAAoB,GAAGhT,MAAM,CAAC+S,eAAe;QAExF,IAAIpE,sBAAsB,KAAK,CAAC,EAAE;UAChC,IAAI0D,WAAW,IAAIE,WAAW,KAAK,MAAM,EAAE;YACzCjE,oBAAW,CAACC,MAAM,CAACC,IAAI,yFAAApL,MAAA,CACmEoP,QAAQ,yCAChGxS,MAAM,CAAC+S,eACT,CAAC;UACH;QACF;;QAEA;QACA,IAAI,CAACrQ,YAAY,CAACK,SAAS,CAAC,CAAC8N,YAAY,CAAC,CAACoC,sBAAsB,GAC/DL,kBAAkB,GAAG,CAAC,GAClBA,kBAAkB,IAAIjE,sBAAsB,GAAGiE,kBAAkB,CAAC,GAClE,CAAC;QACP,IAAI,IAAI,CAAClQ,YAAY,CAACK,SAAS,CAAC,CAAC8N,YAAY,CAAC,CAACoC,sBAAsB,GAAG,CAAC,EAAE;UACzE3E,oBAAW,CAACC,MAAM,CAACC,IAAI,qGAAApL,MAAA,CAC+EoP,QAAQ,GAC5G,IAAI,CAAC9P,YAAY,CAACK,SAAS,CAAC,CAAC8N,YAAY,CAAC,CAACoC,sBAC7C,CAAC;QACH;;QAEA;;QAEA,IAAIjT,MAAM,CAAC6S,WAAW,EAAE;UACtB,IAAI,CAACnQ,YAAY,CAACK,SAAS,CAAC,CAAC8N,YAAY,CAAC,CAACiC,gBAAgB,GACzD9S,MAAM,CAAC6S,WAAW,GAAG,CAAC,GAAG7S,MAAM,CAAC6S,WAAW,GAAG,CAAC7S,MAAM,CAAC6S,WAAW;QACrE,CAAC,MAAM;UACL,IAAI,CAACnQ,YAAY,CAACK,SAAS,CAAC,CAAC8N,YAAY,CAAC,CAACiC,gBAAgB,GAAG,CAAC;QACjE;QAEA,IAAI,CAACpQ,YAAY,CAACK,SAAS,CAAC,CAAC8N,YAAY,CAAC,CAACqC,2BAA2B,GACpElT,MAAM,CAACkT,2BAA2B;;QAEpC;QACA,IAAI,CAACxQ,YAAY,CAACK,SAAS,CAAC,CAAC8N,YAAY,CAAC,CAACW,cAAc,GAAGxR,MAAM,CAACyR,SAAS;QAC5E,IAAI,CAAC/O,YAAY,CAACK,SAAS,CAAC,CAAC8N,YAAY,CAAC,CAACa,aAAa,GAAG1R,MAAM,CAAC2R,QAAQ;QAC1E,IAAI,CAACjP,YAAY,CAACK,SAAS,CAAC,CAAC8N,YAAY,CAAC,CAACsC,aAAa,GAAGnT,MAAM,CAACmT,aAAa;QAC/E,IAAI,CAACzQ,YAAY,CAACK,SAAS,CAAC,CAAC8N,YAAY,CAAC,CAACuC,gBAAgB,GAAGpT,MAAM,CAACoT,gBAAgB;QAErF,IAAI,CAAC1Q,YAAY,CAACK,SAAS,CAAC,CAAC8N,YAAY,CAAC,CAACwC,qBAAqB,GAC9DrT,MAAM,CAACqT,qBAAqB;QAC9B,IAAI,CAAC3Q,YAAY,CAACK,SAAS,CAAC,CAAC8N,YAAY,CAAC,CAACmC,oBAAoB,GAAGhT,MAAM,CAAC+S,eAAe;QAExF,IAAI,CAACrQ,YAAY,CAACK,SAAS,CAAC,CAAC8N,YAAY,CAAC,CAACyC,mBAAmB,GAAGtT,MAAM,CAACsT,mBAAmB;QAC3F,IAAI,CAAC5Q,YAAY,CAACK,SAAS,CAAC,CAAC8N,YAAY,CAAC,CAAC0C,kBAAkB,GAAGvT,MAAM,CAACuT,kBAAkB;QACzF,IAAI,CAAC7Q,YAAY,CAACK,SAAS,CAAC,CAAC8N,YAAY,CAAC,CAAC8B,kBAAkB,GAAG3S,MAAM,CAAC8B,aAAa;QACpF,IAAI,CAACY,YAAY,CAACK,SAAS,CAAC,CAAC8N,YAAY,CAAC,CAAC2C,mBAAmB,GAAGxT,MAAM,CAACwT,mBAAmB;QAE3F,IAAI,CAAC9Q,YAAY,CAACK,SAAS,CAAC,CAAC8N,YAAY,CAAC,CAAC9O,aAAa,CAAC6G,IAAI,CAAC5I,MAAM,CAACyT,MAAM,CAAC;;QAE5E;;QAEA,IAAI,CAAC/Q,YAAY,CAACK,SAAS,CAAC,CAAC8N,YAAY,CAAC,CAAC1D,UAAU,GAAGnN,MAAM,CAACmN,UAAU;QACzE,IAAI,CAACzK,YAAY,CAACK,SAAS,CAAC,CAAC8N,YAAY,CAAC,CAACzD,gBAAgB,GAAGpN,MAAM,CAACoN,gBAAgB;QACrF,IAAI,CAAC1K,YAAY,CAACK,SAAS,CAAC,CAAC8N,YAAY,CAAC,CAAC6C,oBAAoB,GAC7D1T,MAAM,CAAC0T,oBAAoB,IAAI,CAAC;QAClC,IAAI,CAAChR,YAAY,CAACK,SAAS,CAAC,CAAC8N,YAAY,CAAC,CAAC8C,mBAAmB,GAC5D3T,MAAM,CAAC2T,mBAAmB,IAAI,CAAC;QACjC,IAAI,CAACjR,YAAY,CAACK,SAAS,CAAC,CAAC8N,YAAY,CAAC,CAAC+C,gBAAgB,GAAG5T,MAAM,CAAC4T,gBAAgB,IAAI,CAAC;MAC5F;IACF;EAAC;IAAAhN,GAAA;IAAAC,KAAA;IAyGD;AACF;AACA;AACA;AACA;AACA;AACA;AACA;IACE,SAAAqF,uBAAuBlM,MAAM,EAAE6D,IAAI,EAAE;MACnC;MACA,IAAI,CAACA,IAAI,IAAI,CAAC,IAAI,CAACnB,YAAY,CAACmB,IAAI,CAAC,CAACuD,IAAI,EAAE;QAC1C;MACF;MAEA,IAAMrE,SAAS,GAAGc,IAAI;MAEtB,IAAMgQ,iBAAiB,GACrB7T,MAAM,CAAC6S,WAAW,GAAG,IAAI,CAACnQ,YAAY,CAACK,SAAS,CAAC,CAACqE,IAAI,CAAC0M,0BAA0B;MAEnF,IAAI,CAACpR,YAAY,CAACK,SAAS,CAAC,CAACqE,IAAI,CAAC2M,qBAAqB,GAAGF,iBAAiB;MAC3E,IAAI,CAACnR,YAAY,CAACK,SAAS,CAAC,CAACqE,IAAI,CAAC0M,0BAA0B,GAAG9T,MAAM,CAAC6S,WAAW;MAEjF,IAAI,CAACnQ,YAAY,CAACK,SAAS,CAAC,CAACqE,IAAI,CAACzF,gBAAgB,CAACiH,IAAI,CAAC5I,MAAM,CAACyT,MAAM,CAAC;MACtE,IAAI,CAAC/Q,YAAY,CAACK,SAAS,CAAC,CAACqE,IAAI,CAACxF,iBAAiB,CAACgH,IAAI,CAAC5I,MAAM,CAACgU,aAAa,CAAC;MAE9E,IAAI,CAACtR,YAAY,CAACK,SAAS,CAAC,CAACqE,IAAI,CAACrB,SAAS,GAAG/F,MAAM,CAAC+F,SAAS;MAC9D,IAAI,CAACrD,YAAY,CAACK,SAAS,CAAC,CAACqE,IAAI,CAACkL,IAAI,GAAGtS,MAAM,CAACsS,IAAI;MACpD,IAAI,CAAC5P,YAAY,CAACK,SAAS,CAAC,CAACqE,IAAI,CAAC6M,eAAe,GAAGjU,MAAM,CAACiU,eAAe;;MAE1E;MACA,IAAI,CAACvR,YAAY,CAACK,SAAS,CAAC,CAACqE,IAAI,CAAC8M,sBAAsB,GACtD,IAAI,CAACxR,YAAY,CAACK,SAAS,CAAC,CAACqE,IAAI,CAAC0M,0BAA0B,GAAG,CAAC,GAC5D,IAAI,CAACpR,YAAY,CAACK,SAAS,CAAC,CAACqE,IAAI,CAAC0M,0BAA0B,GAC5D,IAAI,CAACpR,YAAY,CAACK,SAAS,CAAC,CAACqE,IAAI,CAACiH,gBAAgB,GAClD,CAAC;MACP,IAAI,CAAC3L,YAAY,CAACK,SAAS,CAAC,CAACqE,IAAI,CAAC6L,sBAAsB,GACtD,IAAI,CAACvQ,YAAY,CAACK,SAAS,CAAC,CAACqE,IAAI,CAAC2M,qBAAqB,GAAG,CAAC,GACtD,IAAI,CAACrR,YAAY,CAACK,SAAS,CAAC,CAACqE,IAAI,CAAC2M,qBAAqB,GAAG,GAAG,IAC7D,IAAI,CAACrR,YAAY,CAACK,SAAS,CAAC,CAACqE,IAAI,CAACkK,WAAW,GAC5C,IAAI,CAAC5O,YAAY,CAACK,SAAS,CAAC,CAACqE,IAAI,CAAC2M,qBAAqB,CAAC,GAC1D,CAAC;MAEP,IACE,IAAI,CAACrR,YAAY,CAACK,SAAS,CAAC,CAACqE,IAAI,CAAC5F,kBAAkB,GACpD,IAAI,CAACkB,YAAY,CAACK,SAAS,CAAC,CAACqE,IAAI,CAAC6L,sBAAsB,EACxD;QACA,IAAI,CAACvQ,YAAY,CAACK,SAAS,CAAC,CAACqE,IAAI,CAAC5F,kBAAkB,GAClD,IAAI,CAACkB,YAAY,CAACK,SAAS,CAAC,CAACqE,IAAI,CAAC6L,sBAAsB;MAC5D;MAEA,IAAIjT,MAAM,CAAC6D,IAAI,KAAK,oBAAoB,EAAE;QACxC,IAAI,CAACpB,qBAAqB,CAAC0R,6BAA6B,CAAC;UACvDpR,SAAS,EAATA,SAAS;UACTqR,gBAAgB,EAAEpU,MAAM;UACxBqU,yBAAyB,EAAE,IAAI,CAAC3R;QAClC,CAAC,CAAC;MACJ;IACF;EAAC;EAAA,OAAAV,aAAA;AAAA,EAtsCgCsS,oBAAW"}
|
|
1
|
+
{"version":3,"names":["_lodash","require","_internalMediaCore","_eventsScope","_interopRequireDefault","_constants","_config","_loggerProxy","_global","_mqaUtil","ownKeys","e","r","t","_Object$keys2","_Object$getOwnPropertySymbols","o","filter","_Object$getOwnPropertyDescriptor","enumerable","push","apply","_objectSpread","arguments","length","Object","forEach","_defineProperty2","default","_Object$getOwnPropertyDescriptors","_Object$defineProperties","_Object$defineProperty","_createSuper","Derived","hasNativeReflectConstruct","_isNativeReflectConstruct","_createSuperInternal","Super","_getPrototypeOf2","result","NewTarget","constructor","_Reflect$construct","_possibleConstructorReturn2","Reflect","sham","Proxy","Boolean","prototype","valueOf","call","EVENTS","exports","MEDIA_QUALITY","LOCAL_MEDIA_STARTED","LOCAL_MEDIA_STOPPED","REMOTE_MEDIA_STARTED","REMOTE_MEDIA_STOPPED","emptySender","trackLabel","maxPacketLossRatio","availableBandwidth","bytesSent","meanRemoteJitter","meanRoundTripTime","emptyReceiver","bytesReceived","meanRtpJitter","StatsAnalyzer","_EventsScope","_inherits2","_super","config","_this","receiveSlotCallback","undefined","networkQualityMonitor","statsResults","defaultStats","_classCallCheck2","_assertThisInitialized2","mediaType","previousValue","currentValue","isLocal","Error","concat","lastEmittedStartStopEvent","lastEmittedEvent","local","remote","newEvent","emit","file","function","type","successfulCandidatePairId","candidates","newIpAddress","isEmpty","localCandidate","candidateType","address","relayProtocol","relatedAddress","localIpAddress","isSender","isRemote","_this$successfulCandi","id","successfulCandidatePair","localCandidateId","transport","toUpperCase","protocol","sendRecvType","STATS","SEND_DIRECTION","RECEIVE_DIRECTION","ipType","REMOTE","LOCAL","ipAddress","ip","relatedPort","portNumber","port","networkType","priority","timestamp","time","connectionType","NETWORK_TYPE","VPN","UNKNOWN","totalRoundTripTime","statsStarted","lastStatsResults","correlationId","mqaSentCount","lastMqaDataSent","_createClass2","key","value","resetStatsResults","_this2","_keys","includes","recv","send","updateMediaStatus","status","_this$meetingMediaSta","_this$meetingMediaSta2","meetingMediaStatus","actual","expected","sendMqaData","_this3","newMqa","cloneDeep","emptyMqaInterval","audioSender","emptyAudioTransmit","audioShareSender","audioReceiver","emptyAudioReceive","audioShareReceiver","videoSender","emptyVideoTransmit","videoShareSender","videoReceiver","emptyVideoReceive","videoShareReceiver","getAudioSenderMqa","baseMediaType","audioTransmit","getAudioReceiverMqa","audioReceive","getVideoSenderMqa","videoTransmit","getVideoReceiverMqa","videoReceive","audioSenderStream","emptyAudioTransmitStream","getAudioSenderStreamMqa","streams","audioReceiverStream","emptyAudioReceiveStream","getAudioReceiverStreamMqa","videoSenderStream","emptyVideoTransmitStream","getVideoSenderStreamMqa","videoReceiverStream","emptyVideoReceiveStream","getVideoReceiverStreamMqa","intervalMetadata","peerReflexiveIP","peripherals","information","_UNKNOWN_","name","MEDIA_DEVICES","SPEAKER","MICROPHONE","CAMERA","intervalNumber","data","updateMediaConnection","mediaConnection","getLocalIpAddress","startAnalyzer","_this4","getStatsAndParse","then","statsInterval","setInterval","analyzerInterval","mqaInterval","MQA_INTERVAL","_promise","resolve","stopAnalyzer","_this5","sendOneLastMqa","clearInterval","parseGetStatsResult","getStatsResult","processOutboundRTPResult","processInboundRTPResult","compareSentAndReceived","parseCandidate","parseAudioSource","filterAndParseGetStatsResults","statsItem","_this6","types","DEFAULT_GET_STATS_FILTER","report","state","_this$successfulCandi2","_this$statsResults","direction","currentDirection","localTrackLabel","csi","extractAndSetLocalIpAddressInfoForDiagnostics","audioLevel","totalAudioEnergy","compareLastStatsResult","_this7","getCurrentStatsTotals","keyPrefix","startsWith","reduce","prev","cur","_this7$statsResults$c","getPreviousStatsTotals","_this7$lastStatsResul","currentStats","previousStats","sendAudio","totalPacketsSent","LoggerProxy","logger","info","emitStartStopEvents","currentAudioPacketsReceived","previousAudioPacketsReceived","sendVideo","framesEncoded","framesSent","currentVideoFramesDecoded","previousVideoFramesDecoded","sendShare","currentShareFramesDecoded","previousShareFramesDecoded","_this8","getConnectionState","ConnectionState","Failed","trace","getTransceiverStats","transceiverStats","video","receivers","receiver","i","audio","screenShareVideo","screenShareAudio","senders","sender","JSON","parse","_stringify","sendrecvType","kilobytes","frameWidth","frameHeight","width","height","hugeFramesSent","toFixed","keyFramesEncoded","packetsSent","totalKeyFramesEncoded","totalNackCount","nackCount","totalPliCount","pliCount","totalFirCount","firCount","encoderImplementation","qualityLimitationReason","qualityLimitationResolutionChanges","retransmittedPacketsSent","totalBytesSent","headerBytesSent","retransmittedBytesSent","receiveSlot","ssrc","sourceState","idAndCsi","bytes","totalBytesReceived","currentPacketsLost","packetsLost","totalPacketsLost","packetsReceivedDiff","packetsReceived","totalPacketsReceived","videoFramesReceivedDiff","framesReceived","videoFramesDecodedDiff","framesDecoded","videoFramesDroppedDiff","framesDropped","currentPacketLossRatio","lastPacketReceivedTimestamp","keyFramesDecoded","decoderImplementation","fecPacketsDiscarded","fecPacketsReceived","headerBytesReceived","jitter","totalSamplesReceived","totalSamplesDecoded","concealedSamples","currentPacketLoss","totalPacketsLostOnReceiver","packetsLostOnReceiver","roundTripTime","reportsReceived","overAllPacketLossRatio","determineUplinkNetworkQuality","remoteRtpResults","statsAnalyzerCurrentStats","EventsScope"],"sources":["index.ts"],"sourcesContent":["/* eslint-disable prefer-destructuring */\n\nimport {cloneDeep, isEmpty} from 'lodash';\nimport {ConnectionState} from '@webex/internal-media-core';\n\nimport EventsScope from '../common/events/events-scope';\nimport {\n DEFAULT_GET_STATS_FILTER,\n STATS,\n MQA_INTERVAL,\n NETWORK_TYPE,\n MEDIA_DEVICES,\n _UNKNOWN_,\n} from '../constants';\nimport {\n emptyAudioReceive,\n emptyAudioTransmit,\n emptyMqaInterval,\n emptyVideoReceive,\n emptyVideoTransmit,\n emptyAudioReceiveStream,\n emptyAudioTransmitStream,\n emptyVideoReceiveStream,\n emptyVideoTransmitStream,\n} from '../mediaQualityMetrics/config';\nimport LoggerProxy from '../common/logs/logger-proxy';\n\nimport defaultStats from './global';\nimport {\n getAudioSenderMqa,\n getAudioReceiverMqa,\n getVideoSenderMqa,\n getVideoReceiverMqa,\n getAudioSenderStreamMqa,\n getAudioReceiverStreamMqa,\n getVideoSenderStreamMqa,\n getVideoReceiverStreamMqa,\n} from './mqaUtil';\nimport {ReceiveSlot} from '../multistream/receiveSlot';\n\nexport const EVENTS = {\n MEDIA_QUALITY: 'MEDIA_QUALITY',\n LOCAL_MEDIA_STARTED: 'LOCAL_MEDIA_STARTED',\n LOCAL_MEDIA_STOPPED: 'LOCAL_MEDIA_STOPPED',\n REMOTE_MEDIA_STARTED: 'REMOTE_MEDIA_STARTED',\n REMOTE_MEDIA_STOPPED: 'REMOTE_MEDIA_STOPPED',\n};\n\nconst emptySender = {\n trackLabel: '',\n maxPacketLossRatio: 0,\n availableBandwidth: 0,\n bytesSent: 0,\n meanRemoteJitter: [],\n meanRoundTripTime: [],\n};\n\nconst emptyReceiver = {\n availableBandwidth: 0,\n bytesReceived: 0,\n meanRtpJitter: [],\n meanRoundTripTime: [],\n};\n\ntype ReceiveSlotCallback = (csi: number) => ReceiveSlot | undefined;\ntype MediaStatus = {\n actual?: any;\n expected?: any;\n};\n/**\n * Stats Analyzer class that will emit events based on detected quality\n *\n * @export\n * @class StatsAnalyzer\n * @extends {EventsScope}\n */\nexport class StatsAnalyzer extends EventsScope {\n config: any;\n correlationId: any;\n lastEmittedStartStopEvent: any;\n lastMqaDataSent: any;\n lastStatsResults: any;\n meetingMediaStatus: any;\n mqaInterval: NodeJS.Timeout;\n mqaSentCount: any;\n networkQualityMonitor: any;\n mediaConnection: any;\n statsInterval: NodeJS.Timeout;\n statsResults: any;\n statsStarted: any;\n successfulCandidatePair: any;\n localIpAddress: string; // Returns the local IP address for diagnostics. this is the local IP of the interface used for the current media connection a host can have many local Ip Addresses\n receiveSlotCallback: ReceiveSlotCallback;\n\n /**\n * Creates a new instance of StatsAnalyzer\n * @constructor\n * @public\n * @param {Object} config SDK Configuration Object\n * @param {Function} receiveSlotCallback Callback used to access receive slots.\n * @param {Object} networkQualityMonitor class for assessing network characteristics (jitter, packetLoss, latency)\n * @param {Object} statsResults Default properties for stats\n */\n constructor(\n config: any,\n receiveSlotCallback: ReceiveSlotCallback = () => undefined,\n networkQualityMonitor: object = {},\n statsResults: object = defaultStats\n ) {\n super();\n this.statsStarted = false;\n this.statsResults = statsResults;\n this.lastStatsResults = null;\n this.config = config;\n this.networkQualityMonitor = networkQualityMonitor;\n this.correlationId = config.correlationId;\n this.mqaSentCount = -1;\n this.lastMqaDataSent = {};\n this.lastEmittedStartStopEvent = {};\n this.receiveSlotCallback = receiveSlotCallback;\n this.successfulCandidatePair = {};\n this.localIpAddress = '';\n }\n\n /**\n * Resets cumulative stats arrays.\n *\n * @public\n * @memberof StatsAnalyzer\n * @returns {void}\n */\n resetStatsResults() {\n Object.keys(this.statsResults).forEach((mediaType) => {\n if (mediaType.includes('recv')) {\n this.statsResults[mediaType].recv.meanRtpJitter = [];\n }\n\n if (mediaType.includes('send')) {\n this.statsResults[mediaType].send.meanRemoteJitter = [];\n this.statsResults[mediaType].send.meanRoundTripTime = [];\n }\n });\n }\n\n /**\n * sets mediaStatus status for analyzing metrics\n *\n * @public\n * @param {Object} status for the audio and video\n * @memberof StatsAnalyzer\n * @returns {void}\n */\n public updateMediaStatus(status: MediaStatus) {\n this.meetingMediaStatus = {\n actual: {\n ...this.meetingMediaStatus?.actual,\n ...status?.actual,\n },\n expected: {\n ...this.meetingMediaStatus?.expected,\n ...status?.expected,\n },\n };\n }\n\n /**\n * captures MQA data from media connection\n *\n * @public\n * @memberof StatsAnalyzer\n * @returns {void}\n */\n sendMqaData() {\n const newMqa = cloneDeep(emptyMqaInterval);\n\n // Fill in empty stats items for lastMqaDataSent\n Object.keys(this.statsResults).forEach((mediaType) => {\n if (!this.lastMqaDataSent[mediaType]) {\n this.lastMqaDataSent[mediaType] = {};\n }\n\n if (!this.lastMqaDataSent[mediaType].send && mediaType.includes('-send')) {\n this.lastMqaDataSent[mediaType].send = {};\n }\n\n if (!this.lastMqaDataSent[mediaType].recv && mediaType.includes('-recv')) {\n this.lastMqaDataSent[mediaType].recv = {};\n }\n });\n\n // Create stats the first level, totals for senders and receivers\n const audioSender = cloneDeep(emptyAudioTransmit);\n const audioShareSender = cloneDeep(emptyAudioTransmit);\n const audioReceiver = cloneDeep(emptyAudioReceive);\n const audioShareReceiver = cloneDeep(emptyAudioReceive);\n const videoSender = cloneDeep(emptyVideoTransmit);\n const videoShareSender = cloneDeep(emptyVideoTransmit);\n const videoReceiver = cloneDeep(emptyVideoReceive);\n const videoShareReceiver = cloneDeep(emptyVideoReceive);\n\n getAudioSenderMqa({\n audioSender,\n statsResults: this.statsResults,\n lastMqaDataSent: this.lastMqaDataSent,\n baseMediaType: 'audio-send',\n });\n newMqa.audioTransmit.push(audioSender);\n\n getAudioSenderMqa({\n audioSender: audioShareSender,\n statsResults: this.statsResults,\n lastMqaDataSent: this.lastMqaDataSent,\n baseMediaType: 'audio-share-send',\n });\n newMqa.audioTransmit.push(audioShareSender);\n\n getAudioReceiverMqa({\n audioReceiver,\n statsResults: this.statsResults,\n lastMqaDataSent: this.lastMqaDataSent,\n baseMediaType: 'audio-recv',\n });\n newMqa.audioReceive.push(audioReceiver);\n\n getAudioReceiverMqa({\n audioReceiver: audioShareReceiver,\n statsResults: this.statsResults,\n lastMqaDataSent: this.lastMqaDataSent,\n baseMediaType: 'audio-share-recv',\n });\n newMqa.audioReceive.push(audioShareReceiver);\n\n getVideoSenderMqa({\n videoSender,\n statsResults: this.statsResults,\n lastMqaDataSent: this.lastMqaDataSent,\n baseMediaType: 'video-send',\n });\n newMqa.videoTransmit.push(videoSender);\n\n getVideoSenderMqa({\n videoSender: videoShareSender,\n statsResults: this.statsResults,\n lastMqaDataSent: this.lastMqaDataSent,\n baseMediaType: 'video-share-send',\n });\n newMqa.videoTransmit.push(videoShareSender);\n\n getVideoReceiverMqa({\n videoReceiver,\n statsResults: this.statsResults,\n lastMqaDataSent: this.lastMqaDataSent,\n baseMediaType: 'video-recv',\n });\n newMqa.videoReceive.push(videoReceiver);\n\n getVideoReceiverMqa({\n videoReceiver: videoShareReceiver,\n statsResults: this.statsResults,\n lastMqaDataSent: this.lastMqaDataSent,\n baseMediaType: 'video-share-recv',\n });\n newMqa.videoReceive.push(videoShareReceiver);\n\n // Add stats for individual streams\n Object.keys(this.statsResults).forEach((mediaType) => {\n if (mediaType.includes('audio-send')) {\n const audioSenderStream = cloneDeep(emptyAudioTransmitStream);\n\n getAudioSenderStreamMqa({\n audioSenderStream,\n statsResults: this.statsResults,\n lastMqaDataSent: this.lastMqaDataSent,\n mediaType,\n });\n newMqa.audioTransmit[0].streams.push(audioSenderStream);\n\n this.lastMqaDataSent[mediaType].send = cloneDeep(this.statsResults[mediaType].send);\n } else if (mediaType.includes('audio-share-send')) {\n const audioSenderStream = cloneDeep(emptyAudioTransmitStream);\n\n getAudioSenderStreamMqa({\n audioSenderStream,\n statsResults: this.statsResults,\n lastMqaDataSent: this.lastMqaDataSent,\n mediaType,\n });\n newMqa.audioTransmit[1].streams.push(audioSenderStream);\n\n this.lastMqaDataSent[mediaType].send = cloneDeep(this.statsResults[mediaType].send);\n } else if (mediaType.includes('audio-recv')) {\n const audioReceiverStream = cloneDeep(emptyAudioReceiveStream);\n\n getAudioReceiverStreamMqa({\n audioReceiverStream,\n statsResults: this.statsResults,\n lastMqaDataSent: this.lastMqaDataSent,\n mediaType,\n });\n newMqa.audioReceive[0].streams.push(audioReceiverStream);\n\n this.lastMqaDataSent[mediaType].recv = cloneDeep(this.statsResults[mediaType].recv);\n } else if (mediaType.includes('audio-share-recv')) {\n const audioReceiverStream = cloneDeep(emptyAudioReceiveStream);\n\n getAudioReceiverStreamMqa({\n audioReceiverStream,\n statsResults: this.statsResults,\n lastMqaDataSent: this.lastMqaDataSent,\n mediaType,\n });\n newMqa.audioReceive[1].streams.push(audioReceiverStream);\n\n this.lastMqaDataSent[mediaType].recv = cloneDeep(this.statsResults[mediaType].recv);\n } else if (mediaType.includes('video-send')) {\n const videoSenderStream = cloneDeep(emptyVideoTransmitStream);\n\n getVideoSenderStreamMqa({\n videoSenderStream,\n statsResults: this.statsResults,\n lastMqaDataSent: this.lastMqaDataSent,\n mediaType,\n });\n newMqa.videoTransmit[0].streams.push(videoSenderStream);\n\n this.lastMqaDataSent[mediaType].send = cloneDeep(this.statsResults[mediaType].send);\n } else if (mediaType.includes('video-share-send')) {\n const videoSenderStream = cloneDeep(emptyVideoTransmitStream);\n\n getVideoSenderStreamMqa({\n videoSenderStream,\n statsResults: this.statsResults,\n lastMqaDataSent: this.lastMqaDataSent,\n mediaType,\n });\n newMqa.videoTransmit[1].streams.push(videoSenderStream);\n\n this.lastMqaDataSent[mediaType].send = cloneDeep(this.statsResults[mediaType].send);\n } else if (mediaType.includes('video-recv')) {\n const videoReceiverStream = cloneDeep(emptyVideoReceiveStream);\n\n getVideoReceiverStreamMqa({\n videoReceiverStream,\n statsResults: this.statsResults,\n lastMqaDataSent: this.lastMqaDataSent,\n mediaType,\n });\n newMqa.videoReceive[0].streams.push(videoReceiverStream);\n\n this.lastMqaDataSent[mediaType].recv = cloneDeep(this.statsResults[mediaType].recv);\n } else if (mediaType.includes('video-share-recv')) {\n const videoReceiverStream = cloneDeep(emptyVideoReceiveStream);\n\n getVideoReceiverStreamMqa({\n videoReceiverStream,\n statsResults: this.statsResults,\n lastMqaDataSent: this.lastMqaDataSent,\n mediaType,\n });\n newMqa.videoReceive[1].streams.push(videoReceiverStream);\n\n this.lastMqaDataSent[mediaType].recv = cloneDeep(this.statsResults[mediaType].recv);\n }\n });\n\n newMqa.intervalMetadata.peerReflexiveIP = this.statsResults.connectionType.local.ipAddress;\n\n // Adding peripheral information\n newMqa.intervalMetadata.peripherals.push({information: _UNKNOWN_, name: MEDIA_DEVICES.SPEAKER});\n if (this.statsResults['audio-send']) {\n newMqa.intervalMetadata.peripherals.push({\n information: this.statsResults['audio-send'].trackLabel || _UNKNOWN_,\n name: MEDIA_DEVICES.MICROPHONE,\n });\n }\n if (this.statsResults['video-send']) {\n newMqa.intervalMetadata.peripherals.push({\n information: this.statsResults['video-send'].trackLabel || _UNKNOWN_,\n name: MEDIA_DEVICES.CAMERA,\n });\n }\n\n newMqa.networkType = this.statsResults.connectionType.local.networkType;\n\n this.mqaSentCount += 1;\n\n newMqa.intervalNumber = this.mqaSentCount;\n\n this.resetStatsResults();\n\n this.emit(\n {\n file: 'statsAnalyzer',\n function: 'sendMqaData',\n },\n EVENTS.MEDIA_QUALITY,\n {\n data: newMqa,\n // @ts-ignore\n networkType: newMqa.networkType,\n }\n );\n }\n\n /**\n * updated the media connection when changed\n *\n * @private\n * @memberof StatsAnalyzer\n * @param {RoapMediaConnection} mediaConnection\n * @returns {void}\n */\n updateMediaConnection(mediaConnection: any) {\n this.mediaConnection = mediaConnection;\n }\n\n /**\n * Returns the local IP address for diagnostics.\n * this is the local IP of the interface used for the current media connection\n * a host can have many local Ip Addresses\n * @returns {string | undefined} The local IP address.\n */\n getLocalIpAddress(): string {\n return this.localIpAddress;\n }\n\n /**\n * Starts the stats analyzer on interval\n *\n * @public\n * @memberof StatsAnalyzer\n * @param {RoapMediaConnection} mediaConnection\n * @returns {Promise}\n */\n public startAnalyzer(mediaConnection: any) {\n if (!this.statsStarted) {\n this.statsStarted = true;\n this.mediaConnection = mediaConnection;\n\n return this.getStatsAndParse().then(() => {\n this.statsInterval = setInterval(() => {\n this.getStatsAndParse();\n }, this.config.analyzerInterval);\n // Trigger initial fetch\n this.sendMqaData();\n this.mqaInterval = setInterval(() => {\n this.sendMqaData();\n }, MQA_INTERVAL);\n });\n }\n\n return Promise.resolve();\n }\n\n /**\n * Cleans up the analyzer when done\n *\n * @public\n * @memberof StatsAnalyzer\n * @returns {void}\n */\n public stopAnalyzer() {\n const sendOneLastMqa = this.mqaInterval && this.statsInterval;\n\n if (this.statsInterval) {\n clearInterval(this.statsInterval);\n this.statsInterval = undefined;\n }\n\n if (this.mqaInterval) {\n clearInterval(this.mqaInterval);\n this.mqaInterval = undefined;\n }\n\n if (sendOneLastMqa) {\n return this.getStatsAndParse().then(() => {\n this.sendMqaData();\n this.mediaConnection = null;\n });\n }\n\n return Promise.resolve();\n }\n\n /**\n * Parse a single result of get stats\n *\n * @private\n * @param {*} getStatsResult\n * @param {String} type\n * @param {boolean} isSender\n * @returns {void}\n * @memberof StatsAnalyzer\n */\n private parseGetStatsResult(getStatsResult: any, type: string, isSender: boolean) {\n if (!getStatsResult) {\n return;\n }\n\n // Generate empty stats results\n if (!this.statsResults[type]) {\n this.statsResults[type] = {};\n }\n\n if (isSender && !this.statsResults[type].send) {\n this.statsResults[type].send = cloneDeep(emptySender);\n } else if (!isSender && !this.statsResults[type].recv) {\n this.statsResults[type].recv = cloneDeep(emptyReceiver);\n }\n\n switch (getStatsResult.type) {\n case 'outbound-rtp':\n this.processOutboundRTPResult(getStatsResult, type);\n break;\n case 'inbound-rtp':\n this.processInboundRTPResult(getStatsResult, type);\n break;\n case 'remote-inbound-rtp':\n case 'remote-outbound-rtp':\n this.compareSentAndReceived(getStatsResult, type);\n break;\n case 'remotecandidate':\n case 'remote-candidate':\n this.parseCandidate(getStatsResult, type, isSender, true);\n break;\n case 'local-candidate':\n this.parseCandidate(getStatsResult, type, isSender, false);\n break;\n case 'media-source':\n this.parseAudioSource(getStatsResult, type);\n break;\n default:\n break;\n }\n }\n\n /**\n * Filters the get stats results for types\n * @private\n * @param {Array} statsItem\n * @param {String} type\n * @param {boolean} isSender\n * @returns {void}\n */\n filterAndParseGetStatsResults(statsItem: any, type: string, isSender: boolean) {\n const {types} = DEFAULT_GET_STATS_FILTER;\n\n // get the successful candidate pair before parsing stats.\n statsItem.report.forEach((report) => {\n if (report.type === 'candidate-pair' && report.state === 'succeeded') {\n this.successfulCandidatePair = report;\n }\n });\n\n statsItem.report.forEach((result) => {\n if (types.includes(result.type)) {\n this.parseGetStatsResult(result, type, isSender);\n }\n });\n\n if (this.statsResults[type]) {\n this.statsResults[type].direction = statsItem.currentDirection;\n this.statsResults[type].trackLabel = statsItem.localTrackLabel;\n this.statsResults[type].csi = statsItem.csi;\n this.extractAndSetLocalIpAddressInfoForDiagnostics(\n this.successfulCandidatePair?.localCandidateId,\n this.statsResults?.candidates\n );\n // reset the successful candidate pair.\n this.successfulCandidatePair = {};\n }\n }\n\n /**\n * parse the audio\n * @param {String} result\n * @param {boolean} type\n * @returns {void}\n */\n parseAudioSource(result: any, type: any) {\n if (!result) {\n return;\n }\n\n if (type.includes('audio-send')) {\n this.statsResults[type].send.audioLevel = result.audioLevel;\n this.statsResults[type].send.totalAudioEnergy = result.totalAudioEnergy;\n }\n }\n\n /**\n * emits started/stopped events for local/remote media by checking\n * if given values are increasing or not. The previousValue, currentValue\n * params can be any numerical value like number of receive packets or\n * decoded frames, etc.\n *\n * @private\n * @param {string} mediaType\n * @param {number} previousValue - value to compare\n * @param {number} currentValue - value to compare (must be same type of value as previousValue)\n * @param {boolean} isLocal - true if stats are for local media being sent out, false for remote media being received\n * @memberof StatsAnalyzer\n * @returns {void}\n */\n emitStartStopEvents = (\n mediaType: string,\n previousValue: number,\n currentValue: number,\n isLocal: boolean\n ) => {\n if (mediaType !== 'audio' && mediaType !== 'video' && mediaType !== 'share') {\n throw new Error(`Unsupported mediaType: ${mediaType}`);\n }\n\n // eslint-disable-next-line no-param-reassign\n if (previousValue === undefined) previousValue = 0;\n // eslint-disable-next-line no-param-reassign\n if (currentValue === undefined) currentValue = 0;\n\n if (!this.lastEmittedStartStopEvent[mediaType]) {\n this.lastEmittedStartStopEvent[mediaType] = {};\n }\n\n const lastEmittedEvent = isLocal\n ? this.lastEmittedStartStopEvent[mediaType].local\n : this.lastEmittedStartStopEvent[mediaType].remote;\n\n let newEvent;\n\n if (currentValue - previousValue > 0) {\n newEvent = isLocal ? EVENTS.LOCAL_MEDIA_STARTED : EVENTS.REMOTE_MEDIA_STARTED;\n } else if (currentValue === previousValue && currentValue > 0) {\n newEvent = isLocal ? EVENTS.LOCAL_MEDIA_STOPPED : EVENTS.REMOTE_MEDIA_STOPPED;\n }\n\n if (newEvent && lastEmittedEvent !== newEvent) {\n if (isLocal) {\n this.lastEmittedStartStopEvent[mediaType].local = newEvent;\n } else {\n this.lastEmittedStartStopEvent[mediaType].remote = newEvent;\n }\n this.emit(\n {\n file: 'statsAnalyzer/index',\n function: 'compareLastStatsResult',\n },\n newEvent,\n {\n type: mediaType,\n }\n );\n }\n };\n\n /**\n * compares current and previous stats to check if packets are not sent\n *\n * @private\n * @memberof StatsAnalyzer\n * @returns {void}\n */\n private compareLastStatsResult() {\n if (this.lastStatsResults !== null && this.meetingMediaStatus) {\n const getCurrentStatsTotals = (keyPrefix: string, value: string): number =>\n Object.keys(this.statsResults)\n .filter((key) => key.startsWith(keyPrefix))\n .reduce((prev, cur) => prev + (this.statsResults[cur]?.recv[value] || 0), 0);\n\n const getPreviousStatsTotals = (keyPrefix: string, value: string): number =>\n Object.keys(this.statsResults)\n .filter((key) => key.startsWith(keyPrefix))\n .reduce((prev, cur) => prev + (this.lastStatsResults[cur]?.recv[value] || 0), 0);\n\n // Audio Transmit\n if (this.lastStatsResults['audio-send']) {\n // compare audio stats sent\n // NOTE: relies on there being only one sender.\n const currentStats = this.statsResults['audio-send'].send;\n const previousStats = this.lastStatsResults['audio-send'].send;\n\n if (\n (this.meetingMediaStatus.expected.sendAudio &&\n currentStats.totalPacketsSent === previousStats.totalPacketsSent) ||\n currentStats.totalPacketsSent === 0\n ) {\n LoggerProxy.logger.info(\n `StatsAnalyzer:index#compareLastStatsResult --> No audio RTP packets sent`,\n currentStats.totalPacketsSent\n );\n } else {\n if (\n (this.meetingMediaStatus.expected.sendAudio &&\n currentStats.totalAudioEnergy === previousStats.totalAudioEnergy) ||\n currentStats.totalAudioEnergy === 0\n ) {\n LoggerProxy.logger.info(\n `StatsAnalyzer:index#compareLastStatsResult --> No audio Energy present`,\n currentStats.totalAudioEnergy\n );\n }\n\n if (this.meetingMediaStatus.expected.sendAudio && currentStats.audioLevel === 0) {\n LoggerProxy.logger.info(\n `StatsAnalyzer:index#compareLastStatsResult --> audio level is 0 for the user`\n );\n }\n }\n\n this.emitStartStopEvents(\n 'audio',\n previousStats.totalPacketsSent,\n currentStats.totalPacketsSent,\n true\n );\n }\n\n // Audio Receive\n const currentAudioPacketsReceived = getCurrentStatsTotals(\n 'audio-recv',\n 'totalPacketsReceived'\n );\n const previousAudioPacketsReceived = getPreviousStatsTotals(\n 'audio-recv',\n 'totalPacketsReceived'\n );\n\n this.emitStartStopEvents(\n 'audio',\n previousAudioPacketsReceived,\n currentAudioPacketsReceived,\n false\n );\n\n // Video Transmit\n if (this.lastStatsResults['video-send']) {\n // compare video stats sent\n const currentStats = this.statsResults['video-send'].send;\n const previousStats = this.lastStatsResults['video-send'].send;\n\n if (\n this.meetingMediaStatus.expected.sendVideo &&\n (currentStats.totalPacketsSent === previousStats.totalPacketsSent ||\n currentStats.totalPacketsSent === 0)\n ) {\n LoggerProxy.logger.info(\n `StatsAnalyzer:index#compareLastStatsResult --> No video RTP packets sent`,\n currentStats.totalPacketsSent\n );\n } else {\n if (\n this.meetingMediaStatus.expected.sendVideo &&\n (currentStats.framesEncoded === previousStats.framesEncoded ||\n currentStats.framesEncoded === 0)\n ) {\n LoggerProxy.logger.info(\n `StatsAnalyzer:index#compareLastStatsResult --> No video Frames Encoded`,\n currentStats.framesEncoded\n );\n }\n\n if (\n this.meetingMediaStatus.expected.sendVideo &&\n (this.statsResults['video-send'].send.framesSent ===\n this.lastStatsResults['video-send'].send.framesSent ||\n this.statsResults['video-send'].send.framesSent === 0)\n ) {\n LoggerProxy.logger.info(\n `StatsAnalyzer:index#compareLastStatsResult --> No video Frames sent`,\n this.statsResults['video-send'].send.framesSent\n );\n }\n }\n\n this.emitStartStopEvents('video', previousStats.framesSent, currentStats.framesSent, true);\n }\n\n // Video Receive\n const currentVideoFramesDecoded = getCurrentStatsTotals('video-recv', 'framesDecoded');\n const previousVideoFramesDecoded = getPreviousStatsTotals('video-recv', 'framesDecoded');\n\n this.emitStartStopEvents(\n 'video',\n previousVideoFramesDecoded,\n currentVideoFramesDecoded,\n false\n );\n\n // Share Transmit\n if (this.lastStatsResults['video-share-send']) {\n // compare share stats sent\n\n const currentStats = this.statsResults['video-share-send'].send;\n const previousStats = this.lastStatsResults['video-share-send'].send;\n\n if (\n this.meetingMediaStatus.expected.sendShare &&\n (currentStats.totalPacketsSent === previousStats.totalPacketsSent ||\n currentStats.totalPacketsSent === 0)\n ) {\n LoggerProxy.logger.info(\n `StatsAnalyzer:index#compareLastStatsResult --> No share RTP packets sent`,\n currentStats.totalPacketsSent\n );\n } else {\n if (\n this.meetingMediaStatus.expected.sendShare &&\n (currentStats.framesEncoded === previousStats.framesEncoded ||\n currentStats.framesEncoded === 0)\n ) {\n LoggerProxy.logger.info(\n `StatsAnalyzer:index#compareLastStatsResult --> No share frames getting encoded`,\n currentStats.framesEncoded\n );\n }\n\n if (\n this.meetingMediaStatus.expected.sendShare &&\n (this.statsResults['video-share-send'].send.framesSent ===\n this.lastStatsResults['video-share-send'].send.framesSent ||\n this.statsResults['video-share-send'].send.framesSent === 0)\n ) {\n LoggerProxy.logger.info(\n `StatsAnalyzer:index#compareLastStatsResult --> No share frames sent`,\n this.statsResults['video-share-send'].send.framesSent\n );\n }\n }\n\n this.emitStartStopEvents('share', previousStats.framesSent, currentStats.framesSent, true);\n }\n\n // Share receive\n const currentShareFramesDecoded = getCurrentStatsTotals('video-share-recv', 'framesDecoded');\n const previousShareFramesDecoded = getPreviousStatsTotals(\n 'video-share-recv',\n 'framesDecoded'\n );\n\n this.emitStartStopEvents(\n 'share',\n previousShareFramesDecoded,\n currentShareFramesDecoded,\n false\n );\n }\n }\n\n /**\n * Does a `getStats` on all the transceivers and parses the results\n *\n * @private\n * @memberof StatsAnalyzer\n * @returns {Promise}\n */\n private getStatsAndParse() {\n if (!this.mediaConnection) {\n return Promise.resolve();\n }\n\n if (\n this.mediaConnection &&\n this.mediaConnection.getConnectionState() === ConnectionState.Failed\n ) {\n LoggerProxy.logger.trace(\n 'StatsAnalyzer:index#getStatsAndParse --> media connection is in failed state'\n );\n\n return Promise.resolve();\n }\n\n LoggerProxy.logger.trace('StatsAnalyzer:index#getStatsAndParse --> Collecting Stats');\n\n return this.mediaConnection.getTransceiverStats().then((transceiverStats) => {\n transceiverStats.video.receivers.forEach((receiver, i) =>\n this.filterAndParseGetStatsResults(receiver, `video-recv-${i}`, false)\n );\n transceiverStats.audio.receivers.forEach((receiver, i) =>\n this.filterAndParseGetStatsResults(receiver, `audio-recv-${i}`, false)\n );\n transceiverStats.screenShareVideo.receivers.forEach((receiver, i) =>\n this.filterAndParseGetStatsResults(receiver, `video-share-recv-${i}`, false)\n );\n transceiverStats.screenShareAudio.receivers.forEach((receiver, i) =>\n this.filterAndParseGetStatsResults(receiver, `audio-share-recv-${i}`, false)\n );\n\n transceiverStats.video.senders.forEach((sender, i) => {\n if (i > 0) {\n throw new Error('Stats Analyzer does not support multiple senders.');\n }\n this.filterAndParseGetStatsResults(sender, 'video-send', true);\n });\n transceiverStats.audio.senders.forEach((sender, i) => {\n if (i > 0) {\n throw new Error('Stats Analyzer does not support multiple senders.');\n }\n this.filterAndParseGetStatsResults(sender, 'audio-send', true);\n });\n transceiverStats.screenShareVideo.senders.forEach((sender, i) => {\n if (i > 0) {\n throw new Error('Stats Analyzer does not support multiple senders.');\n }\n this.filterAndParseGetStatsResults(sender, 'video-share-send', true);\n });\n transceiverStats.screenShareAudio.senders.forEach((sender, i) => {\n if (i > 0) {\n throw new Error('Stats Analyzer does not support multiple senders.');\n }\n this.filterAndParseGetStatsResults(sender, 'audio-share-send', true);\n });\n\n this.compareLastStatsResult();\n\n // Save the last results to compare with the current\n // DO Deep copy, for some reason it takes the reference all the time rather then old value set\n this.lastStatsResults = JSON.parse(JSON.stringify(this.statsResults));\n\n LoggerProxy.logger.trace(\n 'StatsAnalyzer:index#getStatsAndParse --> Finished Collecting Stats'\n );\n });\n }\n\n /**\n * Processes OutboundRTP stats result and stores\n * @private\n * @param {*} result\n * @param {*} mediaType\n * @returns {void}\n */\n private processOutboundRTPResult(result: any, mediaType: any) {\n const sendrecvType = STATS.SEND_DIRECTION;\n\n if (result.bytesSent) {\n const kilobytes = 0;\n\n if (result.frameWidth && result.frameHeight) {\n this.statsResults[mediaType][sendrecvType].width = result.frameWidth;\n this.statsResults[mediaType][sendrecvType].height = result.frameHeight;\n this.statsResults[mediaType][sendrecvType].framesSent = result.framesSent;\n this.statsResults[mediaType][sendrecvType].hugeFramesSent = result.hugeFramesSent;\n }\n\n this.statsResults[mediaType][sendrecvType].availableBandwidth = kilobytes.toFixed(1);\n\n this.statsResults[mediaType][sendrecvType].framesEncoded = result.framesEncoded;\n this.statsResults[mediaType][sendrecvType].keyFramesEncoded = result.keyFramesEncoded;\n this.statsResults[mediaType][sendrecvType].packetsSent = result.packetsSent;\n\n // Data saved to send MQA metrics\n\n this.statsResults[mediaType][sendrecvType].totalKeyFramesEncoded = result.keyFramesEncoded;\n this.statsResults[mediaType][sendrecvType].totalNackCount = result.nackCount;\n this.statsResults[mediaType][sendrecvType].totalPliCount = result.pliCount;\n this.statsResults[mediaType][sendrecvType].totalPacketsSent = result.packetsSent;\n this.statsResults[mediaType][sendrecvType].totalFirCount = result.firCount;\n this.statsResults[mediaType][sendrecvType].framesSent = result.framesSent;\n this.statsResults[mediaType][sendrecvType].framesEncoded = result.framesEncoded;\n this.statsResults[mediaType][sendrecvType].encoderImplementation =\n result.encoderImplementation;\n this.statsResults[mediaType][sendrecvType].qualityLimitationReason =\n result.qualityLimitationReason;\n this.statsResults[mediaType][sendrecvType].qualityLimitationResolutionChanges =\n result.qualityLimitationResolutionChanges;\n this.statsResults[mediaType][sendrecvType].retransmittedPacketsSent =\n result.retransmittedPacketsSent;\n this.statsResults[mediaType][sendrecvType].totalBytesSent = result.bytesSent;\n this.statsResults[mediaType][sendrecvType].headerBytesSent = result.headerBytesSent;\n this.statsResults[mediaType][sendrecvType].retransmittedBytesSent =\n result.retransmittedBytesSent;\n }\n }\n\n /**\n * Processes InboundRTP stats result and stores\n * @private\n * @param {*} result\n * @param {*} mediaType\n * @returns {void}\n */\n private processInboundRTPResult(result: any, mediaType: any) {\n const sendrecvType = STATS.RECEIVE_DIRECTION;\n\n if (result.bytesReceived) {\n let kilobytes = 0;\n const receiveSlot = this.receiveSlotCallback(result.ssrc);\n const sourceState = receiveSlot?.sourceState;\n const idAndCsi = receiveSlot\n ? `id: \"${receiveSlot.id || ''}\"${receiveSlot.csi ? ` and csi: ${receiveSlot.csi}` : ''}`\n : '';\n\n const bytes =\n result.bytesReceived - this.statsResults[mediaType][sendrecvType].totalBytesReceived;\n\n kilobytes = bytes / 1024;\n this.statsResults[mediaType][sendrecvType].availableBandwidth = kilobytes.toFixed(1);\n\n let currentPacketsLost =\n result.packetsLost - this.statsResults[mediaType][sendrecvType].totalPacketsLost;\n if (currentPacketsLost < 0) {\n currentPacketsLost = 0;\n }\n const packetsReceivedDiff =\n result.packetsReceived - this.statsResults[mediaType][sendrecvType].totalPacketsReceived;\n this.statsResults[mediaType][sendrecvType].totalPacketsReceived = result.packetsReceived;\n\n if (packetsReceivedDiff === 0) {\n if (receiveSlot && sourceState === 'live') {\n LoggerProxy.logger.info(\n `StatsAnalyzer:index#processInboundRTPResult --> No packets received for mediaType: ${mediaType}, receive slot ${idAndCsi}. Total packets received on slot: `,\n result.packetsReceived\n );\n }\n }\n\n if (mediaType.startsWith('video') || mediaType.startsWith('share')) {\n const videoFramesReceivedDiff =\n result.framesReceived - this.statsResults[mediaType][sendrecvType].framesReceived;\n\n if (videoFramesReceivedDiff === 0) {\n if (receiveSlot && sourceState === 'live') {\n LoggerProxy.logger.info(\n `StatsAnalyzer:index#processInboundRTPResult --> No frames received for mediaType: ${mediaType}, receive slot ${idAndCsi}. Total frames received on slot: `,\n result.framesReceived\n );\n }\n }\n\n const videoFramesDecodedDiff =\n result.framesDecoded - this.statsResults[mediaType][sendrecvType].framesDecoded;\n\n if (videoFramesDecodedDiff === 0) {\n if (receiveSlot && sourceState === 'live') {\n LoggerProxy.logger.info(\n `StatsAnalyzer:index#processInboundRTPResult --> No frames decoded for mediaType: ${mediaType}, receive slot ${idAndCsi}. Total frames decoded on slot: `,\n result.framesDecoded\n );\n }\n }\n\n const videoFramesDroppedDiff =\n result.framesDropped - this.statsResults[mediaType][sendrecvType].framesDropped;\n\n if (videoFramesDroppedDiff > 10) {\n if (receiveSlot && sourceState === 'live') {\n LoggerProxy.logger.info(\n `StatsAnalyzer:index#processInboundRTPResult --> Frames dropped for mediaType: ${mediaType}, receive slot ${idAndCsi}. Total frames dropped on slot: `,\n result.framesDropped\n );\n }\n }\n }\n\n // Check the over all packet Lost ratio\n this.statsResults[mediaType][sendrecvType].currentPacketLossRatio =\n currentPacketsLost > 0\n ? currentPacketsLost / (packetsReceivedDiff + currentPacketsLost)\n : 0;\n if (this.statsResults[mediaType][sendrecvType].currentPacketLossRatio > 3) {\n LoggerProxy.logger.info(\n `StatsAnalyzer:index#processInboundRTPResult --> Packets getting lost from the receiver with slot ${idAndCsi}`,\n this.statsResults[mediaType][sendrecvType].currentPacketLossRatio\n );\n }\n\n if (result.frameWidth && result.frameHeight) {\n this.statsResults[mediaType][sendrecvType].width = result.frameWidth;\n this.statsResults[mediaType][sendrecvType].height = result.frameHeight;\n this.statsResults[mediaType][sendrecvType].framesReceived = result.framesReceived;\n }\n\n // TODO: check the packet loss value is negative values here\n\n if (result.packetsLost) {\n this.statsResults[mediaType][sendrecvType].totalPacketsLost =\n result.packetsLost > 0 ? result.packetsLost : -result.packetsLost;\n } else {\n this.statsResults[mediaType][sendrecvType].totalPacketsLost = 0;\n }\n\n this.statsResults[mediaType][sendrecvType].lastPacketReceivedTimestamp =\n result.lastPacketReceivedTimestamp;\n\n // From Thin\n this.statsResults[mediaType][sendrecvType].totalNackCount = result.nackCount;\n this.statsResults[mediaType][sendrecvType].totalPliCount = result.pliCount;\n this.statsResults[mediaType][sendrecvType].framesDecoded = result.framesDecoded;\n this.statsResults[mediaType][sendrecvType].keyFramesDecoded = result.keyFramesDecoded;\n this.statsResults[mediaType][sendrecvType].framesDropped = result.framesDropped;\n\n this.statsResults[mediaType][sendrecvType].decoderImplementation =\n result.decoderImplementation;\n this.statsResults[mediaType][sendrecvType].totalPacketsReceived = result.packetsReceived;\n\n this.statsResults[mediaType][sendrecvType].fecPacketsDiscarded = result.fecPacketsDiscarded;\n this.statsResults[mediaType][sendrecvType].fecPacketsReceived = result.fecPacketsReceived;\n this.statsResults[mediaType][sendrecvType].totalBytesReceived = result.bytesReceived;\n this.statsResults[mediaType][sendrecvType].headerBytesReceived = result.headerBytesReceived;\n\n this.statsResults[mediaType][sendrecvType].meanRtpJitter.push(result.jitter);\n\n // Audio stats\n\n this.statsResults[mediaType][sendrecvType].audioLevel = result.audioLevel;\n this.statsResults[mediaType][sendrecvType].totalAudioEnergy = result.totalAudioEnergy;\n this.statsResults[mediaType][sendrecvType].totalSamplesReceived =\n result.totalSamplesReceived || 0;\n this.statsResults[mediaType][sendrecvType].totalSamplesDecoded =\n result.totalSamplesDecoded || 0;\n this.statsResults[mediaType][sendrecvType].concealedSamples = result.concealedSamples || 0;\n }\n }\n\n /**\n * extracts the local Ip address from the statsResult object by looking at stats results candidates\n * and matches that ID with the successful candidate pair. It looks at the type of local candidate it is\n * and then extracts the IP address from the relatedAddress or address property based on conditions known in webrtc\n * note, there are known incompatibilities and it is possible for this to set undefined, or for the IP address to be the public IP address\n * for example, firefox does not set the relayProtocol, and if the user is behind a NAT it might be the public IP\n * @private\n * @param {string} successfulCandidatePairId - The ID of the successful candidate pair.\n * @param {Object} candidates - the stats result candidates\n * @returns {void}\n */\n extractAndSetLocalIpAddressInfoForDiagnostics = (\n successfulCandidatePairId: string,\n candidates: {[key: string]: Record<string, unknown>}\n ) => {\n let newIpAddress = '';\n if (successfulCandidatePairId && !isEmpty(candidates)) {\n const localCandidate = candidates[successfulCandidatePairId];\n if (localCandidate) {\n if (localCandidate.candidateType === 'host') {\n // if it's a host candidate, use the address property - it will be the local IP\n newIpAddress = `${localCandidate.address}`;\n } else if (localCandidate.candidateType === 'prflx') {\n // if it's a peer reflexive candidate and we're not using a relay (there is no relayProtocol set)\n // then look at the relatedAddress - it will be the local\n //\n // Firefox doesn't populate the relayProtocol property\n if (!localCandidate.relayProtocol) {\n newIpAddress = `${localCandidate.relatedAddress}`;\n } else {\n // if it's a peer reflexive candidate and we are using a relay -\n // in that case the relatedAddress will be the IP of the TURN server (Linus),\n // so we can only look at the address, but it might be local IP or public IP,\n // depending on if the user is behind a NAT or not\n newIpAddress = `${localCandidate.address}`;\n }\n }\n }\n }\n this.localIpAddress = newIpAddress;\n };\n\n /**\n * Processes remote and local candidate result and stores\n * @private\n * @param {*} result\n * @param {*} type\n * @param {boolean} isSender\n * @param {boolean} isRemote\n *\n * @returns {void}\n */\n parseCandidate = (result: any, type: any, isSender: boolean, isRemote: boolean) => {\n if (!result || !result.id) {\n return;\n }\n\n // We only care about the successful local candidate\n if (this.successfulCandidatePair?.localCandidateId !== result.id) {\n return;\n }\n\n let transport;\n if (result.relayProtocol) {\n transport = result.relayProtocol.toUpperCase();\n } else if (result.protocol) {\n transport = result.protocol.toUpperCase();\n }\n\n const sendRecvType = isSender ? STATS.SEND_DIRECTION : STATS.RECEIVE_DIRECTION;\n const ipType = isRemote ? STATS.REMOTE : STATS.LOCAL;\n\n if (!this.statsResults.candidates) {\n this.statsResults.candidates = {};\n }\n\n this.statsResults.candidates[result.id] = {\n candidateType: result.candidateType,\n ipAddress: result.ip, // TODO: add ports\n relatedAddress: result.relatedAddress,\n relatedPort: result.relatedPort,\n relayProtocol: result.relayProtocol,\n protocol: result.protocol,\n address: result.address,\n portNumber: result.port,\n networkType: result.networkType,\n priority: result.priority,\n transport,\n timestamp: result.time,\n id: result.id,\n type: result.type,\n };\n\n this.statsResults.connectionType[ipType].candidateType = result.candidateType;\n this.statsResults.connectionType[ipType].ipAddress = result.ipAddress;\n\n this.statsResults.connectionType[ipType].networkType =\n result.networkType === NETWORK_TYPE.VPN ? NETWORK_TYPE.UNKNOWN : result.networkType;\n this.statsResults.connectionType[ipType].transport = transport;\n\n this.statsResults[type][sendRecvType].totalRoundTripTime = result.totalRoundTripTime;\n };\n\n /**\n *\n * @private\n * @param {*} result\n * @param {*} type\n * @returns {void}\n * @memberof StatsAnalyzer\n */\n compareSentAndReceived(result, type) {\n // Don't compare on transceivers without a sender.\n if (!type || !this.statsResults[type].send) {\n return;\n }\n\n const mediaType = type;\n\n const currentPacketLoss =\n result.packetsLost - this.statsResults[mediaType].send.totalPacketsLostOnReceiver;\n\n this.statsResults[mediaType].send.packetsLostOnReceiver = currentPacketLoss;\n this.statsResults[mediaType].send.totalPacketsLostOnReceiver = result.packetsLost;\n\n this.statsResults[mediaType].send.meanRemoteJitter.push(result.jitter);\n this.statsResults[mediaType].send.meanRoundTripTime.push(result.roundTripTime);\n\n this.statsResults[mediaType].send.timestamp = result.timestamp;\n this.statsResults[mediaType].send.ssrc = result.ssrc;\n this.statsResults[mediaType].send.reportsReceived = result.reportsReceived;\n\n // Total packloss ratio on this video section of the call\n this.statsResults[mediaType].send.overAllPacketLossRatio =\n this.statsResults[mediaType].send.totalPacketsLostOnReceiver > 0\n ? this.statsResults[mediaType].send.totalPacketsLostOnReceiver /\n this.statsResults[mediaType].send.totalPacketsSent\n : 0;\n this.statsResults[mediaType].send.currentPacketLossRatio =\n this.statsResults[mediaType].send.packetsLostOnReceiver > 0\n ? (this.statsResults[mediaType].send.packetsLostOnReceiver * 100) /\n (this.statsResults[mediaType].send.packetsSent +\n this.statsResults[mediaType].send.packetsLostOnReceiver)\n : 0;\n\n if (\n this.statsResults[mediaType].send.maxPacketLossRatio <\n this.statsResults[mediaType].send.currentPacketLossRatio\n ) {\n this.statsResults[mediaType].send.maxPacketLossRatio =\n this.statsResults[mediaType].send.currentPacketLossRatio;\n }\n\n if (result.type === 'remote-inbound-rtp') {\n this.networkQualityMonitor.determineUplinkNetworkQuality({\n mediaType,\n remoteRtpResults: result,\n statsAnalyzerCurrentStats: this.statsResults,\n });\n }\n }\n}\n"],"mappings":"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"}
|
package/dist/webinar/index.js
CHANGED
|
@@ -62,7 +62,7 @@ var Webinar = _webexCore.WebexPlugin.extend({
|
|
|
62
62
|
updateCanManageWebcast: function updateCanManageWebcast(canManageWebcast) {
|
|
63
63
|
this.set('canManageWebcast', canManageWebcast);
|
|
64
64
|
},
|
|
65
|
-
version: "2.60.1-next.
|
|
65
|
+
version: "2.60.1-next.18"
|
|
66
66
|
});
|
|
67
67
|
var _default = exports.default = Webinar;
|
|
68
68
|
//# sourceMappingURL=index.js.map
|
package/package.json
CHANGED
|
@@ -33,7 +33,6 @@
|
|
|
33
33
|
"deploy:npm": "yarn npm publish",
|
|
34
34
|
"test:broken": "yarn test:style && yarn test:unit && yarn test:integration && yarn test:browser",
|
|
35
35
|
"test:browser": "webex-legacy-tools test --integration --runner karma",
|
|
36
|
-
"test:integration:broken": "webex-legacy-tools test --integration --runner mocha",
|
|
37
36
|
"test:style": "eslint ./src/**/*.*",
|
|
38
37
|
"test:unit": "webex-legacy-tools test --unit --runner mocha"
|
|
39
38
|
},
|
|
@@ -44,13 +43,13 @@
|
|
|
44
43
|
"@webex/eslint-config-legacy": "0.0.0",
|
|
45
44
|
"@webex/jest-config-legacy": "0.0.0",
|
|
46
45
|
"@webex/legacy-tools": "0.0.0",
|
|
47
|
-
"@webex/plugin-meetings": "2.60.1-next.
|
|
48
|
-
"@webex/plugin-rooms": "2.60.1-next.
|
|
49
|
-
"@webex/test-helper-chai": "2.60.1-next.
|
|
50
|
-
"@webex/test-helper-mocha": "2.60.1-next.
|
|
51
|
-
"@webex/test-helper-mock-webex": "2.60.1-next.
|
|
52
|
-
"@webex/test-helper-retry": "2.60.1-next.
|
|
53
|
-
"@webex/test-helper-test-users": "2.60.1-next.
|
|
46
|
+
"@webex/plugin-meetings": "2.60.1-next.18",
|
|
47
|
+
"@webex/plugin-rooms": "2.60.1-next.12",
|
|
48
|
+
"@webex/test-helper-chai": "2.60.1-next.12",
|
|
49
|
+
"@webex/test-helper-mocha": "2.60.1-next.12",
|
|
50
|
+
"@webex/test-helper-mock-webex": "2.60.1-next.12",
|
|
51
|
+
"@webex/test-helper-retry": "2.60.1-next.12",
|
|
52
|
+
"@webex/test-helper-test-users": "2.60.1-next.12",
|
|
54
53
|
"chai": "^4.3.4",
|
|
55
54
|
"chai-as-promised": "^7.1.1",
|
|
56
55
|
"eslint": "^8.24.0",
|
|
@@ -62,20 +61,20 @@
|
|
|
62
61
|
"typescript": "^4.7.4"
|
|
63
62
|
},
|
|
64
63
|
"dependencies": {
|
|
65
|
-
"@webex/common": "2.60.1-next.
|
|
66
|
-
"@webex/internal-media-core": "2.2.
|
|
67
|
-
"@webex/internal-plugin-conversation": "2.60.1-next.
|
|
68
|
-
"@webex/internal-plugin-device": "2.60.1-next.
|
|
69
|
-
"@webex/internal-plugin-llm": "2.60.1-next.
|
|
70
|
-
"@webex/internal-plugin-mercury": "2.60.1-next.
|
|
71
|
-
"@webex/internal-plugin-metrics": "2.60.1-next.
|
|
72
|
-
"@webex/internal-plugin-support": "2.60.1-next.
|
|
73
|
-
"@webex/internal-plugin-user": "2.60.1-next.
|
|
74
|
-
"@webex/internal-plugin-voicea": "2.60.1-next.
|
|
75
|
-
"@webex/media-helpers": "3.0.0-next.
|
|
76
|
-
"@webex/plugin-people": "2.60.1-next.
|
|
77
|
-
"@webex/plugin-rooms": "2.60.1-next.
|
|
78
|
-
"@webex/webex-core": "2.60.1-next.
|
|
64
|
+
"@webex/common": "2.60.1-next.12",
|
|
65
|
+
"@webex/internal-media-core": "2.2.9",
|
|
66
|
+
"@webex/internal-plugin-conversation": "2.60.1-next.12",
|
|
67
|
+
"@webex/internal-plugin-device": "2.60.1-next.12",
|
|
68
|
+
"@webex/internal-plugin-llm": "2.60.1-next.12",
|
|
69
|
+
"@webex/internal-plugin-mercury": "2.60.1-next.12",
|
|
70
|
+
"@webex/internal-plugin-metrics": "2.60.1-next.12",
|
|
71
|
+
"@webex/internal-plugin-support": "2.60.1-next.12",
|
|
72
|
+
"@webex/internal-plugin-user": "2.60.1-next.12",
|
|
73
|
+
"@webex/internal-plugin-voicea": "2.60.1-next.18",
|
|
74
|
+
"@webex/media-helpers": "3.0.0-next.32",
|
|
75
|
+
"@webex/plugin-people": "2.60.1-next.12",
|
|
76
|
+
"@webex/plugin-rooms": "2.60.1-next.12",
|
|
77
|
+
"@webex/webex-core": "2.60.1-next.12",
|
|
79
78
|
"ampersand-collection": "^2.0.2",
|
|
80
79
|
"bowser": "^2.11.0",
|
|
81
80
|
"btoa": "^1.2.1",
|
|
@@ -92,5 +91,5 @@
|
|
|
92
91
|
"//": [
|
|
93
92
|
"TODO: upgrade jwt-decode when moving to node 18"
|
|
94
93
|
],
|
|
95
|
-
"version": "2.60.1-next.
|
|
94
|
+
"version": "2.60.1-next.18"
|
|
96
95
|
}
|
package/src/constants.ts
CHANGED
|
@@ -343,6 +343,7 @@ export const EVENT_TRIGGERS = {
|
|
|
343
343
|
MEETING_UNLOCKED: 'meeting:unlocked',
|
|
344
344
|
MEETING_LOCKED: 'meeting:locked',
|
|
345
345
|
MEETING_INFO_AVAILABLE: 'meeting:meetingInfoAvailable',
|
|
346
|
+
MEETING_INFO_UPDATED: 'meeting:meetingInfoUpdated',
|
|
346
347
|
MEETING_LOG_UPLOAD_SUCCESS: 'meeting:logUpload:success',
|
|
347
348
|
MEETING_LOG_UPLOAD_FAILURE: 'meeting:logUpload:failure',
|
|
348
349
|
MEETING_ACTIONS_UPDATE: 'meeting:actionsUpdate',
|
package/src/locus-info/index.ts
CHANGED
|
@@ -1169,7 +1169,10 @@ export default class LocusInfo extends EventsScope {
|
|
|
1169
1169
|
file: 'locus-info',
|
|
1170
1170
|
function: 'updateMeetingInfo',
|
|
1171
1171
|
},
|
|
1172
|
-
LOCUSINFO.EVENTS.MEETING_INFO_UPDATED
|
|
1172
|
+
LOCUSINFO.EVENTS.MEETING_INFO_UPDATED,
|
|
1173
|
+
{
|
|
1174
|
+
isInitializing: !self, // if self is undefined, then the update is caused by locus init
|
|
1175
|
+
}
|
|
1173
1176
|
);
|
|
1174
1177
|
}
|
|
1175
1178
|
this.roles = roles;
|
package/src/meeting/index.ts
CHANGED
|
@@ -2884,12 +2884,24 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
2884
2884
|
);
|
|
2885
2885
|
}
|
|
2886
2886
|
});
|
|
2887
|
-
this.locusInfo.on(LOCUSINFO.EVENTS.MEETING_INFO_UPDATED, () => {
|
|
2887
|
+
this.locusInfo.on(LOCUSINFO.EVENTS.MEETING_INFO_UPDATED, ({isInitializing}) => {
|
|
2888
2888
|
this.updateMeetingActions();
|
|
2889
2889
|
this.recordingController.setDisplayHints(this.userDisplayHints);
|
|
2890
2890
|
this.recordingController.setUserPolicy(this.selfUserPolicies);
|
|
2891
2891
|
this.controlsOptionsManager.setDisplayHints(this.userDisplayHints);
|
|
2892
2892
|
this.handleDataChannelUrlChange(this.datachannelUrl);
|
|
2893
|
+
|
|
2894
|
+
if (!isInitializing) {
|
|
2895
|
+
// send updated trigger only if locus is not initializing the meeting
|
|
2896
|
+
Trigger.trigger(
|
|
2897
|
+
this,
|
|
2898
|
+
{
|
|
2899
|
+
file: 'meetings',
|
|
2900
|
+
function: 'setUpLocusInfoMeetingInfoListener',
|
|
2901
|
+
},
|
|
2902
|
+
EVENT_TRIGGERS.MEETING_INFO_UPDATED
|
|
2903
|
+
);
|
|
2904
|
+
}
|
|
2893
2905
|
});
|
|
2894
2906
|
}
|
|
2895
2907
|
|
|
@@ -8191,6 +8203,12 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
8191
8203
|
},
|
|
8192
8204
|
options: {meetingId: this.id},
|
|
8193
8205
|
});
|
|
8206
|
+
|
|
8207
|
+
this.statsAnalyzer.updateMediaStatus({
|
|
8208
|
+
expected: {
|
|
8209
|
+
sendShare: true,
|
|
8210
|
+
},
|
|
8211
|
+
});
|
|
8194
8212
|
// we're sending the http request to Locus to request the screen share floor
|
|
8195
8213
|
// only after the SDP update, because that's how it's always been done for transcoded meetings
|
|
8196
8214
|
// and also if sharing from the start, we need confluence to have been created
|
|
@@ -8239,6 +8257,12 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
8239
8257
|
if (!this.mediaProperties.hasLocalShareStream()) {
|
|
8240
8258
|
try {
|
|
8241
8259
|
this.releaseScreenShareFloor(); // we ignore the returned promise here on purpose
|
|
8260
|
+
|
|
8261
|
+
this.statsAnalyzer.updateMediaStatus({
|
|
8262
|
+
expected: {
|
|
8263
|
+
sendShare: false,
|
|
8264
|
+
},
|
|
8265
|
+
});
|
|
8242
8266
|
} catch (e) {
|
|
8243
8267
|
// nothing to do here, error is logged already inside releaseScreenShareFloor()
|
|
8244
8268
|
}
|