@webex/plugin-meetings 3.0.0-beta.16 → 3.0.0-beta.17

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.
@@ -497,6 +497,24 @@ MeetingUtil.canSelectSpokenLanguages = function (displayHints) {
497
497
  MeetingUtil.waitingForOthersToJoin = function (displayHints) {
498
498
  return displayHints.includes(_constants.DISPLAY_HINTS.WAITING_FOR_OTHERS);
499
499
  };
500
+ MeetingUtil.canEnableReactions = function (originalValue, displayHints) {
501
+ if (displayHints.includes(_constants.DISPLAY_HINTS.ENABLE_REACTIONS)) {
502
+ return true;
503
+ }
504
+ if (displayHints.includes(_constants.DISPLAY_HINTS.DISABLE_REACTIONS)) {
505
+ return false;
506
+ }
507
+ return originalValue;
508
+ };
509
+ MeetingUtil.canSendReactions = function (originalValue, displayHints) {
510
+ if (displayHints.includes(_constants.DISPLAY_HINTS.REACTIONS_ACTIVE)) {
511
+ return true;
512
+ }
513
+ if (displayHints.includes(_constants.DISPLAY_HINTS.REACTIONS_INACTIVE)) {
514
+ return false;
515
+ }
516
+ return originalValue;
517
+ };
500
518
  var _default = MeetingUtil;
501
519
  exports.default = _default;
502
520
  //# sourceMappingURL=util.js.map
@@ -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","preferTranscoding","isMultistream","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","asResourceOccupant","res","LOCUS_JOIN_RESPONSE","data","trigger","LOCI_UPDATE","trackingId","headers","trackingid","cleanUp","stopStatsAnalyzer","statsAnalyzer","stopAnalyzer","resolve","closeLocalStream","closeLocalShare","closeRemoteTracks","closePeerConnections","unsetLocalVideoTrack","unsetLocalShareTrack","unsetRemoteTracks","unsetPeerConnections","reconnectionManager","stopKeepAlive","updateLLMConnection","disconnectPhoneAudio","phoneUrl","meetingState","FULL_STATE","INACTIVE","MeetingNotActiveError","locusInfo","onFullLocus","catch","LoggerProxy","logger","error","leaveMeeting","isUserInLeftState","UserNotJoinedError","defaultOptions","leaveOptions","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","validateOptions","sendVideo","sendAudio","sendShare","localStream","localShare","getTrack","videoTrack","audioTrack","stream","audioTracks","videoTracks","getAudioTracks","getVideoTracks","length","getModeratorFromLocusInfo","getPolicyFromLocusInfo","policy","getUserDisplayHintsFromLocusInfo","userDisplayHints","canInviteNewParticipants","displayHints","DISPLAY_HINTS","ADD_GUEST","canAdmitParticipant","ROSTER_WAITING_TO_JOIN","canUserLock","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","canUserLowerSomeoneElsesHand","LOWER_SOMEONE_ELSES_HAND","bothLeaveAndEndMeetingAvailable","LEAVE_TRANSFER_HOST_END_MEETING","LEAVE_END_MEETING","lockMeeting","actions","canLock","lock","unlockMeeting","canUnlock","handleAudioLogging","LOG_HEADER","settings","getSettings","deviceId","log","handleVideoLogging","handleDeviceLogging","devices","device","endMeetingForAll","endOptions","canEnableClosedCaption","CAPTION_START","canStartTranscribing","TRANSCRIPTION_CONTROL_START","canStopTranscribing","TRANSCRIPTION_CONTROL_STOP","isClosedCaptionActive","CAPTION_STATUS_ACTIVE","isWebexAssistantActive","WEBEX_ASSISTANT_STATUS_ACTIVE","canViewCaptionPanel","ENABLE_CAPTION_PANEL","isRealTimeTranslationEnabled","DISPLAY_REAL_TIME_TRANSLATION","canSelectSpokenLanguages","DISPLAY_NON_ENGLISH_ASR","waitingForOthersToJoin","WAITING_FOR_OTHERS"],"sources":["util.ts"],"sourcesContent":["import {isEmpty} from 'lodash';\n\nimport {MeetingNotActiveError, UserNotJoinedError} from '../common/errors/webex-errors';\nimport Metrics from '../metrics';\nimport {eventType, trigger} from '../metrics/config';\nimport Media from '../media';\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport {\n INTENT_TO_JOIN,\n _LEFT_,\n _IDLE_,\n _JOINED_,\n PASSWORD_STATUS,\n DISPLAY_HINTS,\n FULL_STATE,\n} from '../constants';\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: any = {};\n\nMeetingUtil.parseLocusJoin = (response) => {\n const parsed: any = {};\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(\n new ParameterError('You need a media id on the meeting to change remote audio.')\n );\n }\n\n Metrics.postEvent({event: eventType.MEDIA_REQUEST, meeting});\n\n return meeting.meetingRequest\n .remoteAudioVideoToggle({\n locusUrl: meeting.locusUrl,\n selfId: meeting.selfId,\n localMedias,\n deviceUrl: meeting.deviceUrl,\n correlationId: meeting.correlationId,\n preferTranscoding: !meeting.isMultistream,\n })\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) =>\n 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: !meeting.isMultistream,\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 const stopStatsAnalyzer = meeting.statsAnalyzer\n ? meeting.statsAnalyzer.stopAnalyzer()\n : Promise.resolve();\n\n return stopStatsAnalyzer\n .then(() => 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.reconnectionManager.cleanUp();\n })\n .then(() => meeting.stopKeepAlive())\n .then(() => meeting.updateLLMConnection());\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 ${meeting.id}, 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: any = {}) => {\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) {\n // && !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 ${meeting.id}, 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) => locusInfo.parsedLocus?.self?.state === _LEFT_;\n\nMeetingUtil.isUserInIdleState = (locusInfo) => locusInfo.parsedLocus?.self?.state === _IDLE_;\n\nMeetingUtil.isUserInJoinedState = (locusInfo) => locusInfo.parsedLocus?.self?.state === _JOINED_;\n\nMeetingUtil.isMediaEstablished = (currentMediaStatus) =>\n currentMediaStatus &&\n (currentMediaStatus.audio || currentMediaStatus.video || currentMediaStatus.share);\n\nMeetingUtil.joinMeetingOptions = (meeting, options: any = {}) => {\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.validateOptions = (options) => {\n const {sendVideo, sendAudio, sendShare, localStream, localShare} = 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) =>\n locusInfo?.parsedLocus?.info?.userDisplayHints || [];\n\nMeetingUtil.canInviteNewParticipants = (displayHints) =>\n displayHints.includes(DISPLAY_HINTS.ADD_GUEST);\n\nMeetingUtil.canAdmitParticipant = (displayHints) =>\n displayHints.includes(DISPLAY_HINTS.ROSTER_WAITING_TO_JOIN);\n\nMeetingUtil.canUserLock = (displayHints) =>\n displayHints.includes(DISPLAY_HINTS.LOCK_CONTROL_LOCK) &&\n displayHints.includes(DISPLAY_HINTS.LOCK_STATUS_UNLOCKED);\n\nMeetingUtil.canUserUnlock = (displayHints) =>\n displayHints.includes(DISPLAY_HINTS.LOCK_CONTROL_UNLOCK) &&\n displayHints.includes(DISPLAY_HINTS.LOCK_STATUS_LOCKED);\n\nMeetingUtil.canUserRecord = (displayHints) =>\n displayHints.includes(DISPLAY_HINTS.RECORDING_CONTROL_START);\n\nMeetingUtil.canUserPause = (displayHints) =>\n displayHints.includes(DISPLAY_HINTS.RECORDING_CONTROL_PAUSE);\n\nMeetingUtil.canUserResume = (displayHints) =>\n displayHints.includes(DISPLAY_HINTS.RECORDING_CONTROL_RESUME);\n\nMeetingUtil.canUserStop = (displayHints) =>\n 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(\n new PermissionError('Start recording not allowed, due to moderator property.')\n );\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(\n new PermissionError('Pause recording not allowed, due to moderator property.')\n );\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(\n new PermissionError('Resume recording not allowed, due to moderator property.')\n );\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(\n new PermissionError('Stop recording not allowed, due to moderator property.')\n );\n};\n\nMeetingUtil.canUserRaiseHand = (displayHints) => displayHints.includes(DISPLAY_HINTS.RAISE_HAND);\n\nMeetingUtil.canUserLowerAllHands = (displayHints) =>\n displayHints.includes(DISPLAY_HINTS.LOWER_ALL_HANDS);\n\nMeetingUtil.canUserLowerSomeoneElsesHand = (displayHints) =>\n displayHints.includes(DISPLAY_HINTS.LOWER_SOMEONE_ELSES_HAND);\n\nMeetingUtil.bothLeaveAndEndMeetingAvailable = (displayHints) =>\n displayHints.includes(DISPLAY_HINTS.LEAVE_TRANSFER_HOST_END_MEETING) ||\n displayHints.includes(DISPLAY_HINTS.LEAVE_END_MEETING);\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.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 ${meeting.id}, error: ${err}`\n );\n\n return Promise.reject(err);\n });\n};\n\nMeetingUtil.canEnableClosedCaption = (displayHints) =>\n displayHints.includes(DISPLAY_HINTS.CAPTION_START);\n\nMeetingUtil.canStartTranscribing = (displayHints) =>\n displayHints.includes(DISPLAY_HINTS.TRANSCRIPTION_CONTROL_START);\n\nMeetingUtil.canStopTranscribing = (displayHints) =>\n displayHints.includes(DISPLAY_HINTS.TRANSCRIPTION_CONTROL_STOP);\n\nMeetingUtil.isClosedCaptionActive = (displayHints) =>\n displayHints.includes(DISPLAY_HINTS.CAPTION_STATUS_ACTIVE);\n\nMeetingUtil.isWebexAssistantActive = (displayHints) =>\n displayHints.includes(DISPLAY_HINTS.WEBEX_ASSISTANT_STATUS_ACTIVE);\n\nMeetingUtil.canViewCaptionPanel = (displayHints) =>\n displayHints.includes(DISPLAY_HINTS.ENABLE_CAPTION_PANEL);\n\nMeetingUtil.isRealTimeTranslationEnabled = (displayHints) =>\n displayHints.includes(DISPLAY_HINTS.DISPLAY_REAL_TIME_TRANSLATION);\n\nMeetingUtil.canSelectSpokenLanguages = (displayHints) =>\n displayHints.includes(DISPLAY_HINTS.DISPLAY_NON_ENGLISH_ASR);\n\nMeetingUtil.waitingForOthersToJoin = (displayHints) =>\n displayHints.includes(DISPLAY_HINTS.WAITING_FOR_OTHERS);\n\nexport default MeetingUtil;\n"],"mappings":"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"}
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","preferTranscoding","isMultistream","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","asResourceOccupant","res","LOCUS_JOIN_RESPONSE","data","trigger","LOCI_UPDATE","trackingId","headers","trackingid","cleanUp","stopStatsAnalyzer","statsAnalyzer","stopAnalyzer","resolve","closeLocalStream","closeLocalShare","closeRemoteTracks","closePeerConnections","unsetLocalVideoTrack","unsetLocalShareTrack","unsetRemoteTracks","unsetPeerConnections","reconnectionManager","stopKeepAlive","updateLLMConnection","disconnectPhoneAudio","phoneUrl","meetingState","FULL_STATE","INACTIVE","MeetingNotActiveError","locusInfo","onFullLocus","catch","LoggerProxy","logger","error","leaveMeeting","isUserInLeftState","UserNotJoinedError","defaultOptions","leaveOptions","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","validateOptions","sendVideo","sendAudio","sendShare","localStream","localShare","getTrack","videoTrack","audioTrack","stream","audioTracks","videoTracks","getAudioTracks","getVideoTracks","length","getModeratorFromLocusInfo","getPolicyFromLocusInfo","policy","getUserDisplayHintsFromLocusInfo","userDisplayHints","canInviteNewParticipants","displayHints","DISPLAY_HINTS","ADD_GUEST","canAdmitParticipant","ROSTER_WAITING_TO_JOIN","canUserLock","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","canUserLowerSomeoneElsesHand","LOWER_SOMEONE_ELSES_HAND","bothLeaveAndEndMeetingAvailable","LEAVE_TRANSFER_HOST_END_MEETING","LEAVE_END_MEETING","lockMeeting","actions","canLock","lock","unlockMeeting","canUnlock","handleAudioLogging","LOG_HEADER","settings","getSettings","deviceId","log","handleVideoLogging","handleDeviceLogging","devices","device","endMeetingForAll","endOptions","canEnableClosedCaption","CAPTION_START","canStartTranscribing","TRANSCRIPTION_CONTROL_START","canStopTranscribing","TRANSCRIPTION_CONTROL_STOP","isClosedCaptionActive","CAPTION_STATUS_ACTIVE","isWebexAssistantActive","WEBEX_ASSISTANT_STATUS_ACTIVE","canViewCaptionPanel","ENABLE_CAPTION_PANEL","isRealTimeTranslationEnabled","DISPLAY_REAL_TIME_TRANSLATION","canSelectSpokenLanguages","DISPLAY_NON_ENGLISH_ASR","waitingForOthersToJoin","WAITING_FOR_OTHERS","canEnableReactions","originalValue","ENABLE_REACTIONS","DISABLE_REACTIONS","canSendReactions","REACTIONS_ACTIVE","REACTIONS_INACTIVE"],"sources":["util.ts"],"sourcesContent":["import {isEmpty} from 'lodash';\n\nimport {MeetingNotActiveError, UserNotJoinedError} from '../common/errors/webex-errors';\nimport Metrics from '../metrics';\nimport {eventType, trigger} from '../metrics/config';\nimport Media from '../media';\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport {\n INTENT_TO_JOIN,\n _LEFT_,\n _IDLE_,\n _JOINED_,\n PASSWORD_STATUS,\n DISPLAY_HINTS,\n FULL_STATE,\n} from '../constants';\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: any = {};\n\nMeetingUtil.parseLocusJoin = (response) => {\n const parsed: any = {};\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(\n new ParameterError('You need a media id on the meeting to change remote audio.')\n );\n }\n\n Metrics.postEvent({event: eventType.MEDIA_REQUEST, meeting});\n\n return meeting.meetingRequest\n .remoteAudioVideoToggle({\n locusUrl: meeting.locusUrl,\n selfId: meeting.selfId,\n localMedias,\n deviceUrl: meeting.deviceUrl,\n correlationId: meeting.correlationId,\n preferTranscoding: !meeting.isMultistream,\n })\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) =>\n 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: !meeting.isMultistream,\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 const stopStatsAnalyzer = meeting.statsAnalyzer\n ? meeting.statsAnalyzer.stopAnalyzer()\n : Promise.resolve();\n\n return stopStatsAnalyzer\n .then(() => 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.reconnectionManager.cleanUp();\n })\n .then(() => meeting.stopKeepAlive())\n .then(() => meeting.updateLLMConnection());\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 ${meeting.id}, 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: any = {}) => {\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) {\n // && !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 ${meeting.id}, 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) => locusInfo.parsedLocus?.self?.state === _LEFT_;\n\nMeetingUtil.isUserInIdleState = (locusInfo) => locusInfo.parsedLocus?.self?.state === _IDLE_;\n\nMeetingUtil.isUserInJoinedState = (locusInfo) => locusInfo.parsedLocus?.self?.state === _JOINED_;\n\nMeetingUtil.isMediaEstablished = (currentMediaStatus) =>\n currentMediaStatus &&\n (currentMediaStatus.audio || currentMediaStatus.video || currentMediaStatus.share);\n\nMeetingUtil.joinMeetingOptions = (meeting, options: any = {}) => {\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.validateOptions = (options) => {\n const {sendVideo, sendAudio, sendShare, localStream, localShare} = 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) =>\n locusInfo?.parsedLocus?.info?.userDisplayHints || [];\n\nMeetingUtil.canInviteNewParticipants = (displayHints) =>\n displayHints.includes(DISPLAY_HINTS.ADD_GUEST);\n\nMeetingUtil.canAdmitParticipant = (displayHints) =>\n displayHints.includes(DISPLAY_HINTS.ROSTER_WAITING_TO_JOIN);\n\nMeetingUtil.canUserLock = (displayHints) =>\n displayHints.includes(DISPLAY_HINTS.LOCK_CONTROL_LOCK) &&\n displayHints.includes(DISPLAY_HINTS.LOCK_STATUS_UNLOCKED);\n\nMeetingUtil.canUserUnlock = (displayHints) =>\n displayHints.includes(DISPLAY_HINTS.LOCK_CONTROL_UNLOCK) &&\n displayHints.includes(DISPLAY_HINTS.LOCK_STATUS_LOCKED);\n\nMeetingUtil.canUserRecord = (displayHints) =>\n displayHints.includes(DISPLAY_HINTS.RECORDING_CONTROL_START);\n\nMeetingUtil.canUserPause = (displayHints) =>\n displayHints.includes(DISPLAY_HINTS.RECORDING_CONTROL_PAUSE);\n\nMeetingUtil.canUserResume = (displayHints) =>\n displayHints.includes(DISPLAY_HINTS.RECORDING_CONTROL_RESUME);\n\nMeetingUtil.canUserStop = (displayHints) =>\n 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(\n new PermissionError('Start recording not allowed, due to moderator property.')\n );\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(\n new PermissionError('Pause recording not allowed, due to moderator property.')\n );\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(\n new PermissionError('Resume recording not allowed, due to moderator property.')\n );\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(\n new PermissionError('Stop recording not allowed, due to moderator property.')\n );\n};\n\nMeetingUtil.canUserRaiseHand = (displayHints) => displayHints.includes(DISPLAY_HINTS.RAISE_HAND);\n\nMeetingUtil.canUserLowerAllHands = (displayHints) =>\n displayHints.includes(DISPLAY_HINTS.LOWER_ALL_HANDS);\n\nMeetingUtil.canUserLowerSomeoneElsesHand = (displayHints) =>\n displayHints.includes(DISPLAY_HINTS.LOWER_SOMEONE_ELSES_HAND);\n\nMeetingUtil.bothLeaveAndEndMeetingAvailable = (displayHints) =>\n displayHints.includes(DISPLAY_HINTS.LEAVE_TRANSFER_HOST_END_MEETING) ||\n displayHints.includes(DISPLAY_HINTS.LEAVE_END_MEETING);\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.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 ${meeting.id}, error: ${err}`\n );\n\n return Promise.reject(err);\n });\n};\n\nMeetingUtil.canEnableClosedCaption = (displayHints) =>\n displayHints.includes(DISPLAY_HINTS.CAPTION_START);\n\nMeetingUtil.canStartTranscribing = (displayHints) =>\n displayHints.includes(DISPLAY_HINTS.TRANSCRIPTION_CONTROL_START);\n\nMeetingUtil.canStopTranscribing = (displayHints) =>\n displayHints.includes(DISPLAY_HINTS.TRANSCRIPTION_CONTROL_STOP);\n\nMeetingUtil.isClosedCaptionActive = (displayHints) =>\n displayHints.includes(DISPLAY_HINTS.CAPTION_STATUS_ACTIVE);\n\nMeetingUtil.isWebexAssistantActive = (displayHints) =>\n displayHints.includes(DISPLAY_HINTS.WEBEX_ASSISTANT_STATUS_ACTIVE);\n\nMeetingUtil.canViewCaptionPanel = (displayHints) =>\n displayHints.includes(DISPLAY_HINTS.ENABLE_CAPTION_PANEL);\n\nMeetingUtil.isRealTimeTranslationEnabled = (displayHints) =>\n displayHints.includes(DISPLAY_HINTS.DISPLAY_REAL_TIME_TRANSLATION);\n\nMeetingUtil.canSelectSpokenLanguages = (displayHints) =>\n displayHints.includes(DISPLAY_HINTS.DISPLAY_NON_ENGLISH_ASR);\n\nMeetingUtil.waitingForOthersToJoin = (displayHints) =>\n displayHints.includes(DISPLAY_HINTS.WAITING_FOR_OTHERS);\n\nMeetingUtil.canEnableReactions = (originalValue, displayHints) => {\n if (displayHints.includes(DISPLAY_HINTS.ENABLE_REACTIONS)) {\n return true;\n }\n if (displayHints.includes(DISPLAY_HINTS.DISABLE_REACTIONS)) {\n return false;\n }\n\n return originalValue;\n};\n\nMeetingUtil.canSendReactions = (originalValue, displayHints) => {\n if (displayHints.includes(DISPLAY_HINTS.REACTIONS_ACTIVE)) {\n return true;\n }\n if (displayHints.includes(DISPLAY_HINTS.REACTIONS_INACTIVE)) {\n return false;\n }\n\n return originalValue;\n};\n\nexport default MeetingUtil;\n"],"mappings":";;;;;;;;;;;;;;;;;;AAEA;AACA;AACA;AACA;AACA;AACA;AASA;AACA;AACA;AACA;AACA;AACA;AAA0D;AAAA;AAE1D,IAAMA,WAAgB,GAAG,CAAC,CAAC;AAE3BA,WAAW,CAACC,cAAc,GAAG,UAACC,QAAQ,EAAK;EACzC,IAAMC,MAAW,GAAG,CAAC,CAAC;;EAEtB;EACAA,MAAM,CAACC,KAAK,GAAGF,QAAQ,CAACG,IAAI,CAACD,KAAK;EAClCD,MAAM,CAACG,gBAAgB,GAAGJ,QAAQ,CAACG,IAAI,CAACC,gBAAgB;EACxDH,MAAM,CAACI,QAAQ,GAAGJ,MAAM,CAACC,KAAK,CAACI,GAAG;EAClCL,MAAM,CAACM,OAAO,GAAGN,MAAM,CAACC,KAAK,CAACI,GAAG,CAACE,KAAK,CAAC,GAAG,CAAC,CAACC,GAAG,EAAE;EAClDR,MAAM,CAACS,MAAM,GAAGT,MAAM,CAACC,KAAK,CAACS,IAAI,CAACC,EAAE;;EAEpC;EACAX,MAAM,CAACG,gBAAgB,CAACS,OAAO,CAAC,UAACC,eAAe,EAAK;IACnD,IAAIA,eAAe,CAACC,OAAO,EAAE;MAC3Bd,MAAM,CAACc,OAAO,GAAGD,eAAe,CAACC,OAAO;IAC1C;EACF,CAAC,CAAC;EAEF,OAAOd,MAAM;AACf,CAAC;AAEDH,WAAW,CAACkB,sBAAsB,GAAG,UAACC,UAAU,EAAEC,UAAU,EAAEC,OAAO,EAAK;EACxE,IAAI,CAACA,OAAO,EAAE;IACZ,OAAO,iBAAQC,MAAM,CAAC,IAAIC,kBAAc,CAAC,4BAA4B,CAAC,CAAC;EACzE;EACA,IAAMC,WAAW,GAAGC,cAAK,CAACC,mBAAmB,CAACL,OAAO,CAACJ,OAAO,EAAEE,UAAU,EAAEC,UAAU,CAAC;EAEtF,IAAI,uBAAQI,WAAW,CAAC,EAAE;IACxB,OAAO,iBAAQF,MAAM,CACnB,IAAIC,kBAAc,CAAC,4DAA4D,CAAC,CACjF;EACH;EAEAI,gBAAO,CAACC,SAAS,CAAC;IAACC,KAAK,EAAEC,iBAAS,CAACC,aAAa;IAAEV,OAAO,EAAPA;EAAO,CAAC,CAAC;EAE5D,OAAOA,OAAO,CAACW,cAAc,CAC1BC,sBAAsB,CAAC;IACtB1B,QAAQ,EAAEc,OAAO,CAACd,QAAQ;IAC1BK,MAAM,EAAES,OAAO,CAACT,MAAM;IACtBY,WAAW,EAAXA,WAAW;IACXU,SAAS,EAAEb,OAAO,CAACa,SAAS;IAC5BC,aAAa,EAAEd,OAAO,CAACc,aAAa;IACpCC,iBAAiB,EAAE,CAACf,OAAO,CAACgB;EAC9B,CAAC,CAAC,CACDC,IAAI,CAAC,UAACpC,QAAQ,EAAK;IAClByB,gBAAO,CAACC,SAAS,CAAC;MAACC,KAAK,EAAEC,iBAAS,CAACS,cAAc;MAAElB,OAAO,EAAPA;IAAO,CAAC,CAAC;IAE7D,OAAOnB,QAAQ,CAACG,IAAI,CAACD,KAAK;EAC5B,CAAC,CAAC;AACN,CAAC;AAEDJ,WAAW,CAACwC,QAAQ,GAAG,UAACC,IAAI;EAAA,OAAKA,IAAI,IAAIA,IAAI,CAACC,KAAK;AAAA;AAEnD1C,WAAW,CAAC2C,WAAW,GAAG,UAACD,KAAK,EAAE9B,MAAM;EAAA,OAAK8B,KAAK,KAAK9B,MAAM;AAAA;AAE7DZ,WAAW,CAAC4C,YAAY,GAAG,UAACC,GAAG;EAAA;EAAA,OAC7B,CAAAA,GAAG,aAAHA,GAAG,oCAAHA,GAAG,CAAExC,IAAI,8CAAT,UAAWyC,SAAS,KAAIC,yBAAc,CAACC,QAAQ,CAACH,GAAG,CAACxC,IAAI,CAACyC,SAAS,CAAC;AAAA;AAErE9C,WAAW,CAACiD,WAAW,GAAG,UAAC5B,OAAO,EAAE6B,OAAO,EAAK;EAC9C,IAAI,CAAC7B,OAAO,EAAE;IACZ,OAAO,iBAAQC,MAAM,CAAC,IAAIC,kBAAc,CAAC,4BAA4B,CAAC,CAAC;EACzE;EAEAI,gBAAO,CAACC,SAAS,CAAC;IAACC,KAAK,EAAEC,iBAAS,CAACqB,kBAAkB;IAAE9B,OAAO,EAAPA;EAAO,CAAC,CAAC;;EAEjE;EACA;EACA;EACA,OAAOA,OAAO,CAACW,cAAc,CAC1BiB,WAAW,CAAC;IACXG,cAAc,EAAE/B,OAAO,CAACgC,cAAc,IAAIhC,OAAO,CAACiC,MAAM;IACxDC,aAAa,EAAElC,OAAO,CAACkC,aAAa;IACpCrB,SAAS,EAAEb,OAAO,CAACa,SAAS;IAC5B3B,QAAQ,EAAEc,OAAO,CAACd,QAAQ;IAC1B4B,aAAa,EAAEd,OAAO,CAACc,aAAa;IACpCqB,WAAW,EAAEN,OAAO,CAACM,WAAW;IAChCC,eAAe,EAAEpC,OAAO,CAACoC,eAAe;IACxCC,UAAU,EAAER,OAAO,CAACQ,UAAU,IAAI,IAAI;IACtCC,SAAS,EAAET,OAAO,CAACS,SAAS;IAC5BC,GAAG,EAAEV,OAAO,CAACU,GAAG;IAChBC,cAAc,EAAEX,OAAO,CAACW,cAAc;IACtCzB,iBAAiB,EAAE,CAACf,OAAO,CAACgB,aAAa;IACzCyB,kBAAkB,EAAEZ,OAAO,CAACY;EAC9B,CAAC,CAAC,CACDxB,IAAI,CAAC,UAACyB,GAAG,EAAK;IACbpC,gBAAO,CAACC,SAAS,CAAC;MAChBC,KAAK,EAAEC,iBAAS,CAACkC,mBAAmB;MACpC3C,OAAO,EAAPA,OAAO;MACP4C,IAAI,EAAE;QACJC,OAAO,EAAEA,eAAO,CAACC,WAAW;QAC5B/D,KAAK,EAAE2D,GAAG,CAAC1D,IAAI,CAACD,KAAK;QACrBE,gBAAgB,EAAEyD,GAAG,CAAC1D,IAAI,CAACC,gBAAgB;QAC3C8D,UAAU,EAAEL,GAAG,CAACM,OAAO,CAACC;MAC1B;IACF,CAAC,CAAC;IAEF,OAAOtE,WAAW,CAACC,cAAc,CAAC8D,GAAG,CAAC;EACxC,CAAC,CAAC;AACN,CAAC;AAED/D,WAAW,CAACuE,OAAO,GAAG,UAAClD,OAAO,EAAK;EACjC;EACA,IAAMmD,iBAAiB,GAAGnD,OAAO,CAACoD,aAAa,GAC3CpD,OAAO,CAACoD,aAAa,CAACC,YAAY,EAAE,GACpC,iBAAQC,OAAO,EAAE;EAErB,OAAOH,iBAAiB,CACrBlC,IAAI,CAAC;IAAA,OAAMjB,OAAO,CAACuD,gBAAgB,EAAE;EAAA,EAAC,CACtCtC,IAAI,CAAC;IAAA,OAAMjB,OAAO,CAACwD,eAAe,EAAE;EAAA,EAAC,CACrCvC,IAAI,CAAC;IAAA,OAAMjB,OAAO,CAACyD,iBAAiB,EAAE;EAAA,EAAC,CACvCxC,IAAI,CAAC;IAAA,OAAMjB,OAAO,CAAC0D,oBAAoB,EAAE;EAAA,EAAC,CAC1CzC,IAAI,CAAC,YAAM;IACVjB,OAAO,CAAC2D,oBAAoB,EAAE;IAC9B3D,OAAO,CAAC4D,oBAAoB,EAAE;IAC9B5D,OAAO,CAAC6D,iBAAiB,EAAE;IAC3B7D,OAAO,CAAC8D,oBAAoB,EAAE;IAC9B9D,OAAO,CAAC+D,mBAAmB,CAACb,OAAO,EAAE;EACvC,CAAC,CAAC,CACDjC,IAAI,CAAC;IAAA,OAAMjB,OAAO,CAACgE,aAAa,EAAE;EAAA,EAAC,CACnC/C,IAAI,CAAC;IAAA,OAAMjB,OAAO,CAACiE,mBAAmB,EAAE;EAAA,EAAC;AAC9C,CAAC;AAEDtF,WAAW,CAACuF,oBAAoB,GAAG,UAAClE,OAAO,EAAEmE,QAAQ,EAAK;EACxD,IAAInE,OAAO,CAACoE,YAAY,KAAKC,qBAAU,CAACC,QAAQ,EAAE;IAChD,OAAO,iBAAQrE,MAAM,CAAC,IAAIsE,kCAAqB,EAAE,CAAC;EACpD;EAEA,IAAM1C,OAAO,GAAG;IACd3C,QAAQ,EAAEc,OAAO,CAACd,QAAQ;IAC1BK,MAAM,EAAES,OAAO,CAACT,MAAM;IACtBuB,aAAa,EAAEd,OAAO,CAACc,aAAa;IACpCqD,QAAQ,EAARA;EACF,CAAC;EAED,OAAOnE,OAAO,CAACW,cAAc,CAC1BuD,oBAAoB,CAACrC,OAAO,CAAC,CAC7BZ,IAAI,CAAC,UAACpC,QAAQ,EAAK;IAAA;IAClB,IAAIA,QAAQ,aAARA,QAAQ,iCAARA,QAAQ,CAAEG,IAAI,2CAAd,eAAgBD,KAAK,EAAE;MACzBiB,OAAO,CAACwE,SAAS,CAACC,WAAW,CAAC5F,QAAQ,CAACG,IAAI,CAACD,KAAK,CAAC;IACpD;EACF,CAAC,CAAC,CACD2F,KAAK,CAAC,UAAClD,GAAG,EAAK;IACdmD,oBAAW,CAACC,MAAM,CAACC,KAAK,6GAC+E7E,OAAO,CAACP,EAAE,sBAAY+B,GAAG,EAC/H;IAED,OAAO,iBAAQvB,MAAM,CAACuB,GAAG,CAAC;EAC5B,CAAC,CAAC;AACN,CAAC;;AAED;AACA;AACA;AACA;AACA7C,WAAW,CAACmG,YAAY,GAAG,UAAC9E,OAAO,EAAwB;EAAA,IAAtB6B,OAAY,uEAAG,CAAC,CAAC;EACpD,IAAI7B,OAAO,CAACoE,YAAY,KAAKC,qBAAU,CAACC,QAAQ,EAAE;IAChD;IACA,OAAO,iBAAQrE,MAAM,CAAC,IAAIsE,kCAAqB,EAAE,CAAC;EACpD;EAEA,IAAI5F,WAAW,CAACoG,iBAAiB,CAAC/E,OAAO,CAACwE,SAAS,CAAC,EAAE;IACpD,OAAO,iBAAQvE,MAAM,CAAC,IAAI+E,+BAAkB,EAAE,CAAC;EACjD;EAEA,IAAMC,cAAc,GAAG;IACrB/F,QAAQ,EAAEc,OAAO,CAACd,QAAQ;IAC1BK,MAAM,EAAES,OAAO,CAACT,MAAM;IACtBuB,aAAa,EAAEd,OAAO,CAACc,aAAa;IACpCuB,UAAU,EAAErC,OAAO,CAACqC,UAAU;IAC9BxB,SAAS,EAAEb,OAAO,CAACa;EACrB,CAAC;EAED,IAAMqE,YAAY,mCAAOD,cAAc,GAAKpD,OAAO,CAAC;EAEpD,OAAO7B,OAAO,CAACW,cAAc,CAC1BmE,YAAY,CAACI,YAAY,CAAC,CAC1BjE,IAAI,CAAC,UAACpC,QAAQ,EAAK;IAClB,IAAIA,QAAQ,IAAIA,QAAQ,CAACG,IAAI,IAAIH,QAAQ,CAACG,IAAI,CAACD,KAAK,EAAE;MACpD;MACAiB,OAAO,CAACwE,SAAS,CAACC,WAAW,CAAC5F,QAAQ,CAACG,IAAI,CAACD,KAAK,CAAC;IACpD;IAEA,OAAO,iBAAQuE,OAAO,EAAE;EAC1B,CAAC,CAAC,CACDrC,IAAI,CAAC,YAAM;IACV,IAAIY,OAAO,CAACsD,WAAW,EAAE;MACvB,OAAO,iBAAQ7B,OAAO,EAAE;IAC1B;IAEA,OAAO3E,WAAW,CAACuE,OAAO,CAAClD,OAAO,CAAC;EACrC,CAAC,CAAC,CACD0E,KAAK,CAAC,UAAClD,GAAG,EAAK;IACd;IACA;IACA;IACAmD,oBAAW,CAACC,MAAM,CAACC,KAAK,sGACwE7E,OAAO,CAACP,EAAE,sBAAY+B,GAAG,EACxH;IAED,OAAO,iBAAQvB,MAAM,CAACuB,GAAG,CAAC;EAC5B,CAAC,CAAC;AACN,CAAC;AACD7C,WAAW,CAACyG,cAAc,GAAG,UAACpF,OAAO,EAAEqF,MAAM;EAAA,OAC3CrF,OAAO,CAACW,cAAc,CAACyE,cAAc,CAAC;IACpClG,QAAQ,EAAEc,OAAO,CAACd,QAAQ;IAC1B2B,SAAS,EAAEb,OAAO,CAACa,SAAS;IAC5BwE,MAAM,EAANA;EACF,CAAC,CAAC;AAAA;AAEJ1G,WAAW,CAACoG,iBAAiB,GAAG,UAACP,SAAS;EAAA;EAAA,OAAK,0BAAAA,SAAS,CAACc,WAAW,oFAArB,sBAAuB9F,IAAI,2DAA3B,uBAA6B+F,KAAK,MAAKC,iBAAM;AAAA;AAE5F7G,WAAW,CAAC8G,iBAAiB,GAAG,UAACjB,SAAS;EAAA;EAAA,OAAK,2BAAAA,SAAS,CAACc,WAAW,qFAArB,uBAAuB9F,IAAI,2DAA3B,uBAA6B+F,KAAK,MAAKG,iBAAM;AAAA;AAE5F/G,WAAW,CAACgH,mBAAmB,GAAG,UAACnB,SAAS;EAAA;EAAA,OAAK,2BAAAA,SAAS,CAACc,WAAW,qFAArB,uBAAuB9F,IAAI,2DAA3B,uBAA6B+F,KAAK,MAAKK,mBAAQ;AAAA;AAEhGjH,WAAW,CAACkH,kBAAkB,GAAG,UAACC,kBAAkB;EAAA,OAClDA,kBAAkB,KACjBA,kBAAkB,CAACC,KAAK,IAAID,kBAAkB,CAACE,KAAK,IAAIF,kBAAkB,CAACG,KAAK,CAAC;AAAA;AAEpFtH,WAAW,CAACuH,kBAAkB,GAAG,UAAClG,OAAO,EAAwB;EAAA,IAAtB6B,OAAY,uEAAG,CAAC,CAAC;EAC1D7B,OAAO,CAACqC,UAAU,GAAGrC,OAAO,CAACqC,UAAU,IAAIR,OAAO,CAACQ,UAAU;EAE7D,IAAIrC,OAAO,CAACmG,eAAe,EAAE;IAC3B,OAAO,iBAAQlG,MAAM,CAAC,IAAImG,qBAAY,EAAE,CAAC;EAC3C;EACA,IAAIpG,OAAO,CAACqG,cAAc,KAAKC,0BAAe,CAACC,QAAQ,EAAE;IACvD,OAAO,iBAAQtG,MAAM,CAAC,IAAIuG,sBAAa,EAAE,CAAC;EAC5C;EAEA,IAAI3E,OAAO,CAACU,GAAG,EAAE;IACfjC,gBAAO,CAACC,SAAS,CAAC;MAChBC,KAAK,EAAEC,iBAAS,CAACgG,aAAa;MAC9BzG,OAAO,EAAPA;IACF,CAAC,CAAC;EACJ;;EAEA;EACA,OAAOrB,WAAW,CAACiD,WAAW,CAAC5B,OAAO,EAAE6B,OAAO,CAAC,CAC7CZ,IAAI,CAAC,UAACpC,QAAQ,EAAK;IAClBmB,OAAO,CAAC0G,QAAQ,CAAC7H,QAAQ,CAAC;IAE1B,OAAO,iBAAQyE,OAAO,CAACzE,QAAQ,CAAC;EAClC,CAAC,CAAC,CACD6F,KAAK,CAAC,UAAClD,GAAG,EAAK;IACd;IACA,IAAI7C,WAAW,CAAC4C,YAAY,CAACC,GAAG,CAAC,EAAE;MACjClB,gBAAO,CAACC,SAAS,CAAC;QAChBC,KAAK,EAAEC,iBAAS,CAACkG,UAAU;QAC3B3G,OAAO,EAAPA;MACF,CAAC,CAAC;;MAEF;MACA;MACA,OAAO,iBAAQC,MAAM,CAAC,IAAI2G,qBAAiB,CAAC,uBAAuB,EAAEpF,GAAG,CAAC,CAAC;IAC5E;IACAmD,oBAAW,CAACC,MAAM,CAACC,KAAK,CAAC,8DAA8D,EAAErD,GAAG,CAAC;IAE7F,OAAO,iBAAQvB,MAAM,CAAC,IAAI4G,oBAAgB,CAAChF,OAAO,EAAE,uBAAuB,EAAEL,GAAG,CAAC,CAAC;EACpF,CAAC,CAAC;AACN,CAAC;AAED7C,WAAW,CAACmI,eAAe,GAAG,UAACjF,OAAO,EAAK;EACzC,IAAOkF,SAAS,GAAmDlF,OAAO,CAAnEkF,SAAS;IAAEC,SAAS,GAAwCnF,OAAO,CAAxDmF,SAAS;IAAEC,SAAS,GAA6BpF,OAAO,CAA7CoF,SAAS;IAAEC,WAAW,GAAgBrF,OAAO,CAAlCqF,WAAW;IAAEC,UAAU,GAAItF,OAAO,CAArBsF,UAAU;EAE/D,IAAIJ,SAAS,IAAI,CAACpI,WAAW,CAACyI,QAAQ,CAACF,WAAW,CAAC,CAACG,UAAU,EAAE;IAC9D,OAAO,iBAAQpH,MAAM,CAAC,IAAIC,kBAAc,CAAC,iCAAiC,CAAC,CAAC;EAC9E;EAEA,IAAI8G,SAAS,IAAI,CAACrI,WAAW,CAACyI,QAAQ,CAACF,WAAW,CAAC,CAACI,UAAU,EAAE;IAC9D,OAAO,iBAAQrH,MAAM,CAAC,IAAIC,kBAAc,CAAC,iCAAiC,CAAC,CAAC;EAC9E;EAEA,IAAI+G,SAAS,IAAI,CAACtI,WAAW,CAACyI,QAAQ,CAACD,UAAU,CAAC,CAACE,UAAU,EAAE;IAC7D,OAAO,iBAAQpH,MAAM,CAAC,IAAIC,kBAAc,CAAC,iCAAiC,CAAC,CAAC;EAC9E;EAEA,OAAO,iBAAQoD,OAAO,EAAE;AAC1B,CAAC;AAED3E,WAAW,CAACyI,QAAQ,GAAG,UAACG,MAAM,EAAK;EACjC,IAAID,UAAU,GAAG,IAAI;EACrB,IAAID,UAAU,GAAG,IAAI;EACrB,IAAIG,WAAW,GAAG,IAAI;EACtB,IAAIC,WAAW,GAAG,IAAI;EAEtB,IAAI,CAACF,MAAM,EAAE;IACX,OAAO;MAACD,UAAU,EAAE,IAAI;MAAED,UAAU,EAAE;IAAI,CAAC;EAC7C;EACA,IAAIE,MAAM,CAACG,cAAc,EAAE;IACzBF,WAAW,GAAGD,MAAM,CAACG,cAAc,EAAE;EACvC;EACA,IAAIH,MAAM,CAACI,cAAc,EAAE;IACzBF,WAAW,GAAGF,MAAM,CAACI,cAAc,EAAE;EACvC;EAEA,IAAIH,WAAW,IAAIA,WAAW,CAACI,MAAM,GAAG,CAAC,EAAE;IAAA,mBAC1BJ,WAAW;IAAA;IAAzBF,UAAU;EACb;EAEA,IAAIG,WAAW,IAAIA,WAAW,CAACG,MAAM,GAAG,CAAC,EAAE;IAAA,mBAC1BH,WAAW;IAAA;IAAzBJ,UAAU;EACb;EAEA,OAAO;IAACC,UAAU,EAAVA,UAAU;IAAED,UAAU,EAAVA;EAAU,CAAC;AACjC,CAAC;AAED1I,WAAW,CAACkJ,yBAAyB,GAAG,UAACrD,SAAS;EAAA,OAChDA,SAAS,IACTA,SAAS,CAACc,WAAW,IACrBd,SAAS,CAACc,WAAW,CAAClE,IAAI,IAC1BoD,SAAS,CAACc,WAAW,CAAClE,IAAI,IAC1BoD,SAAS,CAACc,WAAW,CAAClE,IAAI,CAACkB,SAAS;AAAA;AAEtC3D,WAAW,CAACmJ,sBAAsB,GAAG,UAACtD,SAAS;EAAA,OAC7CA,SAAS,IACTA,SAAS,CAACc,WAAW,IACrBd,SAAS,CAACc,WAAW,CAAClE,IAAI,IAC1BoD,SAAS,CAACc,WAAW,CAAClE,IAAI,IAC1BoD,SAAS,CAACc,WAAW,CAAClE,IAAI,CAAC2G,MAAM;AAAA;AAEnCpJ,WAAW,CAACqJ,gCAAgC,GAAG,UAACxD,SAAS;EAAA;EAAA,OACvD,CAAAA,SAAS,aAATA,SAAS,iDAATA,SAAS,CAAEc,WAAW,qFAAtB,uBAAwBlE,IAAI,2DAA5B,uBAA8B6G,gBAAgB,KAAI,EAAE;AAAA;AAEtDtJ,WAAW,CAACuJ,wBAAwB,GAAG,UAACC,YAAY;EAAA,OAClDA,YAAY,CAACxG,QAAQ,CAACyG,wBAAa,CAACC,SAAS,CAAC;AAAA;AAEhD1J,WAAW,CAAC2J,mBAAmB,GAAG,UAACH,YAAY;EAAA,OAC7CA,YAAY,CAACxG,QAAQ,CAACyG,wBAAa,CAACG,sBAAsB,CAAC;AAAA;AAE7D5J,WAAW,CAAC6J,WAAW,GAAG,UAACL,YAAY;EAAA,OACrCA,YAAY,CAACxG,QAAQ,CAACyG,wBAAa,CAACK,iBAAiB,CAAC,IACtDN,YAAY,CAACxG,QAAQ,CAACyG,wBAAa,CAACM,oBAAoB,CAAC;AAAA;AAE3D/J,WAAW,CAACgK,aAAa,GAAG,UAACR,YAAY;EAAA,OACvCA,YAAY,CAACxG,QAAQ,CAACyG,wBAAa,CAACQ,mBAAmB,CAAC,IACxDT,YAAY,CAACxG,QAAQ,CAACyG,wBAAa,CAACS,kBAAkB,CAAC;AAAA;AAEzDlK,WAAW,CAACmK,aAAa,GAAG,UAACX,YAAY;EAAA,OACvCA,YAAY,CAACxG,QAAQ,CAACyG,wBAAa,CAACW,uBAAuB,CAAC;AAAA;AAE9DpK,WAAW,CAACqK,YAAY,GAAG,UAACb,YAAY;EAAA,OACtCA,YAAY,CAACxG,QAAQ,CAACyG,wBAAa,CAACa,uBAAuB,CAAC;AAAA;AAE9DtK,WAAW,CAACuK,aAAa,GAAG,UAACf,YAAY;EAAA,OACvCA,YAAY,CAACxG,QAAQ,CAACyG,wBAAa,CAACe,wBAAwB,CAAC;AAAA;AAE/DxK,WAAW,CAACyK,WAAW,GAAG,UAACjB,YAAY;EAAA,OACrCA,YAAY,CAACxG,QAAQ,CAACyG,wBAAa,CAACiB,sBAAsB,CAAC;AAAA;AAE7D1K,WAAW,CAAC2K,cAAc,GAAG,UAACC,OAAO,EAAErK,QAAQ,EAAEsF,SAAS,EAAK;EAC7D,IAAM2D,YAAY,GAAGxJ,WAAW,CAACqJ,gCAAgC,CAACxD,SAAS,CAAC;EAE5E,IAAI7F,WAAW,CAACmK,aAAa,CAACX,YAAY,CAAC,EAAE;IAC3C,OAAOoB,OAAO,CAACC,aAAa,CAAC;MAACtK,QAAQ,EAARA,QAAQ;MAAEuK,SAAS,EAAE,IAAI;MAAEC,MAAM,EAAE;IAAK,CAAC,CAAC;EAC1E;EAEA,OAAO,iBAAQzJ,MAAM,CACnB,IAAI0J,mBAAe,CAAC,yDAAyD,CAAC,CAC/E;AACH,CAAC;AAEDhL,WAAW,CAACiL,cAAc,GAAG,UAACL,OAAO,EAAErK,QAAQ,EAAEsF,SAAS,EAAK;EAC7D,IAAM2D,YAAY,GAAGxJ,WAAW,CAACqJ,gCAAgC,CAACxD,SAAS,CAAC;EAE5E,IAAI7F,WAAW,CAACqK,YAAY,CAACb,YAAY,CAAC,EAAE;IAC1C,OAAOoB,OAAO,CAACC,aAAa,CAAC;MAACtK,QAAQ,EAARA,QAAQ;MAAEuK,SAAS,EAAE,IAAI;MAAEC,MAAM,EAAE;IAAI,CAAC,CAAC;EACzE;EAEA,OAAO,iBAAQzJ,MAAM,CACnB,IAAI0J,mBAAe,CAAC,yDAAyD,CAAC,CAC/E;AACH,CAAC;AAEDhL,WAAW,CAACkL,eAAe,GAAG,UAACN,OAAO,EAAErK,QAAQ,EAAEsF,SAAS,EAAK;EAC9D,IAAM2D,YAAY,GAAGxJ,WAAW,CAACqJ,gCAAgC,CAACxD,SAAS,CAAC;EAE5E,IAAI7F,WAAW,CAACuK,aAAa,CAACf,YAAY,CAAC,EAAE;IAC3C,OAAOoB,OAAO,CAACC,aAAa,CAAC;MAACtK,QAAQ,EAARA,QAAQ;MAAEuK,SAAS,EAAE,IAAI;MAAEC,MAAM,EAAE;IAAK,CAAC,CAAC;EAC1E;EAEA,OAAO,iBAAQzJ,MAAM,CACnB,IAAI0J,mBAAe,CAAC,0DAA0D,CAAC,CAChF;AACH,CAAC;AAEDhL,WAAW,CAACmL,aAAa,GAAG,UAACP,OAAO,EAAErK,QAAQ,EAAEsF,SAAS,EAAK;EAC5D,IAAM2D,YAAY,GAAGxJ,WAAW,CAACqJ,gCAAgC,CAACxD,SAAS,CAAC;EAE5E,IAAI7F,WAAW,CAACyK,WAAW,CAACjB,YAAY,CAAC,EAAE;IACzC,OAAOoB,OAAO,CAACC,aAAa,CAAC;MAACtK,QAAQ,EAARA,QAAQ;MAAEuK,SAAS,EAAE,KAAK;MAAEC,MAAM,EAAE;IAAK,CAAC,CAAC;EAC3E;EAEA,OAAO,iBAAQzJ,MAAM,CACnB,IAAI0J,mBAAe,CAAC,wDAAwD,CAAC,CAC9E;AACH,CAAC;AAEDhL,WAAW,CAACoL,gBAAgB,GAAG,UAAC5B,YAAY;EAAA,OAAKA,YAAY,CAACxG,QAAQ,CAACyG,wBAAa,CAAC4B,UAAU,CAAC;AAAA;AAEhGrL,WAAW,CAACsL,oBAAoB,GAAG,UAAC9B,YAAY;EAAA,OAC9CA,YAAY,CAACxG,QAAQ,CAACyG,wBAAa,CAAC8B,eAAe,CAAC;AAAA;AAEtDvL,WAAW,CAACwL,4BAA4B,GAAG,UAAChC,YAAY;EAAA,OACtDA,YAAY,CAACxG,QAAQ,CAACyG,wBAAa,CAACgC,wBAAwB,CAAC;AAAA;AAE/DzL,WAAW,CAAC0L,+BAA+B,GAAG,UAAClC,YAAY;EAAA,OACzDA,YAAY,CAACxG,QAAQ,CAACyG,wBAAa,CAACkC,+BAA+B,CAAC,IACpEnC,YAAY,CAACxG,QAAQ,CAACyG,wBAAa,CAACmC,iBAAiB,CAAC;AAAA;AAExD5L,WAAW,CAAC6L,WAAW,GAAG,UAACC,OAAO,EAAElB,OAAO,EAAErK,QAAQ,EAAK;EACxD,IAAIuL,OAAO,IAAIA,OAAO,CAACC,OAAO,EAAE;IAC9B,OAAOnB,OAAO,CAACiB,WAAW,CAAC;MAACtL,QAAQ,EAARA,QAAQ;MAAEyL,IAAI,EAAE;IAAI,CAAC,CAAC;EACpD;EAEA,OAAO,iBAAQ1K,MAAM,CAAC,IAAI0J,mBAAe,CAAC,2CAA2C,CAAC,CAAC;AACzF,CAAC;AAEDhL,WAAW,CAACiM,aAAa,GAAG,UAACH,OAAO,EAAElB,OAAO,EAAErK,QAAQ,EAAK;EAC1D,IAAIuL,OAAO,IAAIA,OAAO,CAACI,SAAS,EAAE;IAChC,OAAOtB,OAAO,CAACiB,WAAW,CAAC;MAACtL,QAAQ,EAARA,QAAQ;MAAEyL,IAAI,EAAE;IAAK,CAAC,CAAC;EACrD;EAEA,OAAO,iBAAQ1K,MAAM,CAAC,IAAI0J,mBAAe,CAAC,6CAA6C,CAAC,CAAC;AAC3F,CAAC;AAEDhL,WAAW,CAACmM,kBAAkB,GAAG,UAACxD,UAAU,EAAK;EAC/C,IAAMyD,UAAU,GAAG,oCAAoC;EAEvD,IAAIzD,UAAU,EAAE;IACd,IAAM0D,QAAQ,GAAG1D,UAAU,CAAC2D,WAAW,EAAE;IACzC,IAAOC,QAAQ,GAAIF,QAAQ,CAApBE,QAAQ;IAEfvG,oBAAW,CAACC,MAAM,CAACuG,GAAG,CAACJ,UAAU,uBAAgBG,QAAQ,EAAG;IAC5DvG,oBAAW,CAACC,MAAM,CAACuG,GAAG,CAACJ,UAAU,EAAE,YAAY,EAAE,wBAAeC,QAAQ,CAAC,CAAC;EAC5E;AACF,CAAC;AAEDrM,WAAW,CAACyM,kBAAkB,GAAG,UAAC/D,UAAU,EAAK;EAC/C,IAAM0D,UAAU,GAAG,oCAAoC;EAEvD,IAAI1D,UAAU,EAAE;IACd,IAAM2D,QAAQ,GAAG3D,UAAU,CAAC4D,WAAW,EAAE;IACzC,IAAOC,QAAQ,GAAIF,QAAQ,CAApBE,QAAQ;IAEfvG,oBAAW,CAACC,MAAM,CAACuG,GAAG,CAACJ,UAAU,uBAAgBG,QAAQ,EAAG;IAC5DvG,oBAAW,CAACC,MAAM,CAACuG,GAAG,CAACJ,UAAU,EAAE,YAAY,EAAE,wBAAeC,QAAQ,CAAC,CAAC;EAC5E;AACF,CAAC;AAEDrM,WAAW,CAAC0M,mBAAmB,GAAG,YAAkB;EAAA,IAAjBC,OAAO,uEAAG,EAAE;EAC7C,IAAMP,UAAU,GAAG,qCAAqC;EAExDO,OAAO,CAAC5L,OAAO,CAAC,UAAC6L,MAAM,EAAK;IAC1B5G,oBAAW,CAACC,MAAM,CAACuG,GAAG,CAACJ,UAAU,uBAAgBQ,MAAM,CAACL,QAAQ,EAAG;IACnEvG,oBAAW,CAACC,MAAM,CAACuG,GAAG,CAACJ,UAAU,EAAE,UAAU,EAAE,wBAAeQ,MAAM,CAAC,CAAC;EACxE,CAAC,CAAC;AACJ,CAAC;AAED5M,WAAW,CAAC6M,gBAAgB,GAAG,UAACxL,OAAO,EAAK;EAC1C,IAAIA,OAAO,CAACoE,YAAY,KAAKC,qBAAU,CAACC,QAAQ,EAAE;IAChD,OAAO,iBAAQrE,MAAM,CAAC,IAAIsE,kCAAqB,EAAE,CAAC;EACpD;EAEA,IAAMkH,UAAU,GAAG;IACjBvM,QAAQ,EAAEc,OAAO,CAACd;EACpB,CAAC;EAED,OAAOc,OAAO,CAACW,cAAc,CAC1B6K,gBAAgB,CAACC,UAAU,CAAC,CAC5BxK,IAAI,CAAC,UAACpC,QAAQ,EAAK;IAClB,IAAIA,QAAQ,IAAIA,QAAQ,CAACG,IAAI,IAAIH,QAAQ,CAACG,IAAI,CAACD,KAAK,EAAE;MACpDiB,OAAO,CAACwE,SAAS,CAACC,WAAW,CAAC5F,QAAQ,CAACG,IAAI,CAACD,KAAK,CAAC;IACpD;IAEA,OAAO,iBAAQuE,OAAO,EAAE;EAC1B,CAAC,CAAC,CACDrC,IAAI,CAAC;IAAA,OAAMtC,WAAW,CAACuE,OAAO,CAAClD,OAAO,CAAC;EAAA,EAAC,CACxC0E,KAAK,CAAC,UAAClD,GAAG,EAAK;IACdmD,oBAAW,CAACC,MAAM,CAACC,KAAK,4GAC8E7E,OAAO,CAACP,EAAE,sBAAY+B,GAAG,EAC9H;IAED,OAAO,iBAAQvB,MAAM,CAACuB,GAAG,CAAC;EAC5B,CAAC,CAAC;AACN,CAAC;AAED7C,WAAW,CAAC+M,sBAAsB,GAAG,UAACvD,YAAY;EAAA,OAChDA,YAAY,CAACxG,QAAQ,CAACyG,wBAAa,CAACuD,aAAa,CAAC;AAAA;AAEpDhN,WAAW,CAACiN,oBAAoB,GAAG,UAACzD,YAAY;EAAA,OAC9CA,YAAY,CAACxG,QAAQ,CAACyG,wBAAa,CAACyD,2BAA2B,CAAC;AAAA;AAElElN,WAAW,CAACmN,mBAAmB,GAAG,UAAC3D,YAAY;EAAA,OAC7CA,YAAY,CAACxG,QAAQ,CAACyG,wBAAa,CAAC2D,0BAA0B,CAAC;AAAA;AAEjEpN,WAAW,CAACqN,qBAAqB,GAAG,UAAC7D,YAAY;EAAA,OAC/CA,YAAY,CAACxG,QAAQ,CAACyG,wBAAa,CAAC6D,qBAAqB,CAAC;AAAA;AAE5DtN,WAAW,CAACuN,sBAAsB,GAAG,UAAC/D,YAAY;EAAA,OAChDA,YAAY,CAACxG,QAAQ,CAACyG,wBAAa,CAAC+D,6BAA6B,CAAC;AAAA;AAEpExN,WAAW,CAACyN,mBAAmB,GAAG,UAACjE,YAAY;EAAA,OAC7CA,YAAY,CAACxG,QAAQ,CAACyG,wBAAa,CAACiE,oBAAoB,CAAC;AAAA;AAE3D1N,WAAW,CAAC2N,4BAA4B,GAAG,UAACnE,YAAY;EAAA,OACtDA,YAAY,CAACxG,QAAQ,CAACyG,wBAAa,CAACmE,6BAA6B,CAAC;AAAA;AAEpE5N,WAAW,CAAC6N,wBAAwB,GAAG,UAACrE,YAAY;EAAA,OAClDA,YAAY,CAACxG,QAAQ,CAACyG,wBAAa,CAACqE,uBAAuB,CAAC;AAAA;AAE9D9N,WAAW,CAAC+N,sBAAsB,GAAG,UAACvE,YAAY;EAAA,OAChDA,YAAY,CAACxG,QAAQ,CAACyG,wBAAa,CAACuE,kBAAkB,CAAC;AAAA;AAEzDhO,WAAW,CAACiO,kBAAkB,GAAG,UAACC,aAAa,EAAE1E,YAAY,EAAK;EAChE,IAAIA,YAAY,CAACxG,QAAQ,CAACyG,wBAAa,CAAC0E,gBAAgB,CAAC,EAAE;IACzD,OAAO,IAAI;EACb;EACA,IAAI3E,YAAY,CAACxG,QAAQ,CAACyG,wBAAa,CAAC2E,iBAAiB,CAAC,EAAE;IAC1D,OAAO,KAAK;EACd;EAEA,OAAOF,aAAa;AACtB,CAAC;AAEDlO,WAAW,CAACqO,gBAAgB,GAAG,UAACH,aAAa,EAAE1E,YAAY,EAAK;EAC9D,IAAIA,YAAY,CAACxG,QAAQ,CAACyG,wBAAa,CAAC6E,gBAAgB,CAAC,EAAE;IACzD,OAAO,IAAI;EACb;EACA,IAAI9E,YAAY,CAACxG,QAAQ,CAACyG,wBAAa,CAAC8E,kBAAkB,CAAC,EAAE;IAC3D,OAAO,KAAK;EACd;EAEA,OAAOL,aAAa;AACtB,CAAC;AAAC,eAEalO,WAAW;AAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@webex/plugin-meetings",
3
- "version": "3.0.0-beta.16",
3
+ "version": "3.0.0-beta.17",
4
4
  "description": "",
5
5
  "license": "Cisco EULA (https://www.cisco.com/c/en/us/products/end-user-license-agreement.html)",
6
6
  "contributors": [
@@ -28,12 +28,12 @@
28
28
  ]
29
29
  },
