@webex/plugin-meetings 2.5.0 → 2.8.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 +9 -5
- package/dist/constants.js +3 -1
- package/dist/constants.js.map +1 -1
- package/dist/meeting/in-meeting-actions.js +5 -1
- package/dist/meeting/in-meeting-actions.js.map +1 -1
- package/dist/meeting/index.js +31 -13
- package/dist/meeting/index.js.map +1 -1
- package/dist/meeting/util.js +8 -0
- package/dist/meeting/util.js.map +1 -1
- package/dist/metrics/constants.js +5 -1
- package/dist/metrics/constants.js.map +1 -1
- package/package.json +6 -6
- package/src/constants.js +3 -1
- package/src/meeting/in-meeting-actions.js +5 -2
- package/src/meeting/index.js +28 -1
- package/src/meeting/util.js +4 -0
- package/src/metrics/constants.js +5 -1
- package/test/unit/spec/meeting/in-meeting-actions.js +5 -1
- package/test/unit/spec/meeting/index.js +39 -3
- package/test/unit/spec/meeting/utils.js +14 -1
package/dist/meeting/util.js
CHANGED
|
@@ -537,6 +537,14 @@ MeetingUtil.stopRecording = function (request, locusUrl, locusInfo) {
|
|
|
537
537
|
return _promise.default.reject(new _permission.default('Stop recording not allowed, due to moderator property.'));
|
|
538
538
|
};
|
|
539
539
|
|
|
540
|
+
MeetingUtil.canUserRaiseHand = function (displayHints) {
|
|
541
|
+
return displayHints.includes(_constants.DISPLAY_HINTS.RAISE_HAND);
|
|
542
|
+
};
|
|
543
|
+
|
|
544
|
+
MeetingUtil.canUserLowerAllHands = function (displayHints) {
|
|
545
|
+
return displayHints.includes(_constants.DISPLAY_HINTS.LOWER_ALL_HANDS);
|
|
546
|
+
};
|
|
547
|
+
|
|
540
548
|
MeetingUtil.lockMeeting = function (actions, request, locusUrl) {
|
|
541
549
|
if (actions && actions.canLock) {
|
|
542
550
|
return request.lockMeeting({
|
package/dist/meeting/util.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["MeetingUtil","parseLocusJoin","response","parsed","locus","body","mediaConnections","locusUrl","url","locusId","split","pop","selfId","self","id","forEach","mediaConnection","mediaId","remoteUpdateAudioVideo","audioMuted","videoMuted","meeting","reject","ParameterError","localMedias","Media","generateLocalMedias","Metrics","postEvent","event","eventType","MEDIA_REQUEST","meetingRequest","remoteAudioVideoToggle","deviceUrl","correlationId","then","MEDIA_RESPONSE","hasOwner","info","owner","isOwnerSelf","isPinOrGuest","err","errorCode","INTENT_TO_JOIN","includes","joinMeeting","options","LOCUS_JOIN_REQUEST","inviteeAddress","meetingJoinUrl","sipUri","meetingNumber","roapMessage","permissionToken","resourceId","moderator","pin","moveToResource","preferTranscoding","asResourceOccupant","res","LOCUS_JOIN_RESPONSE","data","trigger","LOCI_UPDATE","trackingId","headers","trackingid","cleanUp","statsAnalyzer","stopAnalyzer","closeLocalStream","closeLocalShare","closeRemoteTracks","closePeerConnections","unsetLocalVideoTrack","unsetLocalShareTrack","unsetRemoteTracks","unsetPeerConnections","cleanMQAInterval","reconnectionManager","roap","stop","roapSeq","disconnectPhoneAudio","phoneUrl","meetingState","FULL_STATE","INACTIVE","MeetingNotActiveError","locusInfo","onFullLocus","catch","LoggerProxy","logger","error","leaveMeeting","isUserInLeftState","UserNotJoinedError","defaultOptions","leaveOptions","resolve","moveMeeting","declineMeeting","reason","parsedLocus","state","_LEFT_","isUserInIdleState","_IDLE_","isUserInJoinedState","_JOINED_","isMediaEstablished","currentMediaStatus","audio","video","share","joinMeetingOptions","requiredCaptcha","CaptchaError","passwordStatus","PASSWORD_STATUS","REQUIRED","PasswordError","PIN_COLLECTED","setLocus","PIN_PROMPT","IntentToJoinError","JoinMeetingError","updateTransceiver","meetingOptions","type","sendTrack","receiveTrack","track","transceiver","peerConnection","previousMediaDirection","undefined","meetingId","remoteQualityLevel","mediaProperties","enableRtx","config","enableExtmap","sendRoapMediaRequest","sdp","e","sender","replaceTrack","validateOptions","sendVideo","sendAudio","sendShare","localStream","localShare","getTrack","videoTrack","audioTrack","stream","audioTracks","videoTracks","getAudioTracks","getVideoTracks","length","getModeratorFromLocusInfo","getPolicyFromLocusInfo","policy","getUserDisplayHintsFromLocusInfo","userDisplayHints","canUserLock","displayHints","DISPLAY_HINTS","LOCK_CONTROL_LOCK","LOCK_STATUS_UNLOCKED","canUserUnlock","LOCK_CONTROL_UNLOCK","LOCK_STATUS_LOCKED","canUserRecord","RECORDING_CONTROL_START","canUserPause","RECORDING_CONTROL_PAUSE","canUserResume","RECORDING_CONTROL_RESUME","canUserStop","RECORDING_CONTROL_STOP","startRecording","request","recordMeeting","recording","paused","PermissionError","pauseRecording","resumeRecording","stopRecording","lockMeeting","actions","canLock","lock","unlockMeeting","canUnlock","startInternalStats","internalStats","useConfig","senders","correlate","history","onEvent","kind","stat","Trigger","file","function","EVENT_TRIGGERS","MEETING_MEDIA_LOCAL_STARTED","mediaType","AUDIO","SENDING_MEDIA_START","SENDING_MEDIA_STOP","onData","VIDEO","SHARE","SENDING_SHARE_START","SENDING_SHARE_STOP","receivers","MEETING_MEDIA_REMOTE_STARTED","RECEIVING_MEDIA_START","RECEIVING_MEDIA_STOP","StatsUtil","generateOptions","STATS","CONFIG","WebRTCStats","attrs","handleAudioLogging","LOG_HEADER","settings","getSettings","deviceId","log","handleVideoLogging","handleDeviceLogging","devices","device","endMeetingForAll","endOptions"],"sources":["util.js"],"sourcesContent":["import {isEmpty} from 'lodash';\n\nimport {MeetingNotActiveError, UserNotJoinedError} from '../common/errors/webex-errors';\nimport StatsUtil from '../stats/util';\nimport Metrics from '../metrics';\nimport {eventType, trigger, mediaType} from '../metrics/config';\nimport Media from '../media';\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport WebRTCStats from '../stats/index';\nimport {INTENT_TO_JOIN,\n _LEFT_,\n _IDLE_,\n _JOINED_,\n STATS,\n EVENT_TRIGGERS,\n PASSWORD_STATUS,\n DISPLAY_HINTS,\n FULL_STATE} from '../constants';\nimport Trigger from '../common/events/trigger-proxy';\nimport IntentToJoinError from '../common/errors/intent-to-join';\nimport JoinMeetingError from '../common/errors/join-meeting';\nimport ParameterError from '../common/errors/parameter';\nimport PermissionError from '../common/errors/permission';\nimport PasswordError from '../common/errors/password-error';\nimport CaptchaError from '../common/errors/captcha-error';\n\nconst MeetingUtil = {};\n\nMeetingUtil.parseLocusJoin = (response) => {\n const parsed = {};\n\n // First todo: add check for existance\n parsed.locus = response.body.locus;\n parsed.mediaConnections = response.body.mediaConnections;\n parsed.locusUrl = parsed.locus.url;\n parsed.locusId = parsed.locus.url.split('/').pop();\n parsed.selfId = parsed.locus.self.id;\n\n // we need mediaId before making roap calls\n parsed.mediaConnections.forEach((mediaConnection) => {\n if (mediaConnection.mediaId) {\n parsed.mediaId = mediaConnection.mediaId;\n }\n });\n\n return parsed;\n};\n\nMeetingUtil.remoteUpdateAudioVideo = (audioMuted, videoMuted, meeting) => {\n if (!meeting) {\n return Promise.reject(new ParameterError('You need a meeting object.'));\n }\n const localMedias = Media.generateLocalMedias(meeting.mediaId, audioMuted, videoMuted);\n\n if (isEmpty(localMedias)) {\n return Promise.reject(new ParameterError('You need a media id on the meeting to change remote audio.'));\n }\n\n Metrics.postEvent({event: eventType.MEDIA_REQUEST, meeting});\n\n return meeting.meetingRequest.remoteAudioVideoToggle({\n locusUrl: meeting.locusUrl,\n selfId: meeting.selfId,\n localMedias,\n deviceUrl: meeting.deviceUrl,\n correlationId: meeting.correlationId\n }).then((response) => {\n Metrics.postEvent({event: eventType.MEDIA_RESPONSE, meeting});\n\n return response.body.locus;\n });\n};\n\nMeetingUtil.hasOwner = (info) => info && info.owner;\n\nMeetingUtil.isOwnerSelf = (owner, selfId) => owner === selfId;\n\nMeetingUtil.isPinOrGuest = (err) => err?.body?.errorCode && INTENT_TO_JOIN.includes(err.body.errorCode);\n\nMeetingUtil.joinMeeting = (meeting, options) => {\n if (!meeting) {\n return Promise.reject(new ParameterError('You need a meeting object.'));\n }\n\n Metrics.postEvent({event: eventType.LOCUS_JOIN_REQUEST, meeting});\n\n // eslint-disable-next-line no-warning-comments\n // TODO: check if the meeting is in JOINING state\n // if Joining state termintate the request as user might click multiple times\n return meeting.meetingRequest\n .joinMeeting({\n inviteeAddress: meeting.meetingJoinUrl || meeting.sipUri,\n meetingNumber: meeting.meetingNumber,\n deviceUrl: meeting.deviceUrl,\n locusUrl: meeting.locusUrl,\n correlationId: meeting.correlationId,\n roapMessage: options.roapMessage,\n permissionToken: meeting.permissionToken,\n resourceId: options.resourceId || null,\n moderator: options.moderator,\n pin: options.pin,\n moveToResource: options.moveToResource,\n preferTranscoding: options.preferTranscoding,\n asResourceOccupant: options.asResourceOccupant\n })\n .then((res) => {\n Metrics.postEvent({\n event: eventType.LOCUS_JOIN_RESPONSE,\n meeting,\n data: {\n trigger: trigger.LOCI_UPDATE,\n locus: res.body.locus,\n mediaConnections: res.body.mediaConnections,\n trackingId: res.headers.trackingid\n }\n });\n\n return MeetingUtil.parseLocusJoin(res);\n });\n};\n\nMeetingUtil.cleanUp = (meeting) => {\n // make sure we send last metrics before we close the peerconnection\n if (meeting.statsAnalyzer) meeting.statsAnalyzer.stopAnalyzer();\n\n return meeting.closeLocalStream()\n .then(() => meeting.closeLocalShare())\n .then(() => meeting.closeRemoteTracks())\n .then(() => meeting.closePeerConnections())\n .then(() => {\n meeting.unsetLocalVideoTrack();\n meeting.unsetLocalShareTrack();\n meeting.unsetRemoteTracks();\n meeting.unsetPeerConnections();\n meeting.cleanMQAInterval();\n meeting.reconnectionManager.cleanUp();\n })\n .then(() => meeting.roap.stop(meeting.correlationId, meeting.roapSeq));\n};\n\nMeetingUtil.disconnectPhoneAudio = (meeting, phoneUrl) => {\n if (meeting.meetingState === FULL_STATE.INACTIVE) {\n return Promise.reject(new MeetingNotActiveError());\n }\n\n const options = {\n locusUrl: meeting.locusUrl,\n selfId: meeting.selfId,\n correlationId: meeting.correlationId,\n phoneUrl\n };\n\n return meeting.meetingRequest\n .disconnectPhoneAudio(options)\n .then((response) => {\n if (response?.body?.locus) {\n meeting.locusInfo.onFullLocus(response.body.locus);\n }\n })\n .catch((err) => {\n LoggerProxy.logger.error(\n `Meeting:util#disconnectPhoneAudio --> An error occured while disconnecting phone audio in meeting ${\n meeting.id\n }, error: ${err}`\n );\n\n return Promise.reject(err);\n });\n};\n\n// by default will leave on meeting's resourceId\n// if you explicity want it not to leave on resource id, pass\n// {resourceId: null}\n// TODO: chris, you can modify this however you want\nMeetingUtil.leaveMeeting = (meeting, options = {}) => {\n if (meeting.meetingState === FULL_STATE.INACTIVE) {\n // TODO: clean up if the meeting is already inactive\n return Promise.reject(new MeetingNotActiveError());\n }\n\n if (MeetingUtil.isUserInLeftState(meeting.locusInfo)) {\n return Promise.reject(new UserNotJoinedError());\n }\n\n const defaultOptions = {\n locusUrl: meeting.locusUrl,\n selfId: meeting.selfId,\n correlationId: meeting.correlationId,\n resourceId: meeting.resourceId,\n deviceUrl: meeting.deviceUrl\n };\n\n const leaveOptions = {...defaultOptions, ...options};\n\n return meeting.meetingRequest\n .leaveMeeting(leaveOptions)\n .then((response) => {\n if (response && response.body && response.body.locus) { // && !options.moveMeeting) {\n meeting.locusInfo.onFullLocus(response.body.locus);\n }\n\n return Promise.resolve();\n })\n .then(() => {\n if (options.moveMeeting) {\n return Promise.resolve();\n }\n\n return MeetingUtil.cleanUp(meeting);\n })\n .catch((err) => {\n // TODO: If the meeting state comes as LEFT or INACTIVE as response then\n // 1) on leave clean up the meeting or simply do a sync on the meeting\n // 2) If the error says meeting is inactive then destroy the meeting object\n LoggerProxy.logger.error(\n `Meeting:util#leaveMeeting --> An error occured while trying to leave meeting with an id of ${\n meeting.id\n }, error: ${err}`\n );\n\n return Promise.reject(err);\n });\n};\nMeetingUtil.declineMeeting = (meeting, reason) =>\n meeting.meetingRequest.declineMeeting({\n locusUrl: meeting.locusUrl,\n deviceUrl: meeting.deviceUrl,\n reason\n });\n\nMeetingUtil.isUserInLeftState = (locusInfo) =>\n locusInfo.parsedLocus?.self?.state === _LEFT_;\n\nMeetingUtil.isUserInIdleState = (locusInfo) =>\n locusInfo.parsedLocus?.self?.state === _IDLE_;\n\nMeetingUtil.isUserInJoinedState = (locusInfo) =>\n locusInfo.parsedLocus?.self?.state === _JOINED_;\n\nMeetingUtil.isMediaEstablished = (currentMediaStatus) =>\n currentMediaStatus && (currentMediaStatus.audio || currentMediaStatus.video || currentMediaStatus.share);\n\n\nMeetingUtil.joinMeetingOptions = (meeting, options = {}) => {\n meeting.resourceId = meeting.resourceId || options.resourceId;\n\n if (meeting.requiredCaptcha) {\n return Promise.reject(new CaptchaError());\n }\n if (meeting.passwordStatus === PASSWORD_STATUS.REQUIRED) {\n return Promise.reject(new PasswordError());\n }\n\n if (options.pin) {\n Metrics.postEvent({\n event: eventType.PIN_COLLECTED,\n meeting\n });\n }\n\n // normal join meeting, scenario A, D\n return MeetingUtil.joinMeeting(meeting, options)\n .then((response) => {\n meeting.setLocus(response);\n\n return Promise.resolve(response);\n })\n .catch((err) => {\n // joining a claimed PMR that is not my own, scenario B\n if (MeetingUtil.isPinOrGuest(err)) {\n Metrics.postEvent({\n event: eventType.PIN_PROMPT,\n meeting\n });\n\n // request host pin or non host for unclaimed PMR, start of Scenario C\n // see https://sqbu-github.cisco.com/WebExSquared/locus/wiki/Locus-Lobby-and--IVR-Feature\n return Promise.reject(new IntentToJoinError('Error Joining Meeting', err));\n }\n LoggerProxy.logger.error('Meeting:util#joinMeetingOptions --> Error joining the call, ', err);\n\n return Promise.reject(new JoinMeetingError(options, 'Error Joining Meeting', err));\n });\n};\n\nMeetingUtil.updateTransceiver = (options, meetingOptions) => {\n const {\n type,\n sendTrack,\n receiveTrack,\n track,\n transceiver,\n peerConnection,\n previousMediaDirection\n } = options;\n\n if ((sendTrack !== undefined && sendTrack !== previousMediaDirection.sendTrack) ||\n (receiveTrack !== undefined && receiveTrack !== previousMediaDirection.receiveTrack)) {\n return Media.updateTransceiver({\n meetingId: meetingOptions.meeting.id,\n remoteQualityLevel: meetingOptions.mediaProperties.remoteQualityLevel,\n enableRtx: meetingOptions.meeting.config.enableRtx,\n enableExtmap: meetingOptions.meeting.config.enableExtmap\n }, peerConnection, transceiver,\n {\n track,\n type,\n receiveTrack,\n sendTrack\n })\n .then(() => meetingOptions.meeting.roap\n .sendRoapMediaRequest({\n sdp: meetingOptions.mediaProperties.peerConnection.sdp,\n roapSeq: meetingOptions.meeting.roapSeq,\n meeting: meetingOptions.meeting // or can pass meeting ID\n }))\n .catch((e) => {\n LoggerProxy.logger.error(`Meeting:util#updateTransceiver --> Error updating the ${type} streams with error: ${e}`);\n });\n } if (track) {\n transceiver.sender.replaceTrack(track);\n\n return Promise.resolve();\n }\n\n return Promise.reject(new ParameterError('update Failed: please pass valid parameter'));\n};\n\nMeetingUtil.validateOptions = (options) => {\n const {\n sendVideo, sendAudio, sendShare, localStream, localShare\n } = options;\n\n if (sendVideo && !MeetingUtil.getTrack(localStream).videoTrack) {\n return Promise.reject(new ParameterError('please pass valid video streams'));\n }\n\n if (sendAudio && !MeetingUtil.getTrack(localStream).audioTrack) {\n return Promise.reject(new ParameterError('please pass valid audio streams'));\n }\n\n if (sendShare && !MeetingUtil.getTrack(localShare).videoTrack) {\n return Promise.reject(new ParameterError('please pass valid share streams'));\n }\n\n return Promise.resolve();\n};\n\nMeetingUtil.getTrack = (stream) => {\n let audioTrack = null;\n let videoTrack = null;\n let audioTracks = null;\n let videoTracks = null;\n\n if (!stream) {\n return {audioTrack: null, videoTrack: null};\n }\n if (stream.getAudioTracks) {\n audioTracks = stream.getAudioTracks();\n }\n if (stream.getVideoTracks) {\n videoTracks = stream.getVideoTracks();\n }\n\n if (audioTracks && audioTracks.length > 0) {\n [audioTrack] = audioTracks;\n }\n\n if (videoTracks && videoTracks.length > 0) {\n [videoTrack] = videoTracks;\n }\n\n return {audioTrack, videoTrack};\n};\n\nMeetingUtil.getModeratorFromLocusInfo = (locusInfo) =>\n locusInfo &&\n locusInfo.parsedLocus &&\n locusInfo.parsedLocus.info &&\n locusInfo.parsedLocus.info &&\n locusInfo.parsedLocus.info.moderator;\n\nMeetingUtil.getPolicyFromLocusInfo = (locusInfo) =>\n locusInfo &&\n locusInfo.parsedLocus &&\n locusInfo.parsedLocus.info &&\n locusInfo.parsedLocus.info &&\n locusInfo.parsedLocus.info.policy;\n\nMeetingUtil.getUserDisplayHintsFromLocusInfo = (locusInfo) => locusInfo?.parsedLocus?.info?.userDisplayHints || [];\n\nMeetingUtil.canUserLock = (displayHints) => displayHints.includes(DISPLAY_HINTS.LOCK_CONTROL_LOCK) && displayHints.includes(DISPLAY_HINTS.LOCK_STATUS_UNLOCKED);\n\nMeetingUtil.canUserUnlock = (displayHints) => displayHints.includes(DISPLAY_HINTS.LOCK_CONTROL_UNLOCK) && displayHints.includes(DISPLAY_HINTS.LOCK_STATUS_LOCKED);\n\nMeetingUtil.canUserRecord = (displayHints) => displayHints.includes(DISPLAY_HINTS.RECORDING_CONTROL_START);\n\nMeetingUtil.canUserPause = (displayHints) => displayHints.includes(DISPLAY_HINTS.RECORDING_CONTROL_PAUSE);\n\nMeetingUtil.canUserResume = (displayHints) => displayHints.includes(DISPLAY_HINTS.RECORDING_CONTROL_RESUME);\n\nMeetingUtil.canUserStop = (displayHints) => displayHints.includes(DISPLAY_HINTS.RECORDING_CONTROL_STOP);\n\nMeetingUtil.startRecording = (request, locusUrl, locusInfo) => {\n const displayHints = MeetingUtil.getUserDisplayHintsFromLocusInfo(locusInfo);\n\n if (MeetingUtil.canUserRecord(displayHints)) {\n return request.recordMeeting({locusUrl, recording: true, paused: false});\n }\n\n return Promise.reject(new PermissionError('Start recording not allowed, due to moderator property.'));\n};\n\nMeetingUtil.pauseRecording = (request, locusUrl, locusInfo) => {\n const displayHints = MeetingUtil.getUserDisplayHintsFromLocusInfo(locusInfo);\n\n if (MeetingUtil.canUserPause(displayHints)) {\n return request.recordMeeting({locusUrl, recording: true, paused: true});\n }\n\n return Promise.reject(new PermissionError('Pause recording not allowed, due to moderator property.'));\n};\n\nMeetingUtil.resumeRecording = (request, locusUrl, locusInfo) => {\n const displayHints = MeetingUtil.getUserDisplayHintsFromLocusInfo(locusInfo);\n\n if (MeetingUtil.canUserResume(displayHints)) {\n return request.recordMeeting({locusUrl, recording: true, paused: false});\n }\n\n return Promise.reject(new PermissionError('Resume recording not allowed, due to moderator property.'));\n};\n\nMeetingUtil.stopRecording = (request, locusUrl, locusInfo) => {\n const displayHints = MeetingUtil.getUserDisplayHintsFromLocusInfo(locusInfo);\n\n if (MeetingUtil.canUserStop(displayHints)) {\n return request.recordMeeting({locusUrl, recording: false, paused: false});\n }\n\n return Promise.reject(new PermissionError('Stop recording not allowed, due to moderator property.'));\n};\n\nMeetingUtil.lockMeeting = (actions, request, locusUrl) => {\n if (actions && actions.canLock) {\n return request.lockMeeting({locusUrl, lock: true});\n }\n\n return Promise.reject(new PermissionError('Lock not allowed, due to joined property.'));\n};\n\nMeetingUtil.unlockMeeting = (actions, request, locusUrl) => {\n if (actions && actions.canUnlock) {\n return request.lockMeeting({locusUrl, lock: false});\n }\n\n return Promise.reject(new PermissionError('Unlock not allowed, due to joined property.'));\n};\n\nMeetingUtil.startInternalStats = (meeting) => {\n if (!meeting.internalStats) {\n const options = {\n useConfig: true,\n senders: [\n {\n id: 'mainAudio',\n correlate: 'audio',\n history: true,\n onEvent: (event) => {\n // TODO: we don't need checks like this since it comes from the transceiver\n // refactor event linkage to use callbacks instead of events\n if (event.kind === 'audio' && event.stat === 'bytesSent') {\n Trigger.trigger(\n meeting,\n {\n file: 'meeting/util',\n function: 'startInternalStats'\n },\n EVENT_TRIGGERS.MEETING_MEDIA_LOCAL_STARTED,\n {\n type: mediaType.AUDIO\n }\n );\n Metrics.postEvent({\n event: eventType.SENDING_MEDIA_START,\n meeting,\n data: {\n mediaType: mediaType.AUDIO\n }\n });\n }\n else if (event.stop && event.stat === 'bytesSent') {\n Metrics.postEvent({\n event: eventType.SENDING_MEDIA_STOP,\n meeting,\n data: {\n mediaType: mediaType.AUDIO\n }\n });\n }\n },\n onData: () => {}\n },\n {\n id: 'mainVideo',\n correlate: 'video',\n history: true,\n onEvent: (event) => {\n if (event.kind === 'video' && event.stat === 'bytesSent') {\n Trigger.trigger(\n meeting,\n {\n file: 'meeting/util',\n function: 'startInternalStats'\n },\n EVENT_TRIGGERS.MEETING_MEDIA_LOCAL_STARTED,\n {\n type: mediaType.VIDEO\n }\n );\n Metrics.postEvent({\n event: eventType.SENDING_MEDIA_START,\n meeting,\n data: {\n mediaType: mediaType.VIDEO\n }\n });\n }\n else if (event.stop && event.stat === 'bytesSent') {\n Metrics.postEvent({\n event: eventType.SENDING_MEDIA_STOP,\n meeting,\n data: {\n mediaType: mediaType.VIDEO\n }\n });\n }\n },\n onData: () => {}\n },\n {\n id: 'mainShare',\n correlate: 'video',\n onEvent: (event) => {\n if (event.kind === 'share' && event.stat === 'bytesSent') {\n Trigger.trigger(\n meeting,\n {\n file: 'meeting/util',\n function: 'startInternalStats'\n },\n EVENT_TRIGGERS.MEETING_MEDIA_LOCAL_STARTED,\n {\n type: mediaType.SHARE\n }\n );\n Metrics.postEvent({\n event: eventType.SENDING_SHARE_START,\n meeting,\n data: {\n mediaType: mediaType.SHARE\n }\n });\n }\n else if (event.stop && event.stat === 'bytesSent') {\n Metrics.postEvent({\n event: eventType.SENDING_SHARE_STOP,\n meeting,\n data: {\n mediaType: mediaType.SHARE\n }\n });\n }\n },\n onData: () => {}\n }\n ],\n receivers: [\n {\n id: 'mainAudio',\n correlate: 'audio',\n history: true,\n onEvent: (event) => {\n if (event.kind === 'audio' && event.stat === 'bytesReceived') {\n Trigger.trigger(\n meeting,\n {\n file: 'meeting/util',\n function: 'startInternalStats'\n },\n EVENT_TRIGGERS.MEETING_MEDIA_REMOTE_STARTED,\n {\n type: mediaType.AUDIO\n }\n );\n Metrics.postEvent({\n event: eventType.RECEIVING_MEDIA_START,\n meeting,\n data: {\n mediaType: mediaType.AUDIO\n }\n });\n }\n else if (event.stop && event.stat === 'bytesReceived') {\n Metrics.postEvent({\n event: eventType.RECEIVING_MEDIA_STOP,\n meeting,\n data: {\n mediaType: mediaType.AUDIO\n }\n });\n }\n },\n onData: () => {}\n },\n {\n id: 'mainVideo',\n correlate: 'video',\n history: true,\n onEvent: (event) => {\n if (event.kind === 'video' && event.stat === 'bytesReceived') {\n Trigger.trigger(\n meeting,\n {\n file: 'meeting/util',\n function: 'startInternalStats'\n },\n EVENT_TRIGGERS.MEETING_MEDIA_REMOTE_STARTED,\n {\n type: mediaType.VIDEO\n }\n );\n Metrics.postEvent({\n event: eventType.RECEIVING_MEDIA_START,\n meeting,\n data: {\n mediaType: mediaType.VIDEO\n }\n });\n }\n else if (event.stop && event.stat === 'bytesReceived') {\n Metrics.postEvent({\n event: eventType.RECEIVING_MEDIA_STOP,\n meeting,\n data: {\n mediaType: mediaType.VIDEO\n }\n });\n }\n },\n onData: () => {}\n },\n {\n id: 'mainShare',\n correlate: 'video',\n onEvent: (event) => {\n if (event.kind === 'share' && event.stat === 'bytesReceived') {\n Trigger.trigger(\n meeting,\n {\n file: 'meeting/util',\n function: 'startInternalStats'\n },\n EVENT_TRIGGERS.MEETING_MEDIA_REMOTE_STARTED,\n {\n type: mediaType.SHARE\n }\n );\n Metrics.postEvent({\n event: eventType.RECEIVING_MEDIA_START,\n meeting,\n data: {\n mediaType: mediaType.SHARE\n }\n });\n }\n else if (event.stop && event.stat === 'bytesReceived') {\n Metrics.postEvent({\n event: eventType.RECEIVING_MEDIA_STOP,\n meeting,\n data: {\n mediaType: mediaType.SHARE\n }\n });\n }\n },\n onData: () => {}\n }\n ]\n };\n\n StatsUtil.generateOptions(options, STATS.CONFIG, meeting);\n\n options.config = STATS.CONFIG;\n\n // pass the attrs and options for the webex instance\n meeting.internalStats = new WebRTCStats(meeting.attrs, meeting.options, options);\n }\n\n return meeting.internalStats;\n};\n\nMeetingUtil.handleAudioLogging = (audioTrack) => {\n const LOG_HEADER = 'MeetingUtil#handleAudioLogging -->';\n\n if (audioTrack) {\n const settings = audioTrack.getSettings();\n const {deviceId} = settings;\n\n LoggerProxy.logger.log(LOG_HEADER, `deviceId = ${deviceId}`);\n LoggerProxy.logger.log(LOG_HEADER, 'settings =', JSON.stringify(settings));\n }\n};\n\nMeetingUtil.handleVideoLogging = (videoTrack) => {\n const LOG_HEADER = 'MeetingUtil#handleVideoLogging -->';\n\n if (videoTrack) {\n const settings = videoTrack.getSettings();\n const {deviceId} = settings;\n\n LoggerProxy.logger.log(LOG_HEADER, `deviceId = ${deviceId}`);\n LoggerProxy.logger.log(LOG_HEADER, 'settings =', JSON.stringify(settings));\n }\n};\n\nMeetingUtil.handleDeviceLogging = (devices = []) => {\n const LOG_HEADER = 'MeetingUtil#handleDeviceLogging -->';\n\n devices.forEach((device) => {\n LoggerProxy.logger.log(LOG_HEADER, `deviceId = ${device.deviceId}`);\n LoggerProxy.logger.log(LOG_HEADER, 'settings', JSON.stringify(device));\n });\n};\n\nMeetingUtil.endMeetingForAll = (meeting) => {\n if (meeting.meetingState === FULL_STATE.INACTIVE) {\n return Promise.reject(new MeetingNotActiveError());\n }\n\n const endOptions = {\n locusUrl: meeting.locusUrl,\n };\n\n return meeting.meetingRequest\n .endMeetingForAll(endOptions)\n .then((response) => {\n if (response && response.body && response.body.locus) {\n meeting.locusInfo.onFullLocus(response.body.locus);\n }\n\n return Promise.resolve();\n })\n .then(() => MeetingUtil.cleanUp(meeting))\n .catch((err) => {\n LoggerProxy.logger.error(\n `Meeting:util#endMeetingForAll An error occured while trying to end meeting for all with an id of ${\n meeting.id\n }, error: ${err}`\n );\n\n return Promise.reject(err);\n });\n};\n\nexport default MeetingUtil;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AASA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;;;;;AAEA,IAAMA,WAAW,GAAG,EAApB;;AAEAA,WAAW,CAACC,cAAZ,GAA6B,UAACC,QAAD,EAAc;EACzC,IAAMC,MAAM,GAAG,EAAf,CADyC,CAGzC;;EACAA,MAAM,CAACC,KAAP,GAAeF,QAAQ,CAACG,IAAT,CAAcD,KAA7B;EACAD,MAAM,CAACG,gBAAP,GAA0BJ,QAAQ,CAACG,IAAT,CAAcC,gBAAxC;EACAH,MAAM,CAACI,QAAP,GAAkBJ,MAAM,CAACC,KAAP,CAAaI,GAA/B;EACAL,MAAM,CAACM,OAAP,GAAiBN,MAAM,CAACC,KAAP,CAAaI,GAAb,CAAiBE,KAAjB,CAAuB,GAAvB,EAA4BC,GAA5B,EAAjB;EACAR,MAAM,CAACS,MAAP,GAAgBT,MAAM,CAACC,KAAP,CAAaS,IAAb,CAAkBC,EAAlC,CARyC,CAUzC;;EACAX,MAAM,CAACG,gBAAP,CAAwBS,OAAxB,CAAgC,UAACC,eAAD,EAAqB;IACnD,IAAIA,eAAe,CAACC,OAApB,EAA6B;MAC3Bd,MAAM,CAACc,OAAP,GAAiBD,eAAe,CAACC,OAAjC;IACD;EACF,CAJD;EAMA,OAAOd,MAAP;AACD,CAlBD;;AAoBAH,WAAW,CAACkB,sBAAZ,GAAqC,UAACC,UAAD,EAAaC,UAAb,EAAyBC,OAAzB,EAAqC;EACxE,IAAI,CAACA,OAAL,EAAc;IACZ,OAAO,iBAAQC,MAAR,CAAe,IAAIC,kBAAJ,CAAmB,4BAAnB,CAAf,CAAP;EACD;;EACD,IAAMC,WAAW,GAAGC,eAAMC,mBAAN,CAA0BL,OAAO,CAACJ,OAAlC,EAA2CE,UAA3C,EAAuDC,UAAvD,CAApB;;EAEA,IAAI,uBAAQI,WAAR,CAAJ,EAA0B;IACxB,OAAO,iBAAQF,MAAR,CAAe,IAAIC,kBAAJ,CAAmB,4DAAnB,CAAf,CAAP;EACD;;EAEDI,iBAAQC,SAAR,CAAkB;IAACC,KAAK,EAAEC,kBAAUC,aAAlB;IAAiCV,OAAO,EAAPA;EAAjC,CAAlB;;EAEA,OAAOA,OAAO,CAACW,cAAR,CAAuBC,sBAAvB,CAA8C;IACnD1B,QAAQ,EAAEc,OAAO,CAACd,QADiC;IAEnDK,MAAM,EAAES,OAAO,CAACT,MAFmC;IAGnDY,WAAW,EAAXA,WAHmD;IAInDU,SAAS,EAAEb,OAAO,CAACa,SAJgC;IAKnDC,aAAa,EAAEd,OAAO,CAACc;EAL4B,CAA9C,EAMJC,IANI,CAMC,UAAClC,QAAD,EAAc;IACpByB,iBAAQC,SAAR,CAAkB;MAACC,KAAK,EAAEC,kBAAUO,cAAlB;MAAkChB,OAAO,EAAPA;IAAlC,CAAlB;;IAEA,OAAOnB,QAAQ,CAACG,IAAT,CAAcD,KAArB;EACD,CAVM,CAAP;AAWD,CAvBD;;AAyBAJ,WAAW,CAACsC,QAAZ,GAAuB,UAACC,IAAD;EAAA,OAAUA,IAAI,IAAIA,IAAI,CAACC,KAAvB;AAAA,CAAvB;;AAEAxC,WAAW,CAACyC,WAAZ,GAA0B,UAACD,KAAD,EAAQ5B,MAAR;EAAA,OAAmB4B,KAAK,KAAK5B,MAA7B;AAAA,CAA1B;;AAEAZ,WAAW,CAAC0C,YAAZ,GAA2B,UAACC,GAAD;EAAA;;EAAA,OAAS,CAAAA,GAAG,SAAH,IAAAA,GAAG,WAAH,yBAAAA,GAAG,CAAEtC,IAAL,wDAAWuC,SAAX,KAAwBC,0BAAeC,QAAf,CAAwBH,GAAG,CAACtC,IAAJ,CAASuC,SAAjC,CAAjC;AAAA,CAA3B;;AAEA5C,WAAW,CAAC+C,WAAZ,GAA0B,UAAC1B,OAAD,EAAU2B,OAAV,EAAsB;EAC9C,IAAI,CAAC3B,OAAL,EAAc;IACZ,OAAO,iBAAQC,MAAR,CAAe,IAAIC,kBAAJ,CAAmB,4BAAnB,CAAf,CAAP;EACD;;EAEDI,iBAAQC,SAAR,CAAkB;IAACC,KAAK,EAAEC,kBAAUmB,kBAAlB;IAAsC5B,OAAO,EAAPA;EAAtC,CAAlB,EAL8C,CAO9C;EACA;EACA;;;EACA,OAAOA,OAAO,CAACW,cAAR,CACJe,WADI,CACQ;IACXG,cAAc,EAAE7B,OAAO,CAAC8B,cAAR,IAA0B9B,OAAO,CAAC+B,MADvC;IAEXC,aAAa,EAAEhC,OAAO,CAACgC,aAFZ;IAGXnB,SAAS,EAAEb,OAAO,CAACa,SAHR;IAIX3B,QAAQ,EAAEc,OAAO,CAACd,QAJP;IAKX4B,aAAa,EAAEd,OAAO,CAACc,aALZ;IAMXmB,WAAW,EAAEN,OAAO,CAACM,WANV;IAOXC,eAAe,EAAElC,OAAO,CAACkC,eAPd;IAQXC,UAAU,EAAER,OAAO,CAACQ,UAAR,IAAsB,IARvB;IASXC,SAAS,EAAET,OAAO,CAACS,SATR;IAUXC,GAAG,EAAEV,OAAO,CAACU,GAVF;IAWXC,cAAc,EAAEX,OAAO,CAACW,cAXb;IAYXC,iBAAiB,EAAEZ,OAAO,CAACY,iBAZhB;IAaXC,kBAAkB,EAAEb,OAAO,CAACa;EAbjB,CADR,EAgBJzB,IAhBI,CAgBC,UAAC0B,GAAD,EAAS;IACbnC,iBAAQC,SAAR,CAAkB;MAChBC,KAAK,EAAEC,kBAAUiC,mBADD;MAEhB1C,OAAO,EAAPA,OAFgB;MAGhB2C,IAAI,EAAE;QACJC,OAAO,EAAEA,gBAAQC,WADb;QAEJ9D,KAAK,EAAE0D,GAAG,CAACzD,IAAJ,CAASD,KAFZ;QAGJE,gBAAgB,EAAEwD,GAAG,CAACzD,IAAJ,CAASC,gBAHvB;QAIJ6D,UAAU,EAAEL,GAAG,CAACM,OAAJ,CAAYC;MAJpB;IAHU,CAAlB;;IAWA,OAAOrE,WAAW,CAACC,cAAZ,CAA2B6D,GAA3B,CAAP;EACD,CA7BI,CAAP;AA8BD,CAxCD;;AA0CA9D,WAAW,CAACsE,OAAZ,GAAsB,UAACjD,OAAD,EAAa;EACjC;EACA,IAAIA,OAAO,CAACkD,aAAZ,EAA2BlD,OAAO,CAACkD,aAAR,CAAsBC,YAAtB;EAE3B,OAAOnD,OAAO,CAACoD,gBAAR,GACJrC,IADI,CACC;IAAA,OAAMf,OAAO,CAACqD,eAAR,EAAN;EAAA,CADD,EAEJtC,IAFI,CAEC;IAAA,OAAMf,OAAO,CAACsD,iBAAR,EAAN;EAAA,CAFD,EAGJvC,IAHI,CAGC;IAAA,OAAMf,OAAO,CAACuD,oBAAR,EAAN;EAAA,CAHD,EAIJxC,IAJI,CAIC,YAAM;IACVf,OAAO,CAACwD,oBAAR;IACAxD,OAAO,CAACyD,oBAAR;IACAzD,OAAO,CAAC0D,iBAAR;IACA1D,OAAO,CAAC2D,oBAAR;IACA3D,OAAO,CAAC4D,gBAAR;IACA5D,OAAO,CAAC6D,mBAAR,CAA4BZ,OAA5B;EACD,CAXI,EAYJlC,IAZI,CAYC;IAAA,OAAMf,OAAO,CAAC8D,IAAR,CAAaC,IAAb,CAAkB/D,OAAO,CAACc,aAA1B,EAAyCd,OAAO,CAACgE,OAAjD,CAAN;EAAA,CAZD,CAAP;AAaD,CAjBD;;AAmBArF,WAAW,CAACsF,oBAAZ,GAAmC,UAACjE,OAAD,EAAUkE,QAAV,EAAuB;EACxD,IAAIlE,OAAO,CAACmE,YAAR,KAAyBC,sBAAWC,QAAxC,EAAkD;IAChD,OAAO,iBAAQpE,MAAR,CAAe,IAAIqE,kCAAJ,EAAf,CAAP;EACD;;EAED,IAAM3C,OAAO,GAAG;IACdzC,QAAQ,EAAEc,OAAO,CAACd,QADJ;IAEdK,MAAM,EAAES,OAAO,CAACT,MAFF;IAGduB,aAAa,EAAEd,OAAO,CAACc,aAHT;IAIdoD,QAAQ,EAARA;EAJc,CAAhB;EAOA,OAAOlE,OAAO,CAACW,cAAR,CACJsD,oBADI,CACiBtC,OADjB,EAEJZ,IAFI,CAEC,UAAClC,QAAD,EAAc;IAAA;;IAClB,IAAIA,QAAJ,aAAIA,QAAJ,iCAAIA,QAAQ,CAAEG,IAAd,2CAAI,eAAgBD,KAApB,EAA2B;MACzBiB,OAAO,CAACuE,SAAR,CAAkBC,WAAlB,CAA8B3F,QAAQ,CAACG,IAAT,CAAcD,KAA5C;IACD;EACF,CANI,EAOJ0F,KAPI,CAOE,UAACnD,GAAD,EAAS;IACdoD,qBAAYC,MAAZ,CAAmBC,KAAnB,6GAEI5E,OAAO,CAACP,EAFZ,sBAGc6B,GAHd;;IAMA,OAAO,iBAAQrB,MAAR,CAAeqB,GAAf,CAAP;EACD,CAfI,CAAP;AAgBD,CA5BD,C,CA8BA;AACA;AACA;AACA;;;AACA3C,WAAW,CAACkG,YAAZ,GAA2B,UAAC7E,OAAD,EAA2B;EAAA,IAAjB2B,OAAiB,uEAAP,EAAO;;EACpD,IAAI3B,OAAO,CAACmE,YAAR,KAAyBC,sBAAWC,QAAxC,EAAkD;IAChD;IACA,OAAO,iBAAQpE,MAAR,CAAe,IAAIqE,kCAAJ,EAAf,CAAP;EACD;;EAED,IAAI3F,WAAW,CAACmG,iBAAZ,CAA8B9E,OAAO,CAACuE,SAAtC,CAAJ,EAAsD;IACpD,OAAO,iBAAQtE,MAAR,CAAe,IAAI8E,+BAAJ,EAAf,CAAP;EACD;;EAED,IAAMC,cAAc,GAAG;IACrB9F,QAAQ,EAAEc,OAAO,CAACd,QADG;IAErBK,MAAM,EAAES,OAAO,CAACT,MAFK;IAGrBuB,aAAa,EAAEd,OAAO,CAACc,aAHF;IAIrBqB,UAAU,EAAEnC,OAAO,CAACmC,UAJC;IAKrBtB,SAAS,EAAEb,OAAO,CAACa;EALE,CAAvB;;EAQA,IAAMoE,YAAY,mCAAOD,cAAP,GAA0BrD,OAA1B,CAAlB;;EAEA,OAAO3B,OAAO,CAACW,cAAR,CACJkE,YADI,CACSI,YADT,EAEJlE,IAFI,CAEC,UAAClC,QAAD,EAAc;IAClB,IAAIA,QAAQ,IAAIA,QAAQ,CAACG,IAArB,IAA6BH,QAAQ,CAACG,IAAT,CAAcD,KAA/C,EAAsD;MAAE;MACtDiB,OAAO,CAACuE,SAAR,CAAkBC,WAAlB,CAA8B3F,QAAQ,CAACG,IAAT,CAAcD,KAA5C;IACD;;IAED,OAAO,iBAAQmG,OAAR,EAAP;EACD,CARI,EASJnE,IATI,CASC,YAAM;IACV,IAAIY,OAAO,CAACwD,WAAZ,EAAyB;MACvB,OAAO,iBAAQD,OAAR,EAAP;IACD;;IAED,OAAOvG,WAAW,CAACsE,OAAZ,CAAoBjD,OAApB,CAAP;EACD,CAfI,EAgBJyE,KAhBI,CAgBE,UAACnD,GAAD,EAAS;IACd;IACA;IACA;IACAoD,qBAAYC,MAAZ,CAAmBC,KAAnB,sGAEI5E,OAAO,CAACP,EAFZ,sBAGc6B,GAHd;;IAMA,OAAO,iBAAQrB,MAAR,CAAeqB,GAAf,CAAP;EACD,CA3BI,CAAP;AA4BD,CAhDD;;AAiDA3C,WAAW,CAACyG,cAAZ,GAA6B,UAACpF,OAAD,EAAUqF,MAAV;EAAA,OAC3BrF,OAAO,CAACW,cAAR,CAAuByE,cAAvB,CAAsC;IACpClG,QAAQ,EAAEc,OAAO,CAACd,QADkB;IAEpC2B,SAAS,EAAEb,OAAO,CAACa,SAFiB;IAGpCwE,MAAM,EAANA;EAHoC,CAAtC,CAD2B;AAAA,CAA7B;;AAOA1G,WAAW,CAACmG,iBAAZ,GAAgC,UAACP,SAAD;EAAA;;EAAA,OAC9B,0BAAAA,SAAS,CAACe,WAAV,0GAAuB9F,IAAvB,kFAA6B+F,KAA7B,MAAuCC,iBADT;AAAA,CAAhC;;AAGA7G,WAAW,CAAC8G,iBAAZ,GAAgC,UAAClB,SAAD;EAAA;;EAAA,OAC9B,2BAAAA,SAAS,CAACe,WAAV,4GAAuB9F,IAAvB,kFAA6B+F,KAA7B,MAAuCG,iBADT;AAAA,CAAhC;;AAGA/G,WAAW,CAACgH,mBAAZ,GAAkC,UAACpB,SAAD;EAAA;;EAAA,OAChC,2BAAAA,SAAS,CAACe,WAAV,4GAAuB9F,IAAvB,kFAA6B+F,KAA7B,MAAuCK,mBADP;AAAA,CAAlC;;AAGAjH,WAAW,CAACkH,kBAAZ,GAAiC,UAACC,kBAAD;EAAA,OAC/BA,kBAAkB,KAAKA,kBAAkB,CAACC,KAAnB,IAA4BD,kBAAkB,CAACE,KAA/C,IAAwDF,kBAAkB,CAACG,KAAhF,CADa;AAAA,CAAjC;;AAIAtH,WAAW,CAACuH,kBAAZ,GAAiC,UAAClG,OAAD,EAA2B;EAAA,IAAjB2B,OAAiB,uEAAP,EAAO;EAC1D3B,OAAO,CAACmC,UAAR,GAAqBnC,OAAO,CAACmC,UAAR,IAAsBR,OAAO,CAACQ,UAAnD;;EAEA,IAAInC,OAAO,CAACmG,eAAZ,EAA6B;IAC3B,OAAO,iBAAQlG,MAAR,CAAe,IAAImG,qBAAJ,EAAf,CAAP;EACD;;EACD,IAAIpG,OAAO,CAACqG,cAAR,KAA2BC,2BAAgBC,QAA/C,EAAyD;IACvD,OAAO,iBAAQtG,MAAR,CAAe,IAAIuG,sBAAJ,EAAf,CAAP;EACD;;EAED,IAAI7E,OAAO,CAACU,GAAZ,EAAiB;IACf/B,iBAAQC,SAAR,CAAkB;MAChBC,KAAK,EAAEC,kBAAUgG,aADD;MAEhBzG,OAAO,EAAPA;IAFgB,CAAlB;EAID,CAfyD,CAiB1D;;;EACA,OAAOrB,WAAW,CAAC+C,WAAZ,CAAwB1B,OAAxB,EAAiC2B,OAAjC,EACJZ,IADI,CACC,UAAClC,QAAD,EAAc;IAClBmB,OAAO,CAAC0G,QAAR,CAAiB7H,QAAjB;IAEA,OAAO,iBAAQqG,OAAR,CAAgBrG,QAAhB,CAAP;EACD,CALI,EAMJ4F,KANI,CAME,UAACnD,GAAD,EAAS;IACd;IACA,IAAI3C,WAAW,CAAC0C,YAAZ,CAAyBC,GAAzB,CAAJ,EAAmC;MACjChB,iBAAQC,SAAR,CAAkB;QAChBC,KAAK,EAAEC,kBAAUkG,UADD;QAEhB3G,OAAO,EAAPA;MAFgB,CAAlB,EADiC,CAMjC;MACA;;;MACA,OAAO,iBAAQC,MAAR,CAAe,IAAI2G,qBAAJ,CAAsB,uBAAtB,EAA+CtF,GAA/C,CAAf,CAAP;IACD;;IACDoD,qBAAYC,MAAZ,CAAmBC,KAAnB,CAAyB,8DAAzB,EAAyFtD,GAAzF;;IAEA,OAAO,iBAAQrB,MAAR,CAAe,IAAI4G,oBAAJ,CAAqBlF,OAArB,EAA8B,uBAA9B,EAAuDL,GAAvD,CAAf,CAAP;EACD,CArBI,CAAP;AAsBD,CAxCD;;AA0CA3C,WAAW,CAACmI,iBAAZ,GAAgC,UAACnF,OAAD,EAAUoF,cAAV,EAA6B;EAC3D,IACEC,IADF,GAQIrF,OARJ,CACEqF,IADF;EAAA,IAEEC,SAFF,GAQItF,OARJ,CAEEsF,SAFF;EAAA,IAGEC,YAHF,GAQIvF,OARJ,CAGEuF,YAHF;EAAA,IAIEC,KAJF,GAQIxF,OARJ,CAIEwF,KAJF;EAAA,IAKEC,WALF,GAQIzF,OARJ,CAKEyF,WALF;EAAA,IAMEC,cANF,GAQI1F,OARJ,CAME0F,cANF;EAAA,IAOEC,sBAPF,GAQI3F,OARJ,CAOE2F,sBAPF;;EAUA,IAAKL,SAAS,KAAKM,SAAd,IAA2BN,SAAS,KAAKK,sBAAsB,CAACL,SAAjE,IACHC,YAAY,KAAKK,SAAjB,IAA8BL,YAAY,KAAKI,sBAAsB,CAACJ,YADvE,EACsF;IACpF,OAAO9G,eAAM0G,iBAAN,CAAwB;MAC7BU,SAAS,EAAET,cAAc,CAAC/G,OAAf,CAAuBP,EADL;MAE7BgI,kBAAkB,EAAEV,cAAc,CAACW,eAAf,CAA+BD,kBAFtB;MAG7BE,SAAS,EAAEZ,cAAc,CAAC/G,OAAf,CAAuB4H,MAAvB,CAA8BD,SAHZ;MAI7BE,YAAY,EAAEd,cAAc,CAAC/G,OAAf,CAAuB4H,MAAvB,CAA8BC;IAJf,CAAxB,EAKJR,cALI,EAKYD,WALZ,EAMP;MACED,KAAK,EAALA,KADF;MAEEH,IAAI,EAAJA,IAFF;MAGEE,YAAY,EAAZA,YAHF;MAIED,SAAS,EAATA;IAJF,CANO,EAYJlG,IAZI,CAYC;MAAA,OAAMgG,cAAc,CAAC/G,OAAf,CAAuB8D,IAAvB,CACTgE,oBADS,CACY;QACpBC,GAAG,EAAEhB,cAAc,CAACW,eAAf,CAA+BL,cAA/B,CAA8CU,GAD/B;QAEpB/D,OAAO,EAAE+C,cAAc,CAAC/G,OAAf,CAAuBgE,OAFZ;QAGpBhE,OAAO,EAAE+G,cAAc,CAAC/G,OAHJ,CAGY;;MAHZ,CADZ,CAAN;IAAA,CAZD,EAkBJyE,KAlBI,CAkBE,UAACuD,CAAD,EAAO;MACZtD,qBAAYC,MAAZ,CAAmBC,KAAnB,iEAAkFoC,IAAlF,kCAA8GgB,CAA9G;IACD,CApBI,CAAP;EAqBD;;EAAC,IAAIb,KAAJ,EAAW;IACXC,WAAW,CAACa,MAAZ,CAAmBC,YAAnB,CAAgCf,KAAhC;IAEA,OAAO,iBAAQjC,OAAR,EAAP;EACD;;EAED,OAAO,iBAAQjF,MAAR,CAAe,IAAIC,kBAAJ,CAAmB,4CAAnB,CAAf,CAAP;AACD,CAzCD;;AA2CAvB,WAAW,CAACwJ,eAAZ,GAA8B,UAACxG,OAAD,EAAa;EACzC,IACEyG,SADF,GAEIzG,OAFJ,CACEyG,SADF;EAAA,IACaC,SADb,GAEI1G,OAFJ,CACa0G,SADb;EAAA,IACwBC,SADxB,GAEI3G,OAFJ,CACwB2G,SADxB;EAAA,IACmCC,WADnC,GAEI5G,OAFJ,CACmC4G,WADnC;EAAA,IACgDC,UADhD,GAEI7G,OAFJ,CACgD6G,UADhD;;EAIA,IAAIJ,SAAS,IAAI,CAACzJ,WAAW,CAAC8J,QAAZ,CAAqBF,WAArB,EAAkCG,UAApD,EAAgE;IAC9D,OAAO,iBAAQzI,MAAR,CAAe,IAAIC,kBAAJ,CAAmB,iCAAnB,CAAf,CAAP;EACD;;EAED,IAAImI,SAAS,IAAI,CAAC1J,WAAW,CAAC8J,QAAZ,CAAqBF,WAArB,EAAkCI,UAApD,EAAgE;IAC9D,OAAO,iBAAQ1I,MAAR,CAAe,IAAIC,kBAAJ,CAAmB,iCAAnB,CAAf,CAAP;EACD;;EAED,IAAIoI,SAAS,IAAI,CAAC3J,WAAW,CAAC8J,QAAZ,CAAqBD,UAArB,EAAiCE,UAAnD,EAA+D;IAC7D,OAAO,iBAAQzI,MAAR,CAAe,IAAIC,kBAAJ,CAAmB,iCAAnB,CAAf,CAAP;EACD;;EAED,OAAO,iBAAQgF,OAAR,EAAP;AACD,CAlBD;;AAoBAvG,WAAW,CAAC8J,QAAZ,GAAuB,UAACG,MAAD,EAAY;EACjC,IAAID,UAAU,GAAG,IAAjB;EACA,IAAID,UAAU,GAAG,IAAjB;EACA,IAAIG,WAAW,GAAG,IAAlB;EACA,IAAIC,WAAW,GAAG,IAAlB;;EAEA,IAAI,CAACF,MAAL,EAAa;IACX,OAAO;MAACD,UAAU,EAAE,IAAb;MAAmBD,UAAU,EAAE;IAA/B,CAAP;EACD;;EACD,IAAIE,MAAM,CAACG,cAAX,EAA2B;IACzBF,WAAW,GAAGD,MAAM,CAACG,cAAP,EAAd;EACD;;EACD,IAAIH,MAAM,CAACI,cAAX,EAA2B;IACzBF,WAAW,GAAGF,MAAM,CAACI,cAAP,EAAd;EACD;;EAED,IAAIH,WAAW,IAAIA,WAAW,CAACI,MAAZ,GAAqB,CAAxC,EAA2C;IAAA,mBAC1BJ,WAD0B;;IAAA;;IACxCF,UADwC;EAE1C;;EAED,IAAIG,WAAW,IAAIA,WAAW,CAACG,MAAZ,GAAqB,CAAxC,EAA2C;IAAA,mBAC1BH,WAD0B;;IAAA;;IACxCJ,UADwC;EAE1C;;EAED,OAAO;IAACC,UAAU,EAAVA,UAAD;IAAaD,UAAU,EAAVA;EAAb,CAAP;AACD,CAzBD;;AA2BA/J,WAAW,CAACuK,yBAAZ,GAAwC,UAAC3E,SAAD;EAAA,OACtCA,SAAS,IACTA,SAAS,CAACe,WADV,IAEAf,SAAS,CAACe,WAAV,CAAsBpE,IAFtB,IAGAqD,SAAS,CAACe,WAAV,CAAsBpE,IAHtB,IAIAqD,SAAS,CAACe,WAAV,CAAsBpE,IAAtB,CAA2BkB,SALW;AAAA,CAAxC;;AAOAzD,WAAW,CAACwK,sBAAZ,GAAqC,UAAC5E,SAAD;EAAA,OACnCA,SAAS,IACTA,SAAS,CAACe,WADV,IAEAf,SAAS,CAACe,WAAV,CAAsBpE,IAFtB,IAGAqD,SAAS,CAACe,WAAV,CAAsBpE,IAHtB,IAIAqD,SAAS,CAACe,WAAV,CAAsBpE,IAAtB,CAA2BkI,MALQ;AAAA,CAArC;;AAOAzK,WAAW,CAAC0K,gCAAZ,GAA+C,UAAC9E,SAAD;EAAA;;EAAA,OAAe,CAAAA,SAAS,SAAT,IAAAA,SAAS,WAAT,sCAAAA,SAAS,CAAEe,WAAX,4GAAwBpE,IAAxB,kFAA8BoI,gBAA9B,KAAkD,EAAjE;AAAA,CAA/C;;AAEA3K,WAAW,CAAC4K,WAAZ,GAA0B,UAACC,YAAD;EAAA,OAAkBA,YAAY,CAAC/H,QAAb,CAAsBgI,yBAAcC,iBAApC,KAA0DF,YAAY,CAAC/H,QAAb,CAAsBgI,yBAAcE,oBAApC,CAA5E;AAAA,CAA1B;;AAEAhL,WAAW,CAACiL,aAAZ,GAA4B,UAACJ,YAAD;EAAA,OAAkBA,YAAY,CAAC/H,QAAb,CAAsBgI,yBAAcI,mBAApC,KAA4DL,YAAY,CAAC/H,QAAb,CAAsBgI,yBAAcK,kBAApC,CAA9E;AAAA,CAA5B;;AAEAnL,WAAW,CAACoL,aAAZ,GAA4B,UAACP,YAAD;EAAA,OAAkBA,YAAY,CAAC/H,QAAb,CAAsBgI,yBAAcO,uBAApC,CAAlB;AAAA,CAA5B;;AAEArL,WAAW,CAACsL,YAAZ,GAA2B,UAACT,YAAD;EAAA,OAAkBA,YAAY,CAAC/H,QAAb,CAAsBgI,yBAAcS,uBAApC,CAAlB;AAAA,CAA3B;;AAEAvL,WAAW,CAACwL,aAAZ,GAA4B,UAACX,YAAD;EAAA,OAAkBA,YAAY,CAAC/H,QAAb,CAAsBgI,yBAAcW,wBAApC,CAAlB;AAAA,CAA5B;;AAEAzL,WAAW,CAAC0L,WAAZ,GAA0B,UAACb,YAAD;EAAA,OAAkBA,YAAY,CAAC/H,QAAb,CAAsBgI,yBAAca,sBAApC,CAAlB;AAAA,CAA1B;;AAEA3L,WAAW,CAAC4L,cAAZ,GAA6B,UAACC,OAAD,EAAUtL,QAAV,EAAoBqF,SAApB,EAAkC;EAC7D,IAAMiF,YAAY,GAAG7K,WAAW,CAAC0K,gCAAZ,CAA6C9E,SAA7C,CAArB;;EAEA,IAAI5F,WAAW,CAACoL,aAAZ,CAA0BP,YAA1B,CAAJ,EAA6C;IAC3C,OAAOgB,OAAO,CAACC,aAAR,CAAsB;MAACvL,QAAQ,EAARA,QAAD;MAAWwL,SAAS,EAAE,IAAtB;MAA4BC,MAAM,EAAE;IAApC,CAAtB,CAAP;EACD;;EAED,OAAO,iBAAQ1K,MAAR,CAAe,IAAI2K,mBAAJ,CAAoB,yDAApB,CAAf,CAAP;AACD,CARD;;AAUAjM,WAAW,CAACkM,cAAZ,GAA6B,UAACL,OAAD,EAAUtL,QAAV,EAAoBqF,SAApB,EAAkC;EAC7D,IAAMiF,YAAY,GAAG7K,WAAW,CAAC0K,gCAAZ,CAA6C9E,SAA7C,CAArB;;EAEA,IAAI5F,WAAW,CAACsL,YAAZ,CAAyBT,YAAzB,CAAJ,EAA4C;IAC1C,OAAOgB,OAAO,CAACC,aAAR,CAAsB;MAACvL,QAAQ,EAARA,QAAD;MAAWwL,SAAS,EAAE,IAAtB;MAA4BC,MAAM,EAAE;IAApC,CAAtB,CAAP;EACD;;EAED,OAAO,iBAAQ1K,MAAR,CAAe,IAAI2K,mBAAJ,CAAoB,yDAApB,CAAf,CAAP;AACD,CARD;;AAUAjM,WAAW,CAACmM,eAAZ,GAA8B,UAACN,OAAD,EAAUtL,QAAV,EAAoBqF,SAApB,EAAkC;EAC9D,IAAMiF,YAAY,GAAG7K,WAAW,CAAC0K,gCAAZ,CAA6C9E,SAA7C,CAArB;;EAEA,IAAI5F,WAAW,CAACwL,aAAZ,CAA0BX,YAA1B,CAAJ,EAA6C;IAC3C,OAAOgB,OAAO,CAACC,aAAR,CAAsB;MAACvL,QAAQ,EAARA,QAAD;MAAWwL,SAAS,EAAE,IAAtB;MAA4BC,MAAM,EAAE;IAApC,CAAtB,CAAP;EACD;;EAED,OAAO,iBAAQ1K,MAAR,CAAe,IAAI2K,mBAAJ,CAAoB,0DAApB,CAAf,CAAP;AACD,CARD;;AAUAjM,WAAW,CAACoM,aAAZ,GAA4B,UAACP,OAAD,EAAUtL,QAAV,EAAoBqF,SAApB,EAAkC;EAC5D,IAAMiF,YAAY,GAAG7K,WAAW,CAAC0K,gCAAZ,CAA6C9E,SAA7C,CAArB;;EAEA,IAAI5F,WAAW,CAAC0L,WAAZ,CAAwBb,YAAxB,CAAJ,EAA2C;IACzC,OAAOgB,OAAO,CAACC,aAAR,CAAsB;MAACvL,QAAQ,EAARA,QAAD;MAAWwL,SAAS,EAAE,KAAtB;MAA6BC,MAAM,EAAE;IAArC,CAAtB,CAAP;EACD;;EAED,OAAO,iBAAQ1K,MAAR,CAAe,IAAI2K,mBAAJ,CAAoB,wDAApB,CAAf,CAAP;AACD,CARD;;AAUAjM,WAAW,CAACqM,WAAZ,GAA0B,UAACC,OAAD,EAAUT,OAAV,EAAmBtL,QAAnB,EAAgC;EACxD,IAAI+L,OAAO,IAAIA,OAAO,CAACC,OAAvB,EAAgC;IAC9B,OAAOV,OAAO,CAACQ,WAAR,CAAoB;MAAC9L,QAAQ,EAARA,QAAD;MAAWiM,IAAI,EAAE;IAAjB,CAApB,CAAP;EACD;;EAED,OAAO,iBAAQlL,MAAR,CAAe,IAAI2K,mBAAJ,CAAoB,2CAApB,CAAf,CAAP;AACD,CAND;;AAQAjM,WAAW,CAACyM,aAAZ,GAA4B,UAACH,OAAD,EAAUT,OAAV,EAAmBtL,QAAnB,EAAgC;EAC1D,IAAI+L,OAAO,IAAIA,OAAO,CAACI,SAAvB,EAAkC;IAChC,OAAOb,OAAO,CAACQ,WAAR,CAAoB;MAAC9L,QAAQ,EAARA,QAAD;MAAWiM,IAAI,EAAE;IAAjB,CAApB,CAAP;EACD;;EAED,OAAO,iBAAQlL,MAAR,CAAe,IAAI2K,mBAAJ,CAAoB,6CAApB,CAAf,CAAP;AACD,CAND;;AAQAjM,WAAW,CAAC2M,kBAAZ,GAAiC,UAACtL,OAAD,EAAa;EAC5C,IAAI,CAACA,OAAO,CAACuL,aAAb,EAA4B;IAC1B,IAAM5J,OAAO,GAAG;MACd6J,SAAS,EAAE,IADG;MAEdC,OAAO,EAAE,CACP;QACEhM,EAAE,EAAE,WADN;QAEEiM,SAAS,EAAE,OAFb;QAGEC,OAAO,EAAE,IAHX;QAIEC,OAAO,EAAE,iBAACpL,KAAD,EAAW;UAClB;UACA;UACA,IAAIA,KAAK,CAACqL,IAAN,KAAe,OAAf,IAA0BrL,KAAK,CAACsL,IAAN,KAAe,WAA7C,EAA0D;YACxDC,sBAAQnJ,OAAR,CACE5C,OADF,EAEE;cACEgM,IAAI,EAAE,cADR;cAEEC,QAAQ,EAAE;YAFZ,CAFF,EAMEC,0BAAeC,2BANjB,EAOE;cACEnF,IAAI,EAAEoF,kBAAUC;YADlB,CAPF;;YAWA/L,iBAAQC,SAAR,CAAkB;cAChBC,KAAK,EAAEC,kBAAU6L,mBADD;cAEhBtM,OAAO,EAAPA,OAFgB;cAGhB2C,IAAI,EAAE;gBACJyJ,SAAS,EAAEA,kBAAUC;cADjB;YAHU,CAAlB;UAOD,CAnBD,MAoBK,IAAI7L,KAAK,CAACuD,IAAN,IAAcvD,KAAK,CAACsL,IAAN,KAAe,WAAjC,EAA8C;YACjDxL,iBAAQC,SAAR,CAAkB;cAChBC,KAAK,EAAEC,kBAAU8L,kBADD;cAEhBvM,OAAO,EAAPA,OAFgB;cAGhB2C,IAAI,EAAE;gBACJyJ,SAAS,EAAEA,kBAAUC;cADjB;YAHU,CAAlB;UAOD;QACF,CApCH;QAqCEG,MAAM,EAAE,kBAAM,CAAE;MArClB,CADO,EAwCP;QACE/M,EAAE,EAAE,WADN;QAEEiM,SAAS,EAAE,OAFb;QAGEC,OAAO,EAAE,IAHX;QAIEC,OAAO,EAAE,iBAACpL,KAAD,EAAW;UAClB,IAAIA,KAAK,CAACqL,IAAN,KAAe,OAAf,IAA0BrL,KAAK,CAACsL,IAAN,KAAe,WAA7C,EAA0D;YACxDC,sBAAQnJ,OAAR,CACE5C,OADF,EAEE;cACEgM,IAAI,EAAE,cADR;cAEEC,QAAQ,EAAE;YAFZ,CAFF,EAMEC,0BAAeC,2BANjB,EAOE;cACEnF,IAAI,EAAEoF,kBAAUK;YADlB,CAPF;;YAWAnM,iBAAQC,SAAR,CAAkB;cAChBC,KAAK,EAAEC,kBAAU6L,mBADD;cAEhBtM,OAAO,EAAPA,OAFgB;cAGhB2C,IAAI,EAAE;gBACJyJ,SAAS,EAAEA,kBAAUK;cADjB;YAHU,CAAlB;UAOD,CAnBD,MAoBK,IAAIjM,KAAK,CAACuD,IAAN,IAAcvD,KAAK,CAACsL,IAAN,KAAe,WAAjC,EAA8C;YACjDxL,iBAAQC,SAAR,CAAkB;cAChBC,KAAK,EAAEC,kBAAU8L,kBADD;cAEhBvM,OAAO,EAAPA,OAFgB;cAGhB2C,IAAI,EAAE;gBACJyJ,SAAS,EAAEA,kBAAUK;cADjB;YAHU,CAAlB;UAOD;QACF,CAlCH;QAmCED,MAAM,EAAE,kBAAM,CAAE;MAnClB,CAxCO,EA6EP;QACE/M,EAAE,EAAE,WADN;QAEEiM,SAAS,EAAE,OAFb;QAGEE,OAAO,EAAE,iBAACpL,KAAD,EAAW;UAClB,IAAIA,KAAK,CAACqL,IAAN,KAAe,OAAf,IAA0BrL,KAAK,CAACsL,IAAN,KAAe,WAA7C,EAA0D;YACxDC,sBAAQnJ,OAAR,CACE5C,OADF,EAEE;cACEgM,IAAI,EAAE,cADR;cAEEC,QAAQ,EAAE;YAFZ,CAFF,EAMEC,0BAAeC,2BANjB,EAOE;cACEnF,IAAI,EAAEoF,kBAAUM;YADlB,CAPF;;YAWApM,iBAAQC,SAAR,CAAkB;cAChBC,KAAK,EAAEC,kBAAUkM,mBADD;cAEhB3M,OAAO,EAAPA,OAFgB;cAGhB2C,IAAI,EAAE;gBACJyJ,SAAS,EAAEA,kBAAUM;cADjB;YAHU,CAAlB;UAOD,CAnBD,MAoBK,IAAIlM,KAAK,CAACuD,IAAN,IAAcvD,KAAK,CAACsL,IAAN,KAAe,WAAjC,EAA8C;YACjDxL,iBAAQC,SAAR,CAAkB;cAChBC,KAAK,EAAEC,kBAAUmM,kBADD;cAEhB5M,OAAO,EAAPA,OAFgB;cAGhB2C,IAAI,EAAE;gBACJyJ,SAAS,EAAEA,kBAAUM;cADjB;YAHU,CAAlB;UAOD;QACF,CAjCH;QAkCEF,MAAM,EAAE,kBAAM,CAAE;MAlClB,CA7EO,CAFK;MAoHdK,SAAS,EAAE,CACT;QACEpN,EAAE,EAAE,WADN;QAEEiM,SAAS,EAAE,OAFb;QAGEC,OAAO,EAAE,IAHX;QAIEC,OAAO,EAAE,iBAACpL,KAAD,EAAW;UAClB,IAAIA,KAAK,CAACqL,IAAN,KAAe,OAAf,IAA0BrL,KAAK,CAACsL,IAAN,KAAe,eAA7C,EAA8D;YAC5DC,sBAAQnJ,OAAR,CACE5C,OADF,EAEE;cACEgM,IAAI,EAAE,cADR;cAEEC,QAAQ,EAAE;YAFZ,CAFF,EAMEC,0BAAeY,4BANjB,EAOE;cACE9F,IAAI,EAAEoF,kBAAUC;YADlB,CAPF;;YAWA/L,iBAAQC,SAAR,CAAkB;cAChBC,KAAK,EAAEC,kBAAUsM,qBADD;cAEhB/M,OAAO,EAAPA,OAFgB;cAGhB2C,IAAI,EAAE;gBACJyJ,SAAS,EAAEA,kBAAUC;cADjB;YAHU,CAAlB;UAOD,CAnBD,MAoBK,IAAI7L,KAAK,CAACuD,IAAN,IAAcvD,KAAK,CAACsL,IAAN,KAAe,eAAjC,EAAkD;YACrDxL,iBAAQC,SAAR,CAAkB;cAChBC,KAAK,EAAEC,kBAAUuM,oBADD;cAEhBhN,OAAO,EAAPA,OAFgB;cAGhB2C,IAAI,EAAE;gBACJyJ,SAAS,EAAEA,kBAAUC;cADjB;YAHU,CAAlB;UAOD;QACF,CAlCH;QAmCEG,MAAM,EAAE,kBAAM,CAAE;MAnClB,CADS,EAsCT;QACE/M,EAAE,EAAE,WADN;QAEEiM,SAAS,EAAE,OAFb;QAGEC,OAAO,EAAE,IAHX;QAIEC,OAAO,EAAE,iBAACpL,KAAD,EAAW;UAClB,IAAIA,KAAK,CAACqL,IAAN,KAAe,OAAf,IAA0BrL,KAAK,CAACsL,IAAN,KAAe,eAA7C,EAA8D;YAC5DC,sBAAQnJ,OAAR,CACE5C,OADF,EAEE;cACEgM,IAAI,EAAE,cADR;cAEEC,QAAQ,EAAE;YAFZ,CAFF,EAMEC,0BAAeY,4BANjB,EAOE;cACE9F,IAAI,EAAEoF,kBAAUK;YADlB,CAPF;;YAWAnM,iBAAQC,SAAR,CAAkB;cAChBC,KAAK,EAAEC,kBAAUsM,qBADD;cAEhB/M,OAAO,EAAPA,OAFgB;cAGhB2C,IAAI,EAAE;gBACJyJ,SAAS,EAAEA,kBAAUK;cADjB;YAHU,CAAlB;UAOD,CAnBD,MAoBK,IAAIjM,KAAK,CAACuD,IAAN,IAAcvD,KAAK,CAACsL,IAAN,KAAe,eAAjC,EAAkD;YACrDxL,iBAAQC,SAAR,CAAkB;cAChBC,KAAK,EAAEC,kBAAUuM,oBADD;cAEhBhN,OAAO,EAAPA,OAFgB;cAGhB2C,IAAI,EAAE;gBACJyJ,SAAS,EAAEA,kBAAUK;cADjB;YAHU,CAAlB;UAOD;QACF,CAlCH;QAmCED,MAAM,EAAE,kBAAM,CAAE;MAnClB,CAtCS,EA2ET;QACE/M,EAAE,EAAE,WADN;QAEEiM,SAAS,EAAE,OAFb;QAGEE,OAAO,EAAE,iBAACpL,KAAD,EAAW;UAClB,IAAIA,KAAK,CAACqL,IAAN,KAAe,OAAf,IAA0BrL,KAAK,CAACsL,IAAN,KAAe,eAA7C,EAA8D;YAC5DC,sBAAQnJ,OAAR,CACE5C,OADF,EAEE;cACEgM,IAAI,EAAE,cADR;cAEEC,QAAQ,EAAE;YAFZ,CAFF,EAMEC,0BAAeY,4BANjB,EAOE;cACE9F,IAAI,EAAEoF,kBAAUM;YADlB,CAPF;;YAWApM,iBAAQC,SAAR,CAAkB;cAChBC,KAAK,EAAEC,kBAAUsM,qBADD;cAEhB/M,OAAO,EAAPA,OAFgB;cAGhB2C,IAAI,EAAE;gBACJyJ,SAAS,EAAEA,kBAAUM;cADjB;YAHU,CAAlB;UAOD,CAnBD,MAoBK,IAAIlM,KAAK,CAACuD,IAAN,IAAcvD,KAAK,CAACsL,IAAN,KAAe,eAAjC,EAAkD;YACrDxL,iBAAQC,SAAR,CAAkB;cAChBC,KAAK,EAAEC,kBAAUuM,oBADD;cAEhBhN,OAAO,EAAPA,OAFgB;cAGhB2C,IAAI,EAAE;gBACJyJ,SAAS,EAAEA,kBAAUM;cADjB;YAHU,CAAlB;UAOD;QACF,CAjCH;QAkCEF,MAAM,EAAE,kBAAM,CAAE;MAlClB,CA3ES;IApHG,CAAhB;;IAsOAS,cAAUC,eAAV,CAA0BvL,OAA1B,EAAmCwL,iBAAMC,MAAzC,EAAiDpN,OAAjD;;IAEA2B,OAAO,CAACiG,MAAR,GAAiBuF,iBAAMC,MAAvB,CAzO0B,CA2O1B;;IACApN,OAAO,CAACuL,aAAR,GAAwB,IAAI8B,cAAJ,CAAgBrN,OAAO,CAACsN,KAAxB,EAA+BtN,OAAO,CAAC2B,OAAvC,EAAgDA,OAAhD,CAAxB;EACD;;EAED,OAAO3B,OAAO,CAACuL,aAAf;AACD,CAjPD;;AAmPA5M,WAAW,CAAC4O,kBAAZ,GAAiC,UAAC5E,UAAD,EAAgB;EAC/C,IAAM6E,UAAU,GAAG,oCAAnB;;EAEA,IAAI7E,UAAJ,EAAgB;IACd,IAAM8E,QAAQ,GAAG9E,UAAU,CAAC+E,WAAX,EAAjB;IACA,IAAOC,QAAP,GAAmBF,QAAnB,CAAOE,QAAP;;IAEAjJ,qBAAYC,MAAZ,CAAmBiJ,GAAnB,CAAuBJ,UAAvB,uBAAiDG,QAAjD;;IACAjJ,qBAAYC,MAAZ,CAAmBiJ,GAAnB,CAAuBJ,UAAvB,EAAmC,YAAnC,EAAiD,wBAAeC,QAAf,CAAjD;EACD;AACF,CAVD;;AAYA9O,WAAW,CAACkP,kBAAZ,GAAiC,UAACnF,UAAD,EAAgB;EAC/C,IAAM8E,UAAU,GAAG,oCAAnB;;EAEA,IAAI9E,UAAJ,EAAgB;IACd,IAAM+E,QAAQ,GAAG/E,UAAU,CAACgF,WAAX,EAAjB;IACA,IAAOC,QAAP,GAAmBF,QAAnB,CAAOE,QAAP;;IAEAjJ,qBAAYC,MAAZ,CAAmBiJ,GAAnB,CAAuBJ,UAAvB,uBAAiDG,QAAjD;;IACAjJ,qBAAYC,MAAZ,CAAmBiJ,GAAnB,CAAuBJ,UAAvB,EAAmC,YAAnC,EAAiD,wBAAeC,QAAf,CAAjD;EACD;AACF,CAVD;;AAYA9O,WAAW,CAACmP,mBAAZ,GAAkC,YAAkB;EAAA,IAAjBC,OAAiB,uEAAP,EAAO;EAClD,IAAMP,UAAU,GAAG,qCAAnB;EAEAO,OAAO,CAACrO,OAAR,CAAgB,UAACsO,MAAD,EAAY;IAC1BtJ,qBAAYC,MAAZ,CAAmBiJ,GAAnB,CAAuBJ,UAAvB,uBAAiDQ,MAAM,CAACL,QAAxD;;IACAjJ,qBAAYC,MAAZ,CAAmBiJ,GAAnB,CAAuBJ,UAAvB,EAAmC,UAAnC,EAA+C,wBAAeQ,MAAf,CAA/C;EACD,CAHD;AAID,CAPD;;AASArP,WAAW,CAACsP,gBAAZ,GAA+B,UAACjO,OAAD,EAAa;EAC1C,IAAIA,OAAO,CAACmE,YAAR,KAAyBC,sBAAWC,QAAxC,EAAkD;IAChD,OAAO,iBAAQpE,MAAR,CAAe,IAAIqE,kCAAJ,EAAf,CAAP;EACD;;EAED,IAAM4J,UAAU,GAAG;IACjBhP,QAAQ,EAAEc,OAAO,CAACd;EADD,CAAnB;EAIA,OAAOc,OAAO,CAACW,cAAR,CACJsN,gBADI,CACaC,UADb,EAEJnN,IAFI,CAEC,UAAClC,QAAD,EAAc;IAClB,IAAIA,QAAQ,IAAIA,QAAQ,CAACG,IAArB,IAA6BH,QAAQ,CAACG,IAAT,CAAcD,KAA/C,EAAsD;MACpDiB,OAAO,CAACuE,SAAR,CAAkBC,WAAlB,CAA8B3F,QAAQ,CAACG,IAAT,CAAcD,KAA5C;IACD;;IAED,OAAO,iBAAQmG,OAAR,EAAP;EACD,CARI,EASJnE,IATI,CASC;IAAA,OAAMpC,WAAW,CAACsE,OAAZ,CAAoBjD,OAApB,CAAN;EAAA,CATD,EAUJyE,KAVI,CAUE,UAACnD,GAAD,EAAS;IACdoD,qBAAYC,MAAZ,CAAmBC,KAAnB,4GAEI5E,OAAO,CAACP,EAFZ,sBAGc6B,GAHd;;IAMA,OAAO,iBAAQrB,MAAR,CAAeqB,GAAf,CAAP;EACD,CAlBI,CAAP;AAmBD,CA5BD;;eA8Be3C,W"}
|
|
1
|
+
{"version":3,"names":["MeetingUtil","parseLocusJoin","response","parsed","locus","body","mediaConnections","locusUrl","url","locusId","split","pop","selfId","self","id","forEach","mediaConnection","mediaId","remoteUpdateAudioVideo","audioMuted","videoMuted","meeting","reject","ParameterError","localMedias","Media","generateLocalMedias","Metrics","postEvent","event","eventType","MEDIA_REQUEST","meetingRequest","remoteAudioVideoToggle","deviceUrl","correlationId","then","MEDIA_RESPONSE","hasOwner","info","owner","isOwnerSelf","isPinOrGuest","err","errorCode","INTENT_TO_JOIN","includes","joinMeeting","options","LOCUS_JOIN_REQUEST","inviteeAddress","meetingJoinUrl","sipUri","meetingNumber","roapMessage","permissionToken","resourceId","moderator","pin","moveToResource","preferTranscoding","asResourceOccupant","res","LOCUS_JOIN_RESPONSE","data","trigger","LOCI_UPDATE","trackingId","headers","trackingid","cleanUp","statsAnalyzer","stopAnalyzer","closeLocalStream","closeLocalShare","closeRemoteTracks","closePeerConnections","unsetLocalVideoTrack","unsetLocalShareTrack","unsetRemoteTracks","unsetPeerConnections","cleanMQAInterval","reconnectionManager","roap","stop","roapSeq","disconnectPhoneAudio","phoneUrl","meetingState","FULL_STATE","INACTIVE","MeetingNotActiveError","locusInfo","onFullLocus","catch","LoggerProxy","logger","error","leaveMeeting","isUserInLeftState","UserNotJoinedError","defaultOptions","leaveOptions","resolve","moveMeeting","declineMeeting","reason","parsedLocus","state","_LEFT_","isUserInIdleState","_IDLE_","isUserInJoinedState","_JOINED_","isMediaEstablished","currentMediaStatus","audio","video","share","joinMeetingOptions","requiredCaptcha","CaptchaError","passwordStatus","PASSWORD_STATUS","REQUIRED","PasswordError","PIN_COLLECTED","setLocus","PIN_PROMPT","IntentToJoinError","JoinMeetingError","updateTransceiver","meetingOptions","type","sendTrack","receiveTrack","track","transceiver","peerConnection","previousMediaDirection","undefined","meetingId","remoteQualityLevel","mediaProperties","enableRtx","config","enableExtmap","sendRoapMediaRequest","sdp","e","sender","replaceTrack","validateOptions","sendVideo","sendAudio","sendShare","localStream","localShare","getTrack","videoTrack","audioTrack","stream","audioTracks","videoTracks","getAudioTracks","getVideoTracks","length","getModeratorFromLocusInfo","getPolicyFromLocusInfo","policy","getUserDisplayHintsFromLocusInfo","userDisplayHints","canUserLock","displayHints","DISPLAY_HINTS","LOCK_CONTROL_LOCK","LOCK_STATUS_UNLOCKED","canUserUnlock","LOCK_CONTROL_UNLOCK","LOCK_STATUS_LOCKED","canUserRecord","RECORDING_CONTROL_START","canUserPause","RECORDING_CONTROL_PAUSE","canUserResume","RECORDING_CONTROL_RESUME","canUserStop","RECORDING_CONTROL_STOP","startRecording","request","recordMeeting","recording","paused","PermissionError","pauseRecording","resumeRecording","stopRecording","canUserRaiseHand","RAISE_HAND","canUserLowerAllHands","LOWER_ALL_HANDS","lockMeeting","actions","canLock","lock","unlockMeeting","canUnlock","startInternalStats","internalStats","useConfig","senders","correlate","history","onEvent","kind","stat","Trigger","file","function","EVENT_TRIGGERS","MEETING_MEDIA_LOCAL_STARTED","mediaType","AUDIO","SENDING_MEDIA_START","SENDING_MEDIA_STOP","onData","VIDEO","SHARE","SENDING_SHARE_START","SENDING_SHARE_STOP","receivers","MEETING_MEDIA_REMOTE_STARTED","RECEIVING_MEDIA_START","RECEIVING_MEDIA_STOP","StatsUtil","generateOptions","STATS","CONFIG","WebRTCStats","attrs","handleAudioLogging","LOG_HEADER","settings","getSettings","deviceId","log","handleVideoLogging","handleDeviceLogging","devices","device","endMeetingForAll","endOptions"],"sources":["util.js"],"sourcesContent":["import {isEmpty} from 'lodash';\n\nimport {MeetingNotActiveError, UserNotJoinedError} from '../common/errors/webex-errors';\nimport StatsUtil from '../stats/util';\nimport Metrics from '../metrics';\nimport {eventType, trigger, mediaType} from '../metrics/config';\nimport Media from '../media';\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport WebRTCStats from '../stats/index';\nimport {INTENT_TO_JOIN,\n _LEFT_,\n _IDLE_,\n _JOINED_,\n STATS,\n EVENT_TRIGGERS,\n PASSWORD_STATUS,\n DISPLAY_HINTS,\n FULL_STATE} from '../constants';\nimport Trigger from '../common/events/trigger-proxy';\nimport IntentToJoinError from '../common/errors/intent-to-join';\nimport JoinMeetingError from '../common/errors/join-meeting';\nimport ParameterError from '../common/errors/parameter';\nimport PermissionError from '../common/errors/permission';\nimport PasswordError from '../common/errors/password-error';\nimport CaptchaError from '../common/errors/captcha-error';\n\nconst MeetingUtil = {};\n\nMeetingUtil.parseLocusJoin = (response) => {\n const parsed = {};\n\n // First todo: add check for existance\n parsed.locus = response.body.locus;\n parsed.mediaConnections = response.body.mediaConnections;\n parsed.locusUrl = parsed.locus.url;\n parsed.locusId = parsed.locus.url.split('/').pop();\n parsed.selfId = parsed.locus.self.id;\n\n // we need mediaId before making roap calls\n parsed.mediaConnections.forEach((mediaConnection) => {\n if (mediaConnection.mediaId) {\n parsed.mediaId = mediaConnection.mediaId;\n }\n });\n\n return parsed;\n};\n\nMeetingUtil.remoteUpdateAudioVideo = (audioMuted, videoMuted, meeting) => {\n if (!meeting) {\n return Promise.reject(new ParameterError('You need a meeting object.'));\n }\n const localMedias = Media.generateLocalMedias(meeting.mediaId, audioMuted, videoMuted);\n\n if (isEmpty(localMedias)) {\n return Promise.reject(new ParameterError('You need a media id on the meeting to change remote audio.'));\n }\n\n Metrics.postEvent({event: eventType.MEDIA_REQUEST, meeting});\n\n return meeting.meetingRequest.remoteAudioVideoToggle({\n locusUrl: meeting.locusUrl,\n selfId: meeting.selfId,\n localMedias,\n deviceUrl: meeting.deviceUrl,\n correlationId: meeting.correlationId\n }).then((response) => {\n Metrics.postEvent({event: eventType.MEDIA_RESPONSE, meeting});\n\n return response.body.locus;\n });\n};\n\nMeetingUtil.hasOwner = (info) => info && info.owner;\n\nMeetingUtil.isOwnerSelf = (owner, selfId) => owner === selfId;\n\nMeetingUtil.isPinOrGuest = (err) => err?.body?.errorCode && INTENT_TO_JOIN.includes(err.body.errorCode);\n\nMeetingUtil.joinMeeting = (meeting, options) => {\n if (!meeting) {\n return Promise.reject(new ParameterError('You need a meeting object.'));\n }\n\n Metrics.postEvent({event: eventType.LOCUS_JOIN_REQUEST, meeting});\n\n // eslint-disable-next-line no-warning-comments\n // TODO: check if the meeting is in JOINING state\n // if Joining state termintate the request as user might click multiple times\n return meeting.meetingRequest\n .joinMeeting({\n inviteeAddress: meeting.meetingJoinUrl || meeting.sipUri,\n meetingNumber: meeting.meetingNumber,\n deviceUrl: meeting.deviceUrl,\n locusUrl: meeting.locusUrl,\n correlationId: meeting.correlationId,\n roapMessage: options.roapMessage,\n permissionToken: meeting.permissionToken,\n resourceId: options.resourceId || null,\n moderator: options.moderator,\n pin: options.pin,\n moveToResource: options.moveToResource,\n preferTranscoding: options.preferTranscoding,\n asResourceOccupant: options.asResourceOccupant\n })\n .then((res) => {\n Metrics.postEvent({\n event: eventType.LOCUS_JOIN_RESPONSE,\n meeting,\n data: {\n trigger: trigger.LOCI_UPDATE,\n locus: res.body.locus,\n mediaConnections: res.body.mediaConnections,\n trackingId: res.headers.trackingid\n }\n });\n\n return MeetingUtil.parseLocusJoin(res);\n });\n};\n\nMeetingUtil.cleanUp = (meeting) => {\n // make sure we send last metrics before we close the peerconnection\n if (meeting.statsAnalyzer) meeting.statsAnalyzer.stopAnalyzer();\n\n return meeting.closeLocalStream()\n .then(() => meeting.closeLocalShare())\n .then(() => meeting.closeRemoteTracks())\n .then(() => meeting.closePeerConnections())\n .then(() => {\n meeting.unsetLocalVideoTrack();\n meeting.unsetLocalShareTrack();\n meeting.unsetRemoteTracks();\n meeting.unsetPeerConnections();\n meeting.cleanMQAInterval();\n meeting.reconnectionManager.cleanUp();\n })\n .then(() => meeting.roap.stop(meeting.correlationId, meeting.roapSeq));\n};\n\nMeetingUtil.disconnectPhoneAudio = (meeting, phoneUrl) => {\n if (meeting.meetingState === FULL_STATE.INACTIVE) {\n return Promise.reject(new MeetingNotActiveError());\n }\n\n const options = {\n locusUrl: meeting.locusUrl,\n selfId: meeting.selfId,\n correlationId: meeting.correlationId,\n phoneUrl\n };\n\n return meeting.meetingRequest\n .disconnectPhoneAudio(options)\n .then((response) => {\n if (response?.body?.locus) {\n meeting.locusInfo.onFullLocus(response.body.locus);\n }\n })\n .catch((err) => {\n LoggerProxy.logger.error(\n `Meeting:util#disconnectPhoneAudio --> An error occured while disconnecting phone audio in meeting ${\n meeting.id\n }, error: ${err}`\n );\n\n return Promise.reject(err);\n });\n};\n\n// by default will leave on meeting's resourceId\n// if you explicity want it not to leave on resource id, pass\n// {resourceId: null}\n// TODO: chris, you can modify this however you want\nMeetingUtil.leaveMeeting = (meeting, options = {}) => {\n if (meeting.meetingState === FULL_STATE.INACTIVE) {\n // TODO: clean up if the meeting is already inactive\n return Promise.reject(new MeetingNotActiveError());\n }\n\n if (MeetingUtil.isUserInLeftState(meeting.locusInfo)) {\n return Promise.reject(new UserNotJoinedError());\n }\n\n const defaultOptions = {\n locusUrl: meeting.locusUrl,\n selfId: meeting.selfId,\n correlationId: meeting.correlationId,\n resourceId: meeting.resourceId,\n deviceUrl: meeting.deviceUrl\n };\n\n const leaveOptions = {...defaultOptions, ...options};\n\n return meeting.meetingRequest\n .leaveMeeting(leaveOptions)\n .then((response) => {\n if (response && response.body && response.body.locus) { // && !options.moveMeeting) {\n meeting.locusInfo.onFullLocus(response.body.locus);\n }\n\n return Promise.resolve();\n })\n .then(() => {\n if (options.moveMeeting) {\n return Promise.resolve();\n }\n\n return MeetingUtil.cleanUp(meeting);\n })\n .catch((err) => {\n // TODO: If the meeting state comes as LEFT or INACTIVE as response then\n // 1) on leave clean up the meeting or simply do a sync on the meeting\n // 2) If the error says meeting is inactive then destroy the meeting object\n LoggerProxy.logger.error(\n `Meeting:util#leaveMeeting --> An error occured while trying to leave meeting with an id of ${\n meeting.id\n }, error: ${err}`\n );\n\n return Promise.reject(err);\n });\n};\nMeetingUtil.declineMeeting = (meeting, reason) =>\n meeting.meetingRequest.declineMeeting({\n locusUrl: meeting.locusUrl,\n deviceUrl: meeting.deviceUrl,\n reason\n });\n\nMeetingUtil.isUserInLeftState = (locusInfo) =>\n locusInfo.parsedLocus?.self?.state === _LEFT_;\n\nMeetingUtil.isUserInIdleState = (locusInfo) =>\n locusInfo.parsedLocus?.self?.state === _IDLE_;\n\nMeetingUtil.isUserInJoinedState = (locusInfo) =>\n locusInfo.parsedLocus?.self?.state === _JOINED_;\n\nMeetingUtil.isMediaEstablished = (currentMediaStatus) =>\n currentMediaStatus && (currentMediaStatus.audio || currentMediaStatus.video || currentMediaStatus.share);\n\n\nMeetingUtil.joinMeetingOptions = (meeting, options = {}) => {\n meeting.resourceId = meeting.resourceId || options.resourceId;\n\n if (meeting.requiredCaptcha) {\n return Promise.reject(new CaptchaError());\n }\n if (meeting.passwordStatus === PASSWORD_STATUS.REQUIRED) {\n return Promise.reject(new PasswordError());\n }\n\n if (options.pin) {\n Metrics.postEvent({\n event: eventType.PIN_COLLECTED,\n meeting\n });\n }\n\n // normal join meeting, scenario A, D\n return MeetingUtil.joinMeeting(meeting, options)\n .then((response) => {\n meeting.setLocus(response);\n\n return Promise.resolve(response);\n })\n .catch((err) => {\n // joining a claimed PMR that is not my own, scenario B\n if (MeetingUtil.isPinOrGuest(err)) {\n Metrics.postEvent({\n event: eventType.PIN_PROMPT,\n meeting\n });\n\n // request host pin or non host for unclaimed PMR, start of Scenario C\n // see https://sqbu-github.cisco.com/WebExSquared/locus/wiki/Locus-Lobby-and--IVR-Feature\n return Promise.reject(new IntentToJoinError('Error Joining Meeting', err));\n }\n LoggerProxy.logger.error('Meeting:util#joinMeetingOptions --> Error joining the call, ', err);\n\n return Promise.reject(new JoinMeetingError(options, 'Error Joining Meeting', err));\n });\n};\n\nMeetingUtil.updateTransceiver = (options, meetingOptions) => {\n const {\n type,\n sendTrack,\n receiveTrack,\n track,\n transceiver,\n peerConnection,\n previousMediaDirection\n } = options;\n\n if ((sendTrack !== undefined && sendTrack !== previousMediaDirection.sendTrack) ||\n (receiveTrack !== undefined && receiveTrack !== previousMediaDirection.receiveTrack)) {\n return Media.updateTransceiver({\n meetingId: meetingOptions.meeting.id,\n remoteQualityLevel: meetingOptions.mediaProperties.remoteQualityLevel,\n enableRtx: meetingOptions.meeting.config.enableRtx,\n enableExtmap: meetingOptions.meeting.config.enableExtmap\n }, peerConnection, transceiver,\n {\n track,\n type,\n receiveTrack,\n sendTrack\n })\n .then(() => meetingOptions.meeting.roap\n .sendRoapMediaRequest({\n sdp: meetingOptions.mediaProperties.peerConnection.sdp,\n roapSeq: meetingOptions.meeting.roapSeq,\n meeting: meetingOptions.meeting // or can pass meeting ID\n }))\n .catch((e) => {\n LoggerProxy.logger.error(`Meeting:util#updateTransceiver --> Error updating the ${type} streams with error: ${e}`);\n });\n } if (track) {\n transceiver.sender.replaceTrack(track);\n\n return Promise.resolve();\n }\n\n return Promise.reject(new ParameterError('update Failed: please pass valid parameter'));\n};\n\nMeetingUtil.validateOptions = (options) => {\n const {\n sendVideo, sendAudio, sendShare, localStream, localShare\n } = options;\n\n if (sendVideo && !MeetingUtil.getTrack(localStream).videoTrack) {\n return Promise.reject(new ParameterError('please pass valid video streams'));\n }\n\n if (sendAudio && !MeetingUtil.getTrack(localStream).audioTrack) {\n return Promise.reject(new ParameterError('please pass valid audio streams'));\n }\n\n if (sendShare && !MeetingUtil.getTrack(localShare).videoTrack) {\n return Promise.reject(new ParameterError('please pass valid share streams'));\n }\n\n return Promise.resolve();\n};\n\nMeetingUtil.getTrack = (stream) => {\n let audioTrack = null;\n let videoTrack = null;\n let audioTracks = null;\n let videoTracks = null;\n\n if (!stream) {\n return {audioTrack: null, videoTrack: null};\n }\n if (stream.getAudioTracks) {\n audioTracks = stream.getAudioTracks();\n }\n if (stream.getVideoTracks) {\n videoTracks = stream.getVideoTracks();\n }\n\n if (audioTracks && audioTracks.length > 0) {\n [audioTrack] = audioTracks;\n }\n\n if (videoTracks && videoTracks.length > 0) {\n [videoTrack] = videoTracks;\n }\n\n return {audioTrack, videoTrack};\n};\n\nMeetingUtil.getModeratorFromLocusInfo = (locusInfo) =>\n locusInfo &&\n locusInfo.parsedLocus &&\n locusInfo.parsedLocus.info &&\n locusInfo.parsedLocus.info &&\n locusInfo.parsedLocus.info.moderator;\n\nMeetingUtil.getPolicyFromLocusInfo = (locusInfo) =>\n locusInfo &&\n locusInfo.parsedLocus &&\n locusInfo.parsedLocus.info &&\n locusInfo.parsedLocus.info &&\n locusInfo.parsedLocus.info.policy;\n\nMeetingUtil.getUserDisplayHintsFromLocusInfo = (locusInfo) => locusInfo?.parsedLocus?.info?.userDisplayHints || [];\n\nMeetingUtil.canUserLock = (displayHints) => displayHints.includes(DISPLAY_HINTS.LOCK_CONTROL_LOCK) && displayHints.includes(DISPLAY_HINTS.LOCK_STATUS_UNLOCKED);\n\nMeetingUtil.canUserUnlock = (displayHints) => displayHints.includes(DISPLAY_HINTS.LOCK_CONTROL_UNLOCK) && displayHints.includes(DISPLAY_HINTS.LOCK_STATUS_LOCKED);\n\nMeetingUtil.canUserRecord = (displayHints) => displayHints.includes(DISPLAY_HINTS.RECORDING_CONTROL_START);\n\nMeetingUtil.canUserPause = (displayHints) => displayHints.includes(DISPLAY_HINTS.RECORDING_CONTROL_PAUSE);\n\nMeetingUtil.canUserResume = (displayHints) => displayHints.includes(DISPLAY_HINTS.RECORDING_CONTROL_RESUME);\n\nMeetingUtil.canUserStop = (displayHints) => displayHints.includes(DISPLAY_HINTS.RECORDING_CONTROL_STOP);\n\nMeetingUtil.startRecording = (request, locusUrl, locusInfo) => {\n const displayHints = MeetingUtil.getUserDisplayHintsFromLocusInfo(locusInfo);\n\n if (MeetingUtil.canUserRecord(displayHints)) {\n return request.recordMeeting({locusUrl, recording: true, paused: false});\n }\n\n return Promise.reject(new PermissionError('Start recording not allowed, due to moderator property.'));\n};\n\nMeetingUtil.pauseRecording = (request, locusUrl, locusInfo) => {\n const displayHints = MeetingUtil.getUserDisplayHintsFromLocusInfo(locusInfo);\n\n if (MeetingUtil.canUserPause(displayHints)) {\n return request.recordMeeting({locusUrl, recording: true, paused: true});\n }\n\n return Promise.reject(new PermissionError('Pause recording not allowed, due to moderator property.'));\n};\n\nMeetingUtil.resumeRecording = (request, locusUrl, locusInfo) => {\n const displayHints = MeetingUtil.getUserDisplayHintsFromLocusInfo(locusInfo);\n\n if (MeetingUtil.canUserResume(displayHints)) {\n return request.recordMeeting({locusUrl, recording: true, paused: false});\n }\n\n return Promise.reject(new PermissionError('Resume recording not allowed, due to moderator property.'));\n};\n\nMeetingUtil.stopRecording = (request, locusUrl, locusInfo) => {\n const displayHints = MeetingUtil.getUserDisplayHintsFromLocusInfo(locusInfo);\n\n if (MeetingUtil.canUserStop(displayHints)) {\n return request.recordMeeting({locusUrl, recording: false, paused: false});\n }\n\n return Promise.reject(new PermissionError('Stop recording not allowed, due to moderator property.'));\n};\n\nMeetingUtil.canUserRaiseHand = (displayHints) => displayHints.includes(DISPLAY_HINTS.RAISE_HAND);\n\nMeetingUtil.canUserLowerAllHands = (displayHints) => displayHints.includes(DISPLAY_HINTS.LOWER_ALL_HANDS);\n\nMeetingUtil.lockMeeting = (actions, request, locusUrl) => {\n if (actions && actions.canLock) {\n return request.lockMeeting({locusUrl, lock: true});\n }\n\n return Promise.reject(new PermissionError('Lock not allowed, due to joined property.'));\n};\n\nMeetingUtil.unlockMeeting = (actions, request, locusUrl) => {\n if (actions && actions.canUnlock) {\n return request.lockMeeting({locusUrl, lock: false});\n }\n\n return Promise.reject(new PermissionError('Unlock not allowed, due to joined property.'));\n};\n\nMeetingUtil.startInternalStats = (meeting) => {\n if (!meeting.internalStats) {\n const options = {\n useConfig: true,\n senders: [\n {\n id: 'mainAudio',\n correlate: 'audio',\n history: true,\n onEvent: (event) => {\n // TODO: we don't need checks like this since it comes from the transceiver\n // refactor event linkage to use callbacks instead of events\n if (event.kind === 'audio' && event.stat === 'bytesSent') {\n Trigger.trigger(\n meeting,\n {\n file: 'meeting/util',\n function: 'startInternalStats'\n },\n EVENT_TRIGGERS.MEETING_MEDIA_LOCAL_STARTED,\n {\n type: mediaType.AUDIO\n }\n );\n Metrics.postEvent({\n event: eventType.SENDING_MEDIA_START,\n meeting,\n data: {\n mediaType: mediaType.AUDIO\n }\n });\n }\n else if (event.stop && event.stat === 'bytesSent') {\n Metrics.postEvent({\n event: eventType.SENDING_MEDIA_STOP,\n meeting,\n data: {\n mediaType: mediaType.AUDIO\n }\n });\n }\n },\n onData: () => {}\n },\n {\n id: 'mainVideo',\n correlate: 'video',\n history: true,\n onEvent: (event) => {\n if (event.kind === 'video' && event.stat === 'bytesSent') {\n Trigger.trigger(\n meeting,\n {\n file: 'meeting/util',\n function: 'startInternalStats'\n },\n EVENT_TRIGGERS.MEETING_MEDIA_LOCAL_STARTED,\n {\n type: mediaType.VIDEO\n }\n );\n Metrics.postEvent({\n event: eventType.SENDING_MEDIA_START,\n meeting,\n data: {\n mediaType: mediaType.VIDEO\n }\n });\n }\n else if (event.stop && event.stat === 'bytesSent') {\n Metrics.postEvent({\n event: eventType.SENDING_MEDIA_STOP,\n meeting,\n data: {\n mediaType: mediaType.VIDEO\n }\n });\n }\n },\n onData: () => {}\n },\n {\n id: 'mainShare',\n correlate: 'video',\n onEvent: (event) => {\n if (event.kind === 'share' && event.stat === 'bytesSent') {\n Trigger.trigger(\n meeting,\n {\n file: 'meeting/util',\n function: 'startInternalStats'\n },\n EVENT_TRIGGERS.MEETING_MEDIA_LOCAL_STARTED,\n {\n type: mediaType.SHARE\n }\n );\n Metrics.postEvent({\n event: eventType.SENDING_SHARE_START,\n meeting,\n data: {\n mediaType: mediaType.SHARE\n }\n });\n }\n else if (event.stop && event.stat === 'bytesSent') {\n Metrics.postEvent({\n event: eventType.SENDING_SHARE_STOP,\n meeting,\n data: {\n mediaType: mediaType.SHARE\n }\n });\n }\n },\n onData: () => {}\n }\n ],\n receivers: [\n {\n id: 'mainAudio',\n correlate: 'audio',\n history: true,\n onEvent: (event) => {\n if (event.kind === 'audio' && event.stat === 'bytesReceived') {\n Trigger.trigger(\n meeting,\n {\n file: 'meeting/util',\n function: 'startInternalStats'\n },\n EVENT_TRIGGERS.MEETING_MEDIA_REMOTE_STARTED,\n {\n type: mediaType.AUDIO\n }\n );\n Metrics.postEvent({\n event: eventType.RECEIVING_MEDIA_START,\n meeting,\n data: {\n mediaType: mediaType.AUDIO\n }\n });\n }\n else if (event.stop && event.stat === 'bytesReceived') {\n Metrics.postEvent({\n event: eventType.RECEIVING_MEDIA_STOP,\n meeting,\n data: {\n mediaType: mediaType.AUDIO\n }\n });\n }\n },\n onData: () => {}\n },\n {\n id: 'mainVideo',\n correlate: 'video',\n history: true,\n onEvent: (event) => {\n if (event.kind === 'video' && event.stat === 'bytesReceived') {\n Trigger.trigger(\n meeting,\n {\n file: 'meeting/util',\n function: 'startInternalStats'\n },\n EVENT_TRIGGERS.MEETING_MEDIA_REMOTE_STARTED,\n {\n type: mediaType.VIDEO\n }\n );\n Metrics.postEvent({\n event: eventType.RECEIVING_MEDIA_START,\n meeting,\n data: {\n mediaType: mediaType.VIDEO\n }\n });\n }\n else if (event.stop && event.stat === 'bytesReceived') {\n Metrics.postEvent({\n event: eventType.RECEIVING_MEDIA_STOP,\n meeting,\n data: {\n mediaType: mediaType.VIDEO\n }\n });\n }\n },\n onData: () => {}\n },\n {\n id: 'mainShare',\n correlate: 'video',\n onEvent: (event) => {\n if (event.kind === 'share' && event.stat === 'bytesReceived') {\n Trigger.trigger(\n meeting,\n {\n file: 'meeting/util',\n function: 'startInternalStats'\n },\n EVENT_TRIGGERS.MEETING_MEDIA_REMOTE_STARTED,\n {\n type: mediaType.SHARE\n }\n );\n Metrics.postEvent({\n event: eventType.RECEIVING_MEDIA_START,\n meeting,\n data: {\n mediaType: mediaType.SHARE\n }\n });\n }\n else if (event.stop && event.stat === 'bytesReceived') {\n Metrics.postEvent({\n event: eventType.RECEIVING_MEDIA_STOP,\n meeting,\n data: {\n mediaType: mediaType.SHARE\n }\n });\n }\n },\n onData: () => {}\n }\n ]\n };\n\n StatsUtil.generateOptions(options, STATS.CONFIG, meeting);\n\n options.config = STATS.CONFIG;\n\n // pass the attrs and options for the webex instance\n meeting.internalStats = new WebRTCStats(meeting.attrs, meeting.options, options);\n }\n\n return meeting.internalStats;\n};\n\nMeetingUtil.handleAudioLogging = (audioTrack) => {\n const LOG_HEADER = 'MeetingUtil#handleAudioLogging -->';\n\n if (audioTrack) {\n const settings = audioTrack.getSettings();\n const {deviceId} = settings;\n\n LoggerProxy.logger.log(LOG_HEADER, `deviceId = ${deviceId}`);\n LoggerProxy.logger.log(LOG_HEADER, 'settings =', JSON.stringify(settings));\n }\n};\n\nMeetingUtil.handleVideoLogging = (videoTrack) => {\n const LOG_HEADER = 'MeetingUtil#handleVideoLogging -->';\n\n if (videoTrack) {\n const settings = videoTrack.getSettings();\n const {deviceId} = settings;\n\n LoggerProxy.logger.log(LOG_HEADER, `deviceId = ${deviceId}`);\n LoggerProxy.logger.log(LOG_HEADER, 'settings =', JSON.stringify(settings));\n }\n};\n\nMeetingUtil.handleDeviceLogging = (devices = []) => {\n const LOG_HEADER = 'MeetingUtil#handleDeviceLogging -->';\n\n devices.forEach((device) => {\n LoggerProxy.logger.log(LOG_HEADER, `deviceId = ${device.deviceId}`);\n LoggerProxy.logger.log(LOG_HEADER, 'settings', JSON.stringify(device));\n });\n};\n\nMeetingUtil.endMeetingForAll = (meeting) => {\n if (meeting.meetingState === FULL_STATE.INACTIVE) {\n return Promise.reject(new MeetingNotActiveError());\n }\n\n const endOptions = {\n locusUrl: meeting.locusUrl,\n };\n\n return meeting.meetingRequest\n .endMeetingForAll(endOptions)\n .then((response) => {\n if (response && response.body && response.body.locus) {\n meeting.locusInfo.onFullLocus(response.body.locus);\n }\n\n return Promise.resolve();\n })\n .then(() => MeetingUtil.cleanUp(meeting))\n .catch((err) => {\n LoggerProxy.logger.error(\n `Meeting:util#endMeetingForAll An error occured while trying to end meeting for all with an id of ${\n meeting.id\n }, error: ${err}`\n );\n\n return Promise.reject(err);\n });\n};\n\nexport default MeetingUtil;\n"],"mappings":"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"}
|
|
@@ -46,7 +46,11 @@ var BEHAVIORAL_METRICS = {
|
|
|
46
46
|
PEERCONNECTION_FAILURE: 'js_sdk_peerConnection_failures',
|
|
47
47
|
INVALID_ICE_CANDIDATE: 'js_sdk_invalid_ice_candidate',
|
|
48
48
|
UPLOAD_LOGS_FAILURE: 'js_sdk_upload_logs_failure',
|
|
49
|
-
RECEIVE_TRANSCRIPTION_FAILURE: 'js_sdk_receive_transcription_failure'
|
|
49
|
+
RECEIVE_TRANSCRIPTION_FAILURE: 'js_sdk_receive_transcription_failure',
|
|
50
|
+
ENABLE_BNR_SUCCESS: 'js_sdk_enable_bnr_success',
|
|
51
|
+
ENABLE_BNR_FAILURE: 'js_sdk_enable_bnr_failure',
|
|
52
|
+
DISABLE_BNR_SUCCESS: 'js_sdk_disable_bnr_success',
|
|
53
|
+
DISABLE_BNR_FAILURE: 'js_sdk_disable_bnr_failure'
|
|
50
54
|
};
|
|
51
55
|
exports.default = BEHAVIORAL_METRICS;
|
|
52
56
|
//# sourceMappingURL=constants.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["BEHAVIORAL_METRICS","MEETINGS_REGISTRATION_FAILED","MEETINGS_REGISTRATION_SUCCESS","MERCURY_CONNECTION_FAILURE","MERCURY_CONNECTION_RESTORED","JOIN_SUCCESS","JOIN_FAILURE","ADD_MEDIA_SUCCESS","ADD_MEDIA_FAILURE","CONNECTION_SUCCESS","CONNECTION_FAILURE","MEETING_LEAVE_FAILURE","MEETING_END_ALL_FAILURE","MEETING_END_ALL_INITIATED","GET_USER_MEDIA_FAILURE","GET_DISPLAY_MEDIA_FAILURE","JOIN_WITH_MEDIA_FAILURE","DISCONNECT_DUE_TO_INACTIVITY","MEETING_MEDIA_INACTIVE","MEETING_RECONNECT_FAILURE","MEETING_MAX_REJOIN_FAILURE","MEETING_SHARE_FAILURE","MEETING_START_WHITEBOARD_SHARE_FAILURE","MEETING_STOP_WHITEBOARD_SHARE_FAILURE","MUTE_AUDIO_FAILURE","MUTE_VIDEO_FAILURE","SET_MEETING_QUALITY_FAILURE","STOP_FLOOR_REQUEST_FAILURE","ADD_DIAL_IN_FAILURE","ADD_DIAL_OUT_FAILURE","UPDATE_MEDIA_FAILURE","UNMUTE_AUDIO_FAILURE","UNMUTE_VIDEO_FAILURE","ROAP_ANSWER_FAILURE","ROAP_GLARE_CONDITION","PEERCONNECTION_FAILURE","INVALID_ICE_CANDIDATE","UPLOAD_LOGS_FAILURE","RECEIVE_TRANSCRIPTION_FAILURE"],"sources":["constants.js"],"sourcesContent":["\n// Metrics constants ----------------------------------------------------------\n\nconst BEHAVIORAL_METRICS = {\n MEETINGS_REGISTRATION_FAILED: 'js_sdk_meetings_registration_failed',\n MEETINGS_REGISTRATION_SUCCESS: 'js_sdk_meetings_registration_success',\n MERCURY_CONNECTION_FAILURE: 'js_sdk_mercury_connection_failure',\n MERCURY_CONNECTION_RESTORED: 'js_sdk_mercury_connection_restored',\n JOIN_SUCCESS: 'js_sdk_join_success',\n JOIN_FAILURE: 'js_sdk_join_failures',\n ADD_MEDIA_SUCCESS: 'js_sdk_add_media_success',\n ADD_MEDIA_FAILURE: 'js_sdk_add_media_failures',\n CONNECTION_SUCCESS: 'js_sdk_connection_success',\n CONNECTION_FAILURE: 'js_sdk_connection_failures',\n MEETING_LEAVE_FAILURE: 'js_sdk_meeting_leave_failure',\n MEETING_END_ALL_FAILURE: 'js_sdk_meeting_end_for_all_failure',\n MEETING_END_ALL_INITIATED: 'js_sdk_meeting_end_for_all_initiated',\n GET_USER_MEDIA_FAILURE: 'js_sdk_get_user_media_failures',\n GET_DISPLAY_MEDIA_FAILURE: 'js_sdk_get_display_media_failures',\n JOIN_WITH_MEDIA_FAILURE: 'js_sdk_join_with_media_failures',\n\n DISCONNECT_DUE_TO_INACTIVITY: 'js_sdk_disconnect_due_to_inactivity',\n MEETING_MEDIA_INACTIVE: 'js_sdk_meeting_media_inactive',\n MEETING_RECONNECT_FAILURE: 'js_sdk_meeting_reconnect_failures',\n MEETING_MAX_REJOIN_FAILURE: 'js_sdk_meeting_max_rejoin_failure',\n MEETING_SHARE_FAILURE: 'js_sdk_meeting_share_failures',\n MEETING_START_WHITEBOARD_SHARE_FAILURE: 'js_sdk_meeting_start_whiteboard_share_failures',\n MEETING_STOP_WHITEBOARD_SHARE_FAILURE: 'js_sdk_meeting_stop_whiteboard_share_failures',\n MUTE_AUDIO_FAILURE: 'js_sdk_mute_audio_failures',\n MUTE_VIDEO_FAILURE: 'js_sdk_mute_video_failures',\n SET_MEETING_QUALITY_FAILURE: 'js_sdk_set_meeting_quality_failures',\n STOP_FLOOR_REQUEST_FAILURE: 'js_sdk_stop_floor_request_failures',\n ADD_DIAL_IN_FAILURE: 'js_sdk_add_dial_in_failure',\n ADD_DIAL_OUT_FAILURE: 'js_sdk_add_dial_out_failure',\n UPDATE_MEDIA_FAILURE: 'js_sdk_update_media_failures',\n UNMUTE_AUDIO_FAILURE: 'js_sdk_unmute_audio_failures',\n UNMUTE_VIDEO_FAILURE: 'js_sdk_unmute_video_failures',\n ROAP_ANSWER_FAILURE: 'js_sdk_roap_answer_failures',\n ROAP_GLARE_CONDITION: 'js_sdk_roap_glar_condition',\n PEERCONNECTION_FAILURE: 'js_sdk_peerConnection_failures',\n INVALID_ICE_CANDIDATE: 'js_sdk_invalid_ice_candidate',\n UPLOAD_LOGS_FAILURE: 'js_sdk_upload_logs_failure',\n RECEIVE_TRANSCRIPTION_FAILURE: 'js_sdk_receive_transcription_failure'\n};\n\n\nexport {BEHAVIORAL_METRICS as default};\n"],"mappings":";;;;;;;;;AACA;AAEA,IAAMA,kBAAkB,GAAG;EACzBC,4BAA4B,EAAE,qCADL;EAEzBC,6BAA6B,EAAE,sCAFN;EAGzBC,0BAA0B,EAAE,mCAHH;EAIzBC,2BAA2B,EAAE,oCAJJ;EAKzBC,YAAY,EAAE,qBALW;EAMzBC,YAAY,EAAE,sBANW;EAOzBC,iBAAiB,EAAE,0BAPM;EAQzBC,iBAAiB,EAAE,2BARM;EASzBC,kBAAkB,EAAE,2BATK;EAUzBC,kBAAkB,EAAE,4BAVK;EAWzBC,qBAAqB,EAAE,8BAXE;EAYzBC,uBAAuB,EAAE,oCAZA;EAazBC,yBAAyB,EAAE,sCAbF;EAczBC,sBAAsB,EAAE,gCAdC;EAezBC,yBAAyB,EAAE,mCAfF;EAgBzBC,uBAAuB,EAAE,iCAhBA;EAkBzBC,4BAA4B,EAAE,qCAlBL;EAmBzBC,sBAAsB,EAAE,+BAnBC;EAoBzBC,yBAAyB,EAAE,mCApBF;EAqBzBC,0BAA0B,EAAE,mCArBH;EAsBzBC,qBAAqB,EAAE,+BAtBE;EAuBzBC,sCAAsC,EAAE,gDAvBf;EAwBzBC,qCAAqC,EAAE,+CAxBd;EAyBzBC,kBAAkB,EAAE,4BAzBK;EA0BzBC,kBAAkB,EAAE,4BA1BK;EA2BzBC,2BAA2B,EAAE,qCA3BJ;EA4BzBC,0BAA0B,EAAE,oCA5BH;EA6BzBC,mBAAmB,EAAE,4BA7BI;EA8BzBC,oBAAoB,EAAE,6BA9BG;EA+BzBC,oBAAoB,EAAE,8BA/BG;EAgCzBC,oBAAoB,EAAE,8BAhCG;EAiCzBC,oBAAoB,EAAE,8BAjCG;EAkCzBC,mBAAmB,EAAE,6BAlCI;EAmCzBC,oBAAoB,EAAE,4BAnCG;EAoCzBC,sBAAsB,EAAE,gCApCC;EAqCzBC,qBAAqB,EAAE,8BArCE;EAsCzBC,mBAAmB,EAAE,4BAtCI;EAuCzBC,6BAA6B,EAAE;
|
|
1
|
+
{"version":3,"names":["BEHAVIORAL_METRICS","MEETINGS_REGISTRATION_FAILED","MEETINGS_REGISTRATION_SUCCESS","MERCURY_CONNECTION_FAILURE","MERCURY_CONNECTION_RESTORED","JOIN_SUCCESS","JOIN_FAILURE","ADD_MEDIA_SUCCESS","ADD_MEDIA_FAILURE","CONNECTION_SUCCESS","CONNECTION_FAILURE","MEETING_LEAVE_FAILURE","MEETING_END_ALL_FAILURE","MEETING_END_ALL_INITIATED","GET_USER_MEDIA_FAILURE","GET_DISPLAY_MEDIA_FAILURE","JOIN_WITH_MEDIA_FAILURE","DISCONNECT_DUE_TO_INACTIVITY","MEETING_MEDIA_INACTIVE","MEETING_RECONNECT_FAILURE","MEETING_MAX_REJOIN_FAILURE","MEETING_SHARE_FAILURE","MEETING_START_WHITEBOARD_SHARE_FAILURE","MEETING_STOP_WHITEBOARD_SHARE_FAILURE","MUTE_AUDIO_FAILURE","MUTE_VIDEO_FAILURE","SET_MEETING_QUALITY_FAILURE","STOP_FLOOR_REQUEST_FAILURE","ADD_DIAL_IN_FAILURE","ADD_DIAL_OUT_FAILURE","UPDATE_MEDIA_FAILURE","UNMUTE_AUDIO_FAILURE","UNMUTE_VIDEO_FAILURE","ROAP_ANSWER_FAILURE","ROAP_GLARE_CONDITION","PEERCONNECTION_FAILURE","INVALID_ICE_CANDIDATE","UPLOAD_LOGS_FAILURE","RECEIVE_TRANSCRIPTION_FAILURE","ENABLE_BNR_SUCCESS","ENABLE_BNR_FAILURE","DISABLE_BNR_SUCCESS","DISABLE_BNR_FAILURE"],"sources":["constants.js"],"sourcesContent":["\n// Metrics constants ----------------------------------------------------------\n\nconst BEHAVIORAL_METRICS = {\n MEETINGS_REGISTRATION_FAILED: 'js_sdk_meetings_registration_failed',\n MEETINGS_REGISTRATION_SUCCESS: 'js_sdk_meetings_registration_success',\n MERCURY_CONNECTION_FAILURE: 'js_sdk_mercury_connection_failure',\n MERCURY_CONNECTION_RESTORED: 'js_sdk_mercury_connection_restored',\n JOIN_SUCCESS: 'js_sdk_join_success',\n JOIN_FAILURE: 'js_sdk_join_failures',\n ADD_MEDIA_SUCCESS: 'js_sdk_add_media_success',\n ADD_MEDIA_FAILURE: 'js_sdk_add_media_failures',\n CONNECTION_SUCCESS: 'js_sdk_connection_success',\n CONNECTION_FAILURE: 'js_sdk_connection_failures',\n MEETING_LEAVE_FAILURE: 'js_sdk_meeting_leave_failure',\n MEETING_END_ALL_FAILURE: 'js_sdk_meeting_end_for_all_failure',\n MEETING_END_ALL_INITIATED: 'js_sdk_meeting_end_for_all_initiated',\n GET_USER_MEDIA_FAILURE: 'js_sdk_get_user_media_failures',\n GET_DISPLAY_MEDIA_FAILURE: 'js_sdk_get_display_media_failures',\n JOIN_WITH_MEDIA_FAILURE: 'js_sdk_join_with_media_failures',\n\n DISCONNECT_DUE_TO_INACTIVITY: 'js_sdk_disconnect_due_to_inactivity',\n MEETING_MEDIA_INACTIVE: 'js_sdk_meeting_media_inactive',\n MEETING_RECONNECT_FAILURE: 'js_sdk_meeting_reconnect_failures',\n MEETING_MAX_REJOIN_FAILURE: 'js_sdk_meeting_max_rejoin_failure',\n MEETING_SHARE_FAILURE: 'js_sdk_meeting_share_failures',\n MEETING_START_WHITEBOARD_SHARE_FAILURE: 'js_sdk_meeting_start_whiteboard_share_failures',\n MEETING_STOP_WHITEBOARD_SHARE_FAILURE: 'js_sdk_meeting_stop_whiteboard_share_failures',\n MUTE_AUDIO_FAILURE: 'js_sdk_mute_audio_failures',\n MUTE_VIDEO_FAILURE: 'js_sdk_mute_video_failures',\n SET_MEETING_QUALITY_FAILURE: 'js_sdk_set_meeting_quality_failures',\n STOP_FLOOR_REQUEST_FAILURE: 'js_sdk_stop_floor_request_failures',\n ADD_DIAL_IN_FAILURE: 'js_sdk_add_dial_in_failure',\n ADD_DIAL_OUT_FAILURE: 'js_sdk_add_dial_out_failure',\n UPDATE_MEDIA_FAILURE: 'js_sdk_update_media_failures',\n UNMUTE_AUDIO_FAILURE: 'js_sdk_unmute_audio_failures',\n UNMUTE_VIDEO_FAILURE: 'js_sdk_unmute_video_failures',\n ROAP_ANSWER_FAILURE: 'js_sdk_roap_answer_failures',\n ROAP_GLARE_CONDITION: 'js_sdk_roap_glar_condition',\n PEERCONNECTION_FAILURE: 'js_sdk_peerConnection_failures',\n INVALID_ICE_CANDIDATE: 'js_sdk_invalid_ice_candidate',\n UPLOAD_LOGS_FAILURE: 'js_sdk_upload_logs_failure',\n RECEIVE_TRANSCRIPTION_FAILURE: 'js_sdk_receive_transcription_failure',\n ENABLE_BNR_SUCCESS: 'js_sdk_enable_bnr_success',\n ENABLE_BNR_FAILURE: 'js_sdk_enable_bnr_failure',\n DISABLE_BNR_SUCCESS: 'js_sdk_disable_bnr_success',\n DISABLE_BNR_FAILURE: 'js_sdk_disable_bnr_failure'\n};\n\n\nexport {BEHAVIORAL_METRICS as default};\n"],"mappings":";;;;;;;;;AACA;AAEA,IAAMA,kBAAkB,GAAG;EACzBC,4BAA4B,EAAE,qCADL;EAEzBC,6BAA6B,EAAE,sCAFN;EAGzBC,0BAA0B,EAAE,mCAHH;EAIzBC,2BAA2B,EAAE,oCAJJ;EAKzBC,YAAY,EAAE,qBALW;EAMzBC,YAAY,EAAE,sBANW;EAOzBC,iBAAiB,EAAE,0BAPM;EAQzBC,iBAAiB,EAAE,2BARM;EASzBC,kBAAkB,EAAE,2BATK;EAUzBC,kBAAkB,EAAE,4BAVK;EAWzBC,qBAAqB,EAAE,8BAXE;EAYzBC,uBAAuB,EAAE,oCAZA;EAazBC,yBAAyB,EAAE,sCAbF;EAczBC,sBAAsB,EAAE,gCAdC;EAezBC,yBAAyB,EAAE,mCAfF;EAgBzBC,uBAAuB,EAAE,iCAhBA;EAkBzBC,4BAA4B,EAAE,qCAlBL;EAmBzBC,sBAAsB,EAAE,+BAnBC;EAoBzBC,yBAAyB,EAAE,mCApBF;EAqBzBC,0BAA0B,EAAE,mCArBH;EAsBzBC,qBAAqB,EAAE,+BAtBE;EAuBzBC,sCAAsC,EAAE,gDAvBf;EAwBzBC,qCAAqC,EAAE,+CAxBd;EAyBzBC,kBAAkB,EAAE,4BAzBK;EA0BzBC,kBAAkB,EAAE,4BA1BK;EA2BzBC,2BAA2B,EAAE,qCA3BJ;EA4BzBC,0BAA0B,EAAE,oCA5BH;EA6BzBC,mBAAmB,EAAE,4BA7BI;EA8BzBC,oBAAoB,EAAE,6BA9BG;EA+BzBC,oBAAoB,EAAE,8BA/BG;EAgCzBC,oBAAoB,EAAE,8BAhCG;EAiCzBC,oBAAoB,EAAE,8BAjCG;EAkCzBC,mBAAmB,EAAE,6BAlCI;EAmCzBC,oBAAoB,EAAE,4BAnCG;EAoCzBC,sBAAsB,EAAE,gCApCC;EAqCzBC,qBAAqB,EAAE,8BArCE;EAsCzBC,mBAAmB,EAAE,4BAtCI;EAuCzBC,6BAA6B,EAAE,sCAvCN;EAwCzBC,kBAAkB,EAAE,2BAxCK;EAyCzBC,kBAAkB,EAAE,2BAzCK;EA0CzBC,mBAAmB,EAAE,4BA1CI;EA2CzBC,mBAAmB,EAAE;AA3CI,CAA3B"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@webex/plugin-meetings",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.8.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.8.0",
|
|
28
|
+
"@webex/internal-plugin-mercury": "2.8.0",
|
|
29
|
+
"@webex/internal-plugin-conversation": "2.8.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.8.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.8.0",
|
|
40
40
|
"btoa": "^1.2.1",
|
|
41
41
|
"@webex/internal-media-core": "^0.0.4-beta",
|
|
42
42
|
"javascript-state-machine": "^3.1.0",
|
package/src/constants.js
CHANGED
|
@@ -820,7 +820,9 @@ export const DISPLAY_HINTS = {
|
|
|
820
820
|
LOCK_CONTROL_UNLOCK: 'LOCK_CONTROL_UNLOCK',
|
|
821
821
|
LOCK_CONTROL_LOCK: 'LOCK_CONTROL_LOCK',
|
|
822
822
|
LOCK_STATUS_LOCKED: 'LOCK_STATUS_LOCKED',
|
|
823
|
-
LOCK_STATUS_UNLOCKED: 'LOCK_STATUS_UNLOCKED'
|
|
823
|
+
LOCK_STATUS_UNLOCKED: 'LOCK_STATUS_UNLOCKED',
|
|
824
|
+
RAISE_HAND: 'RAISE_HAND',
|
|
825
|
+
LOWER_ALL_HANDS: 'LOWER_ALL_HANDS',
|
|
824
826
|
};
|
|
825
827
|
|
|
826
828
|
export const SELF_ROLES = {
|
|
@@ -20,6 +20,8 @@ export default class InMeetingActions {
|
|
|
20
20
|
this.canPauseRecording = null;
|
|
21
21
|
this.canResumeRecording = null;
|
|
22
22
|
this.canStopRecording = null;
|
|
23
|
+
this.canRaiseHand = null;
|
|
24
|
+
this.canLowerAllHands = null;
|
|
23
25
|
}
|
|
24
26
|
|
|
25
27
|
get() {
|
|
@@ -30,7 +32,9 @@ export default class InMeetingActions {
|
|
|
30
32
|
canStartRecording: this.canStartRecording,
|
|
31
33
|
canPauseRecording: this.canPauseRecording,
|
|
32
34
|
canResumeRecording: this.canResumeRecording,
|
|
33
|
-
canStopRecording: this.canStopRecording
|
|
35
|
+
canStopRecording: this.canStopRecording,
|
|
36
|
+
canRaiseHand: this.canRaiseHand,
|
|
37
|
+
canLowerAllHands: this.canLowerAllHands,
|
|
34
38
|
};
|
|
35
39
|
}
|
|
36
40
|
|
|
@@ -51,4 +55,3 @@ export default class InMeetingActions {
|
|
|
51
55
|
return changed;
|
|
52
56
|
}
|
|
53
57
|
}
|
|
54
|
-
|
package/src/meeting/index.js
CHANGED
|
@@ -1871,7 +1871,9 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
1871
1871
|
canStartRecording: MeetingUtil.canUserRecord(payload.info.userDisplayHints),
|
|
1872
1872
|
canStopRecording: MeetingUtil.canUserStop(payload.info.userDisplayHints),
|
|
1873
1873
|
canPauseRecording: MeetingUtil.canUserPause(payload.info.userDisplayHints),
|
|
1874
|
-
canResumeRecording: MeetingUtil.canUserResume(payload.info.userDisplayHints)
|
|
1874
|
+
canResumeRecording: MeetingUtil.canUserResume(payload.info.userDisplayHints),
|
|
1875
|
+
canRaiseHand: MeetingUtil.canUserRaiseHand(payload.info.userDisplayHints),
|
|
1876
|
+
canLowerAllHands: MeetingUtil.canUserLowerAllHands(payload.info.userDisplayHints),
|
|
1875
1877
|
});
|
|
1876
1878
|
|
|
1877
1879
|
if (changed) {
|
|
@@ -5767,9 +5769,21 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
5767
5769
|
});
|
|
5768
5770
|
this.isBnrEnabled = true;
|
|
5769
5771
|
isSuccess = true;
|
|
5772
|
+
Metrics.sendBehavioralMetric(
|
|
5773
|
+
BEHAVIORAL_METRICS.ENABLE_BNR_SUCCESS,
|
|
5774
|
+
);
|
|
5770
5775
|
}
|
|
5771
5776
|
catch (error) {
|
|
5772
5777
|
LoggerProxy.logger.error(`Meeting:index#enableBNR. ${error}`);
|
|
5778
|
+
|
|
5779
|
+
Metrics.sendBehavioralMetric(
|
|
5780
|
+
BEHAVIORAL_METRICS.ENABLE_BNR_FAILURE,
|
|
5781
|
+
{
|
|
5782
|
+
reason: error.message,
|
|
5783
|
+
stack: error.stack
|
|
5784
|
+
}
|
|
5785
|
+
);
|
|
5786
|
+
|
|
5773
5787
|
throw error;
|
|
5774
5788
|
}
|
|
5775
5789
|
|
|
@@ -5801,9 +5815,22 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
5801
5815
|
});
|
|
5802
5816
|
this.isBnrEnabled = false;
|
|
5803
5817
|
isSuccess = true;
|
|
5818
|
+
|
|
5819
|
+
Metrics.sendBehavioralMetric(
|
|
5820
|
+
BEHAVIORAL_METRICS.DISABLE_BNR_SUCCESS
|
|
5821
|
+
);
|
|
5804
5822
|
}
|
|
5805
5823
|
catch (error) {
|
|
5806
5824
|
LoggerProxy.logger.error(`Meeting:index#disableBNR. ${error}`);
|
|
5825
|
+
|
|
5826
|
+
Metrics.sendBehavioralMetric(
|
|
5827
|
+
BEHAVIORAL_METRICS.DISABLE_BNR_FAILURE,
|
|
5828
|
+
{
|
|
5829
|
+
reason: error.message,
|
|
5830
|
+
stack: error.stack
|
|
5831
|
+
}
|
|
5832
|
+
);
|
|
5833
|
+
|
|
5807
5834
|
throw error;
|
|
5808
5835
|
}
|
|
5809
5836
|
|
package/src/meeting/util.js
CHANGED
|
@@ -441,6 +441,10 @@ MeetingUtil.stopRecording = (request, locusUrl, locusInfo) => {
|
|
|
441
441
|
return Promise.reject(new PermissionError('Stop recording not allowed, due to moderator property.'));
|
|
442
442
|
};
|
|
443
443
|
|
|
444
|
+
MeetingUtil.canUserRaiseHand = (displayHints) => displayHints.includes(DISPLAY_HINTS.RAISE_HAND);
|
|
445
|
+
|
|
446
|
+
MeetingUtil.canUserLowerAllHands = (displayHints) => displayHints.includes(DISPLAY_HINTS.LOWER_ALL_HANDS);
|
|
447
|
+
|
|
444
448
|
MeetingUtil.lockMeeting = (actions, request, locusUrl) => {
|
|
445
449
|
if (actions && actions.canLock) {
|
|
446
450
|
return request.lockMeeting({locusUrl, lock: true});
|
package/src/metrics/constants.js
CHANGED
|
@@ -40,7 +40,11 @@ const BEHAVIORAL_METRICS = {
|
|
|
40
40
|
PEERCONNECTION_FAILURE: 'js_sdk_peerConnection_failures',
|
|
41
41
|
INVALID_ICE_CANDIDATE: 'js_sdk_invalid_ice_candidate',
|
|
42
42
|
UPLOAD_LOGS_FAILURE: 'js_sdk_upload_logs_failure',
|
|
43
|
-
RECEIVE_TRANSCRIPTION_FAILURE: 'js_sdk_receive_transcription_failure'
|
|
43
|
+
RECEIVE_TRANSCRIPTION_FAILURE: 'js_sdk_receive_transcription_failure',
|
|
44
|
+
ENABLE_BNR_SUCCESS: 'js_sdk_enable_bnr_success',
|
|
45
|
+
ENABLE_BNR_FAILURE: 'js_sdk_enable_bnr_failure',
|
|
46
|
+
DISABLE_BNR_SUCCESS: 'js_sdk_disable_bnr_success',
|
|
47
|
+
DISABLE_BNR_FAILURE: 'js_sdk_disable_bnr_failure'
|
|
44
48
|
};
|
|
45
49
|
|
|
46
50
|
|
|
@@ -14,6 +14,8 @@ describe('plugin-meetings', () => {
|
|
|
14
14
|
canPauseRecording: null,
|
|
15
15
|
canResumeRecording: null,
|
|
16
16
|
canStopRecording: null,
|
|
17
|
+
canRaiseHand: null,
|
|
18
|
+
canLowerAllHands: null,
|
|
17
19
|
...expected
|
|
18
20
|
};
|
|
19
21
|
|
|
@@ -33,7 +35,9 @@ describe('plugin-meetings', () => {
|
|
|
33
35
|
'canStartRecording',
|
|
34
36
|
'canPauseRecording',
|
|
35
37
|
'canResumeRecording',
|
|
36
|
-
'canStopRecording'
|
|
38
|
+
'canStopRecording',
|
|
39
|
+
'canRaiseHand',
|
|
40
|
+
'canLowerAllHands',
|
|
37
41
|
].forEach((key) => {
|
|
38
42
|
it(`get and set for ${key} work as expected`, () => {
|
|
39
43
|
const inMeetingActions = new InMeetingActions();
|
|
@@ -74,6 +74,13 @@ describe('plugin-meetings', () => {
|
|
|
74
74
|
debug: () => {}
|
|
75
75
|
};
|
|
76
76
|
|
|
77
|
+
beforeEach(() => {
|
|
78
|
+
sinon.stub(Metrics, 'sendBehavioralMetric');
|
|
79
|
+
});
|
|
80
|
+
afterEach(() => {
|
|
81
|
+
sinon.restore();
|
|
82
|
+
});
|
|
83
|
+
|
|
77
84
|
before(() => {
|
|
78
85
|
const MediaStream = {
|
|
79
86
|
getVideoTracks: () => [{
|
|
@@ -577,7 +584,7 @@ describe('plugin-meetings', () => {
|
|
|
577
584
|
assert.equal(response, true);
|
|
578
585
|
});
|
|
579
586
|
|
|
580
|
-
it('should throw error for inappropriate sample rate', async () => {
|
|
587
|
+
it('should throw error for inappropriate sample rate and send error metrics', async () => {
|
|
581
588
|
const fakeMediaTrack = () => ({
|
|
582
589
|
stop: () => {},
|
|
583
590
|
readyState: 'live',
|
|
@@ -588,9 +595,28 @@ describe('plugin-meetings', () => {
|
|
|
588
595
|
|
|
589
596
|
sinon.stub(meeting.mediaProperties, 'audioTrack').value(fakeMediaTrack());
|
|
590
597
|
await meeting.enableBNR().catch((err) => {
|
|
598
|
+
assert(Metrics.sendBehavioralMetric.calledOnce);
|
|
599
|
+
assert.calledWith(
|
|
600
|
+
Metrics.sendBehavioralMetric,
|
|
601
|
+
BEHAVIORAL_METRICS.ENABLE_BNR_FAILURE, {
|
|
602
|
+
reason: err.message,
|
|
603
|
+
stack: err.stack
|
|
604
|
+
}
|
|
605
|
+
);
|
|
591
606
|
assert.equal(err.message, 'Sample rate of 49000 is not supported.');
|
|
592
607
|
});
|
|
593
608
|
});
|
|
609
|
+
|
|
610
|
+
it('should send metrics for enable bnr success', async () => {
|
|
611
|
+
const response = await meeting.enableBNR();
|
|
612
|
+
|
|
613
|
+
assert(Metrics.sendBehavioralMetric.calledOnce);
|
|
614
|
+
assert.calledWith(
|
|
615
|
+
Metrics.sendBehavioralMetric,
|
|
616
|
+
BEHAVIORAL_METRICS.ENABLE_BNR_SUCCESS,
|
|
617
|
+
);
|
|
618
|
+
assert.equal(response, true);
|
|
619
|
+
});
|
|
594
620
|
});
|
|
595
621
|
});
|
|
596
622
|
|
|
@@ -605,8 +631,13 @@ describe('plugin-meetings', () => {
|
|
|
605
631
|
assert.equal(response, true);
|
|
606
632
|
});
|
|
607
633
|
|
|
608
|
-
it('should throw error if bnr is not enabled before disabling', async () => {
|
|
634
|
+
it('should throw error if bnr is not enabled before disabling and send error metrics', async () => {
|
|
609
635
|
await meeting.disableBNR().catch((err) => {
|
|
636
|
+
assert(Metrics.sendBehavioralMetric.calledOnce);
|
|
637
|
+
assert.calledWith(
|
|
638
|
+
Metrics.sendBehavioralMetric,
|
|
639
|
+
BEHAVIORAL_METRICS.DISABLE_BNR_FAILURE,
|
|
640
|
+
);
|
|
610
641
|
assert.equal(err.message, 'Can not disable as BNR is not enabled');
|
|
611
642
|
});
|
|
612
643
|
});
|
|
@@ -2773,7 +2804,6 @@ describe('plugin-meetings', () => {
|
|
|
2773
2804
|
});
|
|
2774
2805
|
|
|
2775
2806
|
it('should send metrics on reconnect failure', async () => {
|
|
2776
|
-
sandbox.stub(Metrics, 'sendBehavioralMetric');
|
|
2777
2807
|
await assert.isRejected(meeting.reconnect());
|
|
2778
2808
|
assert(Metrics.sendBehavioralMetric.calledOnce);
|
|
2779
2809
|
assert.calledWith(
|
|
@@ -3369,6 +3399,8 @@ describe('plugin-meetings', () => {
|
|
|
3369
3399
|
let canUserStopSpy;
|
|
3370
3400
|
let canUserPauseSpy;
|
|
3371
3401
|
let canUserResumeSpy;
|
|
3402
|
+
let canUserRaiseHandSpy;
|
|
3403
|
+
let canUserLowerAllHandsSpy;
|
|
3372
3404
|
|
|
3373
3405
|
|
|
3374
3406
|
beforeEach(() => {
|
|
@@ -3380,6 +3412,8 @@ describe('plugin-meetings', () => {
|
|
|
3380
3412
|
canUserPauseSpy = sinon.spy(MeetingUtil, 'canUserPause');
|
|
3381
3413
|
canUserResumeSpy = sinon.spy(MeetingUtil, 'canUserResume');
|
|
3382
3414
|
inMeetingActionsSetSpy = sinon.spy(meeting.inMeetingActions, 'set');
|
|
3415
|
+
canUserRaiseHandSpy = sinon.spy(MeetingUtil, 'canUserRaiseHand');
|
|
3416
|
+
canUserLowerAllHandsSpy = sinon.spy(MeetingUtil, 'canUserLowerAllHands');
|
|
3383
3417
|
});
|
|
3384
3418
|
|
|
3385
3419
|
afterEach(() => {
|
|
@@ -3412,6 +3446,8 @@ describe('plugin-meetings', () => {
|
|
|
3412
3446
|
assert.calledWith(canUserStopSpy, payload.info.userDisplayHints);
|
|
3413
3447
|
assert.calledWith(canUserPauseSpy, payload.info.userDisplayHints);
|
|
3414
3448
|
assert.calledWith(canUserResumeSpy, payload.info.userDisplayHints);
|
|
3449
|
+
assert.calledWith(canUserRaiseHandSpy, payload.info.userDisplayHints);
|
|
3450
|
+
assert.calledWith(canUserLowerAllHandsSpy, payload.info.userDisplayHints);
|
|
3415
3451
|
|
|
3416
3452
|
assert.calledWith(
|
|
3417
3453
|
TriggerProxy.trigger,
|
|
@@ -214,6 +214,20 @@ describe('plugin-meetings', () => {
|
|
|
214
214
|
});
|
|
215
215
|
});
|
|
216
216
|
|
|
217
|
+
describe('canUserRaiseHand', () => {
|
|
218
|
+
it('works as expected', () => {
|
|
219
|
+
assert.deepEqual(MeetingUtil.canUserRaiseHand(['RAISE_HAND']), true);
|
|
220
|
+
assert.deepEqual(MeetingUtil.canUserRaiseHand([]), false);
|
|
221
|
+
});
|
|
222
|
+
});
|
|
223
|
+
|
|
224
|
+
describe('canUserLowerAllHands', () => {
|
|
225
|
+
it('works as expected', () => {
|
|
226
|
+
assert.deepEqual(MeetingUtil.canUserLowerAllHands(['LOWER_ALL_HANDS']), true);
|
|
227
|
+
assert.deepEqual(MeetingUtil.canUserLowerAllHands([]), false);
|
|
228
|
+
});
|
|
229
|
+
});
|
|
230
|
+
|
|
217
231
|
describe('canUserLock', () => {
|
|
218
232
|
it('works as expected', () => {
|
|
219
233
|
assert.deepEqual(MeetingUtil.canUserLock(['LOCK_CONTROL_LOCK', 'LOCK_STATUS_UNLOCKED']), true);
|
|
@@ -362,4 +376,3 @@ describe('plugin-meetings', () => {
|
|
|
362
376
|
});
|
|
363
377
|
});
|
|
364
378
|
});
|
|
365
|
-
|