@webex/plugin-meetings 1.161.0 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -16,6 +16,8 @@ var _regenerator = _interopRequireDefault(require("@babel/runtime-corejs2/regene
16
16
 
17
17
  var _promise = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/promise"));
18
18
 
19
+ var _now = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/date/now"));
20
+
19
21
  var _keys = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/object/keys"));
20
22
 
21
23
  var _values = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/object/values"));
@@ -257,6 +259,7 @@ var Meetings = /*#__PURE__*/function (_WebexPlugin) {
257
259
  * @param {Object} data a locus event
258
260
  * @param {String} data.locusUrl
259
261
  * @param {Object} data.locus
262
+ * @param {Boolean} useRandomDelayForInfo whether a random delay should be added to fetching meeting info
260
263
  * @param {String} data.eventType
261
264
  * @returns {undefined}
262
265
  * @private
@@ -272,6 +275,7 @@ var Meetings = /*#__PURE__*/function (_WebexPlugin) {
272
275
  _data$locus$replaces,
273
276
  _this2 = this;
274
277
 
278
+ var useRandomDelayForInfo = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
275
279
  var meeting = null; // getting meeting by correlationId. This will happen for the new event
276
280
  // Either the locus
277
281
  // TODO : Add check for the callBack Address
@@ -316,7 +320,7 @@ var Meetings = /*#__PURE__*/function (_WebexPlugin) {
316
320
  return;
317
321
  }
318
322
 
319
- this.create(data.locus, _constants._LOCUS_ID_).then(function (newMeeting) {
323
+ this.create(data.locus, _constants._LOCUS_ID_, useRandomDelayForInfo).then(function (newMeeting) {
320
324
  meeting = newMeeting; // It's a new meeting so initialize the locus data
321
325
 
322
326
  meeting.locusInfo.initialSetup(data.locus);
@@ -367,7 +371,7 @@ var Meetings = /*#__PURE__*/function (_WebexPlugin) {
367
371
  var eventType = data.eventType;
368
372
 
369
373
  if (eventType && eventType !== _constants.LOCUSEVENT.MESSAGE_ROAP) {
370
- this.handleLocusEvent(data);
374
+ this.handleLocusEvent(data, true);
371
375
  }
372
376
  }
373
377
  /**
@@ -758,6 +762,7 @@ var Meetings = /*#__PURE__*/function (_WebexPlugin) {
758
762
  * Create a meeting.
759
763
  * @param {string} destination - sipURL, spaceId, phonenumber, or locus object}
760
764
  * @param {string} [type] - the optional specified type, such as locusId
765
+ * @param {Boolean} useRandomDelayForInfo - whether a random delay should be added to fetching meeting info
761
766
  * @returns {Promise<Meeting>} A new Meeting.
762
767
  * @public
763
768
  * @memberof Meetings
@@ -769,6 +774,7 @@ var Meetings = /*#__PURE__*/function (_WebexPlugin) {
769
774
  var _this10 = this;
770
775
 
771
776
  var type = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
777
+ var useRandomDelayForInfo = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
772
778
  // TODO: type should be from a dictionary
773
779
  // Validate meeting information based on the provided destination and
774
780
  // type. This must be performed prior to determining if the meeting is
@@ -805,7 +811,7 @@ var Meetings = /*#__PURE__*/function (_WebexPlugin) {
805
811
 
806
812
  if (!meeting) {
807
813
  // Create a meeting based on the normalized destination and type.
808
- return _this10.createMeeting(targetDest, type).then(function (createdMeeting) {
814
+ return _this10.createMeeting(targetDest, type, useRandomDelayForInfo).then(function (createdMeeting) {
809
815
  // If the meeting was successfully created.
810
816
  if (createdMeeting && createdMeeting.on) {
811
817
  // Create a destruction event for the meeting.
@@ -855,6 +861,7 @@ var Meetings = /*#__PURE__*/function (_WebexPlugin) {
855
861
  /**
856
862
  * @param {String} destination see create()
857
863
  * @param {String} type see create()
864
+ * @param {Boolean} useRandomDelayForInfo whether a random delay should be added to fetching meeting info
858
865
  * @returns {Promise} a new meeting instance complete with meeting info and destination
859
866
  * @private
860
867
  * @memberof Meetings
@@ -865,14 +872,26 @@ var Meetings = /*#__PURE__*/function (_WebexPlugin) {
865
872
  value: function () {
866
873
  var _createMeeting = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(destination) {
867
874
  var type,
875
+ useRandomDelayForInfo,
868
876
  meeting,
877
+ _destination$fullStat,
878
+ waitingTime,
879
+ startTime,
880
+ startTimeDate,
881
+ startTimeDatestamp,
882
+ timeToStart,
883
+ maxWaitingTime,
884
+ isMeetingActive,
885
+ enableUnifiedMeetings,
869
886
  meetingAddedType,
870
887
  _args = arguments;
888
+
871
889
  return _regenerator.default.wrap(function _callee$(_context) {
872
890
  while (1) {
873
891
  switch (_context.prev = _context.next) {
874
892
  case 0:
875
893
  type = _args.length > 1 && _args[1] !== undefined ? _args[1] : null;
894
+ useRandomDelayForInfo = _args.length > 2 && _args[2] !== undefined ? _args[2] : false;
876
895
  meeting = new _meeting.default({
877
896
  userId: this.webex.internal.device.userId,
878
897
  deviceUrl: this.webex.internal.device.url,
@@ -887,17 +906,48 @@ var Meetings = /*#__PURE__*/function (_WebexPlugin) {
887
906
  parent: this.webex
888
907
  });
889
908
  this.meetingCollection.set(meeting);
890
- _context.prev = 3;
891
- _context.next = 6;
909
+ _context.prev = 4;
910
+ // if no participant has joined the scheduled meeting (meaning meeting is not active) and we get a locusEvent,
911
+ // it means the meeting will start in 5-6 min. In that case, we want to fetchMeetingInfo
912
+ // between 5 and 2 min (random between 3 minutes) before the meeting starts
913
+ // to avoid a spike in traffic to the wbxappi service
914
+ waitingTime = 0;
915
+
916
+ if (destination.meeting) {
917
+ startTime = destination.meeting.startTime;
918
+ startTimeDate = new Date(startTime);
919
+ startTimeDatestamp = startTimeDate.getTime();
920
+ timeToStart = startTimeDatestamp - (0, _now.default)();
921
+ maxWaitingTime = Math.max(Math.min(timeToStart, _constants.MAX_RANDOM_DELAY_FOR_MEETING_INFO), 0);
922
+ waitingTime = Math.round(Math.random() * maxWaitingTime);
923
+ }
924
+
925
+ isMeetingActive = !!((_destination$fullStat = destination.fullState) !== null && _destination$fullStat !== void 0 && _destination$fullStat.active);
926
+ enableUnifiedMeetings = this.config.experimental.enableUnifiedMeetings;
927
+
928
+ if (!(enableUnifiedMeetings && !isMeetingActive && useRandomDelayForInfo && waitingTime > 0)) {
929
+ _context.next = 14;
930
+ break;
931
+ }
932
+
933
+ meeting.fetchMeetingInfoTimeoutId = setTimeout(function () {
934
+ return meeting.fetchMeetingInfo({});
935
+ }, waitingTime);
936
+ meeting.parseMeetingInfo(undefined, destination);
937
+ _context.next = 16;
938
+ break;
939
+
940
+ case 14:
941
+ _context.next = 16;
892
942
  return meeting.fetchMeetingInfo({});
893
943
 
894
- case 6:
895
- _context.next = 12;
944
+ case 16:
945
+ _context.next = 22;
896
946
  break;
897
947
 
898
- case 8:
899
- _context.prev = 8;
900
- _context.t0 = _context["catch"](3);
948
+ case 18:
949
+ _context.prev = 18;
950
+ _context.t0 = _context["catch"](4);
901
951
 
902
952
  if (!(_context.t0 instanceof _captchaError.default) && !(_context.t0 instanceof _passwordError.default)) {
903
953
  // if there is no meeting info we assume its a 1:1 call or wireless share
@@ -908,8 +958,8 @@ var Meetings = /*#__PURE__*/function (_WebexPlugin) {
908
958
 
909
959
  _loggerProxy.default.logger.debug("Meetings:index#createMeeting --> Debug ".concat(_context.t0, " fetching /meetingInfo for creation."));
910
960
 
911
- case 12:
912
- _context.prev = 12;
961
+ case 22:
962
+ _context.prev = 22;
913
963
 
914
964
  // For type LOCUS_ID we need to parse the locus object to get the information
915
965
  // about the caller and callee
@@ -932,17 +982,17 @@ var Meetings = /*#__PURE__*/function (_WebexPlugin) {
932
982
  });
933
983
  }
934
984
 
935
- return _context.finish(12);
985
+ return _context.finish(22);
936
986
 
937
- case 15:
987
+ case 25:
938
988
  return _context.abrupt("return", meeting);
939
989
 
940
- case 16:
990
+ case 26:
941
991
  case "end":
942
992
  return _context.stop();
943
993
  }
944
994
  }
945
- }, _callee, this, [[3, 8, 12, 15]]);
995
+ }, _callee, this, [[4, 18, 22, 25]]);
946
996
  }));
947
997
 
948
998
  function createMeeting(_x) {
@@ -1 +1 @@
1
- {"version":3,"names":["Meetings","args","MEETINGS","request","Request","parent","webex","loggerRequest","LoggerRequest","meetingCollection","MeetingCollection","personalMeetingRoom","reachability","registered","preferredWebexSite","media","getUserMedia","Media","getSupportedDevice","onReady","MeetingsUtil","checkH264Support","disableNotifications","Metrics","initialSetup","data","meeting","getByKey","LOCUS_URL","locusUrl","CORRELATION_ID","checkForCorrelationId","internal","device","url","locus","SIP_URI","self","callbackInfo","callbackAddress","info","isUnifiedSpaceMeeting","undefined","CONVERSATION_URL","conversationUrl","replaces","length","fullState","state","LOCUS","STATE","INACTIVE","LoggerProxy","logger","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","set","config","LoggerConfig","logging","meetingInfo","experimental","enableUnifiedMeetings","MeetingInfoV2","MeetingInfo","PersonalMeetingRoom","MEETINGS_READY","changeState","enableAdhocMeetings","canAuthorize","error","reject","Error","resolve","all","fetchUserPreferredWebexSite","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","fetchLoginUserInformation","userPreferences","parseUserPreferences","MeetingUtil","cleanUp","delete","MEETING_REMOVED","destination","fetchInfoOptions","targetDest","_CONVERSATION_URL_","foundMeeting","foundMeetingIsNotCalendarMeeting","scheduledMeeting","createMeeting","createdMeeting","EVENTS","DESTROY_MEETING","payload","autoUploadLogs","callStart","lastActive","correlationId","feedbackId","locusId","webExMeetingId","destroy","REQUEST_UPLOAD_LOGS","meetingInstance","Meeting","userId","deviceUrl","orgId","roapSeq","meetingInfoProvider","destinationType","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"],"sources":["index.js"],"sourcesContent":["\nimport '@webex/internal-plugin-mercury';\nimport '@webex/internal-plugin-conversation';\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 * This values indicates the preferred webex site the user will start there meeting, getsits value from {@link Meetings#register}\n * @instance\n * @type {String}\n * @private\n * @memberof Meetings\n */\n this.preferredWebexSite = '';\n\n /**\n * The public interface for the internal Media util files. These are helpful to expose outside the context\n * of a meeting so that a user can access media without creating a meeting instance.\n * @instance\n * @type {Object}\n * @private\n * @memberof Meetings\n */\n this.media = {\n getUserMedia: Media.getUserMedia,\n getSupportedDevice: Media.getSupportedDevice\n };\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 (data.locus.info?.isUnifiedSpaceMeeting ? undefined : 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 LoggerProxy.set(this.webex.logger);\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 * API to toggle starting adhoc meeting\n * @param {Boolean} changeState\n * @private\n * @memberof Meetings\n * @returns {undefined}\n */\n _toggleAdhocMeetings(changeState) {\n if (typeof changeState !== 'boolean') {\n return;\n }\n if (this.config?.experimental?.enableAdhocMeetings !== changeState) {\n this.config.experimental.enableAdhocMeetings = changeState;\n }\n }\n\n /**\n * Explicitly sets up the meetings plugin by registering\n * the device, connecting to mercury, and listening for locus events.\n *\n * @returns {Promise}\n * @public\n * @memberof Meetings\n */\n 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.fetchUserPreferredWebexSite(),\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 * Fetch user preferred webex site information\n * This also has other infomation about the user\n * @returns {Promise}\n * @private\n * @memberof Meetings\n */\n fetchUserPreferredWebexSite() {\n return this.request.fetchLoginUserInformation().then((res) => {\n if (res && res.userPreferences) {\n this.preferredWebexSite = MeetingsUtil.parseUserPreferences(res?.userPreferences);\n }\n });\n }\n\n\n /**\n * gets the personal meeting room instance, for saved PMR values for this user\n * @returns {PersonalMeetingRoom}\n * @public\n * @memberof Meetings\n */\n\n getPersonalMeetingRoom() {\n return this.personalMeetingRoom;\n }\n\n /**\n * @param {Meeting} meeting\n * @param {Object} reason\n * @param {String} type\n * @returns {Undefined}\n * @private\n * @memberof Meetings\n */\n 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 const foundMeeting = this.meetingCollection.getByKey(CONVERSATION_URL, targetDest);\n\n if (foundMeeting) {\n const foundMeetingIsNotCalendarMeeting = !foundMeeting.locusInfo.scheduledMeeting;\n\n // If the found meeting is not a calendar meeting, return that meeting.\n // This allows for the creation of instant-meetings when calendar meetings are present.\n if (foundMeetingIsNotCalendarMeeting) {\n meeting = foundMeeting;\n }\n }\n }\n\n // Attempt to collect the meeting if it exists.\n if (!meeting) {\n meeting = this.meetingCollection.getByKey(SIP_URI, targetDest);\n }\n\n\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 destination,\n destinationType: type,\n },\n {\n parent: this.webex\n }\n );\n\n this.meetingCollection.set(meeting);\n\n try {\n await meeting.fetchMeetingInfo({});\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 }\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"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA;;AACA;;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;;;;;EAGnB;AACF;AACA;AACA;AACA;AACA;EACE,oBAAqB;IAAA;;IAAA;;IAAA,kCAANC,IAAM;MAANA,IAAM;IAAA;;IACnB,gDAASA,IAAT;IAEA;AACJ;AACA;AACA;AACA;AACA;AACA;;IATuB,wFARTC,mBAQS;IAUnB,MAAKC,OAAL,GAAe,IAAIC,iBAAJ,CAAY,EAAZ,EAAgB;MAACC,MAAM,EAAE,MAAKC;IAAd,CAAhB,CAAf;IACA;AACJ;AACA;AACA;AACA;AACA;AACA;;IACI,MAAKC,aAAL,GAAqB,IAAIC,gBAAJ,CAAkB;MAACF,KAAK,EAAE,MAAKA;IAAb,CAAlB,CAArB;IACA,MAAKG,iBAAL,GAAyB,IAAIC,mBAAJ,EAAzB;IACA;AACJ;AACA;AACA;AACA;AACA;AACA;;IACI,MAAKC,mBAAL,GAA2B,IAA3B;IACA;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;;IACI,MAAKC,YAAL,GAAoB,IAApB;IAEA;AACJ;AACA;AACA;AACA;AACA;AACA;;IACI,MAAKC,UAAL,GAAkB,KAAlB;IAEA;AACJ;AACA;AACA;AACA;AACA;AACA;;IACI,MAAKC,kBAAL,GAA0B,EAA1B;IAEA;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;;IACI,MAAKC,KAAL,GAAa;MACXC,YAAY,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"}
1
+ {"version":3,"names":["Meetings","args","MEETINGS","request","Request","parent","webex","loggerRequest","LoggerRequest","meetingCollection","MeetingCollection","personalMeetingRoom","reachability","registered","preferredWebexSite","media","getUserMedia","Media","getSupportedDevice","onReady","MeetingsUtil","checkH264Support","disableNotifications","Metrics","initialSetup","data","useRandomDelayForInfo","meeting","getByKey","LOCUS_URL","locusUrl","CORRELATION_ID","checkForCorrelationId","internal","device","url","locus","SIP_URI","self","callbackInfo","callbackAddress","info","isUnifiedSpaceMeeting","undefined","CONVERSATION_URL","conversationUrl","replaces","length","fullState","state","LOCUS","STATE","INACTIVE","LoggerProxy","logger","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","set","config","LoggerConfig","logging","meetingInfo","experimental","enableUnifiedMeetings","MeetingInfoV2","MeetingInfo","PersonalMeetingRoom","MEETINGS_READY","changeState","enableAdhocMeetings","canAuthorize","error","reject","Error","resolve","all","fetchUserPreferredWebexSite","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","fetchLoginUserInformation","userPreferences","parseUserPreferences","MeetingUtil","cleanUp","delete","MEETING_REMOVED","destination","fetchInfoOptions","targetDest","_CONVERSATION_URL_","foundMeeting","foundMeetingIsNotCalendarMeeting","scheduledMeeting","createMeeting","createdMeeting","EVENTS","DESTROY_MEETING","payload","autoUploadLogs","callStart","lastActive","correlationId","feedbackId","locusId","webExMeetingId","destroy","REQUEST_UPLOAD_LOGS","meetingInstance","Meeting","userId","deviceUrl","orgId","roapSeq","meetingInfoProvider","destinationType","waitingTime","startTime","startTimeDate","Date","startTimeDatestamp","getTime","timeToStart","maxWaitingTime","Math","max","min","MAX_RANDOM_DELAY_FOR_MEETING_INFO","round","random","isMeetingActive","active","fetchMeetingInfoTimeoutId","setTimeout","fetchMeetingInfo","parseMeetingInfo","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"],"sources":["index.js"],"sourcesContent":["\nimport '@webex/internal-plugin-mercury';\nimport '@webex/internal-plugin-conversation';\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 MAX_RANDOM_DELAY_FOR_MEETING_INFO,\n ROAP,\n ONLINE,\n OFFLINE,\n _MEETING_,\n _JOIN_,\n _LOCUS_ID_,\n _INCOMING_,\n LOCUS,\n CORRELATION_ID,\n SIP_URI,\n _LEFT_,\n _ID_,\n MEETING_REMOVED_REASON,\n _CONVERSATION_URL_,\n CONVERSATION_URL\n} 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 * This values indicates the preferred webex site the user will start there meeting, getsits value from {@link Meetings#register}\n * @instance\n * @type {String}\n * @private\n * @memberof Meetings\n */\n this.preferredWebexSite = '';\n\n /**\n * The public interface for the internal Media util files. These are helpful to expose outside the context\n * of a meeting so that a user can access media without creating a meeting instance.\n * @instance\n * @type {Object}\n * @private\n * @memberof Meetings\n */\n this.media = {\n getUserMedia: Media.getUserMedia,\n getSupportedDevice: Media.getSupportedDevice\n };\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 {Boolean} useRandomDelayForInfo whether a random delay should be added to fetching meeting info\n * @param {String} data.eventType\n * @returns {undefined}\n * @private\n * @memberof Meetings\n */\n handleLocusEvent(data, useRandomDelayForInfo = false) {\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 (data.locus.info?.isUnifiedSpaceMeeting ? undefined : 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_, useRandomDelayForInfo).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, true);\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 LoggerProxy.set(this.webex.logger);\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 * API to toggle starting adhoc meeting\n * @param {Boolean} changeState\n * @private\n * @memberof Meetings\n * @returns {undefined}\n */\n _toggleAdhocMeetings(changeState) {\n if (typeof changeState !== 'boolean') {\n return;\n }\n if (this.config?.experimental?.enableAdhocMeetings !== changeState) {\n this.config.experimental.enableAdhocMeetings = changeState;\n }\n }\n\n /**\n * Explicitly sets up the meetings plugin by registering\n * the device, connecting to mercury, and listening for locus events.\n *\n * @returns {Promise}\n * @public\n * @memberof Meetings\n */\n 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.fetchUserPreferredWebexSite(),\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 * Fetch user preferred webex site information\n * This also has other infomation about the user\n * @returns {Promise}\n * @private\n * @memberof Meetings\n */\n fetchUserPreferredWebexSite() {\n return this.request.fetchLoginUserInformation().then((res) => {\n if (res && res.userPreferences) {\n this.preferredWebexSite = MeetingsUtil.parseUserPreferences(res?.userPreferences);\n }\n });\n }\n\n\n /**\n * gets the personal meeting room instance, for saved PMR values for this user\n * @returns {PersonalMeetingRoom}\n * @public\n * @memberof Meetings\n */\n\n getPersonalMeetingRoom() {\n return this.personalMeetingRoom;\n }\n\n /**\n * @param {Meeting} meeting\n * @param {Object} reason\n * @param {String} type\n * @returns {Undefined}\n * @private\n * @memberof Meetings\n */\n 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 * @param {Boolean} useRandomDelayForInfo - whether a random delay should be added to fetching meeting info\n * @returns {Promise<Meeting>} A new Meeting.\n * @public\n * @memberof Meetings\n */\n create(destination, type = null, useRandomDelayForInfo = false) {\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 const foundMeeting = this.meetingCollection.getByKey(CONVERSATION_URL, targetDest);\n\n if (foundMeeting) {\n const foundMeetingIsNotCalendarMeeting = !foundMeeting.locusInfo.scheduledMeeting;\n\n // If the found meeting is not a calendar meeting, return that meeting.\n // This allows for the creation of instant-meetings when calendar meetings are present.\n if (foundMeetingIsNotCalendarMeeting) {\n meeting = foundMeeting;\n }\n }\n }\n\n // Attempt to collect the meeting if it exists.\n if (!meeting) {\n meeting = this.meetingCollection.getByKey(SIP_URI, targetDest);\n }\n\n // Validate if a meeting was found.\n if (!meeting) {\n // Create a meeting based on the normalized destination and type.\n return this.createMeeting(targetDest, type, useRandomDelayForInfo)\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 * @param {Boolean} useRandomDelayForInfo whether a random delay should be added to fetching meeting info\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, useRandomDelayForInfo = false) {\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 destination,\n destinationType: type,\n },\n {\n parent: this.webex\n }\n );\n\n this.meetingCollection.set(meeting);\n\n try {\n // if no participant has joined the scheduled meeting (meaning meeting is not active) and we get a locusEvent,\n // it means the meeting will start in 5-6 min. In that case, we want to fetchMeetingInfo\n // between 5 and 2 min (random between 3 minutes) before the meeting starts\n // to avoid a spike in traffic to the wbxappi service\n let waitingTime = 0;\n\n if (destination.meeting) {\n const {startTime} = destination.meeting;\n const startTimeDate = new Date(startTime);\n const startTimeDatestamp = startTimeDate.getTime();\n const timeToStart = startTimeDatestamp - Date.now();\n const maxWaitingTime = Math.max(Math.min(timeToStart, MAX_RANDOM_DELAY_FOR_MEETING_INFO), 0);\n\n waitingTime = Math.round(Math.random() * maxWaitingTime);\n }\n const isMeetingActive = !!destination.fullState?.active;\n const {enableUnifiedMeetings} = this.config.experimental;\n\n if (enableUnifiedMeetings && !isMeetingActive && useRandomDelayForInfo && waitingTime > 0) {\n meeting.fetchMeetingInfoTimeoutId = setTimeout(() => meeting.fetchMeetingInfo({}), waitingTime);\n meeting.parseMeetingInfo(undefined, destination);\n }\n else {\n await meeting.fetchMeetingInfo({});\n }\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 }\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"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA;;AACA;;AACA;;AAEA;;AAEA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AAwBA;;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;;;;;EAGnB;AACF;AACA;AACA;AACA;AACA;EACE,oBAAqB;IAAA;;IAAA;;IAAA,kCAANC,IAAM;MAANA,IAAM;IAAA;;IACnB,gDAASA,IAAT;IAEA;AACJ;AACA;AACA;AACA;AACA;AACA;;IATuB,wFARTC,mBAQS;IAUnB,MAAKC,OAAL,GAAe,IAAIC,iBAAJ,CAAY,EAAZ,EAAgB;MAACC,MAAM,EAAE,MAAKC;IAAd,CAAhB,CAAf;IACA;AACJ;AACA;AACA;AACA;AACA;AACA;;IACI,MAAKC,aAAL,GAAqB,IAAIC,gBAAJ,CAAkB;MAACF,KAAK,EAAE,MAAKA;IAAb,CAAlB,CAArB;IACA,MAAKG,iBAAL,GAAyB,IAAIC,mBAAJ,EAAzB;IACA;AACJ;AACA;AACA;AACA;AACA;AACA;;IACI,MAAKC,mBAAL,GAA2B,IAA3B;IACA;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;;IACI,MAAKC,YAAL,GAAoB,IAApB;IAEA;AACJ;AACA;AACA;AACA;AACA;AACA;;IACI,MAAKC,UAAL,GAAkB,KAAlB;IAEA;AACJ;AACA;AACA;AACA;AACA;AACA;;IACI,MAAKC,kBAAL,GAA0B,EAA1B;IAEA;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;;IACI,MAAKC,KAAL,GAAa;MACXC,YAAY,EAAEC,eAAMD,YADT;MAEXE,kBAAkB,EAAED,eAAMC;IAFf,CAAb;;IAKA,MAAKC,OAAL;;IACAC,eAAaC,gBAAb,CAA8B;MAACC,oBAAoB,EAAE;IAAvB,CAA9B;;IACAC,iBAAQC,YAAR,CAAqB,MAAKf,iBAA1B,EAA6C,MAAKH,KAAlD;;IAvEmB;EAwEpB;EAED;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;WACE,0BAAiBmB,IAAjB,EAAsD;MAAA;MAAA;MAAA;MAAA;;MAAA,IAA/BC,qBAA+B,uEAAP,KAAO;MACpD,IAAIC,OAAO,GAAG,IAAd,CADoD,CAGpD;MACA;MACA;;MACAA,OAAO,GAAG,KAAKlB,iBAAL,CAAuBmB,QAAvB,CAAgCC,oBAAhC,EAA2CJ,IAAI,CAACK,QAAhD,KACR,KAAKrB,iBAAL,CAAuBmB,QAAvB,CAAgCG,yBAAhC,EAAgDX,eAAaY,qBAAb,CAAmC,KAAK1B,KAAL,CAAW2B,QAAX,CAAoBC,MAApB,CAA2BC,GAA9D,EAAmEV,IAAI,CAACW,KAAxE,CAAhD,CADQ,IAER,KAAK3B,iBAAL,CAAuBmB,QAAvB,CAAgCS,kBAAhC,EAAyCZ,IAAI,CAACW,KAAL,CAAWE,IAAX,IAAmBb,IAAI,CAACW,KAAL,CAAWE,IAAX,CAAgBC,YAAnC,IAAmDd,IAAI,CAACW,KAAL,CAAWE,IAAX,CAAgBC,YAAhB,CAA6BC,eAAzH,CAFQ,KAGP,oBAAAf,IAAI,CAACW,KAAL,CAAWK,IAAX,8DAAiBC,qBAAjB,GAAyCC,SAAzC,GAAqD,KAAKlC,iBAAL,CAAuBmB,QAAvB,CAAgCgB,2BAAhC,EAAkDnB,IAAI,CAACW,KAAL,CAAWS,eAA7D,CAH9C,CAAV,CANoD,CAWpD;MACA;;MAEA,IAAI,CAAClB,OAAD,IAAY,gBAAAF,IAAI,CAACW,KAAL,oFAAYU,QAAZ,8EAAsBC,MAAtB,IAA+B,CAA/C,EAAkD;QAChD;QACApB,OAAO,GAAG,KAAKlB,iBAAL,CAAuBmB,QAAvB,CAAgCC,oBAAhC,EAA2CJ,IAAI,CAACW,KAAL,CAAWU,QAAX,CAAoBrB,IAAI,CAACW,KAAL,CAAWU,QAAX,CAAoBC,MAApB,GAA6B,CAAjD,EAAoDjB,QAA/F,CAAV;MACD;;MAED,IAAI,CAACH,OAAL,EAAc;QACZ;QACA;QACA;QACA;QACA;QAEA;QACA;QACA;QACA;QACA;QACA;QAEA;QACA;QAEA;QACA;QAEA,IAAIF,IAAI,CAACW,KAAL,IAAcX,IAAI,CAACW,KAAL,CAAWY,SAAzB,IAAsCvB,IAAI,CAACW,KAAL,CAAWY,SAAX,CAAqBC,KAArB,KAA+BC,iBAAMC,KAAN,CAAYC,QAArF,EAA+F;UAC7F;UACAC,qBAAYC,MAAZ,CAAmBC,IAAnB,CAAwB,2FAAxB;;UAEA;QACD,CAzBW,CA4BZ;QACA;;;QAEA,IAAI9B,IAAI,CAACW,KAAL,IAAcX,IAAI,CAACW,KAAL,CAAWE,IAAzB,IAAkCb,IAAI,CAACW,KAAL,CAAWE,IAAX,CAAgBW,KAAhB,KAA0BO,iBAA1B,IAAoC/B,IAAI,CAACW,KAAL,CAAWE,IAAX,CAAgBmB,OAAhB,KAA4B,IAAtG,EAA6G;UAC3G;UACAJ,qBAAYC,MAAZ,CAAmBC,IAAnB,CAAwB,2FAAxB;;UAEA;QACD;;QAED,KAAKG,MAAL,CAAYjC,IAAI,CAACW,KAAjB,EAAwBuB,qBAAxB,EAAoCjC,qBAApC,EAA2DkC,IAA3D,CAAgE,UAACC,UAAD,EAAgB;UAC9ElC,OAAO,GAAGkC,UAAV,CAD8E,CAG9E;;UACAlC,OAAO,CAACmC,SAAR,CAAkBtC,YAAlB,CAA+BC,IAAI,CAACW,KAApC;QACD,CALD,EAKG2B,KALH,CAKS,UAACC,CAAD,EAAO;UACdC,OAAO,CAACC,GAAR,CAAYF,CAAZ;QACD,CAPD,EAQGG,OARH,CAQW,YAAM;UACb;UACA;UAEA,IAAI,MAAI,CAACC,gBAAL,CAAsBC,eAAtB,EAA4B1C,OAAO,CAAC2C,EAApC,CAAJ,EAA6C;YAC3C/C,iBAAQgD,SAAR,CAAkB;cAACC,KAAK,EAAEC,kBAAUC,cAAlB;cAAkC/C,OAAO,EAAPA,OAAlC;cAA2CF,IAAI,EAAE;gBAACkD,OAAO,EAAEA,gBAAQC;cAAlB;YAAjD,CAAlB;;YACAC,sBAAQF,OAAR,CACE,MADF,EAEE;cACEG,IAAI,EAAE,UADR;cAEEC,QAAQ,EAAE;YAFZ,CAFF,EAMEC,0BAAeC,aANjB,EAOE;cACEtD,OAAO,EAAPA,OADF;cAEEuD,IAAI,EAAEvD,OAAO,CAACuD,IAAR,KAAiBC,oBAAjB,GAA6BC,iBAA7B,GAAsCC;YAF9C,CAPF;UAYD,CAdD,MAeK;YACH;YACAhC,qBAAYC,MAAZ,CAAmBC,IAAnB,CAAwB,kGAAxB;UACD;QACF,CA/BH;MAgCD,CAtED,MAuEK;QACH5B,OAAO,CAACmC,SAAR,CAAkBwB,KAAlB,CAAwB3D,OAAxB,EAAiCF,IAAjC;MACD;IACF;IAED;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;WACE,4BAAmB8D,QAAnB,EAA6B;MAC3B,IAAO9D,IAAP,GAAe8D,QAAf,CAAO9D,IAAP;MACA,IAAOgD,SAAP,GAAoBhD,IAApB,CAAOgD,SAAP;;MAEA,IAAIA,SAAS,IAAIA,SAAS,KAAKe,sBAAWC,YAA1C,EAAwD;QACtD,KAAKC,gBAAL,CAAsBjE,IAAtB,EAA4B,IAA5B;MACD;IACF;IAGD;AACF;AACA;AACA;AACA;AACA;;;;WACE,gCAAuB;MACrBoD,sBAAQF,OAAR,CACE,IADF,EAEE;QACEG,IAAI,EAAE,gBADR;QAEEC,QAAQ,EAAE;MAFZ,CAFF,EAMEC,0BAAeW,6BANjB;IAQD;IAGD;AACF;AACA;AACA;AACA;AACA;;;;WACE,2BAAkB;MAAA;;MAChB,KAAKrF,KAAL,CAAW2B,QAAX,CAAoB2D,OAApB,CAA4BC,EAA5B,CAA+BL,sBAAWM,aAA1C,EAAyD,UAACP,QAAD,EAAc;QACrE,MAAI,CAACQ,kBAAL,CAAwBR,QAAxB;MACD,CAFD;MAGA,KAAKjF,KAAL,CAAW2B,QAAX,CAAoB2D,OAApB,CAA4BC,EAA5B,CAA+BG,gBAAKC,YAApC,EAAkD,UAACV,QAAD,EAAc;QAC9DnE,eAAa8E,iBAAb,CAA+BX,QAA/B,EAAyC,MAAI,CAAC9E,iBAA9C;MACD,CAFD;MAIA,KAAKH,KAAL,CAAW2B,QAAX,CAAoB2D,OAApB,CAA4BC,EAA5B,CAA+BM,iBAA/B,EAAuC,YAAM;QAC3C,MAAI,CAACC,YAAL;MACD,CAFD;MAIA,KAAK9F,KAAL,CAAW2B,QAAX,CAAoB2D,OAApB,CAA4BC,EAA5B,CAA+BQ,kBAA/B,EAAwC,YAAM;QAC5C,MAAI,CAACC,oBAAL;MACD,CAFD;IAGD;IAED;AACF;AACA;AACA;AACA;AACA;;;;WACE,kCAAyB;MACvB,KAAKhG,KAAL,CAAW2B,QAAX,CAAoB2D,OAApB,CAA4BW,GAA5B,CAAgCf,sBAAWM,aAA3C;MACA,KAAKxF,KAAL,CAAW2B,QAAX,CAAoB2D,OAApB,CAA4BW,GAA5B,CAAgCP,gBAAKC,YAArC;MACA,KAAK3F,KAAL,CAAW2B,QAAX,CAAoB2D,OAApB,CAA4BW,GAA5B,CAAgCJ,iBAAhC;IACD;IAED;AACF;AACA;AACA;AACA;;;;WACE,mBAAU;MAAA;;MACR,KAAK7F,KAAL,CAAWkG,IAAX,CAAgBC,gBAAhB,EAAuB,YAAM;QAC3BC,iBAAaC,GAAb,CAAiB,MAAI,CAACC,MAAtB;;QACAvD,qBAAYsD,GAAZ,CAAgB,MAAI,CAACrG,KAAL,CAAWgD,MAA3B;;QACAuD,sBAAaF,GAAb,CAAiB,MAAI,CAACC,MAAL,CAAYE,OAA7B;QAEA;AACN;AACA;AACA;AACA;AACA;AACA;;;QACM,MAAI,CAACC,WAAL,GAAmB,MAAI,CAACH,MAAL,CAAYI,YAAZ,CAAyBC,qBAAzB,GAAiD,IAAIC,qBAAJ,CAAkB,MAAI,CAAC5G,KAAvB,CAAjD,GAAiF,IAAI6G,oBAAJ,CAAgB,MAAI,CAAC7G,KAArB,CAApG;QACA,MAAI,CAACK,mBAAL,GAA2B,IAAIyG,4BAAJ,CAAwB;UAACL,WAAW,EAAE,MAAI,CAACA;QAAnB,CAAxB,EAAyD;UAAC1G,MAAM,EAAE,MAAI,CAACC;QAAd,CAAzD,CAA3B;;QAEAuE,sBAAQF,OAAR,CACE,MADF,EAEE;UACEG,IAAI,EAAE,UADR;UAEEC,QAAQ,EAAE;QAFZ,CAFF,EAMEC,0BAAeqC,cANjB;MAQD,CAvBD;IAwBD;IAED;AACF;AACA;AACA;AACA;AACA;AACA;;;;WACE,gCAAuBC,WAAvB,EAAoC;MAAA;;MAClC,IAAI,OAAOA,WAAP,KAAuB,SAA3B,EAAsC;QACpC;MACD;;MACD,IAAI,sBAAKV,MAAL,uFAAaI,YAAb,gFAA2BC,qBAA3B,MAAqDK,WAAzD,EAAsE;QACpE,KAAKV,MAAL,CAAYI,YAAZ,CAAyBC,qBAAzB,GAAiDK,WAAjD;QACA,KAAKP,WAAL,GAAmBO,WAAW,GAAG,IAAIJ,qBAAJ,CAAkB,KAAK5G,KAAvB,CAAH,GAAmC,IAAI6G,oBAAJ,CAAgB,KAAK7G,KAArB,CAAjE;MACD;IACF;IAED;AACF;AACA;AACA;AACA;AACA;AACA;;;;WACE,8BAAqBgH,WAArB,EAAkC;MAAA;;MAChC,IAAI,OAAOA,WAAP,KAAuB,SAA3B,EAAsC;QACpC;MACD;;MACD,IAAI,uBAAKV,MAAL,yFAAaI,YAAb,gFAA2BO,mBAA3B,MAAmDD,WAAvD,EAAoE;QAClE,KAAKV,MAAL,CAAYI,YAAZ,CAAyBO,mBAAzB,GAA+CD,WAA/C;MACD;IACF;IAED;AACF;AACA;AACA;AACA;AACA;AACA;AACA;;;;WACE,oBAAW;MAAA;;MACT,IAAI,CAAC,KAAKhH,KAAL,CAAWkH,YAAhB,EAA8B;QAC5BnE,qBAAYC,MAAZ,CAAmBmE,KAAnB,CAAyB,6EAAzB;;QAEA,OAAO,iBAAQC,MAAR,CAAe,IAAIC,KAAJ,CAAU,sBAAV,CAAf,CAAP;MACD;;MAGD,IAAI,KAAK9G,UAAT,EAAqB;QACnBwC,qBAAYC,MAAZ,CAAmBb,IAAnB,CAAwB,sEAAxB;;QAEA,OAAO,iBAAQmF,OAAR,EAAP;MACD;;MAED,OAAO,iBAAQC,GAAR,CAAY,CACjB,KAAKC,2BAAL,EADiB,EAEjB,KAAKC,UAAL,EAFiB,EAGjB,KAAKC,iBAAL,GAAyBjE,KAAzB,CAA+B,UAAC0D,KAAD,EAAW;QACxCpE,qBAAYC,MAAZ,CAAmBmE,KAAnB,kDAAmEA,KAAK,CAACQ,OAAzE;MACD,CAFD,CAHiB,EAMjB,KAAK3H,KAAL,CAAW2B,QAAX,CAAoBC,MAApB,CAA2BgG,QAA3B,GACGtE,IADH,CACQ;QAAA,OAAMP,qBAAYC,MAAZ,CAAmBb,IAAnB,+DAA+E,MAAI,CAACnC,KAAL,CAAW2B,QAAX,CAAoBC,MAApB,CAA2BC,GAA1G,EAAN;MAAA,CADR,EAEGyB,IAFH,CAEQ;QAAA,OAAM,MAAI,CAACtD,KAAL,CAAW2B,QAAX,CAAoB2D,OAApB,CAA4BuC,OAA5B,EAAN;MAAA,CAFR,CANiB,EASjB/G,eAAaC,gBAAb,CAA8B+G,IAA9B,CAAmC,IAAnC,CATiB,CAAZ,EAUJxE,IAVI,CAUC,YAAM;QACZ,MAAI,CAACyE,eAAL;;QACAxD,sBAAQF,OAAR,CACE,MADF,EAEE;UACEG,IAAI,EAAE,UADR;UAEEC,QAAQ,EAAE;QAFZ,CAFF,EAMEC,0BAAesD,mBANjB;;QAQA,MAAI,CAACzH,UAAL,GAAkB,IAAlB;;QACAU,iBAAQgH,oBAAR,CACEC,oBAAmBC,6BADrB;MAGD,CAxBM,EAyBJ1E,KAzBI,CAyBE,UAAC0D,KAAD,EAAW;QAChBpE,qBAAYC,MAAZ,CAAmBmE,KAAnB,kEAAmFA,KAAK,CAACQ,OAAzF;;QAEA1G,iBAAQgH,oBAAR,CACEC,oBAAmBE,4BADrB,EAEE;UACEC,MAAM,EAAElB,KAAK,CAACQ,OADhB;UAEEW,KAAK,EAAEnB,KAAK,CAACmB;QAFf,CAFF;;QAQA,OAAO,iBAAQlB,MAAR,CAAeD,KAAf,CAAP;MACD,CArCI,CAAP;IAsCD;IAED;AACF;AACA;AACA;AACA;AACA;AACA;AACA;;;;WACE,sBAAa;MAAA;;MACX,IAAI,CAAC,KAAK5G,UAAV,EAAsB;QACpBwC,qBAAYC,MAAZ,CAAmBb,IAAnB,CAAwB,0EAAxB;;QAEA,OAAO,iBAAQmF,OAAR,EAAP;MACD;;MAED,KAAKiB,sBAAL;MAEA,OAAO,KAAKvI,KAAL,CAAW2B,QAAX,CAAoB2D,OAApB,CAA4BkD,UAA5B,GACJlF,IADI,CACC;QAAA,OAAM,MAAI,CAACtD,KAAL,CAAW2B,QAAX,CAAoBC,MAApB,CAA2B6G,UAA3B,EAAN;MAAA,CADD,EAEJnF,IAFI,CAEC,YAAM;QACViB,sBAAQF,OAAR,CACE,MADF,EAEE;UACEG,IAAI,EAAE,UADR;UAEEC,QAAQ,EAAE;QAFZ,CAFF,EAMEC,0BAAegE,qBANjB;;QAQA,MAAI,CAACnI,UAAL,GAAkB,KAAlB;MACD,CAZI,CAAP;IAaD;IAED;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;WACE,sBAAyB;MAAA;;MAAA,IAAdoI,OAAc,uEAAJ,EAAI;;MACvB5F,qBAAYC,MAAZ,CAAmBb,IAAnB,CAAwB,8CAAxB;;MAEA,OAAO,KAAKlC,aAAL,CAAmB2I,UAAnB,CAA8BD,OAA9B,EACJrF,IADI,CACC,UAACuF,YAAD,EAAkB;QACtB9F,qBAAYC,MAAZ,CAAmBb,IAAnB,CAAwB,kEAAxB,EAA4F0G,YAA5F;;QACAtE,sBAAQF,OAAR,CACE,MADF,EAEE;UACEG,IAAI,EAAE,UADR;UAEEC,QAAQ,EAAE;QAFZ,CAFF,EAMEC,0BAAeoE,0BANjB,EAOE;UACEC,SAAS,EAAEJ,OAAO,CAACI,SADrB;UAEEC,OAAO,EAAEH;QAFX,CAPF;MAYD,CAfI,EAgBJpF,KAhBI,CAgBE,UAACwF,WAAD,EAAiB;QACtBlG,qBAAYC,MAAZ,CAAmBmE,KAAnB,CAAyB,iEAAzB,EAA4F8B,WAA5F;;QACA1E,sBAAQF,OAAR,CACE,MADF,EAEE;UACEG,IAAI,EAAE,UADR;UAEEC,QAAQ,EAAE;QAFZ,CAFF,EAMEC,0BAAewE,0BANjB,EAOE;UACEH,SAAS,EAAEJ,OAAO,CAACI,SADrB;UAEEV,MAAM,EAAEY;QAFV,CAPF;;QAaAhI,iBAAQgH,oBAAR,CACEC,oBAAmBiB,mBADrB,EAEE;UACEJ,SAAS,EAAEJ,OAAO,CAACS,UADrB;UAEEf,MAAM,EAAEY,WAAW,CAACtB,OAFtB;UAGEW,KAAK,EAAEW,WAAW,CAACX,KAHrB;UAIEe,IAAI,EAAEJ,WAAW,CAACI;QAJpB,CAFF;MASD,CAxCI,CAAP;IAyCD;IAED;AACF;AACA;AACA;AACA;AACA;;;;WACE,2BAAkB;MAChB,KAAK/I,YAAL,GAAoB,IAAIgJ,qBAAJ,CAAiB,KAAKtJ,KAAtB,CAApB;IACD;IAED;AACF;AACA;AACA;AACA;AACA;;;;WACE,2BAAkB;MAChB,OAAO,KAAKM,YAAZ;IACD;IAED;AACF;AACA;AACA;AACA;AACA;;;;WACE,6BAAoB;MAClB,IAAI,CAAC,KAAKA,YAAV,EAAwB;QACtB,KAAKiJ,eAAL;MACD;;MAED,OAAO,KAAKC,eAAL,GAAuBC,kBAAvB,EAAP;IACD;IAED;AACF;AACA;AACA;AACA;AACA;;;;WACE,sBAAa;MAAA;;MACX,OAAO,KAAK5J,OAAL,CAAa6J,YAAb,GAA4BpG,IAA5B,CAAiC,UAACqG,GAAD,EAAS;QAC/C,MAAI,CAACC,WAAL,GAAmBD,GAAnB;MACD,CAFM,CAAP;IAGD;IAED;AACF;AACA;AACA;AACA;AACA;AACA;;;;WACE,uCAA8B;MAAA;;MAC5B,OAAO,KAAK9J,OAAL,CAAagK,yBAAb,GAAyCvG,IAAzC,CAA8C,UAACqG,GAAD,EAAS;QAC5D,IAAIA,GAAG,IAAIA,GAAG,CAACG,eAAf,EAAgC;UAC9B,MAAI,CAACtJ,kBAAL,GAA0BM,eAAaiJ,oBAAb,CAAkCJ,GAAlC,aAAkCA,GAAlC,uBAAkCA,GAAG,CAAEG,eAAvC,CAA1B;QACD;MACF,CAJM,CAAP;IAKD;IAGD;AACF;AACA;AACA;AACA;AACA;;;;WAEE,kCAAyB;MACvB,OAAO,KAAKzJ,mBAAZ;IACD;IAED;AACF;AACA;AACA;AACA;AACA;AACA;AACA;;;;WACE,iBAAQgB,OAAR,EAAiBgH,MAAjB,EAAyB;MACvB2B,cAAYC,OAAZ,CAAoB5I,OAApB;;MACA,KAAKlB,iBAAL,CAAuB+J,MAAvB,CAA8B7I,OAAO,CAAC2C,EAAtC;;MACAO,sBAAQF,OAAR,CACE,IADF,EAEE;QACEG,IAAI,EAAE,UADR;QAEEC,QAAQ,EAAE;MAFZ,CAFF,EAMEC,0BAAeyF,eANjB,EAOE;QACEpB,SAAS,EAAE1H,OAAO,CAAC2C,EADrB;QAEEqE,MAAM,EAANA;MAFF,CAPF;IAYD;IAED;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;WACE,gBAAO+B,WAAP,EAAgE;MAAA;;MAAA,IAA5CxF,IAA4C,uEAArC,IAAqC;MAAA,IAA/BxD,qBAA+B,uEAAP,KAAO;MAC9D;MAEA;MACA;MACA;MACA;MACA,OAAO,KAAKqF,WAAL,CAAiB4D,gBAAjB,CAAkCD,WAAlC,EAA+CxF,IAA/C,EACP;MADO,CAEJnB,KAFI,CAEE,UAAC0D,KAAD,EAAW;QAChBpE,qBAAYC,MAAZ,CAAmBb,IAAnB,6EAA6FgF,KAAK,CAACQ,OAAnG;MACD,CAJI,EAKJrE,IALI,CAKC,YAAkB;QAAA,IAAjBqF,OAAiB,uEAAP,EAAO;QACtB;QACA,IAAM2B,UAAU,GAAG3B,OAAO,CAACyB,WAAR,IAAuBA,WAA1C,CAFsB,CAItB;;QACA,IAAI/I,OAAO,GAAG,IAAd;;QAEA,IAAIuD,IAAI,KAAK2F,6BAAT,IAA+B5B,OAAO,CAAC/D,IAAR,KAAiB2F,6BAApD,EAAwE;UACtE,IAAMC,YAAY,GAAG,OAAI,CAACrK,iBAAL,CAAuBmB,QAAvB,CAAgCgB,2BAAhC,EAAkDgI,UAAlD,CAArB;;UAEA,IAAIE,YAAJ,EAAkB;YAChB,IAAMC,gCAAgC,GAAG,CAACD,YAAY,CAAChH,SAAb,CAAuBkH,gBAAjE,CADgB,CAGhB;YACA;;YACA,IAAID,gCAAJ,EAAsC;cACpCpJ,OAAO,GAAGmJ,YAAV;YACD;UACF;QACF,CAnBqB,CAqBtB;;;QACA,IAAI,CAACnJ,OAAL,EAAc;UACZA,OAAO,GAAG,OAAI,CAAClB,iBAAL,CAAuBmB,QAAvB,CAAgCS,kBAAhC,EAAyCuI,UAAzC,CAAV;QACD,CAxBqB,CA0BtB;;;QACA,IAAI,CAACjJ,OAAL,EAAc;UACZ;UACA,OAAO,OAAI,CAACsJ,aAAL,CAAmBL,UAAnB,EAA+B1F,IAA/B,EAAqCxD,qBAArC,EACJkC,IADI,CACC,UAACsH,cAAD,EAAoB;YACxB;YACA,IAAIA,cAAc,IAAIA,cAAc,CAACrF,EAArC,EAAyC;cACvC;cACAqF,cAAc,CAACrF,EAAf,CAAkBsF,kBAAOC,eAAzB,EAA0C,UAACC,OAAD,EAAa;gBACrD,IAAI,OAAI,CAACzE,MAAL,CAAY0E,cAAhB,EAAgC;kBAAA;;kBAC9B,OAAI,CAACpC,UAAL,CAAgB;oBACdqC,SAAS,2BAAEL,cAAc,CAACpH,SAAjB,oFAAE,sBAA0Bd,SAA5B,2DAAE,uBAAqCwI,UADlC;oBAEdC,aAAa,EAAEP,cAAc,CAACO,aAFhB;oBAGdC,UAAU,EAAER,cAAc,CAACO,aAHb;oBAIdE,OAAO,EAAET,cAAc,CAACS,OAJV;oBAKdtC,SAAS,4BAAE6B,cAAc,CAACpH,SAAjB,qFAAE,uBAA0BrB,IAA5B,2DAAE,uBAAgCmJ;kBAL7B,CAAhB,EAMGhI,IANH,CAMQ;oBAAA,OAAM,OAAI,CAACiI,OAAL,CAAaX,cAAb,EAA6BG,OAAO,CAAC1C,MAArC,CAAN;kBAAA,CANR;gBAOD,CARD,MASK;kBACH,OAAI,CAACkD,OAAL,CAAaX,cAAb,EAA6BG,OAAO,CAAC1C,MAArC;gBACD;cACF,CAbD;cAeAuC,cAAc,CAACrF,EAAf,CAAkBsF,kBAAOW,mBAAzB,EAA8C,UAACC,eAAD,EAAqB;gBACjE,IAAI,OAAI,CAACnF,MAAL,CAAY0E,cAAhB,EAAgC;kBAAA;;kBAC9B,OAAI,CAACpC,UAAL,CAAgB;oBACdqC,SAAS,EAAEQ,eAAF,aAAEA,eAAF,gDAAEA,eAAe,CAAEjI,SAAnB,oFAAE,sBAA4Bd,SAA9B,2DAAE,uBAAuCwI,UADpC;oBAEdC,aAAa,EAAEM,eAAe,CAACN,aAFjB;oBAGdC,UAAU,EAAEK,eAAe,CAACN,aAHd;oBAIdE,OAAO,EAAEI,eAAe,CAACJ,OAJX;oBAKdtC,SAAS,4BAAE0C,eAAe,CAACjI,SAAlB,qFAAE,uBAA2BrB,IAA7B,2DAAE,uBAAiCmJ;kBAL9B,CAAhB;gBAOD;cACF,CAVD;YAWD,CA5BD,MA6BK;cACHvI,qBAAYC,MAAZ,CAAmBmE,KAAnB,4IAA6J9F,OAA7J;YACD,CAjCuB,CAmCxB;;;YACA,OAAO,iBAAQiG,OAAR,CAAgBsD,cAAhB,CAAP;UACD,CAtCI,CAAP;QAuCD,CApEqB,CAsEtB;;;QACA,OAAO,iBAAQtD,OAAR,CAAgBjG,OAAhB,CAAP;MACD,CA7EI,CAAP;IA8ED;IAED;AACF;AACA;AACA;AACA;AACA;AACA;AACA;;;;;mGACE,iBAAoB+I,WAApB;QAAA;QAAA;QAAA;QAAA;QAAA;QAAA;QAAA;QAAA;QAAA;QAAA;QAAA;QAAA;QAAA;QAAA;;QAAA;UAAA;YAAA;cAAA;gBAAiCxF,IAAjC,2DAAwC,IAAxC;gBAA8CxD,qBAA9C,2DAAsE,KAAtE;gBACQC,OADR,GACkB,IAAIqK,gBAAJ,CACd;kBACEC,MAAM,EAAE,KAAK3L,KAAL,CAAW2B,QAAX,CAAoBC,MAApB,CAA2B+J,MADrC;kBAEEC,SAAS,EAAE,KAAK5L,KAAL,CAAW2B,QAAX,CAAoBC,MAApB,CAA2BC,GAFxC;kBAGEgK,KAAK,EAAE,KAAK7L,KAAL,CAAW2B,QAAX,CAAoBC,MAApB,CAA2BiK,KAHpC;kBAIEC,OAAO,EAAE,CAJX;kBAKEhK,KAAK,EAAE8C,IAAI,KAAKvB,qBAAT,GAAsB+G,WAAtB,GAAoC,IAL7C;kBAKmD;kBACjD2B,mBAAmB,EAAE,KAAKtF,WAN5B;kBAOE2D,WAAW,EAAXA,WAPF;kBAQE4B,eAAe,EAAEpH;gBARnB,CADc,EAWd;kBACE7E,MAAM,EAAE,KAAKC;gBADf,CAXc,CADlB;gBAiBE,KAAKG,iBAAL,CAAuBkG,GAAvB,CAA2BhF,OAA3B;gBAjBF;gBAoBI;gBACA;gBACA;gBACA;gBACI4K,WAxBR,GAwBsB,CAxBtB;;gBA0BI,IAAI7B,WAAW,CAAC/I,OAAhB,EAAyB;kBAChB6K,SADgB,GACH9B,WAAW,CAAC/I,OADT,CAChB6K,SADgB;kBAEjBC,aAFiB,GAED,IAAIC,IAAJ,CAASF,SAAT,CAFC;kBAGjBG,kBAHiB,GAGIF,aAAa,CAACG,OAAd,EAHJ;kBAIjBC,WAJiB,GAIHF,kBAAkB,GAAG,mBAJlB;kBAKjBG,cALiB,GAKAC,IAAI,CAACC,GAAL,CAASD,IAAI,CAACE,GAAL,CAASJ,WAAT,EAAsBK,4CAAtB,CAAT,EAAmE,CAAnE,CALA;kBAOvBX,WAAW,GAAGQ,IAAI,CAACI,KAAL,CAAWJ,IAAI,CAACK,MAAL,KAAgBN,cAA3B,CAAd;gBACD;;gBACKO,eAnCV,GAmC4B,CAAC,2BAAC3C,WAAW,CAAC1H,SAAb,kDAAC,sBAAuBsK,MAAxB,CAnC7B;gBAoCWrG,qBApCX,GAoCoC,KAAKL,MAAL,CAAYI,YApChD,CAoCWC,qBApCX;;gBAAA,MAsCQA,qBAAqB,IAAI,CAACoG,eAA1B,IAA6C3L,qBAA7C,IAAsE6K,WAAW,GAAG,CAtC5F;kBAAA;kBAAA;gBAAA;;gBAuCM5K,OAAO,CAAC4L,yBAAR,GAAoCC,UAAU,CAAC;kBAAA,OAAM7L,OAAO,CAAC8L,gBAAR,CAAyB,EAAzB,CAAN;gBAAA,CAAD,EAAqClB,WAArC,CAA9C;gBACA5K,OAAO,CAAC+L,gBAAR,CAAyB/K,SAAzB,EAAoC+H,WAApC;gBAxCN;gBAAA;;cAAA;gBAAA;gBAAA,OA2CY/I,OAAO,CAAC8L,gBAAR,CAAyB,EAAzB,CA3CZ;;cAAA;gBAAA;gBAAA;;cAAA;gBAAA;gBAAA;;gBA+CI,IAAI,EAAE,uBAAeE,qBAAjB,KAAkC,EAAE,uBAAeC,sBAAjB,CAAtC,EAAuE;kBACrE;kBACAvK,qBAAYC,MAAZ,CAAmBb,IAAnB,kFAAkGiI,WAAlG;;kBACArH,qBAAYC,MAAZ,CAAmBb,IAAnB,CAAwB,4FAAxB;gBACD;;gBACDY,qBAAYC,MAAZ,CAAmBuK,KAAnB;;cApDJ;gBAAA;;gBAuDI;gBACA;gBACA;gBACA,IAAI3I,IAAI,KAAKvB,qBAAb,EAAyB;kBACvB,IAAI,CAAChC,OAAO,CAACmM,MAAb,EAAqB;oBACnBnM,OAAO,CAACoM,SAAR,CAAkBrD,WAAlB;kBACD,CAHsB,CAKvB;;;kBACMsD,gBANiB,GAME5M,eAAa6M,mBAAb,CAAiC/I,IAAjC,CANF,EAQvB;kBACA;;kBACAL,sBAAQF,OAAR,CACE,IADF,EAEE;oBACEG,IAAI,EAAE,UADR;oBAEEC,QAAQ,EAAE;kBAFZ,CAFF,EAMEC,0BAAeC,aANjB,EAOE;oBACEtD,OAAO,EAAPA,OADF;oBAEEuD,IAAI,EAAE8I;kBAFR,CAPF;gBAYD;;gBAhFL;;cAAA;gBAAA,iCAmFSrM,OAnFT;;cAAA;cAAA;gBAAA;YAAA;UAAA;QAAA;MAAA,C;;;;;;;;IAwGA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;;;;WACE,0BAAiBuD,IAAjB,EAAuBgJ,KAAvB,EAA8B;MAC5B,OAAO,KAAKzN,iBAAL,CAAuBmB,QAAvB,CAAgCsD,IAAhC,EAAsCgJ,KAAtC,CAAP;IACD;IAED;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;WACE,0BAA6B;MAAA,IAAdjF,OAAc,uEAAJ,EAAI;MAC3B;MACA;MACA,OAAO,KAAKxI,iBAAL,CAAuB0N,MAAvB,CAA8BlF,OAA9B,CAAP;IACD;IAED;AACF;AACA;AACA;AACA;AACA;;;;WACE,wBAAe;MAAA;;MACb,OAAO,KAAK9I,OAAL,CAAaiO,iBAAb,GAAiCxK,IAAjC,CAAsC,UAACyK,UAAD,EAAgB;QAC3D,IAAMC,cAAc,GAAG,EAAvB;;QAEA,IAAID,UAAU,SAAV,IAAAA,UAAU,WAAV,IAAAA,UAAU,CAAEE,IAAZ,IAAoBF,UAAU,CAACE,IAAX,CAAgBxL,MAAhB,GAAyB,CAAjD,EAAoD;UAClDsL,UAAU,CAACE,IAAX,CAAgBC,OAAhB,CAAwB,UAACpM,KAAD,EAAW;YACjCkM,cAAc,CAACG,IAAf,CAAoBrM,KAAK,CAACD,GAA1B;;YACA,OAAI,CAACuD,gBAAL,CAAsB;cACpBtD,KAAK,EAALA,KADoB;cAEpBN,QAAQ,EAAEM,KAAK,CAACD;YAFI,CAAtB;UAID,CAND;QAOD;;QACD,IAAMuM,kBAAkB,GAAG,OAAI,CAACjO,iBAAL,CAAuB0N,MAAvB,EAA3B;;QAEA,IAAI,mBAAYO,kBAAZ,EAAgC3L,MAAhC,GAAyC,CAA7C,EAAgD;UAC9C;UACA;UACA,kCAAsB,qBAAc2L,kBAAd,CAAtB,oCAAyD;YAApD,IAAM/M,OAAO,qBAAb;;YACH,IAAI,CAAC2M,cAAc,CAACK,QAAf,CAAwBhN,OAAO,CAACG,QAAhC,CAAL,EAAgD;cAC9C;cACA,OAAI,CAAC+J,OAAL,CAAalK,OAAb,EAAsBiN,kCAAuBC,mBAA7C;YACD;UACF;QACF;MACF,CAxBM,CAAP;IAyBD;IAED;AACF;AACA;AACA;AACA;AACA;AACA;AACA;;;;WACE,gCAAuB;MACrB,OAAO,KAAKpO,iBAAL,CAAuB0N,MAAvB,CAA8B;QAACW,SAAS,EAAE;MAAZ,CAA9B,CAAP;IACD;IAED;AACF;AACA;AACA;;;;WACE,qBAAY;MACV,OAAOzL,qBAAY0L,GAAZ,EAAP;IACD;IAED;AACF;AACA;AACA;AACA;AACA;;;;WACE,uBAAc;MACZ,OAAOC,iBAAP;IACD;IAED;AACF;AACA;AACA;AACA;AACA;;;;WACE,yBAAgB;MACd,OAAOC,mBAAP;IACD;;;EAn3BmCC,sB"}
@@ -20,6 +20,8 @@ var BEHAVIORAL_METRICS = {
20
20
  CONNECTION_SUCCESS: 'js_sdk_connection_success',
21
21
  CONNECTION_FAILURE: 'js_sdk_connection_failures',
22
22
  MEETING_LEAVE_FAILURE: 'js_sdk_meeting_leave_failure',
23
+ MEETING_END_ALL_FAILURE: 'js_sdk_meeting_end_for_all_failure',
24
+ MEETING_END_ALL_INITIATED: 'js_sdk_meeting_end_for_all_initiated',
23
25
  GET_USER_MEDIA_FAILURE: 'js_sdk_get_user_media_failures',
24
26
  GET_DISPLAY_MEDIA_FAILURE: 'js_sdk_get_display_media_failures',
25
27
  JOIN_WITH_MEDIA_FAILURE: 'js_sdk_join_with_media_failures',
@@ -1 +1 @@
1
- {"version":3,"names":["BEHAVIORAL_METRICS","MEETINGS_REGISTRATION_FAILED","MEETINGS_REGISTRATION_SUCCESS","MERCURY_CONNECTION_FAILURE","MERCURY_CONNECTION_RESTORED","JOIN_SUCCESS","JOIN_FAILURE","ADD_MEDIA_SUCCESS","ADD_MEDIA_FAILURE","CONNECTION_SUCCESS","CONNECTION_FAILURE","MEETING_LEAVE_FAILURE","GET_USER_MEDIA_FAILURE","GET_DISPLAY_MEDIA_FAILURE","JOIN_WITH_MEDIA_FAILURE","DISCONNECT_DUE_TO_INACTIVITY","MEETING_MEDIA_INACTIVE","MEETING_RECONNECT_FAILURE","MEETING_MAX_REJOIN_FAILURE","MEETING_SHARE_FAILURE","MEETING_START_WHITEBOARD_SHARE_FAILURE","MEETING_STOP_WHITEBOARD_SHARE_FAILURE","MUTE_AUDIO_FAILURE","MUTE_VIDEO_FAILURE","SET_MEETING_QUALITY_FAILURE","STOP_FLOOR_REQUEST_FAILURE","ADD_DIAL_IN_FAILURE","ADD_DIAL_OUT_FAILURE","UPDATE_MEDIA_FAILURE","UNMUTE_AUDIO_FAILURE","UNMUTE_VIDEO_FAILURE","ROAP_ANSWER_FAILURE","ROAP_GLARE_CONDITION","PEERCONNECTION_FAILURE","INVALID_ICE_CANDIDATE","UPLOAD_LOGS_FAILURE","RECEIVE_TRANSCRIPTION_FAILURE"],"sources":["constants.js"],"sourcesContent":["\n// Metrics constants ----------------------------------------------------------\n\nconst BEHAVIORAL_METRICS = {\n MEETINGS_REGISTRATION_FAILED: 'js_sdk_meetings_registration_failed',\n MEETINGS_REGISTRATION_SUCCESS: 'js_sdk_meetings_registration_success',\n MERCURY_CONNECTION_FAILURE: 'js_sdk_mercury_connection_failure',\n MERCURY_CONNECTION_RESTORED: 'js_sdk_mercury_connection_restored',\n JOIN_SUCCESS: 'js_sdk_join_success',\n JOIN_FAILURE: 'js_sdk_join_failures',\n ADD_MEDIA_SUCCESS: 'js_sdk_add_media_success',\n ADD_MEDIA_FAILURE: 'js_sdk_add_media_failures',\n CONNECTION_SUCCESS: 'js_sdk_connection_success',\n CONNECTION_FAILURE: 'js_sdk_connection_failures',\n MEETING_LEAVE_FAILURE: 'js_sdk_meeting_leave_failure',\n GET_USER_MEDIA_FAILURE: 'js_sdk_get_user_media_failures',\n GET_DISPLAY_MEDIA_FAILURE: 'js_sdk_get_display_media_failures',\n JOIN_WITH_MEDIA_FAILURE: 'js_sdk_join_with_media_failures',\n\n DISCONNECT_DUE_TO_INACTIVITY: 'js_sdk_disconnect_due_to_inactivity',\n MEETING_MEDIA_INACTIVE: 'js_sdk_meeting_media_inactive',\n MEETING_RECONNECT_FAILURE: 'js_sdk_meeting_reconnect_failures',\n MEETING_MAX_REJOIN_FAILURE: 'js_sdk_meeting_max_rejoin_failure',\n MEETING_SHARE_FAILURE: 'js_sdk_meeting_share_failures',\n MEETING_START_WHITEBOARD_SHARE_FAILURE: 'js_sdk_meeting_start_whiteboard_share_failures',\n MEETING_STOP_WHITEBOARD_SHARE_FAILURE: 'js_sdk_meeting_stop_whiteboard_share_failures',\n MUTE_AUDIO_FAILURE: 'js_sdk_mute_audio_failures',\n MUTE_VIDEO_FAILURE: 'js_sdk_mute_video_failures',\n SET_MEETING_QUALITY_FAILURE: 'js_sdk_set_meeting_quality_failures',\n STOP_FLOOR_REQUEST_FAILURE: 'js_sdk_stop_floor_request_failures',\n ADD_DIAL_IN_FAILURE: 'js_sdk_add_dial_in_failure',\n ADD_DIAL_OUT_FAILURE: 'js_sdk_add_dial_out_failure',\n UPDATE_MEDIA_FAILURE: 'js_sdk_update_media_failures',\n UNMUTE_AUDIO_FAILURE: 'js_sdk_unmute_audio_failures',\n UNMUTE_VIDEO_FAILURE: 'js_sdk_unmute_video_failures',\n ROAP_ANSWER_FAILURE: 'js_sdk_roap_answer_failures',\n ROAP_GLARE_CONDITION: 'js_sdk_roap_glar_condition',\n PEERCONNECTION_FAILURE: 'js_sdk_peerConnection_failures',\n INVALID_ICE_CANDIDATE: 'js_sdk_invalid_ice_candidate',\n UPLOAD_LOGS_FAILURE: 'js_sdk_upload_logs_failure',\n RECEIVE_TRANSCRIPTION_FAILURE: 'js_sdk_receive_transcription_failure'\n};\n\n\nexport {BEHAVIORAL_METRICS as default};\n"],"mappings":";;;;;;;;;AACA;AAEA,IAAMA,kBAAkB,GAAG;EACzBC,4BAA4B,EAAE,qCADL;EAEzBC,6BAA6B,EAAE,sCAFN;EAGzBC,0BAA0B,EAAE,mCAHH;EAIzBC,2BAA2B,EAAE,oCAJJ;EAKzBC,YAAY,EAAE,qBALW;EAMzBC,YAAY,EAAE,sBANW;EAOzBC,iBAAiB,EAAE,0BAPM;EAQzBC,iBAAiB,EAAE,2BARM;EASzBC,kBAAkB,EAAE,2BATK;EAUzBC,kBAAkB,EAAE,4BAVK;EAWzBC,qBAAqB,EAAE,8BAXE;EAYzBC,sBAAsB,EAAE,gCAZC;EAazBC,yBAAyB,EAAE,mCAbF;EAczBC,uBAAuB,EAAE,iCAdA;EAgBzBC,4BAA4B,EAAE,qCAhBL;EAiBzBC,sBAAsB,EAAE,+BAjBC;EAkBzBC,yBAAyB,EAAE,mCAlBF;EAmBzBC,0BAA0B,EAAE,mCAnBH;EAoBzBC,qBAAqB,EAAE,+BApBE;EAqBzBC,sCAAsC,EAAE,gDArBf;EAsBzBC,qCAAqC,EAAE,+CAtBd;EAuBzBC,kBAAkB,EAAE,4BAvBK;EAwBzBC,kBAAkB,EAAE,4BAxBK;EAyBzBC,2BAA2B,EAAE,qCAzBJ;EA0BzBC,0BAA0B,EAAE,oCA1BH;EA2BzBC,mBAAmB,EAAE,4BA3BI;EA4BzBC,oBAAoB,EAAE,6BA5BG;EA6BzBC,oBAAoB,EAAE,8BA7BG;EA8BzBC,oBAAoB,EAAE,8BA9BG;EA+BzBC,oBAAoB,EAAE,8BA/BG;EAgCzBC,mBAAmB,EAAE,6BAhCI;EAiCzBC,oBAAoB,EAAE,4BAjCG;EAkCzBC,sBAAsB,EAAE,gCAlCC;EAmCzBC,qBAAqB,EAAE,8BAnCE;EAoCzBC,mBAAmB,EAAE,4BApCI;EAqCzBC,6BAA6B,EAAE;AArCN,CAA3B"}
1
+ {"version":3,"names":["BEHAVIORAL_METRICS","MEETINGS_REGISTRATION_FAILED","MEETINGS_REGISTRATION_SUCCESS","MERCURY_CONNECTION_FAILURE","MERCURY_CONNECTION_RESTORED","JOIN_SUCCESS","JOIN_FAILURE","ADD_MEDIA_SUCCESS","ADD_MEDIA_FAILURE","CONNECTION_SUCCESS","CONNECTION_FAILURE","MEETING_LEAVE_FAILURE","MEETING_END_ALL_FAILURE","MEETING_END_ALL_INITIATED","GET_USER_MEDIA_FAILURE","GET_DISPLAY_MEDIA_FAILURE","JOIN_WITH_MEDIA_FAILURE","DISCONNECT_DUE_TO_INACTIVITY","MEETING_MEDIA_INACTIVE","MEETING_RECONNECT_FAILURE","MEETING_MAX_REJOIN_FAILURE","MEETING_SHARE_FAILURE","MEETING_START_WHITEBOARD_SHARE_FAILURE","MEETING_STOP_WHITEBOARD_SHARE_FAILURE","MUTE_AUDIO_FAILURE","MUTE_VIDEO_FAILURE","SET_MEETING_QUALITY_FAILURE","STOP_FLOOR_REQUEST_FAILURE","ADD_DIAL_IN_FAILURE","ADD_DIAL_OUT_FAILURE","UPDATE_MEDIA_FAILURE","UNMUTE_AUDIO_FAILURE","UNMUTE_VIDEO_FAILURE","ROAP_ANSWER_FAILURE","ROAP_GLARE_CONDITION","PEERCONNECTION_FAILURE","INVALID_ICE_CANDIDATE","UPLOAD_LOGS_FAILURE","RECEIVE_TRANSCRIPTION_FAILURE"],"sources":["constants.js"],"sourcesContent":["\n// Metrics constants ----------------------------------------------------------\n\nconst BEHAVIORAL_METRICS = {\n MEETINGS_REGISTRATION_FAILED: 'js_sdk_meetings_registration_failed',\n MEETINGS_REGISTRATION_SUCCESS: 'js_sdk_meetings_registration_success',\n MERCURY_CONNECTION_FAILURE: 'js_sdk_mercury_connection_failure',\n MERCURY_CONNECTION_RESTORED: 'js_sdk_mercury_connection_restored',\n JOIN_SUCCESS: 'js_sdk_join_success',\n JOIN_FAILURE: 'js_sdk_join_failures',\n ADD_MEDIA_SUCCESS: 'js_sdk_add_media_success',\n ADD_MEDIA_FAILURE: 'js_sdk_add_media_failures',\n CONNECTION_SUCCESS: 'js_sdk_connection_success',\n CONNECTION_FAILURE: 'js_sdk_connection_failures',\n MEETING_LEAVE_FAILURE: 'js_sdk_meeting_leave_failure',\n MEETING_END_ALL_FAILURE: 'js_sdk_meeting_end_for_all_failure',\n MEETING_END_ALL_INITIATED: 'js_sdk_meeting_end_for_all_initiated',\n GET_USER_MEDIA_FAILURE: 'js_sdk_get_user_media_failures',\n GET_DISPLAY_MEDIA_FAILURE: 'js_sdk_get_display_media_failures',\n JOIN_WITH_MEDIA_FAILURE: 'js_sdk_join_with_media_failures',\n\n DISCONNECT_DUE_TO_INACTIVITY: 'js_sdk_disconnect_due_to_inactivity',\n MEETING_MEDIA_INACTIVE: 'js_sdk_meeting_media_inactive',\n MEETING_RECONNECT_FAILURE: 'js_sdk_meeting_reconnect_failures',\n MEETING_MAX_REJOIN_FAILURE: 'js_sdk_meeting_max_rejoin_failure',\n MEETING_SHARE_FAILURE: 'js_sdk_meeting_share_failures',\n MEETING_START_WHITEBOARD_SHARE_FAILURE: 'js_sdk_meeting_start_whiteboard_share_failures',\n MEETING_STOP_WHITEBOARD_SHARE_FAILURE: 'js_sdk_meeting_stop_whiteboard_share_failures',\n MUTE_AUDIO_FAILURE: 'js_sdk_mute_audio_failures',\n MUTE_VIDEO_FAILURE: 'js_sdk_mute_video_failures',\n SET_MEETING_QUALITY_FAILURE: 'js_sdk_set_meeting_quality_failures',\n STOP_FLOOR_REQUEST_FAILURE: 'js_sdk_stop_floor_request_failures',\n ADD_DIAL_IN_FAILURE: 'js_sdk_add_dial_in_failure',\n ADD_DIAL_OUT_FAILURE: 'js_sdk_add_dial_out_failure',\n UPDATE_MEDIA_FAILURE: 'js_sdk_update_media_failures',\n UNMUTE_AUDIO_FAILURE: 'js_sdk_unmute_audio_failures',\n UNMUTE_VIDEO_FAILURE: 'js_sdk_unmute_video_failures',\n ROAP_ANSWER_FAILURE: 'js_sdk_roap_answer_failures',\n ROAP_GLARE_CONDITION: 'js_sdk_roap_glar_condition',\n PEERCONNECTION_FAILURE: 'js_sdk_peerConnection_failures',\n INVALID_ICE_CANDIDATE: 'js_sdk_invalid_ice_candidate',\n UPLOAD_LOGS_FAILURE: 'js_sdk_upload_logs_failure',\n RECEIVE_TRANSCRIPTION_FAILURE: 'js_sdk_receive_transcription_failure'\n};\n\n\nexport {BEHAVIORAL_METRICS as default};\n"],"mappings":";;;;;;;;;AACA;AAEA,IAAMA,kBAAkB,GAAG;EACzBC,4BAA4B,EAAE,qCADL;EAEzBC,6BAA6B,EAAE,sCAFN;EAGzBC,0BAA0B,EAAE,mCAHH;EAIzBC,2BAA2B,EAAE,oCAJJ;EAKzBC,YAAY,EAAE,qBALW;EAMzBC,YAAY,EAAE,sBANW;EAOzBC,iBAAiB,EAAE,0BAPM;EAQzBC,iBAAiB,EAAE,2BARM;EASzBC,kBAAkB,EAAE,2BATK;EAUzBC,kBAAkB,EAAE,4BAVK;EAWzBC,qBAAqB,EAAE,8BAXE;EAYzBC,uBAAuB,EAAE,oCAZA;EAazBC,yBAAyB,EAAE,sCAbF;EAczBC,sBAAsB,EAAE,gCAdC;EAezBC,yBAAyB,EAAE,mCAfF;EAgBzBC,uBAAuB,EAAE,iCAhBA;EAkBzBC,4BAA4B,EAAE,qCAlBL;EAmBzBC,sBAAsB,EAAE,+BAnBC;EAoBzBC,yBAAyB,EAAE,mCApBF;EAqBzBC,0BAA0B,EAAE,mCArBH;EAsBzBC,qBAAqB,EAAE,+BAtBE;EAuBzBC,sCAAsC,EAAE,gDAvBf;EAwBzBC,qCAAqC,EAAE,+CAxBd;EAyBzBC,kBAAkB,EAAE,4BAzBK;EA0BzBC,kBAAkB,EAAE,4BA1BK;EA2BzBC,2BAA2B,EAAE,qCA3BJ;EA4BzBC,0BAA0B,EAAE,oCA5BH;EA6BzBC,mBAAmB,EAAE,4BA7BI;EA8BzBC,oBAAoB,EAAE,6BA9BG;EA+BzBC,oBAAoB,EAAE,8BA/BG;EAgCzBC,oBAAoB,EAAE,8BAhCG;EAiCzBC,oBAAoB,EAAE,8BAjCG;EAkCzBC,mBAAmB,EAAE,6BAlCI;EAmCzBC,oBAAoB,EAAE,4BAnCG;EAoCzBC,sBAAsB,EAAE,gCApCC;EAqCzBC,qBAAqB,EAAE,8BArCE;EAsCzBC,mBAAmB,EAAE,4BAtCI;EAuCzBC,6BAA6B,EAAE;AAvCN,CAA3B"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@webex/plugin-meetings",
3
- "version": "1.161.0",
3
+ "version": "2.2.0",
4
4
  "description": "",
5
5
  "license": "MIT",
6
6
  "contributors": [
@@ -24,19 +24,19 @@
24
24
  },
25
25
  "dependencies": {
26
26
  "@babel/runtime-corejs2": "^7.14.8",
27
- "@webex/webex-core": "1.161.0",
28
- "@webex/internal-plugin-mercury": "1.161.0",
29
- "@webex/internal-plugin-conversation": "1.161.0",
27
+ "@webex/webex-core": "2.2.0",
28
+ "@webex/internal-plugin-mercury": "2.2.0",
29
+ "@webex/internal-plugin-conversation": "2.2.0",
30
30
  "webrtc-adapter": "^7.7.0",
31
31
  "lodash": "^4.17.21",
32
32
  "uuid": "^3.3.2",
33
33
  "global": "^4.4.0",
34
34
  "ip-anonymize": "^0.1.0",
35
- "@webex/common": "1.161.0",
35
+ "@webex/common": "2.2.0",
36
36
  "bowser": "^2.11.0",
37
37
  "sdp-transform": "^2.12.0",
38
38
  "readable-stream": "^3.6.0",
39
- "@webex/common-timers": "1.161.0",
39
+ "@webex/common-timers": "2.2.0",
40
40
  "btoa": "^1.2.1",
41
41
  "javascript-state-machine": "^3.1.0",
42
42
  "envify": "^4.1.0"
package/src/constants.js CHANGED
@@ -39,7 +39,9 @@ export const LIVE = 'live';
39
39
  export const LOCAL = 'local';
40
40
  export const LOCI = 'loci';
41
41
  export const LOCUS_URL = 'locusUrl';
42
+ export const END = 'end';
42
43
 
44
+ export const MAX_RANDOM_DELAY_FOR_MEETING_INFO = 3 * 60 * 1000;
43
45
  export const MEETINGINFO = 'meetingInfo';
44
46
  export const MEET = 'meet';
45
47
  export const MEET_M = 'm';
@@ -436,11 +438,13 @@ export const EVENT_TRIGGERS = {
436
438
  MEETING_RECONNECTION_FAILURE: 'meeting:reconnectionFailure',
437
439
  MEETING_UNLOCKED: 'meeting:unlocked',
438
440
  MEETING_LOCKED: 'meeting:locked',
441
+ MEETING_INFO_AVAILABLE: 'meeting:meetingInfoAvailable',
439
442
  MEETING_LOG_UPLOAD_SUCCESS: 'meeting:logUpload:success',
440
443
  MEETING_LOG_UPLOAD_FAILURE: 'meeting:logUpload:failure',
441
444
  MEETING_ACTIONS_UPDATE: 'meeting:actionsUpdate',
442
445
  MEETING_STATE_CHANGE: 'meeting:stateChange',
443
446
  MEETING_HIGH_PACKETLOSS: 'meeting:highPacketLoss',
447
+ MEETING_MEETING_CONTAINER_UPDATE: 'meeting:meetingContainer:update',
444
448
  MEDIA_QUALITY: 'media:quality',
445
449
  MEETINGS_NETWORK_DISCONNECTED: 'network:disconnected',
446
450
  MEETINGS_NETWORK_CONNECTED: 'network:connected',
@@ -638,6 +642,7 @@ export const LOCUS = {
638
642
  export const LOCUSINFO = {
639
643
  EVENTS: {
640
644
  CONTROLS_RECORDING_UPDATED: 'CONTROLS_RECORDING_UPDATED',
645
+ CONTROLS_MEETING_CONTAINER_UPDATED: 'CONTROLS_MEETING_CONTAINER_UPDATED',
641
646
  SELF_UNADMITTED_GUEST: 'SELF_UNADMITTED_GUEST',
642
647
  SELF_ADMITTED_GUEST: 'SELF_ADMITTED_GUEST',
643
648
  SELF_REMOTE_MUTE_STATUS_UPDATED: 'SELF_REMOTE_MUTE_STATUS_UPDATED',
@@ -845,6 +850,7 @@ export const MEETING_STATE_MACHINE = {
845
850
  JOIN: 'join',
846
851
  DECLINE: 'decline',
847
852
  LEAVE: 'leave',
853
+ END: 'end',
848
854
  RESET: 'reset'
849
855
  },
850
856
  STATES: {
@@ -29,6 +29,12 @@ ControlsUtils.parse = (controls) => {
29
29
  };
30
30
  }
31
31
 
32
+ if (controls && controls.meetingContainer) {
33
+ parsedControls.meetingContainer = {
34
+ meetingContainerUrl: controls.meetingContainer.meetingContainerUrl
35
+ };
36
+ }
37
+
32
38
  return parsedControls;
33
39
  };
34
40
 
@@ -52,7 +58,11 @@ ControlsUtils.getControls = (oldControls, newControls) => {
52
58
 
53
59
  hasRecordingChanged: current?.record &&
54
60
  !isEqual(previous?.record?.recording, current?.record?.recording) && // upon first join, previous?.record?.recording = undefined; thus, never going to be equal and will always return true
55
- (previous?.record?.recording || current?.record?.recording) // therefore, condition added to prevent false firings of #meeting:recording:stopped upon first joining a meeting
61
+ (previous?.record?.recording || current?.record?.recording), // therefore, condition added to prevent false firings of #meeting:recording:stopped upon first joining a meeting
62
+
63
+ hasMeetingContainerChanged: current?.meetingContainer &&
64
+ !isEqual(previous?.meetingContainer?.meetingContainerUrl,
65
+ current?.meetingContainer?.meetingContainerUrl),
56
66
  }
57
67
  };
58
68
  };
@@ -613,7 +613,14 @@ export default class LocusInfo extends EventsScope {
613
613
  updateControls(controls) {
614
614
  if (controls && !isEqual(this.controls, controls)) {
615
615
  this.parsedLocus.controls = ControlsUtils.parse(controls);
616
- const {updates: {hasRecordingChanged, hasRecordingPausedChanged}, current} = ControlsUtils.getControls(this.controls, controls);
616
+ const {
617
+ updates: {
618
+ hasRecordingChanged,
619
+ hasRecordingPausedChanged,
620
+ hasMeetingContainerChanged,
621
+ },
622
+ current
623
+ } = ControlsUtils.getControls(this.controls, controls);
617
624
 
618
625
  if (hasRecordingChanged || hasRecordingPausedChanged) {
619
626
  let state = null;
@@ -645,6 +652,21 @@ export default class LocusInfo extends EventsScope {
645
652
  );
646
653
  }
647
654
 
655
+ if (hasMeetingContainerChanged) {
656
+ const {meetingContainerUrl} = current.meetingContainer;
657
+
658
+ this.emitScoped(
659
+ {
660
+ file: 'locus-info',
661
+ function: 'updateControls'
662
+ },
663
+ LOCUSINFO.EVENTS.CONTROLS_MEETING_CONTAINER_UPDATED,
664
+ {
665
+ meetingContainerUrl
666
+ }
667
+ );
668
+ }
669
+
648
670
  this.controls = controls;
649
671
  }
650
672
  }