@webex/plugin-meetings 3.0.0-beta.76 → 3.0.0-beta.78
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/breakouts/breakout.js +1 -1
- package/dist/breakouts/index.js +1 -1
- package/dist/locus-info/selfUtils.js +1 -1
- package/dist/locus-info/selfUtils.js.map +1 -1
- package/dist/meeting/index.js +20 -10
- package/dist/meeting/index.js.map +1 -1
- package/dist/multistream/mediaRequestManager.js +51 -9
- package/dist/multistream/mediaRequestManager.js.map +1 -1
- package/dist/types/multistream/mediaRequestManager.d.ts +28 -1
- package/package.json +19 -19
- package/src/locus-info/selfUtils.ts +1 -0
- package/src/meeting/index.ts +46 -22
- package/src/multistream/mediaRequestManager.ts +53 -8
- package/test/unit/spec/meeting/utils.js +1 -1
- package/test/unit/spec/multistream/mediaRequestManager.ts +326 -107
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["BrowserDetection","isBrowser","logRequest","request","logText","LoggerProxy","logger","info","then","arg","catch","error","MEDIA_UPDATE_TYPE","ALL","AUDIO","VIDEO","SHARE","LAMBDA","Meeting","attrs","options","MEETINGS","e","data","relayType","REACTION_RELAY_TYPES","REACTION","config","receiveReactions","isReactionsSupported","members","membersCollection","get","sender","participantId","name","processedReaction","reaction","id","Trigger","trigger","file","function","EVENT_TRIGGERS","MEETING_RECEIVE_REACTIONS","mediaDirection","audioVideo","VIDEO_RESOLUTIONS","mediaProperties","localQualityLevel","sharePreferences","sendAudio","sendVideo","sendShare","warn","includes","setLocalQualityLevel","video","ParameterError","deviceId","preferredVideoDevice","lastVideoDeviceId","getVideoDeviceId","setVideoDeviceId","Media","getSupportedDevice","reject","MediaError","devicePermissions","getUserMedia","isSharing","shareStatus","SHARE_STATUS","LOCAL_SHARE_ACTIVE","metricName","BEHAVIORAL_METRICS","GET_USER_MEDIA_FAILURE","correlation_id","correlationId","locus_id","locusUrl","split","pop","reason","message","stack","metadata","type","Metrics","sendBehavioralMetric","getDevices","code","cause","Errors","SdpOfferCreationError","PEERCONNECTION_FAILURE","postEvent","event","eventType","LOCAL_SDP_GENERATED","meetingId","canProceed","errors","generateErrorPayload","MetricsError","MEDIA_ENGINE","undefined","SdpOfferHandlingError","SdpAnswerHandlingError","REMOTE_SDP_RECEIVED","SdpError","INVALID_ICE_CANDIDATE","webrtcMediaConnection","on","Event","ROAP_STARTED","isRoapInProgress","ROAP_DONE","mediaNegotiatedEvent","processNextQueuedMediaUpdate","ROAP_FAILURE","handleRoapFailure","ROAP_MESSAGE_TO_SEND","LOG_HEADER","roapMessage","messageType","roap","sendRoapOK","seq","mediaId","sendRoapMediaRequest","sdp","tieBreaker","meeting","reconnect","reconnectionManager","isReconnectInProgress","sendRoapAnswer","ROAP_ANSWER_FAILURE","errorType","ErrorType","CONFLICT","DOUBLECONFLICT","ROAP_GLARE_CONDITION","sequence","sendRoapError","REMOTE_TRACK_ADDED","log","mediaTrack","track","RemoteTrackType","EVENT_TYPES","REMOTE_AUDIO","setRemoteAudioTrack","REMOTE_VIDEO","setRemoteVideoTrack","SCREENSHARE_VIDEO","REMOTE_SHARE","setRemoteShare","MEDIA_READY","stream","MediaUtil","createMediaStream","CONNECTION_STATE_CHANGED","connectionFailed","resetReconnectionTimer","networkDisconnect","ICE_END","uploadLogs","CONNECTION_FAILURE","locusId","state","ConnectionState","Connecting","ICE_START","Connected","CONNECTION_SUCCESS","setNetworkStatus","NETWORK_STATUS","CONNECTED","iceReconnected","statsAnalyzer","startAnalyzer","Disconnected","DISCONNECTED","waitForIceReconnect","Failed","ACTIVE_SPEAKERS_CHANGED","msg","ACTIVE_SPEAKER_CHANGED","seqNum","memberIds","csis","map","csi","findMemberByCsi","filter","item","VIDEO_SOURCES_COUNT_CHANGED","numTotalSources","numLiveSources","mediaContent","REMOTE_VIDEO_SOURCE_COUNT_CHANGED","AUDIO_SOURCES_COUNT_CHANGED","REMOTE_AUDIO_SOURCE_COUNT_CHANGED","StatsAnalyzerEvents","MEDIA_QUALITY","intervalMetadata","peerReflexiveIP","webex","meetings","geoHintInfo","clientAddress","MQA_STATS","DEFAULT_IP","intervalData","networkType","LOCAL_MEDIA_STARTED","MEETING_MEDIA_LOCAL_STARTED","SENDING_MEDIA_START","mediaType","LOCAL_MEDIA_STOPPED","SENDING_MEDIA_STOP","REMOTE_MEDIA_STARTED","MEETING_MEDIA_REMOTE_STARTED","RECEIVING_MEDIA_START","REMOTE_MEDIA_STOPPED","RECEIVING_MEDIA_STOP","experimental","enableMediaNegotiatedEvent","MEDIA_NEGOTIATED","canUpdateMedia","queuedMediaUpdates","length","shift","pendingPromiseResolve","pendingPromiseReject","mediaUpdateType","updateMedia","updateAudio","updateVideo","updateShare","lambda","wirelessShare","leave","MEETING_REMOVED_REASON","USER_ENDED_SHARE_STREAMS","isMultistream","releaseScreenShareFloor","setLocalShareTrack","stopShare","skipSignalingCheck","MEETING_STOPPED_SHARING_LOCAL","LOCAL_SHARE","audio","NO_SHARE","transcription","closeSocket","triggerStopReceivingTranscriptionEvent","keepAliveTimerId","joinedWith","keepAliveUrl","keepAliveSecs","keepAliveInterval","setInterval","meetingRequest","keepAlive","stopKeepAlive","clearInterval","uuid","v4","userId","orgId","resource","deviceUrl","meetingInfo","breakouts","Breakouts","parent","receiveSlotManager","ReceiveSlotManager","Error","createReceiveSlot","mediaRequestManagers","MediaRequestManager","degradationPreferences","mediaRequests","requestMedia","MediaType","AudioMain","VideoMain","screenShareAudio","AudioSlides","screenShareVideo","VideoSlides","Members","locus","url","Roap","ReconnectionManager","meetingFiniteStateMachine","MeetingStateMachine","create","conversationUrl","sipUri","destination","destinationType","partner","owner","hostId","policy","MeetingRequest","mediaConnections","fetchMeetingInfoTimeoutId","updateMediaConnections","slice","MediaProperties","inMeetingActions","InMeetingActions","callEvents","floorGrantPending","dialInDeviceStatus","PSTN_STATUS","UNKNOWN","dialInUrl","dialOutDeviceStatus","dialOutUrl","networkQualityMonitor","networkStatus","locusInfo","LocusInfo","updateMeetingObject","bind","recording","deferJoin","hasWebsocketConnected","internal","mercury","connected","lastVideoLayoutInfo","layoutType","main","content","passwordStatus","PASSWORD_STATUS","requiredCaptcha","meetingInfoFailureReason","meetingInfoFailureCode","recordingController","RecordingController","serviceUrl","links","services","record","sessionId","fullState","displayHints","controlsOptionsManager","ControlsOptionsManager","setUpLocusInfoListeners","init","hasJoinedOnce","remoteMediaManager","password","captchaCode","clearTimeout","REQUIRED","captchaInfo","captchaId","meetingInfoProvider","fetchMeetingInfo","installedOrgID","parseMeetingInfo","body","MEETING_INFO_FAILURE_REASON","NONE","VERIFIED","NOT_REQUIRED","MEETING_INFO_AVAILABLE","resolve","MeetingInfoV2PolicyError","POLICY","wbxAppApiCode","PermissionError","MeetingInfoV2PasswordError","meetingNumber","WRONG_PASSWORD","refreshCaptcha","PasswordError","MeetingInfoV2CaptchaError","WRONG_CAPTCHA","isPasswordRequired","CaptchaError","OTHER","VERIFY_PASSWORD_SUCCESS","isPasswordValid","failureReason","URL","refreshURL","hostname","captchaRefreshUrl","response","captchaID","verificationImageURL","verificationAudioURL","setUpLocusInfoSelfListener","setUpLocusInfoMeetingListener","setUpLocusServicesListener","setUpLocusFullStateListener","setUpLocusUrlListener","setUpLocusHostListener","setUpLocusSelfListener","setUpLocusParticipantsListener","setupLocusControlsListener","setUpLocusMediaSharesListener","setUpLocusEmbeddedAppsListener","setUpLocusInfoMeetingInfoListener","setUpLocusInfoAssignHostListener","setUpLocusInfoMediaInactiveListener","setUpBreakoutsListener","BREAKOUTS","EVENTS","BREAKOUTS_CLOSING","MEETING_BREAKOUTS_CLOSING","MESSAGE","messageEvent","MEETING_BREAKOUTS_MESSAGE","MEMBERS_UPDATE","MEETING_BREAKOUTS_UPDATE","DISCONNECT_DUE_TO_INACTIVITY","res","REQUEST_UPLOAD_LOGS","reconnection","autoRejoin","MEETING_SELF_LEFT","LOCUS_INFO_CAN_ASSIGN_HOST","payload","changed","set","canAssignHost","MEETING_ACTIONS_UPDATE","LOCUSINFO","FULL_STATE_MEETING_STATE_CHANGE","MEETING_STATE_CHANGE","FULL_STATE_TYPE_UPDATE","locusFullStateTypeUpdate","trackingId","identifiers","locusStartTime","lastActive","mediaAgentAlias","mediaAgentGroupId","mediaAgentCluster","joinRespRxStartAudio","getSetupDelayDuration","audioSetupDelay","joinRespRxStart","joinRespRxStartVideo","videoSetupDelay","joinRespTxStartAudio","getSendingMediaDelayDuration","joinRespTxStart","joinRespTxStartVideo","localSDPGenRemoteSDPRecv","getLocalSDPGenRemoteSDPRecvDelay","joinTimes","callInitiateJoinReq","getCallInitiateJoinReq","joinReqResp","getJoinReqResp","getTotalJmt","CA_TYPE","initMediaPayload","initPayload","getAnalyzerMetricsPrePayload","metrics","submitCallDiagnosticEvents","MEETINGS_NETWORK_DISCONNECTED","MEETINGS_NETWORK_CONNECTED","LOCUS_INFO_UPDATE_SELF","locusSelfUpdate","pstnUpdate","newSelf","MEETING_STATE","STATES","JOINED","requestScreenShareFloor","self","dialInPstnDevice","pstnDevices","find","device","dialOutPstnDevice","newStatus","dialingStatus","MEETING_SELF_PHONE_AUDIO_UPDATE","dialIn","status","attendeeId","dialOut","LOCUS_INFO_UPDATE_HOST","locusHostUpdate","LOCUS_INFO_UPDATE_PARTICIPANTS","locusParticipantsUpdate","CONTROLS_RECORDING_UPDATED","modifiedBy","lastModified","RECORDING_STATE","RECORDING","MEETING_STARTED_RECORDING","IDLE","MEETING_STOPPED_RECORDING","PAUSED","MEETING_PAUSED_RECORDING","RESUMED","MEETING_RESUMED_RECORDING","CONTROLS_MEETING_CONTAINER_UPDATED","meetingContainerUrl","MEETING_MEETING_CONTAINER_UPDATE","CONTROLS_MEETING_TRANSCRIBE_UPDATED","caption","transcribing","receiveTranscription","MEETING_STOPPED_RECEIVING_TRANSCRIPTION","CONTROLS_MEETING_BREAKOUT_UPDATED","breakout","updateBreakout","CONTROLS_ENTRY_EXIT_TONE_UPDATED","entryExitTone","MEETING_ENTRY_EXIT_TONE_UPDATE","LOCUS_INFO_UPDATE_MEDIA_SHARES","current","contentShare","whiteboardShare","whiteboard","previousContentShare","previous","previousWhiteboardShare","beneficiaryId","disposition","resourceUrl","newShareStatus","selfId","FLOOR_ACTION","GRANTED","REMOTE_SHARE_ACTIVE","localShareTrack","shareTrack","originalTrack","readyState","unpublishTracks","WHITEBOARD_SHARE_ACTIVE","RELEASED","oldShareStatus","MEETING_STOPPED_SHARING_REMOTE","SHARE_STOPPED_REASON","SELF_STOPPED","MEETING_STOPPED_SHARING_WHITEBOARD","sendStartedSharingRemote","MEETING_STARTED_SHARING_REMOTE","memberId","receiveShare","MEETING_STARTED_SHARING_LOCAL","LOCAL_SHARE_FLOOR_GRANTED","MEETING_STARTED_SHARING_WHITEBOARD","WHITEBOARD_SHARE_FLOOR_GRANTED","locusMediaSharesUpdate","LOCUS_INFO_UPDATE_URL","locusUrlUpdate","setLocusUrl","LINKS_SERVICES","setServiceUrl","setSessionId","breakoutServiceUrlUpdate","MEETING_LOCKED","MEETING_UNLOCKED","MEETING_INFO_UPDATED","canInviteNewParticipants","MeetingUtil","userDisplayHints","canAdmitParticipant","canLock","canUserLock","canUnlock","canUserUnlock","canSetDisallowUnmute","ControlsOptionsUtil","canUnsetDisallowUnmute","canSetMuteOnEntry","canUnsetMuteOnEntry","canSetMuted","canUnsetMuted","canStartRecording","RecordingUtil","canUserStart","canStopRecording","canUserStop","canPauseRecording","canUserPause","canResumeRecording","canUserResume","canRaiseHand","canUserRaiseHand","canLowerAllHands","canUserLowerAllHands","canLowerSomeoneElsesHand","canUserLowerSomeoneElsesHand","bothLeaveAndEndMeetingAvailable","canEnableClosedCaption","canStartTranscribing","canStopTranscribing","isClosedCaptionActive","isSaveTranscriptsEnabled","isWebexAssistantActive","canViewCaptionPanel","isRealTimeTranslationEnabled","canSelectSpokenLanguages","waitingForOthersToJoin","canEnableReactions","canSendReactions","canManageBreakout","canAdmitLobbyToBreakout","isBreakoutPreassignmentsEnabled","canUserAskForHelp","canUserRenameSelfAndObserved","canUserRenameOthers","setDisplayHints","handleDataChannelUrlChange","datachannelUrl","enableAutomaticLLM","updateLLMConnection","EMBEDDED_APPS_UPDATED","embeddedApps","MEETING_EMBEDDED_APPS_UPDATE","LOCAL_UNMUTE_REQUIRED","handleServerLocalUnmuteRequired","MEETING_SELF_UNMUTED_BY_OTHERS","SELF_REMOTE_VIDEO_MUTE_STATUS_UPDATED","muted","isRemotelyMuted","unmuteAllowed","isUnmuteAllowed","handleServerRemoteMuteUpdate","MEETING_SELF_VIDEO_MUTED_BY_OTHERS","MEETING_SELF_VIDEO_UNMUTED_BY_OTHERS","SELF_REMOTE_MUTE_STATUS_UPDATED","isMuted","MEETING_SELF_MUTED_BY_OTHERS","LOCAL_UNMUTE_REQUESTED","MEETING_SELF_REQUESTED_TO_UNMUTE","SELF_UNADMITTED_GUEST","startKeepAlive","MEETING_SELF_LOBBY_WAITING","LOBBY_ENTERED","SELF_ADMITTED_GUEST","MEETING_SELF_GUEST_ADMITTED","LOBBY_EXITED","MEDIA_INACTIVITY","MEETING_MEDIA_INACTIVE","MEDIA_STATUS_CHANGE","updateMediaStatus","actual","expected","receiveAudio","receiveVideo","SELF_CANNOT_VIEW_PARTICIPANT_LIST_CHANGE","MEETING_SELF_CANNOT_VIEW_PARTICIPANT_LIST","SELF_MEETING_BREAKOUTS_CHANGED","updateBreakoutSessions","SELF_MODERATOR_OR_COHOST_UPGRADE","queryPreAssignments","SELF_IS_SHARING_BLOCKED_CHANGE","MEETING_SELF_IS_SHARING_BLOCKED","REMOTE_RESPONSE","remote","remoteDeclined","DESTROY_MEETING","shouldLeave","cleanUp","object","forEach","key","invitee","alertIfActive","addMember","cancelPhoneInvite","sessionLocusUrls","locusUrls","mainLocusUrl","authorizingLocusUrl","admitMembers","removeMember","mute","muteMember","moderator","transferHostToMember","isSelf","webexMeetingInfo","locusMeetingObject","setSipUri","enableUnifiedMeetings","sipUrl","sipMeetingUri","webExMeetingId","meetingJoinUrl","permissionToken","setLocus","participants","getLocusPartner","_CALL_","person","mtgLocus","host","initialSetup","unsetRemoteMedia","unsetRemoteTracks","closeRemoteTracks","remoteAudioTrack","remoteVideoTrack","remoteShare","triggerMediaStoppedEvent","MEDIA_STOPPED","stopTrack","stopTracks","isTrackStopped","ENDED","isWrongReadyState","all","LOCAL","audioTrack","underlyingTrack","videoTrack","rawAudioTrack","emitEvent","settings","getSettings","localMicrophoneTrack","LocalMicrophoneTrack","setMediaSettings","echoCancellation","noiseSuppression","mediaSettings","setLocalAudioTrack","applyClientStateLocally","sendLocalMediaReadyEvent","rawVideoTrack","aspectRatio","frameRate","height","width","localCameraTrack","LocalCameraTrack","Number","setLocalVideoTrack","localStream","getTrack","rawLocalShareTrack","localDisplayTrack","LocalDisplayTrack","displaySurface","cursor","screen","LocalTrackEvents","Ended","handleShareTrackEnded","off","stop","unsetLocalVideoTrack","unsetLocalShareTrack","ONLINE","MERCURY_CONNECTION_RESTORED","OFFLINE","MERCURY_CONNECTION_LOST","MERCURY_CONNECTION_FAILURE","mediaRequestManager","reset","close","unsetPeerConnection","detection","isUserInJoinedState","UserNotJoinedError","NoMediaEstablishedYetError","handleClientRequest","handleAudioLogging","MUTED","USER_INTERACTION","MetricsMediaType","MUTE_AUDIO_FAILURE","UNMUTED","UNMUTE_AUDIO_FAILURE","handleVideoLogging","MUTE_VIDEO_FAILURE","UNMUTE_VIDEO_FAILURE","joinOptions","audioVideoOptions","join","joinResponse","getMediaStreams","localShare","addMedia","mediaResponse","media","local","JOIN_WITH_MEDIA_FAILURE","isMediaEstablished","currentMediaStatus","validate","ReconnectInProgress","MEETING_RECONNECTION_STARTING","MEETING_RECONNECTION_SUCCESS","MEETING_RECONNECTION_FAILURE","ReconnectionError","MEETING_RECONNECT_FAILURE","finally","controls","transcribe","reactions","enabled","onCloseSocket","onErrorSocket","RECEIVE_TRANSCRIPTION_FAILURE","method","HTTP_VERBS","POST","uri","webSocketUrl","Transcription","subscribe","MEETING_STARTED_RECEIVING_TRANSCRIPTION","monitorTranscriptionSocketConnection","connect","credentials","supertoken","access_token","registered","errorMessage","joinFailed","joinSuccess","setCorrelationId","rejoin","CALL_INITIATED","isRoapCallEnabled","MEETING_STATE_MACHINE","RINGING","ring","_JOIN_","resourceId","meetingQuality","QUALITY_LEVELS","setRemoteQualityLevel","enableMultistream","joinMeetingOptions","JOIN_SUCCESS","llm","processRelayEvent","isTranscriptionSupported","fail","LOCUS_JOIN_RESPONSE","parseLocusError","JOIN_FAILURE","isJoined","isConnected","getLocusUrl","disconnectLLM","registerAndConnect","phoneNumber","dialInPstn","dialOutPstn","pstnStatus","SUCCESS","isPhoneProvisioned","clientUrl","onFullLocus","ADD_DIAL_IN_FAILURE","dial_in_url","client_url","ADD_DIAL_OUT_FAILURE","dial_out_url","disconnectPhoneAudio","MEDIA_CAPABILITIES","mediaCapabilities","rx","share","share_audio","tx","MOVE_MEDIA","once","SELF_OBSERVING","setMediaDirection","closeLocalStream","closeLocalShare","unsetMediaTracks","reconnectMedia","MOVE_TO_SUCCESS","MOVE_TO_FAILURE","moveToResource","oldCorrelationId","leaveMeeting","moveMeeting","MOVE_FROM_SUCCESS","MOVE_FROM_FAILURE","substring","turnServerInfo","mc","createMediaConnection","getMediaConnectionDebugId","remoteQualityLevel","enableRtx","enableExtmap","setMediaPeerConnection","setupMediaConnectionListeners","eventEmitter","eventTypeToForward","meetingEventType","turnDiscoverySkippedReason","turnServerUsed","meetingState","FULL_STATE","ACTIVE","MeetingNotActiveError","isUserInLeftState","isUserUnadmitted","UserInLobbyError","remoteMediaManagerConfig","validateOptions","doTurnDiscovery","turnDiscoveryObject","preMedia","RemoteMediaManager","forwardEvent","RemoteMediaManagerEvent","AudioCreated","REMOTE_MEDIA_AUDIO_CREATED","ScreenShareAudioCreated","REMOTE_MEDIA_SCREEN_SHARE_AUDIO_CREATED","VideoLayoutChanged","REMOTE_MEDIA_VIDEO_LAYOUT_CHANGED","start","initiateOffer","setMercuryListener","devices","handleDeviceLogging","handleMediaLogging","stats","enableStatsAnalyzer","NetworkQualityMonitor","StatsAnalyzer","ssrc","findReceiveSlotBySsrc","setupStatsAnalyzerEventHandlers","NETWORK_QUALITY","sendNetworkQualityEvent","timerCount","joiningTimer","waitForMediaConnectionConnected","getCurrentConnectionType","connectionType","ADD_MEDIA_SUCCESS","stopStatsAnalyzer","stopAnalyzer","closePeerConnections","unsetPeerConnections","ADD_MEDIA_FAILURE","MEETING_CONNECTION_FAILED","canUpdateMediaNow","queueItem","push","enqueueMediaUpdate","audioEnabled","enableMultistreamAudio","previousSendShareStatus","updateSendReceiveOptions","send","receive","UPDATE_MEDIA_FAILURE","checkForStopShare","startShare","createMuteState","previousShareStatus","setLocalTracks","_INCOMING_","acknowledgeMeeting","ALERT_DISPLAYED","declineMeeting","decline","LEAVE","leaveReason","CLIENT_LEAVE_REQUEST","clearMeetingData","guest","MEETING_LEAVE_FAILURE","channelUrl","resourceToken","mediaShares","element","WHITEBOARD_SHARE_INITIATED","personUrl","changeMeetingFloor","MEETING_START_WHITEBOARD_SHARE_FAILURE","board","WHITEBOARD_SHARE_STOPPED","STOP_WHITEBOARD_SHARE_FAILURE","CONTENT","SHARE_INITIATED","MEETING_SHARE_FAILURE","SHARE_STOPPED","floor","beneficiary","STOP_FLOOR_REQUEST_FAILURE","startRecording","setMuteOnEntry","setDisallowUnmute","mutedEnabled","disallowUnmuteEnabled","muteOnEntryEnabled","setMuteAll","stopRecording","pauseRecording","resumeRecording","lockMeeting","unlockMeeting","tones","enableDTMF","sendDTMF","rejectWithErrorLog","renderInfo","layoutInfo","LAYOUT_TYPES","mainWidth","Math","round","mainHeight","abs","contentWidth","contentHeight","CONTROLS_MEETING_LAYOUT_UPDATED","envelope","MEETING_CONTROLS_LAYOUT_UPDATE","layout","changeVideoLayoutDebounced","level","previousLevel","setLocalVideoQuality","SET_MEETING_QUALITY_FAILURE","shareConstraints","getDisplayMedia","shareStream","GET_DISPLAY_MEDIA_FAILURE","networkQualityScore","typeMedia","performance","now","end","startLocalSDPGenRemoteSDPRecvDelay","endLocalSDPGenRemoteSDPRecvDelay","calculatedDelay","METRICS_JOIN_TIMES_MAX_DURATION","startCallInitiateJoinReq","endCallInitiateJoinReq","startJoinReqResp","endJoinReqResp","MEETING_END_ALL_INITIATED","endMeetingForAll","MEETING_END_ALL_FAILURE","reactionType","skinToneType","reactionChannelUrl","reactionData","Reactions","skinToneData","SkinTones","normal","tone","sendReaction","enable","isEnabled","toggleReactions","requestingParticipantId","tracks","checkMediaConnection","screenShare","publishTrack","microphone","camera","unpublishPromises","localTrackToUnpublish","unpublishTrack","StatelessWebexPlugin"],"sources":["index.ts"],"sourcesContent":["import uuid from 'uuid';\nimport {cloneDeep, isEqual, pick, isString, defer} from 'lodash';\n// @ts-ignore - Fix this\nimport {StatelessWebexPlugin} from '@webex/webex-core';\nimport {\n ConnectionState,\n Errors,\n ErrorType,\n Event,\n LocalCameraTrack,\n LocalDisplayTrack,\n LocalMicrophoneTrack,\n LocalTrackEvents,\n MediaType,\n RemoteTrackType,\n} from '@webex/internal-media-core';\n\nimport {\n MeetingNotActiveError,\n UserInLobbyError,\n NoMediaEstablishedYetError,\n UserNotJoinedError,\n} from '../common/errors/webex-errors';\nimport {StatsAnalyzer, EVENTS as StatsAnalyzerEvents} from '../statsAnalyzer';\nimport NetworkQualityMonitor from '../networkQualityMonitor';\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport Trigger from '../common/events/trigger-proxy';\nimport Roap from '../roap/index';\nimport Media from '../media';\nimport MediaProperties from '../media/properties';\nimport MeetingStateMachine from './state';\nimport {createMuteState} from './muteState';\nimport LocusInfo from '../locus-info';\nimport Metrics from '../metrics';\nimport {\n trigger,\n mediaType as MetricsMediaType,\n error as MetricsError,\n eventType,\n} from '../metrics/config';\nimport ReconnectionManager from '../reconnection-manager';\nimport MeetingRequest from './request';\nimport Members from '../members/index';\nimport MeetingUtil from './util';\nimport RecordingUtil from '../recording-controller/util';\nimport ControlsOptionsUtil from '../controls-options-manager/util';\nimport MediaUtil from '../media/util';\nimport Transcription from '../transcription';\nimport {Reactions, SkinTones} from '../reactions/reactions';\nimport PasswordError from '../common/errors/password-error';\nimport CaptchaError from '../common/errors/captcha-error';\nimport ReconnectionError from '../common/errors/reconnection';\nimport ReconnectInProgress from '../common/errors/reconnection-in-progress';\nimport {\n _CALL_,\n _INCOMING_,\n _JOIN_,\n AUDIO,\n CONTENT,\n ENDED,\n EVENT_TRIGGERS,\n EVENT_TYPES,\n EVENTS,\n BREAKOUTS,\n FLOOR_ACTION,\n FULL_STATE,\n LAYOUT_TYPES,\n LOCUSINFO,\n MEETING_INFO_FAILURE_REASON,\n MEETING_REMOVED_REASON,\n MEETING_STATE_MACHINE,\n MEETING_STATE,\n MEETINGS,\n METRICS_JOIN_TIMES_MAX_DURATION,\n MQA_STATS,\n NETWORK_STATUS,\n ONLINE,\n OFFLINE,\n PASSWORD_STATUS,\n PSTN_STATUS,\n QUALITY_LEVELS,\n RECORDING_STATE,\n SHARE_STATUS,\n SHARE_STOPPED_REASON,\n VIDEO_RESOLUTIONS,\n VIDEO,\n HTTP_VERBS,\n} from '../constants';\nimport BEHAVIORAL_METRICS from '../metrics/constants';\nimport ParameterError from '../common/errors/parameter';\nimport MediaError from '../common/errors/media';\nimport {\n MeetingInfoV2PasswordError,\n MeetingInfoV2CaptchaError,\n MeetingInfoV2PolicyError,\n} from '../meeting-info/meeting-info-v2';\nimport BrowserDetection from '../common/browser-detection';\nimport {CSI, ReceiveSlotManager} from '../multistream/receiveSlotManager';\nimport {MediaRequestManager} from '../multistream/mediaRequestManager';\nimport {\n RemoteMediaManager,\n Event as RemoteMediaManagerEvent,\n} from '../multistream/remoteMediaManager';\nimport {\n Reaction,\n ReactionServerType,\n SkinToneType,\n ProcessedReaction,\n RelayEvent,\n} from '../reactions/reactions.type';\nimport Breakouts from '../breakouts';\n\nimport InMeetingActions from './in-meeting-actions';\nimport {REACTION_RELAY_TYPES} from '../reactions/constants';\nimport RecordingController from '../recording-controller';\nimport ControlsOptionsManager from '../controls-options-manager';\nimport PermissionError from '../common/errors/permission';\n\nconst {isBrowser} = BrowserDetection();\n\nconst logRequest = (request: any, {logText = ''}) => {\n LoggerProxy.logger.info(`${logText} - sending request`);\n\n return request\n .then((arg) => {\n LoggerProxy.logger.info(`${logText} - has been successfully sent`);\n\n return arg;\n })\n .catch((error) => {\n LoggerProxy.logger.error(`${logText} - has failed: `, error);\n throw error;\n });\n};\n\nexport const MEDIA_UPDATE_TYPE = {\n ALL: 'ALL',\n AUDIO: 'AUDIO',\n VIDEO: 'VIDEO',\n SHARE: 'SHARE',\n LAMBDA: 'LAMBDA',\n};\n\n/**\n * MediaDirection\n * @typedef {Object} MediaDirection\n * @property {boolean} sendAudio\n * @property {boolean} receiveAudio\n * @property {boolean} sendVideo\n * @property {boolean} receiveVideo\n * @property {boolean} sendShare\n * @property {boolean} receiveShare\n * @property {boolean} isSharing\n */\n\n/**\n * AudioVideo\n * @typedef {Object} AudioVideo\n * @property {Object} audio\n * @property {String} audio.deviceId\n * @property {Object} video\n * @property {String} video.deviceId\n * @property {String} video.localVideoQuality // [240p, 360p, 480p, 720p, 1080p]\n */\n\n/**\n * SharePreferences\n * @typedef {Object} SharePreferences\n * @property {Object} [shareConstraints]\n * @property {Boolean} [highFrameRate]\n */\n\n/**\n * JoinOptions\n * @typedef {Object} JoinOptions\n * @property {String} [resourceId]\n * @property {String} [pin]\n * @property {Boolean} [moderator]\n * @property {String|Object} [meetingQuality]\n * @property {String} [meetingQuality.local]\n * @property {String} [meetingQuality.remote]\n * @property {Boolean} [rejoin]\n * @property {Boolean} [enableMultistream]\n */\n\n/**\n * SendOptions\n * @typedef {Object} SendOptions\n * @property {Boolean} sendAudio\n * @property {Boolean} sendVideo\n * @property {Boolean} sendShare\n */\n\n/**\n * Recording\n * @typedef {Object} Recording\n * @property {Object} state\n * @property {String} modifiedBy\n */\n\n/**\n * Meeting State Change Event\n * Emitted when ever there is a meeting state change\n * @event meeting:stateChange\n * @instance\n * @type {Object}\n * @property {String} currentState current state of the meeting\n * @property {String} previousState previous state of the meeting\n * @memberof Meeting\n */\n\n/**\n * Media Ready Event\n * Emitted when a stream is ready to be rendered\n * @event media:ready\n * @instance\n * @type {Object}\n * @property {MediaStream} stream the media stream\n * @property {String} type what type of stream, remote, local\n * @memberof Meeting\n */\n\n/**\n * Media Stopped Event\n * Emitted when a stream has stopped sending\n * @event media:stopped\n * @instance\n * @type {Object}\n * @property {String} type what type of stream, remote, local\n * @memberof Meeting\n */\n\n/**\n * Meeting Ringing Event\n * Emitted when this client should play a ringing sound, because this member is getting an incoming meeting\n * or sending out an incoming meeting\n * @event meeting:ringing\n * @instance\n * @type {Object}\n * @property {String} type // INCOMING or JOIN\n * @property {String} id\n * @memberof Meeting\n */\n\n/**\n * Meeting Ringing Stop Event\n * Emitted when this client should stop playing a ringing sound\n * @event meeting:ringingStop\n * @instance\n * @type {Object}\n * @property {Object} type\n * @property {Boolean} type.remoteAnswered\n * @property {Boolean} type.remoteDeclined\n * @property {String} id\n * @memberof Meeting\n */\n\n/**\n * Meeting Started Sharing Local Event\n * Emitted when this member starts sharing\n * @event meeting:startedSharingLocal\n * @instance\n * @type {Object}\n * @memberof Meeting\n */\n\n/**\n * Meeting Stopped Sharing Local Event\n * Emitted when this member stops sharing\n * @event meeting:stoppedSharingLocal\n * @instance\n * @type {Object}\n * @memberof Meeting\n */\n\n/**\n * Meeting Started Sharing Remote Event\n * Emitted when remote sharing starts\n * @event meeting:startedSharingRemote\n * @instance\n * @type {Object}\n * @property {Boolean} memberId id of the meeting member that started screen share\n * @memberof Meeting\n */\n\n/**\n * Meeting Stopped Sharing Remote Event\n * Emitted when remote screen sharing ends\n * @event meeting:stoppedSharingRemote\n * @instance\n * @type {Object}\n * @memberof Meeting\n */\n\n/**\n * Meeting Locked Event\n * Emitted when a meeting is locked\n * @event meeting:locked\n * @instance\n * @type {Object}\n * @property {Object} info\n * @memberof Meeting\n */\n\n/**\n * Meeting Unlocked Event\n * Emitted when a meeting is unlocked\n * @event meeting:unlocked\n * @instance\n * @type {Object}\n * @property {Object} info\n * @memberof Meeting\n */\n\n/**\n * Meeting Actions Update Event\n * Emitted when a user can take actions on a meeting such as lock, unlock, assign host\n * @event meeting:actionsUpdate\n * @instance\n * @type {Object}\n * @property {Boolean} canLock\n * @property {Boolean} canUnlock\n * @property {Boolean} canAssignHost\n * @memberof Meeting\n */\n\n/**\n * Meeting Unmuted By Others Event\n * Emitted when a member is unmuted by another member\n * @event meeting:self:unmutedByOthers\n * @instance\n * @type {Object}\n * @property {Object} payload\n * @memberof Meeting\n */\n\n/**\n * Meeting Muted By Others Event\n * Emitted when a member is muted by another member\n * @event meeting:self:mutedByOthers\n * @instance\n * @type {Object}\n * @property {Object} payload\n * @property {Boolean} payload.unmuteAllowed - whether the user is allowed to unmute self\n * @memberof Meeting\n */\n\n/**\n * Meeting Muted By Others Event\n * Emitted when the host(moderator)/co-host requests a user to unmute\n * @event meeting:self:requestedToUnmute\n * @instance\n * @type {Object}\n * @property {Object} payload\n * @memberof Meeting\n */\n\n/**\n * Meeting Self Guest Admitted Event\n * Emitted when a joined user get admitted to the meeting by another member or host\n * @event meeting:self:guestAdmitted\n * @instance\n * @type {Object}\n * @property {Object} payload\n * @memberof Meeting\n */\n\n/**\n * Meeting Self Lobby Waiting Event\n * Emitted when joined user enters the lobby and is waiting for the webex meeting to begin\n * @event meeting:self:lobbyWaiting\n * @instance\n * @type {Object}\n * @property {Object} reason Reason why user left the meeting\n * @memberof Meeting\n */\n\n/**\n * Meeting Self Left State\n * Emitted when user is inactive for more then 40 seconds, User can rejoin the meeting again\n * @event meeting:self:left\n * @instance\n * @type {Object}\n * @property {Object} payload\n * @memberof Meeting\n */\n\n/**\n * Reconnection Starting Event\n * Emitted when reconnection of media to the active meeting was successful\n * @event meeting:reconnectionStarting\n * @instance\n * @memberof Meeting\n */\n\n/**\n * Reconnection Success Event\n * Emitted when reconnection of media to the active meeting was successful\n * @event meeting:reconnectionSuccess\n * @instance\n * @type {Object}\n * @property {Object} reconnect\n * @memberof Meeting\n */\n\n/**\n * Reconnection Failure Event\n * Emitted when reconnection of media to the active meeting was successful\n * @event meeting:reconnectionFailure\n * @instance\n * @type {Object}\n * @property {Error} error\n * @memberof Meeting\n */\n\n/**\n * Meeting network quality event\n * Emitted on each interval of retrieving stats Analyzer data\n * @event network:quality\n * @type {Object}\n * @property {string} mediaType {video|audio}\n * @property {number} networkQualityScore - {1|0} 1 indicates acceptable uplink 0 indicates unacceptable uplink based on threshold\n * @memberof Meeting\n */\n\n/**\n * @description Meeting is the crux of the plugin\n * @export\n * @class Meeting\n */\nexport default class Meeting extends StatelessWebexPlugin {\n attrs: any;\n audio: any;\n breakouts: any;\n conversationUrl: string;\n correlationId: string;\n destination: string;\n destinationType: string;\n deviceUrl: string;\n hostId: string;\n id: string;\n isMultistream: boolean;\n locusUrl: string;\n mediaConnections: any[];\n mediaId?: string;\n meetingFiniteStateMachine: any;\n meetingInfo: object;\n meetingRequest: MeetingRequest;\n members: Members;\n options: object;\n orgId: string;\n owner: string;\n partner: any;\n policy: string;\n reconnectionManager: ReconnectionManager;\n resource: string;\n roap: Roap;\n roapSeq: number;\n sipUri: string;\n type: string;\n userId: string;\n video: any;\n callEvents: any[];\n deferJoin: Promise<any>;\n dialInDeviceStatus: string;\n dialInUrl: string;\n dialOutDeviceStatus: string;\n dialOutUrl: string;\n fetchMeetingInfoTimeoutId: NodeJS.Timeout;\n floorGrantPending: boolean;\n hasJoinedOnce: boolean;\n hasWebsocketConnected: boolean;\n inMeetingActions: InMeetingActions;\n isLocalShareLive: boolean;\n isRoapInProgress: boolean;\n isSharing: boolean;\n keepAliveTimerId: NodeJS.Timeout;\n lastVideoLayoutInfo: any;\n locusInfo: any;\n mediaProperties: MediaProperties;\n mediaRequestManagers: {\n audio: MediaRequestManager;\n video: MediaRequestManager;\n screenShareAudio: MediaRequestManager;\n screenShareVideo: MediaRequestManager;\n };\n\n meetingInfoFailureReason: string;\n meetingInfoFailureCode?: number;\n networkQualityMonitor: NetworkQualityMonitor;\n networkStatus: string;\n passwordStatus: string;\n queuedMediaUpdates: any[];\n recording: any;\n remoteMediaManager: RemoteMediaManager | null;\n recordingController: RecordingController;\n controlsOptionsManager: ControlsOptionsManager;\n requiredCaptcha: any;\n receiveSlotManager: ReceiveSlotManager;\n shareStatus: string;\n statsAnalyzer: StatsAnalyzer;\n transcription: Transcription;\n updateMediaConnections: (mediaConnections: any[]) => void;\n endCallInitiateJoinReq: any;\n endJoinReqResp: any;\n endLocalSDPGenRemoteSDPRecvDelay: any;\n joinedWith: any;\n locusId: any;\n startCallInitiateJoinReq: any;\n startJoinReqResp: any;\n startLocalSDPGenRemoteSDPRecvDelay: any;\n wirelessShare: any;\n guest: any;\n meetingJoinUrl: any;\n meetingNumber: any;\n meetingState: any;\n permissionToken: any;\n resourceId: any;\n resourceUrl: string;\n selfId: string;\n state: any;\n webexMeetingId: string;\n\n namespace = MEETINGS;\n\n /**\n * @param {Object} attrs\n * @param {Object} options\n * @constructor\n * @memberof Meeting\n */\n constructor(attrs: any, options: object) {\n super({}, options);\n /**\n * @instance\n * @type {Object}\n * @readonly\n * @private\n * @memberof Meeting\n */\n this.attrs = attrs;\n /**\n * @instance\n * @type {Object}\n * @readonly\n * @private\n * @memberof Meeting\n */\n this.options = options;\n /**\n * @instance\n * @type {String}\n * @readonly\n * @public\n * @memberof Meeting\n */\n this.id = uuid.v4();\n /**\n * Correlation ID used for network tracking of meeting\n * @instance\n * @type {String}\n * @readonly\n * @public\n * @memberof Meeting\n */\n this.correlationId = this.id;\n /**\n * @instance\n * @type {String}\n * @readonly\n * @public\n * @memberof Meeting\n */\n this.userId = attrs.userId;\n /**\n * Organization ID\n * @instance\n * @type {String}\n * @readonly\n * @public\n * @memberof Meeting\n */\n this.orgId = attrs.orgId;\n /**\n * @instance\n * @type {String}\n * @readonly\n * @public\n * @memberof Meeting\n */\n this.resource = attrs.resource;\n /**\n * @instance\n * @type {String}\n * @readonly\n * @public\n * @memberof Meeting\n */\n this.deviceUrl = attrs.deviceUrl;\n /**\n * @instance\n * @type {Object}\n * @readonly\n * @public\n * @memberof Meeting\n */\n // TODO: needs to be defined as a class\n this.meetingInfo = {};\n /**\n * @instance\n * @type {Breakouts}\n * @public\n * @memberof Meeting\n */\n // @ts-ignore\n this.breakouts = new Breakouts({meetingId: this.id}, {parent: this.webex});\n /**\n * helper class for managing receive slots (for multistream media connections)\n */\n this.receiveSlotManager = new ReceiveSlotManager(\n (mediaType: MediaType) => {\n if (!this.mediaProperties?.webrtcMediaConnection) {\n return Promise.reject(new Error('Webrtc media connection is missing'));\n }\n\n return this.mediaProperties.webrtcMediaConnection.createReceiveSlot(mediaType);\n },\n (csi: CSI) => (this.members.findMemberByCsi(csi) as any)?.id\n );\n /**\n * Object containing helper classes for managing media requests for audio/video/screenshare (for multistream media connections)\n * All multistream media requests sent out for this meeting have to go through them.\n */\n this.mediaRequestManagers = {\n // @ts-ignore - config coming from registerPlugin\n audio: new MediaRequestManager(this.config.degradationPreferences, (mediaRequests) => {\n if (!this.mediaProperties.webrtcMediaConnection) {\n LoggerProxy.logger.warn(\n 'Meeting:index#mediaRequestManager --> trying to send audio media request before media connection was created'\n );\n\n return;\n }\n this.mediaProperties.webrtcMediaConnection.requestMedia(MediaType.AudioMain, mediaRequests);\n }),\n // @ts-ignore - config coming from registerPlugin\n video: new MediaRequestManager(this.config.degradationPreferences, (mediaRequests) => {\n if (!this.mediaProperties.webrtcMediaConnection) {\n LoggerProxy.logger.warn(\n 'Meeting:index#mediaRequestManager --> trying to send video media request before media connection was created'\n );\n\n return;\n }\n this.mediaProperties.webrtcMediaConnection.requestMedia(MediaType.VideoMain, mediaRequests);\n }),\n screenShareAudio: new MediaRequestManager(\n // @ts-ignore - config coming from registerPlugin\n this.config.degradationPreferences,\n (mediaRequests) => {\n if (!this.mediaProperties.webrtcMediaConnection) {\n LoggerProxy.logger.warn(\n 'Meeting:index#mediaRequestManager --> trying to send screenshare audio media request before media connection was created'\n );\n\n return;\n }\n this.mediaProperties.webrtcMediaConnection.requestMedia(\n MediaType.AudioSlides,\n mediaRequests\n );\n }\n ),\n screenShareVideo: new MediaRequestManager(\n // @ts-ignore - config coming from registerPlugin\n this.config.degradationPreferences,\n (mediaRequests) => {\n if (!this.mediaProperties.webrtcMediaConnection) {\n LoggerProxy.logger.warn(\n 'Meeting:index#mediaRequestManager --> trying to send screenshare video media request before media connection was created'\n );\n\n return;\n }\n this.mediaProperties.webrtcMediaConnection.requestMedia(\n MediaType.VideoSlides,\n mediaRequests\n );\n }\n ),\n };\n /**\n * @instance\n * @type {Members}\n * @public\n * @memberof Meeting\n */\n this.members = new Members(\n {\n locusUrl: attrs.locus && attrs.locus.url,\n receiveSlotManager: this.receiveSlotManager,\n mediaRequestManagers: this.mediaRequestManagers,\n },\n // @ts-ignore - Fix type\n {parent: this.webex}\n );\n /**\n * @instance\n * @type {Roap}\n * @readonly\n * @private\n * @memberof Meeting\n */\n // @ts-ignore - Fix type\n this.roap = new Roap({}, {parent: this.webex});\n /**\n * indicates if an SDP exchange is happening\n *\n * @instance\n * @type {Boolean}\n * @readonly\n * @private\n * @memberof Meeting\n */\n this.isRoapInProgress = false;\n /**\n * created later\n * @instance\n * @type {ReconnectionManager}\n * @readonly\n * @private\n * @memberof Meeting\n */\n this.reconnectionManager = new ReconnectionManager(this);\n /**\n * created later\n * @instance\n * @type {MuteState}\n * @private\n * @memberof Meeting\n */\n this.audio = null;\n /**\n * created later\n * @instance\n * @type {MuteState}\n * @private\n * @memberof Meeting\n */\n this.video = null;\n /**\n * @instance\n * @type {MeetingStateMachine}\n * @readonly\n * @public\n * @memberof Meeting\n */\n this.meetingFiniteStateMachine = MeetingStateMachine.create(this);\n /**\n * @instance\n * @type {String}\n * @readonly\n * @public\n * @memberof Meeting\n */\n this.conversationUrl = null;\n /**\n * @instance\n * @type {String}\n * @readonly\n * @public\n * @memberof Meeting\n */\n this.locusUrl = (attrs.locus && attrs.locus.url) || null;\n /**\n * @instance\n * @type {String}\n * @readonly\n * @public\n * @memberof Meeting\n */\n this.sipUri = null;\n /**\n * @instance\n * @type {String}\n * @readonly\n * @public\n * @memberof Meeting\n */\n this.destination = attrs.destination;\n /**\n * @instance\n * @type {String}\n * @readonly\n * @public\n * @memberof Meeting\n */\n this.destinationType = attrs.destinationType;\n /**\n * @instance\n * @type {String}\n * @readonly\n * @public\n * @memberof Meeting\n */\n this.partner = null;\n /**\n * @instance\n * @type {String}\n * @readonly\n * @public\n * @memberof Meeting\n */\n this.type = null;\n /**\n * @instance\n * @type {String}\n * @readonly\n * @public\n * @memberof Meeting\n */\n this.owner = null;\n /**\n * @instance\n * @type {String}\n * @readonly\n * @public\n * @memberof Meeting\n */\n this.hostId = null;\n /**\n * @instance\n * @type {String}\n * @readonly\n * @public\n * @memberof Meeting\n */\n this.policy = null;\n /**\n * @instance\n * @type {MeetingRequest}\n * @private\n * @memberof Meeting\n */\n this.meetingRequest = new MeetingRequest({}, options);\n /**\n * @instance\n * @type {Array}\n * @readonly\n * @public\n * @memberof Meeting\n */\n this.mediaConnections = null;\n\n /**\n * If true, then media is sent over multiple separate streams.\n * If false, then media is transcoded by the server into a single stream.\n */\n this.isMultistream = false;\n /**\n * Fetching meeting info can be done randomly 2-5 mins before meeting start\n * In case it is done before the timer expires, this timeout id is reset to cancel the timer.\n * @instance\n * @type {Number}\n * @readonly\n * @private\n * @memberof Meeting\n */\n this.fetchMeetingInfoTimeoutId = null;\n\n /**\n * Update the MediaConnections property with new information\n * @param {array} mediaConnections\n * @returns {undefined}\n * @private\n * @memberof Meeting\n */\n this.updateMediaConnections = (mediaConnections: any[]) => {\n if (!isEqual(this.mediaConnections, mediaConnections)) {\n // grab last/latest item in the new mediaConnections information\n this.mediaConnections = mediaConnections.slice(-1);\n }\n };\n /**\n * Passing only info as we send basic info for meeting added event\n * @instance\n * @type {MediaProperties}\n * @public\n * @memberof Meeting\n */\n this.mediaProperties = new MediaProperties();\n /**\n * @instance\n * @type {InMeetingActions}\n * @public\n * @memberof Meeting\n */\n this.inMeetingActions = new InMeetingActions();\n /**\n * This is deprecated, please use shareStatus instead.\n * @instance\n * @type {Boolean}\n * @readonly\n * @public\n * @memberof Meeting\n * @deprecated after v1.118.13\n */\n this.isSharing = false;\n /**\n * @instance\n * @type {string}\n * @readonly\n * @public\n * @memberof Meeting\n */\n this.shareStatus = SHARE_STATUS.NO_SHARE;\n\n /**\n * @instance\n * @type {Array}\n * @readonly\n * @public\n * @memberof Meeting\n */\n this.callEvents = [];\n /**\n * There is a pending floor requested by the user\n * @instance\n * @type {boolean}\n * @private\n * @memberof Meeting\n */\n this.floorGrantPending = false;\n /**\n * The latest status of the dial in device (can be \"JOINED\", \"CONNECTED\", \"LEFT\",\n * \"TRANSFERRING\", \"SUCCESS\" or \"\")\n * @instance\n * @type {String}\n * @private\n * @memberof Meeting\n */\n this.dialInDeviceStatus = PSTN_STATUS.UNKNOWN;\n /**\n * the url for provisioned device used to dial in\n * @instance\n * @type {String}\n * @private\n * @memberof Meeting\n */\n this.dialInUrl = '';\n /**\n * The latest status of the dial out device (can be \"JOINED\", \"CONNECTED\", \"LEFT\",\n * \"TRANSFERRING\", \"SUCCESS\" or \"\")\n * @instance\n * @type {String}\n * @private\n * @memberof Meeting\n */\n this.dialOutDeviceStatus = PSTN_STATUS.UNKNOWN;\n /**\n * the url for provisioned device used to dial out\n * @instance\n * @type {String}\n * @private\n * @memberof Meeting\n */\n this.dialOutUrl = '';\n /**\n * @instance\n * @type {StatsAnalyzer}\n * @private\n * @memberof Meeting\n */\n this.statsAnalyzer = null;\n /**\n * @instance\n * @type {NetworkQualityMonitor}\n * @private\n * @memberof Meeting\n */\n this.networkQualityMonitor = null;\n /**\n * @instance\n * @type {String}\n * @readonly\n * @public\n * @memberof Meeting\n */\n this.networkStatus = null;\n /**\n * Passing only info as we send basic info for meeting added event\n * @instance\n * @type {MeetingRequest}\n * @private\n * @memberof Meeting\n */\n // @ts-ignore - Fix type\n this.locusInfo = new LocusInfo(this.updateMeetingObject.bind(this), this.webex, this.id);\n\n // We had to add listeners first before setting up the locus instance\n /**\n * @instance\n * @type {Recording}\n * @readonly\n * @public\n * @memberof Meeting\n */\n this.recording = null;\n\n /**\n * Promise that exists if joining, and resolves upon method completion.\n * @instance\n * @type {Promise}\n * @private\n * @memberof Meeting\n */\n this.deferJoin = undefined;\n\n /**\n * Staus of websocket connection/mercury connection.\n * @instance\n * @type {Boolean}\n * @private\n * @memberof Meeting\n */\n // @ts-ignore - Fix type\n this.hasWebsocketConnected = this.webex.internal.mercury.connected;\n\n /**\n * Last sent render information\n * @instance\n * @type {Object}\n * @private\n * @memberof Meeting\n */\n this.lastVideoLayoutInfo = {layoutType: undefined, main: undefined, content: undefined};\n\n /**\n * Queue of pending media updates requested by the app\n * @instance\n * @type {Array}\n * @private\n * @memberof Meeting\n */\n this.queuedMediaUpdates = [];\n\n /**\n * Meeting transcription object\n * @instance\n * @type {Transcription}\n * @private\n * @memberof Meeting\n */\n this.transcription = undefined;\n\n /**\n * Password status. If it's PASSWORD_STATUS.REQUIRED then verifyPassword() needs to be called\n * with the correct password before calling join()\n * @instance\n * @type {PASSWORD_STATUS}\n * @public\n * @memberof Meeting\n */\n this.passwordStatus = PASSWORD_STATUS.UNKNOWN;\n\n /**\n * Information about required captcha. If null, then no captcha is required. status. If it's PASSWORD_STATUS.REQUIRED then verifyPassword() needs to be called\n * with the correct password before calling join()\n * @instance\n * @type {Object}\n * @property {string} captchaId captcha id\n * @property {string} verificationImageURL Url of the captcha image\n * @property {string} verificationAudioURL Url of the captcha audio file\n * @property {string} refreshURL Url used for refreshing the captcha (don't use it directly, call refreshCaptcha() instead)\n * @public\n * @memberof Meeting\n */\n this.requiredCaptcha = null;\n\n /**\n * Indicates the reason for last failure to obtain meeting.meetingInfo. MEETING_INFO_FAILURE_REASON.NONE if meeting info was\n * retrieved successfully\n * @instance\n * @type {MEETING_INFO_FAILURE_REASON}\n * @private\n * @memberof Meeting\n */\n this.meetingInfoFailureReason = undefined;\n\n /**\n * The numeric code, if any, associated with the last failure to obtain the meeting info\n * @instance\n * @type {number}\n * @private\n * @memberof Meeting\n */\n this.meetingInfoFailureCode = undefined;\n\n /**\n * Repeating timer used to send keepAlives when in lobby\n * @instance\n * @type {String}\n * @private\n * @memberof Meeting\n */\n this.keepAliveTimerId = null;\n\n /**\n * The class that helps to control recording functions: start, stop, pause, resume, etc\n * @instance\n * @type {RecordingController}\n * @public\n * @memberof Meeting\n */\n this.recordingController = new RecordingController(this.meetingRequest, {\n serviceUrl: this.locusInfo?.links?.services?.record?.url,\n sessionId: this.locusInfo?.fullState?.sessionId,\n locusUrl: this.locusInfo?.url,\n displayHints: [],\n });\n\n /**\n * The class that helps to control recording functions: start, stop, pause, resume, etc\n * @instance\n * @type {ControlsOptionsManager}\n * @public\n * @memberof Meeting\n */\n this.controlsOptionsManager = new ControlsOptionsManager(this.meetingRequest, {\n locusUrl: this.locusInfo?.url,\n displayHints: [],\n });\n\n this.setUpLocusInfoListeners();\n this.locusInfo.init(attrs.locus ? attrs.locus : {});\n this.hasJoinedOnce = false;\n\n /**\n * helper class for managing remote streams\n */\n this.remoteMediaManager = null;\n }\n\n /**\n * Fetches meeting information.\n * @param {Object} options\n * @param {String} [options.password] optional\n * @param {String} [options.captchaCode] optional\n * @public\n * @memberof Meeting\n * @returns {Promise}\n */\n public async fetchMeetingInfo({\n password = null,\n captchaCode = null,\n }: {\n password?: string;\n captchaCode?: string;\n }) {\n // when fetch meeting info is called directly by the client, we want to clear out the random timer for sdk to do it\n if (this.fetchMeetingInfoTimeoutId) {\n clearTimeout(this.fetchMeetingInfoTimeoutId);\n this.fetchMeetingInfoTimeoutId = undefined;\n }\n if (captchaCode && !this.requiredCaptcha) {\n return Promise.reject(\n new Error('fetchMeetingInfo() called with captchaCode when captcha was not required')\n );\n }\n if (\n password &&\n this.passwordStatus !== PASSWORD_STATUS.REQUIRED &&\n this.passwordStatus !== PASSWORD_STATUS.UNKNOWN\n ) {\n return Promise.reject(\n new Error('fetchMeetingInfo() called with password when password was not required')\n );\n }\n\n try {\n const captchaInfo = captchaCode\n ? {code: captchaCode, id: this.requiredCaptcha.captchaId}\n : null;\n\n const info = await this.attrs.meetingInfoProvider.fetchMeetingInfo(\n this.destination,\n this.destinationType,\n password,\n captchaInfo,\n // @ts-ignore - config coming from registerPlugin\n this.config.installedOrgID\n );\n\n this.parseMeetingInfo(info, this.destination);\n this.meetingInfo = info ? info.body : null;\n this.meetingInfoFailureReason = MEETING_INFO_FAILURE_REASON.NONE;\n this.requiredCaptcha = null;\n if (\n this.passwordStatus === PASSWORD_STATUS.REQUIRED ||\n this.passwordStatus === PASSWORD_STATUS.VERIFIED\n ) {\n this.passwordStatus = PASSWORD_STATUS.VERIFIED;\n } else {\n this.passwordStatus = PASSWORD_STATUS.NOT_REQUIRED;\n }\n\n Trigger.trigger(\n this,\n {\n file: 'meetings',\n function: 'fetchMeetingInfo',\n },\n EVENT_TRIGGERS.MEETING_INFO_AVAILABLE\n );\n\n return Promise.resolve();\n } catch (err) {\n if (err instanceof MeetingInfoV2PolicyError) {\n this.meetingInfoFailureReason = MEETING_INFO_FAILURE_REASON.POLICY;\n this.meetingInfoFailureCode = err.wbxAppApiCode;\n\n if (err.meetingInfo) {\n this.meetingInfo = err.meetingInfo;\n }\n\n throw new PermissionError();\n } else if (err instanceof MeetingInfoV2PasswordError) {\n LoggerProxy.logger.info(\n // @ts-ignore\n `Meeting:index#fetchMeetingInfo --> Info Unable to fetch meeting info for ${this.destination} - password required (code=${err?.body?.code}).`\n );\n\n // when wbxappapi requires password it still populates partial meeting info in the response\n if (err.meetingInfo) {\n this.meetingInfo = err.meetingInfo;\n this.meetingNumber = err.meetingInfo.meetingNumber;\n }\n\n this.meetingInfoFailureCode = err.wbxAppApiCode;\n\n this.passwordStatus = PASSWORD_STATUS.REQUIRED;\n this.meetingInfoFailureReason = MEETING_INFO_FAILURE_REASON.WRONG_PASSWORD;\n if (this.requiredCaptcha) {\n // this is a workaround for captcha service bug, see WEBEX-224862\n await this.refreshCaptcha();\n }\n\n throw new PasswordError();\n } else if (err instanceof MeetingInfoV2CaptchaError) {\n LoggerProxy.logger.info(\n // @ts-ignore\n `Meeting:index#fetchMeetingInfo --> Info Unable to fetch meeting info for ${this.destination} - captcha required (code=${err?.body?.code}).`\n );\n\n this.meetingInfoFailureReason = this.requiredCaptcha\n ? MEETING_INFO_FAILURE_REASON.WRONG_CAPTCHA\n : MEETING_INFO_FAILURE_REASON.WRONG_PASSWORD;\n\n this.meetingInfoFailureCode = err.wbxAppApiCode;\n\n if (err.isPasswordRequired) {\n this.passwordStatus = PASSWORD_STATUS.REQUIRED;\n }\n\n this.requiredCaptcha = err.captchaInfo;\n throw new CaptchaError();\n } else {\n this.meetingInfoFailureReason = MEETING_INFO_FAILURE_REASON.OTHER;\n throw err;\n }\n }\n }\n\n /**\n * Checks if the supplied password/host key is correct. It returns a promise with information whether the\n * password and captcha code were correct or not.\n * @param {String} password - this can be either a password or a host key, can be undefined if only captcha was required\n * @param {String} captchaCode - can be undefined if captcha was not required by the server\n * @public\n * @memberof Meeting\n * @returns {Promise<{isPasswordValid: boolean, requiredCaptcha: boolean, failureReason: MEETING_INFO_FAILURE_REASON}>}\n */\n public verifyPassword(password: string, captchaCode: string) {\n return this.fetchMeetingInfo({\n password,\n captchaCode,\n })\n .then(() => {\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.VERIFY_PASSWORD_SUCCESS);\n\n return {\n isPasswordValid: true,\n requiredCaptcha: null,\n failureReason: MEETING_INFO_FAILURE_REASON.NONE,\n };\n })\n .catch((error) => {\n if (error instanceof PasswordError || error instanceof CaptchaError) {\n return {\n isPasswordValid: this.passwordStatus === PASSWORD_STATUS.VERIFIED,\n requiredCaptcha: this.requiredCaptcha,\n failureReason: this.meetingInfoFailureReason,\n };\n }\n throw error;\n });\n }\n\n /**\n * Refreshes the captcha. As a result the meeting will have new captcha id, image and audio.\n * If the refresh operation fails, meeting remains with the old captcha properties.\n * @public\n * @memberof Meeting\n * @returns {Promise}\n */\n public refreshCaptcha() {\n if (!this.requiredCaptcha) {\n return Promise.reject(new Error('There is no captcha to refresh'));\n }\n\n // in order to get fully populated uris for captcha audio and image in response to refresh captcha request\n // we have to pass the wbxappapi hostname as the siteFullName parameter\n const {hostname} = new URL(this.requiredCaptcha.refreshURL);\n\n return (\n this.meetingRequest\n // @ts-ignore\n .refreshCaptcha({\n captchaRefreshUrl: `${this.requiredCaptcha.refreshURL}&siteFullName=${hostname}`,\n captchaId: this.requiredCaptcha.captchaId,\n })\n .then((response) => {\n this.requiredCaptcha.captchaId = response.body.captchaID;\n this.requiredCaptcha.verificationImageURL = response.body.verificationImageURL;\n this.requiredCaptcha.verificationAudioURL = response.body.verificationAudioURL;\n })\n .catch((error) => {\n LoggerProxy.logger.error(\n `Meeting:index#refreshCaptcha --> Error Unable to refresh captcha for ${this.destination} - ${error}`\n );\n throw error;\n })\n );\n }\n\n /**\n * Proxy function for all the listener set ups\n * @returns {undefined}\n * @private\n * @memberof Meeting\n */\n private setUpLocusInfoListeners() {\n // meeting update listeners\n this.setUpLocusInfoSelfListener();\n this.setUpLocusInfoMeetingListener();\n this.setUpLocusServicesListener();\n // members update listeners\n this.setUpLocusFullStateListener();\n this.setUpLocusUrlListener();\n this.setUpLocusHostListener();\n this.setUpLocusSelfListener();\n this.setUpLocusParticipantsListener();\n this.setupLocusControlsListener();\n this.setUpLocusMediaSharesListener();\n this.setUpLocusEmbeddedAppsListener();\n this.setUpLocusInfoMeetingInfoListener();\n this.setUpLocusInfoAssignHostListener();\n this.setUpLocusInfoMediaInactiveListener();\n this.setUpBreakoutsListener();\n }\n\n /**\n * Set up the listeners for breakouts\n * @returns {undefined}\n * @private\n * @memberof Meeting\n */\n setUpBreakoutsListener() {\n this.breakouts.on(BREAKOUTS.EVENTS.BREAKOUTS_CLOSING, () => {\n Trigger.trigger(\n this,\n {\n file: 'meeting/index',\n function: 'setUpBreakoutsListener',\n },\n EVENT_TRIGGERS.MEETING_BREAKOUTS_CLOSING\n );\n });\n\n this.breakouts.on(BREAKOUTS.EVENTS.MESSAGE, (messageEvent) => {\n Trigger.trigger(\n this,\n {\n file: 'meeting/index',\n function: 'setUpBreakoutsListener',\n },\n EVENT_TRIGGERS.MEETING_BREAKOUTS_MESSAGE,\n messageEvent\n );\n });\n\n this.breakouts.on(BREAKOUTS.EVENTS.MEMBERS_UPDATE, () => {\n Trigger.trigger(\n this,\n {\n file: 'meeting/index',\n function: 'setUpBreakoutsListener',\n },\n EVENT_TRIGGERS.MEETING_BREAKOUTS_UPDATE\n );\n });\n }\n\n /**\n * Set up the locus info listener for meetings disconnected due to inactivity\n * @returns {undefined}\n * @private\n * @memberof Meeting\n */\n private setUpLocusInfoMediaInactiveListener() {\n // User gets kicked off the meeting due to inactivity or user did a refresh\n this.locusInfo.on(EVENTS.DISCONNECT_DUE_TO_INACTIVITY, (res) => {\n // https:// jira-eng-gpk2.cisco.com/jira/browse/SPARK-240520\n // TODO: send custom parameter explaining why the inactivity happened\n // refresh , no media or network got dsconnected or something else\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.DISCONNECT_DUE_TO_INACTIVITY, {\n correlation_id: this.correlationId,\n locus_id: this.locusId,\n });\n\n // Upload logs on media inactivity\n // Normally media should not be inactive\n Trigger.trigger(\n this,\n {\n file: 'meeting/index',\n function: 'setUpLocusInfoMediaInactiveListener',\n },\n EVENTS.REQUEST_UPLOAD_LOGS,\n this\n );\n\n LoggerProxy.logger.error(\n `Meeting:index#setUpLocusInfoMediaInactiveListener --> Meeting disconnected due to inactivity: ${res.reason}`\n );\n\n // @ts-ignore - config coming from registerPlugin\n if (this.config.reconnection.autoRejoin) {\n this.reconnect();\n } else {\n Trigger.trigger(\n this,\n {\n file: 'meeting/index',\n function: 'setUpLocusInfoMediaInactiveListener',\n },\n EVENT_TRIGGERS.MEETING_SELF_LEFT,\n res.reason\n );\n }\n });\n }\n\n /**\n * Set up the locus info listener for assign host permissions on a meeting\n * @returns {undefined}\n * @private\n * @memberof Meeting\n */\n private setUpLocusInfoAssignHostListener() {\n this.locusInfo.on(EVENTS.LOCUS_INFO_CAN_ASSIGN_HOST, (payload) => {\n const changed = this.inMeetingActions.set({\n canAssignHost: payload.canAssignHost,\n });\n\n if (changed) {\n Trigger.trigger(\n this,\n {\n file: 'meeting/index',\n function: 'setUpLocusInfoAssignHostListener',\n },\n EVENT_TRIGGERS.MEETING_ACTIONS_UPDATE,\n this.inMeetingActions.get()\n );\n }\n });\n }\n\n /**\n * Set up the internal locus info full state object listener\n * @returns {undefined}\n * @private\n * @memberof Meeting\n */\n private setUpLocusFullStateListener() {\n this.locusInfo.on(LOCUSINFO.EVENTS.FULL_STATE_MEETING_STATE_CHANGE, (payload) => {\n Trigger.trigger(\n this,\n {\n file: 'meeting/index',\n function: 'setUpLocusFullStateListener',\n },\n EVENT_TRIGGERS.MEETING_STATE_CHANGE,\n {\n payload,\n }\n );\n });\n\n this.locusInfo.on(LOCUSINFO.EVENTS.FULL_STATE_TYPE_UPDATE, (payload) => {\n this.members.locusFullStateTypeUpdate(payload);\n });\n }\n\n /**\n * get the metrics payload pre\n * @param {Object} options\n * @param {String} options.event\n * @param {String} options.trackingId\n * @param {Object} options.locus\n * @param {Array} options.mediaConnections\n * @param {Object} options.errors\n * @returns {Object}\n * @memberof Meeting\n */\n getAnalyzerMetricsPrePayload(\n options:\n | {\n event: string;\n trackingId: string;\n locus: object;\n mediaConnections: Array<any>;\n errors: object;\n }\n | any\n ) {\n if (options) {\n const {event, trackingId, mediaConnections} = options;\n\n if (!event) {\n LoggerProxy.logger.error(\n 'Meeting:index#getAnalyzerMetricsPrePayload --> Error [Call Analyzer Event',\n event || '',\n `]: invalid identifers or event type! ${this.correlationId}`\n );\n\n return null;\n }\n\n const identifiers: any = {\n correlationId: this.correlationId,\n userId: this.userId,\n deviceId: this.deviceUrl,\n orgId: this.orgId,\n // @ts-ignore fix type\n locusUrl: this.webex.internal.services.get('locus'),\n };\n\n if (this.locusUrl && this.locusInfo.fullState) {\n identifiers.locusUrl = this.locusUrl;\n identifiers.locusId = this.locusUrl && this.locusUrl.split('/').pop();\n identifiers.locusStartTime =\n this.locusInfo.fullState && this.locusInfo.fullState.lastActive;\n }\n\n // Check if mediaConnections has been passed in or else use this.mediaConnections\n if (mediaConnections) {\n identifiers.mediaAgentAlias = mediaConnections?.[0].mediaAgentAlias;\n identifiers.mediaAgentGroupId = mediaConnections?.[0].mediaAgentGroupId;\n identifiers.mediaAgentCluster = mediaConnections?.[0].mediaAgentCluster;\n } else if (this.mediaConnections) {\n identifiers.mediaAgentAlias = this.mediaConnections?.[0].mediaAgentAlias;\n identifiers.mediaAgentGroupId = this.mediaConnections?.[0].mediaAgentGroupId;\n identifiers.mediaAgentCluster = this.mediaConnections?.[0].mediaAgentCluster;\n }\n\n if (options.trackingId) {\n identifiers.trackingId = trackingId;\n }\n\n let payload = {};\n\n const joinRespRxStartAudio = this.getSetupDelayDuration('audio');\n\n if (joinRespRxStartAudio) {\n options.audioSetupDelay = {\n joinRespRxStart: joinRespRxStartAudio,\n };\n }\n\n const joinRespRxStartVideo = this.getSetupDelayDuration('video');\n\n if (joinRespRxStartAudio) {\n options.videoSetupDelay = {\n joinRespRxStart: joinRespRxStartVideo,\n };\n }\n\n const joinRespTxStartAudio = this.getSendingMediaDelayDuration('audio');\n\n if (joinRespTxStartAudio) {\n options.audioSetupDelay = {\n ...options.audioSetupDelay,\n joinRespTxStart: joinRespTxStartAudio,\n };\n }\n\n const joinRespTxStartVideo = this.getSendingMediaDelayDuration('video');\n\n if (joinRespTxStartVideo) {\n options.videoSetupDelay = {\n ...options.videoSetupDelay,\n joinRespTxStart: joinRespTxStartVideo,\n };\n }\n\n const localSDPGenRemoteSDPRecv = this.getLocalSDPGenRemoteSDPRecvDelay();\n\n if (localSDPGenRemoteSDPRecv) {\n options.joinTimes = {\n ...options.joinTimes,\n localSDPGenRemoteSDPRecv,\n };\n }\n\n const callInitiateJoinReq = this.getCallInitiateJoinReq();\n\n if (callInitiateJoinReq) {\n options.joinTimes = {\n ...options.joinTimes,\n callInitiateJoinReq,\n };\n }\n\n const joinReqResp = this.getJoinReqResp();\n\n if (joinReqResp) {\n options.joinTimes = {\n ...options.joinTimes,\n joinReqResp,\n };\n }\n\n const getTotalJmt = this.getTotalJmt();\n\n if (getTotalJmt) {\n options.joinTimes = {\n ...options.joinTimes,\n getTotalJmt,\n };\n }\n\n if (options.type === MQA_STATS.CA_TYPE) {\n payload = Metrics.initMediaPayload(options.event, identifiers, options);\n } else {\n payload = Metrics.initPayload(options.event, identifiers, options);\n }\n\n return payload;\n }\n\n return null;\n }\n\n /**\n * Send the metrics to call-analyzer dashboard\n * @param {Object} options\n * @param {String} options.event\n * @param {String} options.trackingId\n * @param {Object} options.locus\n * @param {Object} options.errors\n * @returns {Promise}\n * @private\n * @memberof Meeting\n */\n private sendCallAnalyzerMetrics(options: {\n event: string;\n trackingId: string;\n locus: object;\n errors: object;\n }) {\n const payload = this.getAnalyzerMetricsPrePayload({\n // @ts-ignore - config coming from registerPlugin\n ...pick(this.config.metrics, ['clientType', 'subClientType']),\n ...options,\n });\n\n // @ts-ignore - fix type\n return this.webex.internal.metrics.submitCallDiagnosticEvents(payload);\n }\n\n /**\n * Send the metrics to Media Quality Analyzer dashboard\n * @param {Object} options\n * @param {String} options.event\n * @param {String} options.trackingId\n * @param {Object} options.locus\n * @returns {Promise}\n * @private\n * @memberof Meeting\n */\n private sendMediaQualityAnalyzerMetrics(options: {\n event: string;\n trackingId: string;\n locus: object;\n }) {\n const payload = this.getAnalyzerMetricsPrePayload({\n type: MQA_STATS.CA_TYPE,\n // @ts-ignore - config coming from registerPlugin\n ...pick(this.config.metrics, ['clientType', 'subClientType']),\n ...options,\n });\n\n // @ts-ignore\n return this.webex.internal.metrics.submitCallDiagnosticEvents(payload);\n }\n\n /**\n * sets the network status on meeting object\n * @param {String} networkStatus\n * @private\n * @returns {undefined}\n * @memberof Meeting\n */\n private setNetworkStatus(networkStatus: string) {\n if (networkStatus === NETWORK_STATUS.DISCONNECTED) {\n Trigger.trigger(\n this,\n {\n file: 'meeting/index',\n function: 'setNetworkStatus',\n },\n EVENT_TRIGGERS.MEETINGS_NETWORK_DISCONNECTED\n );\n } else if (\n networkStatus === NETWORK_STATUS.CONNECTED &&\n this.networkStatus === NETWORK_STATUS.DISCONNECTED\n ) {\n Trigger.trigger(\n this,\n {\n file: 'meeting/index',\n function: 'setNetworkStatus',\n },\n EVENT_TRIGGERS.MEETINGS_NETWORK_CONNECTED\n );\n }\n\n this.networkStatus = networkStatus;\n }\n\n /**\n * Set up the locus info self listener\n * update self value for members and updates the member\n * notifies consumer with members:self:update {activeSelfId endedSelfId}\n * @returns {undefined}\n * @private\n * @memberof Meeting\n */\n private setUpLocusSelfListener() {\n this.locusInfo.on(EVENTS.LOCUS_INFO_UPDATE_SELF, (payload) => {\n this.members.locusSelfUpdate(payload);\n this.pstnUpdate(payload);\n\n // If user moved to a JOINED state and there is a pending floor grant trigger it\n if (this.floorGrantPending && payload.newSelf.state === MEETING_STATE.STATES.JOINED) {\n this.requestScreenShareFloor().then(() => {\n this.floorGrantPending = false;\n });\n }\n });\n }\n\n /**\n * Notify any changes on the pstn devices\n * @param {Object} payload\n * @returns {undefined}\n * @private\n * @memberof Meeting\n */\n private pstnUpdate(payload: any) {\n if (this.locusInfo.self) {\n const dialInPstnDevice = payload.newSelf?.pstnDevices.find(\n (device) => device.url === this.dialInUrl\n );\n const dialOutPstnDevice = payload.newSelf?.pstnDevices.find(\n (device) => device.url === this.dialOutUrl\n );\n let changed = false;\n\n if (dialInPstnDevice) {\n const newStatus = dialInPstnDevice.dialingStatus ?? dialInPstnDevice.state;\n\n if (newStatus !== this.dialInDeviceStatus) {\n this.dialInDeviceStatus = newStatus;\n changed = true;\n }\n }\n\n if (dialOutPstnDevice) {\n const newStatus = dialOutPstnDevice.dialingStatus ?? dialOutPstnDevice.state;\n\n if (newStatus !== this.dialOutDeviceStatus) {\n this.dialOutDeviceStatus = newStatus;\n changed = true;\n }\n }\n\n if (changed) {\n Trigger.trigger(\n this,\n {\n file: 'meeting/index',\n function: 'setUpLocusSelfListener',\n },\n EVENT_TRIGGERS.MEETING_SELF_PHONE_AUDIO_UPDATE,\n {\n dialIn: {\n status: this.dialInDeviceStatus,\n attendeeId: dialInPstnDevice?.attendeeId,\n },\n dialOut: {\n status: this.dialOutDeviceStatus,\n attendeeId: dialOutPstnDevice?.attendeeId,\n },\n }\n );\n }\n }\n }\n\n /**\n * Set up the locus info host listener\n * update host value for members and updates the member\n * notifies consumer with members:host:update: {activeHostId, endedHostId}\n * @returns {undefined}\n * @private\n * @memberof Meeting\n */\n private setUpLocusHostListener() {\n this.locusInfo.on(EVENTS.LOCUS_INFO_UPDATE_HOST, (payload) => {\n this.members.locusHostUpdate(payload);\n });\n }\n\n /**\n * Set up the locus info participants update listener\n * update members collection value for members\n * notifies consumer with members:update\n * @returns {undefined}\n * @private\n * @memberof Meeting\n */\n private setUpLocusParticipantsListener() {\n this.locusInfo.on(EVENTS.LOCUS_INFO_UPDATE_PARTICIPANTS, (payload) => {\n this.members.locusParticipantsUpdate(payload);\n });\n }\n\n /**\n * Set up the locus info recording update listener\n * update recording value for the meeting\n * notifies consumer with:\n * meeting:recording:started\n * meeting:recording:stopped\n * meeting:recording:paused\n * meeting:recording:resumed\n *\n * Set up the locus info meeeting container listener\n * update meetingContainerUrl value for the meeting\n * notifies consumer with:\n * meeting:meetingContainer:update\n *\n * @returns {undefined}\n * @private\n * @memberof Meeting\n */\n private setupLocusControlsListener() {\n this.locusInfo.on(\n LOCUSINFO.EVENTS.CONTROLS_RECORDING_UPDATED,\n ({state, modifiedBy, lastModified}) => {\n let event;\n\n switch (state) {\n case RECORDING_STATE.RECORDING:\n event = EVENT_TRIGGERS.MEETING_STARTED_RECORDING;\n break;\n case RECORDING_STATE.IDLE:\n event = EVENT_TRIGGERS.MEETING_STOPPED_RECORDING;\n break;\n case RECORDING_STATE.PAUSED:\n event = EVENT_TRIGGERS.MEETING_PAUSED_RECORDING;\n break;\n case RECORDING_STATE.RESUMED:\n event = EVENT_TRIGGERS.MEETING_RESUMED_RECORDING;\n break;\n default:\n event = null;\n break;\n }\n\n // `RESUMED` state should be converted to `RECORDING` after triggering the event\n this.recording = {\n state: state === RECORDING_STATE.RESUMED ? RECORDING_STATE.RECORDING : state,\n modifiedBy,\n lastModified,\n };\n\n Trigger.trigger(\n this,\n {\n file: 'meeting/index',\n function: 'setupLocusControlsListener',\n },\n event,\n this.recording\n );\n }\n );\n\n this.locusInfo.on(\n LOCUSINFO.EVENTS.CONTROLS_MEETING_CONTAINER_UPDATED,\n ({meetingContainerUrl}) => {\n Trigger.trigger(\n this,\n {\n file: 'meeting/index',\n function: 'setupLocusControlsListener',\n },\n EVENT_TRIGGERS.MEETING_MEETING_CONTAINER_UPDATE,\n {meetingContainerUrl}\n );\n }\n );\n\n this.locusInfo.on(\n LOCUSINFO.EVENTS.CONTROLS_MEETING_TRANSCRIBE_UPDATED,\n ({caption, transcribing}) => {\n // @ts-ignore - config coming from registerPlugin\n if (transcribing && this.transcription && this.config.receiveTranscription) {\n this.receiveTranscription();\n } else if (!transcribing && this.transcription) {\n Trigger.trigger(\n this,\n {\n file: 'meeting/index',\n function: 'setupLocusControlsListener',\n },\n EVENT_TRIGGERS.MEETING_STOPPED_RECEIVING_TRANSCRIPTION,\n {caption, transcribing}\n );\n }\n }\n );\n\n this.locusInfo.on(LOCUSINFO.EVENTS.CONTROLS_MEETING_BREAKOUT_UPDATED, ({breakout}) => {\n this.breakouts.updateBreakout(breakout);\n Trigger.trigger(\n this,\n {\n file: 'meeting/index',\n function: 'setupLocusControlsListener',\n },\n EVENT_TRIGGERS.MEETING_BREAKOUTS_UPDATE\n );\n });\n\n this.locusInfo.on(LOCUSINFO.EVENTS.CONTROLS_ENTRY_EXIT_TONE_UPDATED, ({entryExitTone}) => {\n Trigger.trigger(\n this,\n {\n file: 'meeting/index',\n function: 'setupLocusControlsListener',\n },\n EVENT_TRIGGERS.MEETING_ENTRY_EXIT_TONE_UPDATE,\n {entryExitTone}\n );\n });\n }\n\n /**\n * Set up the locus info media shares listener\n * update content and whiteboard sharing id value for members, and updates the member\n * notifies consumer with members:content:update {activeContentSharingId, endedContentSharingId}\n * @returns {undefined}\n * @private\n * @memberof Meeting\n */\n private setUpLocusMediaSharesListener() {\n // Will get triggered on local and remote share\n this.locusInfo.on(EVENTS.LOCUS_INFO_UPDATE_MEDIA_SHARES, async (payload) => {\n const {content: contentShare, whiteboard: whiteboardShare} = payload.current;\n const previousContentShare = payload.previous?.content;\n const previousWhiteboardShare = payload.previous?.whiteboard;\n\n if (\n contentShare.beneficiaryId === previousContentShare?.beneficiaryId &&\n contentShare.disposition === previousContentShare?.disposition &&\n whiteboardShare.beneficiaryId === previousWhiteboardShare?.beneficiaryId &&\n whiteboardShare.disposition === previousWhiteboardShare?.disposition &&\n whiteboardShare.resourceUrl === previousWhiteboardShare?.resourceUrl\n ) {\n // nothing changed, so ignore\n // (this happens when we steal presentation from remote)\n return;\n }\n\n let newShareStatus = this.shareStatus;\n\n // REMOTE - check if remote started sharing\n if (\n this.selfId !== contentShare.beneficiaryId &&\n contentShare.disposition === FLOOR_ACTION.GRANTED\n ) {\n // CONTENT - sharing content remote\n newShareStatus = SHARE_STATUS.REMOTE_SHARE_ACTIVE;\n }\n // LOCAL - check if we started sharing content\n else if (\n this.selfId === contentShare.beneficiaryId &&\n contentShare.disposition === FLOOR_ACTION.GRANTED\n ) {\n // @ts-ignore originalTrack is private - this will be fixed when SPARK-399694 are SPARK-399695 done\n const localShareTrack = this.mediaProperties.shareTrack?.originalTrack;\n\n // todo: remove this block of code and instead make sure we have LocalTrackEvents.Ended listener always registered (SPARK-399695)\n if (localShareTrack?.readyState === 'ended') {\n try {\n if (this.isMultistream) {\n await this.unpublishTracks([localShareTrack]); // todo screen share audio (SPARK-399690)\n } else {\n await this.stopShare({\n skipSignalingCheck: true,\n });\n }\n } catch (error) {\n LoggerProxy.logger.log(\n 'Meeting:index#setUpLocusMediaSharesListener --> Error stopping share: ',\n error\n );\n }\n } else {\n // CONTENT - sharing content local\n newShareStatus = SHARE_STATUS.LOCAL_SHARE_ACTIVE;\n }\n }\n // If we did not hit the cases above, no one is sharng content, so we check if we are sharing whiteboard\n // There is no concept of local/remote share for whiteboard\n // It does not matter who requested to share the whiteboard, everyone gets the same view\n else if (whiteboardShare.disposition === FLOOR_ACTION.GRANTED) {\n // WHITEBOARD - sharing whiteboard\n newShareStatus = SHARE_STATUS.WHITEBOARD_SHARE_ACTIVE;\n }\n // or if content share is either released or null and whiteboard share is either released or null, no one is sharing\n else if (\n ((previousContentShare && contentShare.disposition === FLOOR_ACTION.RELEASED) ||\n contentShare.disposition === null) &&\n ((previousWhiteboardShare && whiteboardShare.disposition === FLOOR_ACTION.RELEASED) ||\n whiteboardShare.disposition === null)\n ) {\n newShareStatus = SHARE_STATUS.NO_SHARE;\n }\n\n if (newShareStatus !== this.shareStatus) {\n const oldShareStatus = this.shareStatus;\n\n // update our state before we send out any notifications\n this.shareStatus = newShareStatus;\n\n // send out \"stop\" notifications for the old state\n switch (oldShareStatus) {\n case SHARE_STATUS.REMOTE_SHARE_ACTIVE:\n Trigger.trigger(\n this,\n {\n file: 'meetings/index',\n function: 'remoteShare',\n },\n EVENT_TRIGGERS.MEETING_STOPPED_SHARING_REMOTE\n );\n break;\n\n case SHARE_STATUS.LOCAL_SHARE_ACTIVE:\n Trigger.trigger(\n this,\n {\n file: 'meeting/index',\n function: 'localShare',\n },\n EVENT_TRIGGERS.MEETING_STOPPED_SHARING_LOCAL,\n {\n reason: SHARE_STOPPED_REASON.SELF_STOPPED,\n }\n );\n break;\n\n case SHARE_STATUS.WHITEBOARD_SHARE_ACTIVE:\n Trigger.trigger(\n this,\n {\n file: 'meeting/index',\n function: 'stopWhiteboardShare',\n },\n EVENT_TRIGGERS.MEETING_STOPPED_SHARING_WHITEBOARD\n );\n break;\n\n case SHARE_STATUS.NO_SHARE:\n // nothing to do\n break;\n\n default:\n break;\n }\n\n // send \"start\" notifications for the new state\n switch (newShareStatus) {\n case SHARE_STATUS.REMOTE_SHARE_ACTIVE: {\n const sendStartedSharingRemote = () => {\n Trigger.trigger(\n this,\n {\n file: 'meetings/index',\n function: 'remoteShare',\n },\n EVENT_TRIGGERS.MEETING_STARTED_SHARING_REMOTE,\n {\n memberId: contentShare.beneficiaryId,\n }\n );\n };\n\n try {\n // if a remote participant is stealing the presentation from us\n if (\n this.mediaProperties.mediaDirection?.sendShare &&\n oldShareStatus === SHARE_STATUS.LOCAL_SHARE_ACTIVE\n ) {\n if (this.isMultistream) {\n // @ts-ignore originalTrack is private - this will be fixed in SPARK-399694\n await this.unpublishTracks([this.mediaProperties.shareTrack?.originalTrack]); // todo screen share audio (SPARK-399690)\n } else {\n await this.updateShare({\n sendShare: false,\n receiveShare: this.mediaProperties.mediaDirection.receiveShare,\n });\n }\n }\n } finally {\n sendStartedSharingRemote();\n }\n break;\n }\n\n case SHARE_STATUS.LOCAL_SHARE_ACTIVE:\n Trigger.trigger(\n this,\n {\n file: 'meeting/index',\n function: 'share',\n },\n EVENT_TRIGGERS.MEETING_STARTED_SHARING_LOCAL\n );\n Metrics.postEvent({event: eventType.LOCAL_SHARE_FLOOR_GRANTED, meeting: this});\n break;\n\n case SHARE_STATUS.WHITEBOARD_SHARE_ACTIVE:\n Trigger.trigger(\n this,\n {\n file: 'meeting/index',\n function: 'startWhiteboardShare',\n },\n EVENT_TRIGGERS.MEETING_STARTED_SHARING_WHITEBOARD,\n {\n resourceUrl: whiteboardShare.resourceUrl,\n memberId: whiteboardShare.beneficiaryId,\n }\n );\n Metrics.postEvent({event: eventType.WHITEBOARD_SHARE_FLOOR_GRANTED, meeting: this});\n break;\n\n case SHARE_STATUS.NO_SHARE:\n // nothing to do\n break;\n\n default:\n break;\n }\n\n this.members.locusMediaSharesUpdate(payload);\n } else if (newShareStatus === SHARE_STATUS.REMOTE_SHARE_ACTIVE) {\n // if we got here, then some remote participant has stolen\n // the presentation from another remote participant\n Trigger.trigger(\n this,\n {\n file: 'meetings/index',\n function: 'remoteShare',\n },\n EVENT_TRIGGERS.MEETING_STARTED_SHARING_REMOTE,\n {\n memberId: contentShare.beneficiaryId,\n }\n );\n this.members.locusMediaSharesUpdate(payload);\n } else if (newShareStatus === SHARE_STATUS.WHITEBOARD_SHARE_ACTIVE) {\n // if we got here, then some remote participant has stolen\n // the presentation from another remote participant\n Trigger.trigger(\n this,\n {\n file: 'meeting/index',\n function: 'startWhiteboardShare',\n },\n EVENT_TRIGGERS.MEETING_STARTED_SHARING_WHITEBOARD,\n {\n resourceUrl: whiteboardShare.resourceUrl,\n memberId: whiteboardShare.beneficiaryId,\n }\n );\n Metrics.postEvent({event: eventType.WHITEBOARD_SHARE_FLOOR_GRANTED, meeting: this});\n this.members.locusMediaSharesUpdate(payload);\n }\n });\n }\n\n /**\n * Set up the locus info url listener\n * update locus_url value for members\n * @returns {undefined}\n * @private\n * @memberof Meeting\n */\n private setUpLocusUrlListener() {\n this.locusInfo.on(EVENTS.LOCUS_INFO_UPDATE_URL, (payload) => {\n this.members.locusUrlUpdate(payload);\n this.breakouts.locusUrlUpdate(payload);\n this.locusUrl = payload;\n this.locusId = this.locusUrl?.split('/').pop();\n this.recordingController.setLocusUrl(this.locusUrl);\n this.controlsOptionsManager.setLocusUrl(this.locusUrl);\n });\n }\n\n /**\n * Set up the locus info service link listener\n * update the locusInfo for recording controller\n * does not currently re-emit the event as it's internal only\n * payload is unused\n * @returns {undefined}\n * @private\n * @memberof Meeting\n */\n private setUpLocusServicesListener() {\n this.locusInfo.on(LOCUSINFO.EVENTS.LINKS_SERVICES, (payload) => {\n this.recordingController.setServiceUrl(payload?.services?.record?.url);\n this.recordingController.setSessionId(this.locusInfo?.fullState?.sessionId);\n this.breakouts.breakoutServiceUrlUpdate(payload?.services?.breakout?.url);\n });\n }\n\n /**\n * Set up the locus info meeting info listener\n * @returns {undefined}\n * @private\n * @memberof meeting\n */\n private setUpLocusInfoMeetingInfoListener() {\n this.locusInfo.on(LOCUSINFO.EVENTS.MEETING_LOCKED, (payload) => {\n if (payload) {\n Trigger.trigger(\n this,\n {\n file: 'meeting/index',\n function: 'setUpLocusInfoMeetingInfoListener',\n },\n EVENT_TRIGGERS.MEETING_LOCKED,\n {\n payload,\n }\n );\n }\n });\n this.locusInfo.on(LOCUSINFO.EVENTS.MEETING_UNLOCKED, (payload) => {\n if (payload) {\n Trigger.trigger(\n this,\n {\n file: 'meeting/index',\n function: 'setUpLocusInfoMeetingInfoListener',\n },\n EVENT_TRIGGERS.MEETING_UNLOCKED,\n {\n payload,\n }\n );\n }\n });\n this.locusInfo.on(LOCUSINFO.EVENTS.MEETING_INFO_UPDATED, (payload) => {\n if (payload && payload.info) {\n const changed = this.inMeetingActions.set({\n canInviteNewParticipants: MeetingUtil.canInviteNewParticipants(\n payload.info.userDisplayHints\n ),\n canAdmitParticipant: MeetingUtil.canAdmitParticipant(payload.info.userDisplayHints),\n canLock: MeetingUtil.canUserLock(payload.info.userDisplayHints),\n canUnlock: MeetingUtil.canUserUnlock(payload.info.userDisplayHints),\n canSetDisallowUnmute: ControlsOptionsUtil.canSetDisallowUnmute(\n payload.info.userDisplayHints\n ),\n canUnsetDisallowUnmute: ControlsOptionsUtil.canUnsetDisallowUnmute(\n payload.info.userDisplayHints\n ),\n canSetMuteOnEntry: ControlsOptionsUtil.canSetMuteOnEntry(payload.info.userDisplayHints),\n canUnsetMuteOnEntry: ControlsOptionsUtil.canUnsetMuteOnEntry(\n payload.info.userDisplayHints\n ),\n canSetMuted: ControlsOptionsUtil.canSetMuted(payload.info.userDisplayHints),\n canUnsetMuted: ControlsOptionsUtil.canUnsetMuted(payload.info.userDisplayHints),\n canStartRecording: RecordingUtil.canUserStart(payload.info.userDisplayHints),\n canStopRecording: RecordingUtil.canUserStop(payload.info.userDisplayHints),\n canPauseRecording: RecordingUtil.canUserPause(payload.info.userDisplayHints),\n canResumeRecording: RecordingUtil.canUserResume(payload.info.userDisplayHints),\n canRaiseHand: MeetingUtil.canUserRaiseHand(payload.info.userDisplayHints),\n canLowerAllHands: MeetingUtil.canUserLowerAllHands(payload.info.userDisplayHints),\n canLowerSomeoneElsesHand: MeetingUtil.canUserLowerSomeoneElsesHand(\n payload.info.userDisplayHints\n ),\n bothLeaveAndEndMeetingAvailable: MeetingUtil.bothLeaveAndEndMeetingAvailable(\n payload.info.userDisplayHints\n ),\n canEnableClosedCaption: MeetingUtil.canEnableClosedCaption(payload.info.userDisplayHints),\n canStartTranscribing: MeetingUtil.canStartTranscribing(payload.info.userDisplayHints),\n canStopTranscribing: MeetingUtil.canStopTranscribing(payload.info.userDisplayHints),\n isClosedCaptionActive: MeetingUtil.isClosedCaptionActive(payload.info.userDisplayHints),\n isSaveTranscriptsEnabled: MeetingUtil.isSaveTranscriptsEnabled(\n payload.info.userDisplayHints\n ),\n isWebexAssistantActive: MeetingUtil.isWebexAssistantActive(payload.info.userDisplayHints),\n canViewCaptionPanel: MeetingUtil.canViewCaptionPanel(payload.info.userDisplayHints),\n isRealTimeTranslationEnabled: MeetingUtil.isRealTimeTranslationEnabled(\n payload.info.userDisplayHints\n ),\n canSelectSpokenLanguages: MeetingUtil.canSelectSpokenLanguages(\n payload.info.userDisplayHints\n ),\n waitingForOthersToJoin: MeetingUtil.waitingForOthersToJoin(payload.info.userDisplayHints),\n canEnableReactions: MeetingUtil.canEnableReactions(\n this.inMeetingActions.canEnableReactions,\n payload.info.userDisplayHints\n ),\n canSendReactions: MeetingUtil.canSendReactions(\n this.inMeetingActions.canSendReactions,\n payload.info.userDisplayHints\n ),\n canManageBreakout: MeetingUtil.canManageBreakout(payload.info.userDisplayHints),\n canAdmitLobbyToBreakout: MeetingUtil.canAdmitLobbyToBreakout(\n payload.info.userDisplayHints\n ),\n isBreakoutPreassignmentsEnabled: MeetingUtil.isBreakoutPreassignmentsEnabled(\n payload.info.userDisplayHints\n ),\n canUserAskForHelp: MeetingUtil.canUserAskForHelp(payload.info.userDisplayHints),\n canUserRenameSelfAndObserved: MeetingUtil.canUserRenameSelfAndObserved(\n payload.info.userDisplayHints\n ),\n canUserRenameOthers: MeetingUtil.canUserRenameOthers(payload.info.userDisplayHints),\n });\n\n this.recordingController.setDisplayHints(payload.info.userDisplayHints);\n this.controlsOptionsManager.setDisplayHints(payload.info.userDisplayHints);\n\n if (changed) {\n Trigger.trigger(\n this,\n {\n file: 'meeting/index',\n function: 'setUpLocusInfoMeetingInfoListener',\n },\n EVENT_TRIGGERS.MEETING_ACTIONS_UPDATE,\n this.inMeetingActions.get()\n );\n }\n\n this.handleDataChannelUrlChange(payload.info.datachannelUrl);\n }\n });\n }\n\n /**\n * Handles a data channel URL change\n * @param {String} datachannelUrl\n * @returns {void}\n */\n handleDataChannelUrlChange(datachannelUrl) {\n // @ts-ignore - config coming from registerPlugin\n if (datachannelUrl && this.config.enableAutomaticLLM) {\n // Defer this as updateLLMConnection relies upon this.locusInfo.url which is only set\n // after the MEETING_INFO_UPDATED callback finishes\n defer(() => {\n this.updateLLMConnection();\n });\n }\n }\n\n /**\n * Set up the locus info embedded apps listener\n * @returns {undefined}\n * @private\n * @memberof meeting\n */\n private setUpLocusEmbeddedAppsListener() {\n this.locusInfo.on(LOCUSINFO.EVENTS.EMBEDDED_APPS_UPDATED, (embeddedApps) => {\n if (embeddedApps) {\n Trigger.trigger(\n this,\n {\n file: 'meeting/index',\n function: 'setUpLocusEmbeddedAppsListener',\n },\n EVENT_TRIGGERS.MEETING_EMBEDDED_APPS_UPDATE,\n embeddedApps\n );\n }\n });\n }\n\n /**\n * Internal function to listen to the self object changes\n * @returns {undefined}\n * @private\n * @memberof Meeting\n */\n private setUpLocusInfoSelfListener() {\n this.locusInfo.on(LOCUSINFO.EVENTS.LOCAL_UNMUTE_REQUIRED, (payload) => {\n if (this.audio) {\n this.audio.handleServerLocalUnmuteRequired(this);\n Trigger.trigger(\n this,\n {\n file: 'meeting/index',\n function: 'setUpLocusInfoSelfListener',\n },\n EVENT_TRIGGERS.MEETING_SELF_UNMUTED_BY_OTHERS,\n {\n payload,\n }\n );\n }\n });\n\n this.locusInfo.on(LOCUSINFO.EVENTS.SELF_REMOTE_VIDEO_MUTE_STATUS_UPDATED, (payload) => {\n if (payload) {\n if (this.video) {\n payload.muted = payload.muted ?? this.video.isRemotelyMuted();\n payload.unmuteAllowed = payload.unmuteAllowed ?? this.video.isUnmuteAllowed();\n this.video.handleServerRemoteMuteUpdate(payload.muted, payload.unmuteAllowed);\n }\n Trigger.trigger(\n this,\n {\n file: 'meeting/index',\n function: 'setUpLocusInfoSelfListener',\n },\n payload.muted\n ? EVENT_TRIGGERS.MEETING_SELF_VIDEO_MUTED_BY_OTHERS\n : EVENT_TRIGGERS.MEETING_SELF_VIDEO_UNMUTED_BY_OTHERS,\n {\n payload,\n }\n );\n }\n });\n\n this.locusInfo.on(LOCUSINFO.EVENTS.SELF_REMOTE_MUTE_STATUS_UPDATED, (payload) => {\n if (payload) {\n if (this.audio) {\n this.audio.handleServerRemoteMuteUpdate(payload.muted, payload.unmuteAllowed);\n }\n // with \"mute on entry\" server will send us remote mute even if we don't have media configured,\n // so if being muted by others, always send the notification,\n // but if being unmuted, only send it if we are also locally unmuted\n if (payload.muted || !this.audio?.isMuted()) {\n Trigger.trigger(\n this,\n {\n file: 'meeting/index',\n function: 'setUpLocusInfoSelfListener',\n },\n payload.muted\n ? EVENT_TRIGGERS.MEETING_SELF_MUTED_BY_OTHERS\n : EVENT_TRIGGERS.MEETING_SELF_UNMUTED_BY_OTHERS,\n {\n payload,\n }\n );\n }\n }\n });\n this.locusInfo.on(LOCUSINFO.EVENTS.LOCAL_UNMUTE_REQUESTED, (payload) => {\n Trigger.trigger(\n this,\n {\n file: 'meeting/index',\n function: 'setUpLocusInfoSelfListener',\n },\n EVENT_TRIGGERS.MEETING_SELF_REQUESTED_TO_UNMUTE,\n {\n payload,\n }\n );\n });\n this.locusInfo.on(LOCUSINFO.EVENTS.SELF_UNADMITTED_GUEST, (payload) => {\n if (payload) {\n this.startKeepAlive();\n\n Trigger.trigger(\n this,\n {\n file: 'meeting/index',\n function: 'setUpLocusInfoSelfListener',\n },\n EVENT_TRIGGERS.MEETING_SELF_LOBBY_WAITING,\n {\n payload,\n }\n );\n\n Metrics.postEvent({\n event: eventType.LOBBY_ENTERED,\n meeting: this,\n });\n }\n });\n this.locusInfo.on(LOCUSINFO.EVENTS.SELF_ADMITTED_GUEST, (payload) => {\n this.stopKeepAlive();\n\n if (payload) {\n Trigger.trigger(\n this,\n {\n file: 'meeting/index',\n function: 'setUpLocusInfoSelfListener',\n },\n EVENT_TRIGGERS.MEETING_SELF_GUEST_ADMITTED,\n {\n payload,\n }\n );\n\n Metrics.postEvent({\n event: eventType.LOBBY_EXITED,\n meeting: this,\n });\n }\n });\n\n // @ts-ignore - check if MEDIA_INACTIVITY exists\n this.locusInfo.on(LOCUSINFO.EVENTS.MEDIA_INACTIVITY, () => {\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.MEETING_MEDIA_INACTIVE, {\n correlation_id: this.correlationId,\n locus_id: this.locusId,\n });\n this.reconnect();\n });\n\n // There is two stats for mute one is the actual media being sent or received\n // The second on is if the audio is muted, we need to tell the statsAnalyzer when\n // the audio is muted or the user is not willing to send media\n this.locusInfo.on(LOCUSINFO.EVENTS.MEDIA_STATUS_CHANGE, (status) => {\n if (this.statsAnalyzer) {\n this.statsAnalyzer.updateMediaStatus({\n actual: status,\n expected: {\n // We need to check what should be the actual direction of media\n sendAudio: this.mediaProperties.mediaDirection?.sendAudio && !this.audio?.isMuted(),\n sendVideo: this.mediaProperties.mediaDirection?.sendVideo && !this.video?.isMuted(),\n sendShare: this.mediaProperties.mediaDirection?.sendShare,\n receiveAudio: this.mediaProperties.mediaDirection?.receiveAudio,\n receiveVideo: this.mediaProperties.mediaDirection?.receiveVideo,\n receiveShare: this.mediaProperties.mediaDirection?.receiveShare,\n },\n });\n }\n });\n\n this.locusInfo.on(LOCUSINFO.EVENTS.SELF_CANNOT_VIEW_PARTICIPANT_LIST_CHANGE, (payload) => {\n Trigger.trigger(\n this,\n {\n file: 'meeting/index',\n function: 'setUpLocusInfoSelfListener',\n },\n EVENT_TRIGGERS.MEETING_SELF_CANNOT_VIEW_PARTICIPANT_LIST,\n {\n payload,\n }\n );\n });\n\n this.locusInfo.on(LOCUSINFO.EVENTS.SELF_MEETING_BREAKOUTS_CHANGED, (payload) => {\n this.breakouts.updateBreakoutSessions(payload);\n Trigger.trigger(\n this,\n {\n file: 'meeting/index',\n function: 'setUpLocusInfoSelfListener',\n },\n EVENT_TRIGGERS.MEETING_BREAKOUTS_UPDATE\n );\n });\n\n // We need to reinitialize when user upgrades to host or cohost\n this.locusInfo.on(LOCUSINFO.EVENTS.SELF_MODERATOR_OR_COHOST_UPGRADE, (payload) => {\n this.breakouts.queryPreAssignments(payload);\n // ...\n });\n\n this.locusInfo.on(LOCUSINFO.EVENTS.SELF_IS_SHARING_BLOCKED_CHANGE, (payload) => {\n Trigger.trigger(\n this,\n {\n file: 'meeting/index',\n function: 'setUpLocusInfoSelfListener',\n },\n EVENT_TRIGGERS.MEETING_SELF_IS_SHARING_BLOCKED,\n {\n payload,\n }\n );\n });\n }\n\n /**\n * Add LocusInfo nested object listeners (from child to parent)\n * @returns {undefined}\n * @private\n * @memberof Meeting\n */\n private setUpLocusInfoMeetingListener() {\n this.locusInfo.on(EVENTS.REMOTE_RESPONSE, (payload) => {\n this.meetingFiniteStateMachine.remote(payload);\n\n if (payload.remoteDeclined) {\n this.leave({reason: payload.reason})\n .then(() => {\n LoggerProxy.logger.info(\n 'Meeting:index#setUpLocusInfoMeetingListener --> REMOTE_RESPONSE. Attempting to leave meeting.'\n );\n })\n .catch((error) => {\n // @ts-ignore\n LoggerProxy.logger.error(\n `Meeting:index#setUpLocusInfoMeetingListener --> REMOTE_RESPONSE. Issue with leave for meeting, meeting still in collection: ${this}, error: ${error}`\n );\n });\n }\n });\n this.locusInfo.on(EVENTS.DESTROY_MEETING, (payload) => {\n // if self state is NOT left\n\n // TODO: Handle sharing and wireless sharing when meeting end\n if (this.wirelessShare) {\n if (this.mediaProperties.shareTrack) {\n this.setLocalShareTrack(null);\n }\n }\n // when multiple WEB deviceType join with same user\n // and some of the devices are joined and some are left\n // when your own device is still connected you want to leave and destroy\n // else you want to just destroy\n // this looks odd because when it leaves it should destroy, but we get a\n // leave response and we should destroy it on the next event loop\n // the leave response gets parsed and we decide if we want to destroy the meeting\n // the first time we just leave it, the second time it comes it destroys it from the collection\n if (payload.shouldLeave) {\n // TODO: We should do cleaning of meeting object if the shouldLeave: false because there might be meeting object which we are not cleaning\n\n this.leave({reason: payload.reason})\n .then(() => {\n LoggerProxy.logger.warn(\n 'Meeting:index#setUpLocusInfoMeetingListener --> DESTROY_MEETING. The meeting has been left, but has not been destroyed, you should see a later event for leave.'\n );\n })\n .catch((error) => {\n // @ts-ignore\n LoggerProxy.logger.error(\n `Meeting:index#setUpLocusInfoMeetingListener --> DESTROY_MEETING. Issue with leave for meeting, meeting still in collection: ${this}, error: ${error}`\n );\n });\n } else {\n LoggerProxy.logger.info(\n 'Meeting:index#setUpLocusInfoMeetingListener --> MEETING_REMOVED_REASON',\n payload.reason\n );\n\n MeetingUtil.cleanUp(this);\n Trigger.trigger(\n this,\n {\n file: 'meeting/index',\n function: 'setUpLocusInfoMeetingListener',\n },\n EVENTS.DESTROY_MEETING,\n {\n reason: payload.reason,\n meetingId: this.id,\n }\n );\n }\n });\n }\n\n /**\n * Set meeting values rather than events\n * @param {Object} object\n * @returns {undefined}\n * @private\n * @memberof Meeting\n * // TODO: is this function necessary?\n */\n private updateMeetingObject(object: object) {\n // Validate if these are valid meeting object property\n // TODO: add a check to make sure the value passed in the constructor\n // is not changed by any delta event\n if (object && Object.keys(object).length) {\n Object.keys(object).forEach((key) => {\n this[key] = object[key];\n });\n }\n }\n\n /**\n * Invite a guest to the call that isn't normally part of this call\n * @param {Object} invitee\n * @param {String} invitee.emailAddress\n * @param {String} invitee.email\n * @param {String} invitee.phoneNumber\n * @param {Boolean} [alertIfActive]\n * @returns {Promise} see #members.addMember\n * @public\n * @memberof Meeting\n */\n public invite(\n invitee: {\n emailAddress: string;\n email: string;\n phoneNumber: string;\n },\n alertIfActive = true\n ) {\n return this.members.addMember(invitee, alertIfActive);\n }\n\n /**\n * Cancel an outgoing phone call invitation made during a meeting\n * @param {Object} invitee\n * @param {String} invitee.phoneNumber\n * @returns {Promise} see #members.cancelPhoneInvite\n * @public\n * @memberof Meeting\n */\n public cancelPhoneInvite(invitee: {phoneNumber: string}) {\n return this.members.cancelPhoneInvite(invitee);\n }\n\n /**\n * Admit the guest(s) to the call once they are waiting.\n * If the host/cohost is in a breakout session, the locus url\n * of the session must be provided as the authorizingLocusUrl.\n * Regardless of host/cohost location, the locus Id (lid) in\n * the path should be the locus Id of the main, which means the\n * locus url of the api call must be from the main session.\n * If these loucs urls are not provided, the function will do the check.\n * @param {Array} memberIds\n * @param {Object} sessionLocusUrls: {authorizingLocusUrl, mainLocusUrl}\n * @returns {Promise} see #members.admitMembers\n * @public\n * @memberof Meeting\n */\n public admit(\n memberIds: Array<any>,\n sessionLocusUrls?: {authorizingLocusUrl: string; mainLocusUrl: string}\n ) {\n let locusUrls = sessionLocusUrls;\n if (!locusUrls) {\n const {locusUrl, mainLocusUrl} = this.breakouts;\n if (locusUrl && mainLocusUrl) {\n locusUrls = {authorizingLocusUrl: locusUrl, mainLocusUrl};\n }\n }\n\n return this.members.admitMembers(memberIds, locusUrls);\n }\n\n /**\n * Remove the member from the meeting, boot them\n * @param {String} memberId\n * @returns {Promise} see #members.removeMember\n * @public\n * @memberof Meeting\n */\n public remove(memberId: string) {\n return this.members.removeMember(memberId);\n }\n\n /**\n * Mute another member from the meeting\n * @param {String} memberId\n * @param {Boolean} mute\n * @returns {Promise} see #members.muteMember\n * @public\n * @memberof Meeting\n */\n public mute(memberId: string, mute = true) {\n return this.members.muteMember(memberId, mute);\n }\n\n /**\n * Transfer the moderator role to another eligible member\n * @param {String} memberId\n * @param {Boolean} moderator\n * @returns {Promise} see #members.transferHostToMember\n * @public\n * @memberof Meeting\n */\n public transfer(memberId: string, moderator = true) {\n return this.members.transferHostToMember(memberId, moderator);\n }\n\n /**\n * Reference to the Members object\n * @returns {Members}\n * @public\n * @memberof Meeting\n */\n public getMembers() {\n return this.members;\n }\n\n /**\n * Truthy when a meeting has an audio connection established\n * @returns {Boolean} true if meeting audio is connected otherwise false\n * @public\n * @memberof Meeting\n */\n public isAudioConnected() {\n return !!this.audio;\n }\n\n /**\n * Convenience function to tell whether a meeting is muted\n * @returns {Boolean} if meeting audio muted or not\n * @public\n * @memberof Meeting\n */\n public isAudioMuted() {\n return this.audio && this.audio.isMuted();\n }\n\n /**\n * Convenience function to tell if the end user last changed the audio state\n * @returns {Boolean} if audio was manipulated by the end user\n * @public\n * @memberof Meeting\n */\n public isAudioSelf() {\n return this.audio && this.audio.isSelf();\n }\n\n /**\n * Truthy when a meeting has a video connection established\n * @returns {Boolean} true if meeting video connected otherwise false\n * @public\n * @memberof Meeting\n */\n public isVideoConnected() {\n return !!this.video;\n }\n\n /**\n * Convenience function to tell whether video is muted\n * @returns {Boolean} if meeting video is muted or not\n * @public\n * @memberof Meeting\n */\n public isVideoMuted() {\n return this.video && this.video.isMuted();\n }\n\n /**\n * Convenience function to tell whether the end user changed the video state\n * @returns {Boolean} if meeting video is muted or not\n * @public\n * @memberof Meeting\n */\n public isVideoSelf() {\n return this.video && this.video.isSelf();\n }\n\n /**\n * Sets the meeting info on the class instance\n * @param {Object} meetingInfo\n * @param {Object} meetingInfo.body\n * @param {String} meetingInfo.body.conversationUrl\n * @param {String} meetingInfo.body.locusUrl\n * @param {String} meetingInfo.body.sipUri\n * @param {Object} meetingInfo.body.owner\n * @param {Object | String} destination locus object with meeting data or destination string (sip url, meeting link, etc)\n * @returns {undefined}\n * @private\n * @memberof Meeting\n */\n parseMeetingInfo(\n meetingInfo:\n | {\n body: {\n conversationUrl: string;\n locusUrl: string;\n sipUri: string;\n owner: object;\n };\n }\n | any,\n destination: object | string | null = null\n ) {\n const webexMeetingInfo = meetingInfo?.body;\n // We try to use as much info from Locus meeting object, stored in destination\n\n let locusMeetingObject;\n\n if (destination) {\n locusMeetingObject = typeof destination === 'object' ? destination : undefined;\n }\n\n // MeetingInfo will be undefined for 1:1 calls\n if (\n locusMeetingObject ||\n (webexMeetingInfo && !(meetingInfo?.errors && meetingInfo?.errors.length > 0))\n ) {\n this.conversationUrl =\n locusMeetingObject?.conversationUrl ||\n webexMeetingInfo?.conversationUrl ||\n this.conversationUrl;\n this.locusUrl = locusMeetingObject?.url || webexMeetingInfo?.locusUrl || this.locusUrl;\n // @ts-ignore - config coming from registerPlugin\n this.setSipUri(\n // @ts-ignore\n this.config.experimental.enableUnifiedMeetings\n ? locusMeetingObject?.info.sipUri || webexMeetingInfo?.sipUrl\n : locusMeetingObject?.info.sipUri || webexMeetingInfo?.sipMeetingUri || this.sipUri\n );\n // @ts-ignore - config coming from registerPlugin\n if (this.config.experimental.enableUnifiedMeetings) {\n this.meetingNumber =\n locusMeetingObject?.info.webExMeetingId || webexMeetingInfo?.meetingNumber;\n this.meetingJoinUrl = webexMeetingInfo?.meetingJoinUrl;\n }\n this.owner =\n locusMeetingObject?.info.owner ||\n webexMeetingInfo?.owner ||\n webexMeetingInfo?.hostId ||\n this.owner;\n this.permissionToken = webexMeetingInfo?.permissionToken;\n }\n }\n\n /**\n * Sets the first locus info on the class instance\n * @param {Object} locus\n * @param {String} locus.url\n * @param {Array} locus.participants\n * @param {Object} locus.self\n * @returns {undefined}\n * @private\n * @memberof Meeting\n */\n private parseLocus(locus: {url: string; participants: Array<any>; self: object}) {\n if (locus) {\n this.locusUrl = locus.url;\n // TODO: move this to parse participants module\n this.setLocus(locus);\n\n // check if we can extract this info from partner\n // Parsing of locus object must be finished at this state\n if (locus.participants && locus.self) {\n this.partner = MeetingUtil.getLocusPartner(locus.participants, locus.self);\n }\n\n // For webex meeting the sipUrl gets updated in info parser\n if (!this.sipUri && this.partner && this.type === _CALL_) {\n this.setSipUri(this.partner.person.sipUrl || this.partner.person.id);\n }\n }\n }\n\n /**\n * Sets the sip uri on the class instance\n * uses meeting info as precedence\n * @param {String} sipUri\n * @returns {undefined}\n * @private\n * @memberof Meeting\n */\n setSipUri(sipUri: string) {\n // This can be tel no, device id or a sip uri, user Id\n this.sipUri = sipUri;\n }\n\n /**\n * Set the locus info the class instance\n * @param {Object} locus\n * @param {Array} locus.mediaConnections\n * @param {String} locus.locusUrl\n * @param {String} locus.locusId\n * @param {String} locus.mediaId\n * @param {Object} locus.host\n * @todo change name to genertic parser\n * @returns {undefined}\n * @private\n * @memberof Meeting\n */\n private setLocus(\n locus:\n | {\n mediaConnections: Array<any>;\n locusUrl: string;\n locusId: string;\n mediaId: string;\n host: object;\n }\n | any\n ) {\n const mtgLocus: any = locus.locus || locus;\n\n // LocusInfo object saves the locus object\n // this.locus = mtgLocus;\n this.mediaConnections = locus.mediaConnections;\n this.locusUrl = locus.locusUrl || locus.url;\n this.locusId = locus.locusId;\n this.selfId = locus.selfId;\n this.mediaId = locus.mediaId;\n this.hostId = mtgLocus.host ? mtgLocus.host.id : this.hostId;\n this.locusInfo.initialSetup(mtgLocus);\n }\n\n /**\n * Upload logs for the current meeting\n * @param {object} options file name and function name\n * @returns {undefined}\n * @public\n * @memberof Meeting\n */\n public uploadLogs(options: object = {file: 'meeting/index', function: 'uploadLogs'}) {\n Trigger.trigger(this, options, EVENTS.REQUEST_UPLOAD_LOGS, this);\n }\n\n /**\n * Removes remote audio and video stream on the class instance and triggers an event\n * to developers\n * @returns {undefined}\n * @public\n * @memberof Meeting\n * @deprecated after v1.89.3\n */\n public unsetRemoteStream() {\n LoggerProxy.logger.warn(\n 'Meeting:index#unsetRemoteStream --> [DEPRECATION WARNING]: unsetRemoteStream has been deprecated after v1.89.3'\n );\n this.mediaProperties.unsetRemoteMedia();\n }\n\n /**\n * Removes remote audio, video and share tracks from class instance's mediaProperties\n * @returns {undefined}\n */\n unsetRemoteTracks() {\n this.mediaProperties.unsetRemoteTracks();\n }\n\n /**\n * Removes the remote stream on the class instance and triggers an event\n * to developers\n * @returns {undefined}\n * @public\n * @memberof Meeting\n * @deprecated after v1.89.3\n */\n public closeRemoteStream() {\n LoggerProxy.logger.warn(\n 'Meeting:index#closeRemoteStream --> [DEPRECATION WARNING]: closeRemoteStream has been deprecated after v1.89.3'\n );\n this.closeRemoteTracks();\n }\n\n /**\n * Removes the remote tracks on the class instance and triggers an event\n * to developers\n * @returns {undefined}\n * @memberof Meeting\n */\n closeRemoteTracks() {\n const {remoteAudioTrack, remoteVideoTrack, remoteShare} = this.mediaProperties;\n\n /**\n * Triggers an event to the developer\n * @param {string} mediaType Type of media that was stopped\n * @returns {void}\n * @inner\n */\n // eslint-disable-next-line @typescript-eslint/no-shadow\n const triggerMediaStoppedEvent = (mediaType: string) => {\n Trigger.trigger(\n this,\n {\n file: 'meeting/index',\n function: 'closeRemoteTracks',\n },\n EVENT_TRIGGERS.MEDIA_STOPPED,\n {\n type: mediaType,\n }\n );\n };\n\n /**\n * Stops a media track and emits an event\n * @param {MediaStreamTrack} track Media track to stop\n * @param {string} type Media track type\n * @returns {Promise}\n * @inner\n */\n // eslint-disable-next-line arrow-body-style\n const stopTrack = (track: MediaStreamTrack, type: string) => {\n return Media.stopTracks(track).then(() => {\n const isTrackStopped = track && track.readyState === ENDED;\n const isWrongReadyState = track && !isTrackStopped;\n\n if (isTrackStopped) {\n triggerMediaStoppedEvent(type);\n } else if (isWrongReadyState) {\n LoggerProxy.logger.warn(\n `Meeting:index#closeRemoteTracks --> Error: MediaStreamTrack.readyState is ${track.readyState} for ${type}`\n );\n }\n });\n };\n\n return Promise.all([\n stopTrack(remoteAudioTrack, EVENT_TYPES.REMOTE_AUDIO),\n stopTrack(remoteVideoTrack, EVENT_TYPES.REMOTE_VIDEO),\n stopTrack(remoteShare, EVENT_TYPES.REMOTE_SHARE),\n ]);\n }\n\n /**\n * Emits the 'media:ready' event with a local stream that consists of 1 local audio and 1 local video track\n * @returns {undefined}\n * @private\n * @memberof Meeting\n */\n private sendLocalMediaReadyEvent() {\n Trigger.trigger(\n this,\n {\n file: 'meeting/index',\n function: 'sendLocalMediaReadyEvent',\n },\n EVENT_TRIGGERS.MEDIA_READY,\n {\n type: EVENT_TYPES.LOCAL,\n stream: MediaUtil.createMediaStream([\n this.mediaProperties.audioTrack?.underlyingTrack,\n this.mediaProperties.videoTrack?.underlyingTrack,\n ]),\n }\n );\n }\n\n /**\n * Sets the local audio track on the class and emits an event to the developer\n * @param {MediaStreamTrack} rawAudioTrack\n * @param {Boolean} emitEvent if true, a media ready event is emitted to the developer\n * @returns {undefined}\n * @private\n * @memberof Meeting\n */\n private setLocalAudioTrack(rawAudioTrack: MediaStreamTrack | null, emitEvent = true) {\n if (rawAudioTrack) {\n const settings = rawAudioTrack.getSettings();\n\n const localMicrophoneTrack = new LocalMicrophoneTrack(\n MediaUtil.createMediaStream([rawAudioTrack])\n );\n\n this.mediaProperties.setMediaSettings('audio', {\n echoCancellation: settings.echoCancellation,\n noiseSuppression: settings.noiseSuppression,\n });\n\n LoggerProxy.logger.log(\n 'Meeting:index#setLocalAudioTrack --> Audio settings.',\n JSON.stringify(this.mediaProperties.mediaSettings.audio)\n );\n this.mediaProperties.setLocalAudioTrack(localMicrophoneTrack);\n if (this.audio) this.audio.applyClientStateLocally(this);\n } else {\n this.mediaProperties.setLocalAudioTrack(null);\n }\n\n if (emitEvent) {\n this.sendLocalMediaReadyEvent();\n }\n }\n\n /**\n * Sets the local video track on the class and emits an event to the developer\n * @param {MediaStreamTrack} rawVideoTrack\n * @param {Boolean} emitEvent if true, a media ready event is emitted to the developer\n * @returns {undefined}\n * @private\n * @memberof Meeting\n */\n private setLocalVideoTrack(rawVideoTrack: MediaStreamTrack | null, emitEvent = true) {\n if (rawVideoTrack) {\n const {aspectRatio, frameRate, height, width, deviceId} = rawVideoTrack.getSettings();\n\n const {localQualityLevel} = this.mediaProperties;\n\n const localCameraTrack = new LocalCameraTrack(MediaUtil.createMediaStream([rawVideoTrack]));\n\n if (Number(localQualityLevel.slice(0, -1)) > height) {\n LoggerProxy.logger\n .warn(`Meeting:index#setLocalVideoTrack --> Local video quality of ${localQualityLevel} not supported,\n downscaling to highest possible resolution of ${height}p`);\n\n this.mediaProperties.setLocalQualityLevel(`${height}p`);\n }\n\n this.mediaProperties.setLocalVideoTrack(localCameraTrack);\n if (this.video) this.video.applyClientStateLocally(this);\n\n this.mediaProperties.setMediaSettings('video', {\n aspectRatio,\n frameRate,\n height,\n width,\n });\n // store and save the selected video input device\n if (deviceId) {\n this.mediaProperties.setVideoDeviceId(deviceId);\n }\n LoggerProxy.logger.log(\n 'Meeting:index#setLocalVideoTrack --> Video settings.',\n JSON.stringify(this.mediaProperties.mediaSettings.video)\n );\n } else {\n this.mediaProperties.setLocalVideoTrack(null);\n }\n\n if (emitEvent) {\n this.sendLocalMediaReadyEvent();\n }\n }\n\n /**\n * Sets the local media stream on the class and emits an event to the developer\n * @param {Stream} localStream the local media stream\n * @returns {undefined}\n * @public\n * @memberof Meeting\n */\n public setLocalTracks(localStream: any) {\n if (localStream) {\n if (this.isMultistream) {\n throw new Error(\n 'addMedia() and updateMedia() APIs are not supported with multistream, use publishTracks/unpublishTracks instead'\n );\n }\n\n const {audioTrack, videoTrack} = MeetingUtil.getTrack(localStream);\n\n this.setLocalAudioTrack(audioTrack, false);\n this.setLocalVideoTrack(videoTrack, false);\n\n this.sendLocalMediaReadyEvent();\n }\n }\n\n /**\n * Sets the local media stream on the class and emits an event to the developer\n * @param {MediaStreamTrack} rawLocalShareTrack the local share media track\n * @returns {undefined}\n * @public\n * @memberof Meeting\n */\n public setLocalShareTrack(rawLocalShareTrack: MediaStreamTrack | null) {\n if (rawLocalShareTrack) {\n const settings = rawLocalShareTrack.getSettings();\n\n const localDisplayTrack = new LocalDisplayTrack(\n MediaUtil.createMediaStream([rawLocalShareTrack])\n );\n\n this.mediaProperties.setLocalShareTrack(localDisplayTrack);\n\n this.mediaProperties.setMediaSettings('screen', {\n aspectRatio: settings.aspectRatio,\n frameRate: settings.frameRate,\n height: settings.height,\n width: settings.width,\n // @ts-ignore\n displaySurface: settings.displaySurface,\n // @ts-ignore\n cursor: settings.cursor,\n });\n LoggerProxy.logger.log(\n 'Meeting:index#setLocalShareTrack --> Screen settings.',\n JSON.stringify(this.mediaProperties.mediaSettings.screen)\n );\n\n localDisplayTrack.on(LocalTrackEvents.Ended, this.handleShareTrackEnded);\n\n Trigger.trigger(\n this,\n {\n file: 'meeting/index',\n function: 'setLocalShareTrack',\n },\n EVENT_TRIGGERS.MEDIA_READY,\n {\n type: EVENT_TYPES.LOCAL_SHARE,\n track: rawLocalShareTrack,\n }\n );\n } else if (this.mediaProperties.shareTrack) {\n this.mediaProperties.shareTrack.off(LocalTrackEvents.Ended, this.handleShareTrackEnded);\n this.mediaProperties.shareTrack.stop(); // todo: this line should be removed once SPARK-399694 are SPARK-399695 are done\n this.mediaProperties.setLocalShareTrack(null);\n }\n }\n\n /**\n * Closes the local stream from the class and emits an event to the developer\n * @returns {undefined}\n * @event media:stopped\n * @public\n * @memberof Meeting\n */\n public closeLocalStream() {\n const {audioTrack, videoTrack} = this.mediaProperties;\n\n return Media.stopTracks(audioTrack)\n .then(() => Media.stopTracks(videoTrack))\n .then(() => {\n if (audioTrack || videoTrack) {\n Trigger.trigger(\n this,\n {\n file: 'meeting/index',\n function: 'closeLocalStream',\n },\n EVENT_TRIGGERS.MEDIA_STOPPED,\n {\n type: EVENT_TYPES.LOCAL,\n }\n );\n }\n });\n }\n\n /**\n * Closes the local stream from the class and emits an event to the developer\n * @returns {undefined}\n * @event media:stopped\n * @public\n * @memberof Meeting\n */\n public closeLocalShare() {\n const track = this.mediaProperties.shareTrack;\n\n return Media.stopTracks(track).then(() => {\n if (track) {\n Trigger.trigger(\n this,\n {\n file: 'meeting/index',\n function: 'closeLocalShare',\n },\n EVENT_TRIGGERS.MEDIA_STOPPED,\n {\n type: EVENT_TYPES.LOCAL_SHARE,\n }\n );\n }\n });\n }\n\n /**\n * Removes the local stream from the class and emits an event to the developer\n * @returns {undefined}\n * @public\n * @memberof Meeting\n */\n public unsetLocalVideoTrack() {\n this.mediaProperties.unsetLocalVideoTrack();\n }\n\n /**\n * Removes the local share from the class and emits an event to the developer\n * @returns {undefined}\n * @public\n * @memberof Meeting\n */\n public unsetLocalShareTrack() {\n this.mediaProperties.unsetLocalShareTrack();\n }\n\n /**\n * sets up listner for mercury event\n * @returns {undefined}\n * @public\n * @memberof Meeting\n */\n public setMercuryListener() {\n // Client will have a socket manager and handle reconnecting to mercury, when we reconnect to mercury\n // if the meeting has active peer connections, it should try to reconnect.\n // @ts-ignore\n this.webex.internal.mercury.on(ONLINE, () => {\n LoggerProxy.logger.info('Meeting:index#setMercuryListener --> Web socket online');\n\n // Only send restore event when it was disconnected before and for connected later\n if (!this.hasWebsocketConnected) {\n Metrics.postEvent({\n event: eventType.MERCURY_CONNECTION_RESTORED,\n meeting: this,\n });\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.MERCURY_CONNECTION_RESTORED, {\n correlation_id: this.correlationId,\n });\n }\n this.hasWebsocketConnected = true;\n });\n\n // @ts-ignore\n this.webex.internal.mercury.on(OFFLINE, () => {\n LoggerProxy.logger.error('Meeting:index#setMercuryListener --> Web socket offline');\n Metrics.postEvent({\n event: eventType.MERCURY_CONNECTION_LOST,\n meeting: this,\n });\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.MERCURY_CONNECTION_FAILURE, {\n correlation_id: this.correlationId,\n });\n });\n }\n\n /**\n * Close the peer connections and remove them from the class.\n * Cleanup any media connection related things.\n *\n * @returns {Promise}\n * @public\n * @memberof Meeting\n */\n public closePeerConnections() {\n if (this.mediaProperties.webrtcMediaConnection) {\n if (this.remoteMediaManager) {\n this.remoteMediaManager.stop();\n this.remoteMediaManager = null;\n }\n\n Object.values(this.mediaRequestManagers).forEach((mediaRequestManager) =>\n mediaRequestManager.reset()\n );\n\n this.receiveSlotManager.reset();\n this.mediaProperties.webrtcMediaConnection.close();\n }\n\n return Promise.resolve();\n }\n\n /**\n * Unsets the peer connections on the class\n * warning DO NOT CALL WITHOUT CLOSING PEER CONNECTIONS FIRST\n * @returns {undefined}\n * @public\n * @memberof Meeting\n */\n public unsetPeerConnections() {\n this.mediaProperties.unsetPeerConnection();\n // @ts-ignore - config coming from registerPlugin\n if (this.config.reconnection.detection) {\n // @ts-ignore\n this.webex.internal.mercury.off(ONLINE);\n }\n }\n\n /**\n * Convenience method to set the correlation id for the Meeting\n * @param {String} id correlation id to set on the class\n * @returns {undefined}\n * @private\n * @memberof Meeting\n */\n private setCorrelationId(id: string) {\n this.correlationId = id;\n }\n\n /**\n * Mute the audio for a meeting\n * @returns {Promise} resolves the data from muting audio {mute, self} or rejects if there is no audio set\n * @public\n * @memberof Meeting\n */\n public muteAudio() {\n if (!MeetingUtil.isUserInJoinedState(this.locusInfo)) {\n return Promise.reject(new UserNotJoinedError());\n }\n\n // @ts-ignore\n if (!this.mediaId) {\n // Happens when addMedia and mute are triggered in succession\n return Promise.reject(new NoMediaEstablishedYetError());\n }\n\n if (!this.audio) {\n return Promise.reject(new ParameterError('no audio control associated to the meeting'));\n }\n\n // First, stop sending the local audio media\n return logRequest(\n this.audio\n .handleClientRequest(this, true)\n .then(() => {\n MeetingUtil.handleAudioLogging(this.mediaProperties.audioTrack);\n Metrics.postEvent({\n event: eventType.MUTED,\n meeting: this,\n data: {trigger: trigger.USER_INTERACTION, mediaType: MetricsMediaType.AUDIO},\n });\n })\n .catch((error) => {\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.MUTE_AUDIO_FAILURE, {\n correlation_id: this.correlationId,\n locus_id: this.locusUrl.split('/').pop(),\n reason: error.message,\n stack: error.stack,\n });\n\n throw error;\n }),\n {\n logText: `Meeting:index#muteAudio --> correlationId=${this.correlationId} muting audio`,\n }\n );\n }\n\n /**\n * Unmute meeting audio\n * @returns {Promise} resolves data from muting audio {mute, self} or rejects if there is no audio set\n * @public\n * @memberof Meeting\n */\n public unmuteAudio() {\n if (!MeetingUtil.isUserInJoinedState(this.locusInfo)) {\n return Promise.reject(new UserNotJoinedError());\n }\n\n // @ts-ignore\n if (!this.mediaId) {\n // Happens when addMedia and mute are triggered in succession\n return Promise.reject(new NoMediaEstablishedYetError());\n }\n\n if (!this.audio) {\n return Promise.reject(new ParameterError('no audio control associated to the meeting'));\n }\n\n // First, send the control to unmute the participant on the server\n return logRequest(\n this.audio\n .handleClientRequest(this, false)\n .then(() => {\n MeetingUtil.handleAudioLogging(this.mediaProperties.audioTrack);\n Metrics.postEvent({\n event: eventType.UNMUTED,\n meeting: this,\n data: {trigger: trigger.USER_INTERACTION, mediaType: MetricsMediaType.AUDIO},\n });\n })\n .catch((error) => {\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.UNMUTE_AUDIO_FAILURE, {\n correlation_id: this.correlationId,\n locus_id: this.locusUrl.split('/').pop(),\n reason: error.message,\n stack: error.stack,\n });\n\n throw error;\n }),\n {\n logText: `Meeting:index#unmuteAudio --> correlationId=${this.correlationId} unmuting audio`,\n }\n );\n }\n\n /**\n * Mute the video for a meeting\n * @returns {Promise} resolves data from muting video {mute, self} or rejects if there is no video set\n * @public\n * @memberof Meeting\n */\n public muteVideo() {\n if (!MeetingUtil.isUserInJoinedState(this.locusInfo)) {\n return Promise.reject(new UserNotJoinedError());\n }\n\n // @ts-ignore\n if (!this.mediaId) {\n // Happens when addMedia and mute are triggered in succession\n return Promise.reject(new NoMediaEstablishedYetError());\n }\n\n if (!this.video) {\n return Promise.reject(new ParameterError('no video control associated to the meeting'));\n }\n\n return logRequest(\n this.video\n .handleClientRequest(this, true)\n .then(() => {\n MeetingUtil.handleVideoLogging(this.mediaProperties.videoTrack);\n Metrics.postEvent({\n event: eventType.MUTED,\n meeting: this,\n data: {trigger: trigger.USER_INTERACTION, mediaType: MetricsMediaType.VIDEO},\n });\n })\n .catch((error) => {\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.MUTE_VIDEO_FAILURE, {\n correlation_id: this.correlationId,\n locus_id: this.locusUrl.split('/').pop(),\n reason: error.message,\n stack: error.stack,\n });\n\n throw error;\n }),\n {\n logText: `Meeting:index#muteVideo --> correlationId=${this.correlationId} muting video`,\n }\n );\n }\n\n /**\n * Unmute meeting video\n * @returns {Promise} resolves data from muting video {mute, self} or rejects if there is no video set\n * @public\n * @memberof Meeting\n */\n public unmuteVideo() {\n if (!MeetingUtil.isUserInJoinedState(this.locusInfo)) {\n return Promise.reject(new UserNotJoinedError());\n }\n\n // @ts-ignore\n if (!this.mediaId) {\n // Happens when addMedia and mute are triggered in succession\n return Promise.reject(new NoMediaEstablishedYetError());\n }\n\n if (!this.video) {\n return Promise.reject(new ParameterError('no audio control associated to the meeting'));\n }\n\n return logRequest(\n this.video\n .handleClientRequest(this, false)\n .then(() => {\n MeetingUtil.handleVideoLogging(this.mediaProperties.videoTrack);\n Metrics.postEvent({\n event: eventType.UNMUTED,\n meeting: this,\n data: {trigger: trigger.USER_INTERACTION, mediaType: MetricsMediaType.VIDEO},\n });\n })\n .catch((error) => {\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.UNMUTE_VIDEO_FAILURE, {\n correlation_id: this.correlationId,\n locus_id: this.locusUrl.split('/').pop(),\n reason: error.message,\n stack: error.stack,\n });\n\n throw error;\n }),\n {\n logText: `Meeting:index#unmuteVideo --> correlationId=${this.correlationId} unmuting video`,\n }\n );\n }\n\n /**\n * Shorthand function to join AND set up media\n * @param {Object} options - options to join with media\n * @param {JoinOptions} [options.joinOptions] - see #join()\n * @param {MediaDirection} options.mediaSettings - see #addMedia()\n * @param {AudioVideo} [options.audioVideoOptions] - see #getMediaStreams()\n * @returns {Promise} -- {join: see join(), media: see addMedia(), local: see getMediaStreams()}\n * @public\n * @memberof Meeting\n * @example\n * joinWithMedia({\n * joinOptions: {resourceId: 'resourceId' },\n * mediaSettings: {\n * sendAudio: true,\n * sendVideo: true,\n * sendShare: false,\n * receiveVideo:true,\n * receiveAudio: true,\n * receiveShare: true\n * }\n * audioVideoOptions: {\n * audio: 'audioDeviceId',\n * video: 'videoDeviceId'\n * }})\n */\n public joinWithMedia(\n options: {\n joinOptions?: any;\n mediaSettings: any;\n audioVideoOptions?: any;\n } = {} as any\n ) {\n // TODO: add validations for parameters\n const {mediaSettings, joinOptions, audioVideoOptions} = options;\n\n return this.join(joinOptions)\n .then((joinResponse) =>\n this.getMediaStreams(mediaSettings, audioVideoOptions).then(([localStream, localShare]) =>\n this.addMedia({\n mediaSettings,\n localShare,\n localStream,\n }).then((mediaResponse) => ({\n join: joinResponse,\n media: mediaResponse,\n local: [localStream, localShare],\n }))\n )\n )\n .catch((error) => {\n LoggerProxy.logger.error('Meeting:index#joinWithMedia --> ', error);\n\n Metrics.sendBehavioralMetric(\n BEHAVIORAL_METRICS.JOIN_WITH_MEDIA_FAILURE,\n {\n correlation_id: this.correlationId,\n locus_id: this.locusUrl.split('/').pop(),\n reason: error.message,\n stack: error.stack,\n },\n {\n type: error.name,\n }\n );\n\n return Promise.reject(error);\n });\n }\n\n /**\n * Initiates the reconnection of the media in the meeting\n *\n * @param {object} options\n * @returns {Promise} resolves with {reconnect} or errors with {error}\n * @public\n * @memberof Meeting\n */\n public reconnect(options?: object) {\n LoggerProxy.logger.log(\n `Meeting:index#reconnect --> attempting to reconnect meeting ${this.id}`\n );\n\n if (!this.reconnectionManager || !this.reconnectionManager.reconnect) {\n return Promise.reject(\n new ParameterError('Cannot reconnect, ReconnectionManager must first be defined.')\n );\n }\n\n // @ts-ignore - currentMediaStatus coming from SelfUtil\n if (!MeetingUtil.isMediaEstablished(this.currentMediaStatus)) {\n return Promise.reject(\n new ParameterError('Cannot reconnect, Media has not established to reconnect')\n );\n }\n\n try {\n LoggerProxy.logger.info('Meeting:index#reconnect --> Validating reconnect ability.');\n // @ts-ignore\n this.reconnectionManager.validate();\n } catch (error) {\n // Unable to reconnect this call\n if (error instanceof ReconnectInProgress) {\n LoggerProxy.logger.info(\n 'Meeting:index#reconnect --> Unable to reconnect, reconnection in progress.'\n );\n } else {\n LoggerProxy.logger.log('Meeting:index#reconnect --> Unable to reconnect.', error);\n }\n\n return Promise.resolve();\n }\n\n Trigger.trigger(\n this,\n {\n file: 'meeting/index',\n function: 'reconnect',\n },\n EVENT_TRIGGERS.MEETING_RECONNECTION_STARTING\n );\n\n return this.reconnectionManager\n .reconnect(options)\n .then(() => {\n Trigger.trigger(\n this,\n {\n file: 'meeting/index',\n function: 'reconnect',\n },\n EVENT_TRIGGERS.MEETING_RECONNECTION_SUCCESS\n );\n LoggerProxy.logger.log('Meeting:index#reconnect --> Meeting reconnect success');\n })\n .catch((error) => {\n Trigger.trigger(\n this,\n {\n file: 'meeting/index',\n function: 'reconnect',\n },\n EVENT_TRIGGERS.MEETING_RECONNECTION_FAILURE,\n {\n error: new ReconnectionError('Reconnection failure event', error),\n }\n );\n\n LoggerProxy.logger.error('Meeting:index#reconnect --> Meeting reconnect failed', error);\n\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.MEETING_RECONNECT_FAILURE, {\n correlation_id: this.correlationId,\n locus_id: this.locusUrl.split('/').pop(),\n reason: error.message,\n stack: error.stack,\n });\n\n this.uploadLogs({\n file: 'meeting/index',\n function: 'reconnect',\n });\n\n return Promise.reject(new ReconnectionError('Reconnection failure event', error));\n })\n .finally(() => {\n this.reconnectionManager.reset();\n });\n }\n\n /**\n * Check if the meeting supports the Webex Assistant feature\n * @returns {boolean}\n * @throws TranscriptionNotSupportedError\n */\n isTranscriptionSupported() {\n if (this.locusInfo.controls.transcribe?.transcribing) {\n return true;\n }\n\n LoggerProxy.logger.error(\n 'Meeting:index#isTranscriptionSupported --> Webex Assistant is not supported'\n );\n\n return false;\n }\n\n /**\n * Check if the meeting supports the Reactions\n * @returns {boolean}\n */\n isReactionsSupported() {\n if (this.locusInfo?.controls?.reactions.enabled) {\n return true;\n }\n\n LoggerProxy.logger.error('Meeting:index#isReactionsSupported --> Reactions is not supported');\n\n return false;\n }\n\n /**\n * Monitor the Low-Latency Mercury (LLM) web socket connection on `onError` and `onClose` states\n * @private\n * @returns {void}\n */\n private monitorTranscriptionSocketConnection() {\n this.transcription.onCloseSocket((event) => {\n LoggerProxy.logger.info(\n `Meeting:index#onCloseSocket -->\n unable to continue receiving transcription;\n low-latency mercury web socket connection is closed now.\n ${event}`\n );\n\n this.triggerStopReceivingTranscriptionEvent();\n });\n\n this.transcription.onErrorSocket((event) => {\n LoggerProxy.logger.error(\n `Meeting:index#onErrorSocket -->\n unable to continue receiving transcription;\n low-latency mercury web socket connection error had occured.\n ${event}`\n );\n\n this.triggerStopReceivingTranscriptionEvent();\n\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.RECEIVE_TRANSCRIPTION_FAILURE, {\n correlation_id: this.correlationId,\n reason: 'unexpected error: transcription LLM web socket connection error had occured.',\n event,\n });\n });\n }\n\n /**\n * Request for a WebSocket Url, open and monitor the WebSocket connection\n * @private\n * @returns {Promise<void>} a promise to open the WebSocket connection\n */\n private async receiveTranscription() {\n LoggerProxy.logger.info(\n `Meeting:index#receiveTranscription -->\n Attempting to generate a web socket url.`\n );\n\n try {\n const {datachannelUrl} = this.locusInfo.info;\n // @ts-ignore - fix type\n const {\n body: {webSocketUrl},\n // @ts-ignore\n } = await this.request({\n method: HTTP_VERBS.POST,\n uri: datachannelUrl,\n body: {deviceUrl: this.deviceUrl},\n });\n\n LoggerProxy.logger.info(\n `Meeting:index#receiveTranscription -->\n Generated web socket url succesfully.`\n );\n\n this.transcription = new Transcription(\n webSocketUrl,\n // @ts-ignore - fix type\n this.webex.sessionId,\n this.members\n );\n\n LoggerProxy.logger.info(\n `Meeting:index#receiveTranscription -->\n opened LLM web socket connection successfully.`\n );\n\n // retrieve and pass the payload\n this.transcription.subscribe((payload) => {\n Trigger.trigger(\n this,\n {\n file: 'meeting/index',\n function: 'join',\n },\n EVENT_TRIGGERS.MEETING_STARTED_RECEIVING_TRANSCRIPTION,\n payload\n );\n });\n\n this.monitorTranscriptionSocketConnection();\n // @ts-ignore - fix type\n this.transcription.connect(this.webex.credentials.supertoken.access_token);\n } catch (error) {\n LoggerProxy.logger.error(`Meeting:index#receiveTranscription --> ${error}`);\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.RECEIVE_TRANSCRIPTION_FAILURE, {\n correlation_id: this.correlationId,\n reason: error.message,\n stack: error.stack,\n });\n }\n }\n\n /**\n * Callback called when a relay event is received from meeting LLM Connection\n * @param {RelayEvent} e Event object coming from LLM Connection\n * @private\n * @returns {void}\n */\n private processRelayEvent = (e: RelayEvent): void => {\n switch (e.data.relayType) {\n case REACTION_RELAY_TYPES.REACTION:\n if (\n // @ts-ignore - config coming from registerPlugin\n (this.config.receiveReactions || options.receiveReactions) &&\n this.isReactionsSupported()\n ) {\n const {name} = this.members.membersCollection.get(e.data.sender.participantId);\n const processedReaction: ProcessedReaction = {\n reaction: e.data.reaction,\n sender: {\n id: e.data.sender.participantId,\n name,\n },\n };\n Trigger.trigger(\n this,\n {\n file: 'meeting/index',\n function: 'join',\n },\n EVENT_TRIGGERS.MEETING_RECEIVE_REACTIONS,\n processedReaction\n );\n }\n break;\n default:\n break;\n }\n };\n\n /**\n * stop recieving Transcription by closing\n * the web socket connection properly\n * @returns {void}\n */\n stopReceivingTranscription() {\n if (this.transcription) {\n this.transcription.closeSocket();\n }\n }\n\n /**\n * triggers an event to notify that the user\n * will not receive any more transcription\n * @private\n * @returns{void}\n */\n private triggerStopReceivingTranscriptionEvent() {\n LoggerProxy.logger.info(`\n Meeting:index#stopReceivingTranscription -->\n closed transcription LLM web socket connection successfully.`);\n\n Trigger.trigger(\n this,\n {\n file: 'meeting',\n function: 'triggerStopReceivingTranscriptionEvent',\n },\n EVENT_TRIGGERS.MEETING_STOPPED_RECEIVING_TRANSCRIPTION\n );\n }\n\n /**\n * Specify joining via audio (option: pstn), video, screenshare\n * @param {JoinOptions} options A configurable options object for joining a meeting\n * @returns {Promise} the join response\n * @public\n * @memberof Meeting\n * Scenario A: Joining own claimed personal meeting room\n * Scenario B: Joining other's claimed personal meeting room, do pass pin (if desired to join as host, or nullify), do pass moderator\n * Scenario C: Joining an unclaimed personal meeting room, -do not- pass pin or moderator on first try, -do- pass pin and moderator\n * if joining as host on second loop, pass pin and pass moderator if joining as guest on second loop\n * Scenario D: Joining any other way (sip, pstn, conversationUrl, link just need to specify resourceId)\n */\n public join(options: any = {}) {\n // @ts-ignore - fix type\n if (!this.webex.meetings.registered) {\n const errorMessage = 'Meeting:index#join --> Device not registered';\n const error = new Error(errorMessage);\n\n LoggerProxy.logger.error(errorMessage);\n\n return Promise.reject(error);\n }\n\n // If a join request is being processed, refer to the deferred promise.\n if (this.deferJoin) {\n return this.deferJoin;\n }\n\n // Scope-up the resolve/reject methods for handling within join().\n let joinFailed;\n let joinSuccess;\n\n // Create a deferred promise for a consistent resolve value from utils.\n // This also prevents redundant API calls.\n this.deferJoin = new Promise((resolve, reject) => {\n joinFailed = reject;\n joinSuccess = resolve;\n });\n\n if (!this.hasJoinedOnce) {\n this.hasJoinedOnce = true;\n } else {\n LoggerProxy.logger.log(\n `Meeting:index#join --> Generating a new correlation id for meeting ${this.id}`\n );\n LoggerProxy.logger.log(\n `Meeting:index#join --> Previous correlation id ${this.correlationId}`\n );\n this.setCorrelationId(uuid.v4());\n LoggerProxy.logger.log(`Meeting:index#join --> New correlation id ${this.correlationId}`);\n }\n\n if (options.rejoin) {\n this.meetingFiniteStateMachine.reset();\n }\n\n Metrics.postEvent({\n event: eventType.CALL_INITIATED,\n meeting: this,\n data: {trigger: trigger.USER_INTERACTION, isRoapCallEnabled: true},\n });\n\n LoggerProxy.logger.log('Meeting:index#join --> Joining a meeting');\n\n if (this.meetingFiniteStateMachine.state === MEETING_STATE_MACHINE.STATES.ENDED) {\n this.meetingFiniteStateMachine.reset();\n }\n if (this.meetingFiniteStateMachine.state !== MEETING_STATE_MACHINE.STATES.RINGING) {\n this.meetingFiniteStateMachine.ring(_JOIN_);\n }\n\n // TODO: does this really need to be here?\n if (options.resourceId && this.destination && options.resourceId === this.destination) {\n this.wirelessShare = true;\n }\n\n if (options.meetingQuality) {\n if (typeof options.meetingQuality === 'string') {\n if (!QUALITY_LEVELS[options.meetingQuality]) {\n const errorMessage = `Meeting:index#join --> ${options.meetingQuality} not defined`;\n const error = new Error(errorMessage);\n\n LoggerProxy.logger.error(errorMessage);\n\n joinFailed(error);\n this.deferJoin = undefined;\n\n return Promise.reject(error);\n }\n\n this.mediaProperties.setLocalQualityLevel(options.meetingQuality);\n this.mediaProperties.setRemoteQualityLevel(options.meetingQuality);\n }\n\n if (typeof options.meetingQuality === 'object') {\n if (\n !QUALITY_LEVELS[options.meetingQuality.local] &&\n !QUALITY_LEVELS[options.meetingQuality.remote]\n ) {\n const errorMessage = `Meeting:index#join --> ${\n options.meetingQuality.local || options.meetingQuality.remote\n } not defined`;\n\n LoggerProxy.logger.error(errorMessage);\n\n const error = new Error(errorMessage);\n\n joinFailed(error);\n this.deferJoin = undefined;\n\n return Promise.reject(new Error(errorMessage));\n }\n\n if (options.meetingQuality.local) {\n this.mediaProperties.setLocalQualityLevel(options.meetingQuality.local);\n }\n if (options.meetingQuality.remote) {\n this.mediaProperties.setRemoteQualityLevel(options.meetingQuality.remote);\n }\n }\n }\n\n this.isMultistream = !!options.enableMultistream;\n\n return MeetingUtil.joinMeetingOptions(this, options)\n .then((join) => {\n this.meetingFiniteStateMachine.join();\n LoggerProxy.logger.log('Meeting:index#join --> Success');\n\n return join;\n })\n .then((join) => {\n joinSuccess(join);\n this.deferJoin = undefined;\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.JOIN_SUCCESS, {\n correlation_id: this.correlationId,\n });\n\n return join;\n })\n .then(async (join) => {\n // @ts-ignore - config coming from registerPlugin\n if (this.config.enableAutomaticLLM) {\n await this.updateLLMConnection();\n // @ts-ignore - Fix type\n this.webex.internal.llm.on('event:relay.event', this.processRelayEvent);\n LoggerProxy.logger.info('Meeting:index#join --> enabled to receive relay events!');\n }\n\n return join;\n })\n .then(async (join) => {\n if (isBrowser) {\n // @ts-ignore - config coming from registerPlugin\n if (this.config.receiveTranscription || options.receiveTranscription) {\n if (this.isTranscriptionSupported()) {\n await this.receiveTranscription();\n LoggerProxy.logger.info('Meeting:index#join --> enabled to recieve transcription!');\n }\n }\n } else {\n LoggerProxy.logger.error(\n 'Meeting:index#join --> Receving transcription is not supported on this platform'\n );\n }\n\n return join;\n })\n .catch((error) => {\n this.meetingFiniteStateMachine.fail(error);\n LoggerProxy.logger.error('Meeting:index#join --> Failed', error);\n\n Metrics.postEvent({\n event: eventType.LOCUS_JOIN_RESPONSE,\n meeting: this,\n meetingId: this.id,\n data: {\n errors: [Metrics.parseLocusError(error.error, true)],\n },\n });\n\n // TODO: change this to error codes and pre defined dictionary\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.JOIN_FAILURE, {\n correlation_id: this.correlationId,\n reason: error.error?.message,\n stack: error.stack,\n });\n\n // Upload logs on join Failure\n Trigger.trigger(\n this,\n {\n file: 'meeting/index',\n function: 'join',\n },\n EVENTS.REQUEST_UPLOAD_LOGS,\n this\n );\n\n joinFailed(error);\n this.deferJoin = undefined;\n\n return Promise.reject(error);\n });\n }\n\n /**\n * Connects to low latency mercury and reconnects if the address has changed\n * It will also disconnect if called when the meeting has ended\n * @param {String} datachannelUrl\n * @returns {Promise}\n */\n async updateLLMConnection() {\n // @ts-ignore - Fix type\n const {url, info: {datachannelUrl} = {}} = this.locusInfo;\n\n const isJoined = this.joinedWith && this.joinedWith.state === 'JOINED';\n\n // @ts-ignore - Fix type\n if (this.webex.internal.llm.isConnected()) {\n // @ts-ignore - Fix type\n if (url === this.webex.internal.llm.getLocusUrl() && isJoined) {\n return undefined;\n }\n // @ts-ignore - Fix type\n await this.webex.internal.llm.disconnectLLM();\n // @ts-ignore - Fix type\n this.webex.internal.llm.off('event:relay.event', this.processRelayEvent);\n }\n\n if (!isJoined) {\n return undefined;\n }\n\n // @ts-ignore - Fix type\n return this.webex.internal.llm.registerAndConnect(url, datachannelUrl);\n }\n\n /**\n * Use phone for meeting audio\n * @param {String} phoneNumber If provided, it will dial-out using this number. If not provided, dial-in will be used\n * @returns {Promise} Resolves once the dial-in or dial-out request has completed, or rejects if it failed\n * @public\n * @memberof Meeting\n */\n public usePhoneAudio(phoneNumber: string) {\n if (!phoneNumber) {\n return this.dialInPstn();\n }\n\n return this.dialOutPstn(phoneNumber);\n }\n\n /**\n * Determines if the given pstnStatus is in a state which implies the phone is provisioned\n * @param {String} pstnStatus\n * @returns {Boolean}\n * @private\n * @memberof Meeting\n */\n private isPhoneProvisioned(pstnStatus: string) {\n return [PSTN_STATUS.JOINED, PSTN_STATUS.CONNECTED, PSTN_STATUS.SUCCESS].includes(pstnStatus);\n }\n\n /**\n * Enable dial-in for audio\n * @returns {Promise} Resolves once the dial-in request has completed, or rejects if it failed\n * @private\n * @memberof Meeting\n */\n private dialInPstn() {\n if (this.isPhoneProvisioned(this.dialInDeviceStatus)) return Promise.resolve(); // prevent multiple dial in devices from being provisioned\n\n const {correlationId, locusUrl} = this;\n\n if (!this.dialInUrl) this.dialInUrl = `dialin:///${uuid.v4()}`;\n\n return (\n this.meetingRequest\n // @ts-ignore\n .dialIn({\n correlationId,\n dialInUrl: this.dialInUrl,\n locusUrl,\n clientUrl: this.deviceUrl,\n })\n .then((res) => {\n this.locusInfo.onFullLocus(res.body.locus);\n })\n .catch((error) => {\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.ADD_DIAL_IN_FAILURE, {\n correlation_id: this.correlationId,\n dial_in_url: this.dialInUrl,\n locus_id: locusUrl.split('/').pop(),\n client_url: this.deviceUrl,\n reason: error.error?.message,\n stack: error.stack,\n });\n\n return Promise.reject(error);\n })\n );\n }\n\n /**\n * Enable dial-out for audio\n * @param {String} phoneNumber Phone number to dial out to\n * @returns {Promise} Resolves once the dial-out request has completed (it doesn't wait for the user to answer the phone), or rejects if it failed\n * @private\n * @memberof Meeting\n */\n private dialOutPstn(phoneNumber: string) {\n if (this.isPhoneProvisioned(this.dialOutDeviceStatus)) return Promise.resolve(); // prevent multiple dial out devices from being provisioned\n\n const {correlationId, locusUrl} = this;\n\n if (!this.dialOutUrl) this.dialOutUrl = `dialout:///${uuid.v4()}`;\n\n return (\n this.meetingRequest\n // @ts-ignore\n .dialOut({\n correlationId,\n dialOutUrl: this.dialOutUrl,\n phoneNumber,\n locusUrl,\n clientUrl: this.deviceUrl,\n })\n .then((res) => {\n this.locusInfo.onFullLocus(res.body.locus);\n })\n .catch((error) => {\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.ADD_DIAL_OUT_FAILURE, {\n correlation_id: this.correlationId,\n dial_out_url: this.dialOutUrl,\n locus_id: locusUrl.split('/').pop(),\n client_url: this.deviceUrl,\n reason: error.error?.message,\n stack: error.stack,\n });\n\n return Promise.reject(error);\n })\n );\n }\n\n /**\n * Disconnect meeting audio via phone.\n * @returns {Promise} Resolves once the phone audio disconnection has completed\n * @public\n * @memberof Meeting\n * @returns {Promise}\n */\n public disconnectPhoneAudio() {\n return Promise.all([\n this.isPhoneProvisioned(this.dialInDeviceStatus)\n ? MeetingUtil.disconnectPhoneAudio(this, this.dialInUrl)\n : Promise.resolve(),\n this.isPhoneProvisioned(this.dialOutDeviceStatus)\n ? MeetingUtil.disconnectPhoneAudio(this, this.dialOutUrl)\n : Promise.resolve(),\n ]);\n }\n\n /**\n * Moves the call to the specified resourceId\n * @param {String} resourceId\n * @returns {Promise} once the move has been completed\n * @public\n * @memberof Meeting\n */\n public moveTo(resourceId: string) {\n if (!resourceId) {\n throw new ParameterError('Cannot move call without a resourceId.');\n }\n\n Metrics.postEvent({\n event: eventType.MEDIA_CAPABILITIES,\n meeting: this,\n data: {\n mediaCapabilities: {\n rx: {\n audio: false,\n share: true,\n share_audio: false,\n video: false,\n whiteboard: false,\n },\n tx: {\n audio: false,\n share: false,\n share_audio: false,\n video: false,\n whiteboard: false,\n },\n },\n },\n });\n\n Metrics.postEvent({event: eventType.MOVE_MEDIA, meeting: this});\n\n this.locusInfo.once(LOCUSINFO.EVENTS.SELF_OBSERVING, async () => {\n // Clean up the camera , microphone track and re initiate it\n\n try {\n if (this.isSharing) {\n await this.releaseScreenShareFloor();\n }\n const mediaSettings = {\n mediaDirection: {\n sendVideo: false,\n receiveVideo: false,\n sendAudio: false,\n receiveAudio: false,\n sendShare: false,\n receiveShare: true,\n },\n };\n\n // clean up the local tracks\n this.mediaProperties.setMediaDirection(mediaSettings.mediaDirection);\n\n // close the existing local tracks\n await this.closeLocalStream();\n await this.closeLocalShare();\n\n this.mediaProperties.unsetMediaTracks();\n\n // when a move to is intiated by the client , Locus delets the existing media node from the server as soon the DX answers the meeting\n // once the DX answers we establish connection back the media server with only receiveShare enabled\n // @ts-ignore - reconnectMedia does not accept any argument\n await this.reconnectionManager.reconnectMedia(mediaSettings).then(() => {\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.MOVE_TO_SUCCESS);\n });\n } catch (error) {\n LoggerProxy.logger.error('Meeting:index#moveTo --> Failed to moveTo resourceId', error);\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.MOVE_TO_FAILURE, {\n correlation_id: this.correlationId,\n locus_id: this.locusUrl.split('/').pop(),\n reason: error.message,\n stack: error.stack,\n });\n }\n });\n\n LoggerProxy.logger.info(\n 'Meeting:index#moveTo --> Initated moved to using resourceId',\n resourceId\n );\n\n return MeetingUtil.joinMeetingOptions(this, {resourceId, moveToResource: true})\n .then(() => {\n this.meetingFiniteStateMachine.join();\n })\n .catch((error) => {\n this.meetingFiniteStateMachine.fail(error);\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.MOVE_TO_FAILURE, {\n correlation_id: this.correlationId,\n locus_id: this.locusUrl.split('/').pop(),\n reason: error.message,\n stack: error.stack,\n });\n LoggerProxy.logger.error('Meeting:index#moveTo --> Failed to moveTo resourceId', error);\n\n return Promise.reject(error);\n });\n }\n\n /**\n * Moves the call from the specified resourceId, back to computer\n * @param {String} resourceId\n * @returns {Promise} once the move has been completed\n * @public\n * @memberof Meeting\n */\n public moveFrom(resourceId: string) {\n // On moveFrom ask the developer to re capture it moveFrom then updateMedia\n if (!resourceId) {\n throw new ParameterError('Cannot move call without a resourceId.');\n }\n const oldCorrelationId = this.correlationId;\n\n Metrics.postEvent({event: eventType.MOVE_MEDIA, meeting: this});\n\n return MeetingUtil.joinMeetingOptions(this)\n .then(() =>\n MeetingUtil.leaveMeeting(this, {\n resourceId,\n correlationId: oldCorrelationId,\n moveMeeting: true,\n }).then(() => {\n this.resourceId = '';\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.MOVE_FROM_SUCCESS);\n })\n )\n .catch((error) => {\n this.meetingFiniteStateMachine.fail(error);\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.MOVE_FROM_FAILURE, {\n correlation_id: this.correlationId,\n locus_id: this.locusUrl.split('/').pop(),\n reason: error.message,\n stack: error.stack,\n });\n LoggerProxy.logger.error('Meeting:index#moveTo --> Failed to moveTo resourceId', error);\n\n return Promise.reject(error);\n });\n }\n\n /**\n * Get local media streams based on options passed\n *\n * NOTE: this method can only be used with transcoded meetings, not with multistream meetings\n *\n * @param {MediaDirection} mediaDirection A configurable options object for joining a meeting\n * @param {AudioVideo} [audioVideo] audio/video object to set audioinput and videoinput devices, see #Media.getUserMedia\n * @param {SharePreferences} [sharePreferences] audio/video object to set audioinput and videoinput devices, see #Media.getUserMedia\n * @returns {Promise} see #Media.getUserMedia\n * @public\n * @todo should be static, or moved so can be called outside of a meeting\n * @memberof Meeting\n */\n getMediaStreams = (\n mediaDirection: any,\n // This return an OBJECT {video: {height, widght}}\n // eslint-disable-next-line default-param-last\n audioVideo: any = VIDEO_RESOLUTIONS[this.mediaProperties.localQualityLevel],\n sharePreferences?: any\n ) => {\n if (\n mediaDirection &&\n (mediaDirection.sendAudio || mediaDirection.sendVideo || mediaDirection.sendShare)\n ) {\n if (\n mediaDirection &&\n mediaDirection.sendAudio &&\n mediaDirection.sendVideo &&\n mediaDirection.sendShare &&\n isBrowser('safari')\n ) {\n LoggerProxy.logger.warn(\n 'Meeting:index#getMediaStreams --> Setting `sendShare` to FALSE, due to complications with Safari'\n );\n\n mediaDirection.sendShare = false;\n\n LoggerProxy.logger.warn(\n 'Meeting:index#getMediaStreams --> Enabling `sendShare` along with `sendAudio` & `sendVideo`, on Safari, causes a failure while setting up a screen share at the same time as the camera+mic stream'\n );\n LoggerProxy.logger.warn(\n 'Meeting:index#getMediaStreams --> Please use `meeting.shareScreen()` to manually start the screen share after successfully joining the meeting'\n );\n }\n\n if (audioVideo && isString(audioVideo)) {\n if (Object.keys(VIDEO_RESOLUTIONS).includes(audioVideo)) {\n this.mediaProperties.setLocalQualityLevel(audioVideo);\n audioVideo = {video: VIDEO_RESOLUTIONS[audioVideo].video};\n } else {\n throw new ParameterError(\n `${audioVideo} not supported. Either pass level from pre-defined resolutions or pass complete audioVideo object`\n );\n }\n }\n\n if (!audioVideo.video) {\n audioVideo = {\n ...audioVideo,\n video: {\n ...audioVideo.video,\n ...VIDEO_RESOLUTIONS[this.mediaProperties.localQualityLevel].video,\n },\n };\n }\n // extract deviceId if exists otherwise default to null.\n const {deviceId: preferredVideoDevice} = (audioVideo && audioVideo.video) || {deviceId: null};\n const lastVideoDeviceId = this.mediaProperties.getVideoDeviceId();\n\n if (preferredVideoDevice) {\n // Store new preferred video input device\n this.mediaProperties.setVideoDeviceId(preferredVideoDevice);\n } else if (lastVideoDeviceId) {\n // no new video preference specified so use last stored value,\n // works with empty object {} or media constraint.\n // eslint-disable-next-line no-param-reassign\n audioVideo = {\n ...audioVideo,\n video: {\n ...audioVideo.video,\n deviceId: lastVideoDeviceId,\n },\n };\n }\n\n return Media.getSupportedDevice({\n sendAudio: mediaDirection.sendAudio,\n sendVideo: mediaDirection.sendVideo,\n })\n .catch((error) =>\n Promise.reject(\n new MediaError(\n 'Given constraints do not match permission set for either camera or microphone',\n error\n )\n )\n )\n .then((devicePermissions) =>\n Media.getUserMedia(\n {\n ...mediaDirection,\n sendAudio: devicePermissions.sendAudio,\n sendVideo: devicePermissions.sendVideo,\n isSharing: this.shareStatus === SHARE_STATUS.LOCAL_SHARE_ACTIVE,\n },\n audioVideo,\n sharePreferences,\n // @ts-ignore - config coming from registerPlugin\n this.config\n ).catch((error) => {\n // Whenever there is a failure when trying to access a user's device\n // report it as an Behavioral metric\n // This gives visibility into common errors and can help\n // with further troubleshooting\n const metricName = BEHAVIORAL_METRICS.GET_USER_MEDIA_FAILURE;\n const data = {\n correlation_id: this.correlationId,\n locus_id: this.locusUrl?.split('/').pop(),\n reason: error.message,\n stack: error.stack,\n };\n const metadata = {\n type: error.name,\n };\n\n Metrics.sendBehavioralMetric(metricName, data, metadata);\n throw new MediaError('Unable to retrieve media streams', error);\n })\n );\n }\n\n return Promise.reject(\n new MediaError('At least one of the mediaDirection value should be true')\n );\n };\n\n /**\n * Checks if the machine has at least one audio or video device\n * @param {Object} options\n * @param {Boolean} options.sendAudio\n * @param {Boolean} options.sendVideo\n * @returns {Object}\n * @memberof Meetings\n */\n getSupportedDevices = ({\n sendAudio = true,\n sendVideo = true,\n }: {\n sendAudio: boolean;\n sendVideo: boolean;\n }) => Media.getSupportedDevice({sendAudio, sendVideo});\n\n /**\n * Get the devices from the Media module\n * @returns {Promise} resolves to an array of DeviceInfo\n * @memberof Meetings\n */\n getDevices = () => Media.getDevices();\n\n /**\n * Handles ROAP_FAILURE event from the webrtc media connection\n *\n * @param {Error} error\n * @returns {void}\n */\n handleRoapFailure = (error) => {\n // eslint-disable-next-line @typescript-eslint/no-shadow\n const sendBehavioralMetric = (metricName, error, correlationId) => {\n const data = {\n code: error.code,\n correlation_id: correlationId,\n reason: error.message,\n stack: error.stack,\n };\n const metadata = {\n type: error.cause?.name || error.name,\n };\n\n Metrics.sendBehavioralMetric(metricName, data, metadata);\n };\n\n if (error instanceof Errors.SdpOfferCreationError) {\n sendBehavioralMetric(BEHAVIORAL_METRICS.PEERCONNECTION_FAILURE, error, this.id);\n\n Metrics.postEvent({\n event: eventType.LOCAL_SDP_GENERATED,\n meetingId: this.id,\n data: {\n canProceed: false,\n errors: [\n Metrics.generateErrorPayload(2001, true, MetricsError.name.MEDIA_ENGINE, undefined),\n ],\n },\n });\n } else if (\n error instanceof Errors.SdpOfferHandlingError ||\n error instanceof Errors.SdpAnswerHandlingError\n ) {\n sendBehavioralMetric(BEHAVIORAL_METRICS.PEERCONNECTION_FAILURE, error, this.id);\n\n Metrics.postEvent({\n event: eventType.REMOTE_SDP_RECEIVED,\n meetingId: this.id,\n data: {\n canProceed: false,\n errors: [\n Metrics.generateErrorPayload(2001, true, MetricsError.name.MEDIA_ENGINE, undefined),\n ],\n },\n });\n } else if (error instanceof Errors.SdpError) {\n // this covers also the case of Errors.IceGatheringError which extends Errors.SdpError\n sendBehavioralMetric(BEHAVIORAL_METRICS.INVALID_ICE_CANDIDATE, error, this.id);\n\n Metrics.postEvent({\n event: eventType.LOCAL_SDP_GENERATED,\n meetingId: this.id,\n data: {\n canProceed: false,\n errors: [\n Metrics.generateErrorPayload(2001, true, MetricsError.name.MEDIA_ENGINE, undefined),\n ],\n },\n });\n }\n };\n\n setupMediaConnectionListeners = () => {\n this.mediaProperties.webrtcMediaConnection.on(Event.ROAP_STARTED, () => {\n this.isRoapInProgress = true;\n });\n\n this.mediaProperties.webrtcMediaConnection.on(Event.ROAP_DONE, () => {\n this.mediaNegotiatedEvent();\n this.isRoapInProgress = false;\n this.processNextQueuedMediaUpdate();\n });\n\n this.mediaProperties.webrtcMediaConnection.on(Event.ROAP_FAILURE, this.handleRoapFailure);\n\n this.mediaProperties.webrtcMediaConnection.on(Event.ROAP_MESSAGE_TO_SEND, (event) => {\n const LOG_HEADER = `Meeting:index#setupMediaConnectionListeners.ROAP_MESSAGE_TO_SEND --> correlationId=${this.correlationId}`;\n\n switch (event.roapMessage.messageType) {\n case 'OK':\n Metrics.postEvent({\n event: eventType.REMOTE_SDP_RECEIVED,\n meetingId: this.id,\n });\n\n logRequest(\n this.roap.sendRoapOK({\n seq: event.roapMessage.seq,\n mediaId: this.mediaId,\n correlationId: this.correlationId,\n }),\n {\n logText: `${LOG_HEADER} Roap OK`,\n }\n );\n break;\n\n case 'OFFER':\n Metrics.postEvent({\n event: eventType.LOCAL_SDP_GENERATED,\n meetingId: this.id,\n });\n\n logRequest(\n this.roap.sendRoapMediaRequest({\n sdp: event.roapMessage.sdp,\n seq: event.roapMessage.seq,\n tieBreaker: event.roapMessage.tieBreaker,\n meeting: this, // or can pass meeting ID\n reconnect: this.reconnectionManager.isReconnectInProgress(),\n }),\n {\n logText: `${LOG_HEADER} Roap Offer`,\n }\n );\n break;\n\n case 'ANSWER':\n Metrics.postEvent({\n event: eventType.REMOTE_SDP_RECEIVED,\n meetingId: this.id,\n });\n\n logRequest(\n this.roap.sendRoapAnswer({\n sdp: event.roapMessage.sdp,\n seq: event.roapMessage.seq,\n mediaId: this.mediaId,\n correlationId: this.correlationId,\n }),\n {\n logText: `${LOG_HEADER} Roap Answer`,\n }\n ).catch((error) => {\n const metricName = BEHAVIORAL_METRICS.ROAP_ANSWER_FAILURE;\n const data = {\n correlation_id: this.correlationId,\n locus_id: this.locusUrl.split('/').pop(),\n reason: error.message,\n stack: error.stack,\n };\n const metadata = {\n type: error.name,\n };\n\n Metrics.sendBehavioralMetric(metricName, data, metadata);\n });\n break;\n\n case 'ERROR':\n if (\n event.roapMessage.errorType === ErrorType.CONFLICT ||\n event.roapMessage.errorType === ErrorType.DOUBLECONFLICT\n ) {\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.ROAP_GLARE_CONDITION, {\n correlation_id: this.correlationId,\n locus_id: this.locusUrl.split('/').pop(),\n sequence: event.roapMessage.seq,\n });\n }\n logRequest(\n this.roap.sendRoapError({\n seq: event.roapMessage.seq,\n errorType: event.roapMessage.errorType,\n mediaId: this.mediaId,\n correlationId: this.correlationId,\n }),\n {\n logText: `${LOG_HEADER} Roap Error (${event.roapMessage.errorType})`,\n }\n );\n break;\n\n default:\n LoggerProxy.logger.error(\n `${LOG_HEADER} Unsupported message type: ${event.roapMessage.messageType}`\n );\n break;\n }\n });\n\n // eslint-disable-next-line no-param-reassign\n this.mediaProperties.webrtcMediaConnection.on(Event.REMOTE_TRACK_ADDED, (event) => {\n LoggerProxy.logger.log(\n `Meeting:index#setupMediaConnectionListeners --> REMOTE_TRACK_ADDED event received for webrtcMediaConnection: ${JSON.stringify(\n event\n )}`\n );\n\n const mediaTrack = event.track;\n\n // eslint-disable-next-line @typescript-eslint/no-shadow\n let eventType;\n\n switch (event.type) {\n case RemoteTrackType.AUDIO:\n eventType = EVENT_TYPES.REMOTE_AUDIO;\n this.mediaProperties.setRemoteAudioTrack(event.track);\n break;\n case RemoteTrackType.VIDEO:\n eventType = EVENT_TYPES.REMOTE_VIDEO;\n this.mediaProperties.setRemoteVideoTrack(event.track);\n break;\n case RemoteTrackType.SCREENSHARE_VIDEO:\n if (event.track) {\n eventType = EVENT_TYPES.REMOTE_SHARE;\n this.mediaProperties.setRemoteShare(event.track);\n }\n break;\n default: {\n LoggerProxy.logger.log(\n 'Meeting:index#setupMediaConnectionListeners --> unexpected track'\n );\n }\n }\n\n if (eventType && mediaTrack) {\n Trigger.trigger(\n this,\n {\n file: 'meeting/index',\n function: 'setupRemoteTrackListener:Event.REMOTE_TRACK_ADDED',\n },\n EVENT_TRIGGERS.MEDIA_READY,\n {\n type: eventType,\n stream: MediaUtil.createMediaStream([mediaTrack]),\n }\n );\n }\n });\n\n this.mediaProperties.webrtcMediaConnection.on(Event.CONNECTION_STATE_CHANGED, (event) => {\n const connectionFailed = () => {\n // we know the media connection failed and browser will not attempt to recover it any more\n // so reset the timer as it's not needed anymore, we want to reconnect immediately\n this.reconnectionManager.resetReconnectionTimer();\n\n this.reconnect({networkDisconnect: true});\n Metrics.postEvent({\n event: eventType.ICE_END,\n meeting: this,\n data: {\n canProceed: false,\n errors: [\n Metrics.generateErrorPayload(2004, false, MetricsError.name.MEDIA_ENGINE, undefined),\n ],\n },\n });\n\n this.uploadLogs({\n file: 'peer-connection-manager/index',\n function: 'connectionFailed',\n });\n\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.CONNECTION_FAILURE, {\n correlation_id: this.correlationId,\n locus_id: this.locusId,\n });\n };\n\n LoggerProxy.logger.info(\n `Meeting:index#setupMediaConnectionListeners --> correlationId=${this.correlationId} connection state changed to ${event.state}`\n );\n switch (event.state) {\n case ConnectionState.Connecting:\n Metrics.postEvent({event: eventType.ICE_START, meeting: this});\n break;\n case ConnectionState.Connected:\n Metrics.postEvent({event: eventType.ICE_END, meeting: this});\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.CONNECTION_SUCCESS, {\n correlation_id: this.correlationId,\n locus_id: this.locusId,\n });\n this.setNetworkStatus(NETWORK_STATUS.CONNECTED);\n this.reconnectionManager.iceReconnected();\n this.statsAnalyzer.startAnalyzer(this.mediaProperties.webrtcMediaConnection);\n break;\n case ConnectionState.Disconnected:\n this.setNetworkStatus(NETWORK_STATUS.DISCONNECTED);\n this.reconnectionManager.waitForIceReconnect().catch(() => {\n LoggerProxy.logger.info(\n 'Meeting:index#setupMediaConnectionListeners --> state DISCONNECTED, automatic reconnection timed out.'\n );\n\n connectionFailed();\n });\n break;\n case ConnectionState.Failed:\n connectionFailed();\n break;\n default:\n break;\n }\n });\n\n this.mediaProperties.webrtcMediaConnection.on(Event.ACTIVE_SPEAKERS_CHANGED, (msg) => {\n Trigger.trigger(\n this,\n {\n file: 'meeting/index',\n function: 'setupMediaConnectionListeners',\n },\n EVENT_TRIGGERS.ACTIVE_SPEAKER_CHANGED,\n {\n seqNum: msg.seqNum,\n memberIds: msg.csis\n // @ts-ignore\n .map((csi) => this.members.findMemberByCsi(csi)?.id)\n .filter((item) => item !== undefined),\n }\n );\n });\n\n this.mediaProperties.webrtcMediaConnection.on(\n Event.VIDEO_SOURCES_COUNT_CHANGED,\n (numTotalSources, numLiveSources, mediaContent) => {\n Trigger.trigger(\n this,\n {\n file: 'meeting/index',\n function: 'setupMediaConnectionListeners',\n },\n EVENT_TRIGGERS.REMOTE_VIDEO_SOURCE_COUNT_CHANGED,\n {\n numTotalSources,\n numLiveSources,\n mediaContent,\n }\n );\n }\n );\n\n this.mediaProperties.webrtcMediaConnection.on(\n Event.AUDIO_SOURCES_COUNT_CHANGED,\n (numTotalSources, numLiveSources, mediaContent) => {\n Trigger.trigger(\n this,\n {\n file: 'meeting/index',\n function: 'setupMediaConnectionListeners',\n },\n EVENT_TRIGGERS.REMOTE_AUDIO_SOURCE_COUNT_CHANGED,\n {\n numTotalSources,\n numLiveSources,\n mediaContent,\n }\n );\n }\n );\n };\n\n /**\n * Registers for all required StatsAnalyzer events\n * @private\n * @returns {void}\n * @memberof Meetings\n */\n setupStatsAnalyzerEventHandlers = () => {\n this.statsAnalyzer.on(StatsAnalyzerEvents.MEDIA_QUALITY, (options) => {\n // TODO: might have to send the same event to the developer\n // Add ip address info if geo hint is present\n // @ts-ignore fix type\n options.data.intervalMetadata.peerReflexiveIP =\n // @ts-ignore\n this.webex.meetings.geoHintInfo?.clientAddress ||\n options.data.intervalMetadata.peerReflexiveIP ||\n MQA_STATS.DEFAULT_IP;\n Metrics.postEvent({\n event: eventType.MEDIA_QUALITY,\n meeting: this,\n data: {intervalData: options.data, networkType: options.networkType},\n });\n });\n this.statsAnalyzer.on(StatsAnalyzerEvents.LOCAL_MEDIA_STARTED, (data) => {\n Trigger.trigger(\n this,\n {\n file: 'meeting/index',\n function: 'addMedia',\n },\n EVENT_TRIGGERS.MEETING_MEDIA_LOCAL_STARTED,\n data\n );\n Metrics.postEvent({\n event: eventType.SENDING_MEDIA_START,\n meeting: this,\n data: {\n mediaType: data.type,\n },\n });\n });\n this.statsAnalyzer.on(StatsAnalyzerEvents.LOCAL_MEDIA_STOPPED, (data) => {\n Metrics.postEvent({\n event: eventType.SENDING_MEDIA_STOP,\n meeting: this,\n data: {\n mediaType: data.type,\n },\n });\n });\n this.statsAnalyzer.on(StatsAnalyzerEvents.REMOTE_MEDIA_STARTED, (data) => {\n Trigger.trigger(\n this,\n {\n file: 'meeting/index',\n function: 'addMedia',\n },\n EVENT_TRIGGERS.MEETING_MEDIA_REMOTE_STARTED,\n data\n );\n Metrics.postEvent({\n event: eventType.RECEIVING_MEDIA_START,\n meeting: this,\n data: {\n mediaType: data.type,\n },\n });\n });\n this.statsAnalyzer.on(StatsAnalyzerEvents.REMOTE_MEDIA_STOPPED, (data) => {\n Metrics.postEvent({\n event: eventType.RECEIVING_MEDIA_STOP,\n meeting: this,\n data: {\n mediaType: data.type,\n },\n });\n });\n };\n\n getMediaConnectionDebugId() {\n return `MC-${this.id.substring(0, 4)}`;\n }\n\n /**\n * Creates a webrtc media connection\n *\n * @param {Object} turnServerInfo TURN server information\n * @returns {RoapMediaConnection | MultistreamRoapMediaConnection}\n */\n createMediaConnection(turnServerInfo) {\n const mc = Media.createMediaConnection(this.isMultistream, this.getMediaConnectionDebugId(), {\n mediaProperties: this.mediaProperties,\n remoteQualityLevel: this.mediaProperties.remoteQualityLevel,\n // @ts-ignore - config coming from registerPlugin\n enableRtx: this.config.enableRtx,\n // @ts-ignore - config coming from registerPlugin\n enableExtmap: this.config.enableExtmap,\n turnServerInfo,\n });\n\n this.mediaProperties.setMediaPeerConnection(mc);\n this.setupMediaConnectionListeners();\n\n return mc;\n }\n\n /**\n * Listens for an event emitted by eventEmitter and emits it from the meeting object\n *\n * @private\n * @param {*} eventEmitter object from which to forward the event\n * @param {*} eventTypeToForward which event type to listen on and to forward\n * @param {string} meetingEventType event type to be used in the event emitted from the meeting object\n * @returns {void}\n */\n forwardEvent(eventEmitter, eventTypeToForward, meetingEventType) {\n eventEmitter.on(eventTypeToForward, (data) =>\n Trigger.trigger(\n this,\n {\n file: 'meetings',\n function: 'addMedia',\n },\n meetingEventType,\n data\n )\n );\n }\n\n /**\n * Specify joining via audio (option: pstn), video, screenshare\n * @param {Object} options A configurable options object for joining a meeting\n * @param {Object} options.resourceId pass the deviceId\n * @param {MediaDirection} options.mediaSettings pass media options\n * @param {MediaStream} options.localStream\n * @param {MediaStream} options.localShare\n * @param {RemoteMediaManagerConfig} options.remoteMediaManagerConfig only applies if multistream is enabled\n * @returns {Promise}\n * @public\n * @memberof Meeting\n */\n addMedia(options: any = {}) {\n const LOG_HEADER = 'Meeting:index#addMedia -->';\n\n let turnDiscoverySkippedReason;\n let turnServerUsed = false;\n\n if (this.meetingState !== FULL_STATE.ACTIVE) {\n return Promise.reject(new MeetingNotActiveError());\n }\n\n if (MeetingUtil.isUserInLeftState(this.locusInfo)) {\n return Promise.reject(new UserNotJoinedError());\n }\n // If the user is unjoined or guest waiting in lobby dont allow the user to addMedia\n // @ts-ignore - isUserUnadmitted coming from SelfUtil\n if (this.isUserUnadmitted && !this.wirelessShare) {\n return Promise.reject(new UserInLobbyError());\n }\n\n const {localStream, localShare, mediaSettings, remoteMediaManagerConfig} = options;\n\n LoggerProxy.logger.info(`${LOG_HEADER} Adding Media.`);\n\n Metrics.postEvent({\n event: eventType.MEDIA_CAPABILITIES,\n meeting: this,\n data: {\n mediaCapabilities: {\n rx: {\n audio: false,\n share: false,\n share_audio: false,\n video: false,\n whiteboard: false,\n },\n tx: {\n audio: false,\n share: false,\n share_audio: false,\n video: false,\n whiteboard: false,\n },\n },\n },\n });\n\n return MeetingUtil.validateOptions(options)\n .then(() => this.roap.doTurnDiscovery(this, false))\n .then((turnDiscoveryObject) => {\n ({turnDiscoverySkippedReason} = turnDiscoveryObject);\n turnServerUsed = !turnDiscoverySkippedReason;\n\n const {turnServerInfo} = turnDiscoveryObject;\n\n this.preMedia(localStream, localShare, mediaSettings);\n\n const mc = this.createMediaConnection(turnServerInfo);\n\n if (this.isMultistream) {\n this.remoteMediaManager = new RemoteMediaManager(\n this.receiveSlotManager,\n this.mediaRequestManagers,\n remoteMediaManagerConfig\n );\n\n this.forwardEvent(\n this.remoteMediaManager,\n RemoteMediaManagerEvent.AudioCreated,\n EVENT_TRIGGERS.REMOTE_MEDIA_AUDIO_CREATED\n );\n this.forwardEvent(\n this.remoteMediaManager,\n RemoteMediaManagerEvent.ScreenShareAudioCreated,\n EVENT_TRIGGERS.REMOTE_MEDIA_SCREEN_SHARE_AUDIO_CREATED\n );\n this.forwardEvent(\n this.remoteMediaManager,\n RemoteMediaManagerEvent.VideoLayoutChanged,\n EVENT_TRIGGERS.REMOTE_MEDIA_VIDEO_LAYOUT_CHANGED\n );\n\n return this.remoteMediaManager.start().then(() => mc.initiateOffer());\n }\n\n return mc.initiateOffer();\n })\n .then(() => {\n this.setMercuryListener();\n })\n .then(() =>\n this.getDevices().then((devices) => {\n MeetingUtil.handleDeviceLogging(devices);\n })\n )\n .then(() => {\n this.handleMediaLogging(this.mediaProperties);\n LoggerProxy.logger.info(`${LOG_HEADER} media connection created`);\n\n // @ts-ignore - config coming from registerPlugin\n if (this.config.stats.enableStatsAnalyzer) {\n // @ts-ignore - config coming from registerPlugin\n this.networkQualityMonitor = new NetworkQualityMonitor(this.config.stats);\n this.statsAnalyzer = new StatsAnalyzer(\n // @ts-ignore - config coming from registerPlugin\n this.config.stats,\n (ssrc: number) => this.receiveSlotManager.findReceiveSlotBySsrc(ssrc),\n this.networkQualityMonitor\n );\n this.setupStatsAnalyzerEventHandlers();\n this.networkQualityMonitor.on(\n EVENT_TRIGGERS.NETWORK_QUALITY,\n this.sendNetworkQualityEvent.bind(this)\n );\n }\n })\n .catch((error) => {\n LoggerProxy.logger.error(\n `${LOG_HEADER} Error adding media , setting up peerconnection, `,\n error\n );\n\n throw error;\n })\n .then(\n () =>\n new Promise<void>((resolve, reject) => {\n let timerCount = 0;\n\n // eslint-disable-next-line func-names\n // eslint-disable-next-line prefer-arrow-callback\n if (this.type === _CALL_) {\n resolve();\n }\n const joiningTimer = setInterval(() => {\n timerCount += 1;\n if (this.meetingState === FULL_STATE.ACTIVE) {\n clearInterval(joiningTimer);\n resolve();\n }\n\n if (timerCount === 4) {\n clearInterval(joiningTimer);\n reject(new Error('Meeting is still not active '));\n }\n }, 1000);\n })\n )\n .then(() =>\n this.mediaProperties.waitForMediaConnectionConnected().catch(() => {\n throw new Error(\n `Timed out waiting for media connection to be connected, correlationId=${this.correlationId}`\n );\n })\n )\n .then(() => {\n LoggerProxy.logger.info(`${LOG_HEADER} PeerConnection CONNECTED`);\n if (mediaSettings && mediaSettings.sendShare && localShare) {\n if (this.state === MEETING_STATE.STATES.JOINED) {\n return this.requestScreenShareFloor();\n }\n\n // When the self state changes to JOINED then request the floor\n this.floorGrantPending = true;\n }\n\n return {};\n })\n .then(() => this.mediaProperties.getCurrentConnectionType())\n .then((connectionType) => {\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.ADD_MEDIA_SUCCESS, {\n correlation_id: this.correlationId,\n locus_id: this.locusUrl.split('/').pop(),\n connectionType,\n });\n })\n .catch((error) => {\n // Clean up stats analyzer, peer connection, and turn off listeners\n const stopStatsAnalyzer = this.statsAnalyzer\n ? this.statsAnalyzer.stopAnalyzer()\n : Promise.resolve();\n\n return stopStatsAnalyzer.then(() => {\n this.statsAnalyzer = null;\n\n if (this.mediaProperties.webrtcMediaConnection) {\n this.closePeerConnections();\n this.unsetPeerConnections();\n }\n\n LoggerProxy.logger.error(\n `${LOG_HEADER} Error adding media failed to initiate PC and send request, `,\n error\n );\n\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.ADD_MEDIA_FAILURE, {\n correlation_id: this.correlationId,\n locus_id: this.locusUrl.split('/').pop(),\n reason: error.message,\n stack: error.stack,\n code: error.code,\n turnDiscoverySkippedReason,\n turnServerUsed,\n });\n\n // Upload logs on error while adding media\n Trigger.trigger(\n this,\n {\n file: 'meeting/index',\n function: 'addMedia',\n },\n EVENTS.REQUEST_UPLOAD_LOGS,\n this\n );\n\n if (error instanceof Errors.SdpError) {\n this.leave({reason: MEETING_REMOVED_REASON.MEETING_CONNECTION_FAILED});\n }\n\n throw error;\n });\n });\n }\n\n /**\n * Informs if the peer connection is in a state that can be updated with updateMedia (audio/video/share)\n * @returns {Boolean}\n */\n canUpdateMedia() {\n // in theory we shouldn't need this as RoapMediaConnection handles multiple updates, glare, etc,\n // but there are some server issues, like https://jira-eng-gpk2.cisco.com/jira/browse/WEBEX-248394\n // so for now it's better to keep queuing any media updates at SDK meeting level\n return !this.isRoapInProgress;\n }\n\n /**\n * Enqueues a media update operation.\n * @param {String} mediaUpdateType one of MEDIA_UPDATE_TYPE values\n * @param {Object} options\n * @returns {Promise}\n * @private\n * @memberof Meeting\n */\n private enqueueMediaUpdate(mediaUpdateType: string, options: any) {\n if (mediaUpdateType === MEDIA_UPDATE_TYPE.LAMBDA && typeof options?.lambda !== 'function') {\n return Promise.reject(\n new Error('lambda must be specified when enqueuing MEDIA_UPDATE_TYPE.LAMBDA')\n );\n }\n const canUpdateMediaNow = this.canUpdateMedia();\n\n return new Promise((resolve, reject) => {\n const queueItem = {\n pendingPromiseResolve: resolve,\n pendingPromiseReject: reject,\n mediaUpdateType,\n options,\n };\n\n LoggerProxy.logger.log(\n `Meeting:index#enqueueMediaUpdate --> enqueuing media update type=${mediaUpdateType}`\n );\n this.queuedMediaUpdates.push(queueItem);\n\n if (canUpdateMediaNow) {\n this.processNextQueuedMediaUpdate();\n }\n });\n }\n\n /**\n * emits event when the negotation is completed\n * @returns {void}\n * @private\n * @memberof Meeting\n */\n mediaNegotiatedEvent = () => {\n // @ts-ignore - config coming from registerPlugin\n if (this.config.experimental.enableMediaNegotiatedEvent) {\n LoggerProxy.logger.info('Meeting:mediaNegotiatedEvent --> Media server negotiated');\n Trigger.trigger(\n this,\n {\n file: 'meeting/index',\n function: 'mediaNegotiatedEvent',\n },\n EVENT_TRIGGERS.MEDIA_NEGOTIATED\n );\n }\n };\n\n /**\n * Checks if there are any queued media updates and runs the first one from\n * the queue if we are in a state that allows doing that.\n * @returns {undefined}\n * @public\n * @memberof Meeting\n */\n processNextQueuedMediaUpdate = () => {\n if (this.canUpdateMedia() && this.queuedMediaUpdates.length > 0) {\n const {pendingPromiseResolve, pendingPromiseReject, mediaUpdateType, options} =\n this.queuedMediaUpdates.shift();\n\n LoggerProxy.logger.log(\n `Meeting:index#processNextQueuedMediaUpdate --> performing delayed media update type=${mediaUpdateType}`\n );\n switch (mediaUpdateType) {\n case MEDIA_UPDATE_TYPE.ALL:\n this.updateMedia(options).then(pendingPromiseResolve, pendingPromiseReject);\n break;\n case MEDIA_UPDATE_TYPE.AUDIO:\n this.updateAudio(options).then(pendingPromiseResolve, pendingPromiseReject);\n break;\n case MEDIA_UPDATE_TYPE.VIDEO:\n this.updateVideo(options).then(pendingPromiseResolve, pendingPromiseReject);\n break;\n case MEDIA_UPDATE_TYPE.SHARE:\n this.updateShare(options).then(pendingPromiseResolve, pendingPromiseReject);\n break;\n case MEDIA_UPDATE_TYPE.LAMBDA:\n options.lambda().then(pendingPromiseResolve, pendingPromiseReject);\n break;\n default:\n LoggerProxy.logger.error(\n `Peer-connection-manager:index#processNextQueuedMediaUpdate --> unsupported media update type ${mediaUpdateType} found in the queue`\n );\n break;\n }\n }\n };\n\n /**\n * A confluence of updateAudio, updateVideo, and updateShare\n * this function re-establishes all of the media streams with new options\n * @param {Object} options\n * @param {MediaStream} options.localStream\n * @param {MediaStream} options.localShare\n * @param {MediaDirection} options.mediaSettings\n * @returns {Promise}\n * @public\n * @memberof Meeting\n */\n public updateMedia(\n options: {\n localStream?: MediaStream;\n localShare?: MediaStream;\n mediaSettings?: any;\n } = {} as any\n ) {\n const LOG_HEADER = 'Meeting:index#updateMedia -->';\n\n if (!this.canUpdateMedia()) {\n return this.enqueueMediaUpdate(MEDIA_UPDATE_TYPE.ALL, options);\n }\n\n if (this.isMultistream) {\n const audioEnabled = options.mediaSettings?.sendAudio || options.mediaSettings?.receiveAudio;\n\n return this.mediaProperties.webrtcMediaConnection.enableMultistreamAudio(audioEnabled);\n }\n\n const {localStream, localShare, mediaSettings} = options;\n\n const previousSendShareStatus = this.mediaProperties.mediaDirection.sendShare;\n\n if (!this.mediaProperties.webrtcMediaConnection) {\n return Promise.reject(new Error('media connection not established, call addMedia() first'));\n }\n\n return MeetingUtil.validateOptions(options)\n .then(() => this.preMedia(localStream, localShare, mediaSettings))\n .then(() =>\n this.mediaProperties.webrtcMediaConnection\n .updateSendReceiveOptions({\n send: {\n audio: this.mediaProperties.mediaDirection.sendAudio\n ? this.mediaProperties.audioTrack.underlyingTrack\n : null,\n video: this.mediaProperties.mediaDirection.sendVideo\n ? this.mediaProperties.videoTrack.underlyingTrack\n : null,\n screenShareVideo: this.mediaProperties.mediaDirection.sendShare\n ? this.mediaProperties.shareTrack.underlyingTrack\n : null,\n },\n receive: {\n audio: this.mediaProperties.mediaDirection.receiveAudio,\n video: this.mediaProperties.mediaDirection.receiveVideo,\n screenShareVideo: this.mediaProperties.mediaDirection.receiveShare,\n remoteQualityLevel: this.mediaProperties.remoteQualityLevel,\n },\n })\n .then(() => {\n LoggerProxy.logger.info(\n `${LOG_HEADER} webrtcMediaConnection.updateSendReceiveOptions done`\n );\n })\n .catch((error) => {\n LoggerProxy.logger.error(`${LOG_HEADER} Error updatedMedia, `, error);\n\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.UPDATE_MEDIA_FAILURE, {\n correlation_id: this.correlationId,\n locus_id: this.locusUrl.split('/').pop(),\n reason: error.message,\n stack: error.stack,\n });\n\n throw error;\n })\n // todo: the following code used to be called always after sending the roap message with the new SDP\n // now it's called independently from the roap message (so might be before it), check if that's OK\n // if not, ensure it's called after (now it's called after roap message is sent out, but we're not\n // waiting for sendRoapMediaRequest() to be resolved)\n .then(() =>\n this.enqueueMediaUpdate(MEDIA_UPDATE_TYPE.LAMBDA, {\n lambda: () => {\n return Promise.resolve()\n .then(() =>\n this.checkForStopShare(mediaSettings.sendShare, previousSendShareStatus)\n )\n .then((startShare) => {\n // This is a special case if we do an /floor grant followed by /media\n // we actually get a OFFER from the server and a GLAR condition happens\n if (startShare) {\n // We are assuming that the clients are connected when doing an update\n return this.requestScreenShareFloor();\n }\n\n return Promise.resolve();\n });\n },\n })\n )\n );\n }\n\n /**\n * Update the main audio track with new parameters\n *\n * NOTE: this method can only be used with transcoded meetings, for multistream meetings use publishTrack()\n *\n * @param {Object} options\n * @param {boolean} options.sendAudio\n * @param {boolean} options.receiveAudio\n * @param {MediaStream} options.stream Stream that contains the audio track to update\n * @returns {Promise}\n * @public\n * @memberof Meeting\n */\n public async updateAudio(options: {\n sendAudio: boolean;\n receiveAudio: boolean;\n stream: MediaStream;\n }) {\n if (this.isMultistream) {\n throw new Error(\n 'updateAudio() is not supported with multistream, use publishTracks/unpublishTracks instead'\n );\n }\n if (!this.canUpdateMedia()) {\n return this.enqueueMediaUpdate(MEDIA_UPDATE_TYPE.AUDIO, options);\n }\n const {sendAudio, receiveAudio, stream} = options;\n const track = MeetingUtil.getTrack(stream).audioTrack;\n\n if (typeof sendAudio !== 'boolean' || typeof receiveAudio !== 'boolean') {\n return Promise.reject(new ParameterError('Pass sendAudio and receiveAudio parameter'));\n }\n\n if (!this.mediaProperties.webrtcMediaConnection) {\n return Promise.reject(new Error('media connection not established, call addMedia() first'));\n }\n\n return MeetingUtil.validateOptions({sendAudio, localStream: stream})\n .then(() =>\n this.mediaProperties.webrtcMediaConnection.updateSendReceiveOptions({\n send: {audio: track},\n receive: {\n audio: options.receiveAudio,\n video: this.mediaProperties.mediaDirection.receiveVideo,\n screenShareVideo: this.mediaProperties.mediaDirection.receiveShare,\n remoteQualityLevel: this.mediaProperties.remoteQualityLevel,\n },\n })\n )\n .then(() => {\n this.setLocalAudioTrack(track);\n // todo: maybe this.mediaProperties.mediaDirection could be removed? it's duplicating stuff from webrtcMediaConnection\n this.mediaProperties.mediaDirection.sendAudio = sendAudio;\n this.mediaProperties.mediaDirection.receiveAudio = receiveAudio;\n\n // audio state could be undefined if you have not sent audio before\n this.audio =\n this.audio || createMuteState(AUDIO, this, this.mediaProperties.mediaDirection);\n });\n }\n\n /**\n * Update the main video track with new parameters\n *\n * NOTE: this method can only be used with transcoded meetings, for multistream meetings use publishTrack()\n *\n * @param {Object} options\n * @param {boolean} options.sendVideo\n * @param {boolean} options.receiveVideo\n * @param {MediaStream} options.stream Stream that contains the video track to update\n * @returns {Promise}\n * @public\n * @memberof Meeting\n */\n public updateVideo(options: {sendVideo: boolean; receiveVideo: boolean; stream: MediaStream}) {\n if (this.isMultistream) {\n throw new Error(\n 'updateVideo() is not supported with multistream, use publishTracks/unpublishTracks instead'\n );\n }\n if (!this.canUpdateMedia()) {\n return this.enqueueMediaUpdate(MEDIA_UPDATE_TYPE.VIDEO, options);\n }\n const {sendVideo, receiveVideo, stream} = options;\n const track = MeetingUtil.getTrack(stream).videoTrack;\n\n if (typeof sendVideo !== 'boolean' || typeof receiveVideo !== 'boolean') {\n return Promise.reject(new ParameterError('Pass sendVideo and receiveVideo parameter'));\n }\n\n if (!this.mediaProperties.webrtcMediaConnection) {\n return Promise.reject(new Error('media connection not established, call addMedia() first'));\n }\n\n return MeetingUtil.validateOptions({sendVideo, localStream: stream})\n .then(() =>\n this.mediaProperties.webrtcMediaConnection.updateSendReceiveOptions({\n send: {video: track},\n receive: {\n audio: this.mediaProperties.mediaDirection.receiveAudio,\n video: options.receiveVideo,\n screenShareVideo: this.mediaProperties.mediaDirection.receiveShare,\n remoteQualityLevel: this.mediaProperties.remoteQualityLevel,\n },\n })\n )\n .then(() => {\n this.setLocalVideoTrack(track);\n this.mediaProperties.mediaDirection.sendVideo = sendVideo;\n this.mediaProperties.mediaDirection.receiveVideo = receiveVideo;\n\n // video state could be undefined if you have not sent video before\n this.video =\n this.video || createMuteState(VIDEO, this, this.mediaProperties.mediaDirection);\n });\n }\n\n /**\n * Internal function when stopping a share stream, cleanup\n * @param {boolean} sendShare\n * @param {boolean} previousShareStatus\n * @returns {Promise}\n * @private\n * @memberof Meeting\n */\n private checkForStopShare(sendShare: boolean, previousShareStatus: boolean) {\n if (sendShare && !previousShareStatus) {\n // When user starts sharing\n return Promise.resolve(true);\n }\n\n if (!sendShare && previousShareStatus) {\n // When user stops sharing\n return this.releaseScreenShareFloor().then(() => Promise.resolve(false));\n }\n\n return Promise.resolve();\n }\n\n /**\n * Update the share streams, can be used to start sharing\n *\n * NOTE: this method can only be used with transcoded meetings, for multistream meetings use publishTrack()\n *\n * @param {Object} options\n * @param {boolean} options.sendShare\n * @param {boolean} options.receiveShare\n * @returns {Promise}\n * @public\n * @memberof Meeting\n */\n public updateShare(options: {\n sendShare?: boolean;\n receiveShare?: boolean;\n stream?: any;\n skipSignalingCheck?: boolean;\n }) {\n if (this.isMultistream) {\n throw new Error(\n 'updateShare() is not supported with multistream, use publishTracks/unpublishTracks instead'\n );\n }\n if (!options.skipSignalingCheck && !this.canUpdateMedia()) {\n return this.enqueueMediaUpdate(MEDIA_UPDATE_TYPE.SHARE, options);\n }\n const {sendShare, receiveShare, stream} = options;\n const track = MeetingUtil.getTrack(stream).videoTrack;\n\n if (typeof sendShare !== 'boolean' || typeof receiveShare !== 'boolean') {\n return Promise.reject(new ParameterError('Pass sendShare and receiveShare parameter'));\n }\n\n if (!this.mediaProperties.webrtcMediaConnection) {\n return Promise.reject(new Error('media connection not established, call addMedia() first'));\n }\n\n const previousSendShareStatus = this.mediaProperties.mediaDirection.sendShare;\n\n this.setLocalShareTrack(track);\n\n return MeetingUtil.validateOptions({sendShare, localShare: stream})\n .then(() => this.checkForStopShare(sendShare, previousSendShareStatus))\n .then((startShare) =>\n this.mediaProperties.webrtcMediaConnection\n .updateSendReceiveOptions({\n send: {screenShareVideo: track},\n receive: {\n audio: this.mediaProperties.mediaDirection.receiveAudio,\n video: this.mediaProperties.mediaDirection.receiveVideo,\n screenShareVideo: options.receiveShare,\n remoteQualityLevel: this.mediaProperties.remoteQualityLevel,\n },\n })\n .then(() =>\n this.enqueueMediaUpdate(MEDIA_UPDATE_TYPE.LAMBDA, {\n lambda: async () => {\n if (startShare) {\n return this.requestScreenShareFloor();\n }\n\n return undefined;\n },\n })\n )\n )\n .then(() => {\n this.mediaProperties.mediaDirection.sendShare = sendShare;\n this.mediaProperties.mediaDirection.receiveShare = receiveShare;\n })\n .catch((error) => {\n this.unsetLocalShareTrack();\n throw error;\n });\n }\n\n /**\n * Do all the attach media pre set up before executing the actual attach\n * @param {MediaStream} localStream\n * @param {MediaStream} localShare\n * @param {MediaDirection} mediaSettings\n * @returns {undefined}\n * @private\n * @memberof Meeting\n */\n private preMedia(localStream: MediaStream, localShare: MediaStream, mediaSettings: any) {\n // eslint-disable-next-line no-warning-comments\n // TODO wire into default config. There's currently an issue with the stateless plugin or how we register\n // @ts-ignore - config coming from registerPlugin\n this.mediaProperties.setMediaDirection(Object.assign(this.config.mediaSettings, mediaSettings));\n // add a setup a function move the create and setup media in future\n // TODO: delete old audio and video if stale\n this.audio = this.audio || createMuteState(AUDIO, this, this.mediaProperties.mediaDirection);\n this.video = this.video || createMuteState(VIDEO, this, this.mediaProperties.mediaDirection);\n // Validation is already done in addMedia so no need to check if the lenght is greater then 0\n this.setLocalTracks(localStream);\n if (this.isMultistream && localShare) {\n throw new Error(\n 'calling addMedia() with localShare stream is not supported when using multistream'\n );\n }\n this.setLocalShareTrack(MeetingUtil.getTrack(localShare).videoTrack);\n }\n\n /**\n * Acknowledge the meeting, outgoing or incoming\n * @param {String} type\n * @returns {Promise} resolve {message, ringing, response}\n * @public\n * @memberof Meeting\n */\n public acknowledge(type: string) {\n if (!type) {\n return Promise.reject(new ParameterError('Type must be set to acknowledge the meeting.'));\n }\n if (type === _INCOMING_) {\n return this.meetingRequest\n .acknowledgeMeeting({\n locusUrl: this.locusUrl,\n deviceUrl: this.deviceUrl,\n correlationId: this.correlationId,\n })\n .then((response) => Promise.resolve(response))\n .then((response) => {\n this.meetingFiniteStateMachine.ring(type);\n Metrics.postEvent({event: eventType.ALERT_DISPLAYED, meeting: this});\n\n return Promise.resolve({\n response,\n });\n });\n }\n\n // TODO: outside of 1:1 incoming, and all outgoing calls\n return Promise.resolve({\n message: 'noop',\n });\n }\n\n /**\n * Decline this meeting\n * @param {String} reason\n * @returns {undefined}\n * @public\n * @memberof Meeting\n */\n public decline(reason: string) {\n return MeetingUtil.declineMeeting(this, reason)\n .then((decline) => {\n this.meetingFiniteStateMachine.decline();\n\n return Promise.resolve(decline);\n })\n .catch((error) => {\n this.meetingFiniteStateMachine.fail(error);\n\n return Promise.reject(error);\n });\n }\n\n /**\n * Leave the current meeting\n * @param {Object} options leave options\n * @param {String} options.resourceId the device with which to leave from, empty if just the computer\n * @returns {Promise}\n * @public\n * @memberof Meeting\n */\n public leave(options: {resourceId?: string; reason?: any} = {} as any) {\n Metrics.postEvent({\n event: eventType.LEAVE,\n meeting: this,\n data: {trigger: trigger.USER_INTERACTION, canProceed: false},\n });\n const leaveReason = options.reason || MEETING_REMOVED_REASON.CLIENT_LEAVE_REQUEST;\n\n LoggerProxy.logger.log('Meeting:index#leave --> Leaving a meeting');\n\n return MeetingUtil.leaveMeeting(this, options)\n .then((leave) => {\n this.meetingFiniteStateMachine.leave();\n this.clearMeetingData();\n\n // upload logs on leave irrespective of meeting delete\n Trigger.trigger(\n this,\n {\n file: 'meeting/index',\n function: 'leave',\n },\n EVENTS.REQUEST_UPLOAD_LOGS,\n this\n );\n\n // TODO: more testing before we remove this code, we are not sure the scenarios for destroy here\n if (this.wirelessShare || this.guest) {\n // If screen sharing clean the meeting object\n Trigger.trigger(\n this,\n {\n file: 'meeting/index',\n function: 'leave',\n },\n EVENTS.DESTROY_MEETING,\n {\n reason: options.reason,\n meetingId: this.id,\n }\n );\n }\n LoggerProxy.logger.log('Meeting:index#leave --> LEAVE REASON ', leaveReason);\n\n return leave;\n })\n .catch((error) => {\n this.meetingFiniteStateMachine.fail(error);\n LoggerProxy.logger.error('Meeting:index#leave --> Failed to leave ', error);\n // upload logs on leave irrespective of meeting delete\n Trigger.trigger(\n this,\n {\n file: 'meeting/index',\n function: 'leave',\n },\n EVENTS.REQUEST_UPLOAD_LOGS,\n this\n );\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.MEETING_LEAVE_FAILURE, {\n correlation_id: this.correlationId,\n locus_id: this.locusUrl.split('/').pop(),\n reason: error.message,\n stack: error.stack,\n code: error.code,\n });\n\n return Promise.reject(error);\n });\n }\n\n /**\n * Start sharing whiteboard given channelUrl\n * @param {string} channelUrl whiteboard url\n * @param {String} resourceToken token created by authorize media injector\n * @returns {Promise}\n * @public\n * @memberof Meeting\n */\n public startWhiteboardShare(channelUrl: string, resourceToken: string) {\n const whiteboard = this.locusInfo.mediaShares.find((element) => element.name === 'whiteboard');\n\n if (!channelUrl) {\n return Promise.reject(new ParameterError('Cannot share without channelUrl.'));\n }\n\n if (whiteboard) {\n Metrics.postEvent({event: eventType.WHITEBOARD_SHARE_INITIATED, meeting: this});\n\n const body: any = {\n disposition: FLOOR_ACTION.GRANTED,\n personUrl: this.locusInfo.self.url,\n deviceUrl: this.deviceUrl,\n uri: whiteboard.url,\n resourceUrl: channelUrl,\n };\n\n if (resourceToken) {\n body.resourceToken = resourceToken;\n }\n\n return this.meetingRequest\n .changeMeetingFloor(body)\n .then(() => {\n this.isSharing = false;\n\n return Promise.resolve();\n })\n .catch((error) => {\n LoggerProxy.logger.error('Meeting:index#startWhiteboardShare --> Error ', error);\n\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.MEETING_START_WHITEBOARD_SHARE_FAILURE, {\n correlation_id: this.correlationId,\n locus_id: this.locusUrl.split('/').pop(),\n reason: error.message,\n stack: error.stack,\n board: {channelUrl},\n });\n\n return Promise.reject(error);\n });\n }\n\n return Promise.reject(new ParameterError('Cannot share without whiteboard.'));\n }\n\n /**\n * Stop sharing whiteboard given channelUrl\n * @param {string} channelUrl whiteboard url\n * @returns {Promise}\n * @public\n * @memberof Meeting\n */\n public stopWhiteboardShare(channelUrl: string) {\n const whiteboard = this.locusInfo.mediaShares.find((element) => element.name === 'whiteboard');\n\n if (whiteboard) {\n Metrics.postEvent({event: eventType.WHITEBOARD_SHARE_STOPPED, meeting: this});\n\n return this.meetingRequest\n .changeMeetingFloor({\n disposition: FLOOR_ACTION.RELEASED,\n personUrl: this.locusInfo.self.url,\n deviceUrl: this.deviceUrl,\n uri: whiteboard.url,\n })\n .catch((error) => {\n LoggerProxy.logger.error('Meeting:index#stopWhiteboardShare --> Error ', error);\n\n Metrics.sendBehavioralMetric(\n // @ts-ignore - check if STOP_WHITEBOARD_SHARE_FAILURE exists\n BEHAVIORAL_METRICS.STOP_WHITEBOARD_SHARE_FAILURE,\n {\n correlation_id: this.correlationId,\n locus_id: this.locusUrl.split('/').pop(),\n reason: error.message,\n stack: error.stack,\n board: {channelUrl},\n }\n );\n\n return Promise.reject(error);\n })\n .finally(() => {});\n }\n\n return Promise.reject(new ParameterError('Cannot stop share without whiteboard.'));\n }\n\n /**\n * Sends a request to Locus to obtain the screen share floor\n * @returns {Promise} see #meetingRequest.changeMeetingFloor\n * @private\n * @memberof Meeting\n */\n private requestScreenShareFloor() {\n const content = this.locusInfo.mediaShares.find((element) => element.name === CONTENT);\n\n if (content && this.shareStatus !== SHARE_STATUS.LOCAL_SHARE_ACTIVE) {\n Metrics.postEvent({event: eventType.SHARE_INITIATED, meeting: this});\n\n return this.meetingRequest\n .changeMeetingFloor({\n disposition: FLOOR_ACTION.GRANTED,\n personUrl: this.locusInfo.self.url,\n deviceUrl: this.deviceUrl,\n uri: content.url,\n resourceUrl: this.resourceUrl,\n })\n .then(() => {\n this.isSharing = true;\n\n return Promise.resolve();\n })\n .catch((error) => {\n LoggerProxy.logger.error('Meeting:index#share --> Error ', error);\n\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.MEETING_SHARE_FAILURE, {\n correlation_id: this.correlationId,\n locus_id: this.locusUrl.split('/').pop(),\n reason: error.message,\n stack: error.stack,\n });\n\n return Promise.reject(error);\n });\n }\n\n return Promise.reject(new ParameterError('Cannot share without content.'));\n }\n\n /**\n * Stops the screen share\n * @returns {Promise} see #updateShare\n * @public\n * @memberof Meeting\n */\n // Internal only, temporarily allows optional params\n // eslint-disable-next-line valid-jsdoc\n public stopShare(options = {}) {\n return this.updateShare({\n sendShare: false,\n receiveShare: this.mediaProperties.mediaDirection.receiveShare,\n ...options,\n });\n }\n\n /**\n * Sends a request to Locus to release the screen share floor.\n * @returns {Promise} see #meetingRequest.changeMeetingFloor\n * @private\n * @memberof Meeting\n */\n private releaseScreenShareFloor() {\n const content = this.locusInfo.mediaShares.find((element) => element.name === CONTENT);\n\n if (content && this.mediaProperties.mediaDirection.sendShare) {\n Metrics.postEvent({event: eventType.SHARE_STOPPED, meeting: this});\n\n if (content.floor.beneficiary.id !== this.selfId) {\n // remote participant started sharing and caused our sharing to stop, we don't want to send any floor action request in that case\n this.isSharing = false;\n\n return Promise.resolve();\n }\n\n return this.meetingRequest\n .changeMeetingFloor({\n disposition: FLOOR_ACTION.RELEASED,\n personUrl: this.locusInfo.self.url,\n deviceUrl: this.deviceUrl,\n uri: content.url,\n resourceUrl: this.resourceUrl,\n })\n .catch((error) => {\n LoggerProxy.logger.error('Meeting:index#releaseScreenShareFloor --> Error ', error);\n\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.STOP_FLOOR_REQUEST_FAILURE, {\n correlation_id: this.correlationId,\n locus_id: this.locusUrl.split('/').pop(),\n reason: error.message,\n stack: error.stack,\n });\n\n return Promise.reject(error);\n })\n .finally(() => {\n this.isSharing = false;\n });\n }\n\n return Promise.reject(new ParameterError('Cannot stop share without content'));\n }\n\n /**\n * Intiate a recording of this meeting\n * @returns {Promise}\n * @public\n * @memberof Meeting\n */\n public startRecording() {\n return this.recordingController.startRecording();\n }\n\n /**\n * set the mute on entry flag for participants if you're the host\n * @returns {Promise}\n * @param {boolean} enabled\n * @public\n * @memberof Meeting\n */\n public setMuteOnEntry(enabled: boolean) {\n return this.controlsOptionsManager.setMuteOnEntry(enabled);\n }\n\n /**\n * set the disallow unmute flag for participants if you're the host\n * @returns {Promise}\n * @param {boolean} enabled\n * @public\n * @memberof Meeting\n */\n public setDisallowUnmute(enabled: boolean) {\n return this.controlsOptionsManager.setDisallowUnmute(enabled);\n }\n\n /**\n * set the mute all flag for participants if you're the host\n * @returns {Promise}\n * @param {boolean} mutedEnabled\n * @param {boolean} disallowUnmuteEnabled\n * @param {boolean} muteOnEntryEnabled\n * @public\n * @memberof Meeting\n */\n public setMuteAll(\n mutedEnabled: boolean,\n disallowUnmuteEnabled: boolean,\n muteOnEntryEnabled: boolean\n ) {\n return this.controlsOptionsManager.setMuteAll(\n mutedEnabled,\n disallowUnmuteEnabled,\n muteOnEntryEnabled\n );\n }\n\n /**\n * End the recording of this meeting\n * @returns {Promise}\n * @public\n * @memberof Meeting\n */\n public stopRecording() {\n return this.recordingController.stopRecording();\n }\n\n /**\n * Pauses the recording of this meeting\n * @returns {Promise}\n * @public\n * @memberof Meeting\n */\n public pauseRecording() {\n return this.recordingController.pauseRecording();\n }\n\n /**\n * Resumes the recording of this meeting\n * @returns {Promise}\n * @public\n * @memberof Meeting\n */\n public resumeRecording() {\n return this.recordingController.resumeRecording();\n }\n\n /**\n * Locks the current meeting if possible\n * @returns {Promise}\n * @public\n * @memberof Meeting\n */\n public lockMeeting() {\n return MeetingUtil.lockMeeting(this.inMeetingActions, this.meetingRequest, this.locusUrl);\n }\n\n /**\n * Unlocks the current meeting if possible\n * @returns {Promise}\n * @public\n * @memberof Meeting\n */\n public unlockMeeting() {\n return MeetingUtil.unlockMeeting(this.inMeetingActions, this.meetingRequest, this.locusUrl);\n }\n\n /**\n * Logs an error message and returns a rejected promise with same message\n * @param {String} message\n * @returns {Promise}\n * @private\n * @memberof Meeting\n */\n private rejectWithErrorLog(message: string) {\n LoggerProxy.logger.error(message);\n\n return Promise.reject(new Error(message));\n }\n\n /**\n * Sends DTMF tones to the current meeting\n * @param {String} tones a string of one or more DTMF tones to send\n * @returns {Promise}\n * @public\n * @memberof Meeting\n */\n public sendDTMF(tones: string) {\n if (this.locusInfo && this.locusInfo.self) {\n if (this.locusInfo.self.enableDTMF) {\n return this.meetingRequest.sendDTMF({\n locusUrl: this.locusInfo.self.url,\n deviceUrl: this.deviceUrl,\n tones,\n });\n }\n\n return this.rejectWithErrorLog(\n 'Meeting:index#sendDTMF --> cannot send DTMF, meeting does not have DTMF enabled'\n );\n }\n\n return this.rejectWithErrorLog(\n 'Meeting:index#sendDTMF --> cannot send DTMF, meeting does not have a connection to the \"locus\" call control service. Have you joined?'\n );\n }\n\n /**\n * Sends request to change layout type for the current meeting for the specific participant/device only\n * @param {String} [layoutType] a layout type that should be available in meeting constants {@link #layout_types}\n * @param {Object} renderInfo preferred dimensions for the remote main and content streams (server can ignore it)\n * @param {Object} renderInfo.main preferred dimensions for the remote main video stream\n * @param {Number} renderInfo.main.width preferred width of main video stream\n * @param {Number} renderInfo.main.height preferred height of main video stream\n * @param {Object} renderInfo.content preferred dimensions for the remote content share stream\n * @param {Number} renderInfo.content.width preferred width of content share stream\n * @param {Number} renderInfo.content.height preferred height of content share stream\n * @returns {Promise}\n * @public\n * @memberof Meeting\n */\n public changeVideoLayout(\n layoutType?: string,\n renderInfo: {\n main: {\n width: number;\n height: number;\n };\n content: {\n width: number;\n height: number;\n };\n } = {} as any\n ) {\n const {main, content} = renderInfo;\n const {mediaDirection, remoteShare, remoteVideoTrack} = this.mediaProperties;\n\n const layoutInfo = cloneDeep(this.lastVideoLayoutInfo);\n\n // TODO: We need a real time value for Audio, Video and Share send indicator\n if (mediaDirection.receiveVideo !== true || !remoteVideoTrack) {\n return this.rejectWithErrorLog(\n 'Meeting:index#changeVideoLayout --> cannot change video layout, you are not recieving any video/share stream'\n );\n }\n\n if (layoutType) {\n if (!LAYOUT_TYPES.includes(layoutType)) {\n this.rejectWithErrorLog(\n 'Meeting:index#changeVideoLayout --> cannot change video layout, invalid layoutType recieved.'\n );\n }\n\n layoutInfo.layoutType = layoutType;\n }\n\n if (main) {\n const mainWidth = Math.round(main.width);\n const mainHeight = Math.round(main.height);\n\n // Stop any \"twitching\" caused by very slight size changes\n if (\n !this.lastVideoLayoutInfo.main ||\n Math.abs(this.lastVideoLayoutInfo.main.height - mainHeight) > 2 ||\n Math.abs(this.lastVideoLayoutInfo.main.width - mainWidth) > 2\n ) {\n layoutInfo.main = {width: mainWidth, height: mainHeight};\n }\n }\n\n if (content) {\n if (this.mediaProperties.mediaDirection.receiveShare && remoteShare) {\n const contentWidth = Math.round(content.width);\n const contentHeight = Math.round(content.height);\n\n // Stop any \"twitching\" caused by very slight size changes\n if (\n !this.lastVideoLayoutInfo.content ||\n Math.abs(this.lastVideoLayoutInfo.content.height - contentHeight) > 2 ||\n Math.abs(this.lastVideoLayoutInfo.content.width - contentWidth) > 2\n ) {\n layoutInfo.content = {width: contentWidth, height: contentHeight};\n }\n } else {\n return this.rejectWithErrorLog(\n 'Meeting:index#changeVideoLayout --> unable to send renderInfo for content, you are not receiving remote share'\n );\n }\n }\n\n if (isEqual(layoutInfo, this.lastVideoLayoutInfo)) {\n // nothing changed, no need to send any request\n return Promise.resolve();\n }\n this.lastVideoLayoutInfo = cloneDeep(layoutInfo);\n\n this.locusInfo.once(LOCUSINFO.EVENTS.CONTROLS_MEETING_LAYOUT_UPDATED, (envelope) => {\n Trigger.trigger(\n this,\n {\n file: 'meeting/index',\n function: 'changeVideoLayout',\n },\n EVENT_TRIGGERS.MEETING_CONTROLS_LAYOUT_UPDATE,\n {\n layout: envelope.layout,\n }\n );\n });\n\n return this.meetingRequest\n .changeVideoLayoutDebounced({\n locusUrl: this.locusInfo.self.url,\n deviceUrl: this.deviceUrl,\n layoutType,\n main: layoutInfo.main,\n content: layoutInfo.content,\n })\n .then((response) => {\n if (response && response.body && response.body.locus) {\n this.locusInfo.onFullLocus(response.body.locus);\n }\n })\n .catch((error) => {\n LoggerProxy.logger.error('Meeting:index#changeVideoLayout --> Error ', error);\n\n return Promise.reject(error);\n });\n }\n\n /**\n * Sets the quality of the local video stream\n * @param {String} level {LOW|MEDIUM|HIGH}\n * @returns {Promise<MediaStream>} localStream\n */\n setLocalVideoQuality(level: string) {\n LoggerProxy.logger.log(`Meeting:index#setLocalVideoQuality --> Setting quality to ${level}`);\n\n if (!VIDEO_RESOLUTIONS[level]) {\n return this.rejectWithErrorLog(`Meeting:index#setLocalVideoQuality --> ${level} not defined`);\n }\n\n if (!this.mediaProperties.mediaDirection.sendVideo) {\n return this.rejectWithErrorLog(\n 'Meeting:index#setLocalVideoQuality --> unable to change video quality, sendVideo is disabled'\n );\n }\n\n // If level is already the same, don't do anything\n if (level === this.mediaProperties.localQualityLevel) {\n LoggerProxy.logger.warn(\n `Meeting:index#setLocalQualityLevel --> Quality already set to ${level}`\n );\n\n return Promise.resolve();\n }\n\n // Set the quality level in properties\n this.mediaProperties.setLocalQualityLevel(level);\n\n const mediaDirection = {\n sendAudio: this.mediaProperties.mediaDirection.sendAudio,\n sendVideo: this.mediaProperties.mediaDirection.sendVideo,\n sendShare: this.mediaProperties.mediaDirection.sendShare,\n };\n\n // When changing local video quality level\n // Need to stop current track first as chrome doesn't support resolution upscaling(for eg. changing 480p to 720p)\n // Without feeding it a new track\n // open bug link: https://bugs.chromium.org/p/chromium/issues/detail?id=943469\n if (isBrowser('chrome') && this.mediaProperties.videoTrack)\n Media.stopTracks(this.mediaProperties.videoTrack);\n\n return this.getMediaStreams(mediaDirection, VIDEO_RESOLUTIONS[level]).then(\n async ([localStream]) => {\n await this.updateVideo({\n sendVideo: true,\n receiveVideo: true,\n stream: localStream,\n });\n\n return localStream;\n }\n );\n }\n\n /**\n * Sets the quality level of the remote incoming media\n * @param {String} level {LOW|MEDIUM|HIGH}\n * @returns {Promise}\n */\n setRemoteQualityLevel(level: string) {\n LoggerProxy.logger.log(`Meeting:index#setRemoteQualityLevel --> Setting quality to ${level}`);\n\n if (!QUALITY_LEVELS[level]) {\n return this.rejectWithErrorLog(\n `Meeting:index#setRemoteQualityLevel --> ${level} not defined`\n );\n }\n\n if (\n !this.mediaProperties.mediaDirection.receiveAudio &&\n !this.mediaProperties.mediaDirection.receiveVideo\n ) {\n return this.rejectWithErrorLog(\n 'Meeting:index#setRemoteQualityLevel --> unable to change remote quality, receiveVideo and receiveAudio is disabled'\n );\n }\n\n // If level is already the same, don't do anything\n if (level === this.mediaProperties.remoteQualityLevel) {\n LoggerProxy.logger.warn(\n `Meeting:index#setRemoteQualityLevel --> Quality already set to ${level}`\n );\n\n return Promise.resolve();\n }\n\n // Set the quality level in properties\n this.mediaProperties.setRemoteQualityLevel(level);\n\n return this.updateMedia({mediaSettings: this.mediaProperties.mediaDirection});\n }\n\n /**\n * This is deprecated, please use setLocalVideoQuality for setting local and setRemoteQualityLevel for remote\n * @param {String} level {LOW|MEDIUM|HIGH}\n * @returns {Promise}\n * @deprecated After FHD support\n */\n setMeetingQuality(level: string) {\n LoggerProxy.logger.log(`Meeting:index#setMeetingQuality --> Setting quality to ${level}`);\n\n if (!QUALITY_LEVELS[level]) {\n return this.rejectWithErrorLog(`Meeting:index#setMeetingQuality --> ${level} not defined`);\n }\n\n const previousLevel = {\n local: this.mediaProperties.localQualityLevel,\n remote: this.mediaProperties.remoteQualityLevel,\n };\n\n // If level is already the same, don't do anything\n if (\n level === this.mediaProperties.localQualityLevel &&\n level === this.mediaProperties.remoteQualityLevel\n ) {\n LoggerProxy.logger.warn(\n `Meeting:index#setMeetingQuality --> Quality already set to ${level}`\n );\n\n return Promise.resolve();\n }\n\n // Determine the direction of our current media\n const {receiveAudio, receiveVideo, sendVideo} = this.mediaProperties.mediaDirection;\n\n return (sendVideo ? this.setLocalVideoQuality(level) : Promise.resolve())\n .then(() =>\n receiveAudio || receiveVideo ? this.setRemoteQualityLevel(level) : Promise.resolve()\n )\n .catch((error) => {\n // From troubleshooting it seems that the stream itself doesn't change the max-fs if the peer connection isn't stable\n this.mediaProperties.setLocalQualityLevel(previousLevel.local);\n this.mediaProperties.setRemoteQualityLevel(previousLevel.remote);\n\n LoggerProxy.logger.error(`Meeting:index#setMeetingQuality --> ${error.message}`);\n\n Metrics.sendBehavioralMetric(\n BEHAVIORAL_METRICS.SET_MEETING_QUALITY_FAILURE,\n {\n correlation_id: this.correlationId,\n locus_id: this.locusUrl.split('/').pop(),\n reason: error.message,\n stack: error.stack,\n },\n {\n type: error.name,\n }\n );\n\n return Promise.reject(error);\n });\n }\n\n /**\n *\n * NOTE: this method can only be used with transcoded meetings, for multistream use publishTrack()\n *\n * @param {Object} options parameter\n * @param {Boolean} options.sendAudio send audio from the display share\n * @param {Boolean} options.sendShare send video from the display share\n * @param {Object} options.sharePreferences\n * @param {MediaTrackConstraints} options.sharePreferences.shareConstraints constraints to apply to video\n * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/MediaTrackConstraints}\n * @param {Boolean} options.sharePreferences.highFrameRate if shareConstraints isn't provided, set default values based off of this boolean\n * @returns {Promise}\n */\n shareScreen(\n options: {\n sendAudio: boolean;\n sendShare: boolean;\n sharePreferences: {shareConstraints: MediaTrackConstraints};\n } = {} as any\n ) {\n LoggerProxy.logger.log('Meeting:index#shareScreen --> Getting local share');\n\n const shareConstraints = {\n sendShare: true,\n sendAudio: false,\n ...options,\n };\n\n // @ts-ignore - config coming from registerPlugin\n return Media.getDisplayMedia(shareConstraints, this.config)\n .then((shareStream) =>\n this.updateShare({\n sendShare: true,\n receiveShare: this.mediaProperties.mediaDirection.receiveShare,\n stream: shareStream,\n })\n )\n .catch((error) => {\n // Whenever there is a failure when trying to access a user's display\n // report it as an Behavioral metric\n // This gives visibility into common errors and can help\n // with further troubleshooting\n\n // This metrics will get erros for getDisplayMedia and share errors for now\n // TODO: The getDisplayMedia errors need to be moved inside `media.getDisplayMedia`\n const metricName = BEHAVIORAL_METRICS.GET_DISPLAY_MEDIA_FAILURE;\n const data = {\n correlation_id: this.correlationId,\n locus_id: this.locusUrl.split('/').pop(),\n reason: error.message,\n stack: error.stack,\n };\n const metadata = {\n type: error.name,\n };\n\n Metrics.sendBehavioralMetric(metricName, data, metadata);\n throw new MediaError('Unable to retrieve display media stream', error);\n });\n }\n\n /**\n * Functionality for when a share is ended.\n * @private\n * @memberof Meeting\n * @param {MediaStream} localShare\n * @returns {undefined}\n */\n private handleShareTrackEnded = async () => {\n if (this.wirelessShare) {\n this.leave({reason: MEETING_REMOVED_REASON.USER_ENDED_SHARE_STREAMS});\n } else if (this.isMultistream) {\n try {\n if (this.mediaProperties.mediaDirection.sendShare) {\n await this.releaseScreenShareFloor();\n }\n } catch (error) {\n LoggerProxy.logger.log(\n 'Meeting:index#handleShareTrackEnded --> Error stopping share: ',\n error\n );\n } finally {\n this.setLocalShareTrack(null);\n this.mediaProperties.mediaDirection.sendShare = false;\n }\n } else {\n // Skip checking for a stable peerConnection\n // to allow immediately stopping screenshare\n this.stopShare({\n skipSignalingCheck: true,\n }).catch((error) => {\n LoggerProxy.logger.log(\n 'Meeting:index#handleShareTrackEnded --> Error stopping share: ',\n error\n );\n });\n }\n\n Trigger.trigger(\n this,\n {\n file: 'meeting/index',\n function: 'handleShareTrackEnded',\n },\n EVENT_TRIGGERS.MEETING_STOPPED_SHARING_LOCAL,\n {\n type: EVENT_TYPES.LOCAL_SHARE,\n }\n );\n };\n\n /**\n * Emits the 'network:quality' event\n * 1 indicates an acceptable uplink network.\n * 0 indicates an unacceptable uplink network based on a predefined threshold\n * @returns {undefined}\n * @param {Object} res - payload of emitNetworkQuality\n * @property {string} mediaType {video|audio}\n * @property {number} networkQualityScore - {1|0}\n * @private\n * @memberof Meeting\n */\n private sendNetworkQualityEvent(res: any) {\n Trigger.trigger(\n this,\n {\n file: 'meeting/index',\n function: 'addMedia',\n },\n EVENT_TRIGGERS.NETWORK_QUALITY,\n {\n networkQualityScore: res.networkQualityScore,\n mediaType: res.mediaType,\n }\n );\n }\n\n /**\n * Handle logging the media\n * @param {Object} mediaProperties\n * @private\n * @returns {undefined}\n */\n private handleMediaLogging(mediaProperties: {\n audioTrack: LocalMicrophoneTrack | null;\n videoTrack: LocalCameraTrack | null;\n }) {\n MeetingUtil.handleVideoLogging(mediaProperties.videoTrack);\n MeetingUtil.handleAudioLogging(mediaProperties.audioTrack);\n }\n\n /**\n * @param {string} typeMedia 'audio' or 'video'\n * @returns {undefined}\n */\n setStartSetupDelay(typeMedia: string) {\n this[`startSetupDelay${typeMedia}`] = performance.now();\n this[`endSetupDelay${typeMedia}`] = undefined;\n }\n\n /**\n * @param {string} typeMedia 'audio' or 'video'\n * @returns {undefined}\n */\n setEndSetupDelay(typeMedia: string) {\n this[`endSetupDelay${typeMedia}`] = performance.now();\n }\n\n /**\n * @param {string} typeMedia 'audio' or 'video'\n * @returns {string} duration between start and end of setup\n */\n getSetupDelayDuration(typeMedia: string) {\n const start = this[`startSetupDelay${typeMedia}`];\n const end = this[`endSetupDelay${typeMedia}`];\n\n return start && end ? end - start : undefined;\n }\n\n /**\n * @param {string} typeMedia 'audio' or 'video'\n * @returns {undefined}\n */\n setStartSendingMediaDelay(typeMedia: string) {\n this[`startSendingMediaDelay${typeMedia}`] = performance.now();\n this[`endSendingMediaDelay${typeMedia}`] = undefined;\n }\n\n /**\n * @param {string} typeMedia 'audio' or 'video'\n * @returns {undefined}\n */\n setEndSendingMediaDelay(typeMedia: string) {\n this[`endSendingMediaDelay${typeMedia}`] = performance.now();\n }\n\n /**\n * @param {string} typeMedia 'audio' or 'video'\n * @returns {string} duration between join response and first media tx\n */\n getSendingMediaDelayDuration(typeMedia: string) {\n const start = this[`startSendingMediaDelay${typeMedia}`];\n const end = this[`endSendingMediaDelay${typeMedia}`];\n\n return start && end ? end - start : undefined;\n }\n\n /**\n *\n * @returns {undefined}\n */\n setStartLocalSDPGenRemoteSDPRecvDelay() {\n if (!this.startLocalSDPGenRemoteSDPRecvDelay) {\n this.startLocalSDPGenRemoteSDPRecvDelay = performance.now();\n this.endLocalSDPGenRemoteSDPRecvDelay = undefined;\n }\n }\n\n /**\n *\n * @returns {undefined}\n */\n setEndLocalSDPGenRemoteSDPRecvDelay() {\n if (!this.endLocalSDPGenRemoteSDPRecvDelay) {\n this.endLocalSDPGenRemoteSDPRecvDelay = performance.now();\n }\n }\n\n /**\n *\n * @returns {string} duration between local SDP generation and remote SDP reception\n */\n getLocalSDPGenRemoteSDPRecvDelay() {\n const start = this.startLocalSDPGenRemoteSDPRecvDelay;\n const end = this.endLocalSDPGenRemoteSDPRecvDelay;\n\n if (start && end) {\n const calculatedDelay = end - start;\n\n return calculatedDelay > METRICS_JOIN_TIMES_MAX_DURATION ? undefined : calculatedDelay;\n }\n\n return undefined;\n }\n\n /**\n *\n * @returns {undefined}\n */\n setStartCallInitiateJoinReq() {\n this.startCallInitiateJoinReq = performance.now();\n this.endCallInitiateJoinReq = undefined;\n }\n\n /**\n *\n * @returns {undefined}\n */\n setEndCallInitiateJoinReq() {\n this.endCallInitiateJoinReq = performance.now();\n }\n\n /**\n *\n * @returns {string} duration between call initiate and sending join request to locus\n */\n getCallInitiateJoinReq() {\n const start = this.startCallInitiateJoinReq;\n const end = this.endCallInitiateJoinReq;\n\n if (start && end) {\n const calculatedDelay = end - start;\n\n return calculatedDelay > METRICS_JOIN_TIMES_MAX_DURATION ? undefined : calculatedDelay;\n }\n\n return undefined;\n }\n\n /**\n *\n * @returns {undefined}\n */\n setStartJoinReqResp() {\n this.startJoinReqResp = performance.now();\n this.endJoinReqResp = undefined;\n }\n\n /**\n *\n * @returns {undefined}\n */\n setEndJoinReqResp() {\n this.endJoinReqResp = performance.now();\n }\n\n /**\n *\n * @returns {string} duration between sending locus join request and receiving join response\n */\n getJoinReqResp() {\n const start = this.startJoinReqResp;\n const end = this.endJoinReqResp;\n\n if (start && end) {\n const calculatedDelay = end - start;\n\n return calculatedDelay > METRICS_JOIN_TIMES_MAX_DURATION ? undefined : calculatedDelay;\n }\n\n return undefined;\n }\n\n /**\n *\n * @returns {string} duration between call initiate and successful locus join (even if it is in lobby)\n */\n getTotalJmt() {\n const start = this.startCallInitiateJoinReq;\n const end = this.endJoinReqResp;\n\n return start && end ? end - start : undefined;\n }\n\n /**\n * End the current meeting for all\n * @returns {Promise}\n * @public\n * @memberof Meeting\n */\n public endMeetingForAll() {\n Metrics.postEvent({\n event: eventType.LEAVE,\n meeting: this,\n data: {trigger: trigger.USER_INTERACTION, canProceed: false},\n });\n\n LoggerProxy.logger.log('Meeting:index#endMeetingForAll --> End meeting for All');\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.MEETING_END_ALL_INITIATED, {\n correlation_id: this.correlationId,\n locus_id: this.locusId,\n });\n\n return MeetingUtil.endMeetingForAll(this)\n .then((end) => {\n this.meetingFiniteStateMachine.end();\n\n this.clearMeetingData();\n // upload logs on leave irrespective of meeting delete\n Trigger.trigger(\n this,\n {\n file: 'meeting/index',\n function: 'endMeetingForAll',\n },\n EVENTS.REQUEST_UPLOAD_LOGS,\n this\n );\n\n return end;\n })\n .catch((error) => {\n this.meetingFiniteStateMachine.fail(error);\n LoggerProxy.logger.error(\n 'Meeting:index#endMeetingForAll --> Failed to end meeting ',\n error\n );\n // upload logs on leave irrespective of meeting delete\n Trigger.trigger(\n this,\n {\n file: 'meeting/index',\n function: 'endMeetingForAll',\n },\n EVENTS.REQUEST_UPLOAD_LOGS,\n this\n );\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.MEETING_END_ALL_FAILURE, {\n correlation_id: this.correlationId,\n locus_id: this.locusUrl.split('/').pop(),\n reason: error.message,\n stack: error.stack,\n code: error.code,\n });\n\n return Promise.reject(error);\n });\n }\n\n /**\n * clear the meeting data\n * @returns {undefined}\n * @public\n * @memberof Meeting\n */\n clearMeetingData = () => {\n this.audio = null;\n this.video = null;\n this.isSharing = false;\n if (this.shareStatus === SHARE_STATUS.LOCAL_SHARE_ACTIVE) {\n this.shareStatus = SHARE_STATUS.NO_SHARE;\n }\n this.queuedMediaUpdates = [];\n\n if (this.transcription) {\n this.transcription.closeSocket();\n this.triggerStopReceivingTranscriptionEvent();\n this.transcription = undefined;\n }\n };\n\n /**\n * starts keepAlives being sent\n * @returns {void}\n * @private\n * @memberof Meeting\n */\n startKeepAlive = () => {\n if (this.keepAliveTimerId) {\n LoggerProxy.logger.warn(\n 'Meeting:index#startKeepAlive --> keepAlive not started: keepAliveTimerId already exists'\n );\n\n return;\n }\n if (!this.joinedWith?.keepAliveUrl) {\n LoggerProxy.logger.warn(\n 'Meeting:index#startKeepAlive --> keepAlive not started: no keepAliveUrl'\n );\n\n return;\n }\n if (!this.joinedWith?.keepAliveSecs) {\n LoggerProxy.logger.warn(\n 'Meeting:index#startKeepAlive --> keepAlive not started: no keepAliveSecs'\n );\n\n return;\n }\n if (this.joinedWith.keepAliveSecs <= 1) {\n LoggerProxy.logger.warn(\n 'Meeting:index#startKeepAlive --> keepAlive not started: keepAliveSecs <= 1'\n );\n\n return;\n }\n const {keepAliveUrl} = this.joinedWith;\n const keepAliveInterval = (this.joinedWith.keepAliveSecs - 1) * 750; // taken from UCF\n\n this.keepAliveTimerId = setInterval(() => {\n this.meetingRequest.keepAlive({keepAliveUrl}).catch((error) => {\n LoggerProxy.logger.warn(\n `Meeting:index#startKeepAlive --> Stopping sending keepAlives to ${keepAliveUrl} after error ${error}`\n );\n this.stopKeepAlive();\n });\n }, keepAliveInterval);\n };\n\n /**\n * stops keepAlives being sent\n * @returns {void}\n * @private\n * @memberof Meeting\n */\n stopKeepAlive = () => {\n if (!this.keepAliveTimerId) {\n return;\n }\n clearInterval(this.keepAliveTimerId);\n this.keepAliveTimerId = null;\n };\n\n /**\n * Send a reaction inside the meeting.\n *\n * @param {ReactionServerType} reactionType - type of reaction to be sent. Example: \"thumbs_up\"\n * @param {SkinToneType} skinToneType - skin tone for the reaction. Example: \"medium_dark\"\n * @returns {Promise}\n * @public\n * @memberof Meeting\n */\n public sendReaction(reactionType: ReactionServerType, skinToneType?: SkinToneType) {\n const reactionChannelUrl = this.locusInfo?.controls?.reactions?.reactionChannelUrl as string;\n const participantId = this.members.selfId;\n\n const reactionData = Reactions[reactionType];\n\n if (!reactionData) {\n return Promise.reject(new Error(`${reactionType} is not a valid reaction.`));\n }\n const skinToneData = SkinTones[skinToneType] || SkinTones.normal;\n const reaction: Reaction = {\n ...reactionData,\n tone: skinToneData,\n };\n\n if (reactionChannelUrl) {\n return this.meetingRequest.sendReaction({reactionChannelUrl, reaction, participantId});\n }\n\n return Promise.reject(new Error('Error sending reaction, service url not found.'));\n }\n\n /**\n * Method to enable or disable reactions inside the meeting.\n *\n * @param {boolean} enable - enable or disable reactions\n * @returns {Promise}\n * @public\n * @memberof Meeting\n */\n public toggleReactions(enable: boolean) {\n const isEnabled = this.locusInfo?.controls?.reactions?.enabled;\n\n if ((isEnabled && enable) || (!isEnabled && !enable)) {\n return Promise.resolve(`Reactions are already ${isEnabled ? 'enabled' : 'disabled'}.`);\n }\n\n return this.meetingRequest.toggleReactions({\n enable,\n locusUrl: this.locusUrl,\n requestingParticipantId: this.members.selfId,\n });\n }\n\n /**\n * Throws if we don't have a media connection created\n *\n * @returns {void}\n */\n private checkMediaConnection() {\n if (this.mediaProperties?.webrtcMediaConnection) {\n return;\n }\n throw new Error('Webrtc media connection is missing, call addMedia() first');\n }\n\n /**\n * Publishes specified local tracks in the meeting\n *\n * @param {Object} tracks\n * @returns {Promise}\n */\n async publishTracks(tracks: {\n microphone?: MediaStreamTrack;\n camera?: MediaStreamTrack;\n screenShare: {\n audio?: MediaStreamTrack; // todo: for now screen share audio is not supported (will be done in SPARK-399690)\n video?: MediaStreamTrack;\n };\n }): Promise<void> {\n this.checkMediaConnection();\n\n if (tracks.screenShare?.video) {\n // we are starting a screen share\n this.setLocalShareTrack(tracks.screenShare.video);\n\n await this.requestScreenShareFloor();\n this.mediaProperties.mediaDirection.sendShare = true;\n\n await this.mediaProperties.webrtcMediaConnection.publishTrack(\n this.mediaProperties.shareTrack\n );\n }\n\n if (tracks.microphone) {\n this.setLocalAudioTrack(tracks.microphone);\n this.mediaProperties.mediaDirection.sendAudio = true;\n\n // audio mute state could be undefined if you have not sent audio before\n this.audio = this.audio || createMuteState(AUDIO, this, this.mediaProperties.mediaDirection);\n\n await this.mediaProperties.webrtcMediaConnection.publishTrack(\n this.mediaProperties.audioTrack\n );\n }\n\n if (tracks.camera) {\n this.setLocalVideoTrack(tracks.camera);\n this.mediaProperties.mediaDirection.sendVideo = true;\n\n // video state could be undefined if you have not sent video before\n this.video = this.video || createMuteState(VIDEO, this, this.mediaProperties.mediaDirection);\n\n await this.mediaProperties.webrtcMediaConnection.publishTrack(\n this.mediaProperties.videoTrack\n );\n }\n }\n\n /**\n * Un-publishes specified local tracks in the meeting\n *\n * @param {Array<MediaStreamTrack>} tracks\n * @returns {Promise}\n */\n async unpublishTracks(tracks: MediaStreamTrack[]): Promise<void> {\n this.checkMediaConnection();\n\n const unpublishPromises = [];\n\n for (const track of tracks) {\n // @ts-ignore originalTrack is private - this will be fixed in SPARK-399694\n if (track === this.mediaProperties.shareTrack?.originalTrack) {\n const localTrackToUnpublish = this.mediaProperties.shareTrack;\n\n this.setLocalShareTrack(null);\n\n this.releaseScreenShareFloor(); // we ignore the returned promise here on purpose\n this.mediaProperties.mediaDirection.sendShare = false;\n\n unpublishPromises.push(\n this.mediaProperties.webrtcMediaConnection.unpublishTrack(localTrackToUnpublish)\n );\n }\n\n // @ts-ignore originalTrack is private - this will be fixed in SPARK-399694\n if (track === this.mediaProperties.audioTrack?.originalTrack) {\n const localTrackToUnpublish = this.mediaProperties.audioTrack;\n\n this.setLocalAudioTrack(null);\n this.mediaProperties.mediaDirection.sendAudio = false;\n\n unpublishPromises.push(\n this.mediaProperties.webrtcMediaConnection.unpublishTrack(localTrackToUnpublish)\n );\n }\n\n // @ts-ignore originalTrack is private - this will be fixed in SPARK-399694\n if (track === this.mediaProperties.videoTrack?.originalTrack) {\n const localTrackToUnpublish = this.mediaProperties.videoTrack;\n\n this.setLocalVideoTrack(null);\n this.mediaProperties.mediaDirection.sendVideo = false;\n\n unpublishPromises.push(\n this.mediaProperties.webrtcMediaConnection.unpublishTrack(localTrackToUnpublish)\n );\n }\n }\n\n await Promise.all(unpublishPromises);\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAGA;AACA;AAaA;AAMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAmCA;AACA;AACA;AACA;AAKA;AACA;AACA;AACA;AAWA;AAEA;AACA;AACA;AACA;AACA;AAA0D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAE1D,wBAAoB,IAAAA,yBAAgB,GAAE;EAA/BC,SAAS,qBAATA,SAAS;AAEhB,IAAMC,UAAU,GAAG,SAAbA,UAAU,CAAIC,OAAY,QAAqB;EAAA,wBAAlBC,OAAO;IAAPA,OAAO,6BAAG,EAAE;EAC7CC,oBAAW,CAACC,MAAM,CAACC,IAAI,WAAIH,OAAO,wBAAqB;EAEvD,OAAOD,OAAO,CACXK,IAAI,CAAC,UAACC,GAAG,EAAK;IACbJ,oBAAW,CAACC,MAAM,CAACC,IAAI,WAAIH,OAAO,mCAAgC;IAElE,OAAOK,GAAG;EACZ,CAAC,CAAC,CACDC,KAAK,CAAC,UAACC,KAAK,EAAK;IAChBN,oBAAW,CAACC,MAAM,CAACK,KAAK,WAAIP,OAAO,sBAAmBO,KAAK,CAAC;IAC5D,MAAMA,KAAK;EACb,CAAC,CAAC;AACN,CAAC;AAEM,IAAMC,iBAAiB,GAAG;EAC/BC,GAAG,EAAE,KAAK;EACVC,KAAK,EAAE,OAAO;EACdC,KAAK,EAAE,OAAO;EACdC,KAAK,EAAE,OAAO;EACdC,MAAM,EAAE;AACV,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AAJA;AAAA,IAKqBC,OAAO;EAAA;EAAA;EA+F1B;AACF;AACA;AACA;AACA;AACA;EACE,iBAAYC,KAAU,EAAEC,QAAe,EAAE;IAAA;IAAA;IAAA;IACvC,0BAAM,CAAC,CAAC,EAAEA,QAAO;IACjB;AACJ;AACA;AACA;AACA;AACA;A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,IAAIoK,4BAAmB,6CAAM;IACxD;AACJ;AACA;AACA;AACA;AACA;AACA;IACI,MAAK7C,KAAK,GAAG,IAAI;IACjB;AACJ;AACA;AACA;AACA;AACA;AACA;IACI,MAAKrM,KAAK,GAAG,IAAI;IACjB;AACJ;AACA;AACA;AACA;AACA;AACA;IACI,MAAKmP,yBAAyB,GAAGC,cAAmB,CAACC,MAAM,6CAAM;IACjE;AACJ;AACA;AACA;AACA;AACA;AACA;IACI,MAAKC,eAAe,GAAG,IAAI;IAC3B;AACJ;AACA;AACA;AACA;AACA;AACA;IACI,MAAK/N,QAAQ,GAAI7D,KAAK,CAACqR,KAAK,IAAIrR,KAAK,CAACqR,KAAK,CAACC,GAAG,IAAK,IAAI;IACxD;AACJ;AACA;AACA;AACA;AACA;AACA;IACI,MAAKO,MAAM,GAAG,IAAI;IAClB;AACJ;AACA;AACA;AACA;AACA;AACA;IACI,MAAKC,WAAW,GAAG9R,KAAK,CAAC8R,WAAW;IACpC;AACJ;AACA;AACA;AACA;AACA;AACA;IACI,MAAKC,eAAe,GAAG/R,KAAK,CAAC+R,eAAe;IAC5C;AACJ;AACA;AACA;AACA;AACA;AACA;IACI,MAAKC,OAAO,GAAG,IAAI;IACnB;AACJ;AACA;AACA;AACA;AACA;AACA;IACI,MAAK5N,IAAI,GAAG,IAAI;IAChB;AACJ;AACA;AACA;AACA;AACA;AACA;IACI,MAAK6N,KAAK,GAAG,IAAI;IACjB;AACJ;AACA;AACA;AACA;AACA;AACA;IACI,MAAKC,MAAM,GAAG,IAAI;IAClB;AACJ;AACA;AACA;AACA;AACA;AACA;IACI,MAAKC,MAAM,GAAG,IAAI;IAClB;AACJ;AACA;AACA;AACA;AACA;IACI,MAAK7C,cAAc,GAAG,IAAI8C,gBAAc,CAAC,CAAC,CAAC,EAAEnS,QAAO,CAAC;IACrD;AACJ;AACA;AACA;AACA;AACA;AACA;IACI,MAAKoS,gBAAgB,GAAG,IAAI;;IAE5B;AACJ;AACA;AACA;IACI,MAAKjE,aAAa,GAAG,KAAK;IAC1B;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;I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"}
|
|
1
|
+
{"version":3,"names":["BrowserDetection","isBrowser","logRequest","request","logText","LoggerProxy","logger","info","then","arg","catch","error","MEDIA_UPDATE_TYPE","ALL","AUDIO","VIDEO","SHARE","LAMBDA","Meeting","attrs","options","MEETINGS","e","data","relayType","REACTION_RELAY_TYPES","REACTION","config","receiveReactions","isReactionsSupported","members","membersCollection","get","sender","participantId","name","processedReaction","reaction","id","Trigger","trigger","file","function","EVENT_TRIGGERS","MEETING_RECEIVE_REACTIONS","mediaDirection","audioVideo","VIDEO_RESOLUTIONS","mediaProperties","localQualityLevel","sharePreferences","sendAudio","sendVideo","sendShare","warn","includes","setLocalQualityLevel","video","ParameterError","deviceId","preferredVideoDevice","lastVideoDeviceId","getVideoDeviceId","setVideoDeviceId","Media","getSupportedDevice","reject","MediaError","devicePermissions","getUserMedia","isSharing","shareStatus","SHARE_STATUS","LOCAL_SHARE_ACTIVE","metricName","BEHAVIORAL_METRICS","GET_USER_MEDIA_FAILURE","correlation_id","correlationId","locus_id","locusUrl","split","pop","reason","message","stack","metadata","type","Metrics","sendBehavioralMetric","getDevices","code","cause","Errors","SdpOfferCreationError","PEERCONNECTION_FAILURE","postEvent","event","eventType","LOCAL_SDP_GENERATED","meetingId","canProceed","errors","generateErrorPayload","MetricsError","MEDIA_ENGINE","undefined","SdpOfferHandlingError","SdpAnswerHandlingError","REMOTE_SDP_RECEIVED","SdpError","INVALID_ICE_CANDIDATE","webrtcMediaConnection","on","Event","ROAP_STARTED","isRoapInProgress","ROAP_DONE","mediaNegotiatedEvent","processNextQueuedMediaUpdate","ROAP_FAILURE","handleRoapFailure","ROAP_MESSAGE_TO_SEND","LOG_HEADER","roapMessage","messageType","roap","sendRoapOK","seq","mediaId","sendRoapMediaRequest","sdp","tieBreaker","meeting","reconnect","reconnectionManager","isReconnectInProgress","sendRoapAnswer","ROAP_ANSWER_FAILURE","errorType","ErrorType","CONFLICT","DOUBLECONFLICT","ROAP_GLARE_CONDITION","sequence","sendRoapError","REMOTE_TRACK_ADDED","log","mediaTrack","track","RemoteTrackType","EVENT_TYPES","REMOTE_AUDIO","setRemoteAudioTrack","REMOTE_VIDEO","setRemoteVideoTrack","SCREENSHARE_VIDEO","REMOTE_SHARE","setRemoteShare","MEDIA_READY","stream","MediaUtil","createMediaStream","CONNECTION_STATE_CHANGED","connectionFailed","resetReconnectionTimer","networkDisconnect","ICE_END","uploadLogs","CONNECTION_FAILURE","locusId","state","ConnectionState","Connecting","ICE_START","Connected","CONNECTION_SUCCESS","setNetworkStatus","NETWORK_STATUS","CONNECTED","iceReconnected","statsAnalyzer","startAnalyzer","Disconnected","DISCONNECTED","waitForIceReconnect","Failed","ACTIVE_SPEAKERS_CHANGED","msg","ACTIVE_SPEAKER_CHANGED","seqNum","memberIds","csis","map","csi","findMemberByCsi","filter","item","VIDEO_SOURCES_COUNT_CHANGED","numTotalSources","numLiveSources","mediaContent","REMOTE_VIDEO_SOURCE_COUNT_CHANGED","AUDIO_SOURCES_COUNT_CHANGED","REMOTE_AUDIO_SOURCE_COUNT_CHANGED","StatsAnalyzerEvents","MEDIA_QUALITY","intervalMetadata","peerReflexiveIP","webex","meetings","geoHintInfo","clientAddress","MQA_STATS","DEFAULT_IP","intervalData","networkType","LOCAL_MEDIA_STARTED","MEETING_MEDIA_LOCAL_STARTED","SENDING_MEDIA_START","mediaType","LOCAL_MEDIA_STOPPED","SENDING_MEDIA_STOP","REMOTE_MEDIA_STARTED","MEETING_MEDIA_REMOTE_STARTED","RECEIVING_MEDIA_START","REMOTE_MEDIA_STOPPED","RECEIVING_MEDIA_STOP","experimental","enableMediaNegotiatedEvent","MEDIA_NEGOTIATED","canUpdateMedia","queuedMediaUpdates","length","shift","pendingPromiseResolve","pendingPromiseReject","mediaUpdateType","updateMedia","updateAudio","updateVideo","updateShare","lambda","wirelessShare","leave","MEETING_REMOVED_REASON","USER_ENDED_SHARE_STREAMS","isMultistream","releaseScreenShareFloor","setLocalShareTrack","stopShare","skipSignalingCheck","MEETING_STOPPED_SHARING_LOCAL","LOCAL_SHARE","audio","NO_SHARE","transcription","closeSocket","triggerStopReceivingTranscriptionEvent","keepAliveTimerId","joinedWith","keepAliveUrl","keepAliveSecs","keepAliveInterval","setInterval","meetingRequest","keepAlive","stopKeepAlive","clearInterval","uuid","v4","userId","orgId","resource","deviceUrl","meetingInfo","breakouts","Breakouts","parent","receiveSlotManager","ReceiveSlotManager","Error","createReceiveSlot","mediaRequestManagers","MediaRequestManager","mediaRequests","requestMedia","MediaType","AudioMain","degradationPreferences","kind","VideoMain","screenShareAudio","AudioSlides","screenShareVideo","VideoSlides","Members","locus","url","Roap","ReconnectionManager","meetingFiniteStateMachine","MeetingStateMachine","create","conversationUrl","sipUri","destination","destinationType","partner","owner","hostId","policy","MeetingRequest","mediaConnections","fetchMeetingInfoTimeoutId","updateMediaConnections","slice","MediaProperties","inMeetingActions","InMeetingActions","callEvents","floorGrantPending","dialInDeviceStatus","PSTN_STATUS","UNKNOWN","dialInUrl","dialOutDeviceStatus","dialOutUrl","networkQualityMonitor","networkStatus","locusInfo","LocusInfo","updateMeetingObject","bind","recording","deferJoin","hasWebsocketConnected","internal","mercury","connected","lastVideoLayoutInfo","layoutType","main","content","passwordStatus","PASSWORD_STATUS","requiredCaptcha","meetingInfoFailureReason","meetingInfoFailureCode","recordingController","RecordingController","serviceUrl","links","services","record","sessionId","fullState","displayHints","controlsOptionsManager","ControlsOptionsManager","setUpLocusInfoListeners","init","hasJoinedOnce","remoteMediaManager","password","captchaCode","clearTimeout","REQUIRED","captchaInfo","captchaId","meetingInfoProvider","fetchMeetingInfo","installedOrgID","parseMeetingInfo","body","MEETING_INFO_FAILURE_REASON","NONE","VERIFIED","NOT_REQUIRED","MEETING_INFO_AVAILABLE","resolve","MeetingInfoV2PolicyError","POLICY","wbxAppApiCode","PermissionError","MeetingInfoV2PasswordError","meetingNumber","WRONG_PASSWORD","refreshCaptcha","PasswordError","MeetingInfoV2CaptchaError","WRONG_CAPTCHA","isPasswordRequired","CaptchaError","OTHER","VERIFY_PASSWORD_SUCCESS","isPasswordValid","failureReason","URL","refreshURL","hostname","captchaRefreshUrl","response","captchaID","verificationImageURL","verificationAudioURL","setUpLocusInfoSelfListener","setUpLocusInfoMeetingListener","setUpLocusServicesListener","setUpLocusFullStateListener","setUpLocusUrlListener","setUpLocusHostListener","setUpLocusSelfListener","setUpLocusParticipantsListener","setupLocusControlsListener","setUpLocusMediaSharesListener","setUpLocusEmbeddedAppsListener","setUpLocusInfoMeetingInfoListener","setUpLocusInfoAssignHostListener","setUpLocusInfoMediaInactiveListener","setUpBreakoutsListener","BREAKOUTS","EVENTS","BREAKOUTS_CLOSING","MEETING_BREAKOUTS_CLOSING","MESSAGE","messageEvent","MEETING_BREAKOUTS_MESSAGE","MEMBERS_UPDATE","MEETING_BREAKOUTS_UPDATE","DISCONNECT_DUE_TO_INACTIVITY","res","REQUEST_UPLOAD_LOGS","reconnection","autoRejoin","MEETING_SELF_LEFT","LOCUS_INFO_CAN_ASSIGN_HOST","payload","changed","set","canAssignHost","MEETING_ACTIONS_UPDATE","LOCUSINFO","FULL_STATE_MEETING_STATE_CHANGE","MEETING_STATE_CHANGE","FULL_STATE_TYPE_UPDATE","locusFullStateTypeUpdate","trackingId","identifiers","locusStartTime","lastActive","mediaAgentAlias","mediaAgentGroupId","mediaAgentCluster","joinRespRxStartAudio","getSetupDelayDuration","audioSetupDelay","joinRespRxStart","joinRespRxStartVideo","videoSetupDelay","joinRespTxStartAudio","getSendingMediaDelayDuration","joinRespTxStart","joinRespTxStartVideo","localSDPGenRemoteSDPRecv","getLocalSDPGenRemoteSDPRecvDelay","joinTimes","callInitiateJoinReq","getCallInitiateJoinReq","joinReqResp","getJoinReqResp","getTotalJmt","CA_TYPE","initMediaPayload","initPayload","getAnalyzerMetricsPrePayload","metrics","submitCallDiagnosticEvents","MEETINGS_NETWORK_DISCONNECTED","MEETINGS_NETWORK_CONNECTED","LOCUS_INFO_UPDATE_SELF","locusSelfUpdate","pstnUpdate","newSelf","MEETING_STATE","STATES","JOINED","requestScreenShareFloor","self","dialInPstnDevice","pstnDevices","find","device","dialOutPstnDevice","newStatus","dialingStatus","MEETING_SELF_PHONE_AUDIO_UPDATE","dialIn","status","attendeeId","dialOut","LOCUS_INFO_UPDATE_HOST","locusHostUpdate","LOCUS_INFO_UPDATE_PARTICIPANTS","locusParticipantsUpdate","CONTROLS_RECORDING_UPDATED","modifiedBy","lastModified","RECORDING_STATE","RECORDING","MEETING_STARTED_RECORDING","IDLE","MEETING_STOPPED_RECORDING","PAUSED","MEETING_PAUSED_RECORDING","RESUMED","MEETING_RESUMED_RECORDING","CONTROLS_MEETING_CONTAINER_UPDATED","meetingContainerUrl","MEETING_MEETING_CONTAINER_UPDATE","CONTROLS_MEETING_TRANSCRIBE_UPDATED","caption","transcribing","receiveTranscription","MEETING_STOPPED_RECEIVING_TRANSCRIPTION","CONTROLS_MEETING_BREAKOUT_UPDATED","breakout","updateBreakout","CONTROLS_ENTRY_EXIT_TONE_UPDATED","entryExitTone","MEETING_ENTRY_EXIT_TONE_UPDATE","LOCUS_INFO_UPDATE_MEDIA_SHARES","current","contentShare","whiteboardShare","whiteboard","previousContentShare","previous","previousWhiteboardShare","beneficiaryId","disposition","resourceUrl","newShareStatus","selfId","FLOOR_ACTION","GRANTED","REMOTE_SHARE_ACTIVE","localShareTrack","shareTrack","originalTrack","readyState","unpublishTracks","WHITEBOARD_SHARE_ACTIVE","RELEASED","oldShareStatus","MEETING_STOPPED_SHARING_REMOTE","SHARE_STOPPED_REASON","SELF_STOPPED","MEETING_STOPPED_SHARING_WHITEBOARD","sendStartedSharingRemote","MEETING_STARTED_SHARING_REMOTE","memberId","receiveShare","MEETING_STARTED_SHARING_LOCAL","LOCAL_SHARE_FLOOR_GRANTED","MEETING_STARTED_SHARING_WHITEBOARD","WHITEBOARD_SHARE_FLOOR_GRANTED","locusMediaSharesUpdate","LOCUS_INFO_UPDATE_URL","locusUrlUpdate","setLocusUrl","LINKS_SERVICES","setServiceUrl","setSessionId","breakoutServiceUrlUpdate","MEETING_LOCKED","MEETING_UNLOCKED","MEETING_INFO_UPDATED","canInviteNewParticipants","MeetingUtil","userDisplayHints","canAdmitParticipant","canLock","canUserLock","canUnlock","canUserUnlock","canSetDisallowUnmute","ControlsOptionsUtil","canUnsetDisallowUnmute","canSetMuteOnEntry","canUnsetMuteOnEntry","canSetMuted","canUnsetMuted","canStartRecording","RecordingUtil","canUserStart","canStopRecording","canUserStop","canPauseRecording","canUserPause","canResumeRecording","canUserResume","canRaiseHand","canUserRaiseHand","canLowerAllHands","canUserLowerAllHands","canLowerSomeoneElsesHand","canUserLowerSomeoneElsesHand","bothLeaveAndEndMeetingAvailable","canEnableClosedCaption","canStartTranscribing","canStopTranscribing","isClosedCaptionActive","isSaveTranscriptsEnabled","isWebexAssistantActive","canViewCaptionPanel","isRealTimeTranslationEnabled","canSelectSpokenLanguages","waitingForOthersToJoin","canEnableReactions","canSendReactions","canManageBreakout","canAdmitLobbyToBreakout","isBreakoutPreassignmentsEnabled","canUserAskForHelp","canUserRenameSelfAndObserved","canUserRenameOthers","setDisplayHints","handleDataChannelUrlChange","datachannelUrl","enableAutomaticLLM","updateLLMConnection","EMBEDDED_APPS_UPDATED","embeddedApps","MEETING_EMBEDDED_APPS_UPDATE","LOCAL_UNMUTE_REQUIRED","handleServerLocalUnmuteRequired","MEETING_SELF_UNMUTED_BY_OTHERS","SELF_REMOTE_VIDEO_MUTE_STATUS_UPDATED","muted","isRemotelyMuted","unmuteAllowed","isUnmuteAllowed","handleServerRemoteMuteUpdate","MEETING_SELF_VIDEO_MUTED_BY_OTHERS","MEETING_SELF_VIDEO_UNMUTED_BY_OTHERS","SELF_REMOTE_MUTE_STATUS_UPDATED","isMuted","MEETING_SELF_MUTED_BY_OTHERS","LOCAL_UNMUTE_REQUESTED","MEETING_SELF_REQUESTED_TO_UNMUTE","SELF_UNADMITTED_GUEST","startKeepAlive","MEETING_SELF_LOBBY_WAITING","LOBBY_ENTERED","SELF_ADMITTED_GUEST","MEETING_SELF_GUEST_ADMITTED","LOBBY_EXITED","MEDIA_INACTIVITY","MEETING_MEDIA_INACTIVE","MEDIA_STATUS_CHANGE","updateMediaStatus","actual","expected","receiveAudio","receiveVideo","SELF_CANNOT_VIEW_PARTICIPANT_LIST_CHANGE","MEETING_SELF_CANNOT_VIEW_PARTICIPANT_LIST","SELF_MEETING_BREAKOUTS_CHANGED","updateBreakoutSessions","SELF_MODERATOR_OR_COHOST_UPGRADE","queryPreAssignments","SELF_IS_SHARING_BLOCKED_CHANGE","MEETING_SELF_IS_SHARING_BLOCKED","REMOTE_RESPONSE","remote","remoteDeclined","DESTROY_MEETING","shouldLeave","cleanUp","object","forEach","key","invitee","alertIfActive","addMember","cancelPhoneInvite","sessionLocusUrls","locusUrls","mainLocusUrl","authorizingLocusUrl","admitMembers","removeMember","mute","muteMember","moderator","transferHostToMember","isSelf","webexMeetingInfo","locusMeetingObject","setSipUri","enableUnifiedMeetings","sipUrl","sipMeetingUri","webExMeetingId","meetingJoinUrl","permissionToken","setLocus","participants","getLocusPartner","_CALL_","person","mtgLocus","host","initialSetup","unsetRemoteMedia","unsetRemoteTracks","closeRemoteTracks","remoteAudioTrack","remoteVideoTrack","remoteShare","triggerMediaStoppedEvent","MEDIA_STOPPED","stopTrack","stopTracks","isTrackStopped","ENDED","isWrongReadyState","all","LOCAL","audioTrack","underlyingTrack","videoTrack","rawAudioTrack","emitEvent","settings","getSettings","localMicrophoneTrack","LocalMicrophoneTrack","setMediaSettings","echoCancellation","noiseSuppression","mediaSettings","setLocalAudioTrack","applyClientStateLocally","sendLocalMediaReadyEvent","rawVideoTrack","aspectRatio","frameRate","height","width","localCameraTrack","LocalCameraTrack","Number","setLocalVideoTrack","localStream","getTrack","rawLocalShareTrack","localDisplayTrack","LocalDisplayTrack","displaySurface","cursor","screen","LocalTrackEvents","Ended","handleShareTrackEnded","off","stop","unsetLocalVideoTrack","unsetLocalShareTrack","ONLINE","MERCURY_CONNECTION_RESTORED","OFFLINE","MERCURY_CONNECTION_LOST","MERCURY_CONNECTION_FAILURE","mediaRequestManager","reset","close","unsetPeerConnection","detection","isUserInJoinedState","UserNotJoinedError","NoMediaEstablishedYetError","handleClientRequest","handleAudioLogging","MUTED","USER_INTERACTION","MetricsMediaType","MUTE_AUDIO_FAILURE","UNMUTED","UNMUTE_AUDIO_FAILURE","handleVideoLogging","MUTE_VIDEO_FAILURE","UNMUTE_VIDEO_FAILURE","joinOptions","audioVideoOptions","join","joinResponse","getMediaStreams","localShare","addMedia","mediaResponse","media","local","JOIN_WITH_MEDIA_FAILURE","isMediaEstablished","currentMediaStatus","validate","ReconnectInProgress","MEETING_RECONNECTION_STARTING","MEETING_RECONNECTION_SUCCESS","MEETING_RECONNECTION_FAILURE","ReconnectionError","MEETING_RECONNECT_FAILURE","finally","controls","transcribe","reactions","enabled","onCloseSocket","onErrorSocket","RECEIVE_TRANSCRIPTION_FAILURE","method","HTTP_VERBS","POST","uri","webSocketUrl","Transcription","subscribe","MEETING_STARTED_RECEIVING_TRANSCRIPTION","monitorTranscriptionSocketConnection","connect","credentials","supertoken","access_token","registered","errorMessage","joinFailed","joinSuccess","setCorrelationId","rejoin","CALL_INITIATED","isRoapCallEnabled","MEETING_STATE_MACHINE","RINGING","ring","_JOIN_","resourceId","meetingQuality","QUALITY_LEVELS","setRemoteQualityLevel","enableMultistream","joinMeetingOptions","JOIN_SUCCESS","llm","processRelayEvent","isTranscriptionSupported","fail","LOCUS_JOIN_RESPONSE","parseLocusError","JOIN_FAILURE","isJoined","isConnected","getLocusUrl","disconnectLLM","registerAndConnect","phoneNumber","dialInPstn","dialOutPstn","pstnStatus","SUCCESS","isPhoneProvisioned","clientUrl","onFullLocus","ADD_DIAL_IN_FAILURE","dial_in_url","client_url","ADD_DIAL_OUT_FAILURE","dial_out_url","disconnectPhoneAudio","MEDIA_CAPABILITIES","mediaCapabilities","rx","share","share_audio","tx","MOVE_MEDIA","once","SELF_OBSERVING","setMediaDirection","closeLocalStream","closeLocalShare","unsetMediaTracks","reconnectMedia","MOVE_TO_SUCCESS","MOVE_TO_FAILURE","moveToResource","oldCorrelationId","leaveMeeting","moveMeeting","MOVE_FROM_SUCCESS","MOVE_FROM_FAILURE","substring","turnServerInfo","mc","createMediaConnection","getMediaConnectionDebugId","remoteQualityLevel","enableRtx","enableExtmap","setMediaPeerConnection","setupMediaConnectionListeners","eventEmitter","eventTypeToForward","meetingEventType","turnDiscoverySkippedReason","turnServerUsed","meetingState","FULL_STATE","ACTIVE","MeetingNotActiveError","isUserInLeftState","isUserUnadmitted","UserInLobbyError","remoteMediaManagerConfig","validateOptions","doTurnDiscovery","turnDiscoveryObject","preMedia","RemoteMediaManager","forwardEvent","RemoteMediaManagerEvent","AudioCreated","REMOTE_MEDIA_AUDIO_CREATED","ScreenShareAudioCreated","REMOTE_MEDIA_SCREEN_SHARE_AUDIO_CREATED","VideoLayoutChanged","REMOTE_MEDIA_VIDEO_LAYOUT_CHANGED","start","initiateOffer","setMercuryListener","devices","handleDeviceLogging","handleMediaLogging","stats","enableStatsAnalyzer","NetworkQualityMonitor","StatsAnalyzer","ssrc","findReceiveSlotBySsrc","setupStatsAnalyzerEventHandlers","NETWORK_QUALITY","sendNetworkQualityEvent","timerCount","joiningTimer","waitForMediaConnectionConnected","getCurrentConnectionType","connectionType","ADD_MEDIA_SUCCESS","stopStatsAnalyzer","stopAnalyzer","closePeerConnections","unsetPeerConnections","ADD_MEDIA_FAILURE","MEETING_CONNECTION_FAILED","canUpdateMediaNow","queueItem","push","enqueueMediaUpdate","audioEnabled","enableMultistreamAudio","previousSendShareStatus","updateSendReceiveOptions","send","receive","UPDATE_MEDIA_FAILURE","checkForStopShare","startShare","createMuteState","previousShareStatus","setLocalTracks","_INCOMING_","acknowledgeMeeting","ALERT_DISPLAYED","declineMeeting","decline","LEAVE","leaveReason","CLIENT_LEAVE_REQUEST","clearMeetingData","guest","MEETING_LEAVE_FAILURE","channelUrl","resourceToken","mediaShares","element","WHITEBOARD_SHARE_INITIATED","personUrl","changeMeetingFloor","MEETING_START_WHITEBOARD_SHARE_FAILURE","board","WHITEBOARD_SHARE_STOPPED","STOP_WHITEBOARD_SHARE_FAILURE","CONTENT","SHARE_INITIATED","MEETING_SHARE_FAILURE","SHARE_STOPPED","floor","beneficiary","STOP_FLOOR_REQUEST_FAILURE","startRecording","setMuteOnEntry","setDisallowUnmute","mutedEnabled","disallowUnmuteEnabled","muteOnEntryEnabled","setMuteAll","stopRecording","pauseRecording","resumeRecording","lockMeeting","unlockMeeting","tones","enableDTMF","sendDTMF","rejectWithErrorLog","renderInfo","layoutInfo","LAYOUT_TYPES","mainWidth","Math","round","mainHeight","abs","contentWidth","contentHeight","CONTROLS_MEETING_LAYOUT_UPDATED","envelope","MEETING_CONTROLS_LAYOUT_UPDATE","layout","changeVideoLayoutDebounced","level","previousLevel","setLocalVideoQuality","SET_MEETING_QUALITY_FAILURE","shareConstraints","getDisplayMedia","shareStream","GET_DISPLAY_MEDIA_FAILURE","networkQualityScore","typeMedia","performance","now","end","startLocalSDPGenRemoteSDPRecvDelay","endLocalSDPGenRemoteSDPRecvDelay","calculatedDelay","METRICS_JOIN_TIMES_MAX_DURATION","startCallInitiateJoinReq","endCallInitiateJoinReq","startJoinReqResp","endJoinReqResp","MEETING_END_ALL_INITIATED","endMeetingForAll","MEETING_END_ALL_FAILURE","reactionType","skinToneType","reactionChannelUrl","reactionData","Reactions","skinToneData","SkinTones","normal","tone","sendReaction","enable","isEnabled","toggleReactions","requestingParticipantId","tracks","checkMediaConnection","screenShare","publishTrack","microphone","camera","unpublishPromises","localTrackToUnpublish","unpublishTrack","StatelessWebexPlugin"],"sources":["index.ts"],"sourcesContent":["import uuid from 'uuid';\nimport {cloneDeep, isEqual, pick, isString, defer} from 'lodash';\n// @ts-ignore - Fix this\nimport {StatelessWebexPlugin} from '@webex/webex-core';\nimport {\n ConnectionState,\n Errors,\n ErrorType,\n Event,\n LocalCameraTrack,\n LocalDisplayTrack,\n LocalMicrophoneTrack,\n LocalTrackEvents,\n MediaType,\n RemoteTrackType,\n} from '@webex/internal-media-core';\n\nimport {\n MeetingNotActiveError,\n UserInLobbyError,\n NoMediaEstablishedYetError,\n UserNotJoinedError,\n} from '../common/errors/webex-errors';\nimport {StatsAnalyzer, EVENTS as StatsAnalyzerEvents} from '../statsAnalyzer';\nimport NetworkQualityMonitor from '../networkQualityMonitor';\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport Trigger from '../common/events/trigger-proxy';\nimport Roap from '../roap/index';\nimport Media from '../media';\nimport MediaProperties from '../media/properties';\nimport MeetingStateMachine from './state';\nimport {createMuteState} from './muteState';\nimport LocusInfo from '../locus-info';\nimport Metrics from '../metrics';\nimport {\n trigger,\n mediaType as MetricsMediaType,\n error as MetricsError,\n eventType,\n} from '../metrics/config';\nimport ReconnectionManager from '../reconnection-manager';\nimport MeetingRequest from './request';\nimport Members from '../members/index';\nimport MeetingUtil from './util';\nimport RecordingUtil from '../recording-controller/util';\nimport ControlsOptionsUtil from '../controls-options-manager/util';\nimport MediaUtil from '../media/util';\nimport Transcription from '../transcription';\nimport {Reactions, SkinTones} from '../reactions/reactions';\nimport PasswordError from '../common/errors/password-error';\nimport CaptchaError from '../common/errors/captcha-error';\nimport ReconnectionError from '../common/errors/reconnection';\nimport ReconnectInProgress from '../common/errors/reconnection-in-progress';\nimport {\n _CALL_,\n _INCOMING_,\n _JOIN_,\n AUDIO,\n CONTENT,\n ENDED,\n EVENT_TRIGGERS,\n EVENT_TYPES,\n EVENTS,\n BREAKOUTS,\n FLOOR_ACTION,\n FULL_STATE,\n LAYOUT_TYPES,\n LOCUSINFO,\n MEETING_INFO_FAILURE_REASON,\n MEETING_REMOVED_REASON,\n MEETING_STATE_MACHINE,\n MEETING_STATE,\n MEETINGS,\n METRICS_JOIN_TIMES_MAX_DURATION,\n MQA_STATS,\n NETWORK_STATUS,\n ONLINE,\n OFFLINE,\n PASSWORD_STATUS,\n PSTN_STATUS,\n QUALITY_LEVELS,\n RECORDING_STATE,\n SHARE_STATUS,\n SHARE_STOPPED_REASON,\n VIDEO_RESOLUTIONS,\n VIDEO,\n HTTP_VERBS,\n} from '../constants';\nimport BEHAVIORAL_METRICS from '../metrics/constants';\nimport ParameterError from '../common/errors/parameter';\nimport MediaError from '../common/errors/media';\nimport {\n MeetingInfoV2PasswordError,\n MeetingInfoV2CaptchaError,\n MeetingInfoV2PolicyError,\n} from '../meeting-info/meeting-info-v2';\nimport BrowserDetection from '../common/browser-detection';\nimport {CSI, ReceiveSlotManager} from '../multistream/receiveSlotManager';\nimport {MediaRequestManager} from '../multistream/mediaRequestManager';\nimport {\n RemoteMediaManager,\n Event as RemoteMediaManagerEvent,\n} from '../multistream/remoteMediaManager';\nimport {\n Reaction,\n ReactionServerType,\n SkinToneType,\n ProcessedReaction,\n RelayEvent,\n} from '../reactions/reactions.type';\nimport Breakouts from '../breakouts';\n\nimport InMeetingActions from './in-meeting-actions';\nimport {REACTION_RELAY_TYPES} from '../reactions/constants';\nimport RecordingController from '../recording-controller';\nimport ControlsOptionsManager from '../controls-options-manager';\nimport PermissionError from '../common/errors/permission';\n\nconst {isBrowser} = BrowserDetection();\n\nconst logRequest = (request: any, {logText = ''}) => {\n LoggerProxy.logger.info(`${logText} - sending request`);\n\n return request\n .then((arg) => {\n LoggerProxy.logger.info(`${logText} - has been successfully sent`);\n\n return arg;\n })\n .catch((error) => {\n LoggerProxy.logger.error(`${logText} - has failed: `, error);\n throw error;\n });\n};\n\nexport const MEDIA_UPDATE_TYPE = {\n ALL: 'ALL',\n AUDIO: 'AUDIO',\n VIDEO: 'VIDEO',\n SHARE: 'SHARE',\n LAMBDA: 'LAMBDA',\n};\n\n/**\n * MediaDirection\n * @typedef {Object} MediaDirection\n * @property {boolean} sendAudio\n * @property {boolean} receiveAudio\n * @property {boolean} sendVideo\n * @property {boolean} receiveVideo\n * @property {boolean} sendShare\n * @property {boolean} receiveShare\n * @property {boolean} isSharing\n */\n\n/**\n * AudioVideo\n * @typedef {Object} AudioVideo\n * @property {Object} audio\n * @property {String} audio.deviceId\n * @property {Object} video\n * @property {String} video.deviceId\n * @property {String} video.localVideoQuality // [240p, 360p, 480p, 720p, 1080p]\n */\n\n/**\n * SharePreferences\n * @typedef {Object} SharePreferences\n * @property {Object} [shareConstraints]\n * @property {Boolean} [highFrameRate]\n */\n\n/**\n * JoinOptions\n * @typedef {Object} JoinOptions\n * @property {String} [resourceId]\n * @property {String} [pin]\n * @property {Boolean} [moderator]\n * @property {String|Object} [meetingQuality]\n * @property {String} [meetingQuality.local]\n * @property {String} [meetingQuality.remote]\n * @property {Boolean} [rejoin]\n * @property {Boolean} [enableMultistream]\n */\n\n/**\n * SendOptions\n * @typedef {Object} SendOptions\n * @property {Boolean} sendAudio\n * @property {Boolean} sendVideo\n * @property {Boolean} sendShare\n */\n\n/**\n * Recording\n * @typedef {Object} Recording\n * @property {Object} state\n * @property {String} modifiedBy\n */\n\n/**\n * Meeting State Change Event\n * Emitted when ever there is a meeting state change\n * @event meeting:stateChange\n * @instance\n * @type {Object}\n * @property {String} currentState current state of the meeting\n * @property {String} previousState previous state of the meeting\n * @memberof Meeting\n */\n\n/**\n * Media Ready Event\n * Emitted when a stream is ready to be rendered\n * @event media:ready\n * @instance\n * @type {Object}\n * @property {MediaStream} stream the media stream\n * @property {String} type what type of stream, remote, local\n * @memberof Meeting\n */\n\n/**\n * Media Stopped Event\n * Emitted when a stream has stopped sending\n * @event media:stopped\n * @instance\n * @type {Object}\n * @property {String} type what type of stream, remote, local\n * @memberof Meeting\n */\n\n/**\n * Meeting Ringing Event\n * Emitted when this client should play a ringing sound, because this member is getting an incoming meeting\n * or sending out an incoming meeting\n * @event meeting:ringing\n * @instance\n * @type {Object}\n * @property {String} type // INCOMING or JOIN\n * @property {String} id\n * @memberof Meeting\n */\n\n/**\n * Meeting Ringing Stop Event\n * Emitted when this client should stop playing a ringing sound\n * @event meeting:ringingStop\n * @instance\n * @type {Object}\n * @property {Object} type\n * @property {Boolean} type.remoteAnswered\n * @property {Boolean} type.remoteDeclined\n * @property {String} id\n * @memberof Meeting\n */\n\n/**\n * Meeting Started Sharing Local Event\n * Emitted when this member starts sharing\n * @event meeting:startedSharingLocal\n * @instance\n * @type {Object}\n * @memberof Meeting\n */\n\n/**\n * Meeting Stopped Sharing Local Event\n * Emitted when this member stops sharing\n * @event meeting:stoppedSharingLocal\n * @instance\n * @type {Object}\n * @memberof Meeting\n */\n\n/**\n * Meeting Started Sharing Remote Event\n * Emitted when remote sharing starts\n * @event meeting:startedSharingRemote\n * @instance\n * @type {Object}\n * @property {Boolean} memberId id of the meeting member that started screen share\n * @memberof Meeting\n */\n\n/**\n * Meeting Stopped Sharing Remote Event\n * Emitted when remote screen sharing ends\n * @event meeting:stoppedSharingRemote\n * @instance\n * @type {Object}\n * @memberof Meeting\n */\n\n/**\n * Meeting Locked Event\n * Emitted when a meeting is locked\n * @event meeting:locked\n * @instance\n * @type {Object}\n * @property {Object} info\n * @memberof Meeting\n */\n\n/**\n * Meeting Unlocked Event\n * Emitted when a meeting is unlocked\n * @event meeting:unlocked\n * @instance\n * @type {Object}\n * @property {Object} info\n * @memberof Meeting\n */\n\n/**\n * Meeting Actions Update Event\n * Emitted when a user can take actions on a meeting such as lock, unlock, assign host\n * @event meeting:actionsUpdate\n * @instance\n * @type {Object}\n * @property {Boolean} canLock\n * @property {Boolean} canUnlock\n * @property {Boolean} canAssignHost\n * @memberof Meeting\n */\n\n/**\n * Meeting Unmuted By Others Event\n * Emitted when a member is unmuted by another member\n * @event meeting:self:unmutedByOthers\n * @instance\n * @type {Object}\n * @property {Object} payload\n * @memberof Meeting\n */\n\n/**\n * Meeting Muted By Others Event\n * Emitted when a member is muted by another member\n * @event meeting:self:mutedByOthers\n * @instance\n * @type {Object}\n * @property {Object} payload\n * @property {Boolean} payload.unmuteAllowed - whether the user is allowed to unmute self\n * @memberof Meeting\n */\n\n/**\n * Meeting Muted By Others Event\n * Emitted when the host(moderator)/co-host requests a user to unmute\n * @event meeting:self:requestedToUnmute\n * @instance\n * @type {Object}\n * @property {Object} payload\n * @memberof Meeting\n */\n\n/**\n * Meeting Self Guest Admitted Event\n * Emitted when a joined user get admitted to the meeting by another member or host\n * @event meeting:self:guestAdmitted\n * @instance\n * @type {Object}\n * @property {Object} payload\n * @memberof Meeting\n */\n\n/**\n * Meeting Self Lobby Waiting Event\n * Emitted when joined user enters the lobby and is waiting for the webex meeting to begin\n * @event meeting:self:lobbyWaiting\n * @instance\n * @type {Object}\n * @property {Object} reason Reason why user left the meeting\n * @memberof Meeting\n */\n\n/**\n * Meeting Self Left State\n * Emitted when user is inactive for more then 40 seconds, User can rejoin the meeting again\n * @event meeting:self:left\n * @instance\n * @type {Object}\n * @property {Object} payload\n * @memberof Meeting\n */\n\n/**\n * Reconnection Starting Event\n * Emitted when reconnection of media to the active meeting was successful\n * @event meeting:reconnectionStarting\n * @instance\n * @memberof Meeting\n */\n\n/**\n * Reconnection Success Event\n * Emitted when reconnection of media to the active meeting was successful\n * @event meeting:reconnectionSuccess\n * @instance\n * @type {Object}\n * @property {Object} reconnect\n * @memberof Meeting\n */\n\n/**\n * Reconnection Failure Event\n * Emitted when reconnection of media to the active meeting was successful\n * @event meeting:reconnectionFailure\n * @instance\n * @type {Object}\n * @property {Error} error\n * @memberof Meeting\n */\n\n/**\n * Meeting network quality event\n * Emitted on each interval of retrieving stats Analyzer data\n * @event network:quality\n * @type {Object}\n * @property {string} mediaType {video|audio}\n * @property {number} networkQualityScore - {1|0} 1 indicates acceptable uplink 0 indicates unacceptable uplink based on threshold\n * @memberof Meeting\n */\n\n/**\n * @description Meeting is the crux of the plugin\n * @export\n * @class Meeting\n */\nexport default class Meeting extends StatelessWebexPlugin {\n attrs: any;\n audio: any;\n breakouts: any;\n conversationUrl: string;\n correlationId: string;\n destination: string;\n destinationType: string;\n deviceUrl: string;\n hostId: string;\n id: string;\n isMultistream: boolean;\n locusUrl: string;\n mediaConnections: any[];\n mediaId?: string;\n meetingFiniteStateMachine: any;\n meetingInfo: object;\n meetingRequest: MeetingRequest;\n members: Members;\n options: object;\n orgId: string;\n owner: string;\n partner: any;\n policy: string;\n reconnectionManager: ReconnectionManager;\n resource: string;\n roap: Roap;\n roapSeq: number;\n sipUri: string;\n type: string;\n userId: string;\n video: any;\n callEvents: any[];\n deferJoin: Promise<any>;\n dialInDeviceStatus: string;\n dialInUrl: string;\n dialOutDeviceStatus: string;\n dialOutUrl: string;\n fetchMeetingInfoTimeoutId: NodeJS.Timeout;\n floorGrantPending: boolean;\n hasJoinedOnce: boolean;\n hasWebsocketConnected: boolean;\n inMeetingActions: InMeetingActions;\n isLocalShareLive: boolean;\n isRoapInProgress: boolean;\n isSharing: boolean;\n keepAliveTimerId: NodeJS.Timeout;\n lastVideoLayoutInfo: any;\n locusInfo: any;\n mediaProperties: MediaProperties;\n mediaRequestManagers: {\n audio: MediaRequestManager;\n video: MediaRequestManager;\n screenShareAudio: MediaRequestManager;\n screenShareVideo: MediaRequestManager;\n };\n\n meetingInfoFailureReason: string;\n meetingInfoFailureCode?: number;\n networkQualityMonitor: NetworkQualityMonitor;\n networkStatus: string;\n passwordStatus: string;\n queuedMediaUpdates: any[];\n recording: any;\n remoteMediaManager: RemoteMediaManager | null;\n recordingController: RecordingController;\n controlsOptionsManager: ControlsOptionsManager;\n requiredCaptcha: any;\n receiveSlotManager: ReceiveSlotManager;\n shareStatus: string;\n statsAnalyzer: StatsAnalyzer;\n transcription: Transcription;\n updateMediaConnections: (mediaConnections: any[]) => void;\n endCallInitiateJoinReq: any;\n endJoinReqResp: any;\n endLocalSDPGenRemoteSDPRecvDelay: any;\n joinedWith: any;\n locusId: any;\n startCallInitiateJoinReq: any;\n startJoinReqResp: any;\n startLocalSDPGenRemoteSDPRecvDelay: any;\n wirelessShare: any;\n guest: any;\n meetingJoinUrl: any;\n meetingNumber: any;\n meetingState: any;\n permissionToken: any;\n resourceId: any;\n resourceUrl: string;\n selfId: string;\n state: any;\n webexMeetingId: string;\n\n namespace = MEETINGS;\n\n /**\n * @param {Object} attrs\n * @param {Object} options\n * @constructor\n * @memberof Meeting\n */\n constructor(attrs: any, options: object) {\n super({}, options);\n /**\n * @instance\n * @type {Object}\n * @readonly\n * @private\n * @memberof Meeting\n */\n this.attrs = attrs;\n /**\n * @instance\n * @type {Object}\n * @readonly\n * @private\n * @memberof Meeting\n */\n this.options = options;\n /**\n * @instance\n * @type {String}\n * @readonly\n * @public\n * @memberof Meeting\n */\n this.id = uuid.v4();\n /**\n * Correlation ID used for network tracking of meeting\n * @instance\n * @type {String}\n * @readonly\n * @public\n * @memberof Meeting\n */\n this.correlationId = this.id;\n /**\n * @instance\n * @type {String}\n * @readonly\n * @public\n * @memberof Meeting\n */\n this.userId = attrs.userId;\n /**\n * Organization ID\n * @instance\n * @type {String}\n * @readonly\n * @public\n * @memberof Meeting\n */\n this.orgId = attrs.orgId;\n /**\n * @instance\n * @type {String}\n * @readonly\n * @public\n * @memberof Meeting\n */\n this.resource = attrs.resource;\n /**\n * @instance\n * @type {String}\n * @readonly\n * @public\n * @memberof Meeting\n */\n this.deviceUrl = attrs.deviceUrl;\n /**\n * @instance\n * @type {Object}\n * @readonly\n * @public\n * @memberof Meeting\n */\n // TODO: needs to be defined as a class\n this.meetingInfo = {};\n /**\n * @instance\n * @type {Breakouts}\n * @public\n * @memberof Meeting\n */\n // @ts-ignore\n this.breakouts = new Breakouts({meetingId: this.id}, {parent: this.webex});\n /**\n * helper class for managing receive slots (for multistream media connections)\n */\n this.receiveSlotManager = new ReceiveSlotManager(\n (mediaType: MediaType) => {\n if (!this.mediaProperties?.webrtcMediaConnection) {\n return Promise.reject(new Error('Webrtc media connection is missing'));\n }\n\n return this.mediaProperties.webrtcMediaConnection.createReceiveSlot(mediaType);\n },\n (csi: CSI) => (this.members.findMemberByCsi(csi) as any)?.id\n );\n /**\n * Object containing helper classes for managing media requests for audio/video/screenshare (for multistream media connections)\n * All multistream media requests sent out for this meeting have to go through them.\n */\n this.mediaRequestManagers = {\n audio: new MediaRequestManager(\n (mediaRequests) => {\n if (!this.mediaProperties.webrtcMediaConnection) {\n LoggerProxy.logger.warn(\n 'Meeting:index#mediaRequestManager --> trying to send audio media request before media connection was created'\n );\n\n return;\n }\n this.mediaProperties.webrtcMediaConnection.requestMedia(\n MediaType.AudioMain,\n mediaRequests\n );\n },\n {\n // @ts-ignore - config coming from registerPlugin\n degradationPreferences: this.config.degradationPreferences,\n kind: 'audio',\n }\n ),\n video: new MediaRequestManager(\n (mediaRequests) => {\n if (!this.mediaProperties.webrtcMediaConnection) {\n LoggerProxy.logger.warn(\n 'Meeting:index#mediaRequestManager --> trying to send video media request before media connection was created'\n );\n\n return;\n }\n this.mediaProperties.webrtcMediaConnection.requestMedia(\n MediaType.VideoMain,\n mediaRequests\n );\n },\n {\n // @ts-ignore - config coming from registerPlugin\n degradationPreferences: this.config.degradationPreferences,\n kind: 'video',\n }\n ),\n screenShareAudio: new MediaRequestManager(\n (mediaRequests) => {\n if (!this.mediaProperties.webrtcMediaConnection) {\n LoggerProxy.logger.warn(\n 'Meeting:index#mediaRequestManager --> trying to send screenshare audio media request before media connection was created'\n );\n\n return;\n }\n this.mediaProperties.webrtcMediaConnection.requestMedia(\n MediaType.AudioSlides,\n mediaRequests\n );\n },\n {\n // @ts-ignore - config coming from registerPlugin\n degradationPreferences: this.config.degradationPreferences,\n kind: 'audio',\n }\n ),\n screenShareVideo: new MediaRequestManager(\n (mediaRequests) => {\n if (!this.mediaProperties.webrtcMediaConnection) {\n LoggerProxy.logger.warn(\n 'Meeting:index#mediaRequestManager --> trying to send screenshare video media request before media connection was created'\n );\n\n return;\n }\n this.mediaProperties.webrtcMediaConnection.requestMedia(\n MediaType.VideoSlides,\n mediaRequests\n );\n },\n {\n // @ts-ignore - config coming from registerPlugin\n degradationPreferences: this.config.degradationPreferences,\n kind: 'video',\n }\n ),\n };\n /**\n * @instance\n * @type {Members}\n * @public\n * @memberof Meeting\n */\n this.members = new Members(\n {\n locusUrl: attrs.locus && attrs.locus.url,\n receiveSlotManager: this.receiveSlotManager,\n mediaRequestManagers: this.mediaRequestManagers,\n },\n // @ts-ignore - Fix type\n {parent: this.webex}\n );\n /**\n * @instance\n * @type {Roap}\n * @readonly\n * @private\n * @memberof Meeting\n */\n // @ts-ignore - Fix type\n this.roap = new Roap({}, {parent: this.webex});\n /**\n * indicates if an SDP exchange is happening\n *\n * @instance\n * @type {Boolean}\n * @readonly\n * @private\n * @memberof Meeting\n */\n this.isRoapInProgress = false;\n /**\n * created later\n * @instance\n * @type {ReconnectionManager}\n * @readonly\n * @private\n * @memberof Meeting\n */\n this.reconnectionManager = new ReconnectionManager(this);\n /**\n * created later\n * @instance\n * @type {MuteState}\n * @private\n * @memberof Meeting\n */\n this.audio = null;\n /**\n * created later\n * @instance\n * @type {MuteState}\n * @private\n * @memberof Meeting\n */\n this.video = null;\n /**\n * @instance\n * @type {MeetingStateMachine}\n * @readonly\n * @public\n * @memberof Meeting\n */\n this.meetingFiniteStateMachine = MeetingStateMachine.create(this);\n /**\n * @instance\n * @type {String}\n * @readonly\n * @public\n * @memberof Meeting\n */\n this.conversationUrl = null;\n /**\n * @instance\n * @type {String}\n * @readonly\n * @public\n * @memberof Meeting\n */\n this.locusUrl = (attrs.locus && attrs.locus.url) || null;\n /**\n * @instance\n * @type {String}\n * @readonly\n * @public\n * @memberof Meeting\n */\n this.sipUri = null;\n /**\n * @instance\n * @type {String}\n * @readonly\n * @public\n * @memberof Meeting\n */\n this.destination = attrs.destination;\n /**\n * @instance\n * @type {String}\n * @readonly\n * @public\n * @memberof Meeting\n */\n this.destinationType = attrs.destinationType;\n /**\n * @instance\n * @type {String}\n * @readonly\n * @public\n * @memberof Meeting\n */\n this.partner = null;\n /**\n * @instance\n * @type {String}\n * @readonly\n * @public\n * @memberof Meeting\n */\n this.type = null;\n /**\n * @instance\n * @type {String}\n * @readonly\n * @public\n * @memberof Meeting\n */\n this.owner = null;\n /**\n * @instance\n * @type {String}\n * @readonly\n * @public\n * @memberof Meeting\n */\n this.hostId = null;\n /**\n * @instance\n * @type {String}\n * @readonly\n * @public\n * @memberof Meeting\n */\n this.policy = null;\n /**\n * @instance\n * @type {MeetingRequest}\n * @private\n * @memberof Meeting\n */\n this.meetingRequest = new MeetingRequest({}, options);\n /**\n * @instance\n * @type {Array}\n * @readonly\n * @public\n * @memberof Meeting\n */\n this.mediaConnections = null;\n\n /**\n * If true, then media is sent over multiple separate streams.\n * If false, then media is transcoded by the server into a single stream.\n */\n this.isMultistream = false;\n /**\n * Fetching meeting info can be done randomly 2-5 mins before meeting start\n * In case it is done before the timer expires, this timeout id is reset to cancel the timer.\n * @instance\n * @type {Number}\n * @readonly\n * @private\n * @memberof Meeting\n */\n this.fetchMeetingInfoTimeoutId = null;\n\n /**\n * Update the MediaConnections property with new information\n * @param {array} mediaConnections\n * @returns {undefined}\n * @private\n * @memberof Meeting\n */\n this.updateMediaConnections = (mediaConnections: any[]) => {\n if (!isEqual(this.mediaConnections, mediaConnections)) {\n // grab last/latest item in the new mediaConnections information\n this.mediaConnections = mediaConnections.slice(-1);\n }\n };\n /**\n * Passing only info as we send basic info for meeting added event\n * @instance\n * @type {MediaProperties}\n * @public\n * @memberof Meeting\n */\n this.mediaProperties = new MediaProperties();\n /**\n * @instance\n * @type {InMeetingActions}\n * @public\n * @memberof Meeting\n */\n this.inMeetingActions = new InMeetingActions();\n /**\n * This is deprecated, please use shareStatus instead.\n * @instance\n * @type {Boolean}\n * @readonly\n * @public\n * @memberof Meeting\n * @deprecated after v1.118.13\n */\n this.isSharing = false;\n /**\n * @instance\n * @type {string}\n * @readonly\n * @public\n * @memberof Meeting\n */\n this.shareStatus = SHARE_STATUS.NO_SHARE;\n\n /**\n * @instance\n * @type {Array}\n * @readonly\n * @public\n * @memberof Meeting\n */\n this.callEvents = [];\n /**\n * There is a pending floor requested by the user\n * @instance\n * @type {boolean}\n * @private\n * @memberof Meeting\n */\n this.floorGrantPending = false;\n /**\n * The latest status of the dial in device (can be \"JOINED\", \"CONNECTED\", \"LEFT\",\n * \"TRANSFERRING\", \"SUCCESS\" or \"\")\n * @instance\n * @type {String}\n * @private\n * @memberof Meeting\n */\n this.dialInDeviceStatus = PSTN_STATUS.UNKNOWN;\n /**\n * the url for provisioned device used to dial in\n * @instance\n * @type {String}\n * @private\n * @memberof Meeting\n */\n this.dialInUrl = '';\n /**\n * The latest status of the dial out device (can be \"JOINED\", \"CONNECTED\", \"LEFT\",\n * \"TRANSFERRING\", \"SUCCESS\" or \"\")\n * @instance\n * @type {String}\n * @private\n * @memberof Meeting\n */\n this.dialOutDeviceStatus = PSTN_STATUS.UNKNOWN;\n /**\n * the url for provisioned device used to dial out\n * @instance\n * @type {String}\n * @private\n * @memberof Meeting\n */\n this.dialOutUrl = '';\n /**\n * @instance\n * @type {StatsAnalyzer}\n * @private\n * @memberof Meeting\n */\n this.statsAnalyzer = null;\n /**\n * @instance\n * @type {NetworkQualityMonitor}\n * @private\n * @memberof Meeting\n */\n this.networkQualityMonitor = null;\n /**\n * @instance\n * @type {String}\n * @readonly\n * @public\n * @memberof Meeting\n */\n this.networkStatus = null;\n /**\n * Passing only info as we send basic info for meeting added event\n * @instance\n * @type {MeetingRequest}\n * @private\n * @memberof Meeting\n */\n // @ts-ignore - Fix type\n this.locusInfo = new LocusInfo(this.updateMeetingObject.bind(this), this.webex, this.id);\n\n // We had to add listeners first before setting up the locus instance\n /**\n * @instance\n * @type {Recording}\n * @readonly\n * @public\n * @memberof Meeting\n */\n this.recording = null;\n\n /**\n * Promise that exists if joining, and resolves upon method completion.\n * @instance\n * @type {Promise}\n * @private\n * @memberof Meeting\n */\n this.deferJoin = undefined;\n\n /**\n * Staus of websocket connection/mercury connection.\n * @instance\n * @type {Boolean}\n * @private\n * @memberof Meeting\n */\n // @ts-ignore - Fix type\n this.hasWebsocketConnected = this.webex.internal.mercury.connected;\n\n /**\n * Last sent render information\n * @instance\n * @type {Object}\n * @private\n * @memberof Meeting\n */\n this.lastVideoLayoutInfo = {layoutType: undefined, main: undefined, content: undefined};\n\n /**\n * Queue of pending media updates requested by the app\n * @instance\n * @type {Array}\n * @private\n * @memberof Meeting\n */\n this.queuedMediaUpdates = [];\n\n /**\n * Meeting transcription object\n * @instance\n * @type {Transcription}\n * @private\n * @memberof Meeting\n */\n this.transcription = undefined;\n\n /**\n * Password status. If it's PASSWORD_STATUS.REQUIRED then verifyPassword() needs to be called\n * with the correct password before calling join()\n * @instance\n * @type {PASSWORD_STATUS}\n * @public\n * @memberof Meeting\n */\n this.passwordStatus = PASSWORD_STATUS.UNKNOWN;\n\n /**\n * Information about required captcha. If null, then no captcha is required. status. If it's PASSWORD_STATUS.REQUIRED then verifyPassword() needs to be called\n * with the correct password before calling join()\n * @instance\n * @type {Object}\n * @property {string} captchaId captcha id\n * @property {string} verificationImageURL Url of the captcha image\n * @property {string} verificationAudioURL Url of the captcha audio file\n * @property {string} refreshURL Url used for refreshing the captcha (don't use it directly, call refreshCaptcha() instead)\n * @public\n * @memberof Meeting\n */\n this.requiredCaptcha = null;\n\n /**\n * Indicates the reason for last failure to obtain meeting.meetingInfo. MEETING_INFO_FAILURE_REASON.NONE if meeting info was\n * retrieved successfully\n * @instance\n * @type {MEETING_INFO_FAILURE_REASON}\n * @private\n * @memberof Meeting\n */\n this.meetingInfoFailureReason = undefined;\n\n /**\n * The numeric code, if any, associated with the last failure to obtain the meeting info\n * @instance\n * @type {number}\n * @private\n * @memberof Meeting\n */\n this.meetingInfoFailureCode = undefined;\n\n /**\n * Repeating timer used to send keepAlives when in lobby\n * @instance\n * @type {String}\n * @private\n * @memberof Meeting\n */\n this.keepAliveTimerId = null;\n\n /**\n * The class that helps to control recording functions: start, stop, pause, resume, etc\n * @instance\n * @type {RecordingController}\n * @public\n * @memberof Meeting\n */\n this.recordingController = new RecordingController(this.meetingRequest, {\n serviceUrl: this.locusInfo?.links?.services?.record?.url,\n sessionId: this.locusInfo?.fullState?.sessionId,\n locusUrl: this.locusInfo?.url,\n displayHints: [],\n });\n\n /**\n * The class that helps to control recording functions: start, stop, pause, resume, etc\n * @instance\n * @type {ControlsOptionsManager}\n * @public\n * @memberof Meeting\n */\n this.controlsOptionsManager = new ControlsOptionsManager(this.meetingRequest, {\n locusUrl: this.locusInfo?.url,\n displayHints: [],\n });\n\n this.setUpLocusInfoListeners();\n this.locusInfo.init(attrs.locus ? attrs.locus : {});\n this.hasJoinedOnce = false;\n\n /**\n * helper class for managing remote streams\n */\n this.remoteMediaManager = null;\n }\n\n /**\n * Fetches meeting information.\n * @param {Object} options\n * @param {String} [options.password] optional\n * @param {String} [options.captchaCode] optional\n * @public\n * @memberof Meeting\n * @returns {Promise}\n */\n public async fetchMeetingInfo({\n password = null,\n captchaCode = null,\n }: {\n password?: string;\n captchaCode?: string;\n }) {\n // when fetch meeting info is called directly by the client, we want to clear out the random timer for sdk to do it\n if (this.fetchMeetingInfoTimeoutId) {\n clearTimeout(this.fetchMeetingInfoTimeoutId);\n this.fetchMeetingInfoTimeoutId = undefined;\n }\n if (captchaCode && !this.requiredCaptcha) {\n return Promise.reject(\n new Error('fetchMeetingInfo() called with captchaCode when captcha was not required')\n );\n }\n if (\n password &&\n this.passwordStatus !== PASSWORD_STATUS.REQUIRED &&\n this.passwordStatus !== PASSWORD_STATUS.UNKNOWN\n ) {\n return Promise.reject(\n new Error('fetchMeetingInfo() called with password when password was not required')\n );\n }\n\n try {\n const captchaInfo = captchaCode\n ? {code: captchaCode, id: this.requiredCaptcha.captchaId}\n : null;\n\n const info = await this.attrs.meetingInfoProvider.fetchMeetingInfo(\n this.destination,\n this.destinationType,\n password,\n captchaInfo,\n // @ts-ignore - config coming from registerPlugin\n this.config.installedOrgID\n );\n\n this.parseMeetingInfo(info, this.destination);\n this.meetingInfo = info ? info.body : null;\n this.meetingInfoFailureReason = MEETING_INFO_FAILURE_REASON.NONE;\n this.requiredCaptcha = null;\n if (\n this.passwordStatus === PASSWORD_STATUS.REQUIRED ||\n this.passwordStatus === PASSWORD_STATUS.VERIFIED\n ) {\n this.passwordStatus = PASSWORD_STATUS.VERIFIED;\n } else {\n this.passwordStatus = PASSWORD_STATUS.NOT_REQUIRED;\n }\n\n Trigger.trigger(\n this,\n {\n file: 'meetings',\n function: 'fetchMeetingInfo',\n },\n EVENT_TRIGGERS.MEETING_INFO_AVAILABLE\n );\n\n return Promise.resolve();\n } catch (err) {\n if (err instanceof MeetingInfoV2PolicyError) {\n this.meetingInfoFailureReason = MEETING_INFO_FAILURE_REASON.POLICY;\n this.meetingInfoFailureCode = err.wbxAppApiCode;\n\n if (err.meetingInfo) {\n this.meetingInfo = err.meetingInfo;\n }\n\n throw new PermissionError();\n } else if (err instanceof MeetingInfoV2PasswordError) {\n LoggerProxy.logger.info(\n // @ts-ignore\n `Meeting:index#fetchMeetingInfo --> Info Unable to fetch meeting info for ${this.destination} - password required (code=${err?.body?.code}).`\n );\n\n // when wbxappapi requires password it still populates partial meeting info in the response\n if (err.meetingInfo) {\n this.meetingInfo = err.meetingInfo;\n this.meetingNumber = err.meetingInfo.meetingNumber;\n }\n\n this.meetingInfoFailureCode = err.wbxAppApiCode;\n\n this.passwordStatus = PASSWORD_STATUS.REQUIRED;\n this.meetingInfoFailureReason = MEETING_INFO_FAILURE_REASON.WRONG_PASSWORD;\n if (this.requiredCaptcha) {\n // this is a workaround for captcha service bug, see WEBEX-224862\n await this.refreshCaptcha();\n }\n\n throw new PasswordError();\n } else if (err instanceof MeetingInfoV2CaptchaError) {\n LoggerProxy.logger.info(\n // @ts-ignore\n `Meeting:index#fetchMeetingInfo --> Info Unable to fetch meeting info for ${this.destination} - captcha required (code=${err?.body?.code}).`\n );\n\n this.meetingInfoFailureReason = this.requiredCaptcha\n ? MEETING_INFO_FAILURE_REASON.WRONG_CAPTCHA\n : MEETING_INFO_FAILURE_REASON.WRONG_PASSWORD;\n\n this.meetingInfoFailureCode = err.wbxAppApiCode;\n\n if (err.isPasswordRequired) {\n this.passwordStatus = PASSWORD_STATUS.REQUIRED;\n }\n\n this.requiredCaptcha = err.captchaInfo;\n throw new CaptchaError();\n } else {\n this.meetingInfoFailureReason = MEETING_INFO_FAILURE_REASON.OTHER;\n throw err;\n }\n }\n }\n\n /**\n * Checks if the supplied password/host key is correct. It returns a promise with information whether the\n * password and captcha code were correct or not.\n * @param {String} password - this can be either a password or a host key, can be undefined if only captcha was required\n * @param {String} captchaCode - can be undefined if captcha was not required by the server\n * @public\n * @memberof Meeting\n * @returns {Promise<{isPasswordValid: boolean, requiredCaptcha: boolean, failureReason: MEETING_INFO_FAILURE_REASON}>}\n */\n public verifyPassword(password: string, captchaCode: string) {\n return this.fetchMeetingInfo({\n password,\n captchaCode,\n })\n .then(() => {\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.VERIFY_PASSWORD_SUCCESS);\n\n return {\n isPasswordValid: true,\n requiredCaptcha: null,\n failureReason: MEETING_INFO_FAILURE_REASON.NONE,\n };\n })\n .catch((error) => {\n if (error instanceof PasswordError || error instanceof CaptchaError) {\n return {\n isPasswordValid: this.passwordStatus === PASSWORD_STATUS.VERIFIED,\n requiredCaptcha: this.requiredCaptcha,\n failureReason: this.meetingInfoFailureReason,\n };\n }\n throw error;\n });\n }\n\n /**\n * Refreshes the captcha. As a result the meeting will have new captcha id, image and audio.\n * If the refresh operation fails, meeting remains with the old captcha properties.\n * @public\n * @memberof Meeting\n * @returns {Promise}\n */\n public refreshCaptcha() {\n if (!this.requiredCaptcha) {\n return Promise.reject(new Error('There is no captcha to refresh'));\n }\n\n // in order to get fully populated uris for captcha audio and image in response to refresh captcha request\n // we have to pass the wbxappapi hostname as the siteFullName parameter\n const {hostname} = new URL(this.requiredCaptcha.refreshURL);\n\n return (\n this.meetingRequest\n // @ts-ignore\n .refreshCaptcha({\n captchaRefreshUrl: `${this.requiredCaptcha.refreshURL}&siteFullName=${hostname}`,\n captchaId: this.requiredCaptcha.captchaId,\n })\n .then((response) => {\n this.requiredCaptcha.captchaId = response.body.captchaID;\n this.requiredCaptcha.verificationImageURL = response.body.verificationImageURL;\n this.requiredCaptcha.verificationAudioURL = response.body.verificationAudioURL;\n })\n .catch((error) => {\n LoggerProxy.logger.error(\n `Meeting:index#refreshCaptcha --> Error Unable to refresh captcha for ${this.destination} - ${error}`\n );\n throw error;\n })\n );\n }\n\n /**\n * Proxy function for all the listener set ups\n * @returns {undefined}\n * @private\n * @memberof Meeting\n */\n private setUpLocusInfoListeners() {\n // meeting update listeners\n this.setUpLocusInfoSelfListener();\n this.setUpLocusInfoMeetingListener();\n this.setUpLocusServicesListener();\n // members update listeners\n this.setUpLocusFullStateListener();\n this.setUpLocusUrlListener();\n this.setUpLocusHostListener();\n this.setUpLocusSelfListener();\n this.setUpLocusParticipantsListener();\n this.setupLocusControlsListener();\n this.setUpLocusMediaSharesListener();\n this.setUpLocusEmbeddedAppsListener();\n this.setUpLocusInfoMeetingInfoListener();\n this.setUpLocusInfoAssignHostListener();\n this.setUpLocusInfoMediaInactiveListener();\n this.setUpBreakoutsListener();\n }\n\n /**\n * Set up the listeners for breakouts\n * @returns {undefined}\n * @private\n * @memberof Meeting\n */\n setUpBreakoutsListener() {\n this.breakouts.on(BREAKOUTS.EVENTS.BREAKOUTS_CLOSING, () => {\n Trigger.trigger(\n this,\n {\n file: 'meeting/index',\n function: 'setUpBreakoutsListener',\n },\n EVENT_TRIGGERS.MEETING_BREAKOUTS_CLOSING\n );\n });\n\n this.breakouts.on(BREAKOUTS.EVENTS.MESSAGE, (messageEvent) => {\n Trigger.trigger(\n this,\n {\n file: 'meeting/index',\n function: 'setUpBreakoutsListener',\n },\n EVENT_TRIGGERS.MEETING_BREAKOUTS_MESSAGE,\n messageEvent\n );\n });\n\n this.breakouts.on(BREAKOUTS.EVENTS.MEMBERS_UPDATE, () => {\n Trigger.trigger(\n this,\n {\n file: 'meeting/index',\n function: 'setUpBreakoutsListener',\n },\n EVENT_TRIGGERS.MEETING_BREAKOUTS_UPDATE\n );\n });\n }\n\n /**\n * Set up the locus info listener for meetings disconnected due to inactivity\n * @returns {undefined}\n * @private\n * @memberof Meeting\n */\n private setUpLocusInfoMediaInactiveListener() {\n // User gets kicked off the meeting due to inactivity or user did a refresh\n this.locusInfo.on(EVENTS.DISCONNECT_DUE_TO_INACTIVITY, (res) => {\n // https:// jira-eng-gpk2.cisco.com/jira/browse/SPARK-240520\n // TODO: send custom parameter explaining why the inactivity happened\n // refresh , no media or network got dsconnected or something else\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.DISCONNECT_DUE_TO_INACTIVITY, {\n correlation_id: this.correlationId,\n locus_id: this.locusId,\n });\n\n // Upload logs on media inactivity\n // Normally media should not be inactive\n Trigger.trigger(\n this,\n {\n file: 'meeting/index',\n function: 'setUpLocusInfoMediaInactiveListener',\n },\n EVENTS.REQUEST_UPLOAD_LOGS,\n this\n );\n\n LoggerProxy.logger.error(\n `Meeting:index#setUpLocusInfoMediaInactiveListener --> Meeting disconnected due to inactivity: ${res.reason}`\n );\n\n // @ts-ignore - config coming from registerPlugin\n if (this.config.reconnection.autoRejoin) {\n this.reconnect();\n } else {\n Trigger.trigger(\n this,\n {\n file: 'meeting/index',\n function: 'setUpLocusInfoMediaInactiveListener',\n },\n EVENT_TRIGGERS.MEETING_SELF_LEFT,\n res.reason\n );\n }\n });\n }\n\n /**\n * Set up the locus info listener for assign host permissions on a meeting\n * @returns {undefined}\n * @private\n * @memberof Meeting\n */\n private setUpLocusInfoAssignHostListener() {\n this.locusInfo.on(EVENTS.LOCUS_INFO_CAN_ASSIGN_HOST, (payload) => {\n const changed = this.inMeetingActions.set({\n canAssignHost: payload.canAssignHost,\n });\n\n if (changed) {\n Trigger.trigger(\n this,\n {\n file: 'meeting/index',\n function: 'setUpLocusInfoAssignHostListener',\n },\n EVENT_TRIGGERS.MEETING_ACTIONS_UPDATE,\n this.inMeetingActions.get()\n );\n }\n });\n }\n\n /**\n * Set up the internal locus info full state object listener\n * @returns {undefined}\n * @private\n * @memberof Meeting\n */\n private setUpLocusFullStateListener() {\n this.locusInfo.on(LOCUSINFO.EVENTS.FULL_STATE_MEETING_STATE_CHANGE, (payload) => {\n Trigger.trigger(\n this,\n {\n file: 'meeting/index',\n function: 'setUpLocusFullStateListener',\n },\n EVENT_TRIGGERS.MEETING_STATE_CHANGE,\n {\n payload,\n }\n );\n });\n\n this.locusInfo.on(LOCUSINFO.EVENTS.FULL_STATE_TYPE_UPDATE, (payload) => {\n this.members.locusFullStateTypeUpdate(payload);\n });\n }\n\n /**\n * get the metrics payload pre\n * @param {Object} options\n * @param {String} options.event\n * @param {String} options.trackingId\n * @param {Object} options.locus\n * @param {Array} options.mediaConnections\n * @param {Object} options.errors\n * @returns {Object}\n * @memberof Meeting\n */\n getAnalyzerMetricsPrePayload(\n options:\n | {\n event: string;\n trackingId: string;\n locus: object;\n mediaConnections: Array<any>;\n errors: object;\n }\n | any\n ) {\n if (options) {\n const {event, trackingId, mediaConnections} = options;\n\n if (!event) {\n LoggerProxy.logger.error(\n 'Meeting:index#getAnalyzerMetricsPrePayload --> Error [Call Analyzer Event',\n event || '',\n `]: invalid identifers or event type! ${this.correlationId}`\n );\n\n return null;\n }\n\n const identifiers: any = {\n correlationId: this.correlationId,\n userId: this.userId,\n deviceId: this.deviceUrl,\n orgId: this.orgId,\n // @ts-ignore fix type\n locusUrl: this.webex.internal.services.get('locus'),\n };\n\n if (this.locusUrl && this.locusInfo.fullState) {\n identifiers.locusUrl = this.locusUrl;\n identifiers.locusId = this.locusUrl && this.locusUrl.split('/').pop();\n identifiers.locusStartTime =\n this.locusInfo.fullState && this.locusInfo.fullState.lastActive;\n }\n\n // Check if mediaConnections has been passed in or else use this.mediaConnections\n if (mediaConnections) {\n identifiers.mediaAgentAlias = mediaConnections?.[0].mediaAgentAlias;\n identifiers.mediaAgentGroupId = mediaConnections?.[0].mediaAgentGroupId;\n identifiers.mediaAgentCluster = mediaConnections?.[0].mediaAgentCluster;\n } else if (this.mediaConnections) {\n identifiers.mediaAgentAlias = this.mediaConnections?.[0].mediaAgentAlias;\n identifiers.mediaAgentGroupId = this.mediaConnections?.[0].mediaAgentGroupId;\n identifiers.mediaAgentCluster = this.mediaConnections?.[0].mediaAgentCluster;\n }\n\n if (options.trackingId) {\n identifiers.trackingId = trackingId;\n }\n\n let payload = {};\n\n const joinRespRxStartAudio = this.getSetupDelayDuration('audio');\n\n if (joinRespRxStartAudio) {\n options.audioSetupDelay = {\n joinRespRxStart: joinRespRxStartAudio,\n };\n }\n\n const joinRespRxStartVideo = this.getSetupDelayDuration('video');\n\n if (joinRespRxStartAudio) {\n options.videoSetupDelay = {\n joinRespRxStart: joinRespRxStartVideo,\n };\n }\n\n const joinRespTxStartAudio = this.getSendingMediaDelayDuration('audio');\n\n if (joinRespTxStartAudio) {\n options.audioSetupDelay = {\n ...options.audioSetupDelay,\n joinRespTxStart: joinRespTxStartAudio,\n };\n }\n\n const joinRespTxStartVideo = this.getSendingMediaDelayDuration('video');\n\n if (joinRespTxStartVideo) {\n options.videoSetupDelay = {\n ...options.videoSetupDelay,\n joinRespTxStart: joinRespTxStartVideo,\n };\n }\n\n const localSDPGenRemoteSDPRecv = this.getLocalSDPGenRemoteSDPRecvDelay();\n\n if (localSDPGenRemoteSDPRecv) {\n options.joinTimes = {\n ...options.joinTimes,\n localSDPGenRemoteSDPRecv,\n };\n }\n\n const callInitiateJoinReq = this.getCallInitiateJoinReq();\n\n if (callInitiateJoinReq) {\n options.joinTimes = {\n ...options.joinTimes,\n callInitiateJoinReq,\n };\n }\n\n const joinReqResp = this.getJoinReqResp();\n\n if (joinReqResp) {\n options.joinTimes = {\n ...options.joinTimes,\n joinReqResp,\n };\n }\n\n const getTotalJmt = this.getTotalJmt();\n\n if (getTotalJmt) {\n options.joinTimes = {\n ...options.joinTimes,\n getTotalJmt,\n };\n }\n\n if (options.type === MQA_STATS.CA_TYPE) {\n payload = Metrics.initMediaPayload(options.event, identifiers, options);\n } else {\n payload = Metrics.initPayload(options.event, identifiers, options);\n }\n\n return payload;\n }\n\n return null;\n }\n\n /**\n * Send the metrics to call-analyzer dashboard\n * @param {Object} options\n * @param {String} options.event\n * @param {String} options.trackingId\n * @param {Object} options.locus\n * @param {Object} options.errors\n * @returns {Promise}\n * @private\n * @memberof Meeting\n */\n private sendCallAnalyzerMetrics(options: {\n event: string;\n trackingId: string;\n locus: object;\n errors: object;\n }) {\n const payload = this.getAnalyzerMetricsPrePayload({\n // @ts-ignore - config coming from registerPlugin\n ...pick(this.config.metrics, ['clientType', 'subClientType']),\n ...options,\n });\n\n // @ts-ignore - fix type\n return this.webex.internal.metrics.submitCallDiagnosticEvents(payload);\n }\n\n /**\n * Send the metrics to Media Quality Analyzer dashboard\n * @param {Object} options\n * @param {String} options.event\n * @param {String} options.trackingId\n * @param {Object} options.locus\n * @returns {Promise}\n * @private\n * @memberof Meeting\n */\n private sendMediaQualityAnalyzerMetrics(options: {\n event: string;\n trackingId: string;\n locus: object;\n }) {\n const payload = this.getAnalyzerMetricsPrePayload({\n type: MQA_STATS.CA_TYPE,\n // @ts-ignore - config coming from registerPlugin\n ...pick(this.config.metrics, ['clientType', 'subClientType']),\n ...options,\n });\n\n // @ts-ignore\n return this.webex.internal.metrics.submitCallDiagnosticEvents(payload);\n }\n\n /**\n * sets the network status on meeting object\n * @param {String} networkStatus\n * @private\n * @returns {undefined}\n * @memberof Meeting\n */\n private setNetworkStatus(networkStatus: string) {\n if (networkStatus === NETWORK_STATUS.DISCONNECTED) {\n Trigger.trigger(\n this,\n {\n file: 'meeting/index',\n function: 'setNetworkStatus',\n },\n EVENT_TRIGGERS.MEETINGS_NETWORK_DISCONNECTED\n );\n } else if (\n networkStatus === NETWORK_STATUS.CONNECTED &&\n this.networkStatus === NETWORK_STATUS.DISCONNECTED\n ) {\n Trigger.trigger(\n this,\n {\n file: 'meeting/index',\n function: 'setNetworkStatus',\n },\n EVENT_TRIGGERS.MEETINGS_NETWORK_CONNECTED\n );\n }\n\n this.networkStatus = networkStatus;\n }\n\n /**\n * Set up the locus info self listener\n * update self value for members and updates the member\n * notifies consumer with members:self:update {activeSelfId endedSelfId}\n * @returns {undefined}\n * @private\n * @memberof Meeting\n */\n private setUpLocusSelfListener() {\n this.locusInfo.on(EVENTS.LOCUS_INFO_UPDATE_SELF, (payload) => {\n this.members.locusSelfUpdate(payload);\n this.pstnUpdate(payload);\n\n // If user moved to a JOINED state and there is a pending floor grant trigger it\n if (this.floorGrantPending && payload.newSelf.state === MEETING_STATE.STATES.JOINED) {\n this.requestScreenShareFloor().then(() => {\n this.floorGrantPending = false;\n });\n }\n });\n }\n\n /**\n * Notify any changes on the pstn devices\n * @param {Object} payload\n * @returns {undefined}\n * @private\n * @memberof Meeting\n */\n private pstnUpdate(payload: any) {\n if (this.locusInfo.self) {\n const dialInPstnDevice = payload.newSelf?.pstnDevices.find(\n (device) => device.url === this.dialInUrl\n );\n const dialOutPstnDevice = payload.newSelf?.pstnDevices.find(\n (device) => device.url === this.dialOutUrl\n );\n let changed = false;\n\n if (dialInPstnDevice) {\n const newStatus = dialInPstnDevice.dialingStatus ?? dialInPstnDevice.state;\n\n if (newStatus !== this.dialInDeviceStatus) {\n this.dialInDeviceStatus = newStatus;\n changed = true;\n }\n }\n\n if (dialOutPstnDevice) {\n const newStatus = dialOutPstnDevice.dialingStatus ?? dialOutPstnDevice.state;\n\n if (newStatus !== this.dialOutDeviceStatus) {\n this.dialOutDeviceStatus = newStatus;\n changed = true;\n }\n }\n\n if (changed) {\n Trigger.trigger(\n this,\n {\n file: 'meeting/index',\n function: 'setUpLocusSelfListener',\n },\n EVENT_TRIGGERS.MEETING_SELF_PHONE_AUDIO_UPDATE,\n {\n dialIn: {\n status: this.dialInDeviceStatus,\n attendeeId: dialInPstnDevice?.attendeeId,\n },\n dialOut: {\n status: this.dialOutDeviceStatus,\n attendeeId: dialOutPstnDevice?.attendeeId,\n },\n }\n );\n }\n }\n }\n\n /**\n * Set up the locus info host listener\n * update host value for members and updates the member\n * notifies consumer with members:host:update: {activeHostId, endedHostId}\n * @returns {undefined}\n * @private\n * @memberof Meeting\n */\n private setUpLocusHostListener() {\n this.locusInfo.on(EVENTS.LOCUS_INFO_UPDATE_HOST, (payload) => {\n this.members.locusHostUpdate(payload);\n });\n }\n\n /**\n * Set up the locus info participants update listener\n * update members collection value for members\n * notifies consumer with members:update\n * @returns {undefined}\n * @private\n * @memberof Meeting\n */\n private setUpLocusParticipantsListener() {\n this.locusInfo.on(EVENTS.LOCUS_INFO_UPDATE_PARTICIPANTS, (payload) => {\n this.members.locusParticipantsUpdate(payload);\n });\n }\n\n /**\n * Set up the locus info recording update listener\n * update recording value for the meeting\n * notifies consumer with:\n * meeting:recording:started\n * meeting:recording:stopped\n * meeting:recording:paused\n * meeting:recording:resumed\n *\n * Set up the locus info meeeting container listener\n * update meetingContainerUrl value for the meeting\n * notifies consumer with:\n * meeting:meetingContainer:update\n *\n * @returns {undefined}\n * @private\n * @memberof Meeting\n */\n private setupLocusControlsListener() {\n this.locusInfo.on(\n LOCUSINFO.EVENTS.CONTROLS_RECORDING_UPDATED,\n ({state, modifiedBy, lastModified}) => {\n let event;\n\n switch (state) {\n case RECORDING_STATE.RECORDING:\n event = EVENT_TRIGGERS.MEETING_STARTED_RECORDING;\n break;\n case RECORDING_STATE.IDLE:\n event = EVENT_TRIGGERS.MEETING_STOPPED_RECORDING;\n break;\n case RECORDING_STATE.PAUSED:\n event = EVENT_TRIGGERS.MEETING_PAUSED_RECORDING;\n break;\n case RECORDING_STATE.RESUMED:\n event = EVENT_TRIGGERS.MEETING_RESUMED_RECORDING;\n break;\n default:\n event = null;\n break;\n }\n\n // `RESUMED` state should be converted to `RECORDING` after triggering the event\n this.recording = {\n state: state === RECORDING_STATE.RESUMED ? RECORDING_STATE.RECORDING : state,\n modifiedBy,\n lastModified,\n };\n\n Trigger.trigger(\n this,\n {\n file: 'meeting/index',\n function: 'setupLocusControlsListener',\n },\n event,\n this.recording\n );\n }\n );\n\n this.locusInfo.on(\n LOCUSINFO.EVENTS.CONTROLS_MEETING_CONTAINER_UPDATED,\n ({meetingContainerUrl}) => {\n Trigger.trigger(\n this,\n {\n file: 'meeting/index',\n function: 'setupLocusControlsListener',\n },\n EVENT_TRIGGERS.MEETING_MEETING_CONTAINER_UPDATE,\n {meetingContainerUrl}\n );\n }\n );\n\n this.locusInfo.on(\n LOCUSINFO.EVENTS.CONTROLS_MEETING_TRANSCRIBE_UPDATED,\n ({caption, transcribing}) => {\n // @ts-ignore - config coming from registerPlugin\n if (transcribing && this.transcription && this.config.receiveTranscription) {\n this.receiveTranscription();\n } else if (!transcribing && this.transcription) {\n Trigger.trigger(\n this,\n {\n file: 'meeting/index',\n function: 'setupLocusControlsListener',\n },\n EVENT_TRIGGERS.MEETING_STOPPED_RECEIVING_TRANSCRIPTION,\n {caption, transcribing}\n );\n }\n }\n );\n\n this.locusInfo.on(LOCUSINFO.EVENTS.CONTROLS_MEETING_BREAKOUT_UPDATED, ({breakout}) => {\n this.breakouts.updateBreakout(breakout);\n Trigger.trigger(\n this,\n {\n file: 'meeting/index',\n function: 'setupLocusControlsListener',\n },\n EVENT_TRIGGERS.MEETING_BREAKOUTS_UPDATE\n );\n });\n\n this.locusInfo.on(LOCUSINFO.EVENTS.CONTROLS_ENTRY_EXIT_TONE_UPDATED, ({entryExitTone}) => {\n Trigger.trigger(\n this,\n {\n file: 'meeting/index',\n function: 'setupLocusControlsListener',\n },\n EVENT_TRIGGERS.MEETING_ENTRY_EXIT_TONE_UPDATE,\n {entryExitTone}\n );\n });\n }\n\n /**\n * Set up the locus info media shares listener\n * update content and whiteboard sharing id value for members, and updates the member\n * notifies consumer with members:content:update {activeContentSharingId, endedContentSharingId}\n * @returns {undefined}\n * @private\n * @memberof Meeting\n */\n private setUpLocusMediaSharesListener() {\n // Will get triggered on local and remote share\n this.locusInfo.on(EVENTS.LOCUS_INFO_UPDATE_MEDIA_SHARES, async (payload) => {\n const {content: contentShare, whiteboard: whiteboardShare} = payload.current;\n const previousContentShare = payload.previous?.content;\n const previousWhiteboardShare = payload.previous?.whiteboard;\n\n if (\n contentShare.beneficiaryId === previousContentShare?.beneficiaryId &&\n contentShare.disposition === previousContentShare?.disposition &&\n whiteboardShare.beneficiaryId === previousWhiteboardShare?.beneficiaryId &&\n whiteboardShare.disposition === previousWhiteboardShare?.disposition &&\n whiteboardShare.resourceUrl === previousWhiteboardShare?.resourceUrl\n ) {\n // nothing changed, so ignore\n // (this happens when we steal presentation from remote)\n return;\n }\n\n let newShareStatus = this.shareStatus;\n\n // REMOTE - check if remote started sharing\n if (\n this.selfId !== contentShare.beneficiaryId &&\n contentShare.disposition === FLOOR_ACTION.GRANTED\n ) {\n // CONTENT - sharing content remote\n newShareStatus = SHARE_STATUS.REMOTE_SHARE_ACTIVE;\n }\n // LOCAL - check if we started sharing content\n else if (\n this.selfId === contentShare.beneficiaryId &&\n contentShare.disposition === FLOOR_ACTION.GRANTED\n ) {\n // @ts-ignore originalTrack is private - this will be fixed when SPARK-399694 are SPARK-399695 done\n const localShareTrack = this.mediaProperties.shareTrack?.originalTrack;\n\n // todo: remove this block of code and instead make sure we have LocalTrackEvents.Ended listener always registered (SPARK-399695)\n if (localShareTrack?.readyState === 'ended') {\n try {\n if (this.isMultistream) {\n await this.unpublishTracks([localShareTrack]); // todo screen share audio (SPARK-399690)\n } else {\n await this.stopShare({\n skipSignalingCheck: true,\n });\n }\n } catch (error) {\n LoggerProxy.logger.log(\n 'Meeting:index#setUpLocusMediaSharesListener --> Error stopping share: ',\n error\n );\n }\n } else {\n // CONTENT - sharing content local\n newShareStatus = SHARE_STATUS.LOCAL_SHARE_ACTIVE;\n }\n }\n // If we did not hit the cases above, no one is sharng content, so we check if we are sharing whiteboard\n // There is no concept of local/remote share for whiteboard\n // It does not matter who requested to share the whiteboard, everyone gets the same view\n else if (whiteboardShare.disposition === FLOOR_ACTION.GRANTED) {\n // WHITEBOARD - sharing whiteboard\n newShareStatus = SHARE_STATUS.WHITEBOARD_SHARE_ACTIVE;\n }\n // or if content share is either released or null and whiteboard share is either released or null, no one is sharing\n else if (\n ((previousContentShare && contentShare.disposition === FLOOR_ACTION.RELEASED) ||\n contentShare.disposition === null) &&\n ((previousWhiteboardShare && whiteboardShare.disposition === FLOOR_ACTION.RELEASED) ||\n whiteboardShare.disposition === null)\n ) {\n newShareStatus = SHARE_STATUS.NO_SHARE;\n }\n\n if (newShareStatus !== this.shareStatus) {\n const oldShareStatus = this.shareStatus;\n\n // update our state before we send out any notifications\n this.shareStatus = newShareStatus;\n\n // send out \"stop\" notifications for the old state\n switch (oldShareStatus) {\n case SHARE_STATUS.REMOTE_SHARE_ACTIVE:\n Trigger.trigger(\n this,\n {\n file: 'meetings/index',\n function: 'remoteShare',\n },\n EVENT_TRIGGERS.MEETING_STOPPED_SHARING_REMOTE\n );\n break;\n\n case SHARE_STATUS.LOCAL_SHARE_ACTIVE:\n Trigger.trigger(\n this,\n {\n file: 'meeting/index',\n function: 'localShare',\n },\n EVENT_TRIGGERS.MEETING_STOPPED_SHARING_LOCAL,\n {\n reason: SHARE_STOPPED_REASON.SELF_STOPPED,\n }\n );\n break;\n\n case SHARE_STATUS.WHITEBOARD_SHARE_ACTIVE:\n Trigger.trigger(\n this,\n {\n file: 'meeting/index',\n function: 'stopWhiteboardShare',\n },\n EVENT_TRIGGERS.MEETING_STOPPED_SHARING_WHITEBOARD\n );\n break;\n\n case SHARE_STATUS.NO_SHARE:\n // nothing to do\n break;\n\n default:\n break;\n }\n\n // send \"start\" notifications for the new state\n switch (newShareStatus) {\n case SHARE_STATUS.REMOTE_SHARE_ACTIVE: {\n const sendStartedSharingRemote = () => {\n Trigger.trigger(\n this,\n {\n file: 'meetings/index',\n function: 'remoteShare',\n },\n EVENT_TRIGGERS.MEETING_STARTED_SHARING_REMOTE,\n {\n memberId: contentShare.beneficiaryId,\n }\n );\n };\n\n try {\n // if a remote participant is stealing the presentation from us\n if (\n this.mediaProperties.mediaDirection?.sendShare &&\n oldShareStatus === SHARE_STATUS.LOCAL_SHARE_ACTIVE\n ) {\n if (this.isMultistream) {\n // @ts-ignore originalTrack is private - this will be fixed in SPARK-399694\n await this.unpublishTracks([this.mediaProperties.shareTrack?.originalTrack]); // todo screen share audio (SPARK-399690)\n } else {\n await this.updateShare({\n sendShare: false,\n receiveShare: this.mediaProperties.mediaDirection.receiveShare,\n });\n }\n }\n } finally {\n sendStartedSharingRemote();\n }\n break;\n }\n\n case SHARE_STATUS.LOCAL_SHARE_ACTIVE:\n Trigger.trigger(\n this,\n {\n file: 'meeting/index',\n function: 'share',\n },\n EVENT_TRIGGERS.MEETING_STARTED_SHARING_LOCAL\n );\n Metrics.postEvent({event: eventType.LOCAL_SHARE_FLOOR_GRANTED, meeting: this});\n break;\n\n case SHARE_STATUS.WHITEBOARD_SHARE_ACTIVE:\n Trigger.trigger(\n this,\n {\n file: 'meeting/index',\n function: 'startWhiteboardShare',\n },\n EVENT_TRIGGERS.MEETING_STARTED_SHARING_WHITEBOARD,\n {\n resourceUrl: whiteboardShare.resourceUrl,\n memberId: whiteboardShare.beneficiaryId,\n }\n );\n Metrics.postEvent({event: eventType.WHITEBOARD_SHARE_FLOOR_GRANTED, meeting: this});\n break;\n\n case SHARE_STATUS.NO_SHARE:\n // nothing to do\n break;\n\n default:\n break;\n }\n\n this.members.locusMediaSharesUpdate(payload);\n } else if (newShareStatus === SHARE_STATUS.REMOTE_SHARE_ACTIVE) {\n // if we got here, then some remote participant has stolen\n // the presentation from another remote participant\n Trigger.trigger(\n this,\n {\n file: 'meetings/index',\n function: 'remoteShare',\n },\n EVENT_TRIGGERS.MEETING_STARTED_SHARING_REMOTE,\n {\n memberId: contentShare.beneficiaryId,\n }\n );\n this.members.locusMediaSharesUpdate(payload);\n } else if (newShareStatus === SHARE_STATUS.WHITEBOARD_SHARE_ACTIVE) {\n // if we got here, then some remote participant has stolen\n // the presentation from another remote participant\n Trigger.trigger(\n this,\n {\n file: 'meeting/index',\n function: 'startWhiteboardShare',\n },\n EVENT_TRIGGERS.MEETING_STARTED_SHARING_WHITEBOARD,\n {\n resourceUrl: whiteboardShare.resourceUrl,\n memberId: whiteboardShare.beneficiaryId,\n }\n );\n Metrics.postEvent({event: eventType.WHITEBOARD_SHARE_FLOOR_GRANTED, meeting: this});\n this.members.locusMediaSharesUpdate(payload);\n }\n });\n }\n\n /**\n * Set up the locus info url listener\n * update locus_url value for members\n * @returns {undefined}\n * @private\n * @memberof Meeting\n */\n private setUpLocusUrlListener() {\n this.locusInfo.on(EVENTS.LOCUS_INFO_UPDATE_URL, (payload) => {\n this.members.locusUrlUpdate(payload);\n this.breakouts.locusUrlUpdate(payload);\n this.locusUrl = payload;\n this.locusId = this.locusUrl?.split('/').pop();\n this.recordingController.setLocusUrl(this.locusUrl);\n this.controlsOptionsManager.setLocusUrl(this.locusUrl);\n });\n }\n\n /**\n * Set up the locus info service link listener\n * update the locusInfo for recording controller\n * does not currently re-emit the event as it's internal only\n * payload is unused\n * @returns {undefined}\n * @private\n * @memberof Meeting\n */\n private setUpLocusServicesListener() {\n this.locusInfo.on(LOCUSINFO.EVENTS.LINKS_SERVICES, (payload) => {\n this.recordingController.setServiceUrl(payload?.services?.record?.url);\n this.recordingController.setSessionId(this.locusInfo?.fullState?.sessionId);\n this.breakouts.breakoutServiceUrlUpdate(payload?.services?.breakout?.url);\n });\n }\n\n /**\n * Set up the locus info meeting info listener\n * @returns {undefined}\n * @private\n * @memberof meeting\n */\n private setUpLocusInfoMeetingInfoListener() {\n this.locusInfo.on(LOCUSINFO.EVENTS.MEETING_LOCKED, (payload) => {\n if (payload) {\n Trigger.trigger(\n this,\n {\n file: 'meeting/index',\n function: 'setUpLocusInfoMeetingInfoListener',\n },\n EVENT_TRIGGERS.MEETING_LOCKED,\n {\n payload,\n }\n );\n }\n });\n this.locusInfo.on(LOCUSINFO.EVENTS.MEETING_UNLOCKED, (payload) => {\n if (payload) {\n Trigger.trigger(\n this,\n {\n file: 'meeting/index',\n function: 'setUpLocusInfoMeetingInfoListener',\n },\n EVENT_TRIGGERS.MEETING_UNLOCKED,\n {\n payload,\n }\n );\n }\n });\n this.locusInfo.on(LOCUSINFO.EVENTS.MEETING_INFO_UPDATED, (payload) => {\n if (payload && payload.info) {\n const changed = this.inMeetingActions.set({\n canInviteNewParticipants: MeetingUtil.canInviteNewParticipants(\n payload.info.userDisplayHints\n ),\n canAdmitParticipant: MeetingUtil.canAdmitParticipant(payload.info.userDisplayHints),\n canLock: MeetingUtil.canUserLock(payload.info.userDisplayHints),\n canUnlock: MeetingUtil.canUserUnlock(payload.info.userDisplayHints),\n canSetDisallowUnmute: ControlsOptionsUtil.canSetDisallowUnmute(\n payload.info.userDisplayHints\n ),\n canUnsetDisallowUnmute: ControlsOptionsUtil.canUnsetDisallowUnmute(\n payload.info.userDisplayHints\n ),\n canSetMuteOnEntry: ControlsOptionsUtil.canSetMuteOnEntry(payload.info.userDisplayHints),\n canUnsetMuteOnEntry: ControlsOptionsUtil.canUnsetMuteOnEntry(\n payload.info.userDisplayHints\n ),\n canSetMuted: ControlsOptionsUtil.canSetMuted(payload.info.userDisplayHints),\n canUnsetMuted: ControlsOptionsUtil.canUnsetMuted(payload.info.userDisplayHints),\n canStartRecording: RecordingUtil.canUserStart(payload.info.userDisplayHints),\n canStopRecording: RecordingUtil.canUserStop(payload.info.userDisplayHints),\n canPauseRecording: RecordingUtil.canUserPause(payload.info.userDisplayHints),\n canResumeRecording: RecordingUtil.canUserResume(payload.info.userDisplayHints),\n canRaiseHand: MeetingUtil.canUserRaiseHand(payload.info.userDisplayHints),\n canLowerAllHands: MeetingUtil.canUserLowerAllHands(payload.info.userDisplayHints),\n canLowerSomeoneElsesHand: MeetingUtil.canUserLowerSomeoneElsesHand(\n payload.info.userDisplayHints\n ),\n bothLeaveAndEndMeetingAvailable: MeetingUtil.bothLeaveAndEndMeetingAvailable(\n payload.info.userDisplayHints\n ),\n canEnableClosedCaption: MeetingUtil.canEnableClosedCaption(payload.info.userDisplayHints),\n canStartTranscribing: MeetingUtil.canStartTranscribing(payload.info.userDisplayHints),\n canStopTranscribing: MeetingUtil.canStopTranscribing(payload.info.userDisplayHints),\n isClosedCaptionActive: MeetingUtil.isClosedCaptionActive(payload.info.userDisplayHints),\n isSaveTranscriptsEnabled: MeetingUtil.isSaveTranscriptsEnabled(\n payload.info.userDisplayHints\n ),\n isWebexAssistantActive: MeetingUtil.isWebexAssistantActive(payload.info.userDisplayHints),\n canViewCaptionPanel: MeetingUtil.canViewCaptionPanel(payload.info.userDisplayHints),\n isRealTimeTranslationEnabled: MeetingUtil.isRealTimeTranslationEnabled(\n payload.info.userDisplayHints\n ),\n canSelectSpokenLanguages: MeetingUtil.canSelectSpokenLanguages(\n payload.info.userDisplayHints\n ),\n waitingForOthersToJoin: MeetingUtil.waitingForOthersToJoin(payload.info.userDisplayHints),\n canEnableReactions: MeetingUtil.canEnableReactions(\n this.inMeetingActions.canEnableReactions,\n payload.info.userDisplayHints\n ),\n canSendReactions: MeetingUtil.canSendReactions(\n this.inMeetingActions.canSendReactions,\n payload.info.userDisplayHints\n ),\n canManageBreakout: MeetingUtil.canManageBreakout(payload.info.userDisplayHints),\n canAdmitLobbyToBreakout: MeetingUtil.canAdmitLobbyToBreakout(\n payload.info.userDisplayHints\n ),\n isBreakoutPreassignmentsEnabled: MeetingUtil.isBreakoutPreassignmentsEnabled(\n payload.info.userDisplayHints\n ),\n canUserAskForHelp: MeetingUtil.canUserAskForHelp(payload.info.userDisplayHints),\n canUserRenameSelfAndObserved: MeetingUtil.canUserRenameSelfAndObserved(\n payload.info.userDisplayHints\n ),\n canUserRenameOthers: MeetingUtil.canUserRenameOthers(payload.info.userDisplayHints),\n });\n\n this.recordingController.setDisplayHints(payload.info.userDisplayHints);\n this.controlsOptionsManager.setDisplayHints(payload.info.userDisplayHints);\n\n if (changed) {\n Trigger.trigger(\n this,\n {\n file: 'meeting/index',\n function: 'setUpLocusInfoMeetingInfoListener',\n },\n EVENT_TRIGGERS.MEETING_ACTIONS_UPDATE,\n this.inMeetingActions.get()\n );\n }\n\n this.handleDataChannelUrlChange(payload.info.datachannelUrl);\n }\n });\n }\n\n /**\n * Handles a data channel URL change\n * @param {String} datachannelUrl\n * @returns {void}\n */\n handleDataChannelUrlChange(datachannelUrl) {\n // @ts-ignore - config coming from registerPlugin\n if (datachannelUrl && this.config.enableAutomaticLLM) {\n // Defer this as updateLLMConnection relies upon this.locusInfo.url which is only set\n // after the MEETING_INFO_UPDATED callback finishes\n defer(() => {\n this.updateLLMConnection();\n });\n }\n }\n\n /**\n * Set up the locus info embedded apps listener\n * @returns {undefined}\n * @private\n * @memberof meeting\n */\n private setUpLocusEmbeddedAppsListener() {\n this.locusInfo.on(LOCUSINFO.EVENTS.EMBEDDED_APPS_UPDATED, (embeddedApps) => {\n if (embeddedApps) {\n Trigger.trigger(\n this,\n {\n file: 'meeting/index',\n function: 'setUpLocusEmbeddedAppsListener',\n },\n EVENT_TRIGGERS.MEETING_EMBEDDED_APPS_UPDATE,\n embeddedApps\n );\n }\n });\n }\n\n /**\n * Internal function to listen to the self object changes\n * @returns {undefined}\n * @private\n * @memberof Meeting\n */\n private setUpLocusInfoSelfListener() {\n this.locusInfo.on(LOCUSINFO.EVENTS.LOCAL_UNMUTE_REQUIRED, (payload) => {\n if (this.audio) {\n this.audio.handleServerLocalUnmuteRequired(this);\n Trigger.trigger(\n this,\n {\n file: 'meeting/index',\n function: 'setUpLocusInfoSelfListener',\n },\n EVENT_TRIGGERS.MEETING_SELF_UNMUTED_BY_OTHERS,\n {\n payload,\n }\n );\n }\n });\n\n this.locusInfo.on(LOCUSINFO.EVENTS.SELF_REMOTE_VIDEO_MUTE_STATUS_UPDATED, (payload) => {\n if (payload) {\n if (this.video) {\n payload.muted = payload.muted ?? this.video.isRemotelyMuted();\n payload.unmuteAllowed = payload.unmuteAllowed ?? this.video.isUnmuteAllowed();\n this.video.handleServerRemoteMuteUpdate(payload.muted, payload.unmuteAllowed);\n }\n Trigger.trigger(\n this,\n {\n file: 'meeting/index',\n function: 'setUpLocusInfoSelfListener',\n },\n payload.muted\n ? EVENT_TRIGGERS.MEETING_SELF_VIDEO_MUTED_BY_OTHERS\n : EVENT_TRIGGERS.MEETING_SELF_VIDEO_UNMUTED_BY_OTHERS,\n {\n payload,\n }\n );\n }\n });\n\n this.locusInfo.on(LOCUSINFO.EVENTS.SELF_REMOTE_MUTE_STATUS_UPDATED, (payload) => {\n if (payload) {\n if (this.audio) {\n this.audio.handleServerRemoteMuteUpdate(payload.muted, payload.unmuteAllowed);\n }\n // with \"mute on entry\" server will send us remote mute even if we don't have media configured,\n // so if being muted by others, always send the notification,\n // but if being unmuted, only send it if we are also locally unmuted\n if (payload.muted || !this.audio?.isMuted()) {\n Trigger.trigger(\n this,\n {\n file: 'meeting/index',\n function: 'setUpLocusInfoSelfListener',\n },\n payload.muted\n ? EVENT_TRIGGERS.MEETING_SELF_MUTED_BY_OTHERS\n : EVENT_TRIGGERS.MEETING_SELF_UNMUTED_BY_OTHERS,\n {\n payload,\n }\n );\n }\n }\n });\n this.locusInfo.on(LOCUSINFO.EVENTS.LOCAL_UNMUTE_REQUESTED, (payload) => {\n Trigger.trigger(\n this,\n {\n file: 'meeting/index',\n function: 'setUpLocusInfoSelfListener',\n },\n EVENT_TRIGGERS.MEETING_SELF_REQUESTED_TO_UNMUTE,\n {\n payload,\n }\n );\n });\n this.locusInfo.on(LOCUSINFO.EVENTS.SELF_UNADMITTED_GUEST, (payload) => {\n if (payload) {\n this.startKeepAlive();\n\n Trigger.trigger(\n this,\n {\n file: 'meeting/index',\n function: 'setUpLocusInfoSelfListener',\n },\n EVENT_TRIGGERS.MEETING_SELF_LOBBY_WAITING,\n {\n payload,\n }\n );\n\n Metrics.postEvent({\n event: eventType.LOBBY_ENTERED,\n meeting: this,\n });\n }\n });\n this.locusInfo.on(LOCUSINFO.EVENTS.SELF_ADMITTED_GUEST, (payload) => {\n this.stopKeepAlive();\n\n if (payload) {\n Trigger.trigger(\n this,\n {\n file: 'meeting/index',\n function: 'setUpLocusInfoSelfListener',\n },\n EVENT_TRIGGERS.MEETING_SELF_GUEST_ADMITTED,\n {\n payload,\n }\n );\n\n Metrics.postEvent({\n event: eventType.LOBBY_EXITED,\n meeting: this,\n });\n }\n });\n\n // @ts-ignore - check if MEDIA_INACTIVITY exists\n this.locusInfo.on(LOCUSINFO.EVENTS.MEDIA_INACTIVITY, () => {\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.MEETING_MEDIA_INACTIVE, {\n correlation_id: this.correlationId,\n locus_id: this.locusId,\n });\n this.reconnect();\n });\n\n // There is two stats for mute one is the actual media being sent or received\n // The second on is if the audio is muted, we need to tell the statsAnalyzer when\n // the audio is muted or the user is not willing to send media\n this.locusInfo.on(LOCUSINFO.EVENTS.MEDIA_STATUS_CHANGE, (status) => {\n if (this.statsAnalyzer) {\n this.statsAnalyzer.updateMediaStatus({\n actual: status,\n expected: {\n // We need to check what should be the actual direction of media\n sendAudio: this.mediaProperties.mediaDirection?.sendAudio && !this.audio?.isMuted(),\n sendVideo: this.mediaProperties.mediaDirection?.sendVideo && !this.video?.isMuted(),\n sendShare: this.mediaProperties.mediaDirection?.sendShare,\n receiveAudio: this.mediaProperties.mediaDirection?.receiveAudio,\n receiveVideo: this.mediaProperties.mediaDirection?.receiveVideo,\n receiveShare: this.mediaProperties.mediaDirection?.receiveShare,\n },\n });\n }\n });\n\n this.locusInfo.on(LOCUSINFO.EVENTS.SELF_CANNOT_VIEW_PARTICIPANT_LIST_CHANGE, (payload) => {\n Trigger.trigger(\n this,\n {\n file: 'meeting/index',\n function: 'setUpLocusInfoSelfListener',\n },\n EVENT_TRIGGERS.MEETING_SELF_CANNOT_VIEW_PARTICIPANT_LIST,\n {\n payload,\n }\n );\n });\n\n this.locusInfo.on(LOCUSINFO.EVENTS.SELF_MEETING_BREAKOUTS_CHANGED, (payload) => {\n this.breakouts.updateBreakoutSessions(payload);\n Trigger.trigger(\n this,\n {\n file: 'meeting/index',\n function: 'setUpLocusInfoSelfListener',\n },\n EVENT_TRIGGERS.MEETING_BREAKOUTS_UPDATE\n );\n });\n\n // We need to reinitialize when user upgrades to host or cohost\n this.locusInfo.on(LOCUSINFO.EVENTS.SELF_MODERATOR_OR_COHOST_UPGRADE, (payload) => {\n this.breakouts.queryPreAssignments(payload);\n // ...\n });\n\n this.locusInfo.on(LOCUSINFO.EVENTS.SELF_IS_SHARING_BLOCKED_CHANGE, (payload) => {\n Trigger.trigger(\n this,\n {\n file: 'meeting/index',\n function: 'setUpLocusInfoSelfListener',\n },\n EVENT_TRIGGERS.MEETING_SELF_IS_SHARING_BLOCKED,\n {\n payload,\n }\n );\n });\n }\n\n /**\n * Add LocusInfo nested object listeners (from child to parent)\n * @returns {undefined}\n * @private\n * @memberof Meeting\n */\n private setUpLocusInfoMeetingListener() {\n this.locusInfo.on(EVENTS.REMOTE_RESPONSE, (payload) => {\n this.meetingFiniteStateMachine.remote(payload);\n\n if (payload.remoteDeclined) {\n this.leave({reason: payload.reason})\n .then(() => {\n LoggerProxy.logger.info(\n 'Meeting:index#setUpLocusInfoMeetingListener --> REMOTE_RESPONSE. Attempting to leave meeting.'\n );\n })\n .catch((error) => {\n // @ts-ignore\n LoggerProxy.logger.error(\n `Meeting:index#setUpLocusInfoMeetingListener --> REMOTE_RESPONSE. Issue with leave for meeting, meeting still in collection: ${this}, error: ${error}`\n );\n });\n }\n });\n this.locusInfo.on(EVENTS.DESTROY_MEETING, (payload) => {\n // if self state is NOT left\n\n // TODO: Handle sharing and wireless sharing when meeting end\n if (this.wirelessShare) {\n if (this.mediaProperties.shareTrack) {\n this.setLocalShareTrack(null);\n }\n }\n // when multiple WEB deviceType join with same user\n // and some of the devices are joined and some are left\n // when your own device is still connected you want to leave and destroy\n // else you want to just destroy\n // this looks odd because when it leaves it should destroy, but we get a\n // leave response and we should destroy it on the next event loop\n // the leave response gets parsed and we decide if we want to destroy the meeting\n // the first time we just leave it, the second time it comes it destroys it from the collection\n if (payload.shouldLeave) {\n // TODO: We should do cleaning of meeting object if the shouldLeave: false because there might be meeting object which we are not cleaning\n\n this.leave({reason: payload.reason})\n .then(() => {\n LoggerProxy.logger.warn(\n 'Meeting:index#setUpLocusInfoMeetingListener --> DESTROY_MEETING. The meeting has been left, but has not been destroyed, you should see a later event for leave.'\n );\n })\n .catch((error) => {\n // @ts-ignore\n LoggerProxy.logger.error(\n `Meeting:index#setUpLocusInfoMeetingListener --> DESTROY_MEETING. Issue with leave for meeting, meeting still in collection: ${this}, error: ${error}`\n );\n });\n } else {\n LoggerProxy.logger.info(\n 'Meeting:index#setUpLocusInfoMeetingListener --> MEETING_REMOVED_REASON',\n payload.reason\n );\n\n MeetingUtil.cleanUp(this);\n Trigger.trigger(\n this,\n {\n file: 'meeting/index',\n function: 'setUpLocusInfoMeetingListener',\n },\n EVENTS.DESTROY_MEETING,\n {\n reason: payload.reason,\n meetingId: this.id,\n }\n );\n }\n });\n }\n\n /**\n * Set meeting values rather than events\n * @param {Object} object\n * @returns {undefined}\n * @private\n * @memberof Meeting\n * // TODO: is this function necessary?\n */\n private updateMeetingObject(object: object) {\n // Validate if these are valid meeting object property\n // TODO: add a check to make sure the value passed in the constructor\n // is not changed by any delta event\n if (object && Object.keys(object).length) {\n Object.keys(object).forEach((key) => {\n this[key] = object[key];\n });\n }\n }\n\n /**\n * Invite a guest to the call that isn't normally part of this call\n * @param {Object} invitee\n * @param {String} invitee.emailAddress\n * @param {String} invitee.email\n * @param {String} invitee.phoneNumber\n * @param {Boolean} [alertIfActive]\n * @returns {Promise} see #members.addMember\n * @public\n * @memberof Meeting\n */\n public invite(\n invitee: {\n emailAddress: string;\n email: string;\n phoneNumber: string;\n },\n alertIfActive = true\n ) {\n return this.members.addMember(invitee, alertIfActive);\n }\n\n /**\n * Cancel an outgoing phone call invitation made during a meeting\n * @param {Object} invitee\n * @param {String} invitee.phoneNumber\n * @returns {Promise} see #members.cancelPhoneInvite\n * @public\n * @memberof Meeting\n */\n public cancelPhoneInvite(invitee: {phoneNumber: string}) {\n return this.members.cancelPhoneInvite(invitee);\n }\n\n /**\n * Admit the guest(s) to the call once they are waiting.\n * If the host/cohost is in a breakout session, the locus url\n * of the session must be provided as the authorizingLocusUrl.\n * Regardless of host/cohost location, the locus Id (lid) in\n * the path should be the locus Id of the main, which means the\n * locus url of the api call must be from the main session.\n * If these loucs urls are not provided, the function will do the check.\n * @param {Array} memberIds\n * @param {Object} sessionLocusUrls: {authorizingLocusUrl, mainLocusUrl}\n * @returns {Promise} see #members.admitMembers\n * @public\n * @memberof Meeting\n */\n public admit(\n memberIds: Array<any>,\n sessionLocusUrls?: {authorizingLocusUrl: string; mainLocusUrl: string}\n ) {\n let locusUrls = sessionLocusUrls;\n if (!locusUrls) {\n const {locusUrl, mainLocusUrl} = this.breakouts;\n if (locusUrl && mainLocusUrl) {\n locusUrls = {authorizingLocusUrl: locusUrl, mainLocusUrl};\n }\n }\n\n return this.members.admitMembers(memberIds, locusUrls);\n }\n\n /**\n * Remove the member from the meeting, boot them\n * @param {String} memberId\n * @returns {Promise} see #members.removeMember\n * @public\n * @memberof Meeting\n */\n public remove(memberId: string) {\n return this.members.removeMember(memberId);\n }\n\n /**\n * Mute another member from the meeting\n * @param {String} memberId\n * @param {Boolean} mute\n * @returns {Promise} see #members.muteMember\n * @public\n * @memberof Meeting\n */\n public mute(memberId: string, mute = true) {\n return this.members.muteMember(memberId, mute);\n }\n\n /**\n * Transfer the moderator role to another eligible member\n * @param {String} memberId\n * @param {Boolean} moderator\n * @returns {Promise} see #members.transferHostToMember\n * @public\n * @memberof Meeting\n */\n public transfer(memberId: string, moderator = true) {\n return this.members.transferHostToMember(memberId, moderator);\n }\n\n /**\n * Reference to the Members object\n * @returns {Members}\n * @public\n * @memberof Meeting\n */\n public getMembers() {\n return this.members;\n }\n\n /**\n * Truthy when a meeting has an audio connection established\n * @returns {Boolean} true if meeting audio is connected otherwise false\n * @public\n * @memberof Meeting\n */\n public isAudioConnected() {\n return !!this.audio;\n }\n\n /**\n * Convenience function to tell whether a meeting is muted\n * @returns {Boolean} if meeting audio muted or not\n * @public\n * @memberof Meeting\n */\n public isAudioMuted() {\n return this.audio && this.audio.isMuted();\n }\n\n /**\n * Convenience function to tell if the end user last changed the audio state\n * @returns {Boolean} if audio was manipulated by the end user\n * @public\n * @memberof Meeting\n */\n public isAudioSelf() {\n return this.audio && this.audio.isSelf();\n }\n\n /**\n * Truthy when a meeting has a video connection established\n * @returns {Boolean} true if meeting video connected otherwise false\n * @public\n * @memberof Meeting\n */\n public isVideoConnected() {\n return !!this.video;\n }\n\n /**\n * Convenience function to tell whether video is muted\n * @returns {Boolean} if meeting video is muted or not\n * @public\n * @memberof Meeting\n */\n public isVideoMuted() {\n return this.video && this.video.isMuted();\n }\n\n /**\n * Convenience function to tell whether the end user changed the video state\n * @returns {Boolean} if meeting video is muted or not\n * @public\n * @memberof Meeting\n */\n public isVideoSelf() {\n return this.video && this.video.isSelf();\n }\n\n /**\n * Sets the meeting info on the class instance\n * @param {Object} meetingInfo\n * @param {Object} meetingInfo.body\n * @param {String} meetingInfo.body.conversationUrl\n * @param {String} meetingInfo.body.locusUrl\n * @param {String} meetingInfo.body.sipUri\n * @param {Object} meetingInfo.body.owner\n * @param {Object | String} destination locus object with meeting data or destination string (sip url, meeting link, etc)\n * @returns {undefined}\n * @private\n * @memberof Meeting\n */\n parseMeetingInfo(\n meetingInfo:\n | {\n body: {\n conversationUrl: string;\n locusUrl: string;\n sipUri: string;\n owner: object;\n };\n }\n | any,\n destination: object | string | null = null\n ) {\n const webexMeetingInfo = meetingInfo?.body;\n // We try to use as much info from Locus meeting object, stored in destination\n\n let locusMeetingObject;\n\n if (destination) {\n locusMeetingObject = typeof destination === 'object' ? destination : undefined;\n }\n\n // MeetingInfo will be undefined for 1:1 calls\n if (\n locusMeetingObject ||\n (webexMeetingInfo && !(meetingInfo?.errors && meetingInfo?.errors.length > 0))\n ) {\n this.conversationUrl =\n locusMeetingObject?.conversationUrl ||\n webexMeetingInfo?.conversationUrl ||\n this.conversationUrl;\n this.locusUrl = locusMeetingObject?.url || webexMeetingInfo?.locusUrl || this.locusUrl;\n // @ts-ignore - config coming from registerPlugin\n this.setSipUri(\n // @ts-ignore\n this.config.experimental.enableUnifiedMeetings\n ? locusMeetingObject?.info.sipUri || webexMeetingInfo?.sipUrl\n : locusMeetingObject?.info.sipUri || webexMeetingInfo?.sipMeetingUri || this.sipUri\n );\n // @ts-ignore - config coming from registerPlugin\n if (this.config.experimental.enableUnifiedMeetings) {\n this.meetingNumber =\n locusMeetingObject?.info.webExMeetingId || webexMeetingInfo?.meetingNumber;\n this.meetingJoinUrl = webexMeetingInfo?.meetingJoinUrl;\n }\n this.owner =\n locusMeetingObject?.info.owner ||\n webexMeetingInfo?.owner ||\n webexMeetingInfo?.hostId ||\n this.owner;\n this.permissionToken = webexMeetingInfo?.permissionToken;\n }\n }\n\n /**\n * Sets the first locus info on the class instance\n * @param {Object} locus\n * @param {String} locus.url\n * @param {Array} locus.participants\n * @param {Object} locus.self\n * @returns {undefined}\n * @private\n * @memberof Meeting\n */\n private parseLocus(locus: {url: string; participants: Array<any>; self: object}) {\n if (locus) {\n this.locusUrl = locus.url;\n // TODO: move this to parse participants module\n this.setLocus(locus);\n\n // check if we can extract this info from partner\n // Parsing of locus object must be finished at this state\n if (locus.participants && locus.self) {\n this.partner = MeetingUtil.getLocusPartner(locus.participants, locus.self);\n }\n\n // For webex meeting the sipUrl gets updated in info parser\n if (!this.sipUri && this.partner && this.type === _CALL_) {\n this.setSipUri(this.partner.person.sipUrl || this.partner.person.id);\n }\n }\n }\n\n /**\n * Sets the sip uri on the class instance\n * uses meeting info as precedence\n * @param {String} sipUri\n * @returns {undefined}\n * @private\n * @memberof Meeting\n */\n setSipUri(sipUri: string) {\n // This can be tel no, device id or a sip uri, user Id\n this.sipUri = sipUri;\n }\n\n /**\n * Set the locus info the class instance\n * @param {Object} locus\n * @param {Array} locus.mediaConnections\n * @param {String} locus.locusUrl\n * @param {String} locus.locusId\n * @param {String} locus.mediaId\n * @param {Object} locus.host\n * @todo change name to genertic parser\n * @returns {undefined}\n * @private\n * @memberof Meeting\n */\n private setLocus(\n locus:\n | {\n mediaConnections: Array<any>;\n locusUrl: string;\n locusId: string;\n mediaId: string;\n host: object;\n }\n | any\n ) {\n const mtgLocus: any = locus.locus || locus;\n\n // LocusInfo object saves the locus object\n // this.locus = mtgLocus;\n this.mediaConnections = locus.mediaConnections;\n this.locusUrl = locus.locusUrl || locus.url;\n this.locusId = locus.locusId;\n this.selfId = locus.selfId;\n this.mediaId = locus.mediaId;\n this.hostId = mtgLocus.host ? mtgLocus.host.id : this.hostId;\n this.locusInfo.initialSetup(mtgLocus);\n }\n\n /**\n * Upload logs for the current meeting\n * @param {object} options file name and function name\n * @returns {undefined}\n * @public\n * @memberof Meeting\n */\n public uploadLogs(options: object = {file: 'meeting/index', function: 'uploadLogs'}) {\n Trigger.trigger(this, options, EVENTS.REQUEST_UPLOAD_LOGS, this);\n }\n\n /**\n * Removes remote audio and video stream on the class instance and triggers an event\n * to developers\n * @returns {undefined}\n * @public\n * @memberof Meeting\n * @deprecated after v1.89.3\n */\n public unsetRemoteStream() {\n LoggerProxy.logger.warn(\n 'Meeting:index#unsetRemoteStream --> [DEPRECATION WARNING]: unsetRemoteStream has been deprecated after v1.89.3'\n );\n this.mediaProperties.unsetRemoteMedia();\n }\n\n /**\n * Removes remote audio, video and share tracks from class instance's mediaProperties\n * @returns {undefined}\n */\n unsetRemoteTracks() {\n this.mediaProperties.unsetRemoteTracks();\n }\n\n /**\n * Removes the remote stream on the class instance and triggers an event\n * to developers\n * @returns {undefined}\n * @public\n * @memberof Meeting\n * @deprecated after v1.89.3\n */\n public closeRemoteStream() {\n LoggerProxy.logger.warn(\n 'Meeting:index#closeRemoteStream --> [DEPRECATION WARNING]: closeRemoteStream has been deprecated after v1.89.3'\n );\n this.closeRemoteTracks();\n }\n\n /**\n * Removes the remote tracks on the class instance and triggers an event\n * to developers\n * @returns {undefined}\n * @memberof Meeting\n */\n closeRemoteTracks() {\n const {remoteAudioTrack, remoteVideoTrack, remoteShare} = this.mediaProperties;\n\n /**\n * Triggers an event to the developer\n * @param {string} mediaType Type of media that was stopped\n * @returns {void}\n * @inner\n */\n // eslint-disable-next-line @typescript-eslint/no-shadow\n const triggerMediaStoppedEvent = (mediaType: string) => {\n Trigger.trigger(\n this,\n {\n file: 'meeting/index',\n function: 'closeRemoteTracks',\n },\n EVENT_TRIGGERS.MEDIA_STOPPED,\n {\n type: mediaType,\n }\n );\n };\n\n /**\n * Stops a media track and emits an event\n * @param {MediaStreamTrack} track Media track to stop\n * @param {string} type Media track type\n * @returns {Promise}\n * @inner\n */\n // eslint-disable-next-line arrow-body-style\n const stopTrack = (track: MediaStreamTrack, type: string) => {\n return Media.stopTracks(track).then(() => {\n const isTrackStopped = track && track.readyState === ENDED;\n const isWrongReadyState = track && !isTrackStopped;\n\n if (isTrackStopped) {\n triggerMediaStoppedEvent(type);\n } else if (isWrongReadyState) {\n LoggerProxy.logger.warn(\n `Meeting:index#closeRemoteTracks --> Error: MediaStreamTrack.readyState is ${track.readyState} for ${type}`\n );\n }\n });\n };\n\n return Promise.all([\n stopTrack(remoteAudioTrack, EVENT_TYPES.REMOTE_AUDIO),\n stopTrack(remoteVideoTrack, EVENT_TYPES.REMOTE_VIDEO),\n stopTrack(remoteShare, EVENT_TYPES.REMOTE_SHARE),\n ]);\n }\n\n /**\n * Emits the 'media:ready' event with a local stream that consists of 1 local audio and 1 local video track\n * @returns {undefined}\n * @private\n * @memberof Meeting\n */\n private sendLocalMediaReadyEvent() {\n Trigger.trigger(\n this,\n {\n file: 'meeting/index',\n function: 'sendLocalMediaReadyEvent',\n },\n EVENT_TRIGGERS.MEDIA_READY,\n {\n type: EVENT_TYPES.LOCAL,\n stream: MediaUtil.createMediaStream([\n this.mediaProperties.audioTrack?.underlyingTrack,\n this.mediaProperties.videoTrack?.underlyingTrack,\n ]),\n }\n );\n }\n\n /**\n * Sets the local audio track on the class and emits an event to the developer\n * @param {MediaStreamTrack} rawAudioTrack\n * @param {Boolean} emitEvent if true, a media ready event is emitted to the developer\n * @returns {undefined}\n * @private\n * @memberof Meeting\n */\n private setLocalAudioTrack(rawAudioTrack: MediaStreamTrack | null, emitEvent = true) {\n if (rawAudioTrack) {\n const settings = rawAudioTrack.getSettings();\n\n const localMicrophoneTrack = new LocalMicrophoneTrack(\n MediaUtil.createMediaStream([rawAudioTrack])\n );\n\n this.mediaProperties.setMediaSettings('audio', {\n echoCancellation: settings.echoCancellation,\n noiseSuppression: settings.noiseSuppression,\n });\n\n LoggerProxy.logger.log(\n 'Meeting:index#setLocalAudioTrack --> Audio settings.',\n JSON.stringify(this.mediaProperties.mediaSettings.audio)\n );\n this.mediaProperties.setLocalAudioTrack(localMicrophoneTrack);\n if (this.audio) this.audio.applyClientStateLocally(this);\n } else {\n this.mediaProperties.setLocalAudioTrack(null);\n }\n\n if (emitEvent) {\n this.sendLocalMediaReadyEvent();\n }\n }\n\n /**\n * Sets the local video track on the class and emits an event to the developer\n * @param {MediaStreamTrack} rawVideoTrack\n * @param {Boolean} emitEvent if true, a media ready event is emitted to the developer\n * @returns {undefined}\n * @private\n * @memberof Meeting\n */\n private setLocalVideoTrack(rawVideoTrack: MediaStreamTrack | null, emitEvent = true) {\n if (rawVideoTrack) {\n const {aspectRatio, frameRate, height, width, deviceId} = rawVideoTrack.getSettings();\n\n const {localQualityLevel} = this.mediaProperties;\n\n const localCameraTrack = new LocalCameraTrack(MediaUtil.createMediaStream([rawVideoTrack]));\n\n if (Number(localQualityLevel.slice(0, -1)) > height) {\n LoggerProxy.logger\n .warn(`Meeting:index#setLocalVideoTrack --> Local video quality of ${localQualityLevel} not supported,\n downscaling to highest possible resolution of ${height}p`);\n\n this.mediaProperties.setLocalQualityLevel(`${height}p`);\n }\n\n this.mediaProperties.setLocalVideoTrack(localCameraTrack);\n if (this.video) this.video.applyClientStateLocally(this);\n\n this.mediaProperties.setMediaSettings('video', {\n aspectRatio,\n frameRate,\n height,\n width,\n });\n // store and save the selected video input device\n if (deviceId) {\n this.mediaProperties.setVideoDeviceId(deviceId);\n }\n LoggerProxy.logger.log(\n 'Meeting:index#setLocalVideoTrack --> Video settings.',\n JSON.stringify(this.mediaProperties.mediaSettings.video)\n );\n } else {\n this.mediaProperties.setLocalVideoTrack(null);\n }\n\n if (emitEvent) {\n this.sendLocalMediaReadyEvent();\n }\n }\n\n /**\n * Sets the local media stream on the class and emits an event to the developer\n * @param {Stream} localStream the local media stream\n * @returns {undefined}\n * @public\n * @memberof Meeting\n */\n public setLocalTracks(localStream: any) {\n if (localStream) {\n if (this.isMultistream) {\n throw new Error(\n 'addMedia() and updateMedia() APIs are not supported with multistream, use publishTracks/unpublishTracks instead'\n );\n }\n\n const {audioTrack, videoTrack} = MeetingUtil.getTrack(localStream);\n\n this.setLocalAudioTrack(audioTrack, false);\n this.setLocalVideoTrack(videoTrack, false);\n\n this.sendLocalMediaReadyEvent();\n }\n }\n\n /**\n * Sets the local media stream on the class and emits an event to the developer\n * @param {MediaStreamTrack} rawLocalShareTrack the local share media track\n * @returns {undefined}\n * @public\n * @memberof Meeting\n */\n public setLocalShareTrack(rawLocalShareTrack: MediaStreamTrack | null) {\n if (rawLocalShareTrack) {\n const settings = rawLocalShareTrack.getSettings();\n\n const localDisplayTrack = new LocalDisplayTrack(\n MediaUtil.createMediaStream([rawLocalShareTrack])\n );\n\n this.mediaProperties.setLocalShareTrack(localDisplayTrack);\n\n this.mediaProperties.setMediaSettings('screen', {\n aspectRatio: settings.aspectRatio,\n frameRate: settings.frameRate,\n height: settings.height,\n width: settings.width,\n // @ts-ignore\n displaySurface: settings.displaySurface,\n // @ts-ignore\n cursor: settings.cursor,\n });\n LoggerProxy.logger.log(\n 'Meeting:index#setLocalShareTrack --> Screen settings.',\n JSON.stringify(this.mediaProperties.mediaSettings.screen)\n );\n\n localDisplayTrack.on(LocalTrackEvents.Ended, this.handleShareTrackEnded);\n\n Trigger.trigger(\n this,\n {\n file: 'meeting/index',\n function: 'setLocalShareTrack',\n },\n EVENT_TRIGGERS.MEDIA_READY,\n {\n type: EVENT_TYPES.LOCAL_SHARE,\n track: rawLocalShareTrack,\n }\n );\n } else if (this.mediaProperties.shareTrack) {\n this.mediaProperties.shareTrack.off(LocalTrackEvents.Ended, this.handleShareTrackEnded);\n this.mediaProperties.shareTrack.stop(); // todo: this line should be removed once SPARK-399694 are SPARK-399695 are done\n this.mediaProperties.setLocalShareTrack(null);\n }\n }\n\n /**\n * Closes the local stream from the class and emits an event to the developer\n * @returns {undefined}\n * @event media:stopped\n * @public\n * @memberof Meeting\n */\n public closeLocalStream() {\n const {audioTrack, videoTrack} = this.mediaProperties;\n\n return Media.stopTracks(audioTrack)\n .then(() => Media.stopTracks(videoTrack))\n .then(() => {\n if (audioTrack || videoTrack) {\n Trigger.trigger(\n this,\n {\n file: 'meeting/index',\n function: 'closeLocalStream',\n },\n EVENT_TRIGGERS.MEDIA_STOPPED,\n {\n type: EVENT_TYPES.LOCAL,\n }\n );\n }\n });\n }\n\n /**\n * Closes the local stream from the class and emits an event to the developer\n * @returns {undefined}\n * @event media:stopped\n * @public\n * @memberof Meeting\n */\n public closeLocalShare() {\n const track = this.mediaProperties.shareTrack;\n\n return Media.stopTracks(track).then(() => {\n if (track) {\n Trigger.trigger(\n this,\n {\n file: 'meeting/index',\n function: 'closeLocalShare',\n },\n EVENT_TRIGGERS.MEDIA_STOPPED,\n {\n type: EVENT_TYPES.LOCAL_SHARE,\n }\n );\n }\n });\n }\n\n /**\n * Removes the local stream from the class and emits an event to the developer\n * @returns {undefined}\n * @public\n * @memberof Meeting\n */\n public unsetLocalVideoTrack() {\n this.mediaProperties.unsetLocalVideoTrack();\n }\n\n /**\n * Removes the local share from the class and emits an event to the developer\n * @returns {undefined}\n * @public\n * @memberof Meeting\n */\n public unsetLocalShareTrack() {\n this.mediaProperties.unsetLocalShareTrack();\n }\n\n /**\n * sets up listner for mercury event\n * @returns {undefined}\n * @public\n * @memberof Meeting\n */\n public setMercuryListener() {\n // Client will have a socket manager and handle reconnecting to mercury, when we reconnect to mercury\n // if the meeting has active peer connections, it should try to reconnect.\n // @ts-ignore\n this.webex.internal.mercury.on(ONLINE, () => {\n LoggerProxy.logger.info('Meeting:index#setMercuryListener --> Web socket online');\n\n // Only send restore event when it was disconnected before and for connected later\n if (!this.hasWebsocketConnected) {\n Metrics.postEvent({\n event: eventType.MERCURY_CONNECTION_RESTORED,\n meeting: this,\n });\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.MERCURY_CONNECTION_RESTORED, {\n correlation_id: this.correlationId,\n });\n }\n this.hasWebsocketConnected = true;\n });\n\n // @ts-ignore\n this.webex.internal.mercury.on(OFFLINE, () => {\n LoggerProxy.logger.error('Meeting:index#setMercuryListener --> Web socket offline');\n Metrics.postEvent({\n event: eventType.MERCURY_CONNECTION_LOST,\n meeting: this,\n });\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.MERCURY_CONNECTION_FAILURE, {\n correlation_id: this.correlationId,\n });\n });\n }\n\n /**\n * Close the peer connections and remove them from the class.\n * Cleanup any media connection related things.\n *\n * @returns {Promise}\n * @public\n * @memberof Meeting\n */\n public closePeerConnections() {\n if (this.mediaProperties.webrtcMediaConnection) {\n if (this.remoteMediaManager) {\n this.remoteMediaManager.stop();\n this.remoteMediaManager = null;\n }\n\n Object.values(this.mediaRequestManagers).forEach((mediaRequestManager) =>\n mediaRequestManager.reset()\n );\n\n this.receiveSlotManager.reset();\n this.mediaProperties.webrtcMediaConnection.close();\n }\n\n return Promise.resolve();\n }\n\n /**\n * Unsets the peer connections on the class\n * warning DO NOT CALL WITHOUT CLOSING PEER CONNECTIONS FIRST\n * @returns {undefined}\n * @public\n * @memberof Meeting\n */\n public unsetPeerConnections() {\n this.mediaProperties.unsetPeerConnection();\n // @ts-ignore - config coming from registerPlugin\n if (this.config.reconnection.detection) {\n // @ts-ignore\n this.webex.internal.mercury.off(ONLINE);\n }\n }\n\n /**\n * Convenience method to set the correlation id for the Meeting\n * @param {String} id correlation id to set on the class\n * @returns {undefined}\n * @private\n * @memberof Meeting\n */\n private setCorrelationId(id: string) {\n this.correlationId = id;\n }\n\n /**\n * Mute the audio for a meeting\n * @returns {Promise} resolves the data from muting audio {mute, self} or rejects if there is no audio set\n * @public\n * @memberof Meeting\n */\n public muteAudio() {\n if (!MeetingUtil.isUserInJoinedState(this.locusInfo)) {\n return Promise.reject(new UserNotJoinedError());\n }\n\n // @ts-ignore\n if (!this.mediaId) {\n // Happens when addMedia and mute are triggered in succession\n return Promise.reject(new NoMediaEstablishedYetError());\n }\n\n if (!this.audio) {\n return Promise.reject(new ParameterError('no audio control associated to the meeting'));\n }\n\n // First, stop sending the local audio media\n return logRequest(\n this.audio\n .handleClientRequest(this, true)\n .then(() => {\n MeetingUtil.handleAudioLogging(this.mediaProperties.audioTrack);\n Metrics.postEvent({\n event: eventType.MUTED,\n meeting: this,\n data: {trigger: trigger.USER_INTERACTION, mediaType: MetricsMediaType.AUDIO},\n });\n })\n .catch((error) => {\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.MUTE_AUDIO_FAILURE, {\n correlation_id: this.correlationId,\n locus_id: this.locusUrl.split('/').pop(),\n reason: error.message,\n stack: error.stack,\n });\n\n throw error;\n }),\n {\n logText: `Meeting:index#muteAudio --> correlationId=${this.correlationId} muting audio`,\n }\n );\n }\n\n /**\n * Unmute meeting audio\n * @returns {Promise} resolves data from muting audio {mute, self} or rejects if there is no audio set\n * @public\n * @memberof Meeting\n */\n public unmuteAudio() {\n if (!MeetingUtil.isUserInJoinedState(this.locusInfo)) {\n return Promise.reject(new UserNotJoinedError());\n }\n\n // @ts-ignore\n if (!this.mediaId) {\n // Happens when addMedia and mute are triggered in succession\n return Promise.reject(new NoMediaEstablishedYetError());\n }\n\n if (!this.audio) {\n return Promise.reject(new ParameterError('no audio control associated to the meeting'));\n }\n\n // First, send the control to unmute the participant on the server\n return logRequest(\n this.audio\n .handleClientRequest(this, false)\n .then(() => {\n MeetingUtil.handleAudioLogging(this.mediaProperties.audioTrack);\n Metrics.postEvent({\n event: eventType.UNMUTED,\n meeting: this,\n data: {trigger: trigger.USER_INTERACTION, mediaType: MetricsMediaType.AUDIO},\n });\n })\n .catch((error) => {\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.UNMUTE_AUDIO_FAILURE, {\n correlation_id: this.correlationId,\n locus_id: this.locusUrl.split('/').pop(),\n reason: error.message,\n stack: error.stack,\n });\n\n throw error;\n }),\n {\n logText: `Meeting:index#unmuteAudio --> correlationId=${this.correlationId} unmuting audio`,\n }\n );\n }\n\n /**\n * Mute the video for a meeting\n * @returns {Promise} resolves data from muting video {mute, self} or rejects if there is no video set\n * @public\n * @memberof Meeting\n */\n public muteVideo() {\n if (!MeetingUtil.isUserInJoinedState(this.locusInfo)) {\n return Promise.reject(new UserNotJoinedError());\n }\n\n // @ts-ignore\n if (!this.mediaId) {\n // Happens when addMedia and mute are triggered in succession\n return Promise.reject(new NoMediaEstablishedYetError());\n }\n\n if (!this.video) {\n return Promise.reject(new ParameterError('no video control associated to the meeting'));\n }\n\n return logRequest(\n this.video\n .handleClientRequest(this, true)\n .then(() => {\n MeetingUtil.handleVideoLogging(this.mediaProperties.videoTrack);\n Metrics.postEvent({\n event: eventType.MUTED,\n meeting: this,\n data: {trigger: trigger.USER_INTERACTION, mediaType: MetricsMediaType.VIDEO},\n });\n })\n .catch((error) => {\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.MUTE_VIDEO_FAILURE, {\n correlation_id: this.correlationId,\n locus_id: this.locusUrl.split('/').pop(),\n reason: error.message,\n stack: error.stack,\n });\n\n throw error;\n }),\n {\n logText: `Meeting:index#muteVideo --> correlationId=${this.correlationId} muting video`,\n }\n );\n }\n\n /**\n * Unmute meeting video\n * @returns {Promise} resolves data from muting video {mute, self} or rejects if there is no video set\n * @public\n * @memberof Meeting\n */\n public unmuteVideo() {\n if (!MeetingUtil.isUserInJoinedState(this.locusInfo)) {\n return Promise.reject(new UserNotJoinedError());\n }\n\n // @ts-ignore\n if (!this.mediaId) {\n // Happens when addMedia and mute are triggered in succession\n return Promise.reject(new NoMediaEstablishedYetError());\n }\n\n if (!this.video) {\n return Promise.reject(new ParameterError('no audio control associated to the meeting'));\n }\n\n return logRequest(\n this.video\n .handleClientRequest(this, false)\n .then(() => {\n MeetingUtil.handleVideoLogging(this.mediaProperties.videoTrack);\n Metrics.postEvent({\n event: eventType.UNMUTED,\n meeting: this,\n data: {trigger: trigger.USER_INTERACTION, mediaType: MetricsMediaType.VIDEO},\n });\n })\n .catch((error) => {\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.UNMUTE_VIDEO_FAILURE, {\n correlation_id: this.correlationId,\n locus_id: this.locusUrl.split('/').pop(),\n reason: error.message,\n stack: error.stack,\n });\n\n throw error;\n }),\n {\n logText: `Meeting:index#unmuteVideo --> correlationId=${this.correlationId} unmuting video`,\n }\n );\n }\n\n /**\n * Shorthand function to join AND set up media\n * @param {Object} options - options to join with media\n * @param {JoinOptions} [options.joinOptions] - see #join()\n * @param {MediaDirection} options.mediaSettings - see #addMedia()\n * @param {AudioVideo} [options.audioVideoOptions] - see #getMediaStreams()\n * @returns {Promise} -- {join: see join(), media: see addMedia(), local: see getMediaStreams()}\n * @public\n * @memberof Meeting\n * @example\n * joinWithMedia({\n * joinOptions: {resourceId: 'resourceId' },\n * mediaSettings: {\n * sendAudio: true,\n * sendVideo: true,\n * sendShare: false,\n * receiveVideo:true,\n * receiveAudio: true,\n * receiveShare: true\n * }\n * audioVideoOptions: {\n * audio: 'audioDeviceId',\n * video: 'videoDeviceId'\n * }})\n */\n public joinWithMedia(\n options: {\n joinOptions?: any;\n mediaSettings: any;\n audioVideoOptions?: any;\n } = {} as any\n ) {\n // TODO: add validations for parameters\n const {mediaSettings, joinOptions, audioVideoOptions} = options;\n\n return this.join(joinOptions)\n .then((joinResponse) =>\n this.getMediaStreams(mediaSettings, audioVideoOptions).then(([localStream, localShare]) =>\n this.addMedia({\n mediaSettings,\n localShare,\n localStream,\n }).then((mediaResponse) => ({\n join: joinResponse,\n media: mediaResponse,\n local: [localStream, localShare],\n }))\n )\n )\n .catch((error) => {\n LoggerProxy.logger.error('Meeting:index#joinWithMedia --> ', error);\n\n Metrics.sendBehavioralMetric(\n BEHAVIORAL_METRICS.JOIN_WITH_MEDIA_FAILURE,\n {\n correlation_id: this.correlationId,\n locus_id: this.locusUrl.split('/').pop(),\n reason: error.message,\n stack: error.stack,\n },\n {\n type: error.name,\n }\n );\n\n return Promise.reject(error);\n });\n }\n\n /**\n * Initiates the reconnection of the media in the meeting\n *\n * @param {object} options\n * @returns {Promise} resolves with {reconnect} or errors with {error}\n * @public\n * @memberof Meeting\n */\n public reconnect(options?: object) {\n LoggerProxy.logger.log(\n `Meeting:index#reconnect --> attempting to reconnect meeting ${this.id}`\n );\n\n if (!this.reconnectionManager || !this.reconnectionManager.reconnect) {\n return Promise.reject(\n new ParameterError('Cannot reconnect, ReconnectionManager must first be defined.')\n );\n }\n\n // @ts-ignore - currentMediaStatus coming from SelfUtil\n if (!MeetingUtil.isMediaEstablished(this.currentMediaStatus)) {\n return Promise.reject(\n new ParameterError('Cannot reconnect, Media has not established to reconnect')\n );\n }\n\n try {\n LoggerProxy.logger.info('Meeting:index#reconnect --> Validating reconnect ability.');\n // @ts-ignore\n this.reconnectionManager.validate();\n } catch (error) {\n // Unable to reconnect this call\n if (error instanceof ReconnectInProgress) {\n LoggerProxy.logger.info(\n 'Meeting:index#reconnect --> Unable to reconnect, reconnection in progress.'\n );\n } else {\n LoggerProxy.logger.log('Meeting:index#reconnect --> Unable to reconnect.', error);\n }\n\n return Promise.resolve();\n }\n\n Trigger.trigger(\n this,\n {\n file: 'meeting/index',\n function: 'reconnect',\n },\n EVENT_TRIGGERS.MEETING_RECONNECTION_STARTING\n );\n\n return this.reconnectionManager\n .reconnect(options)\n .then(() => {\n Trigger.trigger(\n this,\n {\n file: 'meeting/index',\n function: 'reconnect',\n },\n EVENT_TRIGGERS.MEETING_RECONNECTION_SUCCESS\n );\n LoggerProxy.logger.log('Meeting:index#reconnect --> Meeting reconnect success');\n })\n .catch((error) => {\n Trigger.trigger(\n this,\n {\n file: 'meeting/index',\n function: 'reconnect',\n },\n EVENT_TRIGGERS.MEETING_RECONNECTION_FAILURE,\n {\n error: new ReconnectionError('Reconnection failure event', error),\n }\n );\n\n LoggerProxy.logger.error('Meeting:index#reconnect --> Meeting reconnect failed', error);\n\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.MEETING_RECONNECT_FAILURE, {\n correlation_id: this.correlationId,\n locus_id: this.locusUrl.split('/').pop(),\n reason: error.message,\n stack: error.stack,\n });\n\n this.uploadLogs({\n file: 'meeting/index',\n function: 'reconnect',\n });\n\n return Promise.reject(new ReconnectionError('Reconnection failure event', error));\n })\n .finally(() => {\n this.reconnectionManager.reset();\n });\n }\n\n /**\n * Check if the meeting supports the Webex Assistant feature\n * @returns {boolean}\n * @throws TranscriptionNotSupportedError\n */\n isTranscriptionSupported() {\n if (this.locusInfo.controls.transcribe?.transcribing) {\n return true;\n }\n\n LoggerProxy.logger.error(\n 'Meeting:index#isTranscriptionSupported --> Webex Assistant is not supported'\n );\n\n return false;\n }\n\n /**\n * Check if the meeting supports the Reactions\n * @returns {boolean}\n */\n isReactionsSupported() {\n if (this.locusInfo?.controls?.reactions.enabled) {\n return true;\n }\n\n LoggerProxy.logger.error('Meeting:index#isReactionsSupported --> Reactions is not supported');\n\n return false;\n }\n\n /**\n * Monitor the Low-Latency Mercury (LLM) web socket connection on `onError` and `onClose` states\n * @private\n * @returns {void}\n */\n private monitorTranscriptionSocketConnection() {\n this.transcription.onCloseSocket((event) => {\n LoggerProxy.logger.info(\n `Meeting:index#onCloseSocket -->\n unable to continue receiving transcription;\n low-latency mercury web socket connection is closed now.\n ${event}`\n );\n\n this.triggerStopReceivingTranscriptionEvent();\n });\n\n this.transcription.onErrorSocket((event) => {\n LoggerProxy.logger.error(\n `Meeting:index#onErrorSocket -->\n unable to continue receiving transcription;\n low-latency mercury web socket connection error had occured.\n ${event}`\n );\n\n this.triggerStopReceivingTranscriptionEvent();\n\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.RECEIVE_TRANSCRIPTION_FAILURE, {\n correlation_id: this.correlationId,\n reason: 'unexpected error: transcription LLM web socket connection error had occured.',\n event,\n });\n });\n }\n\n /**\n * Request for a WebSocket Url, open and monitor the WebSocket connection\n * @private\n * @returns {Promise<void>} a promise to open the WebSocket connection\n */\n private async receiveTranscription() {\n LoggerProxy.logger.info(\n `Meeting:index#receiveTranscription -->\n Attempting to generate a web socket url.`\n );\n\n try {\n const {datachannelUrl} = this.locusInfo.info;\n // @ts-ignore - fix type\n const {\n body: {webSocketUrl},\n // @ts-ignore\n } = await this.request({\n method: HTTP_VERBS.POST,\n uri: datachannelUrl,\n body: {deviceUrl: this.deviceUrl},\n });\n\n LoggerProxy.logger.info(\n `Meeting:index#receiveTranscription -->\n Generated web socket url succesfully.`\n );\n\n this.transcription = new Transcription(\n webSocketUrl,\n // @ts-ignore - fix type\n this.webex.sessionId,\n this.members\n );\n\n LoggerProxy.logger.info(\n `Meeting:index#receiveTranscription -->\n opened LLM web socket connection successfully.`\n );\n\n // retrieve and pass the payload\n this.transcription.subscribe((payload) => {\n Trigger.trigger(\n this,\n {\n file: 'meeting/index',\n function: 'join',\n },\n EVENT_TRIGGERS.MEETING_STARTED_RECEIVING_TRANSCRIPTION,\n payload\n );\n });\n\n this.monitorTranscriptionSocketConnection();\n // @ts-ignore - fix type\n this.transcription.connect(this.webex.credentials.supertoken.access_token);\n } catch (error) {\n LoggerProxy.logger.error(`Meeting:index#receiveTranscription --> ${error}`);\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.RECEIVE_TRANSCRIPTION_FAILURE, {\n correlation_id: this.correlationId,\n reason: error.message,\n stack: error.stack,\n });\n }\n }\n\n /**\n * Callback called when a relay event is received from meeting LLM Connection\n * @param {RelayEvent} e Event object coming from LLM Connection\n * @private\n * @returns {void}\n */\n private processRelayEvent = (e: RelayEvent): void => {\n switch (e.data.relayType) {\n case REACTION_RELAY_TYPES.REACTION:\n if (\n // @ts-ignore - config coming from registerPlugin\n (this.config.receiveReactions || options.receiveReactions) &&\n this.isReactionsSupported()\n ) {\n const {name} = this.members.membersCollection.get(e.data.sender.participantId);\n const processedReaction: ProcessedReaction = {\n reaction: e.data.reaction,\n sender: {\n id: e.data.sender.participantId,\n name,\n },\n };\n Trigger.trigger(\n this,\n {\n file: 'meeting/index',\n function: 'join',\n },\n EVENT_TRIGGERS.MEETING_RECEIVE_REACTIONS,\n processedReaction\n );\n }\n break;\n default:\n break;\n }\n };\n\n /**\n * stop recieving Transcription by closing\n * the web socket connection properly\n * @returns {void}\n */\n stopReceivingTranscription() {\n if (this.transcription) {\n this.transcription.closeSocket();\n }\n }\n\n /**\n * triggers an event to notify that the user\n * will not receive any more transcription\n * @private\n * @returns{void}\n */\n private triggerStopReceivingTranscriptionEvent() {\n LoggerProxy.logger.info(`\n Meeting:index#stopReceivingTranscription -->\n closed transcription LLM web socket connection successfully.`);\n\n Trigger.trigger(\n this,\n {\n file: 'meeting',\n function: 'triggerStopReceivingTranscriptionEvent',\n },\n EVENT_TRIGGERS.MEETING_STOPPED_RECEIVING_TRANSCRIPTION\n );\n }\n\n /**\n * Specify joining via audio (option: pstn), video, screenshare\n * @param {JoinOptions} options A configurable options object for joining a meeting\n * @returns {Promise} the join response\n * @public\n * @memberof Meeting\n * Scenario A: Joining own claimed personal meeting room\n * Scenario B: Joining other's claimed personal meeting room, do pass pin (if desired to join as host, or nullify), do pass moderator\n * Scenario C: Joining an unclaimed personal meeting room, -do not- pass pin or moderator on first try, -do- pass pin and moderator\n * if joining as host on second loop, pass pin and pass moderator if joining as guest on second loop\n * Scenario D: Joining any other way (sip, pstn, conversationUrl, link just need to specify resourceId)\n */\n public join(options: any = {}) {\n // @ts-ignore - fix type\n if (!this.webex.meetings.registered) {\n const errorMessage = 'Meeting:index#join --> Device not registered';\n const error = new Error(errorMessage);\n\n LoggerProxy.logger.error(errorMessage);\n\n return Promise.reject(error);\n }\n\n // If a join request is being processed, refer to the deferred promise.\n if (this.deferJoin) {\n return this.deferJoin;\n }\n\n // Scope-up the resolve/reject methods for handling within join().\n let joinFailed;\n let joinSuccess;\n\n // Create a deferred promise for a consistent resolve value from utils.\n // This also prevents redundant API calls.\n this.deferJoin = new Promise((resolve, reject) => {\n joinFailed = reject;\n joinSuccess = resolve;\n });\n\n if (!this.hasJoinedOnce) {\n this.hasJoinedOnce = true;\n } else {\n LoggerProxy.logger.log(\n `Meeting:index#join --> Generating a new correlation id for meeting ${this.id}`\n );\n LoggerProxy.logger.log(\n `Meeting:index#join --> Previous correlation id ${this.correlationId}`\n );\n this.setCorrelationId(uuid.v4());\n LoggerProxy.logger.log(`Meeting:index#join --> New correlation id ${this.correlationId}`);\n }\n\n if (options.rejoin) {\n this.meetingFiniteStateMachine.reset();\n }\n\n Metrics.postEvent({\n event: eventType.CALL_INITIATED,\n meeting: this,\n data: {trigger: trigger.USER_INTERACTION, isRoapCallEnabled: true},\n });\n\n LoggerProxy.logger.log('Meeting:index#join --> Joining a meeting');\n\n if (this.meetingFiniteStateMachine.state === MEETING_STATE_MACHINE.STATES.ENDED) {\n this.meetingFiniteStateMachine.reset();\n }\n if (this.meetingFiniteStateMachine.state !== MEETING_STATE_MACHINE.STATES.RINGING) {\n this.meetingFiniteStateMachine.ring(_JOIN_);\n }\n\n // TODO: does this really need to be here?\n if (options.resourceId && this.destination && options.resourceId === this.destination) {\n this.wirelessShare = true;\n }\n\n if (options.meetingQuality) {\n if (typeof options.meetingQuality === 'string') {\n if (!QUALITY_LEVELS[options.meetingQuality]) {\n const errorMessage = `Meeting:index#join --> ${options.meetingQuality} not defined`;\n const error = new Error(errorMessage);\n\n LoggerProxy.logger.error(errorMessage);\n\n joinFailed(error);\n this.deferJoin = undefined;\n\n return Promise.reject(error);\n }\n\n this.mediaProperties.setLocalQualityLevel(options.meetingQuality);\n this.mediaProperties.setRemoteQualityLevel(options.meetingQuality);\n }\n\n if (typeof options.meetingQuality === 'object') {\n if (\n !QUALITY_LEVELS[options.meetingQuality.local] &&\n !QUALITY_LEVELS[options.meetingQuality.remote]\n ) {\n const errorMessage = `Meeting:index#join --> ${\n options.meetingQuality.local || options.meetingQuality.remote\n } not defined`;\n\n LoggerProxy.logger.error(errorMessage);\n\n const error = new Error(errorMessage);\n\n joinFailed(error);\n this.deferJoin = undefined;\n\n return Promise.reject(new Error(errorMessage));\n }\n\n if (options.meetingQuality.local) {\n this.mediaProperties.setLocalQualityLevel(options.meetingQuality.local);\n }\n if (options.meetingQuality.remote) {\n this.mediaProperties.setRemoteQualityLevel(options.meetingQuality.remote);\n }\n }\n }\n\n this.isMultistream = !!options.enableMultistream;\n\n return MeetingUtil.joinMeetingOptions(this, options)\n .then((join) => {\n this.meetingFiniteStateMachine.join();\n LoggerProxy.logger.log('Meeting:index#join --> Success');\n\n return join;\n })\n .then((join) => {\n joinSuccess(join);\n this.deferJoin = undefined;\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.JOIN_SUCCESS, {\n correlation_id: this.correlationId,\n });\n\n return join;\n })\n .then(async (join) => {\n // @ts-ignore - config coming from registerPlugin\n if (this.config.enableAutomaticLLM) {\n await this.updateLLMConnection();\n // @ts-ignore - Fix type\n this.webex.internal.llm.on('event:relay.event', this.processRelayEvent);\n LoggerProxy.logger.info('Meeting:index#join --> enabled to receive relay events!');\n }\n\n return join;\n })\n .then(async (join) => {\n if (isBrowser) {\n // @ts-ignore - config coming from registerPlugin\n if (this.config.receiveTranscription || options.receiveTranscription) {\n if (this.isTranscriptionSupported()) {\n await this.receiveTranscription();\n LoggerProxy.logger.info('Meeting:index#join --> enabled to recieve transcription!');\n }\n }\n } else {\n LoggerProxy.logger.error(\n 'Meeting:index#join --> Receving transcription is not supported on this platform'\n );\n }\n\n return join;\n })\n .catch((error) => {\n this.meetingFiniteStateMachine.fail(error);\n LoggerProxy.logger.error('Meeting:index#join --> Failed', error);\n\n Metrics.postEvent({\n event: eventType.LOCUS_JOIN_RESPONSE,\n meeting: this,\n meetingId: this.id,\n data: {\n errors: [Metrics.parseLocusError(error.error, true)],\n },\n });\n\n // TODO: change this to error codes and pre defined dictionary\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.JOIN_FAILURE, {\n correlation_id: this.correlationId,\n reason: error.error?.message,\n stack: error.stack,\n });\n\n // Upload logs on join Failure\n Trigger.trigger(\n this,\n {\n file: 'meeting/index',\n function: 'join',\n },\n EVENTS.REQUEST_UPLOAD_LOGS,\n this\n );\n\n joinFailed(error);\n this.deferJoin = undefined;\n\n return Promise.reject(error);\n });\n }\n\n /**\n * Connects to low latency mercury and reconnects if the address has changed\n * It will also disconnect if called when the meeting has ended\n * @param {String} datachannelUrl\n * @returns {Promise}\n */\n async updateLLMConnection() {\n // @ts-ignore - Fix type\n const {url, info: {datachannelUrl} = {}} = this.locusInfo;\n\n const isJoined = this.joinedWith && this.joinedWith.state === 'JOINED';\n\n // @ts-ignore - Fix type\n if (this.webex.internal.llm.isConnected()) {\n // @ts-ignore - Fix type\n if (url === this.webex.internal.llm.getLocusUrl() && isJoined) {\n return undefined;\n }\n // @ts-ignore - Fix type\n await this.webex.internal.llm.disconnectLLM();\n // @ts-ignore - Fix type\n this.webex.internal.llm.off('event:relay.event', this.processRelayEvent);\n }\n\n if (!isJoined) {\n return undefined;\n }\n\n // @ts-ignore - Fix type\n return this.webex.internal.llm.registerAndConnect(url, datachannelUrl);\n }\n\n /**\n * Use phone for meeting audio\n * @param {String} phoneNumber If provided, it will dial-out using this number. If not provided, dial-in will be used\n * @returns {Promise} Resolves once the dial-in or dial-out request has completed, or rejects if it failed\n * @public\n * @memberof Meeting\n */\n public usePhoneAudio(phoneNumber: string) {\n if (!phoneNumber) {\n return this.dialInPstn();\n }\n\n return this.dialOutPstn(phoneNumber);\n }\n\n /**\n * Determines if the given pstnStatus is in a state which implies the phone is provisioned\n * @param {String} pstnStatus\n * @returns {Boolean}\n * @private\n * @memberof Meeting\n */\n private isPhoneProvisioned(pstnStatus: string) {\n return [PSTN_STATUS.JOINED, PSTN_STATUS.CONNECTED, PSTN_STATUS.SUCCESS].includes(pstnStatus);\n }\n\n /**\n * Enable dial-in for audio\n * @returns {Promise} Resolves once the dial-in request has completed, or rejects if it failed\n * @private\n * @memberof Meeting\n */\n private dialInPstn() {\n if (this.isPhoneProvisioned(this.dialInDeviceStatus)) return Promise.resolve(); // prevent multiple dial in devices from being provisioned\n\n const {correlationId, locusUrl} = this;\n\n if (!this.dialInUrl) this.dialInUrl = `dialin:///${uuid.v4()}`;\n\n return (\n this.meetingRequest\n // @ts-ignore\n .dialIn({\n correlationId,\n dialInUrl: this.dialInUrl,\n locusUrl,\n clientUrl: this.deviceUrl,\n })\n .then((res) => {\n this.locusInfo.onFullLocus(res.body.locus);\n })\n .catch((error) => {\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.ADD_DIAL_IN_FAILURE, {\n correlation_id: this.correlationId,\n dial_in_url: this.dialInUrl,\n locus_id: locusUrl.split('/').pop(),\n client_url: this.deviceUrl,\n reason: error.error?.message,\n stack: error.stack,\n });\n\n return Promise.reject(error);\n })\n );\n }\n\n /**\n * Enable dial-out for audio\n * @param {String} phoneNumber Phone number to dial out to\n * @returns {Promise} Resolves once the dial-out request has completed (it doesn't wait for the user to answer the phone), or rejects if it failed\n * @private\n * @memberof Meeting\n */\n private dialOutPstn(phoneNumber: string) {\n if (this.isPhoneProvisioned(this.dialOutDeviceStatus)) return Promise.resolve(); // prevent multiple dial out devices from being provisioned\n\n const {correlationId, locusUrl} = this;\n\n if (!this.dialOutUrl) this.dialOutUrl = `dialout:///${uuid.v4()}`;\n\n return (\n this.meetingRequest\n // @ts-ignore\n .dialOut({\n correlationId,\n dialOutUrl: this.dialOutUrl,\n phoneNumber,\n locusUrl,\n clientUrl: this.deviceUrl,\n })\n .then((res) => {\n this.locusInfo.onFullLocus(res.body.locus);\n })\n .catch((error) => {\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.ADD_DIAL_OUT_FAILURE, {\n correlation_id: this.correlationId,\n dial_out_url: this.dialOutUrl,\n locus_id: locusUrl.split('/').pop(),\n client_url: this.deviceUrl,\n reason: error.error?.message,\n stack: error.stack,\n });\n\n return Promise.reject(error);\n })\n );\n }\n\n /**\n * Disconnect meeting audio via phone.\n * @returns {Promise} Resolves once the phone audio disconnection has completed\n * @public\n * @memberof Meeting\n * @returns {Promise}\n */\n public disconnectPhoneAudio() {\n return Promise.all([\n this.isPhoneProvisioned(this.dialInDeviceStatus)\n ? MeetingUtil.disconnectPhoneAudio(this, this.dialInUrl)\n : Promise.resolve(),\n this.isPhoneProvisioned(this.dialOutDeviceStatus)\n ? MeetingUtil.disconnectPhoneAudio(this, this.dialOutUrl)\n : Promise.resolve(),\n ]);\n }\n\n /**\n * Moves the call to the specified resourceId\n * @param {String} resourceId\n * @returns {Promise} once the move has been completed\n * @public\n * @memberof Meeting\n */\n public moveTo(resourceId: string) {\n if (!resourceId) {\n throw new ParameterError('Cannot move call without a resourceId.');\n }\n\n Metrics.postEvent({\n event: eventType.MEDIA_CAPABILITIES,\n meeting: this,\n data: {\n mediaCapabilities: {\n rx: {\n audio: false,\n share: true,\n share_audio: false,\n video: false,\n whiteboard: false,\n },\n tx: {\n audio: false,\n share: false,\n share_audio: false,\n video: false,\n whiteboard: false,\n },\n },\n },\n });\n\n Metrics.postEvent({event: eventType.MOVE_MEDIA, meeting: this});\n\n this.locusInfo.once(LOCUSINFO.EVENTS.SELF_OBSERVING, async () => {\n // Clean up the camera , microphone track and re initiate it\n\n try {\n if (this.isSharing) {\n await this.releaseScreenShareFloor();\n }\n const mediaSettings = {\n mediaDirection: {\n sendVideo: false,\n receiveVideo: false,\n sendAudio: false,\n receiveAudio: false,\n sendShare: false,\n receiveShare: true,\n },\n };\n\n // clean up the local tracks\n this.mediaProperties.setMediaDirection(mediaSettings.mediaDirection);\n\n // close the existing local tracks\n await this.closeLocalStream();\n await this.closeLocalShare();\n\n this.mediaProperties.unsetMediaTracks();\n\n // when a move to is intiated by the client , Locus delets the existing media node from the server as soon the DX answers the meeting\n // once the DX answers we establish connection back the media server with only receiveShare enabled\n // @ts-ignore - reconnectMedia does not accept any argument\n await this.reconnectionManager.reconnectMedia(mediaSettings).then(() => {\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.MOVE_TO_SUCCESS);\n });\n } catch (error) {\n LoggerProxy.logger.error('Meeting:index#moveTo --> Failed to moveTo resourceId', error);\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.MOVE_TO_FAILURE, {\n correlation_id: this.correlationId,\n locus_id: this.locusUrl.split('/').pop(),\n reason: error.message,\n stack: error.stack,\n });\n }\n });\n\n LoggerProxy.logger.info(\n 'Meeting:index#moveTo --> Initated moved to using resourceId',\n resourceId\n );\n\n return MeetingUtil.joinMeetingOptions(this, {resourceId, moveToResource: true})\n .then(() => {\n this.meetingFiniteStateMachine.join();\n })\n .catch((error) => {\n this.meetingFiniteStateMachine.fail(error);\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.MOVE_TO_FAILURE, {\n correlation_id: this.correlationId,\n locus_id: this.locusUrl.split('/').pop(),\n reason: error.message,\n stack: error.stack,\n });\n LoggerProxy.logger.error('Meeting:index#moveTo --> Failed to moveTo resourceId', error);\n\n return Promise.reject(error);\n });\n }\n\n /**\n * Moves the call from the specified resourceId, back to computer\n * @param {String} resourceId\n * @returns {Promise} once the move has been completed\n * @public\n * @memberof Meeting\n */\n public moveFrom(resourceId: string) {\n // On moveFrom ask the developer to re capture it moveFrom then updateMedia\n if (!resourceId) {\n throw new ParameterError('Cannot move call without a resourceId.');\n }\n const oldCorrelationId = this.correlationId;\n\n Metrics.postEvent({event: eventType.MOVE_MEDIA, meeting: this});\n\n return MeetingUtil.joinMeetingOptions(this)\n .then(() =>\n MeetingUtil.leaveMeeting(this, {\n resourceId,\n correlationId: oldCorrelationId,\n moveMeeting: true,\n }).then(() => {\n this.resourceId = '';\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.MOVE_FROM_SUCCESS);\n })\n )\n .catch((error) => {\n this.meetingFiniteStateMachine.fail(error);\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.MOVE_FROM_FAILURE, {\n correlation_id: this.correlationId,\n locus_id: this.locusUrl.split('/').pop(),\n reason: error.message,\n stack: error.stack,\n });\n LoggerProxy.logger.error('Meeting:index#moveTo --> Failed to moveTo resourceId', error);\n\n return Promise.reject(error);\n });\n }\n\n /**\n * Get local media streams based on options passed\n *\n * NOTE: this method can only be used with transcoded meetings, not with multistream meetings\n *\n * @param {MediaDirection} mediaDirection A configurable options object for joining a meeting\n * @param {AudioVideo} [audioVideo] audio/video object to set audioinput and videoinput devices, see #Media.getUserMedia\n * @param {SharePreferences} [sharePreferences] audio/video object to set audioinput and videoinput devices, see #Media.getUserMedia\n * @returns {Promise} see #Media.getUserMedia\n * @public\n * @todo should be static, or moved so can be called outside of a meeting\n * @memberof Meeting\n */\n getMediaStreams = (\n mediaDirection: any,\n // This return an OBJECT {video: {height, widght}}\n // eslint-disable-next-line default-param-last\n audioVideo: any = VIDEO_RESOLUTIONS[this.mediaProperties.localQualityLevel],\n sharePreferences?: any\n ) => {\n if (\n mediaDirection &&\n (mediaDirection.sendAudio || mediaDirection.sendVideo || mediaDirection.sendShare)\n ) {\n if (\n mediaDirection &&\n mediaDirection.sendAudio &&\n mediaDirection.sendVideo &&\n mediaDirection.sendShare &&\n isBrowser('safari')\n ) {\n LoggerProxy.logger.warn(\n 'Meeting:index#getMediaStreams --> Setting `sendShare` to FALSE, due to complications with Safari'\n );\n\n mediaDirection.sendShare = false;\n\n LoggerProxy.logger.warn(\n 'Meeting:index#getMediaStreams --> Enabling `sendShare` along with `sendAudio` & `sendVideo`, on Safari, causes a failure while setting up a screen share at the same time as the camera+mic stream'\n );\n LoggerProxy.logger.warn(\n 'Meeting:index#getMediaStreams --> Please use `meeting.shareScreen()` to manually start the screen share after successfully joining the meeting'\n );\n }\n\n if (audioVideo && isString(audioVideo)) {\n if (Object.keys(VIDEO_RESOLUTIONS).includes(audioVideo)) {\n this.mediaProperties.setLocalQualityLevel(audioVideo);\n audioVideo = {video: VIDEO_RESOLUTIONS[audioVideo].video};\n } else {\n throw new ParameterError(\n `${audioVideo} not supported. Either pass level from pre-defined resolutions or pass complete audioVideo object`\n );\n }\n }\n\n if (!audioVideo.video) {\n audioVideo = {\n ...audioVideo,\n video: {\n ...audioVideo.video,\n ...VIDEO_RESOLUTIONS[this.mediaProperties.localQualityLevel].video,\n },\n };\n }\n // extract deviceId if exists otherwise default to null.\n const {deviceId: preferredVideoDevice} = (audioVideo && audioVideo.video) || {deviceId: null};\n const lastVideoDeviceId = this.mediaProperties.getVideoDeviceId();\n\n if (preferredVideoDevice) {\n // Store new preferred video input device\n this.mediaProperties.setVideoDeviceId(preferredVideoDevice);\n } else if (lastVideoDeviceId) {\n // no new video preference specified so use last stored value,\n // works with empty object {} or media constraint.\n // eslint-disable-next-line no-param-reassign\n audioVideo = {\n ...audioVideo,\n video: {\n ...audioVideo.video,\n deviceId: lastVideoDeviceId,\n },\n };\n }\n\n return Media.getSupportedDevice({\n sendAudio: mediaDirection.sendAudio,\n sendVideo: mediaDirection.sendVideo,\n })\n .catch((error) =>\n Promise.reject(\n new MediaError(\n 'Given constraints do not match permission set for either camera or microphone',\n error\n )\n )\n )\n .then((devicePermissions) =>\n Media.getUserMedia(\n {\n ...mediaDirection,\n sendAudio: devicePermissions.sendAudio,\n sendVideo: devicePermissions.sendVideo,\n isSharing: this.shareStatus === SHARE_STATUS.LOCAL_SHARE_ACTIVE,\n },\n audioVideo,\n sharePreferences,\n // @ts-ignore - config coming from registerPlugin\n this.config\n ).catch((error) => {\n // Whenever there is a failure when trying to access a user's device\n // report it as an Behavioral metric\n // This gives visibility into common errors and can help\n // with further troubleshooting\n const metricName = BEHAVIORAL_METRICS.GET_USER_MEDIA_FAILURE;\n const data = {\n correlation_id: this.correlationId,\n locus_id: this.locusUrl?.split('/').pop(),\n reason: error.message,\n stack: error.stack,\n };\n const metadata = {\n type: error.name,\n };\n\n Metrics.sendBehavioralMetric(metricName, data, metadata);\n throw new MediaError('Unable to retrieve media streams', error);\n })\n );\n }\n\n return Promise.reject(\n new MediaError('At least one of the mediaDirection value should be true')\n );\n };\n\n /**\n * Checks if the machine has at least one audio or video device\n * @param {Object} options\n * @param {Boolean} options.sendAudio\n * @param {Boolean} options.sendVideo\n * @returns {Object}\n * @memberof Meetings\n */\n getSupportedDevices = ({\n sendAudio = true,\n sendVideo = true,\n }: {\n sendAudio: boolean;\n sendVideo: boolean;\n }) => Media.getSupportedDevice({sendAudio, sendVideo});\n\n /**\n * Get the devices from the Media module\n * @returns {Promise} resolves to an array of DeviceInfo\n * @memberof Meetings\n */\n getDevices = () => Media.getDevices();\n\n /**\n * Handles ROAP_FAILURE event from the webrtc media connection\n *\n * @param {Error} error\n * @returns {void}\n */\n handleRoapFailure = (error) => {\n // eslint-disable-next-line @typescript-eslint/no-shadow\n const sendBehavioralMetric = (metricName, error, correlationId) => {\n const data = {\n code: error.code,\n correlation_id: correlationId,\n reason: error.message,\n stack: error.stack,\n };\n const metadata = {\n type: error.cause?.name || error.name,\n };\n\n Metrics.sendBehavioralMetric(metricName, data, metadata);\n };\n\n if (error instanceof Errors.SdpOfferCreationError) {\n sendBehavioralMetric(BEHAVIORAL_METRICS.PEERCONNECTION_FAILURE, error, this.id);\n\n Metrics.postEvent({\n event: eventType.LOCAL_SDP_GENERATED,\n meetingId: this.id,\n data: {\n canProceed: false,\n errors: [\n Metrics.generateErrorPayload(2001, true, MetricsError.name.MEDIA_ENGINE, undefined),\n ],\n },\n });\n } else if (\n error instanceof Errors.SdpOfferHandlingError ||\n error instanceof Errors.SdpAnswerHandlingError\n ) {\n sendBehavioralMetric(BEHAVIORAL_METRICS.PEERCONNECTION_FAILURE, error, this.id);\n\n Metrics.postEvent({\n event: eventType.REMOTE_SDP_RECEIVED,\n meetingId: this.id,\n data: {\n canProceed: false,\n errors: [\n Metrics.generateErrorPayload(2001, true, MetricsError.name.MEDIA_ENGINE, undefined),\n ],\n },\n });\n } else if (error instanceof Errors.SdpError) {\n // this covers also the case of Errors.IceGatheringError which extends Errors.SdpError\n sendBehavioralMetric(BEHAVIORAL_METRICS.INVALID_ICE_CANDIDATE, error, this.id);\n\n Metrics.postEvent({\n event: eventType.LOCAL_SDP_GENERATED,\n meetingId: this.id,\n data: {\n canProceed: false,\n errors: [\n Metrics.generateErrorPayload(2001, true, MetricsError.name.MEDIA_ENGINE, undefined),\n ],\n },\n });\n }\n };\n\n setupMediaConnectionListeners = () => {\n this.mediaProperties.webrtcMediaConnection.on(Event.ROAP_STARTED, () => {\n this.isRoapInProgress = true;\n });\n\n this.mediaProperties.webrtcMediaConnection.on(Event.ROAP_DONE, () => {\n this.mediaNegotiatedEvent();\n this.isRoapInProgress = false;\n this.processNextQueuedMediaUpdate();\n });\n\n this.mediaProperties.webrtcMediaConnection.on(Event.ROAP_FAILURE, this.handleRoapFailure);\n\n this.mediaProperties.webrtcMediaConnection.on(Event.ROAP_MESSAGE_TO_SEND, (event) => {\n const LOG_HEADER = `Meeting:index#setupMediaConnectionListeners.ROAP_MESSAGE_TO_SEND --> correlationId=${this.correlationId}`;\n\n switch (event.roapMessage.messageType) {\n case 'OK':\n Metrics.postEvent({\n event: eventType.REMOTE_SDP_RECEIVED,\n meetingId: this.id,\n });\n\n logRequest(\n this.roap.sendRoapOK({\n seq: event.roapMessage.seq,\n mediaId: this.mediaId,\n correlationId: this.correlationId,\n }),\n {\n logText: `${LOG_HEADER} Roap OK`,\n }\n );\n break;\n\n case 'OFFER':\n Metrics.postEvent({\n event: eventType.LOCAL_SDP_GENERATED,\n meetingId: this.id,\n });\n\n logRequest(\n this.roap.sendRoapMediaRequest({\n sdp: event.roapMessage.sdp,\n seq: event.roapMessage.seq,\n tieBreaker: event.roapMessage.tieBreaker,\n meeting: this, // or can pass meeting ID\n reconnect: this.reconnectionManager.isReconnectInProgress(),\n }),\n {\n logText: `${LOG_HEADER} Roap Offer`,\n }\n );\n break;\n\n case 'ANSWER':\n Metrics.postEvent({\n event: eventType.REMOTE_SDP_RECEIVED,\n meetingId: this.id,\n });\n\n logRequest(\n this.roap.sendRoapAnswer({\n sdp: event.roapMessage.sdp,\n seq: event.roapMessage.seq,\n mediaId: this.mediaId,\n correlationId: this.correlationId,\n }),\n {\n logText: `${LOG_HEADER} Roap Answer`,\n }\n ).catch((error) => {\n const metricName = BEHAVIORAL_METRICS.ROAP_ANSWER_FAILURE;\n const data = {\n correlation_id: this.correlationId,\n locus_id: this.locusUrl.split('/').pop(),\n reason: error.message,\n stack: error.stack,\n };\n const metadata = {\n type: error.name,\n };\n\n Metrics.sendBehavioralMetric(metricName, data, metadata);\n });\n break;\n\n case 'ERROR':\n if (\n event.roapMessage.errorType === ErrorType.CONFLICT ||\n event.roapMessage.errorType === ErrorType.DOUBLECONFLICT\n ) {\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.ROAP_GLARE_CONDITION, {\n correlation_id: this.correlationId,\n locus_id: this.locusUrl.split('/').pop(),\n sequence: event.roapMessage.seq,\n });\n }\n logRequest(\n this.roap.sendRoapError({\n seq: event.roapMessage.seq,\n errorType: event.roapMessage.errorType,\n mediaId: this.mediaId,\n correlationId: this.correlationId,\n }),\n {\n logText: `${LOG_HEADER} Roap Error (${event.roapMessage.errorType})`,\n }\n );\n break;\n\n default:\n LoggerProxy.logger.error(\n `${LOG_HEADER} Unsupported message type: ${event.roapMessage.messageType}`\n );\n break;\n }\n });\n\n // eslint-disable-next-line no-param-reassign\n this.mediaProperties.webrtcMediaConnection.on(Event.REMOTE_TRACK_ADDED, (event) => {\n LoggerProxy.logger.log(\n `Meeting:index#setupMediaConnectionListeners --> REMOTE_TRACK_ADDED event received for webrtcMediaConnection: ${JSON.stringify(\n event\n )}`\n );\n\n const mediaTrack = event.track;\n\n // eslint-disable-next-line @typescript-eslint/no-shadow\n let eventType;\n\n switch (event.type) {\n case RemoteTrackType.AUDIO:\n eventType = EVENT_TYPES.REMOTE_AUDIO;\n this.mediaProperties.setRemoteAudioTrack(event.track);\n break;\n case RemoteTrackType.VIDEO:\n eventType = EVENT_TYPES.REMOTE_VIDEO;\n this.mediaProperties.setRemoteVideoTrack(event.track);\n break;\n case RemoteTrackType.SCREENSHARE_VIDEO:\n if (event.track) {\n eventType = EVENT_TYPES.REMOTE_SHARE;\n this.mediaProperties.setRemoteShare(event.track);\n }\n break;\n default: {\n LoggerProxy.logger.log(\n 'Meeting:index#setupMediaConnectionListeners --> unexpected track'\n );\n }\n }\n\n if (eventType && mediaTrack) {\n Trigger.trigger(\n this,\n {\n file: 'meeting/index',\n function: 'setupRemoteTrackListener:Event.REMOTE_TRACK_ADDED',\n },\n EVENT_TRIGGERS.MEDIA_READY,\n {\n type: eventType,\n stream: MediaUtil.createMediaStream([mediaTrack]),\n }\n );\n }\n });\n\n this.mediaProperties.webrtcMediaConnection.on(Event.CONNECTION_STATE_CHANGED, (event) => {\n const connectionFailed = () => {\n // we know the media connection failed and browser will not attempt to recover it any more\n // so reset the timer as it's not needed anymore, we want to reconnect immediately\n this.reconnectionManager.resetReconnectionTimer();\n\n this.reconnect({networkDisconnect: true});\n Metrics.postEvent({\n event: eventType.ICE_END,\n meeting: this,\n data: {\n canProceed: false,\n errors: [\n Metrics.generateErrorPayload(2004, false, MetricsError.name.MEDIA_ENGINE, undefined),\n ],\n },\n });\n\n this.uploadLogs({\n file: 'peer-connection-manager/index',\n function: 'connectionFailed',\n });\n\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.CONNECTION_FAILURE, {\n correlation_id: this.correlationId,\n locus_id: this.locusId,\n });\n };\n\n LoggerProxy.logger.info(\n `Meeting:index#setupMediaConnectionListeners --> correlationId=${this.correlationId} connection state changed to ${event.state}`\n );\n switch (event.state) {\n case ConnectionState.Connecting:\n Metrics.postEvent({event: eventType.ICE_START, meeting: this});\n break;\n case ConnectionState.Connected:\n Metrics.postEvent({event: eventType.ICE_END, meeting: this});\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.CONNECTION_SUCCESS, {\n correlation_id: this.correlationId,\n locus_id: this.locusId,\n });\n this.setNetworkStatus(NETWORK_STATUS.CONNECTED);\n this.reconnectionManager.iceReconnected();\n this.statsAnalyzer.startAnalyzer(this.mediaProperties.webrtcMediaConnection);\n break;\n case ConnectionState.Disconnected:\n this.setNetworkStatus(NETWORK_STATUS.DISCONNECTED);\n this.reconnectionManager.waitForIceReconnect().catch(() => {\n LoggerProxy.logger.info(\n 'Meeting:index#setupMediaConnectionListeners --> state DISCONNECTED, automatic reconnection timed out.'\n );\n\n connectionFailed();\n });\n break;\n case ConnectionState.Failed:\n connectionFailed();\n break;\n default:\n break;\n }\n });\n\n this.mediaProperties.webrtcMediaConnection.on(Event.ACTIVE_SPEAKERS_CHANGED, (msg) => {\n Trigger.trigger(\n this,\n {\n file: 'meeting/index',\n function: 'setupMediaConnectionListeners',\n },\n EVENT_TRIGGERS.ACTIVE_SPEAKER_CHANGED,\n {\n seqNum: msg.seqNum,\n memberIds: msg.csis\n // @ts-ignore\n .map((csi) => this.members.findMemberByCsi(csi)?.id)\n .filter((item) => item !== undefined),\n }\n );\n });\n\n this.mediaProperties.webrtcMediaConnection.on(\n Event.VIDEO_SOURCES_COUNT_CHANGED,\n (numTotalSources, numLiveSources, mediaContent) => {\n Trigger.trigger(\n this,\n {\n file: 'meeting/index',\n function: 'setupMediaConnectionListeners',\n },\n EVENT_TRIGGERS.REMOTE_VIDEO_SOURCE_COUNT_CHANGED,\n {\n numTotalSources,\n numLiveSources,\n mediaContent,\n }\n );\n }\n );\n\n this.mediaProperties.webrtcMediaConnection.on(\n Event.AUDIO_SOURCES_COUNT_CHANGED,\n (numTotalSources, numLiveSources, mediaContent) => {\n Trigger.trigger(\n this,\n {\n file: 'meeting/index',\n function: 'setupMediaConnectionListeners',\n },\n EVENT_TRIGGERS.REMOTE_AUDIO_SOURCE_COUNT_CHANGED,\n {\n numTotalSources,\n numLiveSources,\n mediaContent,\n }\n );\n }\n );\n };\n\n /**\n * Registers for all required StatsAnalyzer events\n * @private\n * @returns {void}\n * @memberof Meetings\n */\n setupStatsAnalyzerEventHandlers = () => {\n this.statsAnalyzer.on(StatsAnalyzerEvents.MEDIA_QUALITY, (options) => {\n // TODO: might have to send the same event to the developer\n // Add ip address info if geo hint is present\n // @ts-ignore fix type\n options.data.intervalMetadata.peerReflexiveIP =\n // @ts-ignore\n this.webex.meetings.geoHintInfo?.clientAddress ||\n options.data.intervalMetadata.peerReflexiveIP ||\n MQA_STATS.DEFAULT_IP;\n Metrics.postEvent({\n event: eventType.MEDIA_QUALITY,\n meeting: this,\n data: {intervalData: options.data, networkType: options.networkType},\n });\n });\n this.statsAnalyzer.on(StatsAnalyzerEvents.LOCAL_MEDIA_STARTED, (data) => {\n Trigger.trigger(\n this,\n {\n file: 'meeting/index',\n function: 'addMedia',\n },\n EVENT_TRIGGERS.MEETING_MEDIA_LOCAL_STARTED,\n data\n );\n Metrics.postEvent({\n event: eventType.SENDING_MEDIA_START,\n meeting: this,\n data: {\n mediaType: data.type,\n },\n });\n });\n this.statsAnalyzer.on(StatsAnalyzerEvents.LOCAL_MEDIA_STOPPED, (data) => {\n Metrics.postEvent({\n event: eventType.SENDING_MEDIA_STOP,\n meeting: this,\n data: {\n mediaType: data.type,\n },\n });\n });\n this.statsAnalyzer.on(StatsAnalyzerEvents.REMOTE_MEDIA_STARTED, (data) => {\n Trigger.trigger(\n this,\n {\n file: 'meeting/index',\n function: 'addMedia',\n },\n EVENT_TRIGGERS.MEETING_MEDIA_REMOTE_STARTED,\n data\n );\n Metrics.postEvent({\n event: eventType.RECEIVING_MEDIA_START,\n meeting: this,\n data: {\n mediaType: data.type,\n },\n });\n });\n this.statsAnalyzer.on(StatsAnalyzerEvents.REMOTE_MEDIA_STOPPED, (data) => {\n Metrics.postEvent({\n event: eventType.RECEIVING_MEDIA_STOP,\n meeting: this,\n data: {\n mediaType: data.type,\n },\n });\n });\n };\n\n getMediaConnectionDebugId() {\n return `MC-${this.id.substring(0, 4)}`;\n }\n\n /**\n * Creates a webrtc media connection\n *\n * @param {Object} turnServerInfo TURN server information\n * @returns {RoapMediaConnection | MultistreamRoapMediaConnection}\n */\n createMediaConnection(turnServerInfo) {\n const mc = Media.createMediaConnection(this.isMultistream, this.getMediaConnectionDebugId(), {\n mediaProperties: this.mediaProperties,\n remoteQualityLevel: this.mediaProperties.remoteQualityLevel,\n // @ts-ignore - config coming from registerPlugin\n enableRtx: this.config.enableRtx,\n // @ts-ignore - config coming from registerPlugin\n enableExtmap: this.config.enableExtmap,\n turnServerInfo,\n });\n\n this.mediaProperties.setMediaPeerConnection(mc);\n this.setupMediaConnectionListeners();\n\n return mc;\n }\n\n /**\n * Listens for an event emitted by eventEmitter and emits it from the meeting object\n *\n * @private\n * @param {*} eventEmitter object from which to forward the event\n * @param {*} eventTypeToForward which event type to listen on and to forward\n * @param {string} meetingEventType event type to be used in the event emitted from the meeting object\n * @returns {void}\n */\n forwardEvent(eventEmitter, eventTypeToForward, meetingEventType) {\n eventEmitter.on(eventTypeToForward, (data) =>\n Trigger.trigger(\n this,\n {\n file: 'meetings',\n function: 'addMedia',\n },\n meetingEventType,\n data\n )\n );\n }\n\n /**\n * Specify joining via audio (option: pstn), video, screenshare\n * @param {Object} options A configurable options object for joining a meeting\n * @param {Object} options.resourceId pass the deviceId\n * @param {MediaDirection} options.mediaSettings pass media options\n * @param {MediaStream} options.localStream\n * @param {MediaStream} options.localShare\n * @param {RemoteMediaManagerConfig} options.remoteMediaManagerConfig only applies if multistream is enabled\n * @returns {Promise}\n * @public\n * @memberof Meeting\n */\n addMedia(options: any = {}) {\n const LOG_HEADER = 'Meeting:index#addMedia -->';\n\n let turnDiscoverySkippedReason;\n let turnServerUsed = false;\n\n if (this.meetingState !== FULL_STATE.ACTIVE) {\n return Promise.reject(new MeetingNotActiveError());\n }\n\n if (MeetingUtil.isUserInLeftState(this.locusInfo)) {\n return Promise.reject(new UserNotJoinedError());\n }\n // If the user is unjoined or guest waiting in lobby dont allow the user to addMedia\n // @ts-ignore - isUserUnadmitted coming from SelfUtil\n if (this.isUserUnadmitted && !this.wirelessShare) {\n return Promise.reject(new UserInLobbyError());\n }\n\n const {localStream, localShare, mediaSettings, remoteMediaManagerConfig} = options;\n\n LoggerProxy.logger.info(`${LOG_HEADER} Adding Media.`);\n\n Metrics.postEvent({\n event: eventType.MEDIA_CAPABILITIES,\n meeting: this,\n data: {\n mediaCapabilities: {\n rx: {\n audio: false,\n share: false,\n share_audio: false,\n video: false,\n whiteboard: false,\n },\n tx: {\n audio: false,\n share: false,\n share_audio: false,\n video: false,\n whiteboard: false,\n },\n },\n },\n });\n\n return MeetingUtil.validateOptions(options)\n .then(() => this.roap.doTurnDiscovery(this, false))\n .then((turnDiscoveryObject) => {\n ({turnDiscoverySkippedReason} = turnDiscoveryObject);\n turnServerUsed = !turnDiscoverySkippedReason;\n\n const {turnServerInfo} = turnDiscoveryObject;\n\n this.preMedia(localStream, localShare, mediaSettings);\n\n const mc = this.createMediaConnection(turnServerInfo);\n\n if (this.isMultistream) {\n this.remoteMediaManager = new RemoteMediaManager(\n this.receiveSlotManager,\n this.mediaRequestManagers,\n remoteMediaManagerConfig\n );\n\n this.forwardEvent(\n this.remoteMediaManager,\n RemoteMediaManagerEvent.AudioCreated,\n EVENT_TRIGGERS.REMOTE_MEDIA_AUDIO_CREATED\n );\n this.forwardEvent(\n this.remoteMediaManager,\n RemoteMediaManagerEvent.ScreenShareAudioCreated,\n EVENT_TRIGGERS.REMOTE_MEDIA_SCREEN_SHARE_AUDIO_CREATED\n );\n this.forwardEvent(\n this.remoteMediaManager,\n RemoteMediaManagerEvent.VideoLayoutChanged,\n EVENT_TRIGGERS.REMOTE_MEDIA_VIDEO_LAYOUT_CHANGED\n );\n\n return this.remoteMediaManager.start().then(() => mc.initiateOffer());\n }\n\n return mc.initiateOffer();\n })\n .then(() => {\n this.setMercuryListener();\n })\n .then(() =>\n this.getDevices().then((devices) => {\n MeetingUtil.handleDeviceLogging(devices);\n })\n )\n .then(() => {\n this.handleMediaLogging(this.mediaProperties);\n LoggerProxy.logger.info(`${LOG_HEADER} media connection created`);\n\n // @ts-ignore - config coming from registerPlugin\n if (this.config.stats.enableStatsAnalyzer) {\n // @ts-ignore - config coming from registerPlugin\n this.networkQualityMonitor = new NetworkQualityMonitor(this.config.stats);\n this.statsAnalyzer = new StatsAnalyzer(\n // @ts-ignore - config coming from registerPlugin\n this.config.stats,\n (ssrc: number) => this.receiveSlotManager.findReceiveSlotBySsrc(ssrc),\n this.networkQualityMonitor\n );\n this.setupStatsAnalyzerEventHandlers();\n this.networkQualityMonitor.on(\n EVENT_TRIGGERS.NETWORK_QUALITY,\n this.sendNetworkQualityEvent.bind(this)\n );\n }\n })\n .catch((error) => {\n LoggerProxy.logger.error(\n `${LOG_HEADER} Error adding media , setting up peerconnection, `,\n error\n );\n\n throw error;\n })\n .then(\n () =>\n new Promise<void>((resolve, reject) => {\n let timerCount = 0;\n\n // eslint-disable-next-line func-names\n // eslint-disable-next-line prefer-arrow-callback\n if (this.type === _CALL_) {\n resolve();\n }\n const joiningTimer = setInterval(() => {\n timerCount += 1;\n if (this.meetingState === FULL_STATE.ACTIVE) {\n clearInterval(joiningTimer);\n resolve();\n }\n\n if (timerCount === 4) {\n clearInterval(joiningTimer);\n reject(new Error('Meeting is still not active '));\n }\n }, 1000);\n })\n )\n .then(() =>\n this.mediaProperties.waitForMediaConnectionConnected().catch(() => {\n throw new Error(\n `Timed out waiting for media connection to be connected, correlationId=${this.correlationId}`\n );\n })\n )\n .then(() => {\n LoggerProxy.logger.info(`${LOG_HEADER} PeerConnection CONNECTED`);\n if (mediaSettings && mediaSettings.sendShare && localShare) {\n if (this.state === MEETING_STATE.STATES.JOINED) {\n return this.requestScreenShareFloor();\n }\n\n // When the self state changes to JOINED then request the floor\n this.floorGrantPending = true;\n }\n\n return {};\n })\n .then(() => this.mediaProperties.getCurrentConnectionType())\n .then((connectionType) => {\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.ADD_MEDIA_SUCCESS, {\n correlation_id: this.correlationId,\n locus_id: this.locusUrl.split('/').pop(),\n connectionType,\n });\n })\n .catch((error) => {\n // Clean up stats analyzer, peer connection, and turn off listeners\n const stopStatsAnalyzer = this.statsAnalyzer\n ? this.statsAnalyzer.stopAnalyzer()\n : Promise.resolve();\n\n return stopStatsAnalyzer.then(() => {\n this.statsAnalyzer = null;\n\n if (this.mediaProperties.webrtcMediaConnection) {\n this.closePeerConnections();\n this.unsetPeerConnections();\n }\n\n LoggerProxy.logger.error(\n `${LOG_HEADER} Error adding media failed to initiate PC and send request, `,\n error\n );\n\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.ADD_MEDIA_FAILURE, {\n correlation_id: this.correlationId,\n locus_id: this.locusUrl.split('/').pop(),\n reason: error.message,\n stack: error.stack,\n code: error.code,\n turnDiscoverySkippedReason,\n turnServerUsed,\n });\n\n // Upload logs on error while adding media\n Trigger.trigger(\n this,\n {\n file: 'meeting/index',\n function: 'addMedia',\n },\n EVENTS.REQUEST_UPLOAD_LOGS,\n this\n );\n\n if (error instanceof Errors.SdpError) {\n this.leave({reason: MEETING_REMOVED_REASON.MEETING_CONNECTION_FAILED});\n }\n\n throw error;\n });\n });\n }\n\n /**\n * Informs if the peer connection is in a state that can be updated with updateMedia (audio/video/share)\n * @returns {Boolean}\n */\n canUpdateMedia() {\n // in theory we shouldn't need this as RoapMediaConnection handles multiple updates, glare, etc,\n // but there are some server issues, like https://jira-eng-gpk2.cisco.com/jira/browse/WEBEX-248394\n // so for now it's better to keep queuing any media updates at SDK meeting level\n return !this.isRoapInProgress;\n }\n\n /**\n * Enqueues a media update operation.\n * @param {String} mediaUpdateType one of MEDIA_UPDATE_TYPE values\n * @param {Object} options\n * @returns {Promise}\n * @private\n * @memberof Meeting\n */\n private enqueueMediaUpdate(mediaUpdateType: string, options: any) {\n if (mediaUpdateType === MEDIA_UPDATE_TYPE.LAMBDA && typeof options?.lambda !== 'function') {\n return Promise.reject(\n new Error('lambda must be specified when enqueuing MEDIA_UPDATE_TYPE.LAMBDA')\n );\n }\n const canUpdateMediaNow = this.canUpdateMedia();\n\n return new Promise((resolve, reject) => {\n const queueItem = {\n pendingPromiseResolve: resolve,\n pendingPromiseReject: reject,\n mediaUpdateType,\n options,\n };\n\n LoggerProxy.logger.log(\n `Meeting:index#enqueueMediaUpdate --> enqueuing media update type=${mediaUpdateType}`\n );\n this.queuedMediaUpdates.push(queueItem);\n\n if (canUpdateMediaNow) {\n this.processNextQueuedMediaUpdate();\n }\n });\n }\n\n /**\n * emits event when the negotation is completed\n * @returns {void}\n * @private\n * @memberof Meeting\n */\n mediaNegotiatedEvent = () => {\n // @ts-ignore - config coming from registerPlugin\n if (this.config.experimental.enableMediaNegotiatedEvent) {\n LoggerProxy.logger.info('Meeting:mediaNegotiatedEvent --> Media server negotiated');\n Trigger.trigger(\n this,\n {\n file: 'meeting/index',\n function: 'mediaNegotiatedEvent',\n },\n EVENT_TRIGGERS.MEDIA_NEGOTIATED\n );\n }\n };\n\n /**\n * Checks if there are any queued media updates and runs the first one from\n * the queue if we are in a state that allows doing that.\n * @returns {undefined}\n * @public\n * @memberof Meeting\n */\n processNextQueuedMediaUpdate = () => {\n if (this.canUpdateMedia() && this.queuedMediaUpdates.length > 0) {\n const {pendingPromiseResolve, pendingPromiseReject, mediaUpdateType, options} =\n this.queuedMediaUpdates.shift();\n\n LoggerProxy.logger.log(\n `Meeting:index#processNextQueuedMediaUpdate --> performing delayed media update type=${mediaUpdateType}`\n );\n switch (mediaUpdateType) {\n case MEDIA_UPDATE_TYPE.ALL:\n this.updateMedia(options).then(pendingPromiseResolve, pendingPromiseReject);\n break;\n case MEDIA_UPDATE_TYPE.AUDIO:\n this.updateAudio(options).then(pendingPromiseResolve, pendingPromiseReject);\n break;\n case MEDIA_UPDATE_TYPE.VIDEO:\n this.updateVideo(options).then(pendingPromiseResolve, pendingPromiseReject);\n break;\n case MEDIA_UPDATE_TYPE.SHARE:\n this.updateShare(options).then(pendingPromiseResolve, pendingPromiseReject);\n break;\n case MEDIA_UPDATE_TYPE.LAMBDA:\n options.lambda().then(pendingPromiseResolve, pendingPromiseReject);\n break;\n default:\n LoggerProxy.logger.error(\n `Peer-connection-manager:index#processNextQueuedMediaUpdate --> unsupported media update type ${mediaUpdateType} found in the queue`\n );\n break;\n }\n }\n };\n\n /**\n * A confluence of updateAudio, updateVideo, and updateShare\n * this function re-establishes all of the media streams with new options\n * @param {Object} options\n * @param {MediaStream} options.localStream\n * @param {MediaStream} options.localShare\n * @param {MediaDirection} options.mediaSettings\n * @returns {Promise}\n * @public\n * @memberof Meeting\n */\n public updateMedia(\n options: {\n localStream?: MediaStream;\n localShare?: MediaStream;\n mediaSettings?: any;\n } = {} as any\n ) {\n const LOG_HEADER = 'Meeting:index#updateMedia -->';\n\n if (!this.canUpdateMedia()) {\n return this.enqueueMediaUpdate(MEDIA_UPDATE_TYPE.ALL, options);\n }\n\n if (this.isMultistream) {\n const audioEnabled = options.mediaSettings?.sendAudio || options.mediaSettings?.receiveAudio;\n\n return this.mediaProperties.webrtcMediaConnection.enableMultistreamAudio(audioEnabled);\n }\n\n const {localStream, localShare, mediaSettings} = options;\n\n const previousSendShareStatus = this.mediaProperties.mediaDirection.sendShare;\n\n if (!this.mediaProperties.webrtcMediaConnection) {\n return Promise.reject(new Error('media connection not established, call addMedia() first'));\n }\n\n return MeetingUtil.validateOptions(options)\n .then(() => this.preMedia(localStream, localShare, mediaSettings))\n .then(() =>\n this.mediaProperties.webrtcMediaConnection\n .updateSendReceiveOptions({\n send: {\n audio: this.mediaProperties.mediaDirection.sendAudio\n ? this.mediaProperties.audioTrack.underlyingTrack\n : null,\n video: this.mediaProperties.mediaDirection.sendVideo\n ? this.mediaProperties.videoTrack.underlyingTrack\n : null,\n screenShareVideo: this.mediaProperties.mediaDirection.sendShare\n ? this.mediaProperties.shareTrack.underlyingTrack\n : null,\n },\n receive: {\n audio: this.mediaProperties.mediaDirection.receiveAudio,\n video: this.mediaProperties.mediaDirection.receiveVideo,\n screenShareVideo: this.mediaProperties.mediaDirection.receiveShare,\n remoteQualityLevel: this.mediaProperties.remoteQualityLevel,\n },\n })\n .then(() => {\n LoggerProxy.logger.info(\n `${LOG_HEADER} webrtcMediaConnection.updateSendReceiveOptions done`\n );\n })\n .catch((error) => {\n LoggerProxy.logger.error(`${LOG_HEADER} Error updatedMedia, `, error);\n\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.UPDATE_MEDIA_FAILURE, {\n correlation_id: this.correlationId,\n locus_id: this.locusUrl.split('/').pop(),\n reason: error.message,\n stack: error.stack,\n });\n\n throw error;\n })\n // todo: the following code used to be called always after sending the roap message with the new SDP\n // now it's called independently from the roap message (so might be before it), check if that's OK\n // if not, ensure it's called after (now it's called after roap message is sent out, but we're not\n // waiting for sendRoapMediaRequest() to be resolved)\n .then(() =>\n this.enqueueMediaUpdate(MEDIA_UPDATE_TYPE.LAMBDA, {\n lambda: () => {\n return Promise.resolve()\n .then(() =>\n this.checkForStopShare(mediaSettings.sendShare, previousSendShareStatus)\n )\n .then((startShare) => {\n // This is a special case if we do an /floor grant followed by /media\n // we actually get a OFFER from the server and a GLAR condition happens\n if (startShare) {\n // We are assuming that the clients are connected when doing an update\n return this.requestScreenShareFloor();\n }\n\n return Promise.resolve();\n });\n },\n })\n )\n );\n }\n\n /**\n * Update the main audio track with new parameters\n *\n * NOTE: this method can only be used with transcoded meetings, for multistream meetings use publishTrack()\n *\n * @param {Object} options\n * @param {boolean} options.sendAudio\n * @param {boolean} options.receiveAudio\n * @param {MediaStream} options.stream Stream that contains the audio track to update\n * @returns {Promise}\n * @public\n * @memberof Meeting\n */\n public async updateAudio(options: {\n sendAudio: boolean;\n receiveAudio: boolean;\n stream: MediaStream;\n }) {\n if (this.isMultistream) {\n throw new Error(\n 'updateAudio() is not supported with multistream, use publishTracks/unpublishTracks instead'\n );\n }\n if (!this.canUpdateMedia()) {\n return this.enqueueMediaUpdate(MEDIA_UPDATE_TYPE.AUDIO, options);\n }\n const {sendAudio, receiveAudio, stream} = options;\n const track = MeetingUtil.getTrack(stream).audioTrack;\n\n if (typeof sendAudio !== 'boolean' || typeof receiveAudio !== 'boolean') {\n return Promise.reject(new ParameterError('Pass sendAudio and receiveAudio parameter'));\n }\n\n if (!this.mediaProperties.webrtcMediaConnection) {\n return Promise.reject(new Error('media connection not established, call addMedia() first'));\n }\n\n return MeetingUtil.validateOptions({sendAudio, localStream: stream})\n .then(() =>\n this.mediaProperties.webrtcMediaConnection.updateSendReceiveOptions({\n send: {audio: track},\n receive: {\n audio: options.receiveAudio,\n video: this.mediaProperties.mediaDirection.receiveVideo,\n screenShareVideo: this.mediaProperties.mediaDirection.receiveShare,\n remoteQualityLevel: this.mediaProperties.remoteQualityLevel,\n },\n })\n )\n .then(() => {\n this.setLocalAudioTrack(track);\n // todo: maybe this.mediaProperties.mediaDirection could be removed? it's duplicating stuff from webrtcMediaConnection\n this.mediaProperties.mediaDirection.sendAudio = sendAudio;\n this.mediaProperties.mediaDirection.receiveAudio = receiveAudio;\n\n // audio state could be undefined if you have not sent audio before\n this.audio =\n this.audio || createMuteState(AUDIO, this, this.mediaProperties.mediaDirection);\n });\n }\n\n /**\n * Update the main video track with new parameters\n *\n * NOTE: this method can only be used with transcoded meetings, for multistream meetings use publishTrack()\n *\n * @param {Object} options\n * @param {boolean} options.sendVideo\n * @param {boolean} options.receiveVideo\n * @param {MediaStream} options.stream Stream that contains the video track to update\n * @returns {Promise}\n * @public\n * @memberof Meeting\n */\n public updateVideo(options: {sendVideo: boolean; receiveVideo: boolean; stream: MediaStream}) {\n if (this.isMultistream) {\n throw new Error(\n 'updateVideo() is not supported with multistream, use publishTracks/unpublishTracks instead'\n );\n }\n if (!this.canUpdateMedia()) {\n return this.enqueueMediaUpdate(MEDIA_UPDATE_TYPE.VIDEO, options);\n }\n const {sendVideo, receiveVideo, stream} = options;\n const track = MeetingUtil.getTrack(stream).videoTrack;\n\n if (typeof sendVideo !== 'boolean' || typeof receiveVideo !== 'boolean') {\n return Promise.reject(new ParameterError('Pass sendVideo and receiveVideo parameter'));\n }\n\n if (!this.mediaProperties.webrtcMediaConnection) {\n return Promise.reject(new Error('media connection not established, call addMedia() first'));\n }\n\n return MeetingUtil.validateOptions({sendVideo, localStream: stream})\n .then(() =>\n this.mediaProperties.webrtcMediaConnection.updateSendReceiveOptions({\n send: {video: track},\n receive: {\n audio: this.mediaProperties.mediaDirection.receiveAudio,\n video: options.receiveVideo,\n screenShareVideo: this.mediaProperties.mediaDirection.receiveShare,\n remoteQualityLevel: this.mediaProperties.remoteQualityLevel,\n },\n })\n )\n .then(() => {\n this.setLocalVideoTrack(track);\n this.mediaProperties.mediaDirection.sendVideo = sendVideo;\n this.mediaProperties.mediaDirection.receiveVideo = receiveVideo;\n\n // video state could be undefined if you have not sent video before\n this.video =\n this.video || createMuteState(VIDEO, this, this.mediaProperties.mediaDirection);\n });\n }\n\n /**\n * Internal function when stopping a share stream, cleanup\n * @param {boolean} sendShare\n * @param {boolean} previousShareStatus\n * @returns {Promise}\n * @private\n * @memberof Meeting\n */\n private checkForStopShare(sendShare: boolean, previousShareStatus: boolean) {\n if (sendShare && !previousShareStatus) {\n // When user starts sharing\n return Promise.resolve(true);\n }\n\n if (!sendShare && previousShareStatus) {\n // When user stops sharing\n return this.releaseScreenShareFloor().then(() => Promise.resolve(false));\n }\n\n return Promise.resolve();\n }\n\n /**\n * Update the share streams, can be used to start sharing\n *\n * NOTE: this method can only be used with transcoded meetings, for multistream meetings use publishTrack()\n *\n * @param {Object} options\n * @param {boolean} options.sendShare\n * @param {boolean} options.receiveShare\n * @returns {Promise}\n * @public\n * @memberof Meeting\n */\n public updateShare(options: {\n sendShare?: boolean;\n receiveShare?: boolean;\n stream?: any;\n skipSignalingCheck?: boolean;\n }) {\n if (this.isMultistream) {\n throw new Error(\n 'updateShare() is not supported with multistream, use publishTracks/unpublishTracks instead'\n );\n }\n if (!options.skipSignalingCheck && !this.canUpdateMedia()) {\n return this.enqueueMediaUpdate(MEDIA_UPDATE_TYPE.SHARE, options);\n }\n const {sendShare, receiveShare, stream} = options;\n const track = MeetingUtil.getTrack(stream).videoTrack;\n\n if (typeof sendShare !== 'boolean' || typeof receiveShare !== 'boolean') {\n return Promise.reject(new ParameterError('Pass sendShare and receiveShare parameter'));\n }\n\n if (!this.mediaProperties.webrtcMediaConnection) {\n return Promise.reject(new Error('media connection not established, call addMedia() first'));\n }\n\n const previousSendShareStatus = this.mediaProperties.mediaDirection.sendShare;\n\n this.setLocalShareTrack(track);\n\n return MeetingUtil.validateOptions({sendShare, localShare: stream})\n .then(() => this.checkForStopShare(sendShare, previousSendShareStatus))\n .then((startShare) =>\n this.mediaProperties.webrtcMediaConnection\n .updateSendReceiveOptions({\n send: {screenShareVideo: track},\n receive: {\n audio: this.mediaProperties.mediaDirection.receiveAudio,\n video: this.mediaProperties.mediaDirection.receiveVideo,\n screenShareVideo: options.receiveShare,\n remoteQualityLevel: this.mediaProperties.remoteQualityLevel,\n },\n })\n .then(() =>\n this.enqueueMediaUpdate(MEDIA_UPDATE_TYPE.LAMBDA, {\n lambda: async () => {\n if (startShare) {\n return this.requestScreenShareFloor();\n }\n\n return undefined;\n },\n })\n )\n )\n .then(() => {\n this.mediaProperties.mediaDirection.sendShare = sendShare;\n this.mediaProperties.mediaDirection.receiveShare = receiveShare;\n })\n .catch((error) => {\n this.unsetLocalShareTrack();\n throw error;\n });\n }\n\n /**\n * Do all the attach media pre set up before executing the actual attach\n * @param {MediaStream} localStream\n * @param {MediaStream} localShare\n * @param {MediaDirection} mediaSettings\n * @returns {undefined}\n * @private\n * @memberof Meeting\n */\n private preMedia(localStream: MediaStream, localShare: MediaStream, mediaSettings: any) {\n // eslint-disable-next-line no-warning-comments\n // TODO wire into default config. There's currently an issue with the stateless plugin or how we register\n // @ts-ignore - config coming from registerPlugin\n this.mediaProperties.setMediaDirection(Object.assign(this.config.mediaSettings, mediaSettings));\n // add a setup a function move the create and setup media in future\n // TODO: delete old audio and video if stale\n this.audio = this.audio || createMuteState(AUDIO, this, this.mediaProperties.mediaDirection);\n this.video = this.video || createMuteState(VIDEO, this, this.mediaProperties.mediaDirection);\n // Validation is already done in addMedia so no need to check if the lenght is greater then 0\n this.setLocalTracks(localStream);\n if (this.isMultistream && localShare) {\n throw new Error(\n 'calling addMedia() with localShare stream is not supported when using multistream'\n );\n }\n this.setLocalShareTrack(MeetingUtil.getTrack(localShare).videoTrack);\n }\n\n /**\n * Acknowledge the meeting, outgoing or incoming\n * @param {String} type\n * @returns {Promise} resolve {message, ringing, response}\n * @public\n * @memberof Meeting\n */\n public acknowledge(type: string) {\n if (!type) {\n return Promise.reject(new ParameterError('Type must be set to acknowledge the meeting.'));\n }\n if (type === _INCOMING_) {\n return this.meetingRequest\n .acknowledgeMeeting({\n locusUrl: this.locusUrl,\n deviceUrl: this.deviceUrl,\n correlationId: this.correlationId,\n })\n .then((response) => Promise.resolve(response))\n .then((response) => {\n this.meetingFiniteStateMachine.ring(type);\n Metrics.postEvent({event: eventType.ALERT_DISPLAYED, meeting: this});\n\n return Promise.resolve({\n response,\n });\n });\n }\n\n // TODO: outside of 1:1 incoming, and all outgoing calls\n return Promise.resolve({\n message: 'noop',\n });\n }\n\n /**\n * Decline this meeting\n * @param {String} reason\n * @returns {undefined}\n * @public\n * @memberof Meeting\n */\n public decline(reason: string) {\n return MeetingUtil.declineMeeting(this, reason)\n .then((decline) => {\n this.meetingFiniteStateMachine.decline();\n\n return Promise.resolve(decline);\n })\n .catch((error) => {\n this.meetingFiniteStateMachine.fail(error);\n\n return Promise.reject(error);\n });\n }\n\n /**\n * Leave the current meeting\n * @param {Object} options leave options\n * @param {String} options.resourceId the device with which to leave from, empty if just the computer\n * @returns {Promise}\n * @public\n * @memberof Meeting\n */\n public leave(options: {resourceId?: string; reason?: any} = {} as any) {\n Metrics.postEvent({\n event: eventType.LEAVE,\n meeting: this,\n data: {trigger: trigger.USER_INTERACTION, canProceed: false},\n });\n const leaveReason = options.reason || MEETING_REMOVED_REASON.CLIENT_LEAVE_REQUEST;\n\n LoggerProxy.logger.log('Meeting:index#leave --> Leaving a meeting');\n\n return MeetingUtil.leaveMeeting(this, options)\n .then((leave) => {\n this.meetingFiniteStateMachine.leave();\n this.clearMeetingData();\n\n // upload logs on leave irrespective of meeting delete\n Trigger.trigger(\n this,\n {\n file: 'meeting/index',\n function: 'leave',\n },\n EVENTS.REQUEST_UPLOAD_LOGS,\n this\n );\n\n // TODO: more testing before we remove this code, we are not sure the scenarios for destroy here\n if (this.wirelessShare || this.guest) {\n // If screen sharing clean the meeting object\n Trigger.trigger(\n this,\n {\n file: 'meeting/index',\n function: 'leave',\n },\n EVENTS.DESTROY_MEETING,\n {\n reason: options.reason,\n meetingId: this.id,\n }\n );\n }\n LoggerProxy.logger.log('Meeting:index#leave --> LEAVE REASON ', leaveReason);\n\n return leave;\n })\n .catch((error) => {\n this.meetingFiniteStateMachine.fail(error);\n LoggerProxy.logger.error('Meeting:index#leave --> Failed to leave ', error);\n // upload logs on leave irrespective of meeting delete\n Trigger.trigger(\n this,\n {\n file: 'meeting/index',\n function: 'leave',\n },\n EVENTS.REQUEST_UPLOAD_LOGS,\n this\n );\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.MEETING_LEAVE_FAILURE, {\n correlation_id: this.correlationId,\n locus_id: this.locusUrl.split('/').pop(),\n reason: error.message,\n stack: error.stack,\n code: error.code,\n });\n\n return Promise.reject(error);\n });\n }\n\n /**\n * Start sharing whiteboard given channelUrl\n * @param {string} channelUrl whiteboard url\n * @param {String} resourceToken token created by authorize media injector\n * @returns {Promise}\n * @public\n * @memberof Meeting\n */\n public startWhiteboardShare(channelUrl: string, resourceToken: string) {\n const whiteboard = this.locusInfo.mediaShares.find((element) => element.name === 'whiteboard');\n\n if (!channelUrl) {\n return Promise.reject(new ParameterError('Cannot share without channelUrl.'));\n }\n\n if (whiteboard) {\n Metrics.postEvent({event: eventType.WHITEBOARD_SHARE_INITIATED, meeting: this});\n\n const body: any = {\n disposition: FLOOR_ACTION.GRANTED,\n personUrl: this.locusInfo.self.url,\n deviceUrl: this.deviceUrl,\n uri: whiteboard.url,\n resourceUrl: channelUrl,\n };\n\n if (resourceToken) {\n body.resourceToken = resourceToken;\n }\n\n return this.meetingRequest\n .changeMeetingFloor(body)\n .then(() => {\n this.isSharing = false;\n\n return Promise.resolve();\n })\n .catch((error) => {\n LoggerProxy.logger.error('Meeting:index#startWhiteboardShare --> Error ', error);\n\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.MEETING_START_WHITEBOARD_SHARE_FAILURE, {\n correlation_id: this.correlationId,\n locus_id: this.locusUrl.split('/').pop(),\n reason: error.message,\n stack: error.stack,\n board: {channelUrl},\n });\n\n return Promise.reject(error);\n });\n }\n\n return Promise.reject(new ParameterError('Cannot share without whiteboard.'));\n }\n\n /**\n * Stop sharing whiteboard given channelUrl\n * @param {string} channelUrl whiteboard url\n * @returns {Promise}\n * @public\n * @memberof Meeting\n */\n public stopWhiteboardShare(channelUrl: string) {\n const whiteboard = this.locusInfo.mediaShares.find((element) => element.name === 'whiteboard');\n\n if (whiteboard) {\n Metrics.postEvent({event: eventType.WHITEBOARD_SHARE_STOPPED, meeting: this});\n\n return this.meetingRequest\n .changeMeetingFloor({\n disposition: FLOOR_ACTION.RELEASED,\n personUrl: this.locusInfo.self.url,\n deviceUrl: this.deviceUrl,\n uri: whiteboard.url,\n })\n .catch((error) => {\n LoggerProxy.logger.error('Meeting:index#stopWhiteboardShare --> Error ', error);\n\n Metrics.sendBehavioralMetric(\n // @ts-ignore - check if STOP_WHITEBOARD_SHARE_FAILURE exists\n BEHAVIORAL_METRICS.STOP_WHITEBOARD_SHARE_FAILURE,\n {\n correlation_id: this.correlationId,\n locus_id: this.locusUrl.split('/').pop(),\n reason: error.message,\n stack: error.stack,\n board: {channelUrl},\n }\n );\n\n return Promise.reject(error);\n })\n .finally(() => {});\n }\n\n return Promise.reject(new ParameterError('Cannot stop share without whiteboard.'));\n }\n\n /**\n * Sends a request to Locus to obtain the screen share floor\n * @returns {Promise} see #meetingRequest.changeMeetingFloor\n * @private\n * @memberof Meeting\n */\n private requestScreenShareFloor() {\n const content = this.locusInfo.mediaShares.find((element) => element.name === CONTENT);\n\n if (content && this.shareStatus !== SHARE_STATUS.LOCAL_SHARE_ACTIVE) {\n Metrics.postEvent({event: eventType.SHARE_INITIATED, meeting: this});\n\n return this.meetingRequest\n .changeMeetingFloor({\n disposition: FLOOR_ACTION.GRANTED,\n personUrl: this.locusInfo.self.url,\n deviceUrl: this.deviceUrl,\n uri: content.url,\n resourceUrl: this.resourceUrl,\n })\n .then(() => {\n this.isSharing = true;\n\n return Promise.resolve();\n })\n .catch((error) => {\n LoggerProxy.logger.error('Meeting:index#share --> Error ', error);\n\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.MEETING_SHARE_FAILURE, {\n correlation_id: this.correlationId,\n locus_id: this.locusUrl.split('/').pop(),\n reason: error.message,\n stack: error.stack,\n });\n\n return Promise.reject(error);\n });\n }\n\n return Promise.reject(new ParameterError('Cannot share without content.'));\n }\n\n /**\n * Stops the screen share\n * @returns {Promise} see #updateShare\n * @public\n * @memberof Meeting\n */\n // Internal only, temporarily allows optional params\n // eslint-disable-next-line valid-jsdoc\n public stopShare(options = {}) {\n return this.updateShare({\n sendShare: false,\n receiveShare: this.mediaProperties.mediaDirection.receiveShare,\n ...options,\n });\n }\n\n /**\n * Sends a request to Locus to release the screen share floor.\n * @returns {Promise} see #meetingRequest.changeMeetingFloor\n * @private\n * @memberof Meeting\n */\n private releaseScreenShareFloor() {\n const content = this.locusInfo.mediaShares.find((element) => element.name === CONTENT);\n\n if (content && this.mediaProperties.mediaDirection.sendShare) {\n Metrics.postEvent({event: eventType.SHARE_STOPPED, meeting: this});\n\n if (content.floor.beneficiary.id !== this.selfId) {\n // remote participant started sharing and caused our sharing to stop, we don't want to send any floor action request in that case\n this.isSharing = false;\n\n return Promise.resolve();\n }\n\n return this.meetingRequest\n .changeMeetingFloor({\n disposition: FLOOR_ACTION.RELEASED,\n personUrl: this.locusInfo.self.url,\n deviceUrl: this.deviceUrl,\n uri: content.url,\n resourceUrl: this.resourceUrl,\n })\n .catch((error) => {\n LoggerProxy.logger.error('Meeting:index#releaseScreenShareFloor --> Error ', error);\n\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.STOP_FLOOR_REQUEST_FAILURE, {\n correlation_id: this.correlationId,\n locus_id: this.locusUrl.split('/').pop(),\n reason: error.message,\n stack: error.stack,\n });\n\n return Promise.reject(error);\n })\n .finally(() => {\n this.isSharing = false;\n });\n }\n\n return Promise.reject(new ParameterError('Cannot stop share without content'));\n }\n\n /**\n * Intiate a recording of this meeting\n * @returns {Promise}\n * @public\n * @memberof Meeting\n */\n public startRecording() {\n return this.recordingController.startRecording();\n }\n\n /**\n * set the mute on entry flag for participants if you're the host\n * @returns {Promise}\n * @param {boolean} enabled\n * @public\n * @memberof Meeting\n */\n public setMuteOnEntry(enabled: boolean) {\n return this.controlsOptionsManager.setMuteOnEntry(enabled);\n }\n\n /**\n * set the disallow unmute flag for participants if you're the host\n * @returns {Promise}\n * @param {boolean} enabled\n * @public\n * @memberof Meeting\n */\n public setDisallowUnmute(enabled: boolean) {\n return this.controlsOptionsManager.setDisallowUnmute(enabled);\n }\n\n /**\n * set the mute all flag for participants if you're the host\n * @returns {Promise}\n * @param {boolean} mutedEnabled\n * @param {boolean} disallowUnmuteEnabled\n * @param {boolean} muteOnEntryEnabled\n * @public\n * @memberof Meeting\n */\n public setMuteAll(\n mutedEnabled: boolean,\n disallowUnmuteEnabled: boolean,\n muteOnEntryEnabled: boolean\n ) {\n return this.controlsOptionsManager.setMuteAll(\n mutedEnabled,\n disallowUnmuteEnabled,\n muteOnEntryEnabled\n );\n }\n\n /**\n * End the recording of this meeting\n * @returns {Promise}\n * @public\n * @memberof Meeting\n */\n public stopRecording() {\n return this.recordingController.stopRecording();\n }\n\n /**\n * Pauses the recording of this meeting\n * @returns {Promise}\n * @public\n * @memberof Meeting\n */\n public pauseRecording() {\n return this.recordingController.pauseRecording();\n }\n\n /**\n * Resumes the recording of this meeting\n * @returns {Promise}\n * @public\n * @memberof Meeting\n */\n public resumeRecording() {\n return this.recordingController.resumeRecording();\n }\n\n /**\n * Locks the current meeting if possible\n * @returns {Promise}\n * @public\n * @memberof Meeting\n */\n public lockMeeting() {\n return MeetingUtil.lockMeeting(this.inMeetingActions, this.meetingRequest, this.locusUrl);\n }\n\n /**\n * Unlocks the current meeting if possible\n * @returns {Promise}\n * @public\n * @memberof Meeting\n */\n public unlockMeeting() {\n return MeetingUtil.unlockMeeting(this.inMeetingActions, this.meetingRequest, this.locusUrl);\n }\n\n /**\n * Logs an error message and returns a rejected promise with same message\n * @param {String} message\n * @returns {Promise}\n * @private\n * @memberof Meeting\n */\n private rejectWithErrorLog(message: string) {\n LoggerProxy.logger.error(message);\n\n return Promise.reject(new Error(message));\n }\n\n /**\n * Sends DTMF tones to the current meeting\n * @param {String} tones a string of one or more DTMF tones to send\n * @returns {Promise}\n * @public\n * @memberof Meeting\n */\n public sendDTMF(tones: string) {\n if (this.locusInfo && this.locusInfo.self) {\n if (this.locusInfo.self.enableDTMF) {\n return this.meetingRequest.sendDTMF({\n locusUrl: this.locusInfo.self.url,\n deviceUrl: this.deviceUrl,\n tones,\n });\n }\n\n return this.rejectWithErrorLog(\n 'Meeting:index#sendDTMF --> cannot send DTMF, meeting does not have DTMF enabled'\n );\n }\n\n return this.rejectWithErrorLog(\n 'Meeting:index#sendDTMF --> cannot send DTMF, meeting does not have a connection to the \"locus\" call control service. Have you joined?'\n );\n }\n\n /**\n * Sends request to change layout type for the current meeting for the specific participant/device only\n * @param {String} [layoutType] a layout type that should be available in meeting constants {@link #layout_types}\n * @param {Object} renderInfo preferred dimensions for the remote main and content streams (server can ignore it)\n * @param {Object} renderInfo.main preferred dimensions for the remote main video stream\n * @param {Number} renderInfo.main.width preferred width of main video stream\n * @param {Number} renderInfo.main.height preferred height of main video stream\n * @param {Object} renderInfo.content preferred dimensions for the remote content share stream\n * @param {Number} renderInfo.content.width preferred width of content share stream\n * @param {Number} renderInfo.content.height preferred height of content share stream\n * @returns {Promise}\n * @public\n * @memberof Meeting\n */\n public changeVideoLayout(\n layoutType?: string,\n renderInfo: {\n main: {\n width: number;\n height: number;\n };\n content: {\n width: number;\n height: number;\n };\n } = {} as any\n ) {\n const {main, content} = renderInfo;\n const {mediaDirection, remoteShare, remoteVideoTrack} = this.mediaProperties;\n\n const layoutInfo = cloneDeep(this.lastVideoLayoutInfo);\n\n // TODO: We need a real time value for Audio, Video and Share send indicator\n if (mediaDirection.receiveVideo !== true || !remoteVideoTrack) {\n return this.rejectWithErrorLog(\n 'Meeting:index#changeVideoLayout --> cannot change video layout, you are not recieving any video/share stream'\n );\n }\n\n if (layoutType) {\n if (!LAYOUT_TYPES.includes(layoutType)) {\n this.rejectWithErrorLog(\n 'Meeting:index#changeVideoLayout --> cannot change video layout, invalid layoutType recieved.'\n );\n }\n\n layoutInfo.layoutType = layoutType;\n }\n\n if (main) {\n const mainWidth = Math.round(main.width);\n const mainHeight = Math.round(main.height);\n\n // Stop any \"twitching\" caused by very slight size changes\n if (\n !this.lastVideoLayoutInfo.main ||\n Math.abs(this.lastVideoLayoutInfo.main.height - mainHeight) > 2 ||\n Math.abs(this.lastVideoLayoutInfo.main.width - mainWidth) > 2\n ) {\n layoutInfo.main = {width: mainWidth, height: mainHeight};\n }\n }\n\n if (content) {\n if (this.mediaProperties.mediaDirection.receiveShare && remoteShare) {\n const contentWidth = Math.round(content.width);\n const contentHeight = Math.round(content.height);\n\n // Stop any \"twitching\" caused by very slight size changes\n if (\n !this.lastVideoLayoutInfo.content ||\n Math.abs(this.lastVideoLayoutInfo.content.height - contentHeight) > 2 ||\n Math.abs(this.lastVideoLayoutInfo.content.width - contentWidth) > 2\n ) {\n layoutInfo.content = {width: contentWidth, height: contentHeight};\n }\n } else {\n return this.rejectWithErrorLog(\n 'Meeting:index#changeVideoLayout --> unable to send renderInfo for content, you are not receiving remote share'\n );\n }\n }\n\n if (isEqual(layoutInfo, this.lastVideoLayoutInfo)) {\n // nothing changed, no need to send any request\n return Promise.resolve();\n }\n this.lastVideoLayoutInfo = cloneDeep(layoutInfo);\n\n this.locusInfo.once(LOCUSINFO.EVENTS.CONTROLS_MEETING_LAYOUT_UPDATED, (envelope) => {\n Trigger.trigger(\n this,\n {\n file: 'meeting/index',\n function: 'changeVideoLayout',\n },\n EVENT_TRIGGERS.MEETING_CONTROLS_LAYOUT_UPDATE,\n {\n layout: envelope.layout,\n }\n );\n });\n\n return this.meetingRequest\n .changeVideoLayoutDebounced({\n locusUrl: this.locusInfo.self.url,\n deviceUrl: this.deviceUrl,\n layoutType,\n main: layoutInfo.main,\n content: layoutInfo.content,\n })\n .then((response) => {\n if (response && response.body && response.body.locus) {\n this.locusInfo.onFullLocus(response.body.locus);\n }\n })\n .catch((error) => {\n LoggerProxy.logger.error('Meeting:index#changeVideoLayout --> Error ', error);\n\n return Promise.reject(error);\n });\n }\n\n /**\n * Sets the quality of the local video stream\n * @param {String} level {LOW|MEDIUM|HIGH}\n * @returns {Promise<MediaStream>} localStream\n */\n setLocalVideoQuality(level: string) {\n LoggerProxy.logger.log(`Meeting:index#setLocalVideoQuality --> Setting quality to ${level}`);\n\n if (!VIDEO_RESOLUTIONS[level]) {\n return this.rejectWithErrorLog(`Meeting:index#setLocalVideoQuality --> ${level} not defined`);\n }\n\n if (!this.mediaProperties.mediaDirection.sendVideo) {\n return this.rejectWithErrorLog(\n 'Meeting:index#setLocalVideoQuality --> unable to change video quality, sendVideo is disabled'\n );\n }\n\n // If level is already the same, don't do anything\n if (level === this.mediaProperties.localQualityLevel) {\n LoggerProxy.logger.warn(\n `Meeting:index#setLocalQualityLevel --> Quality already set to ${level}`\n );\n\n return Promise.resolve();\n }\n\n // Set the quality level in properties\n this.mediaProperties.setLocalQualityLevel(level);\n\n const mediaDirection = {\n sendAudio: this.mediaProperties.mediaDirection.sendAudio,\n sendVideo: this.mediaProperties.mediaDirection.sendVideo,\n sendShare: this.mediaProperties.mediaDirection.sendShare,\n };\n\n // When changing local video quality level\n // Need to stop current track first as chrome doesn't support resolution upscaling(for eg. changing 480p to 720p)\n // Without feeding it a new track\n // open bug link: https://bugs.chromium.org/p/chromium/issues/detail?id=943469\n if (isBrowser('chrome') && this.mediaProperties.videoTrack)\n Media.stopTracks(this.mediaProperties.videoTrack);\n\n return this.getMediaStreams(mediaDirection, VIDEO_RESOLUTIONS[level]).then(\n async ([localStream]) => {\n await this.updateVideo({\n sendVideo: true,\n receiveVideo: true,\n stream: localStream,\n });\n\n return localStream;\n }\n );\n }\n\n /**\n * Sets the quality level of the remote incoming media\n * @param {String} level {LOW|MEDIUM|HIGH}\n * @returns {Promise}\n */\n setRemoteQualityLevel(level: string) {\n LoggerProxy.logger.log(`Meeting:index#setRemoteQualityLevel --> Setting quality to ${level}`);\n\n if (!QUALITY_LEVELS[level]) {\n return this.rejectWithErrorLog(\n `Meeting:index#setRemoteQualityLevel --> ${level} not defined`\n );\n }\n\n if (\n !this.mediaProperties.mediaDirection.receiveAudio &&\n !this.mediaProperties.mediaDirection.receiveVideo\n ) {\n return this.rejectWithErrorLog(\n 'Meeting:index#setRemoteQualityLevel --> unable to change remote quality, receiveVideo and receiveAudio is disabled'\n );\n }\n\n // If level is already the same, don't do anything\n if (level === this.mediaProperties.remoteQualityLevel) {\n LoggerProxy.logger.warn(\n `Meeting:index#setRemoteQualityLevel --> Quality already set to ${level}`\n );\n\n return Promise.resolve();\n }\n\n // Set the quality level in properties\n this.mediaProperties.setRemoteQualityLevel(level);\n\n return this.updateMedia({mediaSettings: this.mediaProperties.mediaDirection});\n }\n\n /**\n * This is deprecated, please use setLocalVideoQuality for setting local and setRemoteQualityLevel for remote\n * @param {String} level {LOW|MEDIUM|HIGH}\n * @returns {Promise}\n * @deprecated After FHD support\n */\n setMeetingQuality(level: string) {\n LoggerProxy.logger.log(`Meeting:index#setMeetingQuality --> Setting quality to ${level}`);\n\n if (!QUALITY_LEVELS[level]) {\n return this.rejectWithErrorLog(`Meeting:index#setMeetingQuality --> ${level} not defined`);\n }\n\n const previousLevel = {\n local: this.mediaProperties.localQualityLevel,\n remote: this.mediaProperties.remoteQualityLevel,\n };\n\n // If level is already the same, don't do anything\n if (\n level === this.mediaProperties.localQualityLevel &&\n level === this.mediaProperties.remoteQualityLevel\n ) {\n LoggerProxy.logger.warn(\n `Meeting:index#setMeetingQuality --> Quality already set to ${level}`\n );\n\n return Promise.resolve();\n }\n\n // Determine the direction of our current media\n const {receiveAudio, receiveVideo, sendVideo} = this.mediaProperties.mediaDirection;\n\n return (sendVideo ? this.setLocalVideoQuality(level) : Promise.resolve())\n .then(() =>\n receiveAudio || receiveVideo ? this.setRemoteQualityLevel(level) : Promise.resolve()\n )\n .catch((error) => {\n // From troubleshooting it seems that the stream itself doesn't change the max-fs if the peer connection isn't stable\n this.mediaProperties.setLocalQualityLevel(previousLevel.local);\n this.mediaProperties.setRemoteQualityLevel(previousLevel.remote);\n\n LoggerProxy.logger.error(`Meeting:index#setMeetingQuality --> ${error.message}`);\n\n Metrics.sendBehavioralMetric(\n BEHAVIORAL_METRICS.SET_MEETING_QUALITY_FAILURE,\n {\n correlation_id: this.correlationId,\n locus_id: this.locusUrl.split('/').pop(),\n reason: error.message,\n stack: error.stack,\n },\n {\n type: error.name,\n }\n );\n\n return Promise.reject(error);\n });\n }\n\n /**\n *\n * NOTE: this method can only be used with transcoded meetings, for multistream use publishTrack()\n *\n * @param {Object} options parameter\n * @param {Boolean} options.sendAudio send audio from the display share\n * @param {Boolean} options.sendShare send video from the display share\n * @param {Object} options.sharePreferences\n * @param {MediaTrackConstraints} options.sharePreferences.shareConstraints constraints to apply to video\n * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/MediaTrackConstraints}\n * @param {Boolean} options.sharePreferences.highFrameRate if shareConstraints isn't provided, set default values based off of this boolean\n * @returns {Promise}\n */\n shareScreen(\n options: {\n sendAudio: boolean;\n sendShare: boolean;\n sharePreferences: {shareConstraints: MediaTrackConstraints};\n } = {} as any\n ) {\n LoggerProxy.logger.log('Meeting:index#shareScreen --> Getting local share');\n\n const shareConstraints = {\n sendShare: true,\n sendAudio: false,\n ...options,\n };\n\n // @ts-ignore - config coming from registerPlugin\n return Media.getDisplayMedia(shareConstraints, this.config)\n .then((shareStream) =>\n this.updateShare({\n sendShare: true,\n receiveShare: this.mediaProperties.mediaDirection.receiveShare,\n stream: shareStream,\n })\n )\n .catch((error) => {\n // Whenever there is a failure when trying to access a user's display\n // report it as an Behavioral metric\n // This gives visibility into common errors and can help\n // with further troubleshooting\n\n // This metrics will get erros for getDisplayMedia and share errors for now\n // TODO: The getDisplayMedia errors need to be moved inside `media.getDisplayMedia`\n const metricName = BEHAVIORAL_METRICS.GET_DISPLAY_MEDIA_FAILURE;\n const data = {\n correlation_id: this.correlationId,\n locus_id: this.locusUrl.split('/').pop(),\n reason: error.message,\n stack: error.stack,\n };\n const metadata = {\n type: error.name,\n };\n\n Metrics.sendBehavioralMetric(metricName, data, metadata);\n throw new MediaError('Unable to retrieve display media stream', error);\n });\n }\n\n /**\n * Functionality for when a share is ended.\n * @private\n * @memberof Meeting\n * @param {MediaStream} localShare\n * @returns {undefined}\n */\n private handleShareTrackEnded = async () => {\n if (this.wirelessShare) {\n this.leave({reason: MEETING_REMOVED_REASON.USER_ENDED_SHARE_STREAMS});\n } else if (this.isMultistream) {\n try {\n if (this.mediaProperties.mediaDirection.sendShare) {\n await this.releaseScreenShareFloor();\n }\n } catch (error) {\n LoggerProxy.logger.log(\n 'Meeting:index#handleShareTrackEnded --> Error stopping share: ',\n error\n );\n } finally {\n this.setLocalShareTrack(null);\n this.mediaProperties.mediaDirection.sendShare = false;\n }\n } else {\n // Skip checking for a stable peerConnection\n // to allow immediately stopping screenshare\n this.stopShare({\n skipSignalingCheck: true,\n }).catch((error) => {\n LoggerProxy.logger.log(\n 'Meeting:index#handleShareTrackEnded --> Error stopping share: ',\n error\n );\n });\n }\n\n Trigger.trigger(\n this,\n {\n file: 'meeting/index',\n function: 'handleShareTrackEnded',\n },\n EVENT_TRIGGERS.MEETING_STOPPED_SHARING_LOCAL,\n {\n type: EVENT_TYPES.LOCAL_SHARE,\n }\n );\n };\n\n /**\n * Emits the 'network:quality' event\n * 1 indicates an acceptable uplink network.\n * 0 indicates an unacceptable uplink network based on a predefined threshold\n * @returns {undefined}\n * @param {Object} res - payload of emitNetworkQuality\n * @property {string} mediaType {video|audio}\n * @property {number} networkQualityScore - {1|0}\n * @private\n * @memberof Meeting\n */\n private sendNetworkQualityEvent(res: any) {\n Trigger.trigger(\n this,\n {\n file: 'meeting/index',\n function: 'addMedia',\n },\n EVENT_TRIGGERS.NETWORK_QUALITY,\n {\n networkQualityScore: res.networkQualityScore,\n mediaType: res.mediaType,\n }\n );\n }\n\n /**\n * Handle logging the media\n * @param {Object} mediaProperties\n * @private\n * @returns {undefined}\n */\n private handleMediaLogging(mediaProperties: {\n audioTrack: LocalMicrophoneTrack | null;\n videoTrack: LocalCameraTrack | null;\n }) {\n MeetingUtil.handleVideoLogging(mediaProperties.videoTrack);\n MeetingUtil.handleAudioLogging(mediaProperties.audioTrack);\n }\n\n /**\n * @param {string} typeMedia 'audio' or 'video'\n * @returns {undefined}\n */\n setStartSetupDelay(typeMedia: string) {\n this[`startSetupDelay${typeMedia}`] = performance.now();\n this[`endSetupDelay${typeMedia}`] = undefined;\n }\n\n /**\n * @param {string} typeMedia 'audio' or 'video'\n * @returns {undefined}\n */\n setEndSetupDelay(typeMedia: string) {\n this[`endSetupDelay${typeMedia}`] = performance.now();\n }\n\n /**\n * @param {string} typeMedia 'audio' or 'video'\n * @returns {string} duration between start and end of setup\n */\n getSetupDelayDuration(typeMedia: string) {\n const start = this[`startSetupDelay${typeMedia}`];\n const end = this[`endSetupDelay${typeMedia}`];\n\n return start && end ? end - start : undefined;\n }\n\n /**\n * @param {string} typeMedia 'audio' or 'video'\n * @returns {undefined}\n */\n setStartSendingMediaDelay(typeMedia: string) {\n this[`startSendingMediaDelay${typeMedia}`] = performance.now();\n this[`endSendingMediaDelay${typeMedia}`] = undefined;\n }\n\n /**\n * @param {string} typeMedia 'audio' or 'video'\n * @returns {undefined}\n */\n setEndSendingMediaDelay(typeMedia: string) {\n this[`endSendingMediaDelay${typeMedia}`] = performance.now();\n }\n\n /**\n * @param {string} typeMedia 'audio' or 'video'\n * @returns {string} duration between join response and first media tx\n */\n getSendingMediaDelayDuration(typeMedia: string) {\n const start = this[`startSendingMediaDelay${typeMedia}`];\n const end = this[`endSendingMediaDelay${typeMedia}`];\n\n return start && end ? end - start : undefined;\n }\n\n /**\n *\n * @returns {undefined}\n */\n setStartLocalSDPGenRemoteSDPRecvDelay() {\n if (!this.startLocalSDPGenRemoteSDPRecvDelay) {\n this.startLocalSDPGenRemoteSDPRecvDelay = performance.now();\n this.endLocalSDPGenRemoteSDPRecvDelay = undefined;\n }\n }\n\n /**\n *\n * @returns {undefined}\n */\n setEndLocalSDPGenRemoteSDPRecvDelay() {\n if (!this.endLocalSDPGenRemoteSDPRecvDelay) {\n this.endLocalSDPGenRemoteSDPRecvDelay = performance.now();\n }\n }\n\n /**\n *\n * @returns {string} duration between local SDP generation and remote SDP reception\n */\n getLocalSDPGenRemoteSDPRecvDelay() {\n const start = this.startLocalSDPGenRemoteSDPRecvDelay;\n const end = this.endLocalSDPGenRemoteSDPRecvDelay;\n\n if (start && end) {\n const calculatedDelay = end - start;\n\n return calculatedDelay > METRICS_JOIN_TIMES_MAX_DURATION ? undefined : calculatedDelay;\n }\n\n return undefined;\n }\n\n /**\n *\n * @returns {undefined}\n */\n setStartCallInitiateJoinReq() {\n this.startCallInitiateJoinReq = performance.now();\n this.endCallInitiateJoinReq = undefined;\n }\n\n /**\n *\n * @returns {undefined}\n */\n setEndCallInitiateJoinReq() {\n this.endCallInitiateJoinReq = performance.now();\n }\n\n /**\n *\n * @returns {string} duration between call initiate and sending join request to locus\n */\n getCallInitiateJoinReq() {\n const start = this.startCallInitiateJoinReq;\n const end = this.endCallInitiateJoinReq;\n\n if (start && end) {\n const calculatedDelay = end - start;\n\n return calculatedDelay > METRICS_JOIN_TIMES_MAX_DURATION ? undefined : calculatedDelay;\n }\n\n return undefined;\n }\n\n /**\n *\n * @returns {undefined}\n */\n setStartJoinReqResp() {\n this.startJoinReqResp = performance.now();\n this.endJoinReqResp = undefined;\n }\n\n /**\n *\n * @returns {undefined}\n */\n setEndJoinReqResp() {\n this.endJoinReqResp = performance.now();\n }\n\n /**\n *\n * @returns {string} duration between sending locus join request and receiving join response\n */\n getJoinReqResp() {\n const start = this.startJoinReqResp;\n const end = this.endJoinReqResp;\n\n if (start && end) {\n const calculatedDelay = end - start;\n\n return calculatedDelay > METRICS_JOIN_TIMES_MAX_DURATION ? undefined : calculatedDelay;\n }\n\n return undefined;\n }\n\n /**\n *\n * @returns {string} duration between call initiate and successful locus join (even if it is in lobby)\n */\n getTotalJmt() {\n const start = this.startCallInitiateJoinReq;\n const end = this.endJoinReqResp;\n\n return start && end ? end - start : undefined;\n }\n\n /**\n * End the current meeting for all\n * @returns {Promise}\n * @public\n * @memberof Meeting\n */\n public endMeetingForAll() {\n Metrics.postEvent({\n event: eventType.LEAVE,\n meeting: this,\n data: {trigger: trigger.USER_INTERACTION, canProceed: false},\n });\n\n LoggerProxy.logger.log('Meeting:index#endMeetingForAll --> End meeting for All');\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.MEETING_END_ALL_INITIATED, {\n correlation_id: this.correlationId,\n locus_id: this.locusId,\n });\n\n return MeetingUtil.endMeetingForAll(this)\n .then((end) => {\n this.meetingFiniteStateMachine.end();\n\n this.clearMeetingData();\n // upload logs on leave irrespective of meeting delete\n Trigger.trigger(\n this,\n {\n file: 'meeting/index',\n function: 'endMeetingForAll',\n },\n EVENTS.REQUEST_UPLOAD_LOGS,\n this\n );\n\n return end;\n })\n .catch((error) => {\n this.meetingFiniteStateMachine.fail(error);\n LoggerProxy.logger.error(\n 'Meeting:index#endMeetingForAll --> Failed to end meeting ',\n error\n );\n // upload logs on leave irrespective of meeting delete\n Trigger.trigger(\n this,\n {\n file: 'meeting/index',\n function: 'endMeetingForAll',\n },\n EVENTS.REQUEST_UPLOAD_LOGS,\n this\n );\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.MEETING_END_ALL_FAILURE, {\n correlation_id: this.correlationId,\n locus_id: this.locusUrl.split('/').pop(),\n reason: error.message,\n stack: error.stack,\n code: error.code,\n });\n\n return Promise.reject(error);\n });\n }\n\n /**\n * clear the meeting data\n * @returns {undefined}\n * @public\n * @memberof Meeting\n */\n clearMeetingData = () => {\n this.audio = null;\n this.video = null;\n this.isSharing = false;\n if (this.shareStatus === SHARE_STATUS.LOCAL_SHARE_ACTIVE) {\n this.shareStatus = SHARE_STATUS.NO_SHARE;\n }\n this.queuedMediaUpdates = [];\n\n if (this.transcription) {\n this.transcription.closeSocket();\n this.triggerStopReceivingTranscriptionEvent();\n this.transcription = undefined;\n }\n };\n\n /**\n * starts keepAlives being sent\n * @returns {void}\n * @private\n * @memberof Meeting\n */\n startKeepAlive = () => {\n if (this.keepAliveTimerId) {\n LoggerProxy.logger.warn(\n 'Meeting:index#startKeepAlive --> keepAlive not started: keepAliveTimerId already exists'\n );\n\n return;\n }\n if (!this.joinedWith?.keepAliveUrl) {\n LoggerProxy.logger.warn(\n 'Meeting:index#startKeepAlive --> keepAlive not started: no keepAliveUrl'\n );\n\n return;\n }\n if (!this.joinedWith?.keepAliveSecs) {\n LoggerProxy.logger.warn(\n 'Meeting:index#startKeepAlive --> keepAlive not started: no keepAliveSecs'\n );\n\n return;\n }\n if (this.joinedWith.keepAliveSecs <= 1) {\n LoggerProxy.logger.warn(\n 'Meeting:index#startKeepAlive --> keepAlive not started: keepAliveSecs <= 1'\n );\n\n return;\n }\n const {keepAliveUrl} = this.joinedWith;\n const keepAliveInterval = (this.joinedWith.keepAliveSecs - 1) * 750; // taken from UCF\n\n this.keepAliveTimerId = setInterval(() => {\n this.meetingRequest.keepAlive({keepAliveUrl}).catch((error) => {\n LoggerProxy.logger.warn(\n `Meeting:index#startKeepAlive --> Stopping sending keepAlives to ${keepAliveUrl} after error ${error}`\n );\n this.stopKeepAlive();\n });\n }, keepAliveInterval);\n };\n\n /**\n * stops keepAlives being sent\n * @returns {void}\n * @private\n * @memberof Meeting\n */\n stopKeepAlive = () => {\n if (!this.keepAliveTimerId) {\n return;\n }\n clearInterval(this.keepAliveTimerId);\n this.keepAliveTimerId = null;\n };\n\n /**\n * Send a reaction inside the meeting.\n *\n * @param {ReactionServerType} reactionType - type of reaction to be sent. Example: \"thumbs_up\"\n * @param {SkinToneType} skinToneType - skin tone for the reaction. Example: \"medium_dark\"\n * @returns {Promise}\n * @public\n * @memberof Meeting\n */\n public sendReaction(reactionType: ReactionServerType, skinToneType?: SkinToneType) {\n const reactionChannelUrl = this.locusInfo?.controls?.reactions?.reactionChannelUrl as string;\n const participantId = this.members.selfId;\n\n const reactionData = Reactions[reactionType];\n\n if (!reactionData) {\n return Promise.reject(new Error(`${reactionType} is not a valid reaction.`));\n }\n const skinToneData = SkinTones[skinToneType] || SkinTones.normal;\n const reaction: Reaction = {\n ...reactionData,\n tone: skinToneData,\n };\n\n if (reactionChannelUrl) {\n return this.meetingRequest.sendReaction({reactionChannelUrl, reaction, participantId});\n }\n\n return Promise.reject(new Error('Error sending reaction, service url not found.'));\n }\n\n /**\n * Method to enable or disable reactions inside the meeting.\n *\n * @param {boolean} enable - enable or disable reactions\n * @returns {Promise}\n * @public\n * @memberof Meeting\n */\n public toggleReactions(enable: boolean) {\n const isEnabled = this.locusInfo?.controls?.reactions?.enabled;\n\n if ((isEnabled && enable) || (!isEnabled && !enable)) {\n return Promise.resolve(`Reactions are already ${isEnabled ? 'enabled' : 'disabled'}.`);\n }\n\n return this.meetingRequest.toggleReactions({\n enable,\n locusUrl: this.locusUrl,\n requestingParticipantId: this.members.selfId,\n });\n }\n\n /**\n * Throws if we don't have a media connection created\n *\n * @returns {void}\n */\n private checkMediaConnection() {\n if (this.mediaProperties?.webrtcMediaConnection) {\n return;\n }\n throw new Error('Webrtc media connection is missing, call addMedia() first');\n }\n\n /**\n * Publishes specified local tracks in the meeting\n *\n * @param {Object} tracks\n * @returns {Promise}\n */\n async publishTracks(tracks: {\n microphone?: MediaStreamTrack;\n camera?: MediaStreamTrack;\n screenShare: {\n audio?: MediaStreamTrack; // todo: for now screen share audio is not supported (will be done in SPARK-399690)\n video?: MediaStreamTrack;\n };\n }): Promise<void> {\n this.checkMediaConnection();\n\n if (tracks.screenShare?.video) {\n // we are starting a screen share\n this.setLocalShareTrack(tracks.screenShare.video);\n\n await this.requestScreenShareFloor();\n this.mediaProperties.mediaDirection.sendShare = true;\n\n await this.mediaProperties.webrtcMediaConnection.publishTrack(\n this.mediaProperties.shareTrack\n );\n }\n\n if (tracks.microphone) {\n this.setLocalAudioTrack(tracks.microphone);\n this.mediaProperties.mediaDirection.sendAudio = true;\n\n // audio mute state could be undefined if you have not sent audio before\n this.audio = this.audio || createMuteState(AUDIO, this, this.mediaProperties.mediaDirection);\n\n await this.mediaProperties.webrtcMediaConnection.publishTrack(\n this.mediaProperties.audioTrack\n );\n }\n\n if (tracks.camera) {\n this.setLocalVideoTrack(tracks.camera);\n this.mediaProperties.mediaDirection.sendVideo = true;\n\n // video state could be undefined if you have not sent video before\n this.video = this.video || createMuteState(VIDEO, this, this.mediaProperties.mediaDirection);\n\n await this.mediaProperties.webrtcMediaConnection.publishTrack(\n this.mediaProperties.videoTrack\n );\n }\n }\n\n /**\n * Un-publishes specified local tracks in the meeting\n *\n * @param {Array<MediaStreamTrack>} tracks\n * @returns {Promise}\n */\n async unpublishTracks(tracks: MediaStreamTrack[]): Promise<void> {\n this.checkMediaConnection();\n\n const unpublishPromises = [];\n\n for (const track of tracks) {\n // @ts-ignore originalTrack is private - this will be fixed in SPARK-399694\n if (track === this.mediaProperties.shareTrack?.originalTrack) {\n const localTrackToUnpublish = this.mediaProperties.shareTrack;\n\n this.setLocalShareTrack(null);\n\n this.releaseScreenShareFloor(); // we ignore the returned promise here on purpose\n this.mediaProperties.mediaDirection.sendShare = false;\n\n unpublishPromises.push(\n this.mediaProperties.webrtcMediaConnection.unpublishTrack(localTrackToUnpublish)\n );\n }\n\n // @ts-ignore originalTrack is private - this will be fixed in SPARK-399694\n if (track === this.mediaProperties.audioTrack?.originalTrack) {\n const localTrackToUnpublish = this.mediaProperties.audioTrack;\n\n this.setLocalAudioTrack(null);\n this.mediaProperties.mediaDirection.sendAudio = false;\n\n unpublishPromises.push(\n this.mediaProperties.webrtcMediaConnection.unpublishTrack(localTrackToUnpublish)\n );\n }\n\n // @ts-ignore originalTrack is private - this will be fixed in SPARK-399694\n if (track === this.mediaProperties.videoTrack?.originalTrack) {\n const localTrackToUnpublish = this.mediaProperties.videoTrack;\n\n this.setLocalVideoTrack(null);\n this.mediaProperties.mediaDirection.sendVideo = false;\n\n unpublishPromises.push(\n this.mediaProperties.webrtcMediaConnection.unpublishTrack(localTrackToUnpublish)\n );\n }\n }\n\n await Promise.all(unpublishPromises);\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAGA;AACA;AAaA;AAMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAmCA;AACA;AACA;AACA;AAKA;AACA;AACA;AACA;AAWA;AAEA;AACA;AACA;AACA;AACA;AAA0D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAE1D,wBAAoB,IAAAA,yBAAgB,GAAE;EAA/BC,SAAS,qBAATA,SAAS;AAEhB,IAAMC,UAAU,GAAG,SAAbA,UAAU,CAAIC,OAAY,QAAqB;EAAA,wBAAlBC,OAAO;IAAPA,OAAO,6BAAG,EAAE;EAC7CC,oBAAW,CAACC,MAAM,CAACC,IAAI,WAAIH,OAAO,wBAAqB;EAEvD,OAAOD,OAAO,CACXK,IAAI,CAAC,UAACC,GAAG,EAAK;IACbJ,oBAAW,CAACC,MAAM,CAACC,IAAI,WAAIH,OAAO,mCAAgC;IAElE,OAAOK,GAAG;EACZ,CAAC,CAAC,CACDC,KAAK,CAAC,UAACC,KAAK,EAAK;IAChBN,oBAAW,CAACC,MAAM,CAACK,KAAK,WAAIP,OAAO,sBAAmBO,KAAK,CAAC;IAC5D,MAAMA,KAAK;EACb,CAAC,CAAC;AACN,CAAC;AAEM,IAAMC,iBAAiB,GAAG;EAC/BC,GAAG,EAAE,KAAK;EACVC,KAAK,EAAE,OAAO;EACdC,KAAK,EAAE,OAAO;EACdC,KAAK,EAAE,OAAO;EACdC,MAAM,EAAE;AACV,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AAJA;AAAA,IAKqBC,OAAO;EAAA;EAAA;EA+F1B;AACF;AACA;AACA;AACA;AACA;EACE,iBAAYC,KAAU,EAAEC,QAAe,EAAE;IAAA;IAAA;IAAA;IACvC,0BAAM,CAAC,CAAC,EAAEA,QAAO;IACjB;AACJ;AACA;AACA;AACA;AACA;A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AAE;MAACrB,MAAM,EAAE,MAAKrE;IAAK,CAAC,CAAC;IAC9C;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;IACI,MAAK7F,gBAAgB,GAAG,KAAK;IAC7B;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;IACI,MAAKmB,mBAAmB,GAAG,IAAIqK,4BAAmB,6CAAM;IACxD;AACJ;AACA;AACA;AACA;AACA;AACA;IACI,MAAK9C,KAAK,GAAG,IAAI;IACjB;AACJ;AACA;AACA;AACA;AACA;AACA;IACI,MAAKrM,KAAK,GAAG,IAAI;IACjB;AACJ;AACA;AACA;AACA;AACA;AACA;IACI,MAAKoP,yBAAyB,GAAGC,cAAmB,CAACC,MAAM,6CAAM;IACjE;AACJ;AACA;AACA;AACA;AACA;AACA;IACI,MAAKC,eAAe,GAAG,IAAI;IAC3B;AACJ;AACA;AACA;AACA;AACA;AACA;IACI,MAAKhO,QAAQ,GAAI7D,KAAK,CAACsR,KAAK,IAAItR,KAAK,CAACsR,KAAK,CAACC,GAAG,IAAK,IAAI;IACxD;AACJ;AACA;AACA;AACA;AACA;AACA;IACI,MAAKO,MAAM,GAAG,IAAI;IAClB;AACJ;AACA;AACA;AACA;AACA;AACA;IACI,MAAKC,WAAW,GAAG/R,KAAK,CAAC+R,WAAW;IACpC;AACJ;AACA;AACA;AACA;AACA;AACA;IACI,MAAKC,eAAe,GAAGhS,KAAK,CAACgS,eAAe;IAC5C;AACJ;AACA;AACA;AACA;AACA;AACA;IACI,MAAKC,OAAO,GAAG,IAAI;IACnB;AACJ;AACA;AACA;AACA;AACA;AACA;IACI,MAAK7N,IAAI,GAAG,IAAI;IAChB;AACJ;AACA;AACA;AACA;AACA;AACA;IACI,MAAK8N,KAAK,GAAG,IAAI;IACjB;AACJ;AACA;AACA;AACA;AACA;AACA;IACI,MAAKC,MAAM,GAAG,IAAI;IAClB;AACJ;AACA;AACA;AACA;AACA;AACA;IACI,MAAKC,MAAM,GAAG,IAAI;IAClB;AACJ;AACA;AACA;AACA;AACA;IACI,MAAK9C,cAAc,GAAG,IAAI+C,gBAAc,CAAC,CAAC,C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"}
|