@webex/plugin-meetings 3.0.0-beta.143 → 3.0.0-beta.144

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.
@@ -186,7 +186,7 @@ var Breakout = _webexCore.WebexPlugin.extend({
186
186
  sessionId: this.sessionId
187
187
  });
188
188
  },
189
- version: "3.0.0-beta.143"
189
+ version: "3.0.0-beta.144"
190
190
  });
191
191
  var _default = Breakout;
192
192
  exports.default = _default;
@@ -1005,7 +1005,7 @@ var Breakouts = _webexCore.WebexPlugin.extend({
1005
1005
  this.trigger(_constants.BREAKOUTS.EVENTS.ASK_RETURN_TO_MAIN);
1006
1006
  }
1007
1007
  },
1008
- version: "3.0.0-beta.143"
1008
+ version: "3.0.0-beta.144"
1009
1009
  });
1010
1010
  var _default = Breakouts;
1011
1011
  exports.default = _default;
@@ -2,19 +2,23 @@
2
2
 
3
3
  var _typeof = require("@babel/runtime-corejs2/helpers/typeof");
4
4
  var _Reflect$construct = require("@babel/runtime-corejs2/core-js/reflect/construct");
5
- var _WeakMap = require("@babel/runtime-corejs2/core-js/weak-map");
6
- var _Object$defineProperty = require("@babel/runtime-corejs2/core-js/object/define-property");
5
+ var _Object$keys2 = require("@babel/runtime-corejs2/core-js/object/keys");
6
+ var _Object$getOwnPropertySymbols = require("@babel/runtime-corejs2/core-js/object/get-own-property-symbols");
7
7
  var _Object$getOwnPropertyDescriptor = require("@babel/runtime-corejs2/core-js/object/get-own-property-descriptor");
8
+ var _Object$getOwnPropertyDescriptors = require("@babel/runtime-corejs2/core-js/object/get-own-property-descriptors");
9
+ var _Object$defineProperties = require("@babel/runtime-corejs2/core-js/object/define-properties");
10
+ var _Object$defineProperty = require("@babel/runtime-corejs2/core-js/object/define-property");
11
+ var _WeakMap = require("@babel/runtime-corejs2/core-js/weak-map");
8
12
  var _interopRequireDefault = require("@babel/runtime-corejs2/helpers/interopRequireDefault");
9
13
  _Object$defineProperty(exports, "__esModule", {
10
14
  value: true
11
15
  });
12
16
  exports.default = void 0;
13
- var _regenerator = _interopRequireDefault(require("@babel/runtime-corejs2/regenerator"));
14
17
  var _promise = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/promise"));
15
18
  var _now = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/date/now"));
16
19
  var _keys = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/object/keys"));
17
20
  var _values = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/object/values"));
21
+ var _regenerator = _interopRequireDefault(require("@babel/runtime-corejs2/regenerator"));
18
22
  var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/toConsumableArray"));
19
23
  var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/asyncToGenerator"));
20
24
  var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/assertThisInitialized"));
@@ -54,6 +58,8 @@ var _util2 = _interopRequireDefault(require("./util"));
54
58
  var _permission = _interopRequireDefault(require("../common/errors/permission"));
55
59
  function _getRequireWildcardCache(nodeInterop) { if (typeof _WeakMap !== "function") return null; var cacheBabelInterop = new _WeakMap(); var cacheNodeInterop = new _WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
56
60
  function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = _Object$defineProperty && _Object$getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? _Object$getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { _Object$defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
61
+ function ownKeys(object, enumerableOnly) { var keys = _Object$keys2(object); if (_Object$getOwnPropertySymbols) { var symbols = _Object$getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return _Object$getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
62
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }) : _Object$getOwnPropertyDescriptors ? _Object$defineProperties(target, _Object$getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { _Object$defineProperty(target, key, _Object$getOwnPropertyDescriptor(source, key)); }); } return target; }
57
63
  function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2.default)(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2.default)(this).constructor; result = _Reflect$construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2.default)(this, result); }; }
58
64
  function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !_Reflect$construct) return false; if (_Reflect$construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(_Reflect$construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
59
65
  var mediaLogger;
@@ -186,6 +192,48 @@ var Meetings = /*#__PURE__*/function (_WebexPlugin) {
186
192
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "mediaHelpers", void 0);
187
193
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "breakoutLocusForHandleLater", void 0);
188
194
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "namespace", _constants.MEETINGS);
195
+ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "createNoiseReductionEffect", /*#__PURE__*/function () {
196
+ var _ref = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(options) {
197
+ var authToken;
198
+ return _regenerator.default.wrap(function _callee$(_context) {
199
+ while (1) switch (_context.prev = _context.next) {
200
+ case 0:
201
+ // @ts-ignore
202
+ authToken = _this.webex.credentials.supertoken.access_token;
203
+ return _context.abrupt("return", new mediaHelpersModule.NoiseReductionEffect(_objectSpread({
204
+ authToken: authToken
205
+ }, options)));
206
+ case 2:
207
+ case "end":
208
+ return _context.stop();
209
+ }
210
+ }, _callee);
211
+ }));
212
+ return function (_x) {
213
+ return _ref.apply(this, arguments);
214
+ };
215
+ }());
216
+ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "createVirtualBackgroundEffect", /*#__PURE__*/function () {
217
+ var _ref2 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee2(options) {
218
+ var authToken;
219
+ return _regenerator.default.wrap(function _callee2$(_context2) {
220
+ while (1) switch (_context2.prev = _context2.next) {
221
+ case 0:
222
+ // @ts-ignore
223
+ authToken = _this.webex.credentials.supertoken.access_token;
224
+ return _context2.abrupt("return", new mediaHelpersModule.VirtualBackgroundEffect(_objectSpread({
225
+ authToken: authToken
226
+ }, options)));
227
+ case 2:
228
+ case "end":
229
+ return _context2.stop();
230
+ }
231
+ }, _callee2);
232
+ }));
233
+ return function (_x2) {
234
+ return _ref2.apply(this, arguments);
235
+ };
236
+ }());
189
237
  _this.mediaHelpers = mediaHelpersModule;
190
238
 
191
239
  /**
@@ -750,6 +798,17 @@ var Meetings = /*#__PURE__*/function (_WebexPlugin) {
750
798
  );
751
799
  }
752
800
 
