@webex/plugin-meetings 3.0.0-beta.121 → 3.0.0-beta.123
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/annotation/annotation.types.js.map +1 -1
- package/dist/annotation/index.js +3 -5
- package/dist/annotation/index.js.map +1 -1
- package/dist/breakouts/breakout.js +1 -1
- package/dist/breakouts/index.js +1 -1
- package/dist/meeting/index.js +68 -22
- package/dist/meeting/index.js.map +1 -1
- package/dist/meeting/util.js +2 -1
- package/dist/meeting/util.js.map +1 -1
- package/dist/types/annotation/annotation.types.d.ts +2 -2
- package/dist/types/meeting/index.d.ts +7 -0
- package/package.json +19 -19
- package/src/annotation/annotation.types.ts +2 -2
- package/src/annotation/index.ts +3 -5
- package/src/meeting/index.ts +26 -0
- package/src/meeting/util.ts +1 -0
- package/test/unit/spec/annotation/index.ts +7 -10
- package/test/unit/spec/meeting/index.js +37 -0
- package/test/unit/spec/meeting/utils.js +19 -1
package/dist/meeting/util.js
CHANGED
|
@@ -115,7 +115,8 @@ var MeetingUtil = {
|
|
|
115
115
|
asResourceOccupant: options.asResourceOccupant,
|
|
116
116
|
breakoutsSupported: options.breakoutsSupported,
|
|
117
117
|
locale: options.locale,
|
|
118
|
-
deviceCapabilities: options.deviceCapabilities
|
|
118
|
+
deviceCapabilities: options.deviceCapabilities,
|
|
119
|
+
liveAnnotationSupported: options.liveAnnotationSupported
|
|
119
120
|
}).then(function (res) {
|
|
120
121
|
_metrics.default.postEvent({
|
|
121
122
|
event: _config.eventType.LOCUS_JOIN_RESPONSE,
|
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","meeting","audioMuted","videoMuted","reject","ParameterError","locusMediaRequest","Metrics","postEvent","event","eventType","MEDIA_REQUEST","send","type","selfUrl","sequence","locusInfo","muteOptions","then","MEDIA_RESPONSE","hasOwner","info","owner","isOwnerSelf","isPinOrGuest","err","errorCode","INTENT_TO_JOIN","includes","joinMeeting","options","LOCUS_JOIN_REQUEST","meetingRequest","inviteeAddress","meetingJoinUrl","sipUri","meetingNumber","deviceUrl","correlationId","roapMessage","permissionToken","resourceId","moderator","pin","moveToResource","preferTranscoding","isMultistream","asResourceOccupant","breakoutsSupported","locale","deviceCapabilities","res","LOCUS_JOIN_RESPONSE","data","trigger","LOCI_UPDATE","trackingId","headers","trackingid","cleanUp","breakouts","stopStatsAnalyzer","statsAnalyzer","stopAnalyzer","resolve","closeLocalStream","closeLocalShare","closeRemoteTracks","closePeerConnections","unsetLocalVideoTrack","unsetLocalShareTrack","unsetRemoteTracks","unsetPeerConnections","reconnectionManager","stopKeepAlive","updateLLMConnection","disconnectPhoneAudio","phoneUrl","meetingState","FULL_STATE","INACTIVE","MeetingNotActiveError","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","canUserRaiseHand","RAISE_HAND","canUserLowerAllHands","LOWER_ALL_HANDS","canUserLowerSomeoneElsesHand","LOWER_SOMEONE_ELSES_HAND","bothLeaveAndEndMeetingAvailable","LEAVE_TRANSFER_HOST_END_MEETING","LEAVE_END_MEETING","canManageBreakout","BREAKOUT_MANAGEMENT","isSuppressBreakoutSupport","UCF_SUPPRESS_BREAKOUTS_SUPPORT","canAdmitLobbyToBreakout","DISABLE_LOBBY_TO_BREAKOUT","isBreakoutPreassignmentsEnabled","DISABLE_BREAKOUT_PREASSIGNMENTS","canUserAskForHelp","DISABLE_ASK_FOR_HELP","lockMeeting","actions","request","canLock","lock","PermissionError","unlockMeeting","canUnlock","handleAudioLogging","LOG_HEADER","settings","underlyingTrack","getSettings","deviceId","log","handleVideoLogging","handleDeviceLogging","devices","device","endMeetingForAll","endOptions","canEnableClosedCaption","CAPTION_START","isSaveTranscriptsEnabled","SAVE_TRANSCRIPTS_ENABLED","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","canSendReactions","originalValue","REACTIONS_ACTIVE","REACTIONS_INACTIVE","canUserRenameSelfAndObserved","CAN_RENAME_SELF_AND_OBSERVED","canUserRenameOthers","CAN_RENAME_OTHERS","addSequence","requestBody","updateLocusWithDelta","onDeltaLocus","generateLocusDeltaRequest","originalMeeting","meetingRef","WeakRef","locusDeltaRequest","originalOptions","deref"],"sources":["util.ts"],"sourcesContent":["import {LocalCameraTrack, LocalMicrophoneTrack} from '@webex/media-helpers';\n\nimport {cloneDeep} from 'lodash';\nimport {MeetingNotActiveError, UserNotJoinedError} from '../common/errors/webex-errors';\nimport Metrics from '../metrics';\nimport {eventType, trigger} from '../metrics/config';\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 = {\n 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\n remoteUpdateAudioVideo: (meeting, audioMuted?: boolean, videoMuted?: boolean) => {\n if (!meeting) {\n return Promise.reject(new ParameterError('You need a meeting object.'));\n }\n\n if (!meeting.locusMediaRequest) {\n return Promise.reject(\n new ParameterError(\n 'You need a meeting with a media connection, call Meeting.addMedia() first.'\n )\n );\n }\n\n Metrics.postEvent({event: eventType.MEDIA_REQUEST, meeting});\n\n return meeting.locusMediaRequest\n .send({\n type: 'LocalMute',\n selfUrl: meeting.selfUrl,\n mediaId: meeting.mediaId,\n sequence: meeting.locusInfo.sequence,\n muteOptions: {\n audioMuted,\n videoMuted,\n },\n })\n .then((response) => {\n Metrics.postEvent({event: eventType.MEDIA_RESPONSE, meeting});\n\n return response?.body?.locus;\n });\n },\n\n hasOwner: (info) => info && info.owner,\n\n isOwnerSelf: (owner, selfId) => owner === selfId,\n\n isPinOrGuest: (err) => err?.body?.errorCode && INTENT_TO_JOIN.includes(err.body.errorCode),\n\n 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 breakoutsSupported: options.breakoutsSupported,\n locale: options.locale,\n deviceCapabilities: options.deviceCapabilities,\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\n cleanUp: (meeting) => {\n meeting.breakouts.cleanUp();\n\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\n 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.disconnectPhoneAudio(options).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\n 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(() => {\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 },\n declineMeeting: (meeting, reason) =>\n meeting.meetingRequest.declineMeeting({\n locusUrl: meeting.locusUrl,\n deviceUrl: meeting.deviceUrl,\n reason,\n }),\n\n isUserInLeftState: (locusInfo) => locusInfo.parsedLocus?.self?.state === _LEFT_,\n\n isUserInIdleState: (locusInfo) => locusInfo.parsedLocus?.self?.state === _IDLE_,\n\n isUserInJoinedState: (locusInfo) => locusInfo.parsedLocus?.self?.state === _JOINED_,\n\n isMediaEstablished: (currentMediaStatus) =>\n currentMediaStatus &&\n (currentMediaStatus.audio || currentMediaStatus.video || currentMediaStatus.share),\n\n 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(\n 'Meeting:util#joinMeetingOptions --> Error joining the call, ',\n err\n );\n\n return Promise.reject(new JoinMeetingError(options, 'Error Joining Meeting', err));\n });\n },\n\n 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\n 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\n getModeratorFromLocusInfo: (locusInfo) =>\n locusInfo &&\n locusInfo.parsedLocus &&\n locusInfo.parsedLocus.info &&\n locusInfo.parsedLocus.info &&\n locusInfo.parsedLocus.info.moderator,\n\n getPolicyFromLocusInfo: (locusInfo) =>\n locusInfo &&\n locusInfo.parsedLocus &&\n locusInfo.parsedLocus.info &&\n locusInfo.parsedLocus.info &&\n locusInfo.parsedLocus.info.policy,\n\n getUserDisplayHintsFromLocusInfo: (locusInfo) =>\n locusInfo?.parsedLocus?.info?.userDisplayHints || [],\n\n canInviteNewParticipants: (displayHints) => displayHints.includes(DISPLAY_HINTS.ADD_GUEST),\n\n canAdmitParticipant: (displayHints) =>\n displayHints.includes(DISPLAY_HINTS.ROSTER_WAITING_TO_JOIN),\n\n canUserLock: (displayHints) =>\n displayHints.includes(DISPLAY_HINTS.LOCK_CONTROL_LOCK) &&\n displayHints.includes(DISPLAY_HINTS.LOCK_STATUS_UNLOCKED),\n\n canUserUnlock: (displayHints) =>\n displayHints.includes(DISPLAY_HINTS.LOCK_CONTROL_UNLOCK) &&\n displayHints.includes(DISPLAY_HINTS.LOCK_STATUS_LOCKED),\n\n canUserRaiseHand: (displayHints) => displayHints.includes(DISPLAY_HINTS.RAISE_HAND),\n\n canUserLowerAllHands: (displayHints) => displayHints.includes(DISPLAY_HINTS.LOWER_ALL_HANDS),\n\n canUserLowerSomeoneElsesHand: (displayHints) =>\n displayHints.includes(DISPLAY_HINTS.LOWER_SOMEONE_ELSES_HAND),\n\n bothLeaveAndEndMeetingAvailable: (displayHints) =>\n displayHints.includes(DISPLAY_HINTS.LEAVE_TRANSFER_HOST_END_MEETING) ||\n displayHints.includes(DISPLAY_HINTS.LEAVE_END_MEETING),\n\n canManageBreakout: (displayHints) => displayHints.includes(DISPLAY_HINTS.BREAKOUT_MANAGEMENT),\n\n isSuppressBreakoutSupport: (displayHints) =>\n displayHints.includes(DISPLAY_HINTS.UCF_SUPPRESS_BREAKOUTS_SUPPORT),\n\n canAdmitLobbyToBreakout: (displayHints) =>\n !displayHints.includes(DISPLAY_HINTS.DISABLE_LOBBY_TO_BREAKOUT),\n\n isBreakoutPreassignmentsEnabled: (displayHints) =>\n !displayHints.includes(DISPLAY_HINTS.DISABLE_BREAKOUT_PREASSIGNMENTS),\n\n canUserAskForHelp: (displayHints) => !displayHints.includes(DISPLAY_HINTS.DISABLE_ASK_FOR_HELP),\n\n 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\n 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\n handleAudioLogging: (audioTrack: LocalMicrophoneTrack | null) => {\n const LOG_HEADER = 'MeetingUtil#handleAudioLogging -->';\n\n if (audioTrack) {\n const settings = audioTrack.underlyingTrack.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\n handleVideoLogging: (videoTrack: LocalCameraTrack | null) => {\n const LOG_HEADER = 'MeetingUtil#handleVideoLogging -->';\n\n if (videoTrack) {\n const settings = videoTrack.underlyingTrack.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\n 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\n 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(() => 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\n canEnableClosedCaption: (displayHints) => displayHints.includes(DISPLAY_HINTS.CAPTION_START),\n\n isSaveTranscriptsEnabled: (displayHints) =>\n displayHints.includes(DISPLAY_HINTS.SAVE_TRANSCRIPTS_ENABLED),\n\n canStartTranscribing: (displayHints) =>\n displayHints.includes(DISPLAY_HINTS.TRANSCRIPTION_CONTROL_START),\n\n canStopTranscribing: (displayHints) =>\n displayHints.includes(DISPLAY_HINTS.TRANSCRIPTION_CONTROL_STOP),\n\n isClosedCaptionActive: (displayHints) =>\n displayHints.includes(DISPLAY_HINTS.CAPTION_STATUS_ACTIVE),\n\n isWebexAssistantActive: (displayHints) =>\n displayHints.includes(DISPLAY_HINTS.WEBEX_ASSISTANT_STATUS_ACTIVE),\n\n canViewCaptionPanel: (displayHints) => displayHints.includes(DISPLAY_HINTS.ENABLE_CAPTION_PANEL),\n\n isRealTimeTranslationEnabled: (displayHints) =>\n displayHints.includes(DISPLAY_HINTS.DISPLAY_REAL_TIME_TRANSLATION),\n\n canSelectSpokenLanguages: (displayHints) =>\n displayHints.includes(DISPLAY_HINTS.DISPLAY_NON_ENGLISH_ASR),\n\n waitingForOthersToJoin: (displayHints) => displayHints.includes(DISPLAY_HINTS.WAITING_FOR_OTHERS),\n\n 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 canUserRenameSelfAndObserved: (displayHints) =>\n displayHints.includes(DISPLAY_HINTS.CAN_RENAME_SELF_AND_OBSERVED),\n\n canUserRenameOthers: (displayHints) => displayHints.includes(DISPLAY_HINTS.CAN_RENAME_OTHERS),\n\n /**\n * Adds the current locus sequence information to a request body\n * @param {Object} meeting The meeting object\n * @param {Object} requestBody The body of a request to locus\n * @returns {void}\n */\n addSequence: (meeting, requestBody) => {\n const sequence = meeting?.locusInfo?.sequence;\n\n if (!sequence) {\n return;\n }\n\n requestBody.sequence = sequence;\n },\n\n /**\n * Updates the locus info for the meeting with the delta locus\n * returned from requests that include the sequence information\n * Returns the original response object\n * @param {Object} meeting The meeting object\n * @param {Object} response The response of the http request\n * @returns {Object}\n */\n updateLocusWithDelta: (meeting, response) => {\n if (!meeting) {\n return response;\n }\n\n const locus = response?.body?.locus;\n\n if (locus) {\n meeting.locusInfo.onDeltaLocus(locus);\n }\n\n return response;\n },\n\n generateLocusDeltaRequest: (originalMeeting) => {\n const meetingRef = new WeakRef(originalMeeting);\n\n const locusDeltaRequest = (originalOptions) => {\n const meeting = meetingRef.deref();\n\n if (!meeting) {\n return Promise.resolve();\n }\n\n const options = cloneDeep(originalOptions);\n\n if (!options.body) {\n options.body = {};\n }\n\n MeetingUtil.addSequence(meeting, options.body);\n\n return meeting\n .request(options)\n .then((response) => MeetingUtil.updateLocusWithDelta(meeting, response));\n };\n\n return locusDeltaRequest;\n },\n};\n\nexport default MeetingUtil;\n"],"mappings":";;;;;;;;;;;;;;;;;;AAGA;AACA;AACA;AACA;AACA;AASA;AACA;AACA;AACA;AACA;AACA;AAA0D;AAAA;AAE1D,IAAMA,WAAW,GAAG;EAClBC,cAAc,EAAE,wBAACC,QAAQ,EAAK;IAC5B,IAAMC,MAAW,GAAG,CAAC,CAAC;;IAEtB;IACAA,MAAM,CAACC,KAAK,GAAGF,QAAQ,CAACG,IAAI,CAACD,KAAK;IAClCD,MAAM,CAACG,gBAAgB,GAAGJ,QAAQ,CAACG,IAAI,CAACC,gBAAgB;IACxDH,MAAM,CAACI,QAAQ,GAAGJ,MAAM,CAACC,KAAK,CAACI,GAAG;IAClCL,MAAM,CAACM,OAAO,GAAGN,MAAM,CAACC,KAAK,CAACI,GAAG,CAACE,KAAK,CAAC,GAAG,CAAC,CAACC,GAAG,EAAE;IAClDR,MAAM,CAACS,MAAM,GAAGT,MAAM,CAACC,KAAK,CAACS,IAAI,CAACC,EAAE;;IAEpC;IACAX,MAAM,CAACG,gBAAgB,CAACS,OAAO,CAAC,UAACC,eAAe,EAAK;MACnD,IAAIA,eAAe,CAACC,OAAO,EAAE;QAC3Bd,MAAM,CAACc,OAAO,GAAGD,eAAe,CAACC,OAAO;MAC1C;IACF,CAAC,CAAC;IAEF,OAAOd,MAAM;EACf,CAAC;EAEDe,sBAAsB,EAAE,gCAACC,OAAO,EAAEC,UAAoB,EAAEC,UAAoB,EAAK;IAC/E,IAAI,CAACF,OAAO,EAAE;MACZ,OAAO,iBAAQG,MAAM,CAAC,IAAIC,kBAAc,CAAC,4BAA4B,CAAC,CAAC;IACzE;IAEA,IAAI,CAACJ,OAAO,CAACK,iBAAiB,EAAE;MAC9B,OAAO,iBAAQF,MAAM,CACnB,IAAIC,kBAAc,CAChB,4EAA4E,CAC7E,CACF;IACH;IAEAE,gBAAO,CAACC,SAAS,CAAC;MAACC,KAAK,EAAEC,iBAAS,CAACC,aAAa;MAAEV,OAAO,EAAPA;IAAO,CAAC,CAAC;IAE5D,OAAOA,OAAO,CAACK,iBAAiB,CAC7BM,IAAI,CAAC;MACJC,IAAI,EAAE,WAAW;MACjBC,OAAO,EAAEb,OAAO,CAACa,OAAO;MACxBf,OAAO,EAAEE,OAAO,CAACF,OAAO;MACxBgB,QAAQ,EAAEd,OAAO,CAACe,SAAS,CAACD,QAAQ;MACpCE,WAAW,EAAE;QACXf,UAAU,EAAVA,UAAU;QACVC,UAAU,EAAVA;MACF;IACF,CAAC,CAAC,CACDe,IAAI,CAAC,UAAClC,QAAQ,EAAK;MAAA;MAClBuB,gBAAO,CAACC,SAAS,CAAC;QAACC,KAAK,EAAEC,iBAAS,CAACS,cAAc;QAAElB,OAAO,EAAPA;MAAO,CAAC,CAAC;MAE7D,OAAOjB,QAAQ,aAARA,QAAQ,yCAARA,QAAQ,CAAEG,IAAI,mDAAd,eAAgBD,KAAK;IAC9B,CAAC,CAAC;EACN,CAAC;EAEDkC,QAAQ,EAAE,kBAACC,IAAI;IAAA,OAAKA,IAAI,IAAIA,IAAI,CAACC,KAAK;EAAA;EAEtCC,WAAW,EAAE,qBAACD,KAAK,EAAE5B,MAAM;IAAA,OAAK4B,KAAK,KAAK5B,MAAM;EAAA;EAEhD8B,YAAY,EAAE,sBAACC,GAAG;IAAA;IAAA,OAAK,CAAAA,GAAG,aAAHA,GAAG,oCAAHA,GAAG,CAAEtC,IAAI,8CAAT,UAAWuC,SAAS,KAAIC,yBAAc,CAACC,QAAQ,CAACH,GAAG,CAACtC,IAAI,CAACuC,SAAS,CAAC;EAAA;EAE1FG,WAAW,EAAE,qBAAC5B,OAAO,EAAE6B,OAAO,EAAK;IACjC,IAAI,CAAC7B,OAAO,EAAE;MACZ,OAAO,iBAAQG,MAAM,CAAC,IAAIC,kBAAc,CAAC,4BAA4B,CAAC,CAAC;IACzE;IAEAE,gBAAO,CAACC,SAAS,CAAC;MAACC,KAAK,EAAEC,iBAAS,CAACqB,kBAAkB;MAAE9B,OAAO,EAAPA;IAAO,CAAC,CAAC;;IAEjE;IACA;IACA;IACA,OAAOA,OAAO,CAAC+B,cAAc,CAC1BH,WAAW,CAAC;MACXI,cAAc,EAAEhC,OAAO,CAACiC,cAAc,IAAIjC,OAAO,CAACkC,MAAM;MACxDC,aAAa,EAAEnC,OAAO,CAACmC,aAAa;MACpCC,SAAS,EAAEpC,OAAO,CAACoC,SAAS;MAC5BhD,QAAQ,EAAEY,OAAO,CAACZ,QAAQ;MAC1BiD,aAAa,EAAErC,OAAO,CAACqC,aAAa;MACpCC,WAAW,EAAET,OAAO,CAACS,WAAW;MAChCC,eAAe,EAAEvC,OAAO,CAACuC,eAAe;MACxCC,UAAU,EAAEX,OAAO,CAACW,UAAU,IAAI,IAAI;MACtCC,SAAS,EAAEZ,OAAO,CAACY,SAAS;MAC5BC,GAAG,EAAEb,OAAO,CAACa,GAAG;MAChBC,cAAc,EAAEd,OAAO,CAACc,cAAc;MACtCC,iBAAiB,EAAE,CAAC5C,OAAO,CAAC6C,aAAa;MACzCC,kBAAkB,EAAEjB,OAAO,CAACiB,kBAAkB;MAC9CC,kBAAkB,EAAElB,OAAO,CAACkB,kBAAkB;MAC9CC,MAAM,EAAEnB,OAAO,CAACmB,MAAM;MACtBC,kBAAkB,EAAEpB,OAAO,CAACoB;IAC9B,CAAC,CAAC,CACDhC,IAAI,CAAC,UAACiC,GAAG,EAAK;MACb5C,gBAAO,CAACC,SAAS,CAAC;QAChBC,KAAK,EAAEC,iBAAS,CAAC0C,mBAAmB;QACpCnD,OAAO,EAAPA,OAAO;QACPoD,IAAI,EAAE;UACJC,OAAO,EAAEA,eAAO,CAACC,WAAW;UAC5BrE,KAAK,EAAEiE,GAAG,CAAChE,IAAI,CAACD,KAAK;UACrBE,gBAAgB,EAAE+D,GAAG,CAAChE,IAAI,CAACC,gBAAgB;UAC3CoE,UAAU,EAAEL,GAAG,CAACM,OAAO,CAACC;QAC1B;MACF,CAAC,CAAC;MAEF,OAAO5E,WAAW,CAACC,cAAc,CAACoE,GAAG,CAAC;IACxC,CAAC,CAAC;EACN,CAAC;EAEDQ,OAAO,EAAE,iBAAC1D,OAAO,EAAK;IACpBA,OAAO,CAAC2D,SAAS,CAACD,OAAO,EAAE;;IAE3B;IACA,IAAME,iBAAiB,GAAG5D,OAAO,CAAC6D,aAAa,GAC3C7D,OAAO,CAAC6D,aAAa,CAACC,YAAY,EAAE,GACpC,iBAAQC,OAAO,EAAE;IAErB,OAAOH,iBAAiB,CACrB3C,IAAI,CAAC;MAAA,OAAMjB,OAAO,CAACgE,gBAAgB,EAAE;IAAA,EAAC,CACtC/C,IAAI,CAAC;MAAA,OAAMjB,OAAO,CAACiE,eAAe,EAAE;IAAA,EAAC,CACrChD,IAAI,CAAC;MAAA,OAAMjB,OAAO,CAACkE,iBAAiB,EAAE;IAAA,EAAC,CACvCjD,IAAI,CAAC;MAAA,OAAMjB,OAAO,CAACmE,oBAAoB,EAAE;IAAA,EAAC,CAC1ClD,IAAI,CAAC,YAAM;MACVjB,OAAO,CAACoE,oBAAoB,EAAE;MAC9BpE,OAAO,CAACqE,oBAAoB,EAAE;MAC9BrE,OAAO,CAACsE,iBAAiB,EAAE;MAC3BtE,OAAO,CAACuE,oBAAoB,EAAE;MAC9BvE,OAAO,CAACwE,mBAAmB,CAACd,OAAO,EAAE;IACvC,CAAC,CAAC,CACDzC,IAAI,CAAC;MAAA,OAAMjB,OAAO,CAACyE,aAAa,EAAE;IAAA,EAAC,CACnCxD,IAAI,CAAC;MAAA,OAAMjB,OAAO,CAAC0E,mBAAmB,EAAE;IAAA,EAAC;EAC9C,CAAC;EAEDC,oBAAoB,EAAE,8BAAC3E,OAAO,EAAE4E,QAAQ,EAAK;IAC3C,IAAI5E,OAAO,CAAC6E,YAAY,KAAKC,qBAAU,CAACC,QAAQ,EAAE;MAChD,OAAO,iBAAQ5E,MAAM,CAAC,IAAI6E,kCAAqB,EAAE,CAAC;IACpD;IAEA,IAAMnD,OAAO,GAAG;MACdzC,QAAQ,EAAEY,OAAO,CAACZ,QAAQ;MAC1BK,MAAM,EAAEO,OAAO,CAACP,MAAM;MACtB4C,aAAa,EAAErC,OAAO,CAACqC,aAAa;MACpCuC,QAAQ,EAARA;IACF,CAAC;IAED,OAAO5E,OAAO,CAAC+B,cAAc,CAAC4C,oBAAoB,CAAC9C,OAAO,CAAC,CAACoD,KAAK,CAAC,UAACzD,GAAG,EAAK;MACzE0D,oBAAW,CAACC,MAAM,CAACC,KAAK,6GAC+EpF,OAAO,CAACL,EAAE,sBAAY6B,GAAG,EAC/H;MAED,OAAO,iBAAQrB,MAAM,CAACqB,GAAG,CAAC;IAC5B,CAAC,CAAC;EACJ,CAAC;EAED;EACA;EACA;EACA;EACA6D,YAAY,EAAE,sBAACrF,OAAO,EAAwB;IAAA,IAAtB6B,OAAY,uEAAG,CAAC,CAAC;IACvC,IAAI7B,OAAO,CAAC6E,YAAY,KAAKC,qBAAU,CAACC,QAAQ,EAAE;MAChD;MACA,OAAO,iBAAQ5E,MAAM,CAAC,IAAI6E,kCAAqB,EAAE,CAAC;IACpD;IAEA,IAAInG,WAAW,CAACyG,iBAAiB,CAACtF,OAAO,CAACe,SAAS,CAAC,EAAE;MACpD,OAAO,iBAAQZ,MAAM,CAAC,IAAIoF,+BAAkB,EAAE,CAAC;IACjD;IAEA,IAAMC,cAAc,GAAG;MACrBpG,QAAQ,EAAEY,OAAO,CAACZ,QAAQ;MAC1BK,MAAM,EAAEO,OAAO,CAACP,MAAM;MACtB4C,aAAa,EAAErC,OAAO,CAACqC,aAAa;MACpCG,UAAU,EAAExC,OAAO,CAACwC,UAAU;MAC9BJ,SAAS,EAAEpC,OAAO,CAACoC;IACrB,CAAC;IAED,IAAMqD,YAAY,mCAAOD,cAAc,GAAK3D,OAAO,CAAC;IAEpD,OAAO7B,OAAO,CAAC+B,cAAc,CAC1BsD,YAAY,CAACI,YAAY,CAAC,CAC1BxE,IAAI,CAAC,YAAM;MACV,IAAIY,OAAO,CAAC6D,WAAW,EAAE;QACvB,OAAO,iBAAQ3B,OAAO,EAAE;MAC1B;MAEA,OAAOlF,WAAW,CAAC6E,OAAO,CAAC1D,OAAO,CAAC;IACrC,CAAC,CAAC,CACDiF,KAAK,CAAC,UAACzD,GAAG,EAAK;MACd;MACA;MACA;MACA0D,oBAAW,CAACC,MAAM,CAACC,KAAK,sGACwEpF,OAAO,CAACL,EAAE,sBAAY6B,GAAG,EACxH;MAED,OAAO,iBAAQrB,MAAM,CAACqB,GAAG,CAAC;IAC5B,CAAC,CAAC;EACN,CAAC;EACDmE,cAAc,EAAE,wBAAC3F,OAAO,EAAE4F,MAAM;IAAA,OAC9B5F,OAAO,CAAC+B,cAAc,CAAC4D,cAAc,CAAC;MACpCvG,QAAQ,EAAEY,OAAO,CAACZ,QAAQ;MAC1BgD,SAAS,EAAEpC,OAAO,CAACoC,SAAS;MAC5BwD,MAAM,EAANA;IACF,CAAC,CAAC;EAAA;EAEJN,iBAAiB,EAAE,2BAACvE,SAAS;IAAA;IAAA,OAAK,0BAAAA,SAAS,CAAC8E,WAAW,oFAArB,sBAAuBnG,IAAI,2DAA3B,uBAA6BoG,KAAK,MAAKC,iBAAM;EAAA;EAE/EC,iBAAiB,EAAE,2BAACjF,SAAS;IAAA;IAAA,OAAK,2BAAAA,SAAS,CAAC8E,WAAW,qFAArB,uBAAuBnG,IAAI,2DAA3B,uBAA6BoG,KAAK,MAAKG,iBAAM;EAAA;EAE/EC,mBAAmB,EAAE,6BAACnF,SAAS;IAAA;IAAA,OAAK,2BAAAA,SAAS,CAAC8E,WAAW,qFAArB,uBAAuBnG,IAAI,2DAA3B,uBAA6BoG,KAAK,MAAKK,mBAAQ;EAAA;EAEnFC,kBAAkB,EAAE,4BAACC,kBAAkB;IAAA,OACrCA,kBAAkB,KACjBA,kBAAkB,CAACC,KAAK,IAAID,kBAAkB,CAACE,KAAK,IAAIF,kBAAkB,CAACG,KAAK,CAAC;EAAA;EAEpFC,kBAAkB,EAAE,4BAACzG,OAAO,EAAwB;IAAA,IAAtB6B,OAAY,uEAAG,CAAC,CAAC;IAC7C7B,OAAO,CAACwC,UAAU,GAAGxC,OAAO,CAACwC,UAAU,IAAIX,OAAO,CAACW,UAAU;IAE7D,IAAIxC,OAAO,CAAC0G,eAAe,EAAE;MAC3B,OAAO,iBAAQvG,MAAM,CAAC,IAAIwG,qBAAY,EAAE,CAAC;IAC3C;IACA,IAAI3G,OAAO,CAAC4G,cAAc,KAAKC,0BAAe,CAACC,QAAQ,EAAE;MACvD,OAAO,iBAAQ3G,MAAM,CAAC,IAAI4G,sBAAa,EAAE,CAAC;IAC5C;IAEA,IAAIlF,OAAO,CAACa,GAAG,EAAE;MACfpC,gBAAO,CAACC,SAAS,CAAC;QAChBC,KAAK,EAAEC,iBAAS,CAACuG,aAAa;QAC9BhH,OAAO,EAAPA;MACF,CAAC,CAAC;IACJ;;IAEA;IACA,OAAOnB,WAAW,CAAC+C,WAAW,CAAC5B,OAAO,EAAE6B,OAAO,CAAC,CAC7CZ,IAAI,CAAC,UAAClC,QAAQ,EAAK;MAClBiB,OAAO,CAACiH,QAAQ,CAAClI,QAAQ,CAAC;MAE1B,OAAO,iBAAQgF,OAAO,CAAChF,QAAQ,CAAC;IAClC,CAAC,CAAC,CACDkG,KAAK,CAAC,UAACzD,GAAG,EAAK;MACd;MACA,IAAI3C,WAAW,CAAC0C,YAAY,CAACC,GAAG,CAAC,EAAE;QACjClB,gBAAO,CAACC,SAAS,CAAC;UAChBC,KAAK,EAAEC,iBAAS,CAACyG,UAAU;UAC3BlH,OAAO,EAAPA;QACF,CAAC,CAAC;;QAEF;QACA;QACA,OAAO,iBAAQG,MAAM,CAAC,IAAIgH,qBAAiB,CAAC,uBAAuB,EAAE3F,GAAG,CAAC,CAAC;MAC5E;MACA0D,oBAAW,CAACC,MAAM,CAACC,KAAK,CACtB,8DAA8D,EAC9D5D,GAAG,CACJ;MAED,OAAO,iBAAQrB,MAAM,CAAC,IAAIiH,oBAAgB,CAACvF,OAAO,EAAE,uBAAuB,EAAEL,GAAG,CAAC,CAAC;IACpF,CAAC,CAAC;EACN,CAAC;EAED6F,eAAe,EAAE,yBAACxF,OAAO,EAAK;IAC5B,IAAOyF,SAAS,GAAmDzF,OAAO,CAAnEyF,SAAS;MAAEC,SAAS,GAAwC1F,OAAO,CAAxD0F,SAAS;MAAEC,SAAS,GAA6B3F,OAAO,CAA7C2F,SAAS;MAAEC,WAAW,GAAgB5F,OAAO,CAAlC4F,WAAW;MAAEC,UAAU,GAAI7F,OAAO,CAArB6F,UAAU;IAE/D,IAAIJ,SAAS,IAAI,CAACzI,WAAW,CAAC8I,QAAQ,CAACF,WAAW,CAAC,CAACG,UAAU,EAAE;MAC9D,OAAO,iBAAQzH,MAAM,CAAC,IAAIC,kBAAc,CAAC,iCAAiC,CAAC,CAAC;IAC9E;IAEA,IAAImH,SAAS,IAAI,CAAC1I,WAAW,CAAC8I,QAAQ,CAACF,WAAW,CAAC,CAACI,UAAU,EAAE;MAC9D,OAAO,iBAAQ1H,MAAM,CAAC,IAAIC,kBAAc,CAAC,iCAAiC,CAAC,CAAC;IAC9E;IAEA,IAAIoH,SAAS,IAAI,CAAC3I,WAAW,CAAC8I,QAAQ,CAACD,UAAU,CAAC,CAACE,UAAU,EAAE;MAC7D,OAAO,iBAAQzH,MAAM,CAAC,IAAIC,kBAAc,CAAC,iCAAiC,CAAC,CAAC;IAC9E;IAEA,OAAO,iBAAQ2D,OAAO,EAAE;EAC1B,CAAC;EAED4D,QAAQ,EAAE,kBAACG,MAAM,EAAK;IACpB,IAAID,UAAU,GAAG,IAAI;IACrB,IAAID,UAAU,GAAG,IAAI;IACrB,IAAIG,WAAW,GAAG,IAAI;IACtB,IAAIC,WAAW,GAAG,IAAI;IAEtB,IAAI,CAACF,MAAM,EAAE;MACX,OAAO;QAACD,UAAU,EAAE,IAAI;QAAED,UAAU,EAAE;MAAI,CAAC;IAC7C;IACA,IAAIE,MAAM,CAACG,cAAc,EAAE;MACzBF,WAAW,GAAGD,MAAM,CAACG,cAAc,EAAE;IACvC;IACA,IAAIH,MAAM,CAACI,cAAc,EAAE;MACzBF,WAAW,GAAGF,MAAM,CAACI,cAAc,EAAE;IACvC;IAEA,IAAIH,WAAW,IAAIA,WAAW,CAACI,MAAM,GAAG,CAAC,EAAE;MAAA,mBAC1BJ,WAAW;MAAA;MAAzBF,UAAU;IACb;IAEA,IAAIG,WAAW,IAAIA,WAAW,CAACG,MAAM,GAAG,CAAC,EAAE;MAAA,mBAC1BH,WAAW;MAAA;MAAzBJ,UAAU;IACb;IAEA,OAAO;MAACC,UAAU,EAAVA,UAAU;MAAED,UAAU,EAAVA;IAAU,CAAC;EACjC,CAAC;EAEDQ,yBAAyB,EAAE,mCAACrH,SAAS;IAAA,OACnCA,SAAS,IACTA,SAAS,CAAC8E,WAAW,IACrB9E,SAAS,CAAC8E,WAAW,CAACzE,IAAI,IAC1BL,SAAS,CAAC8E,WAAW,CAACzE,IAAI,IAC1BL,SAAS,CAAC8E,WAAW,CAACzE,IAAI,CAACqB,SAAS;EAAA;EAEtC4F,sBAAsB,EAAE,gCAACtH,SAAS;IAAA,OAChCA,SAAS,IACTA,SAAS,CAAC8E,WAAW,IACrB9E,SAAS,CAAC8E,WAAW,CAACzE,IAAI,IAC1BL,SAAS,CAAC8E,WAAW,CAACzE,IAAI,IAC1BL,SAAS,CAAC8E,WAAW,CAACzE,IAAI,CAACkH,MAAM;EAAA;EAEnCC,gCAAgC,EAAE,0CAACxH,SAAS;IAAA;IAAA,OAC1C,CAAAA,SAAS,aAATA,SAAS,iDAATA,SAAS,CAAE8E,WAAW,qFAAtB,uBAAwBzE,IAAI,2DAA5B,uBAA8BoH,gBAAgB,KAAI,EAAE;EAAA;EAEtDC,wBAAwB,EAAE,kCAACC,YAAY;IAAA,OAAKA,YAAY,CAAC/G,QAAQ,CAACgH,wBAAa,CAACC,SAAS,CAAC;EAAA;EAE1FC,mBAAmB,EAAE,6BAACH,YAAY;IAAA,OAChCA,YAAY,CAAC/G,QAAQ,CAACgH,wBAAa,CAACG,sBAAsB,CAAC;EAAA;EAE7DC,WAAW,EAAE,qBAACL,YAAY;IAAA,OACxBA,YAAY,CAAC/G,QAAQ,CAACgH,wBAAa,CAACK,iBAAiB,CAAC,IACtDN,YAAY,CAAC/G,QAAQ,CAACgH,wBAAa,CAACM,oBAAoB,CAAC;EAAA;EAE3DC,aAAa,EAAE,uBAACR,YAAY;IAAA,OAC1BA,YAAY,CAAC/G,QAAQ,CAACgH,wBAAa,CAACQ,mBAAmB,CAAC,IACxDT,YAAY,CAAC/G,QAAQ,CAACgH,wBAAa,CAACS,kBAAkB,CAAC;EAAA;EAEzDC,gBAAgB,EAAE,0BAACX,YAAY;IAAA,OAAKA,YAAY,CAAC/G,QAAQ,CAACgH,wBAAa,CAACW,UAAU,CAAC;EAAA;EAEnFC,oBAAoB,EAAE,8BAACb,YAAY;IAAA,OAAKA,YAAY,CAAC/G,QAAQ,CAACgH,wBAAa,CAACa,eAAe,CAAC;EAAA;EAE5FC,4BAA4B,EAAE,sCAACf,YAAY;IAAA,OACzCA,YAAY,CAAC/G,QAAQ,CAACgH,wBAAa,CAACe,wBAAwB,CAAC;EAAA;EAE/DC,+BAA+B,EAAE,yCAACjB,YAAY;IAAA,OAC5CA,YAAY,CAAC/G,QAAQ,CAACgH,wBAAa,CAACiB,+BAA+B,CAAC,IACpElB,YAAY,CAAC/G,QAAQ,CAACgH,wBAAa,CAACkB,iBAAiB,CAAC;EAAA;EAExDC,iBAAiB,EAAE,2BAACpB,YAAY;IAAA,OAAKA,YAAY,CAAC/G,QAAQ,CAACgH,wBAAa,CAACoB,mBAAmB,CAAC;EAAA;EAE7FC,yBAAyB,EAAE,mCAACtB,YAAY;IAAA,OACtCA,YAAY,CAAC/G,QAAQ,CAACgH,wBAAa,CAACsB,8BAA8B,CAAC;EAAA;EAErEC,uBAAuB,EAAE,iCAACxB,YAAY;IAAA,OACpC,CAACA,YAAY,CAAC/G,QAAQ,CAACgH,wBAAa,CAACwB,yBAAyB,CAAC;EAAA;EAEjEC,+BAA+B,EAAE,yCAAC1B,YAAY;IAAA,OAC5C,CAACA,YAAY,CAAC/G,QAAQ,CAACgH,wBAAa,CAAC0B,+BAA+B,CAAC;EAAA;EAEvEC,iBAAiB,EAAE,2BAAC5B,YAAY;IAAA,OAAK,CAACA,YAAY,CAAC/G,QAAQ,CAACgH,wBAAa,CAAC4B,oBAAoB,CAAC;EAAA;EAE/FC,WAAW,EAAE,qBAACC,OAAO,EAAEC,OAAO,EAAEtL,QAAQ,EAAK;IAC3C,IAAIqL,OAAO,IAAIA,OAAO,CAACE,OAAO,EAAE;MAC9B,OAAOD,OAAO,CAACF,WAAW,CAAC;QAACpL,QAAQ,EAARA,QAAQ;QAAEwL,IAAI,EAAE;MAAI,CAAC,CAAC;IACpD;IAEA,OAAO,iBAAQzK,MAAM,CAAC,IAAI0K,mBAAe,CAAC,2CAA2C,CAAC,CAAC;EACzF,CAAC;EAEDC,aAAa,EAAE,uBAACL,OAAO,EAAEC,OAAO,EAAEtL,QAAQ,EAAK;IAC7C,IAAIqL,OAAO,IAAIA,OAAO,CAACM,SAAS,EAAE;MAChC,OAAOL,OAAO,CAACF,WAAW,CAAC;QAACpL,QAAQ,EAARA,QAAQ;QAAEwL,IAAI,EAAE;MAAK,CAAC,CAAC;IACrD;IAEA,OAAO,iBAAQzK,MAAM,CAAC,IAAI0K,mBAAe,CAAC,6CAA6C,CAAC,CAAC;EAC3F,CAAC;EAEDG,kBAAkB,EAAE,4BAACnD,UAAuC,EAAK;IAC/D,IAAMoD,UAAU,GAAG,oCAAoC;IAEvD,IAAIpD,UAAU,EAAE;MACd,IAAMqD,QAAQ,GAAGrD,UAAU,CAACsD,eAAe,CAACC,WAAW,EAAE;MACzD,IAAOC,QAAQ,GAAIH,QAAQ,CAApBG,QAAQ;MAEfnG,oBAAW,CAACC,MAAM,CAACmG,GAAG,CAACL,UAAU,uBAAgBI,QAAQ,EAAG;MAC5DnG,oBAAW,CAACC,MAAM,CAACmG,GAAG,CAACL,UAAU,EAAE,YAAY,EAAE,wBAAeC,QAAQ,CAAC,CAAC;IAC5E;EACF,CAAC;EAEDK,kBAAkB,EAAE,4BAAC3D,UAAmC,EAAK;IAC3D,IAAMqD,UAAU,GAAG,oCAAoC;IAEvD,IAAIrD,UAAU,EAAE;MACd,IAAMsD,QAAQ,GAAGtD,UAAU,CAACuD,eAAe,CAACC,WAAW,EAAE;MACzD,IAAOC,QAAQ,GAAIH,QAAQ,CAApBG,QAAQ;MAEfnG,oBAAW,CAACC,MAAM,CAACmG,GAAG,CAACL,UAAU,uBAAgBI,QAAQ,EAAG;MAC5DnG,oBAAW,CAACC,MAAM,CAACmG,GAAG,CAACL,UAAU,EAAE,YAAY,EAAE,wBAAeC,QAAQ,CAAC,CAAC;IAC5E;EACF,CAAC;EAEDM,mBAAmB,EAAE,+BAAkB;IAAA,IAAjBC,OAAO,uEAAG,EAAE;IAChC,IAAMR,UAAU,GAAG,qCAAqC;IAExDQ,OAAO,CAAC7L,OAAO,CAAC,UAAC8L,MAAM,EAAK;MAC1BxG,oBAAW,CAACC,MAAM,CAACmG,GAAG,CAACL,UAAU,uBAAgBS,MAAM,CAACL,QAAQ,EAAG;MACnEnG,oBAAW,CAACC,MAAM,CAACmG,GAAG,CAACL,UAAU,EAAE,UAAU,EAAE,wBAAeS,MAAM,CAAC,CAAC;IACxE,CAAC,CAAC;EACJ,CAAC;EAEDC,gBAAgB,EAAE,0BAAC3L,OAAO,EAAK;IAC7B,IAAIA,OAAO,CAAC6E,YAAY,KAAKC,qBAAU,CAACC,QAAQ,EAAE;MAChD,OAAO,iBAAQ5E,MAAM,CAAC,IAAI6E,kCAAqB,EAAE,CAAC;IACpD;IAEA,IAAM4G,UAAU,GAAG;MACjBxM,QAAQ,EAAEY,OAAO,CAACZ;IACpB,CAAC;IAED,OAAOY,OAAO,CAAC+B,cAAc,CAC1B4J,gBAAgB,CAACC,UAAU,CAAC,CAC5B3K,IAAI,CAAC;MAAA,OAAMpC,WAAW,CAAC6E,OAAO,CAAC1D,OAAO,CAAC;IAAA,EAAC,CACxCiF,KAAK,CAAC,UAACzD,GAAG,EAAK;MACd0D,oBAAW,CAACC,MAAM,CAACC,KAAK,4GAC8EpF,OAAO,CAACL,EAAE,sBAAY6B,GAAG,EAC9H;MAED,OAAO,iBAAQrB,MAAM,CAACqB,GAAG,CAAC;IAC5B,CAAC,CAAC;EACN,CAAC;EAEDqK,sBAAsB,EAAE,gCAACnD,YAAY;IAAA,OAAKA,YAAY,CAAC/G,QAAQ,CAACgH,wBAAa,CAACmD,aAAa,CAAC;EAAA;EAE5FC,wBAAwB,EAAE,kCAACrD,YAAY;IAAA,OACrCA,YAAY,CAAC/G,QAAQ,CAACgH,wBAAa,CAACqD,wBAAwB,CAAC;EAAA;EAE/DC,oBAAoB,EAAE,8BAACvD,YAAY;IAAA,OACjCA,YAAY,CAAC/G,QAAQ,CAACgH,wBAAa,CAACuD,2BAA2B,CAAC;EAAA;EAElEC,mBAAmB,EAAE,6BAACzD,YAAY;IAAA,OAChCA,YAAY,CAAC/G,QAAQ,CAACgH,wBAAa,CAACyD,0BAA0B,CAAC;EAAA;EAEjEC,qBAAqB,EAAE,+BAAC3D,YAAY;IAAA,OAClCA,YAAY,CAAC/G,QAAQ,CAACgH,wBAAa,CAAC2D,qBAAqB,CAAC;EAAA;EAE5DC,sBAAsB,EAAE,gCAAC7D,YAAY;IAAA,OACnCA,YAAY,CAAC/G,QAAQ,CAACgH,wBAAa,CAAC6D,6BAA6B,CAAC;EAAA;EAEpEC,mBAAmB,EAAE,6BAAC/D,YAAY;IAAA,OAAKA,YAAY,CAAC/G,QAAQ,CAACgH,wBAAa,CAAC+D,oBAAoB,CAAC;EAAA;EAEhGC,4BAA4B,EAAE,sCAACjE,YAAY;IAAA,OACzCA,YAAY,CAAC/G,QAAQ,CAACgH,wBAAa,CAACiE,6BAA6B,CAAC;EAAA;EAEpEC,wBAAwB,EAAE,kCAACnE,YAAY;IAAA,OACrCA,YAAY,CAAC/G,QAAQ,CAACgH,wBAAa,CAACmE,uBAAuB,CAAC;EAAA;EAE9DC,sBAAsB,EAAE,gCAACrE,YAAY;IAAA,OAAKA,YAAY,CAAC/G,QAAQ,CAACgH,wBAAa,CAACqE,kBAAkB,CAAC;EAAA;EAEjGC,gBAAgB,EAAE,0BAACC,aAAa,EAAExE,YAAY,EAAK;IACjD,IAAIA,YAAY,CAAC/G,QAAQ,CAACgH,wBAAa,CAACwE,gBAAgB,CAAC,EAAE;MACzD,OAAO,IAAI;IACb;IACA,IAAIzE,YAAY,CAAC/G,QAAQ,CAACgH,wBAAa,CAACyE,kBAAkB,CAAC,EAAE;MAC3D,OAAO,KAAK;IACd;IAEA,OAAOF,aAAa;EACtB,CAAC;EACDG,4BAA4B,EAAE,sCAAC3E,YAAY;IAAA,OACzCA,YAAY,CAAC/G,QAAQ,CAACgH,wBAAa,CAAC2E,4BAA4B,CAAC;EAAA;EAEnEC,mBAAmB,EAAE,6BAAC7E,YAAY;IAAA,OAAKA,YAAY,CAAC/G,QAAQ,CAACgH,wBAAa,CAAC6E,iBAAiB,CAAC;EAAA;EAE7F;AACF;AACA;AACA;AACA;AACA;EACEC,WAAW,EAAE,qBAACzN,OAAO,EAAE0N,WAAW,EAAK;IAAA;IACrC,IAAM5M,QAAQ,GAAGd,OAAO,aAAPA,OAAO,6CAAPA,OAAO,CAAEe,SAAS,uDAAlB,mBAAoBD,QAAQ;IAE7C,IAAI,CAACA,QAAQ,EAAE;MACb;IACF;IAEA4M,WAAW,CAAC5M,QAAQ,GAAGA,QAAQ;EACjC,CAAC;EAED;AACF;AACA;AACA;AACA;AACA;AACA;AACA;EACE6M,oBAAoB,EAAE,8BAAC3N,OAAO,EAAEjB,QAAQ,EAAK;IAAA;IAC3C,IAAI,CAACiB,OAAO,EAAE;MACZ,OAAOjB,QAAQ;IACjB;IAEA,IAAME,KAAK,GAAGF,QAAQ,aAARA,QAAQ,0CAARA,QAAQ,CAAEG,IAAI,oDAAd,gBAAgBD,KAAK;IAEnC,IAAIA,KAAK,EAAE;MACTe,OAAO,CAACe,SAAS,CAAC6M,YAAY,CAAC3O,KAAK,CAAC;IACvC;IAEA,OAAOF,QAAQ;EACjB,CAAC;EAED8O,yBAAyB,EAAE,mCAACC,eAAe,EAAK;IAC9C,IAAMC,UAAU,GAAG,IAAIC,OAAO,CAACF,eAAe,CAAC;IAE/C,IAAMG,iBAAiB,GAAG,SAApBA,iBAAiB,CAAIC,eAAe,EAAK;MAC7C,IAAMlO,OAAO,GAAG+N,UAAU,CAACI,KAAK,EAAE;MAElC,IAAI,CAACnO,OAAO,EAAE;QACZ,OAAO,iBAAQ+D,OAAO,EAAE;MAC1B;MAEA,IAAMlC,OAAO,GAAG,yBAAUqM,eAAe,CAAC;MAE1C,IAAI,CAACrM,OAAO,CAAC3C,IAAI,EAAE;QACjB2C,OAAO,CAAC3C,IAAI,GAAG,CAAC,CAAC;MACnB;MAEAL,WAAW,CAAC4O,WAAW,CAACzN,OAAO,EAAE6B,OAAO,CAAC3C,IAAI,CAAC;MAE9C,OAAOc,OAAO,CACX0K,OAAO,CAAC7I,OAAO,CAAC,CAChBZ,IAAI,CAAC,UAAClC,QAAQ;QAAA,OAAKF,WAAW,CAAC8O,oBAAoB,CAAC3N,OAAO,EAAEjB,QAAQ,CAAC;MAAA,EAAC;IAC5E,CAAC;IAED,OAAOkP,iBAAiB;EAC1B;AACF,CAAC;AAAC,eAEapP,WAAW;AAAA"}
|
|
1
|
+
{"version":3,"names":["MeetingUtil","parseLocusJoin","response","parsed","locus","body","mediaConnections","locusUrl","url","locusId","split","pop","selfId","self","id","forEach","mediaConnection","mediaId","remoteUpdateAudioVideo","meeting","audioMuted","videoMuted","reject","ParameterError","locusMediaRequest","Metrics","postEvent","event","eventType","MEDIA_REQUEST","send","type","selfUrl","sequence","locusInfo","muteOptions","then","MEDIA_RESPONSE","hasOwner","info","owner","isOwnerSelf","isPinOrGuest","err","errorCode","INTENT_TO_JOIN","includes","joinMeeting","options","LOCUS_JOIN_REQUEST","meetingRequest","inviteeAddress","meetingJoinUrl","sipUri","meetingNumber","deviceUrl","correlationId","roapMessage","permissionToken","resourceId","moderator","pin","moveToResource","preferTranscoding","isMultistream","asResourceOccupant","breakoutsSupported","locale","deviceCapabilities","liveAnnotationSupported","res","LOCUS_JOIN_RESPONSE","data","trigger","LOCI_UPDATE","trackingId","headers","trackingid","cleanUp","breakouts","stopStatsAnalyzer","statsAnalyzer","stopAnalyzer","resolve","closeLocalStream","closeLocalShare","closeRemoteTracks","closePeerConnections","unsetLocalVideoTrack","unsetLocalShareTrack","unsetRemoteTracks","unsetPeerConnections","reconnectionManager","stopKeepAlive","updateLLMConnection","disconnectPhoneAudio","phoneUrl","meetingState","FULL_STATE","INACTIVE","MeetingNotActiveError","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","canUserRaiseHand","RAISE_HAND","canUserLowerAllHands","LOWER_ALL_HANDS","canUserLowerSomeoneElsesHand","LOWER_SOMEONE_ELSES_HAND","bothLeaveAndEndMeetingAvailable","LEAVE_TRANSFER_HOST_END_MEETING","LEAVE_END_MEETING","canManageBreakout","BREAKOUT_MANAGEMENT","isSuppressBreakoutSupport","UCF_SUPPRESS_BREAKOUTS_SUPPORT","canAdmitLobbyToBreakout","DISABLE_LOBBY_TO_BREAKOUT","isBreakoutPreassignmentsEnabled","DISABLE_BREAKOUT_PREASSIGNMENTS","canUserAskForHelp","DISABLE_ASK_FOR_HELP","lockMeeting","actions","request","canLock","lock","PermissionError","unlockMeeting","canUnlock","handleAudioLogging","LOG_HEADER","settings","underlyingTrack","getSettings","deviceId","log","handleVideoLogging","handleDeviceLogging","devices","device","endMeetingForAll","endOptions","canEnableClosedCaption","CAPTION_START","isSaveTranscriptsEnabled","SAVE_TRANSCRIPTS_ENABLED","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","canSendReactions","originalValue","REACTIONS_ACTIVE","REACTIONS_INACTIVE","canUserRenameSelfAndObserved","CAN_RENAME_SELF_AND_OBSERVED","canUserRenameOthers","CAN_RENAME_OTHERS","addSequence","requestBody","updateLocusWithDelta","onDeltaLocus","generateLocusDeltaRequest","originalMeeting","meetingRef","WeakRef","locusDeltaRequest","originalOptions","deref"],"sources":["util.ts"],"sourcesContent":["import {LocalCameraTrack, LocalMicrophoneTrack} from '@webex/media-helpers';\n\nimport {cloneDeep} from 'lodash';\nimport {MeetingNotActiveError, UserNotJoinedError} from '../common/errors/webex-errors';\nimport Metrics from '../metrics';\nimport {eventType, trigger} from '../metrics/config';\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 = {\n 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\n remoteUpdateAudioVideo: (meeting, audioMuted?: boolean, videoMuted?: boolean) => {\n if (!meeting) {\n return Promise.reject(new ParameterError('You need a meeting object.'));\n }\n\n if (!meeting.locusMediaRequest) {\n return Promise.reject(\n new ParameterError(\n 'You need a meeting with a media connection, call Meeting.addMedia() first.'\n )\n );\n }\n\n Metrics.postEvent({event: eventType.MEDIA_REQUEST, meeting});\n\n return meeting.locusMediaRequest\n .send({\n type: 'LocalMute',\n selfUrl: meeting.selfUrl,\n mediaId: meeting.mediaId,\n sequence: meeting.locusInfo.sequence,\n muteOptions: {\n audioMuted,\n videoMuted,\n },\n })\n .then((response) => {\n Metrics.postEvent({event: eventType.MEDIA_RESPONSE, meeting});\n\n return response?.body?.locus;\n });\n },\n\n hasOwner: (info) => info && info.owner,\n\n isOwnerSelf: (owner, selfId) => owner === selfId,\n\n isPinOrGuest: (err) => err?.body?.errorCode && INTENT_TO_JOIN.includes(err.body.errorCode),\n\n 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 breakoutsSupported: options.breakoutsSupported,\n locale: options.locale,\n deviceCapabilities: options.deviceCapabilities,\n liveAnnotationSupported: options.liveAnnotationSupported,\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\n cleanUp: (meeting) => {\n meeting.breakouts.cleanUp();\n\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\n 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.disconnectPhoneAudio(options).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\n 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(() => {\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 },\n declineMeeting: (meeting, reason) =>\n meeting.meetingRequest.declineMeeting({\n locusUrl: meeting.locusUrl,\n deviceUrl: meeting.deviceUrl,\n reason,\n }),\n\n isUserInLeftState: (locusInfo) => locusInfo.parsedLocus?.self?.state === _LEFT_,\n\n isUserInIdleState: (locusInfo) => locusInfo.parsedLocus?.self?.state === _IDLE_,\n\n isUserInJoinedState: (locusInfo) => locusInfo.parsedLocus?.self?.state === _JOINED_,\n\n isMediaEstablished: (currentMediaStatus) =>\n currentMediaStatus &&\n (currentMediaStatus.audio || currentMediaStatus.video || currentMediaStatus.share),\n\n 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(\n 'Meeting:util#joinMeetingOptions --> Error joining the call, ',\n err\n );\n\n return Promise.reject(new JoinMeetingError(options, 'Error Joining Meeting', err));\n });\n },\n\n 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\n 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\n getModeratorFromLocusInfo: (locusInfo) =>\n locusInfo &&\n locusInfo.parsedLocus &&\n locusInfo.parsedLocus.info &&\n locusInfo.parsedLocus.info &&\n locusInfo.parsedLocus.info.moderator,\n\n getPolicyFromLocusInfo: (locusInfo) =>\n locusInfo &&\n locusInfo.parsedLocus &&\n locusInfo.parsedLocus.info &&\n locusInfo.parsedLocus.info &&\n locusInfo.parsedLocus.info.policy,\n\n getUserDisplayHintsFromLocusInfo: (locusInfo) =>\n locusInfo?.parsedLocus?.info?.userDisplayHints || [],\n\n canInviteNewParticipants: (displayHints) => displayHints.includes(DISPLAY_HINTS.ADD_GUEST),\n\n canAdmitParticipant: (displayHints) =>\n displayHints.includes(DISPLAY_HINTS.ROSTER_WAITING_TO_JOIN),\n\n canUserLock: (displayHints) =>\n displayHints.includes(DISPLAY_HINTS.LOCK_CONTROL_LOCK) &&\n displayHints.includes(DISPLAY_HINTS.LOCK_STATUS_UNLOCKED),\n\n canUserUnlock: (displayHints) =>\n displayHints.includes(DISPLAY_HINTS.LOCK_CONTROL_UNLOCK) &&\n displayHints.includes(DISPLAY_HINTS.LOCK_STATUS_LOCKED),\n\n canUserRaiseHand: (displayHints) => displayHints.includes(DISPLAY_HINTS.RAISE_HAND),\n\n canUserLowerAllHands: (displayHints) => displayHints.includes(DISPLAY_HINTS.LOWER_ALL_HANDS),\n\n canUserLowerSomeoneElsesHand: (displayHints) =>\n displayHints.includes(DISPLAY_HINTS.LOWER_SOMEONE_ELSES_HAND),\n\n bothLeaveAndEndMeetingAvailable: (displayHints) =>\n displayHints.includes(DISPLAY_HINTS.LEAVE_TRANSFER_HOST_END_MEETING) ||\n displayHints.includes(DISPLAY_HINTS.LEAVE_END_MEETING),\n\n canManageBreakout: (displayHints) => displayHints.includes(DISPLAY_HINTS.BREAKOUT_MANAGEMENT),\n\n isSuppressBreakoutSupport: (displayHints) =>\n displayHints.includes(DISPLAY_HINTS.UCF_SUPPRESS_BREAKOUTS_SUPPORT),\n\n canAdmitLobbyToBreakout: (displayHints) =>\n !displayHints.includes(DISPLAY_HINTS.DISABLE_LOBBY_TO_BREAKOUT),\n\n isBreakoutPreassignmentsEnabled: (displayHints) =>\n !displayHints.includes(DISPLAY_HINTS.DISABLE_BREAKOUT_PREASSIGNMENTS),\n\n canUserAskForHelp: (displayHints) => !displayHints.includes(DISPLAY_HINTS.DISABLE_ASK_FOR_HELP),\n\n 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\n 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\n handleAudioLogging: (audioTrack: LocalMicrophoneTrack | null) => {\n const LOG_HEADER = 'MeetingUtil#handleAudioLogging -->';\n\n if (audioTrack) {\n const settings = audioTrack.underlyingTrack.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\n handleVideoLogging: (videoTrack: LocalCameraTrack | null) => {\n const LOG_HEADER = 'MeetingUtil#handleVideoLogging -->';\n\n if (videoTrack) {\n const settings = videoTrack.underlyingTrack.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\n 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\n 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(() => 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\n canEnableClosedCaption: (displayHints) => displayHints.includes(DISPLAY_HINTS.CAPTION_START),\n\n isSaveTranscriptsEnabled: (displayHints) =>\n displayHints.includes(DISPLAY_HINTS.SAVE_TRANSCRIPTS_ENABLED),\n\n canStartTranscribing: (displayHints) =>\n displayHints.includes(DISPLAY_HINTS.TRANSCRIPTION_CONTROL_START),\n\n canStopTranscribing: (displayHints) =>\n displayHints.includes(DISPLAY_HINTS.TRANSCRIPTION_CONTROL_STOP),\n\n isClosedCaptionActive: (displayHints) =>\n displayHints.includes(DISPLAY_HINTS.CAPTION_STATUS_ACTIVE),\n\n isWebexAssistantActive: (displayHints) =>\n displayHints.includes(DISPLAY_HINTS.WEBEX_ASSISTANT_STATUS_ACTIVE),\n\n canViewCaptionPanel: (displayHints) => displayHints.includes(DISPLAY_HINTS.ENABLE_CAPTION_PANEL),\n\n isRealTimeTranslationEnabled: (displayHints) =>\n displayHints.includes(DISPLAY_HINTS.DISPLAY_REAL_TIME_TRANSLATION),\n\n canSelectSpokenLanguages: (displayHints) =>\n displayHints.includes(DISPLAY_HINTS.DISPLAY_NON_ENGLISH_ASR),\n\n waitingForOthersToJoin: (displayHints) => displayHints.includes(DISPLAY_HINTS.WAITING_FOR_OTHERS),\n\n 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 canUserRenameSelfAndObserved: (displayHints) =>\n displayHints.includes(DISPLAY_HINTS.CAN_RENAME_SELF_AND_OBSERVED),\n\n canUserRenameOthers: (displayHints) => displayHints.includes(DISPLAY_HINTS.CAN_RENAME_OTHERS),\n\n /**\n * Adds the current locus sequence information to a request body\n * @param {Object} meeting The meeting object\n * @param {Object} requestBody The body of a request to locus\n * @returns {void}\n */\n addSequence: (meeting, requestBody) => {\n const sequence = meeting?.locusInfo?.sequence;\n\n if (!sequence) {\n return;\n }\n\n requestBody.sequence = sequence;\n },\n\n /**\n * Updates the locus info for the meeting with the delta locus\n * returned from requests that include the sequence information\n * Returns the original response object\n * @param {Object} meeting The meeting object\n * @param {Object} response The response of the http request\n * @returns {Object}\n */\n updateLocusWithDelta: (meeting, response) => {\n if (!meeting) {\n return response;\n }\n\n const locus = response?.body?.locus;\n\n if (locus) {\n meeting.locusInfo.onDeltaLocus(locus);\n }\n\n return response;\n },\n\n generateLocusDeltaRequest: (originalMeeting) => {\n const meetingRef = new WeakRef(originalMeeting);\n\n const locusDeltaRequest = (originalOptions) => {\n const meeting = meetingRef.deref();\n\n if (!meeting) {\n return Promise.resolve();\n }\n\n const options = cloneDeep(originalOptions);\n\n if (!options.body) {\n options.body = {};\n }\n\n MeetingUtil.addSequence(meeting, options.body);\n\n return meeting\n .request(options)\n .then((response) => MeetingUtil.updateLocusWithDelta(meeting, response));\n };\n\n return locusDeltaRequest;\n },\n};\n\nexport default MeetingUtil;\n"],"mappings":";;;;;;;;;;;;;;;;;;AAGA;AACA;AACA;AACA;AACA;AASA;AACA;AACA;AACA;AACA;AACA;AAA0D;AAAA;AAE1D,IAAMA,WAAW,GAAG;EAClBC,cAAc,EAAE,wBAACC,QAAQ,EAAK;IAC5B,IAAMC,MAAW,GAAG,CAAC,CAAC;;IAEtB;IACAA,MAAM,CAACC,KAAK,GAAGF,QAAQ,CAACG,IAAI,CAACD,KAAK;IAClCD,MAAM,CAACG,gBAAgB,GAAGJ,QAAQ,CAACG,IAAI,CAACC,gBAAgB;IACxDH,MAAM,CAACI,QAAQ,GAAGJ,MAAM,CAACC,KAAK,CAACI,GAAG;IAClCL,MAAM,CAACM,OAAO,GAAGN,MAAM,CAACC,KAAK,CAACI,GAAG,CAACE,KAAK,CAAC,GAAG,CAAC,CAACC,GAAG,EAAE;IAClDR,MAAM,CAACS,MAAM,GAAGT,MAAM,CAACC,KAAK,CAACS,IAAI,CAACC,EAAE;;IAEpC;IACAX,MAAM,CAACG,gBAAgB,CAACS,OAAO,CAAC,UAACC,eAAe,EAAK;MACnD,IAAIA,eAAe,CAACC,OAAO,EAAE;QAC3Bd,MAAM,CAACc,OAAO,GAAGD,eAAe,CAACC,OAAO;MAC1C;IACF,CAAC,CAAC;IAEF,OAAOd,MAAM;EACf,CAAC;EAEDe,sBAAsB,EAAE,gCAACC,OAAO,EAAEC,UAAoB,EAAEC,UAAoB,EAAK;IAC/E,IAAI,CAACF,OAAO,EAAE;MACZ,OAAO,iBAAQG,MAAM,CAAC,IAAIC,kBAAc,CAAC,4BAA4B,CAAC,CAAC;IACzE;IAEA,IAAI,CAACJ,OAAO,CAACK,iBAAiB,EAAE;MAC9B,OAAO,iBAAQF,MAAM,CACnB,IAAIC,kBAAc,CAChB,4EAA4E,CAC7E,CACF;IACH;IAEAE,gBAAO,CAACC,SAAS,CAAC;MAACC,KAAK,EAAEC,iBAAS,CAACC,aAAa;MAAEV,OAAO,EAAPA;IAAO,CAAC,CAAC;IAE5D,OAAOA,OAAO,CAACK,iBAAiB,CAC7BM,IAAI,CAAC;MACJC,IAAI,EAAE,WAAW;MACjBC,OAAO,EAAEb,OAAO,CAACa,OAAO;MACxBf,OAAO,EAAEE,OAAO,CAACF,OAAO;MACxBgB,QAAQ,EAAEd,OAAO,CAACe,SAAS,CAACD,QAAQ;MACpCE,WAAW,EAAE;QACXf,UAAU,EAAVA,UAAU;QACVC,UAAU,EAAVA;MACF;IACF,CAAC,CAAC,CACDe,IAAI,CAAC,UAAClC,QAAQ,EAAK;MAAA;MAClBuB,gBAAO,CAACC,SAAS,CAAC;QAACC,KAAK,EAAEC,iBAAS,CAACS,cAAc;QAAElB,OAAO,EAAPA;MAAO,CAAC,CAAC;MAE7D,OAAOjB,QAAQ,aAARA,QAAQ,yCAARA,QAAQ,CAAEG,IAAI,mDAAd,eAAgBD,KAAK;IAC9B,CAAC,CAAC;EACN,CAAC;EAEDkC,QAAQ,EAAE,kBAACC,IAAI;IAAA,OAAKA,IAAI,IAAIA,IAAI,CAACC,KAAK;EAAA;EAEtCC,WAAW,EAAE,qBAACD,KAAK,EAAE5B,MAAM;IAAA,OAAK4B,KAAK,KAAK5B,MAAM;EAAA;EAEhD8B,YAAY,EAAE,sBAACC,GAAG;IAAA;IAAA,OAAK,CAAAA,GAAG,aAAHA,GAAG,oCAAHA,GAAG,CAAEtC,IAAI,8CAAT,UAAWuC,SAAS,KAAIC,yBAAc,CAACC,QAAQ,CAACH,GAAG,CAACtC,IAAI,CAACuC,SAAS,CAAC;EAAA;EAE1FG,WAAW,EAAE,qBAAC5B,OAAO,EAAE6B,OAAO,EAAK;IACjC,IAAI,CAAC7B,OAAO,EAAE;MACZ,OAAO,iBAAQG,MAAM,CAAC,IAAIC,kBAAc,CAAC,4BAA4B,CAAC,CAAC;IACzE;IAEAE,gBAAO,CAACC,SAAS,CAAC;MAACC,KAAK,EAAEC,iBAAS,CAACqB,kBAAkB;MAAE9B,OAAO,EAAPA;IAAO,CAAC,CAAC;;IAEjE;IACA;IACA;IACA,OAAOA,OAAO,CAAC+B,cAAc,CAC1BH,WAAW,CAAC;MACXI,cAAc,EAAEhC,OAAO,CAACiC,cAAc,IAAIjC,OAAO,CAACkC,MAAM;MACxDC,aAAa,EAAEnC,OAAO,CAACmC,aAAa;MACpCC,SAAS,EAAEpC,OAAO,CAACoC,SAAS;MAC5BhD,QAAQ,EAAEY,OAAO,CAACZ,QAAQ;MAC1BiD,aAAa,EAAErC,OAAO,CAACqC,aAAa;MACpCC,WAAW,EAAET,OAAO,CAACS,WAAW;MAChCC,eAAe,EAAEvC,OAAO,CAACuC,eAAe;MACxCC,UAAU,EAAEX,OAAO,CAACW,UAAU,IAAI,IAAI;MACtCC,SAAS,EAAEZ,OAAO,CAACY,SAAS;MAC5BC,GAAG,EAAEb,OAAO,CAACa,GAAG;MAChBC,cAAc,EAAEd,OAAO,CAACc,cAAc;MACtCC,iBAAiB,EAAE,CAAC5C,OAAO,CAAC6C,aAAa;MACzCC,kBAAkB,EAAEjB,OAAO,CAACiB,kBAAkB;MAC9CC,kBAAkB,EAAElB,OAAO,CAACkB,kBAAkB;MAC9CC,MAAM,EAAEnB,OAAO,CAACmB,MAAM;MACtBC,kBAAkB,EAAEpB,OAAO,CAACoB,kBAAkB;MAC9CC,uBAAuB,EAAErB,OAAO,CAACqB;IACnC,CAAC,CAAC,CACDjC,IAAI,CAAC,UAACkC,GAAG,EAAK;MACb7C,gBAAO,CAACC,SAAS,CAAC;QAChBC,KAAK,EAAEC,iBAAS,CAAC2C,mBAAmB;QACpCpD,OAAO,EAAPA,OAAO;QACPqD,IAAI,EAAE;UACJC,OAAO,EAAEA,eAAO,CAACC,WAAW;UAC5BtE,KAAK,EAAEkE,GAAG,CAACjE,IAAI,CAACD,KAAK;UACrBE,gBAAgB,EAAEgE,GAAG,CAACjE,IAAI,CAACC,gBAAgB;UAC3CqE,UAAU,EAAEL,GAAG,CAACM,OAAO,CAACC;QAC1B;MACF,CAAC,CAAC;MAEF,OAAO7E,WAAW,CAACC,cAAc,CAACqE,GAAG,CAAC;IACxC,CAAC,CAAC;EACN,CAAC;EAEDQ,OAAO,EAAE,iBAAC3D,OAAO,EAAK;IACpBA,OAAO,CAAC4D,SAAS,CAACD,OAAO,EAAE;;IAE3B;IACA,IAAME,iBAAiB,GAAG7D,OAAO,CAAC8D,aAAa,GAC3C9D,OAAO,CAAC8D,aAAa,CAACC,YAAY,EAAE,GACpC,iBAAQC,OAAO,EAAE;IAErB,OAAOH,iBAAiB,CACrB5C,IAAI,CAAC;MAAA,OAAMjB,OAAO,CAACiE,gBAAgB,EAAE;IAAA,EAAC,CACtChD,IAAI,CAAC;MAAA,OAAMjB,OAAO,CAACkE,eAAe,EAAE;IAAA,EAAC,CACrCjD,IAAI,CAAC;MAAA,OAAMjB,OAAO,CAACmE,iBAAiB,EAAE;IAAA,EAAC,CACvClD,IAAI,CAAC;MAAA,OAAMjB,OAAO,CAACoE,oBAAoB,EAAE;IAAA,EAAC,CAC1CnD,IAAI,CAAC,YAAM;MACVjB,OAAO,CAACqE,oBAAoB,EAAE;MAC9BrE,OAAO,CAACsE,oBAAoB,EAAE;MAC9BtE,OAAO,CAACuE,iBAAiB,EAAE;MAC3BvE,OAAO,CAACwE,oBAAoB,EAAE;MAC9BxE,OAAO,CAACyE,mBAAmB,CAACd,OAAO,EAAE;IACvC,CAAC,CAAC,CACD1C,IAAI,CAAC;MAAA,OAAMjB,OAAO,CAAC0E,aAAa,EAAE;IAAA,EAAC,CACnCzD,IAAI,CAAC;MAAA,OAAMjB,OAAO,CAAC2E,mBAAmB,EAAE;IAAA,EAAC;EAC9C,CAAC;EAEDC,oBAAoB,EAAE,8BAAC5E,OAAO,EAAE6E,QAAQ,EAAK;IAC3C,IAAI7E,OAAO,CAAC8E,YAAY,KAAKC,qBAAU,CAACC,QAAQ,EAAE;MAChD,OAAO,iBAAQ7E,MAAM,CAAC,IAAI8E,kCAAqB,EAAE,CAAC;IACpD;IAEA,IAAMpD,OAAO,GAAG;MACdzC,QAAQ,EAAEY,OAAO,CAACZ,QAAQ;MAC1BK,MAAM,EAAEO,OAAO,CAACP,MAAM;MACtB4C,aAAa,EAAErC,OAAO,CAACqC,aAAa;MACpCwC,QAAQ,EAARA;IACF,CAAC;IAED,OAAO7E,OAAO,CAAC+B,cAAc,CAAC6C,oBAAoB,CAAC/C,OAAO,CAAC,CAACqD,KAAK,CAAC,UAAC1D,GAAG,EAAK;MACzE2D,oBAAW,CAACC,MAAM,CAACC,KAAK,6GAC+ErF,OAAO,CAACL,EAAE,sBAAY6B,GAAG,EAC/H;MAED,OAAO,iBAAQrB,MAAM,CAACqB,GAAG,CAAC;IAC5B,CAAC,CAAC;EACJ,CAAC;EAED;EACA;EACA;EACA;EACA8D,YAAY,EAAE,sBAACtF,OAAO,EAAwB;IAAA,IAAtB6B,OAAY,uEAAG,CAAC,CAAC;IACvC,IAAI7B,OAAO,CAAC8E,YAAY,KAAKC,qBAAU,CAACC,QAAQ,EAAE;MAChD;MACA,OAAO,iBAAQ7E,MAAM,CAAC,IAAI8E,kCAAqB,EAAE,CAAC;IACpD;IAEA,IAAIpG,WAAW,CAAC0G,iBAAiB,CAACvF,OAAO,CAACe,SAAS,CAAC,EAAE;MACpD,OAAO,iBAAQZ,MAAM,CAAC,IAAIqF,+BAAkB,EAAE,CAAC;IACjD;IAEA,IAAMC,cAAc,GAAG;MACrBrG,QAAQ,EAAEY,OAAO,CAACZ,QAAQ;MAC1BK,MAAM,EAAEO,OAAO,CAACP,MAAM;MACtB4C,aAAa,EAAErC,OAAO,CAACqC,aAAa;MACpCG,UAAU,EAAExC,OAAO,CAACwC,UAAU;MAC9BJ,SAAS,EAAEpC,OAAO,CAACoC;IACrB,CAAC;IAED,IAAMsD,YAAY,mCAAOD,cAAc,GAAK5D,OAAO,CAAC;IAEpD,OAAO7B,OAAO,CAAC+B,cAAc,CAC1BuD,YAAY,CAACI,YAAY,CAAC,CAC1BzE,IAAI,CAAC,YAAM;MACV,IAAIY,OAAO,CAAC8D,WAAW,EAAE;QACvB,OAAO,iBAAQ3B,OAAO,EAAE;MAC1B;MAEA,OAAOnF,WAAW,CAAC8E,OAAO,CAAC3D,OAAO,CAAC;IACrC,CAAC,CAAC,CACDkF,KAAK,CAAC,UAAC1D,GAAG,EAAK;MACd;MACA;MACA;MACA2D,oBAAW,CAACC,MAAM,CAACC,KAAK,sGACwErF,OAAO,CAACL,EAAE,sBAAY6B,GAAG,EACxH;MAED,OAAO,iBAAQrB,MAAM,CAACqB,GAAG,CAAC;IAC5B,CAAC,CAAC;EACN,CAAC;EACDoE,cAAc,EAAE,wBAAC5F,OAAO,EAAE6F,MAAM;IAAA,OAC9B7F,OAAO,CAAC+B,cAAc,CAAC6D,cAAc,CAAC;MACpCxG,QAAQ,EAAEY,OAAO,CAACZ,QAAQ;MAC1BgD,SAAS,EAAEpC,OAAO,CAACoC,SAAS;MAC5ByD,MAAM,EAANA;IACF,CAAC,CAAC;EAAA;EAEJN,iBAAiB,EAAE,2BAACxE,SAAS;IAAA;IAAA,OAAK,0BAAAA,SAAS,CAAC+E,WAAW,oFAArB,sBAAuBpG,IAAI,2DAA3B,uBAA6BqG,KAAK,MAAKC,iBAAM;EAAA;EAE/EC,iBAAiB,EAAE,2BAAClF,SAAS;IAAA;IAAA,OAAK,2BAAAA,SAAS,CAAC+E,WAAW,qFAArB,uBAAuBpG,IAAI,2DAA3B,uBAA6BqG,KAAK,MAAKG,iBAAM;EAAA;EAE/EC,mBAAmB,EAAE,6BAACpF,SAAS;IAAA;IAAA,OAAK,2BAAAA,SAAS,CAAC+E,WAAW,qFAArB,uBAAuBpG,IAAI,2DAA3B,uBAA6BqG,KAAK,MAAKK,mBAAQ;EAAA;EAEnFC,kBAAkB,EAAE,4BAACC,kBAAkB;IAAA,OACrCA,kBAAkB,KACjBA,kBAAkB,CAACC,KAAK,IAAID,kBAAkB,CAACE,KAAK,IAAIF,kBAAkB,CAACG,KAAK,CAAC;EAAA;EAEpFC,kBAAkB,EAAE,4BAAC1G,OAAO,EAAwB;IAAA,IAAtB6B,OAAY,uEAAG,CAAC,CAAC;IAC7C7B,OAAO,CAACwC,UAAU,GAAGxC,OAAO,CAACwC,UAAU,IAAIX,OAAO,CAACW,UAAU;IAE7D,IAAIxC,OAAO,CAAC2G,eAAe,EAAE;MAC3B,OAAO,iBAAQxG,MAAM,CAAC,IAAIyG,qBAAY,EAAE,CAAC;IAC3C;IACA,IAAI5G,OAAO,CAAC6G,cAAc,KAAKC,0BAAe,CAACC,QAAQ,EAAE;MACvD,OAAO,iBAAQ5G,MAAM,CAAC,IAAI6G,sBAAa,EAAE,CAAC;IAC5C;IAEA,IAAInF,OAAO,CAACa,GAAG,EAAE;MACfpC,gBAAO,CAACC,SAAS,CAAC;QAChBC,KAAK,EAAEC,iBAAS,CAACwG,aAAa;QAC9BjH,OAAO,EAAPA;MACF,CAAC,CAAC;IACJ;;IAEA;IACA,OAAOnB,WAAW,CAAC+C,WAAW,CAAC5B,OAAO,EAAE6B,OAAO,CAAC,CAC7CZ,IAAI,CAAC,UAAClC,QAAQ,EAAK;MAClBiB,OAAO,CAACkH,QAAQ,CAACnI,QAAQ,CAAC;MAE1B,OAAO,iBAAQiF,OAAO,CAACjF,QAAQ,CAAC;IAClC,CAAC,CAAC,CACDmG,KAAK,CAAC,UAAC1D,GAAG,EAAK;MACd;MACA,IAAI3C,WAAW,CAAC0C,YAAY,CAACC,GAAG,CAAC,EAAE;QACjClB,gBAAO,CAACC,SAAS,CAAC;UAChBC,KAAK,EAAEC,iBAAS,CAAC0G,UAAU;UAC3BnH,OAAO,EAAPA;QACF,CAAC,CAAC;;QAEF;QACA;QACA,OAAO,iBAAQG,MAAM,CAAC,IAAIiH,qBAAiB,CAAC,uBAAuB,EAAE5F,GAAG,CAAC,CAAC;MAC5E;MACA2D,oBAAW,CAACC,MAAM,CAACC,KAAK,CACtB,8DAA8D,EAC9D7D,GAAG,CACJ;MAED,OAAO,iBAAQrB,MAAM,CAAC,IAAIkH,oBAAgB,CAACxF,OAAO,EAAE,uBAAuB,EAAEL,GAAG,CAAC,CAAC;IACpF,CAAC,CAAC;EACN,CAAC;EAED8F,eAAe,EAAE,yBAACzF,OAAO,EAAK;IAC5B,IAAO0F,SAAS,GAAmD1F,OAAO,CAAnE0F,SAAS;MAAEC,SAAS,GAAwC3F,OAAO,CAAxD2F,SAAS;MAAEC,SAAS,GAA6B5F,OAAO,CAA7C4F,SAAS;MAAEC,WAAW,GAAgB7F,OAAO,CAAlC6F,WAAW;MAAEC,UAAU,GAAI9F,OAAO,CAArB8F,UAAU;IAE/D,IAAIJ,SAAS,IAAI,CAAC1I,WAAW,CAAC+I,QAAQ,CAACF,WAAW,CAAC,CAACG,UAAU,EAAE;MAC9D,OAAO,iBAAQ1H,MAAM,CAAC,IAAIC,kBAAc,CAAC,iCAAiC,CAAC,CAAC;IAC9E;IAEA,IAAIoH,SAAS,IAAI,CAAC3I,WAAW,CAAC+I,QAAQ,CAACF,WAAW,CAAC,CAACI,UAAU,EAAE;MAC9D,OAAO,iBAAQ3H,MAAM,CAAC,IAAIC,kBAAc,CAAC,iCAAiC,CAAC,CAAC;IAC9E;IAEA,IAAIqH,SAAS,IAAI,CAAC5I,WAAW,CAAC+I,QAAQ,CAACD,UAAU,CAAC,CAACE,UAAU,EAAE;MAC7D,OAAO,iBAAQ1H,MAAM,CAAC,IAAIC,kBAAc,CAAC,iCAAiC,CAAC,CAAC;IAC9E;IAEA,OAAO,iBAAQ4D,OAAO,EAAE;EAC1B,CAAC;EAED4D,QAAQ,EAAE,kBAACG,MAAM,EAAK;IACpB,IAAID,UAAU,GAAG,IAAI;IACrB,IAAID,UAAU,GAAG,IAAI;IACrB,IAAIG,WAAW,GAAG,IAAI;IACtB,IAAIC,WAAW,GAAG,IAAI;IAEtB,IAAI,CAACF,MAAM,EAAE;MACX,OAAO;QAACD,UAAU,EAAE,IAAI;QAAED,UAAU,EAAE;MAAI,CAAC;IAC7C;IACA,IAAIE,MAAM,CAACG,cAAc,EAAE;MACzBF,WAAW,GAAGD,MAAM,CAACG,cAAc,EAAE;IACvC;IACA,IAAIH,MAAM,CAACI,cAAc,EAAE;MACzBF,WAAW,GAAGF,MAAM,CAACI,cAAc,EAAE;IACvC;IAEA,IAAIH,WAAW,IAAIA,WAAW,CAACI,MAAM,GAAG,CAAC,EAAE;MAAA,mBAC1BJ,WAAW;MAAA;MAAzBF,UAAU;IACb;IAEA,IAAIG,WAAW,IAAIA,WAAW,CAACG,MAAM,GAAG,CAAC,EAAE;MAAA,mBAC1BH,WAAW;MAAA;MAAzBJ,UAAU;IACb;IAEA,OAAO;MAACC,UAAU,EAAVA,UAAU;MAAED,UAAU,EAAVA;IAAU,CAAC;EACjC,CAAC;EAEDQ,yBAAyB,EAAE,mCAACtH,SAAS;IAAA,OACnCA,SAAS,IACTA,SAAS,CAAC+E,WAAW,IACrB/E,SAAS,CAAC+E,WAAW,CAAC1E,IAAI,IAC1BL,SAAS,CAAC+E,WAAW,CAAC1E,IAAI,IAC1BL,SAAS,CAAC+E,WAAW,CAAC1E,IAAI,CAACqB,SAAS;EAAA;EAEtC6F,sBAAsB,EAAE,gCAACvH,SAAS;IAAA,OAChCA,SAAS,IACTA,SAAS,CAAC+E,WAAW,IACrB/E,SAAS,CAAC+E,WAAW,CAAC1E,IAAI,IAC1BL,SAAS,CAAC+E,WAAW,CAAC1E,IAAI,IAC1BL,SAAS,CAAC+E,WAAW,CAAC1E,IAAI,CAACmH,MAAM;EAAA;EAEnCC,gCAAgC,EAAE,0CAACzH,SAAS;IAAA;IAAA,OAC1C,CAAAA,SAAS,aAATA,SAAS,iDAATA,SAAS,CAAE+E,WAAW,qFAAtB,uBAAwB1E,IAAI,2DAA5B,uBAA8BqH,gBAAgB,KAAI,EAAE;EAAA;EAEtDC,wBAAwB,EAAE,kCAACC,YAAY;IAAA,OAAKA,YAAY,CAAChH,QAAQ,CAACiH,wBAAa,CAACC,SAAS,CAAC;EAAA;EAE1FC,mBAAmB,EAAE,6BAACH,YAAY;IAAA,OAChCA,YAAY,CAAChH,QAAQ,CAACiH,wBAAa,CAACG,sBAAsB,CAAC;EAAA;EAE7DC,WAAW,EAAE,qBAACL,YAAY;IAAA,OACxBA,YAAY,CAAChH,QAAQ,CAACiH,wBAAa,CAACK,iBAAiB,CAAC,IACtDN,YAAY,CAAChH,QAAQ,CAACiH,wBAAa,CAACM,oBAAoB,CAAC;EAAA;EAE3DC,aAAa,EAAE,uBAACR,YAAY;IAAA,OAC1BA,YAAY,CAAChH,QAAQ,CAACiH,wBAAa,CAACQ,mBAAmB,CAAC,IACxDT,YAAY,CAAChH,QAAQ,CAACiH,wBAAa,CAACS,kBAAkB,CAAC;EAAA;EAEzDC,gBAAgB,EAAE,0BAACX,YAAY;IAAA,OAAKA,YAAY,CAAChH,QAAQ,CAACiH,wBAAa,CAACW,UAAU,CAAC;EAAA;EAEnFC,oBAAoB,EAAE,8BAACb,YAAY;IAAA,OAAKA,YAAY,CAAChH,QAAQ,CAACiH,wBAAa,CAACa,eAAe,CAAC;EAAA;EAE5FC,4BAA4B,EAAE,sCAACf,YAAY;IAAA,OACzCA,YAAY,CAAChH,QAAQ,CAACiH,wBAAa,CAACe,wBAAwB,CAAC;EAAA;EAE/DC,+BAA+B,EAAE,yCAACjB,YAAY;IAAA,OAC5CA,YAAY,CAAChH,QAAQ,CAACiH,wBAAa,CAACiB,+BAA+B,CAAC,IACpElB,YAAY,CAAChH,QAAQ,CAACiH,wBAAa,CAACkB,iBAAiB,CAAC;EAAA;EAExDC,iBAAiB,EAAE,2BAACpB,YAAY;IAAA,OAAKA,YAAY,CAAChH,QAAQ,CAACiH,wBAAa,CAACoB,mBAAmB,CAAC;EAAA;EAE7FC,yBAAyB,EAAE,mCAACtB,YAAY;IAAA,OACtCA,YAAY,CAAChH,QAAQ,CAACiH,wBAAa,CAACsB,8BAA8B,CAAC;EAAA;EAErEC,uBAAuB,EAAE,iCAACxB,YAAY;IAAA,OACpC,CAACA,YAAY,CAAChH,QAAQ,CAACiH,wBAAa,CAACwB,yBAAyB,CAAC;EAAA;EAEjEC,+BAA+B,EAAE,yCAAC1B,YAAY;IAAA,OAC5C,CAACA,YAAY,CAAChH,QAAQ,CAACiH,wBAAa,CAAC0B,+BAA+B,CAAC;EAAA;EAEvEC,iBAAiB,EAAE,2BAAC5B,YAAY;IAAA,OAAK,CAACA,YAAY,CAAChH,QAAQ,CAACiH,wBAAa,CAAC4B,oBAAoB,CAAC;EAAA;EAE/FC,WAAW,EAAE,qBAACC,OAAO,EAAEC,OAAO,EAAEvL,QAAQ,EAAK;IAC3C,IAAIsL,OAAO,IAAIA,OAAO,CAACE,OAAO,EAAE;MAC9B,OAAOD,OAAO,CAACF,WAAW,CAAC;QAACrL,QAAQ,EAARA,QAAQ;QAAEyL,IAAI,EAAE;MAAI,CAAC,CAAC;IACpD;IAEA,OAAO,iBAAQ1K,MAAM,CAAC,IAAI2K,mBAAe,CAAC,2CAA2C,CAAC,CAAC;EACzF,CAAC;EAEDC,aAAa,EAAE,uBAACL,OAAO,EAAEC,OAAO,EAAEvL,QAAQ,EAAK;IAC7C,IAAIsL,OAAO,IAAIA,OAAO,CAACM,SAAS,EAAE;MAChC,OAAOL,OAAO,CAACF,WAAW,CAAC;QAACrL,QAAQ,EAARA,QAAQ;QAAEyL,IAAI,EAAE;MAAK,CAAC,CAAC;IACrD;IAEA,OAAO,iBAAQ1K,MAAM,CAAC,IAAI2K,mBAAe,CAAC,6CAA6C,CAAC,CAAC;EAC3F,CAAC;EAEDG,kBAAkB,EAAE,4BAACnD,UAAuC,EAAK;IAC/D,IAAMoD,UAAU,GAAG,oCAAoC;IAEvD,IAAIpD,UAAU,EAAE;MACd,IAAMqD,QAAQ,GAAGrD,UAAU,CAACsD,eAAe,CAACC,WAAW,EAAE;MACzD,IAAOC,QAAQ,GAAIH,QAAQ,CAApBG,QAAQ;MAEfnG,oBAAW,CAACC,MAAM,CAACmG,GAAG,CAACL,UAAU,uBAAgBI,QAAQ,EAAG;MAC5DnG,oBAAW,CAACC,MAAM,CAACmG,GAAG,CAACL,UAAU,EAAE,YAAY,EAAE,wBAAeC,QAAQ,CAAC,CAAC;IAC5E;EACF,CAAC;EAEDK,kBAAkB,EAAE,4BAAC3D,UAAmC,EAAK;IAC3D,IAAMqD,UAAU,GAAG,oCAAoC;IAEvD,IAAIrD,UAAU,EAAE;MACd,IAAMsD,QAAQ,GAAGtD,UAAU,CAACuD,eAAe,CAACC,WAAW,EAAE;MACzD,IAAOC,QAAQ,GAAIH,QAAQ,CAApBG,QAAQ;MAEfnG,oBAAW,CAACC,MAAM,CAACmG,GAAG,CAACL,UAAU,uBAAgBI,QAAQ,EAAG;MAC5DnG,oBAAW,CAACC,MAAM,CAACmG,GAAG,CAACL,UAAU,EAAE,YAAY,EAAE,wBAAeC,QAAQ,CAAC,CAAC;IAC5E;EACF,CAAC;EAEDM,mBAAmB,EAAE,+BAAkB;IAAA,IAAjBC,OAAO,uEAAG,EAAE;IAChC,IAAMR,UAAU,GAAG,qCAAqC;IAExDQ,OAAO,CAAC9L,OAAO,CAAC,UAAC+L,MAAM,EAAK;MAC1BxG,oBAAW,CAACC,MAAM,CAACmG,GAAG,CAACL,UAAU,uBAAgBS,MAAM,CAACL,QAAQ,EAAG;MACnEnG,oBAAW,CAACC,MAAM,CAACmG,GAAG,CAACL,UAAU,EAAE,UAAU,EAAE,wBAAeS,MAAM,CAAC,CAAC;IACxE,CAAC,CAAC;EACJ,CAAC;EAEDC,gBAAgB,EAAE,0BAAC5L,OAAO,EAAK;IAC7B,IAAIA,OAAO,CAAC8E,YAAY,KAAKC,qBAAU,CAACC,QAAQ,EAAE;MAChD,OAAO,iBAAQ7E,MAAM,CAAC,IAAI8E,kCAAqB,EAAE,CAAC;IACpD;IAEA,IAAM4G,UAAU,GAAG;MACjBzM,QAAQ,EAAEY,OAAO,CAACZ;IACpB,CAAC;IAED,OAAOY,OAAO,CAAC+B,cAAc,CAC1B6J,gBAAgB,CAACC,UAAU,CAAC,CAC5B5K,IAAI,CAAC;MAAA,OAAMpC,WAAW,CAAC8E,OAAO,CAAC3D,OAAO,CAAC;IAAA,EAAC,CACxCkF,KAAK,CAAC,UAAC1D,GAAG,EAAK;MACd2D,oBAAW,CAACC,MAAM,CAACC,KAAK,4GAC8ErF,OAAO,CAACL,EAAE,sBAAY6B,GAAG,EAC9H;MAED,OAAO,iBAAQrB,MAAM,CAACqB,GAAG,CAAC;IAC5B,CAAC,CAAC;EACN,CAAC;EAEDsK,sBAAsB,EAAE,gCAACnD,YAAY;IAAA,OAAKA,YAAY,CAAChH,QAAQ,CAACiH,wBAAa,CAACmD,aAAa,CAAC;EAAA;EAE5FC,wBAAwB,EAAE,kCAACrD,YAAY;IAAA,OACrCA,YAAY,CAAChH,QAAQ,CAACiH,wBAAa,CAACqD,wBAAwB,CAAC;EAAA;EAE/DC,oBAAoB,EAAE,8BAACvD,YAAY;IAAA,OACjCA,YAAY,CAAChH,QAAQ,CAACiH,wBAAa,CAACuD,2BAA2B,CAAC;EAAA;EAElEC,mBAAmB,EAAE,6BAACzD,YAAY;IAAA,OAChCA,YAAY,CAAChH,QAAQ,CAACiH,wBAAa,CAACyD,0BAA0B,CAAC;EAAA;EAEjEC,qBAAqB,EAAE,+BAAC3D,YAAY;IAAA,OAClCA,YAAY,CAAChH,QAAQ,CAACiH,wBAAa,CAAC2D,qBAAqB,CAAC;EAAA;EAE5DC,sBAAsB,EAAE,gCAAC7D,YAAY;IAAA,OACnCA,YAAY,CAAChH,QAAQ,CAACiH,wBAAa,CAAC6D,6BAA6B,CAAC;EAAA;EAEpEC,mBAAmB,EAAE,6BAAC/D,YAAY;IAAA,OAAKA,YAAY,CAAChH,QAAQ,CAACiH,wBAAa,CAAC+D,oBAAoB,CAAC;EAAA;EAEhGC,4BAA4B,EAAE,sCAACjE,YAAY;IAAA,OACzCA,YAAY,CAAChH,QAAQ,CAACiH,wBAAa,CAACiE,6BAA6B,CAAC;EAAA;EAEpEC,wBAAwB,EAAE,kCAACnE,YAAY;IAAA,OACrCA,YAAY,CAAChH,QAAQ,CAACiH,wBAAa,CAACmE,uBAAuB,CAAC;EAAA;EAE9DC,sBAAsB,EAAE,gCAACrE,YAAY;IAAA,OAAKA,YAAY,CAAChH,QAAQ,CAACiH,wBAAa,CAACqE,kBAAkB,CAAC;EAAA;EAEjGC,gBAAgB,EAAE,0BAACC,aAAa,EAAExE,YAAY,EAAK;IACjD,IAAIA,YAAY,CAAChH,QAAQ,CAACiH,wBAAa,CAACwE,gBAAgB,CAAC,EAAE;MACzD,OAAO,IAAI;IACb;IACA,IAAIzE,YAAY,CAAChH,QAAQ,CAACiH,wBAAa,CAACyE,kBAAkB,CAAC,EAAE;MAC3D,OAAO,KAAK;IACd;IAEA,OAAOF,aAAa;EACtB,CAAC;EACDG,4BAA4B,EAAE,sCAAC3E,YAAY;IAAA,OACzCA,YAAY,CAAChH,QAAQ,CAACiH,wBAAa,CAAC2E,4BAA4B,CAAC;EAAA;EAEnEC,mBAAmB,EAAE,6BAAC7E,YAAY;IAAA,OAAKA,YAAY,CAAChH,QAAQ,CAACiH,wBAAa,CAAC6E,iBAAiB,CAAC;EAAA;EAE7F;AACF;AACA;AACA;AACA;AACA;EACEC,WAAW,EAAE,qBAAC1N,OAAO,EAAE2N,WAAW,EAAK;IAAA;IACrC,IAAM7M,QAAQ,GAAGd,OAAO,aAAPA,OAAO,6CAAPA,OAAO,CAAEe,SAAS,uDAAlB,mBAAoBD,QAAQ;IAE7C,IAAI,CAACA,QAAQ,EAAE;MACb;IACF;IAEA6M,WAAW,CAAC7M,QAAQ,GAAGA,QAAQ;EACjC,CAAC;EAED;AACF;AACA;AACA;AACA;AACA;AACA;AACA;EACE8M,oBAAoB,EAAE,8BAAC5N,OAAO,EAAEjB,QAAQ,EAAK;IAAA;IAC3C,IAAI,CAACiB,OAAO,EAAE;MACZ,OAAOjB,QAAQ;IACjB;IAEA,IAAME,KAAK,GAAGF,QAAQ,aAARA,QAAQ,0CAARA,QAAQ,CAAEG,IAAI,oDAAd,gBAAgBD,KAAK;IAEnC,IAAIA,KAAK,EAAE;MACTe,OAAO,CAACe,SAAS,CAAC8M,YAAY,CAAC5O,KAAK,CAAC;IACvC;IAEA,OAAOF,QAAQ;EACjB,CAAC;EAED+O,yBAAyB,EAAE,mCAACC,eAAe,EAAK;IAC9C,IAAMC,UAAU,GAAG,IAAIC,OAAO,CAACF,eAAe,CAAC;IAE/C,IAAMG,iBAAiB,GAAG,SAApBA,iBAAiB,CAAIC,eAAe,EAAK;MAC7C,IAAMnO,OAAO,GAAGgO,UAAU,CAACI,KAAK,EAAE;MAElC,IAAI,CAACpO,OAAO,EAAE;QACZ,OAAO,iBAAQgE,OAAO,EAAE;MAC1B;MAEA,IAAMnC,OAAO,GAAG,yBAAUsM,eAAe,CAAC;MAE1C,IAAI,CAACtM,OAAO,CAAC3C,IAAI,EAAE;QACjB2C,OAAO,CAAC3C,IAAI,GAAG,CAAC,CAAC;MACnB;MAEAL,WAAW,CAAC6O,WAAW,CAAC1N,OAAO,EAAE6B,OAAO,CAAC3C,IAAI,CAAC;MAE9C,OAAOc,OAAO,CACX2K,OAAO,CAAC9I,OAAO,CAAC,CAChBZ,IAAI,CAAC,UAAClC,QAAQ;QAAA,OAAKF,WAAW,CAAC+O,oBAAoB,CAAC5N,OAAO,EAAEjB,QAAQ,CAAC;MAAA,EAAC;IAC5E,CAAC;IAED,OAAOmP,iBAAiB;EAC1B;AACF,CAAC;AAAC,eAEarP,WAAW;AAAA"}
|
|
@@ -1731,6 +1731,13 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
1731
1731
|
* @returns {void}
|
|
1732
1732
|
*/
|
|
1733
1733
|
private checkMediaConnection;
|
|
1734
|
+
/**
|
|
1735
|
+
* Method to enable or disable the 'Music mode' effect on audio track
|
|
1736
|
+
*
|
|
1737
|
+
* @param {boolean} shouldEnableMusicMode
|
|
1738
|
+
* @returns {Promise}
|
|
1739
|
+
*/
|
|
1740
|
+
enableMusicMode(shouldEnableMusicMode: boolean): Promise<void>;
|
|
1734
1741
|
/**
|
|
1735
1742
|
* Publishes specified local tracks in the meeting
|
|
1736
1743
|
*
|
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.123",
|
|
4
4
|
"description": "",
|
|
5
5
|
"license": "Cisco EULA (https://www.cisco.com/c/en/us/products/end-user-license-agreement.html)",
|
|
6
6
|
"contributors": [
|
|
@@ -32,12 +32,12 @@
|
|
|
32
32
|
"build": "yarn run -T tsc --declaration true --declarationDir ./dist/types"
|
|
33
33
|
},
|
|
34
34
|
"devDependencies": {
|
|
35
|
-
"@webex/plugin-meetings": "3.0.0-beta.
|
|
36
|
-
"@webex/test-helper-chai": "3.0.0-beta.
|
|
37
|
-
"@webex/test-helper-mocha": "3.0.0-beta.
|
|
38
|
-
"@webex/test-helper-mock-webex": "3.0.0-beta.
|
|
39
|
-
"@webex/test-helper-retry": "3.0.0-beta.
|
|
40
|
-
"@webex/test-helper-test-users": "3.0.0-beta.
|
|
35
|
+
"@webex/plugin-meetings": "3.0.0-beta.123",
|
|
36
|
+
"@webex/test-helper-chai": "3.0.0-beta.123",
|
|
37
|
+
"@webex/test-helper-mocha": "3.0.0-beta.123",
|
|
38
|
+
"@webex/test-helper-mock-webex": "3.0.0-beta.123",
|
|
39
|
+
"@webex/test-helper-retry": "3.0.0-beta.123",
|
|
40
|
+
"@webex/test-helper-test-users": "3.0.0-beta.123",
|
|
41
41
|
"chai": "^4.3.4",
|
|
42
42
|
"chai-as-promised": "^7.1.1",
|
|
43
43
|
"jsdom-global": "3.0.2",
|
|
@@ -46,19 +46,19 @@
|
|
|
46
46
|
"typescript": "^4.7.4"
|
|
47
47
|
},
|
|
48
48
|
"dependencies": {
|
|
49
|
-
"@webex/common": "3.0.0-beta.
|
|
49
|
+
"@webex/common": "3.0.0-beta.123",
|
|
50
50
|
"@webex/internal-media-core": "1.38.1",
|
|
51
|
-
"@webex/internal-plugin-conversation": "3.0.0-beta.
|
|
52
|
-
"@webex/internal-plugin-device": "3.0.0-beta.
|
|
53
|
-
"@webex/internal-plugin-llm": "3.0.0-beta.
|
|
54
|
-
"@webex/internal-plugin-mercury": "3.0.0-beta.
|
|
55
|
-
"@webex/internal-plugin-metrics": "3.0.0-beta.
|
|
56
|
-
"@webex/internal-plugin-support": "3.0.0-beta.
|
|
57
|
-
"@webex/internal-plugin-user": "3.0.0-beta.
|
|
58
|
-
"@webex/media-helpers": "3.0.0-beta.
|
|
59
|
-
"@webex/plugin-people": "3.0.0-beta.
|
|
60
|
-
"@webex/plugin-rooms": "3.0.0-beta.
|
|
61
|
-
"@webex/webex-core": "3.0.0-beta.
|
|
51
|
+
"@webex/internal-plugin-conversation": "3.0.0-beta.123",
|
|
52
|
+
"@webex/internal-plugin-device": "3.0.0-beta.123",
|
|
53
|
+
"@webex/internal-plugin-llm": "3.0.0-beta.123",
|
|
54
|
+
"@webex/internal-plugin-mercury": "3.0.0-beta.123",
|
|
55
|
+
"@webex/internal-plugin-metrics": "3.0.0-beta.123",
|
|
56
|
+
"@webex/internal-plugin-support": "3.0.0-beta.123",
|
|
57
|
+
"@webex/internal-plugin-user": "3.0.0-beta.123",
|
|
58
|
+
"@webex/media-helpers": "3.0.0-beta.123",
|
|
59
|
+
"@webex/plugin-people": "3.0.0-beta.123",
|
|
60
|
+
"@webex/plugin-rooms": "3.0.0-beta.123",
|
|
61
|
+
"@webex/webex-core": "3.0.0-beta.123",
|
|
62
62
|
"ampersand-collection": "^2.0.2",
|
|
63
63
|
"bowser": "^2.11.0",
|
|
64
64
|
"btoa": "^1.2.1",
|
package/src/annotation/index.ts
CHANGED
|
@@ -311,15 +311,13 @@ class AnnotationChannel extends WebexPlugin implements IAnnotationChannel {
|
|
|
311
311
|
relayType: ANNOTATION_RELAY_TYPES.ANNOTATION_CLIENT,
|
|
312
312
|
request: {
|
|
313
313
|
value: {
|
|
314
|
-
sessionId: uuid.v4(),
|
|
315
314
|
type: ANNOTATION_REQUEST_TYPE.ANNOTATION_MESSAGE,
|
|
316
|
-
locusUrl: this.locusUrl,
|
|
317
315
|
content: encryptedContent,
|
|
316
|
+
deviceId: strokeData.deviceId,
|
|
317
|
+
seq: this.seqNum,
|
|
318
|
+
requesterId: strokeData.requesterId,
|
|
318
319
|
version: strokeData.version,
|
|
319
|
-
fromUserId: strokeData.fromUserId,
|
|
320
|
-
fromDeviceUrl: strokeData.fromDeviceUrl,
|
|
321
320
|
shareInstanceId: strokeData.shareInstanceId,
|
|
322
|
-
locusId: this.locusUrl && this.locusUrl.split('/').pop(),
|
|
323
321
|
encryptionKeyUrl: strokeData.encryptionKeyUrl,
|
|
324
322
|
},
|
|
325
323
|
},
|
package/src/meeting/index.ts
CHANGED
|
@@ -7565,6 +7565,32 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
7565
7565
|
throw new Error('Webrtc media connection is missing, call addMedia() first');
|
|
7566
7566
|
}
|
|
7567
7567
|
|
|
7568
|
+
/**
|
|
7569
|
+
* Method to enable or disable the 'Music mode' effect on audio track
|
|
7570
|
+
*
|
|
7571
|
+
* @param {boolean} shouldEnableMusicMode
|
|
7572
|
+
* @returns {Promise}
|
|
7573
|
+
*/
|
|
7574
|
+
async enableMusicMode(shouldEnableMusicMode: boolean) {
|
|
7575
|
+
this.checkMediaConnection();
|
|
7576
|
+
|
|
7577
|
+
if (!this.isMultistream) {
|
|
7578
|
+
throw new Error('enableMusicMode() only supported with multistream');
|
|
7579
|
+
}
|
|
7580
|
+
|
|
7581
|
+
if (shouldEnableMusicMode) {
|
|
7582
|
+
await this.mediaProperties.webrtcMediaConnection.setCodecParameters(MediaType.AudioMain, {
|
|
7583
|
+
maxaveragebitrate: '64000',
|
|
7584
|
+
maxplaybackrate: '48000',
|
|
7585
|
+
});
|
|
7586
|
+
} else {
|
|
7587
|
+
await this.mediaProperties.webrtcMediaConnection.deleteCodecParameters(MediaType.AudioMain, [
|
|
7588
|
+
'maxaveragebitrate',
|
|
7589
|
+
'maxplaybackrate',
|
|
7590
|
+
]);
|
|
7591
|
+
}
|
|
7592
|
+
}
|
|
7593
|
+
|
|
7568
7594
|
/**
|
|
7569
7595
|
* Publishes specified local tracks in the meeting
|
|
7570
7596
|
*
|
package/src/meeting/util.ts
CHANGED
|
@@ -109,6 +109,7 @@ const MeetingUtil = {
|
|
|
109
109
|
breakoutsSupported: options.breakoutsSupported,
|
|
110
110
|
locale: options.locale,
|
|
111
111
|
deviceCapabilities: options.deviceCapabilities,
|
|
112
|
+
liveAnnotationSupported: options.liveAnnotationSupported,
|
|
112
113
|
})
|
|
113
114
|
.then((res) => {
|
|
114
115
|
Metrics.postEvent({
|
|
@@ -240,14 +240,13 @@ describe('live-annotation', () => {
|
|
|
240
240
|
}], "type": "curve", "name": "contentUpdate"
|
|
241
241
|
}], "action": "contentUpdate", "sender": {"name": "perfect", "id": "4dd5eaf9-4cf8-4f0f-a1d6-014bf5d00741"}
|
|
242
242
|
},
|
|
243
|
-
|
|
244
|
-
|
|
243
|
+
deviceId: "525ead98-6c93-4fcb-899d-517305c47513",
|
|
244
|
+
requesterId: '525ead98-6c93-4fcb-899d-517305c47513',
|
|
245
245
|
toUserId: "987ead98-6c93-4fcb-899d-517305c47503",
|
|
246
|
-
|
|
247
|
-
shareInstanceId: "7fa6fe07-dcb1-41ad-973d-7bcf65fab55d",
|
|
246
|
+
shareInstanceId: '7fa6fe07-dcb1-41ad-973d-7bcf65fab55d',
|
|
248
247
|
encryptionKeyUrl: "encryptionKeyUrl",
|
|
249
248
|
version: '1',
|
|
250
|
-
};
|
|
249
|
+
} ;
|
|
251
250
|
|
|
252
251
|
annotationService.publishEncrypted(strokeData.content, strokeData);
|
|
253
252
|
|
|
@@ -261,15 +260,13 @@ describe('live-annotation', () => {
|
|
|
261
260
|
relayType: ANNOTATION_RELAY_TYPES.ANNOTATION_CLIENT,
|
|
262
261
|
request: {
|
|
263
262
|
value: {
|
|
264
|
-
sessionId: sinon.match.string,
|
|
265
263
|
type: ANNOTATION_REQUEST_TYPE.ANNOTATION_MESSAGE,
|
|
266
|
-
locusUrl: locusUrl,
|
|
267
264
|
content: strokeData.content,
|
|
268
265
|
version: '1',
|
|
269
|
-
|
|
270
|
-
|
|
266
|
+
seq:sinon.match.number,
|
|
267
|
+
deviceId: sinon.match.string,
|
|
268
|
+
requesterId: sinon.match.string,
|
|
271
269
|
shareInstanceId: strokeData.shareInstanceId,
|
|
272
|
-
locusId: '163c1787-c1f5-47cc-95eb-ab2d660999e6',
|
|
273
270
|
encryptionKeyUrl: 'encryptionKeyUrl',
|
|
274
271
|
}
|
|
275
272
|
}
|
|
@@ -4126,6 +4126,43 @@ describe('plugin-meetings', () => {
|
|
|
4126
4126
|
});
|
|
4127
4127
|
});
|
|
4128
4128
|
|
|
4129
|
+
describe('#enableMusicMode', () => {
|
|
4130
|
+
beforeEach(() => {
|
|
4131
|
+
meeting.isMultistream = true;
|
|
4132
|
+
meeting.mediaProperties.webrtcMediaConnection = {
|
|
4133
|
+
setCodecParameters: sinon.stub().resolves({}),
|
|
4134
|
+
deleteCodecParameters: sinon.stub().resolves({}),
|
|
4135
|
+
};
|
|
4136
|
+
});
|
|
4137
|
+
[
|
|
4138
|
+
{shouldEnableMusicMode: true},
|
|
4139
|
+
{shouldEnableMusicMode: false},
|
|
4140
|
+
].forEach(({shouldEnableMusicMode}) => {
|
|
4141
|
+
it(`fails if there is no media connection for shouldEnableMusicMode: ${shouldEnableMusicMode}`, async () => {
|
|
4142
|
+
meeting.mediaProperties.webrtcMediaConnection = undefined;
|
|
4143
|
+
await assert.isRejected(meeting.enableMusicMode(shouldEnableMusicMode));
|
|
4144
|
+
});
|
|
4145
|
+
});
|
|
4146
|
+
|
|
4147
|
+
it('should set the codec parameters when shouldEnableMusicMode is true', async () => {
|
|
4148
|
+
await meeting.enableMusicMode(true);
|
|
4149
|
+
assert.calledOnceWithExactly(meeting.mediaProperties.webrtcMediaConnection.setCodecParameters, MediaType.AudioMain, {
|
|
4150
|
+
maxaveragebitrate: '64000',
|
|
4151
|
+
maxplaybackrate: '48000',
|
|
4152
|
+
});
|
|
4153
|
+
assert.notCalled(meeting.mediaProperties.webrtcMediaConnection.deleteCodecParameters);
|
|
4154
|
+
});
|
|
4155
|
+
|
|
4156
|
+
it('should set the codec parameters when shouldEnableMusicMode is false', async () => {
|
|
4157
|
+
await meeting.enableMusicMode(false);
|
|
4158
|
+
assert.calledOnceWithExactly(meeting.mediaProperties.webrtcMediaConnection.deleteCodecParameters, MediaType.AudioMain, [
|
|
4159
|
+
'maxaveragebitrate',
|
|
4160
|
+
'maxplaybackrate',
|
|
4161
|
+
]);
|
|
4162
|
+
assert.notCalled(meeting.mediaProperties.webrtcMediaConnection.setCodecParameters);
|
|
4163
|
+
});
|
|
4164
|
+
});
|
|
4165
|
+
|
|
4129
4166
|
describe('Public Event Triggers', () => {
|
|
4130
4167
|
let sandbox;
|
|
4131
4168
|
const {ENDED} = CONSTANTS;
|
|
@@ -158,7 +158,7 @@ describe('plugin-meetings', () => {
|
|
|
158
158
|
|
|
159
159
|
assert.deepEqual(body, {});
|
|
160
160
|
});
|
|
161
|
-
|
|
161
|
+
|
|
162
162
|
it('should work with an undefined locusInfo', () => {
|
|
163
163
|
const body = {};
|
|
164
164
|
|
|
@@ -337,6 +337,24 @@ describe('plugin-meetings', () => {
|
|
|
337
337
|
assert.equal(parameter.breakoutsSupported, true);
|
|
338
338
|
});
|
|
339
339
|
|
|
340
|
+
it('#Should call meetingRequest.joinMeeting with liveAnnotationSupported=true when passed in as true', async () => {
|
|
341
|
+
const meeting = {
|
|
342
|
+
meetingRequest: {
|
|
343
|
+
joinMeeting: sinon.stub().returns(Promise.resolve({body: {}, headers: {}})),
|
|
344
|
+
},
|
|
345
|
+
};
|
|
346
|
+
|
|
347
|
+
MeetingUtil.parseLocusJoin = sinon.stub();
|
|
348
|
+
await MeetingUtil.joinMeeting(meeting, {
|
|
349
|
+
liveAnnotationSupported: true,
|
|
350
|
+
});
|
|
351
|
+
|
|
352
|
+
assert.calledOnce(meeting.meetingRequest.joinMeeting);
|
|
353
|
+
const parameter = meeting.meetingRequest.joinMeeting.getCall(0).args[0];
|
|
354
|
+
|
|
355
|
+
assert.equal(parameter.liveAnnotationSupported, true);
|
|
356
|
+
});
|
|
357
|
+
|
|
340
358
|
it('#Should call meetingRequest.joinMeeting with locale=en_UK, deviceCapabilities=["TEST"] when they are passed in as those values', async () => {
|
|
341
359
|
const meeting = {
|
|
342
360
|
meetingRequest: {
|