@webex/plugin-meetings 1.152.1 → 1.153.3

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.
@@ -39,18 +39,18 @@ var MeetingStateMachine = {
39
39
  transitions: [// when ringing a meeting, it must be first IDLE, because all other states are invalid, it transitions to the RINGING state
40
40
  {
41
41
  name: _constants.MEETING_STATE_MACHINE.TRANSITIONS.RING,
42
- from: [_constants.MEETING_STATE_MACHINE.STATES.IDLE, _constants.MEETING_STATE_MACHINE.STATES.SAFE, _constants.MEETING_STATE_MACHINE.STATES.JOINED],
42
+ from: [_constants.MEETING_STATE_MACHINE.STATES.IDLE, _constants.MEETING_STATE_MACHINE.STATES.ERROR, _constants.MEETING_STATE_MACHINE.STATES.JOINED],
43
43
  to: _constants.MEETING_STATE_MACHINE.STATES.RINGING
44
44
  }, // when joining a meeting, it must be from the RINGING or IDLE state, transitions to JOINED state, 1:1 will go to RINGING,
45
45
  // others will go straight to JOINED with this transition
46
46
  {
47
47
  name: _constants.MEETING_STATE_MACHINE.TRANSITIONS.JOIN,
48
- from: [_constants.MEETING_STATE_MACHINE.STATES.JOINED, _constants.MEETING_STATE_MACHINE.STATES.IDLE, _constants.MEETING_STATE_MACHINE.STATES.RINGING, _constants.MEETING_STATE_MACHINE.STATES.SAFE],
48
+ from: [_constants.MEETING_STATE_MACHINE.STATES.JOINED, _constants.MEETING_STATE_MACHINE.STATES.IDLE, _constants.MEETING_STATE_MACHINE.STATES.RINGING, _constants.MEETING_STATE_MACHINE.STATES.ERROR],
49
49
  to: _constants.MEETING_STATE_MACHINE.STATES.JOINED
50
50
  }, // signify that ringing has stopped and somebody else answered, move state to DECLINED, ANSWERED
51
51
  {
52
52
  name: _constants.MEETING_STATE_MACHINE.TRANSITIONS.REMOTE,
53
- from: [_constants.MEETING_STATE_MACHINE.STATES.JOINED, _constants.MEETING_STATE_MACHINE.STATES.SAFE],
53
+ from: [_constants.MEETING_STATE_MACHINE.STATES.JOINED, _constants.MEETING_STATE_MACHINE.STATES.ERROR],
54
54
 
55
55
  /**
56
56
  * @param {Object} remote
@@ -75,22 +75,18 @@ var MeetingStateMachine = {
75
75
  }, // when leaving a meeting it must be from either the RINGING, JOINED, or ERROR states, and transitions it to the ENDED state
76
76
  {
77
77
  name: _constants.MEETING_STATE_MACHINE.TRANSITIONS.LEAVE,
78
- from: [_constants.MEETING_STATE_MACHINE.STATES.IDLE, _constants.MEETING_STATE_MACHINE.STATES.RINGING, _constants.MEETING_STATE_MACHINE.STATES.JOINED, _constants.MEETING_STATE_MACHINE.STATES.ANSWERED, _constants.MEETING_STATE_MACHINE.STATES.DECLINED, _constants.MEETING_STATE_MACHINE.STATES.ERROR, _constants.MEETING_STATE_MACHINE.STATES.SAFE],
78
+ from: [_constants.MEETING_STATE_MACHINE.STATES.IDLE, _constants.MEETING_STATE_MACHINE.STATES.RINGING, _constants.MEETING_STATE_MACHINE.STATES.JOINED, _constants.MEETING_STATE_MACHINE.STATES.ANSWERED, _constants.MEETING_STATE_MACHINE.STATES.DECLINED, _constants.MEETING_STATE_MACHINE.STATES.ERROR],
79
79
  to: _constants.MEETING_STATE_MACHINE.STATES.ENDED
80
80
  }, // when declining an incoming meeting it must be from the ringing state, and it moves to DECLINED state
81
81
  {
82
82
  name: _constants.MEETING_STATE_MACHINE.TRANSITIONS.DECLINE,
83
- from: [_constants.MEETING_STATE_MACHINE.STATES.RINGING, _constants.MEETING_STATE_MACHINE.STATES.SAFE],
83
+ from: [_constants.MEETING_STATE_MACHINE.STATES.RINGING, _constants.MEETING_STATE_MACHINE.STATES.ERROR],
84
84
  to: _constants.MEETING_STATE_MACHINE.STATES.ENDED
85
85
  }, // transition from ANY state to ERROR state
86
86
  {
87
87
  name: _constants.MEETING_STATE_MACHINE.TRANSITIONS.FAIL,
88
88
  from: '*',
89
89
  to: _constants.MEETING_STATE_MACHINE.STATES.ERROR
90
- }, {
91
- name: _constants.MEETING_STATE_MACHINE.TRANSITIONS.SAFE,
92
- from: _constants.MEETING_STATE_MACHINE.STATES.ERROR,
93
- to: _constants.MEETING_STATE_MACHINE.STATES.SAFE
94
90
  }, // fail safe, transition from ANY state to IDLE state
95
91
  {
96
92
  name: _constants.MEETING_STATE_MACHINE.TRANSITIONS.RESET,
@@ -141,16 +137,13 @@ var MeetingStateMachine = {
141
137
  },
142
138
 
143
139
  /**
144
- * handle the error transition stage
140
+ * handle the entry to error state
145
141
  * @param {Object} transition
146
142
  * @param {Error} error
147
143
  * @returns {Boolean}
148
144
  */
149
- onBeforeError: function onBeforeError(transition, error) {
150
- _loggerProxy.default.logger.error("Meeting:state#onBeforeError --> state->onError#meeting.id: ".concat(this.meeting.id, " | Transition '").concat(transition.transition, "' : ").concat(transition.from, " -> ").concat(transition.to, " failed after last state transition, with error ").concat(error, ". Moving to a non-informative state. Last states: ").concat(this.history));
151
- },
152
- onAfterError: function onAfterError() {
153
- this.safe();
145
+ onEnterError: function onEnterError(transition, error) {
146
+ _loggerProxy.default.logger.error("Meeting:state#onEnterError --> state->onEnterError#meeting.id: ".concat(this.meeting.id, " | Transition '").concat(transition === null || transition === void 0 ? void 0 : transition.transition, "' : ").concat(transition === null || transition === void 0 ? void 0 : transition.from, " -> ").concat(transition === null || transition === void 0 ? void 0 : transition.to, ", with error ").concat(error, ". Last states: ").concat(this.history));
154
147
  },
155
148
 
156
149
  /**
@@ -1 +1 @@
1
- {"version":3,"sources":["state.js"],"names":["MeetingStateMachine","create","meetingRef","ParameterError","StateMachine","init","MEETING_STATE_MACHINE","STATES","IDLE","transitions","name","TRANSITIONS","RING","from","SAFE","JOINED","to","RINGING","JOIN","REMOTE","remote","remoteAnswered","ANSWERED","remoteDeclined","DECLINED","ERROR","LEAVE","ENDED","DECLINE","FAIL","RESET","data","meeting","methods","onRemote","transition","stop","Trigger","trigger","file","function","EVENT_TRIGGERS","MEETING_RINGING_STOP","id","type","onRing","MEETING_RINGING","onBeforeError","error","LoggerProxy","logger","history","onAfterError","safe","onAfterTransition","log","plugins","StateMachineHistory","max"],"mappings":"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","sourcesContent":["import StateMachine from 'javascript-state-machine';\nimport StateMachineHistory from 'javascript-state-machine/lib/history';\n\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport Trigger from '../common/events/trigger-proxy';\nimport {MEETING_STATE_MACHINE, EVENT_TRIGGERS} from '../constants';\nimport ParameterError from '../common/errors/parameter';\n\n// TODO: ensure that meeting can be destroyed when in an error state\nconst MeetingStateMachine = {\n /**\n * Initializes the StateMachine for the meeting\n * @param {Meeting} meetingRef A reference to a meeting instance\n * @returns {StateMachine}\n */\n create(meetingRef) {\n if (!meetingRef) {\n throw new ParameterError('You must initialize the meeting state machine with a meeting reference.');\n }\n\n return new StateMachine({\n init: MEETING_STATE_MACHINE.STATES.IDLE,\n transitions: [\n // when ringing a meeting, it must be first IDLE, because all other states are invalid, it transitions to the RINGING state\n {\n name: MEETING_STATE_MACHINE.TRANSITIONS.RING,\n from: [MEETING_STATE_MACHINE.STATES.IDLE, MEETING_STATE_MACHINE.STATES.SAFE, MEETING_STATE_MACHINE.STATES.JOINED],\n to: MEETING_STATE_MACHINE.STATES.RINGING\n },\n // when joining a meeting, it must be from the RINGING or IDLE state, transitions to JOINED state, 1:1 will go to RINGING,\n // others will go straight to JOINED with this transition\n {\n name: MEETING_STATE_MACHINE.TRANSITIONS.JOIN,\n from: [MEETING_STATE_MACHINE.STATES.JOINED, MEETING_STATE_MACHINE.STATES.IDLE, MEETING_STATE_MACHINE.STATES.RINGING, MEETING_STATE_MACHINE.STATES.SAFE],\n to: MEETING_STATE_MACHINE.STATES.JOINED\n },\n // signify that ringing has stopped and somebody else answered, move state to DECLINED, ANSWERED\n {\n name: MEETING_STATE_MACHINE.TRANSITIONS.REMOTE,\n from: [MEETING_STATE_MACHINE.STATES.JOINED, MEETING_STATE_MACHINE.STATES.SAFE],\n /**\n * @param {Object} remote\n * @param {Boolean} remote.remoteAnswered\n * @param {Boolean} remote.remoteDeclined\n * @returns {String}\n */\n to(remote) {\n // other user answered the call\n if (remote.remoteAnswered) {\n return MEETING_STATE_MACHINE.STATES.ANSWERED;\n }\n // other user declined the call\n if (remote.remoteDeclined) {\n return MEETING_STATE_MACHINE.STATES.DECLINED;\n }\n\n // default\n return MEETING_STATE_MACHINE.STATES.ERROR;\n }\n },\n // when leaving a meeting it must be from either the RINGING, JOINED, or ERROR states, and transitions it to the ENDED state\n {\n name: MEETING_STATE_MACHINE.TRANSITIONS.LEAVE,\n from: [\n MEETING_STATE_MACHINE.STATES.IDLE,\n MEETING_STATE_MACHINE.STATES.RINGING,\n MEETING_STATE_MACHINE.STATES.JOINED,\n MEETING_STATE_MACHINE.STATES.ANSWERED,\n MEETING_STATE_MACHINE.STATES.DECLINED,\n MEETING_STATE_MACHINE.STATES.ERROR,\n MEETING_STATE_MACHINE.STATES.SAFE\n ],\n to: MEETING_STATE_MACHINE.STATES.ENDED\n },\n // when declining an incoming meeting it must be from the ringing state, and it moves to DECLINED state\n {\n name: MEETING_STATE_MACHINE.TRANSITIONS.DECLINE,\n from: [MEETING_STATE_MACHINE.STATES.RINGING, MEETING_STATE_MACHINE.STATES.SAFE],\n to: MEETING_STATE_MACHINE.STATES.ENDED\n },\n // transition from ANY state to ERROR state\n {\n name: MEETING_STATE_MACHINE.TRANSITIONS.FAIL,\n from: '*',\n to: MEETING_STATE_MACHINE.STATES.ERROR\n },\n {\n name: MEETING_STATE_MACHINE.TRANSITIONS.SAFE,\n from: MEETING_STATE_MACHINE.STATES.ERROR,\n to: MEETING_STATE_MACHINE.STATES.SAFE\n },\n // fail safe, transition from ANY state to IDLE state\n {\n name: MEETING_STATE_MACHINE.TRANSITIONS.RESET,\n from: '*',\n to: MEETING_STATE_MACHINE.STATES.IDLE\n }\n ],\n data: {\n /**\n * The meeting instance to execute all state changes on\n */\n meeting: meetingRef\n },\n methods: {\n /**\n * Ring stop transition, to end the ring event for the meeting, and transition the state to ANSWERED OR DECLINED, only for outgoing meetings\n * @param {Object} transition -- FiniteStateMachine automatically passed, not used\n * @param {Object} stop -- {remoteAnswered: {Boolean}, remoteDeclined: {Boolean}}\n * @returns {Boolean}\n */\n onRemote(transition, stop) {\n if (this.meeting) {\n Trigger.trigger(\n this.meeting,\n {\n file: 'meeting/state',\n function: 'onRemote'\n },\n EVENT_TRIGGERS.MEETING_RINGING_STOP,\n {\n id: this.meeting.id,\n type: stop\n }\n );\n }\n },\n /**\n * Ring transition, to cause the ring event for the meeting, and transition the state to RINGING, for both incoming, and outgoing meetings\n * @param {Object} transition -- FiniteStateMachine automatically passed, not used\n * @param {String} type -- incoming call === INCOMING / or other meetings have a ring type of JOIN\n * @returns {Boolean}\n */\n onRing(transition, type) {\n if (this.meeting) {\n Trigger.trigger(\n this.meeting,\n {\n file: 'meeting/state',\n function: 'onRing'\n },\n EVENT_TRIGGERS.MEETING_RINGING,\n {\n type,\n id: this.meeting.id\n }\n );\n }\n },\n /**\n * handle the error transition stage\n * @param {Object} transition\n * @param {Error} error\n * @returns {Boolean}\n */\n onBeforeError(transition, error) {\n LoggerProxy.logger.error(`Meeting:state#onBeforeError --> state->onError#meeting.id: ${this.meeting.id} | Transition '${transition.transition}' : ${transition.from} -> ${transition.to} failed after last state transition, with error ${error}. Moving to a non-informative state. Last states: ${this.history}`);\n },\n onAfterError() {\n this.safe();\n },\n /**\n * After ANY transition occurs, we want to know what state the meeting moved to for debugging\n * @param {Object} transition\n * @returns {Boolean}\n */\n onAfterTransition(transition) {\n LoggerProxy.logger.log(`Meeting:state#onAfterTransition --> state->onAfterTransition#meeting.id: ${this.meeting.id} | Transition '${transition.transition}' : ${transition.from} -> ${transition.to} executed. Last states: ${this.history}`);\n }\n },\n // track the last 25 states entered\n plugins: [new StateMachineHistory({max: 25})]\n });\n }\n};\n\nexport default MeetingStateMachine;\n"]}
1
+ {"version":3,"sources":["state.js"],"names":["MeetingStateMachine","create","meetingRef","ParameterError","StateMachine","init","MEETING_STATE_MACHINE","STATES","IDLE","transitions","name","TRANSITIONS","RING","from","ERROR","JOINED","to","RINGING","JOIN","REMOTE","remote","remoteAnswered","ANSWERED","remoteDeclined","DECLINED","LEAVE","ENDED","DECLINE","FAIL","RESET","data","meeting","methods","onRemote","transition","stop","Trigger","trigger","file","function","EVENT_TRIGGERS","MEETING_RINGING_STOP","id","type","onRing","MEETING_RINGING","onEnterError","error","LoggerProxy","logger","history","onAfterTransition","log","plugins","StateMachineHistory","max"],"mappings":"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","sourcesContent":["import StateMachine from 'javascript-state-machine';\nimport StateMachineHistory from 'javascript-state-machine/lib/history';\n\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport Trigger from '../common/events/trigger-proxy';\nimport {MEETING_STATE_MACHINE, EVENT_TRIGGERS} from '../constants';\nimport ParameterError from '../common/errors/parameter';\n\n// TODO: ensure that meeting can be destroyed when in an error state\nconst MeetingStateMachine = {\n /**\n * Initializes the StateMachine for the meeting\n * @param {Meeting} meetingRef A reference to a meeting instance\n * @returns {StateMachine}\n */\n create(meetingRef) {\n if (!meetingRef) {\n throw new ParameterError('You must initialize the meeting state machine with a meeting reference.');\n }\n\n return new StateMachine({\n init: MEETING_STATE_MACHINE.STATES.IDLE,\n transitions: [\n // when ringing a meeting, it must be first IDLE, because all other states are invalid, it transitions to the RINGING state\n {\n name: MEETING_STATE_MACHINE.TRANSITIONS.RING,\n from: [MEETING_STATE_MACHINE.STATES.IDLE, MEETING_STATE_MACHINE.STATES.ERROR, MEETING_STATE_MACHINE.STATES.JOINED],\n to: MEETING_STATE_MACHINE.STATES.RINGING\n },\n // when joining a meeting, it must be from the RINGING or IDLE state, transitions to JOINED state, 1:1 will go to RINGING,\n // others will go straight to JOINED with this transition\n {\n name: MEETING_STATE_MACHINE.TRANSITIONS.JOIN,\n from: [MEETING_STATE_MACHINE.STATES.JOINED, MEETING_STATE_MACHINE.STATES.IDLE, MEETING_STATE_MACHINE.STATES.RINGING, MEETING_STATE_MACHINE.STATES.ERROR],\n to: MEETING_STATE_MACHINE.STATES.JOINED\n },\n // signify that ringing has stopped and somebody else answered, move state to DECLINED, ANSWERED\n {\n name: MEETING_STATE_MACHINE.TRANSITIONS.REMOTE,\n from: [MEETING_STATE_MACHINE.STATES.JOINED, MEETING_STATE_MACHINE.STATES.ERROR],\n /**\n * @param {Object} remote\n * @param {Boolean} remote.remoteAnswered\n * @param {Boolean} remote.remoteDeclined\n * @returns {String}\n */\n to(remote) {\n // other user answered the call\n if (remote.remoteAnswered) {\n return MEETING_STATE_MACHINE.STATES.ANSWERED;\n }\n // other user declined the call\n if (remote.remoteDeclined) {\n return MEETING_STATE_MACHINE.STATES.DECLINED;\n }\n\n // default\n return MEETING_STATE_MACHINE.STATES.ERROR;\n }\n },\n // when leaving a meeting it must be from either the RINGING, JOINED, or ERROR states, and transitions it to the ENDED state\n {\n name: MEETING_STATE_MACHINE.TRANSITIONS.LEAVE,\n from: [\n MEETING_STATE_MACHINE.STATES.IDLE,\n MEETING_STATE_MACHINE.STATES.RINGING,\n MEETING_STATE_MACHINE.STATES.JOINED,\n MEETING_STATE_MACHINE.STATES.ANSWERED,\n MEETING_STATE_MACHINE.STATES.DECLINED,\n MEETING_STATE_MACHINE.STATES.ERROR\n ],\n to: MEETING_STATE_MACHINE.STATES.ENDED\n },\n // when declining an incoming meeting it must be from the ringing state, and it moves to DECLINED state\n {\n name: MEETING_STATE_MACHINE.TRANSITIONS.DECLINE,\n from: [MEETING_STATE_MACHINE.STATES.RINGING, MEETING_STATE_MACHINE.STATES.ERROR],\n to: MEETING_STATE_MACHINE.STATES.ENDED\n },\n // transition from ANY state to ERROR state\n {\n name: MEETING_STATE_MACHINE.TRANSITIONS.FAIL,\n from: '*',\n to: MEETING_STATE_MACHINE.STATES.ERROR\n },\n // fail safe, transition from ANY state to IDLE state\n {\n name: MEETING_STATE_MACHINE.TRANSITIONS.RESET,\n from: '*',\n to: MEETING_STATE_MACHINE.STATES.IDLE\n }\n ],\n data: {\n /**\n * The meeting instance to execute all state changes on\n */\n meeting: meetingRef\n },\n methods: {\n /**\n * Ring stop transition, to end the ring event for the meeting, and transition the state to ANSWERED OR DECLINED, only for outgoing meetings\n * @param {Object} transition -- FiniteStateMachine automatically passed, not used\n * @param {Object} stop -- {remoteAnswered: {Boolean}, remoteDeclined: {Boolean}}\n * @returns {Boolean}\n */\n onRemote(transition, stop) {\n if (this.meeting) {\n Trigger.trigger(\n this.meeting,\n {\n file: 'meeting/state',\n function: 'onRemote'\n },\n EVENT_TRIGGERS.MEETING_RINGING_STOP,\n {\n id: this.meeting.id,\n type: stop\n }\n );\n }\n },\n /**\n * Ring transition, to cause the ring event for the meeting, and transition the state to RINGING, for both incoming, and outgoing meetings\n * @param {Object} transition -- FiniteStateMachine automatically passed, not used\n * @param {String} type -- incoming call === INCOMING / or other meetings have a ring type of JOIN\n * @returns {Boolean}\n */\n onRing(transition, type) {\n if (this.meeting) {\n Trigger.trigger(\n this.meeting,\n {\n file: 'meeting/state',\n function: 'onRing'\n },\n EVENT_TRIGGERS.MEETING_RINGING,\n {\n type,\n id: this.meeting.id\n }\n );\n }\n },\n /**\n * handle the entry to error state\n * @param {Object} transition\n * @param {Error} error\n * @returns {Boolean}\n */\n onEnterError(transition, error) {\n LoggerProxy.logger.error(`Meeting:state#onEnterError --> state->onEnterError#meeting.id: ${this.meeting.id} | Transition '${transition?.transition}' : ${transition?.from} -> ${transition?.to}, with error ${error}. Last states: ${this.history}`);\n },\n /**\n * After ANY transition occurs, we want to know what state the meeting moved to for debugging\n * @param {Object} transition\n * @returns {Boolean}\n */\n onAfterTransition(transition) {\n LoggerProxy.logger.log(`Meeting:state#onAfterTransition --> state->onAfterTransition#meeting.id: ${this.meeting.id} | Transition '${transition.transition}' : ${transition.from} -> ${transition.to} executed. Last states: ${this.history}`);\n }\n },\n // track the last 25 states entered\n plugins: [new StateMachineHistory({max: 25})]\n });\n }\n};\n\nexport default MeetingStateMachine;\n"]}
@@ -455,6 +455,28 @@ var Meetings = /*#__PURE__*/function (_WebexPlugin) {
455
455
  }, _constants.EVENT_TRIGGERS.MEETINGS_READY);
456
456
  });
457
457
  }
458
+ /**
459
+ * API to toggle unified meetings
460
+ * @param {Boolean} changeState
461
+ * @private
462
+ * @memberof Meetings
463
+ * @returns {undefined}
464
+ */
465
+
466
+ }, {
467
+ key: "_toggleUnifiedMeetings",
468
+ value: function _toggleUnifiedMeetings(changeState) {
469
+ var _this$config, _this$config$experime;
470
+
471
+ if (typeof changeState !== 'boolean') {
472
+ return;
473
+ }
474
+
475
+ if (((_this$config = this.config) === null || _this$config === void 0 ? void 0 : (_this$config$experime = _this$config.experimental) === null || _this$config$experime === void 0 ? void 0 : _this$config$experime.enableUnifiedMeetings) !== changeState) {
476
+ this.config.experimental.enableUnifiedMeetings = changeState;
477
+ this.meetingInfo = changeState ? new _meetingInfoV.default(this.webex) : new _meetingInfo.default(this.webex);
478
+ }
479
+ }
458
480
  /**
459
481
  * Explicitly sets up the meetings plugin by registering
460
482
  * the device, connecting to mercury, and listening for locus events.
@@ -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","canAuthorize","error","reject","Error","info","resolve","all","getGeoHint","startReachability","message","register","connect","call","listenForEvents","MEETINGS_REGISTERED","stopListeningForEvents","disconnect","unregister","MEETINGS_UNREGISTERED","options","uploadLogs","uploadResult","MEETING_LOG_UPLOAD_SUCCESS","meetingId","details","uploadError","MEETING_LOG_UPLOAD_FAILURE","reason","sendOperationalMetric","METRICS_OPERATIONAL_MEASURES","UPLOAD_LOGS_FAILURE","meetingsId","stack","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;;AAwBA;;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,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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 METRICS_OPERATIONAL_MEASURES\n} from '../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 * 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 })\n .catch((error) => {\n LoggerProxy.logger.error(`Meetings:index#register --> ERROR, Unable to register, ${error.message}`);\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.sendOperationalMetric(\n METRICS_OPERATIONAL_MEASURES.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","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","stopListeningForEvents","disconnect","unregister","MEETINGS_UNREGISTERED","options","uploadLogs","uploadResult","MEETING_LOG_UPLOAD_SUCCESS","meetingId","details","uploadError","MEETING_LOG_UPLOAD_FAILURE","reason","sendOperationalMetric","METRICS_OPERATIONAL_MEASURES","UPLOAD_LOGS_FAILURE","meetingsId","stack","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;;AAwBA;;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,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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 METRICS_OPERATIONAL_MEASURES\n} from '../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 })\n .catch((error) => {\n LoggerProxy.logger.error(`Meetings:index#register --> ERROR, Unable to register, ${error.message}`);\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.sendOperationalMetric(\n METRICS_OPERATIONAL_MEASURES.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"]}
@@ -20,6 +20,10 @@ exports.default = void 0;
20
20
 
21
21
  var _promise = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/promise"));
22
22
 
23
+ var _now = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/date/now"));
24
+
25
+ var _parseInt2 = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/parse-int"));
26
+
23
27
  var _window = _interopRequireDefault(require("global/window"));
24
28
 
25
29
  var _sdpTransform = _interopRequireDefault(require("sdp-transform"));
@@ -42,6 +46,8 @@ var _webexErrors = require("../common/errors/webex-errors");
42
46
 
43
47
  var _browserDetection = _interopRequireDefault(require("../common/browser-detection"));
44
48
 
49
+ var _util = _interopRequireDefault(require("./util"));
50
+
45
51
  function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof _Symbol !== "undefined" && o[_Symbol$iterator] || o["@@iterator"]; if (!it) { if (_Array$isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
46
52
 
47
53
  function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return _Array$from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
@@ -145,23 +151,14 @@ var isSdpInvalid = function isSdpInvalid(sdp) {
145
151
 
146
152
  try {
147
153
  for (_iterator.s(); !(_step = _iterator.n()).done;) {
154
+ var _mediaLine$candidates;
155
+
148
156
  var mediaLine = _step.value;
149
157
 
150
- if (mediaLine.candidates && mediaLine.candidates.length === 0) {
158
+ if (!mediaLine.candidates || ((_mediaLine$candidates = mediaLine.candidates) === null || _mediaLine$candidates === void 0 ? void 0 : _mediaLine$candidates.length) === 0) {
151
159
  _loggerProxy.default.logger.error('PeerConnectionManager:index#isSdpInvalid --> iceCandidate: Ice candadate never completed');
152
160
 
153
- return 'iceCandidate: Ice candadate never completed';
154
- } // Sometimes the candidates might be there but only IPV6 we need to makes sure we have IPV4
155
-
156
-
157
- var hostCandidate = mediaLine.candidates.filter(function (candidate) {
158
- return !!(candidate.type === _constants.HOST && candidate.ip.match(_constants.IPV4_REGEX));
159
- });
160
-
161
- if (hostCandidate.length === 0) {
162
- _loggerProxy.default.logger.error('PeerConnectionManager:index#isSdpInvalid --> iceCandidate: no IPV4 candidate present');
163
-
164
- return 'iceCandidate: no IPV4 candidate present';
161
+ return 'iceCandidate: Ice gathering never completed';
165
162
  }
166
163
 
167
164
  if (_constants.SDP.BAD_MEDIA_PORTS.includes(mediaLine.port)) {
@@ -231,43 +228,56 @@ pc.setContentSlides = function (screenPc) {
231
228
  pc.iceCandidate = function (peerConnection, _ref) {
232
229
  var remoteQualityLevel = _ref.remoteQualityLevel;
233
230
  return new _promise.default(function (resolve, reject) {
234
- // TODO: we dont need timeout as we can check the api state and validate.
235
- var timeout = setTimeout(function () {
231
+ var now = (0, _now.default)();
232
+
233
+ var doneGatheringIceCandidate = function doneGatheringIceCandidate() {
234
+ var miliseconds = (0, _parseInt2.default)(Math.abs((0, _now.default)() - now), 4);
236
235
  peerConnection.sdp = limitBandwidth(peerConnection.localDescription.sdp);
237
236
  peerConnection.sdp = setMaxFs(peerConnection.sdp, remoteQualityLevel);
237
+ peerConnection.sdp = _util.default.convertCLineToIpv4(peerConnection.sdp);
238
+ var invalidSdpPresent = isSdpInvalid(peerConnection.sdp);
238
239
 
239
- if (isSdpInvalid(peerConnection.sdp)) {
240
- setTimeout(function () {
241
- // peerconnection does gather ice candidate IP but in some cases due to firewall
242
- // or proxy the ice candidate does not get gathered so we need to wait and then retry
243
- // if still not valid then throw an error saying missing ice candidate
244
- // if ice candidate still not present after retry
245
- var invalidSdpPresent = isSdpInvalid(peerConnection.sdp);
246
-
247
- if (!invalidSdpPresent) {
248
- resolve(peerConnection);
249
- } else {
250
- _loggerProxy.default.logger.error('PeerConnectionManager:index#iceCandidate --> SDP not valid after waiting.');
251
-
252
- reject(new _webexErrors.InvalidSdpError(invalidSdpPresent));
253
- }
254
- }, _constants.RETRY_TIMEOUT);
255
- } else {
256
- resolve(peerConnection);
240
+ if (invalidSdpPresent) {
241
+ _loggerProxy.default.logger.error('PeerConnectionManager:index#iceCandidate --> SDP not valid after waiting.');
242
+
243
+ reject(new _webexErrors.InvalidSdpError(invalidSdpPresent));
244
+ }
245
+
246
+ _loggerProxy.default.logger.log("PeerConnectionManager:index#iceCandidate --> Time to gather ice candidate ".concat(miliseconds, " miliseconds"));
247
+
248
+ resolve();
249
+ }; // If ice has already been gathered
250
+
251
+
252
+ if (peerConnection.iceGatheringState === _constants.COMPLETE) {
253
+ doneGatheringIceCandidate();
254
+ }
255
+
256
+ peerConnection.onIceGatheringStateChange = function () {
257
+ if (peerConnection.iceGatheringState === _constants.COMPLETE) {
258
+ doneGatheringIceCandidate(peerConnection);
257
259
  }
258
- }, _constants.ICE_TIMEOUT);
260
+
261
+ if (peerConnection.iceGatheringState === _constants.GATHERING) {
262
+ _loggerProxy.default.logger.log('PeerConnectionManager:index#onIceGatheringStateChange --> Ice state changed to gathering');
263
+ }
264
+ };
259
265
 
260
266
  peerConnection.onicecandidate = function (evt) {
261
- if (!evt.candidate && !peerConnection.sdp) {
262
- peerConnection.sdp = limitBandwidth(peerConnection.localDescription.sdp);
263
- peerConnection.sdp = setMaxFs(peerConnection.sdp, remoteQualityLevel);
267
+ if (evt.candidate === null) {
268
+ doneGatheringIceCandidate(peerConnection);
269
+ } else {
270
+ var _evt$candidate, _evt$candidate2, _evt$candidate3, _evt$candidate4;
264
271
 
265
- if (evt.candidate === null && !isSdpInvalid(peerConnection.sdp)) {
266
- clearTimeout(timeout);
267
- resolve(peerConnection);
268
- }
272
+ _loggerProxy.default.logger.log("PeerConnectionManager:index#onicecandidate --> Candidate ".concat((_evt$candidate = evt.candidate) === null || _evt$candidate === void 0 ? void 0 : _evt$candidate.type, " ").concat((_evt$candidate2 = evt.candidate) === null || _evt$candidate2 === void 0 ? void 0 : _evt$candidate2.protocol, " ").concat((_evt$candidate3 = evt.candidate) === null || _evt$candidate3 === void 0 ? void 0 : _evt$candidate3.address, ":").concat((_evt$candidate4 = evt.candidate) === null || _evt$candidate4 === void 0 ? void 0 : _evt$candidate4.port));
269
273
  }
270
274
  };
275
+
276
+ peerConnection.onicecandidateerror = function (event) {
277
+ _loggerProxy.default.logger.error('PeerConnectionManager:index#onicecandidateerror --> Failed to gather ice candidate.', event);
278
+
279
+ reject(new _webexErrors.IceGatheringFailed());
280
+ };
271
281
  });
272
282
  };
273
283
  /**
@@ -430,9 +440,6 @@ pc.createOffer = function (peerConnection, _ref2) {
430
440
  remoteQualityLevel: remoteQualityLevel
431
441
  });
432
442
  }).then(function () {
433
- peerConnection.sdp = limitBandwidth(peerConnection.localDescription.sdp);
434
- peerConnection.sdp = setMaxFs(peerConnection.sdp, remoteQualityLevel);
435
-
436
443
  if (!checkH264Support(peerConnection.sdp)) {
437
444
  throw new _media.default('openH264 is downloading please Wait. Upload logs if not working on second try');
438
445
  }
@@ -568,6 +575,7 @@ pc.createAnswer = function (params, _ref4) {
568
575
  }).then(function () {
569
576
  peerConnection.sdp = limitBandwidth(peerConnection.localDescription.sdp);
570
577
  peerConnection.sdp = setMaxFs(peerConnection.sdp, remoteQualityLevel);
578
+ peerConnection.sdp = _util.default.convertCLineToIpv4(peerConnection.sdp);
571
579
 
572
580
  if (!checkH264Support(peerConnection.sdp)) {
573
581
  throw new _media.default('openH264 is downloading please Wait. Upload logs if not working on second try');