@webex/plugin-meetings 1.149.1 → 1.149.2

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.
@@ -149,12 +149,12 @@ var MeetingRequest = /*#__PURE__*/function (_StatelessWebexPlugin) {
149
149
  }
150
150
 
151
151
  url = "".concat(locusUrl, "/").concat(_constants.PARTICIPANT);
152
- _context.next = 37;
152
+ _context.next = 23;
153
153
  break;
154
154
 
155
155
  case 11:
156
- if (!meetingNumber) {
157
- _context.next = 25;
156
+ if (!(sipUri || meetingNumber)) {
157
+ _context.next = 23;
158
158
  break;
159
159
  }
160
160
 
@@ -165,7 +165,7 @@ var MeetingRequest = /*#__PURE__*/function (_StatelessWebexPlugin) {
165
165
  case 15:
166
166
  url = "".concat(this.webex.internal.services.get('locus'), "/").concat(_constants.LOCI, "/").concat(_constants.CALL);
167
167
  body.invitee = {
168
- address: "wbxmn:".concat(meetingNumber)
168
+ address: sipUri || "wbxmn:".concat(meetingNumber)
169
169
  };
170
170
  _context.next = 23;
171
171
  break;
@@ -174,41 +174,11 @@ var MeetingRequest = /*#__PURE__*/function (_StatelessWebexPlugin) {
174
174
  _context.prev = 19;
175
175
  _context.t0 = _context["catch"](12);
176
176
 
177
- _loggerProxy.default.logger.error("Meeting:request#joinMeeting webex meeting id--> ".concat(_context.t0));
177
+ _loggerProxy.default.logger.error("Meeting:request#joinMeeting ".concat(sipUri ? 'sipUri' : 'meetingNumber', " --> ").concat(_context.t0));
178
178
 
179
179
  throw _context.t0;
180
180
 
181
181
  case 23:
182
- _context.next = 37;
183
- break;
184
-
185
- case 25:
186
- if (!sipUri) {
187
- _context.next = 37;
188
- break;
189
- }
190
-
191
- _context.prev = 26;
192
- _context.next = 29;
193
- return this.webex.internal.services.waitForCatalog('postauth');
194
-
195
- case 29:
196
- url = "".concat(this.webex.internal.services.get('locus'), "/").concat(_constants.LOCI, "/").concat(_constants.CALL);
197
- body.invitee = {
198
- address: sipUri
199
- };
200
- _context.next = 37;
201
- break;
202
-
203
- case 33:
204
- _context.prev = 33;
205
- _context.t1 = _context["catch"](26);
206
-
207
- _loggerProxy.default.logger.error("Meeting:request#joinMeeting sipUrl --> ".concat(_context.t1));
208
-
209
- throw _context.t1;
210
-
211
- case 37:
212
182
  // TODO: -- this will be resolved in SDK request
213
183
  url = url.concat("?".concat(_constants.ALTERNATE_REDIRECT_TRUE));
214
184
 
@@ -228,12 +198,12 @@ var MeetingRequest = /*#__PURE__*/function (_StatelessWebexPlugin) {
228
198
  body: body
229
199
  }));
230
200
 
231
- case 41:
201
+ case 27:
232
202
  case "end":
233
203
  return _context.stop();
234
204
  }
235
205
  }
236
- }, _callee, this, [[12, 19], [26, 33]]);
206
+ }, _callee, this, [[12, 19]]);
237
207
  }));
238
208
 
