@webex/plugin-meetings 3.0.0-beta.156 → 3.0.0-beta.158

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.
@@ -205,7 +205,7 @@ var Breakout = _webexCore.WebexPlugin.extend({
205
205
  sessionId: this.sessionId
206
206
  });
207
207
  },
208
- version: "3.0.0-beta.156"
208
+ version: "3.0.0-beta.158"
209
209
  });
210
210
  var _default = Breakout;
211
211
  exports.default = _default;
@@ -1039,7 +1039,7 @@ var Breakouts = _webexCore.WebexPlugin.extend({
1039
1039
  this.trigger(_constants.BREAKOUTS.EVENTS.ASK_RETURN_TO_MAIN);
1040
1040
  }
1041
1041
  },
1042
- version: "3.0.0-beta.156"
1042
+ version: "3.0.0-beta.158"
1043
1043
  });
1044
1044
  var _default = Breakouts;
1045
1045
  exports.default = _default;
@@ -1331,7 +1331,7 @@ var LocusInfo = /*#__PURE__*/function (_EventsScope) {
1331
1331
  }, {
1332
1332
  key: "getTheLocusToUpdate",
1333
1333
  value: function getTheLocusToUpdate(newLocus) {
1334
- var switchStatus = _controlsUtils.default.getSessionSwitchStatus(this.controls, newLocus.controls);
1334
+ var switchStatus = _controlsUtils.default.getSessionSwitchStatus(this.controls, newLocus === null || newLocus === void 0 ? void 0 : newLocus.controls);
1335
1335
  if (switchStatus.isReturnToMain && this.mainSessionLocusCache) {
1336
1336
  return (0, _cloneDeep2.default)(this.mainSessionLocusCache);
1337
1337
  }
@@ -1 +1 @@
1
- {"version":3,"names":["LocusInfo","updateMeeting","webex","meetingId","parsedLocus","states","emitChange","compareAndUpdateFlags","locusParser","LocusDeltaParser","action","locus","meeting","loci","DESYNC","USE_CURRENT","USE_INCOMING","locusInfo","onDeltaLocus","locusDesync","needToGetFullLocus","meetingRequest","getFullLocus","desync","locusUrl","url","then","res","onFullLocus","body","resume","LoggerProxy","logger","info","onDeltaAction","parsedLoci","applyLocusDeltaData","onDeltaEvent","created","scheduledMeeting","participantsUrl","replaces","aclUrl","baseSequence","sequence","membership","identities","participants","deltaParticipants","updateLocusCache","updateParticipants","updateConversationUrl","conversationUrl","updateControls","controls","self","updateLocusUrl","updateFullState","fullState","updateMeetingInfo","updateEmbeddedApps","embeddedApps","updateSelf","updateHostInfo","host","updateMediaShares","mediaShares","updateServices","links","services","data","eventType","getTheLocusToUpdate","LOCUSEVENT","PARTICIPANT_JOIN","PARTICIPANT_LEFT","CONTROLS_UPDATED","PARTICIPANT_AUDIO_MUTED","PARTICIPANT_AUDIO_UNMUTED","PARTICIPANT_VIDEO_MUTED","PARTICIPANT_VIDEO_UNMUTED","SELF_CHANGED","PARTICIPANT_UPDATED","PARTICIPANT_CONTROLS_UPDATED","PARTICIPANT_ROLES_UPDATED","PARTICIPANT_DECLINED","FLOOR_GRANTED","FLOOR_RELEASED","DIFFERENCE","handleLocusDelta","scope","eventName","args","emit","error","updateParticipantDeltas","isReplaceMembers","ControlsUtils","isNeedReplaceMembers","updateLocusInfo","isMeetingActive","handleOneOnOneEvent","workingCopy","type","_CALL_","_SIP_BRIDGE_","emitScoped","file","function","EVENTS","REMOTE_RESPONSE","remoteDeclined","remoteAnswered","reason","state","updateCreated","updateParticipantsUrl","updateReplace","replace","updateAclUrl","updateBasequence","updateSequence","updateMemberShip","updateIdentifiers","compareAndUpdate","length","find","participant","identity","_USER_","removed","partner","getLocusPartner","LOCUS","STATE","INACTIVE","warn","Metrics","postEvent","event","REMOTE_ENDED","DESTROY_MEETING","CALL_REMOVED_REASON","CALL_INACTIVE","shouldLeave","MEETING_STATE","STATES","LEFT","DECLINED","NOTIFIED","JOINED","PARTNER_LEFT","joinedWith","_LEFT_","IDLE","SELF_LEFT","_MEETING_","TERMINATING","MEETING_REMOVED_REASON","MEETING_INACTIVE_TERMINATING","FULLSTATE_REMOVED","SELF_REMOVED","compareSelfAndHost","compareHostAndSelf","selfIdentity","hostId","moderator","LOCUS_INFO_CAN_ASSIGN_HOST","canAssignHost","findParticipant","collection","item","person","id","generateDelta","prevState","newState","deltas","audioStatus","videoSlidesStatus","videoStatus","forEach","key","reduce","existingParticipant","delta","status","changed","push","isReplace","LOCUS_INFO_UPDATE_PARTICIPANTS","recordingId","record","modifiedBy","selfId","parse","getControls","updates","hasRecordingChanged","hasRecordingPausedChanged","hasMeetingContainerChanged","hasTranscribeChanged","hasEntryExitToneChanged","hasBreakoutChanged","hasVideoEnabledChanged","hasMuteOnEntryChanged","hasShareControlChanged","hasDisallowUnmuteChanged","hasReactionsChanged","hasReactionDisplayNamesChanged","hasViewTheParticipantListChanged","hasRaiseHandChanged","hasVideoChanged","current","LOCUSINFO","CONTROLS_MUTE_ON_ENTRY_CHANGED","muteOnEntry","CONTROLS_SHARE_CONTROL_CHANGED","shareControl","CONTROLS_DISALLOW_UNMUTE_CHANGED","disallowUnmute","CONTROLS_REACTIONS_CHANGED","reactions","CONTROLS_VIEW_THE_PARTICIPANTS_LIST_CHANGED","viewTheParticipantList","CONTROLS_RAISE_HAND_CHANGED","raiseHand","CONTROLS_VIDEO_CHANGED","video","paused","RECORDING_STATE","PAUSED","recording","RESUMED","RECORDING","CONTROLS_RECORDING_UPDATED","lastModified","meetingContainerUrl","meetingContainer","CONTROLS_MEETING_CONTAINER_UPDATED","transcribe","transcribing","caption","CONTROLS_MEETING_TRANSCRIBE_UPDATED","breakout","breakoutMoveId","SelfUtils","getReplacedBreakoutMoveId","internal","device","CONTROLS_MEETING_BREAKOUT_UPDATED","entryExitTone","CONTROLS_ENTRY_EXIT_TONE_UPDATED","videoEnabled","unmuteVideoAllowed","SELF_REMOTE_VIDEO_MUTE_STATUS_UPDATED","unmuteAllowed","LINKS_SERVICES","result","FullState","getFullState","meetingStateChangedTo","FULL_STATE_MEETING_STATE_CHANGE","previousState","previous","meetingState","currentState","meetingTypeChangedTo","FULL_STATE_TYPE_UPDATE","parsedHosts","HostUtils","getHosts","isNewHost","LOCUS_INFO_UPDATE_HOST","newHost","oldHost","roles","getRoles","isJoined","parsedInfo","InfoUtils","getInfos","MEETING_INFO_UPDATED","isLocked","MEETING_LOCKED","isUnlocked","MEETING_UNLOCKED","EmbeddedAppsUtils","areSimilar","parsedEmbeddedApps","EMBEDDED_APPS_UPDATED","parsedMediaShares","MediaSharesUtils","getMediaShares","LOCUS_INFO_UPDATE_MEDIA_SHARES","parsedSelves","getSelves","element","getSipUrl","sipUri","moderatorChanged","layoutChanged","CONTROLS_MEETING_LAYOUT_UPDATED","layout","breakoutsChanged","SELF_MEETING_BREAKOUTS_CHANGED","breakoutSessions","isMediaInactiveOrReleased","DISCONNECT_DUE_TO_INACTIVITY","SELF_MODERATOR_CHANGED","isRolesChanged","SELF_ROLES_CHANGED","oldRoles","newRoles","isVideoMutedByOthersChanged","muted","remoteVideoMuted","localAudioUnmuteRequiredByServer","LOCAL_UNMUTE_REQUIRED","remoteMuted","isMutedByOthersChanged","SELF_REMOTE_MUTE_STATUS_UPDATED","localAudioUnmuteRequestedByServer","LOCAL_UNMUTE_REQUESTED","isUserUnadmitted","SELF_UNADMITTED_GUEST","isUserAdmitted","SELF_ADMITTED_GUEST","isMediaInactive","MEDIA_INACTIVITY","getMediaStatus","mediaSessions","audioStateChange","videoStateChange","shareStateChange","MEDIA_STATUS_CHANGE","currentMediaStatus","audio","shareStatus","share","isUserObserving","SELF_OBSERVING","canNotViewTheParticipantListChanged","SELF_CANNOT_VIEW_PARTICIPANT_LIST_CHANGE","canNotViewTheParticipantList","isSharingBlockedChanged","SELF_IS_SHARING_BLOCKED_CHANGE","isSharingBlocked","LOCUS_INFO_UPDATE_SELF","oldSelf","newSelf","LOCUS_INFO_UPDATE_URL","isMainSessionDTO","updateMainSessionLocusCache","newLocus","switchStatus","getSessionSwitchStatus","isReturnToMain","mainSessionLocusCache","isJoinToBreakout","CONTROLS_JOIN_BREAKOUT_FROM_MAIN","mainLocusUrl","sourceParticipants","existIndex","findIndex","p","splice","mainLocus","locusClone","objValue","srcValue","mergeParticipants","EventsScope"],"sources":["index.ts"],"sourcesContent":["import {isEqual, assignWith, cloneDeep} from 'lodash';\n\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport EventsScope from '../common/events/events-scope';\nimport {\n EVENTS,\n LOCUSEVENT,\n _USER_,\n _CALL_,\n _SIP_BRIDGE_,\n MEETING_STATE,\n _MEETING_,\n LOCUSINFO,\n LOCUS,\n _LEFT_,\n MEETING_REMOVED_REASON,\n CALL_REMOVED_REASON,\n RECORDING_STATE,\n} from '../constants';\nimport Metrics from '../metrics';\nimport {eventType} from '../metrics/config';\nimport InfoUtils from './infoUtils';\nimport FullState from './fullState';\nimport SelfUtils from './selfUtils';\nimport HostUtils from './hostUtils';\nimport ControlsUtils from './controlsUtils';\nimport EmbeddedAppsUtils from './embeddedAppsUtils';\nimport MediaSharesUtils from './mediaSharesUtils';\nimport LocusDeltaParser from './parser';\n\n/**\n * @description LocusInfo extends ChildEmitter to convert locusInfo info a private emitter to parent object\n * @export\n * @private\n * @class LocusInfo\n */\nexport default class LocusInfo extends EventsScope {\n compareAndUpdateFlags: any;\n emitChange: any;\n locusParser: any;\n meetingId: any;\n parsedLocus: any;\n updateMeeting: any;\n webex: any;\n aclUrl: any;\n baseSequence: any;\n created: any;\n deltaParticipants: any;\n identities: any;\n membership: any;\n participants: any;\n participantsUrl: any;\n replaces: any;\n scheduledMeeting: any;\n sequence: any;\n controls: any;\n conversationUrl: any;\n embeddedApps: any;\n fullState: any;\n host: any;\n info: any;\n roles: any;\n mediaShares: any;\n replace: any;\n url: any;\n services: any;\n mainSessionLocusCache: any;\n /**\n * Constructor\n * @param {boolean} updateMeeting true if the meeting should be updated\n * @param {object} webex\n * @param {string} meetingId\n * @returns {undefined}\n */\n constructor(updateMeeting, webex, meetingId) {\n super();\n this.parsedLocus = {\n states: [],\n };\n this.webex = webex;\n this.emitChange = false;\n this.compareAndUpdateFlags = {};\n this.meetingId = meetingId;\n this.updateMeeting = updateMeeting;\n this.locusParser = new LocusDeltaParser();\n }\n\n /**\n * Apply locus delta data to meeting\n * @param {string} action Locus delta action\n * @param {Locus} locus\n * @param {Meeting} meeting\n * @returns {undefined}\n */\n applyLocusDeltaData(action: string, locus: any, meeting: any) {\n const {DESYNC, USE_CURRENT, USE_INCOMING} = LocusDeltaParser.loci;\n\n switch (action) {\n case USE_INCOMING:\n meeting.locusInfo.onDeltaLocus(locus);\n break;\n case USE_CURRENT:\n meeting.locusDesync = false;\n meeting.needToGetFullLocus = false;\n break;\n case DESYNC:\n meeting.meetingRequest\n .getFullLocus({\n desync: true,\n locusUrl: locus.url ? locus.url : meeting.locusUrl,\n })\n .then((res) => {\n meeting.locusInfo.onFullLocus(res.body);\n // Notify parser to resume processing delta events\n // now that we have full locus from DESYNC.\n this.locusParser.resume();\n });\n break;\n default:\n LoggerProxy.logger.info(\n `Locus-info:index#applyLocusDeltaData --> Unknown locus delta action: ${action}`\n );\n }\n }\n\n /**\n * Adds locus delta to parser's queue\n * and registers a function handler\n * to recieve parsed actions from queue.\n * @param {Locus} locus\n * @param {Meeting} meeting\n * @returns {undefined}\n */\n handleLocusDelta(locus: any, meeting: any) {\n // register a function to process delta actions\n if (!this.locusParser.onDeltaAction) {\n // delta action, along with associated loci\n // is passed into the function.\n this.locusParser.onDeltaAction = (action, parsedLoci) => {\n this.applyLocusDeltaData(action, parsedLoci, meeting);\n };\n }\n // queue delta event with parser\n this.locusParser.onDeltaEvent(locus);\n }\n\n /**\n * @param {Locus} locus\n * @returns {undefined}\n * @memberof LocusInfo\n */\n init(locus: any = {}) {\n this.created = locus.created || null;\n this.scheduledMeeting = locus.meeting || null;\n this.participantsUrl = locus.participantsUrl || null;\n this.replaces = locus.replaces || null;\n this.aclUrl = locus.aclUrl || null;\n this.baseSequence = locus.baseSequence || null;\n this.sequence = locus.sequence || null;\n this.membership = locus.membership || null;\n this.identities = locus.identities || null;\n this.participants = locus.participants || null;\n\n /**\n * Stores the delta values for a changed participant.\n *\n * @typedef {Object} DeltaParticipant\n * @property {Record<string, boolean>} delta - Contains changed streams.\n * @property {Object} person - Contains person data.\n */\n\n /**\n * Stored participant changes between the last event and the current event.\n * All previously stored events are overwritten between events.\n *\n * @instance\n * @type {Array<DeltaParticipant>}\n * @private\n * @member LocusInfo\n */\n this.deltaParticipants = [];\n\n this.updateLocusCache(locus);\n // above section only updates the locusInfo object\n // The below section makes sure it updates the locusInfo as well as updates the meeting object\n this.updateParticipants(locus.participants);\n // For 1:1 space meeting the conversation Url does not exist in locus.conversation\n this.updateConversationUrl(locus.conversationUrl, locus.info);\n this.updateControls(locus.controls, locus.self);\n this.updateLocusUrl(locus.url);\n this.updateFullState(locus.fullState);\n this.updateMeetingInfo(locus.info);\n this.updateEmbeddedApps(locus.embeddedApps);\n // self and participants generate sipUrl for 1:1 meeting\n this.updateSelf(locus.self, locus.participants);\n this.updateHostInfo(locus.host);\n this.updateMediaShares(locus.mediaShares);\n this.updateServices(locus.links?.services);\n }\n\n /**\n * @param {Object} locus\n * @returns {undefined}\n * @memberof LocusInfo\n */\n initialSetup(locus: object) {\n this.updateLocusCache(locus);\n this.onFullLocus(locus);\n\n // Change it to true after it receives it first locus object\n this.emitChange = true;\n }\n\n /**\n * @param {Meeting} meeting\n * @param {Object} data\n * @returns {undefined}\n * @memberof LocusInfo\n */\n parse(meeting: any, data: any) {\n // eslint-disable-next-line @typescript-eslint/no-shadow\n const {eventType} = data;\n const locus = this.getTheLocusToUpdate(data.locus);\n LoggerProxy.logger.info(`Locus-info:index#parse --> received locus data: ${eventType}`);\n\n switch (eventType) {\n case LOCUSEVENT.PARTICIPANT_JOIN:\n case LOCUSEVENT.PARTICIPANT_LEFT:\n case LOCUSEVENT.CONTROLS_UPDATED:\n case LOCUSEVENT.PARTICIPANT_AUDIO_MUTED:\n case LOCUSEVENT.PARTICIPANT_AUDIO_UNMUTED:\n case LOCUSEVENT.PARTICIPANT_VIDEO_MUTED:\n case LOCUSEVENT.PARTICIPANT_VIDEO_UNMUTED:\n case LOCUSEVENT.SELF_CHANGED:\n case LOCUSEVENT.PARTICIPANT_UPDATED:\n case LOCUSEVENT.PARTICIPANT_CONTROLS_UPDATED:\n case LOCUSEVENT.PARTICIPANT_ROLES_UPDATED:\n case LOCUSEVENT.PARTICIPANT_DECLINED:\n case LOCUSEVENT.FLOOR_GRANTED:\n case LOCUSEVENT.FLOOR_RELEASED:\n this.onFullLocus(locus, eventType);\n break;\n case LOCUSEVENT.DIFFERENCE:\n this.handleLocusDelta(locus, meeting);\n break;\n\n default:\n // Why will there be a event with no eventType ????\n // we may not need this, we can get full locus\n this.handleLocusDelta(locus, meeting);\n }\n }\n\n /**\n * @param {String} scope\n * @param {String} eventName\n * @param {Array} args\n * @returns {undefined}\n * @memberof LocusInfo\n */\n emitScoped(scope?: any, eventName?: string, args?: any) {\n return this.emit(scope, eventName, args);\n }\n\n /**\n * updates the locus with full locus object\n * @param {object} locus locus object\n * @param {string} eventType particulat locus event\n * @returns {object} null\n * @memberof LocusInfo\n */\n // eslint-disable-next-line @typescript-eslint/no-shadow\n onFullLocus(locus: any, eventType?: string) {\n if (!locus) {\n LoggerProxy.logger.error(\n 'Locus-info:index#onFullLocus --> object passed as argument was invalid, continuing.'\n );\n }\n this.updateParticipantDeltas(locus.participants);\n this.scheduledMeeting = locus.meeting || null;\n this.participants = locus.participants;\n const isReplaceMembers = ControlsUtils.isNeedReplaceMembers(this.controls, locus.controls);\n this.updateLocusInfo(locus);\n this.updateParticipants(locus.participants, isReplaceMembers);\n this.isMeetingActive();\n this.handleOneOnOneEvent(eventType);\n this.updateEmbeddedApps(locus.embeddedApps);\n // set current (working copy) for parser\n this.locusParser.workingCopy = locus;\n }\n\n // used for ringing stops on one on one\n /**\n * @param {String} eventType\n * @returns {undefined}\n * @memberof LocusInfo\n */\n // eslint-disable-next-line @typescript-eslint/no-shadow\n handleOneOnOneEvent(eventType: string) {\n if (\n this.parsedLocus.fullState.type === _CALL_ ||\n this.parsedLocus.fullState.type === _SIP_BRIDGE_\n ) {\n // for 1:1 bob calls alice and alice declines, notify the meeting state\n if (eventType === LOCUSEVENT.PARTICIPANT_DECLINED) {\n // trigger the event for stop ringing\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'handleOneonOneEvent',\n },\n EVENTS.REMOTE_RESPONSE,\n {\n remoteDeclined: true,\n remoteAnswered: false,\n }\n );\n }\n // for 1:1 bob calls alice and alice answers, notify the meeting state\n if (eventType === LOCUSEVENT.PARTICIPANT_JOIN) {\n // trigger the event for stop ringing\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'handleOneonOneEvent',\n },\n EVENTS.REMOTE_RESPONSE,\n {\n remoteDeclined: false,\n remoteAnswered: true,\n }\n );\n }\n }\n }\n\n /**\n * @param {Object} locus\n * @returns {undefined}\n * @memberof LocusInfo\n */\n onDeltaLocus(locus: any) {\n const isReplaceMembers = ControlsUtils.isNeedReplaceMembers(this.controls, locus.controls);\n this.updateLocusInfo(locus);\n this.updateParticipants(locus.participants, isReplaceMembers);\n this.isMeetingActive();\n }\n\n /**\n * @param {Object} locus\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateLocusInfo(locus) {\n if (locus.self?.reason === 'MOVED' && locus.self?.state === 'LEFT') {\n // When moved to a breakout session locus sends a message for the previous locus\n // indicating that we have been moved. It isn't helpful to continue parsing this\n // as it gets interpreted as if we have left the call\n return;\n }\n\n this.updateControls(locus.controls, locus.self);\n this.updateConversationUrl(locus.conversationUrl, locus.info);\n this.updateCreated(locus.created);\n this.updateFullState(locus.fullState);\n this.updateHostInfo(locus.host);\n this.updateMeetingInfo(locus.info, locus.self);\n this.updateMediaShares(locus.mediaShares);\n this.updateParticipantsUrl(locus.participantsUrl);\n this.updateReplace(locus.replace);\n this.updateSelf(locus.self, locus.participants);\n this.updateLocusUrl(locus.url);\n this.updateAclUrl(locus.aclUrl);\n this.updateBasequence(locus.baseSequence);\n this.updateSequence(locus.sequence);\n this.updateMemberShip(locus.membership);\n this.updateIdentifiers(locus.identities);\n this.updateEmbeddedApps(locus.embeddedApps);\n this.updateServices(locus.links?.services);\n this.compareAndUpdate();\n // update which required to compare different objects from locus\n }\n\n /**\n * @param {Array} participants\n * @param {Object} self\n * @returns {Array}\n * @memberof LocusInfo\n */\n getLocusPartner(participants: Array<any>, self: any) {\n if (!participants || participants.length === 0) {\n return null;\n }\n\n return (\n participants.find(\n (participant) =>\n self &&\n participant.identity !== self.identity &&\n (participants.length <= 2 || (participant.type === _USER_ && !participant.removed))\n // @ts-ignore\n ) || this.partner\n );\n }\n\n // TODO: all the leave states need to be checked\n /**\n * @returns {undefined}\n * @memberof LocusInfo\n */\n isMeetingActive() {\n if (\n this.parsedLocus.fullState.type === _CALL_ ||\n this.parsedLocus.fullState.type === _SIP_BRIDGE_\n ) {\n // @ts-ignore\n const partner = this.getLocusPartner(this.participants, this.self);\n\n this.updateMeeting({partner});\n\n // Check if guest user needs to be checked here\n\n // 1) when bob declines call from bob, (bob='DECLINED')\n // 2) When alice rejects call to bob , (bob='NOTIFIED')\n\n // When we dont add MEDIA for condition 2. The state of bob='IDLE'\n\n if (this.fullState && this.fullState.state === LOCUS.STATE.INACTIVE) {\n // TODO: update the meeting state\n LoggerProxy.logger.warn(\n 'Locus-info:index#isMeetingActive --> Call Ended, locus state is inactive.'\n );\n Metrics.postEvent({\n event: eventType.REMOTE_ENDED,\n meetingId: this.meetingId,\n });\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'isMeetingActive',\n },\n EVENTS.DESTROY_MEETING,\n {\n reason: CALL_REMOVED_REASON.CALL_INACTIVE,\n shouldLeave: false,\n }\n );\n } else if (\n partner.state === MEETING_STATE.STATES.LEFT &&\n this.parsedLocus.self &&\n (this.parsedLocus.self.state === MEETING_STATE.STATES.DECLINED ||\n this.parsedLocus.self.state === MEETING_STATE.STATES.NOTIFIED ||\n this.parsedLocus.self.state === MEETING_STATE.STATES.JOINED)\n ) {\n Metrics.postEvent({\n event: eventType.REMOTE_ENDED,\n meetingId: this.meetingId,\n });\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'isMeetingActive',\n },\n EVENTS.DESTROY_MEETING,\n {\n reason: CALL_REMOVED_REASON.PARTNER_LEFT,\n shouldLeave:\n this.parsedLocus.self.joinedWith && this.parsedLocus.self.joinedWith.state !== _LEFT_,\n }\n );\n } else if (\n this.parsedLocus.self &&\n this.parsedLocus.self.state === MEETING_STATE.STATES.LEFT &&\n (partner.state === MEETING_STATE.STATES.LEFT ||\n partner.state === MEETING_STATE.STATES.DECLINED ||\n partner.state === MEETING_STATE.STATES.NOTIFIED ||\n partner.state === MEETING_STATE.STATES.IDLE) // Happens when user just joins and adds no Media\n ) {\n Metrics.postEvent({\n event: eventType.REMOTE_ENDED,\n meetingId: this.meetingId,\n });\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'isMeetingActive',\n },\n EVENTS.DESTROY_MEETING,\n {\n reason: CALL_REMOVED_REASON.SELF_LEFT,\n shouldLeave: false,\n }\n );\n }\n } else if (this.parsedLocus.fullState.type === _MEETING_) {\n if (\n this.fullState &&\n (this.fullState.state === LOCUS.STATE.INACTIVE ||\n // @ts-ignore\n this.fullState.state === LOCUS.STATE.TERMINATING)\n ) {\n LoggerProxy.logger.warn(\n 'Locus-info:index#isMeetingActive --> Meeting is ending due to inactive or terminating'\n );\n Metrics.postEvent({\n event: eventType.REMOTE_ENDED,\n meetingId: this.meetingId,\n });\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'isMeetingActive',\n },\n EVENTS.DESTROY_MEETING,\n {\n reason: MEETING_REMOVED_REASON.MEETING_INACTIVE_TERMINATING,\n shouldLeave: false,\n }\n );\n } else if (this.fullState && this.fullState.removed) {\n // user has been dropped from a meeting\n Metrics.postEvent({\n event: eventType.REMOTE_ENDED,\n meetingId: this.meetingId,\n });\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'isMeetingActive',\n },\n EVENTS.DESTROY_MEETING,\n {\n reason: MEETING_REMOVED_REASON.FULLSTATE_REMOVED,\n shouldLeave: false,\n }\n );\n }\n // If you are guest and you are removed from the meeting\n // You wont get any further events\n else if (this.parsedLocus.self && this.parsedLocus.self.removed) {\n // Check if we need to send an event\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'isMeetingActive',\n },\n EVENTS.DESTROY_MEETING,\n {\n reason: MEETING_REMOVED_REASON.SELF_REMOVED,\n shouldLeave: false,\n }\n );\n }\n } else {\n LoggerProxy.logger.warn('Locus-info:index#isMeetingActive --> Meeting Type is unknown.');\n }\n }\n\n /**\n * checks if the host permissions have changed while in the meeting\n * This would be the case if your role as host or moderator has been updated\n * @returns {undefined}\n * @memberof LocusInfo\n */\n compareAndUpdate() {\n // TODO: check with locus team on host and moderator doc\n // use host as a validator if needed\n if (\n this.compareAndUpdateFlags.compareSelfAndHost ||\n this.compareAndUpdateFlags.compareHostAndSelf\n ) {\n this.compareSelfAndHost();\n }\n }\n\n /**\n * compared the self object to check if the user has host permissions\n * @returns {undefined}\n * @memberof LocusInfo\n */\n compareSelfAndHost() {\n // In some cases the host info is not present but the moderator values changes from null to false so it triggers an update\n if (\n this.parsedLocus.self.selfIdentity === this.parsedLocus.host?.hostId &&\n this.parsedLocus.self.moderator\n ) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'compareSelfAndHost',\n },\n EVENTS.LOCUS_INFO_CAN_ASSIGN_HOST,\n {\n canAssignHost: true,\n }\n );\n } else {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'compareSelfAndHost',\n },\n EVENTS.LOCUS_INFO_CAN_ASSIGN_HOST,\n {\n canAssignHost: false,\n }\n );\n }\n }\n\n /**\n * Update the deltaParticipants property of this object based on a list of\n * provided participants.\n *\n * @param {Array} [participants] - The participants to update against.\n * @returns {void}\n */\n updateParticipantDeltas(participants: Array<any> = []) {\n // Used to find a participant within a participants collection.\n const findParticipant = (participant, collection) =>\n collection.find((item) => item.person.id === participant.person.id);\n\n // Generates an object that indicates which state properties have changed.\n const generateDelta = (prevState: any = {}, newState: any = {}) => {\n // Setup deltas.\n const deltas = {\n audioStatus: prevState.audioStatus !== newState.audioStatus,\n videoSlidesStatus: prevState.videoSlidesStatus !== newState.videoSlidesStatus,\n videoStatus: prevState.videoStatus !== newState.videoStatus,\n };\n\n // Clean the object\n Object.keys(deltas).forEach((key) => {\n if (deltas[key] !== true) {\n delete deltas[key];\n }\n });\n\n return deltas;\n };\n\n this.deltaParticipants = participants.reduce((collection, participant) => {\n const existingParticipant = findParticipant(participant, this.participants || []) || {};\n\n const delta = generateDelta(existingParticipant.status, participant.status);\n\n const changed = Object.keys(delta).length > 0;\n\n if (changed) {\n collection.push({\n person: participant.person,\n delta,\n });\n }\n\n return collection;\n }, []);\n }\n\n /**\n * update meeting's members\n * @param {Object} participants new participants object\n * @param {Boolean} isReplace is replace the whole members\n * @returns {Array} updatedParticipants\n * @memberof LocusInfo\n */\n updateParticipants(participants: object, isReplace?: boolean) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateParticipants',\n },\n EVENTS.LOCUS_INFO_UPDATE_PARTICIPANTS,\n {\n participants,\n recordingId: this.parsedLocus.controls && this.parsedLocus.controls.record?.modifiedBy,\n selfIdentity: this.parsedLocus.self && this.parsedLocus.self.selfIdentity,\n selfId: this.parsedLocus.self && this.parsedLocus.self.selfId,\n hostId: this.parsedLocus.host && this.parsedLocus.host.hostId,\n isReplace,\n }\n );\n }\n\n /**\n * @param {Object} controls\n * @param {Object} self\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateControls(controls: object, self: object) {\n if (controls && !isEqual(this.controls, controls)) {\n this.parsedLocus.controls = ControlsUtils.parse(controls);\n const {\n updates: {\n hasRecordingChanged,\n hasRecordingPausedChanged,\n hasMeetingContainerChanged,\n hasTranscribeChanged,\n hasEntryExitToneChanged,\n hasBreakoutChanged,\n hasVideoEnabledChanged,\n hasMuteOnEntryChanged,\n hasShareControlChanged,\n hasDisallowUnmuteChanged,\n hasReactionsChanged,\n hasReactionDisplayNamesChanged,\n hasViewTheParticipantListChanged,\n hasRaiseHandChanged,\n hasVideoChanged,\n },\n current,\n } = ControlsUtils.getControls(this.controls, controls);\n\n if (hasMuteOnEntryChanged) {\n this.emitScoped(\n {file: 'locus-info', function: 'updateControls'},\n LOCUSINFO.EVENTS.CONTROLS_MUTE_ON_ENTRY_CHANGED,\n {state: current.muteOnEntry}\n );\n }\n\n if (hasShareControlChanged) {\n this.emitScoped(\n {file: 'locus-info', function: 'updateControls'},\n LOCUSINFO.EVENTS.CONTROLS_SHARE_CONTROL_CHANGED,\n {state: current.shareControl}\n );\n }\n\n if (hasDisallowUnmuteChanged) {\n this.emitScoped(\n {file: 'locus-info', function: 'updateControls'},\n LOCUSINFO.EVENTS.CONTROLS_DISALLOW_UNMUTE_CHANGED,\n {state: current.disallowUnmute}\n );\n }\n\n if (hasReactionsChanged || hasReactionDisplayNamesChanged) {\n this.emitScoped(\n {file: 'locus-info', function: 'updateControls'},\n LOCUSINFO.EVENTS.CONTROLS_REACTIONS_CHANGED,\n {state: current.reactions}\n );\n }\n\n if (hasViewTheParticipantListChanged) {\n this.emitScoped(\n {file: 'locus-info', function: 'updateControls'},\n LOCUSINFO.EVENTS.CONTROLS_VIEW_THE_PARTICIPANTS_LIST_CHANGED,\n {state: current.viewTheParticipantList}\n );\n }\n\n if (hasRaiseHandChanged) {\n this.emitScoped(\n {file: 'locus-info', function: 'updateControls'},\n LOCUSINFO.EVENTS.CONTROLS_RAISE_HAND_CHANGED,\n {state: current.raiseHand}\n );\n }\n\n if (hasVideoChanged) {\n this.emitScoped(\n {file: 'locus-info', function: 'updateControls'},\n LOCUSINFO.EVENTS.CONTROLS_VIDEO_CHANGED,\n {state: current.video}\n );\n }\n\n if (hasRecordingChanged || hasRecordingPausedChanged) {\n let state = null;\n\n if (hasRecordingPausedChanged) {\n if (current.record.paused) {\n state = RECORDING_STATE.PAUSED;\n } else {\n // state will be `IDLE` if the recording is not active, even when there is a `pause` status change.\n state = current.record.recording ? RECORDING_STATE.RESUMED : RECORDING_STATE.IDLE;\n }\n } else if (hasRecordingChanged) {\n state = current.record.recording ? RECORDING_STATE.RECORDING : RECORDING_STATE.IDLE;\n }\n\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateControls',\n },\n LOCUSINFO.EVENTS.CONTROLS_RECORDING_UPDATED,\n {\n state,\n modifiedBy: current.record.modifiedBy,\n lastModified: current.record.lastModified,\n }\n );\n }\n\n if (hasMeetingContainerChanged) {\n const {meetingContainerUrl} = current.meetingContainer;\n\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateControls',\n },\n LOCUSINFO.EVENTS.CONTROLS_MEETING_CONTAINER_UPDATED,\n {\n meetingContainerUrl,\n }\n );\n }\n\n if (hasTranscribeChanged) {\n const {transcribing, caption} = current.transcribe;\n\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateControls',\n },\n LOCUSINFO.EVENTS.CONTROLS_MEETING_TRANSCRIBE_UPDATED,\n {\n transcribing,\n caption,\n }\n );\n }\n\n if (hasBreakoutChanged) {\n const {breakout} = current;\n breakout.breakoutMoveId = SelfUtils.getReplacedBreakoutMoveId(\n self,\n this.webex.internal.device.url\n );\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateControls',\n },\n LOCUSINFO.EVENTS.CONTROLS_MEETING_BREAKOUT_UPDATED,\n {\n breakout,\n }\n );\n }\n\n if (hasEntryExitToneChanged) {\n const {entryExitTone} = current;\n\n this.updateMeeting({entryExitTone});\n\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateControls',\n },\n LOCUSINFO.EVENTS.CONTROLS_ENTRY_EXIT_TONE_UPDATED,\n {\n entryExitTone,\n }\n );\n }\n\n // videoEnabled is handled differently than other controls,\n // to fit with audio mute status logic\n if (hasVideoEnabledChanged) {\n const {videoEnabled} = current;\n\n this.updateMeeting({unmuteVideoAllowed: videoEnabled});\n\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateControls',\n },\n LOCUSINFO.EVENTS.SELF_REMOTE_VIDEO_MUTE_STATUS_UPDATED,\n {\n // muted: not part of locus.controls\n unmuteAllowed: videoEnabled,\n }\n );\n }\n\n this.controls = controls;\n }\n }\n\n /**\n * @param {String} conversationUrl\n * @param {Object} info\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateConversationUrl(conversationUrl: string, info: any) {\n if (conversationUrl && !isEqual(this.conversationUrl, conversationUrl)) {\n this.conversationUrl = conversationUrl;\n this.updateMeeting({conversationUrl});\n } else if (\n info &&\n info.conversationUrl &&\n !isEqual(this.conversationUrl, info.conversationUrl)\n ) {\n this.conversationUrl = info.conversationUrl;\n this.updateMeeting({conversationUrl: info.conversationUrl});\n }\n }\n\n /**\n * @param {Object} created\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateCreated(created: object) {\n if (created && !isEqual(this.created, created)) {\n this.created = created;\n }\n }\n\n /**\n * @param {Object} services\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateServices(services: Record<'breakout' | 'record', {url: string}>) {\n if (services && !isEqual(this.services, services)) {\n this.services = services;\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateServices',\n },\n LOCUSINFO.EVENTS.LINKS_SERVICES,\n {\n services,\n }\n );\n }\n }\n\n /**\n * @param {Object} fullState\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateFullState(fullState: object) {\n if (fullState && !isEqual(this.fullState, fullState)) {\n const result = FullState.getFullState(this.fullState, fullState);\n\n this.updateMeeting(result.current);\n\n if (result.updates.meetingStateChangedTo) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateFullState',\n },\n LOCUSINFO.EVENTS.FULL_STATE_MEETING_STATE_CHANGE,\n {\n previousState: result.previous && result.previous.meetingState,\n currentState: result.current.meetingState,\n }\n );\n }\n\n if (result.updates.meetingTypeChangedTo) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateFullState',\n },\n LOCUSINFO.EVENTS.FULL_STATE_TYPE_UPDATE,\n {\n type: result.current.type,\n }\n );\n }\n this.parsedLocus.fullState = result.current;\n this.fullState = fullState;\n }\n }\n\n /**\n * handles when the locus.host is updated\n * @param {Object} host the locus.host property\n * @returns {undefined}\n * @memberof LocusInfo\n * emits internal event locus_info_update_host\n */\n updateHostInfo(host: object) {\n if (host && !isEqual(this.host, host)) {\n const parsedHosts = HostUtils.getHosts(this.host, host);\n\n this.updateMeeting(parsedHosts.current);\n this.parsedLocus.host = parsedHosts.current;\n if (parsedHosts.updates.isNewHost) {\n this.compareAndUpdateFlags.compareSelfAndHost = true;\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateHostInfo',\n },\n EVENTS.LOCUS_INFO_UPDATE_HOST,\n {\n newHost: parsedHosts.current,\n oldHost: parsedHosts.previous,\n }\n );\n }\n this.host = host;\n } else {\n this.compareAndUpdateFlags.compareSelfAndHost = false;\n }\n }\n\n /**\n * @param {Object} info\n * @param {Object} self\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateMeetingInfo(info: object, self?: object) {\n const roles = self ? SelfUtils.getRoles(self) : this.parsedLocus.self?.roles || [];\n if (\n (info && !isEqual(this.info, info)) ||\n (roles.length && !isEqual(this.roles, roles) && info)\n ) {\n const isJoined = SelfUtils.isJoined(self || this.parsedLocus.self);\n const parsedInfo = InfoUtils.getInfos(this.parsedLocus.info, info, roles, isJoined);\n\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateMeetingInfo',\n },\n LOCUSINFO.EVENTS.MEETING_INFO_UPDATED,\n {info: parsedInfo.current, self}\n );\n\n if (parsedInfo.updates.isLocked) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateMeetingInfo',\n },\n LOCUSINFO.EVENTS.MEETING_LOCKED,\n info\n );\n }\n if (parsedInfo.updates.isUnlocked) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateMeetingInfo',\n },\n LOCUSINFO.EVENTS.MEETING_UNLOCKED,\n info\n );\n }\n\n this.info = info;\n this.parsedLocus.info = parsedInfo.current;\n // Parses the info and adds necessary values\n this.updateMeeting(parsedInfo.current);\n }\n this.roles = roles;\n }\n\n /**\n * @param {Object} embeddedApps\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateEmbeddedApps(embeddedApps: object) {\n // don't do anything if the arrays of apps haven't changed significantly\n if (EmbeddedAppsUtils.areSimilar(this.embeddedApps, embeddedApps)) {\n return;\n }\n\n const parsedEmbeddedApps = EmbeddedAppsUtils.parse(embeddedApps);\n\n this.updateMeeting({embeddedApps: parsedEmbeddedApps});\n\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateEmbeddedApps',\n },\n LOCUSINFO.EVENTS.EMBEDDED_APPS_UPDATED,\n parsedEmbeddedApps\n );\n this.embeddedApps = embeddedApps;\n }\n\n /**\n * handles when the locus.mediaShares is updated\n * @param {Object} mediaShares the locus.mediaShares property\n * @returns {undefined}\n * @memberof LocusInfo\n * emits internal event locus_info_update_media_shares\n */\n updateMediaShares(mediaShares: object) {\n if (mediaShares && !isEqual(this.mediaShares, mediaShares)) {\n const parsedMediaShares = MediaSharesUtils.getMediaShares(this.mediaShares, mediaShares);\n\n this.updateMeeting(parsedMediaShares.current);\n this.parsedLocus.mediaShares = parsedMediaShares.current;\n this.mediaShares = mediaShares;\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateMediaShares',\n },\n EVENTS.LOCUS_INFO_UPDATE_MEDIA_SHARES,\n {\n current: parsedMediaShares.current,\n previous: parsedMediaShares.previous,\n }\n );\n }\n }\n\n /**\n * @param {String} participantsUrl\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateParticipantsUrl(participantsUrl: string) {\n if (participantsUrl && !isEqual(this.participantsUrl, participantsUrl)) {\n this.participantsUrl = participantsUrl;\n }\n }\n\n /**\n * @param {Object} replace\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateReplace(replace: object) {\n if (replace && !isEqual(this.replace, replace)) {\n this.replace = replace;\n }\n }\n\n /**\n * handles when the locus.self is updated\n * @param {Object} self the locus.mediaShares property\n * @param {Array} participants the locus.participants property\n * @returns {undefined}\n * @memberof LocusInfo\n * emits internal events self_admitted_guest, self_unadmitted_guest, locus_info_update_self\n */\n updateSelf(self: any, participants: Array<any>) {\n // @ts-ignore - check where this.self come from\n if (self && !isEqual(this.self, self)) {\n // @ts-ignore\n const parsedSelves = SelfUtils.getSelves(this.self, self, this.webex.internal.device.url);\n\n this.updateMeeting(parsedSelves.current);\n this.parsedLocus.self = parsedSelves.current;\n\n const element = this.parsedLocus.states[this.parsedLocus.states.length - 1];\n\n if (element !== parsedSelves.current.state) {\n this.parsedLocus.states.push(parsedSelves.current.state);\n }\n\n // TODO: check if we need to save the sipUri here as well\n // this.emit(LOCUSINFO.EVENTS.MEETING_UPDATE, SelfUtils.getSipUrl(this.getLocusPartner(participants, self), this.parsedLocus.fullState.type, this.parsedLocus.info.sipUri));\n const result = SelfUtils.getSipUrl(\n this.getLocusPartner(participants, self),\n this.parsedLocus.fullState.type,\n this.parsedLocus.info.sipUri\n );\n\n if (result.sipUri) {\n this.updateMeeting(result);\n }\n\n if (parsedSelves.updates.moderatorChanged) {\n this.compareAndUpdateFlags.compareHostAndSelf = true;\n } else {\n this.compareAndUpdateFlags.compareHostAndSelf = false;\n }\n\n if (parsedSelves.updates.layoutChanged) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateSelf',\n },\n LOCUSINFO.EVENTS.CONTROLS_MEETING_LAYOUT_UPDATED,\n {layout: parsedSelves.current.layout}\n );\n }\n\n if (parsedSelves.updates.breakoutsChanged) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateSelf',\n },\n LOCUSINFO.EVENTS.SELF_MEETING_BREAKOUTS_CHANGED,\n {breakoutSessions: parsedSelves.current.breakoutSessions}\n );\n }\n\n if (parsedSelves.updates.isMediaInactiveOrReleased) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateSelf',\n },\n LOCUSINFO.EVENTS.DISCONNECT_DUE_TO_INACTIVITY,\n {reason: self.reason}\n );\n }\n\n if (parsedSelves.updates.moderatorChanged) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateSelf',\n },\n LOCUSINFO.EVENTS.SELF_MODERATOR_CHANGED,\n self\n );\n }\n\n if (parsedSelves.updates.isRolesChanged) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateSelf',\n },\n LOCUSINFO.EVENTS.SELF_ROLES_CHANGED,\n {oldRoles: parsedSelves.previous?.roles, newRoles: parsedSelves.current?.roles}\n );\n }\n\n if (parsedSelves.updates.isVideoMutedByOthersChanged) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateSelf',\n },\n LOCUSINFO.EVENTS.SELF_REMOTE_VIDEO_MUTE_STATUS_UPDATED,\n {\n muted: parsedSelves.current.remoteVideoMuted,\n // unmuteAllowed: not part of .self\n }\n );\n }\n if (parsedSelves.updates.localAudioUnmuteRequiredByServer) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateSelf',\n },\n LOCUSINFO.EVENTS.LOCAL_UNMUTE_REQUIRED,\n {\n muted: parsedSelves.current.remoteMuted,\n unmuteAllowed: parsedSelves.current.unmuteAllowed,\n }\n );\n }\n if (parsedSelves.updates.isMutedByOthersChanged) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateSelf',\n },\n LOCUSINFO.EVENTS.SELF_REMOTE_MUTE_STATUS_UPDATED,\n {\n muted: parsedSelves.current.remoteMuted,\n unmuteAllowed: parsedSelves.current.unmuteAllowed,\n }\n );\n }\n if (parsedSelves.updates.localAudioUnmuteRequestedByServer) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateSelf',\n },\n LOCUSINFO.EVENTS.LOCAL_UNMUTE_REQUESTED,\n {}\n );\n }\n if (parsedSelves.updates.isUserUnadmitted) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateSelf',\n },\n LOCUSINFO.EVENTS.SELF_UNADMITTED_GUEST,\n self\n );\n }\n if (parsedSelves.updates.isUserAdmitted) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateSelf',\n },\n LOCUSINFO.EVENTS.SELF_ADMITTED_GUEST,\n self\n );\n }\n\n if (parsedSelves.updates.isMediaInactive) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateSelf',\n },\n // @ts-ignore\n LOCUSINFO.EVENTS.MEDIA_INACTIVITY,\n SelfUtils.getMediaStatus(self.mediaSessions)\n );\n }\n\n if (\n parsedSelves.updates.audioStateChange ||\n parsedSelves.updates.videoStateChange ||\n parsedSelves.updates.shareStateChange\n ) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateSelf',\n },\n LOCUSINFO.EVENTS.MEDIA_STATUS_CHANGE,\n {\n audioStatus: parsedSelves.current.currentMediaStatus?.audio,\n videoStatus: parsedSelves.current.currentMediaStatus?.video,\n shareStatus: parsedSelves.current.currentMediaStatus?.share,\n }\n );\n }\n\n if (parsedSelves.updates.isUserObserving) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateSelf',\n },\n LOCUSINFO.EVENTS.SELF_OBSERVING\n );\n }\n\n if (parsedSelves.updates.canNotViewTheParticipantListChanged) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateSelf',\n },\n LOCUSINFO.EVENTS.SELF_CANNOT_VIEW_PARTICIPANT_LIST_CHANGE,\n {canNotViewTheParticipantList: parsedSelves.current.canNotViewTheParticipantList}\n );\n }\n\n if (parsedSelves.updates.isSharingBlockedChanged) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateSelf',\n },\n LOCUSINFO.EVENTS.SELF_IS_SHARING_BLOCKED_CHANGE,\n {isSharingBlocked: parsedSelves.current.isSharingBlocked}\n );\n }\n\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateSelf',\n },\n EVENTS.LOCUS_INFO_UPDATE_SELF,\n {\n oldSelf: parsedSelves.previous,\n newSelf: parsedSelves.current,\n }\n );\n this.parsedLocus.self = parsedSelves.current;\n // @ts-ignore\n this.self = self;\n } else {\n this.compareAndUpdateFlags.compareHostAndSelf = false;\n }\n }\n\n /**\n * handles when the locus.url is updated\n * @param {String} url\n * @returns {undefined}\n * emits internal event locus_info_update_url\n */\n updateLocusUrl(url: string) {\n if (url && this.url !== url) {\n this.url = url;\n this.updateMeeting({locusUrl: url});\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateLocusUrl',\n },\n EVENTS.LOCUS_INFO_UPDATE_URL,\n url\n );\n }\n }\n\n /**\n * @param {String} aclUrl\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateAclUrl(aclUrl: string) {\n if (aclUrl && !isEqual(this.aclUrl, aclUrl)) {\n this.aclUrl = aclUrl;\n }\n }\n\n /**\n * @param {Number} baseSequence\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateBasequence(baseSequence: number) {\n if (baseSequence && !isEqual(this.baseSequence, baseSequence)) {\n this.baseSequence = baseSequence;\n }\n }\n\n /**\n * @param {Number} sequence\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateSequence(sequence: number) {\n if (sequence && !isEqual(this.sequence, sequence)) {\n this.sequence = sequence;\n }\n }\n\n /**\n * @param {Object} membership\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateMemberShip(membership: object) {\n if (membership && !isEqual(this.membership, membership)) {\n this.membership = membership;\n }\n }\n\n /**\n * @param {Array} identities\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateIdentifiers(identities: Array<any>) {\n if (identities && !isEqual(this.identities, identities)) {\n this.identities = identities;\n }\n }\n\n /**\n * check the locus is main session's one or not, if is main session's, update main session cache\n * @param {Object} locus\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateLocusCache(locus: any) {\n const isMainSessionDTO = ControlsUtils.isMainSessionDTO(locus);\n if (isMainSessionDTO) {\n this.updateMainSessionLocusCache(locus);\n }\n }\n\n /**\n * if return from breakout to main session, need to use cached main session DTO since locus won't send the full locus (participants)\n * if join breakout from main session, need to query main locus url (if response with 403 means no privilege, need to clear the cache)\n * @param {Object} newLocus\n * @returns {Object}\n * @memberof LocusInfo\n */\n getTheLocusToUpdate(newLocus: any) {\n const switchStatus = ControlsUtils.getSessionSwitchStatus(this.controls, newLocus.controls);\n if (switchStatus.isReturnToMain && this.mainSessionLocusCache) {\n return cloneDeep(this.mainSessionLocusCache);\n }\n if (switchStatus.isJoinToBreakout) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateControls',\n },\n LOCUSINFO.EVENTS.CONTROLS_JOIN_BREAKOUT_FROM_MAIN,\n {\n mainLocusUrl: this.url,\n }\n );\n }\n\n return newLocus;\n }\n\n /**\n * merge participants by participant id\n * @param {Array} participants\n * @param {Array} sourceParticipants\n * @returns {Array} merged participants\n * @memberof LocusInfo\n */\n // eslint-disable-next-line class-methods-use-this\n mergeParticipants(participants, sourceParticipants) {\n if (!sourceParticipants || !sourceParticipants.length) return participants;\n if (!participants || !participants.length) {\n return sourceParticipants;\n }\n sourceParticipants.forEach((participant) => {\n const existIndex = participants.findIndex((p) => p.id === participant.id);\n if (existIndex > -1) {\n participants.splice(existIndex, 1, participant);\n } else {\n participants.push(participant);\n }\n });\n\n return participants;\n }\n\n /**\n * need cache main sessions' participants since locus will not send the full list when cohost/host leave breakout\n * @param {Object} mainLocus\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateMainSessionLocusCache(mainLocus: any) {\n if (!mainLocus) {\n return;\n }\n const locusClone = cloneDeep(mainLocus);\n if (this.mainSessionLocusCache) {\n // shallow merge and do special merge for participants\n assignWith(this.mainSessionLocusCache, locusClone, (objValue, srcValue, key) => {\n if (key === 'participants') {\n return this.mergeParticipants(objValue, srcValue);\n }\n\n return srcValue || objValue;\n });\n } else {\n this.mainSessionLocusCache = locusClone;\n }\n }\n\n /**\n * clear main session cache\n * @returns {undefined}\n * @memberof LocusInfo\n */\n clearMainSessionLocusCache() {\n this.mainSessionLocusCache = null;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"names":["LocusInfo","updateMeeting","webex","meetingId","parsedLocus","states","emitChange","compareAndUpdateFlags","locusParser","LocusDeltaParser","action","locus","meeting","loci","DESYNC","USE_CURRENT","USE_INCOMING","locusInfo","onDeltaLocus","locusDesync","needToGetFullLocus","meetingRequest","getFullLocus","desync","locusUrl","url","then","res","onFullLocus","body","resume","LoggerProxy","logger","info","onDeltaAction","parsedLoci","applyLocusDeltaData","onDeltaEvent","created","scheduledMeeting","participantsUrl","replaces","aclUrl","baseSequence","sequence","membership","identities","participants","deltaParticipants","updateLocusCache","updateParticipants","updateConversationUrl","conversationUrl","updateControls","controls","self","updateLocusUrl","updateFullState","fullState","updateMeetingInfo","updateEmbeddedApps","embeddedApps","updateSelf","updateHostInfo","host","updateMediaShares","mediaShares","updateServices","links","services","data","eventType","getTheLocusToUpdate","LOCUSEVENT","PARTICIPANT_JOIN","PARTICIPANT_LEFT","CONTROLS_UPDATED","PARTICIPANT_AUDIO_MUTED","PARTICIPANT_AUDIO_UNMUTED","PARTICIPANT_VIDEO_MUTED","PARTICIPANT_VIDEO_UNMUTED","SELF_CHANGED","PARTICIPANT_UPDATED","PARTICIPANT_CONTROLS_UPDATED","PARTICIPANT_ROLES_UPDATED","PARTICIPANT_DECLINED","FLOOR_GRANTED","FLOOR_RELEASED","DIFFERENCE","handleLocusDelta","scope","eventName","args","emit","error","updateParticipantDeltas","isReplaceMembers","ControlsUtils","isNeedReplaceMembers","updateLocusInfo","isMeetingActive","handleOneOnOneEvent","workingCopy","type","_CALL_","_SIP_BRIDGE_","emitScoped","file","function","EVENTS","REMOTE_RESPONSE","remoteDeclined","remoteAnswered","reason","state","updateCreated","updateParticipantsUrl","updateReplace","replace","updateAclUrl","updateBasequence","updateSequence","updateMemberShip","updateIdentifiers","compareAndUpdate","length","find","participant","identity","_USER_","removed","partner","getLocusPartner","LOCUS","STATE","INACTIVE","warn","Metrics","postEvent","event","REMOTE_ENDED","DESTROY_MEETING","CALL_REMOVED_REASON","CALL_INACTIVE","shouldLeave","MEETING_STATE","STATES","LEFT","DECLINED","NOTIFIED","JOINED","PARTNER_LEFT","joinedWith","_LEFT_","IDLE","SELF_LEFT","_MEETING_","TERMINATING","MEETING_REMOVED_REASON","MEETING_INACTIVE_TERMINATING","FULLSTATE_REMOVED","SELF_REMOVED","compareSelfAndHost","compareHostAndSelf","selfIdentity","hostId","moderator","LOCUS_INFO_CAN_ASSIGN_HOST","canAssignHost","findParticipant","collection","item","person","id","generateDelta","prevState","newState","deltas","audioStatus","videoSlidesStatus","videoStatus","forEach","key","reduce","existingParticipant","delta","status","changed","push","isReplace","LOCUS_INFO_UPDATE_PARTICIPANTS","recordingId","record","modifiedBy","selfId","parse","getControls","updates","hasRecordingChanged","hasRecordingPausedChanged","hasMeetingContainerChanged","hasTranscribeChanged","hasEntryExitToneChanged","hasBreakoutChanged","hasVideoEnabledChanged","hasMuteOnEntryChanged","hasShareControlChanged","hasDisallowUnmuteChanged","hasReactionsChanged","hasReactionDisplayNamesChanged","hasViewTheParticipantListChanged","hasRaiseHandChanged","hasVideoChanged","current","LOCUSINFO","CONTROLS_MUTE_ON_ENTRY_CHANGED","muteOnEntry","CONTROLS_SHARE_CONTROL_CHANGED","shareControl","CONTROLS_DISALLOW_UNMUTE_CHANGED","disallowUnmute","CONTROLS_REACTIONS_CHANGED","reactions","CONTROLS_VIEW_THE_PARTICIPANTS_LIST_CHANGED","viewTheParticipantList","CONTROLS_RAISE_HAND_CHANGED","raiseHand","CONTROLS_VIDEO_CHANGED","video","paused","RECORDING_STATE","PAUSED","recording","RESUMED","RECORDING","CONTROLS_RECORDING_UPDATED","lastModified","meetingContainerUrl","meetingContainer","CONTROLS_MEETING_CONTAINER_UPDATED","transcribe","transcribing","caption","CONTROLS_MEETING_TRANSCRIBE_UPDATED","breakout","breakoutMoveId","SelfUtils","getReplacedBreakoutMoveId","internal","device","CONTROLS_MEETING_BREAKOUT_UPDATED","entryExitTone","CONTROLS_ENTRY_EXIT_TONE_UPDATED","videoEnabled","unmuteVideoAllowed","SELF_REMOTE_VIDEO_MUTE_STATUS_UPDATED","unmuteAllowed","LINKS_SERVICES","result","FullState","getFullState","meetingStateChangedTo","FULL_STATE_MEETING_STATE_CHANGE","previousState","previous","meetingState","currentState","meetingTypeChangedTo","FULL_STATE_TYPE_UPDATE","parsedHosts","HostUtils","getHosts","isNewHost","LOCUS_INFO_UPDATE_HOST","newHost","oldHost","roles","getRoles","isJoined","parsedInfo","InfoUtils","getInfos","MEETING_INFO_UPDATED","isLocked","MEETING_LOCKED","isUnlocked","MEETING_UNLOCKED","EmbeddedAppsUtils","areSimilar","parsedEmbeddedApps","EMBEDDED_APPS_UPDATED","parsedMediaShares","MediaSharesUtils","getMediaShares","LOCUS_INFO_UPDATE_MEDIA_SHARES","parsedSelves","getSelves","element","getSipUrl","sipUri","moderatorChanged","layoutChanged","CONTROLS_MEETING_LAYOUT_UPDATED","layout","breakoutsChanged","SELF_MEETING_BREAKOUTS_CHANGED","breakoutSessions","isMediaInactiveOrReleased","DISCONNECT_DUE_TO_INACTIVITY","SELF_MODERATOR_CHANGED","isRolesChanged","SELF_ROLES_CHANGED","oldRoles","newRoles","isVideoMutedByOthersChanged","muted","remoteVideoMuted","localAudioUnmuteRequiredByServer","LOCAL_UNMUTE_REQUIRED","remoteMuted","isMutedByOthersChanged","SELF_REMOTE_MUTE_STATUS_UPDATED","localAudioUnmuteRequestedByServer","LOCAL_UNMUTE_REQUESTED","isUserUnadmitted","SELF_UNADMITTED_GUEST","isUserAdmitted","SELF_ADMITTED_GUEST","isMediaInactive","MEDIA_INACTIVITY","getMediaStatus","mediaSessions","audioStateChange","videoStateChange","shareStateChange","MEDIA_STATUS_CHANGE","currentMediaStatus","audio","shareStatus","share","isUserObserving","SELF_OBSERVING","canNotViewTheParticipantListChanged","SELF_CANNOT_VIEW_PARTICIPANT_LIST_CHANGE","canNotViewTheParticipantList","isSharingBlockedChanged","SELF_IS_SHARING_BLOCKED_CHANGE","isSharingBlocked","LOCUS_INFO_UPDATE_SELF","oldSelf","newSelf","LOCUS_INFO_UPDATE_URL","isMainSessionDTO","updateMainSessionLocusCache","newLocus","switchStatus","getSessionSwitchStatus","isReturnToMain","mainSessionLocusCache","isJoinToBreakout","CONTROLS_JOIN_BREAKOUT_FROM_MAIN","mainLocusUrl","sourceParticipants","existIndex","findIndex","p","splice","mainLocus","locusClone","objValue","srcValue","mergeParticipants","EventsScope"],"sources":["index.ts"],"sourcesContent":["import {isEqual, assignWith, cloneDeep} from 'lodash';\n\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport EventsScope from '../common/events/events-scope';\nimport {\n EVENTS,\n LOCUSEVENT,\n _USER_,\n _CALL_,\n _SIP_BRIDGE_,\n MEETING_STATE,\n _MEETING_,\n LOCUSINFO,\n LOCUS,\n _LEFT_,\n MEETING_REMOVED_REASON,\n CALL_REMOVED_REASON,\n RECORDING_STATE,\n} from '../constants';\nimport Metrics from '../metrics';\nimport {eventType} from '../metrics/config';\nimport InfoUtils from './infoUtils';\nimport FullState from './fullState';\nimport SelfUtils from './selfUtils';\nimport HostUtils from './hostUtils';\nimport ControlsUtils from './controlsUtils';\nimport EmbeddedAppsUtils from './embeddedAppsUtils';\nimport MediaSharesUtils from './mediaSharesUtils';\nimport LocusDeltaParser from './parser';\n\n/**\n * @description LocusInfo extends ChildEmitter to convert locusInfo info a private emitter to parent object\n * @export\n * @private\n * @class LocusInfo\n */\nexport default class LocusInfo extends EventsScope {\n compareAndUpdateFlags: any;\n emitChange: any;\n locusParser: any;\n meetingId: any;\n parsedLocus: any;\n updateMeeting: any;\n webex: any;\n aclUrl: any;\n baseSequence: any;\n created: any;\n deltaParticipants: any;\n identities: any;\n membership: any;\n participants: any;\n participantsUrl: any;\n replaces: any;\n scheduledMeeting: any;\n sequence: any;\n controls: any;\n conversationUrl: any;\n embeddedApps: any;\n fullState: any;\n host: any;\n info: any;\n roles: any;\n mediaShares: any;\n replace: any;\n url: any;\n services: any;\n mainSessionLocusCache: any;\n /**\n * Constructor\n * @param {boolean} updateMeeting true if the meeting should be updated\n * @param {object} webex\n * @param {string} meetingId\n * @returns {undefined}\n */\n constructor(updateMeeting, webex, meetingId) {\n super();\n this.parsedLocus = {\n states: [],\n };\n this.webex = webex;\n this.emitChange = false;\n this.compareAndUpdateFlags = {};\n this.meetingId = meetingId;\n this.updateMeeting = updateMeeting;\n this.locusParser = new LocusDeltaParser();\n }\n\n /**\n * Apply locus delta data to meeting\n * @param {string} action Locus delta action\n * @param {Locus} locus\n * @param {Meeting} meeting\n * @returns {undefined}\n */\n applyLocusDeltaData(action: string, locus: any, meeting: any) {\n const {DESYNC, USE_CURRENT, USE_INCOMING} = LocusDeltaParser.loci;\n\n switch (action) {\n case USE_INCOMING:\n meeting.locusInfo.onDeltaLocus(locus);\n break;\n case USE_CURRENT:\n meeting.locusDesync = false;\n meeting.needToGetFullLocus = false;\n break;\n case DESYNC:\n meeting.meetingRequest\n .getFullLocus({\n desync: true,\n locusUrl: locus.url ? locus.url : meeting.locusUrl,\n })\n .then((res) => {\n meeting.locusInfo.onFullLocus(res.body);\n // Notify parser to resume processing delta events\n // now that we have full locus from DESYNC.\n this.locusParser.resume();\n });\n break;\n default:\n LoggerProxy.logger.info(\n `Locus-info:index#applyLocusDeltaData --> Unknown locus delta action: ${action}`\n );\n }\n }\n\n /**\n * Adds locus delta to parser's queue\n * and registers a function handler\n * to recieve parsed actions from queue.\n * @param {Locus} locus\n * @param {Meeting} meeting\n * @returns {undefined}\n */\n handleLocusDelta(locus: any, meeting: any) {\n // register a function to process delta actions\n if (!this.locusParser.onDeltaAction) {\n // delta action, along with associated loci\n // is passed into the function.\n this.locusParser.onDeltaAction = (action, parsedLoci) => {\n this.applyLocusDeltaData(action, parsedLoci, meeting);\n };\n }\n // queue delta event with parser\n this.locusParser.onDeltaEvent(locus);\n }\n\n /**\n * @param {Locus} locus\n * @returns {undefined}\n * @memberof LocusInfo\n */\n init(locus: any = {}) {\n this.created = locus.created || null;\n this.scheduledMeeting = locus.meeting || null;\n this.participantsUrl = locus.participantsUrl || null;\n this.replaces = locus.replaces || null;\n this.aclUrl = locus.aclUrl || null;\n this.baseSequence = locus.baseSequence || null;\n this.sequence = locus.sequence || null;\n this.membership = locus.membership || null;\n this.identities = locus.identities || null;\n this.participants = locus.participants || null;\n\n /**\n * Stores the delta values for a changed participant.\n *\n * @typedef {Object} DeltaParticipant\n * @property {Record<string, boolean>} delta - Contains changed streams.\n * @property {Object} person - Contains person data.\n */\n\n /**\n * Stored participant changes between the last event and the current event.\n * All previously stored events are overwritten between events.\n *\n * @instance\n * @type {Array<DeltaParticipant>}\n * @private\n * @member LocusInfo\n */\n this.deltaParticipants = [];\n\n this.updateLocusCache(locus);\n // above section only updates the locusInfo object\n // The below section makes sure it updates the locusInfo as well as updates the meeting object\n this.updateParticipants(locus.participants);\n // For 1:1 space meeting the conversation Url does not exist in locus.conversation\n this.updateConversationUrl(locus.conversationUrl, locus.info);\n this.updateControls(locus.controls, locus.self);\n this.updateLocusUrl(locus.url);\n this.updateFullState(locus.fullState);\n this.updateMeetingInfo(locus.info);\n this.updateEmbeddedApps(locus.embeddedApps);\n // self and participants generate sipUrl for 1:1 meeting\n this.updateSelf(locus.self, locus.participants);\n this.updateHostInfo(locus.host);\n this.updateMediaShares(locus.mediaShares);\n this.updateServices(locus.links?.services);\n }\n\n /**\n * @param {Object} locus\n * @returns {undefined}\n * @memberof LocusInfo\n */\n initialSetup(locus: object) {\n this.updateLocusCache(locus);\n this.onFullLocus(locus);\n\n // Change it to true after it receives it first locus object\n this.emitChange = true;\n }\n\n /**\n * @param {Meeting} meeting\n * @param {Object} data\n * @returns {undefined}\n * @memberof LocusInfo\n */\n parse(meeting: any, data: any) {\n // eslint-disable-next-line @typescript-eslint/no-shadow\n const {eventType} = data;\n const locus = this.getTheLocusToUpdate(data.locus);\n LoggerProxy.logger.info(`Locus-info:index#parse --> received locus data: ${eventType}`);\n\n switch (eventType) {\n case LOCUSEVENT.PARTICIPANT_JOIN:\n case LOCUSEVENT.PARTICIPANT_LEFT:\n case LOCUSEVENT.CONTROLS_UPDATED:\n case LOCUSEVENT.PARTICIPANT_AUDIO_MUTED:\n case LOCUSEVENT.PARTICIPANT_AUDIO_UNMUTED:\n case LOCUSEVENT.PARTICIPANT_VIDEO_MUTED:\n case LOCUSEVENT.PARTICIPANT_VIDEO_UNMUTED:\n case LOCUSEVENT.SELF_CHANGED:\n case LOCUSEVENT.PARTICIPANT_UPDATED:\n case LOCUSEVENT.PARTICIPANT_CONTROLS_UPDATED:\n case LOCUSEVENT.PARTICIPANT_ROLES_UPDATED:\n case LOCUSEVENT.PARTICIPANT_DECLINED:\n case LOCUSEVENT.FLOOR_GRANTED:\n case LOCUSEVENT.FLOOR_RELEASED:\n this.onFullLocus(locus, eventType);\n break;\n case LOCUSEVENT.DIFFERENCE:\n this.handleLocusDelta(locus, meeting);\n break;\n\n default:\n // Why will there be a event with no eventType ????\n // we may not need this, we can get full locus\n this.handleLocusDelta(locus, meeting);\n }\n }\n\n /**\n * @param {String} scope\n * @param {String} eventName\n * @param {Array} args\n * @returns {undefined}\n * @memberof LocusInfo\n */\n emitScoped(scope?: any, eventName?: string, args?: any) {\n return this.emit(scope, eventName, args);\n }\n\n /**\n * updates the locus with full locus object\n * @param {object} locus locus object\n * @param {string} eventType particulat locus event\n * @returns {object} null\n * @memberof LocusInfo\n */\n // eslint-disable-next-line @typescript-eslint/no-shadow\n onFullLocus(locus: any, eventType?: string) {\n if (!locus) {\n LoggerProxy.logger.error(\n 'Locus-info:index#onFullLocus --> object passed as argument was invalid, continuing.'\n );\n }\n this.updateParticipantDeltas(locus.participants);\n this.scheduledMeeting = locus.meeting || null;\n this.participants = locus.participants;\n const isReplaceMembers = ControlsUtils.isNeedReplaceMembers(this.controls, locus.controls);\n this.updateLocusInfo(locus);\n this.updateParticipants(locus.participants, isReplaceMembers);\n this.isMeetingActive();\n this.handleOneOnOneEvent(eventType);\n this.updateEmbeddedApps(locus.embeddedApps);\n // set current (working copy) for parser\n this.locusParser.workingCopy = locus;\n }\n\n // used for ringing stops on one on one\n /**\n * @param {String} eventType\n * @returns {undefined}\n * @memberof LocusInfo\n */\n // eslint-disable-next-line @typescript-eslint/no-shadow\n handleOneOnOneEvent(eventType: string) {\n if (\n this.parsedLocus.fullState.type === _CALL_ ||\n this.parsedLocus.fullState.type === _SIP_BRIDGE_\n ) {\n // for 1:1 bob calls alice and alice declines, notify the meeting state\n if (eventType === LOCUSEVENT.PARTICIPANT_DECLINED) {\n // trigger the event for stop ringing\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'handleOneonOneEvent',\n },\n EVENTS.REMOTE_RESPONSE,\n {\n remoteDeclined: true,\n remoteAnswered: false,\n }\n );\n }\n // for 1:1 bob calls alice and alice answers, notify the meeting state\n if (eventType === LOCUSEVENT.PARTICIPANT_JOIN) {\n // trigger the event for stop ringing\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'handleOneonOneEvent',\n },\n EVENTS.REMOTE_RESPONSE,\n {\n remoteDeclined: false,\n remoteAnswered: true,\n }\n );\n }\n }\n }\n\n /**\n * @param {Object} locus\n * @returns {undefined}\n * @memberof LocusInfo\n */\n onDeltaLocus(locus: any) {\n const isReplaceMembers = ControlsUtils.isNeedReplaceMembers(this.controls, locus.controls);\n this.updateLocusInfo(locus);\n this.updateParticipants(locus.participants, isReplaceMembers);\n this.isMeetingActive();\n }\n\n /**\n * @param {Object} locus\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateLocusInfo(locus) {\n if (locus.self?.reason === 'MOVED' && locus.self?.state === 'LEFT') {\n // When moved to a breakout session locus sends a message for the previous locus\n // indicating that we have been moved. It isn't helpful to continue parsing this\n // as it gets interpreted as if we have left the call\n return;\n }\n\n this.updateControls(locus.controls, locus.self);\n this.updateConversationUrl(locus.conversationUrl, locus.info);\n this.updateCreated(locus.created);\n this.updateFullState(locus.fullState);\n this.updateHostInfo(locus.host);\n this.updateMeetingInfo(locus.info, locus.self);\n this.updateMediaShares(locus.mediaShares);\n this.updateParticipantsUrl(locus.participantsUrl);\n this.updateReplace(locus.replace);\n this.updateSelf(locus.self, locus.participants);\n this.updateLocusUrl(locus.url);\n this.updateAclUrl(locus.aclUrl);\n this.updateBasequence(locus.baseSequence);\n this.updateSequence(locus.sequence);\n this.updateMemberShip(locus.membership);\n this.updateIdentifiers(locus.identities);\n this.updateEmbeddedApps(locus.embeddedApps);\n this.updateServices(locus.links?.services);\n this.compareAndUpdate();\n // update which required to compare different objects from locus\n }\n\n /**\n * @param {Array} participants\n * @param {Object} self\n * @returns {Array}\n * @memberof LocusInfo\n */\n getLocusPartner(participants: Array<any>, self: any) {\n if (!participants || participants.length === 0) {\n return null;\n }\n\n return (\n participants.find(\n (participant) =>\n self &&\n participant.identity !== self.identity &&\n (participants.length <= 2 || (participant.type === _USER_ && !participant.removed))\n // @ts-ignore\n ) || this.partner\n );\n }\n\n // TODO: all the leave states need to be checked\n /**\n * @returns {undefined}\n * @memberof LocusInfo\n */\n isMeetingActive() {\n if (\n this.parsedLocus.fullState.type === _CALL_ ||\n this.parsedLocus.fullState.type === _SIP_BRIDGE_\n ) {\n // @ts-ignore\n const partner = this.getLocusPartner(this.participants, this.self);\n\n this.updateMeeting({partner});\n\n // Check if guest user needs to be checked here\n\n // 1) when bob declines call from bob, (bob='DECLINED')\n // 2) When alice rejects call to bob , (bob='NOTIFIED')\n\n // When we dont add MEDIA for condition 2. The state of bob='IDLE'\n\n if (this.fullState && this.fullState.state === LOCUS.STATE.INACTIVE) {\n // TODO: update the meeting state\n LoggerProxy.logger.warn(\n 'Locus-info:index#isMeetingActive --> Call Ended, locus state is inactive.'\n );\n Metrics.postEvent({\n event: eventType.REMOTE_ENDED,\n meetingId: this.meetingId,\n });\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'isMeetingActive',\n },\n EVENTS.DESTROY_MEETING,\n {\n reason: CALL_REMOVED_REASON.CALL_INACTIVE,\n shouldLeave: false,\n }\n );\n } else if (\n partner.state === MEETING_STATE.STATES.LEFT &&\n this.parsedLocus.self &&\n (this.parsedLocus.self.state === MEETING_STATE.STATES.DECLINED ||\n this.parsedLocus.self.state === MEETING_STATE.STATES.NOTIFIED ||\n this.parsedLocus.self.state === MEETING_STATE.STATES.JOINED)\n ) {\n Metrics.postEvent({\n event: eventType.REMOTE_ENDED,\n meetingId: this.meetingId,\n });\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'isMeetingActive',\n },\n EVENTS.DESTROY_MEETING,\n {\n reason: CALL_REMOVED_REASON.PARTNER_LEFT,\n shouldLeave:\n this.parsedLocus.self.joinedWith && this.parsedLocus.self.joinedWith.state !== _LEFT_,\n }\n );\n } else if (\n this.parsedLocus.self &&\n this.parsedLocus.self.state === MEETING_STATE.STATES.LEFT &&\n (partner.state === MEETING_STATE.STATES.LEFT ||\n partner.state === MEETING_STATE.STATES.DECLINED ||\n partner.state === MEETING_STATE.STATES.NOTIFIED ||\n partner.state === MEETING_STATE.STATES.IDLE) // Happens when user just joins and adds no Media\n ) {\n Metrics.postEvent({\n event: eventType.REMOTE_ENDED,\n meetingId: this.meetingId,\n });\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'isMeetingActive',\n },\n EVENTS.DESTROY_MEETING,\n {\n reason: CALL_REMOVED_REASON.SELF_LEFT,\n shouldLeave: false,\n }\n );\n }\n } else if (this.parsedLocus.fullState.type === _MEETING_) {\n if (\n this.fullState &&\n (this.fullState.state === LOCUS.STATE.INACTIVE ||\n // @ts-ignore\n this.fullState.state === LOCUS.STATE.TERMINATING)\n ) {\n LoggerProxy.logger.warn(\n 'Locus-info:index#isMeetingActive --> Meeting is ending due to inactive or terminating'\n );\n Metrics.postEvent({\n event: eventType.REMOTE_ENDED,\n meetingId: this.meetingId,\n });\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'isMeetingActive',\n },\n EVENTS.DESTROY_MEETING,\n {\n reason: MEETING_REMOVED_REASON.MEETING_INACTIVE_TERMINATING,\n shouldLeave: false,\n }\n );\n } else if (this.fullState && this.fullState.removed) {\n // user has been dropped from a meeting\n Metrics.postEvent({\n event: eventType.REMOTE_ENDED,\n meetingId: this.meetingId,\n });\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'isMeetingActive',\n },\n EVENTS.DESTROY_MEETING,\n {\n reason: MEETING_REMOVED_REASON.FULLSTATE_REMOVED,\n shouldLeave: false,\n }\n );\n }\n // If you are guest and you are removed from the meeting\n // You wont get any further events\n else if (this.parsedLocus.self && this.parsedLocus.self.removed) {\n // Check if we need to send an event\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'isMeetingActive',\n },\n EVENTS.DESTROY_MEETING,\n {\n reason: MEETING_REMOVED_REASON.SELF_REMOVED,\n shouldLeave: false,\n }\n );\n }\n } else {\n LoggerProxy.logger.warn('Locus-info:index#isMeetingActive --> Meeting Type is unknown.');\n }\n }\n\n /**\n * checks if the host permissions have changed while in the meeting\n * This would be the case if your role as host or moderator has been updated\n * @returns {undefined}\n * @memberof LocusInfo\n */\n compareAndUpdate() {\n // TODO: check with locus team on host and moderator doc\n // use host as a validator if needed\n if (\n this.compareAndUpdateFlags.compareSelfAndHost ||\n this.compareAndUpdateFlags.compareHostAndSelf\n ) {\n this.compareSelfAndHost();\n }\n }\n\n /**\n * compared the self object to check if the user has host permissions\n * @returns {undefined}\n * @memberof LocusInfo\n */\n compareSelfAndHost() {\n // In some cases the host info is not present but the moderator values changes from null to false so it triggers an update\n if (\n this.parsedLocus.self.selfIdentity === this.parsedLocus.host?.hostId &&\n this.parsedLocus.self.moderator\n ) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'compareSelfAndHost',\n },\n EVENTS.LOCUS_INFO_CAN_ASSIGN_HOST,\n {\n canAssignHost: true,\n }\n );\n } else {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'compareSelfAndHost',\n },\n EVENTS.LOCUS_INFO_CAN_ASSIGN_HOST,\n {\n canAssignHost: false,\n }\n );\n }\n }\n\n /**\n * Update the deltaParticipants property of this object based on a list of\n * provided participants.\n *\n * @param {Array} [participants] - The participants to update against.\n * @returns {void}\n */\n updateParticipantDeltas(participants: Array<any> = []) {\n // Used to find a participant within a participants collection.\n const findParticipant = (participant, collection) =>\n collection.find((item) => item.person.id === participant.person.id);\n\n // Generates an object that indicates which state properties have changed.\n const generateDelta = (prevState: any = {}, newState: any = {}) => {\n // Setup deltas.\n const deltas = {\n audioStatus: prevState.audioStatus !== newState.audioStatus,\n videoSlidesStatus: prevState.videoSlidesStatus !== newState.videoSlidesStatus,\n videoStatus: prevState.videoStatus !== newState.videoStatus,\n };\n\n // Clean the object\n Object.keys(deltas).forEach((key) => {\n if (deltas[key] !== true) {\n delete deltas[key];\n }\n });\n\n return deltas;\n };\n\n this.deltaParticipants = participants.reduce((collection, participant) => {\n const existingParticipant = findParticipant(participant, this.participants || []) || {};\n\n const delta = generateDelta(existingParticipant.status, participant.status);\n\n const changed = Object.keys(delta).length > 0;\n\n if (changed) {\n collection.push({\n person: participant.person,\n delta,\n });\n }\n\n return collection;\n }, []);\n }\n\n /**\n * update meeting's members\n * @param {Object} participants new participants object\n * @param {Boolean} isReplace is replace the whole members\n * @returns {Array} updatedParticipants\n * @memberof LocusInfo\n */\n updateParticipants(participants: object, isReplace?: boolean) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateParticipants',\n },\n EVENTS.LOCUS_INFO_UPDATE_PARTICIPANTS,\n {\n participants,\n recordingId: this.parsedLocus.controls && this.parsedLocus.controls.record?.modifiedBy,\n selfIdentity: this.parsedLocus.self && this.parsedLocus.self.selfIdentity,\n selfId: this.parsedLocus.self && this.parsedLocus.self.selfId,\n hostId: this.parsedLocus.host && this.parsedLocus.host.hostId,\n isReplace,\n }\n );\n }\n\n /**\n * @param {Object} controls\n * @param {Object} self\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateControls(controls: object, self: object) {\n if (controls && !isEqual(this.controls, controls)) {\n this.parsedLocus.controls = ControlsUtils.parse(controls);\n const {\n updates: {\n hasRecordingChanged,\n hasRecordingPausedChanged,\n hasMeetingContainerChanged,\n hasTranscribeChanged,\n hasEntryExitToneChanged,\n hasBreakoutChanged,\n hasVideoEnabledChanged,\n hasMuteOnEntryChanged,\n hasShareControlChanged,\n hasDisallowUnmuteChanged,\n hasReactionsChanged,\n hasReactionDisplayNamesChanged,\n hasViewTheParticipantListChanged,\n hasRaiseHandChanged,\n hasVideoChanged,\n },\n current,\n } = ControlsUtils.getControls(this.controls, controls);\n\n if (hasMuteOnEntryChanged) {\n this.emitScoped(\n {file: 'locus-info', function: 'updateControls'},\n LOCUSINFO.EVENTS.CONTROLS_MUTE_ON_ENTRY_CHANGED,\n {state: current.muteOnEntry}\n );\n }\n\n if (hasShareControlChanged) {\n this.emitScoped(\n {file: 'locus-info', function: 'updateControls'},\n LOCUSINFO.EVENTS.CONTROLS_SHARE_CONTROL_CHANGED,\n {state: current.shareControl}\n );\n }\n\n if (hasDisallowUnmuteChanged) {\n this.emitScoped(\n {file: 'locus-info', function: 'updateControls'},\n LOCUSINFO.EVENTS.CONTROLS_DISALLOW_UNMUTE_CHANGED,\n {state: current.disallowUnmute}\n );\n }\n\n if (hasReactionsChanged || hasReactionDisplayNamesChanged) {\n this.emitScoped(\n {file: 'locus-info', function: 'updateControls'},\n LOCUSINFO.EVENTS.CONTROLS_REACTIONS_CHANGED,\n {state: current.reactions}\n );\n }\n\n if (hasViewTheParticipantListChanged) {\n this.emitScoped(\n {file: 'locus-info', function: 'updateControls'},\n LOCUSINFO.EVENTS.CONTROLS_VIEW_THE_PARTICIPANTS_LIST_CHANGED,\n {state: current.viewTheParticipantList}\n );\n }\n\n if (hasRaiseHandChanged) {\n this.emitScoped(\n {file: 'locus-info', function: 'updateControls'},\n LOCUSINFO.EVENTS.CONTROLS_RAISE_HAND_CHANGED,\n {state: current.raiseHand}\n );\n }\n\n if (hasVideoChanged) {\n this.emitScoped(\n {file: 'locus-info', function: 'updateControls'},\n LOCUSINFO.EVENTS.CONTROLS_VIDEO_CHANGED,\n {state: current.video}\n );\n }\n\n if (hasRecordingChanged || hasRecordingPausedChanged) {\n let state = null;\n\n if (hasRecordingPausedChanged) {\n if (current.record.paused) {\n state = RECORDING_STATE.PAUSED;\n } else {\n // state will be `IDLE` if the recording is not active, even when there is a `pause` status change.\n state = current.record.recording ? RECORDING_STATE.RESUMED : RECORDING_STATE.IDLE;\n }\n } else if (hasRecordingChanged) {\n state = current.record.recording ? RECORDING_STATE.RECORDING : RECORDING_STATE.IDLE;\n }\n\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateControls',\n },\n LOCUSINFO.EVENTS.CONTROLS_RECORDING_UPDATED,\n {\n state,\n modifiedBy: current.record.modifiedBy,\n lastModified: current.record.lastModified,\n }\n );\n }\n\n if (hasMeetingContainerChanged) {\n const {meetingContainerUrl} = current.meetingContainer;\n\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateControls',\n },\n LOCUSINFO.EVENTS.CONTROLS_MEETING_CONTAINER_UPDATED,\n {\n meetingContainerUrl,\n }\n );\n }\n\n if (hasTranscribeChanged) {\n const {transcribing, caption} = current.transcribe;\n\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateControls',\n },\n LOCUSINFO.EVENTS.CONTROLS_MEETING_TRANSCRIBE_UPDATED,\n {\n transcribing,\n caption,\n }\n );\n }\n\n if (hasBreakoutChanged) {\n const {breakout} = current;\n breakout.breakoutMoveId = SelfUtils.getReplacedBreakoutMoveId(\n self,\n this.webex.internal.device.url\n );\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateControls',\n },\n LOCUSINFO.EVENTS.CONTROLS_MEETING_BREAKOUT_UPDATED,\n {\n breakout,\n }\n );\n }\n\n if (hasEntryExitToneChanged) {\n const {entryExitTone} = current;\n\n this.updateMeeting({entryExitTone});\n\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateControls',\n },\n LOCUSINFO.EVENTS.CONTROLS_ENTRY_EXIT_TONE_UPDATED,\n {\n entryExitTone,\n }\n );\n }\n\n // videoEnabled is handled differently than other controls,\n // to fit with audio mute status logic\n if (hasVideoEnabledChanged) {\n const {videoEnabled} = current;\n\n this.updateMeeting({unmuteVideoAllowed: videoEnabled});\n\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateControls',\n },\n LOCUSINFO.EVENTS.SELF_REMOTE_VIDEO_MUTE_STATUS_UPDATED,\n {\n // muted: not part of locus.controls\n unmuteAllowed: videoEnabled,\n }\n );\n }\n\n this.controls = controls;\n }\n }\n\n /**\n * @param {String} conversationUrl\n * @param {Object} info\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateConversationUrl(conversationUrl: string, info: any) {\n if (conversationUrl && !isEqual(this.conversationUrl, conversationUrl)) {\n this.conversationUrl = conversationUrl;\n this.updateMeeting({conversationUrl});\n } else if (\n info &&\n info.conversationUrl &&\n !isEqual(this.conversationUrl, info.conversationUrl)\n ) {\n this.conversationUrl = info.conversationUrl;\n this.updateMeeting({conversationUrl: info.conversationUrl});\n }\n }\n\n /**\n * @param {Object} created\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateCreated(created: object) {\n if (created && !isEqual(this.created, created)) {\n this.created = created;\n }\n }\n\n /**\n * @param {Object} services\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateServices(services: Record<'breakout' | 'record', {url: string}>) {\n if (services && !isEqual(this.services, services)) {\n this.services = services;\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateServices',\n },\n LOCUSINFO.EVENTS.LINKS_SERVICES,\n {\n services,\n }\n );\n }\n }\n\n /**\n * @param {Object} fullState\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateFullState(fullState: object) {\n if (fullState && !isEqual(this.fullState, fullState)) {\n const result = FullState.getFullState(this.fullState, fullState);\n\n this.updateMeeting(result.current);\n\n if (result.updates.meetingStateChangedTo) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateFullState',\n },\n LOCUSINFO.EVENTS.FULL_STATE_MEETING_STATE_CHANGE,\n {\n previousState: result.previous && result.previous.meetingState,\n currentState: result.current.meetingState,\n }\n );\n }\n\n if (result.updates.meetingTypeChangedTo) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateFullState',\n },\n LOCUSINFO.EVENTS.FULL_STATE_TYPE_UPDATE,\n {\n type: result.current.type,\n }\n );\n }\n this.parsedLocus.fullState = result.current;\n this.fullState = fullState;\n }\n }\n\n /**\n * handles when the locus.host is updated\n * @param {Object} host the locus.host property\n * @returns {undefined}\n * @memberof LocusInfo\n * emits internal event locus_info_update_host\n */\n updateHostInfo(host: object) {\n if (host && !isEqual(this.host, host)) {\n const parsedHosts = HostUtils.getHosts(this.host, host);\n\n this.updateMeeting(parsedHosts.current);\n this.parsedLocus.host = parsedHosts.current;\n if (parsedHosts.updates.isNewHost) {\n this.compareAndUpdateFlags.compareSelfAndHost = true;\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateHostInfo',\n },\n EVENTS.LOCUS_INFO_UPDATE_HOST,\n {\n newHost: parsedHosts.current,\n oldHost: parsedHosts.previous,\n }\n );\n }\n this.host = host;\n } else {\n this.compareAndUpdateFlags.compareSelfAndHost = false;\n }\n }\n\n /**\n * @param {Object} info\n * @param {Object} self\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateMeetingInfo(info: object, self?: object) {\n const roles = self ? SelfUtils.getRoles(self) : this.parsedLocus.self?.roles || [];\n if (\n (info && !isEqual(this.info, info)) ||\n (roles.length && !isEqual(this.roles, roles) && info)\n ) {\n const isJoined = SelfUtils.isJoined(self || this.parsedLocus.self);\n const parsedInfo = InfoUtils.getInfos(this.parsedLocus.info, info, roles, isJoined);\n\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateMeetingInfo',\n },\n LOCUSINFO.EVENTS.MEETING_INFO_UPDATED,\n {info: parsedInfo.current, self}\n );\n\n if (parsedInfo.updates.isLocked) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateMeetingInfo',\n },\n LOCUSINFO.EVENTS.MEETING_LOCKED,\n info\n );\n }\n if (parsedInfo.updates.isUnlocked) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateMeetingInfo',\n },\n LOCUSINFO.EVENTS.MEETING_UNLOCKED,\n info\n );\n }\n\n this.info = info;\n this.parsedLocus.info = parsedInfo.current;\n // Parses the info and adds necessary values\n this.updateMeeting(parsedInfo.current);\n }\n this.roles = roles;\n }\n\n /**\n * @param {Object} embeddedApps\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateEmbeddedApps(embeddedApps: object) {\n // don't do anything if the arrays of apps haven't changed significantly\n if (EmbeddedAppsUtils.areSimilar(this.embeddedApps, embeddedApps)) {\n return;\n }\n\n const parsedEmbeddedApps = EmbeddedAppsUtils.parse(embeddedApps);\n\n this.updateMeeting({embeddedApps: parsedEmbeddedApps});\n\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateEmbeddedApps',\n },\n LOCUSINFO.EVENTS.EMBEDDED_APPS_UPDATED,\n parsedEmbeddedApps\n );\n this.embeddedApps = embeddedApps;\n }\n\n /**\n * handles when the locus.mediaShares is updated\n * @param {Object} mediaShares the locus.mediaShares property\n * @returns {undefined}\n * @memberof LocusInfo\n * emits internal event locus_info_update_media_shares\n */\n updateMediaShares(mediaShares: object) {\n if (mediaShares && !isEqual(this.mediaShares, mediaShares)) {\n const parsedMediaShares = MediaSharesUtils.getMediaShares(this.mediaShares, mediaShares);\n\n this.updateMeeting(parsedMediaShares.current);\n this.parsedLocus.mediaShares = parsedMediaShares.current;\n this.mediaShares = mediaShares;\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateMediaShares',\n },\n EVENTS.LOCUS_INFO_UPDATE_MEDIA_SHARES,\n {\n current: parsedMediaShares.current,\n previous: parsedMediaShares.previous,\n }\n );\n }\n }\n\n /**\n * @param {String} participantsUrl\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateParticipantsUrl(participantsUrl: string) {\n if (participantsUrl && !isEqual(this.participantsUrl, participantsUrl)) {\n this.participantsUrl = participantsUrl;\n }\n }\n\n /**\n * @param {Object} replace\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateReplace(replace: object) {\n if (replace && !isEqual(this.replace, replace)) {\n this.replace = replace;\n }\n }\n\n /**\n * handles when the locus.self is updated\n * @param {Object} self the locus.mediaShares property\n * @param {Array} participants the locus.participants property\n * @returns {undefined}\n * @memberof LocusInfo\n * emits internal events self_admitted_guest, self_unadmitted_guest, locus_info_update_self\n */\n updateSelf(self: any, participants: Array<any>) {\n // @ts-ignore - check where this.self come from\n if (self && !isEqual(this.self, self)) {\n // @ts-ignore\n const parsedSelves = SelfUtils.getSelves(this.self, self, this.webex.internal.device.url);\n\n this.updateMeeting(parsedSelves.current);\n this.parsedLocus.self = parsedSelves.current;\n\n const element = this.parsedLocus.states[this.parsedLocus.states.length - 1];\n\n if (element !== parsedSelves.current.state) {\n this.parsedLocus.states.push(parsedSelves.current.state);\n }\n\n // TODO: check if we need to save the sipUri here as well\n // this.emit(LOCUSINFO.EVENTS.MEETING_UPDATE, SelfUtils.getSipUrl(this.getLocusPartner(participants, self), this.parsedLocus.fullState.type, this.parsedLocus.info.sipUri));\n const result = SelfUtils.getSipUrl(\n this.getLocusPartner(participants, self),\n this.parsedLocus.fullState.type,\n this.parsedLocus.info.sipUri\n );\n\n if (result.sipUri) {\n this.updateMeeting(result);\n }\n\n if (parsedSelves.updates.moderatorChanged) {\n this.compareAndUpdateFlags.compareHostAndSelf = true;\n } else {\n this.compareAndUpdateFlags.compareHostAndSelf = false;\n }\n\n if (parsedSelves.updates.layoutChanged) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateSelf',\n },\n LOCUSINFO.EVENTS.CONTROLS_MEETING_LAYOUT_UPDATED,\n {layout: parsedSelves.current.layout}\n );\n }\n\n if (parsedSelves.updates.breakoutsChanged) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateSelf',\n },\n LOCUSINFO.EVENTS.SELF_MEETING_BREAKOUTS_CHANGED,\n {breakoutSessions: parsedSelves.current.breakoutSessions}\n );\n }\n\n if (parsedSelves.updates.isMediaInactiveOrReleased) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateSelf',\n },\n LOCUSINFO.EVENTS.DISCONNECT_DUE_TO_INACTIVITY,\n {reason: self.reason}\n );\n }\n\n if (parsedSelves.updates.moderatorChanged) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateSelf',\n },\n LOCUSINFO.EVENTS.SELF_MODERATOR_CHANGED,\n self\n );\n }\n\n if (parsedSelves.updates.isRolesChanged) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateSelf',\n },\n LOCUSINFO.EVENTS.SELF_ROLES_CHANGED,\n {oldRoles: parsedSelves.previous?.roles, newRoles: parsedSelves.current?.roles}\n );\n }\n\n if (parsedSelves.updates.isVideoMutedByOthersChanged) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateSelf',\n },\n LOCUSINFO.EVENTS.SELF_REMOTE_VIDEO_MUTE_STATUS_UPDATED,\n {\n muted: parsedSelves.current.remoteVideoMuted,\n // unmuteAllowed: not part of .self\n }\n );\n }\n if (parsedSelves.updates.localAudioUnmuteRequiredByServer) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateSelf',\n },\n LOCUSINFO.EVENTS.LOCAL_UNMUTE_REQUIRED,\n {\n muted: parsedSelves.current.remoteMuted,\n unmuteAllowed: parsedSelves.current.unmuteAllowed,\n }\n );\n }\n if (parsedSelves.updates.isMutedByOthersChanged) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateSelf',\n },\n LOCUSINFO.EVENTS.SELF_REMOTE_MUTE_STATUS_UPDATED,\n {\n muted: parsedSelves.current.remoteMuted,\n unmuteAllowed: parsedSelves.current.unmuteAllowed,\n }\n );\n }\n if (parsedSelves.updates.localAudioUnmuteRequestedByServer) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateSelf',\n },\n LOCUSINFO.EVENTS.LOCAL_UNMUTE_REQUESTED,\n {}\n );\n }\n if (parsedSelves.updates.isUserUnadmitted) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateSelf',\n },\n LOCUSINFO.EVENTS.SELF_UNADMITTED_GUEST,\n self\n );\n }\n if (parsedSelves.updates.isUserAdmitted) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateSelf',\n },\n LOCUSINFO.EVENTS.SELF_ADMITTED_GUEST,\n self\n );\n }\n\n if (parsedSelves.updates.isMediaInactive) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateSelf',\n },\n // @ts-ignore\n LOCUSINFO.EVENTS.MEDIA_INACTIVITY,\n SelfUtils.getMediaStatus(self.mediaSessions)\n );\n }\n\n if (\n parsedSelves.updates.audioStateChange ||\n parsedSelves.updates.videoStateChange ||\n parsedSelves.updates.shareStateChange\n ) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateSelf',\n },\n LOCUSINFO.EVENTS.MEDIA_STATUS_CHANGE,\n {\n audioStatus: parsedSelves.current.currentMediaStatus?.audio,\n videoStatus: parsedSelves.current.currentMediaStatus?.video,\n shareStatus: parsedSelves.current.currentMediaStatus?.share,\n }\n );\n }\n\n if (parsedSelves.updates.isUserObserving) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateSelf',\n },\n LOCUSINFO.EVENTS.SELF_OBSERVING\n );\n }\n\n if (parsedSelves.updates.canNotViewTheParticipantListChanged) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateSelf',\n },\n LOCUSINFO.EVENTS.SELF_CANNOT_VIEW_PARTICIPANT_LIST_CHANGE,\n {canNotViewTheParticipantList: parsedSelves.current.canNotViewTheParticipantList}\n );\n }\n\n if (parsedSelves.updates.isSharingBlockedChanged) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateSelf',\n },\n LOCUSINFO.EVENTS.SELF_IS_SHARING_BLOCKED_CHANGE,\n {isSharingBlocked: parsedSelves.current.isSharingBlocked}\n );\n }\n\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateSelf',\n },\n EVENTS.LOCUS_INFO_UPDATE_SELF,\n {\n oldSelf: parsedSelves.previous,\n newSelf: parsedSelves.current,\n }\n );\n this.parsedLocus.self = parsedSelves.current;\n // @ts-ignore\n this.self = self;\n } else {\n this.compareAndUpdateFlags.compareHostAndSelf = false;\n }\n }\n\n /**\n * handles when the locus.url is updated\n * @param {String} url\n * @returns {undefined}\n * emits internal event locus_info_update_url\n */\n updateLocusUrl(url: string) {\n if (url && this.url !== url) {\n this.url = url;\n this.updateMeeting({locusUrl: url});\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateLocusUrl',\n },\n EVENTS.LOCUS_INFO_UPDATE_URL,\n url\n );\n }\n }\n\n /**\n * @param {String} aclUrl\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateAclUrl(aclUrl: string) {\n if (aclUrl && !isEqual(this.aclUrl, aclUrl)) {\n this.aclUrl = aclUrl;\n }\n }\n\n /**\n * @param {Number} baseSequence\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateBasequence(baseSequence: number) {\n if (baseSequence && !isEqual(this.baseSequence, baseSequence)) {\n this.baseSequence = baseSequence;\n }\n }\n\n /**\n * @param {Number} sequence\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateSequence(sequence: number) {\n if (sequence && !isEqual(this.sequence, sequence)) {\n this.sequence = sequence;\n }\n }\n\n /**\n * @param {Object} membership\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateMemberShip(membership: object) {\n if (membership && !isEqual(this.membership, membership)) {\n this.membership = membership;\n }\n }\n\n /**\n * @param {Array} identities\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateIdentifiers(identities: Array<any>) {\n if (identities && !isEqual(this.identities, identities)) {\n this.identities = identities;\n }\n }\n\n /**\n * check the locus is main session's one or not, if is main session's, update main session cache\n * @param {Object} locus\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateLocusCache(locus: any) {\n const isMainSessionDTO = ControlsUtils.isMainSessionDTO(locus);\n if (isMainSessionDTO) {\n this.updateMainSessionLocusCache(locus);\n }\n }\n\n /**\n * if return from breakout to main session, need to use cached main session DTO since locus won't send the full locus (participants)\n * if join breakout from main session, need to query main locus url (if response with 403 means no privilege, need to clear the cache)\n * @param {Object} newLocus\n * @returns {Object}\n * @memberof LocusInfo\n */\n getTheLocusToUpdate(newLocus: any) {\n const switchStatus = ControlsUtils.getSessionSwitchStatus(this.controls, newLocus?.controls);\n if (switchStatus.isReturnToMain && this.mainSessionLocusCache) {\n return cloneDeep(this.mainSessionLocusCache);\n }\n if (switchStatus.isJoinToBreakout) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateControls',\n },\n LOCUSINFO.EVENTS.CONTROLS_JOIN_BREAKOUT_FROM_MAIN,\n {\n mainLocusUrl: this.url,\n }\n );\n }\n\n return newLocus;\n }\n\n /**\n * merge participants by participant id\n * @param {Array} participants\n * @param {Array} sourceParticipants\n * @returns {Array} merged participants\n * @memberof LocusInfo\n */\n // eslint-disable-next-line class-methods-use-this\n mergeParticipants(participants, sourceParticipants) {\n if (!sourceParticipants || !sourceParticipants.length) return participants;\n if (!participants || !participants.length) {\n return sourceParticipants;\n }\n sourceParticipants.forEach((participant) => {\n const existIndex = participants.findIndex((p) => p.id === participant.id);\n if (existIndex > -1) {\n participants.splice(existIndex, 1, participant);\n } else {\n participants.push(participant);\n }\n });\n\n return participants;\n }\n\n /**\n * need cache main sessions' participants since locus will not send the full list when cohost/host leave breakout\n * @param {Object} mainLocus\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateMainSessionLocusCache(mainLocus: any) {\n if (!mainLocus) {\n return;\n }\n const locusClone = cloneDeep(mainLocus);\n if (this.mainSessionLocusCache) {\n // shallow merge and do special merge for participants\n assignWith(this.mainSessionLocusCache, locusClone, (objValue, srcValue, key) => {\n if (key === 'participants') {\n return this.mergeParticipants(objValue, srcValue);\n }\n\n return srcValue || objValue;\n });\n } else {\n this.mainSessionLocusCache = locusClone;\n }\n }\n\n /**\n * clear main session cache\n * @returns {undefined}\n * @memberof LocusInfo\n */\n clearMainSessionLocusCache() {\n this.mainSessionLocusCache = null;\n }\n}\n"],"mappings":"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"}
@@ -328,6 +328,7 @@ var Meetings = /*#__PURE__*/function (_WebexPlugin) {
328
328
  var isSelfMoved = (newLocus === null || newLocus === void 0 ? void 0 : (_newLocus$self2 = newLocus.self) === null || _newLocus$self2 === void 0 ? void 0 : _newLocus$self2.state) === _constants._LEFT_ && (newLocus === null || newLocus === void 0 ? void 0 : (_newLocus$self3 = newLocus.self) === null || _newLocus$self3 === void 0 ? void 0 : _newLocus$self3.reason) === _constants._MOVED_;
329
329
  // @ts-ignore
330
330
  var deviceFromNewLocus = _util2.default.getThisDevice(newLocus, this.webex.internal.device.url);
331
+ var isResourceMovedOnThisDevice = (deviceFromNewLocus === null || deviceFromNewLocus === void 0 ? void 0 : deviceFromNewLocus.state) === _constants._LEFT_ && (deviceFromNewLocus === null || deviceFromNewLocus === void 0 ? void 0 : deviceFromNewLocus.reason) === _constants._MOVED_;
331
332
  var isNewLocusJoinThisDevice = _util2.default.joinedOnThisDevice(meeting, newLocus,
332
333
  // @ts-ignore
333
334
  this.webex.internal.device.url);
@@ -349,8 +350,12 @@ var Meetings = /*#__PURE__*/function (_WebexPlugin) {
349
350
  _loggerProxy.default.logger.log("Meetings:index#isNeedHandleMainLocus --> there is active breakout session and joined on this device, and don't need to handle main session: ".concat(breakoutUrl));
350
351
  return false;
351
352
  }
352
- if (isSelfMoved && newLocus !== null && newLocus !== void 0 && (_newLocus$self4 = newLocus.self) !== null && _newLocus$self4 !== void 0 && _newLocus$self4.removed) {
353
- _loggerProxy.default.logger.log('Meetings:index#isNeedHandleMainLocus --> self moved main locus with self removed status, not need to handle');
353
+ if (isSelfMoved && (newLocus !== null && newLocus !== void 0 && (_newLocus$self4 = newLocus.self) !== null && _newLocus$self4 !== void 0 && _newLocus$self4.removed || isResourceMovedOnThisDevice)) {
354
+ _loggerProxy.default.logger.log('Meetings:index#isNeedHandleMainLocus --> self moved main locus with self removed status or with device resource moved, not need to handle');
355
+ return false;
356
+ }
357
+ if (isSelfJoined && isResourceMovedOnThisDevice) {
358
+ _loggerProxy.default.logger.log('Meetings:index#isNeedHandleMainLocus --> self device left&moved in main locus with self joined status, not need to handle');
354
359
  return false;
355
360
  }
356
361
  _loggerProxy.default.logger.log('Meetings:index#isNeedHandleMainLocus --> this is a normal main session locusDTO update case');
@@ -1 +1 @@
1
- {"version":3,"names":["mediaLogger","MediaLogger","LoggerProxy","logger","info","log","error","warn","trace","debug","Meetings","args","MEETINGS","options","authToken","webex","credentials","supertoken","access_token","mediaHelpersModule","NoiseReductionEffect","VirtualBackgroundEffect","mediaHelpers","request","Request","parent","loggerRequest","LoggerRequest","meetingCollection","MeetingCollection","personalMeetingRoom","reachability","registered","preferredWebexSite","media","getUserMedia","Media","onReady","meeting","newLocus","breakoutUrl","controls","breakout","url","breakoutLocus","getActiveBreakoutLocus","isSelfJoined","self","state","_JOINED_","isSelfMoved","_LEFT_","reason","_MOVED_","deviceFromNewLocus","MeetingsUtil","getThisDevice","internal","device","isNewLocusJoinThisDevice","joinedOnThisDevice","isBreakoutLocusJoinThisDevice","joinedWith","correlationId","breakoutReplaceAt","replaces","length","replaceAt","newLocusReplaceAt","removed","isNewLocusAsBreakout","isBreakoutLocusDTO","fullState","active","isNeedHandleMainLocus","data","getByKey","LOCUS_URL","locusUrl","CORRELATION_ID","checkForCorrelationId","locus","SIP_URI","callbackInfo","callbackAddress","isUnifiedSpaceMeeting","undefined","CONVERSATION_URL","conversationUrl","MEETINGNUMBER","webExMeetingId","useRandomDelayForInfo","getCorrespondingMeetingByLocus","locusInfo","updateMainSessionLocusCache","isNeedHandleLocusDTO","LOCUS","STATE","INACTIVE","create","_LOCUS_ID_","then","newMeeting","initialSetup","checkHandleBreakoutLocus","catch","e","finally","getMeetingByType","_ID_","id","Metrics","postEvent","event","eventType","REMOTE_STARTED","trigger","MERCURY_EVENT","Trigger","file","function","EVENT_TRIGGERS","MEETING_ADDED","type","_MEETING_","_JOIN_","_INCOMING_","parse","envelope","LOCUSEVENT","MESSAGE_ROAP","handleLocusEvent","MEETINGS_NETWORK_DISCONNECTED","mercury","on","LOCUS_MERCURY","handleLocusMercury","ROAP","ROAP_MERCURY","handleRoapMercury","ONLINE","syncMeetings","OFFLINE","handleMercuryOffline","off","once","READY","StaticConfig","set","config","LoggerConfig","logging","setLogger","meetingInfo","experimental","enableUnifiedMeetings","MeetingInfoV2","MeetingInfo","PersonalMeetingRoom","MEETINGS_READY","checkH264Support","disableNotifications","changeState","enable","enableTurnDiscovery","enableAdhocMeetings","canAuthorize","reject","Error","resolve","all","fetchUserPreferredWebexSite","getGeoHint","startReachability","message","register","connect","call","listenForEvents","MEETINGS_REGISTERED","sendBehavioralMetric","BEHAVIORAL_METRICS","MEETINGS_REGISTRATION_SUCCESS","MEETINGS_REGISTRATION_FAILED","stack","stopListeningForEvents","disconnect","unregister","MEETINGS_UNREGISTERED","uploadLogs","uploadResult","MEETING_LOG_UPLOAD_SUCCESS","meetingId","details","uploadError","MEETING_LOG_UPLOAD_FAILURE","UPLOAD_LOGS_FAILURE","meetingsId","code","Reachability","setReachability","getReachability","gatherReachability","fetchGeoHint","res","geoHintInfo","getMeetingPreferences","parseDefaultSiteFromMeetingPreferences","user","get","userPreferences","userPreferencesItems","preferredWebExSite","MeetingUtil","cleanUp","delete","MEETING_REMOVED","destination","infoExtraParams","fetchInfoOptions","targetDest","_CONVERSATION_URL_","foundMeeting","foundMeetingIsNotCalendarMeeting","scheduledMeeting","createMeeting","createdMeeting","EVENTS","DESTROY_MEETING","payload","autoUploadLogs","callStart","lastActive","feedbackId","locusId","destroy","REQUEST_UPLOAD_LOGS","meetingInstance","Meeting","userId","deviceUrl","orgId","meetingInfoProvider","destinationType","waitingTime","startTime","startTimeDate","Date","startTimeDatestamp","getTime","timeToStart","maxWaitingTime","Math","max","min","MAX_RANDOM_DELAY_FOR_MEETING_INFO","round","random","isMeetingActive","fetchMeetingInfoTimeoutId","setTimeout","fetchMeetingInfo","extraParams","parseMeetingInfo","CaptchaError","PasswordError","PermissionError","sipUri","setSipUri","meetingAddedType","getMeetingAddedType","value","getAll","getActiveMeetings","locusArray","activeLocusUrl","loci","lociToUpdate","sortLocusArrayToUpdate","forEach","push","meetingsCollection","includes","MEETING_REMOVED_REASON","NO_MEETINGS_TO_SYNC","mainLoci","filter","breakoutLoci","isValidBreakoutLocus","breakoutLocusForHandleLater","associateMainLocus","find","mainLocus","existCorrespondingMeeting","newCreatedLocus","existIndex","findIndex","associateBreakoutLocus","splice","scheduled","WebexPlugin"],"sources":["index.ts"],"sourcesContent":["/* eslint no-shadow: [\"error\", { \"allow\": [\"eventType\"] }] */\n\nimport '@webex/internal-plugin-mercury';\nimport '@webex/internal-plugin-conversation';\n// @ts-ignore\nimport {WebexPlugin} from '@webex/webex-core';\nimport {setLogger} from '@webex/internal-media-core';\n\nimport * as mediaHelpersModule from '@webex/media-helpers';\n\nimport 'webrtc-adapter';\n\nimport Metrics from '../metrics';\nimport {trigger, eventType} from '../metrics/config';\nimport LoggerConfig from '../common/logs/logger-config';\nimport StaticConfig from '../common/config';\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport LoggerRequest from '../common/logs/request';\nimport Trigger from '../common/events/trigger-proxy';\nimport Media from '../media';\nimport MeetingUtil from '../meeting/util';\nimport {\n MEETINGS,\n EVENTS,\n EVENT_TRIGGERS,\n READY,\n LOCUSEVENT,\n LOCUS_URL,\n MAX_RANDOM_DELAY_FOR_MEETING_INFO,\n ROAP,\n ONLINE,\n OFFLINE,\n _MEETING_,\n _JOIN_,\n _LOCUS_ID_,\n _INCOMING_,\n LOCUS,\n CORRELATION_ID,\n SIP_URI,\n _LEFT_,\n _ID_,\n MEETING_REMOVED_REASON,\n _CONVERSATION_URL_,\n CONVERSATION_URL,\n MEETINGNUMBER,\n _JOINED_,\n _MOVED_,\n} from '../constants';\nimport BEHAVIORAL_METRICS from '../metrics/constants';\nimport MeetingInfo from '../meeting-info';\nimport MeetingInfoV2 from '../meeting-info/meeting-info-v2';\nimport Meeting from '../meeting';\nimport PersonalMeetingRoom from '../personal-meeting-room';\nimport Reachability from '../reachability';\nimport Request from './request';\nimport PasswordError from '../common/errors/password-error';\nimport CaptchaError from '../common/errors/captcha-error';\n\nimport MeetingCollection from './collection';\nimport MeetingsUtil from './util';\nimport PermissionError from '../common/errors/permission';\nimport {INoiseReductionEffect, IVirtualBackgroundEffect} from './meetings.types';\n\nlet mediaLogger;\n\nclass MediaLogger {\n info(...args) {\n LoggerProxy.logger.info(...args);\n }\n\n log(...args) {\n LoggerProxy.logger.log(...args);\n }\n\n error(...args) {\n LoggerProxy.logger.error(...args);\n }\n\n warn(...args) {\n LoggerProxy.logger.warn(...args);\n }\n\n trace(...args) {\n LoggerProxy.logger.trace(...args);\n }\n\n debug(...args) {\n LoggerProxy.logger.debug(...args);\n }\n}\n/**\n * Meetings Ready Event\n * Emitted when the meetings instance on webex is ready\n * @event meetings:ready\n * @instance\n * @memberof Meetings\n */\n\n/**\n * Meetings Network Disconnected Event\n * Emitted when the meetings instance is disconnected from\n * the internal mercury server\n * @event network:disconnected\n * @instance\n * @memberof Meetings\n */\n\n/**\n * Meetings Registered Event\n * Emitted when the meetings instance has been registered and listening\n * @event meetings:registered\n * @instance\n * @memberof Meetings\n */\n\n/**\n * Meeting Removed Event\n * Emitted when a meeting was removed from the cache of meetings\n * @event meeting:removed\n * @instance\n * @type {Object}\n * @property {String} meetingId the removed meeting\n * @property {Object} response the server response\n * @property {String} type what type of meeting it was\n * @memberof Meetings\n */\n\n/**\n * Meeting Added Event\n * Emitted when a meeting was added to the cache of meetings\n * @event meeting:added\n * @instance\n * @type {Object}\n * @property {String} meetingId the added meeting\n * @property {String} type what type of meeting it was\n * @memberof Meetings\n */\n\n/**\n * Maintain a cache of meetings and sync with services.\n * @class\n */\nexport default class Meetings extends WebexPlugin {\n loggerRequest: any;\n media: any;\n meetingCollection: any;\n personalMeetingRoom: any;\n preferredWebexSite: any;\n reachability: any;\n registered: any;\n request: any;\n geoHintInfo: any;\n meetingInfo: any;\n mediaHelpers: any;\n breakoutLocusForHandleLater: any;\n namespace = MEETINGS;\n\n /**\n * Initializes the Meetings Plugin\n * @constructor\n * @public\n * @memberof Meetings\n */\n constructor(...args) {\n super(...args);\n\n /**\n * The webrtc-core media helpers. This is a temporary solution required for the SDK sample app\n * to be able to call media helper functions.\n *\n * @instance\n * @type {Object}\n * @private\n * @memberof Meetings\n */\n this.mediaHelpers = mediaHelpersModule;\n\n /**\n * The Meetings request to interact with server\n * @instance\n * @type {Object}\n * @private\n * @memberof Meetings\n */\n // @ts-ignore\n this.request = new Request({}, {parent: this.webex});\n /**\n * Log upload request helper\n * @instance\n * @type {Object}\n * @private\n * @memberof Meetings\n */\n // @ts-ignore\n this.loggerRequest = new LoggerRequest({webex: this.webex});\n this.meetingCollection = new MeetingCollection();\n /**\n * The PersonalMeetingRoom object to interact with server\n * @instance\n * @type {Object}\n * @public\n * @memberof Meetings\n */\n this.personalMeetingRoom = null;\n /**\n * The Reachability object to interact with server, starts as null until {@link Meeting#setReachability} is called\n * starts as null\n * @instance\n * @type {Object}\n * @private\n * @memberof Meetings\n */\n this.reachability = null;\n\n /**\n * If the meetings plugin has been registered and listening via {@link Meetings#register}\n * @instance\n * @type {Boolean}\n * @public\n * @memberof Meetings\n */\n this.registered = false;\n\n /**\n * This values indicates the preferred webex site the user will start there meeting, getsits value from {@link Meetings#register}\n * @instance\n * @type {String}\n * @private\n * @memberof Meetings\n */\n this.preferredWebexSite = '';\n\n /**\n * The public interface for the internal Media util files. These are helpful to expose outside the context\n * of a meeting so that a user can access media without creating a meeting instance.\n * @instance\n * @type {Object}\n * @private\n * @memberof Meetings\n */\n this.media = {\n getUserMedia: Media.getUserMedia,\n };\n\n this.onReady();\n }\n\n /**\n * check whether you need to handle this main session's locus data or not\n * @param {Object} meeting current meeting data\n * @param {Object} newLocus new locus data\n * @returns {boolean}\n * @private\n * @memberof Meetings\n */\n private isNeedHandleMainLocus(meeting: any, newLocus: any) {\n const breakoutUrl = newLocus.controls?.breakout?.url;\n const breakoutLocus = this.meetingCollection.getActiveBreakoutLocus(breakoutUrl);\n\n const isSelfJoined = newLocus?.self?.state === _JOINED_;\n const isSelfMoved = newLocus?.self?.state === _LEFT_ && newLocus?.self?.reason === _MOVED_;\n // @ts-ignore\n const deviceFromNewLocus = MeetingsUtil.getThisDevice(newLocus, this.webex.internal.device.url);\n const isNewLocusJoinThisDevice = MeetingsUtil.joinedOnThisDevice(\n meeting,\n newLocus,\n // @ts-ignore\n this.webex.internal.device.url\n );\n const isBreakoutLocusJoinThisDevice =\n breakoutLocus?.joinedWith?.correlationId &&\n breakoutLocus.joinedWith.correlationId === meeting?.correlationId;\n\n if (isSelfJoined && isNewLocusJoinThisDevice) {\n LoggerProxy.logger.log(\n 'Meetings:index#isNeedHandleMainLocus --> self this device shown as JOINED in the main session'\n );\n if (breakoutLocus?.joinedWith && deviceFromNewLocus) {\n const breakoutReplaceAt =\n breakoutLocus.joinedWith.replaces?.length > 0\n ? breakoutLocus.joinedWith.replaces[0].replaceAt\n : '';\n const newLocusReplaceAt =\n deviceFromNewLocus.replaces?.length > 0 ? deviceFromNewLocus.replaces[0].replaceAt : '';\n if (breakoutReplaceAt && newLocusReplaceAt && breakoutReplaceAt > newLocusReplaceAt) {\n LoggerProxy.logger.log(\n `Meetings:index#isNeedHandleMainLocus --> this is expired main joined status locus_dto replacedAt ${newLocusReplaceAt} bo replacedAt ${breakoutReplaceAt}`\n );\n\n return false;\n }\n }\n\n return true;\n }\n if (isBreakoutLocusJoinThisDevice) {\n LoggerProxy.logger.log(\n `Meetings:index#isNeedHandleMainLocus --> there is active breakout session and joined on this device, and don't need to handle main session: ${breakoutUrl}`\n );\n\n return false;\n }\n if (isSelfMoved && newLocus?.self?.removed) {\n LoggerProxy.logger.log(\n 'Meetings:index#isNeedHandleMainLocus --> self moved main locus with self removed status, not need to handle'\n );\n\n return false;\n }\n LoggerProxy.logger.log(\n 'Meetings:index#isNeedHandleMainLocus --> this is a normal main session locusDTO update case'\n );\n\n return true;\n }\n\n /**\n * check whether you need to handle this locus data or not\n * @param {Object} meeting old locus data\n * @param {Object} newLocus new locus data\n * @returns {boolean}\n * @private\n * @memberof Meetings\n */\n private isNeedHandleLocusDTO(meeting: any, newLocus: any) {\n if (newLocus) {\n const isNewLocusAsBreakout = MeetingsUtil.isBreakoutLocusDTO(newLocus);\n const isSelfMoved = newLocus?.self?.state === _LEFT_ && newLocus?.self?.reason === _MOVED_;\n if (!meeting) {\n if (isNewLocusAsBreakout) {\n LoggerProxy.logger.log(\n `Meetings:index#isNeedHandleLocusDTO --> the first breakout session locusDTO active status: ${newLocus.fullState?.active}`\n );\n\n return newLocus.self?.state === _JOINED_;\n }\n\n return this.isNeedHandleMainLocus(meeting, newLocus);\n }\n if (!isNewLocusAsBreakout) {\n return this.isNeedHandleMainLocus(meeting, newLocus);\n }\n\n return !isSelfMoved;\n }\n\n return true;\n }\n\n /**\n * get corresponding meeting object by locus data\n * @param {Object} data a locus event\n * @param {String} data.locusUrl\n * @param {Object} data.locus\n * @returns {Object}\n * @private\n * @memberof Meetings\n */\n getCorrespondingMeetingByLocus(data) {\n // getting meeting by correlationId. This will happen for the new event\n // Either the locus\n // TODO : Add check for the callBack Address\n return (\n this.meetingCollection.getByKey(LOCUS_URL, data.locusUrl) ||\n // @ts-ignore\n this.meetingCollection.getByKey(\n CORRELATION_ID,\n // @ts-ignore\n MeetingsUtil.checkForCorrelationId(this.webex.internal.device.url, data.locus)\n ) ||\n this.meetingCollection.getByKey(\n SIP_URI,\n data.locus.self &&\n data.locus.self.callbackInfo &&\n data.locus.self.callbackInfo.callbackAddress\n ) ||\n (data.locus.info?.isUnifiedSpaceMeeting\n ? undefined\n : this.meetingCollection.getByKey(CONVERSATION_URL, data.locus.conversationUrl)) ||\n this.meetingCollection.getByKey(MEETINGNUMBER, data.locus?.info?.webExMeetingId)\n );\n }\n\n /**\n * handle locus events and takes meeting actions with them as they come in\n * @param {Object} data a locus event\n * @param {String} data.locusUrl\n * @param {Object} data.locus\n * @param {Boolean} useRandomDelayForInfo whether a random delay should be added to fetching meeting info\n * @param {String} data.eventType\n * @returns {undefined}\n * @private\n * @memberof Meetings\n */\n private handleLocusEvent(data: {locusUrl: string; locus: any}, useRandomDelayForInfo = false) {\n let meeting = this.getCorrespondingMeetingByLocus(data);\n\n // Special case when locus has got replaced, This only happend once if a replace locus exists\n // https://sqbu-github.cisco.com/WebExSquared/locus/wiki/Locus-changing-mid-call\n\n if (!meeting && data.locus?.replaces?.length > 0) {\n // Always the last element in the replace is the active one\n meeting = this.meetingCollection.getByKey(\n LOCUS_URL,\n data.locus.replaces[data.locus.replaces.length - 1].locusUrl\n );\n }\n\n if (meeting && !MeetingsUtil.isBreakoutLocusDTO(data.locus)) {\n meeting.locusInfo.updateMainSessionLocusCache(data.locus);\n }\n if (!this.isNeedHandleLocusDTO(meeting, data.locus)) {\n LoggerProxy.logger.log(\n `Meetings:index#handleLocusEvent --> doesn't need to process locus event`\n );\n\n return;\n }\n if (!meeting) {\n // TODO: create meeting when we get a meeting object\n // const checkForEnded = (locus) => {\n // TODO: you already ended the meeting but you got an event later\n // Mainly for 1:1 Callsor meeting\n // Happens mainly after refresh\n\n // 1:1 Meeting\n // 1) You ended a call before but you got a mercury event\n // Make sure end the call and cleanup the meeting only if the mercury\n // event says so\n // 2) Maintain lastSync time in the meetings object which helps to compare\n // If the meeting came befor or after the sync . ANy meeting start time before the sync time is invalid\n\n // For space Meeting\n // Check the locus object and see who has joined\n\n // };\n // rather then locus object change to locus url\n\n if (\n data.locus &&\n data.locus.fullState &&\n data.locus.fullState.state === LOCUS.STATE.INACTIVE\n ) {\n // just ignore the event as its already ended and not active\n LoggerProxy.logger.warn(\n 'Meetings:index#handleLocusEvent --> Locus event received for meeting, after it was ended.'\n );\n\n return;\n }\n\n // When its wireless share or guest and user leaves the meeting we dont have to keep the meeting object\n // Any future events will be neglected\n\n if (\n data.locus &&\n data.locus.self &&\n data.locus.self.state === _LEFT_ &&\n data.locus.self.removed === true\n ) {\n // just ignore the event as its already ended and not active\n LoggerProxy.logger.warn(\n 'Meetings:index#handleLocusEvent --> Locus event received for meeting, after it was ended.'\n );\n\n return;\n }\n\n this.create(data.locus, _LOCUS_ID_, useRandomDelayForInfo)\n .then((newMeeting) => {\n meeting = newMeeting;\n\n // It's a new meeting so initialize the locus data\n meeting.locusInfo.initialSetup(data.locus);\n this.checkHandleBreakoutLocus(data.locus);\n })\n .catch((e) => {\n LoggerProxy.logger.error(e);\n })\n .finally(() => {\n // There will be cases where locus event comes in gets created and deleted because its a 1:1 and meeting gets deleted\n // because the other user left so before sending 'added' event make sure it exists in the collection\n\n if (this.getMeetingByType(_ID_, meeting.id)) {\n Metrics.postEvent({\n event: eventType.REMOTE_STARTED,\n meeting,\n data: {trigger: trigger.MERCURY_EVENT},\n });\n Trigger.trigger(\n this,\n {\n file: 'meetings',\n function: 'handleLocusEvent',\n },\n EVENT_TRIGGERS.MEETING_ADDED,\n {\n meeting,\n type: meeting.type === _MEETING_ ? _JOIN_ : _INCOMING_,\n }\n );\n } else {\n // Meeting got added but was not found in the collection. It might have got destroyed\n LoggerProxy.logger.warn(\n 'Meetings:index#handleLocusEvent --> Created and destroyed meeting object before sending an event'\n );\n }\n });\n } else {\n meeting.locusInfo.parse(meeting, data);\n }\n }\n\n /**\n * handles locus events through mercury that are not roap\n * @param {Object} envelope\n * @param {Object} envelope.data\n * @param {String} envelope.data.eventType\n * @returns {undefined}\n * @private\n * @memberof Meetings\n */\n private handleLocusMercury(envelope: {data: any}) {\n const {data} = envelope;\n // eslint-disable-next-line @typescript-eslint/no-shadow\n const {eventType} = data;\n\n if (eventType && eventType !== LOCUSEVENT.MESSAGE_ROAP) {\n this.handleLocusEvent(data, true);\n }\n }\n\n /**\n * handles mecury offline event\n * @returns {undefined}\n * @private\n * @memberof Meetings\n */\n private handleMercuryOffline() {\n Trigger.trigger(\n this,\n {\n file: 'meetings/index',\n function: 'handleMercuryOffline',\n },\n EVENT_TRIGGERS.MEETINGS_NETWORK_DISCONNECTED\n );\n }\n\n /**\n * registers for locus and roap mercury events\n * @returns {undefined}\n * @private\n * @memberof Meetings\n */\n private listenForEvents() {\n // @ts-ignore\n this.webex.internal.mercury.on(LOCUSEVENT.LOCUS_MERCURY, (envelope) => {\n this.handleLocusMercury(envelope);\n });\n // @ts-ignore\n this.webex.internal.mercury.on(ROAP.ROAP_MERCURY, (envelope) => {\n MeetingsUtil.handleRoapMercury(envelope, this.meetingCollection);\n });\n\n // @ts-ignore\n this.webex.internal.mercury.on(ONLINE, () => {\n this.syncMeetings();\n });\n\n // @ts-ignore\n this.webex.internal.mercury.on(OFFLINE, () => {\n this.handleMercuryOffline();\n });\n }\n\n /**\n * stops listening for locus and roap mercury events\n * @returns {undefined}\n * @private\n * @memberof Meetings\n */\n private stopListeningForEvents() {\n // @ts-ignore\n this.webex.internal.mercury.off(LOCUSEVENT.LOCUS_MERCURY);\n // @ts-ignore\n this.webex.internal.mercury.off(ROAP.ROAP_MERCURY);\n // @ts-ignore\n this.webex.internal.mercury.off(ONLINE);\n }\n\n /**\n * @returns {undefined}\n * @private\n * @memberof Meetings\n */\n private onReady() {\n // @ts-ignore\n this.webex.once(READY, () => {\n // @ts-ignore\n StaticConfig.set(this.config);\n // @ts-ignore\n LoggerConfig.set(this.config.logging);\n // @ts-ignore\n LoggerProxy.set(this.webex.logger);\n\n mediaLogger = new MediaLogger();\n setLogger(mediaLogger);\n\n /**\n * The MeetingInfo object to interact with server\n * @instance\n * @type {Object}\n * @private\n * @memberof Meetings\n */\n // @ts-ignore\n this.meetingInfo = this.config.experimental.enableUnifiedMeetings\n ? // @ts-ignore\n new MeetingInfoV2(this.webex)\n : // @ts-ignore\n new MeetingInfo(this.webex);\n // @ts-ignore\n this.personalMeetingRoom = new PersonalMeetingRoom(\n {meetingInfo: this.meetingInfo},\n // @ts-ignore\n {parent: this.webex}\n );\n\n Trigger.trigger(\n this,\n {\n file: 'meetings',\n function: 'onReady',\n },\n EVENT_TRIGGERS.MEETINGS_READY\n );\n\n MeetingsUtil.checkH264Support({disableNotifications: true});\n // @ts-ignore\n Metrics.initialSetup(this.meetingCollection, this.webex);\n });\n }\n\n /**\n * API to toggle unified meetings\n * @param {Boolean} changeState\n * @private\n * @memberof Meetings\n * @returns {undefined}\n */\n private _toggleUnifiedMeetings(changeState: boolean) {\n if (typeof changeState !== 'boolean') {\n return;\n }\n // @ts-ignore\n if (this.config?.experimental?.enableUnifiedMeetings !== changeState) {\n // @ts-ignore\n this.config.experimental.enableUnifiedMeetings = changeState;\n // @ts-ignore\n this.meetingInfo = changeState ? new MeetingInfoV2(this.webex) : new MeetingInfo(this.webex);\n }\n }\n\n /**\n * API to enable or disable TURN discovery\n * @param {Boolean} enable\n * @private\n * @memberof Meetings\n * @returns {undefined}\n */\n private _toggleTurnDiscovery(enable: boolean) {\n if (typeof enable !== 'boolean') {\n return;\n }\n // @ts-ignore\n this.config.experimental.enableTurnDiscovery = enable;\n }\n\n /**\n * API to toggle starting adhoc meeting\n * @param {Boolean} changeState\n * @private\n * @memberof Meetings\n * @returns {undefined}\n */\n private _toggleAdhocMeetings(changeState: boolean) {\n if (typeof changeState !== 'boolean') {\n return;\n }\n // @ts-ignore\n if (this.config?.experimental?.enableAdhocMeetings !== changeState) {\n // @ts-ignore\n this.config.experimental.enableAdhocMeetings = changeState;\n }\n }\n\n /**\n * Explicitly sets up the meetings plugin by registering\n * the device, connecting to mercury, and listening for locus events.\n *\n * @returns {Promise}\n * @public\n * @memberof Meetings\n */\n public register() {\n // @ts-ignore\n if (!this.webex.canAuthorize) {\n LoggerProxy.logger.error(\n 'Meetings:index#register --> ERROR, Unable to register, SDK cannot authorize'\n );\n\n return Promise.reject(new Error('SDK cannot authorize'));\n }\n\n if (this.registered) {\n LoggerProxy.logger.info(\n 'Meetings:index#register --> INFO, Meetings plugin already registered'\n );\n\n return Promise.resolve();\n }\n\n return Promise.all([\n this.fetchUserPreferredWebexSite(),\n this.getGeoHint(),\n this.startReachability().catch((error) => {\n LoggerProxy.logger.error(`Meetings:index#register --> GDM error, ${error.message}`);\n }),\n // @ts-ignore\n this.webex.internal.device\n .register()\n // @ts-ignore\n .then(() =>\n LoggerProxy.logger.info(\n // @ts-ignore\n `Meetings:index#register --> INFO, Device registered ${this.webex.internal.device.url}`\n )\n )\n // @ts-ignore\n .then(() => this.webex.internal.mercury.connect()),\n MeetingsUtil.checkH264Support.call(this),\n ])\n .then(() => {\n this.listenForEvents();\n Trigger.trigger(\n this,\n {\n file: 'meetings',\n function: 'register',\n },\n EVENT_TRIGGERS.MEETINGS_REGISTERED\n );\n this.registered = true;\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.MEETINGS_REGISTRATION_SUCCESS);\n })\n .catch((error) => {\n LoggerProxy.logger.error(\n `Meetings:index#register --> ERROR, Unable to register, ${error.message}`\n );\n\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.MEETINGS_REGISTRATION_FAILED, {\n reason: error.message,\n stack: error.stack,\n });\n\n return Promise.reject(error);\n });\n }\n\n /**\n * Explicitly tears down the meetings plugin by deregistering\n * the device, disconnecting from mercury, and stops listening to locus events\n *\n * @returns {Promise}\n * @public\n * @memberof Meetings\n */\n unregister() {\n if (!this.registered) {\n LoggerProxy.logger.info(\n 'Meetings:index#unregister --> INFO, Meetings plugin already unregistered'\n );\n\n return Promise.resolve();\n }\n\n this.stopListeningForEvents();\n\n return (\n // @ts-ignore\n this.webex.internal.mercury\n .disconnect()\n // @ts-ignore\n .then(() => this.webex.internal.device.unregister())\n .then(() => {\n Trigger.trigger(\n this,\n {\n file: 'meetings',\n function: 'unregister',\n },\n EVENT_TRIGGERS.MEETINGS_UNREGISTERED\n );\n this.registered = false;\n })\n );\n }\n\n /**\n * Creates a noise reduction effect\n *\n * @param {INoiseReductionEffect} options optional custom effect options\n * @returns {Promise<effect>} noise reduction effect.\n * @public\n * @memberof Meetings\n */\n createNoiseReductionEffect = async (options?: INoiseReductionEffect) => {\n // @ts-ignore\n const authToken = this.webex.credentials.supertoken.access_token;\n\n return new mediaHelpersModule.NoiseReductionEffect({authToken, ...options});\n };\n\n /**\n * Creates a virtual background effect\n *\n * @param {IVirtualBackgroundEffect} options optional custom effect options\n * @returns {Promise<effect>} virtual background effect.\n * @public\n * @memberof Meetings\n */\n createVirtualBackgroundEffect = async (options?: IVirtualBackgroundEffect) => {\n // @ts-ignore\n const authToken = this.webex.credentials.supertoken.access_token;\n\n return new mediaHelpersModule.VirtualBackgroundEffect({authToken, ...options});\n };\n\n /**\n * Uploads logs to the webex services for tracking\n * @param {Object} [options={}]\n * @param {String} [options.callStart] Call Start Time\n * @param {String} [options.feedbackId] ID used for tracking\n * @param {String} [options.locusId]\n * @param {String} [options.correlationId]\n * @param {String} [options.meetingId] webex meeting ID\n * @param {String} [options.userId] userId\n * @param {String} [options.orgId] org id\n * @returns {String} feedback ID logs were submitted under\n */\n uploadLogs(\n options: {\n callStart?: string;\n feedbackId?: string;\n locusId?: string;\n correlationId?: string;\n meetingId?: string;\n userId?: string;\n orgId?: string;\n } = {}\n ) {\n LoggerProxy.logger.info('Meetings:index#uploadLogs --> uploading logs');\n\n return this.loggerRequest\n .uploadLogs(options)\n .then((uploadResult) => {\n LoggerProxy.logger.info(\n 'Meetings:index#uploadLogs --> Upload logs for meeting completed.',\n uploadResult\n );\n Trigger.trigger(\n this,\n {\n file: 'meetings',\n function: 'uploadLogs',\n },\n EVENT_TRIGGERS.MEETING_LOG_UPLOAD_SUCCESS,\n {\n meetingId: options.meetingId,\n details: uploadResult,\n }\n );\n\n return uploadResult;\n })\n .catch((uploadError) => {\n LoggerProxy.logger.error(\n 'Meetings:index#uploadLogs --> Unable to upload logs for meeting',\n uploadError\n );\n Trigger.trigger(\n this,\n {\n file: 'meetings',\n function: 'uploadLogs',\n },\n EVENT_TRIGGERS.MEETING_LOG_UPLOAD_FAILURE,\n {\n meetingId: options.meetingId,\n reason: uploadError,\n }\n );\n\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.UPLOAD_LOGS_FAILURE, {\n // @ts-ignore - seems like typo\n meetingId: options.meetingsId,\n reason: uploadError.message,\n stack: uploadError.stack,\n code: uploadError.code,\n });\n });\n }\n\n /**\n * initializes the reachability instance for Meetings\n * @returns {undefined}\n * @public\n * @memberof Meetings\n */\n setReachability() {\n // @ts-ignore\n this.reachability = new Reachability(this.webex);\n }\n\n /**\n * gets the reachability instance for Meetings\n * @returns {Reachability}\n * @public\n * @memberof Meetings\n */\n getReachability() {\n return this.reachability;\n }\n\n /**\n * initializes and starts gathering reachability for Meetings\n * @returns {Promise}\n * @public\n * @memberof Meetings\n */\n startReachability() {\n if (!this.reachability) {\n this.setReachability();\n }\n\n return this.getReachability().gatherReachability();\n }\n\n /**\n * Get geoHint for info for meetings\n * @returns {Promise}\n * @private\n * @memberof Meetings\n */\n getGeoHint() {\n return this.request.fetchGeoHint().then((res) => {\n this.geoHintInfo = res;\n });\n }\n\n /**\n * Fetch user preferred webex site information\n * This also has other infomation about the user\n * @returns {Promise}\n * @private\n * @memberof Meetings\n */\n fetchUserPreferredWebexSite() {\n return this.request.getMeetingPreferences().then((res) => {\n if (res) {\n this.preferredWebexSite = MeetingsUtil.parseDefaultSiteFromMeetingPreferences(res);\n }\n\n // fall back to getting the preferred site from the user information\n if (!this.preferredWebexSite) {\n // @ts-ignore\n return this.webex.internal.user\n .get()\n .then((user) => {\n const preferredWebexSite =\n user?.userPreferences?.userPreferencesItems?.preferredWebExSite;\n if (preferredWebexSite) {\n this.preferredWebexSite = preferredWebexSite;\n } else {\n throw new Error('site not found');\n }\n })\n .catch(() => {\n LoggerProxy.logger.error(\n 'Failed to fetch preferred site from user - no site will be set'\n );\n });\n }\n\n return Promise.resolve();\n });\n }\n\n /**\n * gets the personal meeting room instance, for saved PMR values for this user\n * @returns {PersonalMeetingRoom}\n * @public\n * @memberof Meetings\n */\n\n getPersonalMeetingRoom() {\n return this.personalMeetingRoom;\n }\n\n /**\n * @param {Meeting} meeting\n * @param {Object} reason\n * @param {String} type\n * @returns {Undefined}\n * @private\n * @memberof Meetings\n */\n private destroy(meeting: Meeting, reason: object) {\n MeetingUtil.cleanUp(meeting);\n this.meetingCollection.delete(meeting.id);\n Trigger.trigger(\n this,\n {\n file: 'meetings',\n function: 'destroy',\n },\n EVENT_TRIGGERS.MEETING_REMOVED,\n {\n meetingId: meeting.id,\n reason,\n }\n );\n }\n\n /**\n * Create a meeting.\n * @param {string} destination - sipURL, spaceId, phonenumber, or locus object}\n * @param {string} [type] - the optional specified type, such as locusId\n * @param {Boolean} useRandomDelayForInfo - whether a random delay should be added to fetching meeting info\n * @param {Object} infoExtraParams extra parameters to be provided when fetching meeting info\n * @returns {Promise<Meeting>} A new Meeting.\n * @public\n * @memberof Meetings\n */\n public create(\n destination: string,\n type: string = null,\n useRandomDelayForInfo = false,\n infoExtraParams = {}\n ) {\n // TODO: type should be from a dictionary\n\n // Validate meeting information based on the provided destination and\n // type. This must be performed prior to determining if the meeting is\n // found in the collection, as we mutate the destination for hydra person\n // id values.\n return (\n this.meetingInfo\n .fetchInfoOptions(destination, type)\n // Catch a failure to fetch info options.\n .catch((error) => {\n LoggerProxy.logger.info(\n `Meetings:index#create --> INFO, unable to determine info options: ${error.message}`\n );\n })\n .then((options: any = {}) => {\n // Normalize the destination.\n const targetDest = options.destination || destination;\n\n // check for the conversation URL then sip Url\n let meeting = null;\n\n if (type === _CONVERSATION_URL_ || options.type === _CONVERSATION_URL_) {\n const foundMeeting = this.meetingCollection.getByKey(CONVERSATION_URL, targetDest);\n\n if (foundMeeting) {\n const foundMeetingIsNotCalendarMeeting = !foundMeeting.locusInfo.scheduledMeeting;\n\n // If the found meeting is not a calendar meeting, return that meeting.\n // This allows for the creation of instant-meetings when calendar meetings are present.\n if (foundMeetingIsNotCalendarMeeting) {\n meeting = foundMeeting;\n }\n }\n }\n\n // Attempt to collect the meeting if it exists.\n if (!meeting) {\n meeting = this.meetingCollection.getByKey(SIP_URI, targetDest);\n }\n\n // Validate if a meeting was found.\n if (!meeting) {\n // Create a meeting based on the normalized destination and type.\n return this.createMeeting(\n targetDest,\n type,\n useRandomDelayForInfo,\n infoExtraParams\n ).then((createdMeeting: any) => {\n // If the meeting was successfully created.\n if (createdMeeting && createdMeeting.on) {\n // Create a destruction event for the meeting.\n createdMeeting.on(EVENTS.DESTROY_MEETING, (payload) => {\n // @ts-ignore\n if (this.config.autoUploadLogs) {\n this.uploadLogs({\n callStart: createdMeeting.locusInfo?.fullState?.lastActive,\n correlationId: createdMeeting.correlationId,\n feedbackId: createdMeeting.correlationId,\n locusId: createdMeeting.locusId,\n meetingId: createdMeeting.locusInfo?.info?.webExMeetingId,\n }).then(() => this.destroy(createdMeeting, payload.reason));\n } else {\n this.destroy(createdMeeting, payload.reason);\n }\n });\n\n createdMeeting.on(EVENTS.REQUEST_UPLOAD_LOGS, (meetingInstance) => {\n // @ts-ignore\n if (this.config.autoUploadLogs) {\n this.uploadLogs({\n callStart: meetingInstance?.locusInfo?.fullState?.lastActive,\n correlationId: meetingInstance.correlationId,\n feedbackId: meetingInstance.correlationId,\n locusId: meetingInstance.locusId,\n meetingId: meetingInstance.locusInfo?.info?.webExMeetingId,\n });\n }\n });\n } else {\n LoggerProxy.logger.error(\n `Meetings:index#create --> ERROR, meeting does not have on method, will not be destroyed, meeting cleanup impossible for meeting: ${meeting}`\n );\n }\n\n // Return the newly created meeting.\n return Promise.resolve(createdMeeting);\n });\n }\n\n // Return the existing meeting.\n return Promise.resolve(meeting);\n })\n );\n }\n\n /**\n * @param {String} destination see create()\n * @param {String} type see create()\n * @param {Boolean} useRandomDelayForInfo whether a random delay should be added to fetching meeting info\n * @param {Object} infoExtraParams extra parameters to be provided when fetching meeting info\n * @returns {Promise} a new meeting instance complete with meeting info and destination\n * @private\n * @memberof Meetings\n */\n private async createMeeting(\n destination: any,\n type: string = null,\n useRandomDelayForInfo = false,\n infoExtraParams = {}\n ) {\n const meeting = new Meeting(\n {\n // @ts-ignore\n userId: this.webex.internal.device.userId,\n // @ts-ignore\n deviceUrl: this.webex.internal.device.url,\n // @ts-ignore\n orgId: this.webex.internal.device.orgId,\n locus: type === _LOCUS_ID_ ? destination : null, // pass the locus object if present\n meetingInfoProvider: this.meetingInfo,\n destination,\n destinationType: type,\n },\n {\n // @ts-ignore\n parent: this.webex,\n }\n );\n\n this.meetingCollection.set(meeting);\n\n try {\n // if no participant has joined the scheduled meeting (meaning meeting is not active) and we get a locusEvent,\n // it means the meeting will start in 5-6 min. In that case, we want to fetchMeetingInfo\n // between 5 and 2 min (random between 3 minutes) before the meeting starts\n // to avoid a spike in traffic to the wbxappi service\n let waitingTime = 0;\n\n if (destination.meeting) {\n const {startTime} = destination.meeting;\n const startTimeDate = new Date(startTime);\n const startTimeDatestamp = startTimeDate.getTime();\n const timeToStart = startTimeDatestamp - Date.now();\n const maxWaitingTime = Math.max(\n Math.min(timeToStart, MAX_RANDOM_DELAY_FOR_MEETING_INFO),\n 0\n );\n\n waitingTime = Math.round(Math.random() * maxWaitingTime);\n }\n const isMeetingActive = !!destination.fullState?.active;\n // @ts-ignore\n const {enableUnifiedMeetings} = this.config.experimental;\n\n if (enableUnifiedMeetings && !isMeetingActive && useRandomDelayForInfo && waitingTime > 0) {\n meeting.fetchMeetingInfoTimeoutId = setTimeout(\n () => meeting.fetchMeetingInfo({extraParams: infoExtraParams}),\n waitingTime\n );\n meeting.parseMeetingInfo(undefined, destination);\n } else {\n await meeting.fetchMeetingInfo({extraParams: infoExtraParams});\n }\n } catch (err) {\n if (\n !(err instanceof CaptchaError) &&\n !(err instanceof PasswordError) &&\n !(err instanceof PermissionError)\n ) {\n // if there is no meeting info we assume its a 1:1 call or wireless share\n LoggerProxy.logger.info(\n `Meetings:index#createMeeting --> Info Unable to fetch meeting info for ${destination}.`\n );\n LoggerProxy.logger.info(\n 'Meetings:index#createMeeting --> Info assuming this destination is a 1:1 or wireless share'\n );\n }\n LoggerProxy.logger.debug(\n `Meetings:index#createMeeting --> Debug ${err} fetching /meetingInfo for creation.`\n );\n } finally {\n // For type LOCUS_ID we need to parse the locus object to get the information\n // about the caller and callee\n // Meeting Added event will be created in `handleLocusEvent`\n if (type !== _LOCUS_ID_) {\n if (!meeting.sipUri) {\n meeting.setSipUri(destination);\n }\n\n // TODO: check if we have to move this to parser\n const meetingAddedType = MeetingsUtil.getMeetingAddedType(type);\n\n // We typically shouldn't need to trigger both and event and return a promise.\n // Is this a special case? We want to make the public API usage as simple as possible.\n Trigger.trigger(\n this,\n {\n file: 'meetings',\n function: 'createMeeting',\n },\n EVENT_TRIGGERS.MEETING_ADDED,\n {\n meeting,\n type: meetingAddedType,\n }\n );\n }\n }\n\n return meeting;\n\n // Create the meeting calling the necessary service endpoints.\n\n // Internally, there are many more destinations:\n //\n // - locusID\n // - meetingURL\n // - globalMeetingID, e.g, *00*meetingID\n // - meetingID\n // - meetingURL\n // - PSTN\n // - phone number\n //\n // Our job is to determine the appropriate one\n // and its corresponding service so that developers\n // need only sipURL or spaceID to get a meeting\n // and its ID, but have the option to use createWithType()\n // and specify those types to get meetingInfo\n }\n\n /**\n * get a specifc meeting given it's type matched to the value, i.e., locus url\n * @param {String} type\n * @param {Object} value\n * @returns {Meeting}\n * @public\n * @memberof Meetings\n */\n public getMeetingByType(type: string, value: object) {\n return this.meetingCollection.getByKey(type, value);\n }\n\n /**\n * Get all meetings.\n * @param {object} options\n * @param {object} options.startDate - get meetings after this start date\n * @param {object} options.endDate - get meetings before this end date\n * @returns {Object} All currently active meetings.\n * @public\n * @memberof Meetings\n */\n public getAllMeetings(\n options: {\n startDate: object;\n endDate: object;\n } = {} as any\n ) {\n // Options may include other parameters to filter this collection\n // of meetings.\n return this.meetingCollection.getAll(options);\n }\n\n /**\n * syncs all the meeting from server\n * @returns {undefined}\n * @public\n * @memberof Meetings\n */\n public syncMeetings() {\n return this.request\n .getActiveMeetings()\n .then((locusArray) => {\n const activeLocusUrl = [];\n\n if (locusArray?.loci && locusArray.loci.length > 0) {\n const lociToUpdate = this.sortLocusArrayToUpdate(locusArray.loci);\n lociToUpdate.forEach((locus) => {\n activeLocusUrl.push(locus.url);\n this.handleLocusEvent({\n locus,\n locusUrl: locus.url,\n });\n });\n }\n const meetingsCollection = this.meetingCollection.getAll();\n\n if (Object.keys(meetingsCollection).length > 0) {\n // Some time the mercury event is missed after mercury reconnect\n // if sync returns no locus then clear all the meetings\n for (const meeting of Object.values(meetingsCollection)) {\n // @ts-ignore\n if (!activeLocusUrl.includes(meeting.locusUrl)) {\n // destroy function also uploads logs\n // @ts-ignore\n this.destroy(meeting, MEETING_REMOVED_REASON.NO_MEETINGS_TO_SYNC);\n }\n }\n }\n })\n .catch((error) => {\n LoggerProxy.logger.error(\n `Meetings:index#syncMeetings --> failed to sync meetings, ${error}`\n );\n throw new Error(error);\n });\n }\n\n /**\n * sort out locus array for initial creating\n * @param {Array} loci original locus array\n * @returns {undefined}\n * @public\n * @memberof Meetings\n */\n sortLocusArrayToUpdate(loci: any[]) {\n const mainLoci = loci.filter((locus) => !MeetingsUtil.isBreakoutLocusDTO(locus));\n const breakoutLoci = loci.filter((locus) => MeetingsUtil.isValidBreakoutLocus(locus));\n this.breakoutLocusForHandleLater = [];\n const lociToUpdate = [...mainLoci];\n breakoutLoci.forEach((breakoutLocus) => {\n const associateMainLocus = mainLoci.find(\n (mainLocus) => mainLocus.controls?.breakout?.url === breakoutLocus.controls?.breakout?.url\n );\n const existCorrespondingMeeting = this.getCorrespondingMeetingByLocus({\n locus: breakoutLocus,\n locusUrl: breakoutLocus.url,\n });\n\n if (associateMainLocus && !existCorrespondingMeeting) {\n // if exists both main session and breakout session locus of the same non-exist meeting, handle main locus first,\n // after meeting create with main locus, then handle the associate breakout locus.\n // if only handle breakout locus, will miss some date\n this.breakoutLocusForHandleLater.push(breakoutLocus);\n } else {\n lociToUpdate.push(breakoutLocus);\n }\n });\n\n return lociToUpdate;\n }\n\n /**\n * check breakout locus which waiting for main locus's meeting to be created, then handle the breakout locus\n * @param {Object} newCreatedLocus the locus which just create meeting object of it\n * @returns {undefined}\n * @public\n * @memberof Meetings\n */\n checkHandleBreakoutLocus(newCreatedLocus) {\n if (\n !newCreatedLocus ||\n !this.breakoutLocusForHandleLater ||\n !this.breakoutLocusForHandleLater.length\n ) {\n return;\n }\n if (MeetingsUtil.isBreakoutLocusDTO(newCreatedLocus)) {\n return;\n }\n const existIndex = this.breakoutLocusForHandleLater.findIndex(\n (breakoutLocus) =>\n breakoutLocus.controls?.breakout?.url === newCreatedLocus.controls?.breakout?.url\n );\n\n if (existIndex < 0) {\n return;\n }\n\n const associateBreakoutLocus = this.breakoutLocusForHandleLater[existIndex];\n this.handleLocusEvent({locus: associateBreakoutLocus, locusUrl: associateBreakoutLocus.url});\n this.breakoutLocusForHandleLater.splice(existIndex, 1);\n }\n\n /**\n * Get all scheduled meetings.\n * @param {object} options\n * @param {object} options.startDate - get meetings after this start date\n * @param {object} options.endDate - get meetings before this end date\n * @returns {Object} All scheduled meetings.\n * @memberof Meetings\n */\n getScheduledMeetings() {\n return this.meetingCollection.getAll({scheduled: true});\n }\n\n /**\n * Get the logger instance for plugin-meetings\n * @returns {Logger}\n */\n getLogger() {\n return LoggerProxy.get();\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"names":["mediaLogger","MediaLogger","LoggerProxy","logger","info","log","error","warn","trace","debug","Meetings","args","MEETINGS","options","authToken","webex","credentials","supertoken","access_token","mediaHelpersModule","NoiseReductionEffect","VirtualBackgroundEffect","mediaHelpers","request","Request","parent","loggerRequest","LoggerRequest","meetingCollection","MeetingCollection","personalMeetingRoom","reachability","registered","preferredWebexSite","media","getUserMedia","Media","onReady","meeting","newLocus","breakoutUrl","controls","breakout","url","breakoutLocus","getActiveBreakoutLocus","isSelfJoined","self","state","_JOINED_","isSelfMoved","_LEFT_","reason","_MOVED_","deviceFromNewLocus","MeetingsUtil","getThisDevice","internal","device","isResourceMovedOnThisDevice","isNewLocusJoinThisDevice","joinedOnThisDevice","isBreakoutLocusJoinThisDevice","joinedWith","correlationId","breakoutReplaceAt","replaces","length","replaceAt","newLocusReplaceAt","removed","isNewLocusAsBreakout","isBreakoutLocusDTO","fullState","active","isNeedHandleMainLocus","data","getByKey","LOCUS_URL","locusUrl","CORRELATION_ID","checkForCorrelationId","locus","SIP_URI","callbackInfo","callbackAddress","isUnifiedSpaceMeeting","undefined","CONVERSATION_URL","conversationUrl","MEETINGNUMBER","webExMeetingId","useRandomDelayForInfo","getCorrespondingMeetingByLocus","locusInfo","updateMainSessionLocusCache","isNeedHandleLocusDTO","LOCUS","STATE","INACTIVE","create","_LOCUS_ID_","then","newMeeting","initialSetup","checkHandleBreakoutLocus","catch","e","finally","getMeetingByType","_ID_","id","Metrics","postEvent","event","eventType","REMOTE_STARTED","trigger","MERCURY_EVENT","Trigger","file","function","EVENT_TRIGGERS","MEETING_ADDED","type","_MEETING_","_JOIN_","_INCOMING_","parse","envelope","LOCUSEVENT","MESSAGE_ROAP","handleLocusEvent","MEETINGS_NETWORK_DISCONNECTED","mercury","on","LOCUS_MERCURY","handleLocusMercury","ROAP","ROAP_MERCURY","handleRoapMercury","ONLINE","syncMeetings","OFFLINE","handleMercuryOffline","off","once","READY","StaticConfig","set","config","LoggerConfig","logging","setLogger","meetingInfo","experimental","enableUnifiedMeetings","MeetingInfoV2","MeetingInfo","PersonalMeetingRoom","MEETINGS_READY","checkH264Support","disableNotifications","changeState","enable","enableTurnDiscovery","enableAdhocMeetings","canAuthorize","reject","Error","resolve","all","fetchUserPreferredWebexSite","getGeoHint","startReachability","message","register","connect","call","listenForEvents","MEETINGS_REGISTERED","sendBehavioralMetric","BEHAVIORAL_METRICS","MEETINGS_REGISTRATION_SUCCESS","MEETINGS_REGISTRATION_FAILED","stack","stopListeningForEvents","disconnect","unregister","MEETINGS_UNREGISTERED","uploadLogs","uploadResult","MEETING_LOG_UPLOAD_SUCCESS","meetingId","details","uploadError","MEETING_LOG_UPLOAD_FAILURE","UPLOAD_LOGS_FAILURE","meetingsId","code","Reachability","setReachability","getReachability","gatherReachability","fetchGeoHint","res","geoHintInfo","getMeetingPreferences","parseDefaultSiteFromMeetingPreferences","user","get","userPreferences","userPreferencesItems","preferredWebExSite","MeetingUtil","cleanUp","delete","MEETING_REMOVED","destination","infoExtraParams","fetchInfoOptions","targetDest","_CONVERSATION_URL_","foundMeeting","foundMeetingIsNotCalendarMeeting","scheduledMeeting","createMeeting","createdMeeting","EVENTS","DESTROY_MEETING","payload","autoUploadLogs","callStart","lastActive","feedbackId","locusId","destroy","REQUEST_UPLOAD_LOGS","meetingInstance","Meeting","userId","deviceUrl","orgId","meetingInfoProvider","destinationType","waitingTime","startTime","startTimeDate","Date","startTimeDatestamp","getTime","timeToStart","maxWaitingTime","Math","max","min","MAX_RANDOM_DELAY_FOR_MEETING_INFO","round","random","isMeetingActive","fetchMeetingInfoTimeoutId","setTimeout","fetchMeetingInfo","extraParams","parseMeetingInfo","CaptchaError","PasswordError","PermissionError","sipUri","setSipUri","meetingAddedType","getMeetingAddedType","value","getAll","getActiveMeetings","locusArray","activeLocusUrl","loci","lociToUpdate","sortLocusArrayToUpdate","forEach","push","meetingsCollection","includes","MEETING_REMOVED_REASON","NO_MEETINGS_TO_SYNC","mainLoci","filter","breakoutLoci","isValidBreakoutLocus","breakoutLocusForHandleLater","associateMainLocus","find","mainLocus","existCorrespondingMeeting","newCreatedLocus","existIndex","findIndex","associateBreakoutLocus","splice","scheduled","WebexPlugin"],"sources":["index.ts"],"sourcesContent":["/* eslint no-shadow: [\"error\", { \"allow\": [\"eventType\"] }] */\n\nimport '@webex/internal-plugin-mercury';\nimport '@webex/internal-plugin-conversation';\n// @ts-ignore\nimport {WebexPlugin} from '@webex/webex-core';\nimport {setLogger} from '@webex/internal-media-core';\n\nimport * as mediaHelpersModule from '@webex/media-helpers';\n\nimport 'webrtc-adapter';\n\nimport Metrics from '../metrics';\nimport {trigger, eventType} from '../metrics/config';\nimport LoggerConfig from '../common/logs/logger-config';\nimport StaticConfig from '../common/config';\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport LoggerRequest from '../common/logs/request';\nimport Trigger from '../common/events/trigger-proxy';\nimport Media from '../media';\nimport MeetingUtil from '../meeting/util';\nimport {\n MEETINGS,\n EVENTS,\n EVENT_TRIGGERS,\n READY,\n LOCUSEVENT,\n LOCUS_URL,\n MAX_RANDOM_DELAY_FOR_MEETING_INFO,\n ROAP,\n ONLINE,\n OFFLINE,\n _MEETING_,\n _JOIN_,\n _LOCUS_ID_,\n _INCOMING_,\n LOCUS,\n CORRELATION_ID,\n SIP_URI,\n _LEFT_,\n _ID_,\n MEETING_REMOVED_REASON,\n _CONVERSATION_URL_,\n CONVERSATION_URL,\n MEETINGNUMBER,\n _JOINED_,\n _MOVED_,\n} from '../constants';\nimport BEHAVIORAL_METRICS from '../metrics/constants';\nimport MeetingInfo from '../meeting-info';\nimport MeetingInfoV2 from '../meeting-info/meeting-info-v2';\nimport Meeting from '../meeting';\nimport PersonalMeetingRoom from '../personal-meeting-room';\nimport Reachability from '../reachability';\nimport Request from './request';\nimport PasswordError from '../common/errors/password-error';\nimport CaptchaError from '../common/errors/captcha-error';\n\nimport MeetingCollection from './collection';\nimport MeetingsUtil from './util';\nimport PermissionError from '../common/errors/permission';\nimport {INoiseReductionEffect, IVirtualBackgroundEffect} from './meetings.types';\n\nlet mediaLogger;\n\nclass MediaLogger {\n info(...args) {\n LoggerProxy.logger.info(...args);\n }\n\n log(...args) {\n LoggerProxy.logger.log(...args);\n }\n\n error(...args) {\n LoggerProxy.logger.error(...args);\n }\n\n warn(...args) {\n LoggerProxy.logger.warn(...args);\n }\n\n trace(...args) {\n LoggerProxy.logger.trace(...args);\n }\n\n debug(...args) {\n LoggerProxy.logger.debug(...args);\n }\n}\n/**\n * Meetings Ready Event\n * Emitted when the meetings instance on webex is ready\n * @event meetings:ready\n * @instance\n * @memberof Meetings\n */\n\n/**\n * Meetings Network Disconnected Event\n * Emitted when the meetings instance is disconnected from\n * the internal mercury server\n * @event network:disconnected\n * @instance\n * @memberof Meetings\n */\n\n/**\n * Meetings Registered Event\n * Emitted when the meetings instance has been registered and listening\n * @event meetings:registered\n * @instance\n * @memberof Meetings\n */\n\n/**\n * Meeting Removed Event\n * Emitted when a meeting was removed from the cache of meetings\n * @event meeting:removed\n * @instance\n * @type {Object}\n * @property {String} meetingId the removed meeting\n * @property {Object} response the server response\n * @property {String} type what type of meeting it was\n * @memberof Meetings\n */\n\n/**\n * Meeting Added Event\n * Emitted when a meeting was added to the cache of meetings\n * @event meeting:added\n * @instance\n * @type {Object}\n * @property {String} meetingId the added meeting\n * @property {String} type what type of meeting it was\n * @memberof Meetings\n */\n\n/**\n * Maintain a cache of meetings and sync with services.\n * @class\n */\nexport default class Meetings extends WebexPlugin {\n loggerRequest: any;\n media: any;\n meetingCollection: any;\n personalMeetingRoom: any;\n preferredWebexSite: any;\n reachability: any;\n registered: any;\n request: any;\n geoHintInfo: any;\n meetingInfo: any;\n mediaHelpers: any;\n breakoutLocusForHandleLater: any;\n namespace = MEETINGS;\n\n /**\n * Initializes the Meetings Plugin\n * @constructor\n * @public\n * @memberof Meetings\n */\n constructor(...args) {\n super(...args);\n\n /**\n * The webrtc-core media helpers. This is a temporary solution required for the SDK sample app\n * to be able to call media helper functions.\n *\n * @instance\n * @type {Object}\n * @private\n * @memberof Meetings\n */\n this.mediaHelpers = mediaHelpersModule;\n\n /**\n * The Meetings request to interact with server\n * @instance\n * @type {Object}\n * @private\n * @memberof Meetings\n */\n // @ts-ignore\n this.request = new Request({}, {parent: this.webex});\n /**\n * Log upload request helper\n * @instance\n * @type {Object}\n * @private\n * @memberof Meetings\n */\n // @ts-ignore\n this.loggerRequest = new LoggerRequest({webex: this.webex});\n this.meetingCollection = new MeetingCollection();\n /**\n * The PersonalMeetingRoom object to interact with server\n * @instance\n * @type {Object}\n * @public\n * @memberof Meetings\n */\n this.personalMeetingRoom = null;\n /**\n * The Reachability object to interact with server, starts as null until {@link Meeting#setReachability} is called\n * starts as null\n * @instance\n * @type {Object}\n * @private\n * @memberof Meetings\n */\n this.reachability = null;\n\n /**\n * If the meetings plugin has been registered and listening via {@link Meetings#register}\n * @instance\n * @type {Boolean}\n * @public\n * @memberof Meetings\n */\n this.registered = false;\n\n /**\n * This values indicates the preferred webex site the user will start there meeting, getsits value from {@link Meetings#register}\n * @instance\n * @type {String}\n * @private\n * @memberof Meetings\n */\n this.preferredWebexSite = '';\n\n /**\n * The public interface for the internal Media util files. These are helpful to expose outside the context\n * of a meeting so that a user can access media without creating a meeting instance.\n * @instance\n * @type {Object}\n * @private\n * @memberof Meetings\n */\n this.media = {\n getUserMedia: Media.getUserMedia,\n };\n\n this.onReady();\n }\n\n /**\n * check whether you need to handle this main session's locus data or not\n * @param {Object} meeting current meeting data\n * @param {Object} newLocus new locus data\n * @returns {boolean}\n * @private\n * @memberof Meetings\n */\n private isNeedHandleMainLocus(meeting: any, newLocus: any) {\n const breakoutUrl = newLocus.controls?.breakout?.url;\n const breakoutLocus = this.meetingCollection.getActiveBreakoutLocus(breakoutUrl);\n\n const isSelfJoined = newLocus?.self?.state === _JOINED_;\n const isSelfMoved = newLocus?.self?.state === _LEFT_ && newLocus?.self?.reason === _MOVED_;\n // @ts-ignore\n const deviceFromNewLocus = MeetingsUtil.getThisDevice(newLocus, this.webex.internal.device.url);\n const isResourceMovedOnThisDevice =\n deviceFromNewLocus?.state === _LEFT_ && deviceFromNewLocus?.reason === _MOVED_;\n\n const isNewLocusJoinThisDevice = MeetingsUtil.joinedOnThisDevice(\n meeting,\n newLocus,\n // @ts-ignore\n this.webex.internal.device.url\n );\n const isBreakoutLocusJoinThisDevice =\n breakoutLocus?.joinedWith?.correlationId &&\n breakoutLocus.joinedWith.correlationId === meeting?.correlationId;\n\n if (isSelfJoined && isNewLocusJoinThisDevice) {\n LoggerProxy.logger.log(\n 'Meetings:index#isNeedHandleMainLocus --> self this device shown as JOINED in the main session'\n );\n if (breakoutLocus?.joinedWith && deviceFromNewLocus) {\n const breakoutReplaceAt =\n breakoutLocus.joinedWith.replaces?.length > 0\n ? breakoutLocus.joinedWith.replaces[0].replaceAt\n : '';\n const newLocusReplaceAt =\n deviceFromNewLocus.replaces?.length > 0 ? deviceFromNewLocus.replaces[0].replaceAt : '';\n if (breakoutReplaceAt && newLocusReplaceAt && breakoutReplaceAt > newLocusReplaceAt) {\n LoggerProxy.logger.log(\n `Meetings:index#isNeedHandleMainLocus --> this is expired main joined status locus_dto replacedAt ${newLocusReplaceAt} bo replacedAt ${breakoutReplaceAt}`\n );\n\n return false;\n }\n }\n\n return true;\n }\n if (isBreakoutLocusJoinThisDevice) {\n LoggerProxy.logger.log(\n `Meetings:index#isNeedHandleMainLocus --> there is active breakout session and joined on this device, and don't need to handle main session: ${breakoutUrl}`\n );\n\n return false;\n }\n if (isSelfMoved && (newLocus?.self?.removed || isResourceMovedOnThisDevice)) {\n LoggerProxy.logger.log(\n 'Meetings:index#isNeedHandleMainLocus --> self moved main locus with self removed status or with device resource moved, not need to handle'\n );\n\n return false;\n }\n if (isSelfJoined && isResourceMovedOnThisDevice) {\n LoggerProxy.logger.log(\n 'Meetings:index#isNeedHandleMainLocus --> self device left&moved in main locus with self joined status, not need to handle'\n );\n\n return false;\n }\n LoggerProxy.logger.log(\n 'Meetings:index#isNeedHandleMainLocus --> this is a normal main session locusDTO update case'\n );\n\n return true;\n }\n\n /**\n * check whether you need to handle this locus data or not\n * @param {Object} meeting old locus data\n * @param {Object} newLocus new locus data\n * @returns {boolean}\n * @private\n * @memberof Meetings\n */\n private isNeedHandleLocusDTO(meeting: any, newLocus: any) {\n if (newLocus) {\n const isNewLocusAsBreakout = MeetingsUtil.isBreakoutLocusDTO(newLocus);\n const isSelfMoved = newLocus?.self?.state === _LEFT_ && newLocus?.self?.reason === _MOVED_;\n if (!meeting) {\n if (isNewLocusAsBreakout) {\n LoggerProxy.logger.log(\n `Meetings:index#isNeedHandleLocusDTO --> the first breakout session locusDTO active status: ${newLocus.fullState?.active}`\n );\n\n return newLocus.self?.state === _JOINED_;\n }\n\n return this.isNeedHandleMainLocus(meeting, newLocus);\n }\n if (!isNewLocusAsBreakout) {\n return this.isNeedHandleMainLocus(meeting, newLocus);\n }\n\n return !isSelfMoved;\n }\n\n return true;\n }\n\n /**\n * get corresponding meeting object by locus data\n * @param {Object} data a locus event\n * @param {String} data.locusUrl\n * @param {Object} data.locus\n * @returns {Object}\n * @private\n * @memberof Meetings\n */\n getCorrespondingMeetingByLocus(data) {\n // getting meeting by correlationId. This will happen for the new event\n // Either the locus\n // TODO : Add check for the callBack Address\n return (\n this.meetingCollection.getByKey(LOCUS_URL, data.locusUrl) ||\n // @ts-ignore\n this.meetingCollection.getByKey(\n CORRELATION_ID,\n // @ts-ignore\n MeetingsUtil.checkForCorrelationId(this.webex.internal.device.url, data.locus)\n ) ||\n this.meetingCollection.getByKey(\n SIP_URI,\n data.locus.self &&\n data.locus.self.callbackInfo &&\n data.locus.self.callbackInfo.callbackAddress\n ) ||\n (data.locus.info?.isUnifiedSpaceMeeting\n ? undefined\n : this.meetingCollection.getByKey(CONVERSATION_URL, data.locus.conversationUrl)) ||\n this.meetingCollection.getByKey(MEETINGNUMBER, data.locus?.info?.webExMeetingId)\n );\n }\n\n /**\n * handle locus events and takes meeting actions with them as they come in\n * @param {Object} data a locus event\n * @param {String} data.locusUrl\n * @param {Object} data.locus\n * @param {Boolean} useRandomDelayForInfo whether a random delay should be added to fetching meeting info\n * @param {String} data.eventType\n * @returns {undefined}\n * @private\n * @memberof Meetings\n */\n private handleLocusEvent(data: {locusUrl: string; locus: any}, useRandomDelayForInfo = false) {\n let meeting = this.getCorrespondingMeetingByLocus(data);\n\n // Special case when locus has got replaced, This only happend once if a replace locus exists\n // https://sqbu-github.cisco.com/WebExSquared/locus/wiki/Locus-changing-mid-call\n\n if (!meeting && data.locus?.replaces?.length > 0) {\n // Always the last element in the replace is the active one\n meeting = this.meetingCollection.getByKey(\n LOCUS_URL,\n data.locus.replaces[data.locus.replaces.length - 1].locusUrl\n );\n }\n\n if (meeting && !MeetingsUtil.isBreakoutLocusDTO(data.locus)) {\n meeting.locusInfo.updateMainSessionLocusCache(data.locus);\n }\n if (!this.isNeedHandleLocusDTO(meeting, data.locus)) {\n LoggerProxy.logger.log(\n `Meetings:index#handleLocusEvent --> doesn't need to process locus event`\n );\n\n return;\n }\n if (!meeting) {\n // TODO: create meeting when we get a meeting object\n // const checkForEnded = (locus) => {\n // TODO: you already ended the meeting but you got an event later\n // Mainly for 1:1 Callsor meeting\n // Happens mainly after refresh\n\n // 1:1 Meeting\n // 1) You ended a call before but you got a mercury event\n // Make sure end the call and cleanup the meeting only if the mercury\n // event says so\n // 2) Maintain lastSync time in the meetings object which helps to compare\n // If the meeting came befor or after the sync . ANy meeting start time before the sync time is invalid\n\n // For space Meeting\n // Check the locus object and see who has joined\n\n // };\n // rather then locus object change to locus url\n\n if (\n data.locus &&\n data.locus.fullState &&\n data.locus.fullState.state === LOCUS.STATE.INACTIVE\n ) {\n // just ignore the event as its already ended and not active\n LoggerProxy.logger.warn(\n 'Meetings:index#handleLocusEvent --> Locus event received for meeting, after it was ended.'\n );\n\n return;\n }\n\n // When its wireless share or guest and user leaves the meeting we dont have to keep the meeting object\n // Any future events will be neglected\n\n if (\n data.locus &&\n data.locus.self &&\n data.locus.self.state === _LEFT_ &&\n data.locus.self.removed === true\n ) {\n // just ignore the event as its already ended and not active\n LoggerProxy.logger.warn(\n 'Meetings:index#handleLocusEvent --> Locus event received for meeting, after it was ended.'\n );\n\n return;\n }\n\n this.create(data.locus, _LOCUS_ID_, useRandomDelayForInfo)\n .then((newMeeting) => {\n meeting = newMeeting;\n\n // It's a new meeting so initialize the locus data\n meeting.locusInfo.initialSetup(data.locus);\n this.checkHandleBreakoutLocus(data.locus);\n })\n .catch((e) => {\n LoggerProxy.logger.error(e);\n })\n .finally(() => {\n // There will be cases where locus event comes in gets created and deleted because its a 1:1 and meeting gets deleted\n // because the other user left so before sending 'added' event make sure it exists in the collection\n\n if (this.getMeetingByType(_ID_, meeting.id)) {\n Metrics.postEvent({\n event: eventType.REMOTE_STARTED,\n meeting,\n data: {trigger: trigger.MERCURY_EVENT},\n });\n Trigger.trigger(\n this,\n {\n file: 'meetings',\n function: 'handleLocusEvent',\n },\n EVENT_TRIGGERS.MEETING_ADDED,\n {\n meeting,\n type: meeting.type === _MEETING_ ? _JOIN_ : _INCOMING_,\n }\n );\n } else {\n // Meeting got added but was not found in the collection. It might have got destroyed\n LoggerProxy.logger.warn(\n 'Meetings:index#handleLocusEvent --> Created and destroyed meeting object before sending an event'\n );\n }\n });\n } else {\n meeting.locusInfo.parse(meeting, data);\n }\n }\n\n /**\n * handles locus events through mercury that are not roap\n * @param {Object} envelope\n * @param {Object} envelope.data\n * @param {String} envelope.data.eventType\n * @returns {undefined}\n * @private\n * @memberof Meetings\n */\n private handleLocusMercury(envelope: {data: any}) {\n const {data} = envelope;\n // eslint-disable-next-line @typescript-eslint/no-shadow\n const {eventType} = data;\n\n if (eventType && eventType !== LOCUSEVENT.MESSAGE_ROAP) {\n this.handleLocusEvent(data, true);\n }\n }\n\n /**\n * handles mecury offline event\n * @returns {undefined}\n * @private\n * @memberof Meetings\n */\n private handleMercuryOffline() {\n Trigger.trigger(\n this,\n {\n file: 'meetings/index',\n function: 'handleMercuryOffline',\n },\n EVENT_TRIGGERS.MEETINGS_NETWORK_DISCONNECTED\n );\n }\n\n /**\n * registers for locus and roap mercury events\n * @returns {undefined}\n * @private\n * @memberof Meetings\n */\n private listenForEvents() {\n // @ts-ignore\n this.webex.internal.mercury.on(LOCUSEVENT.LOCUS_MERCURY, (envelope) => {\n this.handleLocusMercury(envelope);\n });\n // @ts-ignore\n this.webex.internal.mercury.on(ROAP.ROAP_MERCURY, (envelope) => {\n MeetingsUtil.handleRoapMercury(envelope, this.meetingCollection);\n });\n\n // @ts-ignore\n this.webex.internal.mercury.on(ONLINE, () => {\n this.syncMeetings();\n });\n\n // @ts-ignore\n this.webex.internal.mercury.on(OFFLINE, () => {\n this.handleMercuryOffline();\n });\n }\n\n /**\n * stops listening for locus and roap mercury events\n * @returns {undefined}\n * @private\n * @memberof Meetings\n */\n private stopListeningForEvents() {\n // @ts-ignore\n this.webex.internal.mercury.off(LOCUSEVENT.LOCUS_MERCURY);\n // @ts-ignore\n this.webex.internal.mercury.off(ROAP.ROAP_MERCURY);\n // @ts-ignore\n this.webex.internal.mercury.off(ONLINE);\n }\n\n /**\n * @returns {undefined}\n * @private\n * @memberof Meetings\n */\n private onReady() {\n // @ts-ignore\n this.webex.once(READY, () => {\n // @ts-ignore\n StaticConfig.set(this.config);\n // @ts-ignore\n LoggerConfig.set(this.config.logging);\n // @ts-ignore\n LoggerProxy.set(this.webex.logger);\n\n mediaLogger = new MediaLogger();\n setLogger(mediaLogger);\n\n /**\n * The MeetingInfo object to interact with server\n * @instance\n * @type {Object}\n * @private\n * @memberof Meetings\n */\n // @ts-ignore\n this.meetingInfo = this.config.experimental.enableUnifiedMeetings\n ? // @ts-ignore\n new MeetingInfoV2(this.webex)\n : // @ts-ignore\n new MeetingInfo(this.webex);\n // @ts-ignore\n this.personalMeetingRoom = new PersonalMeetingRoom(\n {meetingInfo: this.meetingInfo},\n // @ts-ignore\n {parent: this.webex}\n );\n\n Trigger.trigger(\n this,\n {\n file: 'meetings',\n function: 'onReady',\n },\n EVENT_TRIGGERS.MEETINGS_READY\n );\n\n MeetingsUtil.checkH264Support({disableNotifications: true});\n // @ts-ignore\n Metrics.initialSetup(this.meetingCollection, this.webex);\n });\n }\n\n /**\n * API to toggle unified meetings\n * @param {Boolean} changeState\n * @private\n * @memberof Meetings\n * @returns {undefined}\n */\n private _toggleUnifiedMeetings(changeState: boolean) {\n if (typeof changeState !== 'boolean') {\n return;\n }\n // @ts-ignore\n if (this.config?.experimental?.enableUnifiedMeetings !== changeState) {\n // @ts-ignore\n this.config.experimental.enableUnifiedMeetings = changeState;\n // @ts-ignore\n this.meetingInfo = changeState ? new MeetingInfoV2(this.webex) : new MeetingInfo(this.webex);\n }\n }\n\n /**\n * API to enable or disable TURN discovery\n * @param {Boolean} enable\n * @private\n * @memberof Meetings\n * @returns {undefined}\n */\n private _toggleTurnDiscovery(enable: boolean) {\n if (typeof enable !== 'boolean') {\n return;\n }\n // @ts-ignore\n this.config.experimental.enableTurnDiscovery = enable;\n }\n\n /**\n * API to toggle starting adhoc meeting\n * @param {Boolean} changeState\n * @private\n * @memberof Meetings\n * @returns {undefined}\n */\n private _toggleAdhocMeetings(changeState: boolean) {\n if (typeof changeState !== 'boolean') {\n return;\n }\n // @ts-ignore\n if (this.config?.experimental?.enableAdhocMeetings !== changeState) {\n // @ts-ignore\n this.config.experimental.enableAdhocMeetings = changeState;\n }\n }\n\n /**\n * Explicitly sets up the meetings plugin by registering\n * the device, connecting to mercury, and listening for locus events.\n *\n * @returns {Promise}\n * @public\n * @memberof Meetings\n */\n public register() {\n // @ts-ignore\n if (!this.webex.canAuthorize) {\n LoggerProxy.logger.error(\n 'Meetings:index#register --> ERROR, Unable to register, SDK cannot authorize'\n );\n\n return Promise.reject(new Error('SDK cannot authorize'));\n }\n\n if (this.registered) {\n LoggerProxy.logger.info(\n 'Meetings:index#register --> INFO, Meetings plugin already registered'\n );\n\n return Promise.resolve();\n }\n\n return Promise.all([\n this.fetchUserPreferredWebexSite(),\n this.getGeoHint(),\n this.startReachability().catch((error) => {\n LoggerProxy.logger.error(`Meetings:index#register --> GDM error, ${error.message}`);\n }),\n // @ts-ignore\n this.webex.internal.device\n .register()\n // @ts-ignore\n .then(() =>\n LoggerProxy.logger.info(\n // @ts-ignore\n `Meetings:index#register --> INFO, Device registered ${this.webex.internal.device.url}`\n )\n )\n // @ts-ignore\n .then(() => this.webex.internal.mercury.connect()),\n MeetingsUtil.checkH264Support.call(this),\n ])\n .then(() => {\n this.listenForEvents();\n Trigger.trigger(\n this,\n {\n file: 'meetings',\n function: 'register',\n },\n EVENT_TRIGGERS.MEETINGS_REGISTERED\n );\n this.registered = true;\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.MEETINGS_REGISTRATION_SUCCESS);\n })\n .catch((error) => {\n LoggerProxy.logger.error(\n `Meetings:index#register --> ERROR, Unable to register, ${error.message}`\n );\n\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.MEETINGS_REGISTRATION_FAILED, {\n reason: error.message,\n stack: error.stack,\n });\n\n return Promise.reject(error);\n });\n }\n\n /**\n * Explicitly tears down the meetings plugin by deregistering\n * the device, disconnecting from mercury, and stops listening to locus events\n *\n * @returns {Promise}\n * @public\n * @memberof Meetings\n */\n unregister() {\n if (!this.registered) {\n LoggerProxy.logger.info(\n 'Meetings:index#unregister --> INFO, Meetings plugin already unregistered'\n );\n\n return Promise.resolve();\n }\n\n this.stopListeningForEvents();\n\n return (\n // @ts-ignore\n this.webex.internal.mercury\n .disconnect()\n // @ts-ignore\n .then(() => this.webex.internal.device.unregister())\n .then(() => {\n Trigger.trigger(\n this,\n {\n file: 'meetings',\n function: 'unregister',\n },\n EVENT_TRIGGERS.MEETINGS_UNREGISTERED\n );\n this.registered = false;\n })\n );\n }\n\n /**\n * Creates a noise reduction effect\n *\n * @param {INoiseReductionEffect} options optional custom effect options\n * @returns {Promise<effect>} noise reduction effect.\n * @public\n * @memberof Meetings\n */\n createNoiseReductionEffect = async (options?: INoiseReductionEffect) => {\n // @ts-ignore\n const authToken = this.webex.credentials.supertoken.access_token;\n\n return new mediaHelpersModule.NoiseReductionEffect({authToken, ...options});\n };\n\n /**\n * Creates a virtual background effect\n *\n * @param {IVirtualBackgroundEffect} options optional custom effect options\n * @returns {Promise<effect>} virtual background effect.\n * @public\n * @memberof Meetings\n */\n createVirtualBackgroundEffect = async (options?: IVirtualBackgroundEffect) => {\n // @ts-ignore\n const authToken = this.webex.credentials.supertoken.access_token;\n\n return new mediaHelpersModule.VirtualBackgroundEffect({authToken, ...options});\n };\n\n /**\n * Uploads logs to the webex services for tracking\n * @param {Object} [options={}]\n * @param {String} [options.callStart] Call Start Time\n * @param {String} [options.feedbackId] ID used for tracking\n * @param {String} [options.locusId]\n * @param {String} [options.correlationId]\n * @param {String} [options.meetingId] webex meeting ID\n * @param {String} [options.userId] userId\n * @param {String} [options.orgId] org id\n * @returns {String} feedback ID logs were submitted under\n */\n uploadLogs(\n options: {\n callStart?: string;\n feedbackId?: string;\n locusId?: string;\n correlationId?: string;\n meetingId?: string;\n userId?: string;\n orgId?: string;\n } = {}\n ) {\n LoggerProxy.logger.info('Meetings:index#uploadLogs --> uploading logs');\n\n return this.loggerRequest\n .uploadLogs(options)\n .then((uploadResult) => {\n LoggerProxy.logger.info(\n 'Meetings:index#uploadLogs --> Upload logs for meeting completed.',\n uploadResult\n );\n Trigger.trigger(\n this,\n {\n file: 'meetings',\n function: 'uploadLogs',\n },\n EVENT_TRIGGERS.MEETING_LOG_UPLOAD_SUCCESS,\n {\n meetingId: options.meetingId,\n details: uploadResult,\n }\n );\n\n return uploadResult;\n })\n .catch((uploadError) => {\n LoggerProxy.logger.error(\n 'Meetings:index#uploadLogs --> Unable to upload logs for meeting',\n uploadError\n );\n Trigger.trigger(\n this,\n {\n file: 'meetings',\n function: 'uploadLogs',\n },\n EVENT_TRIGGERS.MEETING_LOG_UPLOAD_FAILURE,\n {\n meetingId: options.meetingId,\n reason: uploadError,\n }\n );\n\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.UPLOAD_LOGS_FAILURE, {\n // @ts-ignore - seems like typo\n meetingId: options.meetingsId,\n reason: uploadError.message,\n stack: uploadError.stack,\n code: uploadError.code,\n });\n });\n }\n\n /**\n * initializes the reachability instance for Meetings\n * @returns {undefined}\n * @public\n * @memberof Meetings\n */\n setReachability() {\n // @ts-ignore\n this.reachability = new Reachability(this.webex);\n }\n\n /**\n * gets the reachability instance for Meetings\n * @returns {Reachability}\n * @public\n * @memberof Meetings\n */\n getReachability() {\n return this.reachability;\n }\n\n /**\n * initializes and starts gathering reachability for Meetings\n * @returns {Promise}\n * @public\n * @memberof Meetings\n */\n startReachability() {\n if (!this.reachability) {\n this.setReachability();\n }\n\n return this.getReachability().gatherReachability();\n }\n\n /**\n * Get geoHint for info for meetings\n * @returns {Promise}\n * @private\n * @memberof Meetings\n */\n getGeoHint() {\n return this.request.fetchGeoHint().then((res) => {\n this.geoHintInfo = res;\n });\n }\n\n /**\n * Fetch user preferred webex site information\n * This also has other infomation about the user\n * @returns {Promise}\n * @private\n * @memberof Meetings\n */\n fetchUserPreferredWebexSite() {\n return this.request.getMeetingPreferences().then((res) => {\n if (res) {\n this.preferredWebexSite = MeetingsUtil.parseDefaultSiteFromMeetingPreferences(res);\n }\n\n // fall back to getting the preferred site from the user information\n if (!this.preferredWebexSite) {\n // @ts-ignore\n return this.webex.internal.user\n .get()\n .then((user) => {\n const preferredWebexSite =\n user?.userPreferences?.userPreferencesItems?.preferredWebExSite;\n if (preferredWebexSite) {\n this.preferredWebexSite = preferredWebexSite;\n } else {\n throw new Error('site not found');\n }\n })\n .catch(() => {\n LoggerProxy.logger.error(\n 'Failed to fetch preferred site from user - no site will be set'\n );\n });\n }\n\n return Promise.resolve();\n });\n }\n\n /**\n * gets the personal meeting room instance, for saved PMR values for this user\n * @returns {PersonalMeetingRoom}\n * @public\n * @memberof Meetings\n */\n\n getPersonalMeetingRoom() {\n return this.personalMeetingRoom;\n }\n\n /**\n * @param {Meeting} meeting\n * @param {Object} reason\n * @param {String} type\n * @returns {Undefined}\n * @private\n * @memberof Meetings\n */\n private destroy(meeting: Meeting, reason: object) {\n MeetingUtil.cleanUp(meeting);\n this.meetingCollection.delete(meeting.id);\n Trigger.trigger(\n this,\n {\n file: 'meetings',\n function: 'destroy',\n },\n EVENT_TRIGGERS.MEETING_REMOVED,\n {\n meetingId: meeting.id,\n reason,\n }\n );\n }\n\n /**\n * Create a meeting.\n * @param {string} destination - sipURL, spaceId, phonenumber, or locus object}\n * @param {string} [type] - the optional specified type, such as locusId\n * @param {Boolean} useRandomDelayForInfo - whether a random delay should be added to fetching meeting info\n * @param {Object} infoExtraParams extra parameters to be provided when fetching meeting info\n * @returns {Promise<Meeting>} A new Meeting.\n * @public\n * @memberof Meetings\n */\n public create(\n destination: string,\n type: string = null,\n useRandomDelayForInfo = false,\n infoExtraParams = {}\n ) {\n // TODO: type should be from a dictionary\n\n // Validate meeting information based on the provided destination and\n // type. This must be performed prior to determining if the meeting is\n // found in the collection, as we mutate the destination for hydra person\n // id values.\n return (\n this.meetingInfo\n .fetchInfoOptions(destination, type)\n // Catch a failure to fetch info options.\n .catch((error) => {\n LoggerProxy.logger.info(\n `Meetings:index#create --> INFO, unable to determine info options: ${error.message}`\n );\n })\n .then((options: any = {}) => {\n // Normalize the destination.\n const targetDest = options.destination || destination;\n\n // check for the conversation URL then sip Url\n let meeting = null;\n\n if (type === _CONVERSATION_URL_ || options.type === _CONVERSATION_URL_) {\n const foundMeeting = this.meetingCollection.getByKey(CONVERSATION_URL, targetDest);\n\n if (foundMeeting) {\n const foundMeetingIsNotCalendarMeeting = !foundMeeting.locusInfo.scheduledMeeting;\n\n // If the found meeting is not a calendar meeting, return that meeting.\n // This allows for the creation of instant-meetings when calendar meetings are present.\n if (foundMeetingIsNotCalendarMeeting) {\n meeting = foundMeeting;\n }\n }\n }\n\n // Attempt to collect the meeting if it exists.\n if (!meeting) {\n meeting = this.meetingCollection.getByKey(SIP_URI, targetDest);\n }\n\n // Validate if a meeting was found.\n if (!meeting) {\n // Create a meeting based on the normalized destination and type.\n return this.createMeeting(\n targetDest,\n type,\n useRandomDelayForInfo,\n infoExtraParams\n ).then((createdMeeting: any) => {\n // If the meeting was successfully created.\n if (createdMeeting && createdMeeting.on) {\n // Create a destruction event for the meeting.\n createdMeeting.on(EVENTS.DESTROY_MEETING, (payload) => {\n // @ts-ignore\n if (this.config.autoUploadLogs) {\n this.uploadLogs({\n callStart: createdMeeting.locusInfo?.fullState?.lastActive,\n correlationId: createdMeeting.correlationId,\n feedbackId: createdMeeting.correlationId,\n locusId: createdMeeting.locusId,\n meetingId: createdMeeting.locusInfo?.info?.webExMeetingId,\n }).then(() => this.destroy(createdMeeting, payload.reason));\n } else {\n this.destroy(createdMeeting, payload.reason);\n }\n });\n\n createdMeeting.on(EVENTS.REQUEST_UPLOAD_LOGS, (meetingInstance) => {\n // @ts-ignore\n if (this.config.autoUploadLogs) {\n this.uploadLogs({\n callStart: meetingInstance?.locusInfo?.fullState?.lastActive,\n correlationId: meetingInstance.correlationId,\n feedbackId: meetingInstance.correlationId,\n locusId: meetingInstance.locusId,\n meetingId: meetingInstance.locusInfo?.info?.webExMeetingId,\n });\n }\n });\n } else {\n LoggerProxy.logger.error(\n `Meetings:index#create --> ERROR, meeting does not have on method, will not be destroyed, meeting cleanup impossible for meeting: ${meeting}`\n );\n }\n\n // Return the newly created meeting.\n return Promise.resolve(createdMeeting);\n });\n }\n\n // Return the existing meeting.\n return Promise.resolve(meeting);\n })\n );\n }\n\n /**\n * @param {String} destination see create()\n * @param {String} type see create()\n * @param {Boolean} useRandomDelayForInfo whether a random delay should be added to fetching meeting info\n * @param {Object} infoExtraParams extra parameters to be provided when fetching meeting info\n * @returns {Promise} a new meeting instance complete with meeting info and destination\n * @private\n * @memberof Meetings\n */\n private async createMeeting(\n destination: any,\n type: string = null,\n useRandomDelayForInfo = false,\n infoExtraParams = {}\n ) {\n const meeting = new Meeting(\n {\n // @ts-ignore\n userId: this.webex.internal.device.userId,\n // @ts-ignore\n deviceUrl: this.webex.internal.device.url,\n // @ts-ignore\n orgId: this.webex.internal.device.orgId,\n locus: type === _LOCUS_ID_ ? destination : null, // pass the locus object if present\n meetingInfoProvider: this.meetingInfo,\n destination,\n destinationType: type,\n },\n {\n // @ts-ignore\n parent: this.webex,\n }\n );\n\n this.meetingCollection.set(meeting);\n\n try {\n // if no participant has joined the scheduled meeting (meaning meeting is not active) and we get a locusEvent,\n // it means the meeting will start in 5-6 min. In that case, we want to fetchMeetingInfo\n // between 5 and 2 min (random between 3 minutes) before the meeting starts\n // to avoid a spike in traffic to the wbxappi service\n let waitingTime = 0;\n\n if (destination.meeting) {\n const {startTime} = destination.meeting;\n const startTimeDate = new Date(startTime);\n const startTimeDatestamp = startTimeDate.getTime();\n const timeToStart = startTimeDatestamp - Date.now();\n const maxWaitingTime = Math.max(\n Math.min(timeToStart, MAX_RANDOM_DELAY_FOR_MEETING_INFO),\n 0\n );\n\n waitingTime = Math.round(Math.random() * maxWaitingTime);\n }\n const isMeetingActive = !!destination.fullState?.active;\n // @ts-ignore\n const {enableUnifiedMeetings} = this.config.experimental;\n\n if (enableUnifiedMeetings && !isMeetingActive && useRandomDelayForInfo && waitingTime > 0) {\n meeting.fetchMeetingInfoTimeoutId = setTimeout(\n () => meeting.fetchMeetingInfo({extraParams: infoExtraParams}),\n waitingTime\n );\n meeting.parseMeetingInfo(undefined, destination);\n } else {\n await meeting.fetchMeetingInfo({extraParams: infoExtraParams});\n }\n } catch (err) {\n if (\n !(err instanceof CaptchaError) &&\n !(err instanceof PasswordError) &&\n !(err instanceof PermissionError)\n ) {\n // if there is no meeting info we assume its a 1:1 call or wireless share\n LoggerProxy.logger.info(\n `Meetings:index#createMeeting --> Info Unable to fetch meeting info for ${destination}.`\n );\n LoggerProxy.logger.info(\n 'Meetings:index#createMeeting --> Info assuming this destination is a 1:1 or wireless share'\n );\n }\n LoggerProxy.logger.debug(\n `Meetings:index#createMeeting --> Debug ${err} fetching /meetingInfo for creation.`\n );\n } finally {\n // For type LOCUS_ID we need to parse the locus object to get the information\n // about the caller and callee\n // Meeting Added event will be created in `handleLocusEvent`\n if (type !== _LOCUS_ID_) {\n if (!meeting.sipUri) {\n meeting.setSipUri(destination);\n }\n\n // TODO: check if we have to move this to parser\n const meetingAddedType = MeetingsUtil.getMeetingAddedType(type);\n\n // We typically shouldn't need to trigger both and event and return a promise.\n // Is this a special case? We want to make the public API usage as simple as possible.\n Trigger.trigger(\n this,\n {\n file: 'meetings',\n function: 'createMeeting',\n },\n EVENT_TRIGGERS.MEETING_ADDED,\n {\n meeting,\n type: meetingAddedType,\n }\n );\n }\n }\n\n return meeting;\n\n // Create the meeting calling the necessary service endpoints.\n\n // Internally, there are many more destinations:\n //\n // - locusID\n // - meetingURL\n // - globalMeetingID, e.g, *00*meetingID\n // - meetingID\n // - meetingURL\n // - PSTN\n // - phone number\n //\n // Our job is to determine the appropriate one\n // and its corresponding service so that developers\n // need only sipURL or spaceID to get a meeting\n // and its ID, but have the option to use createWithType()\n // and specify those types to get meetingInfo\n }\n\n /**\n * get a specifc meeting given it's type matched to the value, i.e., locus url\n * @param {String} type\n * @param {Object} value\n * @returns {Meeting}\n * @public\n * @memberof Meetings\n */\n public getMeetingByType(type: string, value: object) {\n return this.meetingCollection.getByKey(type, value);\n }\n\n /**\n * Get all meetings.\n * @param {object} options\n * @param {object} options.startDate - get meetings after this start date\n * @param {object} options.endDate - get meetings before this end date\n * @returns {Object} All currently active meetings.\n * @public\n * @memberof Meetings\n */\n public getAllMeetings(\n options: {\n startDate: object;\n endDate: object;\n } = {} as any\n ) {\n // Options may include other parameters to filter this collection\n // of meetings.\n return this.meetingCollection.getAll(options);\n }\n\n /**\n * syncs all the meeting from server\n * @returns {undefined}\n * @public\n * @memberof Meetings\n */\n public syncMeetings() {\n return this.request\n .getActiveMeetings()\n .then((locusArray) => {\n const activeLocusUrl = [];\n\n if (locusArray?.loci && locusArray.loci.length > 0) {\n const lociToUpdate = this.sortLocusArrayToUpdate(locusArray.loci);\n lociToUpdate.forEach((locus) => {\n activeLocusUrl.push(locus.url);\n this.handleLocusEvent({\n locus,\n locusUrl: locus.url,\n });\n });\n }\n const meetingsCollection = this.meetingCollection.getAll();\n\n if (Object.keys(meetingsCollection).length > 0) {\n // Some time the mercury event is missed after mercury reconnect\n // if sync returns no locus then clear all the meetings\n for (const meeting of Object.values(meetingsCollection)) {\n // @ts-ignore\n if (!activeLocusUrl.includes(meeting.locusUrl)) {\n // destroy function also uploads logs\n // @ts-ignore\n this.destroy(meeting, MEETING_REMOVED_REASON.NO_MEETINGS_TO_SYNC);\n }\n }\n }\n })\n .catch((error) => {\n LoggerProxy.logger.error(\n `Meetings:index#syncMeetings --> failed to sync meetings, ${error}`\n );\n throw new Error(error);\n });\n }\n\n /**\n * sort out locus array for initial creating\n * @param {Array} loci original locus array\n * @returns {undefined}\n * @public\n * @memberof Meetings\n */\n sortLocusArrayToUpdate(loci: any[]) {\n const mainLoci = loci.filter((locus) => !MeetingsUtil.isBreakoutLocusDTO(locus));\n const breakoutLoci = loci.filter((locus) => MeetingsUtil.isValidBreakoutLocus(locus));\n this.breakoutLocusForHandleLater = [];\n const lociToUpdate = [...mainLoci];\n breakoutLoci.forEach((breakoutLocus) => {\n const associateMainLocus = mainLoci.find(\n (mainLocus) => mainLocus.controls?.breakout?.url === breakoutLocus.controls?.breakout?.url\n );\n const existCorrespondingMeeting = this.getCorrespondingMeetingByLocus({\n locus: breakoutLocus,\n locusUrl: breakoutLocus.url,\n });\n\n if (associateMainLocus && !existCorrespondingMeeting) {\n // if exists both main session and breakout session locus of the same non-exist meeting, handle main locus first,\n // after meeting create with main locus, then handle the associate breakout locus.\n // if only handle breakout locus, will miss some date\n this.breakoutLocusForHandleLater.push(breakoutLocus);\n } else {\n lociToUpdate.push(breakoutLocus);\n }\n });\n\n return lociToUpdate;\n }\n\n /**\n * check breakout locus which waiting for main locus's meeting to be created, then handle the breakout locus\n * @param {Object} newCreatedLocus the locus which just create meeting object of it\n * @returns {undefined}\n * @public\n * @memberof Meetings\n */\n checkHandleBreakoutLocus(newCreatedLocus) {\n if (\n !newCreatedLocus ||\n !this.breakoutLocusForHandleLater ||\n !this.breakoutLocusForHandleLater.length\n ) {\n return;\n }\n if (MeetingsUtil.isBreakoutLocusDTO(newCreatedLocus)) {\n return;\n }\n const existIndex = this.breakoutLocusForHandleLater.findIndex(\n (breakoutLocus) =>\n breakoutLocus.controls?.breakout?.url === newCreatedLocus.controls?.breakout?.url\n );\n\n if (existIndex < 0) {\n return;\n }\n\n const associateBreakoutLocus = this.breakoutLocusForHandleLater[existIndex];\n this.handleLocusEvent({locus: associateBreakoutLocus, locusUrl: associateBreakoutLocus.url});\n this.breakoutLocusForHandleLater.splice(existIndex, 1);\n }\n\n /**\n * Get all scheduled meetings.\n * @param {object} options\n * @param {object} options.startDate - get meetings after this start date\n * @param {object} options.endDate - get meetings before this end date\n * @returns {Object} All scheduled meetings.\n * @memberof Meetings\n */\n getScheduledMeetings() {\n return this.meetingCollection.getAll({scheduled: true});\n }\n\n /**\n * Get the logger instance for plugin-meetings\n * @returns {Logger}\n */\n getLogger() {\n return LoggerProxy.get();\n }\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@webex/plugin-meetings",
3
- "version": "3.0.0-beta.156",
3
+ "version": "3.0.0-beta.158",
4
4
  "description": "",
5
5
  "license": "Cisco EULA (https://www.cisco.com/c/en/us/products/end-user-license-agreement.html)",
6
6
  "contributors": [
@@ -32,12 +32,12 @@
32
32
  "build": "yarn run -T tsc --declaration true --declarationDir ./dist/types"
33
33
  },
34
34
  "devDependencies": {
35
- "@webex/plugin-meetings": "3.0.0-beta.156",
36
- "@webex/test-helper-chai": "3.0.0-beta.156",
37
- "@webex/test-helper-mocha": "3.0.0-beta.156",
38
- "@webex/test-helper-mock-webex": "3.0.0-beta.156",
39
- "@webex/test-helper-retry": "3.0.0-beta.156",
40
- "@webex/test-helper-test-users": "3.0.0-beta.156",
35
+ "@webex/plugin-meetings": "3.0.0-beta.158",
36
+ "@webex/test-helper-chai": "3.0.0-beta.158",
37
+ "@webex/test-helper-mocha": "3.0.0-beta.158",
38
+ "@webex/test-helper-mock-webex": "3.0.0-beta.158",
39
+ "@webex/test-helper-retry": "3.0.0-beta.158",
40
+ "@webex/test-helper-test-users": "3.0.0-beta.158",
41
41
  "chai": "^4.3.4",
42
42
  "chai-as-promised": "^7.1.1",
43
43
  "jsdom-global": "3.0.2",
@@ -46,19 +46,19 @@
46
46
  "typescript": "^4.7.4"
47
47
  },
48
48
  "dependencies": {
49
- "@webex/common": "3.0.0-beta.156",
50
- "@webex/internal-media-core": "1.38.5",
51
- "@webex/internal-plugin-conversation": "3.0.0-beta.156",
52
- "@webex/internal-plugin-device": "3.0.0-beta.156",
53
- "@webex/internal-plugin-llm": "3.0.0-beta.156",
54
- "@webex/internal-plugin-mercury": "3.0.0-beta.156",
55
- "@webex/internal-plugin-metrics": "3.0.0-beta.156",
56
- "@webex/internal-plugin-support": "3.0.0-beta.156",
57
- "@webex/internal-plugin-user": "3.0.0-beta.156",
58
- "@webex/media-helpers": "3.0.0-beta.156",
59
- "@webex/plugin-people": "3.0.0-beta.156",
60
- "@webex/plugin-rooms": "3.0.0-beta.156",
61
- "@webex/webex-core": "3.0.0-beta.156",
49
+ "@webex/common": "3.0.0-beta.158",
50
+ "@webex/internal-media-core": "1.38.6",
51
+ "@webex/internal-plugin-conversation": "3.0.0-beta.158",
52
+ "@webex/internal-plugin-device": "3.0.0-beta.158",
53
+ "@webex/internal-plugin-llm": "3.0.0-beta.158",
54
+ "@webex/internal-plugin-mercury": "3.0.0-beta.158",
55
+ "@webex/internal-plugin-metrics": "3.0.0-beta.158",
56
+ "@webex/internal-plugin-support": "3.0.0-beta.158",
57
+ "@webex/internal-plugin-user": "3.0.0-beta.158",
58
+ "@webex/media-helpers": "3.0.0-beta.158",
59
+ "@webex/plugin-people": "3.0.0-beta.158",
60
+ "@webex/plugin-rooms": "3.0.0-beta.158",
61
+ "@webex/webex-core": "3.0.0-beta.158",
62
62
  "ampersand-collection": "^2.0.2",
63
63
  "bowser": "^2.11.0",
64
64
  "btoa": "^1.2.1",
@@ -1487,7 +1487,7 @@ export default class LocusInfo extends EventsScope {
1487
1487
  * @memberof LocusInfo
1488
1488
  */
1489
1489
  getTheLocusToUpdate(newLocus: any) {
1490
- const switchStatus = ControlsUtils.getSessionSwitchStatus(this.controls, newLocus.controls);
1490
+ const switchStatus = ControlsUtils.getSessionSwitchStatus(this.controls, newLocus?.controls);
1491
1491
  if (switchStatus.isReturnToMain && this.mainSessionLocusCache) {
1492
1492
  return cloneDeep(this.mainSessionLocusCache);
1493
1493
  }
@@ -261,6 +261,9 @@ export default class Meetings extends WebexPlugin {
261
261
  const isSelfMoved = newLocus?.self?.state === _LEFT_ && newLocus?.self?.reason === _MOVED_;
262
262
  // @ts-ignore
263
263
  const deviceFromNewLocus = MeetingsUtil.getThisDevice(newLocus, this.webex.internal.device.url);
264
+ const isResourceMovedOnThisDevice =
265
+ deviceFromNewLocus?.state === _LEFT_ && deviceFromNewLocus?.reason === _MOVED_;
266
+
264
267
  const isNewLocusJoinThisDevice = MeetingsUtil.joinedOnThisDevice(
265
268
  meeting,
266
269
  newLocus,
@@ -300,9 +303,16 @@ export default class Meetings extends WebexPlugin {
300
303
 
301
304
  return false;
302
305
  }
303
- if (isSelfMoved && newLocus?.self?.removed) {
306
+ if (isSelfMoved && (newLocus?.self?.removed || isResourceMovedOnThisDevice)) {
307
+ LoggerProxy.logger.log(
308
+ 'Meetings:index#isNeedHandleMainLocus --> self moved main locus with self removed status or with device resource moved, not need to handle'
309
+ );
310
+
311
+ return false;
312
+ }
313
+ if (isSelfJoined && isResourceMovedOnThisDevice) {
304
314
  LoggerProxy.logger.log(
305
- 'Meetings:index#isNeedHandleMainLocus --> self moved main locus with self removed status, not need to handle'
315
+ 'Meetings:index#isNeedHandleMainLocus --> self device left&moved in main locus with self joined status, not need to handle'
306
316
  );
307
317
 
308
318
  return false;
@@ -1083,7 +1083,7 @@ describe('plugin-meetings', () => {
1083
1083
  'meeting:meetingInfoAvailable'
1084
1084
  );
1085
1085
  };
1086
-
1086
+
1087
1087
  it('creates the meeting from a successful meeting info fetch promise testing', async () => {
1088
1088
  const meeting = await webex.meetings.createMeeting('test destination', 'test type');
1089
1089
 
@@ -1104,7 +1104,7 @@ describe('plugin-meetings', () => {
1104
1104
  permissionToken: 'PT',
1105
1105
  meetingJoinUrl: 'meetingJoinUrl',
1106
1106
  };
1107
-
1107
+
1108
1108
  assert.instanceOf(
1109
1109
  meeting,
1110
1110
  Meeting,
@@ -1112,7 +1112,7 @@ describe('plugin-meetings', () => {
1112
1112
  );
1113
1113
  checkCreateWithoutDelay(meeting, 'test destination', 'test type', infoExtraParamsProvided ? infoExtraParams : {}, expectedMeetingData);
1114
1114
  });
1115
-
1115
+
1116
1116
  it(`creates the meeting from a successful meeting info fetch with random delay${infoExtraParamsProvided ? ' with infoExtraParams' : ''}`, async () => {
1117
1117
  const FAKE_LOCUS_MEETING = {
1118
1118
  conversationUrl: 'locusConvURL',
@@ -1129,14 +1129,14 @@ describe('plugin-meetings', () => {
1129
1129
  active: false,
1130
1130
  },
1131
1131
  };
1132
-
1132
+
1133
1133
  const meeting = await webex.meetings.createMeeting(
1134
1134
  FAKE_LOCUS_MEETING,
1135
1135
  'test type',
1136
1136
  true,
1137
1137
  infoExtraParams
1138
1138
  );
1139
-
1139
+
1140
1140
  assert.instanceOf(
1141
1141
  meeting,
1142
1142
  Meeting,
@@ -1144,7 +1144,7 @@ describe('plugin-meetings', () => {
1144
1144
  );
1145
1145
  assert.notCalled(webex.meetings.meetingInfo.fetchMeetingInfo);
1146
1146
  assert.calledOnce(setTimeoutSpy);
1147
-
1147
+
1148
1148
  // Parse meeting info with locus object
1149
1149
  assert.equal(meeting.conversationUrl, 'locusConvURL');
1150
1150
  assert.equal(meeting.locusUrl, 'locusUrl');
@@ -1153,7 +1153,7 @@ describe('plugin-meetings', () => {
1153
1153
  assert.isUndefined(meeting.meetingJoinUrl);
1154
1154
  assert.equal(meeting.owner, 'locusOwner');
1155
1155
  assert.isUndefined(meeting.permissionToken);
1156
-
1156
+
1157
1157
  // Add meeting and send trigger
1158
1158
  assert.calledWith(MeetingsUtil.getMeetingAddedType, 'test type');
1159
1159
  assert.calledTwice(TriggerProxy.trigger);
@@ -1170,7 +1170,7 @@ describe('plugin-meetings', () => {
1170
1170
  type: 'test meeting added type',
1171
1171
  }
1172
1172
  );
1173
-
1173
+
1174
1174
  // When timer expires
1175
1175
  clock.tick(FAKE_TIME_TO_START);
1176
1176
  assert.calledWith(
@@ -1183,7 +1183,7 @@ describe('plugin-meetings', () => {
1183
1183
  undefined,
1184
1184
  infoExtraParamsProvided ? infoExtraParams : {}
1185
1185
  );
1186
-
1186
+
1187
1187
  // Parse meeting info is called again with new meeting info
1188
1188
  await testUtils.flushPromises();
1189
1189
  assert.equal(meeting.conversationUrl, 'locusConvURL');
@@ -1193,7 +1193,7 @@ describe('plugin-meetings', () => {
1193
1193
  assert.equal(meeting.meetingJoinUrl, 'meetingJoinUrl');
1194
1194
  assert.equal(meeting.owner, 'locusOwner');
1195
1195
  assert.equal(meeting.permissionToken, 'PT');
1196
-
1196
+
1197
1197
  assert.calledWith(
1198
1198
  TriggerProxy.trigger,
1199
1199
  meeting,
@@ -1744,7 +1744,41 @@ describe('plugin-meetings', () => {
1744
1744
  assert.equal(result, false);
1745
1745
  assert.calledWith(
1746
1746
  LoggerProxy.logger.log,
1747
- 'Meetings:index#isNeedHandleMainLocus --> self moved main locus with self removed status, not need to handle'
1747
+ 'Meetings:index#isNeedHandleMainLocus --> self moved main locus with self removed status or with device resource moved, not need to handle'
1748
+ );
1749
+ });
1750
+
1751
+ it('check self is moved and device resource removed, return false', () => {
1752
+ webex.meetings.meetingCollection.getActiveBreakoutLocus = sinon.stub().returns(null);
1753
+ newLocus.self.state = 'LEFT';
1754
+ newLocus.self.reason = 'MOVED';
1755
+ sinon.stub(MeetingsUtil, 'getThisDevice').returns({
1756
+ state: 'LEFT',
1757
+ reason: 'MOVED',
1758
+ });
1759
+ LoggerProxy.logger.log = sinon.stub();
1760
+ const result = webex.meetings.isNeedHandleMainLocus(meeting, newLocus);
1761
+ assert.equal(result, false);
1762
+ assert.calledWith(
1763
+ LoggerProxy.logger.log,
1764
+ 'Meetings:index#isNeedHandleMainLocus --> self moved main locus with self removed status or with device resource moved, not need to handle'
1765
+ );
1766
+ });
1767
+
1768
+ it('check self is joined but device resource removed, return false', () => {
1769
+ webex.meetings.meetingCollection.getActiveBreakoutLocus = sinon.stub().returns(null);
1770
+ sinon.stub(MeetingsUtil, 'joinedOnThisDevice').returns(false);
1771
+ newLocus.self.state = 'JOINED';
1772
+ sinon.stub(MeetingsUtil, 'getThisDevice').returns({
1773
+ state: 'LEFT',
1774
+ reason: 'MOVED',
1775
+ });
1776
+ LoggerProxy.logger.log = sinon.stub();
1777
+ const result = webex.meetings.isNeedHandleMainLocus(meeting, newLocus);
1778
+ assert.equal(result, false);
1779
+ assert.calledWith(
1780
+ LoggerProxy.logger.log,
1781
+ 'Meetings:index#isNeedHandleMainLocus --> self device left&moved in main locus with self joined status, not need to handle'
1748
1782
  );
1749
1783
  });
1750
1784
  });