@webex/plugin-meetings 3.0.0-beta.276 → 3.0.0-beta.278

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.
@@ -1 +1 @@
1
- {"version":3,"names":["getAudioReceiverMqa","audioReceiver","statsResults","lastMqaDataSent","mediaType","sendrecvType","STATS","RECEIVE_DIRECTION","lastPacketsReceived","totalPacketsReceived","lastPacketsLost","totalPacketsLost","lastPacketsDecoded","totalSamplesDecoded","lastSamplesReceived","totalSamplesReceived","lastConcealedSamples","concealedSamples","lastBytesReceived","totalBytesReceived","lastFecPacketsReceived","fecPacketsReceived","lastFecPacketsDiscarded","fecPacketsDiscarded","csi","streams","common","includes","push","direction","transportType","connectionType","remote","transport","rtpPackets","mediaHopByHopLost","rtpHopByHopLost","maxRtpJitter","meanRtpJitter","rtpJitter","fecRecovered","rtpEndToEndLost","framesDropped","renderedFrameRate","framesReceived","concealedFrames","receivedBitrate","rtpBitrate","getAudioSenderMqa","audioSender","SEND_DIRECTION","lastPacketsSent","totalPacketsSent","totalPacketsLostOnReceiver","lastBytesSent","totalBytesSent","lastFramesEncoded","totalKeyFramesEncoded","lastFirCount","totalFirCount","local","maxRemoteJitter","meanRemoteJitter","availableBitrate","availableOutgoingBitrate","totalpacketsLostForaMin","remoteLossRate","maxRoundTripTime","meanRoundTripTime","roundTripTime","totalBytesSentInaMin","transmittedBitrate","transmittedKeyFrames","requestedKeyFrames","getVideoReceiverMqa","videoReceiver","lastFramesReceived","lastFramesDecoded","framesDecoded","lastFramesDropped","lastKeyFramesDecoded","keyFramesDecoded","lastPliCount","totalPliCount","totalPacketLoss","totalBytesReceivedInaMin","totalFrameReceivedInaMin","resolutions","totalFrameDecodedInaMin","receivedFrameRate","receivedHeight","height","receivedWidth","width","receivedFrameSize","receivedKeyFrames","getVideoSenderMqa","videoSender","lastKeyFramesEncoded","lastFramesSent","framesSent","totalFrameSentInaMin","transmittedFrameRate","transmittedHeight","transmittedWidth","transmittedFrameSize"],"sources":["mqaUtil.ts"],"sourcesContent":["/* eslint-disable no-param-reassign, prefer-destructuring */\n\nimport {mean, max} from 'lodash';\n\nimport {STATS} from '../constants';\n\nexport const getAudioReceiverMqa = ({audioReceiver, statsResults, lastMqaDataSent, mediaType}) => {\n const sendrecvType = STATS.RECEIVE_DIRECTION;\n\n const lastPacketsReceived = lastMqaDataSent[mediaType]?.[sendrecvType].totalPacketsReceived || 0;\n const lastPacketsLost = lastMqaDataSent[mediaType]?.[sendrecvType].totalPacketsLost || 0;\n const lastPacketsDecoded = lastMqaDataSent[mediaType]?.[sendrecvType].totalSamplesDecoded || 0;\n const lastSamplesReceived = lastMqaDataSent[mediaType]?.[sendrecvType].totalSamplesReceived || 0;\n const lastConcealedSamples = lastMqaDataSent[mediaType]?.[sendrecvType].concealedSamples || 0;\n const lastBytesReceived = lastMqaDataSent[mediaType]?.[sendrecvType].totalBytesReceived || 0;\n const lastFecPacketsReceived = lastMqaDataSent[mediaType]?.[sendrecvType].fecPacketsReceived || 0;\n const lastFecPacketsDiscarded =\n lastMqaDataSent[mediaType]?.[sendrecvType].fecPacketsDiscarded || 0;\n\n const {csi} = statsResults[mediaType];\n if (csi && !audioReceiver.streams[0].common.csi.includes(csi)) {\n audioReceiver.streams[0].common.csi.push(csi);\n }\n\n audioReceiver.common.common.direction = statsResults[mediaType].direction;\n audioReceiver.common.transportType = statsResults.connectionType.remote.transport[0];\n\n // add rtpPacket info inside common as also for call analyzer\n audioReceiver.common.rtpPackets =\n statsResults[mediaType][sendrecvType].totalPacketsReceived - lastPacketsReceived || 0;\n // Hop by hop are numbers and not percentage so we compare on what we sent the last min\n // collect the packets received for the last min\n audioReceiver.streams[0].common.rtpPackets = audioReceiver.common.rtpPackets;\n audioReceiver.common.mediaHopByHopLost =\n statsResults[mediaType][sendrecvType].totalPacketsLost - lastPacketsLost || 0;\n audioReceiver.common.rtpHopByHopLost =\n statsResults[mediaType][sendrecvType].totalPacketsLost - lastPacketsLost || 0;\n\n audioReceiver.streams[0].common.maxRtpJitter =\n // @ts-ignore\n max(statsResults[mediaType][sendrecvType].meanRtpJitter) * 1000 || 0;\n audioReceiver.streams[0].common.meanRtpJitter =\n mean(statsResults[mediaType][sendrecvType].meanRtpJitter) * 1000 || 0;\n audioReceiver.streams[0].common.rtpJitter = audioReceiver.streams[0].common.maxRtpJitter;\n\n // Fec packets do come in as part of the FEC only for audio\n const fecRecovered =\n statsResults[mediaType][sendrecvType].fecPacketsReceived -\n lastFecPacketsReceived -\n (statsResults[mediaType][sendrecvType].fecPacketsDiscarded - lastFecPacketsDiscarded);\n\n audioReceiver.streams[0].common.rtpEndToEndLost =\n statsResults[mediaType][sendrecvType].totalPacketsLost - lastPacketsLost - fecRecovered || 0;\n\n audioReceiver.streams[0].common.framesDropped =\n statsResults[mediaType][sendrecvType].totalSamplesDecoded - lastPacketsDecoded || 0;\n audioReceiver.streams[0].common.renderedFrameRate =\n (audioReceiver.streams[0].common.framesDropped * 100) / 60 || 0;\n\n audioReceiver.streams[0].common.framesReceived =\n statsResults[mediaType][sendrecvType].totalSamplesReceived - lastSamplesReceived || 0;\n audioReceiver.streams[0].common.concealedFrames =\n statsResults[mediaType][sendrecvType].concealedSamples - lastConcealedSamples || 0;\n audioReceiver.streams[0].common.receivedBitrate =\n ((statsResults[mediaType][sendrecvType].totalBytesReceived - lastBytesReceived) * 8) / 60 || 0;\n\n audioReceiver.common.rtpBitrate = audioReceiver.streams[0].common.receivedBitrate;\n};\n\nexport const getAudioSenderMqa = ({audioSender, statsResults, lastMqaDataSent, mediaType}) => {\n const sendrecvType = STATS.SEND_DIRECTION;\n\n const lastPacketsSent = lastMqaDataSent[mediaType]?.[sendrecvType].totalPacketsSent || 0;\n const lastPacketsLost =\n lastMqaDataSent[mediaType]?.[sendrecvType].totalPacketsLostOnReceiver || 0;\n const lastBytesSent = lastMqaDataSent[mediaType]?.[sendrecvType].totalBytesSent || 0;\n const lastFramesEncoded = lastMqaDataSent[mediaType]?.[sendrecvType].totalKeyFramesEncoded || 0;\n const lastFirCount = lastMqaDataSent[mediaType]?.[sendrecvType].totalFirCount || 0;\n\n const {csi} = statsResults[mediaType];\n if (csi && !audioSender.streams[0].common.csi.includes(csi)) {\n audioSender.streams[0].common.csi.push(csi);\n }\n\n audioSender.common.common.direction = statsResults[mediaType].direction;\n audioSender.common.transportType = statsResults.connectionType.local.transport[0];\n\n audioSender.common.maxRemoteJitter =\n // @ts-ignore\n max(statsResults[mediaType][sendrecvType].meanRemoteJitter) * 1000 || 0;\n audioSender.common.meanRemoteJitter =\n mean(statsResults[mediaType][sendrecvType].meanRemoteJitter) * 1000 || 0;\n\n audioSender.common.rtpPackets =\n statsResults[mediaType][sendrecvType].totalPacketsSent - lastPacketsSent || 0;\n audioSender.streams[0].common.rtpPackets = audioSender.common.rtpPackets;\n // From candidate-pair\n audioSender.common.availableBitrate =\n statsResults[mediaType][sendrecvType].availableOutgoingBitrate || 0;\n // Calculate based on how much packets lost of received compated to how to the client sent\n\n const totalpacketsLostForaMin =\n statsResults[mediaType][sendrecvType].totalPacketsLostOnReceiver - lastPacketsLost;\n\n audioSender.common.remoteLossRate =\n totalpacketsLostForaMin > 0\n ? (totalpacketsLostForaMin * 100) / audioSender.common.rtpPackets\n : 0; // This is the packets sent with in last min || 0;\n\n audioSender.common.maxRoundTripTime =\n // @ts-ignore\n max(statsResults[mediaType][sendrecvType].meanRoundTripTime) * 1000 || 0;\n audioSender.common.meanRoundTripTime =\n mean(statsResults[mediaType][sendrecvType].meanRoundTripTime) * 1000 || 0;\n audioSender.common.roundTripTime = audioSender.common.maxRoundTripTime;\n\n // Calculate the outgoing bitrate\n const totalBytesSentInaMin = statsResults[mediaType][sendrecvType].totalBytesSent - lastBytesSent;\n\n audioSender.streams[0].common.transmittedBitrate = totalBytesSentInaMin\n ? (totalBytesSentInaMin * 8) / 60\n : 0;\n audioSender.common.rtpBitrate = audioSender.streams[0].common.transmittedBitrate;\n\n audioSender.streams[0].transmittedKeyFrames =\n statsResults[mediaType][sendrecvType].totalKeyFramesEncoded - lastFramesEncoded || 0;\n audioSender.streams[0].requestedKeyFrames =\n statsResults[mediaType][sendrecvType].totalFirCount - lastFirCount || 0;\n};\n\nexport const getVideoReceiverMqa = ({videoReceiver, statsResults, lastMqaDataSent, mediaType}) => {\n const sendrecvType = STATS.RECEIVE_DIRECTION;\n\n const lastPacketsReceived = lastMqaDataSent[mediaType]?.[sendrecvType].totalPacketsReceived || 0;\n const lastPacketsLost = lastMqaDataSent[mediaType]?.[sendrecvType].totalPacketsLost || 0;\n const lastBytesReceived = lastMqaDataSent[mediaType]?.[sendrecvType].totalBytesReceived || 0;\n const lastFramesReceived = lastMqaDataSent[mediaType]?.[sendrecvType].framesReceived || 0;\n const lastFramesDecoded = lastMqaDataSent[mediaType]?.[sendrecvType].framesDecoded || 0;\n const lastFramesDropped = lastMqaDataSent[mediaType]?.[sendrecvType].framesDropped || 0;\n const lastKeyFramesDecoded = lastMqaDataSent[mediaType]?.[sendrecvType].keyFramesDecoded || 0;\n const lastPliCount = lastMqaDataSent[mediaType]?.[sendrecvType].totalPliCount || 0;\n\n const {csi} = statsResults[mediaType];\n if (csi && !videoReceiver.streams[0].common.csi.includes(csi)) {\n videoReceiver.streams[0].common.csi.push(csi);\n }\n\n videoReceiver.common.common.direction = statsResults[mediaType].direction;\n videoReceiver.common.transportType = statsResults.connectionType.remote.transport[0];\n // collect the packets received for the last min\n videoReceiver.common.rtpPackets =\n statsResults[mediaType][sendrecvType].totalPacketsReceived - lastPacketsReceived || 0;\n videoReceiver.streams[0].common.rtpPackets = videoReceiver.common.rtpPackets;\n\n const totalPacketLoss =\n statsResults[mediaType][sendrecvType].totalPacketsLost - lastPacketsLost || 0;\n\n // Hope by hop are numbers and not percentage so we compare on what we sent the last min\n // this is including packet lost\n videoReceiver.common.mediaHopByHopLost = totalPacketLoss;\n videoReceiver.common.rtpHopByHopLost = totalPacketLoss;\n\n // End to end packetloss is after recovery\n videoReceiver.streams[0].common.rtpEndToEndLost = totalPacketLoss;\n\n // calculate this values\n\n videoReceiver.common.maxRemoteJitter =\n // @ts-ignore\n max(statsResults[mediaType][sendrecvType].meanRemoteJitter) * 1000 || 0;\n videoReceiver.common.meanRemoteJitter =\n mean(statsResults[mediaType][sendrecvType].meanRemoteJitter) * 1000 || 0;\n\n videoReceiver.streams[0].common.rtpJitter = videoReceiver.common.maxRemoteJitter;\n // videoReceiver.streams[0].common.rtpJitter = (statsResults.resolutions[mediaType][sendrecvType].jitterBufferDelay - lastMqaDataSent.resolutions[mediaType]?.[sendrecvType].jitterBufferDelay) / (statsResults.resolutions[mediaType][sendrecvType].jitterBufferEmittedCount - lastMqaDataSent.resolutions[mediaType]?.[sendrecvType].jitterBufferEmittedCount) * 1000 || 0;\n\n // Calculate the outgoing bitrate\n const totalBytesReceivedInaMin =\n statsResults[mediaType][sendrecvType].totalBytesReceived - lastBytesReceived;\n\n videoReceiver.streams[0].common.receivedBitrate = totalBytesReceivedInaMin\n ? (totalBytesReceivedInaMin * 8) / 60\n : 0;\n videoReceiver.common.rtpBitrate = videoReceiver.streams[0].common.receivedBitrate;\n\n // From tracks //TODO: calculate a proper one\n const totalFrameReceivedInaMin =\n statsResults.resolutions[mediaType][sendrecvType].framesReceived - lastFramesReceived;\n const totalFrameDecodedInaMin =\n statsResults.resolutions[mediaType][sendrecvType].framesDecoded - lastFramesDecoded;\n\n videoReceiver.streams[0].common.receivedFrameRate = totalFrameReceivedInaMin\n ? (totalFrameReceivedInaMin * 100) / 60\n : 0;\n videoReceiver.streams[0].common.renderedFrameRate = totalFrameDecodedInaMin\n ? (totalFrameDecodedInaMin * 100) / 60\n : 0;\n\n videoReceiver.streams[0].common.framesDropped =\n statsResults.resolutions[mediaType][sendrecvType].framesDropped - lastFramesDropped;\n videoReceiver.streams[0].receivedHeight =\n statsResults.resolutions[mediaType][sendrecvType].height || 0;\n videoReceiver.streams[0].receivedWidth =\n statsResults.resolutions[mediaType][sendrecvType].width || 0;\n videoReceiver.streams[0].receivedFrameSize =\n (videoReceiver.streams[0].receivedHeight * videoReceiver.streams[0].receivedWidth) / 256;\n\n videoReceiver.streams[0].receivedKeyFrames =\n statsResults[mediaType][sendrecvType].keyFramesDecoded - lastKeyFramesDecoded || 0;\n videoReceiver.streams[0].requestedKeyFrames =\n statsResults[mediaType][sendrecvType].totalPliCount - lastPliCount || 0;\n};\n\nexport const getVideoSenderMqa = ({videoSender, statsResults, lastMqaDataSent, mediaType}) => {\n const sendrecvType = STATS.SEND_DIRECTION;\n\n const lastPacketsSent = lastMqaDataSent[mediaType]?.[sendrecvType].totalPacketsSent || 0;\n const lastPacketsLost =\n lastMqaDataSent[mediaType]?.[sendrecvType].totalPacketsLostOnReceiver || 0;\n const lastBytesSent = lastMqaDataSent[mediaType]?.[sendrecvType].totalBytesSent || 0;\n const lastKeyFramesEncoded =\n lastMqaDataSent[mediaType]?.[sendrecvType].totalKeyFramesEncoded || 0;\n const lastFirCount = lastMqaDataSent[mediaType]?.[sendrecvType].totalFirCount || 0;\n const lastFramesSent = lastMqaDataSent[mediaType]?.[sendrecvType].framesSent || 0;\n const {csi} = statsResults[mediaType];\n if (csi && !videoSender.streams[0].common.csi.includes(csi)) {\n videoSender.streams[0].common.csi.push(csi);\n }\n\n videoSender.common.common.direction = statsResults[mediaType].direction;\n videoSender.common.transportType = statsResults.connectionType.local.transport[0];\n\n // @ts-ignore\n videoSender.common.maxRemoteJitter =\n // @ts-ignore\n max(statsResults[mediaType][sendrecvType].meanRemoteJitter) * 1000 || 0;\n videoSender.common.meanRemoteJitter =\n mean(statsResults[mediaType][sendrecvType].meanRemoteJitter) * 1000 || 0;\n\n videoSender.common.rtpPackets =\n statsResults[mediaType][sendrecvType].totalPacketsSent - lastPacketsSent || 0;\n videoSender.common.availableBitrate =\n statsResults[mediaType][sendrecvType].availableOutgoingBitrate || 0;\n // Calculate based on how much packets lost of received compated to how to the client sent\n\n const totalpacketsLostForaMin =\n statsResults[mediaType][sendrecvType].totalPacketsLostOnReceiver - lastPacketsLost;\n\n videoSender.common.remoteLossRate =\n totalpacketsLostForaMin > 0\n ? (totalpacketsLostForaMin * 100) / (videoSender.common.rtpPackets + totalpacketsLostForaMin)\n : 0; // This is the packets sent with in last min || 0;\n\n videoSender.common.maxRoundTripTime =\n // @ts-ignore\n max(statsResults[mediaType][sendrecvType].meanRoundTripTime) * 1000 || 0;\n videoSender.common.meanRoundTripTime =\n mean(statsResults[mediaType][sendrecvType].meanRoundTripTime) * 1000 || 0;\n videoSender.common.roundTripTime = videoSender.common.maxRoundTripTime;\n\n videoSender.streams[0].common.rtpPackets =\n statsResults[mediaType][sendrecvType].totalPacketsSent - lastPacketsSent || 0;\n\n // Calculate the outgoing bitrate\n const totalBytesSentInaMin = statsResults[mediaType][sendrecvType].totalBytesSent - lastBytesSent;\n\n videoSender.streams[0].common.transmittedBitrate = totalBytesSentInaMin\n ? (totalBytesSentInaMin * 8) / 60\n : 0;\n\n videoSender.common.rtpBitrate = videoSender.streams[0].common.transmittedBitrate;\n\n videoSender.streams[0].transmittedKeyFrames =\n statsResults[mediaType][sendrecvType].totalKeyFramesEncoded - lastKeyFramesEncoded || 0;\n videoSender.streams[0].requestedKeyFrames =\n statsResults[mediaType][sendrecvType].totalFirCount - lastFirCount || 0;\n\n // From tracks //TODO: calculate a proper one\n const totalFrameSentInaMin =\n statsResults.resolutions[mediaType][sendrecvType].framesSent - (lastFramesSent || 0);\n\n videoSender.streams[0].common.transmittedFrameRate = totalFrameSentInaMin\n ? (totalFrameSentInaMin * 100) / 60\n : 0;\n videoSender.streams[0].transmittedHeight =\n statsResults.resolutions[mediaType][sendrecvType].height || 0;\n videoSender.streams[0].transmittedWidth =\n statsResults.resolutions[mediaType][sendrecvType].width || 0;\n videoSender.streams[0].transmittedFrameSize =\n (videoSender.streams[0].transmittedHeight * videoSender.streams[0].transmittedWidth) / 256;\n};\n"],"mappings":"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"}
1
+ {"version":3,"names":["getAudioReceiverMqa","audioReceiver","statsResults","lastMqaDataSent","mediaType","sendrecvType","STATS","RECEIVE_DIRECTION","lastPacketsReceived","totalPacketsReceived","lastPacketsLost","totalPacketsLost","lastPacketsDecoded","totalSamplesDecoded","lastSamplesReceived","totalSamplesReceived","lastConcealedSamples","concealedSamples","lastBytesReceived","totalBytesReceived","lastFecPacketsReceived","fecPacketsReceived","lastFecPacketsDiscarded","fecPacketsDiscarded","csi","streams","common","includes","push","direction","transportType","connectionType","local","transport","rtpPackets","mediaHopByHopLost","rtpHopByHopLost","maxRtpJitter","meanRtpJitter","rtpJitter","fecRecovered","rtpEndToEndLost","framesDropped","renderedFrameRate","framesReceived","concealedFrames","receivedBitrate","rtpBitrate","getAudioSenderMqa","audioSender","SEND_DIRECTION","lastPacketsSent","totalPacketsSent","totalPacketsLostOnReceiver","lastBytesSent","totalBytesSent","lastFramesEncoded","totalKeyFramesEncoded","lastFirCount","totalFirCount","maxRemoteJitter","meanRemoteJitter","availableBitrate","availableOutgoingBitrate","totalpacketsLostForaMin","remoteLossRate","maxRoundTripTime","meanRoundTripTime","roundTripTime","totalBytesSentInaMin","transmittedBitrate","transmittedKeyFrames","requestedKeyFrames","getVideoReceiverMqa","videoReceiver","lastFramesReceived","lastFramesDecoded","framesDecoded","lastFramesDropped","lastKeyFramesDecoded","keyFramesDecoded","lastPliCount","totalPliCount","totalPacketLoss","totalBytesReceivedInaMin","totalFrameReceivedInaMin","resolutions","totalFrameDecodedInaMin","receivedFrameRate","receivedHeight","height","receivedWidth","width","receivedFrameSize","receivedKeyFrames","getVideoSenderMqa","videoSender","lastKeyFramesEncoded","lastFramesSent","framesSent","totalFrameSentInaMin","transmittedFrameRate","transmittedHeight","transmittedWidth","transmittedFrameSize"],"sources":["mqaUtil.ts"],"sourcesContent":["/* eslint-disable no-param-reassign, prefer-destructuring */\n\nimport {mean, max} from 'lodash';\n\nimport {STATS} from '../constants';\n\nexport const getAudioReceiverMqa = ({audioReceiver, statsResults, lastMqaDataSent, mediaType}) => {\n const sendrecvType = STATS.RECEIVE_DIRECTION;\n\n const lastPacketsReceived = lastMqaDataSent[mediaType]?.[sendrecvType].totalPacketsReceived || 0;\n const lastPacketsLost = lastMqaDataSent[mediaType]?.[sendrecvType].totalPacketsLost || 0;\n const lastPacketsDecoded = lastMqaDataSent[mediaType]?.[sendrecvType].totalSamplesDecoded || 0;\n const lastSamplesReceived = lastMqaDataSent[mediaType]?.[sendrecvType].totalSamplesReceived || 0;\n const lastConcealedSamples = lastMqaDataSent[mediaType]?.[sendrecvType].concealedSamples || 0;\n const lastBytesReceived = lastMqaDataSent[mediaType]?.[sendrecvType].totalBytesReceived || 0;\n const lastFecPacketsReceived = lastMqaDataSent[mediaType]?.[sendrecvType].fecPacketsReceived || 0;\n const lastFecPacketsDiscarded =\n lastMqaDataSent[mediaType]?.[sendrecvType].fecPacketsDiscarded || 0;\n\n const {csi} = statsResults[mediaType];\n if (csi && !audioReceiver.streams[0].common.csi.includes(csi)) {\n audioReceiver.streams[0].common.csi.push(csi);\n }\n\n audioReceiver.common.common.direction = statsResults[mediaType].direction;\n audioReceiver.common.transportType = statsResults.connectionType.local.transport;\n\n // add rtpPacket info inside common as also for call analyzer\n audioReceiver.common.rtpPackets =\n statsResults[mediaType][sendrecvType].totalPacketsReceived - lastPacketsReceived || 0;\n // Hop by hop are numbers and not percentage so we compare on what we sent the last min\n // collect the packets received for the last min\n audioReceiver.streams[0].common.rtpPackets = audioReceiver.common.rtpPackets;\n audioReceiver.common.mediaHopByHopLost =\n statsResults[mediaType][sendrecvType].totalPacketsLost - lastPacketsLost || 0;\n audioReceiver.common.rtpHopByHopLost =\n statsResults[mediaType][sendrecvType].totalPacketsLost - lastPacketsLost || 0;\n\n audioReceiver.streams[0].common.maxRtpJitter =\n // @ts-ignore\n max(statsResults[mediaType][sendrecvType].meanRtpJitter) * 1000 || 0;\n audioReceiver.streams[0].common.meanRtpJitter =\n mean(statsResults[mediaType][sendrecvType].meanRtpJitter) * 1000 || 0;\n audioReceiver.streams[0].common.rtpJitter = audioReceiver.streams[0].common.maxRtpJitter;\n\n // Fec packets do come in as part of the FEC only for audio\n const fecRecovered =\n statsResults[mediaType][sendrecvType].fecPacketsReceived -\n lastFecPacketsReceived -\n (statsResults[mediaType][sendrecvType].fecPacketsDiscarded - lastFecPacketsDiscarded);\n\n audioReceiver.streams[0].common.rtpEndToEndLost =\n statsResults[mediaType][sendrecvType].totalPacketsLost - lastPacketsLost - fecRecovered || 0;\n\n audioReceiver.streams[0].common.framesDropped =\n statsResults[mediaType][sendrecvType].totalSamplesDecoded - lastPacketsDecoded || 0;\n audioReceiver.streams[0].common.renderedFrameRate =\n (audioReceiver.streams[0].common.framesDropped * 100) / 60 || 0;\n\n audioReceiver.streams[0].common.framesReceived =\n statsResults[mediaType][sendrecvType].totalSamplesReceived - lastSamplesReceived || 0;\n audioReceiver.streams[0].common.concealedFrames =\n statsResults[mediaType][sendrecvType].concealedSamples - lastConcealedSamples || 0;\n audioReceiver.streams[0].common.receivedBitrate =\n ((statsResults[mediaType][sendrecvType].totalBytesReceived - lastBytesReceived) * 8) / 60 || 0;\n\n audioReceiver.common.rtpBitrate = audioReceiver.streams[0].common.receivedBitrate;\n};\n\nexport const getAudioSenderMqa = ({audioSender, statsResults, lastMqaDataSent, mediaType}) => {\n const sendrecvType = STATS.SEND_DIRECTION;\n\n const lastPacketsSent = lastMqaDataSent[mediaType]?.[sendrecvType].totalPacketsSent || 0;\n const lastPacketsLost =\n lastMqaDataSent[mediaType]?.[sendrecvType].totalPacketsLostOnReceiver || 0;\n const lastBytesSent = lastMqaDataSent[mediaType]?.[sendrecvType].totalBytesSent || 0;\n const lastFramesEncoded = lastMqaDataSent[mediaType]?.[sendrecvType].totalKeyFramesEncoded || 0;\n const lastFirCount = lastMqaDataSent[mediaType]?.[sendrecvType].totalFirCount || 0;\n\n const {csi} = statsResults[mediaType];\n if (csi && !audioSender.streams[0].common.csi.includes(csi)) {\n audioSender.streams[0].common.csi.push(csi);\n }\n\n audioSender.common.common.direction = statsResults[mediaType].direction;\n audioSender.common.transportType = statsResults.connectionType.local.transport;\n\n audioSender.common.maxRemoteJitter =\n // @ts-ignore\n max(statsResults[mediaType][sendrecvType].meanRemoteJitter) * 1000 || 0;\n audioSender.common.meanRemoteJitter =\n mean(statsResults[mediaType][sendrecvType].meanRemoteJitter) * 1000 || 0;\n\n audioSender.common.rtpPackets =\n statsResults[mediaType][sendrecvType].totalPacketsSent - lastPacketsSent || 0;\n audioSender.streams[0].common.rtpPackets = audioSender.common.rtpPackets;\n // From candidate-pair\n audioSender.common.availableBitrate =\n statsResults[mediaType][sendrecvType].availableOutgoingBitrate || 0;\n // Calculate based on how much packets lost of received compated to how to the client sent\n\n const totalpacketsLostForaMin =\n statsResults[mediaType][sendrecvType].totalPacketsLostOnReceiver - lastPacketsLost;\n\n audioSender.common.remoteLossRate =\n totalpacketsLostForaMin > 0\n ? (totalpacketsLostForaMin * 100) / audioSender.common.rtpPackets\n : 0; // This is the packets sent with in last min || 0;\n\n audioSender.common.maxRoundTripTime =\n // @ts-ignore\n max(statsResults[mediaType][sendrecvType].meanRoundTripTime) * 1000 || 0;\n audioSender.common.meanRoundTripTime =\n mean(statsResults[mediaType][sendrecvType].meanRoundTripTime) * 1000 || 0;\n audioSender.common.roundTripTime = audioSender.common.maxRoundTripTime;\n\n // Calculate the outgoing bitrate\n const totalBytesSentInaMin = statsResults[mediaType][sendrecvType].totalBytesSent - lastBytesSent;\n\n audioSender.streams[0].common.transmittedBitrate = totalBytesSentInaMin\n ? (totalBytesSentInaMin * 8) / 60\n : 0;\n audioSender.common.rtpBitrate = audioSender.streams[0].common.transmittedBitrate;\n\n audioSender.streams[0].transmittedKeyFrames =\n statsResults[mediaType][sendrecvType].totalKeyFramesEncoded - lastFramesEncoded || 0;\n audioSender.streams[0].requestedKeyFrames =\n statsResults[mediaType][sendrecvType].totalFirCount - lastFirCount || 0;\n};\n\nexport const getVideoReceiverMqa = ({videoReceiver, statsResults, lastMqaDataSent, mediaType}) => {\n const sendrecvType = STATS.RECEIVE_DIRECTION;\n\n const lastPacketsReceived = lastMqaDataSent[mediaType]?.[sendrecvType].totalPacketsReceived || 0;\n const lastPacketsLost = lastMqaDataSent[mediaType]?.[sendrecvType].totalPacketsLost || 0;\n const lastBytesReceived = lastMqaDataSent[mediaType]?.[sendrecvType].totalBytesReceived || 0;\n const lastFramesReceived = lastMqaDataSent[mediaType]?.[sendrecvType].framesReceived || 0;\n const lastFramesDecoded = lastMqaDataSent[mediaType]?.[sendrecvType].framesDecoded || 0;\n const lastFramesDropped = lastMqaDataSent[mediaType]?.[sendrecvType].framesDropped || 0;\n const lastKeyFramesDecoded = lastMqaDataSent[mediaType]?.[sendrecvType].keyFramesDecoded || 0;\n const lastPliCount = lastMqaDataSent[mediaType]?.[sendrecvType].totalPliCount || 0;\n\n const {csi} = statsResults[mediaType];\n if (csi && !videoReceiver.streams[0].common.csi.includes(csi)) {\n videoReceiver.streams[0].common.csi.push(csi);\n }\n\n videoReceiver.common.common.direction = statsResults[mediaType].direction;\n videoReceiver.common.transportType = statsResults.connectionType.local.transport;\n\n // collect the packets received for the last min\n videoReceiver.common.rtpPackets =\n statsResults[mediaType][sendrecvType].totalPacketsReceived - lastPacketsReceived || 0;\n videoReceiver.streams[0].common.rtpPackets = videoReceiver.common.rtpPackets;\n\n const totalPacketLoss =\n statsResults[mediaType][sendrecvType].totalPacketsLost - lastPacketsLost || 0;\n\n // Hope by hop are numbers and not percentage so we compare on what we sent the last min\n // this is including packet lost\n videoReceiver.common.mediaHopByHopLost = totalPacketLoss;\n videoReceiver.common.rtpHopByHopLost = totalPacketLoss;\n\n // End to end packetloss is after recovery\n videoReceiver.streams[0].common.rtpEndToEndLost = totalPacketLoss;\n\n // calculate this values\n\n videoReceiver.common.maxRemoteJitter =\n // @ts-ignore\n max(statsResults[mediaType][sendrecvType].meanRemoteJitter) * 1000 || 0;\n videoReceiver.common.meanRemoteJitter =\n mean(statsResults[mediaType][sendrecvType].meanRemoteJitter) * 1000 || 0;\n\n videoReceiver.streams[0].common.rtpJitter = videoReceiver.common.maxRemoteJitter;\n // videoReceiver.streams[0].common.rtpJitter = (statsResults.resolutions[mediaType][sendrecvType].jitterBufferDelay - lastMqaDataSent.resolutions[mediaType]?.[sendrecvType].jitterBufferDelay) / (statsResults.resolutions[mediaType][sendrecvType].jitterBufferEmittedCount - lastMqaDataSent.resolutions[mediaType]?.[sendrecvType].jitterBufferEmittedCount) * 1000 || 0;\n\n // Calculate the outgoing bitrate\n const totalBytesReceivedInaMin =\n statsResults[mediaType][sendrecvType].totalBytesReceived - lastBytesReceived;\n\n videoReceiver.streams[0].common.receivedBitrate = totalBytesReceivedInaMin\n ? (totalBytesReceivedInaMin * 8) / 60\n : 0;\n videoReceiver.common.rtpBitrate = videoReceiver.streams[0].common.receivedBitrate;\n\n // From tracks //TODO: calculate a proper one\n const totalFrameReceivedInaMin =\n statsResults.resolutions[mediaType][sendrecvType].framesReceived - lastFramesReceived;\n const totalFrameDecodedInaMin =\n statsResults.resolutions[mediaType][sendrecvType].framesDecoded - lastFramesDecoded;\n\n videoReceiver.streams[0].common.receivedFrameRate = totalFrameReceivedInaMin\n ? (totalFrameReceivedInaMin * 100) / 60\n : 0;\n videoReceiver.streams[0].common.renderedFrameRate = totalFrameDecodedInaMin\n ? (totalFrameDecodedInaMin * 100) / 60\n : 0;\n\n videoReceiver.streams[0].common.framesDropped =\n statsResults.resolutions[mediaType][sendrecvType].framesDropped - lastFramesDropped;\n videoReceiver.streams[0].receivedHeight =\n statsResults.resolutions[mediaType][sendrecvType].height || 0;\n videoReceiver.streams[0].receivedWidth =\n statsResults.resolutions[mediaType][sendrecvType].width || 0;\n videoReceiver.streams[0].receivedFrameSize =\n (videoReceiver.streams[0].receivedHeight * videoReceiver.streams[0].receivedWidth) / 256;\n\n videoReceiver.streams[0].receivedKeyFrames =\n statsResults[mediaType][sendrecvType].keyFramesDecoded - lastKeyFramesDecoded || 0;\n videoReceiver.streams[0].requestedKeyFrames =\n statsResults[mediaType][sendrecvType].totalPliCount - lastPliCount || 0;\n};\n\nexport const getVideoSenderMqa = ({videoSender, statsResults, lastMqaDataSent, mediaType}) => {\n const sendrecvType = STATS.SEND_DIRECTION;\n\n const lastPacketsSent = lastMqaDataSent[mediaType]?.[sendrecvType].totalPacketsSent || 0;\n const lastPacketsLost =\n lastMqaDataSent[mediaType]?.[sendrecvType].totalPacketsLostOnReceiver || 0;\n const lastBytesSent = lastMqaDataSent[mediaType]?.[sendrecvType].totalBytesSent || 0;\n const lastKeyFramesEncoded =\n lastMqaDataSent[mediaType]?.[sendrecvType].totalKeyFramesEncoded || 0;\n const lastFirCount = lastMqaDataSent[mediaType]?.[sendrecvType].totalFirCount || 0;\n const lastFramesSent = lastMqaDataSent[mediaType]?.[sendrecvType].framesSent || 0;\n const {csi} = statsResults[mediaType];\n if (csi && !videoSender.streams[0].common.csi.includes(csi)) {\n videoSender.streams[0].common.csi.push(csi);\n }\n\n videoSender.common.common.direction = statsResults[mediaType].direction;\n videoSender.common.transportType = statsResults.connectionType.local.transport;\n\n // @ts-ignore\n videoSender.common.maxRemoteJitter =\n // @ts-ignore\n max(statsResults[mediaType][sendrecvType].meanRemoteJitter) * 1000 || 0;\n videoSender.common.meanRemoteJitter =\n mean(statsResults[mediaType][sendrecvType].meanRemoteJitter) * 1000 || 0;\n\n videoSender.common.rtpPackets =\n statsResults[mediaType][sendrecvType].totalPacketsSent - lastPacketsSent || 0;\n videoSender.common.availableBitrate =\n statsResults[mediaType][sendrecvType].availableOutgoingBitrate || 0;\n // Calculate based on how much packets lost of received compated to how to the client sent\n\n const totalpacketsLostForaMin =\n statsResults[mediaType][sendrecvType].totalPacketsLostOnReceiver - lastPacketsLost;\n\n videoSender.common.remoteLossRate =\n totalpacketsLostForaMin > 0\n ? (totalpacketsLostForaMin * 100) / (videoSender.common.rtpPackets + totalpacketsLostForaMin)\n : 0; // This is the packets sent with in last min || 0;\n\n videoSender.common.maxRoundTripTime =\n // @ts-ignore\n max(statsResults[mediaType][sendrecvType].meanRoundTripTime) * 1000 || 0;\n videoSender.common.meanRoundTripTime =\n mean(statsResults[mediaType][sendrecvType].meanRoundTripTime) * 1000 || 0;\n videoSender.common.roundTripTime = videoSender.common.maxRoundTripTime;\n\n videoSender.streams[0].common.rtpPackets =\n statsResults[mediaType][sendrecvType].totalPacketsSent - lastPacketsSent || 0;\n\n // Calculate the outgoing bitrate\n const totalBytesSentInaMin = statsResults[mediaType][sendrecvType].totalBytesSent - lastBytesSent;\n\n videoSender.streams[0].common.transmittedBitrate = totalBytesSentInaMin\n ? (totalBytesSentInaMin * 8) / 60\n : 0;\n\n videoSender.common.rtpBitrate = videoSender.streams[0].common.transmittedBitrate;\n\n videoSender.streams[0].transmittedKeyFrames =\n statsResults[mediaType][sendrecvType].totalKeyFramesEncoded - lastKeyFramesEncoded || 0;\n videoSender.streams[0].requestedKeyFrames =\n statsResults[mediaType][sendrecvType].totalFirCount - lastFirCount || 0;\n\n // From tracks //TODO: calculate a proper one\n const totalFrameSentInaMin =\n statsResults.resolutions[mediaType][sendrecvType].framesSent - (lastFramesSent || 0);\n\n videoSender.streams[0].common.transmittedFrameRate = totalFrameSentInaMin\n ? (totalFrameSentInaMin * 100) / 60\n : 0;\n videoSender.streams[0].transmittedHeight =\n statsResults.resolutions[mediaType][sendrecvType].height || 0;\n videoSender.streams[0].transmittedWidth =\n statsResults.resolutions[mediaType][sendrecvType].width || 0;\n videoSender.streams[0].transmittedFrameSize =\n (videoSender.streams[0].transmittedHeight * videoSender.streams[0].transmittedWidth) / 256;\n};\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@webex/plugin-meetings",
3
- "version": "3.0.0-beta.276",
3
+ "version": "3.0.0-beta.278",
4
4
  "description": "",
5
5
  "license": "Cisco EULA (https://www.cisco.com/c/en/us/products/end-user-license-agreement.html)",
6
6
  "contributors": [
@@ -32,12 +32,12 @@
32
32
  "build": "yarn run -T tsc --declaration true --declarationDir ./dist/types"
33
33
  },
34
34
  "devDependencies": {
35
- "@webex/plugin-meetings": "3.0.0-beta.276",
36
- "@webex/test-helper-chai": "3.0.0-beta.276",
37
- "@webex/test-helper-mocha": "3.0.0-beta.276",
38
- "@webex/test-helper-mock-webex": "3.0.0-beta.276",
39
- "@webex/test-helper-retry": "3.0.0-beta.276",
40
- "@webex/test-helper-test-users": "3.0.0-beta.276",
35
+ "@webex/plugin-meetings": "3.0.0-beta.278",
36
+ "@webex/test-helper-chai": "3.0.0-beta.278",
37
+ "@webex/test-helper-mocha": "3.0.0-beta.278",
38
+ "@webex/test-helper-mock-webex": "3.0.0-beta.278",
39
+ "@webex/test-helper-retry": "3.0.0-beta.278",
40
+ "@webex/test-helper-test-users": "3.0.0-beta.278",
41
41
  "chai": "^4.3.4",
42
42
  "chai-as-promised": "^7.1.1",
43
43
  "jsdom-global": "3.0.2",
@@ -46,19 +46,19 @@
46
46
  "typescript": "^4.7.4"
47
47
  },
48
48
  "dependencies": {
49
- "@webex/common": "3.0.0-beta.276",
49
+ "@webex/common": "3.0.0-beta.278",
50
50
  "@webex/internal-media-core": "2.0.6",
51
- "@webex/internal-plugin-conversation": "3.0.0-beta.276",
52
- "@webex/internal-plugin-device": "3.0.0-beta.276",
53
- "@webex/internal-plugin-llm": "3.0.0-beta.276",
54
- "@webex/internal-plugin-mercury": "3.0.0-beta.276",
55
- "@webex/internal-plugin-metrics": "3.0.0-beta.276",
56
- "@webex/internal-plugin-support": "3.0.0-beta.276",
57
- "@webex/internal-plugin-user": "3.0.0-beta.276",
58
- "@webex/media-helpers": "3.0.0-beta.276",
59
- "@webex/plugin-people": "3.0.0-beta.276",
60
- "@webex/plugin-rooms": "3.0.0-beta.276",
61
- "@webex/webex-core": "3.0.0-beta.276",
51
+ "@webex/internal-plugin-conversation": "3.0.0-beta.278",
52
+ "@webex/internal-plugin-device": "3.0.0-beta.278",
53
+ "@webex/internal-plugin-llm": "3.0.0-beta.278",
54
+ "@webex/internal-plugin-mercury": "3.0.0-beta.278",
55
+ "@webex/internal-plugin-metrics": "3.0.0-beta.278",
56
+ "@webex/internal-plugin-support": "3.0.0-beta.278",
57
+ "@webex/internal-plugin-user": "3.0.0-beta.278",
58
+ "@webex/media-helpers": "3.0.0-beta.278",
59
+ "@webex/plugin-people": "3.0.0-beta.278",
60
+ "@webex/plugin-rooms": "3.0.0-beta.278",
61
+ "@webex/webex-core": "3.0.0-beta.278",
62
62
  "ampersand-collection": "^2.0.2",
63
63
  "bowser": "^2.11.0",
64
64
  "btoa": "^1.2.1",
@@ -5542,8 +5542,8 @@ export default class Meeting extends StatelessWebexPlugin {
5542
5542
  this.mediaProperties.mediaDirection.receiveShare,
5543
5543
  ];
5544
5544
 
5545
- this.sendSlotManager.createSlot(mc, MediaType.VideoMain, audioEnabled);
5546
- this.sendSlotManager.createSlot(mc, MediaType.AudioMain, videoEnabled);
5545
+ this.sendSlotManager.createSlot(mc, MediaType.VideoMain, videoEnabled);
5546
+ this.sendSlotManager.createSlot(mc, MediaType.AudioMain, audioEnabled);
5547
5547
  this.sendSlotManager.createSlot(mc, MediaType.VideoSlides, shareEnabled);
5548
5548
  this.sendSlotManager.createSlot(mc, MediaType.AudioSlides, shareEnabled);
5549
5549
  }
@@ -193,7 +193,7 @@ export class StatsAnalyzer extends EventsScope {
193
193
  }
194
194
  });
