@webex/plugin-meetings 2.29.5 → 2.30.1

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.
@@ -554,6 +554,10 @@ MeetingUtil.canUserLowerSomeoneElsesHand = function (displayHints) {
554
554
  return displayHints.includes(_constants.DISPLAY_HINTS.LOWER_SOMEONE_ELSES_HAND);
555
555
  };
556
556
 
557
+ MeetingUtil.bothLeaveAndEndMeetingAvailable = function (displayHints) {
558
+ return displayHints.includes(_constants.DISPLAY_HINTS.LEAVE_TRANSFER_HOST_END_MEETING) || displayHints.includes(_constants.DISPLAY_HINTS.LEAVE_END_MEETING);
559
+ };
560
+
557
561
  MeetingUtil.lockMeeting = function (actions, request, locusUrl) {
558
562
  if (actions && actions.canLock) {
559
563
  return request.lockMeeting({
@@ -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","stopStatsAnalyzer","statsAnalyzer","stopAnalyzer","resolve","closeLocalStream","closeLocalShare","closeRemoteTracks","closePeerConnections","unsetLocalVideoTrack","unsetLocalShareTrack","unsetRemoteTracks","unsetPeerConnections","reconnectionManager","roap","stop","roapSeq","stopKeepAlive","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","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","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","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.js"],"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 {INTENT_TO_JOIN,\n _LEFT_,\n _IDLE_,\n _JOINED_,\n PASSWORD_STATUS,\n DISPLAY_HINTS,\n FULL_STATE} 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 = {};\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 const stopStatsAnalyzer = (meeting.statsAnalyzer) ? meeting.statsAnalyzer.stopAnalyzer() : 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.roap.stop(meeting.correlationId, meeting.roapSeq))\n .then(() => meeting.stopKeepAlive());\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.canInviteNewParticipants = (displayHints) => displayHints.includes(DISPLAY_HINTS.ADD_GUEST);\n\nMeetingUtil.canAdmitParticipant = (displayHints) => displayHints.includes(DISPLAY_HINTS.ROSTER_WAITING_TO_JOIN);\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.canUserLowerSomeoneElsesHand = (displayHints) => displayHints.includes(DISPLAY_HINTS.LOWER_SOMEONE_ELSES_HAND);\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 ${\n meeting.id\n }, error: ${err}`\n );\n\n return Promise.reject(err);\n });\n};\n\nMeetingUtil.canEnableClosedCaption = (displayHints) => displayHints.includes(DISPLAY_HINTS.CAPTION_START);\n\nMeetingUtil.canStartTranscribing = (displayHints) => displayHints.includes(DISPLAY_HINTS.TRANSCRIPTION_CONTROL_START);\n\nMeetingUtil.canStopTranscribing = (displayHints) => displayHints.includes(DISPLAY_HINTS.TRANSCRIPTION_CONTROL_STOP);\n\nMeetingUtil.isClosedCaptionActive = (displayHints) => displayHints.includes(DISPLAY_HINTS.CAPTION_STATUS_ACTIVE);\n\nMeetingUtil.isWebexAssistantActive = (displayHints) => displayHints.includes(DISPLAY_HINTS.WEBEX_ASSISTANT_STATUS_ACTIVE);\n\nMeetingUtil.canViewCaptionPanel = (displayHints) => displayHints.includes(DISPLAY_HINTS.ENABLE_CAPTION_PANEL);\n\nMeetingUtil.isRealTimeTranslationEnabled = (displayHints) => displayHints.includes(DISPLAY_HINTS.DISPLAY_REAL_TIME_TRANSLATION);\n\nMeetingUtil.canSelectSpokenLanguages = (displayHints) => displayHints.includes(DISPLAY_HINTS.DISPLAY_NON_ENGLISH_ASR);\n\nMeetingUtil.waitingForOthersToJoin = (displayHints) => 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","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","stopStatsAnalyzer","statsAnalyzer","stopAnalyzer","resolve","closeLocalStream","closeLocalShare","closeRemoteTracks","closePeerConnections","unsetLocalVideoTrack","unsetLocalShareTrack","unsetRemoteTracks","unsetPeerConnections","reconnectionManager","roap","stop","roapSeq","stopKeepAlive","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","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","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.js"],"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 {INTENT_TO_JOIN,\n _LEFT_,\n _IDLE_,\n _JOINED_,\n PASSWORD_STATUS,\n DISPLAY_HINTS,\n FULL_STATE} 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 = {};\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 const stopStatsAnalyzer = (meeting.statsAnalyzer) ? meeting.statsAnalyzer.stopAnalyzer() : 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.roap.stop(meeting.correlationId, meeting.roapSeq))\n .then(() => meeting.stopKeepAlive());\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.canInviteNewParticipants = (displayHints) => displayHints.includes(DISPLAY_HINTS.ADD_GUEST);\n\nMeetingUtil.canAdmitParticipant = (displayHints) => displayHints.includes(DISPLAY_HINTS.ROSTER_WAITING_TO_JOIN);\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.canUserLowerSomeoneElsesHand = (displayHints) => displayHints.includes(DISPLAY_HINTS.LOWER_SOMEONE_ELSES_HAND);\n\nMeetingUtil.bothLeaveAndEndMeetingAvailable = (displayHints) => displayHints.includes(DISPLAY_HINTS.LEAVE_TRANSFER_HOST_END_MEETING) || 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 ${\n meeting.id\n }, error: ${err}`\n );\n\n return Promise.reject(err);\n });\n};\n\nMeetingUtil.canEnableClosedCaption = (displayHints) => displayHints.includes(DISPLAY_HINTS.CAPTION_START);\n\nMeetingUtil.canStartTranscribing = (displayHints) => displayHints.includes(DISPLAY_HINTS.TRANSCRIPTION_CONTROL_START);\n\nMeetingUtil.canStopTranscribing = (displayHints) => displayHints.includes(DISPLAY_HINTS.TRANSCRIPTION_CONTROL_STOP);\n\nMeetingUtil.isClosedCaptionActive = (displayHints) => displayHints.includes(DISPLAY_HINTS.CAPTION_STATUS_ACTIVE);\n\nMeetingUtil.isWebexAssistantActive = (displayHints) => displayHints.includes(DISPLAY_HINTS.WEBEX_ASSISTANT_STATUS_ACTIVE);\n\nMeetingUtil.canViewCaptionPanel = (displayHints) => displayHints.includes(DISPLAY_HINTS.ENABLE_CAPTION_PANEL);\n\nMeetingUtil.isRealTimeTranslationEnabled = (displayHints) => displayHints.includes(DISPLAY_HINTS.DISPLAY_REAL_TIME_TRANSLATION);\n\nMeetingUtil.canSelectSpokenLanguages = (displayHints) => displayHints.includes(DISPLAY_HINTS.DISPLAY_NON_ENGLISH_ASR);\n\nMeetingUtil.waitingForOthersToJoin = (displayHints) => displayHints.includes(DISPLAY_HINTS.WAITING_FOR_OTHERS);\n\nexport default MeetingUtil;\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,61 +1,61 @@
1
1
  {
2
- "name": "@webex/plugin-meetings",
3
- "version": "2.29.5",
4
- "description": "",
5
- "license": "MIT",
6
- "contributors": [
7
- "Adam Weeks <adweeks@cisco.com> (https://adamweeks.com/)",
8
- "Arun Ganeshan <arungane@cisco.com>",
9
- "Christopher DuBois <chdubois@cisco.com> (https://chrisadubois.github.io/)",
10
- "Matt Norris <matnorri@cisco.com> (http://mattnorris.me)",
11
- "Moriah Maney <momaney@cisco.com>",
12
- "Taymoor Khan <taykhan@cisco.com>"
13
- ],
14
- "main": "dist/index.js",
15
- "devMain": "src/index.js",
16
- "repository": "https://github.com/webex/webex-js-sdk/tree/master/packages/@webex/plugin-meetings",
17
- "engines": {
18
- "node": ">=14"
19
- },
20
- "browserify": {
21
- "transform": [
22
- "babelify",
23
- "envify"
24
- ]
25
- },
26
- "devDependencies": {
27
- "@webex/plugin-meetings": "workspace:^",
28
- "@webex/test-helper-chai": "workspace:^",
29
- "@webex/test-helper-mocha": "workspace:^",
30
- "@webex/test-helper-mock-webex": "workspace:^",
31
- "@webex/test-helper-retry": "workspace:^",
32
- "@webex/test-helper-test-users": "workspace:^",
33
- "chai": "^4.3.4",
34
- "chai-as-promised": "^7.1.1",
35
- "jsdom-global": "3.0.2",
36
- "sinon": "^9.2.4"
37
- },
38
- "dependencies": {
39
- "@webex/common": "workspace:^",
40
- "@webex/internal-media-core": "^0.0.7-beta",
41
- "@webex/internal-plugin-conversation": "workspace:^",
42
- "@webex/internal-plugin-device": "workspace:^",
43
- "@webex/internal-plugin-mercury": "workspace:^",
44
- "@webex/internal-plugin-metrics": "workspace:^",
45
- "@webex/internal-plugin-support": "workspace:^",
46
- "@webex/internal-plugin-user": "workspace:^",
47
- "@webex/plugin-people": "workspace:^",
48
- "@webex/plugin-rooms": "workspace:^",
49
- "@webex/webex-core": "workspace:^",
50
- "bowser": "^2.11.0",
51
- "btoa": "^1.2.1",
52
- "dotenv": "^4.0.0",
53
- "global": "^4.4.0",
54
- "ip-anonymize": "^0.1.0",
55
- "javascript-state-machine": "^3.1.0",
56
- "lodash": "^4.17.21",
57
- "sdp-transform": "^2.12.0",
58
- "uuid": "^3.3.2",
59
- "webrtc-adapter": "^7.7.0"
60
- }
2
+ "name": "@webex/plugin-meetings",
3
+ "version": "2.30.1",
4
+ "description": "",
5
+ "license": "MIT",
6
+ "contributors": [
7
+ "Adam Weeks <adweeks@cisco.com> (https://adamweeks.com/)",
8
+ "Arun Ganeshan <arungane@cisco.com>",
9
+ "Christopher DuBois <chdubois@cisco.com> (https://chrisadubois.github.io/)",
10
+ "Matt Norris <matnorri@cisco.com> (http://mattnorris.me)",
11
+ "Moriah Maney <momaney@cisco.com>",
12
+ "Taymoor Khan <taykhan@cisco.com>"
13
+ ],
14
+ "main": "dist/index.js",
15
+ "devMain": "src/index.js",
16
+ "repository": "https://github.com/webex/webex-js-sdk/tree/master/packages/@webex/plugin-meetings",
17
+ "engines": {
18
+ "node": ">=14"
19
+ },
20
+ "browserify": {
21
+ "transform": [
22
+ "babelify",
23
+ "envify"
24
+ ]
25
+ },
26
+ "devDependencies": {
27
+ "@webex/plugin-meetings": "2.30.1",
28
+ "@webex/test-helper-chai": "2.30.1",
29
+ "@webex/test-helper-mocha": "2.30.1",
30
+ "@webex/test-helper-mock-webex": "2.30.1",
31
+ "@webex/test-helper-retry": "2.30.1",
32
+ "@webex/test-helper-test-users": "2.30.1",
33
+ "chai": "^4.3.4",
34
+ "chai-as-promised": "^7.1.1",
35
+ "jsdom-global": "3.0.2",
36
+ "sinon": "^9.2.4"
37
+ },
38
+ "dependencies": {
39
+ "@webex/common": "2.30.1",
40
+ "@webex/internal-media-core": "^0.0.7-beta",
41
+ "@webex/internal-plugin-conversation": "2.30.1",
42
+ "@webex/internal-plugin-device": "2.30.1",
43
+ "@webex/internal-plugin-mercury": "2.30.1",
44
+ "@webex/internal-plugin-metrics": "2.30.1",
45
+ "@webex/internal-plugin-support": "2.30.1",
46
+ "@webex/internal-plugin-user": "2.30.1",
47
+ "@webex/plugin-people": "2.30.1",
48
+ "@webex/plugin-rooms": "2.30.1",
49
+ "@webex/webex-core": "2.30.1",
50
+ "bowser": "^2.11.0",
51
+ "btoa": "^1.2.1",
52
+ "dotenv": "^4.0.0",
53
+ "global": "^4.4.0",
54
+ "ip-anonymize": "^0.1.0",
55
+ "javascript-state-machine": "^3.1.0",
56
+ "lodash": "^4.17.21",
57
+ "sdp-transform": "^2.12.0",
58
+ "uuid": "^3.3.2",
59
+ "webrtc-adapter": "^7.7.0"
60
+ }
61
61
  }
