@webex/plugin-meetings 1.156.2 → 1.157.0

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.
@@ -208,22 +208,14 @@ var LocusInfo = /*#__PURE__*/function (_EventsScope) {
208
208
  }
209
209
  /**
210
210
  * @param {Object} locus
211
- * @param {Meeting} meeting
212
211
  * @returns {undefined}
213
212
  * @memberof LocusInfo
214
213
  */
215
214
 
216
215
  }, {
217
216
  key: "initialSetup",
218
- value: function initialSetup(locus, meeting) {
219
- // meeting already exisits just do an update
220
- if (meeting) {
221
- // Its a new delta event fetch the whole meeting object
222
- this.locusParser.onDeltaEvent(locus);
223
- } else {
224
- this.onFullLocus(locus);
225
- } // Change it to true after it recives it first locus object
226
-
217
+ value: function initialSetup(locus) {
218
+ this.onFullLocus(locus); // Change it to true after it receives it first locus object
227
219
 
228
220
  this.emitChange = true;
229
221
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["index.js"],"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","then","res","onFullLocus","body","resume","LoggerProxy","logger","info","onDeltaAction","parsedLoci","applyLocusDeltaData","onDeltaEvent","created","scheduledMeeting","participantsUrl","replaces","aclUrl","baseSequence","sequence","membership","identities","participants","deltaParticipants","updateParticipants","updateConversationUrl","conversationUrl","updateControls","controls","updateLocusUrl","url","updateFullState","fullState","updateMeetingInfo","updateSelf","self","updateHostInfo","host","updateMediaShares","mediaShares","data","eventType","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","updateLocusInfo","isMeetingActive","handleOneOnOneEvent","workingCopy","type","_CALL_","_SIP_BRIDGE_","emitScoped","file","function","EVENTS","REMOTE_RESPONSE","remoteDeclined","remoteAnswered","updateCreated","updateParticipantsUrl","updateReplace","replace","updateAclUrl","updateBasequence","updateSequence","updateMemberShip","updateIdentifiers","compareAndUpdate","length","find","participant","identity","_USER_","removed","partner","getLocusPartner","state","LOCUS","STATE","INACTIVE","warn","Metrics","postEvent","event","REMOTE_ENDED","DESTROY_MEETING","reason","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","LOCUS_INFO_UPDATE_PARTICIPANTS","recordingId","record","modifiedBy","selfId","ControlsUtils","parse","getControls","updates","hasRecordingChanged","hasRecordingPausedChanged","current","paused","RECORDING_STATE","PAUSED","recording","RESUMED","RECORDING","LOCUSINFO","CONTROLS_RECORDING_UPDATED","lastModified","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","InfoUtils","parsePolicy","parseModerator","parsedInfo","getInfos","MEETING_INFO_UPDATED","isLocked","MEETING_LOCKED","isUnlocked","MEETING_UNLOCKED","parsedMediaShares","MediaSharesUtils","getMediaShares","LOCUS_INFO_UPDATE_MEDIA_SHARES","parsedSelves","SelfUtils","getSelves","internal","device","element","getSipUrl","sipUri","moderatorChanged","isMediaInactiveOrReleased","DISCONNECT_DUE_TO_INACTIVITY","SELF_MODERATOR_CHANGED","localAudioUnmuteRequiredByServer","LOCAL_UNMUTE_REQUIRED","muted","remoteMuted","unmuteAllowed","isMutedByOthersChanged","SELF_REMOTE_MUTE_STATUS_UPDATED","localAudioUnmuteRequestedByServer","LOCAL_UNMUTE_REQUESTED","isUnadmittedGuest","SELF_UNADMITTED_GUEST","isAdmittedGuest","SELF_ADMITTED_GUEST","isMediaInactive","MEDIA_INACTIVITY","getMediaStatus","mediaSessions","audioStateChange","videoStateChange","shareStateChange","MEDIA_STATUS_CHANGE","currentMediaStatus","audio","video","shareStatus","share","LOCUS_INFO_UPDATE_SELF","oldSelf","newSelf","LOCUS_INFO_UPDATE_URL","EventsScope"],"mappings":"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","sourcesContent":["import {isEqual} 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 '../locus-info/infoUtils';\nimport FullState from '../locus-info/fullState';\nimport SelfUtils from '../locus-info/selfUtils';\nimport HostUtils from '../locus-info/hostUtils';\nimport ControlsUtils from '../locus-info/controlsUtils';\nimport MediaSharesUtils from '../locus-info/mediaSharesUtils';\nimport LocusDeltaParser from '../locus-info/parser';\n\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 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 /**\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, locus, meeting) {\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.getFullLocus({\n desync: true,\n locusUrl: meeting.locusUrl\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(`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, meeting) {\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 /**\n * @param {Locus} locus\n * @returns {undefined}\n * @memberof LocusInfo\n */\n init(locus = {}) {\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 // 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);\n this.updateLocusUrl(locus.url);\n this.updateFullState(locus.fullState);\n this.updateMeetingInfo(locus.info);\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 }\n\n /**\n * @param {Object} locus\n * @param {Meeting} meeting\n * @returns {undefined}\n * @memberof LocusInfo\n */\n initialSetup(locus, meeting) {\n // meeting already exisits just do an update\n if (meeting) {\n // Its a new delta event fetch the whole meeting object\n this.locusParser.onDeltaEvent(locus);\n }\n else {\n this.onFullLocus(locus);\n }\n\n // Change it to true after it recives 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, data) {\n const {eventType} = data;\n\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(data.locus, eventType);\n break;\n case LOCUSEVENT.DIFFERENCE:\n this.handleLocusDelta(data.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(data.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, eventName, args) {\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 {sting} eventType particulat locus event\n * @returns {object} null\n * @memberof LocusInfo\n */\n onFullLocus(locus, eventType) {\n if (!locus) {\n LoggerProxy.logger.error('Locus-info:index#onFullLocus --> object passed as argument was invalid, continuing.');\n }\n this.updateParticipantDeltas(locus.participants);\n this.scheduledMeeting = locus.meeting || null;\n this.participants = locus.participants;\n this.updateLocusInfo(locus);\n this.updateParticipants(locus.participants);\n this.isMeetingActive();\n this.handleOneOnOneEvent(eventType);\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 handleOneOnOneEvent(eventType) {\n if (this.parsedLocus.fullState.type === _CALL_ || this.parsedLocus.fullState.type === _SIP_BRIDGE_) {\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) {\n this.updateLocusInfo(locus);\n this.updateParticipants(locus.participants);\n this.isMeetingActive();\n }\n\n /**\n * @param {Object} locus\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateLocusInfo(locus) {\n this.updateControls(locus.controls);\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.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, self) {\n if (!participants || participants.length === 0) {\n return null;\n }\n\n return participants.find((participant) =>\n (self && participant.identity !== self.identity) &&\n (participants.length <= 2 || (participant.type === _USER_ && !participant.removed))) || this.partner;\n }\n\n // TODO: all the leave states need to be checked\n /**\n * @returns {undefined}\n * @memberof LocusInfo\n */\n isMeetingActive() {\n if ((this.parsedLocus.fullState.type === _CALL_) || (this.parsedLocus.fullState.type === _SIP_BRIDGE_)) {\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('Locus-info:index#isMeetingActive --> Call Ended, locus state is inactive.');\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 }\n else\n if (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 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: this.parsedLocus.self.joinedWith && this.parsedLocus.self.joinedWith.state !== _LEFT_\n }\n );\n }\n else\n if (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 }\n else if (this.parsedLocus.fullState.type === _MEETING_) {\n if (this.fullState && (this.fullState.state === LOCUS.STATE.INACTIVE || this.fullState.state === LOCUS.STATE.TERMINATING)) {\n LoggerProxy.logger.warn('Locus-info:index#isMeetingActive --> Meeting is ending due to inactive or terminating');\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 }\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 }\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 (this.compareAndUpdateFlags.compareSelfAndHost || this.compareAndUpdateFlags.compareHostAndSelf) {\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 ((this.parsedLocus.self.selfIdentity === this.parsedLocus.host?.hostId) && this.parsedLocus.self.moderator) {\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 }\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 = []) {\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 = {}, newState = {}) => {\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(\n (key) => {\n if (deltas[key] !== true) {\n delete deltas[key];\n }\n }\n );\n\n return deltas;\n };\n\n this.deltaParticipants = participants.reduce(\n (collection, participant) => {\n const existingParticipant = findParticipant(\n participant,\n this.participants || []\n ) || {};\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 /**\n *\n * @param {Object} participants new participants object\n * @param {boolen} deltaParticpantFlag delta event\n * @returns {Array} updatedParticipants\n * @memberof LocusInfo\n */\n updateParticipants(participants) {\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 }\n );\n }\n\n /**\n * @param {Object} controls\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateControls(controls) {\n if (controls && !isEqual(this.controls, controls)) {\n this.parsedLocus.controls = ControlsUtils.parse(controls);\n const {updates: {hasRecordingChanged, hasRecordingPausedChanged}, current} = ControlsUtils.getControls(this.controls, controls);\n\n if (hasRecordingChanged || hasRecordingPausedChanged) {\n let state = null;\n\n if (hasRecordingPausedChanged) {\n if (current.record.paused) {\n state = RECORDING_STATE.PAUSED;\n }\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 }\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 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, info) {\n if (conversationUrl && !isEqual(this.conversationUrl, conversationUrl)) {\n this.conversationUrl = conversationUrl;\n this.updateMeeting({conversationUrl});\n }\n else if (info && info.conversationUrl && !isEqual(this.conversationUrl, info.conversationUrl)) {\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) {\n if (created && !isEqual(this.created, created)) {\n this.created = created;\n }\n }\n\n\n /**\n * @param {Object} fullState\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateFullState(fullState) {\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) {\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 }\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, self) {\n if (info && (!isEqual(this.info, info) ||\n !isEqual(InfoUtils.parsePolicy(info), InfoUtils.parsePolicy(this.info)) ||\n !isEqual(InfoUtils.parseModerator(info) || InfoUtils.parseModerator(info)))) {\n const parsedInfo = InfoUtils.getInfos(this.parsedLocus.info, info);\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 }\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) {\n if (mediaShares && !isEqual(this.mediaShares, mediaShares)) {\n const parsedMediaShares = MediaSharesUtils.getMediaShares(this.mediaShares, mediaShares);\n\n this.updateMeeting(parsedMediaShares.current);\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 this.parsedLocus.mediaShares = parsedMediaShares.current;\n this.mediaShares = mediaShares;\n }\n }\n\n /**\n * @param {String} participantsUrl\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateParticipantsUrl(participantsUrl) {\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) {\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, participants) {\n if (self && !isEqual(this.self, self)) {\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(this.getLocusPartner(participants, self), this.parsedLocus.fullState.type, this.parsedLocus.info.sipUri);\n\n if (result.sipUri) {\n this.updateMeeting(result);\n }\n\n if (parsedSelves.updates.moderatorChanged) {\n this.compareAndUpdateFlags.compareHostAndSelf = true;\n }\n else {\n this.compareAndUpdateFlags.compareHostAndSelf = false;\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 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.isUnadmittedGuest) {\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.isAdmittedGuest) {\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 LOCUSINFO.EVENTS.MEDIA_INACTIVITY,\n SelfUtils.getMediaStatus(self.mediaSessions)\n );\n }\n\n if (parsedSelves.updates.audioStateChange || parsedSelves.updates.videoStateChange || parsedSelves.updates.shareStateChange) {\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\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 this.self = self;\n }\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) {\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) {\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) {\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) {\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) {\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) {\n if (identities && !isEqual(this.identities, identities)) {\n this.identities = identities;\n }\n }\n}\n"]}
1
+ {"version":3,"sources":["index.js"],"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","then","res","onFullLocus","body","resume","LoggerProxy","logger","info","onDeltaAction","parsedLoci","applyLocusDeltaData","onDeltaEvent","created","scheduledMeeting","participantsUrl","replaces","aclUrl","baseSequence","sequence","membership","identities","participants","deltaParticipants","updateParticipants","updateConversationUrl","conversationUrl","updateControls","controls","updateLocusUrl","url","updateFullState","fullState","updateMeetingInfo","updateSelf","self","updateHostInfo","host","updateMediaShares","mediaShares","data","eventType","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","updateLocusInfo","isMeetingActive","handleOneOnOneEvent","workingCopy","type","_CALL_","_SIP_BRIDGE_","emitScoped","file","function","EVENTS","REMOTE_RESPONSE","remoteDeclined","remoteAnswered","updateCreated","updateParticipantsUrl","updateReplace","replace","updateAclUrl","updateBasequence","updateSequence","updateMemberShip","updateIdentifiers","compareAndUpdate","length","find","participant","identity","_USER_","removed","partner","getLocusPartner","state","LOCUS","STATE","INACTIVE","warn","Metrics","postEvent","event","REMOTE_ENDED","DESTROY_MEETING","reason","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","LOCUS_INFO_UPDATE_PARTICIPANTS","recordingId","record","modifiedBy","selfId","ControlsUtils","parse","getControls","updates","hasRecordingChanged","hasRecordingPausedChanged","current","paused","RECORDING_STATE","PAUSED","recording","RESUMED","RECORDING","LOCUSINFO","CONTROLS_RECORDING_UPDATED","lastModified","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","InfoUtils","parsePolicy","parseModerator","parsedInfo","getInfos","MEETING_INFO_UPDATED","isLocked","MEETING_LOCKED","isUnlocked","MEETING_UNLOCKED","parsedMediaShares","MediaSharesUtils","getMediaShares","LOCUS_INFO_UPDATE_MEDIA_SHARES","parsedSelves","SelfUtils","getSelves","internal","device","element","getSipUrl","sipUri","moderatorChanged","isMediaInactiveOrReleased","DISCONNECT_DUE_TO_INACTIVITY","SELF_MODERATOR_CHANGED","localAudioUnmuteRequiredByServer","LOCAL_UNMUTE_REQUIRED","muted","remoteMuted","unmuteAllowed","isMutedByOthersChanged","SELF_REMOTE_MUTE_STATUS_UPDATED","localAudioUnmuteRequestedByServer","LOCAL_UNMUTE_REQUESTED","isUnadmittedGuest","SELF_UNADMITTED_GUEST","isAdmittedGuest","SELF_ADMITTED_GUEST","isMediaInactive","MEDIA_INACTIVITY","getMediaStatus","mediaSessions","audioStateChange","videoStateChange","shareStateChange","MEDIA_STATUS_CHANGE","currentMediaStatus","audio","video","shareStatus","share","LOCUS_INFO_UPDATE_SELF","oldSelf","newSelf","LOCUS_INFO_UPDATE_URL","EventsScope"],"mappings":"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","sourcesContent":["import {isEqual} 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 '../locus-info/infoUtils';\nimport FullState from '../locus-info/fullState';\nimport SelfUtils from '../locus-info/selfUtils';\nimport HostUtils from '../locus-info/hostUtils';\nimport ControlsUtils from '../locus-info/controlsUtils';\nimport MediaSharesUtils from '../locus-info/mediaSharesUtils';\nimport LocusDeltaParser from '../locus-info/parser';\n\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 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 /**\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, locus, meeting) {\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.getFullLocus({\n desync: true,\n locusUrl: meeting.locusUrl\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(`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, meeting) {\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 /**\n * @param {Locus} locus\n * @returns {undefined}\n * @memberof LocusInfo\n */\n init(locus = {}) {\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 // 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);\n this.updateLocusUrl(locus.url);\n this.updateFullState(locus.fullState);\n this.updateMeetingInfo(locus.info);\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 }\n\n /**\n * @param {Object} locus\n * @returns {undefined}\n * @memberof LocusInfo\n */\n initialSetup(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, data) {\n const {eventType} = data;\n\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(data.locus, eventType);\n break;\n case LOCUSEVENT.DIFFERENCE:\n this.handleLocusDelta(data.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(data.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, eventName, args) {\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 {sting} eventType particulat locus event\n * @returns {object} null\n * @memberof LocusInfo\n */\n onFullLocus(locus, eventType) {\n if (!locus) {\n LoggerProxy.logger.error('Locus-info:index#onFullLocus --> object passed as argument was invalid, continuing.');\n }\n this.updateParticipantDeltas(locus.participants);\n this.scheduledMeeting = locus.meeting || null;\n this.participants = locus.participants;\n this.updateLocusInfo(locus);\n this.updateParticipants(locus.participants);\n this.isMeetingActive();\n this.handleOneOnOneEvent(eventType);\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 handleOneOnOneEvent(eventType) {\n if (this.parsedLocus.fullState.type === _CALL_ || this.parsedLocus.fullState.type === _SIP_BRIDGE_) {\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) {\n this.updateLocusInfo(locus);\n this.updateParticipants(locus.participants);\n this.isMeetingActive();\n }\n\n /**\n * @param {Object} locus\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateLocusInfo(locus) {\n this.updateControls(locus.controls);\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.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, self) {\n if (!participants || participants.length === 0) {\n return null;\n }\n\n return participants.find((participant) =>\n (self && participant.identity !== self.identity) &&\n (participants.length <= 2 || (participant.type === _USER_ && !participant.removed))) || this.partner;\n }\n\n // TODO: all the leave states need to be checked\n /**\n * @returns {undefined}\n * @memberof LocusInfo\n */\n isMeetingActive() {\n if ((this.parsedLocus.fullState.type === _CALL_) || (this.parsedLocus.fullState.type === _SIP_BRIDGE_)) {\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('Locus-info:index#isMeetingActive --> Call Ended, locus state is inactive.');\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 }\n else\n if (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 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: this.parsedLocus.self.joinedWith && this.parsedLocus.self.joinedWith.state !== _LEFT_\n }\n );\n }\n else\n if (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 }\n else if (this.parsedLocus.fullState.type === _MEETING_) {\n if (this.fullState && (this.fullState.state === LOCUS.STATE.INACTIVE || this.fullState.state === LOCUS.STATE.TERMINATING)) {\n LoggerProxy.logger.warn('Locus-info:index#isMeetingActive --> Meeting is ending due to inactive or terminating');\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 }\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 }\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 (this.compareAndUpdateFlags.compareSelfAndHost || this.compareAndUpdateFlags.compareHostAndSelf) {\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 ((this.parsedLocus.self.selfIdentity === this.parsedLocus.host?.hostId) && this.parsedLocus.self.moderator) {\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 }\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 = []) {\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 = {}, newState = {}) => {\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(\n (key) => {\n if (deltas[key] !== true) {\n delete deltas[key];\n }\n }\n );\n\n return deltas;\n };\n\n this.deltaParticipants = participants.reduce(\n (collection, participant) => {\n const existingParticipant = findParticipant(\n participant,\n this.participants || []\n ) || {};\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 /**\n *\n * @param {Object} participants new participants object\n * @param {boolen} deltaParticpantFlag delta event\n * @returns {Array} updatedParticipants\n * @memberof LocusInfo\n */\n updateParticipants(participants) {\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 }\n );\n }\n\n /**\n * @param {Object} controls\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateControls(controls) {\n if (controls && !isEqual(this.controls, controls)) {\n this.parsedLocus.controls = ControlsUtils.parse(controls);\n const {updates: {hasRecordingChanged, hasRecordingPausedChanged}, current} = ControlsUtils.getControls(this.controls, controls);\n\n if (hasRecordingChanged || hasRecordingPausedChanged) {\n let state = null;\n\n if (hasRecordingPausedChanged) {\n if (current.record.paused) {\n state = RECORDING_STATE.PAUSED;\n }\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 }\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 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, info) {\n if (conversationUrl && !isEqual(this.conversationUrl, conversationUrl)) {\n this.conversationUrl = conversationUrl;\n this.updateMeeting({conversationUrl});\n }\n else if (info && info.conversationUrl && !isEqual(this.conversationUrl, info.conversationUrl)) {\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) {\n if (created && !isEqual(this.created, created)) {\n this.created = created;\n }\n }\n\n\n /**\n * @param {Object} fullState\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateFullState(fullState) {\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) {\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 }\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, self) {\n if (info && (!isEqual(this.info, info) ||\n !isEqual(InfoUtils.parsePolicy(info), InfoUtils.parsePolicy(this.info)) ||\n !isEqual(InfoUtils.parseModerator(info) || InfoUtils.parseModerator(info)))) {\n const parsedInfo = InfoUtils.getInfos(this.parsedLocus.info, info);\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 }\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) {\n if (mediaShares && !isEqual(this.mediaShares, mediaShares)) {\n const parsedMediaShares = MediaSharesUtils.getMediaShares(this.mediaShares, mediaShares);\n\n this.updateMeeting(parsedMediaShares.current);\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 this.parsedLocus.mediaShares = parsedMediaShares.current;\n this.mediaShares = mediaShares;\n }\n }\n\n /**\n * @param {String} participantsUrl\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateParticipantsUrl(participantsUrl) {\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) {\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, participants) {\n if (self && !isEqual(this.self, self)) {\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(this.getLocusPartner(participants, self), this.parsedLocus.fullState.type, this.parsedLocus.info.sipUri);\n\n if (result.sipUri) {\n this.updateMeeting(result);\n }\n\n if (parsedSelves.updates.moderatorChanged) {\n this.compareAndUpdateFlags.compareHostAndSelf = true;\n }\n else {\n this.compareAndUpdateFlags.compareHostAndSelf = false;\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 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.isUnadmittedGuest) {\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.isAdmittedGuest) {\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 LOCUSINFO.EVENTS.MEDIA_INACTIVITY,\n SelfUtils.getMediaStatus(self.mediaSessions)\n );\n }\n\n if (parsedSelves.updates.audioStateChange || parsedSelves.updates.videoStateChange || parsedSelves.updates.shareStateChange) {\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\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 this.self = self;\n }\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) {\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) {\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) {\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) {\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) {\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) {\n if (identities && !isEqual(this.identities, identities)) {\n this.identities = identities;\n }\n }\n}\n"]}
@@ -1480,6 +1480,7 @@ var Meeting = /*#__PURE__*/function (_StatelessWebexPlugin) {
1480
1480
  * @param {String} options.trackingId
1481
1481
  * @param {Object} options.locus
1482
1482
  * @param {Array} options.mediaConnections
1483
+ * @param {Object} options.errors
1483
1484
  * @returns {Object}
1484
1485
  * @memberof Meeting
1485
1486
  */
@@ -1611,6 +1612,7 @@ var Meeting = /*#__PURE__*/function (_StatelessWebexPlugin) {
1611
1612
  * @param {String} options.event
1612
1613
  * @param {String} options.trackingId
1613
1614
  * @param {Object} options.locus
1615
+ * @param {Object} options.errors
1614
1616
  * @returns {Promise}
1615
1617
  * @private
1616
1618
  * @memberof Meeting
@@ -4030,7 +4032,16 @@ var Meeting = /*#__PURE__*/function (_StatelessWebexPlugin) {
4030
4032
 
4031
4033
  _this34.meetingFiniteStateMachine.fail(error);
4032
4034
 
4033
- _loggerProxy.default.logger.error('Meeting:index#join --> Failed', error); // TODO: change this to error codes and pre defined dictionary
4035
+ _loggerProxy.default.logger.error('Meeting:index#join --> Failed', error);
4036
+
4037
+ _metrics.default.postEvent({
4038
+ event: _config.eventType.LOCUS_JOIN_RESPONSE,
4039
+ meeting: _this34,
4040
+ meetingId: _this34.id,
4041
+ data: {
4042
+ errors: [_metrics.default.parseLocusError(error.error, true)]
4043
+ }
4044
+ }); // TODO: change this to error codes and pre defined dictionary
4034
4045
 
4035
4046
 
4036
4047
  _metrics.default.sendBehavioralMetric(_constants2.default.JOIN_FAILURE, {