195
195
 
196
- newMqa.intervalMetadata.peerReflexiveIP = this.statsResults.connectionType.local.ipAddress[0];
196
+ newMqa.intervalMetadata.peerReflexiveIP = this.statsResults.connectionType.local.ipAddress;
197
197
 
198
198
  // Adding peripheral information
199
199
  newMqa.intervalMetadata.peripherals = [];
@@ -1094,73 +1094,35 @@ export class StatsAnalyzer extends EventsScope {
1094
1094
  if (!result || !result.id) {
1095
1095
  return;
1096
1096
  }
1097
- const RemoteCandidateType = {};
1098
- const RemoteTransport = {};
1099
- const RemoteIpAddress = {};
1100
- const RemoteNetworkType = {};
1101
1097
 
1102
- if (!result.id) return;
1098
+ let transport;
1099
+ if (result.relayProtocol) {
1100
+ transport = result.relayProtocol.toUpperCase();
1101
+ } else if (result.protocol) {
1102
+ transport = result.protocol.toUpperCase();
1103
+ }
1103
1104
 
1104
1105
  const sendRecvType = isSender ? STATS.SEND_DIRECTION : STATS.RECEIVE_DIRECTION;
1105
1106
  const ipType = isRemote ? STATS.REMOTE : STATS.LOCAL;
1106
1107
 
1107
- if (!RemoteCandidateType[result.id]) {
1108
- RemoteCandidateType[result.id] = [];
1109
- }
1110
-
1111
- if (!RemoteTransport[result.id]) {
1112
- RemoteTransport[result.id] = [];
1113
- }
1114
-
1115
- if (!RemoteIpAddress[result.id]) {
1116
- RemoteIpAddress[result.id] = [];
1117
- }
1118
- if (!RemoteNetworkType[result.id]) {
1119
- RemoteNetworkType[result.id] = [];
1120
- }
1121
-
1122
- if (
1123
- result.candidateType &&
1124
- RemoteCandidateType[result.id].indexOf(result.candidateType) === -1
1125
- ) {
1126
- RemoteCandidateType[result.id].push(result.candidateType);
1127
- }
1128
-
1129
- if (result.protocol && RemoteTransport[result.id].indexOf(result.protocol) === -1) {
1130
- RemoteTransport[result.id].push(result.protocol.toUpperCase());
1131
- }
1132
-
1133
- if (
1134
- result.ip &&
1135
- RemoteIpAddress[result.id].indexOf(`${result.ip}:${result.portNumber}`) === -1
1136
- ) {
1137
- RemoteIpAddress[result.id].push(`${result.ip}`); // TODO: Add ports
1138
- }
1139
-
1140
- if (result.networkType && RemoteNetworkType[result.id].indexOf(result.networkType) === -1) {
1141
- RemoteNetworkType[result.id].push(result.networkType);
1142
- }
1143
-
1144
1108
  this.statsResults.internal.candidates[result.id] = {
1145
- candidateType: RemoteCandidateType[result.id],
1146
- ipAddress: RemoteIpAddress[result.id],
1109
+ candidateType: result.candidateType,
1110
+ ipAddress: result.ip, // TODO: add ports
1147
1111
  portNumber: result.port,
1148
- networkType: RemoteNetworkType[result.id],
1112
+ networkType: result.networkType,
1149
1113
  priority: result.priority,
1150
- transport: RemoteTransport[result.id],
1114
+ transport,
1151
1115
  timestamp: result.time,
1152
1116
  id: result.id,
1153
1117
  type: result.type,
1154
1118
  };
1155
1119
 
1156
- this.statsResults.connectionType[ipType].candidateType = RemoteCandidateType[result.id];
1157
- this.statsResults.connectionType[ipType].ipAddress = RemoteIpAddress[result.id];
1120
+ this.statsResults.connectionType[ipType].candidateType = result.candidateType;
1121
+ this.statsResults.connectionType[ipType].ipAddress = result.ipAddress;
1158
1122
 
1159
1123
  this.statsResults.connectionType[ipType].networkType =
1160
- RemoteNetworkType[result.id][0] === NETWORK_TYPE.VPN
1161
- ? NETWORK_TYPE.UNKNOWN
1162
- : RemoteNetworkType[result.id][0];
1163
- this.statsResults.connectionType[ipType].transport = RemoteTransport[result.id];
1124
+ result.networkType === NETWORK_TYPE.VPN ? NETWORK_TYPE.UNKNOWN : result.networkType;
1125
+ this.statsResults.connectionType[ipType].transport = transport;
1164
1126
 
1165
1127
  this.statsResults[type][sendRecvType].totalRoundTripTime = result.totalRoundTripTime;
1166
1128
  };