package/src/constants.ts CHANGED
@@ -684,6 +684,8 @@ export const DISPLAY_HINTS = {
684
684
  RAISE_HAND: 'RAISE_HAND',
685
685
  LOWER_ALL_HANDS: 'LOWER_ALL_HANDS',
686
686
  LOWER_SOMEONE_ELSES_HAND: 'LOWER_SOMEONE_ELSES_HAND',
687
+ LEAVE_TRANSFER_HOST_END_MEETING: 'LEAVE_TRANSFER_HOST_END_MEETING',
688
+ LEAVE_END_MEETING: 'LEAVE_END_MEETING',
687
689
  CAPTION_START: 'CAPTION_START',
688
690
  CAPTION_STATUS_ACTIVE: 'CAPTION_STATUS_ACTIVE',
689
691
  DISPLAY_REAL_TIME_TRANSLATION: 'DISPLAY_REAL_TIME_TRANSLATION',
@@ -23,6 +23,7 @@ interface IInMeetingActions {
23
23
  canRaiseHand?: boolean;
24
24
  canLowerAllHands?: boolean;
25
25
  canLowerSomeoneElsesHand?: boolean;
26
+ bothLeaveAndEndMeetingAvailable?: boolean;
26
27
  canEnableClosedCaption?: boolean;
27
28
  canStartTranscribing?: boolean;
28
29
  canStopTranscribing?: boolean;
@@ -64,6 +65,8 @@ export default class InMeetingActions implements IInMeetingActions {
64
65
 
65
66
  canLowerSomeoneElsesHand = null;
66
67
 
68
+ bothLeaveAndEndMeetingAvailable = null;
69
+
67
70
  canEnableClosedCaption = null;
68
71
 
69
72
  canStartTranscribing = null;
@@ -99,6 +102,7 @@ export default class InMeetingActions implements IInMeetingActions {
99
102
  canRaiseHand: this.canRaiseHand,
100
103
  canLowerAllHands: this.canLowerAllHands,
101
104
  canLowerSomeoneElsesHand: this.canLowerSomeoneElsesHand,
105
+ bothLeaveAndEndMeetingAvailable: this.bothLeaveAndEndMeetingAvailable,
102
106
  canEnableClosedCaption: this.canEnableClosedCaption,
103
107
  canStartTranscribing: this.canStartTranscribing,
104
108
  canStopTranscribing: this.canStopTranscribing,
@@ -1889,6 +1889,7 @@ export default class Meeting extends StatelessWebexPlugin {
1889
1889
  canRaiseHand: MeetingUtil.canUserRaiseHand(payload.info.userDisplayHints),
1890
1890
  canLowerAllHands: MeetingUtil.canUserLowerAllHands(payload.info.userDisplayHints),
1891
1891
  canLowerSomeoneElsesHand: MeetingUtil.canUserLowerSomeoneElsesHand(payload.info.userDisplayHints),
1892
+ bothLeaveAndEndMeetingAvailable: MeetingUtil.bothLeaveAndEndMeetingAvailable(payload.info.userDisplayHints),
1892
1893
  canEnableClosedCaption: MeetingUtil.canEnableClosedCaption(payload.info.userDisplayHints),
1893
1894
  canStartTranscribing: MeetingUtil.canStartTranscribing(payload.info.userDisplayHints),
1894
1895
  canStopTranscribing: MeetingUtil.canStopTranscribing(payload.info.userDisplayHints),
@@ -447,6 +447,8 @@ MeetingUtil.canUserLowerAllHands = (displayHints) => displayHints.includes(DISPL
447
447
 
448
448
  MeetingUtil.canUserLowerSomeoneElsesHand = (displayHints) => displayHints.includes(DISPLAY_HINTS.LOWER_SOMEONE_ELSES_HAND);
449
449
 
450
+ MeetingUtil.bothLeaveAndEndMeetingAvailable = (displayHints) => displayHints.includes(DISPLAY_HINTS.LEAVE_TRANSFER_HOST_END_MEETING) || displayHints.includes(DISPLAY_HINTS.LEAVE_END_MEETING);
451
+
450
452
  MeetingUtil.lockMeeting = (actions, request, locusUrl) => {
451
453
  if (actions && actions.canLock) {
452
454
  return request.lockMeeting({locusUrl, lock: true});
@@ -18,6 +18,7 @@ describe('plugin-meetings', () => {
18
18
  canRaiseHand: null,
19
19
  canLowerAllHands: null,
20
20
  canLowerSomeoneElsesHand: null,
21
+ bothLeaveAndEndMeetingAvailable: null,
21
22
  canEnableClosedCaption: null,
22
23
  canStartTranscribing: null,
23
24
  canStopTranscribing: null,
@@ -52,6 +53,7 @@ describe('plugin-meetings', () => {
52
53
  'canRaiseHand',
53
54
  'canLowerAllHands',
54
55
  'canLowerSomeoneElsesHand',
56
+ 'bothLeaveAndEndMeetingAvailable',
55
57
  'canEnableClosedCaption',
56
58
  'canStopTranscribing',
57
59
  'isClosedCaptionActive',
@@ -21,7 +21,6 @@ import {
21
21
  _MEETING_ID_,
22
22
  LOCUSINFO,
23
23
  } from '@webex/plugin-meetings/src/constants';
24
-
25
24
  import * as StatsAnalyzerModule from '@webex/plugin-meetings/src/statsAnalyzer';
26
25
  import EventsScope from '@webex/plugin-meetings/src/common/events/events-scope';
27
26
  import Meetings, {CONSTANTS} from '@webex/plugin-meetings';
@@ -3664,11 +3663,11 @@ describe('plugin-meetings', () => {
3664
3663
  let canUserPauseSpy;
3665
3664
  let canUserResumeSpy;
3666
3665
  let canUserRaiseHandSpy;
3666
+ let bothLeaveAndEndMeetingAvailableSpy;
3667
3667
  let canUserLowerAllHandsSpy;
3668
3668
  let canUserLowerSomeoneElsesHandSpy;
3669
3669
  let waitingForOthersToJoinSpy;
3670
3670
 
3671
-
3672
3671
  beforeEach(() => {
3673
3672
  locusInfoOnSpy = sinon.spy(meeting.locusInfo, 'on');
3674
3673
  canUserLockSpy = sinon.spy(MeetingUtil, 'canUserLock');
@@ -3680,6 +3679,7 @@ describe('plugin-meetings', () => {
3680
3679
  inMeetingActionsSetSpy = sinon.spy(meeting.inMeetingActions, 'set');
3681
3680
  canUserRaiseHandSpy = sinon.spy(MeetingUtil, 'canUserRaiseHand');
3682
3681
  canUserLowerAllHandsSpy = sinon.spy(MeetingUtil, 'canUserLowerAllHands');
3682
+ bothLeaveAndEndMeetingAvailableSpy = sinon.spy(MeetingUtil, 'bothLeaveAndEndMeetingAvailable');
3683
3683
  canUserLowerSomeoneElsesHandSpy = sinon.spy(MeetingUtil, 'canUserLowerSomeoneElsesHand');
3684
3684
  waitingForOthersToJoinSpy = sinon.spy(MeetingUtil, 'waitingForOthersToJoin');
3685
3685
  });
@@ -3716,6 +3716,7 @@ describe('plugin-meetings', () => {
3716
3716
  assert.calledWith(canUserPauseSpy, payload.info.userDisplayHints);
3717
3717
  assert.calledWith(canUserResumeSpy, payload.info.userDisplayHints);
3718
3718
  assert.calledWith(canUserRaiseHandSpy, payload.info.userDisplayHints);
3719
+ assert.calledWith(bothLeaveAndEndMeetingAvailableSpy, payload.info.userDisplayHints);
3719
3720
  assert.calledWith(canUserLowerAllHandsSpy, payload.info.userDisplayHints);
3720
3721
  assert.calledWith(canUserLowerSomeoneElsesHandSpy, payload.info.userDisplayHints);
3721
3722
  assert.calledWith(waitingForOthersToJoinSpy, payload.info.userDisplayHints);
@@ -1,6 +1,5 @@
1
1
  import sinon from 'sinon';
2
2
  import {assert} from '@webex/test-helper-chai';
3
-
4
3
  import MeetingUtil from '@webex/plugin-meetings/src/meeting/util';
5
4
  import LoggerProxy from '@webex/plugin-meetings/src/common/logs/logger-proxy';
6
5
  import LoggerConfig
@@ -250,6 +249,15 @@ describe('plugin-meetings', () => {
250
249
  });
251
250
  });
252
251
 
252
+ describe('bothLeaveAndEndMeetingAvailable', () => {
253
+ it('works as expected', () => {
254
+ assert.deepEqual(MeetingUtil.bothLeaveAndEndMeetingAvailable(['LEAVE_TRANSFER_HOST_END_MEETING']), true);
255
+ assert.deepEqual(MeetingUtil.bothLeaveAndEndMeetingAvailable(['LEAVE_END_MEETING']), true);
256
+ assert.deepEqual(MeetingUtil.bothLeaveAndEndMeetingAvailable(['LEAVE_TRANSFER_HOST_END_MEETING', 'LEAVE_END_MEETING']), true);
257
+ assert.deepEqual(MeetingUtil.bothLeaveAndEndMeetingAvailable([]), false);
258
+ });
259
+ });
260
+
253
261
  describe('canUserLock', () => {
254
262
  it('works as expected', () => {
255
263
  assert.deepEqual(MeetingUtil.canUserLock(['LOCK_CONTROL_LOCK', 'LOCK_STATUS_UNLOCKED']), true);