239
209
  function joinMeeting(_x) {
@@ -1 +1 @@
1
- {"version":3,"sources":["request.js"],"names":["MeetingRequest","attrs","options","changeVideoLayoutDebounced","changeVideoLayout","leading","trailing","asResourceOccupant","sipUri","meetingNumber","deviceUrl","locusUrl","resourceId","correlationId","ensureConversation","moderator","pin","moveToResource","roapMessage","preferTranscoding","LoggerProxy","logger","info","url","body","device","deviceType","config","meetings","usingResource","moveMediaToResource","respOnlySdp","allowMultiDevice","supportsNativeLobby","clientMediaPreferences","webex","clientRegion","countryCode","regionCode","undefined","PARTICIPANT","internal","services","waitForCatalog","get","LOCI","CALL","invitee","address","error","concat","ALTERNATE_REDIRECT_TRUE","callPreferences","requestedMedia","_SLIDES_","localMedias","request","method","HTTP_VERBS","POST","uri","dialInUrl","clientUrl","PROVISIONAL","provisionalType","PROVISIONAL_TYPE_DIAL_IN","catch","err","dialOutUrl","phoneNumber","PROVISIONAL_TYPE_DIAL_OUT","dialoutAddress","desync","syncUrl","split","LOCUS","SYNCDEBUG","GET","reject","phoneUrl","selfId","LEAVE","PUT","ALERT","CONTROLS","record","recording","paused","PATCH","lock","locked","DECLINE","reason","MEDIA","floorReq","disposition","FLOOR_ACTION","GRANTED","beneficiary","personUrl","devices","requester","floor","resourceUrl","tones","SEND_DTMF_ENDPOINT","dtmf","uuid","v4","layoutType","main","content","width","height","Error","renderInfoMain","renderInfoContent","layoutParams","renderInfo","layout","type","StatelessWebexPlugin"],"mappings":"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","sourcesContent":["import uuid from 'uuid';\nimport {debounce} from 'lodash';\nimport {StatelessWebexPlugin} from '@webex/webex-core';\nimport {\n deviceType\n} from '@webex/common';\n\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport {\n ALERT,\n ALTERNATE_REDIRECT_TRUE,\n CALL,\n CONTROLS,\n DECLINE,\n FLOOR_ACTION,\n HTTP_VERBS,\n LEAVE,\n LOCI,\n LOCUS,\n MEDIA,\n PARTICIPANT,\n PROVISIONAL_TYPE_DIAL_IN,\n PROVISIONAL_TYPE_DIAL_OUT,\n SEND_DTMF_ENDPOINT,\n _SLIDES_\n} from '../constants';\n\n/**\n * @class MeetingRequest\n */\nexport default class MeetingRequest extends StatelessWebexPlugin {\n constructor(attrs, options) {\n super(attrs, options);\n this.changeVideoLayoutDebounced = debounce(this.changeVideoLayout, 2000, {leading: true, trailing: true});\n }\n\n /**\n * Make a network request to join a meeting\n * @param {Object} options\n * @param {String} options.sipUri\n * @param {String} options.deviceUrl\n * @param {String} options.locusUrl\n * @param {String} options.resourceId,\n * @param {String} options.correlationId\n * @param {boolean} options.ensureConversation\n * @param {boolean} options.moderator\n * @param {boolean} options.pin\n * @param {boolean} options.moveToResource\n * @param {Object} options.roapMessage\n * @returns {Promise}\n */\n async joinMeeting(options) {\n const {\n asResourceOccupant, sipUri, meetingNumber, deviceUrl, locusUrl, resourceId, correlationId, ensureConversation, moderator, pin, moveToResource, roapMessage, preferTranscoding\n } = options;\n\n LoggerProxy.logger.info(\n 'Meeting:request#joinMeeting --> Joining a meeting',\n correlationId\n );\n\n let url = '';\n\n const body = {\n asResourceOccupant,\n device: {\n url: deviceUrl,\n deviceType: this.config.meetings.deviceType\n },\n usingResource: resourceId || null,\n moveMediaToResource: resourceId && moveToResource || false,\n correlationId,\n respOnlySdp: true,\n allowMultiDevice: true,\n ensureConversation: ensureConversation || false,\n supportsNativeLobby: 1,\n clientMediaPreferences: {\n preferTranscoding: preferTranscoding ?? true\n }\n };\n\n if (this.webex.meetings.clientRegion) {\n body.device.countryCode = this.webex.meetings.clientRegion.countryCode;\n body.device.regionCode = this.webex.meetings.clientRegion.regionCode;\n }\n\n if (moderator !== undefined) {\n body.moderator = moderator;\n }\n\n if (pin !== undefined) {\n body.pin = pin;\n }\n\n if (locusUrl) {\n url = `${locusUrl}/${PARTICIPANT}`;\n }\n else if (meetingNumber) {\n try {\n await this.webex.internal.services.waitForCatalog('postauth');\n url = `${this.webex.internal.services.get('locus')}/${LOCI}/${CALL}`;\n body.invitee = {\n address: `wbxmn:${meetingNumber}`\n };\n }\n catch (e) {\n LoggerProxy.logger.error(`Meeting:request#joinMeeting webex meeting id--> ${e}`);\n throw (e);\n }\n }\n else if (sipUri) {\n try {\n await this.webex.internal.services.waitForCatalog('postauth');\n url = `${this.webex.internal.services.get('locus')}/${LOCI}/${CALL}`;\n body.invitee = {\n address: sipUri\n };\n }\n catch (e) {\n LoggerProxy.logger.error(`Meeting:request#joinMeeting sipUrl --> ${e}`);\n throw (e);\n }\n }\n\n\n // TODO: -- this will be resolved in SDK request\n url = url.concat(`?${ALTERNATE_REDIRECT_TRUE}`);\n\n if (resourceId === sipUri) {\n body.callPreferences = {\n requestedMedia: [_SLIDES_]\n };\n }\n\n if (roapMessage) {\n body.localMedias = roapMessage.localMedias;\n }\n\n return this.request({\n method: HTTP_VERBS.POST,\n uri: url,\n body\n });\n }\n\n /**\n * Make a network request to add a dial in device\n * @param {Object} options\n * @param {String} options.correlationId\n * @param {String} options.localUrl url for the meeting\n * @param {String} options.dialInUrl identifier for the to-be provisioned device\n * @param {String} options.clientUrl identifier for the web device\n * @returns {Promise}\n * @private\n */\n dialIn({\n locusUrl, dialInUrl, clientUrl, correlationId\n }) {\n LoggerProxy.logger.info(\n 'Meeting:request#dialIn --> Provisioning a dial in device',\n correlationId\n );\n const uri = `${locusUrl}/${PARTICIPANT}`;\n\n const body = {\n device: {\n deviceType: deviceType.PROVISIONAL,\n provisionalType: PROVISIONAL_TYPE_DIAL_IN,\n url: dialInUrl,\n clientUrl\n },\n correlationId\n };\n\n return this.request({\n method: HTTP_VERBS.POST,\n uri,\n body\n }).catch((err) => {\n LoggerProxy.logger.error(`Meeting:request#dialIn --> Error provisioning a dial in device, error ${err}`);\n\n throw err;\n });\n }\n\n /**\n * Make a network request to add a dial out device\n * @param {Object} options\n * @param {String} options.correlationId\n * @param {String} options.localUrl url for the meeting\n * @param {String} options.dialOutUrl identifier for the to-be provisioned device\n * @param {String} options.phoneNumber phone number to dial out to\n * @param {String} options.clientUrl identifier for the web device\n * @returns {Promise}\n * @private\n */\n dialOut({\n locusUrl, dialOutUrl, phoneNumber, clientUrl, correlationId\n }) {\n LoggerProxy.logger.info(\n 'Meeting:request#dialOut --> Provisioning a dial out device',\n correlationId\n );\n const uri = `${locusUrl}/${PARTICIPANT}`;\n\n const body = {\n device: {\n deviceType: deviceType.PROVISIONAL,\n provisionalType: PROVISIONAL_TYPE_DIAL_OUT,\n url: dialOutUrl,\n dialoutAddress: phoneNumber,\n clientUrl\n },\n correlationId\n };\n\n return this.request({\n method: HTTP_VERBS.POST,\n uri,\n body\n }).catch((err) => {\n LoggerProxy.logger.error(`Meeting:request#dialOut --> Error provisioning a dial out device, error ${err}`);\n\n throw err;\n });\n }\n\n /**\n * Syns the missed delta event\n * @param {Object} options\n * @param {boolen} options.desync flag to get partial or whole locus object\n * @param {String} options.syncUrl sync url to get ht elatest locus delta\n * @returns {Promise}\n */\n syncMeeting(options) {\n /* eslint-disable no-else-return */\n const {desync} = options;\n let {syncUrl} = options;\n\n /* istanbul ignore else */\n if (desync) {\n // check for existing URL parameters\n syncUrl = syncUrl.concat(syncUrl.split('?')[1] ? '&' : '?').concat(`${LOCUS.SYNCDEBUG}=${desync}`);\n }\n\n return this.request({\n method: HTTP_VERBS.GET,\n uri: syncUrl\n }) // TODO: Handle if delta sync failed . Get the full locus object\n .catch((err) => {\n LoggerProxy.logger.error(`Meeting:request#syncMeeting --> Error syncing meeting, error ${err}`);\n\n return err;\n });\n }\n\n /**\n * Request to get the complete locus object\n * @param {Object} options\n * @param {boolen} options.desync flag to get partial or whole locus object\n * @param {String} options.locusUrl sync url to get ht elatest locus delta\n * @returns {Promise}\n */\n getFullLocus(options) {\n let {locusUrl} = options;\n const {desync} = options;\n\n if (locusUrl) {\n if (desync) {\n locusUrl += `?${LOCUS.SYNCDEBUG}=${desync}`;\n }\n\n return this.request({\n method: HTTP_VERBS.GET,\n uri: locusUrl\n }).catch((err) => {\n LoggerProxy.logger.error(`Meeting:request#getFullLocus --> Error getting full locus, error ${err}`);\n\n return err;\n });\n }\n\n return Promise.reject();\n }\n\n /**\n * Make a network request to make a provisioned phone leave the meeting\n * @param {Object} options\n * @param {String} options.locusUrl\n * @param {String} options.phoneUrl\n * @param {String} options.correlationId\n * @param {String} options.selfId\n * @returns {Promise}\n * @private\n */\n disconnectPhoneAudio({\n locusUrl, phoneUrl, correlationId, selfId\n }) {\n LoggerProxy.logger.info(\n `Meeting:request#disconnectPhoneAudio --> request phone ${phoneUrl} to leave`,\n correlationId\n );\n const uri = `${locusUrl}/${PARTICIPANT}/${selfId}/${LEAVE}`;\n\n const body = {\n device: {\n deviceType: deviceType.PROVISIONAL,\n url: phoneUrl\n },\n correlationId\n };\n\n return this.request({\n method: HTTP_VERBS.PUT,\n uri,\n body\n }).catch((err) => {\n LoggerProxy.logger.error(\n `Meeting:request#disconnectPhoneAudio --> Error when requesting phone ${phoneUrl} to leave, error ${err}`\n );\n\n throw err;\n });\n }\n\n /**\n * Make a network request to leave a meeting\n * @param {Object} options\n * @param {Url} options.locusUrl\n * @param {String} options.selfId\n * @param {Url} options.deviceUrl\n * @param {String} options.resourceId,\n * @param {String} options.correlationId\n * @returns {Promise}\n */\n leaveMeeting({\n locusUrl, selfId, deviceUrl: url, resourceId, correlationId\n }) {\n LoggerProxy.logger.info(\n 'Meeting:request#leaveMeeting --> Leaving a meeting',\n correlationId\n );\n\n const uri = `${locusUrl}/${PARTICIPANT}/${selfId}/${LEAVE}`;\n const body = {\n device: {\n deviceType: this.config.meetings.deviceType,\n url\n },\n usingResource: resourceId || null,\n correlationId\n };\n\n return this.request({\n method: HTTP_VERBS.PUT,\n uri,\n body\n });\n }\n\n /**\n * Make a network request to acknowledge a meeting\n * @param {Object} options\n * @param {String} options.locusUrl\n * @param {String} options.deviceUrl\n * @param {String} options.correlationId\n * @returns {Promise}\n */\n acknowledgeMeeting(options) {\n const uri = `${options.locusUrl}/${PARTICIPANT}/${ALERT}`;\n const body = {\n device: {\n deviceType: this.config.meetings.deviceType,\n url: options.deviceUrl\n },\n correlationId: options.correlationId\n };\n\n return this.request({\n method: HTTP_VERBS.PUT,\n uri,\n body\n });\n }\n\n /**\n * Make a network request to acknowledge a meeting\n * @param {Object} options\n * @param {String} options.locusUrl\n * @param {String} options.deviceUrl\n * @param {String} options.id\n * @returns {Promise}\n */\n recordMeeting(options) {\n const uri = `${options.locusUrl}/${CONTROLS}`;\n const body = {\n record: {\n recording: options.recording,\n paused: options.paused\n }\n };\n\n return this.request({\n method: HTTP_VERBS.PATCH,\n uri,\n body\n });\n }\n\n lockMeeting(options) {\n const uri = `${options.locusUrl}/${CONTROLS}`;\n const body = {\n lock: {\n locked: options.lock\n }\n };\n\n return this.request({\n method: HTTP_VERBS.PATCH,\n uri,\n body\n });\n }\n\n /**\n * Make a network request to decline a meeting\n * @param {Object} options\n * @param {String} options.locusUrl\n * @param {String} options.deviceUrl\n * @param {String} options.reason\n * @returns {Promise}\n */\n declineMeeting(options) {\n const uri = `${options.locusUrl}/${PARTICIPANT}/${DECLINE}`;\n const body = {\n device: {\n deviceType: this.config.meetings.deviceType,\n url: options.deviceUrl\n },\n ...(options.reason && {reason: options.reason})\n };\n\n return this.request({\n method: HTTP_VERBS.PUT,\n uri,\n body\n });\n }\n\n /**\n * Toggle remote audio and/or video\n * @param {Object} options options for toggling\n * @param {String} options.selfId Locus self id??\n * @param {String} options.locusUrl Locus url\n * @param {String} options.deviceUrl Url of a device\n * @param {String} options.resourceId Populated if you are paired to a device\n * @param {String} options.localMedias local sdps\n * @returns {Promise}\n */\n remoteAudioVideoToggle(options) {\n const uri = `${options.locusUrl}/${PARTICIPANT}/${options.selfId}/${MEDIA}`;\n const body = {\n device: {\n deviceType: this.config.meetings.deviceType,\n url: options.deviceUrl\n },\n usingResource: options.resourceId || null,\n correlationId: options.correlationId,\n respOnlySdp: true,\n localMedias: options.localMedias,\n clientMediaPreferences: {\n preferTranscoding: options.preferTranscoding ?? true\n }\n };\n\n return this.request({\n method: HTTP_VERBS.PUT,\n uri,\n body\n });\n }\n\n /**\n * change the content floor grant\n * @param {Object} options options for floor grant\n * @param {String} options.disposition floor action (granted/released)\n * @param {String} options.personUrl personUrl who is requesting floor\n * @param {String} options.deviceUrl Url of a device\n * @param {String} options.resourceId Populated if you are paired to a device\n * @param {String} options.uri floor grant uri\n * @returns {Promise}\n */\n changeMeetingFloor(options) {\n let floorReq = {disposition: options.disposition};\n\n /* istanbul ignore else */\n if (options.disposition === FLOOR_ACTION.GRANTED) {\n floorReq = {\n beneficiary: {\n url: options.personUrl,\n devices: [\n {\n deviceType: this.config.meetings.deviceType,\n url: options.deviceUrl\n }\n ]\n },\n disposition: options.disposition,\n requester: {\n url: options.personUrl\n }\n };\n }\n\n return this.request({\n uri: options.uri,\n method: HTTP_VERBS.PUT,\n body: {\n floor: floorReq,\n resourceUrl: options.resourceUrl\n }\n });\n }\n\n /**\n * Sends a request to the DTMF endpoint to send tones\n * @param {Object} options\n * @param {String} options.locusUrl\n * @param {String} options.deviceUrl\n * @param {String} options.tones a string of one or more DTMF tones to send\n * @returns {Promise}\n */\n sendDTMF({locusUrl, deviceUrl, tones}) {\n return this.request({\n method: HTTP_VERBS.POST,\n uri: `${locusUrl}/${SEND_DTMF_ENDPOINT}`,\n body: {\n deviceUrl,\n dtmf: {\n correlationId: uuid.v4(),\n tones\n }\n }\n });\n }\n\n /**\n * Sends a request to the controls endpoint to set the video layout\n * @param {Object} options\n * @param {String} options.locusUrl\n * @param {String} options.deviceUrl\n * @param {String} options.layoutType a layout type that should be available in meeting constants LAYOUT_TYPES\n * @param {Object} options.main preferred dimensions for the remote main video stream\n * @param {Number} options.main.width preferred width of main video stream\n * @param {Number} options.main.height preferred height of main video stream\n * @param {Object} options.content preferred dimensions for the remote content share stream\n * @param {Number} options.content.width preferred width of content share stream\n * @param {Number} options.content.height preferred height of content share stream\n * @returns {Promise}\n */\n changeVideoLayout({\n locusUrl, deviceUrl, layoutType, main, content\n }) {\n // send main/content renderInfo only if both width and height are specified\n if (main && (!main.width || !main.height)) {\n return Promise.reject(new Error(`Both width and height must be specified. One of them is missing for main: ${JSON.stringify(main)}`));\n }\n\n if (content && (!content.width || !content.height)) {\n return Promise.reject(new Error(`Both width and height must be specified. One of them is missing for content: ${JSON.stringify(content)}`));\n }\n\n const renderInfoMain = (main) ? {width: main.width, height: main.height} : undefined;\n const renderInfoContent = (content) ? {width: content.width, height: content.height} : undefined;\n\n const layoutParams = (renderInfoMain || renderInfoContent) ?\n {\n renderInfo:\n {\n main: renderInfoMain,\n content: renderInfoContent\n }\n } : undefined;\n\n return this.request({\n method: HTTP_VERBS.PUT,\n uri: `${locusUrl}/${CONTROLS}`,\n body: {\n layout: {\n deviceUrl,\n type: layoutType,\n layoutParams\n }\n }\n });\n }\n}\n"]}
1
+ {"version":3,"sources":["request.js"],"names":["MeetingRequest","attrs","options","changeVideoLayoutDebounced","changeVideoLayout","leading","trailing","asResourceOccupant","sipUri","meetingNumber","deviceUrl","locusUrl","resourceId","correlationId","ensureConversation","moderator","pin","moveToResource","roapMessage","preferTranscoding","LoggerProxy","logger","info","url","body","device","deviceType","config","meetings","usingResource","moveMediaToResource","respOnlySdp","allowMultiDevice","supportsNativeLobby","clientMediaPreferences","webex","clientRegion","countryCode","regionCode","undefined","PARTICIPANT","internal","services","waitForCatalog","get","LOCI","CALL","invitee","address","error","concat","ALTERNATE_REDIRECT_TRUE","callPreferences","requestedMedia","_SLIDES_","localMedias","request","method","HTTP_VERBS","POST","uri","dialInUrl","clientUrl","PROVISIONAL","provisionalType","PROVISIONAL_TYPE_DIAL_IN","catch","err","dialOutUrl","phoneNumber","PROVISIONAL_TYPE_DIAL_OUT","dialoutAddress","desync","syncUrl","split","LOCUS","SYNCDEBUG","GET","reject","phoneUrl","selfId","LEAVE","PUT","ALERT","CONTROLS","record","recording","paused","PATCH","lock","locked","DECLINE","reason","MEDIA","floorReq","disposition","FLOOR_ACTION","GRANTED","beneficiary","personUrl","devices","requester","floor","resourceUrl","tones","SEND_DTMF_ENDPOINT","dtmf","uuid","v4","layoutType","main","content","width","height","Error","renderInfoMain","renderInfoContent","layoutParams","renderInfo","layout","type","StatelessWebexPlugin"],"mappings":"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","sourcesContent":["import uuid from 'uuid';\nimport {debounce} from 'lodash';\nimport {StatelessWebexPlugin} from '@webex/webex-core';\nimport {deviceType} from '@webex/common';\n\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport {\n ALERT,\n ALTERNATE_REDIRECT_TRUE,\n CALL,\n CONTROLS,\n DECLINE,\n FLOOR_ACTION,\n HTTP_VERBS,\n LEAVE,\n LOCI,\n LOCUS,\n MEDIA,\n PARTICIPANT,\n PROVISIONAL_TYPE_DIAL_IN,\n PROVISIONAL_TYPE_DIAL_OUT,\n SEND_DTMF_ENDPOINT,\n _SLIDES_\n} from '../constants';\n\n/**\n * @class MeetingRequest\n */\nexport default class MeetingRequest extends StatelessWebexPlugin {\n constructor(attrs, options) {\n super(attrs, options);\n this.changeVideoLayoutDebounced = debounce(this.changeVideoLayout, 2000, {leading: true, trailing: true});\n }\n\n /**\n * Make a network request to join a meeting\n * @param {Object} options\n * @param {String} options.sipUri\n * @param {String} options.deviceUrl\n * @param {String} options.locusUrl\n * @param {String} options.resourceId,\n * @param {String} options.correlationId\n * @param {boolean} options.ensureConversation\n * @param {boolean} options.moderator\n * @param {boolean} options.pin\n * @param {boolean} options.moveToResource\n * @param {Object} options.roapMessage\n * @returns {Promise}\n */\n async joinMeeting(options) {\n const {\n asResourceOccupant,\n sipUri,\n meetingNumber,\n deviceUrl,\n locusUrl,\n resourceId,\n correlationId,\n ensureConversation,\n moderator,\n pin,\n moveToResource,\n roapMessage,\n preferTranscoding\n } = options;\n\n LoggerProxy.logger.info(\n 'Meeting:request#joinMeeting --> Joining a meeting',\n correlationId\n );\n\n let url = '';\n\n const body = {\n asResourceOccupant,\n device: {\n url: deviceUrl,\n deviceType: this.config.meetings.deviceType\n },\n usingResource: resourceId || null,\n moveMediaToResource: resourceId && moveToResource || false,\n correlationId,\n respOnlySdp: true,\n allowMultiDevice: true,\n ensureConversation: ensureConversation || false,\n supportsNativeLobby: 1,\n clientMediaPreferences: {\n preferTranscoding: preferTranscoding ?? true\n }\n };\n\n if (this.webex.meetings.clientRegion) {\n body.device.countryCode = this.webex.meetings.clientRegion.countryCode;\n body.device.regionCode = this.webex.meetings.clientRegion.regionCode;\n }\n\n if (moderator !== undefined) {\n body.moderator = moderator;\n }\n\n if (pin !== undefined) {\n body.pin = pin;\n }\n\n if (locusUrl) {\n url = `${locusUrl}/${PARTICIPANT}`;\n }\n else if (sipUri || meetingNumber) {\n try {\n await this.webex.internal.services.waitForCatalog('postauth');\n url = `${this.webex.internal.services.get('locus')}/${LOCI}/${CALL}`;\n body.invitee = {\n address: sipUri || `wbxmn:${meetingNumber}`\n };\n }\n catch (e) {\n LoggerProxy.logger.error(`Meeting:request#joinMeeting ${sipUri ? 'sipUri' : 'meetingNumber'} --> ${e}`);\n throw (e);\n }\n }\n\n\n // TODO: -- this will be resolved in SDK request\n url = url.concat(`?${ALTERNATE_REDIRECT_TRUE}`);\n\n if (resourceId === sipUri) {\n body.callPreferences = {\n requestedMedia: [_SLIDES_]\n };\n }\n\n if (roapMessage) {\n body.localMedias = roapMessage.localMedias;\n }\n\n return this.request({\n method: HTTP_VERBS.POST,\n uri: url,\n body\n });\n }\n\n /**\n * Make a network request to add a dial in device\n * @param {Object} options\n * @param {String} options.correlationId\n * @param {String} options.localUrl url for the meeting\n * @param {String} options.dialInUrl identifier for the to-be provisioned device\n * @param {String} options.clientUrl identifier for the web device\n * @returns {Promise}\n * @private\n */\n dialIn({\n locusUrl,\n dialInUrl,\n clientUrl,\n correlationId\n }) {\n LoggerProxy.logger.info(\n 'Meeting:request#dialIn --> Provisioning a dial in device',\n correlationId\n );\n const uri = `${locusUrl}/${PARTICIPANT}`;\n\n const body = {\n device: {\n deviceType: deviceType.PROVISIONAL,\n provisionalType: PROVISIONAL_TYPE_DIAL_IN,\n url: dialInUrl,\n clientUrl\n },\n correlationId\n };\n\n return this.request({\n method: HTTP_VERBS.POST,\n uri,\n body\n }).catch((err) => {\n LoggerProxy.logger.error(`Meeting:request#dialIn --> Error provisioning a dial in device, error ${err}`);\n\n throw err;\n });\n }\n\n /**\n * Make a network request to add a dial out device\n * @param {Object} options\n * @param {String} options.correlationId\n * @param {String} options.localUrl url for the meeting\n * @param {String} options.dialOutUrl identifier for the to-be provisioned device\n * @param {String} options.phoneNumber phone number to dial out to\n * @param {String} options.clientUrl identifier for the web device\n * @returns {Promise}\n * @private\n */\n dialOut({\n locusUrl,\n dialOutUrl,\n phoneNumber,\n clientUrl,\n correlationId\n }) {\n LoggerProxy.logger.info(\n 'Meeting:request#dialOut --> Provisioning a dial out device',\n correlationId\n );\n const uri = `${locusUrl}/${PARTICIPANT}`;\n\n const body = {\n device: {\n deviceType: deviceType.PROVISIONAL,\n provisionalType: PROVISIONAL_TYPE_DIAL_OUT,\n url: dialOutUrl,\n dialoutAddress: phoneNumber,\n clientUrl\n },\n correlationId\n };\n\n return this.request({\n method: HTTP_VERBS.POST,\n uri,\n body\n }).catch((err) => {\n LoggerProxy.logger.error(`Meeting:request#dialOut --> Error provisioning a dial out device, error ${err}`);\n\n throw err;\n });\n }\n\n /**\n * Syns the missed delta event\n * @param {Object} options\n * @param {boolen} options.desync flag to get partial or whole locus object\n * @param {String} options.syncUrl sync url to get ht elatest locus delta\n * @returns {Promise}\n */\n syncMeeting(options) {\n /* eslint-disable no-else-return */\n const {desync} = options;\n let {syncUrl} = options;\n\n /* istanbul ignore else */\n if (desync) {\n // check for existing URL parameters\n syncUrl = syncUrl.concat(syncUrl.split('?')[1] ? '&' : '?').concat(`${LOCUS.SYNCDEBUG}=${desync}`);\n }\n\n return this.request({\n method: HTTP_VERBS.GET,\n uri: syncUrl\n }) // TODO: Handle if delta sync failed . Get the full locus object\n .catch((err) => {\n LoggerProxy.logger.error(`Meeting:request#syncMeeting --> Error syncing meeting, error ${err}`);\n\n return err;\n });\n }\n\n /**\n * Request to get the complete locus object\n * @param {Object} options\n * @param {boolen} options.desync flag to get partial or whole locus object\n * @param {String} options.locusUrl sync url to get ht elatest locus delta\n * @returns {Promise}\n */\n getFullLocus(options) {\n let {locusUrl} = options;\n const {desync} = options;\n\n if (locusUrl) {\n if (desync) {\n locusUrl += `?${LOCUS.SYNCDEBUG}=${desync}`;\n }\n\n return this.request({\n method: HTTP_VERBS.GET,\n uri: locusUrl\n }).catch((err) => {\n LoggerProxy.logger.error(`Meeting:request#getFullLocus --> Error getting full locus, error ${err}`);\n\n return err;\n });\n }\n\n return Promise.reject();\n }\n\n /**\n * Make a network request to make a provisioned phone leave the meeting\n * @param {Object} options\n * @param {String} options.locusUrl\n * @param {String} options.phoneUrl\n * @param {String} options.correlationId\n * @param {String} options.selfId\n * @returns {Promise}\n * @private\n */\n disconnectPhoneAudio({\n locusUrl,\n phoneUrl,\n correlationId,\n selfId\n }) {\n LoggerProxy.logger.info(\n `Meeting:request#disconnectPhoneAudio --> request phone ${phoneUrl} to leave`,\n correlationId\n );\n const uri = `${locusUrl}/${PARTICIPANT}/${selfId}/${LEAVE}`;\n\n const body = {\n device: {\n deviceType: deviceType.PROVISIONAL,\n url: phoneUrl\n },\n correlationId\n };\n\n return this.request({\n method: HTTP_VERBS.PUT,\n uri,\n body\n }).catch((err) => {\n LoggerProxy.logger.error(\n `Meeting:request#disconnectPhoneAudio --> Error when requesting phone ${phoneUrl} to leave, error ${err}`\n );\n\n throw err;\n });\n }\n\n /**\n * Make a network request to leave a meeting\n * @param {Object} options\n * @param {Url} options.locusUrl\n * @param {String} options.selfId\n * @param {Url} options.deviceUrl\n * @param {String} options.resourceId,\n * @param {String} options.correlationId\n * @returns {Promise}\n */\n leaveMeeting({\n locusUrl,\n selfId,\n deviceUrl: url,\n resourceId,\n correlationId\n }) {\n LoggerProxy.logger.info(\n 'Meeting:request#leaveMeeting --> Leaving a meeting',\n correlationId\n );\n\n const uri = `${locusUrl}/${PARTICIPANT}/${selfId}/${LEAVE}`;\n const body = {\n device: {\n deviceType: this.config.meetings.deviceType,\n url\n },\n usingResource: resourceId || null,\n correlationId\n };\n\n return this.request({\n method: HTTP_VERBS.PUT,\n uri,\n body\n });\n }\n\n /**\n * Make a network request to acknowledge a meeting\n * @param {Object} options\n * @param {String} options.locusUrl\n * @param {String} options.deviceUrl\n * @param {String} options.correlationId\n * @returns {Promise}\n */\n acknowledgeMeeting(options) {\n const uri = `${options.locusUrl}/${PARTICIPANT}/${ALERT}`;\n const body = {\n device: {\n deviceType: this.config.meetings.deviceType,\n url: options.deviceUrl\n },\n correlationId: options.correlationId\n };\n\n return this.request({\n method: HTTP_VERBS.PUT,\n uri,\n body\n });\n }\n\n /**\n * Make a network request to acknowledge a meeting\n * @param {Object} options\n * @param {String} options.locusUrl\n * @param {String} options.deviceUrl\n * @param {String} options.id\n * @returns {Promise}\n */\n recordMeeting(options) {\n const uri = `${options.locusUrl}/${CONTROLS}`;\n const body = {\n record: {\n recording: options.recording,\n paused: options.paused\n }\n };\n\n return this.request({\n method: HTTP_VERBS.PATCH,\n uri,\n body\n });\n }\n\n lockMeeting(options) {\n const uri = `${options.locusUrl}/${CONTROLS}`;\n const body = {\n lock: {\n locked: options.lock\n }\n };\n\n return this.request({\n method: HTTP_VERBS.PATCH,\n uri,\n body\n });\n }\n\n /**\n * Make a network request to decline a meeting\n * @param {Object} options\n * @param {String} options.locusUrl\n * @param {String} options.deviceUrl\n * @param {String} options.reason\n * @returns {Promise}\n */\n declineMeeting(options) {\n const uri = `${options.locusUrl}/${PARTICIPANT}/${DECLINE}`;\n const body = {\n device: {\n deviceType: this.config.meetings.deviceType,\n url: options.deviceUrl\n },\n ...(options.reason && {reason: options.reason})\n };\n\n return this.request({\n method: HTTP_VERBS.PUT,\n uri,\n body\n });\n }\n\n /**\n * Toggle remote audio and/or video\n * @param {Object} options options for toggling\n * @param {String} options.selfId Locus self id??\n * @param {String} options.locusUrl Locus url\n * @param {String} options.deviceUrl Url of a device\n * @param {String} options.resourceId Populated if you are paired to a device\n * @param {String} options.localMedias local sdps\n * @returns {Promise}\n */\n remoteAudioVideoToggle(options) {\n const uri = `${options.locusUrl}/${PARTICIPANT}/${options.selfId}/${MEDIA}`;\n const body = {\n device: {\n deviceType: this.config.meetings.deviceType,\n url: options.deviceUrl\n },\n usingResource: options.resourceId || null,\n correlationId: options.correlationId,\n respOnlySdp: true,\n localMedias: options.localMedias,\n clientMediaPreferences: {\n preferTranscoding: options.preferTranscoding ?? true\n }\n };\n\n return this.request({\n method: HTTP_VERBS.PUT,\n uri,\n body\n });\n }\n\n /**\n * change the content floor grant\n * @param {Object} options options for floor grant\n * @param {String} options.disposition floor action (granted/released)\n * @param {String} options.personUrl personUrl who is requesting floor\n * @param {String} options.deviceUrl Url of a device\n * @param {String} options.resourceId Populated if you are paired to a device\n * @param {String} options.uri floor grant uri\n * @returns {Promise}\n */\n changeMeetingFloor(options) {\n let floorReq = {disposition: options.disposition};\n\n /* istanbul ignore else */\n if (options.disposition === FLOOR_ACTION.GRANTED) {\n floorReq = {\n beneficiary: {\n url: options.personUrl,\n devices: [\n {\n deviceType: this.config.meetings.deviceType,\n url: options.deviceUrl\n }\n ]\n },\n disposition: options.disposition,\n requester: {\n url: options.personUrl\n }\n };\n }\n\n return this.request({\n uri: options.uri,\n method: HTTP_VERBS.PUT,\n body: {\n floor: floorReq,\n resourceUrl: options.resourceUrl\n }\n });\n }\n\n /**\n * Sends a request to the DTMF endpoint to send tones\n * @param {Object} options\n * @param {String} options.locusUrl\n * @param {String} options.deviceUrl\n * @param {String} options.tones a string of one or more DTMF tones to send\n * @returns {Promise}\n */\n sendDTMF({locusUrl, deviceUrl, tones}) {\n return this.request({\n method: HTTP_VERBS.POST,\n uri: `${locusUrl}/${SEND_DTMF_ENDPOINT}`,\n body: {\n deviceUrl,\n dtmf: {\n correlationId: uuid.v4(),\n tones\n }\n }\n });\n }\n\n /**\n * Sends a request to the controls endpoint to set the video layout\n * @param {Object} options\n * @param {String} options.locusUrl\n * @param {String} options.deviceUrl\n * @param {String} options.layoutType a layout type that should be available in meeting constants LAYOUT_TYPES\n * @param {Object} options.main preferred dimensions for the remote main video stream\n * @param {Number} options.main.width preferred width of main video stream\n * @param {Number} options.main.height preferred height of main video stream\n * @param {Object} options.content preferred dimensions for the remote content share stream\n * @param {Number} options.content.width preferred width of content share stream\n * @param {Number} options.content.height preferred height of content share stream\n * @returns {Promise}\n */\n changeVideoLayout({\n locusUrl,\n deviceUrl,\n layoutType,\n main,\n content\n }) {\n // send main/content renderInfo only if both width and height are specified\n if (main && (!main.width || !main.height)) {\n return Promise.reject(new Error(`Both width and height must be specified. One of them is missing for main: ${JSON.stringify(main)}`));\n }\n\n if (content && (!content.width || !content.height)) {\n return Promise.reject(new Error(`Both width and height must be specified. One of them is missing for content: ${JSON.stringify(content)}`));\n }\n\n const renderInfoMain = (main) ? {width: main.width, height: main.height} : undefined;\n const renderInfoContent = (content) ? {width: content.width, height: content.height} : undefined;\n\n const layoutParams = (renderInfoMain || renderInfoContent) ?\n {\n renderInfo:\n {\n main: renderInfoMain,\n content: renderInfoContent\n }\n } : undefined;\n\n return this.request({\n method: HTTP_VERBS.PUT,\n uri: `${locusUrl}/${CONTROLS}`,\n body: {\n layout: {\n deviceUrl,\n type: layoutType,\n layoutParams\n }\n }\n });\n }\n}\n"]}
@@ -144,7 +144,7 @@ var MeetingInfo = /*#__PURE__*/function () {
144
144
  var _this2 = this;
145
145
 
146
146
  var type = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
147
- return this.fetchInfoOptions(destination, type).then(function (options) {
147
+ return this.fetchInfoOptions(_util.default.extractDestination(destination, type), type).then(function (options) {
148
148
  return (// fetch meeting info
149
149
  _this2.requestFetchInfo(options).catch(function (error) {
150
150
  // if it failed the first time as meeting link
@@ -1 +1 @@
1
- {"version":3,"sources":["index.js"],"names":["MeetingInfo","webex","meetingInfoRequest","MeetingInfoRequest","meetingInfoCollection","MeetingInfoCollection","id","get","info","set","options","fetchMeetingInfo","then","body","setMeetingInfo","sipMeetingUri","meetingLink","catch","error","LoggerProxy","logger","reject","destination","type","MeetingInfoUtil","generateOptions","fetchInfoOptions","requestFetchInfo","_MEETING_LINK_","convertLinkToSip","_SIP_URI_"],"mappings":";;;;;;;;;;;;;;;;;;AAIA;;AAIA;;AAEA;;AACA;;AACA;;AAZA;AACA;AACA;;AAYA;AACA;AACA;IACqBA,W;AACnB;AACF;AACA;AACA;AACE,uBAAYC,KAAZ,EAAmB;AAAA;AACjB,SAAKA,KAAL,GAAaA,KAAb;AAEA;AACJ;AACA;AACA;AACA;AACA;AACA;;AACI,SAAKC,kBAAL,GAA0B,IAAIC,gBAAJ,CAAuB,KAAKF,KAA5B,CAA1B;AACA;AACJ;AACA;AACA;AACA;AACA;AACA;;AACI,SAAKG,qBAAL,GAA6B,IAAIC,mBAAJ,EAA7B;AACD;AAED;AACF;AACA;AACA;AACA;AACA;;;;;WACE,wBAAeC,EAAf,EAAmB;AACjB,aAAO,KAAKF,qBAAL,CAA2BG,GAA3B,CAA+BD,EAA/B,CAAP;AACD;AAED;AACF;AACA;AACA;AACA;AACA;AACA;;;;WACE,wBAAeA,EAAf,EAAmBE,IAAnB,EAAyB;AACvB,WAAKJ,qBAAL,CAA2BK,GAA3B,CAA+BH,EAA/B,EAAmCE,IAAnC;AACD;AAED;AACF;AACA;AACA;AACA;AACA;AACA;;;;WACE,0BAAiBE,OAAjB,EAA0B;AAAA;;AACxB,aAAO,KAAKR,kBAAL,CAAwBS,gBAAxB,CAAyCD,OAAzC,EAAkDE,IAAlD,CAAuD,UAACJ,IAAD,EAAU;AACtE,YAAIA,IAAI,IAAIA,IAAI,CAACK,IAAjB,EAAuB;AACrB,UAAA,KAAI,CAACC,cAAL,CAAoBN,IAAI,CAACK,IAAL,CAAUE,aAAV,IAA2BP,IAAI,CAACK,IAAL,CAAUG,WAAzD,EAAsER,IAAI,CAACK,IAA3E;AACD;;AAED,eAAOL,IAAP;AACD,OANM,EAMJS,KANI,CAME,UAACC,KAAD,EAAW;AAClBC,6BAAYC,MAAZ,CAAmBF,KAAnB,oDAAqEA,KAArE;;AAEA,eAAO,iBAAQG,MAAR,CAAeH,KAAf,CAAP;AACD,OAVM,CAAP;AAWD;AAED;AACF;AACA;AACA;AACA;AACA;AACA;AACA;;;;WACE,0BAAiBI,WAAjB,EAA8BC,IAA9B,EAAoC;AAClC,aAAOC,cAAgBC,eAAhB,CAAgC;AACrCH,QAAAA,WAAW,EAAXA,WADqC;AAErCC,QAAAA,IAAI,EAAJA,IAFqC;AAGrCtB,QAAAA,KAAK,EAAE,KAAKA;AAHyB,OAAhC,CAAP;AAKD;AAED;AACF;AACA;AACA;AACA;AACA;AACA;AACA;;;;WACE,0BAAiBqB,WAAjB,EAA2C;AAAA;;AAAA,UAAbC,IAAa,uEAAN,IAAM;AACzC,aAAO,KAAKG,gBAAL,CAAsBJ,WAAtB,EAAmCC,IAAnC,EAAyCX,IAAzC,CAA8C,UAACF,OAAD;AAAA,eACrD;AACE,UAAA,MAAI,CAACiB,gBAAL,CAAsBjB,OAAtB,EAA+BO,KAA/B,CAAqC,UAACC,KAAD,EAAW;AAChD;AACE,gBAAIR,OAAO,CAACa,IAAR,KAAiBK,yBAArB,EAAqC;AACrC;AACE,qBAAO,MAAI,CAACD,gBAAL,CAAsB,MAAI,CAACD,gBAAL,CAAsBF,cAAgBK,gBAAhB,CAAiCP,WAAjC,CAAtB,EAAqEQ,oBAArE,CAAtB,CAAP;AACD;;AAED,mBAAO,iBAAQT,MAAR,CAAeH,KAAf,CAAP;AACD,WARD;AAFmD;AAAA,OAA9C,CAAP;AAWD","sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\nimport {\n _MEETING_LINK_,\n _SIP_URI_\n} from '../constants';\nimport LoggerProxy from '../common/logs/logger-proxy';\n\nimport MeetingInfoCollection from './collection';\nimport MeetingInfoRequest from './request';\nimport MeetingInfoUtil from './util';\n\n/**\n * @class MeetingInfo\n */\nexport default class MeetingInfo {\n /**\n *\n * @param {WebexSDK} webex\n */\n constructor(webex) {\n this.webex = webex;\n\n /**\n * The meeting info request server interface\n * @instance\n * @type {Object}\n * @private\n * @memberof MeetingInfo\n */\n this.meetingInfoRequest = new MeetingInfoRequest(this.webex);\n /**\n * The meeting information collection interface\n * @instance\n * @type {Object}\n * @private\n * @memberof MeetingInfo\n */\n this.meetingInfoCollection = new MeetingInfoCollection();\n }\n\n /**\n * @param {string} id\n * @returns {object}\n * @public\n * @memberof MeetingInfo\n */\n getMeetingInfo(id) {\n return this.meetingInfoCollection.get(id);\n }\n\n /**\n * @param {string} id\n * @param {object} info\n * @returns {null}\n * @public\n * @memberof MeetingInfo\n */\n setMeetingInfo(id, info) {\n this.meetingInfoCollection.set(id, info);\n }\n\n /**\n * Helper to make the actual MeetingInfo request and set the meetingInfo if successful, else reject\n * @param {Object} options\n * @returns {Promise}\n * @private\n * @memberof MeetingInfo\n */\n requestFetchInfo(options) {\n return this.meetingInfoRequest.fetchMeetingInfo(options).then((info) => {\n if (info && info.body) {\n this.setMeetingInfo(info.body.sipMeetingUri || info.body.meetingLink, info.body);\n }\n\n return info;\n }).catch((error) => {\n LoggerProxy.logger.error(`Meeting-info:index#requestFetchInfo --> ${error} fetch meetingInfo`);\n\n return Promise.reject(error);\n });\n }\n\n /**\n * Helper to generate the options for the MeetingInfo request\n * @param {String} destination\n * @param {String} type\n * @returns {Promise}\n * @private\n * @memberof MeetingInfo\n */\n fetchInfoOptions(destination, type) {\n return MeetingInfoUtil.generateOptions({\n destination,\n type,\n webex: this.webex\n });\n }\n\n /**\n * Fetches meeting info from the server\n * @param {String} destination one of many different types of destinations to look up info for\n * @param {String} [type] to match up with the destination value\n * @returns {Promise} returns a meeting info object\n * @public\n * @memberof MeetingInfo\n */\n fetchMeetingInfo(destination, type = null) {\n return this.fetchInfoOptions(destination, type).then((options) =>\n // fetch meeting info\n this.requestFetchInfo(options).catch((error) => {\n // if it failed the first time as meeting link\n if (options.type === _MEETING_LINK_) {\n // convert the meeting link to sip URI and retry\n return this.requestFetchInfo(this.fetchInfoOptions(MeetingInfoUtil.convertLinkToSip(destination), _SIP_URI_));\n }\n\n return Promise.reject(error);\n }));\n }\n}\n"]}
1
+ {"version":3,"sources":["index.js"],"names":["MeetingInfo","webex","meetingInfoRequest","MeetingInfoRequest","meetingInfoCollection","MeetingInfoCollection","id","get","info","set","options","fetchMeetingInfo","then","body","setMeetingInfo","sipMeetingUri","meetingLink","catch","error","LoggerProxy","logger","reject","destination","type","MeetingInfoUtil","generateOptions","fetchInfoOptions","extractDestination","requestFetchInfo","_MEETING_LINK_","convertLinkToSip","_SIP_URI_"],"mappings":";;;;;;;;;;;;;;;;;;AAIA;;AAIA;;AAEA;;AACA;;AACA;;AAZA;AACA;AACA;;AAYA;AACA;AACA;IACqBA,W;AACnB;AACF;AACA;AACA;AACE,uBAAYC,KAAZ,EAAmB;AAAA;AACjB,SAAKA,KAAL,GAAaA,KAAb;AAEA;AACJ;AACA;AACA;AACA;AACA;AACA;;AACI,SAAKC,kBAAL,GAA0B,IAAIC,gBAAJ,CAAuB,KAAKF,KAA5B,CAA1B;AACA;AACJ;AACA;AACA;AACA;AACA;AACA;;AACI,SAAKG,qBAAL,GAA6B,IAAIC,mBAAJ,EAA7B;AACD;AAED;AACF;AACA;AACA;AACA;AACA;;;;;WACE,wBAAeC,EAAf,EAAmB;AACjB,aAAO,KAAKF,qBAAL,CAA2BG,GAA3B,CAA+BD,EAA/B,CAAP;AACD;AAED;AACF;AACA;AACA;AACA;AACA;AACA;;;;WACE,wBAAeA,EAAf,EAAmBE,IAAnB,EAAyB;AACvB,WAAKJ,qBAAL,CAA2BK,GAA3B,CAA+BH,EAA/B,EAAmCE,IAAnC;AACD;AAED;AACF;AACA;AACA;AACA;AACA;AACA;;;;WACE,0BAAiBE,OAAjB,EAA0B;AAAA;;AACxB,aAAO,KAAKR,kBAAL,CAAwBS,gBAAxB,CAAyCD,OAAzC,EAAkDE,IAAlD,CAAuD,UAACJ,IAAD,EAAU;AACtE,YAAIA,IAAI,IAAIA,IAAI,CAACK,IAAjB,EAAuB;AACrB,UAAA,KAAI,CAACC,cAAL,CAAoBN,IAAI,CAACK,IAAL,CAAUE,aAAV,IAA2BP,IAAI,CAACK,IAAL,CAAUG,WAAzD,EAAsER,IAAI,CAACK,IAA3E;AACD;;AAED,eAAOL,IAAP;AACD,OANM,EAMJS,KANI,CAME,UAACC,KAAD,EAAW;AAClBC,6BAAYC,MAAZ,CAAmBF,KAAnB,oDAAqEA,KAArE;;AAEA,eAAO,iBAAQG,MAAR,CAAeH,KAAf,CAAP;AACD,OAVM,CAAP;AAWD;AAED;AACF;AACA;AACA;AACA;AACA;AACA;AACA;;;;WACE,0BAAiBI,WAAjB,EAA8BC,IAA9B,EAAoC;AAClC,aAAOC,cAAgBC,eAAhB,CAAgC;AACrCH,QAAAA,WAAW,EAAXA,WADqC;AAErCC,QAAAA,IAAI,EAAJA,IAFqC;AAGrCtB,QAAAA,KAAK,EAAE,KAAKA;AAHyB,OAAhC,CAAP;AAKD;AAED;AACF;AACA;AACA;AACA;AACA;AACA;AACA;;;;WACE,0BAAiBqB,WAAjB,EAA2C;AAAA;;AAAA,UAAbC,IAAa,uEAAN,IAAM;AACzC,aAAO,KAAKG,gBAAL,CACLF,cAAgBG,kBAAhB,CAAmCL,WAAnC,EAAgDC,IAAhD,CADK,EAELA,IAFK,EAGLX,IAHK,CAGA,UAACF,OAAD;AAAA,eACP;AACE,UAAA,MAAI,CAACkB,gBAAL,CAAsBlB,OAAtB,EAA+BO,KAA/B,CAAqC,UAACC,KAAD,EAAW;AAChD;AACE,gBAAIR,OAAO,CAACa,IAAR,KAAiBM,yBAArB,EAAqC;AACrC;AACE,qBAAO,MAAI,CAACD,gBAAL,CAAsB,MAAI,CAACF,gBAAL,CAAsBF,cAAgBM,gBAAhB,CAAiCR,WAAjC,CAAtB,EAAqES,oBAArE,CAAtB,CAAP;AACD;;AAED,mBAAO,iBAAQV,MAAR,CAAeH,KAAf,CAAP;AACD,WARD;AAFK;AAAA,OAHA,CAAP;AAcD","sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\nimport {\n _MEETING_LINK_,\n _SIP_URI_\n} from '../constants';\nimport LoggerProxy from '../common/logs/logger-proxy';\n\nimport MeetingInfoCollection from './collection';\nimport MeetingInfoRequest from './request';\nimport MeetingInfoUtil from './util';\n\n/**\n * @class MeetingInfo\n */\nexport default class MeetingInfo {\n /**\n *\n * @param {WebexSDK} webex\n */\n constructor(webex) {\n this.webex = webex;\n\n /**\n * The meeting info request server interface\n * @instance\n * @type {Object}\n * @private\n * @memberof MeetingInfo\n */\n this.meetingInfoRequest = new MeetingInfoRequest(this.webex);\n /**\n * The meeting information collection interface\n * @instance\n * @type {Object}\n * @private\n * @memberof MeetingInfo\n */\n this.meetingInfoCollection = new MeetingInfoCollection();\n }\n\n /**\n * @param {string} id\n * @returns {object}\n * @public\n * @memberof MeetingInfo\n */\n getMeetingInfo(id) {\n return this.meetingInfoCollection.get(id);\n }\n\n /**\n * @param {string} id\n * @param {object} info\n * @returns {null}\n * @public\n * @memberof MeetingInfo\n */\n setMeetingInfo(id, info) {\n this.meetingInfoCollection.set(id, info);\n }\n\n /**\n * Helper to make the actual MeetingInfo request and set the meetingInfo if successful, else reject\n * @param {Object} options\n * @returns {Promise}\n * @private\n * @memberof MeetingInfo\n */\n requestFetchInfo(options) {\n return this.meetingInfoRequest.fetchMeetingInfo(options).then((info) => {\n if (info && info.body) {\n this.setMeetingInfo(info.body.sipMeetingUri || info.body.meetingLink, info.body);\n }\n\n return info;\n }).catch((error) => {\n LoggerProxy.logger.error(`Meeting-info:index#requestFetchInfo --> ${error} fetch meetingInfo`);\n\n return Promise.reject(error);\n });\n }\n\n /**\n * Helper to generate the options for the MeetingInfo request\n * @param {String} destination\n * @param {String} type\n * @returns {Promise}\n * @private\n * @memberof MeetingInfo\n */\n fetchInfoOptions(destination, type) {\n return MeetingInfoUtil.generateOptions({\n destination,\n type,\n webex: this.webex\n });\n }\n\n /**\n * Fetches meeting info from the server\n * @param {String} destination one of many different types of destinations to look up info for\n * @param {String} [type] to match up with the destination value\n * @returns {Promise} returns a meeting info object\n * @public\n * @memberof MeetingInfo\n */\n fetchMeetingInfo(destination, type = null) {\n return this.fetchInfoOptions(\n MeetingInfoUtil.extractDestination(destination, type),\n type\n ).then((options) =>\n // fetch meeting info\n this.requestFetchInfo(options).catch((error) => {\n // if it failed the first time as meeting link\n if (options.type === _MEETING_LINK_) {\n // convert the meeting link to sip URI and retry\n return this.requestFetchInfo(this.fetchInfoOptions(MeetingInfoUtil.convertLinkToSip(destination), _SIP_URI_));\n }\n\n return Promise.reject(error);\n }));\n }\n}\n"]}
@@ -30,6 +30,20 @@ var _constants = require("../constants");
30
30
 
31
31
  var MeetingInfoUtil = {};
32
32
 
33
+ MeetingInfoUtil.extractDestination = function (destination, type) {
34
+ var dest = destination;
35
+
36
+ if (type === _constants._LOCUS_ID_) {
37
+ if (!(destination && destination.url)) {
38
+ throw new _parameter.default('You cannot create a meeting by locus without a locus.url defined');
39
+ }
40
+
41
+ dest = destination.url;
42
+ }
43
+
44
+ return dest;
45
+ };
46
+
33
47
  MeetingInfoUtil.getParsedUrl = function (link) {
34
48
  try {
35
49
  var parsedUrl = _url.default.parse(link);
@@ -1 +1 @@
1
- {"version":3,"sources":["util.js"],"names":["MeetingInfoUtil","getParsedUrl","link","parsedUrl","url","parse","protocol","HTTPS_PROTOCOL","error","LoggerProxy","logger","warn","isMeetingLink","value","hostNameBool","hostname","includes","WEBEX_DOT_COM","pathNameBool","pathname","MEET","MEET_M","JOIN","isConversationUrl","webex","clusterId","internal","services","getClusterId","endsWith","CONVERSATION_SERVICE","convertLinkToSip","user","userIndex","lastIndexOf","substring","company","companyIndex","replace","WWW_DOT","isSipUri","sipString","sipUri","DIALER_REGEX","SIP_ADDRESS","exec","isPhoneNumber","phoneNumber","isValidNumber","PHONE_NUMBER","test","getHydraId","destination","type","id","cluster","UUID_REG","_ROOM_","room","_PEOPLE_","people","getSipUriFromHydraPersonId","get","then","res","emails","length","ParameterError","catch","err","generateOptions","from","options","hydraId","_MEETING_LINK_","_SIP_URI_","_CONVERSATION_URL_","wasHydraPerson","resolve","waitForCatalog","conversationUrl","conversation","getUrlFromClusterId","getResourceUrl","resource","LOCI","MEETINGINFO","method","HTTP_VERBS","GET","uri","_PERSONAL_ROOM_","_MEETING_ID_","encodeURIComponent","TYPE","USE_URI_LOOKUP_FALSE","PUT","_LOCUS_ID_","getRequestParams","resourceOptions","api","requestParams","concat","ALTERNATE_REDIRECT_TRUE","body","lookupType"],"mappings":"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","sourcesContent":["import url from 'url';\n\nimport btoa from 'btoa';\nimport {\n deconstructHydraId\n} from '@webex/common';\n\nimport ParameterError from '../common/errors/parameter';\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport {\n _SIP_URI_,\n _PERSONAL_ROOM_,\n _MEETING_ID_,\n _CONVERSATION_URL_,\n _LOCUS_ID_,\n _MEETING_LINK_,\n _PEOPLE_,\n _ROOM_,\n HTTP_VERBS,\n USE_URI_LOOKUP_FALSE,\n TYPE,\n LOCI,\n MEETINGINFO,\n ALTERNATE_REDIRECT_TRUE,\n DIALER_REGEX,\n WEBEX_DOT_COM,\n CONVERSATION_SERVICE,\n WWW_DOT,\n JOIN,\n MEET,\n MEET_M,\n HTTPS_PROTOCOL,\n UUID_REG\n} from '../constants';\n\nconst MeetingInfoUtil = {};\n\nMeetingInfoUtil.getParsedUrl = (link) => {\n try {\n let parsedUrl = url.parse(link);\n\n if (!parsedUrl) {\n return false;\n }\n // hack for links such as <company>.webex.com/meet/<user> without a protocol\n if (!parsedUrl.protocol) {\n parsedUrl = url.parse(`${HTTPS_PROTOCOL}${link}`);\n }\n\n return parsedUrl;\n }\n catch (error) {\n LoggerProxy.logger.warn(`Meeting-info:util#getParsedUrl --> unable to parse the URL, error: ${error}`);\n\n return null;\n }\n};\n\n/**\n * Helper function to check if a string matches a known meeting link pattern\n * @param {String} value string to parse and see if it matches a meeting link\n * @returns {Boolean}\n */\nMeetingInfoUtil.isMeetingLink = (value) => {\n const parsedUrl = MeetingInfoUtil.getParsedUrl(value);\n const hostNameBool = parsedUrl.hostname && parsedUrl.hostname.includes(WEBEX_DOT_COM);\n const pathNameBool = parsedUrl.pathname && (parsedUrl.pathname.includes(`/${MEET}`) || parsedUrl.pathname.includes(`/${MEET_M}`) || parsedUrl.pathname.includes(`/${JOIN}`));\n\n return hostNameBool && pathNameBool;\n};\n\nMeetingInfoUtil.isConversationUrl = (value, webex) => {\n const clusterId = webex.internal.services.getClusterId(value);\n\n if (clusterId) {\n return clusterId.endsWith(CONVERSATION_SERVICE);\n }\n\n return false;\n};\n\nMeetingInfoUtil.convertLinkToSip = (value) => {\n const parsedUrl = MeetingInfoUtil.getParsedUrl(value);\n\n if (!parsedUrl) {\n return null;\n }\n let user;\n\n if (parsedUrl.pathname) {\n const userIndex = parsedUrl.pathname.lastIndexOf('/');\n\n user = parsedUrl.pathname.substring(userIndex + 1);\n }\n if (!user) {\n return null;\n }\n let company;\n\n if (parsedUrl.hostname) {\n const companyIndex = parsedUrl.hostname.lastIndexOf(`.${WEBEX_DOT_COM}`);\n\n company = parsedUrl.hostname.substring(0, companyIndex).replace(WWW_DOT, '');\n }\n if (!company) {\n return null;\n }\n\n return `${user}@${company}.${WEBEX_DOT_COM}`;\n};\n\n\nMeetingInfoUtil.isSipUri = (sipString) => {\n // TODO: lets remove regex from this equation and user URI matchers and such\n // have not found a great sip uri parser library as of now\n const sipUri = DIALER_REGEX.SIP_ADDRESS.exec(sipString);\n\n return sipUri;\n};\n\nMeetingInfoUtil.isPhoneNumber = (phoneNumber) => {\n const isValidNumber = DIALER_REGEX.PHONE_NUMBER.test(phoneNumber);\n\n return isValidNumber;\n};\n\nMeetingInfoUtil.getHydraId = (destination) => {\n const {type, id, cluster} = deconstructHydraId(destination);\n\n if (id && UUID_REG.test(id)) {\n if (type === _ROOM_) {\n return {room: true, destination: id, cluster};\n }\n if (type === _PEOPLE_) {\n return {people: true, destination: id, cluster};\n }\n\n return {};\n }\n\n return {};\n};\n\nMeetingInfoUtil.getSipUriFromHydraPersonId = (destination, webex) => webex.people.get(destination).then((res) => {\n if (res.emails && res.emails.length) {\n return res.emails[0];\n }\n throw new ParameterError('Hydra Id Lookup was an invalid hydra person id.');\n}).catch((err) => {\n LoggerProxy.logger.error(`Meeting-info:util#MeetingInfoUtil.getSipUriFromHydraPersonId --> getSipUriFromHydraPersonId ${err} `);\n throw err;\n});\n\nMeetingInfoUtil.generateOptions = async (from) => {\n const {destination, type, webex} = from;\n\n if (type) {\n return {\n destination,\n type\n };\n }\n const options = {};\n const hydraId = MeetingInfoUtil.getHydraId(destination);\n\n if (MeetingInfoUtil.isMeetingLink(destination)) {\n LoggerProxy.logger.warn('Meeting-info:util#generateOptions --> WARN, use of Meeting Link is deprecated, please use a SIP URI instead');\n\n options.type = _MEETING_LINK_;\n options.destination = destination;\n }\n else if (MeetingInfoUtil.isSipUri(destination)) {\n options.type = _SIP_URI_;\n options.destination = destination;\n }\n else if (MeetingInfoUtil.isPhoneNumber(destination)) {\n options.type = _SIP_URI_;\n options.destination = destination;\n }\n else if (MeetingInfoUtil.isConversationUrl(destination, webex)) {\n options.type = _CONVERSATION_URL_;\n options.destination = destination;\n }\n else if (hydraId.people) {\n options.type = _SIP_URI_;\n\n return MeetingInfoUtil.getSipUriFromHydraPersonId(hydraId.destination, webex).then((res) => {\n options.destination = res;\n\n // Since hydra person ids require a unique case in which they are\n // entirely converted to a SIP URI, we need to set a flag for detecting\n // this type of destination.\n options.wasHydraPerson = true;\n\n return Promise.resolve(options);\n });\n }\n else if (hydraId.room) {\n options.type = _CONVERSATION_URL_;\n try {\n await webex.internal.services.waitForCatalog('postauth');\n\n const conversationUrl = webex.internal.conversation.getUrlFromClusterId({\n cluster: hydraId.cluster,\n id: hydraId.destination\n });\n\n options.destination = conversationUrl;\n }\n catch (e) {\n LoggerProxy.logger.error(`Meeting-info:util#generateOptions --> ${e}`);\n throw (e);\n }\n }\n else {\n throw new ParameterError('MeetingInfo is fetched with meeting link, sip uri, phone number, hydra room id, hydra people id, or a conversation url.');\n }\n\n return Promise.resolve(options);\n};\n\n/**\n * Helper function to build up a correct locus url depending on the value passed\n * @param {String} type One of [SIP_URI, PERSONAL_ROOM, MEETING_ID, CONVERSATION_URL, LOCUS_ID, MEETING_LINK]\n * @param {Object} value ?? value.value\n * @returns {Object} returns an object with {resource, method}\n */\nMeetingInfoUtil.getResourceUrl = (type, value) => {\n let resource = `/${LOCI}/${MEETINGINFO}`;\n let method = HTTP_VERBS.GET;\n let uri = null;\n\n switch (type) {\n case _SIP_URI_:\n case _PERSONAL_ROOM_:\n case _MEETING_ID_:\n resource = `/${LOCI}/${MEETINGINFO}/${encodeURIComponent(value)}?${TYPE}=${type}&${USE_URI_LOOKUP_FALSE}`;\n break;\n case _CONVERSATION_URL_:\n method = HTTP_VERBS.PUT;\n break;\n case _LOCUS_ID_:\n uri = `${value}/${MEETINGINFO}`;\n method = HTTP_VERBS.PUT;\n break;\n case _MEETING_LINK_:\n resource = `$/${LOCI}/${MEETINGINFO}/${btoa(value)}?${TYPE}=${_MEETING_LINK_}&${USE_URI_LOOKUP_FALSE}`;\n break;\n default:\n }\n\n return {\n uri,\n resource,\n method\n };\n};\n\nMeetingInfoUtil.getRequestParams = (resourceOptions, type, value, api) => {\n let requestParams = {\n method: resourceOptions.method,\n api,\n resource: resourceOptions.resource\n };\n\n if (resourceOptions.method === HTTP_VERBS.GET) {\n // for handling URL redirections\n requestParams.resource = requestParams.resource.concat(`&${ALTERNATE_REDIRECT_TRUE}`);\n }\n else\n if (type !== _LOCUS_ID_) {\n // locus id check is a PUT not sure why\n requestParams.resource = requestParams.resource.concat(`?${ALTERNATE_REDIRECT_TRUE}`);\n requestParams.body = {\n value,\n lookupType: type\n };\n }\n else if (type === _LOCUS_ID_) {\n requestParams = {\n method: resourceOptions.method,\n uri: resourceOptions.uri\n };\n }\n\n return requestParams;\n};\n\nexport default MeetingInfoUtil;\n"]}
1
+ {"version":3,"sources":["util.js"],"names":["MeetingInfoUtil","extractDestination","destination","type","dest","_LOCUS_ID_","url","ParameterError","getParsedUrl","link","parsedUrl","parse","protocol","HTTPS_PROTOCOL","error","LoggerProxy","logger","warn","isMeetingLink","value","hostNameBool","hostname","includes","WEBEX_DOT_COM","pathNameBool","pathname","MEET","MEET_M","JOIN","isConversationUrl","webex","clusterId","internal","services","getClusterId","endsWith","CONVERSATION_SERVICE","convertLinkToSip","user","userIndex","lastIndexOf","substring","company","companyIndex","replace","WWW_DOT","isSipUri","sipString","sipUri","DIALER_REGEX","SIP_ADDRESS","exec","isPhoneNumber","phoneNumber","isValidNumber","PHONE_NUMBER","test","getHydraId","id","cluster","UUID_REG","_ROOM_","room","_PEOPLE_","people","getSipUriFromHydraPersonId","get","then","res","emails","length","catch","err","generateOptions","from","options","hydraId","_MEETING_LINK_","_SIP_URI_","_CONVERSATION_URL_","wasHydraPerson","resolve","waitForCatalog","conversationUrl","conversation","getUrlFromClusterId","getResourceUrl","resource","LOCI","MEETINGINFO","method","HTTP_VERBS","GET","uri","_PERSONAL_ROOM_","_MEETING_ID_","encodeURIComponent","TYPE","USE_URI_LOOKUP_FALSE","PUT","getRequestParams","resourceOptions","api","requestParams","concat","ALTERNATE_REDIRECT_TRUE","body","lookupType"],"mappings":"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","sourcesContent":["import url from 'url';\n\nimport btoa from 'btoa';\nimport {\n deconstructHydraId\n} from '@webex/common';\n\nimport ParameterError from '../common/errors/parameter';\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport {\n _SIP_URI_,\n _PERSONAL_ROOM_,\n _MEETING_ID_,\n _CONVERSATION_URL_,\n _LOCUS_ID_,\n _MEETING_LINK_,\n _PEOPLE_,\n _ROOM_,\n HTTP_VERBS,\n USE_URI_LOOKUP_FALSE,\n TYPE,\n LOCI,\n MEETINGINFO,\n ALTERNATE_REDIRECT_TRUE,\n DIALER_REGEX,\n WEBEX_DOT_COM,\n CONVERSATION_SERVICE,\n WWW_DOT,\n JOIN,\n MEET,\n MEET_M,\n HTTPS_PROTOCOL,\n UUID_REG\n} from '../constants';\n\nconst MeetingInfoUtil = {};\n\nMeetingInfoUtil.extractDestination = (destination, type) => {\n let dest = destination;\n\n if (type === _LOCUS_ID_) {\n if (!(destination && destination.url)) {\n throw new ParameterError('You cannot create a meeting by locus without a locus.url defined');\n }\n dest = destination.url;\n }\n\n return dest;\n};\n\nMeetingInfoUtil.getParsedUrl = (link) => {\n try {\n let parsedUrl = url.parse(link);\n\n if (!parsedUrl) {\n return false;\n }\n // hack for links such as <company>.webex.com/meet/<user> without a protocol\n if (!parsedUrl.protocol) {\n parsedUrl = url.parse(`${HTTPS_PROTOCOL}${link}`);\n }\n\n return parsedUrl;\n }\n catch (error) {\n LoggerProxy.logger.warn(`Meeting-info:util#getParsedUrl --> unable to parse the URL, error: ${error}`);\n\n return null;\n }\n};\n\n/**\n * Helper function to check if a string matches a known meeting link pattern\n * @param {String} value string to parse and see if it matches a meeting link\n * @returns {Boolean}\n */\nMeetingInfoUtil.isMeetingLink = (value) => {\n const parsedUrl = MeetingInfoUtil.getParsedUrl(value);\n const hostNameBool = parsedUrl.hostname && parsedUrl.hostname.includes(WEBEX_DOT_COM);\n const pathNameBool = parsedUrl.pathname && (parsedUrl.pathname.includes(`/${MEET}`) || parsedUrl.pathname.includes(`/${MEET_M}`) || parsedUrl.pathname.includes(`/${JOIN}`));\n\n return hostNameBool && pathNameBool;\n};\n\nMeetingInfoUtil.isConversationUrl = (value, webex) => {\n const clusterId = webex.internal.services.getClusterId(value);\n\n if (clusterId) {\n return clusterId.endsWith(CONVERSATION_SERVICE);\n }\n\n return false;\n};\n\nMeetingInfoUtil.convertLinkToSip = (value) => {\n const parsedUrl = MeetingInfoUtil.getParsedUrl(value);\n\n if (!parsedUrl) {\n return null;\n }\n let user;\n\n if (parsedUrl.pathname) {\n const userIndex = parsedUrl.pathname.lastIndexOf('/');\n\n user = parsedUrl.pathname.substring(userIndex + 1);\n }\n if (!user) {\n return null;\n }\n let company;\n\n if (parsedUrl.hostname) {\n const companyIndex = parsedUrl.hostname.lastIndexOf(`.${WEBEX_DOT_COM}`);\n\n company = parsedUrl.hostname.substring(0, companyIndex).replace(WWW_DOT, '');\n }\n if (!company) {\n return null;\n }\n\n return `${user}@${company}.${WEBEX_DOT_COM}`;\n};\n\n\nMeetingInfoUtil.isSipUri = (sipString) => {\n // TODO: lets remove regex from this equation and user URI matchers and such\n // have not found a great sip uri parser library as of now\n const sipUri = DIALER_REGEX.SIP_ADDRESS.exec(sipString);\n\n return sipUri;\n};\n\nMeetingInfoUtil.isPhoneNumber = (phoneNumber) => {\n const isValidNumber = DIALER_REGEX.PHONE_NUMBER.test(phoneNumber);\n\n return isValidNumber;\n};\n\nMeetingInfoUtil.getHydraId = (destination) => {\n const {type, id, cluster} = deconstructHydraId(destination);\n\n if (id && UUID_REG.test(id)) {\n if (type === _ROOM_) {\n return {room: true, destination: id, cluster};\n }\n if (type === _PEOPLE_) {\n return {people: true, destination: id, cluster};\n }\n\n return {};\n }\n\n return {};\n};\n\nMeetingInfoUtil.getSipUriFromHydraPersonId = (destination, webex) => webex.people.get(destination).then((res) => {\n if (res.emails && res.emails.length) {\n return res.emails[0];\n }\n throw new ParameterError('Hydra Id Lookup was an invalid hydra person id.');\n}).catch((err) => {\n LoggerProxy.logger.error(`Meeting-info:util#MeetingInfoUtil.getSipUriFromHydraPersonId --> getSipUriFromHydraPersonId ${err} `);\n throw err;\n});\n\nMeetingInfoUtil.generateOptions = async (from) => {\n const {destination, type, webex} = from;\n\n if (type) {\n return {\n destination,\n type\n };\n }\n const options = {};\n const hydraId = MeetingInfoUtil.getHydraId(destination);\n\n if (MeetingInfoUtil.isMeetingLink(destination)) {\n LoggerProxy.logger.warn('Meeting-info:util#generateOptions --> WARN, use of Meeting Link is deprecated, please use a SIP URI instead');\n\n options.type = _MEETING_LINK_;\n options.destination = destination;\n }\n else if (MeetingInfoUtil.isSipUri(destination)) {\n options.type = _SIP_URI_;\n options.destination = destination;\n }\n else if (MeetingInfoUtil.isPhoneNumber(destination)) {\n options.type = _SIP_URI_;\n options.destination = destination;\n }\n else if (MeetingInfoUtil.isConversationUrl(destination, webex)) {\n options.type = _CONVERSATION_URL_;\n options.destination = destination;\n }\n else if (hydraId.people) {\n options.type = _SIP_URI_;\n\n return MeetingInfoUtil.getSipUriFromHydraPersonId(hydraId.destination, webex).then((res) => {\n options.destination = res;\n\n // Since hydra person ids require a unique case in which they are\n // entirely converted to a SIP URI, we need to set a flag for detecting\n // this type of destination.\n options.wasHydraPerson = true;\n\n return Promise.resolve(options);\n });\n }\n else if (hydraId.room) {\n options.type = _CONVERSATION_URL_;\n try {\n await webex.internal.services.waitForCatalog('postauth');\n\n const conversationUrl = webex.internal.conversation.getUrlFromClusterId({\n cluster: hydraId.cluster,\n id: hydraId.destination\n });\n\n options.destination = conversationUrl;\n }\n catch (e) {\n LoggerProxy.logger.error(`Meeting-info:util#generateOptions --> ${e}`);\n throw (e);\n }\n }\n else {\n throw new ParameterError('MeetingInfo is fetched with meeting link, sip uri, phone number, hydra room id, hydra people id, or a conversation url.');\n }\n\n return Promise.resolve(options);\n};\n\n/**\n * Helper function to build up a correct locus url depending on the value passed\n * @param {String} type One of [SIP_URI, PERSONAL_ROOM, MEETING_ID, CONVERSATION_URL, LOCUS_ID, MEETING_LINK]\n * @param {Object} value ?? value.value\n * @returns {Object} returns an object with {resource, method}\n */\nMeetingInfoUtil.getResourceUrl = (type, value) => {\n let resource = `/${LOCI}/${MEETINGINFO}`;\n let method = HTTP_VERBS.GET;\n let uri = null;\n\n switch (type) {\n case _SIP_URI_:\n case _PERSONAL_ROOM_:\n case _MEETING_ID_:\n resource = `/${LOCI}/${MEETINGINFO}/${encodeURIComponent(value)}?${TYPE}=${type}&${USE_URI_LOOKUP_FALSE}`;\n break;\n case _CONVERSATION_URL_:\n method = HTTP_VERBS.PUT;\n break;\n case _LOCUS_ID_:\n uri = `${value}/${MEETINGINFO}`;\n method = HTTP_VERBS.PUT;\n break;\n case _MEETING_LINK_:\n resource = `$/${LOCI}/${MEETINGINFO}/${btoa(value)}?${TYPE}=${_MEETING_LINK_}&${USE_URI_LOOKUP_FALSE}`;\n break;\n default:\n }\n\n return {\n uri,\n resource,\n method\n };\n};\n\nMeetingInfoUtil.getRequestParams = (resourceOptions, type, value, api) => {\n let requestParams = {\n method: resourceOptions.method,\n api,\n resource: resourceOptions.resource\n };\n\n if (resourceOptions.method === HTTP_VERBS.GET) {\n // for handling URL redirections\n requestParams.resource = requestParams.resource.concat(`&${ALTERNATE_REDIRECT_TRUE}`);\n }\n else\n if (type !== _LOCUS_ID_) {\n // locus id check is a PUT not sure why\n requestParams.resource = requestParams.resource.concat(`?${ALTERNATE_REDIRECT_TRUE}`);\n requestParams.body = {\n value,\n lookupType: type\n };\n }\n else if (type === _LOCUS_ID_) {\n requestParams = {\n method: resourceOptions.method,\n uri: resourceOptions.uri\n };\n }\n\n return requestParams;\n};\n\nexport default MeetingInfoUtil;\n"]}
@@ -794,7 +794,7 @@ var Meetings = /*#__PURE__*/function (_WebexPlugin) {
794
794
  this.meetingCollection.set(meeting);
795
795
  _context.prev = 3;
796
796
  _context.next = 6;
797
- return this.meetingInfo.fetchMeetingInfo(_util2.default.extractDestination(destination, type), type);
797
+ return this.meetingInfo.fetchMeetingInfo(destination, type);
798
798
 
799
799
  case 6:
800
800
  info = _context.sent;
@@ -1 +1 @@
1
- {"version":3,"sources":["index.js"],"names":["Meetings","args","MEETINGS","request","Request","parent","webex","loggerRequest","LoggerRequest","meetingCollection","MeetingCollection","personalMeetingRoom","PersonalMeetingRoom","reachability","registered","media","getUserMedia","Media","getSupportedDevice","onReady","MeetingsUtil","checkH264Support","disableNotifications","Metrics","initialSetup","data","meeting","getByKey","LOCUS_URL","locusUrl","CORRELATION_ID","checkForCorrelationId","internal","device","url","locus","SIP_URI","self","callbackInfo","callbackAddress","CONVERSATION_URL","conversationUrl","replaces","length","fullState","state","LOCUS","STATE","INACTIVE","LoggerProxy","logger","warn","_LEFT_","removed","create","_LOCUS_ID_","then","newMeeting","eventType","LOCUSEVENT","DIFFERENCE","locusInfo","catch","e","console","log","finally","getMeetingByType","_ID_","id","postEvent","event","REMOTE_STARTED","trigger","MERCURY_EVENT","Trigger","file","function","EVENT_TRIGGERS","MEETING_ADDED","type","_MEETING_","_JOIN_","_INCOMING_","parse","envelope","MESSAGE_ROAP","handleLocusEvent","MEETINGS_NETWORK_DISCONNECTED","mercury","on","LOCUS_MERCURY","handleLocusMercury","ROAP","ROAP_MERCURY","handleRoapMercury","ONLINE","syncMeetings","OFFLINE","handleMercuryOffline","off","once","READY","StaticConfig","set","config","LoggerConfig","logging","meetingInfo","experimental","enableUnifiedMeetings","MeetingInfoV2","MeetingInfo","MEETINGS_READY","canAuthorize","error","reject","Error","info","resolve","all","getGeoHint","startReachability","message","register","connect","call","listenForEvents","MEETINGS_REGISTERED","stopListeningForEvents","disconnect","unregister","MEETINGS_UNREGISTERED","options","uploadLogs","uploadResult","MEETING_LOG_UPLOAD_SUCCESS","meetingId","details","uploadError","MEETING_LOG_UPLOAD_FAILURE","reason","sendOperationalMetric","METRICS_OPERATIONAL_MEASURES","UPLOAD_LOGS_FAILURE","meetingsId","stack","code","Reachability","setReachability","getReachability","gatherReachability","fetchGeoHint","res","geoHintInfo","MeetingUtil","cleanUp","delete","MEETING_REMOVED","destination","fetchInfoOptions","targetDest","_CONVERSATION_URL_","createMeeting","createdMeeting","EVENTS","DESTROY_MEETING","payload","autoUploadLogs","callStart","lastActive","correlationId","feedbackId","locusId","webExMeetingId","destroy","REQUEST_UPLOAD_LOGS","meetingInstance","Meeting","userId","deviceUrl","orgId","roapSeq","fetchMeetingInfo","extractDestination","parseMeetingInfo","body","debug","sipUri","setSipUri","meetingAddedType","getMeetingAddedType","value","getAll","getActiveMeetings","locusArray","activeLocusUrl","loci","forEach","push","meetingsCollection","includes","MEETING_REMOVED_REASON","NO_MEETINGS_TO_SYNC","scheduled","get","StatsAnalyzer","StatsCalculator","WebexPlugin"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAIA;;AACA;;AAEA;;AAEA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AAwBA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AAEA;;AACA;;;;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;IACqBA,Q;;;;;AAGjB;AACJ;AACA;AACA;AACA;AACA;AACI,sBAAqB;AAAA;;AAAA;;AAAA,sCAANC,IAAM;AAANA,MAAAA,IAAM;AAAA;;AACnB,oDAASA,IAAT;AAEA;AACN;AACA;AACA;AACA;AACA;AACA;;AATyB,4FARTC,mBAQS;AAUnB,UAAKC,OAAL,GAAe,IAAIC,iBAAJ,CAAY,EAAZ,EAAgB;AAACC,MAAAA,MAAM,EAAE,MAAKC;AAAd,KAAhB,CAAf;AACA;AACN;AACA;AACA;AACA;AACA;AACA;;AACM,UAAKC,aAAL,GAAqB,IAAIC,gBAAJ,CAAkB;AAACF,MAAAA,KAAK,EAAE,MAAKA;AAAb,KAAlB,CAArB;AACA,UAAKG,iBAAL,GAAyB,IAAIC,mBAAJ,EAAzB;AACA;AACN;AACA;AACA;AACA;AACA;AACA;;AACM,UAAKC,mBAAL,GAA2B,IAAIC,4BAAJ,CAAwB,EAAxB,EAA4B;AAACP,MAAAA,MAAM,EAAE,MAAKC;AAAd,KAA5B,CAA3B;AACA;AACN;AACA;AACA;AACA;AACA;AACA;AACA;;AACM,UAAKO,YAAL,GAAoB,IAApB;AAEA;AACN;AACA;AACA;AACA;AACA;AACA;;AACM,UAAKC,UAAL,GAAkB,KAAlB;AAEA;AACN;AACA;AACA;AACA;AACA;AACA;AACA;;AACM,UAAKC,KAAL,GAAa;AACXC,MAAAA,Y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","sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n*/\n\nimport '@webex/internal-plugin-mercury';\nimport {WebexPlugin} from '@webex/webex-core';\n\nimport 'webrtc-adapter';\n\nimport Metrics from '../metrics';\nimport {trigger, eventType} from '../metrics/config';\nimport LoggerConfig from '../common/logs/logger-config';\nimport StaticConfig from '../common/config';\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport LoggerRequest from '../common/logs/request';\nimport Trigger from '../common/events/trigger-proxy';\nimport Media from '../media';\nimport MeetingUtil from '../meeting/util';\nimport {\n MEETINGS,\n EVENTS,\n EVENT_TRIGGERS,\n READY,\n LOCUSEVENT,\n LOCUS_URL,\n ROAP,\n ONLINE,\n OFFLINE,\n _MEETING_,\n _JOIN_,\n _LOCUS_ID_,\n _INCOMING_,\n LOCUS,\n CORRELATION_ID,\n SIP_URI,\n _LEFT_,\n _ID_,\n MEETING_REMOVED_REASON,\n _CONVERSATION_URL_,\n CONVERSATION_URL,\n METRICS_OPERATIONAL_MEASURES\n} from '../constants';\nimport MeetingInfo from '../meeting-info';\nimport MeetingInfoV2 from '../meeting-info/meeting-info-v2';\nimport Meeting from '../meeting';\nimport PersonalMeetingRoom from '../personal-meeting-room';\nimport Reachability from '../reachability';\nimport Request from '../meetings/request';\nimport StatsAnalyzer from '../analyzer/analyzer';\nimport StatsCalculator from '../analyzer/calculator';\n\nimport MeetingCollection from './collection';\nimport MeetingsUtil from './util';\n\n\n/**\n * Meetings Ready Event\n * Emitted when the meetings instance on webex is ready\n * @event meetings:ready\n * @instance\n * @memberof Meetings\n */\n\n/**\n * Meetings Network Disconnected Event\n * Emitted when the meetings instance is disconnected from\n * the internal mercury server\n * @event network:disconnected\n * @instance\n * @memberof Meetings\n */\n\n/**\n * Meetings Registered Event\n * Emitted when the meetings instance has been registered and listening\n * @event meetings:registered\n * @instance\n * @memberof Meetings\n */\n\n/**\n * Meeting Removed Event\n * Emitted when a meeting was removed from the cache of meetings\n * @event meeting:removed\n * @instance\n * @type {Object}\n * @property {String} meetingId the removed meeting\n * @property {Object} response the server response\n * @property {String} type what type of meeting it was\n * @memberof Meetings\n */\n\n/**\n * Meeting Added Event\n * Emitted when a meeting was added to the cache of meetings\n * @event meeting:added\n * @instance\n * @type {Object}\n * @property {String} meetingId the added meeting\n * @property {String} type what type of meeting it was\n * @memberof Meetings\n */\n\n/**\n * Maintain a cache of meetings and sync with services.\n * @class\n */\nexport default class Meetings extends WebexPlugin {\n namespace = MEETINGS;\n\n /**\n * Initializes the Meetings Plugin\n * @constructor\n * @public\n * @memberof Meetings\n */\n constructor(...args) {\n super(...args);\n\n /**\n * The Meetings request to interact with server\n * @instance\n * @type {Object}\n * @private\n * @memberof Meetings\n */\n this.request = new Request({}, {parent: this.webex});\n /**\n * Log upload request helper\n * @instance\n * @type {Object}\n * @private\n * @memberof Meetings\n */\n this.loggerRequest = new LoggerRequest({webex: this.webex});\n this.meetingCollection = new MeetingCollection();\n /**\n * The PersonalMeetingRoom object to interact with server\n * @instance\n * @type {Object}\n * @public\n * @memberof Meetings\n */\n this.personalMeetingRoom = new PersonalMeetingRoom({}, {parent: this.webex});\n /**\n * The Reachability object to interact with server, starts as null until {@link Meeting#setReachability} is called\n * starts as null\n * @instance\n * @type {Object}\n * @private\n * @memberof Meetings\n */\n this.reachability = null;\n\n /**\n * If the meetings plugin has been registered and listening via {@link Meetings#register}\n * @instance\n * @type {Boolean}\n * @public\n * @memberof Meetings\n */\n this.registered = false;\n\n /**\n * The public interface for the internal Media util files. These are helpful to expose outside the context\n * of a meeting so that a user can access media without creating a meeting instance.\n * @instance\n * @type {Object}\n * @private\n * @memberof Meetings\n */\n this.media = {\n getUserMedia: Media.getUserMedia,\n getSupportedDevice: Media.getSupportedDevice\n };\n\n this.onReady();\n MeetingsUtil.checkH264Support({disableNotifications: true});\n Metrics.initialSetup(this.meetingCollection, this.webex);\n }\n\n /**\n * handle locus events and takes meeting actions with them as they come in\n * @param {Object} data a locus event\n * @param {String} data.locusUrl\n * @param {Object} data.locus\n * @param {String} data.eventType\n * @returns {undefined}\n * @private\n * @memberof Meetings\n */\n handleLocusEvent(data) {\n let meeting = null;\n\n // getting meeting by correlationId. This will happen for the new event\n // Either the locus\n // TODO : Add check for the callBack Address\n meeting = this.meetingCollection.getByKey(LOCUS_URL, data.locusUrl) ||\n this.meetingCollection.getByKey(CORRELATION_ID, MeetingsUtil.checkForCorrelationId(this.webex.internal.device.url, data.locus)) ||\n this.meetingCollection.getByKey(SIP_URI, data.locus.self && data.locus.self.callbackInfo && data.locus.self.callbackInfo.callbackAddress) ||\n this.meetingCollection.getByKey(CONVERSATION_URL, data.locus.conversationUrl);\n\n // Special case when locus has got replaced, This only happend once if a replace locus exists\n // https://sqbu-github.cisco.com/WebExSquared/locus/wiki/Locus-changing-mid-call\n\n if (!meeting && data.locus?.replaces?.length > 0) {\n // Always the last element in the replace is the active one\n meeting = this.meetingCollection.getByKey(LOCUS_URL, data.locus.replaces[data.locus.replaces.length - 1].locusUrl);\n }\n\n if (!meeting) {\n // TODO: create meeting when we get a meeting object\n // const checkForEnded = (locus) => {\n // TODO: you already ended the meeting but you got an event later\n // Mainly for 1:1 Callsor meeting\n // Happens mainly after refresh\n\n // 1:1 Meeting\n // 1) You ended a call before but you got a mercury event\n // Make sure end the call and cleanup the meeting only if the mercury\n // event says so\n // 2) Maintain lastSync time in the meetings object which helps to compare\n // If the meeting came befor or after the sync . ANy meeting start time before the sync time is invalid\n\n // For space Meeting\n // Check the locus object and see who has joined\n\n // };\n // rather then locus object change to locus url\n\n if (data.locus && data.locus.fullState && data.locus.fullState.state === LOCUS.STATE.INACTIVE) {\n // just ignore the event as its already ended and not active\n LoggerProxy.logger.warn('Meetings:index#handleLocusEvent --> Locus event received for meeting, after it was ended.');\n\n return;\n }\n\n\n // When its wireless share or guest and user leaves the meeting we dont have to keep the meeting object\n // Any future events will be neglected\n\n if (data.locus && data.locus.self && (data.locus.self.state === _LEFT_ && data.locus.self.removed === true)) {\n // just ignore the event as its already ended and not active\n LoggerProxy.logger.warn('Meetings:index#handleLocusEvent --> Locus event received for meeting, after it was ended.');\n\n return;\n }\n\n this.create(data.locus, _LOCUS_ID_).then((newMeeting) => {\n meeting = newMeeting;\n\n if (data.eventType === LOCUSEVENT.DIFFERENCE) {\n // its a delta object and we have a new meeting\n meeting.locusInfo.initialSetup(data.locus, meeting);\n }\n else {\n // Its a new meeting and have a fresh locus object\n meeting.locusInfo.initialSetup(data.locus);\n }\n }).catch((e) => {\n console.log(e);\n })\n .finally(() => {\n // There will be cases where locus event comes in gets created and deleted because its a 1:1 and meeting gets deleted\n // because the other user left so before sending 'added' event make sure it exists in the collection\n\n if (this.getMeetingByType(_ID_, meeting.id)) {\n Metrics.postEvent({event: eventType.REMOTE_STARTED, meeting, data: {trigger: trigger.MERCURY_EVENT}});\n Trigger.trigger(\n this,\n {\n file: 'meetings',\n function: 'handleLocusEvent'\n },\n EVENT_TRIGGERS.MEETING_ADDED,\n {\n meeting,\n type: meeting.type === _MEETING_ ? _JOIN_ : _INCOMING_\n }\n );\n }\n else {\n // Meeting got added but was not found in the collection. It might have got destroyed\n LoggerProxy.logger.warn('Meetings:index#handleLocusEvent --> Created and destroyed meeting object before sending an event');\n }\n });\n }\n else {\n meeting.locusInfo.parse(meeting, data);\n }\n }\n\n /**\n * handles locus events through mercury that are not roap\n * @param {Object} envelope\n * @param {Object} envelope.data\n * @param {String} envelope.data.eventType\n * @returns {undefined}\n * @private\n * @memberof Meetings\n */\n handleLocusMercury(envelope) {\n const {data} = envelope;\n const {eventType} = data;\n\n if (eventType && eventType !== LOCUSEVENT.MESSAGE_ROAP) {\n this.handleLocusEvent(data);\n }\n }\n\n\n /**\n * handles mecury offline event\n * @returns {undefined}\n * @private\n * @memberof Meetings\n */\n handleMercuryOffline() {\n Trigger.trigger(\n this,\n {\n file: 'meetings/index',\n function: 'handleMercuryOffline'\n },\n EVENT_TRIGGERS.MEETINGS_NETWORK_DISCONNECTED,\n );\n }\n\n\n /**\n * registers for locus and roap mercury events\n * @returns {undefined}\n * @private\n * @memberof Meetings\n */\n listenForEvents() {\n this.webex.internal.mercury.on(LOCUSEVENT.LOCUS_MERCURY, (envelope) => {\n this.handleLocusMercury(envelope);\n });\n this.webex.internal.mercury.on(ROAP.ROAP_MERCURY, (envelope) => {\n MeetingsUtil.handleRoapMercury(envelope, this.meetingCollection);\n });\n\n this.webex.internal.mercury.on(ONLINE, () => {\n this.syncMeetings();\n });\n\n this.webex.internal.mercury.on(OFFLINE, () => {\n this.handleMercuryOffline();\n });\n }\n\n /**\n * stops listening for locus and roap mercury events\n * @returns {undefined}\n * @private\n * @memberof Meetings\n */\n stopListeningForEvents() {\n this.webex.internal.mercury.off(LOCUSEVENT.LOCUS_MERCURY);\n this.webex.internal.mercury.off(ROAP.ROAP_MERCURY);\n this.webex.internal.mercury.off(ONLINE);\n }\n\n /**\n * @returns {undefined}\n * @private\n * @memberof Meetings\n */\n onReady() {\n this.webex.once(READY, () => {\n StaticConfig.set(this.config);\n LoggerConfig.set(this.config.logging);\n LoggerProxy.set(this.webex.logger);\n\n /**\n * The MeetingInfo object to interact with server\n * @instance\n * @type {Object}\n * @private\n * @memberof Meetings\n */\n this.meetingInfo = this.config.experimental.enableUnifiedMeetings ? new MeetingInfoV2(this.webex) : new MeetingInfo(this.webex);\n\n Trigger.trigger(\n this,\n {\n file: 'meetings',\n function: 'onReady'\n },\n EVENT_TRIGGERS.MEETINGS_READY\n );\n });\n }\n\n /**\n * Explicitly sets up the meetings plugin by registering\n * the device, connecting to mercury, and listening for locus events.\n *\n * @returns {Promise}\n * @public\n * @memberof Meetings\n */\n register() {\n if (!this.webex.canAuthorize) {\n LoggerProxy.logger.error('Meetings:index#register --> ERROR, Unable to register, SDK cannot authorize');\n\n return Promise.reject(new Error('SDK cannot authorize'));\n }\n\n\n if (this.registered) {\n LoggerProxy.logger.info('Meetings:index#register --> INFO, Meetings plugin already registered');\n\n return Promise.resolve();\n }\n\n return Promise.all([\n this.getGeoHint(),\n this.startReachability().catch((error) => {\n LoggerProxy.logger.error(`Meetings:index#register --> GDM error, ${error.message}`);\n }),\n this.webex.internal.device.register()\n .then(() => LoggerProxy.logger.info(`Meetings:index#register --> INFO, Device registered ${this.webex.internal.device.url}`))\n .then(() => this.webex.internal.mercury.connect()),\n MeetingsUtil.checkH264Support.call(this)\n ]).then(() => {\n this.listenForEvents();\n Trigger.trigger(\n this,\n {\n file: 'meetings',\n function: 'register'\n },\n EVENT_TRIGGERS.MEETINGS_REGISTERED\n );\n this.registered = true;\n })\n .catch((error) => {\n LoggerProxy.logger.error(`Meetings:index#register --> ERROR, Unable to register, ${error.message}`);\n\n return Promise.reject(error);\n });\n }\n\n /**\n * Explicitly tears down the meetings plugin by deregistering\n * the device, disconnecting from mercury, and stops listening to locus events\n *\n * @returns {Promise}\n * @public\n * @memberof Meetings\n */\n unregister() {\n if (!this.registered) {\n LoggerProxy.logger.info('Meetings:index#unregister --> INFO, Meetings plugin already unregistered');\n\n return Promise.resolve();\n }\n\n this.stopListeningForEvents();\n\n return this.webex.internal.mercury.disconnect()\n .then(() => this.webex.internal.device.unregister())\n .then(() => {\n Trigger.trigger(\n this,\n {\n file: 'meetings',\n function: 'unregister'\n },\n EVENT_TRIGGERS.MEETINGS_UNREGISTERED\n );\n this.registered = false;\n });\n }\n\n /**\n * Uploads logs to the webex services for tracking\n * @param {Object} [options={}]\n * @param {String} [options.callStart] Call Start Time\n * @param {String} [options.feedbackId] ID used for tracking\n * @param {String} [options.locusId]\n * @param {String} [options.correlationId]\n * @param {String} [options.meetingId] webex meeting ID\n * @param {String} [options.userId] userId\n * @param {String} [options.orgId] org id\n * @returns {String} feedback ID logs were submitted under\n */\n uploadLogs(options = {}) {\n LoggerProxy.logger.info('Meetings:index#uploadLogs --> uploading logs');\n\n return this.loggerRequest.uploadLogs(options)\n .then((uploadResult) => {\n LoggerProxy.logger.info('Meetings:index#uploadLogs --> Upload logs for meeting completed.', uploadResult);\n Trigger.trigger(\n this,\n {\n file: 'meetings',\n function: 'uploadLogs'\n },\n EVENT_TRIGGERS.MEETING_LOG_UPLOAD_SUCCESS,\n {\n meetingId: options.meetingId,\n details: uploadResult\n }\n );\n })\n .catch((uploadError) => {\n LoggerProxy.logger.error('Meetings:index#uploadLogs --> Unable to upload logs for meeting', uploadError);\n Trigger.trigger(\n this,\n {\n file: 'meetings',\n function: 'uploadLogs'\n },\n EVENT_TRIGGERS.MEETING_LOG_UPLOAD_FAILURE,\n {\n meetingId: options.meetingId,\n reason: uploadError\n }\n );\n\n Metrics.sendOperationalMetric(\n METRICS_OPERATIONAL_MEASURES.UPLOAD_LOGS_FAILURE,\n {\n meetingId: options.meetingsId,\n reason: uploadError.message,\n stack: uploadError.stack,\n code: uploadError.code\n }\n );\n });\n }\n\n /**\n * initializes the reachability instance for Meetings\n * @returns {undefined}\n * @public\n * @memberof Meetings\n */\n setReachability() {\n this.reachability = new Reachability(this.webex);\n }\n\n /**\n * gets the reachability instance for Meetings\n * @returns {Reachability}\n * @public\n * @memberof Meetings\n */\n getReachability() {\n return this.reachability;\n }\n\n /**\n * initializes and starts gathering reachability for Meetings\n * @returns {Promise}\n * @public\n * @memberof Meetings\n */\n startReachability() {\n if (!this.reachability) {\n this.setReachability();\n }\n\n return this.getReachability().gatherReachability();\n }\n\n /**\n * Get geoHint for info for meetings\n * @returns {Promise}\n * @private\n * @memberof Meetings\n */\n getGeoHint() {\n return this.request.fetchGeoHint().then((res) => {\n this.geoHintInfo = res;\n });\n }\n\n /**\n * gets the personal meeting room instance, for saved PMR values for this user\n * @returns {PersonalMeetingRoom}\n * @public\n * @memberof Meetings\n */\n getPersonalMeetingRoom() {\n return this.personalMeetingRoom;\n }\n\n /**\n * @param {Meeting} meeting\n * @param {Object} reason\n * @param {String} type\n * @returns {Undefined}\n * @private\n * @memberof Meetings\n */\n destroy(meeting, reason) {\n MeetingUtil.cleanUp(meeting);\n this.meetingCollection.delete(meeting.id);\n Trigger.trigger(\n this,\n {\n file: 'meetings',\n function: 'destroy'\n },\n EVENT_TRIGGERS.MEETING_REMOVED,\n {\n meetingId: meeting.id,\n reason\n }\n );\n }\n\n /**\n * Create a meeting.\n * @param {string} destination - sipURL, spaceId, phonenumber, or locus object}\n * @param {string} [type] - the optional specified type, such as locusId\n * @returns {Promise<Meeting>} A new Meeting.\n * @public\n * @memberof Meetings\n */\n create(destination, type = null) {\n // TODO: type should be from a dictionary\n\n // Validate meeting information based on the provided destination and\n // type. This must be performed prior to determining if the meeting is\n // found in the collection, as we mutate the destination for hydra person\n // id values.\n return this.meetingInfo.fetchInfoOptions(destination, type)\n // Catch a failure to fetch info options.\n .catch((error) => {\n LoggerProxy.logger.info(`Meetings:index#create --> INFO, unable to determine info options: ${error.message}`);\n })\n .then((options = {}) => {\n // Normalize the destination.\n const targetDest = options.destination || destination;\n\n // check for the conversation URL then sip Url\n let meeting = null;\n\n if (type === _CONVERSATION_URL_ || options.type === _CONVERSATION_URL_) {\n meeting = this.meetingCollection.getByKey(CONVERSATION_URL, targetDest);\n }\n\n // Attempt to collect the meeting if it exists.\n if (!meeting) {\n meeting = this.meetingCollection.getByKey(SIP_URI, targetDest);\n }\n\n\n // Validate if a meeting was found.\n if (!meeting) {\n // Create a meeting based on the normalized destination and type.\n return this.createMeeting(targetDest, type)\n .then((createdMeeting) => {\n // If the meeting was successfully created.\n if (createdMeeting && createdMeeting.on) {\n // Create a destruction event for the meeting.\n createdMeeting.on(EVENTS.DESTROY_MEETING, (payload) => {\n if (this.config.autoUploadLogs) {\n this.uploadLogs({\n callStart: createdMeeting.locusInfo?.fullState?.lastActive,\n correlationId: createdMeeting.correlationId,\n feedbackId: createdMeeting.correlationId,\n locusId: createdMeeting.locusId,\n meetingId: createdMeeting.locusInfo?.info?.webExMeetingId\n }).then(() => this.destroy(createdMeeting, payload.reason));\n }\n else {\n this.destroy(createdMeeting, payload.reason);\n }\n });\n\n createdMeeting.on(EVENTS.REQUEST_UPLOAD_LOGS, (meetingInstance) => {\n if (this.config.autoUploadLogs) {\n this.uploadLogs({\n callStart: meetingInstance?.locusInfo?.fullState?.lastActive,\n correlationId: meetingInstance.correlationId,\n feedbackId: meetingInstance.correlationId,\n locusId: meetingInstance.locusId,\n meetingId: meetingInstance.locusInfo?.info?.webExMeetingId\n });\n }\n });\n }\n else {\n LoggerProxy.logger.error(`Meetings:index#create --> ERROR, meeting does not have on method, will not be destroyed, meeting cleanup impossible for meeting: ${meeting}`);\n }\n\n // Return the newly created meeting.\n return Promise.resolve(createdMeeting);\n });\n }\n\n // Return the existing meeting.\n return Promise.resolve(meeting);\n });\n }\n\n /**\n * @param {String} destination see create()\n * @param {String} type see create()\n * @returns {Promise} a new meeting instance complete with meeting info and destination\n * @private\n * @memberof Meetings\n */\n async createMeeting(destination, type = null) {\n const meeting = new Meeting(\n {\n userId: this.webex.internal.device.userId,\n deviceUrl: this.webex.internal.device.url,\n orgId: this.webex.internal.device.orgId,\n roapSeq: 0,\n locus: type === _LOCUS_ID_ ? destination : null // pass the locus object if present\n },\n {\n parent: this.webex\n }\n );\n\n this.meetingCollection.set(meeting);\n\n try {\n const info = await this.meetingInfo.fetchMeetingInfo(MeetingsUtil.extractDestination(destination, type), type);\n\n meeting.parseMeetingInfo(info);\n meeting.meetingInfo = info ? info.body : null;\n }\n catch (err) {\n // if there is no meeting info we assume its a 1:1 call or wireless share\n LoggerProxy.logger.info(`Meetings:index#createMeeting --> Info Unable to fetch meeting info for ${destination}.`);\n LoggerProxy.logger.info('Meetings:index#createMeeting --> Info assuming this destination is a 1:1 or wireless share');\n LoggerProxy.logger.debug(`Meetings:index#createMeeting --> Debug ${err} fetching /meetingInfo for creation.`);\n // We need to save this info for future reference\n meeting.destination = destination;\n }\n finally {\n // For type LOCUS_ID we need to parse the locus object to get the information\n // about the caller and callee\n // Meeting Added event will be created in `handleLocusEvent`\n if (type !== _LOCUS_ID_) {\n if (!meeting.sipUri) {\n meeting.setSipUri(destination);\n }\n\n // TODO: check if we have to move this to parser\n const meetingAddedType = MeetingsUtil.getMeetingAddedType(type);\n\n // We typically shouldn't need to trigger both and event and return a promise.\n // Is this a special case? We want to make the public API usage as simple as possible.\n Trigger.trigger(\n this,\n {\n file: 'meetings',\n function: 'createMeeting'\n },\n EVENT_TRIGGERS.MEETING_ADDED,\n {\n meeting,\n type: meetingAddedType\n }\n );\n }\n }\n\n return meeting;\n\n // Create the meeting calling the necessary service endpoints.\n\n // Internally, there are many more destinations:\n //\n // - locusID\n // - meetingURL\n // - globalMeetingID, e.g, *00*meetingID\n // - meetingID\n // - meetingURL\n // - PSTN\n // - phone number\n //\n // Our job is to determine the appropriate one\n // and its corresponding service so that developers\n // need only sipURL or spaceID to get a meeting\n // and its ID, but have the option to use createWithType()\n // and specify those types to get meetingInfo\n }\n\n /**\n * get a specifc meeting given it's type matched to the value, i.e., locus url\n * @param {String} type\n * @param {Object} value\n * @returns {Meeting}\n * @public\n * @memberof Meetings\n */\n getMeetingByType(type, value) {\n return this.meetingCollection.getByKey(type, value);\n }\n\n /**\n * Get all meetings.\n * @param {object} options\n * @param {object} options.startDate - get meetings after this start date\n * @param {object} options.endDate - get meetings before this end date\n * @returns {Object} All currently active meetings.\n * @public\n * @memberof Meetings\n */\n getAllMeetings(options = {}) {\n // Options may include other parameters to filter this collection\n // of meetings.\n return this.meetingCollection.getAll(options);\n }\n\n /**\n * syncs all the meeting from server\n * @returns {undefined}\n * @public\n * @memberof Meetings\n */\n syncMeetings() {\n return this.request.getActiveMeetings().then((locusArray) => {\n const activeLocusUrl = [];\n\n if (locusArray?.loci && locusArray.loci.length > 0) {\n locusArray.loci.forEach((locus) => {\n activeLocusUrl.push(locus.url);\n this.handleLocusEvent({\n locus,\n locusUrl: locus.url\n });\n });\n }\n const meetingsCollection = this.meetingCollection.getAll();\n\n if (Object.keys(meetingsCollection).length > 0) {\n // Some time the mercury event is missed after mercury reconnect\n // if sync returns no locus then clear all the meetings\n for (const meeting of Object.values(meetingsCollection)) {\n if (!activeLocusUrl.includes(meeting.locusUrl)) {\n // destroy function also uploads logs\n this.destroy(meeting, MEETING_REMOVED_REASON.NO_MEETINGS_TO_SYNC);\n }\n }\n }\n });\n }\n\n /**\n * Get all scheduled meetings.\n * @param {object} options\n * @param {object} options.startDate - get meetings after this start date\n * @param {object} options.endDate - get meetings before this end date\n * @returns {Object} All scheduled meetings.\n * @memberof Meetings\n */\n getScheduledMeetings() {\n return this.meetingCollection.getAll({scheduled: true});\n }\n\n /**\n * Get the logger instance for plugin-meetings\n * @returns {Logger}\n */\n getLogger() {\n return LoggerProxy.get();\n }\n\n /**\n * Get the Stats Analyzer singleton\n * @returns {StatsAnalyzer}\n * @public\n * @memberof Meetings\n */\n getAnalyzer() {\n return StatsAnalyzer;\n }\n\n /**\n * Get the Stats Calculator singleton\n * @returns {StatsCalculator}\n * @public\n * @memberof Meetings\n */\n getCalculator() {\n return StatsCalculator;\n }\n}\n"]}
1
+ {"version":3,"sources":["index.js"],"names":["Meetings","args","MEETINGS","request","Request","parent","webex","loggerRequest","LoggerRequest","meetingCollection","MeetingCollection","personalMeetingRoom","PersonalMeetingRoom","reachability","registered","media","getUserMedia","Media","getSupportedDevice","onReady","MeetingsUtil","checkH264Support","disableNotifications","Metrics","initialSetup","data","meeting","getByKey","LOCUS_URL","locusUrl","CORRELATION_ID","checkForCorrelationId","internal","device","url","locus","SIP_URI","self","callbackInfo","callbackAddress","CONVERSATION_URL","conversationUrl","replaces","length","fullState","state","LOCUS","STATE","INACTIVE","LoggerProxy","logger","warn","_LEFT_","removed","create","_LOCUS_ID_","then","newMeeting","eventType","LOCUSEVENT","DIFFERENCE","locusInfo","catch","e","console","log","finally","getMeetingByType","_ID_","id","postEvent","event","REMOTE_STARTED","trigger","MERCURY_EVENT","Trigger","file","function","EVENT_TRIGGERS","MEETING_ADDED","type","_MEETING_","_JOIN_","_INCOMING_","parse","envelope","MESSAGE_ROAP","handleLocusEvent","MEETINGS_NETWORK_DISCONNECTED","mercury","on","LOCUS_MERCURY","handleLocusMercury","ROAP","ROAP_MERCURY","handleRoapMercury","ONLINE","syncMeetings","OFFLINE","handleMercuryOffline","off","once","READY","StaticConfig","set","config","LoggerConfig","logging","meetingInfo","experimental","enableUnifiedMeetings","MeetingInfoV2","MeetingInfo","MEETINGS_READY","canAuthorize","error","reject","Error","info","resolve","all","getGeoHint","startReachability","message","register","connect","call","listenForEvents","MEETINGS_REGISTERED","stopListeningForEvents","disconnect","unregister","MEETINGS_UNREGISTERED","options","uploadLogs","uploadResult","MEETING_LOG_UPLOAD_SUCCESS","meetingId","details","uploadError","MEETING_LOG_UPLOAD_FAILURE","reason","sendOperationalMetric","METRICS_OPERATIONAL_MEASURES","UPLOAD_LOGS_FAILURE","meetingsId","stack","code","Reachability","setReachability","getReachability","gatherReachability","fetchGeoHint","res","geoHintInfo","MeetingUtil","cleanUp","delete","MEETING_REMOVED","destination","fetchInfoOptions","targetDest","_CONVERSATION_URL_","createMeeting","createdMeeting","EVENTS","DESTROY_MEETING","payload","autoUploadLogs","callStart","lastActive","correlationId","feedbackId","locusId","webExMeetingId","destroy","REQUEST_UPLOAD_LOGS","meetingInstance","Meeting","userId","deviceUrl","orgId","roapSeq","fetchMeetingInfo","parseMeetingInfo","body","debug","sipUri","setSipUri","meetingAddedType","getMeetingAddedType","value","getAll","getActiveMeetings","locusArray","activeLocusUrl","loci","forEach","push","meetingsCollection","includes","MEETING_REMOVED_REASON","NO_MEETINGS_TO_SYNC","scheduled","get","StatsAnalyzer","StatsCalculator","WebexPlugin"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAIA;;AACA;;AAEA;;AAEA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AAwBA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AAEA;;AACA;;;;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;IACqBA,Q;;;;;AAGjB;AACJ;AACA;AACA;AACA;AACA;AACI,sBAAqB;AAAA;;AAAA;;AAAA,sCAANC,IAAM;AAANA,MAAAA,IAAM;AAAA;;AACnB,oDAASA,IAAT;AAEA;AACN;AACA;AACA;AACA;AACA;AACA;;AATyB,4FARTC,mBAQS;AAUnB,UAAKC,OAAL,GAAe,IAAIC,iBAAJ,CAAY,EAAZ,EAAgB;AAACC,MAAAA,MAAM,EAAE,MAAKC;AAAd,KAAhB,CAAf;AACA;AACN;AACA;AACA;AACA;AACA;AACA;;AACM,UAAKC,aAAL,GAAqB,IAAIC,gBAAJ,CAAkB;AAACF,MAAAA,KAAK,EAAE,MAAKA;AAAb,KAAlB,CAArB;AACA,UAAKG,iBAAL,GAAyB,IAAIC,mBAAJ,EAAzB;AACA;AACN;AACA;AACA;AACA;AACA;AACA;;AACM,UAAKC,mBAAL,GAA2B,IAAIC,4BAAJ,CAAwB,EAAxB,EAA4B;AAACP,MAAAA,MAAM,EAAE,MAAKC;AAAd,KAA5B,CAA3B;AACA;AACN;AACA;AACA;AACA;AACA;AACA;AACA;;AACM,UAAKO,YAAL,GAAoB,IAApB;AAEA;AACN;AACA;AACA;AACA;AACA;AACA;;AACM,UAAKC,UAAL,GAAkB,KAAlB;AAEA;AACN;AACA;AACA;AACA;AACA;AACA;AACA;;AACM,UAAKC,KAAL,GAAa;AACXC,MAAAA,Y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","sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n*/\n\nimport '@webex/internal-plugin-mercury';\nimport {WebexPlugin} from '@webex/webex-core';\n\nimport 'webrtc-adapter';\n\nimport Metrics from '../metrics';\nimport {trigger, eventType} from '../metrics/config';\nimport LoggerConfig from '../common/logs/logger-config';\nimport StaticConfig from '../common/config';\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport LoggerRequest from '../common/logs/request';\nimport Trigger from '../common/events/trigger-proxy';\nimport Media from '../media';\nimport MeetingUtil from '../meeting/util';\nimport {\n MEETINGS,\n EVENTS,\n EVENT_TRIGGERS,\n READY,\n LOCUSEVENT,\n LOCUS_URL,\n ROAP,\n ONLINE,\n OFFLINE,\n _MEETING_,\n _JOIN_,\n _LOCUS_ID_,\n _INCOMING_,\n LOCUS,\n CORRELATION_ID,\n SIP_URI,\n _LEFT_,\n _ID_,\n MEETING_REMOVED_REASON,\n _CONVERSATION_URL_,\n CONVERSATION_URL,\n METRICS_OPERATIONAL_MEASURES\n} from '../constants';\nimport MeetingInfo from '../meeting-info';\nimport MeetingInfoV2 from '../meeting-info/meeting-info-v2';\nimport Meeting from '../meeting';\nimport PersonalMeetingRoom from '../personal-meeting-room';\nimport Reachability from '../reachability';\nimport Request from '../meetings/request';\nimport StatsAnalyzer from '../analyzer/analyzer';\nimport StatsCalculator from '../analyzer/calculator';\n\nimport MeetingCollection from './collection';\nimport MeetingsUtil from './util';\n\n\n/**\n * Meetings Ready Event\n * Emitted when the meetings instance on webex is ready\n * @event meetings:ready\n * @instance\n * @memberof Meetings\n */\n\n/**\n * Meetings Network Disconnected Event\n * Emitted when the meetings instance is disconnected from\n * the internal mercury server\n * @event network:disconnected\n * @instance\n * @memberof Meetings\n */\n\n/**\n * Meetings Registered Event\n * Emitted when the meetings instance has been registered and listening\n * @event meetings:registered\n * @instance\n * @memberof Meetings\n */\n\n/**\n * Meeting Removed Event\n * Emitted when a meeting was removed from the cache of meetings\n * @event meeting:removed\n * @instance\n * @type {Object}\n * @property {String} meetingId the removed meeting\n * @property {Object} response the server response\n * @property {String} type what type of meeting it was\n * @memberof Meetings\n */\n\n/**\n * Meeting Added Event\n * Emitted when a meeting was added to the cache of meetings\n * @event meeting:added\n * @instance\n * @type {Object}\n * @property {String} meetingId the added meeting\n * @property {String} type what type of meeting it was\n * @memberof Meetings\n */\n\n/**\n * Maintain a cache of meetings and sync with services.\n * @class\n */\nexport default class Meetings extends WebexPlugin {\n namespace = MEETINGS;\n\n /**\n * Initializes the Meetings Plugin\n * @constructor\n * @public\n * @memberof Meetings\n */\n constructor(...args) {\n super(...args);\n\n /**\n * The Meetings request to interact with server\n * @instance\n * @type {Object}\n * @private\n * @memberof Meetings\n */\n this.request = new Request({}, {parent: this.webex});\n /**\n * Log upload request helper\n * @instance\n * @type {Object}\n * @private\n * @memberof Meetings\n */\n this.loggerRequest = new LoggerRequest({webex: this.webex});\n this.meetingCollection = new MeetingCollection();\n /**\n * The PersonalMeetingRoom object to interact with server\n * @instance\n * @type {Object}\n * @public\n * @memberof Meetings\n */\n this.personalMeetingRoom = new PersonalMeetingRoom({}, {parent: this.webex});\n /**\n * The Reachability object to interact with server, starts as null until {@link Meeting#setReachability} is called\n * starts as null\n * @instance\n * @type {Object}\n * @private\n * @memberof Meetings\n */\n this.reachability = null;\n\n /**\n * If the meetings plugin has been registered and listening via {@link Meetings#register}\n * @instance\n * @type {Boolean}\n * @public\n * @memberof Meetings\n */\n this.registered = false;\n\n /**\n * The public interface for the internal Media util files. These are helpful to expose outside the context\n * of a meeting so that a user can access media without creating a meeting instance.\n * @instance\n * @type {Object}\n * @private\n * @memberof Meetings\n */\n this.media = {\n getUserMedia: Media.getUserMedia,\n getSupportedDevice: Media.getSupportedDevice\n };\n\n this.onReady();\n MeetingsUtil.checkH264Support({disableNotifications: true});\n Metrics.initialSetup(this.meetingCollection, this.webex);\n }\n\n /**\n * handle locus events and takes meeting actions with them as they come in\n * @param {Object} data a locus event\n * @param {String} data.locusUrl\n * @param {Object} data.locus\n * @param {String} data.eventType\n * @returns {undefined}\n * @private\n * @memberof Meetings\n */\n handleLocusEvent(data) {\n let meeting = null;\n\n // getting meeting by correlationId. This will happen for the new event\n // Either the locus\n // TODO : Add check for the callBack Address\n meeting = this.meetingCollection.getByKey(LOCUS_URL, data.locusUrl) ||\n this.meetingCollection.getByKey(CORRELATION_ID, MeetingsUtil.checkForCorrelationId(this.webex.internal.device.url, data.locus)) ||\n this.meetingCollection.getByKey(SIP_URI, data.locus.self && data.locus.self.callbackInfo && data.locus.self.callbackInfo.callbackAddress) ||\n this.meetingCollection.getByKey(CONVERSATION_URL, data.locus.conversationUrl);\n\n // Special case when locus has got replaced, This only happend once if a replace locus exists\n // https://sqbu-github.cisco.com/WebExSquared/locus/wiki/Locus-changing-mid-call\n\n if (!meeting && data.locus?.replaces?.length > 0) {\n // Always the last element in the replace is the active one\n meeting = this.meetingCollection.getByKey(LOCUS_URL, data.locus.replaces[data.locus.replaces.length - 1].locusUrl);\n }\n\n if (!meeting) {\n // TODO: create meeting when we get a meeting object\n // const checkForEnded = (locus) => {\n // TODO: you already ended the meeting but you got an event later\n // Mainly for 1:1 Callsor meeting\n // Happens mainly after refresh\n\n // 1:1 Meeting\n // 1) You ended a call before but you got a mercury event\n // Make sure end the call and cleanup the meeting only if the mercury\n // event says so\n // 2) Maintain lastSync time in the meetings object which helps to compare\n // If the meeting came befor or after the sync . ANy meeting start time before the sync time is invalid\n\n // For space Meeting\n // Check the locus object and see who has joined\n\n // };\n // rather then locus object change to locus url\n\n if (data.locus && data.locus.fullState && data.locus.fullState.state === LOCUS.STATE.INACTIVE) {\n // just ignore the event as its already ended and not active\n LoggerProxy.logger.warn('Meetings:index#handleLocusEvent --> Locus event received for meeting, after it was ended.');\n\n return;\n }\n\n\n // When its wireless share or guest and user leaves the meeting we dont have to keep the meeting object\n // Any future events will be neglected\n\n if (data.locus && data.locus.self && (data.locus.self.state === _LEFT_ && data.locus.self.removed === true)) {\n // just ignore the event as its already ended and not active\n LoggerProxy.logger.warn('Meetings:index#handleLocusEvent --> Locus event received for meeting, after it was ended.');\n\n return;\n }\n\n this.create(data.locus, _LOCUS_ID_).then((newMeeting) => {\n meeting = newMeeting;\n\n if (data.eventType === LOCUSEVENT.DIFFERENCE) {\n // its a delta object and we have a new meeting\n meeting.locusInfo.initialSetup(data.locus, meeting);\n }\n else {\n // Its a new meeting and have a fresh locus object\n meeting.locusInfo.initialSetup(data.locus);\n }\n }).catch((e) => {\n console.log(e);\n })\n .finally(() => {\n // There will be cases where locus event comes in gets created and deleted because its a 1:1 and meeting gets deleted\n // because the other user left so before sending 'added' event make sure it exists in the collection\n\n if (this.getMeetingByType(_ID_, meeting.id)) {\n Metrics.postEvent({event: eventType.REMOTE_STARTED, meeting, data: {trigger: trigger.MERCURY_EVENT}});\n Trigger.trigger(\n this,\n {\n file: 'meetings',\n function: 'handleLocusEvent'\n },\n EVENT_TRIGGERS.MEETING_ADDED,\n {\n meeting,\n type: meeting.type === _MEETING_ ? _JOIN_ : _INCOMING_\n }\n );\n }\n else {\n // Meeting got added but was not found in the collection. It might have got destroyed\n LoggerProxy.logger.warn('Meetings:index#handleLocusEvent --> Created and destroyed meeting object before sending an event');\n }\n });\n }\n else {\n meeting.locusInfo.parse(meeting, data);\n }\n }\n\n /**\n * handles locus events through mercury that are not roap\n * @param {Object} envelope\n * @param {Object} envelope.data\n * @param {String} envelope.data.eventType\n * @returns {undefined}\n * @private\n * @memberof Meetings\n */\n handleLocusMercury(envelope) {\n const {data} = envelope;\n const {eventType} = data;\n\n if (eventType && eventType !== LOCUSEVENT.MESSAGE_ROAP) {\n this.handleLocusEvent(data);\n }\n }\n\n\n /**\n * handles mecury offline event\n * @returns {undefined}\n * @private\n * @memberof Meetings\n */\n handleMercuryOffline() {\n Trigger.trigger(\n this,\n {\n file: 'meetings/index',\n function: 'handleMercuryOffline'\n },\n EVENT_TRIGGERS.MEETINGS_NETWORK_DISCONNECTED,\n );\n }\n\n\n /**\n * registers for locus and roap mercury events\n * @returns {undefined}\n * @private\n * @memberof Meetings\n */\n listenForEvents() {\n this.webex.internal.mercury.on(LOCUSEVENT.LOCUS_MERCURY, (envelope) => {\n this.handleLocusMercury(envelope);\n });\n this.webex.internal.mercury.on(ROAP.ROAP_MERCURY, (envelope) => {\n MeetingsUtil.handleRoapMercury(envelope, this.meetingCollection);\n });\n\n this.webex.internal.mercury.on(ONLINE, () => {\n this.syncMeetings();\n });\n\n this.webex.internal.mercury.on(OFFLINE, () => {\n this.handleMercuryOffline();\n });\n }\n\n /**\n * stops listening for locus and roap mercury events\n * @returns {undefined}\n * @private\n * @memberof Meetings\n */\n stopListeningForEvents() {\n this.webex.internal.mercury.off(LOCUSEVENT.LOCUS_MERCURY);\n this.webex.internal.mercury.off(ROAP.ROAP_MERCURY);\n this.webex.internal.mercury.off(ONLINE);\n }\n\n /**\n * @returns {undefined}\n * @private\n * @memberof Meetings\n */\n onReady() {\n this.webex.once(READY, () => {\n StaticConfig.set(this.config);\n LoggerConfig.set(this.config.logging);\n LoggerProxy.set(this.webex.logger);\n\n /**\n * The MeetingInfo object to interact with server\n * @instance\n * @type {Object}\n * @private\n * @memberof Meetings\n */\n this.meetingInfo = this.config.experimental.enableUnifiedMeetings ? new MeetingInfoV2(this.webex) : new MeetingInfo(this.webex);\n\n Trigger.trigger(\n this,\n {\n file: 'meetings',\n function: 'onReady'\n },\n EVENT_TRIGGERS.MEETINGS_READY\n );\n });\n }\n\n /**\n * Explicitly sets up the meetings plugin by registering\n * the device, connecting to mercury, and listening for locus events.\n *\n * @returns {Promise}\n * @public\n * @memberof Meetings\n */\n register() {\n if (!this.webex.canAuthorize) {\n LoggerProxy.logger.error('Meetings:index#register --> ERROR, Unable to register, SDK cannot authorize');\n\n return Promise.reject(new Error('SDK cannot authorize'));\n }\n\n\n if (this.registered) {\n LoggerProxy.logger.info('Meetings:index#register --> INFO, Meetings plugin already registered');\n\n return Promise.resolve();\n }\n\n return Promise.all([\n this.getGeoHint(),\n this.startReachability().catch((error) => {\n LoggerProxy.logger.error(`Meetings:index#register --> GDM error, ${error.message}`);\n }),\n this.webex.internal.device.register()\n .then(() => LoggerProxy.logger.info(`Meetings:index#register --> INFO, Device registered ${this.webex.internal.device.url}`))\n .then(() => this.webex.internal.mercury.connect()),\n MeetingsUtil.checkH264Support.call(this)\n ]).then(() => {\n this.listenForEvents();\n Trigger.trigger(\n this,\n {\n file: 'meetings',\n function: 'register'\n },\n EVENT_TRIGGERS.MEETINGS_REGISTERED\n );\n this.registered = true;\n })\n .catch((error) => {\n LoggerProxy.logger.error(`Meetings:index#register --> ERROR, Unable to register, ${error.message}`);\n\n return Promise.reject(error);\n });\n }\n\n /**\n * Explicitly tears down the meetings plugin by deregistering\n * the device, disconnecting from mercury, and stops listening to locus events\n *\n * @returns {Promise}\n * @public\n * @memberof Meetings\n */\n unregister() {\n if (!this.registered) {\n LoggerProxy.logger.info('Meetings:index#unregister --> INFO, Meetings plugin already unregistered');\n\n return Promise.resolve();\n }\n\n this.stopListeningForEvents();\n\n return this.webex.internal.mercury.disconnect()\n .then(() => this.webex.internal.device.unregister())\n .then(() => {\n Trigger.trigger(\n this,\n {\n file: 'meetings',\n function: 'unregister'\n },\n EVENT_TRIGGERS.MEETINGS_UNREGISTERED\n );\n this.registered = false;\n });\n }\n\n /**\n * Uploads logs to the webex services for tracking\n * @param {Object} [options={}]\n * @param {String} [options.callStart] Call Start Time\n * @param {String} [options.feedbackId] ID used for tracking\n * @param {String} [options.locusId]\n * @param {String} [options.correlationId]\n * @param {String} [options.meetingId] webex meeting ID\n * @param {String} [options.userId] userId\n * @param {String} [options.orgId] org id\n * @returns {String} feedback ID logs were submitted under\n */\n uploadLogs(options = {}) {\n LoggerProxy.logger.info('Meetings:index#uploadLogs --> uploading logs');\n\n return this.loggerRequest.uploadLogs(options)\n .then((uploadResult) => {\n LoggerProxy.logger.info('Meetings:index#uploadLogs --> Upload logs for meeting completed.', uploadResult);\n Trigger.trigger(\n this,\n {\n file: 'meetings',\n function: 'uploadLogs'\n },\n EVENT_TRIGGERS.MEETING_LOG_UPLOAD_SUCCESS,\n {\n meetingId: options.meetingId,\n details: uploadResult\n }\n );\n })\n .catch((uploadError) => {\n LoggerProxy.logger.error('Meetings:index#uploadLogs --> Unable to upload logs for meeting', uploadError);\n Trigger.trigger(\n this,\n {\n file: 'meetings',\n function: 'uploadLogs'\n },\n EVENT_TRIGGERS.MEETING_LOG_UPLOAD_FAILURE,\n {\n meetingId: options.meetingId,\n reason: uploadError\n }\n );\n\n Metrics.sendOperationalMetric(\n METRICS_OPERATIONAL_MEASURES.UPLOAD_LOGS_FAILURE,\n {\n meetingId: options.meetingsId,\n reason: uploadError.message,\n stack: uploadError.stack,\n code: uploadError.code\n }\n );\n });\n }\n\n /**\n * initializes the reachability instance for Meetings\n * @returns {undefined}\n * @public\n * @memberof Meetings\n */\n setReachability() {\n this.reachability = new Reachability(this.webex);\n }\n\n /**\n * gets the reachability instance for Meetings\n * @returns {Reachability}\n * @public\n * @memberof Meetings\n */\n getReachability() {\n return this.reachability;\n }\n\n /**\n * initializes and starts gathering reachability for Meetings\n * @returns {Promise}\n * @public\n * @memberof Meetings\n */\n startReachability() {\n if (!this.reachability) {\n this.setReachability();\n }\n\n return this.getReachability().gatherReachability();\n }\n\n /**\n * Get geoHint for info for meetings\n * @returns {Promise}\n * @private\n * @memberof Meetings\n */\n getGeoHint() {\n return this.request.fetchGeoHint().then((res) => {\n this.geoHintInfo = res;\n });\n }\n\n /**\n * gets the personal meeting room instance, for saved PMR values for this user\n * @returns {PersonalMeetingRoom}\n * @public\n * @memberof Meetings\n */\n getPersonalMeetingRoom() {\n return this.personalMeetingRoom;\n }\n\n /**\n * @param {Meeting} meeting\n * @param {Object} reason\n * @param {String} type\n * @returns {Undefined}\n * @private\n * @memberof Meetings\n */\n destroy(meeting, reason) {\n MeetingUtil.cleanUp(meeting);\n this.meetingCollection.delete(meeting.id);\n Trigger.trigger(\n this,\n {\n file: 'meetings',\n function: 'destroy'\n },\n EVENT_TRIGGERS.MEETING_REMOVED,\n {\n meetingId: meeting.id,\n reason\n }\n );\n }\n\n /**\n * Create a meeting.\n * @param {string} destination - sipURL, spaceId, phonenumber, or locus object}\n * @param {string} [type] - the optional specified type, such as locusId\n * @returns {Promise<Meeting>} A new Meeting.\n * @public\n * @memberof Meetings\n */\n create(destination, type = null) {\n // TODO: type should be from a dictionary\n\n // Validate meeting information based on the provided destination and\n // type. This must be performed prior to determining if the meeting is\n // found in the collection, as we mutate the destination for hydra person\n // id values.\n return this.meetingInfo.fetchInfoOptions(destination, type)\n // Catch a failure to fetch info options.\n .catch((error) => {\n LoggerProxy.logger.info(`Meetings:index#create --> INFO, unable to determine info options: ${error.message}`);\n })\n .then((options = {}) => {\n // Normalize the destination.\n const targetDest = options.destination || destination;\n\n // check for the conversation URL then sip Url\n let meeting = null;\n\n if (type === _CONVERSATION_URL_ || options.type === _CONVERSATION_URL_) {\n meeting = this.meetingCollection.getByKey(CONVERSATION_URL, targetDest);\n }\n\n // Attempt to collect the meeting if it exists.\n if (!meeting) {\n meeting = this.meetingCollection.getByKey(SIP_URI, targetDest);\n }\n\n\n // Validate if a meeting was found.\n if (!meeting) {\n // Create a meeting based on the normalized destination and type.\n return this.createMeeting(targetDest, type)\n .then((createdMeeting) => {\n // If the meeting was successfully created.\n if (createdMeeting && createdMeeting.on) {\n // Create a destruction event for the meeting.\n createdMeeting.on(EVENTS.DESTROY_MEETING, (payload) => {\n if (this.config.autoUploadLogs) {\n this.uploadLogs({\n callStart: createdMeeting.locusInfo?.fullState?.lastActive,\n correlationId: createdMeeting.correlationId,\n feedbackId: createdMeeting.correlationId,\n locusId: createdMeeting.locusId,\n meetingId: createdMeeting.locusInfo?.info?.webExMeetingId\n }).then(() => this.destroy(createdMeeting, payload.reason));\n }\n else {\n this.destroy(createdMeeting, payload.reason);\n }\n });\n\n createdMeeting.on(EVENTS.REQUEST_UPLOAD_LOGS, (meetingInstance) => {\n if (this.config.autoUploadLogs) {\n this.uploadLogs({\n callStart: meetingInstance?.locusInfo?.fullState?.lastActive,\n correlationId: meetingInstance.correlationId,\n feedbackId: meetingInstance.correlationId,\n locusId: meetingInstance.locusId,\n meetingId: meetingInstance.locusInfo?.info?.webExMeetingId\n });\n }\n });\n }\n else {\n LoggerProxy.logger.error(`Meetings:index#create --> ERROR, meeting does not have on method, will not be destroyed, meeting cleanup impossible for meeting: ${meeting}`);\n }\n\n // Return the newly created meeting.\n return Promise.resolve(createdMeeting);\n });\n }\n\n // Return the existing meeting.\n return Promise.resolve(meeting);\n });\n }\n\n /**\n * @param {String} destination see create()\n * @param {String} type see create()\n * @returns {Promise} a new meeting instance complete with meeting info and destination\n * @private\n * @memberof Meetings\n */\n async createMeeting(destination, type = null) {\n const meeting = new Meeting(\n {\n userId: this.webex.internal.device.userId,\n deviceUrl: this.webex.internal.device.url,\n orgId: this.webex.internal.device.orgId,\n roapSeq: 0,\n locus: type === _LOCUS_ID_ ? destination : null // pass the locus object if present\n },\n {\n parent: this.webex\n }\n );\n\n this.meetingCollection.set(meeting);\n\n try {\n const info = await this.meetingInfo.fetchMeetingInfo(destination, type);\n\n meeting.parseMeetingInfo(info);\n meeting.meetingInfo = info ? info.body : null;\n }\n catch (err) {\n // if there is no meeting info we assume its a 1:1 call or wireless share\n LoggerProxy.logger.info(`Meetings:index#createMeeting --> Info Unable to fetch meeting info for ${destination}.`);\n LoggerProxy.logger.info('Meetings:index#createMeeting --> Info assuming this destination is a 1:1 or wireless share');\n LoggerProxy.logger.debug(`Meetings:index#createMeeting --> Debug ${err} fetching /meetingInfo for creation.`);\n // We need to save this info for future reference\n meeting.destination = destination;\n }\n finally {\n // For type LOCUS_ID we need to parse the locus object to get the information\n // about the caller and callee\n // Meeting Added event will be created in `handleLocusEvent`\n if (type !== _LOCUS_ID_) {\n if (!meeting.sipUri) {\n meeting.setSipUri(destination);\n }\n\n // TODO: check if we have to move this to parser\n const meetingAddedType = MeetingsUtil.getMeetingAddedType(type);\n\n // We typically shouldn't need to trigger both and event and return a promise.\n // Is this a special case? We want to make the public API usage as simple as possible.\n Trigger.trigger(\n this,\n {\n file: 'meetings',\n function: 'createMeeting'\n },\n EVENT_TRIGGERS.MEETING_ADDED,\n {\n meeting,\n type: meetingAddedType\n }\n );\n }\n }\n\n return meeting;\n\n // Create the meeting calling the necessary service endpoints.\n\n // Internally, there are many more destinations:\n //\n // - locusID\n // - meetingURL\n // - globalMeetingID, e.g, *00*meetingID\n // - meetingID\n // - meetingURL\n // - PSTN\n // - phone number\n //\n // Our job is to determine the appropriate one\n // and its corresponding service so that developers\n // need only sipURL or spaceID to get a meeting\n // and its ID, but have the option to use createWithType()\n // and specify those types to get meetingInfo\n }\n\n /**\n * get a specifc meeting given it's type matched to the value, i.e., locus url\n * @param {String} type\n * @param {Object} value\n * @returns {Meeting}\n * @public\n * @memberof Meetings\n */\n getMeetingByType(type, value) {\n return this.meetingCollection.getByKey(type, value);\n }\n\n /**\n * Get all meetings.\n * @param {object} options\n * @param {object} options.startDate - get meetings after this start date\n * @param {object} options.endDate - get meetings before this end date\n * @returns {Object} All currently active meetings.\n * @public\n * @memberof Meetings\n */\n getAllMeetings(options = {}) {\n // Options may include other parameters to filter this collection\n // of meetings.\n return this.meetingCollection.getAll(options);\n }\n\n /**\n * syncs all the meeting from server\n * @returns {undefined}\n * @public\n * @memberof Meetings\n */\n syncMeetings() {\n return this.request.getActiveMeetings().then((locusArray) => {\n const activeLocusUrl = [];\n\n if (locusArray?.loci && locusArray.loci.length > 0) {\n locusArray.loci.forEach((locus) => {\n activeLocusUrl.push(locus.url);\n this.handleLocusEvent({\n locus,\n locusUrl: locus.url\n });\n });\n }\n const meetingsCollection = this.meetingCollection.getAll();\n\n if (Object.keys(meetingsCollection).length > 0) {\n // Some time the mercury event is missed after mercury reconnect\n // if sync returns no locus then clear all the meetings\n for (const meeting of Object.values(meetingsCollection)) {\n if (!activeLocusUrl.includes(meeting.locusUrl)) {\n // destroy function also uploads logs\n this.destroy(meeting, MEETING_REMOVED_REASON.NO_MEETINGS_TO_SYNC);\n }\n }\n }\n });\n }\n\n /**\n * Get all scheduled meetings.\n * @param {object} options\n * @param {object} options.startDate - get meetings after this start date\n * @param {object} options.endDate - get meetings before this end date\n * @returns {Object} All scheduled meetings.\n * @memberof Meetings\n */\n getScheduledMeetings() {\n return this.meetingCollection.getAll({scheduled: true});\n }\n\n /**\n * Get the logger instance for plugin-meetings\n * @returns {Logger}\n */\n getLogger() {\n return LoggerProxy.get();\n }\n\n /**\n * Get the Stats Analyzer singleton\n * @returns {StatsAnalyzer}\n * @public\n * @memberof Meetings\n */\n getAnalyzer() {\n return StatsAnalyzer;\n }\n\n /**\n * Get the Stats Calculator singleton\n * @returns {StatsCalculator}\n * @public\n * @memberof Meetings\n */\n getCalculator() {\n return StatsCalculator;\n }\n}\n"]}
@@ -18,8 +18,6 @@ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime-corejs2/
18
18
 
19
19
  var _constants = require("../constants");
20
20
 
21
- var _parameter = _interopRequireDefault(require("../common/errors/parameter"));
22
-
23
21
  var _loggerProxy = _interopRequireDefault(require("../common/logs/logger-proxy"));
24
22
 
25
23
  var _triggerProxy = _interopRequireDefault(require("../common/events/trigger-proxy"));
@@ -45,20 +43,6 @@ var _triggerProxy = _interopRequireDefault(require("../common/events/trigger-pro
45
43
  */
46
44
  var MeetingsUtil = {};
47
45
 
48
- MeetingsUtil.extractDestination = function (destination, type) {
49
- var dest = destination;
50
-
51
- if (type === _constants._LOCUS_ID_) {
52
- if (!(destination && destination.url)) {
53
- throw new _parameter.default('You cannot create a meeting by locus without a locus.url defined');
54
- }
55
-
56
- dest = destination.url;
57
- }
58
-
59
- return dest;
60
- };
61
-
62
46
  MeetingsUtil.getMeetingAddedType = function (type) {
63
47
  return type === _constants._LOCUS_ID_ ? _constants._INCOMING_ : _constants._CREATED_;
64
48
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["util.js"],"names":["MeetingsUtil","extractDestination","destination","type","dest","_LOCUS_ID_","url","ParameterError","getMeetingAddedType","_INCOMING_","_CREATED_","handleRoapMercury","envelope","meetingCollection","data","eventType","LOCUSEVENT","MESSAGE_ROAP","meeting","getByKey","CORRELATION_ID","correlationId","roap","roapEvent","checkForCorrelationId","deviceUrl","locus","devices","self","foundDevice","find","device","hasH264Codec","hasCodec","pc","window","RTCPeerConnection","createOffer","offerToReceiveVideo","offer","sdp","match","close","LoggerProxy","logger","error","checkH264Support","options","firstChecked","disableNotifications","delay","maxDuration","shouldTrigger","undefined","shouldStopChecking","Trigger","trigger","file","function","EVENT_TRIGGERS","MEDIA_CODEC_LOADED","log","MEDIA_CODEC_MISSING","setTimeout","timestamp","call"],"mappings":"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","sourcesContent":["/* globals window */\n\nimport {\n _LOCUS_ID_,\n _INCOMING_,\n _CREATED_,\n LOCUSEVENT,\n CORRELATION_ID,\n EVENT_TRIGGERS\n} from '../constants';\nimport ParameterError from '../common/errors/parameter';\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport Trigger from '../common/events/trigger-proxy';\n\n/**\n * Meetings Media Codec Missing Event\n * Emitted when H.264 codec is not\n * found in the browser.\n * @event media:codec:missing\n * @instance\n * @memberof MeetingsUtil\n */\n\n/**\n * Meetings Media Codec Loaded Event\n * Emitted when H.264 codec has been\n * loaded in the browser.\n * @event media:codec:loaded\n * @instance\n * @memberof MeetingsUtil\n */\n\nconst MeetingsUtil = {};\n\nMeetingsUtil.extractDestination = (destination, type) => {\n let dest = destination;\n\n if (type === _LOCUS_ID_) {\n if (!(destination && destination.url)) {\n throw new ParameterError('You cannot create a meeting by locus without a locus.url defined');\n }\n dest = destination.url;\n }\n\n return dest;\n};\n\nMeetingsUtil.getMeetingAddedType = (type) => (type === _LOCUS_ID_ ? _INCOMING_ : _CREATED_);\n\nMeetingsUtil.handleRoapMercury = (envelope, meetingCollection) => {\n const {data} = envelope;\n const {eventType} = data;\n\n if (eventType === LOCUSEVENT.MESSAGE_ROAP) {\n const meeting = meetingCollection.getByKey(CORRELATION_ID, data.correlationId);\n\n if (meeting) {\n meeting.roap.roapEvent(data);\n }\n }\n};\n\nMeetingsUtil.checkForCorrelationId = (deviceUrl, locus) => {\n let devices = [];\n\n if (locus) {\n if (locus && locus.self && locus.self.devices) {\n devices = locus.self.devices;\n }\n\n const foundDevice = devices.find((device) => device.url === deviceUrl);\n\n if (foundDevice && foundDevice.correlationId) {\n return foundDevice.correlationId;\n }\n }\n\n return false;\n};\n\n\n/**\n * Will check to see if the H.264 media codec is supported.\n * @async\n * @private\n * @returns {Promise<boolean>}\n */\nMeetingsUtil.hasH264Codec = async () => {\n let hasCodec = false;\n\n try {\n const pc = new window.RTCPeerConnection();\n const offer = await pc.createOffer({offerToReceiveVideo: true});\n\n if (offer.sdp.match(/^a=rtpmap:\\d+\\s+H264\\/\\d+/m)) {\n hasCodec = true;\n }\n pc.close();\n }\n catch (error) {\n LoggerProxy.logger.error('Meetings:util#hasH264Codec --> Error creating peerConnection for H.264 test.');\n }\n\n return hasCodec;\n};\n\n\n/**\n * Notifies the user whether or not the H.264\n * codec is present. Will continuously check\n * until max duration.\n * @async\n * @private\n * @param {object} options\n * @param {Number} options.firstChecked Timestamp in milliseconds\n * @param {boolean} options.disableNotifications Default is false. Boolean to enable/disable notification and events\n * @returns {undefined}\n */\nMeetingsUtil.checkH264Support = async function checkH264Support(options) {\n const {hasH264Codec} = MeetingsUtil;\n const {firstChecked, disableNotifications} = options || {};\n const delay = 5e3; // ms\n const maxDuration = 3e5; // ms\n const shouldTrigger = (firstChecked === undefined);\n const shouldStopChecking = firstChecked && (Date.now() - firstChecked) >= maxDuration;\n\n // Disable notifications and start H.264 download only\n if (disableNotifications) {\n hasH264Codec();\n\n return;\n }\n\n // Codec loaded trigger event notification\n if (await hasH264Codec()) {\n Trigger.trigger(\n this,\n {\n file: 'meetings/util',\n function: 'checkH264Support'\n },\n EVENT_TRIGGERS.MEDIA_CODEC_LOADED\n );\n LoggerProxy.logger.log('Meetings:util#checkH264Support --> H264 codec loaded successfully.');\n\n return;\n }\n\n // Stop checking if past the timelimit\n if (shouldStopChecking) {\n LoggerProxy.logger.error('Meetings:util#checkH264Support --> Timed out waiting for H264 codec to load.');\n\n return;\n }\n\n // Trigger only once\n if (shouldTrigger) {\n Trigger.trigger(\n this,\n {\n file: 'meetings/util',\n function: 'checkH264Support'\n },\n EVENT_TRIGGERS.MEDIA_CODEC_MISSING\n );\n LoggerProxy.logger.log('Meetings:util#checkH264Support --> H264 codec is missing.');\n }\n\n // Keep checking in intervals to see if codec loaded\n window.setTimeout(() => {\n const timestamp = firstChecked || Date.now();\n\n MeetingsUtil.checkH264Support.call(this, {firstChecked: timestamp});\n }, delay);\n};\n\nexport default MeetingsUtil;\n"]}
1
+ {"version":3,"sources":["util.js"],"names":["MeetingsUtil","getMeetingAddedType","type","_LOCUS_ID_","_INCOMING_","_CREATED_","handleRoapMercury","envelope","meetingCollection","data","eventType","LOCUSEVENT","MESSAGE_ROAP","meeting","getByKey","CORRELATION_ID","correlationId","roap","roapEvent","checkForCorrelationId","deviceUrl","locus","devices","self","foundDevice","find","device","url","hasH264Codec","hasCodec","pc","window","RTCPeerConnection","createOffer","offerToReceiveVideo","offer","sdp","match","close","LoggerProxy","logger","error","checkH264Support","options","firstChecked","disableNotifications","delay","maxDuration","shouldTrigger","undefined","shouldStopChecking","Trigger","trigger","file","function","EVENT_TRIGGERS","MEDIA_CODEC_LOADED","log","MEDIA_CODEC_MISSING","setTimeout","timestamp","call"],"mappings":"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","sourcesContent":["/* globals window */\n\nimport {\n _LOCUS_ID_,\n _INCOMING_,\n _CREATED_,\n LOCUSEVENT,\n CORRELATION_ID,\n EVENT_TRIGGERS\n} from '../constants';\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport Trigger from '../common/events/trigger-proxy';\n\n/**\n * Meetings Media Codec Missing Event\n * Emitted when H.264 codec is not\n * found in the browser.\n * @event media:codec:missing\n * @instance\n * @memberof MeetingsUtil\n */\n\n/**\n * Meetings Media Codec Loaded Event\n * Emitted when H.264 codec has been\n * loaded in the browser.\n * @event media:codec:loaded\n * @instance\n * @memberof MeetingsUtil\n */\n\nconst MeetingsUtil = {};\n\nMeetingsUtil.getMeetingAddedType = (type) => (type === _LOCUS_ID_ ? _INCOMING_ : _CREATED_);\n\nMeetingsUtil.handleRoapMercury = (envelope, meetingCollection) => {\n const {data} = envelope;\n const {eventType} = data;\n\n if (eventType === LOCUSEVENT.MESSAGE_ROAP) {\n const meeting = meetingCollection.getByKey(CORRELATION_ID, data.correlationId);\n\n if (meeting) {\n meeting.roap.roapEvent(data);\n }\n }\n};\n\nMeetingsUtil.checkForCorrelationId = (deviceUrl, locus) => {\n let devices = [];\n\n if (locus) {\n if (locus && locus.self && locus.self.devices) {\n devices = locus.self.devices;\n }\n\n const foundDevice = devices.find((device) => device.url === deviceUrl);\n\n if (foundDevice && foundDevice.correlationId) {\n return foundDevice.correlationId;\n }\n }\n\n return false;\n};\n\n\n/**\n * Will check to see if the H.264 media codec is supported.\n * @async\n * @private\n * @returns {Promise<boolean>}\n */\nMeetingsUtil.hasH264Codec = async () => {\n let hasCodec = false;\n\n try {\n const pc = new window.RTCPeerConnection();\n const offer = await pc.createOffer({offerToReceiveVideo: true});\n\n if (offer.sdp.match(/^a=rtpmap:\\d+\\s+H264\\/\\d+/m)) {\n hasCodec = true;\n }\n pc.close();\n }\n catch (error) {\n LoggerProxy.logger.error('Meetings:util#hasH264Codec --> Error creating peerConnection for H.264 test.');\n }\n\n return hasCodec;\n};\n\n\n/**\n * Notifies the user whether or not the H.264\n * codec is present. Will continuously check\n * until max duration.\n * @async\n * @private\n * @param {object} options\n * @param {Number} options.firstChecked Timestamp in milliseconds\n * @param {boolean} options.disableNotifications Default is false. Boolean to enable/disable notification and events\n * @returns {undefined}\n */\nMeetingsUtil.checkH264Support = async function checkH264Support(options) {\n const {hasH264Codec} = MeetingsUtil;\n const {firstChecked, disableNotifications} = options || {};\n const delay = 5e3; // ms\n const maxDuration = 3e5; // ms\n const shouldTrigger = (firstChecked === undefined);\n const shouldStopChecking = firstChecked && (Date.now() - firstChecked) >= maxDuration;\n\n // Disable notifications and start H.264 download only\n if (disableNotifications) {\n hasH264Codec();\n\n return;\n }\n\n // Codec loaded trigger event notification\n if (await hasH264Codec()) {\n Trigger.trigger(\n this,\n {\n file: 'meetings/util',\n function: 'checkH264Support'\n },\n EVENT_TRIGGERS.MEDIA_CODEC_LOADED\n );\n LoggerProxy.logger.log('Meetings:util#checkH264Support --> H264 codec loaded successfully.');\n\n return;\n }\n\n // Stop checking if past the timelimit\n if (shouldStopChecking) {\n LoggerProxy.logger.error('Meetings:util#checkH264Support --> Timed out waiting for H264 codec to load.');\n\n return;\n }\n\n // Trigger only once\n if (shouldTrigger) {\n Trigger.trigger(\n this,\n {\n file: 'meetings/util',\n function: 'checkH264Support'\n },\n EVENT_TRIGGERS.MEDIA_CODEC_MISSING\n );\n LoggerProxy.logger.log('Meetings:util#checkH264Support --> H264 codec is missing.');\n }\n\n // Keep checking in intervals to see if codec loaded\n window.setTimeout(() => {\n const timestamp = firstChecked || Date.now();\n\n MeetingsUtil.checkH264Support.call(this, {firstChecked: timestamp});\n }, delay);\n};\n\nexport default MeetingsUtil;\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@webex/plugin-meetings",
3
- "version": "1.149.1",
3
+ "version": "1.149.2",
4
4
  "description": "",
5
5
  "license": "MIT",
6
6
  "contributors": [
@@ -24,17 +24,17 @@
24
24
  },
25
25
  "dependencies": {
26
26
  "@babel/runtime-corejs2": "^7.14.8",
27
- "@webex/webex-core": "1.149.1",
28
- "@webex/internal-plugin-mercury": "1.149.1",
27
+ "@webex/webex-core": "1.149.2",
28
+ "@webex/internal-plugin-mercury": "1.149.2",
29
29
  "webrtc-adapter": "^7.7.0",
30
30
  "lodash": "^4.17.21",
31
31
  "uuid": "^3.3.2",
32
32
  "global": "^4.4.0",
33
- "@webex/common": "1.149.1",
33
+ "@webex/common": "1.149.2",
34
34
  "bowser": "^2.11.0",
35
35
  "sdp-transform": "^2.12.0",
36
36
  "readable-stream": "^3.6.0",
37
- "@webex/common-timers": "1.149.1",
37
+ "@webex/common-timers": "1.149.2",
38
38
  "btoa": "^1.2.1",
39
39
  "javascript-state-machine": "^3.1.0",
40
40
  "envify": "^4.1.0"
@@ -1,9 +1,7 @@
1
1
  import uuid from 'uuid';
2
2
  import {debounce} from 'lodash';
3
3
  import {StatelessWebexPlugin} from '@webex/webex-core';
4
- import {
5
- deviceType
6
- } from '@webex/common';
4
+ import {deviceType} from '@webex/common';
7
5
 
8
6
  import LoggerProxy from '../common/logs/logger-proxy';
9
7
  import {
@@ -51,7 +49,19 @@ export default class MeetingRequest extends StatelessWebexPlugin {
51
49
  */
52
50
  async joinMeeting(options) {
53
51
  const {
54
- asResourceOccupant, sipUri, meetingNumber, deviceUrl, locusUrl, resourceId, correlationId, ensureConversation, moderator, pin, moveToResource, roapMessage, preferTranscoding
52
+ asResourceOccupant,
53
+ sipUri,
54
+ meetingNumber,
55
+ deviceUrl,
56
+ locusUrl,
57
+ resourceId,
58
+ correlationId,
59
+ ensureConversation,
60
+ moderator,
61
+ pin,
62
+ moveToResource,
63
+ roapMessage,
64
+ preferTranscoding
55
65
  } = options;
56
66
 
57
67
  LoggerProxy.logger.info(
@@ -95,29 +105,16 @@ export default class MeetingRequest extends StatelessWebexPlugin {
95
105
  if (locusUrl) {
96
106
  url = `${locusUrl}/${PARTICIPANT}`;
97
107
  }
98
- else if (meetingNumber) {
99
- try {
100
- await this.webex.internal.services.waitForCatalog('postauth');
101
- url = `${this.webex.internal.services.get('locus')}/${LOCI}/${CALL}`;
102
- body.invitee = {
103
- address: `wbxmn:${meetingNumber}`
104
- };
105
- }
106
- catch (e) {
107
- LoggerProxy.logger.error(`Meeting:request#joinMeeting webex meeting id--> ${e}`);
108
- throw (e);
109
- }
110
- }
111
- else if (sipUri) {
108
+ else if (sipUri || meetingNumber) {
112
109
  try {
113
110
  await this.webex.internal.services.waitForCatalog('postauth');
114
111
  url = `${this.webex.internal.services.get('locus')}/${LOCI}/${CALL}`;
115
112
  body.invitee = {
116
- address: sipUri
113
+ address: sipUri || `wbxmn:${meetingNumber}`
117
114
  };
118
115
  }
119
116
  catch (e) {
120
- LoggerProxy.logger.error(`Meeting:request#joinMeeting sipUrl --> ${e}`);
117
+ LoggerProxy.logger.error(`Meeting:request#joinMeeting ${sipUri ? 'sipUri' : 'meetingNumber'} --> ${e}`);
121
118
  throw (e);
122
119
  }
123
120
  }
@@ -154,7 +151,10 @@ export default class MeetingRequest extends StatelessWebexPlugin {
154
151
  * @private
155
152
  */
156
153
  dialIn({
157
- locusUrl, dialInUrl, clientUrl, correlationId
154
+ locusUrl,
155
+ dialInUrl,
156
+ clientUrl,
157
+ correlationId
158
158
  }) {
159
159
  LoggerProxy.logger.info(
160
160
  'Meeting:request#dialIn --> Provisioning a dial in device',
@@ -195,7 +195,11 @@ export default class MeetingRequest extends StatelessWebexPlugin {
195
195
  * @private
196
196
  */
197
197
  dialOut({
198
- locusUrl, dialOutUrl, phoneNumber, clientUrl, correlationId
198
+ locusUrl,
199
+ dialOutUrl,
200
+ phoneNumber,
201
+ clientUrl,
202
+ correlationId
199
203
  }) {
200
204
  LoggerProxy.logger.info(
201
205
  'Meeting:request#dialOut --> Provisioning a dial out device',
@@ -294,7 +298,10 @@ export default class MeetingRequest extends StatelessWebexPlugin {
294
298
  * @private
295
299
  */
296
300
  disconnectPhoneAudio({
297
- locusUrl, phoneUrl, correlationId, selfId
301
+ locusUrl,
302
+ phoneUrl,
303
+ correlationId,
304
+ selfId
298
305
  }) {
299
306
  LoggerProxy.logger.info(
300
307
  `Meeting:request#disconnectPhoneAudio --> request phone ${phoneUrl} to leave`,
@@ -334,7 +341,11 @@ export default class MeetingRequest extends StatelessWebexPlugin {
334
341
  * @returns {Promise}
335
342
  */
336
343
  leaveMeeting({
337
- locusUrl, selfId, deviceUrl: url, resourceId, correlationId
344
+ locusUrl,
345
+ selfId,
346
+ deviceUrl: url,
347
+ resourceId,
348
+ correlationId
338
349
  }) {
339
350
  LoggerProxy.logger.info(
340
351
  'Meeting:request#leaveMeeting --> Leaving a meeting',
@@ -559,7 +570,11 @@ export default class MeetingRequest extends StatelessWebexPlugin {
559
570
  * @returns {Promise}
560
571
  */
561
572
  changeVideoLayout({
562
- locusUrl, deviceUrl, layoutType, main, content
573
+ locusUrl,
574
+ deviceUrl,
575
+ layoutType,
576
+ main,
577
+ content
563
578
  }) {
564
579
  // send main/content renderInfo only if both width and height are specified
565
580
  if (main && (!main.width || !main.height)) {
@@ -108,7 +108,10 @@ export default class MeetingInfo {
108
108
  * @memberof MeetingInfo
109
109
  */
110
110
  fetchMeetingInfo(destination, type = null) {
111
- return this.fetchInfoOptions(destination, type).then((options) =>
111
+ return this.fetchInfoOptions(
112
+ MeetingInfoUtil.extractDestination(destination, type),
113
+ type
114
+ ).then((options) =>
112
115
  // fetch meeting info
113
116
  this.requestFetchInfo(options).catch((error) => {
114
117
  // if it failed the first time as meeting link
@@ -35,6 +35,19 @@ import {
35
35
 
36
36
  const MeetingInfoUtil = {};
37
37
 
38
+ MeetingInfoUtil.extractDestination = (destination, type) => {
39
+ let dest = destination;
40
+
41
+ if (type === _LOCUS_ID_) {
42
+ if (!(destination && destination.url)) {
43
+ throw new ParameterError('You cannot create a meeting by locus without a locus.url defined');
44
+ }
45
+ dest = destination.url;
46
+ }
47
+
48
+ return dest;
49
+ };
50
+
38
51
  MeetingInfoUtil.getParsedUrl = (link) => {
39
52
  try {
40
53
  let parsedUrl = url.parse(link);
@@ -724,7 +724,7 @@ export default class Meetings extends WebexPlugin {
724
724
  this.meetingCollection.set(meeting);
725
725
 
726
726
  try {
727
- const info = await this.meetingInfo.fetchMeetingInfo(MeetingsUtil.extractDestination(destination, type), type);
727
+ const info = await this.meetingInfo.fetchMeetingInfo(destination, type);
728
728
 
729
729
  meeting.parseMeetingInfo(info);
730
730
  meeting.meetingInfo = info ? info.body : null;
@@ -8,7 +8,6 @@ import {
8
8
  CORRELATION_ID,
9
9
  EVENT_TRIGGERS
10
10
  } from '../constants';
11
- import ParameterError from '../common/errors/parameter';
12
11
  import LoggerProxy from '../common/logs/logger-proxy';
13
12
  import Trigger from '../common/events/trigger-proxy';
14
13
 
@@ -32,19 +31,6 @@ import Trigger from '../common/events/trigger-proxy';
32
31
 
33
32
  const MeetingsUtil = {};
34
33
 
35
- MeetingsUtil.extractDestination = (destination, type) => {
36
- let dest = destination;
37
-
38
- if (type === _LOCUS_ID_) {
39
- if (!(destination && destination.url)) {
40
- throw new ParameterError('You cannot create a meeting by locus without a locus.url defined');
41
- }
42
- dest = destination.url;
43
- }
44
-
45
- return dest;
46
- };
47
-
48
34
  MeetingsUtil.getMeetingAddedType = (type) => (type === _LOCUS_ID_ ? _INCOMING_ : _CREATED_);
49
35
 
50
36
  MeetingsUtil.handleRoapMercury = (envelope, meetingCollection) => {
@@ -482,10 +482,7 @@ skipInNode(describe)('plugin-meetings', () => {
482
482
  .then((response) => {
483
483
  assert.equal(response[0].result.memberId, alice.meeting.selfId);
484
484
  }),
485
- testUtils.waitForEvents([{scope: bob.meeting.members, event: 'members:update'}])
486
- .then((response) => {
487
- console.log('SCREEN SHARE RESPONSE ', JSON.stringify(response));
488
- }),
485
+ testUtils.waitForEvents([{scope: bob.meeting.members, event: 'members:update'}]),
489
486
  testUtils.waitForEvents([{scope: alice.meeting, event: 'media:ready'}])
490
487
  .then((response) => {
491
488
  console.log('MEDIA:READY event ', response[0].result);
@@ -44,6 +44,15 @@ skipInNode(describe)('plugin-meetings', () => {
44
44
  console.log('CONVERSATION', conversation);
45
45
  space = conversation;
46
46
  })
47
+ .then(async () => {
48
+ const destinationWithType = await alice.webex.meetings.meetingInfo.fetchMeetingInfo(space.url, 'CONVERSATION_URL');
49
+ const destinationNoType = await alice.webex.meetings.meetingInfo.fetchMeetingInfo(space.url);
50
+
51
+ assert.exists(destinationNoType);
52
+ assert.exists(destinationWithType);
53
+ assert.exists(destinationNoType.body.meetingNumber);
54
+ assert.exists(destinationWithType.body.meetingNumber);
55
+ })
47
56
  .then(function aliceStartsMeeting() {
48
57
  return Promise.all([
49
58
  testUtils.delayedPromise(alice.webex.meetings.create(space.url)),
@@ -97,7 +106,7 @@ skipInNode(describe)('plugin-meetings', () => {
97
106
 
98
107
 
99
108
  it('alice adds x user as guest to space meeting', () => Promise.all([
100
- testUtils.delayedPromise(guest.webex.meetings.create(alice.meeting.meetingInfo.uri)),
109
+ testUtils.delayedPromise(guest.webex.meetings.create(alice.meeting.sipUri)),
101
110
  testUtils.waitForEvents([{scope: guest.webex.meetings, event: 'meeting:added', user: guest}])
102
111
  ]).then(() =>
103
112
  Promise.all([