@webex/plugin-meetings 2.14.4 → 2.17.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -0
- package/dist/analyzer/analyzer.js.map +1 -1
- package/dist/analyzer/calculator.js.map +1 -1
- package/dist/common/browser-detection.js.map +1 -1
- package/dist/common/collection.js +2 -3
- package/dist/common/collection.js.map +1 -1
- package/dist/common/errors/captcha-error.js.map +1 -1
- package/dist/common/errors/intent-to-join.js.map +1 -1
- package/dist/common/errors/join-meeting.js.map +1 -1
- package/dist/common/errors/media.js.map +1 -1
- package/dist/common/errors/parameter.js +20 -5
- package/dist/common/errors/parameter.js.map +1 -1
- package/dist/common/errors/password-error.js.map +1 -1
- package/dist/common/errors/permission.js.map +1 -1
- package/dist/common/errors/reconnection.js.map +1 -1
- package/dist/common/errors/stats.js.map +1 -1
- package/dist/common/events/events-scope.js.map +1 -1
- package/dist/common/events/events.js.map +1 -1
- package/dist/common/events/trigger-proxy.js.map +1 -1
- package/dist/common/events/util.js.map +1 -1
- package/dist/common/logs/logger-proxy.js.map +1 -1
- package/dist/common/logs/request.js.map +1 -1
- package/dist/common/queue.js +3 -0
- package/dist/common/queue.js.map +1 -1
- package/dist/config.js.map +1 -1
- package/dist/constants.js +2 -1
- package/dist/constants.js.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/locus-info/fullState.js.map +1 -1
- package/dist/locus-info/index.js +5 -3
- package/dist/locus-info/index.js.map +1 -1
- package/dist/locus-info/infoUtils.js +8 -6
- package/dist/locus-info/infoUtils.js.map +1 -1
- package/dist/locus-info/parser.js.map +1 -1
- package/dist/locus-info/selfUtils.js +22 -9
- package/dist/locus-info/selfUtils.js.map +1 -1
- package/dist/media/index.js.map +1 -1
- package/dist/media/properties.js.map +1 -1
- package/dist/media/util.js.map +1 -1
- package/dist/meeting/effectsState.js.map +1 -1
- package/dist/meeting/in-meeting-actions.js +3 -1
- package/dist/meeting/in-meeting-actions.js.map +1 -1
- package/dist/meeting/index.js +7 -3
- package/dist/meeting/index.js.map +1 -1
- package/dist/meeting/muteState.js.map +1 -1
- package/dist/meeting/request.js.map +1 -1
- package/dist/meeting/state.js.map +1 -1
- package/dist/meeting/util.js +4 -0
- package/dist/meeting/util.js.map +1 -1
- package/dist/meeting-info/index.js.map +1 -1
- package/dist/meeting-info/meeting-info-v2.js.map +1 -1
- package/dist/meeting-info/request.js.map +1 -1
- package/dist/meeting-info/util.js +0 -3
- package/dist/meeting-info/util.js.map +1 -1
- package/dist/meeting-info/utilv2.js +0 -3
- package/dist/meeting-info/utilv2.js.map +1 -1
- package/dist/meetings/index.js.map +1 -1
- package/dist/meetings/request.js.map +1 -1
- package/dist/meetings/util.js.map +1 -1
- package/dist/member/index.js.map +1 -1
- package/dist/members/index.js.map +1 -1
- package/dist/members/request.js.map +1 -1
- package/dist/members/util.js.map +1 -1
- package/dist/metrics/index.js.map +1 -1
- package/dist/metrics/mqa-processor.js.map +1 -1
- package/dist/networkQualityMonitor/index.js.map +1 -1
- package/dist/peer-connection-manager/index.js.map +1 -1
- package/dist/personal-meeting-room/request.js.map +1 -1
- package/dist/personal-meeting-room/util.js.map +1 -1
- package/dist/reachability/index.js.map +1 -1
- package/dist/reachability/request.js.map +1 -1
- package/dist/reconnection-manager/index.js +0 -3
- package/dist/reconnection-manager/index.js.map +1 -1
- package/dist/roap/collection.js.map +1 -1
- package/dist/roap/handler.js.map +1 -1
- package/dist/roap/index.js.map +1 -1
- package/dist/roap/request.js.map +1 -1
- package/dist/roap/state.js.map +1 -1
- package/dist/roap/util.js.map +1 -1
- package/dist/stats/data.js.map +1 -1
- package/dist/stats/events.js.map +1 -1
- package/dist/stats/filter.js.map +1 -1
- package/dist/stats/index.js.map +1 -1
- package/dist/stats/metrics.js.map +1 -1
- package/dist/stats/stats.js.map +1 -1
- package/dist/stats/stream.js.map +1 -1
- package/dist/stats/transformer.js.map +1 -1
- package/dist/stats/util.js.map +1 -1
- package/dist/statsAnalyzer/index.js.map +1 -1
- package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
- package/dist/transcription/index.js.map +1 -1
- package/package.json +6 -6
- package/src/common/{collection.js → collection.ts} +2 -2
- package/src/common/errors/parameter.ts +29 -0
- package/src/common/{queue.js → queue.ts} +1 -0
- package/src/{constants.js → constants.ts} +1 -0
- package/src/locus-info/index.js +4 -4
- package/src/locus-info/infoUtils.js +15 -7
- package/src/locus-info/selfUtils.js +18 -9
- package/src/meeting/in-meeting-actions.js +2 -0
- package/src/meeting/index.js +6 -1
- package/src/meeting/util.js +2 -0
- package/test/unit/spec/locus-info/index.js +4 -1
- package/test/unit/spec/locus-info/infoUtils.js +33 -10
- package/test/unit/spec/locus-info/selfUtils.js +20 -0
- package/test/unit/spec/meeting/in-meeting-actions.js +2 -0
- package/test/unit/spec/meeting/index.js +5 -2
- package/test/unit/spec/meeting/utils.js +7 -0
- package/dist/common/constants.js +0 -15
- package/dist/common/constants.js.map +0 -1
- package/src/common/constants.js +0 -6
- package/src/common/errors/parameter.js +0 -26
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["getAudioReceiverMqa","audioReceiver","statsResults","lastMqaDataSent","mediaType","STATS","AUDIO_CORRELATE","sendrecvType","RECEIVE_DIRECTION","common","direction","transportType","connectionType","remote","transport","rtpPackets","totalPacketsReceived","streams","mediaHopByHopLost","totalPacketsLost","rtpHopByHopLost","maxRtpJitter","meanRtpJitter","rtpJitter","fecRecovered","fecPacketsReceived","fecPacketsDiscarded","rtpEndToEndLost","framesDropped","totalSamplesDecoded","renderedFrameRate","framesReceived","totalSamplesReceived","concealedFrames","concealedSamples","receivedBitrate","totalBytesReceived","rtpBitrate","getAudioSenderMqa","audioSender","SEND_DIRECTION","local","maxRemoteJitter","meanRemoteJitter","totalPacketsSent","availableBitrate","availableOutgoingBitrate","totalpacketsLostForaMin","totalPacketsLostOnReceiver","remoteLossRate","maxRoundTripTime","meanRoundTripTime","roundTripTime","totalBytesSentInaMin","totalBytesSent","transmittedBitrate","transmittedKeyFrames","totalKeyFramesEncoded","requestedKeyFrames","totalFirCount","getVideoReceiverMqa","videoReceiver","isShareStream","SHARE_CORRELATE","VIDEO_CORRELATE","totalPacketLoss","totalBytesReceivedInaMin","totalFrameReceivedInaMin","resolutions","totalFrameDecodedInaMin","framesDecoded","receivedFrameRate","receivedHeight","height","receivedWidth","width","receivedFrameSize","receivedKeyFrames","keyFramesDecoded","totalPliCount","getVideoSenderMqa","videoSender","totalFrameSentInaMin","framesSent","transmittedFrameRate","transmittedHeight","transmittedWidth","transmittedFrameSize"],"sources":["mqaUtil.js"],"sourcesContent":["\nimport {mean, max} from 'lodash';\n\nimport {STATS} from '../constants';\n\nexport const getAudioReceiverMqa = ({audioReceiver, statsResults, lastMqaDataSent}) => {\n const mediaType = STATS.AUDIO_CORRELATE;\n const sendrecvType = STATS.RECEIVE_DIRECTION;\n\n audioReceiver.common.common.direction = statsResults[mediaType].direction;\n audioReceiver.common.transportType = statsResults.connectionType.remote.transport[0];\n // add rtpPacket info inside common as also for call analyzer\n audioReceiver.common.rtpPackets = statsResults[mediaType][sendrecvType].totalPacketsReceived - lastMqaDataSent[mediaType][sendrecvType].totalPacketsReceived || 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 = (statsResults[mediaType][sendrecvType].totalPacketsLost - lastMqaDataSent[mediaType][sendrecvType].totalPacketsLost) || 0;\n audioReceiver.common.rtpHopByHopLost = statsResults[mediaType][sendrecvType].totalPacketsLost - lastMqaDataSent[mediaType][sendrecvType].totalPacketsLost || 0;\n\n audioReceiver.streams[0].common.maxRtpJitter = max(statsResults[mediaType][sendrecvType].meanRtpJitter) * 1000 || 0;\n audioReceiver.streams[0].common.meanRtpJitter = 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 = (statsResults[mediaType][sendrecvType].fecPacketsReceived - lastMqaDataSent[mediaType][sendrecvType].fecPacketsReceived) - (statsResults[mediaType][sendrecvType].fecPacketsDiscarded - lastMqaDataSent[mediaType][sendrecvType].fecPacketsDiscarded);\n\n audioReceiver.streams[0].common.rtpEndToEndLost = (statsResults[mediaType][sendrecvType].totalPacketsLost - lastMqaDataSent[mediaType][sendrecvType].totalPacketsLost) - fecRecovered || 0;\n\n audioReceiver.streams[0].common.framesDropped = statsResults[mediaType][sendrecvType].totalSamplesDecoded - lastMqaDataSent[mediaType][sendrecvType].totalSamplesDecoded || 0;\n audioReceiver.streams[0].common.renderedFrameRate = audioReceiver.streams[0].common.framesDropped * 100 / 60 || 0;\n audioReceiver.streams[0].common.framesReceived = statsResults[mediaType][sendrecvType].totalSamplesReceived - lastMqaDataSent[mediaType][sendrecvType].totalSamplesReceived || 0;\n audioReceiver.streams[0].common.concealedFrames = statsResults[mediaType][sendrecvType].concealedSamples - lastMqaDataSent[mediaType][sendrecvType].concealedSamples || 0;\n audioReceiver.streams[0].common.receivedBitrate = (statsResults[mediaType][sendrecvType].totalBytesReceived - lastMqaDataSent[mediaType][sendrecvType].totalBytesReceived) * 8 / 60 || 0;\n\n audioReceiver.common.rtpBitrate = audioReceiver.streams[0].common.receivedBitrate;\n};\n\n\nexport const getAudioSenderMqa = ({audioSender, statsResults, lastMqaDataSent}) => {\n const mediaType = STATS.AUDIO_CORRELATE;\n const sendrecvType = STATS.SEND_DIRECTION;\n\n audioSender.common.common.direction = statsResults[mediaType].direction;\n audioSender.common.transportType = statsResults.connectionType.local.transport[0];\n\n audioSender.common.maxRemoteJitter = max(statsResults[mediaType][sendrecvType].meanRemoteJitter) * 1000 || 0;\n audioSender.common.meanRemoteJitter = mean(statsResults[mediaType][sendrecvType].meanRemoteJitter) * 1000 || 0;\n\n audioSender.common.rtpPackets = statsResults[mediaType][sendrecvType].totalPacketsSent - lastMqaDataSent[mediaType][sendrecvType].totalPacketsSent || 0;\n audioSender.streams[0].common.rtpPackets = audioSender.common.rtpPackets;\n // From candidate-pair\n audioSender.common.availableBitrate = 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 = statsResults[mediaType][sendrecvType].totalPacketsLostOnReceiver - lastMqaDataSent[mediaType][sendrecvType].totalPacketsLostOnReceiver;\n\n audioSender.common.remoteLossRate = totalpacketsLostForaMin > 0 ? (totalpacketsLostForaMin * 100 / audioSender.common.rtpPackets) : 0; // This is the packets sent with in last min || 0;\n\n audioSender.common.maxRoundTripTime = max(statsResults[mediaType][sendrecvType].meanRoundTripTime) * 1000 || 0;\n audioSender.common.meanRoundTripTime = mean(statsResults[mediaType][sendrecvType].meanRoundTripTime) * 1000 || 0;\n audioSender.common.roundTripTime = audioSender.common.maxRoundTripTime;\n\n\n // Calculate the outgoing bitrate\n const totalBytesSentInaMin = statsResults[mediaType][sendrecvType].totalBytesSent - lastMqaDataSent[mediaType][sendrecvType].totalBytesSent;\n\n audioSender.streams[0].common.transmittedBitrate = totalBytesSentInaMin ? (totalBytesSentInaMin) * 8 / 60 : 0;\n audioSender.common.rtpBitrate = audioSender.streams[0].common.transmittedBitrate;\n\n\n audioSender.streams[0].transmittedKeyFrames = statsResults[mediaType][sendrecvType].totalKeyFramesEncoded - lastMqaDataSent[mediaType][sendrecvType].totalKeyFramesEncoded || 0;\n audioSender.streams[0].requestedKeyFrames = statsResults[mediaType][sendrecvType].totalFirCount - lastMqaDataSent[mediaType][sendrecvType].totalFirCount || 0;\n};\n\n\nexport const getVideoReceiverMqa = ({\n videoReceiver, statsResults, lastMqaDataSent, isShareStream = false\n}) => {\n const mediaType = isShareStream ? STATS.SHARE_CORRELATE : STATS.VIDEO_CORRELATE;\n const sendrecvType = STATS.RECEIVE_DIRECTION;\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 = statsResults[mediaType][sendrecvType].totalPacketsReceived - lastMqaDataSent[mediaType][sendrecvType].totalPacketsReceived || 0;\n videoReceiver.streams[0].common.rtpPackets = videoReceiver.common.rtpPackets;\n\n const totalPacketLoss = (statsResults[mediaType][sendrecvType].totalPacketsLost - lastMqaDataSent[mediaType][sendrecvType].totalPacketsLost) || 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 = max(statsResults[mediaType][sendrecvType].meanRemoteJitter) * 1000 || 0;\n videoReceiver.common.meanRemoteJitter = 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 = statsResults[mediaType][sendrecvType].totalBytesReceived - lastMqaDataSent[mediaType][sendrecvType].totalBytesReceived;\n\n videoReceiver.streams[0].common.receivedBitrate = totalBytesReceivedInaMin ? (totalBytesReceivedInaMin) * 8 / 60 : 0;\n videoReceiver.common.rtpBitrate = videoReceiver.streams[0].common.receivedBitrate;\n\n // From tracks //TODO: calculate a proper one\n const totalFrameReceivedInaMin = statsResults.resolutions[mediaType][sendrecvType].framesReceived - lastMqaDataSent.resolutions[mediaType][sendrecvType].framesReceived;\n const totalFrameDecodedInaMin = statsResults.resolutions[mediaType][sendrecvType].framesDecoded - lastMqaDataSent.resolutions[mediaType][sendrecvType].framesDecoded;\n\n videoReceiver.streams[0].common.receivedFrameRate = totalFrameReceivedInaMin ? totalFrameReceivedInaMin * 100 / 60 : 0;\n videoReceiver.streams[0].common.renderedFrameRate = totalFrameDecodedInaMin ? totalFrameDecodedInaMin * 100 / 60 : 0;\n\n videoReceiver.streams[0].common.framesDropped = statsResults.resolutions[mediaType][sendrecvType].framesDropped - lastMqaDataSent.resolutions[mediaType][sendrecvType].framesDropped;\n videoReceiver.streams[0].receivedHeight = statsResults.resolutions[mediaType][sendrecvType].height;\n videoReceiver.streams[0].receivedWidth = statsResults.resolutions[mediaType][sendrecvType].width;\n videoReceiver.streams[0].receivedFrameSize = statsResults.resolutions[mediaType][sendrecvType].height * statsResults.resolutions[mediaType][sendrecvType].height / 256;\n\n videoReceiver.streams[0].receivedKeyFrames = statsResults[mediaType][sendrecvType].keyFramesDecoded - lastMqaDataSent[mediaType][sendrecvType].keyFramesDecoded || 0;\n videoReceiver.streams[0].requestedKeyFrames = statsResults[mediaType][sendrecvType].totalPliCount - lastMqaDataSent[mediaType][sendrecvType].totalPliCount || 0;\n};\n\nexport const getVideoSenderMqa = ({\n videoSender, statsResults, lastMqaDataSent, isShareStream = false\n}) => {\n const mediaType = isShareStream ? STATS.SHARE_CORRELATE : STATS.VIDEO_CORRELATE;\n const sendrecvType = STATS.SEND_DIRECTION;\n\n videoSender.common.common.direction = statsResults[mediaType].direction;\n videoSender.common.transportType = statsResults.connectionType.local.transport[0];\n\n videoSender.common.maxRemoteJitter = max(statsResults[mediaType][sendrecvType].meanRemoteJitter) * 1000 || 0;\n videoSender.common.meanRemoteJitter = mean(statsResults[mediaType][sendrecvType].meanRemoteJitter) * 1000 || 0;\n\n\n videoSender.common.rtpPackets = statsResults[mediaType][sendrecvType].totalPacketsSent - lastMqaDataSent[mediaType][sendrecvType].totalPacketsSent || 0;\n videoSender.common.availableBitrate = 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 = statsResults[mediaType][sendrecvType].totalPacketsLostOnReceiver - lastMqaDataSent[mediaType][sendrecvType].totalPacketsLostOnReceiver;\n\n videoSender.common.remoteLossRate = totalpacketsLostForaMin > 0 ? (totalpacketsLostForaMin) * 100 / (videoSender.common.rtpPackets + totalpacketsLostForaMin) : 0; // This is the packets sent with in last min || 0;\n\n videoSender.common.maxRoundTripTime = max(statsResults[mediaType][sendrecvType].meanRoundTripTime) * 1000 || 0;\n videoSender.common.meanRoundTripTime = mean(statsResults[mediaType][sendrecvType].meanRoundTripTime) * 1000 || 0;\n videoSender.common.roundTripTime = videoSender.common.maxRoundTripTime;\n\n videoSender.streams[0].common.rtpPackets = statsResults[mediaType][sendrecvType].totalPacketsSent - lastMqaDataSent[mediaType][sendrecvType].totalPacketsSent || 0;\n\n // Calculate the outgoing bitrate\n const totalBytesSentInaMin = statsResults[mediaType][sendrecvType].totalBytesSent - lastMqaDataSent[mediaType][sendrecvType].totalBytesSent;\n\n videoSender.streams[0].common.transmittedBitrate = totalBytesSentInaMin ? (totalBytesSentInaMin) * 8 / 60 : 0;\n\n videoSender.common.rtpBitrate = videoSender.streams[0].common.transmittedBitrate;\n\n\n videoSender.streams[0].transmittedKeyFrames = statsResults[mediaType][sendrecvType].totalKeyFramesEncoded - lastMqaDataSent[mediaType][sendrecvType].totalKeyFramesEncoded || 0;\n videoSender.streams[0].requestedKeyFrames = statsResults[mediaType][sendrecvType].totalFirCount - lastMqaDataSent[mediaType][sendrecvType].totalFirCount || 0;\n\n // From tracks //TODO: calculate a proper one\n const totalFrameSentInaMin = statsResults.resolutions[mediaType][sendrecvType].framesSent - (lastMqaDataSent.resolutions[mediaType][sendrecvType].framesSent || 0);\n\n videoSender.streams[0].common.transmittedFrameRate = totalFrameSentInaMin ? totalFrameSentInaMin * 100 / 60 : 0;\n videoSender.streams[0].transmittedHeight = statsResults.resolutions[mediaType][sendrecvType].height;\n videoSender.streams[0].transmittedWidth = statsResults.resolutions[mediaType][sendrecvType].width;\n videoSender.streams[0].transmittedFrameSize = statsResults.resolutions[mediaType][sendrecvType].height * statsResults.resolutions[mediaType][sendrecvType].width / 254;\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"names":["getAudioReceiverMqa","audioReceiver","statsResults","lastMqaDataSent","mediaType","STATS","AUDIO_CORRELATE","sendrecvType","RECEIVE_DIRECTION","common","direction","transportType","connectionType","remote","transport","rtpPackets","totalPacketsReceived","streams","mediaHopByHopLost","totalPacketsLost","rtpHopByHopLost","maxRtpJitter","meanRtpJitter","rtpJitter","fecRecovered","fecPacketsReceived","fecPacketsDiscarded","rtpEndToEndLost","framesDropped","totalSamplesDecoded","renderedFrameRate","framesReceived","totalSamplesReceived","concealedFrames","concealedSamples","receivedBitrate","totalBytesReceived","rtpBitrate","getAudioSenderMqa","audioSender","SEND_DIRECTION","local","maxRemoteJitter","meanRemoteJitter","totalPacketsSent","availableBitrate","availableOutgoingBitrate","totalpacketsLostForaMin","totalPacketsLostOnReceiver","remoteLossRate","maxRoundTripTime","meanRoundTripTime","roundTripTime","totalBytesSentInaMin","totalBytesSent","transmittedBitrate","transmittedKeyFrames","totalKeyFramesEncoded","requestedKeyFrames","totalFirCount","getVideoReceiverMqa","videoReceiver","isShareStream","SHARE_CORRELATE","VIDEO_CORRELATE","totalPacketLoss","totalBytesReceivedInaMin","totalFrameReceivedInaMin","resolutions","totalFrameDecodedInaMin","framesDecoded","receivedFrameRate","receivedHeight","height","receivedWidth","width","receivedFrameSize","receivedKeyFrames","keyFramesDecoded","totalPliCount","getVideoSenderMqa","videoSender","totalFrameSentInaMin","framesSent","transmittedFrameRate","transmittedHeight","transmittedWidth","transmittedFrameSize"],"sources":["mqaUtil.js"],"sourcesContent":["\nimport {mean, max} from 'lodash';\n\nimport {STATS} from '../constants';\n\nexport const getAudioReceiverMqa = ({audioReceiver, statsResults, lastMqaDataSent}) => {\n const mediaType = STATS.AUDIO_CORRELATE;\n const sendrecvType = STATS.RECEIVE_DIRECTION;\n\n audioReceiver.common.common.direction = statsResults[mediaType].direction;\n audioReceiver.common.transportType = statsResults.connectionType.remote.transport[0];\n // add rtpPacket info inside common as also for call analyzer\n audioReceiver.common.rtpPackets = statsResults[mediaType][sendrecvType].totalPacketsReceived - lastMqaDataSent[mediaType][sendrecvType].totalPacketsReceived || 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 = (statsResults[mediaType][sendrecvType].totalPacketsLost - lastMqaDataSent[mediaType][sendrecvType].totalPacketsLost) || 0;\n audioReceiver.common.rtpHopByHopLost = statsResults[mediaType][sendrecvType].totalPacketsLost - lastMqaDataSent[mediaType][sendrecvType].totalPacketsLost || 0;\n\n audioReceiver.streams[0].common.maxRtpJitter = max(statsResults[mediaType][sendrecvType].meanRtpJitter) * 1000 || 0;\n audioReceiver.streams[0].common.meanRtpJitter = 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 = (statsResults[mediaType][sendrecvType].fecPacketsReceived - lastMqaDataSent[mediaType][sendrecvType].fecPacketsReceived) - (statsResults[mediaType][sendrecvType].fecPacketsDiscarded - lastMqaDataSent[mediaType][sendrecvType].fecPacketsDiscarded);\n\n audioReceiver.streams[0].common.rtpEndToEndLost = (statsResults[mediaType][sendrecvType].totalPacketsLost - lastMqaDataSent[mediaType][sendrecvType].totalPacketsLost) - fecRecovered || 0;\n\n audioReceiver.streams[0].common.framesDropped = statsResults[mediaType][sendrecvType].totalSamplesDecoded - lastMqaDataSent[mediaType][sendrecvType].totalSamplesDecoded || 0;\n audioReceiver.streams[0].common.renderedFrameRate = audioReceiver.streams[0].common.framesDropped * 100 / 60 || 0;\n audioReceiver.streams[0].common.framesReceived = statsResults[mediaType][sendrecvType].totalSamplesReceived - lastMqaDataSent[mediaType][sendrecvType].totalSamplesReceived || 0;\n audioReceiver.streams[0].common.concealedFrames = statsResults[mediaType][sendrecvType].concealedSamples - lastMqaDataSent[mediaType][sendrecvType].concealedSamples || 0;\n audioReceiver.streams[0].common.receivedBitrate = (statsResults[mediaType][sendrecvType].totalBytesReceived - lastMqaDataSent[mediaType][sendrecvType].totalBytesReceived) * 8 / 60 || 0;\n\n audioReceiver.common.rtpBitrate = audioReceiver.streams[0].common.receivedBitrate;\n};\n\n\nexport const getAudioSenderMqa = ({audioSender, statsResults, lastMqaDataSent}) => {\n const mediaType = STATS.AUDIO_CORRELATE;\n const sendrecvType = STATS.SEND_DIRECTION;\n\n audioSender.common.common.direction = statsResults[mediaType].direction;\n audioSender.common.transportType = statsResults.connectionType.local.transport[0];\n\n audioSender.common.maxRemoteJitter = max(statsResults[mediaType][sendrecvType].meanRemoteJitter) * 1000 || 0;\n audioSender.common.meanRemoteJitter = mean(statsResults[mediaType][sendrecvType].meanRemoteJitter) * 1000 || 0;\n\n audioSender.common.rtpPackets = statsResults[mediaType][sendrecvType].totalPacketsSent - lastMqaDataSent[mediaType][sendrecvType].totalPacketsSent || 0;\n audioSender.streams[0].common.rtpPackets = audioSender.common.rtpPackets;\n // From candidate-pair\n audioSender.common.availableBitrate = 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 = statsResults[mediaType][sendrecvType].totalPacketsLostOnReceiver - lastMqaDataSent[mediaType][sendrecvType].totalPacketsLostOnReceiver;\n\n audioSender.common.remoteLossRate = totalpacketsLostForaMin > 0 ? (totalpacketsLostForaMin * 100 / audioSender.common.rtpPackets) : 0; // This is the packets sent with in last min || 0;\n\n audioSender.common.maxRoundTripTime = max(statsResults[mediaType][sendrecvType].meanRoundTripTime) * 1000 || 0;\n audioSender.common.meanRoundTripTime = mean(statsResults[mediaType][sendrecvType].meanRoundTripTime) * 1000 || 0;\n audioSender.common.roundTripTime = audioSender.common.maxRoundTripTime;\n\n\n // Calculate the outgoing bitrate\n const totalBytesSentInaMin = statsResults[mediaType][sendrecvType].totalBytesSent - lastMqaDataSent[mediaType][sendrecvType].totalBytesSent;\n\n audioSender.streams[0].common.transmittedBitrate = totalBytesSentInaMin ? (totalBytesSentInaMin) * 8 / 60 : 0;\n audioSender.common.rtpBitrate = audioSender.streams[0].common.transmittedBitrate;\n\n\n audioSender.streams[0].transmittedKeyFrames = statsResults[mediaType][sendrecvType].totalKeyFramesEncoded - lastMqaDataSent[mediaType][sendrecvType].totalKeyFramesEncoded || 0;\n audioSender.streams[0].requestedKeyFrames = statsResults[mediaType][sendrecvType].totalFirCount - lastMqaDataSent[mediaType][sendrecvType].totalFirCount || 0;\n};\n\n\nexport const getVideoReceiverMqa = ({\n videoReceiver, statsResults, lastMqaDataSent, isShareStream = false\n}) => {\n const mediaType = isShareStream ? STATS.SHARE_CORRELATE : STATS.VIDEO_CORRELATE;\n const sendrecvType = STATS.RECEIVE_DIRECTION;\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 = statsResults[mediaType][sendrecvType].totalPacketsReceived - lastMqaDataSent[mediaType][sendrecvType].totalPacketsReceived || 0;\n videoReceiver.streams[0].common.rtpPackets = videoReceiver.common.rtpPackets;\n\n const totalPacketLoss = (statsResults[mediaType][sendrecvType].totalPacketsLost - lastMqaDataSent[mediaType][sendrecvType].totalPacketsLost) || 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 = max(statsResults[mediaType][sendrecvType].meanRemoteJitter) * 1000 || 0;\n videoReceiver.common.meanRemoteJitter = 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 = statsResults[mediaType][sendrecvType].totalBytesReceived - lastMqaDataSent[mediaType][sendrecvType].totalBytesReceived;\n\n videoReceiver.streams[0].common.receivedBitrate = totalBytesReceivedInaMin ? (totalBytesReceivedInaMin) * 8 / 60 : 0;\n videoReceiver.common.rtpBitrate = videoReceiver.streams[0].common.receivedBitrate;\n\n // From tracks //TODO: calculate a proper one\n const totalFrameReceivedInaMin = statsResults.resolutions[mediaType][sendrecvType].framesReceived - lastMqaDataSent.resolutions[mediaType][sendrecvType].framesReceived;\n const totalFrameDecodedInaMin = statsResults.resolutions[mediaType][sendrecvType].framesDecoded - lastMqaDataSent.resolutions[mediaType][sendrecvType].framesDecoded;\n\n videoReceiver.streams[0].common.receivedFrameRate = totalFrameReceivedInaMin ? totalFrameReceivedInaMin * 100 / 60 : 0;\n videoReceiver.streams[0].common.renderedFrameRate = totalFrameDecodedInaMin ? totalFrameDecodedInaMin * 100 / 60 : 0;\n\n videoReceiver.streams[0].common.framesDropped = statsResults.resolutions[mediaType][sendrecvType].framesDropped - lastMqaDataSent.resolutions[mediaType][sendrecvType].framesDropped;\n videoReceiver.streams[0].receivedHeight = statsResults.resolutions[mediaType][sendrecvType].height;\n videoReceiver.streams[0].receivedWidth = statsResults.resolutions[mediaType][sendrecvType].width;\n videoReceiver.streams[0].receivedFrameSize = statsResults.resolutions[mediaType][sendrecvType].height * statsResults.resolutions[mediaType][sendrecvType].height / 256;\n\n videoReceiver.streams[0].receivedKeyFrames = statsResults[mediaType][sendrecvType].keyFramesDecoded - lastMqaDataSent[mediaType][sendrecvType].keyFramesDecoded || 0;\n videoReceiver.streams[0].requestedKeyFrames = statsResults[mediaType][sendrecvType].totalPliCount - lastMqaDataSent[mediaType][sendrecvType].totalPliCount || 0;\n};\n\nexport const getVideoSenderMqa = ({\n videoSender, statsResults, lastMqaDataSent, isShareStream = false\n}) => {\n const mediaType = isShareStream ? STATS.SHARE_CORRELATE : STATS.VIDEO_CORRELATE;\n const sendrecvType = STATS.SEND_DIRECTION;\n\n videoSender.common.common.direction = statsResults[mediaType].direction;\n videoSender.common.transportType = statsResults.connectionType.local.transport[0];\n\n videoSender.common.maxRemoteJitter = max(statsResults[mediaType][sendrecvType].meanRemoteJitter) * 1000 || 0;\n videoSender.common.meanRemoteJitter = mean(statsResults[mediaType][sendrecvType].meanRemoteJitter) * 1000 || 0;\n\n\n videoSender.common.rtpPackets = statsResults[mediaType][sendrecvType].totalPacketsSent - lastMqaDataSent[mediaType][sendrecvType].totalPacketsSent || 0;\n videoSender.common.availableBitrate = 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 = statsResults[mediaType][sendrecvType].totalPacketsLostOnReceiver - lastMqaDataSent[mediaType][sendrecvType].totalPacketsLostOnReceiver;\n\n videoSender.common.remoteLossRate = totalpacketsLostForaMin > 0 ? (totalpacketsLostForaMin) * 100 / (videoSender.common.rtpPackets + totalpacketsLostForaMin) : 0; // This is the packets sent with in last min || 0;\n\n videoSender.common.maxRoundTripTime = max(statsResults[mediaType][sendrecvType].meanRoundTripTime) * 1000 || 0;\n videoSender.common.meanRoundTripTime = mean(statsResults[mediaType][sendrecvType].meanRoundTripTime) * 1000 || 0;\n videoSender.common.roundTripTime = videoSender.common.maxRoundTripTime;\n\n videoSender.streams[0].common.rtpPackets = statsResults[mediaType][sendrecvType].totalPacketsSent - lastMqaDataSent[mediaType][sendrecvType].totalPacketsSent || 0;\n\n // Calculate the outgoing bitrate\n const totalBytesSentInaMin = statsResults[mediaType][sendrecvType].totalBytesSent - lastMqaDataSent[mediaType][sendrecvType].totalBytesSent;\n\n videoSender.streams[0].common.transmittedBitrate = totalBytesSentInaMin ? (totalBytesSentInaMin) * 8 / 60 : 0;\n\n videoSender.common.rtpBitrate = videoSender.streams[0].common.transmittedBitrate;\n\n\n videoSender.streams[0].transmittedKeyFrames = statsResults[mediaType][sendrecvType].totalKeyFramesEncoded - lastMqaDataSent[mediaType][sendrecvType].totalKeyFramesEncoded || 0;\n videoSender.streams[0].requestedKeyFrames = statsResults[mediaType][sendrecvType].totalFirCount - lastMqaDataSent[mediaType][sendrecvType].totalFirCount || 0;\n\n // From tracks //TODO: calculate a proper one\n const totalFrameSentInaMin = statsResults.resolutions[mediaType][sendrecvType].framesSent - (lastMqaDataSent.resolutions[mediaType][sendrecvType].framesSent || 0);\n\n videoSender.streams[0].common.transmittedFrameRate = totalFrameSentInaMin ? totalFrameSentInaMin * 100 / 60 : 0;\n videoSender.streams[0].transmittedHeight = statsResults.resolutions[mediaType][sendrecvType].height;\n videoSender.streams[0].transmittedWidth = statsResults.resolutions[mediaType][sendrecvType].width;\n videoSender.streams[0].transmittedFrameSize = statsResults.resolutions[mediaType][sendrecvType].height * statsResults.resolutions[mediaType][sendrecvType].width / 254;\n};\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["Transcription","webSocketUrl","sessionId","members","sessionID","memberCSIs","params","webSocket","WebSocket","token","onopen","send","id","type","data","trackingId","toString","callback","onclose","event","onerror","csis","csi","member","membersCollection","find","participant","status","selfIsSpeaking","includes","speaker","transcription","onmessage","JSON","parse","voiceaPayload","getSpeaker","messageID","transcript_id","personID","timestamp","close"],"sources":["index.js"],"sourcesContent":["import {v4 as uuidv4} from 'uuid';\n\n/**\n * @description Meeting Webex assistance transcription feature.\n * @exports\n * @class Transcription\n */\nexport default class Transcription {\n /**\n * @param {string} webSocketUrl\n * @param {sessionID} sessionId\n * @param {object} members\n * @constructor\n * @memberof Transcription\n */\n constructor(webSocketUrl, sessionId, members) {\n this.webSocketUrl = webSocketUrl;\n this.sessionID = sessionId;\n this.members = members;\n this.memberCSIs = {};\n\n const params = '?outboundWireFormat=text&bufferStates=true&aliasHttpStatus=true';\n\n this.webSocket = new WebSocket(`${this.webSocketUrl}${params}`);\n }\n\n /**\n * open the Low Latency Mercury connection\n * An event parameter will be send to the callback.\n *\n * @param {string} token\n * @param {string} sessionID\n * @returns {void}\n */\n connect(token) {\n this.webSocket.onopen = () => {\n this.webSocket.send(JSON.stringify({\n id: uuidv4(),\n type: 'authorization',\n data: {token: `Bearer ${token}`},\n trackingId: `webex-js-sdk_${this.sessionID}${Date.now.toString()}`\n }));\n };\n }\n\n /**\n * Sets callback to invoke when the web socket connection is closed.\n *\n * @param {function} callback\n * @returns {void}\n */\n onCloseSocket(callback) {\n if (callback) {\n this.webSocket.onclose = (event) => {\n callback(event);\n };\n }\n }\n\n /**\n * Sets callback to invoke when a web socket connection error occurs.\n * An event parameter will be send to the callback.\n *\n * @param {function} callback\n * @returns {void}\n */\n onErrorSocket(callback) {\n if (callback) {\n this.webSocket.onerror = (event) => {\n callback(event);\n };\n }\n }\n\n /**\n * Get current speaker from the given csis payload and update the global csis map\n *\n * @private\n * @param {object} csis\n * @returns {object}\n */\n getSpeaker(csis) {\n for (const csi of csis) {\n const member = this.memberCSIs[csi];\n\n if (member) {\n return member;\n }\n }\n\n return Object.values(this.members.membersCollection.members)\n .find((member) => {\n const memberCSIs = member.participant.status.csis;\n let selfIsSpeaking = false;\n\n for (const csi of csis) {\n if (memberCSIs.includes(csi)) {\n this.memberCSIs[csi] = member;\n selfIsSpeaking = true;\n break;\n }\n }\n\n return selfIsSpeaking;\n });\n }\n\n /**\n * Sends transcription data to given callback as it arrives.\n *\n * @param {function} callback\n * @returns {void}\n */\n subscribe(callback) {\n let data, csis, speaker, transcription;\n\n this.webSocket.onmessage = (event) => {\n data = JSON.parse(event.data);\n csis = data.data?.voiceaPayload?.csis || [];\n speaker = this.getSpeaker(csis);\n transcription = data.data?.voiceaPayload?.data || '';\n\n this.webSocket.send(JSON.stringify({messageID: data.id, type: 'ack'}));\n\n if (transcription) {\n callback(\n {\n id: data.data?.voiceaPayload?.transcript_id,\n personID: speaker?.id,\n transcription,\n timestamp: data.timestamp,\n type: data?.data?.voiceaPayload?.type\n }\n );\n }\n };\n }\n\n /**\n * Close the LLM web socket connection\n * @returns {void}\n */\n closeSocket() {\n this.webSocket.close();\n }\n}\n\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;;;;;;AAEA;AACA;AACA;AACA;AACA;IACqBA,a;EACnB;AACF;AACA;AACA;AACA;AACA;AACA;EACE,uBAAYC,YAAZ,EAA0BC,SAA1B,EAAqCC,OAArC,EAA8C;IAAA;IAC5C,KAAKF,YAAL,GAAoBA,YAApB;IACA,KAAKG,SAAL,GAAiBF,SAAjB;IACA,KAAKC,OAAL,GAAeA,OAAf;IACA,KAAKE,UAAL,GAAkB,EAAlB;IAEA,IAAMC,MAAM,GAAG,iEAAf;IAEA,KAAKC,SAAL,GAAiB,IAAIC,SAAJ,WAAiB,KAAKP,YAAtB,SAAqCK,MAArC,EAAjB;EACD;EAED;AACF;AACA;AACA;AACA;AACA;AACA;AACA;;;;;WACE,iBAAQG,KAAR,EAAe;MAAA;;MACb,KAAKF,SAAL,CAAeG,MAAf,GAAwB,YAAM;QAC5B,KAAI,CAACH,SAAL,CAAeI,IAAf,CAAoB,wBAAe;UACjCC,EAAE,EAAE,
|
|
1
|
+
{"version":3,"names":["Transcription","webSocketUrl","sessionId","members","sessionID","memberCSIs","params","webSocket","WebSocket","token","onopen","send","id","uuidv4","type","data","trackingId","toString","callback","onclose","event","onerror","csis","csi","member","membersCollection","find","participant","status","selfIsSpeaking","includes","speaker","transcription","onmessage","JSON","parse","voiceaPayload","getSpeaker","messageID","transcript_id","personID","timestamp","close"],"sources":["index.js"],"sourcesContent":["import {v4 as uuidv4} from 'uuid';\n\n/**\n * @description Meeting Webex assistance transcription feature.\n * @exports\n * @class Transcription\n */\nexport default class Transcription {\n /**\n * @param {string} webSocketUrl\n * @param {sessionID} sessionId\n * @param {object} members\n * @constructor\n * @memberof Transcription\n */\n constructor(webSocketUrl, sessionId, members) {\n this.webSocketUrl = webSocketUrl;\n this.sessionID = sessionId;\n this.members = members;\n this.memberCSIs = {};\n\n const params = '?outboundWireFormat=text&bufferStates=true&aliasHttpStatus=true';\n\n this.webSocket = new WebSocket(`${this.webSocketUrl}${params}`);\n }\n\n /**\n * open the Low Latency Mercury connection\n * An event parameter will be send to the callback.\n *\n * @param {string} token\n * @param {string} sessionID\n * @returns {void}\n */\n connect(token) {\n this.webSocket.onopen = () => {\n this.webSocket.send(JSON.stringify({\n id: uuidv4(),\n type: 'authorization',\n data: {token: `Bearer ${token}`},\n trackingId: `webex-js-sdk_${this.sessionID}${Date.now.toString()}`\n }));\n };\n }\n\n /**\n * Sets callback to invoke when the web socket connection is closed.\n *\n * @param {function} callback\n * @returns {void}\n */\n onCloseSocket(callback) {\n if (callback) {\n this.webSocket.onclose = (event) => {\n callback(event);\n };\n }\n }\n\n /**\n * Sets callback to invoke when a web socket connection error occurs.\n * An event parameter will be send to the callback.\n *\n * @param {function} callback\n * @returns {void}\n */\n onErrorSocket(callback) {\n if (callback) {\n this.webSocket.onerror = (event) => {\n callback(event);\n };\n }\n }\n\n /**\n * Get current speaker from the given csis payload and update the global csis map\n *\n * @private\n * @param {object} csis\n * @returns {object}\n */\n getSpeaker(csis) {\n for (const csi of csis) {\n const member = this.memberCSIs[csi];\n\n if (member) {\n return member;\n }\n }\n\n return Object.values(this.members.membersCollection.members)\n .find((member) => {\n const memberCSIs = member.participant.status.csis;\n let selfIsSpeaking = false;\n\n for (const csi of csis) {\n if (memberCSIs.includes(csi)) {\n this.memberCSIs[csi] = member;\n selfIsSpeaking = true;\n break;\n }\n }\n\n return selfIsSpeaking;\n });\n }\n\n /**\n * Sends transcription data to given callback as it arrives.\n *\n * @param {function} callback\n * @returns {void}\n */\n subscribe(callback) {\n let data, csis, speaker, transcription;\n\n this.webSocket.onmessage = (event) => {\n data = JSON.parse(event.data);\n csis = data.data?.voiceaPayload?.csis || [];\n speaker = this.getSpeaker(csis);\n transcription = data.data?.voiceaPayload?.data || '';\n\n this.webSocket.send(JSON.stringify({messageID: data.id, type: 'ack'}));\n\n if (transcription) {\n callback(\n {\n id: data.data?.voiceaPayload?.transcript_id,\n personID: speaker?.id,\n transcription,\n timestamp: data.timestamp,\n type: data?.data?.voiceaPayload?.type\n }\n );\n }\n };\n }\n\n /**\n * Close the LLM web socket connection\n * @returns {void}\n */\n closeSocket() {\n this.webSocket.close();\n }\n}\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": "2.
|
|
3
|
+
"version": "2.17.0",
|
|
4
4
|
"description": "",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"contributors": [
|
|
@@ -24,19 +24,19 @@
|
|
|
24
24
|
},
|
|
25
25
|
"dependencies": {
|
|
26
26
|
"@babel/runtime-corejs2": "^7.14.8",
|
|
27
|
-
"@webex/webex-core": "2.
|
|
28
|
-
"@webex/internal-plugin-mercury": "2.
|
|
29
|
-
"@webex/internal-plugin-conversation": "2.
|
|
27
|
+
"@webex/webex-core": "2.17.0",
|
|
28
|
+
"@webex/internal-plugin-mercury": "2.17.0",
|
|
29
|
+
"@webex/internal-plugin-conversation": "2.17.0",
|
|
30
30
|
"webrtc-adapter": "^7.7.0",
|
|
31
31
|
"lodash": "^4.17.21",
|
|
32
32
|
"uuid": "^3.3.2",
|
|
33
33
|
"global": "^4.4.0",
|
|
34
34
|
"ip-anonymize": "^0.1.0",
|
|
35
|
-
"@webex/common": "2.
|
|
35
|
+
"@webex/common": "2.17.0",
|
|
36
36
|
"bowser": "^2.11.0",
|
|
37
37
|
"sdp-transform": "^2.12.0",
|
|
38
38
|
"readable-stream": "^3.6.0",
|
|
39
|
-
"@webex/common-timers": "2.
|
|
39
|
+
"@webex/common-timers": "2.17.0",
|
|
40
40
|
"btoa": "^1.2.1",
|
|
41
41
|
"@webex/internal-media-core": "^0.0.6-beta",
|
|
42
42
|
"javascript-state-machine": "^3.1.0",
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import {isString} from 'lodash';
|
|
2
2
|
|
|
3
|
-
import {MEETINGS} from '../constants';
|
|
4
3
|
import ParameterError from '../common/errors/parameter';
|
|
5
4
|
|
|
6
5
|
/**
|
|
7
6
|
* @class Collection
|
|
8
7
|
*/
|
|
9
8
|
export default class Collection {
|
|
10
|
-
namespace =
|
|
9
|
+
namespace = 'Meetings';
|
|
10
|
+
propertyName: string;
|
|
11
11
|
|
|
12
12
|
/**
|
|
13
13
|
* @param {String} property
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import * as MEETINGCONSTANTS from '../../constants';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Extended Error object for general parameter errors
|
|
5
|
+
*/
|
|
6
|
+
export default class ParameterError extends Error {
|
|
7
|
+
sdkMessage: string;
|
|
8
|
+
error: null;
|
|
9
|
+
code: number;
|
|
10
|
+
/**
|
|
11
|
+
*
|
|
12
|
+
* @constructor
|
|
13
|
+
* @param {String} [message]
|
|
14
|
+
* @param {Object} [error]
|
|
15
|
+
*/
|
|
16
|
+
constructor(message = MEETINGCONSTANTS.ERROR_DICTIONARY.PARAMETER.MESSAGE, error = null) {
|
|
17
|
+
super(message);
|
|
18
|
+
|
|
19
|
+
if (Error.captureStackTrace) {
|
|
20
|
+
Error.captureStackTrace(this, ParameterError);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
this.name = MEETINGCONSTANTS.ERROR_DICTIONARY.PARAMETER.NAME;
|
|
24
|
+
this.sdkMessage = message || MEETINGCONSTANTS.ERROR_DICTIONARY.PARAMETER.MESSAGE;
|
|
25
|
+
this.error = error;
|
|
26
|
+
|
|
27
|
+
this.code = MEETINGCONSTANTS.ERROR_DICTIONARY.PARAMETER.CODE;
|
|
28
|
+
}
|
|
29
|
+
}
|
package/src/locus-info/index.js
CHANGED
|
@@ -801,8 +801,8 @@ export default class LocusInfo extends EventsScope {
|
|
|
801
801
|
updateMeetingInfo(info, self) {
|
|
802
802
|
if (info && (!isEqual(this.info, info))) {
|
|
803
803
|
const roles = self ? SelfUtils.getRoles(self) : this.parsedLocus.self?.roles || [];
|
|
804
|
-
|
|
805
|
-
const parsedInfo = InfoUtils.getInfos(this.parsedLocus.info, info, roles);
|
|
804
|
+
const isJoined = SelfUtils.isJoined(self || this.parsedLocus.self);
|
|
805
|
+
const parsedInfo = InfoUtils.getInfos(this.parsedLocus.info, info, roles, isJoined);
|
|
806
806
|
|
|
807
807
|
this.emitScoped(
|
|
808
808
|
{
|
|
@@ -984,7 +984,7 @@ export default class LocusInfo extends EventsScope {
|
|
|
984
984
|
{}
|
|
985
985
|
);
|
|
986
986
|
}
|
|
987
|
-
if (parsedSelves.updates.
|
|
987
|
+
if (parsedSelves.updates.isUserUnadmitted) {
|
|
988
988
|
this.emitScoped(
|
|
989
989
|
{
|
|
990
990
|
file: 'locus-info',
|
|
@@ -994,7 +994,7 @@ export default class LocusInfo extends EventsScope {
|
|
|
994
994
|
self
|
|
995
995
|
);
|
|
996
996
|
}
|
|
997
|
-
if (parsedSelves.updates.
|
|
997
|
+
if (parsedSelves.updates.isUserAdmitted) {
|
|
998
998
|
this.emitScoped(
|
|
999
999
|
{
|
|
1000
1000
|
file: 'locus-info',
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
|
|
2
|
-
import {SELF_ROLES} from '../constants';
|
|
2
|
+
import {SELF_ROLES, DISPLAY_HINTS} from '../constants';
|
|
3
3
|
|
|
4
4
|
const InfoUtils = {};
|
|
5
5
|
|
|
6
|
-
InfoUtils.parse = (info, roles) => {
|
|
6
|
+
InfoUtils.parse = (info, roles, isJoined = true) => {
|
|
7
7
|
const parsed = {
|
|
8
8
|
policy: InfoUtils.parsePolicy(info),
|
|
9
9
|
moderator: InfoUtils.parseModerator(info),
|
|
10
10
|
coHost: InfoUtils.parseCoHost(info),
|
|
11
11
|
};
|
|
12
12
|
|
|
13
|
-
let userDisplayHints = {...parsed.policy};
|
|
13
|
+
let userDisplayHints = isJoined ? {...parsed.policy} : {};
|
|
14
14
|
|
|
15
15
|
if (roles.includes(SELF_ROLES.COHOST)) {
|
|
16
16
|
userDisplayHints = {...userDisplayHints, ...parsed.coHost};
|
|
@@ -47,21 +47,29 @@ InfoUtils.parseDisplayHintSection = (info, displayHintKey) => {
|
|
|
47
47
|
|
|
48
48
|
InfoUtils.parsePolicy = (info) => InfoUtils.parseDisplayHintSection(info, 'joined');
|
|
49
49
|
|
|
50
|
-
InfoUtils.parseModerator = (info) =>
|
|
50
|
+
InfoUtils.parseModerator = (info) => {
|
|
51
|
+
const displayHints = InfoUtils.parseDisplayHintSection(info, 'moderator');
|
|
51
52
|
|
|
52
|
-
|
|
53
|
+
return {...displayHints, [DISPLAY_HINTS.LOWER_SOMEONE_ELSES_HAND]: true};
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
InfoUtils.parseCoHost = (info) => {
|
|
57
|
+
const displayHints = InfoUtils.parseDisplayHintSection(info, 'coHost');
|
|
58
|
+
|
|
59
|
+
return {...displayHints, [DISPLAY_HINTS.LOWER_SOMEONE_ELSES_HAND]: true};
|
|
60
|
+
};
|
|
53
61
|
|
|
54
62
|
InfoUtils.isLocked = (policy) => policy.LOCK_STATUS_LOCKED || false;
|
|
55
63
|
|
|
56
64
|
InfoUtils.isUnlocked = (policy) => policy.LOCK_STATUS_UNLOCKED || false;
|
|
57
65
|
|
|
58
|
-
InfoUtils.getInfos = (oldInfo, newInfo, roles) => {
|
|
66
|
+
InfoUtils.getInfos = (oldInfo, newInfo, roles, isJoined) => {
|
|
59
67
|
let previous = null;
|
|
60
68
|
|
|
61
69
|
if (oldInfo) {
|
|
62
70
|
previous = oldInfo;
|
|
63
71
|
}
|
|
64
|
-
const current = newInfo && InfoUtils.parse(newInfo, roles);
|
|
72
|
+
const current = newInfo && InfoUtils.parse(newInfo, roles, isJoined);
|
|
65
73
|
const updates = {};
|
|
66
74
|
|
|
67
75
|
if (current) {
|
|
@@ -56,7 +56,8 @@ SelfUtils.parse = (self, deviceId) => {
|
|
|
56
56
|
selfIdentity: SelfUtils.getSelfIdentity(self),
|
|
57
57
|
selfUrl: self.url,
|
|
58
58
|
removed: self.removed,
|
|
59
|
-
roles: SelfUtils.getRoles(self)
|
|
59
|
+
roles: SelfUtils.getRoles(self),
|
|
60
|
+
isUserUnadmitted: self.state === _IDLE_ && joinedWith?.intent?.type === _WAIT_,
|
|
60
61
|
};
|
|
61
62
|
}
|
|
62
63
|
|
|
@@ -76,8 +77,8 @@ SelfUtils.getSelves = (oldSelf, newSelf, deviceId) => {
|
|
|
76
77
|
const current = newSelf && SelfUtils.parse(newSelf, deviceId);
|
|
77
78
|
const updates = {};
|
|
78
79
|
|
|
79
|
-
updates.
|
|
80
|
-
updates.
|
|
80
|
+
updates.isUserUnadmitted = SelfUtils.isUserUnadmitted(current);
|
|
81
|
+
updates.isUserAdmitted = SelfUtils.isUserAdmitted(previous, current);
|
|
81
82
|
updates.isMutedByOthersChanged = SelfUtils.mutedByOthersChanged(previous, current);
|
|
82
83
|
updates.localAudioUnmuteRequestedByServer = SelfUtils.localAudioUnmuteRequestedByServer(previous, current);
|
|
83
84
|
updates.localAudioUnmuteRequiredByServer = SelfUtils.localAudioUnmuteRequiredByServer(previous, current);
|
|
@@ -97,6 +98,14 @@ SelfUtils.getSelves = (oldSelf, newSelf, deviceId) => {
|
|
|
97
98
|
};
|
|
98
99
|
};
|
|
99
100
|
|
|
101
|
+
/**
|
|
102
|
+
* Checks if user has joined the meeting
|
|
103
|
+
* @param {Object} self
|
|
104
|
+
* @returns {boolean} isJoined
|
|
105
|
+
*/
|
|
106
|
+
SelfUtils.isJoined = (self) => self?.state === _JOINED_;
|
|
107
|
+
|
|
108
|
+
|
|
100
109
|
SelfUtils.isMediaInactive = (previous, current) => {
|
|
101
110
|
if (
|
|
102
111
|
previous &&
|
|
@@ -221,25 +230,25 @@ SelfUtils.wasMediaInactiveOrReleased = (oldSelf = {}, changedSelf) => oldSelf.jo
|
|
|
221
230
|
* @param {Object} check
|
|
222
231
|
* @returns {Boolean}
|
|
223
232
|
*/
|
|
224
|
-
SelfUtils.
|
|
233
|
+
SelfUtils.isLocusUserUnadmitted = (check) => check && check.joinedWith?.intent?.type === _WAIT_ && check.state === _IDLE_;
|
|
225
234
|
|
|
226
235
|
/**
|
|
227
236
|
* @param {Object} check
|
|
228
237
|
* @returns {Boolean}
|
|
229
238
|
*/
|
|
230
|
-
SelfUtils.
|
|
239
|
+
SelfUtils.isLocusUserAdmitted = (check) => check && check.joinedWith?.intent?.type !== _WAIT_ && check.state === _JOINED_;
|
|
231
240
|
|
|
232
241
|
/**
|
|
233
242
|
* @param {Object} self
|
|
234
243
|
* @returns {Boolean}
|
|
235
244
|
* @throws {Error} when self is undefined
|
|
236
245
|
*/
|
|
237
|
-
SelfUtils.
|
|
246
|
+
SelfUtils.isUserUnadmitted = (self) => {
|
|
238
247
|
if (!self) {
|
|
239
248
|
throw new ParameterError('self must be defined to determine if self is unadmitted as guest.');
|
|
240
249
|
}
|
|
241
250
|
|
|
242
|
-
return SelfUtils.
|
|
251
|
+
return SelfUtils.isLocusUserUnadmitted(self);
|
|
243
252
|
};
|
|
244
253
|
|
|
245
254
|
SelfUtils.moderatorChanged = (oldSelf, changedSelf) => {
|
|
@@ -268,7 +277,7 @@ SelfUtils.isDeviceObserving = (oldSelf, changedSelf) => oldSelf && oldSelf.joine
|
|
|
268
277
|
* @returns {Boolean}
|
|
269
278
|
* @throws {Error} if changed self was undefined
|
|
270
279
|
*/
|
|
271
|
-
SelfUtils.
|
|
280
|
+
SelfUtils.isUserAdmitted = (oldSelf, changedSelf) => {
|
|
272
281
|
if (!oldSelf) {
|
|
273
282
|
// if there was no previous locus, it couldn't have been admitted yet
|
|
274
283
|
return false;
|
|
@@ -277,7 +286,7 @@ SelfUtils.isAdmittedGuest = (oldSelf, changedSelf) => {
|
|
|
277
286
|
throw new ParameterError('New self must be defined to determine if self transitioned to admitted as guest.');
|
|
278
287
|
}
|
|
279
288
|
|
|
280
|
-
return SelfUtils.
|
|
289
|
+
return SelfUtils.isLocusUserUnadmitted(oldSelf) && SelfUtils.isLocusUserAdmitted(changedSelf);
|
|
281
290
|
};
|
|
282
291
|
|
|
283
292
|
SelfUtils.mutedByOthersChanged = (oldSelf, changedSelf) => {
|
|
@@ -22,6 +22,7 @@ export default class InMeetingActions {
|
|
|
22
22
|
this.canStopRecording = null;
|
|
23
23
|
this.canRaiseHand = null;
|
|
24
24
|
this.canLowerAllHands = null;
|
|
25
|
+
this.canLowerSomeoneElsesHand = null;
|
|
25
26
|
}
|
|
26
27
|
|
|
27
28
|
get() {
|
|
@@ -35,6 +36,7 @@ export default class InMeetingActions {
|
|
|
35
36
|
canStopRecording: this.canStopRecording,
|
|
36
37
|
canRaiseHand: this.canRaiseHand,
|
|
37
38
|
canLowerAllHands: this.canLowerAllHands,
|
|
39
|
+
canLowerSomeoneElsesHand: this.canLowerSomeoneElsesHand,
|
|
38
40
|
};
|
|
39
41
|
}
|
|
40
42
|
|
package/src/meeting/index.js
CHANGED
|
@@ -1076,6 +1076,10 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
1076
1076
|
this.requiredCaptcha.captchaId = response.body.captchaID;
|
|
1077
1077
|
this.requiredCaptcha.verificationImageURL = response.body.verificationImageURL;
|
|
1078
1078
|
this.requiredCaptcha.verificationAudioURL = response.body.verificationAudioURL;
|
|
1079
|
+
})
|
|
1080
|
+
.catch((error) => {
|
|
1081
|
+
LoggerProxy.logger.error(`Meeting:index#refreshCaptcha --> Error Unable to refresh captcha for ${this.destination} - ${error}`);
|
|
1082
|
+
throw (error);
|
|
1079
1083
|
});
|
|
1080
1084
|
}
|
|
1081
1085
|
|
|
@@ -1908,6 +1912,7 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
1908
1912
|
canResumeRecording: MeetingUtil.canUserResume(payload.info.userDisplayHints),
|
|
1909
1913
|
canRaiseHand: MeetingUtil.canUserRaiseHand(payload.info.userDisplayHints),
|
|
1910
1914
|
canLowerAllHands: MeetingUtil.canUserLowerAllHands(payload.info.userDisplayHints),
|
|
1915
|
+
canLowerSomeoneElsesHand: MeetingUtil.canUserLowerSomeoneElsesHand(payload.info.userDisplayHints),
|
|
1911
1916
|
});
|
|
1912
1917
|
|
|
1913
1918
|
if (changed) {
|
|
@@ -4175,7 +4180,7 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
4175
4180
|
return Promise.reject(new UserNotJoinedError());
|
|
4176
4181
|
}
|
|
4177
4182
|
// If the user is unjoined or guest waiting in lobby dont allow the user to addMedia
|
|
4178
|
-
if (this.
|
|
4183
|
+
if (this.isUserUnadmitted && !this.wirelessShare) {
|
|
4179
4184
|
return Promise.reject(new UserInLobbyError());
|
|
4180
4185
|
}
|
|
4181
4186
|
|
package/src/meeting/util.js
CHANGED
|
@@ -445,6 +445,8 @@ MeetingUtil.canUserRaiseHand = (displayHints) => displayHints.includes(DISPLAY_H
|
|
|
445
445
|
|
|
446
446
|
MeetingUtil.canUserLowerAllHands = (displayHints) => displayHints.includes(DISPLAY_HINTS.LOWER_ALL_HANDS);
|
|
447
447
|
|
|
448
|
+
MeetingUtil.canUserLowerSomeoneElsesHand = (displayHints) => displayHints.includes(DISPLAY_HINTS.LOWER_SOMEONE_ELSES_HAND);
|
|
449
|
+
|
|
448
450
|
MeetingUtil.lockMeeting = (actions, request, locusUrl) => {
|
|
449
451
|
if (actions && actions.canLock) {
|
|
450
452
|
return request.lockMeeting({locusUrl, lock: true});
|
|
@@ -652,6 +652,7 @@ describe('plugin-meetings', () => {
|
|
|
652
652
|
let meetingInfo;
|
|
653
653
|
let getInfosSpy;
|
|
654
654
|
let getRolesSpy;
|
|
655
|
+
let isJoinedSpy;
|
|
655
656
|
|
|
656
657
|
beforeEach('setup meeting info', () => {
|
|
657
658
|
meetingInfo = {
|
|
@@ -662,11 +663,13 @@ describe('plugin-meetings', () => {
|
|
|
662
663
|
};
|
|
663
664
|
getInfosSpy = sinon.spy(InfoUtils, 'getInfos');
|
|
664
665
|
getRolesSpy = sinon.spy(SelfUtils, 'getRoles');
|
|
666
|
+
isJoinedSpy = sinon.spy(SelfUtils, 'isJoined');
|
|
665
667
|
});
|
|
666
668
|
|
|
667
669
|
afterEach(() => {
|
|
668
670
|
getRolesSpy.restore();
|
|
669
671
|
getInfosSpy.restore();
|
|
672
|
+
isJoinedSpy.restore();
|
|
670
673
|
});
|
|
671
674
|
|
|
672
675
|
it('should trigger MEETING_LOCKED/UNLOCKED when meeting gets locked/unlocked', () => {
|
|
@@ -770,7 +773,7 @@ describe('plugin-meetings', () => {
|
|
|
770
773
|
const parsedLocusInfo = cloneDeep(locusInfo.parsedLocus.info);
|
|
771
774
|
|
|
772
775
|
locusInfo.updateMeetingInfo(initialInfo);
|
|
773
|
-
|
|
776
|
+
assert.calledWith(isJoinedSpy, locusInfo.parsedLocus.self);
|
|
774
777
|
assert.neverCalledWith(getRolesSpy, self);
|
|
775
778
|
assert.calledWith(
|
|
776
779
|
getInfosSpy,
|
|
@@ -33,25 +33,48 @@ describe('plugin-meetings', () => {
|
|
|
33
33
|
it('only gives includes display hints when user has the correct role', () => {
|
|
34
34
|
assert.deepEqual(InfoUtils.parse(info, ['MODERATOR']), {
|
|
35
35
|
policy: {HINT_3: true},
|
|
36
|
-
moderator: {HINT_1: true, HINT_2: true},
|
|
37
|
-
coHost: {HINT_4: true},
|
|
38
|
-
userDisplayHints: ['HINT_3', 'HINT_1', 'HINT_2']
|
|
36
|
+
moderator: {HINT_1: true, HINT_2: true, LOWER_SOMEONE_ELSES_HAND: true},
|
|
37
|
+
coHost: {HINT_4: true, LOWER_SOMEONE_ELSES_HAND: true},
|
|
38
|
+
userDisplayHints: ['HINT_3', 'HINT_1', 'HINT_2', 'LOWER_SOMEONE_ELSES_HAND']
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
assert.deepEqual(InfoUtils.parse(info, ['MODERATOR', 'COHOST']), {
|
|
42
|
+
policy: {HINT_3: true},
|
|
43
|
+
moderator: {HINT_1: true, HINT_2: true, LOWER_SOMEONE_ELSES_HAND: true},
|
|
44
|
+
coHost: {HINT_4: true, LOWER_SOMEONE_ELSES_HAND: true},
|
|
45
|
+
userDisplayHints: ['HINT_3', 'HINT_4', 'LOWER_SOMEONE_ELSES_HAND', 'HINT_1', 'HINT_2']
|
|
39
46
|
});
|
|
40
47
|
|
|
41
48
|
assert.deepEqual(InfoUtils.parse(info, ['COHOST']), {
|
|
42
49
|
policy: {HINT_3: true},
|
|
43
|
-
moderator: {HINT_1: true, HINT_2: true},
|
|
44
|
-
coHost: {HINT_4: true},
|
|
45
|
-
userDisplayHints: ['HINT_3', 'HINT_4']
|
|
50
|
+
moderator: {HINT_1: true, HINT_2: true, LOWER_SOMEONE_ELSES_HAND: true},
|
|
51
|
+
coHost: {HINT_4: true, LOWER_SOMEONE_ELSES_HAND: true},
|
|
52
|
+
userDisplayHints: ['HINT_3', 'HINT_4', 'LOWER_SOMEONE_ELSES_HAND']
|
|
46
53
|
});
|
|
47
54
|
|
|
48
55
|
assert.deepEqual(InfoUtils.parse(info, []), {
|
|
49
56
|
policy: {HINT_3: true},
|
|
50
|
-
moderator: {HINT_1: true, HINT_2: true},
|
|
51
|
-
coHost: {HINT_4: true},
|
|
57
|
+
moderator: {HINT_1: true, HINT_2: true, LOWER_SOMEONE_ELSES_HAND: true},
|
|
58
|
+
coHost: {HINT_4: true, LOWER_SOMEONE_ELSES_HAND: true},
|
|
52
59
|
userDisplayHints: ['HINT_3']
|
|
53
60
|
});
|
|
54
61
|
});
|
|
62
|
+
|
|
63
|
+
it('only gives includes display hints when user has joined the meeting role', () => {
|
|
64
|
+
assert.deepEqual(InfoUtils.parse(info, ['MODERATOR'], false), {
|
|
65
|
+
policy: {HINT_3: true},
|
|
66
|
+
moderator: {HINT_1: true, HINT_2: true, LOWER_SOMEONE_ELSES_HAND: true},
|
|
67
|
+
coHost: {HINT_4: true, LOWER_SOMEONE_ELSES_HAND: true},
|
|
68
|
+
userDisplayHints: ['HINT_1', 'HINT_2', 'LOWER_SOMEONE_ELSES_HAND']
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
assert.deepEqual(InfoUtils.parse(info, ['MODERATOR'], true), {
|
|
72
|
+
policy: {HINT_3: true},
|
|
73
|
+
moderator: {HINT_1: true, HINT_2: true, LOWER_SOMEONE_ELSES_HAND: true},
|
|
74
|
+
coHost: {HINT_4: true, LOWER_SOMEONE_ELSES_HAND: true},
|
|
75
|
+
userDisplayHints: ['HINT_3', 'HINT_1', 'HINT_2', 'LOWER_SOMEONE_ELSES_HAND']
|
|
76
|
+
});
|
|
77
|
+
});
|
|
55
78
|
});
|
|
56
79
|
|
|
57
80
|
describe('parseDisplayHintsSection', () => {
|
|
@@ -99,7 +122,7 @@ describe('plugin-meetings', () => {
|
|
|
99
122
|
|
|
100
123
|
assert.calledWith(parseDisplayHintSectionSpy, info, 'moderator');
|
|
101
124
|
|
|
102
|
-
assert.deepEqual(result, parseDisplayHintSectionSpy.firstCall.returnValue);
|
|
125
|
+
assert.deepEqual(result, {...parseDisplayHintSectionSpy.firstCall.returnValue, LOWER_SOMEONE_ELSES_HAND: true});
|
|
103
126
|
});
|
|
104
127
|
|
|
105
128
|
it('parsePolicy calls parseDisplayHintSection correctly and returns the result', () => {
|
|
@@ -115,7 +138,7 @@ describe('plugin-meetings', () => {
|
|
|
115
138
|
|
|
116
139
|
assert.calledWith(parseDisplayHintSectionSpy, info, 'coHost');
|
|
117
140
|
|
|
118
|
-
assert.deepEqual(result, parseDisplayHintSectionSpy.firstCall.returnValue);
|
|
141
|
+
assert.deepEqual(result, {...parseDisplayHintSectionSpy.firstCall.returnValue, LOWER_SOMEONE_ELSES_HAND: true});
|
|
119
142
|
});
|
|
120
143
|
});
|
|
121
144
|
});
|
|
@@ -40,4 +40,24 @@ describe('plugin-meetings', () => {
|
|
|
40
40
|
});
|
|
41
41
|
});
|
|
42
42
|
});
|
|
43
|
+
|
|
44
|
+
describe('isJoined', () => {
|
|
45
|
+
it(' returns true if state is joined', () => {
|
|
46
|
+
assert.deepEqual(SelfUtils.isJoined(self), true);
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
it(' returns true if state is not joined', () => {
|
|
50
|
+
const customSelf = {...self, state: 'NOT_JOINED'};
|
|
51
|
+
|
|
52
|
+
assert.deepEqual(SelfUtils.isJoined(customSelf), false);
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
it(' returns true if state is empty', () => {
|
|
56
|
+
const customSelf = {...self};
|
|
57
|
+
|
|
58
|
+
delete customSelf.state;
|
|
59
|
+
|
|
60
|
+
assert.deepEqual(SelfUtils.isJoined(customSelf), false);
|
|
61
|
+
});
|
|
62
|
+
});
|
|
43
63
|
});
|
|
@@ -16,6 +16,7 @@ describe('plugin-meetings', () => {
|
|
|
16
16
|
canStopRecording: null,
|
|
17
17
|
canRaiseHand: null,
|
|
18
18
|
canLowerAllHands: null,
|
|
19
|
+
canLowerSomeoneElsesHand: null,
|
|
19
20
|
...expected
|
|
20
21
|
};
|
|
21
22
|
|
|
@@ -38,6 +39,7 @@ describe('plugin-meetings', () => {
|
|
|
38
39
|
'canStopRecording',
|
|
39
40
|
'canRaiseHand',
|
|
40
41
|
'canLowerAllHands',
|
|
42
|
+
'canLowerSomeoneElsesHand',
|
|
41
43
|
].forEach((key) => {
|
|
42
44
|
it(`get and set for ${key} work as expected`, () => {
|
|
43
45
|
const inMeetingActions = new InMeetingActions();
|