@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.
- package/dist/constants.js +5 -1
- package/dist/constants.js.map +1 -1
- package/dist/meeting/in-meeting-actions.js +5 -1
- package/dist/meeting/in-meeting-actions.js.map +1 -1
- package/dist/meeting/index.js +3 -1
- package/dist/meeting/index.js.map +1 -1
- package/dist/meeting/util.js +18 -0
- package/dist/meeting/util.js.map +1 -1
- package/package.json +18 -18
- package/src/constants.ts +4 -0
- package/src/meeting/in-meeting-actions.ts +8 -0
- package/src/meeting/index.ts +8 -0
- package/src/meeting/util.ts +22 -0
- package/test/unit/spec/meeting/in-meeting-actions.ts +5 -1
- package/test/unit/spec/meeting/index.js +6 -0
- package/test/unit/spec/meeting/utils.js +15 -0
package/dist/meeting/util.js
CHANGED
|
@@ -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
|
package/dist/meeting/util.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["MeetingUtil","parseLocusJoin","response","parsed","locus","body","mediaConnections","locusUrl","url","locusId","split","pop","selfId","self","id","forEach","mediaConnection","mediaId","remoteUpdateAudioVideo","audioMuted","videoMuted","meeting","reject","ParameterError","localMedias","Media","generateLocalMedias","Metrics","postEvent","event","eventType","MEDIA_REQUEST","meetingRequest","remoteAudioVideoToggle","deviceUrl","correlationId","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":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@webex/plugin-meetings",
|
|
3
|
-
"version": "3.0.0-beta.
|
|
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.
|
|
32
|
-
"@webex/test-helper-chai": "3.0.0-beta.
|
|
33
|
-
"@webex/test-helper-mocha": "3.0.0-beta.
|
|
34
|
-
"@webex/test-helper-mock-webex": "3.0.0-beta.
|
|
35
|
-
"@webex/test-helper-retry": "3.0.0-beta.
|
|
36
|
-
"@webex/test-helper-test-users": "3.0.0-beta.
|
|
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.
|
|
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.
|
|
47
|
-
"@webex/internal-plugin-device": "3.0.0-beta.
|
|
48
|
-
"@webex/internal-plugin-llm": "3.0.0-beta.
|
|
49
|
-
"@webex/internal-plugin-mercury": "3.0.0-beta.
|
|
50
|
-
"@webex/internal-plugin-metrics": "3.0.0-beta.
|
|
51
|
-
"@webex/internal-plugin-support": "3.0.0-beta.
|
|
52
|
-
"@webex/internal-plugin-user": "3.0.0-beta.
|
|
53
|
-
"@webex/plugin-people": "3.0.0-beta.
|
|
54
|
-
"@webex/plugin-rooms": "3.0.0-beta.
|
|
55
|
-
"@webex/webex-core": "3.0.0-beta.
|
|
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
|
/**
|
package/src/meeting/index.ts
CHANGED
|
@@ -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) {
|
package/src/meeting/util.ts
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
|
-
|
|
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;
|