801
+ /**
802
+ * Creates a noise reduction effect
803
+ *
804
+ * @param {INoiseReductionEffect} options optional custom effect options
805
+ * @returns {Promise<effect>} noise reduction effect.
806
+ * @public
807
+ * @memberof Meetings
808
+ */
809
+ }, {
810
+ key: "uploadLogs",
811
+ value:
753
812
  /**
754
813
  * Uploads logs to the webex services for tracking
755
814
  * @param {Object} [options={}]
@@ -762,9 +821,7 @@ var Meetings = /*#__PURE__*/function (_WebexPlugin) {
762
821
  * @param {String} [options.orgId] org id
763
822
  * @returns {String} feedback ID logs were submitted under
764
823
  */
765
- }, {
766
- key: "uploadLogs",
767
- value: function uploadLogs() {
824
+ function uploadLogs() {
768
825
  var _this7 = this;
769
826
  var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
770
827
  _loggerProxy.default.logger.info('Meetings:index#uploadLogs --> uploading logs');
@@ -1036,7 +1093,7 @@ var Meetings = /*#__PURE__*/function (_WebexPlugin) {
1036
1093
  }, {
1037
1094
  key: "createMeeting",
1038
1095
  value: function () {
1039
- var _createMeeting = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(destination) {
1096
+ var _createMeeting = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee3(destination) {
1040
1097
  var type,
1041
1098
  useRandomDelayForInfo,
1042
1099
  infoExtraParams,
@@ -1051,13 +1108,13 @@ var Meetings = /*#__PURE__*/function (_WebexPlugin) {
1051
1108
  isMeetingActive,
1052
1109
  enableUnifiedMeetings,
1053
1110
  meetingAddedType,
1054
- _args = arguments;
1055
- return _regenerator.default.wrap(function _callee$(_context) {
1056
- while (1) switch (_context.prev = _context.next) {
1111
+ _args3 = arguments;
1112
+ return _regenerator.default.wrap(function _callee3$(_context3) {
1113
+ while (1) switch (_context3.prev = _context3.next) {
1057
1114
  case 0:
1058
- type = _args.length > 1 && _args[1] !== undefined ? _args[1] : null;
1059
- useRandomDelayForInfo = _args.length > 2 && _args[2] !== undefined ? _args[2] : false;
1060
- infoExtraParams = _args.length > 3 && _args[3] !== undefined ? _args[3] : {};
1115
+ type = _args3.length > 1 && _args3[1] !== undefined ? _args3[1] : null;
1116
+ useRandomDelayForInfo = _args3.length > 2 && _args3[2] !== undefined ? _args3[2] : false;
1117
+ infoExtraParams = _args3.length > 3 && _args3[3] !== undefined ? _args3[3] : {};
1061
1118
  meeting = new _meeting.default({
1062
1119
  // @ts-ignore
1063
1120
  userId: this.webex.internal.device.userId,
@@ -1075,7 +1132,7 @@ var Meetings = /*#__PURE__*/function (_WebexPlugin) {
1075
1132
  parent: this.webex
1076
1133
  });
1077
1134
  this.meetingCollection.set(meeting);
1078
- _context.prev = 5;
1135
+ _context3.prev = 5;
1079
1136
  // if no participant has joined the scheduled meeting (meaning meeting is not active) and we get a locusEvent,
1080
1137
  // it means the meeting will start in 5-6 min. In that case, we want to fetchMeetingInfo
1081
1138
  // between 5 and 2 min (random between 3 minutes) before the meeting starts
@@ -1092,7 +1149,7 @@ var Meetings = /*#__PURE__*/function (_WebexPlugin) {
1092
1149
  isMeetingActive = !!((_destination$fullStat = destination.fullState) !== null && _destination$fullStat !== void 0 && _destination$fullStat.active); // @ts-ignore
1093
1150
  enableUnifiedMeetings = this.config.experimental.enableUnifiedMeetings;
1094
1151
  if (!(enableUnifiedMeetings && !isMeetingActive && useRandomDelayForInfo && waitingTime > 0)) {
1095
- _context.next = 15;
1152
+ _context3.next = 15;
1096
1153
  break;
1097
1154
  }
1098
1155
  meeting.fetchMeetingInfoTimeoutId = setTimeout(function () {
@@ -1101,27 +1158,27 @@ var Meetings = /*#__PURE__*/function (_WebexPlugin) {
1101
1158
  });
1102
1159
  }, waitingTime);
1103
1160
  meeting.parseMeetingInfo(undefined, destination);
1104
- _context.next = 17;
1161
+ _context3.next = 17;
1105
1162
  break;
1106
1163
  case 15:
1107
- _context.next = 17;
1164
+ _context3.next = 17;
1108
1165
  return meeting.fetchMeetingInfo({
1109
1166
  extraParams: infoExtraParams
1110
1167
  });
1111
1168
  case 17:
1112
- _context.next = 23;
1169
+ _context3.next = 23;
1113
1170
  break;
1114
1171
  case 19:
1115
- _context.prev = 19;
1116
- _context.t0 = _context["catch"](5);
1117
- if (!(_context.t0 instanceof _captchaError.default) && !(_context.t0 instanceof _passwordError.default) && !(_context.t0 instanceof _permission.default)) {
1172
+ _context3.prev = 19;
1173
+ _context3.t0 = _context3["catch"](5);
1174
+ if (!(_context3.t0 instanceof _captchaError.default) && !(_context3.t0 instanceof _passwordError.default) && !(_context3.t0 instanceof _permission.default)) {
1118
1175
  // if there is no meeting info we assume its a 1:1 call or wireless share
1119
1176
  _loggerProxy.default.logger.info("Meetings:index#createMeeting --> Info Unable to fetch meeting info for ".concat(destination, "."));
1120
1177
  _loggerProxy.default.logger.info('Meetings:index#createMeeting --> Info assuming this destination is a 1:1 or wireless share');
1121
1178
  }
1122
- _loggerProxy.default.logger.debug("Meetings:index#createMeeting --> Debug ".concat(_context.t0, " fetching /meetingInfo for creation."));
1179
+ _loggerProxy.default.logger.debug("Meetings:index#createMeeting --> Debug ".concat(_context3.t0, " fetching /meetingInfo for creation."));
1123
1180
  case 23:
1124
- _context.prev = 23;
1181
+ _context3.prev = 23;
1125
1182
  // For type LOCUS_ID we need to parse the locus object to get the information
1126
1183
  // about the caller and callee
1127
1184
  // Meeting Added event will be created in `handleLocusEvent`
@@ -1141,16 +1198,16 @@ var Meetings = /*#__PURE__*/function (_WebexPlugin) {
1141
1198
  type: meetingAddedType
1142
1199
  });
1143
1200
  }
1144
- return _context.finish(23);
1201
+ return _context3.finish(23);
1145
1202
  case 26:
1146
- return _context.abrupt("return", meeting);
1203
+ return _context3.abrupt("return", meeting);
1147
1204
  case 27:
1148
1205
  case "end":
1149
- return _context.stop();
1206
+ return _context3.stop();
1150
1207
  }
1151
- }, _callee, this, [[5, 19, 23, 26]]);
1208
+ }, _callee3, this, [[5, 19, 23, 26]]);
1152
1209
  }));
1153
- function createMeeting(_x) {
1210
+ function createMeeting(_x3) {
1154
1211
  return _createMeeting.apply(this, arguments);
1155
1212
  }
1156
1213
  return createMeeting;
@@ -1 +1 @@
1
- {"version":3,"names":["mediaLogger","MediaLogger","LoggerProxy","logger","info","log","error","warn","trace","debug","Meetings","args","MEETINGS","mediaHelpers","mediaHelpersModule","request","Request","parent","webex","loggerRequest","LoggerRequest","meetingCollection","MeetingCollection","personalMeetingRoom","reachability","registered","preferredWebexSite","media","getUserMedia","Media","getSupportedDevice","onReady","meeting","newLocus","breakoutUrl","controls","breakout","url","breakoutLocus","getActiveBreakoutLocus","isSelfJoined","self","state","_JOINED_","isSelfMoved","_LEFT_","reason","_MOVED_","deviceFromNewLocus","MeetingsUtil","getThisDevice","internal","device","isNewLocusJoinThisDevice","joinedOnThisDevice","isBreakoutLocusJoinThisDevice","joinedWith","correlationId","breakoutReplaceAt","replaces","length","replaceAt","newLocusReplaceAt","removed","isNewLocusAsBreakout","isBreakoutLocusDTO","fullState","active","isNeedHandleMainLocus","data","getByKey","LOCUS_URL","locusUrl","CORRELATION_ID","checkForCorrelationId","locus","SIP_URI","callbackInfo","callbackAddress","isUnifiedSpaceMeeting","undefined","CONVERSATION_URL","conversationUrl","MEETINGNUMBER","webExMeetingId","useRandomDelayForInfo","getCorrespondingMeetingByLocus","locusInfo","updateMainSessionLocusCache","isNeedHandleLocusDTO","LOCUS","STATE","INACTIVE","create","_LOCUS_ID_","then","newMeeting","initialSetup","checkHandleBreakoutLocus","catch","e","finally","getMeetingByType","_ID_","id","Metrics","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","setLogger","meetingInfo","experimental","enableUnifiedMeetings","MeetingInfoV2","MeetingInfo","PersonalMeetingRoom","MEETINGS_READY","checkH264Support","disableNotifications","changeState","enable","enableTurnDiscovery","enableAdhocMeetings","canAuthorize","reject","Error","resolve","all","fetchUserPreferredWebexSite","getGeoHint","startReachability","message","register","connect","call","listenForEvents","MEETINGS_REGISTERED","sendBehavioralMetric","BEHAVIORAL_METRICS","MEETINGS_REGISTRATION_SUCCESS","MEETINGS_REGISTRATION_FAILED","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","getMeetingPreferences","parseDefaultSiteFromMeetingPreferences","user","get","userPreferences","userPreferencesItems","preferredWebExSite","MeetingUtil","cleanUp","delete","MEETING_REMOVED","destination","infoExtraParams","fetchInfoOptions","targetDest","_CONVERSATION_URL_","foundMeeting","foundMeetingIsNotCalendarMeeting","scheduledMeeting","createMeeting","createdMeeting","EVENTS","DESTROY_MEETING","payload","autoUploadLogs","callStart","lastActive","feedbackId","locusId","destroy","REQUEST_UPLOAD_LOGS","meetingInstance","Meeting","userId","deviceUrl","orgId","meetingInfoProvider","destinationType","waitingTime","startTime","startTimeDate","Date","startTimeDatestamp","getTime","timeToStart","maxWaitingTime","Math","max","min","MAX_RANDOM_DELAY_FOR_MEETING_INFO","round","random","isMeetingActive","fetchMeetingInfoTimeoutId","setTimeout","fetchMeetingInfo","extraParams","parseMeetingInfo","CaptchaError","PasswordError","PermissionError","sipUri","setSipUri","meetingAddedType","getMeetingAddedType","value","getAll","getActiveMeetings","locusArray","activeLocusUrl","loci","lociToUpdate","sortLocusArrayToUpdate","forEach","push","meetingsCollection","includes","MEETING_REMOVED_REASON","NO_MEETINGS_TO_SYNC","mainLoci","filter","breakoutLoci","isValidBreakoutLocus","breakoutLocusForHandleLater","associateMainLocus","find","mainLocus","existCorrespondingMeeting","newCreatedLocus","existIndex","findIndex","associateBreakoutLocus","splice","scheduled","WebexPlugin"],"sources":["index.ts"],"sourcesContent":["/* eslint no-shadow: [\"error\", { \"allow\": [\"eventType\"] }] */\n\nimport '@webex/internal-plugin-mercury';\nimport '@webex/internal-plugin-conversation';\n// @ts-ignore\nimport {WebexPlugin} from '@webex/webex-core';\nimport {setLogger} from '@webex/internal-media-core';\n\nimport * as mediaHelpersModule from '@webex/media-helpers';\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 MEETINGNUMBER,\n _JOINED_,\n _MOVED_,\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 './request';\nimport PasswordError from '../common/errors/password-error';\nimport CaptchaError from '../common/errors/captcha-error';\n\nimport MeetingCollection from './collection';\nimport MeetingsUtil from './util';\nimport PermissionError from '../common/errors/permission';\n\nlet mediaLogger;\n\nclass MediaLogger {\n info(...args) {\n LoggerProxy.logger.info(...args);\n }\n\n log(...args) {\n LoggerProxy.logger.log(...args);\n }\n\n error(...args) {\n LoggerProxy.logger.error(...args);\n }\n\n warn(...args) {\n LoggerProxy.logger.warn(...args);\n }\n\n trace(...args) {\n LoggerProxy.logger.trace(...args);\n }\n\n debug(...args) {\n LoggerProxy.logger.debug(...args);\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 loggerRequest: any;\n media: any;\n meetingCollection: any;\n personalMeetingRoom: any;\n preferredWebexSite: any;\n reachability: any;\n registered: any;\n request: any;\n geoHintInfo: any;\n meetingInfo: any;\n mediaHelpers: any;\n breakoutLocusForHandleLater: any;\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 webrtc-core media helpers. This is a temporary solution required for the SDK sample app\n * to be able to call media helper functions.\n *\n * @instance\n * @type {Object}\n * @private\n * @memberof Meetings\n */\n this.mediaHelpers = mediaHelpersModule;\n\n /**\n * The Meetings request to interact with server\n * @instance\n * @type {Object}\n * @private\n * @memberof Meetings\n */\n // @ts-ignore\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 // @ts-ignore\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 }\n\n /**\n * check whether you need to handle this main session's locus data or not\n * @param {Object} meeting current meeting data\n * @param {Object} newLocus new locus data\n * @returns {boolean}\n * @private\n * @memberof Meetings\n */\n private isNeedHandleMainLocus(meeting: any, newLocus: any) {\n const breakoutUrl = newLocus.controls?.breakout?.url;\n const breakoutLocus = this.meetingCollection.getActiveBreakoutLocus(breakoutUrl);\n\n const isSelfJoined = newLocus?.self?.state === _JOINED_;\n const isSelfMoved = newLocus?.self?.state === _LEFT_ && newLocus?.self?.reason === _MOVED_;\n // @ts-ignore\n const deviceFromNewLocus = MeetingsUtil.getThisDevice(newLocus, this.webex.internal.device.url);\n const isNewLocusJoinThisDevice = MeetingsUtil.joinedOnThisDevice(\n meeting,\n newLocus,\n // @ts-ignore\n this.webex.internal.device.url\n );\n const isBreakoutLocusJoinThisDevice =\n breakoutLocus?.joinedWith?.correlationId &&\n breakoutLocus.joinedWith.correlationId === meeting?.correlationId;\n\n if (isSelfJoined && isNewLocusJoinThisDevice) {\n LoggerProxy.logger.log(\n 'Meetings:index#isNeedHandleMainLocus --> self this device shown as JOINED in the main session'\n );\n if (breakoutLocus?.joinedWith && deviceFromNewLocus) {\n const breakoutReplaceAt =\n breakoutLocus.joinedWith.replaces?.length > 0\n ? breakoutLocus.joinedWith.replaces[0].replaceAt\n : '';\n const newLocusReplaceAt =\n deviceFromNewLocus.replaces?.length > 0 ? deviceFromNewLocus.replaces[0].replaceAt : '';\n if (breakoutReplaceAt && newLocusReplaceAt && breakoutReplaceAt > newLocusReplaceAt) {\n LoggerProxy.logger.log(\n `Meetings:index#isNeedHandleMainLocus --> this is expired main joined status locus_dto replacedAt ${newLocusReplaceAt} bo replacedAt ${breakoutReplaceAt}`\n );\n\n return false;\n }\n }\n\n return true;\n }\n if (isBreakoutLocusJoinThisDevice) {\n LoggerProxy.logger.log(\n `Meetings:index#isNeedHandleMainLocus --> there is active breakout session and joined on this device, and don't need to handle main session: ${breakoutUrl}`\n );\n\n return false;\n }\n if (isSelfMoved && newLocus?.self?.removed) {\n LoggerProxy.logger.log(\n 'Meetings:index#isNeedHandleMainLocus --> self moved main locus with self removed status, not need to handle'\n );\n\n return false;\n }\n LoggerProxy.logger.log(\n 'Meetings:index#isNeedHandleMainLocus --> this is a normal main session locusDTO update case'\n );\n\n return true;\n }\n\n /**\n * check whether you need to handle this locus data or not\n * @param {Object} meeting old locus data\n * @param {Object} newLocus new locus data\n * @returns {boolean}\n * @private\n * @memberof Meetings\n */\n private isNeedHandleLocusDTO(meeting: any, newLocus: any) {\n if (newLocus) {\n const isNewLocusAsBreakout = MeetingsUtil.isBreakoutLocusDTO(newLocus);\n const isSelfMoved = newLocus?.self?.state === _LEFT_ && newLocus?.self?.reason === _MOVED_;\n if (!meeting) {\n if (isNewLocusAsBreakout) {\n LoggerProxy.logger.log(\n `Meetings:index#isNeedHandleLocusDTO --> the first breakout session locusDTO active status: ${newLocus.fullState?.active}`\n );\n\n return newLocus.self?.state === _JOINED_;\n }\n\n return this.isNeedHandleMainLocus(meeting, newLocus);\n }\n if (!isNewLocusAsBreakout) {\n return this.isNeedHandleMainLocus(meeting, newLocus);\n }\n\n return !isSelfMoved;\n }\n\n return true;\n }\n\n /**\n * get corresponding meeting object by locus data\n * @param {Object} data a locus event\n * @param {String} data.locusUrl\n * @param {Object} data.locus\n * @returns {Object}\n * @private\n * @memberof Meetings\n */\n getCorrespondingMeetingByLocus(data) {\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 return (\n this.meetingCollection.getByKey(LOCUS_URL, data.locusUrl) ||\n // @ts-ignore\n this.meetingCollection.getByKey(\n CORRELATION_ID,\n // @ts-ignore\n MeetingsUtil.checkForCorrelationId(this.webex.internal.device.url, data.locus)\n ) ||\n this.meetingCollection.getByKey(\n SIP_URI,\n data.locus.self &&\n data.locus.self.callbackInfo &&\n data.locus.self.callbackInfo.callbackAddress\n ) ||\n (data.locus.info?.isUnifiedSpaceMeeting\n ? undefined\n : this.meetingCollection.getByKey(CONVERSATION_URL, data.locus.conversationUrl)) ||\n this.meetingCollection.getByKey(MEETINGNUMBER, data.locus?.info?.webExMeetingId)\n );\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 private handleLocusEvent(data: {locusUrl: string; locus: any}, useRandomDelayForInfo = false) {\n let meeting = this.getCorrespondingMeetingByLocus(data);\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(\n LOCUS_URL,\n data.locus.replaces[data.locus.replaces.length - 1].locusUrl\n );\n }\n\n if (meeting && !MeetingsUtil.isBreakoutLocusDTO(data.locus)) {\n meeting.locusInfo.updateMainSessionLocusCache(data.locus);\n }\n if (!this.isNeedHandleLocusDTO(meeting, data.locus)) {\n LoggerProxy.logger.log(\n `Meetings:index#handleLocusEvent --> doesn't need to process locus event`\n );\n\n return;\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 (\n data.locus &&\n data.locus.fullState &&\n data.locus.fullState.state === LOCUS.STATE.INACTIVE\n ) {\n // just ignore the event as its already ended and not active\n LoggerProxy.logger.warn(\n 'Meetings:index#handleLocusEvent --> Locus event received for meeting, after it was ended.'\n );\n\n return;\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 (\n data.locus &&\n data.locus.self &&\n data.locus.self.state === _LEFT_ &&\n data.locus.self.removed === true\n ) {\n // just ignore the event as its already ended and not active\n LoggerProxy.logger.warn(\n 'Meetings:index#handleLocusEvent --> Locus event received for meeting, after it was ended.'\n );\n\n return;\n }\n\n this.create(data.locus, _LOCUS_ID_, useRandomDelayForInfo)\n .then((newMeeting) => {\n meeting = newMeeting;\n\n // It's a new meeting so initialize the locus data\n meeting.locusInfo.initialSetup(data.locus);\n this.checkHandleBreakoutLocus(data.locus);\n })\n .catch((e) => {\n LoggerProxy.logger.error(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({\n event: eventType.REMOTE_STARTED,\n meeting,\n data: {trigger: trigger.MERCURY_EVENT},\n });\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 } else {\n // Meeting got added but was not found in the collection. It might have got destroyed\n LoggerProxy.logger.warn(\n '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 private handleLocusMercury(envelope: {data: any}) {\n const {data} = envelope;\n // eslint-disable-next-line @typescript-eslint/no-shadow\n const {eventType} = data;\n\n if (eventType && eventType !== LOCUSEVENT.MESSAGE_ROAP) {\n this.handleLocusEvent(data, true);\n }\n }\n\n /**\n * handles mecury offline event\n * @returns {undefined}\n * @private\n * @memberof Meetings\n */\n private 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 * registers for locus and roap mercury events\n * @returns {undefined}\n * @private\n * @memberof Meetings\n */\n private listenForEvents() {\n // @ts-ignore\n this.webex.internal.mercury.on(LOCUSEVENT.LOCUS_MERCURY, (envelope) => {\n this.handleLocusMercury(envelope);\n });\n // @ts-ignore\n this.webex.internal.mercury.on(ROAP.ROAP_MERCURY, (envelope) => {\n MeetingsUtil.handleRoapMercury(envelope, this.meetingCollection);\n });\n\n // @ts-ignore\n this.webex.internal.mercury.on(ONLINE, () => {\n this.syncMeetings();\n });\n\n // @ts-ignore\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 private stopListeningForEvents() {\n // @ts-ignore\n this.webex.internal.mercury.off(LOCUSEVENT.LOCUS_MERCURY);\n // @ts-ignore\n this.webex.internal.mercury.off(ROAP.ROAP_MERCURY);\n // @ts-ignore\n this.webex.internal.mercury.off(ONLINE);\n }\n\n /**\n * @returns {undefined}\n * @private\n * @memberof Meetings\n */\n private onReady() {\n // @ts-ignore\n this.webex.once(READY, () => {\n // @ts-ignore\n StaticConfig.set(this.config);\n // @ts-ignore\n LoggerConfig.set(this.config.logging);\n // @ts-ignore\n LoggerProxy.set(this.webex.logger);\n\n mediaLogger = new MediaLogger();\n setLogger(mediaLogger);\n\n /**\n * The MeetingInfo object to interact with server\n * @instance\n * @type {Object}\n * @private\n * @memberof Meetings\n */\n // @ts-ignore\n this.meetingInfo = this.config.experimental.enableUnifiedMeetings\n ? // @ts-ignore\n new MeetingInfoV2(this.webex)\n : // @ts-ignore\n new MeetingInfo(this.webex);\n // @ts-ignore\n this.personalMeetingRoom = new PersonalMeetingRoom(\n {meetingInfo: this.meetingInfo},\n // @ts-ignore\n {parent: this.webex}\n );\n\n Trigger.trigger(\n this,\n {\n file: 'meetings',\n function: 'onReady',\n },\n EVENT_TRIGGERS.MEETINGS_READY\n );\n\n MeetingsUtil.checkH264Support({disableNotifications: true});\n // @ts-ignore\n Metrics.initialSetup(this.meetingCollection, this.webex);\n });\n }\n\n /**\n * API to toggle unified meetings\n * @param {Boolean} changeState\n * @private\n * @memberof Meetings\n * @returns {undefined}\n */\n private _toggleUnifiedMeetings(changeState: boolean) {\n if (typeof changeState !== 'boolean') {\n return;\n }\n // @ts-ignore\n if (this.config?.experimental?.enableUnifiedMeetings !== changeState) {\n // @ts-ignore\n this.config.experimental.enableUnifiedMeetings = changeState;\n // @ts-ignore\n this.meetingInfo = changeState ? new MeetingInfoV2(this.webex) : new MeetingInfo(this.webex);\n }\n }\n\n /**\n * API to enable or disable TURN discovery\n * @param {Boolean} enable\n * @private\n * @memberof Meetings\n * @returns {undefined}\n */\n private _toggleTurnDiscovery(enable: boolean) {\n if (typeof enable !== 'boolean') {\n return;\n }\n // @ts-ignore\n this.config.experimental.enableTurnDiscovery = enable;\n }\n\n /**\n * API to toggle starting adhoc meeting\n * @param {Boolean} changeState\n * @private\n * @memberof Meetings\n * @returns {undefined}\n */\n private _toggleAdhocMeetings(changeState: boolean) {\n if (typeof changeState !== 'boolean') {\n return;\n }\n // @ts-ignore\n if (this.config?.experimental?.enableAdhocMeetings !== changeState) {\n // @ts-ignore\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 public register() {\n // @ts-ignore\n if (!this.webex.canAuthorize) {\n LoggerProxy.logger.error(\n 'Meetings:index#register --> ERROR, Unable to register, SDK cannot authorize'\n );\n\n return Promise.reject(new Error('SDK cannot authorize'));\n }\n\n if (this.registered) {\n LoggerProxy.logger.info(\n 'Meetings:index#register --> INFO, Meetings plugin already registered'\n );\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 // @ts-ignore\n this.webex.internal.device\n .register()\n // @ts-ignore\n .then(() =>\n LoggerProxy.logger.info(\n // @ts-ignore\n `Meetings:index#register --> INFO, Device registered ${this.webex.internal.device.url}`\n )\n )\n // @ts-ignore\n .then(() => this.webex.internal.mercury.connect()),\n MeetingsUtil.checkH264Support.call(this),\n ])\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(BEHAVIORAL_METRICS.MEETINGS_REGISTRATION_SUCCESS);\n })\n .catch((error) => {\n LoggerProxy.logger.error(\n `Meetings:index#register --> ERROR, Unable to register, ${error.message}`\n );\n\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.MEETINGS_REGISTRATION_FAILED, {\n reason: error.message,\n stack: error.stack,\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(\n 'Meetings:index#unregister --> INFO, Meetings plugin already unregistered'\n );\n\n return Promise.resolve();\n }\n\n this.stopListeningForEvents();\n\n return (\n // @ts-ignore\n this.webex.internal.mercury\n .disconnect()\n // @ts-ignore\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 /**\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(\n options: {\n callStart?: string;\n feedbackId?: string;\n locusId?: string;\n correlationId?: string;\n meetingId?: string;\n userId?: string;\n orgId?: string;\n } = {}\n ) {\n LoggerProxy.logger.info('Meetings:index#uploadLogs --> uploading logs');\n\n return this.loggerRequest\n .uploadLogs(options)\n .then((uploadResult) => {\n LoggerProxy.logger.info(\n 'Meetings:index#uploadLogs --> Upload logs for meeting completed.',\n uploadResult\n );\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 return uploadResult;\n })\n .catch((uploadError) => {\n LoggerProxy.logger.error(\n 'Meetings:index#uploadLogs --> Unable to upload logs for meeting',\n uploadError\n );\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(BEHAVIORAL_METRICS.UPLOAD_LOGS_FAILURE, {\n // @ts-ignore - seems like typo\n meetingId: options.meetingsId,\n reason: uploadError.message,\n stack: uploadError.stack,\n code: uploadError.code,\n });\n });\n }\n\n /**\n * initializes the reachability instance for Meetings\n * @returns {undefined}\n * @public\n * @memberof Meetings\n */\n setReachability() {\n // @ts-ignore\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.getMeetingPreferences().then((res) => {\n if (res) {\n this.preferredWebexSite = MeetingsUtil.parseDefaultSiteFromMeetingPreferences(res);\n }\n\n // fall back to getting the preferred site from the user information\n if (!this.preferredWebexSite) {\n // @ts-ignore\n return this.webex.internal.user\n .get()\n .then((user) => {\n const preferredWebexSite =\n user?.userPreferences?.userPreferencesItems?.preferredWebExSite;\n if (preferredWebexSite) {\n this.preferredWebexSite = preferredWebexSite;\n } else {\n throw new Error('site not found');\n }\n })\n .catch(() => {\n LoggerProxy.logger.error(\n 'Failed to fetch preferred site from user - no site will be set'\n );\n });\n }\n\n return Promise.resolve();\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 private destroy(meeting: Meeting, reason: object) {\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 * @param {Object} infoExtraParams extra parameters to be provided when fetching meeting info\n * @returns {Promise<Meeting>} A new Meeting.\n * @public\n * @memberof Meetings\n */\n public create(\n destination: string,\n type: string = null,\n useRandomDelayForInfo = false,\n infoExtraParams = {}\n ) {\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 (\n this.meetingInfo\n .fetchInfoOptions(destination, type)\n // Catch a failure to fetch info options.\n .catch((error) => {\n LoggerProxy.logger.info(\n `Meetings:index#create --> INFO, unable to determine info options: ${error.message}`\n );\n })\n .then((options: any = {}) => {\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(\n targetDest,\n type,\n useRandomDelayForInfo,\n infoExtraParams\n ).then((createdMeeting: any) => {\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 // @ts-ignore\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 } else {\n this.destroy(createdMeeting, payload.reason);\n }\n });\n\n createdMeeting.on(EVENTS.REQUEST_UPLOAD_LOGS, (meetingInstance) => {\n // @ts-ignore\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 } else {\n LoggerProxy.logger.error(\n `Meetings:index#create --> ERROR, meeting does not have on method, will not be destroyed, meeting cleanup impossible for meeting: ${meeting}`\n );\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 /**\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 * @param {Object} infoExtraParams extra parameters to be provided when fetching meeting info\n * @returns {Promise} a new meeting instance complete with meeting info and destination\n * @private\n * @memberof Meetings\n */\n private async createMeeting(\n destination: any,\n type: string = null,\n useRandomDelayForInfo = false,\n infoExtraParams = {}\n ) {\n const meeting = new Meeting(\n {\n // @ts-ignore\n userId: this.webex.internal.device.userId,\n // @ts-ignore\n deviceUrl: this.webex.internal.device.url,\n // @ts-ignore\n orgId: this.webex.internal.device.orgId,\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 // @ts-ignore\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(\n Math.min(timeToStart, MAX_RANDOM_DELAY_FOR_MEETING_INFO),\n 0\n );\n\n waitingTime = Math.round(Math.random() * maxWaitingTime);\n }\n const isMeetingActive = !!destination.fullState?.active;\n // @ts-ignore\n const {enableUnifiedMeetings} = this.config.experimental;\n\n if (enableUnifiedMeetings && !isMeetingActive && useRandomDelayForInfo && waitingTime > 0) {\n meeting.fetchMeetingInfoTimeoutId = setTimeout(\n () => meeting.fetchMeetingInfo({extraParams: infoExtraParams}),\n waitingTime\n );\n meeting.parseMeetingInfo(undefined, destination);\n } else {\n await meeting.fetchMeetingInfo({extraParams: infoExtraParams});\n }\n } catch (err) {\n if (\n !(err instanceof CaptchaError) &&\n !(err instanceof PasswordError) &&\n !(err instanceof PermissionError)\n ) {\n // if there is no meeting info we assume its a 1:1 call or wireless share\n LoggerProxy.logger.info(\n `Meetings:index#createMeeting --> Info Unable to fetch meeting info for ${destination}.`\n );\n LoggerProxy.logger.info(\n 'Meetings:index#createMeeting --> Info assuming this destination is a 1:1 or wireless share'\n );\n }\n LoggerProxy.logger.debug(\n `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 public getMeetingByType(type: string, value: object) {\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 public getAllMeetings(\n options: {\n startDate: object;\n endDate: object;\n } = {} as any\n ) {\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 public syncMeetings() {\n return this.request\n .getActiveMeetings()\n .then((locusArray) => {\n const activeLocusUrl = [];\n\n if (locusArray?.loci && locusArray.loci.length > 0) {\n const lociToUpdate = this.sortLocusArrayToUpdate(locusArray.loci);\n lociToUpdate.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 // @ts-ignore\n if (!activeLocusUrl.includes(meeting.locusUrl)) {\n // destroy function also uploads logs\n // @ts-ignore\n this.destroy(meeting, MEETING_REMOVED_REASON.NO_MEETINGS_TO_SYNC);\n }\n }\n }\n })\n .catch((error) => {\n LoggerProxy.logger.error(\n `Meetings:index#syncMeetings --> failed to sync meetings, ${error}`\n );\n throw new Error(error);\n });\n }\n\n /**\n * sort out locus array for initial creating\n * @param {Array} loci original locus array\n * @returns {undefined}\n * @public\n * @memberof Meetings\n */\n sortLocusArrayToUpdate(loci: any[]) {\n const mainLoci = loci.filter((locus) => !MeetingsUtil.isBreakoutLocusDTO(locus));\n const breakoutLoci = loci.filter((locus) => MeetingsUtil.isValidBreakoutLocus(locus));\n this.breakoutLocusForHandleLater = [];\n const lociToUpdate = [...mainLoci];\n breakoutLoci.forEach((breakoutLocus) => {\n const associateMainLocus = mainLoci.find(\n (mainLocus) => mainLocus.controls?.breakout?.url === breakoutLocus.controls?.breakout?.url\n );\n const existCorrespondingMeeting = this.getCorrespondingMeetingByLocus({\n locus: breakoutLocus,\n locusUrl: breakoutLocus.url,\n });\n\n if (associateMainLocus && !existCorrespondingMeeting) {\n // if exists both main session and breakout session locus of the same non-exist meeting, handle main locus first,\n // after meeting create with main locus, then handle the associate breakout locus.\n // if only handle breakout locus, will miss some date\n this.breakoutLocusForHandleLater.push(breakoutLocus);\n } else {\n lociToUpdate.push(breakoutLocus);\n }\n });\n\n return lociToUpdate;\n }\n\n /**\n * check breakout locus which waiting for main locus's meeting to be created, then handle the breakout locus\n * @param {Object} newCreatedLocus the locus which just create meeting object of it\n * @returns {undefined}\n * @public\n * @memberof Meetings\n */\n checkHandleBreakoutLocus(newCreatedLocus) {\n if (\n !newCreatedLocus ||\n !this.breakoutLocusForHandleLater ||\n !this.breakoutLocusForHandleLater.length\n ) {\n return;\n }\n if (MeetingsUtil.isBreakoutLocusDTO(newCreatedLocus)) {\n return;\n }\n const existIndex = this.breakoutLocusForHandleLater.findIndex(\n (breakoutLocus) =>\n breakoutLocus.controls?.breakout?.url === newCreatedLocus.controls?.breakout?.url\n );\n\n if (existIndex < 0) {\n return;\n }\n\n const associateBreakoutLocus = this.breakoutLocusForHandleLater[existIndex];\n this.handleLocusEvent({locus: associateBreakoutLocus, locusUrl: associateBreakoutLocus.url});\n this.breakoutLocusForHandleLater.splice(existIndex, 1);\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"],"mappings":"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"}
1
+ {"version":3,"names":["mediaLogger","MediaLogger","LoggerProxy","logger","info","log","error","warn","trace","debug","Meetings","args","MEETINGS","options","authToken","webex","credentials","supertoken","access_token","mediaHelpersModule","NoiseReductionEffect","VirtualBackgroundEffect","mediaHelpers","request","Request","parent","loggerRequest","LoggerRequest","meetingCollection","MeetingCollection","personalMeetingRoom","reachability","registered","preferredWebexSite","media","getUserMedia","Media","getSupportedDevice","onReady","meeting","newLocus","breakoutUrl","controls","breakout","url","breakoutLocus","getActiveBreakoutLocus","isSelfJoined","self","state","_JOINED_","isSelfMoved","_LEFT_","reason","_MOVED_","deviceFromNewLocus","MeetingsUtil","getThisDevice","internal","device","isNewLocusJoinThisDevice","joinedOnThisDevice","isBreakoutLocusJoinThisDevice","joinedWith","correlationId","breakoutReplaceAt","replaces","length","replaceAt","newLocusReplaceAt","removed","isNewLocusAsBreakout","isBreakoutLocusDTO","fullState","active","isNeedHandleMainLocus","data","getByKey","LOCUS_URL","locusUrl","CORRELATION_ID","checkForCorrelationId","locus","SIP_URI","callbackInfo","callbackAddress","isUnifiedSpaceMeeting","undefined","CONVERSATION_URL","conversationUrl","MEETINGNUMBER","webExMeetingId","useRandomDelayForInfo","getCorrespondingMeetingByLocus","locusInfo","updateMainSessionLocusCache","isNeedHandleLocusDTO","LOCUS","STATE","INACTIVE","create","_LOCUS_ID_","then","newMeeting","initialSetup","checkHandleBreakoutLocus","catch","e","finally","getMeetingByType","_ID_","id","Metrics","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","setLogger","meetingInfo","experimental","enableUnifiedMeetings","MeetingInfoV2","MeetingInfo","PersonalMeetingRoom","MEETINGS_READY","checkH264Support","disableNotifications","changeState","enable","enableTurnDiscovery","enableAdhocMeetings","canAuthorize","reject","Error","resolve","all","fetchUserPreferredWebexSite","getGeoHint","startReachability","message","register","connect","call","listenForEvents","MEETINGS_REGISTERED","sendBehavioralMetric","BEHAVIORAL_METRICS","MEETINGS_REGISTRATION_SUCCESS","MEETINGS_REGISTRATION_FAILED","stack","stopListeningForEvents","disconnect","unregister","MEETINGS_UNREGISTERED","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","getMeetingPreferences","parseDefaultSiteFromMeetingPreferences","user","get","userPreferences","userPreferencesItems","preferredWebExSite","MeetingUtil","cleanUp","delete","MEETING_REMOVED","destination","infoExtraParams","fetchInfoOptions","targetDest","_CONVERSATION_URL_","foundMeeting","foundMeetingIsNotCalendarMeeting","scheduledMeeting","createMeeting","createdMeeting","EVENTS","DESTROY_MEETING","payload","autoUploadLogs","callStart","lastActive","feedbackId","locusId","destroy","REQUEST_UPLOAD_LOGS","meetingInstance","Meeting","userId","deviceUrl","orgId","meetingInfoProvider","destinationType","waitingTime","startTime","startTimeDate","Date","startTimeDatestamp","getTime","timeToStart","maxWaitingTime","Math","max","min","MAX_RANDOM_DELAY_FOR_MEETING_INFO","round","random","isMeetingActive","fetchMeetingInfoTimeoutId","setTimeout","fetchMeetingInfo","extraParams","parseMeetingInfo","CaptchaError","PasswordError","PermissionError","sipUri","setSipUri","meetingAddedType","getMeetingAddedType","value","getAll","getActiveMeetings","locusArray","activeLocusUrl","loci","lociToUpdate","sortLocusArrayToUpdate","forEach","push","meetingsCollection","includes","MEETING_REMOVED_REASON","NO_MEETINGS_TO_SYNC","mainLoci","filter","breakoutLoci","isValidBreakoutLocus","breakoutLocusForHandleLater","associateMainLocus","find","mainLocus","existCorrespondingMeeting","newCreatedLocus","existIndex","findIndex","associateBreakoutLocus","splice","scheduled","WebexPlugin"],"sources":["index.ts"],"sourcesContent":["/* eslint no-shadow: [\"error\", { \"allow\": [\"eventType\"] }] */\n\nimport '@webex/internal-plugin-mercury';\nimport '@webex/internal-plugin-conversation';\n// @ts-ignore\nimport {WebexPlugin} from '@webex/webex-core';\nimport {setLogger} from '@webex/internal-media-core';\n\nimport * as mediaHelpersModule from '@webex/media-helpers';\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 MEETINGNUMBER,\n _JOINED_,\n _MOVED_,\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 './request';\nimport PasswordError from '../common/errors/password-error';\nimport CaptchaError from '../common/errors/captcha-error';\n\nimport MeetingCollection from './collection';\nimport MeetingsUtil from './util';\nimport PermissionError from '../common/errors/permission';\nimport {INoiseReductionEffect, IVirtualBackgroundEffect} from './meetings.types';\n\nlet mediaLogger;\n\nclass MediaLogger {\n info(...args) {\n LoggerProxy.logger.info(...args);\n }\n\n log(...args) {\n LoggerProxy.logger.log(...args);\n }\n\n error(...args) {\n LoggerProxy.logger.error(...args);\n }\n\n warn(...args) {\n LoggerProxy.logger.warn(...args);\n }\n\n trace(...args) {\n LoggerProxy.logger.trace(...args);\n }\n\n debug(...args) {\n LoggerProxy.logger.debug(...args);\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 loggerRequest: any;\n media: any;\n meetingCollection: any;\n personalMeetingRoom: any;\n preferredWebexSite: any;\n reachability: any;\n registered: any;\n request: any;\n geoHintInfo: any;\n meetingInfo: any;\n mediaHelpers: any;\n breakoutLocusForHandleLater: any;\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 webrtc-core media helpers. This is a temporary solution required for the SDK sample app\n * to be able to call media helper functions.\n *\n * @instance\n * @type {Object}\n * @private\n * @memberof Meetings\n */\n this.mediaHelpers = mediaHelpersModule;\n\n /**\n * The Meetings request to interact with server\n * @instance\n * @type {Object}\n * @private\n * @memberof Meetings\n */\n // @ts-ignore\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 // @ts-ignore\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 }\n\n /**\n * check whether you need to handle this main session's locus data or not\n * @param {Object} meeting current meeting data\n * @param {Object} newLocus new locus data\n * @returns {boolean}\n * @private\n * @memberof Meetings\n */\n private isNeedHandleMainLocus(meeting: any, newLocus: any) {\n const breakoutUrl = newLocus.controls?.breakout?.url;\n const breakoutLocus = this.meetingCollection.getActiveBreakoutLocus(breakoutUrl);\n\n const isSelfJoined = newLocus?.self?.state === _JOINED_;\n const isSelfMoved = newLocus?.self?.state === _LEFT_ && newLocus?.self?.reason === _MOVED_;\n // @ts-ignore\n const deviceFromNewLocus = MeetingsUtil.getThisDevice(newLocus, this.webex.internal.device.url);\n const isNewLocusJoinThisDevice = MeetingsUtil.joinedOnThisDevice(\n meeting,\n newLocus,\n // @ts-ignore\n this.webex.internal.device.url\n );\n const isBreakoutLocusJoinThisDevice =\n breakoutLocus?.joinedWith?.correlationId &&\n breakoutLocus.joinedWith.correlationId === meeting?.correlationId;\n\n if (isSelfJoined && isNewLocusJoinThisDevice) {\n LoggerProxy.logger.log(\n 'Meetings:index#isNeedHandleMainLocus --> self this device shown as JOINED in the main session'\n );\n if (breakoutLocus?.joinedWith && deviceFromNewLocus) {\n const breakoutReplaceAt =\n breakoutLocus.joinedWith.replaces?.length > 0\n ? breakoutLocus.joinedWith.replaces[0].replaceAt\n : '';\n const newLocusReplaceAt =\n deviceFromNewLocus.replaces?.length > 0 ? deviceFromNewLocus.replaces[0].replaceAt : '';\n if (breakoutReplaceAt && newLocusReplaceAt && breakoutReplaceAt > newLocusReplaceAt) {\n LoggerProxy.logger.log(\n `Meetings:index#isNeedHandleMainLocus --> this is expired main joined status locus_dto replacedAt ${newLocusReplaceAt} bo replacedAt ${breakoutReplaceAt}`\n );\n\n return false;\n }\n }\n\n return true;\n }\n if (isBreakoutLocusJoinThisDevice) {\n LoggerProxy.logger.log(\n `Meetings:index#isNeedHandleMainLocus --> there is active breakout session and joined on this device, and don't need to handle main session: ${breakoutUrl}`\n );\n\n return false;\n }\n if (isSelfMoved && newLocus?.self?.removed) {\n LoggerProxy.logger.log(\n 'Meetings:index#isNeedHandleMainLocus --> self moved main locus with self removed status, not need to handle'\n );\n\n return false;\n }\n LoggerProxy.logger.log(\n 'Meetings:index#isNeedHandleMainLocus --> this is a normal main session locusDTO update case'\n );\n\n return true;\n }\n\n /**\n * check whether you need to handle this locus data or not\n * @param {Object} meeting old locus data\n * @param {Object} newLocus new locus data\n * @returns {boolean}\n * @private\n * @memberof Meetings\n */\n private isNeedHandleLocusDTO(meeting: any, newLocus: any) {\n if (newLocus) {\n const isNewLocusAsBreakout = MeetingsUtil.isBreakoutLocusDTO(newLocus);\n const isSelfMoved = newLocus?.self?.state === _LEFT_ && newLocus?.self?.reason === _MOVED_;\n if (!meeting) {\n if (isNewLocusAsBreakout) {\n LoggerProxy.logger.log(\n `Meetings:index#isNeedHandleLocusDTO --> the first breakout session locusDTO active status: ${newLocus.fullState?.active}`\n );\n\n return newLocus.self?.state === _JOINED_;\n }\n\n return this.isNeedHandleMainLocus(meeting, newLocus);\n }\n if (!isNewLocusAsBreakout) {\n return this.isNeedHandleMainLocus(meeting, newLocus);\n }\n\n return !isSelfMoved;\n }\n\n return true;\n }\n\n /**\n * get corresponding meeting object by locus data\n * @param {Object} data a locus event\n * @param {String} data.locusUrl\n * @param {Object} data.locus\n * @returns {Object}\n * @private\n * @memberof Meetings\n */\n getCorrespondingMeetingByLocus(data) {\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 return (\n this.meetingCollection.getByKey(LOCUS_URL, data.locusUrl) ||\n // @ts-ignore\n this.meetingCollection.getByKey(\n CORRELATION_ID,\n // @ts-ignore\n MeetingsUtil.checkForCorrelationId(this.webex.internal.device.url, data.locus)\n ) ||\n this.meetingCollection.getByKey(\n SIP_URI,\n data.locus.self &&\n data.locus.self.callbackInfo &&\n data.locus.self.callbackInfo.callbackAddress\n ) ||\n (data.locus.info?.isUnifiedSpaceMeeting\n ? undefined\n : this.meetingCollection.getByKey(CONVERSATION_URL, data.locus.conversationUrl)) ||\n this.meetingCollection.getByKey(MEETINGNUMBER, data.locus?.info?.webExMeetingId)\n );\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 private handleLocusEvent(data: {locusUrl: string; locus: any}, useRandomDelayForInfo = false) {\n let meeting = this.getCorrespondingMeetingByLocus(data);\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(\n LOCUS_URL,\n data.locus.replaces[data.locus.replaces.length - 1].locusUrl\n );\n }\n\n if (meeting && !MeetingsUtil.isBreakoutLocusDTO(data.locus)) {\n meeting.locusInfo.updateMainSessionLocusCache(data.locus);\n }\n if (!this.isNeedHandleLocusDTO(meeting, data.locus)) {\n LoggerProxy.logger.log(\n `Meetings:index#handleLocusEvent --> doesn't need to process locus event`\n );\n\n return;\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 (\n data.locus &&\n data.locus.fullState &&\n data.locus.fullState.state === LOCUS.STATE.INACTIVE\n ) {\n // just ignore the event as its already ended and not active\n LoggerProxy.logger.warn(\n 'Meetings:index#handleLocusEvent --> Locus event received for meeting, after it was ended.'\n );\n\n return;\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 (\n data.locus &&\n data.locus.self &&\n data.locus.self.state === _LEFT_ &&\n data.locus.self.removed === true\n ) {\n // just ignore the event as its already ended and not active\n LoggerProxy.logger.warn(\n 'Meetings:index#handleLocusEvent --> Locus event received for meeting, after it was ended.'\n );\n\n return;\n }\n\n this.create(data.locus, _LOCUS_ID_, useRandomDelayForInfo)\n .then((newMeeting) => {\n meeting = newMeeting;\n\n // It's a new meeting so initialize the locus data\n meeting.locusInfo.initialSetup(data.locus);\n this.checkHandleBreakoutLocus(data.locus);\n })\n .catch((e) => {\n LoggerProxy.logger.error(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({\n event: eventType.REMOTE_STARTED,\n meeting,\n data: {trigger: trigger.MERCURY_EVENT},\n });\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 } else {\n // Meeting got added but was not found in the collection. It might have got destroyed\n LoggerProxy.logger.warn(\n '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 private handleLocusMercury(envelope: {data: any}) {\n const {data} = envelope;\n // eslint-disable-next-line @typescript-eslint/no-shadow\n const {eventType} = data;\n\n if (eventType && eventType !== LOCUSEVENT.MESSAGE_ROAP) {\n this.handleLocusEvent(data, true);\n }\n }\n\n /**\n * handles mecury offline event\n * @returns {undefined}\n * @private\n * @memberof Meetings\n */\n private 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 * registers for locus and roap mercury events\n * @returns {undefined}\n * @private\n * @memberof Meetings\n */\n private listenForEvents() {\n // @ts-ignore\n this.webex.internal.mercury.on(LOCUSEVENT.LOCUS_MERCURY, (envelope) => {\n this.handleLocusMercury(envelope);\n });\n // @ts-ignore\n this.webex.internal.mercury.on(ROAP.ROAP_MERCURY, (envelope) => {\n MeetingsUtil.handleRoapMercury(envelope, this.meetingCollection);\n });\n\n // @ts-ignore\n this.webex.internal.mercury.on(ONLINE, () => {\n this.syncMeetings();\n });\n\n // @ts-ignore\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 private stopListeningForEvents() {\n // @ts-ignore\n this.webex.internal.mercury.off(LOCUSEVENT.LOCUS_MERCURY);\n // @ts-ignore\n this.webex.internal.mercury.off(ROAP.ROAP_MERCURY);\n // @ts-ignore\n this.webex.internal.mercury.off(ONLINE);\n }\n\n /**\n * @returns {undefined}\n * @private\n * @memberof Meetings\n */\n private onReady() {\n // @ts-ignore\n this.webex.once(READY, () => {\n // @ts-ignore\n StaticConfig.set(this.config);\n // @ts-ignore\n LoggerConfig.set(this.config.logging);\n // @ts-ignore\n LoggerProxy.set(this.webex.logger);\n\n mediaLogger = new MediaLogger();\n setLogger(mediaLogger);\n\n /**\n * The MeetingInfo object to interact with server\n * @instance\n * @type {Object}\n * @private\n * @memberof Meetings\n */\n // @ts-ignore\n this.meetingInfo = this.config.experimental.enableUnifiedMeetings\n ? // @ts-ignore\n new MeetingInfoV2(this.webex)\n : // @ts-ignore\n new MeetingInfo(this.webex);\n // @ts-ignore\n this.personalMeetingRoom = new PersonalMeetingRoom(\n {meetingInfo: this.meetingInfo},\n // @ts-ignore\n {parent: this.webex}\n );\n\n Trigger.trigger(\n this,\n {\n file: 'meetings',\n function: 'onReady',\n },\n EVENT_TRIGGERS.MEETINGS_READY\n );\n\n MeetingsUtil.checkH264Support({disableNotifications: true});\n // @ts-ignore\n Metrics.initialSetup(this.meetingCollection, this.webex);\n });\n }\n\n /**\n * API to toggle unified meetings\n * @param {Boolean} changeState\n * @private\n * @memberof Meetings\n * @returns {undefined}\n */\n private _toggleUnifiedMeetings(changeState: boolean) {\n if (typeof changeState !== 'boolean') {\n return;\n }\n // @ts-ignore\n if (this.config?.experimental?.enableUnifiedMeetings !== changeState) {\n // @ts-ignore\n this.config.experimental.enableUnifiedMeetings = changeState;\n // @ts-ignore\n this.meetingInfo = changeState ? new MeetingInfoV2(this.webex) : new MeetingInfo(this.webex);\n }\n }\n\n /**\n * API to enable or disable TURN discovery\n * @param {Boolean} enable\n * @private\n * @memberof Meetings\n * @returns {undefined}\n */\n private _toggleTurnDiscovery(enable: boolean) {\n if (typeof enable !== 'boolean') {\n return;\n }\n // @ts-ignore\n this.config.experimental.enableTurnDiscovery = enable;\n }\n\n /**\n * API to toggle starting adhoc meeting\n * @param {Boolean} changeState\n * @private\n * @memberof Meetings\n * @returns {undefined}\n */\n private _toggleAdhocMeetings(changeState: boolean) {\n if (typeof changeState !== 'boolean') {\n return;\n }\n // @ts-ignore\n if (this.config?.experimental?.enableAdhocMeetings !== changeState) {\n // @ts-ignore\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 public register() {\n // @ts-ignore\n if (!this.webex.canAuthorize) {\n LoggerProxy.logger.error(\n 'Meetings:index#register --> ERROR, Unable to register, SDK cannot authorize'\n );\n\n return Promise.reject(new Error('SDK cannot authorize'));\n }\n\n if (this.registered) {\n LoggerProxy.logger.info(\n 'Meetings:index#register --> INFO, Meetings plugin already registered'\n );\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 // @ts-ignore\n this.webex.internal.device\n .register()\n // @ts-ignore\n .then(() =>\n LoggerProxy.logger.info(\n // @ts-ignore\n `Meetings:index#register --> INFO, Device registered ${this.webex.internal.device.url}`\n )\n )\n // @ts-ignore\n .then(() => this.webex.internal.mercury.connect()),\n MeetingsUtil.checkH264Support.call(this),\n ])\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(BEHAVIORAL_METRICS.MEETINGS_REGISTRATION_SUCCESS);\n })\n .catch((error) => {\n LoggerProxy.logger.error(\n `Meetings:index#register --> ERROR, Unable to register, ${error.message}`\n );\n\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.MEETINGS_REGISTRATION_FAILED, {\n reason: error.message,\n stack: error.stack,\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(\n 'Meetings:index#unregister --> INFO, Meetings plugin already unregistered'\n );\n\n return Promise.resolve();\n }\n\n this.stopListeningForEvents();\n\n return (\n // @ts-ignore\n this.webex.internal.mercury\n .disconnect()\n // @ts-ignore\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 /**\n * Creates a noise reduction effect\n *\n * @param {INoiseReductionEffect} options optional custom effect options\n * @returns {Promise<effect>} noise reduction effect.\n * @public\n * @memberof Meetings\n */\n createNoiseReductionEffect = async (options?: INoiseReductionEffect) => {\n // @ts-ignore\n const authToken = this.webex.credentials.supertoken.access_token;\n\n return new mediaHelpersModule.NoiseReductionEffect({authToken, ...options});\n };\n\n /**\n * Creates a virtual background effect\n *\n * @param {IVirtualBackgroundEffect} options optional custom effect options\n * @returns {Promise<effect>} virtual background effect.\n * @public\n * @memberof Meetings\n */\n createVirtualBackgroundEffect = async (options?: IVirtualBackgroundEffect) => {\n // @ts-ignore\n const authToken = this.webex.credentials.supertoken.access_token;\n\n return new mediaHelpersModule.VirtualBackgroundEffect({authToken, ...options});\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(\n options: {\n callStart?: string;\n feedbackId?: string;\n locusId?: string;\n correlationId?: string;\n meetingId?: string;\n userId?: string;\n orgId?: string;\n } = {}\n ) {\n LoggerProxy.logger.info('Meetings:index#uploadLogs --> uploading logs');\n\n return this.loggerRequest\n .uploadLogs(options)\n .then((uploadResult) => {\n LoggerProxy.logger.info(\n 'Meetings:index#uploadLogs --> Upload logs for meeting completed.',\n uploadResult\n );\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 return uploadResult;\n })\n .catch((uploadError) => {\n LoggerProxy.logger.error(\n 'Meetings:index#uploadLogs --> Unable to upload logs for meeting',\n uploadError\n );\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(BEHAVIORAL_METRICS.UPLOAD_LOGS_FAILURE, {\n // @ts-ignore - seems like typo\n meetingId: options.meetingsId,\n reason: uploadError.message,\n stack: uploadError.stack,\n code: uploadError.code,\n });\n });\n }\n\n /**\n * initializes the reachability instance for Meetings\n * @returns {undefined}\n * @public\n * @memberof Meetings\n */\n setReachability() {\n // @ts-ignore\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.getMeetingPreferences().then((res) => {\n if (res) {\n this.preferredWebexSite = MeetingsUtil.parseDefaultSiteFromMeetingPreferences(res);\n }\n\n // fall back to getting the preferred site from the user information\n if (!this.preferredWebexSite) {\n // @ts-ignore\n return this.webex.internal.user\n .get()\n .then((user) => {\n const preferredWebexSite =\n user?.userPreferences?.userPreferencesItems?.preferredWebExSite;\n if (preferredWebexSite) {\n this.preferredWebexSite = preferredWebexSite;\n } else {\n throw new Error('site not found');\n }\n })\n .catch(() => {\n LoggerProxy.logger.error(\n 'Failed to fetch preferred site from user - no site will be set'\n );\n });\n }\n\n return Promise.resolve();\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 private destroy(meeting: Meeting, reason: object) {\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 * @param {Object} infoExtraParams extra parameters to be provided when fetching meeting info\n * @returns {Promise<Meeting>} A new Meeting.\n * @public\n * @memberof Meetings\n */\n public create(\n destination: string,\n type: string = null,\n useRandomDelayForInfo = false,\n infoExtraParams = {}\n ) {\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 (\n this.meetingInfo\n .fetchInfoOptions(destination, type)\n // Catch a failure to fetch info options.\n .catch((error) => {\n LoggerProxy.logger.info(\n `Meetings:index#create --> INFO, unable to determine info options: ${error.message}`\n );\n })\n .then((options: any = {}) => {\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(\n targetDest,\n type,\n useRandomDelayForInfo,\n infoExtraParams\n ).then((createdMeeting: any) => {\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 // @ts-ignore\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 } else {\n this.destroy(createdMeeting, payload.reason);\n }\n });\n\n createdMeeting.on(EVENTS.REQUEST_UPLOAD_LOGS, (meetingInstance) => {\n // @ts-ignore\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 } else {\n LoggerProxy.logger.error(\n `Meetings:index#create --> ERROR, meeting does not have on method, will not be destroyed, meeting cleanup impossible for meeting: ${meeting}`\n );\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 /**\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 * @param {Object} infoExtraParams extra parameters to be provided when fetching meeting info\n * @returns {Promise} a new meeting instance complete with meeting info and destination\n * @private\n * @memberof Meetings\n */\n private async createMeeting(\n destination: any,\n type: string = null,\n useRandomDelayForInfo = false,\n infoExtraParams = {}\n ) {\n const meeting = new Meeting(\n {\n // @ts-ignore\n userId: this.webex.internal.device.userId,\n // @ts-ignore\n deviceUrl: this.webex.internal.device.url,\n // @ts-ignore\n orgId: this.webex.internal.device.orgId,\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 // @ts-ignore\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(\n Math.min(timeToStart, MAX_RANDOM_DELAY_FOR_MEETING_INFO),\n 0\n );\n\n waitingTime = Math.round(Math.random() * maxWaitingTime);\n }\n const isMeetingActive = !!destination.fullState?.active;\n // @ts-ignore\n const {enableUnifiedMeetings} = this.config.experimental;\n\n if (enableUnifiedMeetings && !isMeetingActive && useRandomDelayForInfo && waitingTime > 0) {\n meeting.fetchMeetingInfoTimeoutId = setTimeout(\n () => meeting.fetchMeetingInfo({extraParams: infoExtraParams}),\n waitingTime\n );\n meeting.parseMeetingInfo(undefined, destination);\n } else {\n await meeting.fetchMeetingInfo({extraParams: infoExtraParams});\n }\n } catch (err) {\n if (\n !(err instanceof CaptchaError) &&\n !(err instanceof PasswordError) &&\n !(err instanceof PermissionError)\n ) {\n // if there is no meeting info we assume its a 1:1 call or wireless share\n LoggerProxy.logger.info(\n `Meetings:index#createMeeting --> Info Unable to fetch meeting info for ${destination}.`\n );\n LoggerProxy.logger.info(\n 'Meetings:index#createMeeting --> Info assuming this destination is a 1:1 or wireless share'\n );\n }\n LoggerProxy.logger.debug(\n `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 public getMeetingByType(type: string, value: object) {\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 public getAllMeetings(\n options: {\n startDate: object;\n endDate: object;\n } = {} as any\n ) {\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 public syncMeetings() {\n return this.request\n .getActiveMeetings()\n .then((locusArray) => {\n const activeLocusUrl = [];\n\n if (locusArray?.loci && locusArray.loci.length > 0) {\n const lociToUpdate = this.sortLocusArrayToUpdate(locusArray.loci);\n lociToUpdate.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 // @ts-ignore\n if (!activeLocusUrl.includes(meeting.locusUrl)) {\n // destroy function also uploads logs\n // @ts-ignore\n this.destroy(meeting, MEETING_REMOVED_REASON.NO_MEETINGS_TO_SYNC);\n }\n }\n }\n })\n .catch((error) => {\n LoggerProxy.logger.error(\n `Meetings:index#syncMeetings --> failed to sync meetings, ${error}`\n );\n throw new Error(error);\n });\n }\n\n /**\n * sort out locus array for initial creating\n * @param {Array} loci original locus array\n * @returns {undefined}\n * @public\n * @memberof Meetings\n */\n sortLocusArrayToUpdate(loci: any[]) {\n const mainLoci = loci.filter((locus) => !MeetingsUtil.isBreakoutLocusDTO(locus));\n const breakoutLoci = loci.filter((locus) => MeetingsUtil.isValidBreakoutLocus(locus));\n this.breakoutLocusForHandleLater = [];\n const lociToUpdate = [...mainLoci];\n breakoutLoci.forEach((breakoutLocus) => {\n const associateMainLocus = mainLoci.find(\n (mainLocus) => mainLocus.controls?.breakout?.url === breakoutLocus.controls?.breakout?.url\n );\n const existCorrespondingMeeting = this.getCorrespondingMeetingByLocus({\n locus: breakoutLocus,\n locusUrl: breakoutLocus.url,\n });\n\n if (associateMainLocus && !existCorrespondingMeeting) {\n // if exists both main session and breakout session locus of the same non-exist meeting, handle main locus first,\n // after meeting create with main locus, then handle the associate breakout locus.\n // if only handle breakout locus, will miss some date\n this.breakoutLocusForHandleLater.push(breakoutLocus);\n } else {\n lociToUpdate.push(breakoutLocus);\n }\n });\n\n return lociToUpdate;\n }\n\n /**\n * check breakout locus which waiting for main locus's meeting to be created, then handle the breakout locus\n * @param {Object} newCreatedLocus the locus which just create meeting object of it\n * @returns {undefined}\n * @public\n * @memberof Meetings\n */\n checkHandleBreakoutLocus(newCreatedLocus) {\n if (\n !newCreatedLocus ||\n !this.breakoutLocusForHandleLater ||\n !this.breakoutLocusForHandleLater.length\n ) {\n return;\n }\n if (MeetingsUtil.isBreakoutLocusDTO(newCreatedLocus)) {\n return;\n }\n const existIndex = this.breakoutLocusForHandleLater.findIndex(\n (breakoutLocus) =>\n breakoutLocus.controls?.breakout?.url === newCreatedLocus.controls?.breakout?.url\n );\n\n if (existIndex < 0) {\n return;\n }\n\n const associateBreakoutLocus = this.breakoutLocusForHandleLater[existIndex];\n this.handleLocusEvent({locus: associateBreakoutLocus, locusUrl: associateBreakoutLocus.url});\n this.breakoutLocusForHandleLater.splice(existIndex, 1);\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"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEA;AACA;AAEA;AACA;AAEA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AA2BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAA0D;AAAA;AAAA;AAAA;AAAA;AAAA;AAG1D,IAAIA,WAAW;AAAC,IAEVC,WAAW;EAAA;IAAA;EAAA;EAAA;IAAA;IAAA,OACf,gBAAc;MAAA;MACZ,uBAAAC,oBAAW,CAACC,MAAM,EAACC,IAAI,sCAAS;IAClC;EAAC;IAAA;IAAA,OAED,eAAa;MAAA;MACX,wBAAAF,oBAAW,CAACC,MAAM,EAACE,GAAG,uCAAS;IACjC;EAAC;IAAA;IAAA,OAED,iBAAe;MAAA;MACb,wBAAAH,oBAAW,CAACC,MAAM,EAACG,KAAK,uCAAS;IACnC;EAAC;IAAA;IAAA,OAED,gBAAc;MAAA;MACZ,wBAAAJ,oBAAW,CAACC,MAAM,EAACI,IAAI,uCAAS;IAClC;EAAC;IAAA;IAAA,OAED,iBAAe;MAAA;MACb,wBAAAL,oBAAW,CAACC,MAAM,EAACK,KAAK,uCAAS;IACnC;EAAC;IAAA;IAAA,OAED,iBAAe;MAAA;MACb,wBAAAN,oBAAW,CAACC,MAAM,EAACM,KAAK,uCAAS;IACnC;EAAC;EAAA;AAAA;AAEH;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;AAHA,IAIqBC,QAAQ;EAAA;EAAA;EAe3B;AACF;AACA;AACA;AACA;AACA;EACE,oBAAqB;IAAA;IAAA;IAAA,kCAANC,IAAI;MAAJA,IAAI;IAAA;IACjB,gDAASA,IAAI;;IAEb;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;IARI;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA,wFAXUC,mBAAQ;IAAA;MAAA,mFAupBS,iBAAOC,OAA+B;QAAA;QAAA;UAAA;YAAA;cACjE;cACMC,SAAS,GAAG,MAAKC,KAAK,CAACC,WAAW,CAACC,UAAU,CAACC,YAAY;cAAA,iCAEzD,IAAIC,kBAAkB,CAACC,oBAAoB;gBAAEN,SAAS,EAATA;cAAS,GAAKD,OAAO,EAAE;YAAA;YAAA;cAAA;UAAA;QAAA;MAAA,CAC5E;MAAA;QAAA;MAAA;IAAA;IAAA;MAAA,oFAU+B,kBAAOA,OAAkC;QAAA;QAAA;UAAA;YAAA;cACvE;cACMC,SAAS,GAAG,MAAKC,KAAK,CAACC,WAAW,CAACC,UAAU,CAACC,YAAY;cAAA,kCAEzD,IAAIC,kBAAkB,CAACE,uBAAuB;gBAAEP,SAAS,EAATA;cAAS,GAAKD,OAAO,EAAE;YAAA;YAAA;cAAA;UAAA;QAAA;MAAA,CAC/E;MAAA;QAAA;MAAA;IAAA;IAvpBC,MAAKS,YAAY,GAAGH,kBAAkB;;IAEtC;AACJ;AACA;AACA;AACA;AACA;AACA;IACI;IACA,MAAKI,OAAO,GAAG,IAAIC,iBAAO,CAAC,CAAC,CAAC,EAAE;MAACC,MAAM,EAAE,MAAKV;IAAK,CAAC,CAAC;IACpD;AACJ;AACA;AACA;AACA;AACA;AACA;IACI;IACA,MAAKW,aAAa,GAAG,IAAIC,gBAAa,CAAC;MAACZ,KAAK,EAAE,MAAKA;IAAK,CAAC,CAAC;IAC3D,MAAKa,iBAAiB,GAAG,IAAIC,mBAAiB,EAAE;IAChD;AACJ;AACA;AACA;AACA;AACA;AACA;IACI,MAAKC,mBAAmB,GAAG,IAAI;IAC/B;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;IACI,MAAKC,YAAY,GAAG,IAAI;;IAExB;AACJ;AACA;AACA;AACA;AACA;AACA;IACI,MAAKC,UAAU,GAAG,KAAK;;IAEvB;AACJ;AACA;AACA;AACA;AACA;AACA;IACI,MAAKC,kBAAkB,GAAG,EAAE;;IAE5B;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;IACI,MAAKC,KAAK,GAAG;MACXC,YAAY,EAAEC,cAAK,CAACD,YAAY;MAChCE,kBAAkB,EAAED,cAAK,CAACC;IAC5B,CAAC;IAED,MAAKC,OAAO,EAAE;IAAC;EACjB;;EAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;EAPE;IAAA;IAAA,OAQA,+BAA8BC,OAAY,EAAEC,QAAa,EAAE;MAAA;MACzD,IAAMC,WAAW,yBAAGD,QAAQ,CAACE,QAAQ,gFAAjB,mBAAmBC,QAAQ,0DAA3B,sBAA6BC,GAAG;MACpD,IAAMC,aAAa,GAAG,IAAI,CAACjB,iBAAiB,CAACkB,sBAAsB,CAACL,WAAW,CAAC;MAEhF,IAAMM,YAAY,GAAG,CAAAP,QAAQ,aAARA,QAAQ,yCAARA,QAAQ,CAAEQ,IAAI,mDAAd,eAAgBC,KAAK,MAAKC,mBAAQ;MACvD,IAAMC,WAAW,GAAG,CAAAX,QAAQ,aAARA,QAAQ,0CAARA,QAAQ,CAAEQ,IAAI,oDAAd,gBAAgBC,KAAK,MAAKG,iBAAM,IAAI,CAAAZ,QAAQ,aAARA,QAAQ,0CAARA,QAAQ,CAAEQ,IAAI,oDAAd,gBAAgBK,MAAM,MAAKC,kBAAO;MAC1F;MACA,IAAMC,kBAAkB,GAAGC,cAAY,CAACC,aAAa,CAACjB,QAAQ,EAAE,IAAI,CAACzB,KAAK,CAAC2C,QAAQ,CAACC,MAAM,CAACf,GAAG,CAAC;MAC/F,IAAMgB,wBAAwB,GAAGJ,cAAY,CAACK,kBAAkB,CAC9DtB,OAAO,EACPC,QAAQ;MACR;MACA,IAAI,CAACzB,KAAK,CAAC2C,QAAQ,CAACC,MAAM,CAACf,GAAG,CAC/B;MACD,IAAMkB,6BAA6B,GACjC,CAAAjB,aAAa,aAAbA,aAAa,gDAAbA,aAAa,CAAEkB,UAAU,0DAAzB,sBAA2BC,aAAa,KACxCnB,aAAa,CAACkB,UAAU,CAACC,aAAa,MAAKzB,OAAO,aAAPA,OAAO,uBAAPA,OAAO,CAAEyB,aAAa;MAEnE,IAAIjB,YAAY,IAAIa,wBAAwB,EAAE;QAC5C1D,oBAAW,CAACC,MAAM,CAACE,GAAG,CACpB,+FAA+F,CAChG;QACD,IAAIwC,aAAa,aAAbA,aAAa,eAAbA,aAAa,CAAEkB,UAAU,IAAIR,kBAAkB,EAAE;UAAA;UACnD,IAAMU,iBAAiB,GACrB,2BAAApB,aAAa,CAACkB,UAAU,CAACG,QAAQ,2DAAjC,uBAAmCC,MAAM,IAAG,CAAC,GACzCtB,aAAa,CAACkB,UAAU,CAACG,QAAQ,CAAC,CAAC,CAAC,CAACE,SAAS,GAC9C,EAAE;UACR,IAAMC,iBAAiB,GACrB,0BAAAd,kBAAkB,CAACW,QAAQ,0DAA3B,sBAA6BC,MAAM,IAAG,CAAC,GAAGZ,kBAAkB,CAACW,QAAQ,CAAC,CAAC,CAAC,CAACE,SAAS,GAAG,EAAE;UACzF,IAAIH,iBAAiB,IAAII,iBAAiB,IAAIJ,iBAAiB,GAAGI,iBAAiB,EAAE;YACnFnE,oBAAW,CAACC,MAAM,CAACE,GAAG,4GACgFgE,iBAAiB,4BAAkBJ,iBAAiB,EACzJ;YAED,OAAO,KAAK;UACd;QACF;QAEA,OAAO,IAAI;MACb;MACA,IAAIH,6BAA6B,EAAE;QACjC5D,oBAAW,CAACC,MAAM,CAACE,GAAG,uJAC2HoC,WAAW,EAC3J;QAED,OAAO,KAAK;MACd;MACA,IAAIU,WAAW,IAAIX,QAAQ,aAARA,QAAQ,kCAARA,QAAQ,CAAEQ,IAAI,4CAAd,gBAAgBsB,OAAO,EAAE;QAC1CpE,oBAAW,CAACC,MAAM,CAACE,GAAG,CACpB,6GAA6G,CAC9G;QAED,OAAO,KAAK;MACd;MACAH,oBAAW,CAACC,MAAM,CAACE,GAAG,CACpB,6FAA6F,CAC9F;MAED,OAAO,IAAI;IACb;;IAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;EAPE;IAAA;IAAA,OAQA,8BAA6BkC,OAAY,EAAEC,QAAa,EAAE;MACxD,IAAIA,QAAQ,EAAE;QAAA;QACZ,IAAM+B,oBAAoB,GAAGf,cAAY,CAACgB,kBAAkB,CAAChC,QAAQ,CAAC;QACtE,IAAMW,WAAW,GAAG,CAAAX,QAAQ,aAARA,QAAQ,0CAARA,QAAQ,CAAEQ,IAAI,oDAAd,gBAAgBC,KAAK,MAAKG,iBAAM,IAAI,CAAAZ,QAAQ,aAARA,QAAQ,0CAARA,QAAQ,CAAEQ,IAAI,oDAAd,gBAAgBK,MAAM,MAAKC,kBAAO;QAC1F,IAAI,CAACf,OAAO,EAAE;UACZ,IAAIgC,oBAAoB,EAAE;YAAA;YACxBrE,oBAAW,CAACC,MAAM,CAACE,GAAG,6HAC0EmC,QAAQ,CAACiC,SAAS,wDAAlB,oBAAoBC,MAAM,EACzH;YAED,OAAO,oBAAAlC,QAAQ,CAACQ,IAAI,oDAAb,gBAAeC,KAAK,MAAKC,mBAAQ;UAC1C;UAEA,OAAO,IAAI,CAACyB,qBAAqB,CAACpC,OAAO,EAAEC,QAAQ,CAAC;QACtD;QACA,IAAI,CAAC+B,oBAAoB,EAAE;UACzB,OAAO,IAAI,CAACI,qBAAqB,CAACpC,OAAO,EAAEC,QAAQ,CAAC;QACtD;QAEA,OAAO,CAACW,WAAW;MACrB;MAEA,OAAO,IAAI;IACb;;IAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EARE;IAAA;IAAA,OASA,wCAA+ByB,IAAI,EAAE;MAAA;MACnC;MACA;MACA;MACA,OACE,IAAI,CAAChD,iBAAiB,CAACiD,QAAQ,CAACC,oBAAS,EAAEF,IAAI,CAACG,QAAQ,CAAC;MACzD;MACA,IAAI,CAACnD,iBAAiB,CAACiD,QAAQ,CAC7BG,yBAAc;MACd;MACAxB,cAAY,CAACyB,qBAAqB,CAAC,IAAI,CAAClE,KAAK,CAAC2C,QAAQ,CAACC,MAAM,CAACf,GAAG,EAAEgC,IAAI,CAACM,KAAK,CAAC,CAC/E,IACD,IAAI,CAACtD,iBAAiB,CAACiD,QAAQ,CAC7BM,kBAAO,EACPP,IAAI,CAACM,KAAK,CAAClC,IAAI,IACb4B,IAAI,CAACM,KAAK,CAAClC,IAAI,CAACoC,YAAY,IAC5BR,IAAI,CAACM,KAAK,CAAClC,IAAI,CAACoC,YAAY,CAACC,eAAe,CAC/C,KACA,oBAAAT,IAAI,CAACM,KAAK,CAAC9E,IAAI,6CAAf,iBAAiBkF,qBAAqB,GACnCC,SAAS,GACT,IAAI,CAAC3D,iBAAiB,CAACiD,QAAQ,CAACW,2BAAgB,EAAEZ,IAAI,CAACM,KAAK,CAACO,eAAe,CAAC,CAAC,IAClF,IAAI,CAAC7D,iBAAiB,CAACiD,QAAQ,CAACa,wBAAa,iBAAEd,IAAI,CAACM,KAAK,qEAAV,YAAY9E,IAAI,sDAAhB,kBAAkBuF,cAAc,CAAC;IAEpF;;IAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EAVE;IAAA;IAAA,OAWA,0BAAyBf,IAAoC,EAAiC;MAAA;QAAA;QAAA;MAAA,IAA/BgB,qBAAqB,uEAAG,KAAK;MAC1F,IAAIrD,OAAO,GAAG,IAAI,CAACsD,8BAA8B,CAACjB,IAAI,CAAC;;MAEvD;MACA;;MAEA,IAAI,CAACrC,OAAO,IAAI,iBAAAqC,IAAI,CAACM,KAAK,0EAAV,aAAYhB,QAAQ,0DAApB,sBAAsBC,MAAM,IAAG,CAAC,EAAE;QAChD;QACA5B,OAAO,GAAG,IAAI,CAACX,iBAAiB,CAACiD,QAAQ,CACvCC,oBAAS,EACTF,IAAI,CAACM,KAAK,CAAChB,QAAQ,CAACU,IAAI,CAACM,KAAK,CAAChB,QAAQ,CAACC,MAAM,GAAG,CAAC,CAAC,CAACY,QAAQ,CAC7D;MACH;MAEA,IAAIxC,OAAO,IAAI,CAACiB,cAAY,CAACgB,kBAAkB,CAACI,IAAI,CAACM,KAAK,CAAC,EAAE;QAC3D3C,OAAO,CAACuD,SAAS,CAACC,2BAA2B,CAACnB,IAAI,CAACM,KAAK,CAAC;MAC3D;MACA,IAAI,CAAC,IAAI,CAACc,oBAAoB,CAACzD,OAAO,EAAEqC,IAAI,CAACM,KAAK,CAAC,EAAE;QACnDhF,oBAAW,CAACC,MAAM,CAACE,GAAG,2EAErB;QAED;MACF;MACA,IAAI,CAACkC,OAAO,EAAE;QACZ;QACA;QACA;QACA;QACA;;QAEA;QACA;QACA;QACA;QACA;QACA;;QAEA;QACA;;QAEA;QACA;;QAEA,IACEqC,IAAI,CAACM,KAAK,IACVN,IAAI,CAACM,KAAK,CAACT,SAAS,IACpBG,IAAI,CAACM,KAAK,CAACT,SAAS,CAACxB,KAAK,KAAKgD,gBAAK,CAACC,KAAK,CAACC,QAAQ,EACnD;UACA;UACAjG,oBAAW,CAACC,MAAM,CAACI,IAAI,CACrB,2FAA2F,CAC5F;UAED;QACF;;QAEA;QACA;;QAEA,IACEqE,IAAI,CAACM,KAAK,IACVN,IAAI,CAACM,KAAK,CAAClC,IAAI,IACf4B,IAAI,CAACM,KAAK,CAAClC,IAAI,CAACC,KAAK,KAAKG,iBAAM,IAChCwB,IAAI,CAACM,KAAK,CAAClC,IAAI,CAACsB,OAAO,KAAK,IAAI,EAChC;UACA;UACApE,oBAAW,CAACC,MAAM,CAACI,IAAI,CACrB,2FAA2F,CAC5F;UAED;QACF;QAEA,IAAI,CAAC6F,MAAM,CAACxB,IAAI,CAACM,KAAK,EAAEmB,qBAAU,EAAET,qBAAqB,CAAC,CACvDU,IAAI,CAAC,UAACC,UAAU,EAAK;UACpBhE,OAAO,GAAGgE,UAAU;;UAEpB;UACAhE,OAAO,CAACuD,SAAS,CAACU,YAAY,CAAC5B,IAAI,CAACM,KAAK,CAAC;UAC1C,MAAI,CAACuB,wBAAwB,CAAC7B,IAAI,CAACM,KAAK,CAAC;QAC3C,CAAC,CAAC,CACDwB,KAAK,CAAC,UAACC,CAAC,EAAK;UACZzG,oBAAW,CAACC,MAAM,CAACG,KAAK,CAACqG,CAAC,CAAC;QAC7B,CAAC,CAAC,CACDC,OAAO,CAAC,YAAM;UACb;UACA;;UAEA,IAAI,MAAI,CAACC,gBAAgB,CAACC,eAAI,EAAEvE,OAAO,CAACwE,EAAE,CAAC,EAAE;YAC3CC,gBAAO,CAACC,SAAS,CAAC;cAChBC,KAAK,EAAEC,iBAAS,CAACC,cAAc;cAC/B7E,OAAO,EAAPA,OAAO;cACPqC,IAAI,EAAE;gBAACyC,OAAO,EAAEA,eAAO,CAACC;cAAa;YACvC,CAAC,CAAC;YACFC,qBAAO,CAACF,OAAO,CACb,MAAI,EACJ;cACEG,IAAI,EAAE,UAAU;cAChBC,QAAQ,EAAE;YACZ,CAAC,EACDC,yBAAc,CAACC,aAAa,EAC5B;cACEpF,OAAO,EAAPA,OAAO;cACPqF,IAAI,EAAErF,OAAO,CAACqF,IAAI,KAAKC,oBAAS,GAAGC,iBAAM,GAAGC;YAC9C,CAAC,CACF;UACH,CAAC,MAAM;YACL;YACA7H,oBAAW,CAACC,MAAM,CAACI,IAAI,CACrB,kGAAkG,CACnG;UACH;QACF,CAAC,CAAC;MACN,CAAC,MAAM;QACLgC,OAAO,CAACuD,SAAS,CAACkC,KAAK,CAACzF,OAAO,EAAEqC,IAAI,CAAC;MACxC;IACF;;IAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EARE;IAAA;IAAA,OASA,4BAA2BqD,QAAqB,EAAE;MAChD,IAAOrD,IAAI,GAAIqD,QAAQ,CAAhBrD,IAAI;MACX;MACA,IAAOuC,SAAS,GAAIvC,IAAI,CAAjBuC,SAAS;MAEhB,IAAIA,SAAS,IAAIA,SAAS,KAAKe,qBAAU,CAACC,YAAY,EAAE;QACtD,IAAI,CAACC,gBAAgB,CAACxD,IAAI,EAAE,IAAI,CAAC;MACnC;IACF;;IAEA;AACF;AACA;AACA;AACA;AACA;EALE;IAAA;IAAA,OAMA,gCAA+B;MAC7B2C,qBAAO,CAACF,OAAO,CACb,IAAI,EACJ;QACEG,IAAI,EAAE,gBAAgB;QACtBC,QAAQ,EAAE;MACZ,CAAC,EACDC,yBAAc,CAACW,6BAA6B,CAC7C;IACH;;IAEA;AACF;AACA;AACA;AACA;AACA;EALE;IAAA;IAAA,OAMA,2BAA0B;MAAA;MACxB;MACA,IAAI,CAACtH,KAAK,CAAC2C,QAAQ,CAAC4E,OAAO,CAACC,EAAE,CAACL,qBAAU,CAACM,aAAa,EAAE,UAACP,QAAQ,EAAK;QACrE,MAAI,CAACQ,kBAAkB,CAACR,QAAQ,CAAC;MACnC,CAAC,CAAC;MACF;MACA,IAAI,CAAClH,KAAK,CAAC2C,QAAQ,CAAC4E,OAAO,CAACC,EAAE,CAACG,eAAI,CAACC,YAAY,EAAE,UAACV,QAAQ,EAAK;QAC9DzE,cAAY,CAACoF,iBAAiB,CAACX,QAAQ,EAAE,MAAI,CAACrG,iBAAiB,CAAC;MAClE,CAAC,CAAC;;MAEF;MACA,IAAI,CAACb,KAAK,CAAC2C,QAAQ,CAAC4E,OAAO,CAACC,EAAE,CAACM,iBAAM,EAAE,YAAM;QAC3C,MAAI,CAACC,YAAY,EAAE;MACrB,CAAC,CAAC;;MAEF;MACA,IAAI,CAAC/H,KAAK,CAAC2C,QAAQ,CAAC4E,OAAO,CAACC,EAAE,CAACQ,kBAAO,EAAE,YAAM;QAC5C,MAAI,CAACC,oBAAoB,EAAE;MAC7B,CAAC,CAAC;IACJ;;IAEA;AACF;AACA;AACA;AACA;AACA;EALE;IAAA;IAAA,OAMA,kCAAiC;MAC/B;MACA,IAAI,CAACjI,KAAK,CAAC2C,QAAQ,CAAC4E,OAAO,CAACW,GAAG,CAACf,qBAAU,CAACM,aAAa,CAAC;MACzD;MACA,IAAI,CAACzH,KAAK,CAAC2C,QAAQ,CAAC4E,OAAO,CAACW,GAAG,CAACP,eAAI,CAACC,YAAY,CAAC;MAClD;MACA,IAAI,CAAC5H,KAAK,CAAC2C,QAAQ,CAAC4E,OAAO,CAACW,GAAG,CAACJ,iBAAM,CAAC;IACzC;;IAEA;AACF;AACA;AACA;AACA;EAJE;IAAA;IAAA,OAKA,mBAAkB;MAAA;MAChB;MACA,IAAI,CAAC9H,KAAK,CAACmI,IAAI,CAACC,gBAAK,EAAE,YAAM;QAC3B;QACAC,gBAAY,CAACC,GAAG,CAAC,MAAI,CAACC,MAAM,CAAC;QAC7B;QACAC,qBAAY,CAACF,GAAG,CAAC,MAAI,CAACC,MAAM,CAACE,OAAO,CAAC;QACrC;QACAtJ,oBAAW,CAACmJ,GAAG,CAAC,MAAI,CAACtI,KAAK,CAACZ,MAAM,CAAC;QAElCH,WAAW,GAAG,IAAIC,WAAW,EAAE;QAC/B,IAAAwJ,4BAAS,EAACzJ,WAAW,CAAC;;QAEtB;AACN;AACA;AACA;AACA;AACA;AACA;QACM;QACA,MAAI,CAAC0J,WAAW,GAAG,MAAI,CAACJ,MAAM,CAACK,YAAY,CAACC,qBAAqB;QAC7D;QACA,IAAIC,qBAAa,CAAC,MAAI,CAAC9I,KAAK,CAAC;QAC7B;QACA,IAAI+I,oBAAW,CAAC,MAAI,CAAC/I,KAAK,CAAC;QAC/B;QACA,MAAI,CAACe,mBAAmB,GAAG,IAAIiI,4BAAmB,CAChD;UAACL,WAAW,EAAE,MAAI,CAACA;QAAW,CAAC;QAC/B;QACA;UAACjI,MAAM,EAAE,MAAI,CAACV;QAAK,CAAC,CACrB;QAEDwG,qBAAO,CAACF,OAAO,CACb,MAAI,EACJ;UACEG,IAAI,EAAE,UAAU;UAChBC,QAAQ,EAAE;QACZ,CAAC,EACDC,yBAAc,CAACsC,cAAc,CAC9B;QAEDxG,cAAY,CAACyG,gBAAgB,CAAC;UAACC,oBAAoB,EAAE;QAAI,CAAC,CAAC;QAC3D;QACAlD,gBAAO,CAACR,YAAY,CAAC,MAAI,CAAC5E,iBAAiB,EAAE,MAAI,CAACb,KAAK,CAAC;MAC1D,CAAC,CAAC;IACJ;;IAEA;AACF;AACA;AACA;AACA;AACA;AACA;EANE;IAAA;IAAA,OAOA,gCAA+BoJ,WAAoB,EAAE;MAAA;MACnD,IAAI,OAAOA,WAAW,KAAK,SAAS,EAAE;QACpC;MACF;MACA;MACA,IAAI,qBAAI,CAACb,MAAM,0EAAX,aAAaK,YAAY,0DAAzB,sBAA2BC,qBAAqB,MAAKO,WAAW,EAAE;QACpE;QACA,IAAI,CAACb,MAAM,CAACK,YAAY,CAACC,qBAAqB,GAAGO,WAAW;QAC5D;QACA,IAAI,CAACT,WAAW,GAAGS,WAAW,GAAG,IAAIN,qBAAa,CAAC,IAAI,CAAC9I,KAAK,CAAC,GAAG,IAAI+I,oBAAW,CAAC,IAAI,CAAC/I,KAAK,CAAC;MAC9F;IACF;;IAEA;AACF;AACA;AACA;AACA;AACA;AACA;EANE;IAAA;IAAA,OAOA,8BAA6BqJ,MAAe,EAAE;MAC5C,IAAI,OAAOA,MAAM,KAAK,SAAS,EAAE;QAC/B;MACF;MACA;MACA,IAAI,CAACd,MAAM,CAACK,YAAY,CAACU,mBAAmB,GAAGD,MAAM;IACvD;;IAEA;AACF;AACA;AACA;AACA;AACA;AACA;EANE;IAAA;IAAA,OAOA,8BAA6BD,WAAoB,EAAE;MAAA;MACjD,IAAI,OAAOA,WAAW,KAAK,SAAS,EAAE;QACpC;MACF;MACA;MACA,IAAI,sBAAI,CAACb,MAAM,2EAAX,cAAaK,YAAY,0DAAzB,sBAA2BW,mBAAmB,MAAKH,WAAW,EAAE;QAClE;QACA,IAAI,CAACb,MAAM,CAACK,YAAY,CAACW,mBAAmB,GAAGH,WAAW;MAC5D;IACF;;IAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;EAPE;IAAA;IAAA,OAQA,oBAAkB;MAAA;MAChB;MACA,IAAI,CAAC,IAAI,CAACpJ,KAAK,CAACwJ,YAAY,EAAE;QAC5BrK,oBAAW,CAACC,MAAM,CAACG,KAAK,CACtB,6EAA6E,CAC9E;QAED,OAAO,iBAAQkK,MAAM,CAAC,IAAIC,KAAK,CAAC,sBAAsB,CAAC,CAAC;MAC1D;MAEA,IAAI,IAAI,CAACzI,UAAU,EAAE;QACnB9B,oBAAW,CAACC,MAAM,CAACC,IAAI,CACrB,sEAAsE,CACvE;QAED,OAAO,iBAAQsK,OAAO,EAAE;MAC1B;MAEA,OAAO,iBAAQC,GAAG,CAAC,CACjB,IAAI,CAACC,2BAA2B,EAAE,EAClC,IAAI,CAACC,UAAU,EAAE,EACjB,IAAI,CAACC,iBAAiB,EAAE,CAACpE,KAAK,CAAC,UAACpG,KAAK,EAAK;QACxCJ,oBAAW,CAACC,MAAM,CAACG,KAAK,kDAA2CA,KAAK,CAACyK,OAAO,EAAG;MACrF,CAAC,CAAC;MACF;MACA,IAAI,CAAChK,KAAK,CAAC2C,QAAQ,CAACC,MAAM,CACvBqH,QAAQ;MACT;MAAA,CACC1E,IAAI,CAAC;QAAA,OACJpG,oBAAW,CAACC,MAAM,CAACC,IAAI,EACrB;QAAA,8DACuD,MAAI,CAACW,KAAK,CAAC2C,QAAQ,CAACC,MAAM,CAACf,GAAG,EACtF;MAAA;MAEH;MAAA,CACC0D,IAAI,CAAC;QAAA,OAAM,MAAI,CAACvF,KAAK,CAAC2C,QAAQ,CAAC4E,OAAO,CAAC2C,OAAO,EAAE;MAAA,EAAC,EACpDzH,cAAY,CAACyG,gBAAgB,CAACiB,IAAI,CAAC,IAAI,CAAC,CACzC,CAAC,CACC5E,IAAI,CAAC,YAAM;QACV,MAAI,CAAC6E,eAAe,EAAE;QACtB5D,qBAAO,CAACF,OAAO,CACb,MAAI,EACJ;UACEG,IAAI,EAAE,UAAU;UAChBC,QAAQ,EAAE;QACZ,CAAC,EACDC,yBAAc,CAAC0D,mBAAmB,CACnC;QACD,MAAI,CAACpJ,UAAU,GAAG,IAAI;QACtBgF,gBAAO,CAACqE,oBAAoB,CAACC,mBAAkB,CAACC,6BAA6B,CAAC;MAChF,CAAC,CAAC,CACD7E,KAAK,CAAC,UAACpG,KAAK,EAAK;QAChBJ,oBAAW,CAACC,MAAM,CAACG,KAAK,kEACoCA,KAAK,CAACyK,OAAO,EACxE;QAED/D,gBAAO,CAACqE,oBAAoB,CAACC,mBAAkB,CAACE,4BAA4B,EAAE;UAC5EnI,MAAM,EAAE/C,KAAK,CAACyK,OAAO;UACrBU,KAAK,EAAEnL,KAAK,CAACmL;QACf,CAAC,CAAC;QAEF,OAAO,iBAAQjB,MAAM,CAAClK,KAAK,CAAC;MAC9B,CAAC,CAAC;IACN;;IAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;EAPE;IAAA;IAAA,OAQA,sBAAa;MAAA;MACX,IAAI,CAAC,IAAI,CAAC0B,UAAU,EAAE;QACpB9B,oBAAW,CAACC,MAAM,CAACC,IAAI,CACrB,0EAA0E,CAC3E;QAED,OAAO,iBAAQsK,OAAO,EAAE;MAC1B;MAEA,IAAI,CAACgB,sBAAsB,EAAE;MAE7B;QACE;QACA,IAAI,CAAC3K,KAAK,CAAC2C,QAAQ,CAAC4E,OAAO,CACxBqD,UAAU;QACX;QAAA,CACCrF,IAAI,CAAC;UAAA,OAAM,MAAI,CAACvF,KAAK,CAAC2C,QAAQ,CAACC,MAAM,CAACiI,UAAU,EAAE;QAAA,EAAC,CACnDtF,IAAI,CAAC,YAAM;UACViB,qBAAO,CAACF,OAAO,CACb,MAAI,EACJ;YACEG,IAAI,EAAE,UAAU;YAChBC,QAAQ,EAAE;UACZ,CAAC,EACDC,yBAAc,CAACmE,qBAAqB,CACrC;UACD,MAAI,CAAC7J,UAAU,GAAG,KAAK;QACzB,CAAC;MAAC;IAER;;IAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;EAPE;IAAA;IAAA;IA8BA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;IACE,sBAUE;MAAA;MAAA,IATAnB,OAQC,uEAAG,CAAC,CAAC;MAENX,oBAAW,CAACC,MAAM,CAACC,IAAI,CAAC,8CAA8C,CAAC;MAEvE,OAAO,IAAI,CAACsB,aAAa,CACtBoK,UAAU,CAACjL,OAAO,CAAC,CACnByF,IAAI,CAAC,UAACyF,YAAY,EAAK;QACtB7L,oBAAW,CAACC,MAAM,CAACC,IAAI,CACrB,kEAAkE,EAClE2L,YAAY,CACb;QACDxE,qBAAO,CAACF,OAAO,CACb,MAAI,EACJ;UACEG,IAAI,EAAE,UAAU;UAChBC,QAAQ,EAAE;QACZ,CAAC,EACDC,yBAAc,CAACsE,0BAA0B,EACzC;UACEC,SAAS,EAAEpL,OAAO,CAACoL,SAAS;UAC5BC,OAAO,EAAEH;QACX,CAAC,CACF;QAED,OAAOA,YAAY;MACrB,CAAC,CAAC,CACDrF,KAAK,CAAC,UAACyF,WAAW,EAAK;QACtBjM,oBAAW,CAACC,MAAM,CAACG,KAAK,CACtB,iEAAiE,EACjE6L,WAAW,CACZ;QACD5E,qBAAO,CAACF,OAAO,CACb,MAAI,EACJ;UACEG,IAAI,EAAE,UAAU;UAChBC,QAAQ,EAAE;QACZ,CAAC,EACDC,yBAAc,CAAC0E,0BAA0B,EACzC;UACEH,SAAS,EAAEpL,OAAO,CAACoL,SAAS;UAC5B5I,MAAM,EAAE8I;QACV,CAAC,CACF;QAEDnF,gBAAO,CAACqE,oBAAoB,CAACC,mBAAkB,CAACe,mBAAmB,EAAE;UACnE;UACAJ,SAAS,EAAEpL,OAAO,CAACyL,UAAU;UAC7BjJ,MAAM,EAAE8I,WAAW,CAACpB,OAAO;UAC3BU,KAAK,EAAEU,WAAW,CAACV,KAAK;UACxBc,IAAI,EAAEJ,WAAW,CAACI;QACpB,CAAC,CAAC;MACJ,CAAC,CAAC;IACN;;IAEA;AACF;AACA;AACA;AACA;AACA;EALE;IAAA;IAAA,OAMA,2BAAkB;MAChB;MACA,IAAI,CAACxK,YAAY,GAAG,IAAIyK,qBAAY,CAAC,IAAI,CAACzL,KAAK,CAAC;IAClD;;IAEA;AACF;AACA;AACA;AACA;AACA;EALE;IAAA;IAAA,OAMA,2BAAkB;MAChB,OAAO,IAAI,CAACgB,YAAY;IAC1B;;IAEA;AACF;AACA;AACA;AACA;AACA;EALE;IAAA;IAAA,OAMA,6BAAoB;MAClB,IAAI,CAAC,IAAI,CAACA,YAAY,EAAE;QACtB,IAAI,CAAC0K,eAAe,EAAE;MACxB;MAEA,OAAO,IAAI,CAACC,eAAe,EAAE,CAACC,kBAAkB,EAAE;IACpD;;IAEA;AACF;AACA;AACA;AACA;AACA;EALE;IAAA;IAAA,OAMA,sBAAa;MAAA;MACX,OAAO,IAAI,CAACpL,OAAO,CAACqL,YAAY,EAAE,CAACtG,IAAI,CAAC,UAACuG,GAAG,EAAK;QAC/C,MAAI,CAACC,WAAW,GAAGD,GAAG;MACxB,CAAC,CAAC;IACJ;;IAEA;AACF;AACA;AACA;AACA;AACA;AACA;EANE;IAAA;IAAA,OAOA,uCAA8B;MAAA;MAC5B,OAAO,IAAI,CAACtL,OAAO,CAACwL,qBAAqB,EAAE,CAACzG,IAAI,CAAC,UAACuG,GAAG,EAAK;QACxD,IAAIA,GAAG,EAAE;UACP,MAAI,CAAC5K,kBAAkB,GAAGuB,cAAY,CAACwJ,sCAAsC,CAACH,GAAG,CAAC;QACpF;;QAEA;QACA,IAAI,CAAC,MAAI,CAAC5K,kBAAkB,EAAE;UAC5B;UACA,OAAO,MAAI,CAAClB,KAAK,CAAC2C,QAAQ,CAACuJ,IAAI,CAC5BC,GAAG,EAAE,CACL5G,IAAI,CAAC,UAAC2G,IAAI,EAAK;YAAA;YACd,IAAMhL,kBAAkB,GACtBgL,IAAI,aAAJA,IAAI,gDAAJA,IAAI,CAAEE,eAAe,oFAArB,sBAAuBC,oBAAoB,2DAA3C,uBAA6CC,kBAAkB;YACjE,IAAIpL,kBAAkB,EAAE;cACtB,MAAI,CAACA,kBAAkB,GAAGA,kBAAkB;YAC9C,CAAC,MAAM;cACL,MAAM,IAAIwI,KAAK,CAAC,gBAAgB,CAAC;YACnC;UACF,CAAC,CAAC,CACD/D,KAAK,CAAC,YAAM;YACXxG,oBAAW,CAACC,MAAM,CAACG,KAAK,CACtB,gEAAgE,CACjE;UACH,CAAC,CAAC;QACN;QAEA,OAAO,iBAAQoK,OAAO,EAAE;MAC1B,CAAC,CAAC;IACJ;;IAEA;AACF;AACA;AACA;AACA;AACA;EALE;IAAA;IAAA,OAOA,kCAAyB;MACvB,OAAO,IAAI,CAAC5I,mBAAmB;IACjC;;IAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;EAPE;IAAA;IAAA,OAQA,iBAAgBS,OAAgB,EAAEc,MAAc,EAAE;MAChDiK,aAAW,CAACC,OAAO,CAAChL,OAAO,CAAC;MAC5B,IAAI,CAACX,iBAAiB,CAAC4L,MAAM,CAACjL,OAAO,CAACwE,EAAE,CAAC;MACzCQ,qBAAO,CAACF,OAAO,CACb,IAAI,EACJ;QACEG,IAAI,EAAE,UAAU;QAChBC,QAAQ,EAAE;MACZ,CAAC,EACDC,yBAAc,CAAC+F,eAAe,EAC9B;QACExB,SAAS,EAAE1J,OAAO,CAACwE,EAAE;QACrB1D,MAAM,EAANA;MACF,CAAC,CACF;IACH;;IAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EATE;IAAA;IAAA,OAUA,gBACEqK,WAAmB,EAInB;MAAA;MAAA,IAHA9F,IAAY,uEAAG,IAAI;MAAA,IACnBhC,qBAAqB,uEAAG,KAAK;MAAA,IAC7B+H,eAAe,uEAAG,CAAC,CAAC;MAEpB;;MAEA;MACA;MACA;MACA;MACA,OACE,IAAI,CAACjE,WAAW,CACbkE,gBAAgB,CAACF,WAAW,EAAE9F,IAAI;MACnC;MAAA,CACClB,KAAK,CAAC,UAACpG,KAAK,EAAK;QAChBJ,oBAAW,CAACC,MAAM,CAACC,IAAI,6EACgDE,KAAK,CAACyK,OAAO,EACnF;MACH,CAAC,CAAC,CACDzE,IAAI,CAAC,YAAuB;QAAA,IAAtBzF,OAAY,uEAAG,CAAC,CAAC;QACtB;QACA,IAAMgN,UAAU,GAAGhN,OAAO,CAAC6M,WAAW,IAAIA,WAAW;;QAErD;QACA,IAAInL,OAAO,GAAG,IAAI;QAElB,IAAIqF,IAAI,KAAKkG,6BAAkB,IAAIjN,OAAO,CAAC+G,IAAI,KAAKkG,6BAAkB,EAAE;UACtE,IAAMC,YAAY,GAAG,OAAI,CAACnM,iBAAiB,CAACiD,QAAQ,CAACW,2BAAgB,EAAEqI,UAAU,CAAC;UAElF,IAAIE,YAAY,EAAE;YAChB,IAAMC,gCAAgC,GAAG,CAACD,YAAY,CAACjI,SAAS,CAACmI,gBAAgB;;YAEjF;YACA;YACA,IAAID,gCAAgC,EAAE;cACpCzL,OAAO,GAAGwL,YAAY;YACxB;UACF;QACF;;QAEA;QACA,IAAI,CAACxL,OAAO,EAAE;UACZA,OAAO,GAAG,OAAI,CAACX,iBAAiB,CAACiD,QAAQ,CAACM,kBAAO,EAAE0I,UAAU,CAAC;QAChE;;QAEA;QACA,IAAI,CAACtL,OAAO,EAAE;UACZ;UACA,OAAO,OAAI,CAAC2L,aAAa,CACvBL,UAAU,EACVjG,IAAI,EACJhC,qBAAqB,EACrB+H,eAAe,CAChB,CAACrH,IAAI,CAAC,UAAC6H,cAAmB,EAAK;YAC9B;YACA,IAAIA,cAAc,IAAIA,cAAc,CAAC5F,EAAE,EAAE;cACvC;cACA4F,cAAc,CAAC5F,EAAE,CAAC6F,iBAAM,CAACC,eAAe,EAAE,UAACC,OAAO,EAAK;gBACrD;gBACA,IAAI,OAAI,CAAChF,MAAM,CAACiF,cAAc,EAAE;kBAAA;kBAC9B,OAAI,CAACzC,UAAU,CAAC;oBACd0C,SAAS,2BAAEL,cAAc,CAACrI,SAAS,oFAAxB,sBAA0BrB,SAAS,2DAAnC,uBAAqCgK,UAAU;oBAC1DzK,aAAa,EAAEmK,cAAc,CAACnK,aAAa;oBAC3C0K,UAAU,EAAEP,cAAc,CAACnK,aAAa;oBACxC2K,OAAO,EAAER,cAAc,CAACQ,OAAO;oBAC/B1C,SAAS,4BAAEkC,cAAc,CAACrI,SAAS,qFAAxB,uBAA0B1F,IAAI,2DAA9B,uBAAgCuF;kBAC7C,CAAC,CAAC,CAACW,IAAI,CAAC;oBAAA,OAAM,OAAI,CAACsI,OAAO,CAACT,cAAc,EAAEG,OAAO,CAACjL,MAAM,CAAC;kBAAA,EAAC;gBAC7D,CAAC,MAAM;kBACL,OAAI,CAACuL,OAAO,CAACT,cAAc,EAAEG,OAAO,CAACjL,MAAM,CAAC;gBAC9C;cACF,CAAC,CAAC;cAEF8K,cAAc,CAAC5F,EAAE,CAAC6F,iBAAM,CAACS,mBAAmB,EAAE,UAACC,eAAe,EAAK;gBACjE;gBACA,IAAI,OAAI,CAACxF,MAAM,CAACiF,cAAc,EAAE;kBAAA;kBAC9B,OAAI,CAACzC,UAAU,CAAC;oBACd0C,SAAS,EAAEM,eAAe,aAAfA,eAAe,gDAAfA,eAAe,CAAEhJ,SAAS,oFAA1B,sBAA4BrB,SAAS,2DAArC,uBAAuCgK,UAAU;oBAC5DzK,aAAa,EAAE8K,eAAe,CAAC9K,aAAa;oBAC5C0K,UAAU,EAAEI,eAAe,CAAC9K,aAAa;oBACzC2K,OAAO,EAAEG,eAAe,CAACH,OAAO;oBAChC1C,SAAS,4BAAE6C,eAAe,CAAChJ,SAAS,qFAAzB,uBAA2B1F,IAAI,2DAA/B,uBAAiCuF;kBAC9C,CAAC,CAAC;gBACJ;cACF,CAAC,CAAC;YACJ,CAAC,MAAM;cACLzF,oBAAW,CAACC,MAAM,CAACG,KAAK,4IAC8GiC,OAAO,EAC5I;YACH;;YAEA;YACA,OAAO,iBAAQmI,OAAO,CAACyD,cAAc,CAAC;UACxC,CAAC,CAAC;QACJ;;QAEA;QACA,OAAO,iBAAQzD,OAAO,CAACnI,OAAO,CAAC;MACjC,CAAC,CAAC;IAER;;IAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EARE;IAAA;IAAA;MAAA,6FASA,kBACEmL,WAAgB;QAAA;UAAA;UAAA;UAAA;UAAA;UAAA;UAAA;UAAA;UAAA;UAAA;UAAA;UAAA;UAAA;UAAA;UAAA;QAAA;UAAA;YAAA;cAChB9F,IAAY,8DAAG,IAAI;cACnBhC,qBAAqB,8DAAG,KAAK;cAC7B+H,eAAe,8DAAG,CAAC,CAAC;cAEdpL,OAAO,GAAG,IAAIwM,gBAAO,CACzB;gBACE;gBACAC,MAAM,EAAE,IAAI,CAACjO,KAAK,CAAC2C,QAAQ,CAACC,MAAM,CAACqL,MAAM;gBACzC;gBACAC,SAAS,EAAE,IAAI,CAAClO,KAAK,CAAC2C,QAAQ,CAACC,MAAM,CAACf,GAAG;gBACzC;gBACAsM,KAAK,EAAE,IAAI,CAACnO,KAAK,CAAC2C,QAAQ,CAACC,MAAM,CAACuL,KAAK;gBACvChK,KAAK,EAAE0C,IAAI,KAAKvB,qBAAU,GAAGqH,WAAW,GAAG,IAAI;gBAAE;gBACjDyB,mBAAmB,EAAE,IAAI,CAACzF,WAAW;gBACrCgE,WAAW,EAAXA,WAAW;gBACX0B,eAAe,EAAExH;cACnB,CAAC,EACD;gBACE;gBACAnG,MAAM,EAAE,IAAI,CAACV;cACf,CAAC,CACF;cAED,IAAI,CAACa,iBAAiB,CAACyH,GAAG,CAAC9G,OAAO,CAAC;cAAC;cAGlC;cACA;cACA;cACA;cACI8M,WAAW,GAAG,CAAC;cAEnB,IAAI3B,WAAW,CAACnL,OAAO,EAAE;gBAChB+M,SAAS,GAAI5B,WAAW,CAACnL,OAAO,CAAhC+M,SAAS;gBACVC,aAAa,GAAG,IAAIC,IAAI,CAACF,SAAS,CAAC;gBACnCG,kBAAkB,GAAGF,aAAa,CAACG,OAAO,EAAE;gBAC5CC,WAAW,GAAGF,kBAAkB,GAAG,mBAAU;gBAC7CG,cAAc,GAAGC,IAAI,CAACC,GAAG,CAC7BD,IAAI,CAACE,GAAG,CAACJ,WAAW,EAAEK,4CAAiC,CAAC,EACxD,CAAC,CACF;gBAEDX,WAAW,GAAGQ,IAAI,CAACI,KAAK,CAACJ,IAAI,CAACK,MAAM,EAAE,GAAGN,cAAc,CAAC;cAC1D;cACMO,eAAe,GAAG,CAAC,2BAACzC,WAAW,CAACjJ,SAAS,kDAArB,sBAAuBC,MAAM,GACvD;cACOkF,qBAAqB,GAAI,IAAI,CAACN,MAAM,CAACK,YAAY,CAAjDC,qBAAqB;cAAA,MAExBA,qBAAqB,IAAI,CAACuG,eAAe,IAAIvK,qBAAqB,IAAIyJ,WAAW,GAAG,CAAC;gBAAA;gBAAA;cAAA;cACvF9M,OAAO,CAAC6N,yBAAyB,GAAGC,UAAU,CAC5C;gBAAA,OAAM9N,OAAO,CAAC+N,gBAAgB,CAAC;kBAACC,WAAW,EAAE5C;gBAAe,CAAC,CAAC;cAAA,GAC9D0B,WAAW,CACZ;cACD9M,OAAO,CAACiO,gBAAgB,CAACjL,SAAS,EAAEmI,WAAW,CAAC;cAAC;cAAA;YAAA;cAAA;cAAA,OAE3CnL,OAAO,CAAC+N,gBAAgB,CAAC;gBAACC,WAAW,EAAE5C;cAAe,CAAC,CAAC;YAAA;cAAA;cAAA;YAAA;cAAA;cAAA;cAGhE,IACE,EAAE,wBAAe8C,qBAAY,CAAC,IAC9B,EAAE,wBAAeC,sBAAa,CAAC,IAC/B,EAAE,wBAAeC,mBAAe,CAAC,EACjC;gBACA;gBACAzQ,oBAAW,CAACC,MAAM,CAACC,IAAI,kFACqDsN,WAAW,OACtF;gBACDxN,oBAAW,CAACC,MAAM,CAACC,IAAI,CACrB,4FAA4F,CAC7F;cACH;cACAF,oBAAW,CAACC,MAAM,CAACM,KAAK,wGAEvB;YAAC;cAAA;cAEF;cACA;cACA;cACA,IAAImH,IAAI,KAAKvB,qBAAU,EAAE;gBACvB,IAAI,CAAC9D,OAAO,CAACqO,MAAM,EAAE;kBACnBrO,OAAO,CAACsO,SAAS,CAACnD,WAAW,CAAC;gBAChC;;gBAEA;gBACMoD,gBAAgB,GAAGtN,cAAY,CAACuN,mBAAmB,CAACnJ,IAAI,CAAC,EAE/D;gBACA;gBACAL,qBAAO,CAACF,OAAO,CACb,IAAI,EACJ;kBACEG,IAAI,EAAE,UAAU;kBAChBC,QAAQ,EAAE;gBACZ,CAAC,EACDC,yBAAc,CAACC,aAAa,EAC5B;kBACEpF,OAAO,EAAPA,OAAO;kBACPqF,IAAI,EAAEkJ;gBACR,CAAC,CACF;cACH;cAAC;YAAA;cAAA,kCAGIvO,OAAO;YAAA;YAAA;cAAA;UAAA;QAAA;MAAA,CAmBf;MAAA;QAAA;MAAA;MAAA;IAAA;IAED;AACF;AACA;AACA;AACA;AACA;AACA;AACA;EAPE;IAAA;IAAA,OAQA,0BAAwBqF,IAAY,EAAEoJ,KAAa,EAAE;MACnD,OAAO,IAAI,CAACpP,iBAAiB,CAACiD,QAAQ,CAAC+C,IAAI,EAAEoJ,KAAK,CAAC;IACrD;;IAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EARE;IAAA;IAAA,OASA,0BAKE;MAAA,IAJAnQ,OAGC,uEAAG,CAAC,CAAC;MAEN;MACA;MACA,OAAO,IAAI,CAACe,iBAAiB,CAACqP,MAAM,CAACpQ,OAAO,CAAC;IAC/C;;IAEA;AACF;AACA;AACA;AACA;AACA;EALE;IAAA;IAAA,OAMA,wBAAsB;MAAA;MACpB,OAAO,IAAI,CAACU,OAAO,CAChB2P,iBAAiB,EAAE,CACnB5K,IAAI,CAAC,UAAC6K,UAAU,EAAK;QACpB,IAAMC,cAAc,GAAG,EAAE;QAEzB,IAAID,UAAU,aAAVA,UAAU,eAAVA,UAAU,CAAEE,IAAI,IAAIF,UAAU,CAACE,IAAI,CAAClN,MAAM,GAAG,CAAC,EAAE;UAClD,IAAMmN,YAAY,GAAG,OAAI,CAACC,sBAAsB,CAACJ,UAAU,CAACE,IAAI,CAAC;UACjEC,YAAY,CAACE,OAAO,CAAC,UAACtM,KAAK,EAAK;YAC9BkM,cAAc,CAACK,IAAI,CAACvM,KAAK,CAACtC,GAAG,CAAC;YAC9B,OAAI,CAACwF,gBAAgB,CAAC;cACpBlD,KAAK,EAALA,KAAK;cACLH,QAAQ,EAAEG,KAAK,CAACtC;YAClB,CAAC,CAAC;UACJ,CAAC,CAAC;QACJ;QACA,IAAM8O,kBAAkB,GAAG,OAAI,CAAC9P,iBAAiB,CAACqP,MAAM,EAAE;QAE1D,IAAI,mBAAYS,kBAAkB,CAAC,CAACvN,MAAM,GAAG,CAAC,EAAE;UAC9C;UACA;UACA,kCAAsB,qBAAcuN,kBAAkB,CAAC,oCAAE;YAApD,IAAMnP,OAAO;YAChB;YACA,IAAI,CAAC6O,cAAc,CAACO,QAAQ,CAACpP,OAAO,CAACwC,QAAQ,CAAC,EAAE;cAC9C;cACA;cACA,OAAI,CAAC6J,OAAO,CAACrM,OAAO,EAAEqP,iCAAsB,CAACC,mBAAmB,CAAC;YACnE;UACF;QACF;MACF,CAAC,CAAC,CACDnL,KAAK,CAAC,UAACpG,KAAK,EAAK;QAChBJ,oBAAW,CAACC,MAAM,CAACG,KAAK,oEACsCA,KAAK,EAClE;QACD,MAAM,IAAImK,KAAK,CAACnK,KAAK,CAAC;MACxB,CAAC,CAAC;IACN;;IAEA;AACF;AACA;AACA;AACA;AACA;AACA;EANE;IAAA;IAAA,OAOA,gCAAuB+Q,IAAW,EAAE;MAAA;MAClC,IAAMS,QAAQ,GAAGT,IAAI,CAACU,MAAM,CAAC,UAAC7M,KAAK;QAAA,OAAK,CAAC1B,cAAY,CAACgB,kBAAkB,CAACU,KAAK,CAAC;MAAA,EAAC;MAChF,IAAM8M,YAAY,GAAGX,IAAI,CAACU,MAAM,CAAC,UAAC7M,KAAK;QAAA,OAAK1B,cAAY,CAACyO,oBAAoB,CAAC/M,KAAK,CAAC;MAAA,EAAC;MACrF,IAAI,CAACgN,2BAA2B,GAAG,EAAE;MACrC,IAAMZ,YAAY,oCAAOQ,QAAQ,CAAC;MAClCE,YAAY,CAACR,OAAO,CAAC,UAAC3O,aAAa,EAAK;QACtC,IAAMsP,kBAAkB,GAAGL,QAAQ,CAACM,IAAI,CACtC,UAACC,SAAS;UAAA;UAAA,OAAK,wBAAAA,SAAS,CAAC3P,QAAQ,iFAAlB,oBAAoBC,QAAQ,0DAA5B,sBAA8BC,GAAG,gCAAKC,aAAa,CAACH,QAAQ,oFAAtB,sBAAwBC,QAAQ,2DAAhC,uBAAkCC,GAAG;QAAA,EAC3F;QACD,IAAM0P,yBAAyB,GAAG,OAAI,CAACzM,8BAA8B,CAAC;UACpEX,KAAK,EAAErC,aAAa;UACpBkC,QAAQ,EAAElC,aAAa,CAACD;QAC1B,CAAC,CAAC;QAEF,IAAIuP,kBAAkB,IAAI,CAACG,yBAAyB,EAAE;UACpD;UACA;UACA;UACA,OAAI,CAACJ,2BAA2B,CAACT,IAAI,CAAC5O,aAAa,CAAC;QACtD,CAAC,MAAM;UACLyO,YAAY,CAACG,IAAI,CAAC5O,aAAa,CAAC;QAClC;MACF,CAAC,CAAC;MAEF,OAAOyO,YAAY;IACrB;;IAEA;AACF;AACA;AACA;AACA;AACA;AACA;EANE;IAAA;IAAA,OAOA,kCAAyBiB,eAAe,EAAE;MACxC,IACE,CAACA,eAAe,IAChB,CAAC,IAAI,CAACL,2BAA2B,IACjC,CAAC,IAAI,CAACA,2BAA2B,CAAC/N,MAAM,EACxC;QACA;MACF;MACA,IAAIX,cAAY,CAACgB,kBAAkB,CAAC+N,eAAe,CAAC,EAAE;QACpD;MACF;MACA,IAAMC,UAAU,GAAG,IAAI,CAACN,2BAA2B,CAACO,SAAS,CAC3D,UAAC5P,aAAa;QAAA;QAAA,OACZ,2BAAAA,aAAa,CAACH,QAAQ,qFAAtB,uBAAwBC,QAAQ,2DAAhC,uBAAkCC,GAAG,gCAAK2P,eAAe,CAAC7P,QAAQ,oFAAxB,sBAA0BC,QAAQ,2DAAlC,uBAAoCC,GAAG;MAAA,EACpF;MAED,IAAI4P,UAAU,GAAG,CAAC,EAAE;QAClB;MACF;MAEA,IAAME,sBAAsB,GAAG,IAAI,CAACR,2BAA2B,CAACM,UAAU,CAAC;MAC3E,IAAI,CAACpK,gBAAgB,CAAC;QAAClD,KAAK,EAAEwN,sBAAsB;QAAE3N,QAAQ,EAAE2N,sBAAsB,CAAC9P;MAAG,CAAC,CAAC;MAC5F,IAAI,CAACsP,2BAA2B,CAACS,MAAM,CAACH,UAAU,EAAE,CAAC,CAAC;IACxD;;IAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;EAPE;IAAA;IAAA,OAQA,gCAAuB;MACrB,OAAO,IAAI,CAAC5Q,iBAAiB,CAACqP,MAAM,CAAC;QAAC2B,SAAS,EAAE;MAAI,CAAC,CAAC;IACzD;;IAEA;AACF;AACA;AACA;EAHE;IAAA;IAAA,OAIA,qBAAY;MACV,OAAO1S,oBAAW,CAACgN,GAAG,EAAE;IAC1B;EAAC;EAAA;AAAA,EAvxCmC2F,sBAAW;AAAA"}
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+
3
+ var _Object$defineProperty = require("@babel/runtime-corejs2/core-js/object/define-property");
4
+ _Object$defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ //# sourceMappingURL=meetings.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sources":["meetings.types.ts"],"sourcesContent":["import type {\n NoiseReductionEffectOptions,\n VirtualBackgroundEffectOptions,\n} from '@webex/media-helpers';\n\ntype INoiseReductionEffect = Omit<NoiseReductionEffectOptions, 'authToken'>;\ntype IVirtualBackgroundEffect = Omit<VirtualBackgroundEffectOptions, 'authToken'>;\n\nexport type {INoiseReductionEffect, IVirtualBackgroundEffect};\n"],"mappings":""}
@@ -2,6 +2,7 @@ import '@webex/internal-plugin-mercury';
2
2
  import '@webex/internal-plugin-conversation';
3
3
  import { WebexPlugin } from '@webex/webex-core';
4
4
  import 'webrtc-adapter';
5
+ import { INoiseReductionEffect, IVirtualBackgroundEffect } from './meetings.types';
5
6
  /**
6
7
  * Meetings Ready Event
7
8
  * Emitted when the meetings instance on webex is ready
@@ -189,6 +190,24 @@ export default class Meetings extends WebexPlugin {
189
190
  * @memberof Meetings
190
191
  */
191
192
  unregister(): any;
193
+ /**
194
+ * Creates a noise reduction effect
195
+ *
196
+ * @param {INoiseReductionEffect} options optional custom effect options
197
+ * @returns {Promise<effect>} noise reduction effect.
198
+ * @public
199
+ * @memberof Meetings
200
+ */
201
+ createNoiseReductionEffect: (options?: INoiseReductionEffect) => Promise<any>;
202
+ /**
203
+ * Creates a virtual background effect
204
+ *
205
+ * @param {IVirtualBackgroundEffect} options optional custom effect options
206
+ * @returns {Promise<effect>} virtual background effect.
207
+ * @public
208
+ * @memberof Meetings
209
+ */
210
+ createVirtualBackgroundEffect: (options?: IVirtualBackgroundEffect) => Promise<any>;
192
211
  /**
193
212
  * Uploads logs to the webex services for tracking
194
213
  * @param {Object} [options={}]
@@ -0,0 +1,4 @@
1
+ import type { NoiseReductionEffectOptions, VirtualBackgroundEffectOptions } from '@webex/media-helpers';
2
+ type INoiseReductionEffect = Omit<NoiseReductionEffectOptions, 'authToken'>;
3
+ type IVirtualBackgroundEffect = Omit<VirtualBackgroundEffectOptions, 'authToken'>;
4
+ export type { INoiseReductionEffect, IVirtualBackgroundEffect };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@webex/plugin-meetings",
3
- "version": "3.0.0-beta.143",
3
+ "version": "3.0.0-beta.144",
4
4
  "description": "",
5
5
  "license": "Cisco EULA (https://www.cisco.com/c/en/us/products/end-user-license-agreement.html)",
6
6
  "contributors": [
@@ -32,12 +32,12 @@
32
32
  "build": "yarn run -T tsc --declaration true --declarationDir ./dist/types"
33
33
  },
34
34
  "devDependencies": {
35
- "@webex/plugin-meetings": "3.0.0-beta.143",
36
- "@webex/test-helper-chai": "3.0.0-beta.143",
37
- "@webex/test-helper-mocha": "3.0.0-beta.143",
38
- "@webex/test-helper-mock-webex": "3.0.0-beta.143",
39
- "@webex/test-helper-retry": "3.0.0-beta.143",
40
- "@webex/test-helper-test-users": "3.0.0-beta.143",
35
+ "@webex/plugin-meetings": "3.0.0-beta.144",
36
+ "@webex/test-helper-chai": "3.0.0-beta.144",
37
+ "@webex/test-helper-mocha": "3.0.0-beta.144",
38
+ "@webex/test-helper-mock-webex": "3.0.0-beta.144",
39
+ "@webex/test-helper-retry": "3.0.0-beta.144",
40
+ "@webex/test-helper-test-users": "3.0.0-beta.144",
41
41
  "chai": "^4.3.4",
42
42
  "chai-as-promised": "^7.1.1",
43
43
  "jsdom-global": "3.0.2",
@@ -46,19 +46,19 @@
46
46
  "typescript": "^4.7.4"
47
47
  },
48
48
  "dependencies": {
49
- "@webex/common": "3.0.0-beta.143",
49
+ "@webex/common": "3.0.0-beta.144",
50
50
  "@webex/internal-media-core": "1.38.3",
51
- "@webex/internal-plugin-conversation": "3.0.0-beta.143",
52
- "@webex/internal-plugin-device": "3.0.0-beta.143",
53
- "@webex/internal-plugin-llm": "3.0.0-beta.143",
54
- "@webex/internal-plugin-mercury": "3.0.0-beta.143",
55
- "@webex/internal-plugin-metrics": "3.0.0-beta.143",
56
- "@webex/internal-plugin-support": "3.0.0-beta.143",
57
- "@webex/internal-plugin-user": "3.0.0-beta.143",
58
- "@webex/media-helpers": "3.0.0-beta.143",
59
- "@webex/plugin-people": "3.0.0-beta.143",
60
- "@webex/plugin-rooms": "3.0.0-beta.143",
61
- "@webex/webex-core": "3.0.0-beta.143",
51
+ "@webex/internal-plugin-conversation": "3.0.0-beta.144",
52
+ "@webex/internal-plugin-device": "3.0.0-beta.144",
53
+ "@webex/internal-plugin-llm": "3.0.0-beta.144",
54
+ "@webex/internal-plugin-mercury": "3.0.0-beta.144",
55
+ "@webex/internal-plugin-metrics": "3.0.0-beta.144",
56
+ "@webex/internal-plugin-support": "3.0.0-beta.144",
57
+ "@webex/internal-plugin-user": "3.0.0-beta.144",
58
+ "@webex/media-helpers": "3.0.0-beta.144",
59
+ "@webex/plugin-people": "3.0.0-beta.144",
60
+ "@webex/plugin-rooms": "3.0.0-beta.144",
61
+ "@webex/webex-core": "3.0.0-beta.144",
62
62
  "ampersand-collection": "^2.0.2",
63
63
  "bowser": "^2.11.0",
64
64
  "btoa": "^1.2.1",
@@ -59,6 +59,7 @@ import CaptchaError from '../common/errors/captcha-error';
59
59
  import MeetingCollection from './collection';
60
60
  import MeetingsUtil from './util';
61
61
  import PermissionError from '../common/errors/permission';
62
+ import {INoiseReductionEffect, IVirtualBackgroundEffect} from './meetings.types';
62
63
 
63
64
  let mediaLogger;
64
65
 
@@ -807,6 +808,36 @@ export default class Meetings extends WebexPlugin {
807
808
  );
808
809
  }
809
810
 
811
+ /**
812
+ * Creates a noise reduction effect
813
+ *
814
+ * @param {INoiseReductionEffect} options optional custom effect options
815
+ * @returns {Promise<effect>} noise reduction effect.
816
+ * @public
817
+ * @memberof Meetings
818
+ */
819
+ createNoiseReductionEffect = async (options?: INoiseReductionEffect) => {
820
+ // @ts-ignore
821
+ const authToken = this.webex.credentials.supertoken.access_token;
822
+
823
+ return new mediaHelpersModule.NoiseReductionEffect({authToken, ...options});
824
+ };
825
+
826
+ /**
827
+ * Creates a virtual background effect
828
+ *
829
+ * @param {IVirtualBackgroundEffect} options optional custom effect options
830
+ * @returns {Promise<effect>} virtual background effect.
831
+ * @public
832
+ * @memberof Meetings
833
+ */
834
+ createVirtualBackgroundEffect = async (options?: IVirtualBackgroundEffect) => {
835
+ // @ts-ignore
836
+ const authToken = this.webex.credentials.supertoken.access_token;
837
+
838
+ return new mediaHelpersModule.VirtualBackgroundEffect({authToken, ...options});
839
+ };
840
+
810
841
  /**
811
842
  * Uploads logs to the webex services for tracking
812
843
  * @param {Object} [options={}]
@@ -0,0 +1,9 @@
1
+ import type {
2
+ NoiseReductionEffectOptions,
3
+ VirtualBackgroundEffectOptions,
4
+ } from '@webex/media-helpers';
5
+
6
+ type INoiseReductionEffect = Omit<NoiseReductionEffectOptions, 'authToken'>;
7
+ type IVirtualBackgroundEffect = Omit<VirtualBackgroundEffectOptions, 'authToken'>;
8
+
9
+ export type {INoiseReductionEffect, IVirtualBackgroundEffect};
@@ -34,6 +34,7 @@ import CaptchaError from '@webex/plugin-meetings/src/common/errors/captcha-error
34
34
  import { forEach } from 'lodash';
35
35
  import PasswordError from '@webex/plugin-meetings/src/common/errors/password-error';
36
36
  import PermissionError from '@webex/plugin-meetings/src/common/errors/permission';
37
+ import {NoiseReductionEffect,VirtualBackgroundEffect} from '@webex/media-helpers';
37
38
 
38
39
  describe('plugin-meetings', () => {
39
40
  const logger = {
@@ -352,6 +353,102 @@ describe('plugin-meetings', () => {
352
353
  });
353
354
  });
354
355
 
356
+ describe('virtual background effect', () => {
357
+ beforeEach(() => {
358
+ webex.credentials = {
359
+ supertoken: {
360
+ access_token: "fake_token"
361
+ }
362
+ };
363
+ })
364
+
365
+ it('creates background effect', async () => {
366
+ const result = await webex.meetings.createVirtualBackgroundEffect();
367
+
368
+ assert.exists(result);
369
+ assert.instanceOf(result, VirtualBackgroundEffect);
370
+ assert.containsAllKeys(result, ['loadModel', 'isEnabled', 'isLoaded', 'options']);
371
+ assert.deepEqual(result.options, {
372
+ mode: 'BLUR',
373
+ blurStrength: 'STRONG',
374
+ generator: 'worker',
375
+ quality: 'LOW',
376
+ authToken: 'fake_token',
377
+ mirror: false
378
+ });
379
+ assert.exists(result.enable);
380
+ assert.exists(result.disable);
381
+ assert.exists(result.dispose);
382
+ });
383
+
384
+ it('creates background effect with custom options passed', async () => {
385
+ const effectOptions = {
386
+ generator: "local",
387
+ frameRate: 45,
388
+ mode: "IMAGE",
389
+ mirror: false,
390
+ quality: "HIGH",
391
+ blurStrength: "STRONG",
392
+ bgImageUrl: "https://test.webex.com/landscape.5a535788.jpg",
393
+ };
394
+
395
+ const result = await webex.meetings.createVirtualBackgroundEffect(effectOptions);
396
+
397
+ assert.exists(result);
398
+ assert.instanceOf(result, VirtualBackgroundEffect);
399
+ assert.containsAllKeys(result, ['loadModel', 'isEnabled', 'isLoaded', 'options']);
400
+ assert.deepEqual(result.options, {...effectOptions, authToken: "fake_token"});
401
+ assert.exists(result.enable);
402
+ assert.exists(result.disable);
403
+ assert.exists(result.dispose);
404
+ });
405
+ })
406
+
407
+ describe('noise reduction effect', () => {
408
+ beforeEach(() => {
409
+ webex.credentials = {
410
+ supertoken: {
411
+ access_token: "fake_token"
412
+ }
413
+ };
414
+ })
415
+
416
+ it('creates noise reduction effect', async () => {
417
+ const result = await webex.meetings.createNoiseReductionEffect({audioContext: {}});
418
+
419
+ assert.exists(result);
420
+ assert.instanceOf(result, NoiseReductionEffect);
421
+ assert.containsAllKeys(result, ['audioContext', 'isEnabled', 'isReady', 'options']);
422
+ assert.deepEqual(result.options, {
423
+ authToken: 'fake_token',
424
+ audioContext: {}
425
+ });
426
+ assert.exists(result.enable);
427
+ assert.exists(result.disable);
428
+ assert.exists(result.dispose);
429
+ });
430
+
431
+ it('creates noise reduction effect with custom options passed', async () => {
432
+ const effectOptions = {
433
+ audioContext: {},
434
+ workletProcessorUrl: "test.url.com",
435
+ mode: "WORKLET",
436
+ env: "prod",
437
+ avoidSimd: false
438
+ };
439
+
440
+ const result = await webex.meetings.createNoiseReductionEffect(effectOptions);
441
+
442
+ assert.exists(result);
443
+ assert.instanceOf(result, NoiseReductionEffect);
444
+ assert.containsAllKeys(result, ['audioContext', 'isEnabled', 'isReady', 'options']);
445
+ assert.deepEqual(result.options, {...effectOptions, authToken: "fake_token"});
446
+ assert.exists(result.enable);
447
+ assert.exists(result.disable);
448
+ assert.exists(result.dispose);
449
+ });
450
+ })
451
+
355
452
  describe('gets', () => {
356
453
  describe('#getReachability', () => {
357
454
  it('should have #getReachability', () => {