@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.
- package/dist/locus-info/index.js +2 -10
- package/dist/locus-info/index.js.map +1 -1
- package/dist/meeting/index.js +12 -1
- package/dist/meeting/index.js.map +1 -1
- package/dist/meetings/index.js +2 -8
- package/dist/meetings/index.js.map +1 -1
- package/dist/metrics/index.js +8 -1
- package/dist/metrics/index.js.map +1 -1
- package/package.json +5 -5
- package/src/locus-info/index.js +3 -11
- package/src/meeting/index.js +13 -0
- package/src/meetings/index.js +2 -8
- package/src/metrics/index.js +9 -1
- package/test/unit/spec/meeting/index.js +6 -0
- package/test/unit/spec/meetings/index.js +7 -0
package/dist/locus-info/index.js
CHANGED
|
@@ -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
|
|
219
|
-
//
|
|
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"]}
|
package/dist/meeting/index.js
CHANGED
|
@@ -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);
|
|
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, {
|