30
30
  "devDependencies": {
31
- "@webex/plugin-meetings": "3.0.0-beta.16",
32
- "@webex/test-helper-chai": "3.0.0-beta.16",
33
- "@webex/test-helper-mocha": "3.0.0-beta.16",
34
- "@webex/test-helper-mock-webex": "3.0.0-beta.16",
35
- "@webex/test-helper-retry": "3.0.0-beta.16",
36
- "@webex/test-helper-test-users": "3.0.0-beta.16",
31
+ "@webex/plugin-meetings": "3.0.0-beta.17",
32
+ "@webex/test-helper-chai": "3.0.0-beta.17",
33
+ "@webex/test-helper-mocha": "3.0.0-beta.17",
34
+ "@webex/test-helper-mock-webex": "3.0.0-beta.17",
35
+ "@webex/test-helper-retry": "3.0.0-beta.17",
36
+ "@webex/test-helper-test-users": "3.0.0-beta.17",
37
37
  "chai": "^4.3.4",
38
38
  "chai-as-promised": "^7.1.1",
39
39
  "jsdom-global": "3.0.2",
@@ -41,18 +41,18 @@
41
41
  "typed-emitter": "^2.1.0"
42
42
  },
43
43
  "dependencies": {
44
- "@webex/common": "3.0.0-beta.16",
44
+ "@webex/common": "3.0.0-beta.17",
45
45
  "@webex/internal-media-core": "^0.0.17-beta",
46
- "@webex/internal-plugin-conversation": "3.0.0-beta.16",
47
- "@webex/internal-plugin-device": "3.0.0-beta.16",
48
- "@webex/internal-plugin-llm": "3.0.0-beta.16",
49
- "@webex/internal-plugin-mercury": "3.0.0-beta.16",
50
- "@webex/internal-plugin-metrics": "3.0.0-beta.16",
51
- "@webex/internal-plugin-support": "3.0.0-beta.16",
52
- "@webex/internal-plugin-user": "3.0.0-beta.16",
53
- "@webex/plugin-people": "3.0.0-beta.16",
54
- "@webex/plugin-rooms": "3.0.0-beta.16",
55
- "@webex/webex-core": "3.0.0-beta.16",
46
+ "@webex/internal-plugin-conversation": "3.0.0-beta.17",
47
+ "@webex/internal-plugin-device": "3.0.0-beta.17",
48
+ "@webex/internal-plugin-llm": "3.0.0-beta.17",
49
+ "@webex/internal-plugin-mercury": "3.0.0-beta.17",
50
+ "@webex/internal-plugin-metrics": "3.0.0-beta.17",
51
+ "@webex/internal-plugin-support": "3.0.0-beta.17",
52
+ "@webex/internal-plugin-user": "3.0.0-beta.17",
53
+ "@webex/plugin-people": "3.0.0-beta.17",
54
+ "@webex/plugin-rooms": "3.0.0-beta.17",
55
+ "@webex/webex-core": "3.0.0-beta.17",
56
56
  "bowser": "^2.11.0",
57
57
  "btoa": "^1.2.1",
58
58
  "dotenv": "^4.0.0",
package/src/constants.ts CHANGED
@@ -724,6 +724,10 @@ export const DISPLAY_HINTS = {
724
724
  TRANSCRIPTION_CONTROL_STOP: 'TRANSCRIPTION_CONTROL_STOP',
725
725
  WEBEX_ASSISTANT_STATUS_ACTIVE: 'WEBEX_ASSISTANT_STATUS_ACTIVE',
726
726
  WAITING_FOR_OTHERS: 'WAITING_FOR_OTHERS',
727
+ ENABLE_REACTIONS: 'ENABLE_REACTIONS',
728
+ DISABLE_REACTIONS: 'DISABLE_REACTIONS',
729
+ REACTIONS_ACTIVE: 'REACTIONS_ACTIVE',
730
+ REACTIONS_INACTIVE: 'REACTIONS_INACTIVE',
727
731
  };
728
732
 
729
733
  export const SELF_ROLES = {
@@ -31,6 +31,8 @@ interface IInMeetingActions {
31
31
  isRealTimeTranslationEnabled?: boolean;
32
32
  canSelectSpokenLanguages?: boolean;
33
33
  waitingForOthersToJoin?: boolean;
34
+ canEnableReactions?: boolean;
35
+ canSendReactions?: boolean;
34
36
  }
35
37
 
36
38
  /**
@@ -83,6 +85,10 @@ export default class InMeetingActions implements IInMeetingActions {
83
85
 
84
86
  waitingForOthersToJoin = null;
85
87
 
88
+ canEnableReactions = null;
89
+
90
+ canSendReactions = null;
91
+
86
92
  /**
87
93
  * Returns all meeting action options
88
94
  * @returns {Object}
@@ -110,6 +116,8 @@ export default class InMeetingActions implements IInMeetingActions {
110
116
  isRealTimeTranslationEnabled: this.isRealTimeTranslationEnabled,
111
117
  canSelectSpokenLanguages: this.canSelectSpokenLanguages,
112
118
  waitingForOthersToJoin: this.waitingForOthersToJoin,
119
+ canEnableReactions: this.canEnableReactions,
120
+ canSendReactions: this.canSendReactions,
113
121
  });
114
122
 
115
123
  /**
@@ -2117,6 +2117,14 @@ export default class Meeting extends StatelessWebexPlugin {
2117
2117
  payload.info.userDisplayHints
2118
2118
  ),
2119
2119
  waitingForOthersToJoin: MeetingUtil.waitingForOthersToJoin(payload.info.userDisplayHints),
2120
+ canEnableReactions: MeetingUtil.canEnableReactions(
2121
+ this.inMeetingActions.canEnableReactions,
2122
+ payload.info.userDisplayHints
2123
+ ),
2124
+ canSendReactions: MeetingUtil.canSendReactions(
2125
+ this.inMeetingActions.canSendReactions,
2126
+ payload.info.userDisplayHints
2127
+ ),
2120
2128
  });
2121
2129
 
2122
2130
  if (changed) {
@@ -535,4 +535,26 @@ MeetingUtil.canSelectSpokenLanguages = (displayHints) =>
535
535
  MeetingUtil.waitingForOthersToJoin = (displayHints) =>
536
536
  displayHints.includes(DISPLAY_HINTS.WAITING_FOR_OTHERS);
537
537
 
538
+ MeetingUtil.canEnableReactions = (originalValue, displayHints) => {
539
+ if (displayHints.includes(DISPLAY_HINTS.ENABLE_REACTIONS)) {
540
+ return true;
541
+ }
542
+ if (displayHints.includes(DISPLAY_HINTS.DISABLE_REACTIONS)) {
543
+ return false;
544
+ }
545
+
546
+ return originalValue;
547
+ };
548
+
549
+ MeetingUtil.canSendReactions = (originalValue, displayHints) => {
550
+ if (displayHints.includes(DISPLAY_HINTS.REACTIONS_ACTIVE)) {
551
+ return true;
552
+ }
553
+ if (displayHints.includes(DISPLAY_HINTS.REACTIONS_INACTIVE)) {
554
+ return false;
555
+ }
556
+
557
+ return originalValue;
558
+ };
559
+
538
560
  export default MeetingUtil;
@@ -27,7 +27,9 @@ describe('plugin-meetings', () => {
27
27
  isRealTimeTranslationEnabled: null,
28
28
  canSelectSpokenLanguages: null,
29
29
  waitingForOthersToJoin: null,
30
- ...expected,
30
+ canEnableReactions: null,
31
+ canSendReactions: null,
32
+ ...expected
31
33
  };
32
34
 
33
35
  // Check get retuns all the correct values at once
@@ -61,6 +63,8 @@ describe('plugin-meetings', () => {
61
63
  'isRealTimeTranslationEnabled',
62
64
  'canSelectSpokenLanguages',
63
65
  'waitingForOthersToJoin',
66
+ 'canEnableReactions',
67
+ 'canSendReactions'
64
68
  ].forEach((key) => {
65
69
  it(`get and set for ${key} work as expected`, () => {
66
70
  const inMeetingActions = new InMeetingActions();
@@ -4329,6 +4329,8 @@ describe('plugin-meetings', () => {
4329
4329
  let canUserLowerSomeoneElsesHandSpy;
4330
4330
  let waitingForOthersToJoinSpy;
4331
4331
  let handleDataChannelUrlChangeSpy;
4332
+ let canEnableReactionsSpy;
4333
+ let canSendReactionsSpy;
4332
4334
 
4333
4335
  beforeEach(() => {
4334
4336
  locusInfoOnSpy = sinon.spy(meeting.locusInfo, 'on');
@@ -4348,6 +4350,8 @@ describe('plugin-meetings', () => {
4348
4350
  canUserLowerSomeoneElsesHandSpy = sinon.spy(MeetingUtil, 'canUserLowerSomeoneElsesHand');
4349
4351
  waitingForOthersToJoinSpy = sinon.spy(MeetingUtil, 'waitingForOthersToJoin');
4350
4352
  handleDataChannelUrlChangeSpy = sinon.spy(meeting, 'handleDataChannelUrlChange');
4353
+ canEnableReactionsSpy = sinon.spy(MeetingUtil, 'canEnableReactions');
4354
+ canSendReactionsSpy = sinon.spy(MeetingUtil, 'canSendReactions');
4351
4355
  });
4352
4356
 
4353
4357
  afterEach(() => {
@@ -4387,6 +4391,8 @@ describe('plugin-meetings', () => {
4387
4391
  assert.calledWith(canUserLowerSomeoneElsesHandSpy, payload.info.userDisplayHints);
4388
4392
  assert.calledWith(waitingForOthersToJoinSpy, payload.info.userDisplayHints);
4389
4393
  assert.calledWith(handleDataChannelUrlChangeSpy, payload.info.datachannelUrl);
4394
+ assert.calledWith(canEnableReactionsSpy, null, payload.info.userDisplayHints);
4395
+ assert.calledWith(canSendReactionsSpy, null, payload.info.userDisplayHints);
4390
4396
 
4391
4397
  assert.calledWith(
4392
4398
  TriggerProxy.trigger,
@@ -4,6 +4,7 @@ import MeetingUtil from '@webex/plugin-meetings/src/meeting/util';
4
4
  import LoggerProxy from '@webex/plugin-meetings/src/common/logs/logger-proxy';
5
5
  import LoggerConfig from '@webex/plugin-meetings/src/common/logs/logger-config';
6
6
  import Metrics from '@webex/plugin-meetings/src/metrics/index';
7
+ import {DISPLAY_HINTS} from '@webex/plugin-meetings/dist/constants';
7
8
 
8
9
  describe('plugin-meetings', () => {
9
10
  describe('Meeting utils function', () => {
@@ -413,6 +414,20 @@ describe('plugin-meetings', () => {
413
414
  });
414
415
  });
415
416
 
417
+
418
+ describe('reactions', () => {
419
+ describe('canEnableReactions', () => {
420
+ [[null, DISPLAY_HINTS.ENABLE_REACTIONS, true], [null, DISPLAY_HINTS.DISABLE_REACTIONS, false], [null, undefined, null]].forEach(() => ([originalValue, displayHint, expected]) => {
421
+ assert.deepEqual(MeetingUtil.canEnableReactions(originalValue, [displayHint]), expected);
422
+ });
423
+ });
424
+ describe('canEnableReactions', () => {
425
+ [[null, DISPLAY_HINTS.REACTIONS_ACTIVE, true], [null, DISPLAY_HINTS.REACTIONS_INACTIVE, false], [null, undefined, null]].forEach(([originalValue, displayHint, expected]) => {
426
+ assert.deepEqual(MeetingUtil.canSendReactions(originalValue, [displayHint]), expected);
427
+ });
428
+ });
429
+ });
430
+
416
431
  describe('recording tests', () => {
417
432
  let request;
418
433
  let locusInfo;