@webex/plugin-meetings 1.156.1 → 1.156.4

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"]}
@@ -307,15 +307,9 @@ var Meetings = /*#__PURE__*/function (_WebexPlugin) {
307
307
  }
308
308
 
309
309
  this.create(data.locus, _constants._LOCUS_ID_).then(function (newMeeting) {
310
- meeting = newMeeting;
310
+ meeting = newMeeting; // It's a new meeting so initialize the locus data
311
311
 
312
- if (data.eventType === _constants.LOCUSEVENT.DIFFERENCE) {
313
- // its a delta object and we have a new meeting
314
- meeting.locusInfo.initialSetup(data.locus, meeting);
315
- } else {
316
- // Its a new meeting and have a fresh locus object
317
- meeting.locusInfo.initialSetup(data.locus);
318
- }
312
+ meeting.locusInfo.initialSetup(data.locus);
319
313
  }).catch(function (e) {
320
314
  console.log(e);
321
315
  }).finally(function () {
@@ -1 +1 @@
1
- {"version":3,"sources":["index.js"],"names":["Meetings","args","MEETINGS","request","Request","parent","webex","loggerRequest","LoggerRequest","meetingCollection","MeetingCollection","personalMeetingRoom","reachability","registered","media","getUserMedia","Media","getSupportedDevice","LoggerProxy","set","logger","onReady","MeetingsUtil","checkH264Support","disableNotifications","Metrics","initialSetup","data","meeting","getByKey","LOCUS_URL","locusUrl","CORRELATION_ID","checkForCorrelationId","internal","device","url","locus","SIP_URI","self","callbackInfo","callbackAddress","CONVERSATION_URL","conversationUrl","replaces","length","fullState","state","LOCUS","STATE","INACTIVE","warn","_LEFT_","removed","create","_LOCUS_ID_","then","newMeeting","eventType","LOCUSEVENT","DIFFERENCE","locusInfo","catch","e","console","log","finally","getMeetingByType","_ID_","id","postEvent","event","REMOTE_STARTED","trigger","MERCURY_EVENT","Trigger","file","function","EVENT_TRIGGERS","MEETING_ADDED","type","_MEETING_","_JOIN_","_INCOMING_","parse","envelope","MESSAGE_ROAP","handleLocusEvent","MEETINGS_NETWORK_DISCONNECTED","mercury","on","LOCUS_MERCURY","handleLocusMercury","ROAP","ROAP_MERCURY","handleRoapMercury","ONLINE","syncMeetings","OFFLINE","handleMercuryOffline","off","once","READY","StaticConfig","config","LoggerConfig","logging","meetingInfo","experimental","enableUnifiedMeetings","MeetingInfoV2","MeetingInfo","PersonalMeetingRoom","MEETINGS_READY","changeState","canAuthorize","error","reject","Error","info","resolve","all","getGeoHint","startReachability","message","register","connect","call","listenForEvents","MEETINGS_REGISTERED","sendBehavioralMetric","BEHAVIORAL_METRICS","MEETINGS_REGISTRATION_SUCCESS","MEETINGS_REGISTRATION_FAILED","reason","stack","stopListeningForEvents","disconnect","unregister","MEETINGS_UNREGISTERED","options","uploadLogs","uploadResult","MEETING_LOG_UPLOAD_SUCCESS","meetingId","details","uploadError","MEETING_LOG_UPLOAD_FAILURE","UPLOAD_LOGS_FAILURE","meetingsId","code","Reachability","setReachability","getReachability","gatherReachability","fetchGeoHint","res","geoHintInfo","MeetingUtil","cleanUp","delete","MEETING_REMOVED","destination","fetchInfoOptions","targetDest","_CONVERSATION_URL_","createMeeting","createdMeeting","EVENTS","DESTROY_MEETING","payload","autoUploadLogs","callStart","lastActive","correlationId","feedbackId","locusId","webExMeetingId","destroy","REQUEST_UPLOAD_LOGS","meetingInstance","Meeting","userId","deviceUrl","orgId","roapSeq","meetingInfoProvider","fetchMeetingInfo","CaptchaError","PasswordError","debug","sipUri","setSipUri","meetingAddedType","getMeetingAddedType","value","getAll","getActiveMeetings","locusArray","activeLocusUrl","loci","forEach","push","meetingsCollection","includes","MEETING_REMOVED_REASON","NO_MEETINGS_TO_SYNC","scheduled","get","StatsAnalyzer","StatsCalculator","WebexPlugin"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAIA;;AACA;;AAEA;;AAEA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AAuBA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AAEA;;AACA;;;;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;IACqBA,Q;;;;;AAGjB;AACJ;AACA;AACA;AACA;AACA;AACI,sBAAqB;AAAA;;AAAA;;AAAA,sCAANC,IAAM;AAANA,MAAAA,IAAM;AAAA;;AACnB,oDAASA,IAAT;AAEA;AACN;AACA;AACA;AACA;AACA;AACA;;AATyB,4FARTC,mBAQS;AAUnB,UAAKC,OAAL,GAAe,IAAIC,iBAAJ,CAAY,EAAZ,EAAgB;AAACC,MAAAA,MAAM,EAAE,MAAKC;AAAd,KAAhB,CAAf;AACA;AACN;AACA;AACA;AACA;AACA;AACA;;AACM,UAAKC,aAAL,GAAqB,IAAIC,gBAAJ,CAAkB;AAACF,MAAAA,KAAK,EAAE,MAAKA;AAAb,KAAlB,CAArB;AACA,UAAKG,iBAAL,GAAyB,IAAIC,mBAAJ,EAAzB;AACA;AACN;AACA;AACA;AACA;AACA;AACA;;AACM,UAAKC,mBAAL,GAA2B,IAA3B;AACA;AACN;AACA;AACA;AACA;AACA;AACA;AACA;;AACM,UAAKC,YAAL,GAAoB,IAApB;AAEA;AACN;AACA;AACA;AACA;AACA;AACA;;AACM,UAAKC,UAAL,GAAkB,KAAlB;AAEA;AACN;AACA;AACA;AACA;AACA;AACA;AACA;;AACM,UAAKC,KAAL,GAAa;AACXC,MAAAA,YAAY,EAAEC,eAAMD,YADT;AAEXE,MAAAA,kBAAkB,EAAED,eAAMC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","sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n*/\n\nimport '@webex/internal-plugin-mercury';\nimport {WebexPlugin} from '@webex/webex-core';\n\nimport 'webrtc-adapter';\n\nimport Metrics from '../metrics';\nimport {trigger, eventType} from '../metrics/config';\nimport LoggerConfig from '../common/logs/logger-config';\nimport StaticConfig from '../common/config';\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport LoggerRequest from '../common/logs/request';\nimport Trigger from '../common/events/trigger-proxy';\nimport Media from '../media';\nimport MeetingUtil from '../meeting/util';\nimport {\n MEETINGS,\n EVENTS,\n EVENT_TRIGGERS,\n READY,\n LOCUSEVENT,\n LOCUS_URL,\n ROAP,\n ONLINE,\n OFFLINE,\n _MEETING_,\n _JOIN_,\n _LOCUS_ID_,\n _INCOMING_,\n LOCUS,\n CORRELATION_ID,\n SIP_URI,\n _LEFT_,\n _ID_,\n MEETING_REMOVED_REASON,\n _CONVERSATION_URL_,\n CONVERSATION_URL\n} from '../constants';\nimport BEHAVIORAL_METRICS from '../metrics/constants';\nimport MeetingInfo from '../meeting-info';\nimport MeetingInfoV2 from '../meeting-info/meeting-info-v2';\nimport Meeting from '../meeting';\nimport PersonalMeetingRoom from '../personal-meeting-room';\nimport Reachability from '../reachability';\nimport Request from '../meetings/request';\nimport StatsAnalyzer from '../analyzer/analyzer';\nimport StatsCalculator from '../analyzer/calculator';\nimport PasswordError from '../common/errors/password-error';\nimport CaptchaError from '../common/errors/captcha-error';\n\nimport MeetingCollection from './collection';\nimport MeetingsUtil from './util';\n\n\n/**\n * Meetings Ready Event\n * Emitted when the meetings instance on webex is ready\n * @event meetings:ready\n * @instance\n * @memberof Meetings\n */\n\n/**\n * Meetings Network Disconnected Event\n * Emitted when the meetings instance is disconnected from\n * the internal mercury server\n * @event network:disconnected\n * @instance\n * @memberof Meetings\n */\n\n/**\n * Meetings Registered Event\n * Emitted when the meetings instance has been registered and listening\n * @event meetings:registered\n * @instance\n * @memberof Meetings\n */\n\n/**\n * Meeting Removed Event\n * Emitted when a meeting was removed from the cache of meetings\n * @event meeting:removed\n * @instance\n * @type {Object}\n * @property {String} meetingId the removed meeting\n * @property {Object} response the server response\n * @property {String} type what type of meeting it was\n * @memberof Meetings\n */\n\n/**\n * Meeting Added Event\n * Emitted when a meeting was added to the cache of meetings\n * @event meeting:added\n * @instance\n * @type {Object}\n * @property {String} meetingId the added meeting\n * @property {String} type what type of meeting it was\n * @memberof Meetings\n */\n\n/**\n * Maintain a cache of meetings and sync with services.\n * @class\n */\nexport default class Meetings extends WebexPlugin {\n namespace = MEETINGS;\n\n /**\n * Initializes the Meetings Plugin\n * @constructor\n * @public\n * @memberof Meetings\n */\n constructor(...args) {\n super(...args);\n\n /**\n * The Meetings request to interact with server\n * @instance\n * @type {Object}\n * @private\n * @memberof Meetings\n */\n this.request = new Request({}, {parent: this.webex});\n /**\n * Log upload request helper\n * @instance\n * @type {Object}\n * @private\n * @memberof Meetings\n */\n this.loggerRequest = new LoggerRequest({webex: this.webex});\n this.meetingCollection = new MeetingCollection();\n /**\n * The PersonalMeetingRoom object to interact with server\n * @instance\n * @type {Object}\n * @public\n * @memberof Meetings\n */\n this.personalMeetingRoom = null;\n /**\n * The Reachability object to interact with server, starts as null until {@link Meeting#setReachability} is called\n * starts as null\n * @instance\n * @type {Object}\n * @private\n * @memberof Meetings\n */\n this.reachability = null;\n\n /**\n * If the meetings plugin has been registered and listening via {@link Meetings#register}\n * @instance\n * @type {Boolean}\n * @public\n * @memberof Meetings\n */\n this.registered = false;\n\n /**\n * The public interface for the internal Media util files. These are helpful to expose outside the context\n * of a meeting so that a user can access media without creating a meeting instance.\n * @instance\n * @type {Object}\n * @private\n * @memberof Meetings\n */\n this.media = {\n getUserMedia: Media.getUserMedia,\n getSupportedDevice: Media.getSupportedDevice\n };\n\n LoggerProxy.set(this.webex.logger);\n\n this.onReady();\n MeetingsUtil.checkH264Support({disableNotifications: true});\n Metrics.initialSetup(this.meetingCollection, this.webex);\n }\n\n /**\n * handle locus events and takes meeting actions with them as they come in\n * @param {Object} data a locus event\n * @param {String} data.locusUrl\n * @param {Object} data.locus\n * @param {String} data.eventType\n * @returns {undefined}\n * @private\n * @memberof Meetings\n */\n handleLocusEvent(data) {\n let meeting = null;\n\n // getting meeting by correlationId. This will happen for the new event\n // Either the locus\n // TODO : Add check for the callBack Address\n meeting = this.meetingCollection.getByKey(LOCUS_URL, data.locusUrl) ||\n this.meetingCollection.getByKey(CORRELATION_ID, MeetingsUtil.checkForCorrelationId(this.webex.internal.device.url, data.locus)) ||\n this.meetingCollection.getByKey(SIP_URI, data.locus.self && data.locus.self.callbackInfo && data.locus.self.callbackInfo.callbackAddress) ||\n this.meetingCollection.getByKey(CONVERSATION_URL, data.locus.conversationUrl);\n\n // Special case when locus has got replaced, This only happend once if a replace locus exists\n // https://sqbu-github.cisco.com/WebExSquared/locus/wiki/Locus-changing-mid-call\n\n if (!meeting && data.locus?.replaces?.length > 0) {\n // Always the last element in the replace is the active one\n meeting = this.meetingCollection.getByKey(LOCUS_URL, data.locus.replaces[data.locus.replaces.length - 1].locusUrl);\n }\n\n if (!meeting) {\n // TODO: create meeting when we get a meeting object\n // const checkForEnded = (locus) => {\n // TODO: you already ended the meeting but you got an event later\n // Mainly for 1:1 Callsor meeting\n // Happens mainly after refresh\n\n // 1:1 Meeting\n // 1) You ended a call before but you got a mercury event\n // Make sure end the call and cleanup the meeting only if the mercury\n // event says so\n // 2) Maintain lastSync time in the meetings object which helps to compare\n // If the meeting came befor or after the sync . ANy meeting start time before the sync time is invalid\n\n // For space Meeting\n // Check the locus object and see who has joined\n\n // };\n // rather then locus object change to locus url\n\n if (data.locus && data.locus.fullState && data.locus.fullState.state === LOCUS.STATE.INACTIVE) {\n // just ignore the event as its already ended and not active\n LoggerProxy.logger.warn('Meetings:index#handleLocusEvent --> Locus event received for meeting, after it was ended.');\n\n return;\n }\n\n\n // When its wireless share or guest and user leaves the meeting we dont have to keep the meeting object\n // Any future events will be neglected\n\n if (data.locus && data.locus.self && (data.locus.self.state === _LEFT_ && data.locus.self.removed === true)) {\n // just ignore the event as its already ended and not active\n LoggerProxy.logger.warn('Meetings:index#handleLocusEvent --> Locus event received for meeting, after it was ended.');\n\n return;\n }\n\n this.create(data.locus, _LOCUS_ID_).then((newMeeting) => {\n meeting = newMeeting;\n\n if (data.eventType === LOCUSEVENT.DIFFERENCE) {\n // its a delta object and we have a new meeting\n meeting.locusInfo.initialSetup(data.locus, meeting);\n }\n else {\n // Its a new meeting and have a fresh locus object\n meeting.locusInfo.initialSetup(data.locus);\n }\n }).catch((e) => {\n console.log(e);\n })\n .finally(() => {\n // There will be cases where locus event comes in gets created and deleted because its a 1:1 and meeting gets deleted\n // because the other user left so before sending 'added' event make sure it exists in the collection\n\n if (this.getMeetingByType(_ID_, meeting.id)) {\n Metrics.postEvent({event: eventType.REMOTE_STARTED, meeting, data: {trigger: trigger.MERCURY_EVENT}});\n Trigger.trigger(\n this,\n {\n file: 'meetings',\n function: 'handleLocusEvent'\n },\n EVENT_TRIGGERS.MEETING_ADDED,\n {\n meeting,\n type: meeting.type === _MEETING_ ? _JOIN_ : _INCOMING_\n }\n );\n }\n else {\n // Meeting got added but was not found in the collection. It might have got destroyed\n LoggerProxy.logger.warn('Meetings:index#handleLocusEvent --> Created and destroyed meeting object before sending an event');\n }\n });\n }\n else {\n meeting.locusInfo.parse(meeting, data);\n }\n }\n\n /**\n * handles locus events through mercury that are not roap\n * @param {Object} envelope\n * @param {Object} envelope.data\n * @param {String} envelope.data.eventType\n * @returns {undefined}\n * @private\n * @memberof Meetings\n */\n handleLocusMercury(envelope) {\n const {data} = envelope;\n const {eventType} = data;\n\n if (eventType && eventType !== LOCUSEVENT.MESSAGE_ROAP) {\n this.handleLocusEvent(data);\n }\n }\n\n\n /**\n * handles mecury offline event\n * @returns {undefined}\n * @private\n * @memberof Meetings\n */\n handleMercuryOffline() {\n Trigger.trigger(\n this,\n {\n file: 'meetings/index',\n function: 'handleMercuryOffline'\n },\n EVENT_TRIGGERS.MEETINGS_NETWORK_DISCONNECTED,\n );\n }\n\n\n /**\n * registers for locus and roap mercury events\n * @returns {undefined}\n * @private\n * @memberof Meetings\n */\n listenForEvents() {\n this.webex.internal.mercury.on(LOCUSEVENT.LOCUS_MERCURY, (envelope) => {\n this.handleLocusMercury(envelope);\n });\n this.webex.internal.mercury.on(ROAP.ROAP_MERCURY, (envelope) => {\n MeetingsUtil.handleRoapMercury(envelope, this.meetingCollection);\n });\n\n this.webex.internal.mercury.on(ONLINE, () => {\n this.syncMeetings();\n });\n\n this.webex.internal.mercury.on(OFFLINE, () => {\n this.handleMercuryOffline();\n });\n }\n\n /**\n * stops listening for locus and roap mercury events\n * @returns {undefined}\n * @private\n * @memberof Meetings\n */\n stopListeningForEvents() {\n this.webex.internal.mercury.off(LOCUSEVENT.LOCUS_MERCURY);\n this.webex.internal.mercury.off(ROAP.ROAP_MERCURY);\n this.webex.internal.mercury.off(ONLINE);\n }\n\n /**\n * @returns {undefined}\n * @private\n * @memberof Meetings\n */\n onReady() {\n this.webex.once(READY, () => {\n StaticConfig.set(this.config);\n LoggerConfig.set(this.config.logging);\n\n /**\n * The MeetingInfo object to interact with server\n * @instance\n * @type {Object}\n * @private\n * @memberof Meetings\n */\n this.meetingInfo = this.config.experimental.enableUnifiedMeetings ? new MeetingInfoV2(this.webex) : new MeetingInfo(this.webex);\n this.personalMeetingRoom = new PersonalMeetingRoom({meetingInfo: this.meetingInfo}, {parent: this.webex});\n\n Trigger.trigger(\n this,\n {\n file: 'meetings',\n function: 'onReady'\n },\n EVENT_TRIGGERS.MEETINGS_READY\n );\n });\n }\n\n /**\n * API to toggle unified meetings\n * @param {Boolean} changeState\n * @private\n * @memberof Meetings\n * @returns {undefined}\n */\n _toggleUnifiedMeetings(changeState) {\n if (typeof changeState !== 'boolean') {\n return;\n }\n if (this.config?.experimental?.enableUnifiedMeetings !== changeState) {\n this.config.experimental.enableUnifiedMeetings = changeState;\n this.meetingInfo = changeState ? new MeetingInfoV2(this.webex) : new MeetingInfo(this.webex);\n }\n }\n\n /**\n * Explicitly sets up the meetings plugin by registering\n * the device, connecting to mercury, and listening for locus events.\n *\n * @returns {Promise}\n * @public\n * @memberof Meetings\n */\n register() {\n if (!this.webex.canAuthorize) {\n LoggerProxy.logger.error('Meetings:index#register --> ERROR, Unable to register, SDK cannot authorize');\n\n return Promise.reject(new Error('SDK cannot authorize'));\n }\n\n\n if (this.registered) {\n LoggerProxy.logger.info('Meetings:index#register --> INFO, Meetings plugin already registered');\n\n return Promise.resolve();\n }\n\n return Promise.all([\n this.getGeoHint(),\n this.startReachability().catch((error) => {\n LoggerProxy.logger.error(`Meetings:index#register --> GDM error, ${error.message}`);\n }),\n this.webex.internal.device.register()\n .then(() => LoggerProxy.logger.info(`Meetings:index#register --> INFO, Device registered ${this.webex.internal.device.url}`))\n .then(() => this.webex.internal.mercury.connect()),\n MeetingsUtil.checkH264Support.call(this)\n ]).then(() => {\n this.listenForEvents();\n Trigger.trigger(\n this,\n {\n file: 'meetings',\n function: 'register'\n },\n EVENT_TRIGGERS.MEETINGS_REGISTERED\n );\n this.registered = true;\n Metrics.sendBehavioralMetric(\n BEHAVIORAL_METRICS.MEETINGS_REGISTRATION_SUCCESS,\n );\n })\n .catch((error) => {\n LoggerProxy.logger.error(`Meetings:index#register --> ERROR, Unable to register, ${error.message}`);\n\n Metrics.sendBehavioralMetric(\n BEHAVIORAL_METRICS.MEETINGS_REGISTRATION_FAILED,\n {\n reason: error.message,\n stack: error.stack\n }\n );\n\n return Promise.reject(error);\n });\n }\n\n /**\n * Explicitly tears down the meetings plugin by deregistering\n * the device, disconnecting from mercury, and stops listening to locus events\n *\n * @returns {Promise}\n * @public\n * @memberof Meetings\n */\n unregister() {\n if (!this.registered) {\n LoggerProxy.logger.info('Meetings:index#unregister --> INFO, Meetings plugin already unregistered');\n\n return Promise.resolve();\n }\n\n this.stopListeningForEvents();\n\n return this.webex.internal.mercury.disconnect()\n .then(() => this.webex.internal.device.unregister())\n .then(() => {\n Trigger.trigger(\n this,\n {\n file: 'meetings',\n function: 'unregister'\n },\n EVENT_TRIGGERS.MEETINGS_UNREGISTERED\n );\n this.registered = false;\n });\n }\n\n /**\n * Uploads logs to the webex services for tracking\n * @param {Object} [options={}]\n * @param {String} [options.callStart] Call Start Time\n * @param {String} [options.feedbackId] ID used for tracking\n * @param {String} [options.locusId]\n * @param {String} [options.correlationId]\n * @param {String} [options.meetingId] webex meeting ID\n * @param {String} [options.userId] userId\n * @param {String} [options.orgId] org id\n * @returns {String} feedback ID logs were submitted under\n */\n uploadLogs(options = {}) {\n LoggerProxy.logger.info('Meetings:index#uploadLogs --> uploading logs');\n\n return this.loggerRequest.uploadLogs(options)\n .then((uploadResult) => {\n LoggerProxy.logger.info('Meetings:index#uploadLogs --> Upload logs for meeting completed.', uploadResult);\n Trigger.trigger(\n this,\n {\n file: 'meetings',\n function: 'uploadLogs'\n },\n EVENT_TRIGGERS.MEETING_LOG_UPLOAD_SUCCESS,\n {\n meetingId: options.meetingId,\n details: uploadResult\n }\n );\n })\n .catch((uploadError) => {\n LoggerProxy.logger.error('Meetings:index#uploadLogs --> Unable to upload logs for meeting', uploadError);\n Trigger.trigger(\n this,\n {\n file: 'meetings',\n function: 'uploadLogs'\n },\n EVENT_TRIGGERS.MEETING_LOG_UPLOAD_FAILURE,\n {\n meetingId: options.meetingId,\n reason: uploadError\n }\n );\n\n Metrics.sendBehavioralMetric(\n BEHAVIORAL_METRICS.UPLOAD_LOGS_FAILURE,\n {\n meetingId: options.meetingsId,\n reason: uploadError.message,\n stack: uploadError.stack,\n code: uploadError.code\n }\n );\n });\n }\n\n /**\n * initializes the reachability instance for Meetings\n * @returns {undefined}\n * @public\n * @memberof Meetings\n */\n setReachability() {\n this.reachability = new Reachability(this.webex);\n }\n\n /**\n * gets the reachability instance for Meetings\n * @returns {Reachability}\n * @public\n * @memberof Meetings\n */\n getReachability() {\n return this.reachability;\n }\n\n /**\n * initializes and starts gathering reachability for Meetings\n * @returns {Promise}\n * @public\n * @memberof Meetings\n */\n startReachability() {\n if (!this.reachability) {\n this.setReachability();\n }\n\n return this.getReachability().gatherReachability();\n }\n\n /**\n * Get geoHint for info for meetings\n * @returns {Promise}\n * @private\n * @memberof Meetings\n */\n getGeoHint() {\n return this.request.fetchGeoHint().then((res) => {\n this.geoHintInfo = res;\n });\n }\n\n /**\n * gets the personal meeting room instance, for saved PMR values for this user\n * @returns {PersonalMeetingRoom}\n * @public\n * @memberof Meetings\n */\n getPersonalMeetingRoom() {\n return this.personalMeetingRoom;\n }\n\n /**\n * @param {Meeting} meeting\n * @param {Object} reason\n * @param {String} type\n * @returns {Undefined}\n * @private\n * @memberof Meetings\n */\n destroy(meeting, reason) {\n MeetingUtil.cleanUp(meeting);\n this.meetingCollection.delete(meeting.id);\n Trigger.trigger(\n this,\n {\n file: 'meetings',\n function: 'destroy'\n },\n EVENT_TRIGGERS.MEETING_REMOVED,\n {\n meetingId: meeting.id,\n reason\n }\n );\n }\n\n /**\n * Create a meeting.\n * @param {string} destination - sipURL, spaceId, phonenumber, or locus object}\n * @param {string} [type] - the optional specified type, such as locusId\n * @returns {Promise<Meeting>} A new Meeting.\n * @public\n * @memberof Meetings\n */\n create(destination, type = null) {\n // TODO: type should be from a dictionary\n\n // Validate meeting information based on the provided destination and\n // type. This must be performed prior to determining if the meeting is\n // found in the collection, as we mutate the destination for hydra person\n // id values.\n return this.meetingInfo.fetchInfoOptions(destination, type)\n // Catch a failure to fetch info options.\n .catch((error) => {\n LoggerProxy.logger.info(`Meetings:index#create --> INFO, unable to determine info options: ${error.message}`);\n })\n .then((options = {}) => {\n // Normalize the destination.\n const targetDest = options.destination || destination;\n\n // check for the conversation URL then sip Url\n let meeting = null;\n\n if (type === _CONVERSATION_URL_ || options.type === _CONVERSATION_URL_) {\n meeting = this.meetingCollection.getByKey(CONVERSATION_URL, targetDest);\n }\n\n // Attempt to collect the meeting if it exists.\n if (!meeting) {\n meeting = this.meetingCollection.getByKey(SIP_URI, targetDest);\n }\n\n\n // Validate if a meeting was found.\n if (!meeting) {\n // Create a meeting based on the normalized destination and type.\n return this.createMeeting(targetDest, type)\n .then((createdMeeting) => {\n // If the meeting was successfully created.\n if (createdMeeting && createdMeeting.on) {\n // Create a destruction event for the meeting.\n createdMeeting.on(EVENTS.DESTROY_MEETING, (payload) => {\n if (this.config.autoUploadLogs) {\n this.uploadLogs({\n callStart: createdMeeting.locusInfo?.fullState?.lastActive,\n correlationId: createdMeeting.correlationId,\n feedbackId: createdMeeting.correlationId,\n locusId: createdMeeting.locusId,\n meetingId: createdMeeting.locusInfo?.info?.webExMeetingId\n }).then(() => this.destroy(createdMeeting, payload.reason));\n }\n else {\n this.destroy(createdMeeting, payload.reason);\n }\n });\n\n createdMeeting.on(EVENTS.REQUEST_UPLOAD_LOGS, (meetingInstance) => {\n if (this.config.autoUploadLogs) {\n this.uploadLogs({\n callStart: meetingInstance?.locusInfo?.fullState?.lastActive,\n correlationId: meetingInstance.correlationId,\n feedbackId: meetingInstance.correlationId,\n locusId: meetingInstance.locusId,\n meetingId: meetingInstance.locusInfo?.info?.webExMeetingId\n });\n }\n });\n }\n else {\n LoggerProxy.logger.error(`Meetings:index#create --> ERROR, meeting does not have on method, will not be destroyed, meeting cleanup impossible for meeting: ${meeting}`);\n }\n\n // Return the newly created meeting.\n return Promise.resolve(createdMeeting);\n });\n }\n\n // Return the existing meeting.\n return Promise.resolve(meeting);\n });\n }\n\n /**\n * @param {String} destination see create()\n * @param {String} type see create()\n * @returns {Promise} a new meeting instance complete with meeting info and destination\n * @private\n * @memberof Meetings\n */\n async createMeeting(destination, type = null) {\n const meeting = new Meeting(\n {\n userId: this.webex.internal.device.userId,\n deviceUrl: this.webex.internal.device.url,\n orgId: this.webex.internal.device.orgId,\n roapSeq: 0,\n locus: type === _LOCUS_ID_ ? destination : null, // pass the locus object if present\n meetingInfoProvider: this.meetingInfo\n },\n {\n parent: this.webex\n }\n );\n\n this.meetingCollection.set(meeting);\n\n try {\n await meeting.fetchMeetingInfo({destination, type});\n }\n catch (err) {\n if (!(err instanceof CaptchaError) && !(err instanceof PasswordError)) {\n // if there is no meeting info we assume its a 1:1 call or wireless share\n LoggerProxy.logger.info(`Meetings:index#createMeeting --> Info Unable to fetch meeting info for ${destination}.`);\n LoggerProxy.logger.info('Meetings:index#createMeeting --> Info assuming this destination is a 1:1 or wireless share');\n }\n LoggerProxy.logger.debug(`Meetings:index#createMeeting --> Debug ${err} fetching /meetingInfo for creation.`);\n // We need to save this info for future reference\n meeting.destination = destination;\n }\n finally {\n // For type LOCUS_ID we need to parse the locus object to get the information\n // about the caller and callee\n // Meeting Added event will be created in `handleLocusEvent`\n if (type !== _LOCUS_ID_) {\n if (!meeting.sipUri) {\n meeting.setSipUri(destination);\n }\n\n // TODO: check if we have to move this to parser\n const meetingAddedType = MeetingsUtil.getMeetingAddedType(type);\n\n // We typically shouldn't need to trigger both and event and return a promise.\n // Is this a special case? We want to make the public API usage as simple as possible.\n Trigger.trigger(\n this,\n {\n file: 'meetings',\n function: 'createMeeting'\n },\n EVENT_TRIGGERS.MEETING_ADDED,\n {\n meeting,\n type: meetingAddedType\n }\n );\n }\n }\n\n return meeting;\n\n // Create the meeting calling the necessary service endpoints.\n\n // Internally, there are many more destinations:\n //\n // - locusID\n // - meetingURL\n // - globalMeetingID, e.g, *00*meetingID\n // - meetingID\n // - meetingURL\n // - PSTN\n // - phone number\n //\n // Our job is to determine the appropriate one\n // and its corresponding service so that developers\n // need only sipURL or spaceID to get a meeting\n // and its ID, but have the option to use createWithType()\n // and specify those types to get meetingInfo\n }\n\n /**\n * get a specifc meeting given it's type matched to the value, i.e., locus url\n * @param {String} type\n * @param {Object} value\n * @returns {Meeting}\n * @public\n * @memberof Meetings\n */\n getMeetingByType(type, value) {\n return this.meetingCollection.getByKey(type, value);\n }\n\n /**\n * Get all meetings.\n * @param {object} options\n * @param {object} options.startDate - get meetings after this start date\n * @param {object} options.endDate - get meetings before this end date\n * @returns {Object} All currently active meetings.\n * @public\n * @memberof Meetings\n */\n getAllMeetings(options = {}) {\n // Options may include other parameters to filter this collection\n // of meetings.\n return this.meetingCollection.getAll(options);\n }\n\n /**\n * syncs all the meeting from server\n * @returns {undefined}\n * @public\n * @memberof Meetings\n */\n syncMeetings() {\n return this.request.getActiveMeetings().then((locusArray) => {\n const activeLocusUrl = [];\n\n if (locusArray?.loci && locusArray.loci.length > 0) {\n locusArray.loci.forEach((locus) => {\n activeLocusUrl.push(locus.url);\n this.handleLocusEvent({\n locus,\n locusUrl: locus.url\n });\n });\n }\n const meetingsCollection = this.meetingCollection.getAll();\n\n if (Object.keys(meetingsCollection).length > 0) {\n // Some time the mercury event is missed after mercury reconnect\n // if sync returns no locus then clear all the meetings\n for (const meeting of Object.values(meetingsCollection)) {\n if (!activeLocusUrl.includes(meeting.locusUrl)) {\n // destroy function also uploads logs\n this.destroy(meeting, MEETING_REMOVED_REASON.NO_MEETINGS_TO_SYNC);\n }\n }\n }\n });\n }\n\n /**\n * Get all scheduled meetings.\n * @param {object} options\n * @param {object} options.startDate - get meetings after this start date\n * @param {object} options.endDate - get meetings before this end date\n * @returns {Object} All scheduled meetings.\n * @memberof Meetings\n */\n getScheduledMeetings() {\n return this.meetingCollection.getAll({scheduled: true});\n }\n\n /**\n * Get the logger instance for plugin-meetings\n * @returns {Logger}\n */\n getLogger() {\n return LoggerProxy.get();\n }\n\n /**\n * Get the Stats Analyzer singleton\n * @returns {StatsAnalyzer}\n * @public\n * @memberof Meetings\n */\n getAnalyzer() {\n return StatsAnalyzer;\n }\n\n /**\n * Get the Stats Calculator singleton\n * @returns {StatsCalculator}\n * @public\n * @memberof Meetings\n */\n getCalculator() {\n return StatsCalculator;\n }\n}\n"]}
1
+ {"version":3,"sources":["index.js"],"names":["Meetings","args","MEETINGS","request","Request","parent","webex","loggerRequest","LoggerRequest","meetingCollection","MeetingCollection","personalMeetingRoom","reachability","registered","media","getUserMedia","Media","getSupportedDevice","LoggerProxy","set","logger","onReady","MeetingsUtil","checkH264Support","disableNotifications","Metrics","initialSetup","data","meeting","getByKey","LOCUS_URL","locusUrl","CORRELATION_ID","checkForCorrelationId","internal","device","url","locus","SIP_URI","self","callbackInfo","callbackAddress","CONVERSATION_URL","conversationUrl","replaces","length","fullState","state","LOCUS","STATE","INACTIVE","warn","_LEFT_","removed","create","_LOCUS_ID_","then","newMeeting","locusInfo","catch","e","console","log","finally","getMeetingByType","_ID_","id","postEvent","event","eventType","REMOTE_STARTED","trigger","MERCURY_EVENT","Trigger","file","function","EVENT_TRIGGERS","MEETING_ADDED","type","_MEETING_","_JOIN_","_INCOMING_","parse","envelope","LOCUSEVENT","MESSAGE_ROAP","handleLocusEvent","MEETINGS_NETWORK_DISCONNECTED","mercury","on","LOCUS_MERCURY","handleLocusMercury","ROAP","ROAP_MERCURY","handleRoapMercury","ONLINE","syncMeetings","OFFLINE","handleMercuryOffline","off","once","READY","StaticConfig","config","LoggerConfig","logging","meetingInfo","experimental","enableUnifiedMeetings","MeetingInfoV2","MeetingInfo","PersonalMeetingRoom","MEETINGS_READY","changeState","canAuthorize","error","reject","Error","info","resolve","all","getGeoHint","startReachability","message","register","connect","call","listenForEvents","MEETINGS_REGISTERED","sendBehavioralMetric","BEHAVIORAL_METRICS","MEETINGS_REGISTRATION_SUCCESS","MEETINGS_REGISTRATION_FAILED","reason","stack","stopListeningForEvents","disconnect","unregister","MEETINGS_UNREGISTERED","options","uploadLogs","uploadResult","MEETING_LOG_UPLOAD_SUCCESS","meetingId","details","uploadError","MEETING_LOG_UPLOAD_FAILURE","UPLOAD_LOGS_FAILURE","meetingsId","code","Reachability","setReachability","getReachability","gatherReachability","fetchGeoHint","res","geoHintInfo","MeetingUtil","cleanUp","delete","MEETING_REMOVED","destination","fetchInfoOptions","targetDest","_CONVERSATION_URL_","createMeeting","createdMeeting","EVENTS","DESTROY_MEETING","payload","autoUploadLogs","callStart","lastActive","correlationId","feedbackId","locusId","webExMeetingId","destroy","REQUEST_UPLOAD_LOGS","meetingInstance","Meeting","userId","deviceUrl","orgId","roapSeq","meetingInfoProvider","fetchMeetingInfo","CaptchaError","PasswordError","debug","sipUri","setSipUri","meetingAddedType","getMeetingAddedType","value","getAll","getActiveMeetings","locusArray","activeLocusUrl","loci","forEach","push","meetingsCollection","includes","MEETING_REMOVED_REASON","NO_MEETINGS_TO_SYNC","scheduled","get","StatsAnalyzer","StatsCalculator","WebexPlugin"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAIA;;AACA;;AAEA;;AAEA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AAuBA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AAEA;;AACA;;;;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;IACqBA,Q;;;;;AAGjB;AACJ;AACA;AACA;AACA;AACA;AACI,sBAAqB;AAAA;;AAAA;;AAAA,sCAANC,IAAM;AAANA,MAAAA,IAAM;AAAA;;AACnB,oDAASA,IAAT;AAEA;AACN;AACA;AACA;AACA;AACA;AACA;;AATyB,4FARTC,mBAQS;AAUnB,UAAKC,OAAL,GAAe,IAAIC,iBAAJ,CAAY,EAAZ,EAAgB;AAACC,MAAAA,MAAM,EAAE,MAAKC;AAAd,KAAhB,CAAf;AACA;AACN;AACA;AACA;AACA;AACA;AACA;;AACM,UAAKC,aAAL,GAAqB,IAAIC,gBAAJ,CAAkB;AAACF,MAAAA,KAAK,EAAE,MAAKA;AAAb,KAAlB,CAArB;AACA,UAAKG,iBAAL,GAAyB,IAAIC,mBAAJ,EAAzB;AACA;AACN;AACA;AACA;AACA;AACA;AACA;;AACM,UAAKC,mBAAL,GAA2B,IAA3B;AACA;AACN;AACA;AACA;AACA;AACA;AACA;AACA;;AACM,UAAKC,YAAL,GAAoB,IAApB;AAEA;AACN;AACA;AACA;AACA;AACA;AACA;;AACM,UAAKC,UAAL,GAAkB,KAAlB;AAEA;AACN;AACA;AACA;AACA;AACA;AACA;AACA;;AACM,UAAKC,KAAL,GAAa;AACXC,MAAAA,YAAY,EAAEC,eAAMD,YADT;AAEXE,MAAAA,kBAAkB,EAAED,eAAMC;AAFf,KAAb;;AAKAC,yBAAYC,GAAZ,CAAgB,MAAKb,KAAL,CAAWc,MAA3B;;AAEA,UAAKC,OAAL;;AACAC,mBAAaC,gBAAb,CAA8B;AAACC,MAAAA,oBAAoB,EAAE;AAAvB,KAA9B;;AACAC,qBAAQC,YAAR,CAAqB,MAAKjB,iBAA1B,EAA6C,MAAKH,KAAlD;;AAhEmB;AAiEpB;AAED;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;WACI,0BAAiBqB,IAAjB,EAAuB;AAAA;AAAA;AAAA;;AACrB,UAAIC,OAAO,GAAG,IAAd,CADqB,CAGrB;AACA;AACA;;AACAA,MAAAA,OAAO,GAAG,KAAKnB,iBAAL,CAAuBoB,QAAvB,CAAgCC,oBAAhC,EAA2CH,IAAI,CAACI,QAAhD,KACV,KAAKtB,iBAAL,CAAuBoB,QAAvB,CAAgCG,yBAAhC,EAAgDV,eAAaW,qBAAb,CAAmC,KAAK3B,KAAL,CAAW4B,QAAX,CAAoBC,MAApB,CAA2BC,GAA9D,EAAmET,IAAI,CAACU,KAAxE,CAAhD,CADU,IAEV,KAAK5B,iBAAL,CAAuBoB,QAAvB,CAAgCS,kBAAhC,EAAyCX,IAAI,CAACU,KAAL,CAAWE,IAAX,IAAmBZ,IAAI,CAACU,KAAL,CAAWE,IAAX,CAAgBC,YAAnC,IAAmDb,IAAI,CAACU,KAAL,CAAWE,IAAX,CAAgBC,YAAhB,CAA6BC,eAAzH,CAFU,IAGV,KAAKhC,iBAAL,CAAuBoB,QAAvB,CAAgCa,2BAAhC,EAAkDf,IAAI,CAACU,KAAL,CAAWM,eAA7D,CAHA,CANqB,CAWrB;AACA;;AAEA,UAAI,CAACf,OAAD,IAAY,gBAAAD,IAAI,CAACU,KAAL,oFAAYO,QAAZ,8EAAsBC,MAAtB,IAA+B,CAA/C,EAAkD;AAChD;AACAjB,QAAAA,OAAO,GAAG,KAAKnB,iBAAL,CAAuBoB,QAAvB,CAAgCC,oBAAhC,EAA2CH,IAAI,CAACU,KAAL,CAAWO,QAAX,CAAoBjB,IAAI,CAACU,KAAL,CAAWO,QAAX,CAAoBC,MAApB,GAA6B,CAAjD,EAAoDd,QAA/F,CAAV;AACD;;AAED,UAAI,CAACH,OAAL,EAAc;AACZ;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AAEA,YAAID,IAAI,CAACU,KAAL,IAAcV,IAAI,CAACU,KAAL,CAAWS,SAAzB,IAAsCnB,IAAI,CAACU,KAAL,CAAWS,SAAX,CAAqBC,KAArB,KAA+BC,iBAAMC,KAAN,CAAYC,QAArF,EAA+F;AAC7F;AACAhC,+BAAYE,MAAZ,CAAmB+B,IAAnB,CAAwB,2FAAxB;;AAEA;AACD,SAzBW,CA4BZ;AACA;;;AAEA,YAAIxB,IAAI,CAACU,KAAL,IAAcV,IAAI,CAACU,KAAL,CAAWE,IAAzB,IAAkCZ,IAAI,CAACU,KAAL,CAAWE,IAAX,CAAgBQ,KAAhB,KAA0BK,iBAA1B,IAAoCzB,IAAI,CAACU,KAAL,CAAWE,IAAX,CAAgBc,OAAhB,KAA4B,IAAtG,EAA6G;AAC3G;AACAnC,+BAAYE,MAAZ,CAAmB+B,IAAnB,CAAwB,2FAAxB;;AAEA;AACD;;AAED,aAAKG,MAAL,CAAY3B,IAAI,CAACU,KAAjB,EAAwBkB,qBAAxB,EAAoCC,IAApC,CAAyC,UAACC,UAAD,EAAgB;AACvD7B,UAAAA,OAAO,GAAG6B,UAAV,CADuD,CAGvD;;AACA7B,UAAAA,OAAO,CAAC8B,SAAR,CAAkBhC,YAAlB,CAA+BC,IAAI,CAACU,KAApC;AACD,SALD,EAKGsB,KALH,CAKS,UAACC,CAAD,EAAO;AACdC,UAAAA,OAAO,CAACC,GAAR,CAAYF,CAAZ;AACD,SAPD,EAQGG,OARH,CAQW,YAAM;AACb;AACA;AAEA,cAAI,MAAI,CAACC,gBAAL,CAAsBC,eAAtB,EAA4BrC,OAAO,CAACsC,EAApC,CAAJ,EAA6C;AAC3CzC,6BAAQ0C,SAAR,CAAkB;AAACC,cAAAA,KAAK,EAAEC,kBAAUC,cAAlB;AAAkC1C,cAAAA,OAAO,EAAPA,OAAlC;AAA2CD,cAAAA,IAAI,EAAE;AAAC4C,gBAAAA,OAAO,EAAEA,gBAAQC;AAAlB;AAAjD,aAAlB;;AACAC,kCAAQF,OAAR,CACE,MADF,EAEE;AACEG,cAAAA,IAAI,EAAE,UADR;AAEEC,cAAAA,QAAQ,EAAE;AAFZ,aAFF,EAMEC,0BAAeC,aANjB,EAOE;AACEjD,cAAAA,OAAO,EAAPA,OADF;AAEEkD,cAAAA,IAAI,EAAElD,OAAO,CAACkD,IAAR,KAAiBC,oBAAjB,GAA6BC,iBAA7B,GAAsCC;AAF9C,aAPF;AAYD,WAdD,MAeK;AACH;AACA/D,iCAAYE,MAAZ,CAAmB+B,IAAnB,CAAwB,kGAAxB;AACD;AACF,SA/BH;AAgCD,OAtED,MAuEK;AACHvB,QAAAA,OAAO,CAAC8B,SAAR,CAAkBwB,KAAlB,CAAwBtD,OAAxB,EAAiCD,IAAjC;AACD;AACF;AAED;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;WACI,4BAAmBwD,QAAnB,EAA6B;AAC3B,UAAOxD,IAAP,GAAewD,QAAf,CAAOxD,IAAP;AACA,UAAO0C,SAAP,GAAoB1C,IAApB,CAAO0C,SAAP;;AAEA,UAAIA,SAAS,IAAIA,SAAS,KAAKe,sBAAWC,YAA1C,EAAwD;AACtD,aAAKC,gBAAL,CAAsB3D,IAAtB;AACD;AACF;AAGD;AACJ;AACA;AACA;AACA;AACA;;;;WACI,gCAAuB;AACrB8C,4BAAQF,OAAR,CACE,IADF,EAEE;AACEG,QAAAA,IAAI,EAAE,gBADR;AAEEC,QAAAA,QAAQ,EAAE;AAFZ,OAFF,EAMEC,0BAAeW,6BANjB;AAQD;AAGD;AACJ;AACA;AACA;AACA;AACA;;;;WACI,2BAAkB;AAAA;;AAChB,WAAKjF,KAAL,CAAW4B,QAAX,CAAoBsD,OAApB,CAA4BC,EAA5B,CAA+BL,sBAAWM,aAA1C,EAAyD,UAACP,QAAD,EAAc;AACrE,QAAA,MAAI,CAACQ,kBAAL,CAAwBR,QAAxB;AACD,OAFD;AAGA,WAAK7E,KAAL,CAAW4B,QAAX,CAAoBsD,OAApB,CAA4BC,EAA5B,CAA+BG,gBAAKC,YAApC,EAAkD,UAACV,QAAD,EAAc;AAC9D7D,uBAAawE,iBAAb,CAA+BX,QAA/B,EAAyC,MAAI,CAAC1E,iBAA9C;AACD,OAFD;AAIA,WAAKH,KAAL,CAAW4B,QAAX,CAAoBsD,OAApB,CAA4BC,EAA5B,CAA+BM,iBAA/B,EAAuC,YAAM;AAC3C,QAAA,MAAI,CAACC,YAAL;AACD,OAFD;AAIA,WAAK1F,KAAL,CAAW4B,QAAX,CAAoBsD,OAApB,CAA4BC,EAA5B,CAA+BQ,kBAA/B,EAAwC,YAAM;AAC5C,QAAA,MAAI,CAACC,oBAAL;AACD,OAFD;AAGD;AAED;AACJ;AACA;AACA;AACA;AACA;;;;WACI,kCAAyB;AACvB,WAAK5F,KAAL,CAAW4B,QAAX,CAAoBsD,OAApB,CAA4BW,GAA5B,CAAgCf,sBAAWM,aAA3C;AACA,WAAKpF,KAAL,CAAW4B,QAAX,CAAoBsD,OAApB,CAA4BW,GAA5B,CAAgCP,gBAAKC,YAArC;AACA,WAAKvF,KAAL,CAAW4B,QAAX,CAAoBsD,OAApB,CAA4BW,GAA5B,CAAgCJ,iBAAhC;AACD;AAED;AACJ;AACA;AACA;AACA;;;;WACI,mBAAU;AAAA;;AACR,WAAKzF,KAAL,CAAW8F,IAAX,CAAgBC,gBAAhB,EAAuB,YAAM;AAC3BC,yBAAanF,GAAb,CAAiB,MAAI,CAACoF,MAAtB;;AACAC,8BAAarF,GAAb,CAAiB,MAAI,CAACoF,MAAL,CAAYE,OAA7B;AAEA;AACR;AACA;AACA;AACA;AACA;AACA;;;AACQ,QAAA,MAAI,CAACC,WAAL,GAAmB,MAAI,CAACH,MAAL,CAAYI,YAAZ,CAAyBC,qBAAzB,GAAiD,IAAIC,qBAAJ,CAAkB,MAAI,CAACvG,KAAvB,CAAjD,GAAiF,IAAIwG,oBAAJ,CAAgB,MAAI,CAACxG,KAArB,CAApG;AACA,QAAA,MAAI,CAACK,mBAAL,GAA2B,IAAIoG,4BAAJ,CAAwB;AAACL,UAAAA,WAAW,EAAE,MAAI,CAACA;AAAnB,SAAxB,EAAyD;AAACrG,UAAAA,MAAM,EAAE,MAAI,CAACC;AAAd,SAAzD,CAA3B;;AAEAmE,8BAAQF,OAAR,CACE,MADF,EAEE;AACEG,UAAAA,IAAI,EAAE,UADR;AAEEC,UAAAA,QAAQ,EAAE;AAFZ,SAFF,EAMEC,0BAAeoC,cANjB;AAQD,OAtBD;AAuBD;AAED;AACJ;AACA;AACA;AACA;AACA;AACA;;;;WACI,gCAAuBC,WAAvB,EAAoC;AAAA;;AAClC,UAAI,OAAOA,WAAP,KAAuB,SAA3B,EAAsC;AACpC;AACD;;AACD,UAAI,sBAAKV,MAAL,uFAAaI,YAAb,gFAA2BC,qBAA3B,MAAqDK,WAAzD,EAAsE;AACpE,aAAKV,MAAL,CAAYI,YAAZ,CAAyBC,qBAAzB,GAAiDK,WAAjD;AACA,aAAKP,WAAL,GAAmBO,WAAW,GAAG,IAAIJ,qBAAJ,CAAkB,KAAKvG,KAAvB,CAAH,GAAmC,IAAIwG,oBAAJ,CAAgB,KAAKxG,KAArB,CAAjE;AACD;AACF;AAED;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;;;;WACI,oBAAW;AAAA;;AACT,UAAI,CAAC,KAAKA,KAAL,CAAW4G,YAAhB,EAA8B;AAC5BhG,6BAAYE,MAAZ,CAAmB+F,KAAnB,CAAyB,6EAAzB;;AAEA,eAAO,iBAAQC,MAAR,CAAe,IAAIC,KAAJ,CAAU,sBAAV,CAAf,CAAP;AACD;;AAGD,UAAI,KAAKxG,UAAT,EAAqB;AACnBK,6BAAYE,MAAZ,CAAmBkG,IAAnB,CAAwB,sEAAxB;;AAEA,eAAO,iBAAQC,OAAR,EAAP;AACD;;AAED,aAAO,iBAAQC,GAAR,CAAY,CACjB,KAAKC,UAAL,EADiB,EAEjB,KAAKC,iBAAL,GAAyB/D,KAAzB,CAA+B,UAACwD,KAAD,EAAW;AACxCjG,6BAAYE,MAAZ,CAAmB+F,KAAnB,kDAAmEA,KAAK,CAACQ,OAAzE;AACD,OAFD,CAFiB,EAKjB,KAAKrH,KAAL,CAAW4B,QAAX,CAAoBC,MAApB,CAA2ByF,QAA3B,GACGpE,IADH,CACQ;AAAA,eAAMtC,qBAAYE,MAAZ,CAAmBkG,IAAnB,+DAA+E,MAAI,CAAChH,KAAL,CAAW4B,QAAX,CAAoBC,MAApB,CAA2BC,GAA1G,EAAN;AAAA,OADR,EAEGoB,IAFH,CAEQ;AAAA,eAAM,MAAI,CAAClD,KAAL,CAAW4B,QAAX,CAAoBsD,OAApB,CAA4BqC,OAA5B,EAAN;AAAA,OAFR,CALiB,EAQjBvG,eAAaC,gBAAb,CAA8BuG,IAA9B,CAAmC,IAAnC,CARiB,CAAZ,EASJtE,IATI,CASC,YAAM;AACZ,QAAA,MAAI,CAACuE,eAAL;;AACAtD,8BAAQF,OAAR,CACE,MADF,EAEE;AACEG,UAAAA,IAAI,EAAE,UADR;AAEEC,UAAAA,QAAQ,EAAE;AAFZ,SAFF,EAMEC,0BAAeoD,mBANjB;;AAQA,QAAA,MAAI,CAACnH,UAAL,GAAkB,IAAlB;;AACAY,yBAAQwG,oBAAR,CACEC,oBAAmBC,6BADrB;AAGD,OAvBM,EAwBJxE,KAxBI,CAwBE,UAACwD,KAAD,EAAW;AAChBjG,6BAAYE,MAAZ,CAAmB+F,KAAnB,kEAAmFA,KAAK,CAACQ,OAAzF;;AAEAlG,yBAAQwG,oBAAR,CACEC,oBAAmBE,4BADrB,EAEE;AACEC,UAAAA,MAAM,EAAElB,KAAK,CAACQ,OADhB;AAEEW,UAAAA,KAAK,EAAEnB,KAAK,CAACmB;AAFf,SAFF;;AAQA,eAAO,iBAAQlB,MAAR,CAAeD,KAAf,CAAP;AACD,OApCI,CAAP;AAqCD;AAED;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;;;;WACI,sBAAa;AAAA;;AACX,UAAI,CAAC,KAAKtG,UAAV,EAAsB;AACpBK,6BAAYE,MAAZ,CAAmBkG,IAAnB,CAAwB,0EAAxB;;AAEA,eAAO,iBAAQC,OAAR,EAAP;AACD;;AAED,WAAKgB,sBAAL;AAEA,aAAO,KAAKjI,KAAL,CAAW4B,QAAX,CAAoBsD,OAApB,CAA4BgD,UAA5B,GACJhF,IADI,CACC;AAAA,eAAM,MAAI,CAAClD,KAAL,CAAW4B,QAAX,CAAoBC,MAApB,CAA2BsG,UAA3B,EAAN;AAAA,OADD,EAEJjF,IAFI,CAEC,YAAM;AACViB,8BAAQF,OAAR,CACE,MADF,EAEE;AACEG,UAAAA,IAAI,EAAE,UADR;AAEEC,UAAAA,QAAQ,EAAE;AAFZ,SAFF,EAMEC,0BAAe8D,qBANjB;;AAQA,QAAA,MAAI,CAAC7H,UAAL,GAAkB,KAAlB;AACD,OAZI,CAAP;AAaD;AAED;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;WACI,sBAAyB;AAAA;;AAAA,UAAd8H,OAAc,uEAAJ,EAAI;;AACvBzH,2BAAYE,MAAZ,CAAmBkG,IAAnB,CAAwB,8CAAxB;;AAEA,aAAO,KAAK/G,aAAL,CAAmBqI,UAAnB,CAA8BD,OAA9B,EACJnF,IADI,CACC,UAACqF,YAAD,EAAkB;AACtB3H,6BAAYE,MAAZ,CAAmBkG,IAAnB,CAAwB,kEAAxB,EAA4FuB,YAA5F;;AACApE,8BAAQF,OAAR,CACE,MADF,EAEE;AACEG,UAAAA,IAAI,EAAE,UADR;AAEEC,UAAAA,QAAQ,EAAE;AAFZ,SAFF,EAMEC,0BAAekE,0BANjB,EAOE;AACEC,UAAAA,SAAS,EAAEJ,OAAO,CAACI,SADrB;AAEEC,UAAAA,OAAO,EAAEH;AAFX,SAPF;AAYD,OAfI,EAgBJlF,KAhBI,CAgBE,UAACsF,WAAD,EAAiB;AACtB/H,6BAAYE,MAAZ,CAAmB+F,KAAnB,CAAyB,iEAAzB,EAA4F8B,WAA5F;;AACAxE,8BAAQF,OAAR,CACE,MADF,EAEE;AACEG,UAAAA,IAAI,EAAE,UADR;AAEEC,UAAAA,QAAQ,EAAE;AAFZ,SAFF,EAMEC,0BAAesE,0BANjB,EAOE;AACEH,UAAAA,SAAS,EAAEJ,OAAO,CAACI,SADrB;AAEEV,UAAAA,MAAM,EAAEY;AAFV,SAPF;;AAaAxH,yBAAQwG,oBAAR,CACEC,oBAAmBiB,mBADrB,EAEE;AACEJ,UAAAA,SAAS,EAAEJ,OAAO,CAACS,UADrB;AAEEf,UAAAA,MAAM,EAAEY,WAAW,CAACtB,OAFtB;AAGEW,UAAAA,KAAK,EAAEW,WAAW,CAACX,KAHrB;AAIEe,UAAAA,IAAI,EAAEJ,WAAW,CAACI;AAJpB,SAFF;AASD,OAxCI,CAAP;AAyCD;AAED;AACJ;AACA;AACA;AACA;AACA;;;;WACI,2BAAkB;AAChB,WAAKzI,YAAL,GAAoB,IAAI0I,qBAAJ,CAAiB,KAAKhJ,KAAtB,CAApB;AACD;AAED;AACJ;AACA;AACA;AACA;AACA;;;;WACI,2BAAkB;AAChB,aAAO,KAAKM,YAAZ;AACD;AAED;AACJ;AACA;AACA;AACA;AACA;;;;WACI,6BAAoB;AAClB,UAAI,CAAC,KAAKA,YAAV,EAAwB;AACtB,aAAK2I,eAAL;AACD;;AAED,aAAO,KAAKC,eAAL,GAAuBC,kBAAvB,EAAP;AACD;AAED;AACJ;AACA;AACA;AACA;AACA;;;;WACI,sBAAa;AAAA;;AACX,aAAO,KAAKtJ,OAAL,CAAauJ,YAAb,GAA4BlG,IAA5B,CAAiC,UAACmG,GAAD,EAAS;AAC/C,QAAA,MAAI,CAACC,WAAL,GAAmBD,GAAnB;AACD,OAFM,CAAP;AAGD;AAED;AACJ;AACA;AACA;AACA;AACA;;;;WACI,kCAAyB;AACvB,aAAO,KAAKhJ,mBAAZ;AACD;AAED;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;;;;WACI,iBAAQiB,OAAR,EAAiByG,MAAjB,EAAyB;AACvBwB,oBAAYC,OAAZ,CAAoBlI,OAApB;;AACA,WAAKnB,iBAAL,CAAuBsJ,MAAvB,CAA8BnI,OAAO,CAACsC,EAAtC;;AACAO,4BAAQF,OAAR,CACE,IADF,EAEE;AACEG,QAAAA,IAAI,EAAE,UADR;AAEEC,QAAAA,QAAQ,EAAE;AAFZ,OAFF,EAMEC,0BAAeoF,eANjB,EAOE;AACEjB,QAAAA,SAAS,EAAEnH,OAAO,CAACsC,EADrB;AAEEmE,QAAAA,MAAM,EAANA;AAFF,OAPF;AAYD;AAED;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;;;;WACI,gBAAO4B,WAAP,EAAiC;AAAA;;AAAA,UAAbnF,IAAa,uEAAN,IAAM;AAC/B;AAEA;AACA;AACA;AACA;AACA,aAAO,KAAK4B,WAAL,CAAiBwD,gBAAjB,CAAkCD,WAAlC,EAA+CnF,IAA/C,EACL;AADK,OAEJnB,KAFI,CAEE,UAACwD,KAAD,EAAW;AAChBjG,6BAAYE,MAAZ,CAAmBkG,IAAnB,6EAA6FH,KAAK,CAACQ,OAAnG;AACD,OAJI,EAKJnE,IALI,CAKC,YAAkB;AAAA,YAAjBmF,OAAiB,uEAAP,EAAO;AACtB;AACA,YAAMwB,UAAU,GAAGxB,OAAO,CAACsB,WAAR,IAAuBA,WAA1C,CAFsB,CAItB;;AACA,YAAIrI,OAAO,GAAG,IAAd;;AAEA,YAAIkD,IAAI,KAAKsF,6BAAT,IAA+BzB,OAAO,CAAC7D,IAAR,KAAiBsF,6BAApD,EAAwE;AACtExI,UAAAA,OAAO,GAAG,MAAI,CAACnB,iBAAL,CAAuBoB,QAAvB,CAAgCa,2BAAhC,EAAkDyH,UAAlD,CAAV;AACD,SATqB,CAWtB;;;AACA,YAAI,CAACvI,OAAL,EAAc;AACZA,UAAAA,OAAO,GAAG,MAAI,CAACnB,iBAAL,CAAuBoB,QAAvB,CAAgCS,kBAAhC,EAAyC6H,UAAzC,CAAV;AACD,SAdqB,CAiBtB;;;AACA,YAAI,CAACvI,OAAL,EAAc;AACZ;AACA,iBAAO,MAAI,CAACyI,aAAL,CAAmBF,UAAnB,EAA+BrF,IAA/B,EACJtB,IADI,CACC,UAAC8G,cAAD,EAAoB;AACxB;AACA,gBAAIA,cAAc,IAAIA,cAAc,CAAC7E,EAArC,EAAyC;AACvC;AACA6E,cAAAA,cAAc,CAAC7E,EAAf,CAAkB8E,kBAAOC,eAAzB,EAA0C,UAACC,OAAD,EAAa;AACrD,oBAAI,MAAI,CAAClE,MAAL,CAAYmE,cAAhB,EAAgC;AAAA;;AAC9B,kBAAA,MAAI,CAAC9B,UAAL,CAAgB;AACd+B,oBAAAA,SAAS,2BAAEL,cAAc,CAAC5G,SAAjB,oFAAE,sBAA0BZ,SAA5B,2DAAE,uBAAqC8H,UADlC;AAEdC,oBAAAA,aAAa,EAAEP,cAAc,CAACO,aAFhB;AAGdC,oBAAAA,UAAU,EAAER,cAAc,CAACO,aAHb;AAIdE,oBAAAA,OAAO,EAAET,cAAc,CAACS,OAJV;AAKdhC,oBAAAA,SAAS,4BAAEuB,cAAc,CAAC5G,SAAjB,qFAAE,uBAA0B4D,IAA5B,2DAAE,uBAAgC0D;AAL7B,mBAAhB,EAMGxH,IANH,CAMQ;AAAA,2BAAM,MAAI,CAACyH,OAAL,CAAaX,cAAb,EAA6BG,OAAO,CAACpC,MAArC,CAAN;AAAA,mBANR;AAOD,iBARD,MASK;AACH,kBAAA,MAAI,CAAC4C,OAAL,CAAaX,cAAb,EAA6BG,OAAO,CAACpC,MAArC;AACD;AACF,eAbD;AAeAiC,cAAAA,cAAc,CAAC7E,EAAf,CAAkB8E,kBAAOW,mBAAzB,EAA8C,UAACC,eAAD,EAAqB;AACjE,oBAAI,MAAI,CAAC5E,MAAL,CAAYmE,cAAhB,EAAgC;AAAA;;AAC9B,kBAAA,MAAI,CAAC9B,UAAL,CAAgB;AACd+B,oBAAAA,SAAS,EAAEQ,eAAF,aAAEA,eAAF,gDAAEA,eAAe,CAAEzH,SAAnB,oFAAE,sBAA4BZ,SAA9B,2DAAE,uBAAuC8H,UADpC;AAEdC,oBAAAA,aAAa,EAAEM,eAAe,CAACN,aAFjB;AAGdC,oBAAAA,UAAU,EAAEK,eAAe,CAACN,aAHd;AAIdE,oBAAAA,OAAO,EAAEI,eAAe,CAACJ,OAJX;AAKdhC,oBAAAA,SAAS,4BAAEoC,eAAe,CAACzH,SAAlB,qFAAE,uBAA2B4D,IAA7B,2DAAE,uBAAiC0D;AAL9B,mBAAhB;AAOD;AACF,eAVD;AAWD,aA5BD,MA6BK;AACH9J,mCAAYE,MAAZ,CAAmB+F,KAAnB,4IAA6JvF,OAA7J;AACD,aAjCuB,CAmCxB;;;AACA,mBAAO,iBAAQ2F,OAAR,CAAgB+C,cAAhB,CAAP;AACD,WAtCI,CAAP;AAuCD,SA3DqB,CA6DtB;;;AACA,eAAO,iBAAQ/C,OAAR,CAAgB3F,OAAhB,CAAP;AACD,OApEI,CAAP;AAqED;AAED;AACJ;AACA;AACA;AACA;AACA;AACA;;;;;mGACI,iBAAoBqI,WAApB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAiCnF,gBAAAA,IAAjC,2DAAwC,IAAxC;AACQlD,gBAAAA,OADR,GACkB,IAAIwJ,gBAAJ,CACd;AACEC,kBAAAA,MAAM,EAAE,KAAK/K,KAAL,CAAW4B,QAAX,CAAoBC,MAApB,CAA2BkJ,MADrC;AAEEC,kBAAAA,SAAS,EAAE,KAAKhL,KAAL,CAAW4B,QAAX,CAAoBC,MAApB,CAA2BC,GAFxC;AAGEmJ,kBAAAA,KAAK,EAAE,KAAKjL,KAAL,CAAW4B,QAAX,CAAoBC,MAApB,CAA2BoJ,KAHpC;AAIEC,kBAAAA,OAAO,EAAE,CAJX;AAKEnJ,kBAAAA,KAAK,EAAEyC,IAAI,KAAKvB,qBAAT,GAAsB0G,WAAtB,GAAoC,IAL7C;AAKmD;AACjDwB,kBAAAA,mBAAmB,EAAE,KAAK/E;AAN5B,iBADc,EASd;AACErG,kBAAAA,MAAM,EAAE,KAAKC;AADf,iBATc,CADlB;AAeE,qBAAKG,iBAAL,CAAuBU,GAAvB,CAA2BS,OAA3B;AAfF;AAAA;AAAA,uBAkBUA,OAAO,CAAC8J,gBAAR,CAAyB;AAACzB,kBAAAA,WAAW,EAAXA,WAAD;AAAcnF,kBAAAA,IAAI,EAAJA;AAAd,iBAAzB,CAlBV;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAqBI,oBAAI,EAAE,uBAAe6G,qBAAjB,KAAkC,EAAE,uBAAeC,sBAAjB,CAAtC,EAAuE;AACrE;AACA1K,uCAAYE,MAAZ,CAAmBkG,IAAnB,kFAAkG2C,WAAlG;;AACA/I,uCAAYE,MAAZ,CAAmBkG,IAAnB,CAAwB,4FAAxB;AACD;;AACDpG,qCAAYE,MAAZ,CAAmByK,KAAnB,wGA1BJ,CA2BI;;;AACAjK,gBAAAA,OAAO,CAACqI,WAAR,GAAsBA,WAAtB;;AA5BJ;AAAA;;AA+BI;AACA;AACA;AACA,oBAAInF,IAAI,KAAKvB,qBAAb,EAAyB;AACvB,sBAAI,CAAC3B,OAAO,CAACkK,MAAb,EAAqB;AACnBlK,oBAAAA,OAAO,CAACmK,SAAR,CAAkB9B,WAAlB;AACD,mBAHsB,CAKvB;;;AACM+B,kBAAAA,gBANiB,GAME1K,eAAa2K,mBAAb,CAAiCnH,IAAjC,CANF,EAQvB;AACA;;AACAL,wCAAQF,OAAR,CACE,IADF,EAEE;AACEG,oBAAAA,IAAI,EAAE,UADR;AAEEC,oBAAAA,QAAQ,EAAE;AAFZ,mBAFF,EAMEC,0BAAeC,aANjB,EAOE;AACEjD,oBAAAA,OAAO,EAAPA,OADF;AAEEkD,oBAAAA,IAAI,EAAEkH;AAFR,mBAPF;AAYD;;AAxDL;;AAAA;AAAA,iDA2DSpK,OA3DT;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,O;;;;;;;;AAgFA;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;;;;WACI,0BAAiBkD,IAAjB,EAAuBoH,KAAvB,EAA8B;AAC5B,aAAO,KAAKzL,iBAAL,CAAuBoB,QAAvB,CAAgCiD,IAAhC,EAAsCoH,KAAtC,CAAP;AACD;AAED;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;WACI,0BAA6B;AAAA,UAAdvD,OAAc,uEAAJ,EAAI;AAC3B;AACA;AACA,aAAO,KAAKlI,iBAAL,CAAuB0L,MAAvB,CAA8BxD,OAA9B,CAAP;AACD;AAED;AACJ;AACA;AACA;AACA;AACA;;;;WACI,wBAAe;AAAA;;AACb,aAAO,KAAKxI,OAAL,CAAaiM,iBAAb,GAAiC5I,IAAjC,CAAsC,UAAC6I,UAAD,EAAgB;AAC3D,YAAMC,cAAc,GAAG,EAAvB;;AAEA,YAAID,UAAU,SAAV,IAAAA,UAAU,WAAV,IAAAA,UAAU,CAAEE,IAAZ,IAAoBF,UAAU,CAACE,IAAX,CAAgB1J,MAAhB,GAAyB,CAAjD,EAAoD;AAClDwJ,UAAAA,UAAU,CAACE,IAAX,CAAgBC,OAAhB,CAAwB,UAACnK,KAAD,EAAW;AACjCiK,YAAAA,cAAc,CAACG,IAAf,CAAoBpK,KAAK,CAACD,GAA1B;;AACA,YAAA,OAAI,CAACkD,gBAAL,CAAsB;AACpBjD,cAAAA,KAAK,EAALA,KADoB;AAEpBN,cAAAA,QAAQ,EAAEM,KAAK,CAACD;AAFI,aAAtB;AAID,WAND;AAOD;;AACD,YAAMsK,kBAAkB,GAAG,OAAI,CAACjM,iBAAL,CAAuB0L,MAAvB,EAA3B;;AAEA,YAAI,mBAAYO,kBAAZ,EAAgC7J,MAAhC,GAAyC,CAA7C,EAAgD;AAC9C;AACA;AACA,4CAAsB,qBAAc6J,kBAAd,CAAtB,oCAAyD;AAApD,gBAAM9K,OAAO,qBAAb;;AACH,gBAAI,CAAC0K,cAAc,CAACK,QAAf,CAAwB/K,OAAO,CAACG,QAAhC,CAAL,EAAgD;AAC9C;AACA,cAAA,OAAI,CAACkJ,OAAL,CAAarJ,OAAb,EAAsBgL,kCAAuBC,mBAA7C;AACD;AACF;AACF;AACF,OAxBM,CAAP;AAyBD;AAED;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;;;;WACI,gCAAuB;AACrB,aAAO,KAAKpM,iBAAL,CAAuB0L,MAAvB,CAA8B;AAACW,QAAAA,SAAS,EAAE;AAAZ,OAA9B,CAAP;AACD;AAED;AACJ;AACA;AACA;;;;WACI,qBAAY;AACV,aAAO5L,qBAAY6L,GAAZ,EAAP;AACD;AAED;AACJ;AACA;AACA;AACA;AACA;;;;WACI,uBAAc;AACZ,aAAOC,iBAAP;AACD;AAED;AACJ;AACA;AACA;AACA;AACA;;;;WACI,yBAAgB;AACd,aAAOC,mBAAP;AACD;;;EAryBiCC,sB","sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n*/\n\nimport '@webex/internal-plugin-mercury';\nimport {WebexPlugin} from '@webex/webex-core';\n\nimport 'webrtc-adapter';\n\nimport Metrics from '../metrics';\nimport {trigger, eventType} from '../metrics/config';\nimport LoggerConfig from '../common/logs/logger-config';\nimport StaticConfig from '../common/config';\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport LoggerRequest from '../common/logs/request';\nimport Trigger from '../common/events/trigger-proxy';\nimport Media from '../media';\nimport MeetingUtil from '../meeting/util';\nimport {\n MEETINGS,\n EVENTS,\n EVENT_TRIGGERS,\n READY,\n LOCUSEVENT,\n LOCUS_URL,\n ROAP,\n ONLINE,\n OFFLINE,\n _MEETING_,\n _JOIN_,\n _LOCUS_ID_,\n _INCOMING_,\n LOCUS,\n CORRELATION_ID,\n SIP_URI,\n _LEFT_,\n _ID_,\n MEETING_REMOVED_REASON,\n _CONVERSATION_URL_,\n CONVERSATION_URL\n} from '../constants';\nimport BEHAVIORAL_METRICS from '../metrics/constants';\nimport MeetingInfo from '../meeting-info';\nimport MeetingInfoV2 from '../meeting-info/meeting-info-v2';\nimport Meeting from '../meeting';\nimport PersonalMeetingRoom from '../personal-meeting-room';\nimport Reachability from '../reachability';\nimport Request from '../meetings/request';\nimport StatsAnalyzer from '../analyzer/analyzer';\nimport StatsCalculator from '../analyzer/calculator';\nimport PasswordError from '../common/errors/password-error';\nimport CaptchaError from '../common/errors/captcha-error';\n\nimport MeetingCollection from './collection';\nimport MeetingsUtil from './util';\n\n\n/**\n * Meetings Ready Event\n * Emitted when the meetings instance on webex is ready\n * @event meetings:ready\n * @instance\n * @memberof Meetings\n */\n\n/**\n * Meetings Network Disconnected Event\n * Emitted when the meetings instance is disconnected from\n * the internal mercury server\n * @event network:disconnected\n * @instance\n * @memberof Meetings\n */\n\n/**\n * Meetings Registered Event\n * Emitted when the meetings instance has been registered and listening\n * @event meetings:registered\n * @instance\n * @memberof Meetings\n */\n\n/**\n * Meeting Removed Event\n * Emitted when a meeting was removed from the cache of meetings\n * @event meeting:removed\n * @instance\n * @type {Object}\n * @property {String} meetingId the removed meeting\n * @property {Object} response the server response\n * @property {String} type what type of meeting it was\n * @memberof Meetings\n */\n\n/**\n * Meeting Added Event\n * Emitted when a meeting was added to the cache of meetings\n * @event meeting:added\n * @instance\n * @type {Object}\n * @property {String} meetingId the added meeting\n * @property {String} type what type of meeting it was\n * @memberof Meetings\n */\n\n/**\n * Maintain a cache of meetings and sync with services.\n * @class\n */\nexport default class Meetings extends WebexPlugin {\n namespace = MEETINGS;\n\n /**\n * Initializes the Meetings Plugin\n * @constructor\n * @public\n * @memberof Meetings\n */\n constructor(...args) {\n super(...args);\n\n /**\n * The Meetings request to interact with server\n * @instance\n * @type {Object}\n * @private\n * @memberof Meetings\n */\n this.request = new Request({}, {parent: this.webex});\n /**\n * Log upload request helper\n * @instance\n * @type {Object}\n * @private\n * @memberof Meetings\n */\n this.loggerRequest = new LoggerRequest({webex: this.webex});\n this.meetingCollection = new MeetingCollection();\n /**\n * The PersonalMeetingRoom object to interact with server\n * @instance\n * @type {Object}\n * @public\n * @memberof Meetings\n */\n this.personalMeetingRoom = null;\n /**\n * The Reachability object to interact with server, starts as null until {@link Meeting#setReachability} is called\n * starts as null\n * @instance\n * @type {Object}\n * @private\n * @memberof Meetings\n */\n this.reachability = null;\n\n /**\n * If the meetings plugin has been registered and listening via {@link Meetings#register}\n * @instance\n * @type {Boolean}\n * @public\n * @memberof Meetings\n */\n this.registered = false;\n\n /**\n * The public interface for the internal Media util files. These are helpful to expose outside the context\n * of a meeting so that a user can access media without creating a meeting instance.\n * @instance\n * @type {Object}\n * @private\n * @memberof Meetings\n */\n this.media = {\n getUserMedia: Media.getUserMedia,\n getSupportedDevice: Media.getSupportedDevice\n };\n\n LoggerProxy.set(this.webex.logger);\n\n this.onReady();\n MeetingsUtil.checkH264Support({disableNotifications: true});\n Metrics.initialSetup(this.meetingCollection, this.webex);\n }\n\n /**\n * handle locus events and takes meeting actions with them as they come in\n * @param {Object} data a locus event\n * @param {String} data.locusUrl\n * @param {Object} data.locus\n * @param {String} data.eventType\n * @returns {undefined}\n * @private\n * @memberof Meetings\n */\n handleLocusEvent(data) {\n let meeting = null;\n\n // getting meeting by correlationId. This will happen for the new event\n // Either the locus\n // TODO : Add check for the callBack Address\n meeting = this.meetingCollection.getByKey(LOCUS_URL, data.locusUrl) ||\n this.meetingCollection.getByKey(CORRELATION_ID, MeetingsUtil.checkForCorrelationId(this.webex.internal.device.url, data.locus)) ||\n this.meetingCollection.getByKey(SIP_URI, data.locus.self && data.locus.self.callbackInfo && data.locus.self.callbackInfo.callbackAddress) ||\n this.meetingCollection.getByKey(CONVERSATION_URL, data.locus.conversationUrl);\n\n // Special case when locus has got replaced, This only happend once if a replace locus exists\n // https://sqbu-github.cisco.com/WebExSquared/locus/wiki/Locus-changing-mid-call\n\n if (!meeting && data.locus?.replaces?.length > 0) {\n // Always the last element in the replace is the active one\n meeting = this.meetingCollection.getByKey(LOCUS_URL, data.locus.replaces[data.locus.replaces.length - 1].locusUrl);\n }\n\n if (!meeting) {\n // TODO: create meeting when we get a meeting object\n // const checkForEnded = (locus) => {\n // TODO: you already ended the meeting but you got an event later\n // Mainly for 1:1 Callsor meeting\n // Happens mainly after refresh\n\n // 1:1 Meeting\n // 1) You ended a call before but you got a mercury event\n // Make sure end the call and cleanup the meeting only if the mercury\n // event says so\n // 2) Maintain lastSync time in the meetings object which helps to compare\n // If the meeting came befor or after the sync . ANy meeting start time before the sync time is invalid\n\n // For space Meeting\n // Check the locus object and see who has joined\n\n // };\n // rather then locus object change to locus url\n\n if (data.locus && data.locus.fullState && data.locus.fullState.state === LOCUS.STATE.INACTIVE) {\n // just ignore the event as its already ended and not active\n LoggerProxy.logger.warn('Meetings:index#handleLocusEvent --> Locus event received for meeting, after it was ended.');\n\n return;\n }\n\n\n // When its wireless share or guest and user leaves the meeting we dont have to keep the meeting object\n // Any future events will be neglected\n\n if (data.locus && data.locus.self && (data.locus.self.state === _LEFT_ && data.locus.self.removed === true)) {\n // just ignore the event as its already ended and not active\n LoggerProxy.logger.warn('Meetings:index#handleLocusEvent --> Locus event received for meeting, after it was ended.');\n\n return;\n }\n\n this.create(data.locus, _LOCUS_ID_).then((newMeeting) => {\n meeting = newMeeting;\n\n // It's a new meeting so initialize the locus data\n meeting.locusInfo.initialSetup(data.locus);\n }).catch((e) => {\n console.log(e);\n })\n .finally(() => {\n // There will be cases where locus event comes in gets created and deleted because its a 1:1 and meeting gets deleted\n // because the other user left so before sending 'added' event make sure it exists in the collection\n\n if (this.getMeetingByType(_ID_, meeting.id)) {\n Metrics.postEvent({event: eventType.REMOTE_STARTED, meeting, data: {trigger: trigger.MERCURY_EVENT}});\n Trigger.trigger(\n this,\n {\n file: 'meetings',\n function: 'handleLocusEvent'\n },\n EVENT_TRIGGERS.MEETING_ADDED,\n {\n meeting,\n type: meeting.type === _MEETING_ ? _JOIN_ : _INCOMING_\n }\n );\n }\n else {\n // Meeting got added but was not found in the collection. It might have got destroyed\n LoggerProxy.logger.warn('Meetings:index#handleLocusEvent --> Created and destroyed meeting object before sending an event');\n }\n });\n }\n else {\n meeting.locusInfo.parse(meeting, data);\n }\n }\n\n /**\n * handles locus events through mercury that are not roap\n * @param {Object} envelope\n * @param {Object} envelope.data\n * @param {String} envelope.data.eventType\n * @returns {undefined}\n * @private\n * @memberof Meetings\n */\n handleLocusMercury(envelope) {\n const {data} = envelope;\n const {eventType} = data;\n\n if (eventType && eventType !== LOCUSEVENT.MESSAGE_ROAP) {\n this.handleLocusEvent(data);\n }\n }\n\n\n /**\n * handles mecury offline event\n * @returns {undefined}\n * @private\n * @memberof Meetings\n */\n handleMercuryOffline() {\n Trigger.trigger(\n this,\n {\n file: 'meetings/index',\n function: 'handleMercuryOffline'\n },\n EVENT_TRIGGERS.MEETINGS_NETWORK_DISCONNECTED,\n );\n }\n\n\n /**\n * registers for locus and roap mercury events\n * @returns {undefined}\n * @private\n * @memberof Meetings\n */\n listenForEvents() {\n this.webex.internal.mercury.on(LOCUSEVENT.LOCUS_MERCURY, (envelope) => {\n this.handleLocusMercury(envelope);\n });\n this.webex.internal.mercury.on(ROAP.ROAP_MERCURY, (envelope) => {\n MeetingsUtil.handleRoapMercury(envelope, this.meetingCollection);\n });\n\n this.webex.internal.mercury.on(ONLINE, () => {\n this.syncMeetings();\n });\n\n this.webex.internal.mercury.on(OFFLINE, () => {\n this.handleMercuryOffline();\n });\n }\n\n /**\n * stops listening for locus and roap mercury events\n * @returns {undefined}\n * @private\n * @memberof Meetings\n */\n stopListeningForEvents() {\n this.webex.internal.mercury.off(LOCUSEVENT.LOCUS_MERCURY);\n this.webex.internal.mercury.off(ROAP.ROAP_MERCURY);\n this.webex.internal.mercury.off(ONLINE);\n }\n\n /**\n * @returns {undefined}\n * @private\n * @memberof Meetings\n */\n onReady() {\n this.webex.once(READY, () => {\n StaticConfig.set(this.config);\n LoggerConfig.set(this.config.logging);\n\n /**\n * The MeetingInfo object to interact with server\n * @instance\n * @type {Object}\n * @private\n * @memberof Meetings\n */\n this.meetingInfo = this.config.experimental.enableUnifiedMeetings ? new MeetingInfoV2(this.webex) : new MeetingInfo(this.webex);\n this.personalMeetingRoom = new PersonalMeetingRoom({meetingInfo: this.meetingInfo}, {parent: this.webex});\n\n Trigger.trigger(\n this,\n {\n file: 'meetings',\n function: 'onReady'\n },\n EVENT_TRIGGERS.MEETINGS_READY\n );\n });\n }\n\n /**\n * API to toggle unified meetings\n * @param {Boolean} changeState\n * @private\n * @memberof Meetings\n * @returns {undefined}\n */\n _toggleUnifiedMeetings(changeState) {\n if (typeof changeState !== 'boolean') {\n return;\n }\n if (this.config?.experimental?.enableUnifiedMeetings !== changeState) {\n this.config.experimental.enableUnifiedMeetings = changeState;\n this.meetingInfo = changeState ? new MeetingInfoV2(this.webex) : new MeetingInfo(this.webex);\n }\n }\n\n /**\n * Explicitly sets up the meetings plugin by registering\n * the device, connecting to mercury, and listening for locus events.\n *\n * @returns {Promise}\n * @public\n * @memberof Meetings\n */\n register() {\n if (!this.webex.canAuthorize) {\n LoggerProxy.logger.error('Meetings:index#register --> ERROR, Unable to register, SDK cannot authorize');\n\n return Promise.reject(new Error('SDK cannot authorize'));\n }\n\n\n if (this.registered) {\n LoggerProxy.logger.info('Meetings:index#register --> INFO, Meetings plugin already registered');\n\n return Promise.resolve();\n }\n\n return Promise.all([\n this.getGeoHint(),\n this.startReachability().catch((error) => {\n LoggerProxy.logger.error(`Meetings:index#register --> GDM error, ${error.message}`);\n }),\n this.webex.internal.device.register()\n .then(() => LoggerProxy.logger.info(`Meetings:index#register --> INFO, Device registered ${this.webex.internal.device.url}`))\n .then(() => this.webex.internal.mercury.connect()),\n MeetingsUtil.checkH264Support.call(this)\n ]).then(() => {\n this.listenForEvents();\n Trigger.trigger(\n this,\n {\n file: 'meetings',\n function: 'register'\n },\n EVENT_TRIGGERS.MEETINGS_REGISTERED\n );\n this.registered = true;\n Metrics.sendBehavioralMetric(\n BEHAVIORAL_METRICS.MEETINGS_REGISTRATION_SUCCESS,\n );\n })\n .catch((error) => {\n LoggerProxy.logger.error(`Meetings:index#register --> ERROR, Unable to register, ${error.message}`);\n\n Metrics.sendBehavioralMetric(\n BEHAVIORAL_METRICS.MEETINGS_REGISTRATION_FAILED,\n {\n reason: error.message,\n stack: error.stack\n }\n );\n\n return Promise.reject(error);\n });\n }\n\n /**\n * Explicitly tears down the meetings plugin by deregistering\n * the device, disconnecting from mercury, and stops listening to locus events\n *\n * @returns {Promise}\n * @public\n * @memberof Meetings\n */\n unregister() {\n if (!this.registered) {\n LoggerProxy.logger.info('Meetings:index#unregister --> INFO, Meetings plugin already unregistered');\n\n return Promise.resolve();\n }\n\n this.stopListeningForEvents();\n\n return this.webex.internal.mercury.disconnect()\n .then(() => this.webex.internal.device.unregister())\n .then(() => {\n Trigger.trigger(\n this,\n {\n file: 'meetings',\n function: 'unregister'\n },\n EVENT_TRIGGERS.MEETINGS_UNREGISTERED\n );\n this.registered = false;\n });\n }\n\n /**\n * Uploads logs to the webex services for tracking\n * @param {Object} [options={}]\n * @param {String} [options.callStart] Call Start Time\n * @param {String} [options.feedbackId] ID used for tracking\n * @param {String} [options.locusId]\n * @param {String} [options.correlationId]\n * @param {String} [options.meetingId] webex meeting ID\n * @param {String} [options.userId] userId\n * @param {String} [options.orgId] org id\n * @returns {String} feedback ID logs were submitted under\n */\n uploadLogs(options = {}) {\n LoggerProxy.logger.info('Meetings:index#uploadLogs --> uploading logs');\n\n return this.loggerRequest.uploadLogs(options)\n .then((uploadResult) => {\n LoggerProxy.logger.info('Meetings:index#uploadLogs --> Upload logs for meeting completed.', uploadResult);\n Trigger.trigger(\n this,\n {\n file: 'meetings',\n function: 'uploadLogs'\n },\n EVENT_TRIGGERS.MEETING_LOG_UPLOAD_SUCCESS,\n {\n meetingId: options.meetingId,\n details: uploadResult\n }\n );\n })\n .catch((uploadError) => {\n LoggerProxy.logger.error('Meetings:index#uploadLogs --> Unable to upload logs for meeting', uploadError);\n Trigger.trigger(\n this,\n {\n file: 'meetings',\n function: 'uploadLogs'\n },\n EVENT_TRIGGERS.MEETING_LOG_UPLOAD_FAILURE,\n {\n meetingId: options.meetingId,\n reason: uploadError\n }\n );\n\n Metrics.sendBehavioralMetric(\n BEHAVIORAL_METRICS.UPLOAD_LOGS_FAILURE,\n {\n meetingId: options.meetingsId,\n reason: uploadError.message,\n stack: uploadError.stack,\n code: uploadError.code\n }\n );\n });\n }\n\n /**\n * initializes the reachability instance for Meetings\n * @returns {undefined}\n * @public\n * @memberof Meetings\n */\n setReachability() {\n this.reachability = new Reachability(this.webex);\n }\n\n /**\n * gets the reachability instance for Meetings\n * @returns {Reachability}\n * @public\n * @memberof Meetings\n */\n getReachability() {\n return this.reachability;\n }\n\n /**\n * initializes and starts gathering reachability for Meetings\n * @returns {Promise}\n * @public\n * @memberof Meetings\n */\n startReachability() {\n if (!this.reachability) {\n this.setReachability();\n }\n\n return this.getReachability().gatherReachability();\n }\n\n /**\n * Get geoHint for info for meetings\n * @returns {Promise}\n * @private\n * @memberof Meetings\n */\n getGeoHint() {\n return this.request.fetchGeoHint().then((res) => {\n this.geoHintInfo = res;\n });\n }\n\n /**\n * gets the personal meeting room instance, for saved PMR values for this user\n * @returns {PersonalMeetingRoom}\n * @public\n * @memberof Meetings\n */\n getPersonalMeetingRoom() {\n return this.personalMeetingRoom;\n }\n\n /**\n * @param {Meeting} meeting\n * @param {Object} reason\n * @param {String} type\n * @returns {Undefined}\n * @private\n * @memberof Meetings\n */\n destroy(meeting, reason) {\n MeetingUtil.cleanUp(meeting);\n this.meetingCollection.delete(meeting.id);\n Trigger.trigger(\n this,\n {\n file: 'meetings',\n function: 'destroy'\n },\n EVENT_TRIGGERS.MEETING_REMOVED,\n {\n meetingId: meeting.id,\n reason\n }\n );\n }\n\n /**\n * Create a meeting.\n * @param {string} destination - sipURL, spaceId, phonenumber, or locus object}\n * @param {string} [type] - the optional specified type, such as locusId\n * @returns {Promise<Meeting>} A new Meeting.\n * @public\n * @memberof Meetings\n */\n create(destination, type = null) {\n // TODO: type should be from a dictionary\n\n // Validate meeting information based on the provided destination and\n // type. This must be performed prior to determining if the meeting is\n // found in the collection, as we mutate the destination for hydra person\n // id values.\n return this.meetingInfo.fetchInfoOptions(destination, type)\n // Catch a failure to fetch info options.\n .catch((error) => {\n LoggerProxy.logger.info(`Meetings:index#create --> INFO, unable to determine info options: ${error.message}`);\n })\n .then((options = {}) => {\n // Normalize the destination.\n const targetDest = options.destination || destination;\n\n // check for the conversation URL then sip Url\n let meeting = null;\n\n if (type === _CONVERSATION_URL_ || options.type === _CONVERSATION_URL_) {\n meeting = this.meetingCollection.getByKey(CONVERSATION_URL, targetDest);\n }\n\n // Attempt to collect the meeting if it exists.\n if (!meeting) {\n meeting = this.meetingCollection.getByKey(SIP_URI, targetDest);\n }\n\n\n // Validate if a meeting was found.\n if (!meeting) {\n // Create a meeting based on the normalized destination and type.\n return this.createMeeting(targetDest, type)\n .then((createdMeeting) => {\n // If the meeting was successfully created.\n if (createdMeeting && createdMeeting.on) {\n // Create a destruction event for the meeting.\n createdMeeting.on(EVENTS.DESTROY_MEETING, (payload) => {\n if (this.config.autoUploadLogs) {\n this.uploadLogs({\n callStart: createdMeeting.locusInfo?.fullState?.lastActive,\n correlationId: createdMeeting.correlationId,\n feedbackId: createdMeeting.correlationId,\n locusId: createdMeeting.locusId,\n meetingId: createdMeeting.locusInfo?.info?.webExMeetingId\n }).then(() => this.destroy(createdMeeting, payload.reason));\n }\n else {\n this.destroy(createdMeeting, payload.reason);\n }\n });\n\n createdMeeting.on(EVENTS.REQUEST_UPLOAD_LOGS, (meetingInstance) => {\n if (this.config.autoUploadLogs) {\n this.uploadLogs({\n callStart: meetingInstance?.locusInfo?.fullState?.lastActive,\n correlationId: meetingInstance.correlationId,\n feedbackId: meetingInstance.correlationId,\n locusId: meetingInstance.locusId,\n meetingId: meetingInstance.locusInfo?.info?.webExMeetingId\n });\n }\n });\n }\n else {\n LoggerProxy.logger.error(`Meetings:index#create --> ERROR, meeting does not have on method, will not be destroyed, meeting cleanup impossible for meeting: ${meeting}`);\n }\n\n // Return the newly created meeting.\n return Promise.resolve(createdMeeting);\n });\n }\n\n // Return the existing meeting.\n return Promise.resolve(meeting);\n });\n }\n\n /**\n * @param {String} destination see create()\n * @param {String} type see create()\n * @returns {Promise} a new meeting instance complete with meeting info and destination\n * @private\n * @memberof Meetings\n */\n async createMeeting(destination, type = null) {\n const meeting = new Meeting(\n {\n userId: this.webex.internal.device.userId,\n deviceUrl: this.webex.internal.device.url,\n orgId: this.webex.internal.device.orgId,\n roapSeq: 0,\n locus: type === _LOCUS_ID_ ? destination : null, // pass the locus object if present\n meetingInfoProvider: this.meetingInfo\n },\n {\n parent: this.webex\n }\n );\n\n this.meetingCollection.set(meeting);\n\n try {\n await meeting.fetchMeetingInfo({destination, type});\n }\n catch (err) {\n if (!(err instanceof CaptchaError) && !(err instanceof PasswordError)) {\n // if there is no meeting info we assume its a 1:1 call or wireless share\n LoggerProxy.logger.info(`Meetings:index#createMeeting --> Info Unable to fetch meeting info for ${destination}.`);\n LoggerProxy.logger.info('Meetings:index#createMeeting --> Info assuming this destination is a 1:1 or wireless share');\n }\n LoggerProxy.logger.debug(`Meetings:index#createMeeting --> Debug ${err} fetching /meetingInfo for creation.`);\n // We need to save this info for future reference\n meeting.destination = destination;\n }\n finally {\n // For type LOCUS_ID we need to parse the locus object to get the information\n // about the caller and callee\n // Meeting Added event will be created in `handleLocusEvent`\n if (type !== _LOCUS_ID_) {\n if (!meeting.sipUri) {\n meeting.setSipUri(destination);\n }\n\n // TODO: check if we have to move this to parser\n const meetingAddedType = MeetingsUtil.getMeetingAddedType(type);\n\n // We typically shouldn't need to trigger both and event and return a promise.\n // Is this a special case? We want to make the public API usage as simple as possible.\n Trigger.trigger(\n this,\n {\n file: 'meetings',\n function: 'createMeeting'\n },\n EVENT_TRIGGERS.MEETING_ADDED,\n {\n meeting,\n type: meetingAddedType\n }\n );\n }\n }\n\n return meeting;\n\n // Create the meeting calling the necessary service endpoints.\n\n // Internally, there are many more destinations:\n //\n // - locusID\n // - meetingURL\n // - globalMeetingID, e.g, *00*meetingID\n // - meetingID\n // - meetingURL\n // - PSTN\n // - phone number\n //\n // Our job is to determine the appropriate one\n // and its corresponding service so that developers\n // need only sipURL or spaceID to get a meeting\n // and its ID, but have the option to use createWithType()\n // and specify those types to get meetingInfo\n }\n\n /**\n * get a specifc meeting given it's type matched to the value, i.e., locus url\n * @param {String} type\n * @param {Object} value\n * @returns {Meeting}\n * @public\n * @memberof Meetings\n */\n getMeetingByType(type, value) {\n return this.meetingCollection.getByKey(type, value);\n }\n\n /**\n * Get all meetings.\n * @param {object} options\n * @param {object} options.startDate - get meetings after this start date\n * @param {object} options.endDate - get meetings before this end date\n * @returns {Object} All currently active meetings.\n * @public\n * @memberof Meetings\n */\n getAllMeetings(options = {}) {\n // Options may include other parameters to filter this collection\n // of meetings.\n return this.meetingCollection.getAll(options);\n }\n\n /**\n * syncs all the meeting from server\n * @returns {undefined}\n * @public\n * @memberof Meetings\n */\n syncMeetings() {\n return this.request.getActiveMeetings().then((locusArray) => {\n const activeLocusUrl = [];\n\n if (locusArray?.loci && locusArray.loci.length > 0) {\n locusArray.loci.forEach((locus) => {\n activeLocusUrl.push(locus.url);\n this.handleLocusEvent({\n locus,\n locusUrl: locus.url\n });\n });\n }\n const meetingsCollection = this.meetingCollection.getAll();\n\n if (Object.keys(meetingsCollection).length > 0) {\n // Some time the mercury event is missed after mercury reconnect\n // if sync returns no locus then clear all the meetings\n for (const meeting of Object.values(meetingsCollection)) {\n if (!activeLocusUrl.includes(meeting.locusUrl)) {\n // destroy function also uploads logs\n this.destroy(meeting, MEETING_REMOVED_REASON.NO_MEETINGS_TO_SYNC);\n }\n }\n }\n });\n }\n\n /**\n * Get all scheduled meetings.\n * @param {object} options\n * @param {object} options.startDate - get meetings after this start date\n * @param {object} options.endDate - get meetings before this end date\n * @returns {Object} All scheduled meetings.\n * @memberof Meetings\n */\n getScheduledMeetings() {\n return this.meetingCollection.getAll({scheduled: true});\n }\n\n /**\n * Get the logger instance for plugin-meetings\n * @returns {Logger}\n */\n getLogger() {\n return LoggerProxy.get();\n }\n\n /**\n * Get the Stats Analyzer singleton\n * @returns {StatsAnalyzer}\n * @public\n * @memberof Meetings\n */\n getAnalyzer() {\n return StatsAnalyzer;\n }\n\n /**\n * Get the Stats Calculator singleton\n * @returns {StatsCalculator}\n * @public\n * @memberof Meetings\n */\n getCalculator() {\n return StatsCalculator;\n }\n}\n"]}
@@ -116,7 +116,7 @@ MeetingsUtil.hasH264Codec = /*#__PURE__*/(0, _asyncToGenerator2.default)( /*#__P
116
116
  _context.prev = 10;
117
117
  _context.t0 = _context["catch"](1);
118
118
 
119
- _loggerProxy.default.logger.error('Meetings:util#hasH264Codec --> Error creating peerConnection for H.264 test.');
119
+ _loggerProxy.default.logger.warn('Meetings:util#hasH264Codec --> Error creating peerConnection for H.264 test.');
120
120
 
121
121
  case 13:
122
122
  return _context.abrupt("return", hasCodec);
@@ -1 +1 @@
1
- {"version":3,"sources":["util.js"],"names":["MeetingsUtil","getMeetingAddedType","type","_LOCUS_ID_","_INCOMING_","_CREATED_","handleRoapMercury","envelope","meetingCollection","data","eventType","LOCUSEVENT","MESSAGE_ROAP","meeting","getByKey","CORRELATION_ID","correlationId","roap","roapEvent","checkForCorrelationId","deviceUrl","locus","devices","self","foundDevice","find","device","url","hasH264Codec","hasCodec","pc","window","RTCPeerConnection","createOffer","offerToReceiveVideo","offer","sdp","match","close","LoggerProxy","logger","error","checkH264Support","options","firstChecked","disableNotifications","delay","maxDuration","shouldTrigger","undefined","shouldStopChecking","Trigger","trigger","file","function","EVENT_TRIGGERS","MEDIA_CODEC_LOADED","log","MEDIA_CODEC_MISSING","setTimeout","timestamp","call"],"mappings":"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","sourcesContent":["/* globals window */\n\nimport {\n _LOCUS_ID_,\n _INCOMING_,\n _CREATED_,\n LOCUSEVENT,\n CORRELATION_ID,\n EVENT_TRIGGERS\n} from '../constants';\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport Trigger from '../common/events/trigger-proxy';\n\n/**\n * Meetings Media Codec Missing Event\n * Emitted when H.264 codec is not\n * found in the browser.\n * @event media:codec:missing\n * @instance\n * @memberof MeetingsUtil\n */\n\n/**\n * Meetings Media Codec Loaded Event\n * Emitted when H.264 codec has been\n * loaded in the browser.\n * @event media:codec:loaded\n * @instance\n * @memberof MeetingsUtil\n */\n\nconst MeetingsUtil = {};\n\nMeetingsUtil.getMeetingAddedType = (type) => (type === _LOCUS_ID_ ? _INCOMING_ : _CREATED_);\n\nMeetingsUtil.handleRoapMercury = (envelope, meetingCollection) => {\n const {data} = envelope;\n const {eventType} = data;\n\n if (eventType === LOCUSEVENT.MESSAGE_ROAP) {\n const meeting = meetingCollection.getByKey(CORRELATION_ID, data.correlationId);\n\n if (meeting) {\n meeting.roap.roapEvent(data);\n }\n }\n};\n\nMeetingsUtil.checkForCorrelationId = (deviceUrl, locus) => {\n let devices = [];\n\n if (locus) {\n if (locus && locus.self && locus.self.devices) {\n devices = locus.self.devices;\n }\n\n const foundDevice = devices.find((device) => device.url === deviceUrl);\n\n if (foundDevice && foundDevice.correlationId) {\n return foundDevice.correlationId;\n }\n }\n\n return false;\n};\n\n\n/**\n * Will check to see if the H.264 media codec is supported.\n * @async\n * @private\n * @returns {Promise<boolean>}\n */\nMeetingsUtil.hasH264Codec = async () => {\n let hasCodec = false;\n\n try {\n const pc = new window.RTCPeerConnection();\n const offer = await pc.createOffer({offerToReceiveVideo: true});\n\n if (offer.sdp.match(/^a=rtpmap:\\d+\\s+H264\\/\\d+/m)) {\n hasCodec = true;\n }\n pc.close();\n }\n catch (error) {\n LoggerProxy.logger.error('Meetings:util#hasH264Codec --> Error creating peerConnection for H.264 test.');\n }\n\n return hasCodec;\n};\n\n\n/**\n * Notifies the user whether or not the H.264\n * codec is present. Will continuously check\n * until max duration.\n * @async\n * @private\n * @param {object} options\n * @param {Number} options.firstChecked Timestamp in milliseconds\n * @param {boolean} options.disableNotifications Default is false. Boolean to enable/disable notification and events\n * @returns {undefined}\n */\nMeetingsUtil.checkH264Support = async function checkH264Support(options) {\n const {hasH264Codec} = MeetingsUtil;\n const {firstChecked, disableNotifications} = options || {};\n const delay = 5e3; // ms\n const maxDuration = 3e5; // ms\n const shouldTrigger = (firstChecked === undefined);\n const shouldStopChecking = firstChecked && (Date.now() - firstChecked) >= maxDuration;\n\n // Disable notifications and start H.264 download only\n if (disableNotifications) {\n hasH264Codec();\n\n return;\n }\n\n // Codec loaded trigger event notification\n if (await hasH264Codec()) {\n Trigger.trigger(\n this,\n {\n file: 'meetings/util',\n function: 'checkH264Support'\n },\n EVENT_TRIGGERS.MEDIA_CODEC_LOADED\n );\n LoggerProxy.logger.log('Meetings:util#checkH264Support --> H264 codec loaded successfully.');\n\n return;\n }\n\n // Stop checking if past the timelimit\n if (shouldStopChecking) {\n LoggerProxy.logger.error('Meetings:util#checkH264Support --> Timed out waiting for H264 codec to load.');\n\n return;\n }\n\n // Trigger only once\n if (shouldTrigger) {\n Trigger.trigger(\n this,\n {\n file: 'meetings/util',\n function: 'checkH264Support'\n },\n EVENT_TRIGGERS.MEDIA_CODEC_MISSING\n );\n LoggerProxy.logger.log('Meetings:util#checkH264Support --> H264 codec is missing.');\n }\n\n // Keep checking in intervals to see if codec loaded\n window.setTimeout(() => {\n const timestamp = firstChecked || Date.now();\n\n MeetingsUtil.checkH264Support.call(this, {firstChecked: timestamp});\n }, delay);\n};\n\nexport default MeetingsUtil;\n"]}
1
+ {"version":3,"sources":["util.js"],"names":["MeetingsUtil","getMeetingAddedType","type","_LOCUS_ID_","_INCOMING_","_CREATED_","handleRoapMercury","envelope","meetingCollection","data","eventType","LOCUSEVENT","MESSAGE_ROAP","meeting","getByKey","CORRELATION_ID","correlationId","roap","roapEvent","checkForCorrelationId","deviceUrl","locus","devices","self","foundDevice","find","device","url","hasH264Codec","hasCodec","pc","window","RTCPeerConnection","createOffer","offerToReceiveVideo","offer","sdp","match","close","LoggerProxy","logger","warn","checkH264Support","options","firstChecked","disableNotifications","delay","maxDuration","shouldTrigger","undefined","shouldStopChecking","Trigger","trigger","file","function","EVENT_TRIGGERS","MEDIA_CODEC_LOADED","log","error","MEDIA_CODEC_MISSING","setTimeout","timestamp","call"],"mappings":"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","sourcesContent":["/* globals window */\n\nimport {\n _LOCUS_ID_,\n _INCOMING_,\n _CREATED_,\n LOCUSEVENT,\n CORRELATION_ID,\n EVENT_TRIGGERS\n} from '../constants';\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport Trigger from '../common/events/trigger-proxy';\n\n/**\n * Meetings Media Codec Missing Event\n * Emitted when H.264 codec is not\n * found in the browser.\n * @event media:codec:missing\n * @instance\n * @memberof MeetingsUtil\n */\n\n/**\n * Meetings Media Codec Loaded Event\n * Emitted when H.264 codec has been\n * loaded in the browser.\n * @event media:codec:loaded\n * @instance\n * @memberof MeetingsUtil\n */\n\nconst MeetingsUtil = {};\n\nMeetingsUtil.getMeetingAddedType = (type) => (type === _LOCUS_ID_ ? _INCOMING_ : _CREATED_);\n\nMeetingsUtil.handleRoapMercury = (envelope, meetingCollection) => {\n const {data} = envelope;\n const {eventType} = data;\n\n if (eventType === LOCUSEVENT.MESSAGE_ROAP) {\n const meeting = meetingCollection.getByKey(CORRELATION_ID, data.correlationId);\n\n if (meeting) {\n meeting.roap.roapEvent(data);\n }\n }\n};\n\nMeetingsUtil.checkForCorrelationId = (deviceUrl, locus) => {\n let devices = [];\n\n if (locus) {\n if (locus && locus.self && locus.self.devices) {\n devices = locus.self.devices;\n }\n\n const foundDevice = devices.find((device) => device.url === deviceUrl);\n\n if (foundDevice && foundDevice.correlationId) {\n return foundDevice.correlationId;\n }\n }\n\n return false;\n};\n\n\n/**\n * Will check to see if the H.264 media codec is supported.\n * @async\n * @private\n * @returns {Promise<boolean>}\n */\nMeetingsUtil.hasH264Codec = async () => {\n let hasCodec = false;\n\n try {\n const pc = new window.RTCPeerConnection();\n const offer = await pc.createOffer({offerToReceiveVideo: true});\n\n if (offer.sdp.match(/^a=rtpmap:\\d+\\s+H264\\/\\d+/m)) {\n hasCodec = true;\n }\n pc.close();\n }\n catch (error) {\n LoggerProxy.logger.warn('Meetings:util#hasH264Codec --> Error creating peerConnection for H.264 test.');\n }\n\n return hasCodec;\n};\n\n\n/**\n * Notifies the user whether or not the H.264\n * codec is present. Will continuously check\n * until max duration.\n * @async\n * @private\n * @param {object} options\n * @param {Number} options.firstChecked Timestamp in milliseconds\n * @param {boolean} options.disableNotifications Default is false. Boolean to enable/disable notification and events\n * @returns {undefined}\n */\nMeetingsUtil.checkH264Support = async function checkH264Support(options) {\n const {hasH264Codec} = MeetingsUtil;\n const {firstChecked, disableNotifications} = options || {};\n const delay = 5e3; // ms\n const maxDuration = 3e5; // ms\n const shouldTrigger = (firstChecked === undefined);\n const shouldStopChecking = firstChecked && (Date.now() - firstChecked) >= maxDuration;\n\n // Disable notifications and start H.264 download only\n if (disableNotifications) {\n hasH264Codec();\n\n return;\n }\n\n // Codec loaded trigger event notification\n if (await hasH264Codec()) {\n Trigger.trigger(\n this,\n {\n file: 'meetings/util',\n function: 'checkH264Support'\n },\n EVENT_TRIGGERS.MEDIA_CODEC_LOADED\n );\n LoggerProxy.logger.log('Meetings:util#checkH264Support --> H264 codec loaded successfully.');\n\n return;\n }\n\n // Stop checking if past the timelimit\n if (shouldStopChecking) {\n LoggerProxy.logger.error('Meetings:util#checkH264Support --> Timed out waiting for H264 codec to load.');\n\n return;\n }\n\n // Trigger only once\n if (shouldTrigger) {\n Trigger.trigger(\n this,\n {\n file: 'meetings/util',\n function: 'checkH264Support'\n },\n EVENT_TRIGGERS.MEDIA_CODEC_MISSING\n );\n LoggerProxy.logger.log('Meetings:util#checkH264Support --> H264 codec is missing.');\n }\n\n // Keep checking in intervals to see if codec loaded\n window.setTimeout(() => {\n const timestamp = firstChecked || Date.now();\n\n MeetingsUtil.checkH264Support.call(this, {firstChecked: timestamp});\n }, delay);\n};\n\nexport default MeetingsUtil;\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@webex/plugin-meetings",
3
- "version": "1.156.1",
3
+ "version": "1.156.4",
4
4
  "description": "",
5
5
  "license": "MIT",
6
6
  "contributors": [
@@ -24,18 +24,18 @@
24
24
  },
25
25
  "dependencies": {
26
26
  "@babel/runtime-corejs2": "^7.14.8",
27
- "@webex/webex-core": "1.156.1",
28
- "@webex/internal-plugin-mercury": "1.156.1",
27
+ "@webex/webex-core": "1.156.4",
28
+ "@webex/internal-plugin-mercury": "1.156.4",
29
29
  "webrtc-adapter": "^7.7.0",
30
30
  "lodash": "^4.17.21",
31
31
  "uuid": "^3.3.2",
32
32
  "global": "^4.4.0",
33
33
  "ip-anonymize": "^0.1.0",
34
- "@webex/common": "1.156.1",
34
+ "@webex/common": "1.156.4",
35
35
  "bowser": "^2.11.0",
36
36
  "sdp-transform": "^2.12.0",
37
37
  "readable-stream": "^3.6.0",
38
- "@webex/common-timers": "1.156.1",
38
+ "@webex/common-timers": "1.156.4",
39
39
  "btoa": "^1.2.1",
40
40
  "javascript-state-machine": "^3.1.0",
41
41
  "envify": "^4.1.0"
@@ -159,21 +159,13 @@ export default class LocusInfo extends EventsScope {
159
159
 
160
160
  /**
161
161
  * @param {Object} locus
162
- * @param {Meeting} meeting
163
162
  * @returns {undefined}
164
163
  * @memberof LocusInfo
165
164
  */
166
- initialSetup(locus, meeting) {
167
- // meeting already exisits just do an update
168
- if (meeting) {
169
- // Its a new delta event fetch the whole meeting object
170
- this.locusParser.onDeltaEvent(locus);
171
- }
172
- else {
173
- this.onFullLocus(locus);
174
- }
165
+ initialSetup(locus) {
166
+ this.onFullLocus(locus);
175
167
 
176
- // Change it to true after it recives it first locus object
168
+ // Change it to true after it receives it first locus object
177
169
  this.emitChange = true;
178
170
  }
179
171
 
@@ -253,14 +253,8 @@ export default class Meetings extends WebexPlugin {
253
253
  this.create(data.locus, _LOCUS_ID_).then((newMeeting) => {
254
254
  meeting = newMeeting;
255
255
 
256
- if (data.eventType === LOCUSEVENT.DIFFERENCE) {
257
- // its a delta object and we have a new meeting
258
- meeting.locusInfo.initialSetup(data.locus, meeting);
259
- }
260
- else {
261
- // Its a new meeting and have a fresh locus object
262
- meeting.locusInfo.initialSetup(data.locus);
263
- }
256
+ // It's a new meeting so initialize the locus data
257
+ meeting.locusInfo.initialSetup(data.locus);
264
258
  }).catch((e) => {
265
259
  console.log(e);
266
260
  })
@@ -84,7 +84,7 @@ MeetingsUtil.hasH264Codec = async () => {
84
84
  pc.close();
85
85
  }
86
86
  catch (error) {
87
- LoggerProxy.logger.error('Meetings:util#hasH264Codec --> Error creating peerConnection for H.264 test.');
87
+ LoggerProxy.logger.warn('Meetings:util#hasH264Codec --> Error creating peerConnection for H.264 test.');
88
88
  }
89
89
 
90
90
  return hasCodec;
@@ -448,6 +448,13 @@ skipInBrowser(describe)('plugin-meetings', () => {
448
448
  assert.calledOnce(initialSetup);
449
449
  assert.calledWith(initialSetup, {id: uuid1, replaces: [{locusUrl: 'http:locusUrl'}], self: {callBackInfo: {callbackAddress: uri1}}});
450
450
  });
451
+ it('should setup the meeting by difference event without replaces', async () => {
452
+ await webex.meetings.handleLocusEvent({locus: {id: uuid1, self: {callBackInfo: {callbackAddress: uri1}}}, eventType: 'locus.difference', locusUrl: url1});
453
+ assert.callCount(webex.meetings.meetingCollection.getByKey, 4);
454
+ assert.calledWith(webex.meetings.meetingCollection.getByKey, 'locusUrl', url1);
455
+ assert.calledOnce(initialSetup);
456
+ assert.calledWith(initialSetup, {id: uuid1, self: {callBackInfo: {callbackAddress: uri1}}});
457
+ });
451
458
  it('should setup the meeting by a not difference event', async () => {
452
459
  await webex.meetings.handleLocusEvent({locus: {id: uuid1, self: {callBackInfo: {callbackAddress: uri1}}}, eventType: test1, locusUrl: url1});
453
460
  assert.callCount(webex.meetings.meetingCollection.getByKey, 4);