@webex/plugin-meetings 3.0.0-beta.423 → 3.0.0-beta.424
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.js +2 -8
- package/dist/constants.js.map +1 -1
- package/dist/interpretation/index.js +1 -1
- package/dist/interpretation/siLanguage.js +1 -1
- package/dist/mediaQualityMetrics/config.js +10 -1
- package/dist/mediaQualityMetrics/config.js.map +1 -1
- package/dist/statsAnalyzer/index.js +9 -12
- package/dist/statsAnalyzer/index.js.map +1 -1
- package/dist/types/constants.d.ts +0 -5
- package/dist/types/mediaQualityMetrics/config.d.ts +9 -1
- package/dist/webinar/index.js +1 -1
- package/package.json +19 -19
- package/src/constants.ts +0 -6
- package/src/mediaQualityMetrics/config.ts +11 -1
- package/src/statsAnalyzer/index.ts +10 -17
- package/test/unit/spec/stats-analyzer/index.js +4 -8
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["emptyMqaInterval","audioReceive","audioTransmit","intervalMetadata","peerReflexiveIP","peripherals","processAverageCPU","processMaximumCPU","systemAverageCPU","systemMaximumCPU","networkType","intervalNumber","videoReceive","videoTransmit","emptyAudioReceive","common","direction","isMain","mariFecEnabled","mariQosEnabled","multistreamEnabled","dtlsBitrate","dtlsPackets","fecBitrate","fecPackets","maxBitrate","mediaHopByHopLost","rtcpBitrate","rtcpPackets","rtpBitrate","rtpHopByHopLost","rtpPackets","rtpRecovered","rtxBitrate","rtxPackets","srtcpUnprotectErrors","srtpUnprotectErrors","stunBitrate","stunPackets","transportType","streams","emptyAudioReceiveStream","codec","concealedFrames","csi","maxConcealRunLength","optimalBitrate","optimalFrameRate","receivedBitrate","receivedFrameRate","renderedFrameRate","requestedBitrate","requestedFrameRate","rtpEndToEndLost","maxRtpJitter","meanRtpJitter","ssci","emptyAudioTransmit","availableBitrate","queueDelay","remoteJitter","remoteLossRate","remoteReceiveRate","roundTripTime","emptyAudioTransmitStream","requestedFrames","transmittedBitrate","transmittedFrameRate","emptyVideoReceive","emptyVideoReceiveStream","rtpJitter","h264CodecProfile","isActiveSpeaker","optimalFrameSize","receivedFrameSize","receivedHeight","receivedKeyFrames","receivedKeyFramesForRequest","receivedKeyFramesSourceChange","receivedKeyFramesUnknown","receivedWidth","requestedFrameSize","requestedKeyFrames","emptyVideoTransmit","emptyVideoTransmitStream","duplicateSsci","isAvatar","isHardwareEncoded","localConfigurationChanges","maxFrameQp","maxNoiseLevel","minRegionQp","remoteConfigurationChanges","transmittedFrameSize","transmittedHeight","transmittedKeyFrames","transmittedKeyFramesClient","transmittedKeyFramesConfigurationChange","transmittedKeyFramesFeedback","transmittedKeyFramesLocalDrop","transmittedKeyFramesOtherLayer","transmittedKeyFramesPeriodic","transmittedKeyFramesSceneChange","transmittedKeyFramesStartup","transmittedKeyFramesUnknown","transmittedWidth"],"sources":["config.ts"],"sourcesContent":["export const emptyMqaInterval = {\n audioReceive: [],\n audioTransmit: [],\n intervalMetadata: {\n peerReflexiveIP: '0.0.0.0',\n peripherals: [],\n processAverageCPU: 0,\n processMaximumCPU: 0,\n systemAverageCPU: 0,\n systemMaximumCPU: 0,\n },\n networkType: '',\n intervalNumber: 0,\n videoReceive: [],\n videoTransmit: [],\n};\n\nexport const emptyAudioReceive = {\n common: {\n common: {\n direction: 'inactive',\n isMain: true,\n mariFecEnabled: false,\n mariQosEnabled: false,\n multistreamEnabled: false,\n },\n dtlsBitrate: 0,\n dtlsPackets: 0,\n fecBitrate: 0,\n fecPackets: 0,\n maxBitrate: 0,\n mediaHopByHopLost: 0,\n rtcpBitrate: 0,\n rtcpPackets: 0,\n rtpBitrate: 0,\n rtpHopByHopLost: 0,\n rtpPackets: 0,\n rtpRecovered: 0,\n rtxBitrate: 0,\n rtxPackets: 0,\n srtcpUnprotectErrors: 0,\n srtpUnprotectErrors: 0,\n stunBitrate: 0,\n stunPackets: 0,\n transportType: 'UDP',\n },\n streams: [],\n};\n\nexport const emptyAudioReceiveStream = {\n common: {\n codec: 'opus',\n concealedFrames: 0,\n csi: [],\n maxConcealRunLength: 0,\n optimalBitrate: 0,\n optimalFrameRate: 0,\n receivedBitrate: 0,\n receivedFrameRate: 0,\n renderedFrameRate: 0,\n requestedBitrate: 0,\n requestedFrameRate: 0,\n rtpEndToEndLost: 0,\n maxRtpJitter: 0,\n meanRtpJitter: 0,\n rtpPackets: 0,\n ssci: 0,\n },\n};\n\nexport const emptyAudioTransmit = {\n common: {\n availableBitrate: 0,\n common: {\n direction: 'inactive',\n isMain: true,\n mariFecEnabled: false,\n mariQosEnabled: false,\n multistreamEnabled: false,\n },\n dtlsBitrate: 0,\n dtlsPackets: 0,\n fecBitrate: 0,\n fecPackets: 0,\n maxBitrate: 0,\n queueDelay: 0,\n remoteJitter: 0,\n remoteLossRate: 0,\n remoteReceiveRate: 0,\n roundTripTime: 0,\n rtcpBitrate: 0,\n rtcpPackets: 0,\n rtpBitrate: 0,\n rtpPackets: 0,\n rtxBitrate: 0,\n rtxPackets: 0,\n stunBitrate: 0,\n stunPackets: 0,\n transportType: 'UDP',\n },\n streams: [],\n};\n\nexport const emptyAudioTransmitStream = {\n common: {\n codec: 'opus',\n csi: [],\n requestedBitrate: 0,\n requestedFrames: 0,\n rtpPackets: 0,\n ssci: 0,\n transmittedBitrate: 0,\n transmittedFrameRate: 0,\n },\n};\n\nexport const emptyVideoReceive = {\n common: {\n common: {\n direction: 'inactive',\n isMain: true, // Not avaliable\n mariFecEnabled: true, // Not avaliable\n mariQosEnabled: true, // Not avaliable\n multistreamEnabled: true, // Not avaliable\n },\n dtlsBitrate: 0, // Not avaliable\n dtlsPackets: 0, // Not avaliable\n fecBitrate: 0, // Not avaliable\n fecPackets: 0, // Not avaliable\n maxBitrate: 0,\n mediaHopByHopLost: 0,\n rtcpBitrate: 0, // Not avaliable\n rtcpPackets: 0, // Not avaliable\n rtpBitrate: 0,\n rtpHopByHopLost: 0,\n rtpPackets: 0,\n rtpRecovered: 0, // Not avaliable\n rtxBitrate: 0, // Not avaliable\n rtxPackets: 0, // Not avaliable\n srtcpUnprotectErrors: 0, // Not avaliable\n srtpUnprotectErrors: 0, // Not avaliable\n stunBitrate: 0, // Not avaliable\n stunPackets: 0, // Not avaliable\n transportType: 'UDP',\n },\n streams: [],\n};\n\nexport const emptyVideoReceiveStream = {\n common: {\n codec: 'H264',\n concealedFrames: 0, // Not avaliable\n csi: [],\n maxConcealRunLength: 0, // Not avaliable\n optimalBitrate: 0,\n optimalFrameRate: 0,\n receivedBitrate: 0,\n receivedFrameRate: 0,\n renderedFrameRate: 0, // Not avaliable\n requestedBitrate: 0,\n requestedFrameRate: 0,\n rtpEndToEndLost: 0,\n rtpJitter: 0,\n rtpPackets: 0,\n ssci: 0, // Not avaliable\n },\n h264CodecProfile: 'BP',\n isActiveSpeaker: true,\n optimalFrameSize: 0, // Not avaliable\n receivedFrameSize: 0,\n receivedHeight: 0,\n receivedKeyFrames: 0,\n receivedKeyFramesForRequest: 0,\n receivedKeyFramesSourceChange: 0,\n receivedKeyFramesUnknown: 0,\n receivedWidth: 0,\n requestedFrameSize: 0,\n requestedKeyFrames: 0,\n};\n\nexport const emptyVideoTransmit = {\n common: {\n availableBitrate: 0, // Not avaliable currently hardcoded\n common: {\n direction: 'inactive',\n isMain: true,\n mariFecEnabled: false, // Not avaliable\n mariQosEnabled: false, // Not avaliable\n multistreamEnabled: false, // Not avaliable\n },\n dtlsBitrate: 0, // Not avaliable\n dtlsPackets: 0, // Not avaliable\n fecBitrate: 0, // Not avaliable\n fecPackets: 0, // TODO: check inbound-rtp// Not avaliable\n maxBitrate: 0, // Currently hardcoded\n queueDelay: 0, // outboundRtp.totalPacketSentDelay // TODO: check if totalInterFrameDelay/ packetSentDelay/ jitterBufferDalay\n remoteJitter: 0, // remoteInboundRtp.jitter\n remoteLossRate: 0, // comparedResults.lossRate\n remoteReceiveRate: 0, // compareResults.packetsLost\n roundTripTime: 0, // compareResults.roundTripTime\n rtcpBitrate: 0, // Dont have access to it\n rtcpPackets: 0, // Dont have access to rtcp\n rtpBitrate: 0, // Dont have access\n rtpPackets: 0, // outboundRtp.packetsSent\n rtxBitrate: 0, // Dont have access to it\n rtxPackets: 0, // Dont have access to it\n stunBitrate: 0, // Dont have access to it\n stunPackets: 0, // Dont have access to it\n transportType: 'UDP', // TODO: need to calculate\n },\n streams: [],\n};\n\nexport const emptyVideoTransmitStream = {\n common: {\n codec: 'H264',\n csi: [],\n duplicateSsci: 0, // Not Avaliable\n requestedBitrate: 0, // TODO: from remote SDP\n requestedFrames: 0, // TODO: from remote SDP\n rtpPackets: 0, // same as rtp packets\n ssci: 0,\n transmittedBitrate: 0, // TODO: get in the candidate pair\n transmittedFrameRate: 0, // TODO: from track info\n },\n h264CodecProfile: 'BP', // TODO: from localSDP\n isAvatar: false, // Not Avaliable\n isHardwareEncoded: false, // Not Avaliable\n localConfigurationChanges: 2, // Not Avaliable\n maxFrameQp: 0, // Not Avaliable\n maxNoiseLevel: 0, // Not Avaliable\n minRegionQp: 0, // Not Avaliable\n remoteConfigurationChanges: 0, // Not Avaliable\n requestedFrameSize: 0, // TODO: from remote SDP\n requestedKeyFrames: 0, // outbound Fir request\n transmittedFrameSize: 0, // Not Avaliable\n transmittedHeight: 0,\n transmittedKeyFrames: 0, // Key frames encoded\n transmittedKeyFramesClient: 0, // Not Avaliable\n transmittedKeyFramesConfigurationChange: 0, // Not Avaliable\n transmittedKeyFramesFeedback: 0, // Not Avaliable\n transmittedKeyFramesLocalDrop: 0, // Not Avaliable\n transmittedKeyFramesOtherLayer: 0, // Not Avaliable\n transmittedKeyFramesPeriodic: 0, // Not Avaliable\n transmittedKeyFramesSceneChange: 0, // Not Avaliable\n transmittedKeyFramesStartup: 0, // Not Avaliable\n transmittedKeyFramesUnknown: 0, // Not Avaliable\n transmittedWidth: 0,\n};\n"],"mappings":";;;;;;;AAAO,IAAMA,gBAAgB,GAAG;EAC9BC,YAAY,EAAE,EAAE;EAChBC,aAAa,EAAE,EAAE;EACjBC,gBAAgB,EAAE;IAChBC,eAAe,EAAE,SAAS;IAC1BC,WAAW,EAAE,EAAE;IACfC,iBAAiB,EAAE,CAAC;IACpBC,iBAAiB,EAAE,CAAC;IACpBC,gBAAgB,EAAE,CAAC;IACnBC,gBAAgB,EAAE;EACpB,CAAC;EACDC,WAAW,EAAE,EAAE;EACfC,cAAc,EAAE,CAAC;EACjBC,YAAY,EAAE,EAAE;EAChBC,aAAa,EAAE;AACjB,CAAC;AAAC;AAEK,IAAMC,iBAAiB,GAAG;EAC/BC,MAAM,EAAE;IACNA,MAAM,EAAE;MACNC,SAAS,EAAE,UAAU;MACrBC,MAAM,EAAE,IAAI;MACZC,cAAc,EAAE,KAAK;MACrBC,cAAc,EAAE,KAAK;MACrBC,kBAAkB,EAAE;IACtB,CAAC;IACDC,WAAW,EAAE,CAAC;IACdC,WAAW,EAAE,CAAC;IACdC,UAAU,EAAE,CAAC;IACbC,UAAU,EAAE,CAAC;IACbC,UAAU,EAAE,CAAC;IACbC,iBAAiB,EAAE,CAAC;IACpBC,WAAW,EAAE,CAAC;IACdC,WAAW,EAAE,CAAC;IACdC,UAAU,EAAE,CAAC;IACbC,eAAe,EAAE,CAAC;IAClBC,UAAU,EAAE,CAAC;IACbC,YAAY,EAAE,CAAC;IACfC,UAAU,EAAE,CAAC;IACbC,UAAU,EAAE,CAAC;IACbC,oBAAoB,EAAE,CAAC;IACvBC,mBAAmB,EAAE,CAAC;IACtBC,WAAW,EAAE,CAAC;IACdC,WAAW,EAAE,CAAC;IACdC,aAAa,EAAE;EACjB,CAAC;EACDC,OAAO,EAAE;AACX,CAAC;AAAC;AAEK,IAAMC,uBAAuB,GAAG;EACrC1B,MAAM,EAAE;IACN2B,KAAK,EAAE,MAAM;IACbC,eAAe,EAAE,CAAC;IAClBC,GAAG,EAAE,EAAE;IACPC,mBAAmB,EAAE,CAAC;IACtBC,cAAc,EAAE,CAAC;IACjBC,gBAAgB,EAAE,CAAC;IACnBC,eAAe,EAAE,CAAC;IAClBC,iBAAiB,EAAE,CAAC;IACpBC,iBAAiB,EAAE,CAAC;IACpBC,gBAAgB,EAAE,CAAC;IACnBC,kBAAkB,EAAE,CAAC;IACrBC,eAAe,EAAE,CAAC;IAClBC,YAAY,EAAE,CAAC;IACfC,aAAa,EAAE,CAAC;IAChBxB,UAAU,EAAE,CAAC;IACbyB,IAAI,EAAE;EACR;AACF,CAAC;AAAC;AAEK,IAAMC,kBAAkB,GAAG;EAChC1C,MAAM,EAAE;IACN2C,gBAAgB,EAAE,CAAC;IACnB3C,MAAM,EAAE;MACNC,SAAS,EAAE,UAAU;MACrBC,MAAM,EAAE,IAAI;MACZC,cAAc,EAAE,KAAK;MACrBC,cAAc,EAAE,KAAK;MACrBC,kBAAkB,EAAE;IACtB,CAAC;IACDC,WAAW,EAAE,CAAC;IACdC,WAAW,EAAE,CAAC;IACdC,UAAU,EAAE,CAAC;IACbC,UAAU,EAAE,CAAC;IACbC,UAAU,EAAE,CAAC;IACbkC,UAAU,EAAE,CAAC;IACbC,YAAY,EAAE,CAAC;IACfC,cAAc,EAAE,CAAC;IACjBC,iBAAiB,EAAE,CAAC;IACpBC,aAAa,EAAE,CAAC;IAChBpC,WAAW,EAAE,CAAC;IACdC,WAAW,EAAE,CAAC;IACdC,UAAU,EAAE,CAAC;IACbE,UAAU,EAAE,CAAC;IACbE,UAAU,EAAE,CAAC;IACbC,UAAU,EAAE,CAAC;IACbG,WAAW,EAAE,CAAC;IACdC,WAAW,EAAE,CAAC;IACdC,aAAa,EAAE;EACjB,CAAC;EACDC,OAAO,EAAE;AACX,CAAC;AAAC;AAEK,IAAMwB,wBAAwB,GAAG;EACtCjD,MAAM,EAAE;IACN2B,KAAK,EAAE,MAAM;IACbE,GAAG,EAAE,EAAE;IACPO,gBAAgB,EAAE,CAAC;IACnBc,eAAe,EAAE,CAAC;IAClBlC,UAAU,EAAE,CAAC;IACbyB,IAAI,EAAE,CAAC;IACPU,kBAAkB,EAAE,CAAC;IACrBC,oBAAoB,EAAE;EACxB;AACF,CAAC;AAAC;AAEK,IAAMC,iBAAiB,GAAG;EAC/BrD,MAAM,EAAE;IACNA,MAAM,EAAE;MACNC,SAAS,EAAE,UAAU;MACrBC,MAAM,EAAE,IAAI;MAAE;MACdC,cAAc,EAAE,IAAI;MAAE;MACtBC,cAAc,EAAE,IAAI;MAAE;MACtBC,kBAAkB,EAAE,IAAI,CAAE;IAC5B,CAAC;;IACDC,WAAW,EAAE,CAAC;IAAE;IAChBC,WAAW,EAAE,CAAC;IAAE;IAChBC,UAAU,EAAE,CAAC;IAAE;IACfC,UAAU,EAAE,CAAC;IAAE;IACfC,UAAU,EAAE,CAAC;IACbC,iBAAiB,EAAE,CAAC;IACpBC,WAAW,EAAE,CAAC;IAAE;IAChBC,WAAW,EAAE,CAAC;IAAE;IAChBC,UAAU,EAAE,CAAC;IACbC,eAAe,EAAE,CAAC;IAClBC,UAAU,EAAE,CAAC;IACbC,YAAY,EAAE,CAAC;IAAE;IACjBC,UAAU,EAAE,CAAC;IAAE;IACfC,UAAU,EAAE,CAAC;IAAE;IACfC,oBAAoB,EAAE,CAAC;IAAE;IACzBC,mBAAmB,EAAE,CAAC;IAAE;IACxBC,WAAW,EAAE,CAAC;IAAE;IAChBC,WAAW,EAAE,CAAC;IAAE;IAChBC,aAAa,EAAE;EACjB,CAAC;EACDC,OAAO,EAAE;AACX,CAAC;AAAC;AAEK,IAAM6B,uBAAuB,GAAG;EACrCtD,MAAM,EAAE;IACN2B,KAAK,EAAE,MAAM;IACbC,eAAe,EAAE,CAAC;IAAE;IACpBC,GAAG,EAAE,EAAE;IACPC,mBAAmB,EAAE,CAAC;IAAE;IACxBC,cAAc,EAAE,CAAC;IACjBC,gBAAgB,EAAE,CAAC;IACnBC,eAAe,EAAE,CAAC;IAClBC,iBAAiB,EAAE,CAAC;IACpBC,iBAAiB,EAAE,CAAC;IAAE;IACtBC,gBAAgB,EAAE,CAAC;IACnBC,kBAAkB,EAAE,CAAC;IACrBC,eAAe,EAAE,CAAC;IAClBiB,SAAS,EAAE,CAAC;IACZvC,UAAU,EAAE,CAAC;IACbyB,IAAI,EAAE,CAAC,CAAE;EACX,CAAC;;EACDe,gBAAgB,EAAE,IAAI;EACtBC,eAAe,EAAE,IAAI;EACrBC,gBAAgB,EAAE,CAAC;EAAE;EACrBC,iBAAiB,EAAE,CAAC;EACpBC,cAAc,EAAE,CAAC;EACjBC,iBAAiB,EAAE,CAAC;EACpBC,2BAA2B,EAAE,CAAC;EAC9BC,6BAA6B,EAAE,CAAC;EAChCC,wBAAwB,EAAE,CAAC;EAC3BC,aAAa,EAAE,CAAC;EAChBC,kBAAkB,EAAE,CAAC;EACrBC,kBAAkB,EAAE;AACtB,CAAC;AAAC;AAEK,IAAMC,kBAAkB,GAAG;EAChCpE,MAAM,EAAE;IACN2C,gBAAgB,EAAE,CAAC;IAAE;IACrB3C,MAAM,EAAE;MACNC,SAAS,EAAE,UAAU;MACrBC,MAAM,EAAE,IAAI;MACZC,cAAc,EAAE,KAAK;MAAE;MACvBC,cAAc,EAAE,KAAK;MAAE;MACvBC,kBAAkB,EAAE,KAAK,CAAE;IAC7B,CAAC;;IACDC,WAAW,EAAE,CAAC;IAAE;IAChBC,WAAW,EAAE,CAAC;IAAE;IAChBC,UAAU,EAAE,CAAC;IAAE;IACfC,UAAU,EAAE,CAAC;IAAE;IACfC,UAAU,EAAE,CAAC;IAAE;IACfkC,UAAU,EAAE,CAAC;IAAE;IACfC,YAAY,EAAE,CAAC;IAAE;IACjBC,cAAc,EAAE,CAAC;IAAE;IACnBC,iBAAiB,EAAE,CAAC;IAAE;IACtBC,aAAa,EAAE,CAAC;IAAE;IAClBpC,WAAW,EAAE,CAAC;IAAE;IAChBC,WAAW,EAAE,CAAC;IAAE;IAChBC,UAAU,EAAE,CAAC;IAAE;IACfE,UAAU,EAAE,CAAC;IAAE;IACfE,UAAU,EAAE,CAAC;IAAE;IACfC,UAAU,EAAE,CAAC;IAAE;IACfG,WAAW,EAAE,CAAC;IAAE;IAChBC,WAAW,EAAE,CAAC;IAAE;IAChBC,aAAa,EAAE,KAAK,CAAE;EACxB,CAAC;;EACDC,OAAO,EAAE;AACX,CAAC;AAAC;AAEK,IAAM4C,wBAAwB,GAAG;EACtCrE,MAAM,EAAE;IACN2B,KAAK,EAAE,MAAM;IACbE,GAAG,EAAE,EAAE;IACPyC,aAAa,EAAE,CAAC;IAAE;IAClBlC,gBAAgB,EAAE,CAAC;IAAE;IACrBc,eAAe,EAAE,CAAC;IAAE;IACpBlC,UAAU,EAAE,CAAC;IAAE;IACfyB,IAAI,EAAE,CAAC;IACPU,kBAAkB,EAAE,CAAC;IAAE;IACvBC,oBAAoB,EAAE,CAAC,CAAE;EAC3B,CAAC;;EACDI,gBAAgB,EAAE,IAAI;EAAE;EACxBe,QAAQ,EAAE,KAAK;EAAE;EACjBC,iBAAiB,EAAE,KAAK;EAAE;EAC1BC,yBAAyB,EAAE,CAAC;EAAE;EAC9BC,UAAU,EAAE,CAAC;EAAE;EACfC,aAAa,EAAE,CAAC;EAAE;EAClBC,WAAW,EAAE,CAAC;EAAE;EAChBC,0BAA0B,EAAE,CAAC;EAAE;EAC/BX,kBAAkB,EAAE,CAAC;EAAE;EACvBC,kBAAkB,EAAE,CAAC;EAAE;EACvBW,oBAAoB,EAAE,CAAC;EAAE;EACzBC,iBAAiB,EAAE,CAAC;EACpBC,oBAAoB,EAAE,CAAC;EAAE;EACzBC,0BAA0B,EAAE,CAAC;EAAE;EAC/BC,uCAAuC,EAAE,CAAC;EAAE;EAC5CC,4BAA4B,EAAE,CAAC;EAAE;EACjCC,6BAA6B,EAAE,CAAC;EAAE;EAClCC,8BAA8B,EAAE,CAAC;EAAE;EACnCC,4BAA4B,EAAE,CAAC;EAAE;EACjCC,+BAA+B,EAAE,CAAC;EAAE;EACpCC,2BAA2B,EAAE,CAAC;EAAE;EAChCC,2BAA2B,EAAE,CAAC;EAAE;EAChCC,gBAAgB,EAAE;AACpB,CAAC;AAAC"}
|
|
1
|
+
{"version":3,"names":["emptyMqaInterval","audioReceive","audioTransmit","intervalMetadata","peerReflexiveIP","speakerInfo","deviceName","_UNKNOWN_","microphoneInfo","cameraInfo","processAverageCPU","processMaximumCPU","systemAverageCPU","systemMaximumCPU","networkType","intervalNumber","videoReceive","videoTransmit","emptyAudioReceive","common","direction","isMain","mariFecEnabled","mariQosEnabled","multistreamEnabled","dtlsBitrate","dtlsPackets","fecBitrate","fecPackets","maxBitrate","mediaHopByHopLost","rtcpBitrate","rtcpPackets","rtpBitrate","rtpHopByHopLost","rtpPackets","rtpRecovered","rtxBitrate","rtxPackets","srtcpUnprotectErrors","srtpUnprotectErrors","stunBitrate","stunPackets","transportType","streams","emptyAudioReceiveStream","codec","concealedFrames","csi","maxConcealRunLength","optimalBitrate","optimalFrameRate","receivedBitrate","receivedFrameRate","renderedFrameRate","requestedBitrate","requestedFrameRate","rtpEndToEndLost","maxRtpJitter","meanRtpJitter","ssci","emptyAudioTransmit","availableBitrate","queueDelay","remoteJitter","remoteLossRate","remoteReceiveRate","roundTripTime","emptyAudioTransmitStream","requestedFrames","transmittedBitrate","transmittedFrameRate","emptyVideoReceive","emptyVideoReceiveStream","rtpJitter","h264CodecProfile","isActiveSpeaker","optimalFrameSize","receivedFrameSize","receivedHeight","receivedKeyFrames","receivedKeyFramesForRequest","receivedKeyFramesSourceChange","receivedKeyFramesUnknown","receivedWidth","requestedFrameSize","requestedKeyFrames","emptyVideoTransmit","emptyVideoTransmitStream","duplicateSsci","isAvatar","isHardwareEncoded","localConfigurationChanges","maxFrameQp","maxNoiseLevel","minRegionQp","remoteConfigurationChanges","transmittedFrameSize","transmittedHeight","transmittedKeyFrames","transmittedKeyFramesClient","transmittedKeyFramesConfigurationChange","transmittedKeyFramesFeedback","transmittedKeyFramesLocalDrop","transmittedKeyFramesOtherLayer","transmittedKeyFramesPeriodic","transmittedKeyFramesSceneChange","transmittedKeyFramesStartup","transmittedKeyFramesUnknown","transmittedWidth"],"sources":["config.ts"],"sourcesContent":["import {_UNKNOWN_} from '../constants';\n\nexport const emptyMqaInterval = {\n audioReceive: [],\n audioTransmit: [],\n intervalMetadata: {\n peerReflexiveIP: '0.0.0.0',\n speakerInfo: {\n deviceName: _UNKNOWN_,\n },\n microphoneInfo: {\n deviceName: _UNKNOWN_,\n },\n cameraInfo: {\n deviceName: _UNKNOWN_,\n },\n processAverageCPU: 0,\n processMaximumCPU: 0,\n systemAverageCPU: 0,\n systemMaximumCPU: 0,\n },\n networkType: '',\n intervalNumber: 0,\n videoReceive: [],\n videoTransmit: [],\n};\n\nexport const emptyAudioReceive = {\n common: {\n common: {\n direction: 'inactive',\n isMain: true,\n mariFecEnabled: false,\n mariQosEnabled: false,\n multistreamEnabled: false,\n },\n dtlsBitrate: 0,\n dtlsPackets: 0,\n fecBitrate: 0,\n fecPackets: 0,\n maxBitrate: 0,\n mediaHopByHopLost: 0,\n rtcpBitrate: 0,\n rtcpPackets: 0,\n rtpBitrate: 0,\n rtpHopByHopLost: 0,\n rtpPackets: 0,\n rtpRecovered: 0,\n rtxBitrate: 0,\n rtxPackets: 0,\n srtcpUnprotectErrors: 0,\n srtpUnprotectErrors: 0,\n stunBitrate: 0,\n stunPackets: 0,\n transportType: 'UDP',\n },\n streams: [],\n};\n\nexport const emptyAudioReceiveStream = {\n common: {\n codec: 'opus',\n concealedFrames: 0,\n csi: [],\n maxConcealRunLength: 0,\n optimalBitrate: 0,\n optimalFrameRate: 0,\n receivedBitrate: 0,\n receivedFrameRate: 0,\n renderedFrameRate: 0,\n requestedBitrate: 0,\n requestedFrameRate: 0,\n rtpEndToEndLost: 0,\n maxRtpJitter: 0,\n meanRtpJitter: 0,\n rtpPackets: 0,\n ssci: 0,\n },\n};\n\nexport const emptyAudioTransmit = {\n common: {\n availableBitrate: 0,\n common: {\n direction: 'inactive',\n isMain: true,\n mariFecEnabled: false,\n mariQosEnabled: false,\n multistreamEnabled: false,\n },\n dtlsBitrate: 0,\n dtlsPackets: 0,\n fecBitrate: 0,\n fecPackets: 0,\n maxBitrate: 0,\n queueDelay: 0,\n remoteJitter: 0,\n remoteLossRate: 0,\n remoteReceiveRate: 0,\n roundTripTime: 0,\n rtcpBitrate: 0,\n rtcpPackets: 0,\n rtpBitrate: 0,\n rtpPackets: 0,\n rtxBitrate: 0,\n rtxPackets: 0,\n stunBitrate: 0,\n stunPackets: 0,\n transportType: 'UDP',\n },\n streams: [],\n};\n\nexport const emptyAudioTransmitStream = {\n common: {\n codec: 'opus',\n csi: [],\n requestedBitrate: 0,\n requestedFrames: 0,\n rtpPackets: 0,\n ssci: 0,\n transmittedBitrate: 0,\n transmittedFrameRate: 0,\n },\n};\n\nexport const emptyVideoReceive = {\n common: {\n common: {\n direction: 'inactive',\n isMain: true, // Not avaliable\n mariFecEnabled: true, // Not avaliable\n mariQosEnabled: true, // Not avaliable\n multistreamEnabled: true, // Not avaliable\n },\n dtlsBitrate: 0, // Not avaliable\n dtlsPackets: 0, // Not avaliable\n fecBitrate: 0, // Not avaliable\n fecPackets: 0, // Not avaliable\n maxBitrate: 0,\n mediaHopByHopLost: 0,\n rtcpBitrate: 0, // Not avaliable\n rtcpPackets: 0, // Not avaliable\n rtpBitrate: 0,\n rtpHopByHopLost: 0,\n rtpPackets: 0,\n rtpRecovered: 0, // Not avaliable\n rtxBitrate: 0, // Not avaliable\n rtxPackets: 0, // Not avaliable\n srtcpUnprotectErrors: 0, // Not avaliable\n srtpUnprotectErrors: 0, // Not avaliable\n stunBitrate: 0, // Not avaliable\n stunPackets: 0, // Not avaliable\n transportType: 'UDP',\n },\n streams: [],\n};\n\nexport const emptyVideoReceiveStream = {\n common: {\n codec: 'H264',\n concealedFrames: 0, // Not avaliable\n csi: [],\n maxConcealRunLength: 0, // Not avaliable\n optimalBitrate: 0,\n optimalFrameRate: 0,\n receivedBitrate: 0,\n receivedFrameRate: 0,\n renderedFrameRate: 0, // Not avaliable\n requestedBitrate: 0,\n requestedFrameRate: 0,\n rtpEndToEndLost: 0,\n rtpJitter: 0,\n rtpPackets: 0,\n ssci: 0, // Not avaliable\n },\n h264CodecProfile: 'BP',\n isActiveSpeaker: true,\n optimalFrameSize: 0, // Not avaliable\n receivedFrameSize: 0,\n receivedHeight: 0,\n receivedKeyFrames: 0,\n receivedKeyFramesForRequest: 0,\n receivedKeyFramesSourceChange: 0,\n receivedKeyFramesUnknown: 0,\n receivedWidth: 0,\n requestedFrameSize: 0,\n requestedKeyFrames: 0,\n};\n\nexport const emptyVideoTransmit = {\n common: {\n availableBitrate: 0, // Not avaliable currently hardcoded\n common: {\n direction: 'inactive',\n isMain: true,\n mariFecEnabled: false, // Not avaliable\n mariQosEnabled: false, // Not avaliable\n multistreamEnabled: false, // Not avaliable\n },\n dtlsBitrate: 0, // Not avaliable\n dtlsPackets: 0, // Not avaliable\n fecBitrate: 0, // Not avaliable\n fecPackets: 0, // TODO: check inbound-rtp// Not avaliable\n maxBitrate: 0, // Currently hardcoded\n queueDelay: 0, // outboundRtp.totalPacketSentDelay // TODO: check if totalInterFrameDelay/ packetSentDelay/ jitterBufferDalay\n remoteJitter: 0, // remoteInboundRtp.jitter\n remoteLossRate: 0, // comparedResults.lossRate\n remoteReceiveRate: 0, // compareResults.packetsLost\n roundTripTime: 0, // compareResults.roundTripTime\n rtcpBitrate: 0, // Dont have access to it\n rtcpPackets: 0, // Dont have access to rtcp\n rtpBitrate: 0, // Dont have access\n rtpPackets: 0, // outboundRtp.packetsSent\n rtxBitrate: 0, // Dont have access to it\n rtxPackets: 0, // Dont have access to it\n stunBitrate: 0, // Dont have access to it\n stunPackets: 0, // Dont have access to it\n transportType: 'UDP', // TODO: need to calculate\n },\n streams: [],\n};\n\nexport const emptyVideoTransmitStream = {\n common: {\n codec: 'H264',\n csi: [],\n duplicateSsci: 0, // Not Avaliable\n requestedBitrate: 0, // TODO: from remote SDP\n requestedFrames: 0, // TODO: from remote SDP\n rtpPackets: 0, // same as rtp packets\n ssci: 0,\n transmittedBitrate: 0, // TODO: get in the candidate pair\n transmittedFrameRate: 0, // TODO: from track info\n },\n h264CodecProfile: 'BP', // TODO: from localSDP\n isAvatar: false, // Not Avaliable\n isHardwareEncoded: false, // Not Avaliable\n localConfigurationChanges: 2, // Not Avaliable\n maxFrameQp: 0, // Not Avaliable\n maxNoiseLevel: 0, // Not Avaliable\n minRegionQp: 0, // Not Avaliable\n remoteConfigurationChanges: 0, // Not Avaliable\n requestedFrameSize: 0, // TODO: from remote SDP\n requestedKeyFrames: 0, // outbound Fir request\n transmittedFrameSize: 0, // Not Avaliable\n transmittedHeight: 0,\n transmittedKeyFrames: 0, // Key frames encoded\n transmittedKeyFramesClient: 0, // Not Avaliable\n transmittedKeyFramesConfigurationChange: 0, // Not Avaliable\n transmittedKeyFramesFeedback: 0, // Not Avaliable\n transmittedKeyFramesLocalDrop: 0, // Not Avaliable\n transmittedKeyFramesOtherLayer: 0, // Not Avaliable\n transmittedKeyFramesPeriodic: 0, // Not Avaliable\n transmittedKeyFramesSceneChange: 0, // Not Avaliable\n transmittedKeyFramesStartup: 0, // Not Avaliable\n transmittedKeyFramesUnknown: 0, // Not Avaliable\n transmittedWidth: 0,\n};\n"],"mappings":";;;;;;;AAAA;AAEO,IAAMA,gBAAgB,GAAG;EAC9BC,YAAY,EAAE,EAAE;EAChBC,aAAa,EAAE,EAAE;EACjBC,gBAAgB,EAAE;IAChBC,eAAe,EAAE,SAAS;IAC1BC,WAAW,EAAE;MACXC,UAAU,EAAEC;IACd,CAAC;IACDC,cAAc,EAAE;MACdF,UAAU,EAAEC;IACd,CAAC;IACDE,UAAU,EAAE;MACVH,UAAU,EAAEC;IACd,CAAC;IACDG,iBAAiB,EAAE,CAAC;IACpBC,iBAAiB,EAAE,CAAC;IACpBC,gBAAgB,EAAE,CAAC;IACnBC,gBAAgB,EAAE;EACpB,CAAC;EACDC,WAAW,EAAE,EAAE;EACfC,cAAc,EAAE,CAAC;EACjBC,YAAY,EAAE,EAAE;EAChBC,aAAa,EAAE;AACjB,CAAC;AAAC;AAEK,IAAMC,iBAAiB,GAAG;EAC/BC,MAAM,EAAE;IACNA,MAAM,EAAE;MACNC,SAAS,EAAE,UAAU;MACrBC,MAAM,EAAE,IAAI;MACZC,cAAc,EAAE,KAAK;MACrBC,cAAc,EAAE,KAAK;MACrBC,kBAAkB,EAAE;IACtB,CAAC;IACDC,WAAW,EAAE,CAAC;IACdC,WAAW,EAAE,CAAC;IACdC,UAAU,EAAE,CAAC;IACbC,UAAU,EAAE,CAAC;IACbC,UAAU,EAAE,CAAC;IACbC,iBAAiB,EAAE,CAAC;IACpBC,WAAW,EAAE,CAAC;IACdC,WAAW,EAAE,CAAC;IACdC,UAAU,EAAE,CAAC;IACbC,eAAe,EAAE,CAAC;IAClBC,UAAU,EAAE,CAAC;IACbC,YAAY,EAAE,CAAC;IACfC,UAAU,EAAE,CAAC;IACbC,UAAU,EAAE,CAAC;IACbC,oBAAoB,EAAE,CAAC;IACvBC,mBAAmB,EAAE,CAAC;IACtBC,WAAW,EAAE,CAAC;IACdC,WAAW,EAAE,CAAC;IACdC,aAAa,EAAE;EACjB,CAAC;EACDC,OAAO,EAAE;AACX,CAAC;AAAC;AAEK,IAAMC,uBAAuB,GAAG;EACrC1B,MAAM,EAAE;IACN2B,KAAK,EAAE,MAAM;IACbC,eAAe,EAAE,CAAC;IAClBC,GAAG,EAAE,EAAE;IACPC,mBAAmB,EAAE,CAAC;IACtBC,cAAc,EAAE,CAAC;IACjBC,gBAAgB,EAAE,CAAC;IACnBC,eAAe,EAAE,CAAC;IAClBC,iBAAiB,EAAE,CAAC;IACpBC,iBAAiB,EAAE,CAAC;IACpBC,gBAAgB,EAAE,CAAC;IACnBC,kBAAkB,EAAE,CAAC;IACrBC,eAAe,EAAE,CAAC;IAClBC,YAAY,EAAE,CAAC;IACfC,aAAa,EAAE,CAAC;IAChBxB,UAAU,EAAE,CAAC;IACbyB,IAAI,EAAE;EACR;AACF,CAAC;AAAC;AAEK,IAAMC,kBAAkB,GAAG;EAChC1C,MAAM,EAAE;IACN2C,gBAAgB,EAAE,CAAC;IACnB3C,MAAM,EAAE;MACNC,SAAS,EAAE,UAAU;MACrBC,MAAM,EAAE,IAAI;MACZC,cAAc,EAAE,KAAK;MACrBC,cAAc,EAAE,KAAK;MACrBC,kBAAkB,EAAE;IACtB,CAAC;IACDC,WAAW,EAAE,CAAC;IACdC,WAAW,EAAE,CAAC;IACdC,UAAU,EAAE,CAAC;IACbC,UAAU,EAAE,CAAC;IACbC,UAAU,EAAE,CAAC;IACbkC,UAAU,EAAE,CAAC;IACbC,YAAY,EAAE,CAAC;IACfC,cAAc,EAAE,CAAC;IACjBC,iBAAiB,EAAE,CAAC;IACpBC,aAAa,EAAE,CAAC;IAChBpC,WAAW,EAAE,CAAC;IACdC,WAAW,EAAE,CAAC;IACdC,UAAU,EAAE,CAAC;IACbE,UAAU,EAAE,CAAC;IACbE,UAAU,EAAE,CAAC;IACbC,UAAU,EAAE,CAAC;IACbG,WAAW,EAAE,CAAC;IACdC,WAAW,EAAE,CAAC;IACdC,aAAa,EAAE;EACjB,CAAC;EACDC,OAAO,EAAE;AACX,CAAC;AAAC;AAEK,IAAMwB,wBAAwB,GAAG;EACtCjD,MAAM,EAAE;IACN2B,KAAK,EAAE,MAAM;IACbE,GAAG,EAAE,EAAE;IACPO,gBAAgB,EAAE,CAAC;IACnBc,eAAe,EAAE,CAAC;IAClBlC,UAAU,EAAE,CAAC;IACbyB,IAAI,EAAE,CAAC;IACPU,kBAAkB,EAAE,CAAC;IACrBC,oBAAoB,EAAE;EACxB;AACF,CAAC;AAAC;AAEK,IAAMC,iBAAiB,GAAG;EAC/BrD,MAAM,EAAE;IACNA,MAAM,EAAE;MACNC,SAAS,EAAE,UAAU;MACrBC,MAAM,EAAE,IAAI;MAAE;MACdC,cAAc,EAAE,IAAI;MAAE;MACtBC,cAAc,EAAE,IAAI;MAAE;MACtBC,kBAAkB,EAAE,IAAI,CAAE;IAC5B,CAAC;;IACDC,WAAW,EAAE,CAAC;IAAE;IAChBC,WAAW,EAAE,CAAC;IAAE;IAChBC,UAAU,EAAE,CAAC;IAAE;IACfC,UAAU,EAAE,CAAC;IAAE;IACfC,UAAU,EAAE,CAAC;IACbC,iBAAiB,EAAE,CAAC;IACpBC,WAAW,EAAE,CAAC;IAAE;IAChBC,WAAW,EAAE,CAAC;IAAE;IAChBC,UAAU,EAAE,CAAC;IACbC,eAAe,EAAE,CAAC;IAClBC,UAAU,EAAE,CAAC;IACbC,YAAY,EAAE,CAAC;IAAE;IACjBC,UAAU,EAAE,CAAC;IAAE;IACfC,UAAU,EAAE,CAAC;IAAE;IACfC,oBAAoB,EAAE,CAAC;IAAE;IACzBC,mBAAmB,EAAE,CAAC;IAAE;IACxBC,WAAW,EAAE,CAAC;IAAE;IAChBC,WAAW,EAAE,CAAC;IAAE;IAChBC,aAAa,EAAE;EACjB,CAAC;EACDC,OAAO,EAAE;AACX,CAAC;AAAC;AAEK,IAAM6B,uBAAuB,GAAG;EACrCtD,MAAM,EAAE;IACN2B,KAAK,EAAE,MAAM;IACbC,eAAe,EAAE,CAAC;IAAE;IACpBC,GAAG,EAAE,EAAE;IACPC,mBAAmB,EAAE,CAAC;IAAE;IACxBC,cAAc,EAAE,CAAC;IACjBC,gBAAgB,EAAE,CAAC;IACnBC,eAAe,EAAE,CAAC;IAClBC,iBAAiB,EAAE,CAAC;IACpBC,iBAAiB,EAAE,CAAC;IAAE;IACtBC,gBAAgB,EAAE,CAAC;IACnBC,kBAAkB,EAAE,CAAC;IACrBC,eAAe,EAAE,CAAC;IAClBiB,SAAS,EAAE,CAAC;IACZvC,UAAU,EAAE,CAAC;IACbyB,IAAI,EAAE,CAAC,CAAE;EACX,CAAC;;EACDe,gBAAgB,EAAE,IAAI;EACtBC,eAAe,EAAE,IAAI;EACrBC,gBAAgB,EAAE,CAAC;EAAE;EACrBC,iBAAiB,EAAE,CAAC;EACpBC,cAAc,EAAE,CAAC;EACjBC,iBAAiB,EAAE,CAAC;EACpBC,2BAA2B,EAAE,CAAC;EAC9BC,6BAA6B,EAAE,CAAC;EAChCC,wBAAwB,EAAE,CAAC;EAC3BC,aAAa,EAAE,CAAC;EAChBC,kBAAkB,EAAE,CAAC;EACrBC,kBAAkB,EAAE;AACtB,CAAC;AAAC;AAEK,IAAMC,kBAAkB,GAAG;EAChCpE,MAAM,EAAE;IACN2C,gBAAgB,EAAE,CAAC;IAAE;IACrB3C,MAAM,EAAE;MACNC,SAAS,EAAE,UAAU;MACrBC,MAAM,EAAE,IAAI;MACZC,cAAc,EAAE,KAAK;MAAE;MACvBC,cAAc,EAAE,KAAK;MAAE;MACvBC,kBAAkB,EAAE,KAAK,CAAE;IAC7B,CAAC;;IACDC,WAAW,EAAE,CAAC;IAAE;IAChBC,WAAW,EAAE,CAAC;IAAE;IAChBC,UAAU,EAAE,CAAC;IAAE;IACfC,UAAU,EAAE,CAAC;IAAE;IACfC,UAAU,EAAE,CAAC;IAAE;IACfkC,UAAU,EAAE,CAAC;IAAE;IACfC,YAAY,EAAE,CAAC;IAAE;IACjBC,cAAc,EAAE,CAAC;IAAE;IACnBC,iBAAiB,EAAE,CAAC;IAAE;IACtBC,aAAa,EAAE,CAAC;IAAE;IAClBpC,WAAW,EAAE,CAAC;IAAE;IAChBC,WAAW,EAAE,CAAC;IAAE;IAChBC,UAAU,EAAE,CAAC;IAAE;IACfE,UAAU,EAAE,CAAC;IAAE;IACfE,UAAU,EAAE,CAAC;IAAE;IACfC,UAAU,EAAE,CAAC;IAAE;IACfG,WAAW,EAAE,CAAC;IAAE;IAChBC,WAAW,EAAE,CAAC;IAAE;IAChBC,aAAa,EAAE,KAAK,CAAE;EACxB,CAAC;;EACDC,OAAO,EAAE;AACX,CAAC;AAAC;AAEK,IAAM4C,wBAAwB,GAAG;EACtCrE,MAAM,EAAE;IACN2B,KAAK,EAAE,MAAM;IACbE,GAAG,EAAE,EAAE;IACPyC,aAAa,EAAE,CAAC;IAAE;IAClBlC,gBAAgB,EAAE,CAAC;IAAE;IACrBc,eAAe,EAAE,CAAC;IAAE;IACpBlC,UAAU,EAAE,CAAC;IAAE;IACfyB,IAAI,EAAE,CAAC;IACPU,kBAAkB,EAAE,CAAC;IAAE;IACvBC,oBAAoB,EAAE,CAAC,CAAE;EAC3B,CAAC;;EACDI,gBAAgB,EAAE,IAAI;EAAE;EACxBe,QAAQ,EAAE,KAAK;EAAE;EACjBC,iBAAiB,EAAE,KAAK;EAAE;EAC1BC,yBAAyB,EAAE,CAAC;EAAE;EAC9BC,UAAU,EAAE,CAAC;EAAE;EACfC,aAAa,EAAE,CAAC;EAAE;EAClBC,WAAW,EAAE,CAAC;EAAE;EAChBC,0BAA0B,EAAE,CAAC;EAAE;EAC/BX,kBAAkB,EAAE,CAAC;EAAE;EACvBC,kBAAkB,EAAE,CAAC;EAAE;EACvBW,oBAAoB,EAAE,CAAC;EAAE;EACzBC,iBAAiB,EAAE,CAAC;EACpBC,oBAAoB,EAAE,CAAC;EAAE;EACzBC,0BAA0B,EAAE,CAAC;EAAE;EAC/BC,uCAAuC,EAAE,CAAC;EAAE;EAC5CC,4BAA4B,EAAE,CAAC;EAAE;EACjCC,6BAA6B,EAAE,CAAC;EAAE;EAClCC,8BAA8B,EAAE,CAAC;EAAE;EACnCC,4BAA4B,EAAE,CAAC;EAAE;EACjCC,+BAA+B,EAAE,CAAC;EAAE;EACpCC,2BAA2B,EAAE,CAAC;EAAE;EAChCC,2BAA2B,EAAE,CAAC;EAAE;EAChCC,gBAAgB,EAAE;AACpB,CAAC;AAAC"}
|
|
@@ -442,24 +442,21 @@ var StatsAnalyzer = /*#__PURE__*/function (_EventsScope) {
|
|
|
442
442
|
newMqa.intervalMetadata.peerReflexiveIP = this.statsResults.connectionType.local.ipAddress;
|
|
443
443
|
|
|
444
444
|
// Adding peripheral information
|
|
445
|
-
newMqa.intervalMetadata.
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
});
|
|
445
|
+
newMqa.intervalMetadata.speakerInfo = {
|
|
446
|
+
deviceName: _constants._UNKNOWN_
|
|
447
|
+
};
|
|
449
448
|
if (this.statsResults['audio-send']) {
|
|
450
|
-
newMqa.intervalMetadata.
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
});
|
|
449
|
+
newMqa.intervalMetadata.microphoneInfo = {
|
|
450
|
+
deviceName: this.statsResults['audio-send'].trackLabel || _constants._UNKNOWN_
|
|
451
|
+
};
|
|
454
452
|
}
|
|
455
453
|
var existingVideoSender = (0, _keys.default)(this.statsResults).find(function (item) {
|
|
456
454
|
return item.includes('video-send');
|
|
457
455
|
});
|
|
458
456
|
if (existingVideoSender) {
|
|
459
|
-
newMqa.intervalMetadata.
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
});
|
|
457
|
+
newMqa.intervalMetadata.cameraInfo = {
|
|
458
|
+
deviceName: this.statsResults[existingVideoSender].trackLabel || _constants._UNKNOWN_
|
|
459
|
+
};
|
|
463
460
|
}
|
|
464
461
|
newMqa.networkType = this.statsResults.connectionType.local.networkType;
|
|
465
462
|
this.mqaSentCount += 1;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["EVENTS","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","config","receiveSlotCallback","undefined","networkQualityMonitor","statsResults","defaultStats","mediaType","previousValue","currentValue","isLocal","Error","lastEmittedStartStopEvent","lastEmittedEvent","local","remote","newEvent","emit","file","function","type","successfulCandidatePairId","candidates","newIpAddress","localCandidate","candidateType","address","relayProtocol","relatedAddress","localIpAddress","result","isSender","isRemote","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","forEach","includes","recv","send","status","meetingMediaStatus","actual","expected","newMqa","emptyMqaInterval","audioSender","emptyAudioTransmit","audioShareSender","audioReceiver","emptyAudioReceive","audioShareReceiver","videoSender","emptyVideoTransmit","videoShareSender","videoReceiver","emptyVideoReceive","videoShareReceiver","getAudioSenderMqa","baseMediaType","audioTransmit","push","getAudioReceiverMqa","audioReceive","getVideoSenderMqa","videoTransmit","getVideoReceiverMqa","videoReceive","startsWith","audioSenderStream","emptyAudioTransmitStream","getAudioSenderStreamMqa","streams","audioReceiverStream","emptyAudioReceiveStream","getAudioReceiverStreamMqa","videoSenderStream","emptyVideoTransmitStream","getVideoSenderStreamMqa","videoReceiverStream","emptyVideoReceiveStream","getVideoReceiverStreamMqa","intervalMetadata","peerReflexiveIP","peripherals","information","_UNKNOWN_","name","MEDIA_DEVICES","SPEAKER","MICROPHONE","existingVideoSender","find","item","CAMERA","intervalNumber","resetStatsResults","data","mediaConnection","getStatsAndParse","then","statsInterval","setInterval","analyzerInterval","sendMqaData","mqaInterval","MQA_INTERVAL","resolve","sendOneLastMqa","clearInterval","getStatsResult","processOutboundRTPResult","processInboundRTPResult","compareSentAndReceived","parseCandidate","parseAudioSource","statsItem","types","DEFAULT_GET_STATS_FILTER","report","state","videoSenderIndex","newType","parseGetStatsResult","direction","currentDirection","localTrackLabel","csi","extractAndSetLocalIpAddressInfoForDiagnostics","audioLevel","totalAudioEnergy","getCurrentStatsTotals","keyPrefix","value","filter","key","reduce","prev","cur","getPreviousStatsTotals","currentStats","previousStats","sendAudio","totalPacketsSent","LoggerProxy","logger","info","emitStartStopEvents","currentAudioPacketsReceived","previousAudioPacketsReceived","currentTotalPacketsSent","previousTotalPacketsSent","currentFramesEncoded","previousFramesEncoded","currentFramesSent","previousFramesSent","doesVideoSendExist","some","sendVideo","currentVideoFramesDecoded","previousVideoFramesDecoded","sendShare","framesEncoded","framesSent","currentShareFramesDecoded","previousShareFramesDecoded","getConnectionState","ConnectionState","Failed","trace","getTransceiverStats","transceiverStats","video","receivers","receiver","i","filterAndParseGetStatsResults","audio","screenShareVideo","screenShareAudio","senders","sender","compareLastStatsResult","JSON","parse","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.startsWith('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.startsWith('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.startsWith('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.startsWith('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.startsWith('video-send-layer')) {\n // We only want the stream-specific stats we get with video-send-layer-0, video-send-layer-1, etc.\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.startsWith('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.startsWith('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.startsWith('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\n const existingVideoSender = Object.keys(this.statsResults).find((item) =>\n item.includes('video-send')\n );\n\n if (existingVideoSender) {\n newMqa.intervalMetadata.peripherals.push({\n information: this.statsResults[existingVideoSender].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 let videoSenderIndex = 0;\n statsItem.report.forEach((result) => {\n if (types.includes(result.type)) {\n // if the video sender has multiple streams in the report, it is a new stream object.\n if (type === 'video-send' && result.type === 'outbound-rtp') {\n const newType = `video-send-layer-${videoSenderIndex}`;\n this.parseGetStatsResult(result, newType, isSender);\n videoSenderIndex += 1;\n\n this.statsResults[newType].direction = statsItem.currentDirection;\n this.statsResults[newType].trackLabel = statsItem.localTrackLabel;\n this.statsResults[newType].csi = statsItem.csi;\n } else {\n this.parseGetStatsResult(result, type, isSender);\n }\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(\n (prev, cur) =>\n prev +\n (this.statsResults[cur]?.[keyPrefix.includes('send') ? 'send' : 'recv'][value] || 0),\n 0\n );\n\n const getPreviousStatsTotals = (keyPrefix: string, value: string): number =>\n Object.keys(this.statsResults)\n .filter((key) => key.startsWith(keyPrefix))\n .reduce(\n (prev, cur) =>\n prev +\n (this.lastStatsResults[cur]?.[keyPrefix.includes('send') ? 'send' : 'recv'][value] ||\n 0),\n 0\n );\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 const currentTotalPacketsSent = getCurrentStatsTotals('video-send', 'totalPacketsSent');\n const previousTotalPacketsSent = getPreviousStatsTotals('video-send', 'totalPacketsSent');\n\n const currentFramesEncoded = getCurrentStatsTotals('video-send', 'framesEncoded');\n const previousFramesEncoded = getPreviousStatsTotals('video-send', 'framesEncoded');\n\n const currentFramesSent = getCurrentStatsTotals('video-send', 'framesSent');\n const previousFramesSent = getPreviousStatsTotals('video-send', 'framesSent');\n\n const doesVideoSendExist = Object.keys(this.lastStatsResults).some((item) =>\n item.includes('video-send')\n );\n\n // Video Transmit\n if (doesVideoSendExist) {\n // compare video stats sent\n\n if (\n this.meetingMediaStatus.expected.sendVideo &&\n (currentTotalPacketsSent === previousTotalPacketsSent || currentTotalPacketsSent === 0)\n ) {\n LoggerProxy.logger.info(\n `StatsAnalyzer:index#compareLastStatsResult --> No video RTP packets sent`,\n currentTotalPacketsSent\n );\n } else {\n if (\n this.meetingMediaStatus.expected.sendVideo &&\n (currentFramesEncoded === previousFramesEncoded || currentFramesEncoded === 0)\n ) {\n LoggerProxy.logger.info(\n `StatsAnalyzer:index#compareLastStatsResult --> No video Frames Encoded`,\n currentFramesEncoded\n );\n }\n\n if (\n this.meetingMediaStatus.expected.sendVideo &&\n (currentFramesSent === previousFramesSent || currentFramesSent === 0)\n ) {\n LoggerProxy.logger.info(\n `StatsAnalyzer:index#compareLastStatsResult --> No video Frames sent`,\n currentFramesSent\n );\n }\n }\n\n this.emitStartStopEvents('video', previousFramesSent, currentFramesSent, 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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"}
|
|
1
|
+
{"version":3,"names":["EVENTS","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","config","receiveSlotCallback","undefined","networkQualityMonitor","statsResults","defaultStats","mediaType","previousValue","currentValue","isLocal","Error","lastEmittedStartStopEvent","lastEmittedEvent","local","remote","newEvent","emit","file","function","type","successfulCandidatePairId","candidates","newIpAddress","localCandidate","candidateType","address","relayProtocol","relatedAddress","localIpAddress","result","isSender","isRemote","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","forEach","includes","recv","send","status","meetingMediaStatus","actual","expected","newMqa","emptyMqaInterval","audioSender","emptyAudioTransmit","audioShareSender","audioReceiver","emptyAudioReceive","audioShareReceiver","videoSender","emptyVideoTransmit","videoShareSender","videoReceiver","emptyVideoReceive","videoShareReceiver","getAudioSenderMqa","baseMediaType","audioTransmit","push","getAudioReceiverMqa","audioReceive","getVideoSenderMqa","videoTransmit","getVideoReceiverMqa","videoReceive","startsWith","audioSenderStream","emptyAudioTransmitStream","getAudioSenderStreamMqa","streams","audioReceiverStream","emptyAudioReceiveStream","getAudioReceiverStreamMqa","videoSenderStream","emptyVideoTransmitStream","getVideoSenderStreamMqa","videoReceiverStream","emptyVideoReceiveStream","getVideoReceiverStreamMqa","intervalMetadata","peerReflexiveIP","speakerInfo","deviceName","_UNKNOWN_","microphoneInfo","existingVideoSender","find","item","cameraInfo","intervalNumber","resetStatsResults","data","mediaConnection","getStatsAndParse","then","statsInterval","setInterval","analyzerInterval","sendMqaData","mqaInterval","MQA_INTERVAL","resolve","sendOneLastMqa","clearInterval","getStatsResult","processOutboundRTPResult","processInboundRTPResult","compareSentAndReceived","parseCandidate","parseAudioSource","statsItem","types","DEFAULT_GET_STATS_FILTER","report","state","videoSenderIndex","newType","parseGetStatsResult","direction","currentDirection","localTrackLabel","csi","extractAndSetLocalIpAddressInfoForDiagnostics","audioLevel","totalAudioEnergy","getCurrentStatsTotals","keyPrefix","value","filter","key","reduce","prev","cur","getPreviousStatsTotals","currentStats","previousStats","sendAudio","totalPacketsSent","LoggerProxy","logger","info","emitStartStopEvents","currentAudioPacketsReceived","previousAudioPacketsReceived","currentTotalPacketsSent","previousTotalPacketsSent","currentFramesEncoded","previousFramesEncoded","currentFramesSent","previousFramesSent","doesVideoSendExist","some","sendVideo","currentVideoFramesDecoded","previousVideoFramesDecoded","sendShare","framesEncoded","framesSent","currentShareFramesDecoded","previousShareFramesDecoded","getConnectionState","ConnectionState","Failed","trace","getTransceiverStats","transceiverStats","video","receivers","receiver","i","filterAndParseGetStatsResults","audio","screenShareVideo","screenShareAudio","senders","sender","compareLastStatsResult","JSON","parse","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 {DEFAULT_GET_STATS_FILTER, STATS, MQA_INTERVAL, NETWORK_TYPE, _UNKNOWN_} 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.startsWith('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.startsWith('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.startsWith('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.startsWith('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.startsWith('video-send-layer')) {\n // We only want the stream-specific stats we get with video-send-layer-0, video-send-layer-1, etc.\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.startsWith('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.startsWith('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.startsWith('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.speakerInfo = {\n deviceName: _UNKNOWN_,\n };\n if (this.statsResults['audio-send']) {\n newMqa.intervalMetadata.microphoneInfo = {\n deviceName: this.statsResults['audio-send'].trackLabel || _UNKNOWN_,\n };\n }\n\n const existingVideoSender = Object.keys(this.statsResults).find((item) =>\n item.includes('video-send')\n );\n\n if (existingVideoSender) {\n newMqa.intervalMetadata.cameraInfo = {\n deviceName: this.statsResults[existingVideoSender].trackLabel || _UNKNOWN_,\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 let videoSenderIndex = 0;\n statsItem.report.forEach((result) => {\n if (types.includes(result.type)) {\n // if the video sender has multiple streams in the report, it is a new stream object.\n if (type === 'video-send' && result.type === 'outbound-rtp') {\n const newType = `video-send-layer-${videoSenderIndex}`;\n this.parseGetStatsResult(result, newType, isSender);\n videoSenderIndex += 1;\n\n this.statsResults[newType].direction = statsItem.currentDirection;\n this.statsResults[newType].trackLabel = statsItem.localTrackLabel;\n this.statsResults[newType].csi = statsItem.csi;\n } else {\n this.parseGetStatsResult(result, type, isSender);\n }\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(\n (prev, cur) =>\n prev +\n (this.statsResults[cur]?.[keyPrefix.includes('send') ? 'send' : 'recv'][value] || 0),\n 0\n );\n\n const getPreviousStatsTotals = (keyPrefix: string, value: string): number =>\n Object.keys(this.statsResults)\n .filter((key) => key.startsWith(keyPrefix))\n .reduce(\n (prev, cur) =>\n prev +\n (this.lastStatsResults[cur]?.[keyPrefix.includes('send') ? 'send' : 'recv'][value] ||\n 0),\n 0\n );\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 const currentTotalPacketsSent = getCurrentStatsTotals('video-send', 'totalPacketsSent');\n const previousTotalPacketsSent = getPreviousStatsTotals('video-send', 'totalPacketsSent');\n\n const currentFramesEncoded = getCurrentStatsTotals('video-send', 'framesEncoded');\n const previousFramesEncoded = getPreviousStatsTotals('video-send', 'framesEncoded');\n\n const currentFramesSent = getCurrentStatsTotals('video-send', 'framesSent');\n const previousFramesSent = getPreviousStatsTotals('video-send', 'framesSent');\n\n const doesVideoSendExist = Object.keys(this.lastStatsResults).some((item) =>\n item.includes('video-send')\n );\n\n // Video Transmit\n if (doesVideoSendExist) {\n // compare video stats sent\n\n if (\n this.meetingMediaStatus.expected.sendVideo &&\n (currentTotalPacketsSent === previousTotalPacketsSent || currentTotalPacketsSent === 0)\n ) {\n LoggerProxy.logger.info(\n `StatsAnalyzer:index#compareLastStatsResult --> No video RTP packets sent`,\n currentTotalPacketsSent\n );\n } else {\n if (\n this.meetingMediaStatus.expected.sendVideo &&\n (currentFramesEncoded === previousFramesEncoded || currentFramesEncoded === 0)\n ) {\n LoggerProxy.logger.info(\n `StatsAnalyzer:index#compareLastStatsResult --> No video Frames Encoded`,\n currentFramesEncoded\n );\n }\n\n if (\n this.meetingMediaStatus.expected.sendVideo &&\n (currentFramesSent === previousFramesSent || currentFramesSent === 0)\n ) {\n LoggerProxy.logger.info(\n `StatsAnalyzer:index#compareLastStatsResult --> No video Frames sent`,\n currentFramesSent\n );\n }\n }\n\n this.emitStartStopEvents('video', previousFramesSent, currentFramesSent, 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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"}
|
|
@@ -1026,11 +1026,6 @@ export declare const AVAILABLE_RESOLUTIONS: {
|
|
|
1026
1026
|
};
|
|
1027
1027
|
};
|
|
1028
1028
|
export declare const MQA_INTERVAL = 60000;
|
|
1029
|
-
export declare const MEDIA_DEVICES: {
|
|
1030
|
-
MICROPHONE: string;
|
|
1031
|
-
SPEAKER: string;
|
|
1032
|
-
CAMERA: string;
|
|
1033
|
-
};
|
|
1034
1029
|
export declare const PSTN_STATUS: {
|
|
1035
1030
|
JOINED: string;
|
|
1036
1031
|
CONNECTED: string;
|
|
@@ -3,7 +3,15 @@ export declare const emptyMqaInterval: {
|
|
|
3
3
|
audioTransmit: any[];
|
|
4
4
|
intervalMetadata: {
|
|
5
5
|
peerReflexiveIP: string;
|
|
6
|
-
|
|
6
|
+
speakerInfo: {
|
|
7
|
+
deviceName: string;
|
|
8
|
+
};
|
|
9
|
+
microphoneInfo: {
|
|
10
|
+
deviceName: string;
|
|
11
|
+
};
|
|
12
|
+
cameraInfo: {
|
|
13
|
+
deviceName: string;
|
|
14
|
+
};
|
|
7
15
|
processAverageCPU: number;
|
|
8
16
|
processMaximumCPU: number;
|
|
9
17
|
systemAverageCPU: number;
|
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: "3.0.0-beta.
|
|
65
|
+
version: "3.0.0-beta.424"
|
|
66
66
|
});
|
|
67
67
|
var _default = Webinar;
|
|
68
68
|
exports.default = _default;
|