@@ -23,7 +23,7 @@ export const getAudioReceiverMqa = ({audioReceiver, statsResults, lastMqaDataSen
23
23
  }
24
24
 
25
25
  audioReceiver.common.common.direction = statsResults[mediaType].direction;
26
- audioReceiver.common.transportType = statsResults.connectionType.remote.transport[0];
26
+ audioReceiver.common.transportType = statsResults.connectionType.local.transport;
27
27
 
28
28
  // add rtpPacket info inside common as also for call analyzer
29
29
  audioReceiver.common.rtpPackets =
@@ -83,7 +83,7 @@ export const getAudioSenderMqa = ({audioSender, statsResults, lastMqaDataSent, m
83
83
  }
84
84
 
85
85
  audioSender.common.common.direction = statsResults[mediaType].direction;
86
- audioSender.common.transportType = statsResults.connectionType.local.transport[0];
86
+ audioSender.common.transportType = statsResults.connectionType.local.transport;
87
87
 
88
88
  audioSender.common.maxRemoteJitter =
89
89
  // @ts-ignore
@@ -146,7 +146,8 @@ export const getVideoReceiverMqa = ({videoReceiver, statsResults, lastMqaDataSen
146
146
  }
147
147
 
148
148
  videoReceiver.common.common.direction = statsResults[mediaType].direction;
149
- videoReceiver.common.transportType = statsResults.connectionType.remote.transport[0];
149
+ videoReceiver.common.transportType = statsResults.connectionType.local.transport;
150
+
150
151
  // collect the packets received for the last min
151
152
  videoReceiver.common.rtpPackets =
152
153
  statsResults[mediaType][sendrecvType].totalPacketsReceived - lastPacketsReceived || 0;
@@ -228,7 +229,7 @@ export const getVideoSenderMqa = ({videoSender, statsResults, lastMqaDataSent, m
228
229
  }
229
230
 
230
231
  videoSender.common.common.direction = statsResults[mediaType].direction;
231
- videoSender.common.transportType = statsResults.connectionType.local.transport[0];
232
+ videoSender.common.transportType = statsResults.connectionType.local.transport;
232
233
 
233
234
  // @ts-ignore
234
235
  videoSender.common.maxRemoteJitter =
@@ -2081,6 +2081,11 @@ describe('plugin-meetings', () => {
2081
2081
  iceServers,
2082
2082
  }, meetingId);
2083
2083
 
2084
+ assert.calledWith(fakeMultistreamRoapMediaConnection.createSendSlot, MediaType.AudioMain, direction.audio !== 'inactive');
2085
+ assert.calledWith(fakeMultistreamRoapMediaConnection.createSendSlot, MediaType.VideoMain, direction.video !== 'inactive');
2086
+ assert.calledWith(fakeMultistreamRoapMediaConnection.createSendSlot, MediaType.AudioSlides, direction.screenShare !== 'inactive');
2087
+ assert.calledWith(fakeMultistreamRoapMediaConnection.createSendSlot, MediaType.VideoSlides, direction.screenShare !== 'inactive');
2088
+
2084
2089
  for(let type in localStreams){
2085
2090
  const stream = localStreams[type];
2086
2091
  if(stream !== undefined){
@@ -2109,7 +2114,7 @@ describe('plugin-meetings', () => {
2109
2114
  screenShareVideo: localStreams.screenShareVideo?.outputTrack,
2110
2115
  screenShareAudio: localStreams.screenShareAudio?.outputTrack,
2111
2116
  },
2112
- direction,
2117
+ direction: {audio: direction.audio, video: direction.video, screenShareVideo: direction.screenShare},
2113
2118
  remoteQualityLevel,
2114
2119
  },
2115
2120
  expectedDebugId
@@ -2133,7 +2138,7 @@ describe('plugin-meetings', () => {
2133
2138
  direction: {
2134
2139
  audio: 'sendrecv',
2135
2140
  video: 'sendrecv',
2136
- screenShareVideo: 'recvonly',
2141
+ screenShare: 'recvonly',
2137
2142
  },
2138
2143
  remoteQualityLevel: 'HIGH',
2139
2144
  expectedDebugId,
@@ -2163,7 +2168,7 @@ describe('plugin-meetings', () => {
2163
2168
  direction: {
2164
2169
  audio: 'sendrecv',
2165
2170
  video: 'sendrecv',
2166
- screenShareVideo: 'recvonly',
2171
+ screenShare: 'recvonly',
2167
2172
  },
2168
2173
  remoteQualityLevel: 'HIGH',
2169
2174
  expectedDebugId,
@@ -2195,7 +2200,7 @@ describe('plugin-meetings', () => {
2195
2200
  direction: {
2196
2201
  audio: 'sendrecv',
2197
2202
  video: 'sendrecv',
2198
- screenShareVideo: 'recvonly',
2203
+ screenShare: 'recvonly',
2199
2204
  },
2200
2205
  remoteQualityLevel: 'HIGH',
2201
2206
  expectedDebugId,
@@ -2224,7 +2229,7 @@ describe('plugin-meetings', () => {
2224
2229
  direction: {
2225
2230
  audio: 'inactive',
2226
2231
  video: 'sendrecv',
2227
- screenShareVideo: 'recvonly',
2232
+ screenShare: 'recvonly',
2228
2233
  },
2229
2234
  remoteQualityLevel: 'HIGH',
2230
2235
  expectedDebugId,
@@ -2254,7 +2259,68 @@ describe('plugin-meetings', () => {
2254
2259
  direction: {
2255
2260
  audio: 'inactive',
2256
2261
  video: 'sendrecv',
2257
- screenShareVideo: 'recvonly',
2262
+ screenShare: 'recvonly',
2263
+ },
2264
+ remoteQualityLevel: 'HIGH',
2265
+ expectedDebugId,
2266
+ meetingId: meeting.id
2267
+ });
2268
+
2269
+ // and SDP offer was sent with the right audioMuted/videoMuted values
2270
+ checkSdpOfferSent({audioMuted: true, videoMuted: true});
2271
+
2272
+ // and no other local mute requests were sent to Locus
2273
+ assert.calledOnce(locusMediaRequestStub);
2274
+ });
2275
+
2276
+
2277
+ it('addMedia() works correctly when video is disabled with no tracks to publish', async () => {
2278
+ await meeting.addMedia({videoEnabled: false});
2279
+ await simulateRoapOffer();
2280
+
2281
+ // check RoapMediaConnection was created correctly
2282
+ checkMediaConnectionCreated({
2283
+ mediaConnectionConfig: expectedMediaConnectionConfig,
2284
+ localStreams: {
2285
+ audio: undefined,
2286
+ video: undefined,
2287
+ screenShareVideo: undefined,
2288
+ screenShareAudio: undefined,
2289
+ },
2290
+ direction: {
2291
+ audio: 'sendrecv',
2292
+ video: 'inactive',
2293
+ screenShare: 'recvonly',
2294
+ },
2295
+ remoteQualityLevel: 'HIGH',
2296
+ expectedDebugId,
2297
+ meetingId: meeting.id
2298
+ });
2299
+
2300
+ // and SDP offer was sent with the right audioMuted/videoMuted values
2301
+ checkSdpOfferSent({audioMuted: true, videoMuted: true});
2302
+
2303
+ // and no other local mute requests were sent to Locus
2304
+ assert.calledOnce(locusMediaRequestStub);
2305
+ });
2306
+
2307
+ it('addMedia() works correctly when screen share is disabled with no tracks to publish', async () => {
2308
+ await meeting.addMedia({shareAudioEnabled: false, shareVideoEnabled: false});
2309
+ await simulateRoapOffer();
2310
+
2311
+ // check RoapMediaConnection was created correctly
2312
+ checkMediaConnectionCreated({
2313
+ mediaConnectionConfig: expectedMediaConnectionConfig,
2314
+ localStreams: {
2315
+ audio: undefined,
2316
+ video: undefined,
2317
+ screenShareVideo: undefined,
2318
+ screenShareAudio: undefined,
2319
+ },
2320
+ direction: {
2321
+ audio: 'sendrecv',
2322
+ video: 'sendrecv',
2323
+ screenShare: 'inactive',
2258
2324
  },
2259
2325
  remoteQualityLevel: 'HIGH',
2260
2326
  expectedDebugId,
@@ -125,6 +125,11 @@ describe('plugin-meetings', () => {
125
125
  packetsSent: 0,
126
126
  bytesSent: 1,
127
127
  },
128
+ {
129
+ type: 'local-candidate',
130
+ id: 'fake-candidate-id',
131
+ protocol: 'tcp'
132
+ },
128
133
  ],
129
134
  },
130
135
  ],
@@ -136,6 +141,11 @@ describe('plugin-meetings', () => {
136
141
  packetsReceived: 0,
137
142
  bytesReceived: 1,
138
143
  },
144
+ {
145
+ type: 'local-candidate',
146
+ id: 'fake-candidate-id',
147
+ protocol: 'tcp'
148
+ },
139
149
  ],
140
150
  },
141
151
  ],
@@ -149,6 +159,11 @@ describe('plugin-meetings', () => {
149
159
  framesSent: 0,
150
160
  bytesSent: 1,
151
161
  },
162
+ {
163
+ type: 'local-candidate',
164
+ id: 'fake-candidate-id',
165
+ protocol: 'tcp'
166
+ },
152
167
  ],
153
168
  },
154
169
  ],
@@ -163,6 +178,11 @@ describe('plugin-meetings', () => {
163
178
  frameWidth: 1280,
164
179
  framesReceived: 1,
165
180
  },
181
+ {
182
+ type: 'local-candidate',
183
+ id: 'fake-candidate-id',
184
+ protocol: 'tcp'
185
+ },
166
186
  ],
167
187
  },
168
188
  ],
@@ -242,6 +262,13 @@ describe('plugin-meetings', () => {
242
262
  assert.strictEqual(mqeData.videoReceive[0].streams[0].receivedWidth, 1280);
243
263
  };
244
264
 
265
+ const checkMqeTransportType = () => {
266
+ console.log(mqeData.audioTransmit[0])
267
+ console.log(mqeData.videoReceive[0])
268
+ assert.strictEqual(mqeData.audioTransmit[0].common.transportType, 'TCP');
269
+ assert.strictEqual(mqeData.videoReceive[0].common.transportType, 'TCP');
270
+ }
271
+
245
272
  it('emits LOCAL_MEDIA_STARTED and LOCAL_MEDIA_STOPPED events for audio', async () => {
246
273
  await startStatsAnalyzer({expected: {sendAudio: true}});
247
274
 
@@ -330,6 +357,14 @@ describe('plugin-meetings', () => {
330
357
  // Check that the mqe data has been emitted and is correctly computed.
331
358
  checkMqeData();
332
359
  });
360
+
361
+ it('emits the correct transportType in MEDIA_QUALITY events', async () => {
362
+ await startStatsAnalyzer({expected: {receiveVideo: true}});
363
+
364
+ await progressTime();
365
+
366
+ checkMqeTransportType();
367
+ });
333
368
  });
334
369
  });
335
370
  });