@webex/plugin-meetings 3.0.0-beta.363 → 3.0.0-beta.365
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.
- package/dist/breakouts/breakout.js +1 -1
- package/dist/breakouts/index.js +1 -1
- package/dist/interpretation/index.js +1 -1
- package/dist/interpretation/siLanguage.js +1 -1
- package/dist/meeting/request.js +25 -18
- package/dist/meeting/request.js.map +1 -1
- package/dist/rtcMetrics/index.js +38 -1
- package/dist/rtcMetrics/index.js.map +1 -1
- package/dist/types/rtcMetrics/index.d.ts +7 -0
- package/dist/webinar/index.js +1 -1
- package/package.json +19 -19
- package/src/meeting/request.ts +7 -0
- package/src/rtcMetrics/index.ts +43 -1
- package/test/unit/spec/meeting/request.js +22 -12
- package/test/unit/spec/rtcMetrics/index.ts +32 -3
package/dist/breakouts/index.js
CHANGED
|
@@ -1041,7 +1041,7 @@ var Breakouts = _webexCore.WebexPlugin.extend({
|
|
|
1041
1041
|
this.trigger(_constants.BREAKOUTS.EVENTS.ASK_RETURN_TO_MAIN);
|
|
1042
1042
|
}
|
|
1043
1043
|
},
|
|
1044
|
-
version: "3.0.0-beta.
|
|
1044
|
+
version: "3.0.0-beta.365"
|
|
1045
1045
|
});
|
|
1046
1046
|
var _default = Breakouts;
|
|
1047
1047
|
exports.default = _default;
|
package/dist/meeting/request.js
CHANGED
|
@@ -167,6 +167,13 @@ var MeetingRequest = /*#__PURE__*/function (_StatelessWebexPlugin) {
|
|
|
167
167
|
if (liveAnnotationSupported) {
|
|
168
168
|
deviceCapabilities.push(_constants.ANNOTATION.ANNOTATION_ON_SHARE_SUPPORTED);
|
|
169
169
|
}
|
|
170
|
+
|
|
171
|
+
// append installationId to device config if it exists
|
|
172
|
+
// @ts-ignore
|
|
173
|
+
if (this.webex.internal.device.config.installationId) {
|
|
174
|
+
// @ts-ignore
|
|
175
|
+
body.device.installationId = this.webex.internal.device.config.installationId;
|
|
176
|
+
}
|
|
170
177
|
if (locale) {
|
|
171
178
|
body.locale = locale;
|
|
172
179
|
}
|
|
@@ -195,44 +202,44 @@ var MeetingRequest = /*#__PURE__*/function (_StatelessWebexPlugin) {
|
|
|
195
202
|
body.pin = pin;
|
|
196
203
|
}
|
|
197
204
|
if (!locusUrl) {
|
|
198
|
-
_context2.next =
|
|
205
|
+
_context2.next = 20;
|
|
199
206
|
break;
|
|
200
207
|
}
|
|
201
208
|
url = "".concat(locusUrl, "/").concat(_constants.PARTICIPANT);
|
|
202
|
-
_context2.next =
|
|
209
|
+
_context2.next = 37;
|
|
203
210
|
break;
|
|
204
|
-
case
|
|
211
|
+
case 20:
|
|
205
212
|
if (!(inviteeAddress || meetingNumber)) {
|
|
206
|
-
_context2.next =
|
|
213
|
+
_context2.next = 37;
|
|
207
214
|
break;
|
|
208
215
|
}
|
|
209
|
-
_context2.prev =
|
|
216
|
+
_context2.prev = 21;
|
|
210
217
|
if (!locusClusterUrl) {
|
|
211
|
-
_context2.next =
|
|
218
|
+
_context2.next = 26;
|
|
212
219
|
break;
|
|
213
220
|
}
|
|
214
221
|
clusterUrl = "https://".concat(locusClusterUrl, "/locus/api/v1");
|
|
215
|
-
_context2.next =
|
|
222
|
+
_context2.next = 29;
|
|
216
223
|
break;
|
|
217
|
-
case
|
|
218
|
-
_context2.next =
|
|
224
|
+
case 26:
|
|
225
|
+
_context2.next = 28;
|
|
219
226
|
return this.webex.internal.services.waitForCatalog('postauth');
|
|
220
|
-
case
|
|
227
|
+
case 28:
|
|
221
228
|
// @ts-ignore
|
|
222
229
|
clusterUrl = this.webex.internal.services.get('locus');
|
|
223
|
-
case
|
|
230
|
+
case 29:
|
|
224
231
|
url = "".concat(clusterUrl, "/").concat(_constants.LOCI, "/").concat(_constants.CALL);
|
|
225
232
|
body.invitee = {
|
|
226
233
|
address: inviteeAddress || "wbxmn:".concat(meetingNumber)
|
|
227
234
|
};
|
|
228
|
-
_context2.next =
|
|
235
|
+
_context2.next = 37;
|
|
229
236
|
break;
|
|
230
|
-
case
|
|
231
|
-
_context2.prev =
|
|
232
|
-
_context2.t0 = _context2["catch"](
|
|
237
|
+
case 33:
|
|
238
|
+
_context2.prev = 33;
|
|
239
|
+
_context2.t0 = _context2["catch"](21);
|
|
233
240
|
_loggerProxy.default.logger.error("Meeting:request#joinMeeting Error Joining ".concat(inviteeAddress || meetingNumber, " --> ").concat(_context2.t0));
|
|
234
241
|
throw _context2.t0;
|
|
235
|
-
case
|
|
242
|
+
case 37:
|
|
236
243
|
// TODO: -- this will be resolved in SDK request
|
|
237
244
|
url = url.concat("?".concat(_constants.ALTERNATE_REDIRECT_TRUE));
|
|
238
245
|
if (resourceId === inviteeAddress) {
|
|
@@ -250,11 +257,11 @@ var MeetingRequest = /*#__PURE__*/function (_StatelessWebexPlugin) {
|
|
|
250
257
|
uri: url,
|
|
251
258
|
body: body
|
|
252
259
|
}));
|
|
253
|
-
case
|
|
260
|
+
case 41:
|
|
254
261
|
case "end":
|
|
255
262
|
return _context2.stop();
|
|
256
263
|
}
|
|
257
|
-
}, _callee2, this, [[
|
|
264
|
+
}, _callee2, this, [[21, 33]]);
|
|
258
265
|
}));
|
|
259
266
|
function joinMeeting(_x) {
|
|
260
267
|
return _joinMeeting.apply(this, arguments);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["MeetingRequest","attrs","options","meeting","otherAttrs","webex","boundedStorage","get","REACHABILITY","namespace","localStorageJoinCookie","catch","joinCookieRaw","joinCookie","JSON","parse","LoggerProxy","logger","error","locusDeltaRequest","MeetingUtil","generateLocusDeltaRequest","buildLocusDeltaRequestOptions","generateBuildLocusDeltaRequestOptions","changeVideoLayoutDebounced","changeVideoLayout","leading","trailing","asResourceOccupant","inviteeAddress","meetingNumber","permissionToken","deviceUrl","locusUrl","locusClusterUrl","resourceId","correlationId","ensureConversation","moderator","pin","moveToResource","roapMessage","preferTranscoding","breakoutsSupported","locale","deviceCapabilities","liveAnnotationSupported","ipVersion","info","url","getJoinCookie","body","device","deviceType","config","meetings","usingResource","moveMediaToResource","respOnlySdp","allowMultiDevice","supportsNativeLobby","clientMediaPreferences","ipver","push","BREAKOUTS","BREAKOUTS_SUPPORTED","ANNOTATION","ANNOTATION_ON_SHARE_SUPPORTED","length","geoHintInfo","countryCode","regionCode","localIp","CallDiagnosticUtils","anonymizeIPAddress","clientAddress","undefined","PARTICIPANT","clusterUrl","internal","services","waitForCatalog","LOCI","CALL","invitee","address","concat","ALTERNATE_REDIRECT_TRUE","callPreferences","requestedMedia","_SLIDES_","localMedias","request","method","HTTP_VERBS","POST","uri","captchaRefreshUrl","captchaId","err","dialInUrl","clientUrl","PROVISIONAL","provisionalType","PROVISIONAL_TYPE_DIAL_IN","dialOutUrl","phoneNumber","PROVISIONAL_TYPE_DIAL_OUT","dialoutAddress","GET","reject","phoneUrl","selfId","LEAVE","PUT","prepareLeaveMeetingRequestOptions","ALERT","CONTROLS","lock","locked","PATCH","DECLINE","reason","floorReq","disposition","FLOOR_ACTION","GRANTED","beneficiary","personUrl","devices","requester","floor","resourceUrl","resourceToken","annotationInfo","annotation","tones","SEND_DTMF_ENDPOINT","dtmf","uuid","v4","layoutType","main","content","width","height","Error","renderInfoMain","renderInfoContent","layoutParams","renderInfo","layout","type","END","keepAliveUrl","reactionChannelUrl","reaction","participantId","sender","enable","requestingParticipantId","reactions","enabled","StatelessWebexPlugin"],"sources":["request.ts"],"sourcesContent":["import uuid from 'uuid';\nimport {debounce} from 'lodash';\n// @ts-ignore\nimport {StatelessWebexPlugin} from '@webex/webex-core';\n// @ts-ignore\nimport {deviceType} from '@webex/common';\nimport {CallDiagnosticUtils} from '@webex/internal-plugin-metrics';\n\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport {\n ALERT,\n ALTERNATE_REDIRECT_TRUE,\n BREAKOUTS,\n CALL,\n CONTROLS,\n DECLINE,\n END,\n FLOOR_ACTION,\n HTTP_VERBS,\n LEAVE,\n LOCI,\n PARTICIPANT,\n PROVISIONAL_TYPE_DIAL_IN,\n PROVISIONAL_TYPE_DIAL_OUT,\n REACHABILITY,\n SEND_DTMF_ENDPOINT,\n _SLIDES_,\n ANNOTATION,\n IP_VERSION,\n} from '../constants';\nimport {SendReactionOptions, ToggleReactionsOptions} from './request.type';\nimport MeetingUtil from './util';\nimport {AnnotationInfo} from '../annotation/annotation.types';\n\n/**\n * @class MeetingRequest\n */\nexport default class MeetingRequest extends StatelessWebexPlugin {\n changeVideoLayoutDebounced: any;\n meetingRef: WeakRef<any>;\n locusDeltaRequest: (options: object) => Promise<any>;\n buildLocusDeltaRequestOptions: (options: object) => Promise<any>;\n\n /**\n * Constructor\n * @param {Object} attrs\n * @param {Object} options\n */\n constructor(attrs: any, options: any) {\n const {meeting, ...otherAttrs} = attrs;\n\n super(otherAttrs, options);\n\n this.locusDeltaRequest = MeetingUtil.generateLocusDeltaRequest(meeting);\n this.buildLocusDeltaRequestOptions = MeetingUtil.generateBuildLocusDeltaRequestOptions(meeting);\n\n this.changeVideoLayoutDebounced = debounce(this.changeVideoLayout, 2000, {\n leading: true,\n trailing: true,\n });\n }\n\n /**\n * Returns joinCookie from boundedStorage if present.\n * @returns {Object} joinCookie\n */\n private getJoinCookie = async () => {\n // @ts-ignore\n const joinCookieRaw = await this.webex.boundedStorage\n .get(REACHABILITY.namespace, REACHABILITY.localStorageJoinCookie)\n .catch(() => {});\n\n if (joinCookieRaw) {\n try {\n const joinCookie = JSON.parse(joinCookieRaw);\n if (joinCookie) {\n return joinCookie;\n }\n } catch (e) {\n LoggerProxy.logger.error(\n `MeetingRequest#constructor --> Error in parsing join cookie data: ${e}`\n );\n }\n }\n\n return null;\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 * @param {boolean} options.breakoutsSupported\n * @param {String} options.locale,\n * @param {Array} options.deviceCapabilities\n * @param {boolean} options.liveAnnotationSupported\n * @returns {Promise}\n */\n async joinMeeting(options: {\n sipUri: string;\n deviceUrl: string;\n locusUrl: string;\n locusClusterUrl: string;\n resourceId: string;\n correlationId: string;\n ensureConversation: boolean;\n moderator: boolean;\n pin: boolean;\n moveToResource: boolean;\n roapMessage: any;\n asResourceOccupant: any;\n inviteeAddress: any;\n meetingNumber: any;\n permissionToken: any;\n preferTranscoding: any;\n breakoutsSupported: boolean;\n locale?: string;\n deviceCapabilities?: Array<string>;\n liveAnnotationSupported: boolean;\n ipVersion?: IP_VERSION;\n }) {\n const {\n asResourceOccupant,\n inviteeAddress,\n meetingNumber,\n permissionToken,\n deviceUrl,\n locusUrl,\n locusClusterUrl,\n resourceId,\n correlationId,\n ensureConversation,\n moderator,\n pin,\n moveToResource,\n roapMessage,\n preferTranscoding,\n breakoutsSupported,\n locale,\n deviceCapabilities = [],\n liveAnnotationSupported,\n ipVersion,\n } = options;\n\n LoggerProxy.logger.info('Meeting:request#joinMeeting --> Joining a meeting', correlationId);\n\n let url = '';\n\n const joinCookie = await this.getJoinCookie();\n\n const body: any = {\n asResourceOccupant,\n device: {\n url: deviceUrl,\n // @ts-ignore - config comes from registerPlugin\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 joinCookie,\n ipver: ipVersion,\n },\n };\n\n if (breakoutsSupported) {\n deviceCapabilities.push(BREAKOUTS.BREAKOUTS_SUPPORTED);\n }\n if (liveAnnotationSupported) {\n deviceCapabilities.push(ANNOTATION.ANNOTATION_ON_SHARE_SUPPORTED);\n }\n\n if (locale) {\n body.locale = locale;\n }\n\n // add deviceCapabilities prop\n if (deviceCapabilities.length) {\n body.deviceCapabilities = deviceCapabilities;\n }\n // @ts-ignore\n if (this.webex.meetings.geoHintInfo) {\n // @ts-ignore\n body.device.countryCode = this.webex.meetings.geoHintInfo.countryCode;\n // @ts-ignore\n body.device.regionCode = this.webex.meetings.geoHintInfo.regionCode;\n body.device.localIp =\n // @ts-ignore\n CallDiagnosticUtils.anonymizeIPAddress(this.webex.meetings.geoHintInfo.clientAddress) ||\n undefined;\n }\n\n if (moderator !== undefined) {\n body.moderator = moderator;\n }\n\n if (permissionToken) {\n body.permissionToken = permissionToken;\n }\n\n if (pin !== undefined) {\n body.pin = pin;\n }\n\n if (locusUrl) {\n url = `${locusUrl}/${PARTICIPANT}`;\n } else if (inviteeAddress || meetingNumber) {\n try {\n let clusterUrl;\n\n if (locusClusterUrl) {\n clusterUrl = `https://${locusClusterUrl}/locus/api/v1`;\n } else {\n // @ts-ignore\n await this.webex.internal.services.waitForCatalog('postauth');\n // @ts-ignore\n clusterUrl = this.webex.internal.services.get('locus');\n }\n\n url = `${clusterUrl}/${LOCI}/${CALL}`;\n body.invitee = {\n address: inviteeAddress || `wbxmn:${meetingNumber}`,\n };\n } catch (e) {\n LoggerProxy.logger.error(\n `Meeting:request#joinMeeting Error Joining ${inviteeAddress || meetingNumber} --> ${e}`\n );\n throw e;\n }\n }\n\n // TODO: -- this will be resolved in SDK request\n url = url.concat(`?${ALTERNATE_REDIRECT_TRUE}`);\n\n if (resourceId === inviteeAddress) {\n body.callPreferences = {\n requestedMedia: [_SLIDES_],\n };\n }\n\n if (roapMessage) {\n body.localMedias = roapMessage.localMedias;\n }\n\n /// @ts-ignore\n return this.request({\n method: HTTP_VERBS.POST,\n uri: url,\n body,\n });\n }\n\n /**\n * Send a request to refresh the captcha\n * @param {Object} options\n * @param {String} options.captchaRefreshUrl\n * @param {String} options.captchaId\n * @returns {Promise}\n * @private\n */\n private refreshCaptcha({\n captchaRefreshUrl,\n captchaId,\n }: {\n captchaRefreshUrl: string;\n captchaId: string;\n }) {\n const body = {\n captchaId,\n };\n\n // @ts-ignore\n return this.request({\n method: HTTP_VERBS.POST,\n uri: captchaRefreshUrl,\n body,\n }).catch((err) => {\n LoggerProxy.logger.error(`Meeting:request#refreshCaptcha --> Error: ${err}`);\n\n throw err;\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.locusUrl 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 private dialIn({\n locusUrl,\n dialInUrl,\n clientUrl,\n correlationId,\n }: {\n correlationId: string;\n locusUrl: string;\n dialInUrl: string;\n clientUrl: string;\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 // @ts-ignore\n return this.locusDeltaRequest({\n method: HTTP_VERBS.POST,\n uri,\n body,\n }).catch((err) => {\n LoggerProxy.logger.error(\n `Meeting:request#dialIn --> Error provisioning a dial in device, error ${err}`\n );\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.locusUrl 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 private dialOut({\n locusUrl,\n dialOutUrl,\n phoneNumber,\n clientUrl,\n correlationId,\n }: {\n correlationId: string;\n locusUrl: string;\n dialOutUrl: string;\n phoneNumber: string;\n clientUrl: string;\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 // @ts-ignore\n return this.locusDeltaRequest({\n method: HTTP_VERBS.POST,\n uri,\n body,\n }).catch((err) => {\n LoggerProxy.logger.error(\n `Meeting:request#dialOut --> Error provisioning a dial out device, error ${err}`\n );\n\n throw err;\n });\n }\n\n /**\n * Sends a requests to get the latest locus DTO, it might be a full Locus or a delta, depending on the url provided\n * @param {Object} options\n * @param {String} options.locusUrl sync url to get ht elatest locus delta\n * @returns {Promise}\n */\n getLocusDTO(options: {url: string}) {\n const {url} = options;\n\n if (url) {\n // @ts-ignore\n return this.request({\n method: HTTP_VERBS.GET,\n uri: url,\n }).catch((err) => {\n LoggerProxy.logger.error(\n `Meeting:request#getLocusDTO --> Error getting latest locus, error ${err}`\n );\n\n throw 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 private disconnectPhoneAudio({\n locusUrl,\n phoneUrl,\n correlationId,\n selfId,\n }: {\n locusUrl: string;\n phoneUrl: string;\n correlationId: string;\n selfId: string;\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 // @ts-ignore\n return this.locusDeltaRequest({\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 * Prepares request options to 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 {Object} request options\n */\n prepareLeaveMeetingRequestOptions({\n locusUrl,\n selfId,\n deviceUrl: url,\n resourceId,\n correlationId,\n }: {\n locusUrl: string;\n selfId: string;\n deviceUrl: string;\n resourceId: string;\n correlationId: string;\n }) {\n const uri = `${locusUrl}/${PARTICIPANT}/${selfId}/${LEAVE}`;\n const body = {\n device: {\n // @ts-ignore\n deviceType: this.config.meetings.deviceType,\n url,\n },\n usingResource: resourceId || null,\n correlationId,\n };\n\n return {\n method: HTTP_VERBS.PUT,\n uri,\n body,\n };\n }\n\n /**\n * Make a network request to leave a meeting\n * @param {Object} options\n * @returns {Promise}\n */\n leaveMeeting({\n locusUrl,\n selfId,\n deviceUrl: url,\n resourceId,\n correlationId,\n }: {\n locusUrl: string;\n selfId: string;\n deviceUrl: string;\n resourceId: string;\n correlationId: string;\n }) {\n LoggerProxy.logger.info('Meeting:request#leaveMeeting --> Leaving a meeting', correlationId);\n\n const uri = `${locusUrl}/${PARTICIPANT}/${selfId}/${LEAVE}`;\n const body = {\n device: {\n // @ts-ignore\n deviceType: this.config.meetings.deviceType,\n url,\n },\n usingResource: resourceId || null,\n correlationId,\n };\n\n return this.locusDeltaRequest({\n method: HTTP_VERBS.PUT,\n uri,\n body,\n });\n }\n\n /**\n * Builds request options to leave a meeting\n * @param {Object} options\n * @returns {Object} request options\n */\n buildLeaveMeetingRequestOptions(options: any) {\n return this.buildLocusDeltaRequestOptions(this.prepareLeaveMeetingRequestOptions(options));\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: {locusUrl: string; deviceUrl: string; correlationId: string}) {\n const uri = `${options.locusUrl}/${PARTICIPANT}/${ALERT}`;\n const body = {\n device: {\n // @ts-ignore\n deviceType: this.config.meetings.deviceType,\n url: options.deviceUrl,\n },\n correlationId: options.correlationId,\n };\n\n return this.locusDeltaRequest({\n method: HTTP_VERBS.PUT,\n uri,\n body,\n });\n }\n\n /**\n * Makes a network request to lock the meeting\n * @param {Object} options\n * @param {Boolean} options.lock Whether it is locked or not\n * @returns {Promise}\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.locusDeltaRequest({\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: {locusUrl: string; deviceUrl: string; reason: string}) {\n const uri = `${options.locusUrl}/${PARTICIPANT}/${DECLINE}`;\n const body = {\n device: {\n // @ts-ignore\n deviceType: this.config.meetings.deviceType,\n url: options.deviceUrl,\n },\n ...(options.reason && {reason: options.reason}),\n };\n\n return this.locusDeltaRequest({\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(\n options:\n | {\n disposition: string;\n personUrl: string;\n deviceUrl: string;\n resourceId: string;\n uri: string;\n annotationInfo: AnnotationInfo;\n }\n | any\n ) {\n let floorReq: any = {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 // @ts-ignore\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 const body: any = {\n floor: floorReq,\n resourceUrl: options.resourceUrl,\n };\n\n if (options?.resourceToken) {\n body.resourceToken = options?.resourceToken;\n }\n if (options?.annotationInfo) {\n body.annotation = options?.annotationInfo;\n }\n\n // @ts-ignore\n return this.request({\n uri: options.uri,\n method: HTTP_VERBS.PUT,\n body,\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}: {locusUrl: string; deviceUrl: string; tones: string}) {\n // @ts-ignore\n return this.locusDeltaRequest({\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 {@link #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 locusUrl: string;\n deviceUrl: string;\n layoutType: string;\n main: {\n width: number;\n height: number;\n };\n content: {\n width: number;\n height: number;\n };\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(\n new Error(\n `Both width and height must be specified. One of them is missing for main: ${JSON.stringify(\n main\n )}`\n )\n );\n }\n\n if (content && (!content.width || !content.height)) {\n return Promise.reject(\n new Error(\n `Both width and height must be specified. One of them is missing for content: ${JSON.stringify(\n content\n )}`\n )\n );\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 =\n renderInfoMain || renderInfoContent\n ? {\n renderInfo: {\n main: renderInfoMain,\n content: renderInfoContent,\n },\n }\n : undefined;\n\n // @ts-ignore\n return this.locusDeltaRequest({\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 /**\n * Make a network request to end meeting for all\n * @param {Object} options\n * @param {Url} options.locusUrl\n * @returns {Promise}\n */\n endMeetingForAll({locusUrl}: {locusUrl: string}) {\n const uri = `${locusUrl}/${END}`;\n\n // @ts-ignore\n return this.locusDeltaRequest({\n method: HTTP_VERBS.POST,\n uri,\n });\n }\n\n /**\n * Send a locus keepAlive (used in lobby)\n * @param {Object} options\n * @param {Url} options.keepAliveUrl\n * @returns {Promise}\n */\n keepAlive({keepAliveUrl}: {keepAliveUrl: string}) {\n // @ts-ignore\n return this.request({\n method: HTTP_VERBS.GET,\n uri: keepAliveUrl,\n });\n }\n\n /**\n * Make a network request to send a reaction.\n * @param {Object} options\n * @param {Url} options.reactionChannelUrl\n * @param {Reaction} options.reaction\n * @param {string} options.senderID\n * @returns {Promise}\n */\n sendReaction({reactionChannelUrl, reaction, participantId}: SendReactionOptions) {\n const uri = reactionChannelUrl;\n\n // @ts-ignore\n return this.request({\n method: HTTP_VERBS.POST,\n uri,\n body: {\n sender: {participantId},\n reaction,\n },\n });\n }\n\n /**\n * Make a network request to enable or disable reactions.\n * @param {boolean} options.enable - determines if we need to enable or disable.\n * @param {locusUrl} options.locusUrl\n * @returns {Promise}\n */\n toggleReactions({enable, locusUrl, requestingParticipantId}: ToggleReactionsOptions) {\n const uri = `${locusUrl}/${CONTROLS}`;\n\n // @ts-ignore\n return this.locusDeltaRequest({\n method: HTTP_VERBS.PUT,\n uri,\n body: {\n reactions: {\n enabled: enable,\n },\n requestingParticipantId,\n },\n });\n }\n\n getLocusStatusByUrl(locusUrl: string) {\n // @ts-ignore\n return this.request({\n method: HTTP_VERBS.GET,\n uri: locusUrl,\n });\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"names":["MeetingRequest","attrs","options","meeting","otherAttrs","webex","boundedStorage","get","REACHABILITY","namespace","localStorageJoinCookie","catch","joinCookieRaw","joinCookie","JSON","parse","LoggerProxy","logger","error","locusDeltaRequest","MeetingUtil","generateLocusDeltaRequest","buildLocusDeltaRequestOptions","generateBuildLocusDeltaRequestOptions","changeVideoLayoutDebounced","changeVideoLayout","leading","trailing","asResourceOccupant","inviteeAddress","meetingNumber","permissionToken","deviceUrl","locusUrl","locusClusterUrl","resourceId","correlationId","ensureConversation","moderator","pin","moveToResource","roapMessage","preferTranscoding","breakoutsSupported","locale","deviceCapabilities","liveAnnotationSupported","ipVersion","info","url","getJoinCookie","body","device","deviceType","config","meetings","usingResource","moveMediaToResource","respOnlySdp","allowMultiDevice","supportsNativeLobby","clientMediaPreferences","ipver","push","BREAKOUTS","BREAKOUTS_SUPPORTED","ANNOTATION","ANNOTATION_ON_SHARE_SUPPORTED","internal","installationId","length","geoHintInfo","countryCode","regionCode","localIp","CallDiagnosticUtils","anonymizeIPAddress","clientAddress","undefined","PARTICIPANT","clusterUrl","services","waitForCatalog","LOCI","CALL","invitee","address","concat","ALTERNATE_REDIRECT_TRUE","callPreferences","requestedMedia","_SLIDES_","localMedias","request","method","HTTP_VERBS","POST","uri","captchaRefreshUrl","captchaId","err","dialInUrl","clientUrl","PROVISIONAL","provisionalType","PROVISIONAL_TYPE_DIAL_IN","dialOutUrl","phoneNumber","PROVISIONAL_TYPE_DIAL_OUT","dialoutAddress","GET","reject","phoneUrl","selfId","LEAVE","PUT","prepareLeaveMeetingRequestOptions","ALERT","CONTROLS","lock","locked","PATCH","DECLINE","reason","floorReq","disposition","FLOOR_ACTION","GRANTED","beneficiary","personUrl","devices","requester","floor","resourceUrl","resourceToken","annotationInfo","annotation","tones","SEND_DTMF_ENDPOINT","dtmf","uuid","v4","layoutType","main","content","width","height","Error","renderInfoMain","renderInfoContent","layoutParams","renderInfo","layout","type","END","keepAliveUrl","reactionChannelUrl","reaction","participantId","sender","enable","requestingParticipantId","reactions","enabled","StatelessWebexPlugin"],"sources":["request.ts"],"sourcesContent":["import uuid from 'uuid';\nimport {debounce} from 'lodash';\n// @ts-ignore\nimport {StatelessWebexPlugin} from '@webex/webex-core';\n// @ts-ignore\nimport {deviceType} from '@webex/common';\nimport {CallDiagnosticUtils} from '@webex/internal-plugin-metrics';\n\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport {\n ALERT,\n ALTERNATE_REDIRECT_TRUE,\n BREAKOUTS,\n CALL,\n CONTROLS,\n DECLINE,\n END,\n FLOOR_ACTION,\n HTTP_VERBS,\n LEAVE,\n LOCI,\n PARTICIPANT,\n PROVISIONAL_TYPE_DIAL_IN,\n PROVISIONAL_TYPE_DIAL_OUT,\n REACHABILITY,\n SEND_DTMF_ENDPOINT,\n _SLIDES_,\n ANNOTATION,\n IP_VERSION,\n} from '../constants';\nimport {SendReactionOptions, ToggleReactionsOptions} from './request.type';\nimport MeetingUtil from './util';\nimport {AnnotationInfo} from '../annotation/annotation.types';\n\n/**\n * @class MeetingRequest\n */\nexport default class MeetingRequest extends StatelessWebexPlugin {\n changeVideoLayoutDebounced: any;\n meetingRef: WeakRef<any>;\n locusDeltaRequest: (options: object) => Promise<any>;\n buildLocusDeltaRequestOptions: (options: object) => Promise<any>;\n\n /**\n * Constructor\n * @param {Object} attrs\n * @param {Object} options\n */\n constructor(attrs: any, options: any) {\n const {meeting, ...otherAttrs} = attrs;\n\n super(otherAttrs, options);\n\n this.locusDeltaRequest = MeetingUtil.generateLocusDeltaRequest(meeting);\n this.buildLocusDeltaRequestOptions = MeetingUtil.generateBuildLocusDeltaRequestOptions(meeting);\n\n this.changeVideoLayoutDebounced = debounce(this.changeVideoLayout, 2000, {\n leading: true,\n trailing: true,\n });\n }\n\n /**\n * Returns joinCookie from boundedStorage if present.\n * @returns {Object} joinCookie\n */\n private getJoinCookie = async () => {\n // @ts-ignore\n const joinCookieRaw = await this.webex.boundedStorage\n .get(REACHABILITY.namespace, REACHABILITY.localStorageJoinCookie)\n .catch(() => {});\n\n if (joinCookieRaw) {\n try {\n const joinCookie = JSON.parse(joinCookieRaw);\n if (joinCookie) {\n return joinCookie;\n }\n } catch (e) {\n LoggerProxy.logger.error(\n `MeetingRequest#constructor --> Error in parsing join cookie data: ${e}`\n );\n }\n }\n\n return null;\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 * @param {boolean} options.breakoutsSupported\n * @param {String} options.locale,\n * @param {Array} options.deviceCapabilities\n * @param {boolean} options.liveAnnotationSupported\n * @returns {Promise}\n */\n async joinMeeting(options: {\n sipUri: string;\n deviceUrl: string;\n locusUrl: string;\n locusClusterUrl: string;\n resourceId: string;\n correlationId: string;\n ensureConversation: boolean;\n moderator: boolean;\n pin: boolean;\n moveToResource: boolean;\n roapMessage: any;\n asResourceOccupant: any;\n inviteeAddress: any;\n meetingNumber: any;\n permissionToken: any;\n preferTranscoding: any;\n breakoutsSupported: boolean;\n locale?: string;\n deviceCapabilities?: Array<string>;\n liveAnnotationSupported: boolean;\n ipVersion?: IP_VERSION;\n }) {\n const {\n asResourceOccupant,\n inviteeAddress,\n meetingNumber,\n permissionToken,\n deviceUrl,\n locusUrl,\n locusClusterUrl,\n resourceId,\n correlationId,\n ensureConversation,\n moderator,\n pin,\n moveToResource,\n roapMessage,\n preferTranscoding,\n breakoutsSupported,\n locale,\n deviceCapabilities = [],\n liveAnnotationSupported,\n ipVersion,\n } = options;\n\n LoggerProxy.logger.info('Meeting:request#joinMeeting --> Joining a meeting', correlationId);\n\n let url = '';\n\n const joinCookie = await this.getJoinCookie();\n\n const body: any = {\n asResourceOccupant,\n device: {\n url: deviceUrl,\n // @ts-ignore - config comes from registerPlugin\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 joinCookie,\n ipver: ipVersion,\n },\n };\n\n if (breakoutsSupported) {\n deviceCapabilities.push(BREAKOUTS.BREAKOUTS_SUPPORTED);\n }\n if (liveAnnotationSupported) {\n deviceCapabilities.push(ANNOTATION.ANNOTATION_ON_SHARE_SUPPORTED);\n }\n\n // append installationId to device config if it exists\n // @ts-ignore\n if (this.webex.internal.device.config.installationId) {\n // @ts-ignore\n body.device.installationId = this.webex.internal.device.config.installationId;\n }\n\n if (locale) {\n body.locale = locale;\n }\n\n // add deviceCapabilities prop\n if (deviceCapabilities.length) {\n body.deviceCapabilities = deviceCapabilities;\n }\n // @ts-ignore\n if (this.webex.meetings.geoHintInfo) {\n // @ts-ignore\n body.device.countryCode = this.webex.meetings.geoHintInfo.countryCode;\n // @ts-ignore\n body.device.regionCode = this.webex.meetings.geoHintInfo.regionCode;\n body.device.localIp =\n // @ts-ignore\n CallDiagnosticUtils.anonymizeIPAddress(this.webex.meetings.geoHintInfo.clientAddress) ||\n undefined;\n }\n\n if (moderator !== undefined) {\n body.moderator = moderator;\n }\n\n if (permissionToken) {\n body.permissionToken = permissionToken;\n }\n\n if (pin !== undefined) {\n body.pin = pin;\n }\n\n if (locusUrl) {\n url = `${locusUrl}/${PARTICIPANT}`;\n } else if (inviteeAddress || meetingNumber) {\n try {\n let clusterUrl;\n\n if (locusClusterUrl) {\n clusterUrl = `https://${locusClusterUrl}/locus/api/v1`;\n } else {\n // @ts-ignore\n await this.webex.internal.services.waitForCatalog('postauth');\n // @ts-ignore\n clusterUrl = this.webex.internal.services.get('locus');\n }\n\n url = `${clusterUrl}/${LOCI}/${CALL}`;\n body.invitee = {\n address: inviteeAddress || `wbxmn:${meetingNumber}`,\n };\n } catch (e) {\n LoggerProxy.logger.error(\n `Meeting:request#joinMeeting Error Joining ${inviteeAddress || meetingNumber} --> ${e}`\n );\n throw e;\n }\n }\n\n // TODO: -- this will be resolved in SDK request\n url = url.concat(`?${ALTERNATE_REDIRECT_TRUE}`);\n\n if (resourceId === inviteeAddress) {\n body.callPreferences = {\n requestedMedia: [_SLIDES_],\n };\n }\n\n if (roapMessage) {\n body.localMedias = roapMessage.localMedias;\n }\n\n /// @ts-ignore\n return this.request({\n method: HTTP_VERBS.POST,\n uri: url,\n body,\n });\n }\n\n /**\n * Send a request to refresh the captcha\n * @param {Object} options\n * @param {String} options.captchaRefreshUrl\n * @param {String} options.captchaId\n * @returns {Promise}\n * @private\n */\n private refreshCaptcha({\n captchaRefreshUrl,\n captchaId,\n }: {\n captchaRefreshUrl: string;\n captchaId: string;\n }) {\n const body = {\n captchaId,\n };\n\n // @ts-ignore\n return this.request({\n method: HTTP_VERBS.POST,\n uri: captchaRefreshUrl,\n body,\n }).catch((err) => {\n LoggerProxy.logger.error(`Meeting:request#refreshCaptcha --> Error: ${err}`);\n\n throw err;\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.locusUrl 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 private dialIn({\n locusUrl,\n dialInUrl,\n clientUrl,\n correlationId,\n }: {\n correlationId: string;\n locusUrl: string;\n dialInUrl: string;\n clientUrl: string;\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 // @ts-ignore\n return this.locusDeltaRequest({\n method: HTTP_VERBS.POST,\n uri,\n body,\n }).catch((err) => {\n LoggerProxy.logger.error(\n `Meeting:request#dialIn --> Error provisioning a dial in device, error ${err}`\n );\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.locusUrl 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 private dialOut({\n locusUrl,\n dialOutUrl,\n phoneNumber,\n clientUrl,\n correlationId,\n }: {\n correlationId: string;\n locusUrl: string;\n dialOutUrl: string;\n phoneNumber: string;\n clientUrl: string;\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 // @ts-ignore\n return this.locusDeltaRequest({\n method: HTTP_VERBS.POST,\n uri,\n body,\n }).catch((err) => {\n LoggerProxy.logger.error(\n `Meeting:request#dialOut --> Error provisioning a dial out device, error ${err}`\n );\n\n throw err;\n });\n }\n\n /**\n * Sends a requests to get the latest locus DTO, it might be a full Locus or a delta, depending on the url provided\n * @param {Object} options\n * @param {String} options.locusUrl sync url to get ht elatest locus delta\n * @returns {Promise}\n */\n getLocusDTO(options: {url: string}) {\n const {url} = options;\n\n if (url) {\n // @ts-ignore\n return this.request({\n method: HTTP_VERBS.GET,\n uri: url,\n }).catch((err) => {\n LoggerProxy.logger.error(\n `Meeting:request#getLocusDTO --> Error getting latest locus, error ${err}`\n );\n\n throw 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 private disconnectPhoneAudio({\n locusUrl,\n phoneUrl,\n correlationId,\n selfId,\n }: {\n locusUrl: string;\n phoneUrl: string;\n correlationId: string;\n selfId: string;\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 // @ts-ignore\n return this.locusDeltaRequest({\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 * Prepares request options to 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 {Object} request options\n */\n prepareLeaveMeetingRequestOptions({\n locusUrl,\n selfId,\n deviceUrl: url,\n resourceId,\n correlationId,\n }: {\n locusUrl: string;\n selfId: string;\n deviceUrl: string;\n resourceId: string;\n correlationId: string;\n }) {\n const uri = `${locusUrl}/${PARTICIPANT}/${selfId}/${LEAVE}`;\n const body = {\n device: {\n // @ts-ignore\n deviceType: this.config.meetings.deviceType,\n url,\n },\n usingResource: resourceId || null,\n correlationId,\n };\n\n return {\n method: HTTP_VERBS.PUT,\n uri,\n body,\n };\n }\n\n /**\n * Make a network request to leave a meeting\n * @param {Object} options\n * @returns {Promise}\n */\n leaveMeeting({\n locusUrl,\n selfId,\n deviceUrl: url,\n resourceId,\n correlationId,\n }: {\n locusUrl: string;\n selfId: string;\n deviceUrl: string;\n resourceId: string;\n correlationId: string;\n }) {\n LoggerProxy.logger.info('Meeting:request#leaveMeeting --> Leaving a meeting', correlationId);\n\n const uri = `${locusUrl}/${PARTICIPANT}/${selfId}/${LEAVE}`;\n const body = {\n device: {\n // @ts-ignore\n deviceType: this.config.meetings.deviceType,\n url,\n },\n usingResource: resourceId || null,\n correlationId,\n };\n\n return this.locusDeltaRequest({\n method: HTTP_VERBS.PUT,\n uri,\n body,\n });\n }\n\n /**\n * Builds request options to leave a meeting\n * @param {Object} options\n * @returns {Object} request options\n */\n buildLeaveMeetingRequestOptions(options: any) {\n return this.buildLocusDeltaRequestOptions(this.prepareLeaveMeetingRequestOptions(options));\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: {locusUrl: string; deviceUrl: string; correlationId: string}) {\n const uri = `${options.locusUrl}/${PARTICIPANT}/${ALERT}`;\n const body = {\n device: {\n // @ts-ignore\n deviceType: this.config.meetings.deviceType,\n url: options.deviceUrl,\n },\n correlationId: options.correlationId,\n };\n\n return this.locusDeltaRequest({\n method: HTTP_VERBS.PUT,\n uri,\n body,\n });\n }\n\n /**\n * Makes a network request to lock the meeting\n * @param {Object} options\n * @param {Boolean} options.lock Whether it is locked or not\n * @returns {Promise}\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.locusDeltaRequest({\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: {locusUrl: string; deviceUrl: string; reason: string}) {\n const uri = `${options.locusUrl}/${PARTICIPANT}/${DECLINE}`;\n const body = {\n device: {\n // @ts-ignore\n deviceType: this.config.meetings.deviceType,\n url: options.deviceUrl,\n },\n ...(options.reason && {reason: options.reason}),\n };\n\n return this.locusDeltaRequest({\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(\n options:\n | {\n disposition: string;\n personUrl: string;\n deviceUrl: string;\n resourceId: string;\n uri: string;\n annotationInfo: AnnotationInfo;\n }\n | any\n ) {\n let floorReq: any = {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 // @ts-ignore\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 const body: any = {\n floor: floorReq,\n resourceUrl: options.resourceUrl,\n };\n\n if (options?.resourceToken) {\n body.resourceToken = options?.resourceToken;\n }\n if (options?.annotationInfo) {\n body.annotation = options?.annotationInfo;\n }\n\n // @ts-ignore\n return this.request({\n uri: options.uri,\n method: HTTP_VERBS.PUT,\n body,\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}: {locusUrl: string; deviceUrl: string; tones: string}) {\n // @ts-ignore\n return this.locusDeltaRequest({\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 {@link #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 locusUrl: string;\n deviceUrl: string;\n layoutType: string;\n main: {\n width: number;\n height: number;\n };\n content: {\n width: number;\n height: number;\n };\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(\n new Error(\n `Both width and height must be specified. One of them is missing for main: ${JSON.stringify(\n main\n )}`\n )\n );\n }\n\n if (content && (!content.width || !content.height)) {\n return Promise.reject(\n new Error(\n `Both width and height must be specified. One of them is missing for content: ${JSON.stringify(\n content\n )}`\n )\n );\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 =\n renderInfoMain || renderInfoContent\n ? {\n renderInfo: {\n main: renderInfoMain,\n content: renderInfoContent,\n },\n }\n : undefined;\n\n // @ts-ignore\n return this.locusDeltaRequest({\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 /**\n * Make a network request to end meeting for all\n * @param {Object} options\n * @param {Url} options.locusUrl\n * @returns {Promise}\n */\n endMeetingForAll({locusUrl}: {locusUrl: string}) {\n const uri = `${locusUrl}/${END}`;\n\n // @ts-ignore\n return this.locusDeltaRequest({\n method: HTTP_VERBS.POST,\n uri,\n });\n }\n\n /**\n * Send a locus keepAlive (used in lobby)\n * @param {Object} options\n * @param {Url} options.keepAliveUrl\n * @returns {Promise}\n */\n keepAlive({keepAliveUrl}: {keepAliveUrl: string}) {\n // @ts-ignore\n return this.request({\n method: HTTP_VERBS.GET,\n uri: keepAliveUrl,\n });\n }\n\n /**\n * Make a network request to send a reaction.\n * @param {Object} options\n * @param {Url} options.reactionChannelUrl\n * @param {Reaction} options.reaction\n * @param {string} options.senderID\n * @returns {Promise}\n */\n sendReaction({reactionChannelUrl, reaction, participantId}: SendReactionOptions) {\n const uri = reactionChannelUrl;\n\n // @ts-ignore\n return this.request({\n method: HTTP_VERBS.POST,\n uri,\n body: {\n sender: {participantId},\n reaction,\n },\n });\n }\n\n /**\n * Make a network request to enable or disable reactions.\n * @param {boolean} options.enable - determines if we need to enable or disable.\n * @param {locusUrl} options.locusUrl\n * @returns {Promise}\n */\n toggleReactions({enable, locusUrl, requestingParticipantId}: ToggleReactionsOptions) {\n const uri = `${locusUrl}/${CONTROLS}`;\n\n // @ts-ignore\n return this.locusDeltaRequest({\n method: HTTP_VERBS.PUT,\n uri,\n body: {\n reactions: {\n enabled: enable,\n },\n requestingParticipantId,\n },\n });\n }\n\n getLocusStatusByUrl(locusUrl: string) {\n // @ts-ignore\n return this.request({\n method: HTTP_VERBS.GET,\n uri: locusUrl,\n });\n }\n}\n"],"mappings":"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"}
|
package/dist/rtcMetrics/index.js
CHANGED
|
@@ -11,8 +11,21 @@ var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs2/he
|
|
|
11
11
|
var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/createClass"));
|
|
12
12
|
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/defineProperty"));
|
|
13
13
|
var _internalPluginMetrics = require("@webex/internal-plugin-metrics");
|
|
14
|
+
var _uuid = _interopRequireDefault(require("uuid"));
|
|
14
15
|
var _constants = _interopRequireDefault(require("./constants"));
|
|
15
16
|
/* eslint-disable class-methods-use-this */
|
|
17
|
+
|
|
18
|
+
var parseJsonPayload = function parseJsonPayload(payload) {
|
|
19
|
+
try {
|
|
20
|
+
if (payload && payload[0]) {
|
|
21
|
+
return JSON.parse(payload[0]);
|
|
22
|
+
}
|
|
23
|
+
return null;
|
|
24
|
+
} catch (_) {
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
|
|
16
29
|
/**
|
|
17
30
|
* Rtc Metrics
|
|
18
31
|
*/
|
|
@@ -35,11 +48,13 @@ var RtcMetrics = /*#__PURE__*/function () {
|
|
|
35
48
|
(0, _defineProperty2.default)(this, "webex", void 0);
|
|
36
49
|
(0, _defineProperty2.default)(this, "meetingId", void 0);
|
|
37
50
|
(0, _defineProperty2.default)(this, "correlationId", void 0);
|
|
51
|
+
(0, _defineProperty2.default)(this, "connectionId", void 0);
|
|
38
52
|
// `window` is used to prevent typescript from returning a NodeJS.Timer.
|
|
39
53
|
this.intervalId = window.setInterval(this.sendMetricsInQueue.bind(this), 30 * 1000);
|
|
40
54
|
this.meetingId = meetingId;
|
|
41
55
|
this.webex = webex;
|
|
42
56
|
this.correlationId = correlationId;
|
|
57
|
+
this.setNewConnectionId();
|
|
43
58
|
// Send the first set of metrics at 5 seconds in the case of a user leaving the call shortly after joining.
|
|
44
59
|
setTimeout(this.sendMetricsInQueue.bind(this), 5 * 1000);
|
|
45
60
|
}
|
|
@@ -73,6 +88,16 @@ var RtcMetrics = /*#__PURE__*/function () {
|
|
|
73
88
|
data.payload = data.payload.map(this.anonymizeIp);
|
|
74
89
|
}
|
|
75
90
|
this.metricsQueue.push(data);
|
|
91
|
+
try {
|
|
92
|
+
// If a connection fails, send the rest of the metrics in queue and get a new connection id.
|
|
93
|
+
var parsedPayload = parseJsonPayload(data.payload);
|
|
94
|
+
if (data.name === 'onconnectionstatechange' && parsedPayload && parsedPayload.value === 'failed') {
|
|
95
|
+
this.sendMetricsInQueue();
|
|
96
|
+
this.setNewConnectionId();
|
|
97
|
+
}
|
|
98
|
+
} catch (e) {
|
|
99
|
+
console.error(e);
|
|
100
|
+
}
|
|
76
101
|
}
|
|
77
102
|
}
|
|
78
103
|
|
|
@@ -107,6 +132,17 @@ var RtcMetrics = /*#__PURE__*/function () {
|
|
|
107
132
|
return (0, _stringify.default)(data);
|
|
108
133
|
}
|
|
109
134
|
|
|
135
|
+
/**
|
|
136
|
+
* Set a new connection id.
|
|
137
|
+
*
|
|
138
|
+
* @returns {void}
|
|
139
|
+
*/
|
|
140
|
+
}, {
|
|
141
|
+
key: "setNewConnectionId",
|
|
142
|
+
value: function setNewConnectionId() {
|
|
143
|
+
this.connectionId = _uuid.default.v4();
|
|
144
|
+
}
|
|
145
|
+
|
|
110
146
|
/**
|
|
111
147
|
* Send metrics to the metrics service.
|
|
112
148
|
*
|
|
@@ -126,10 +162,11 @@ var RtcMetrics = /*#__PURE__*/function () {
|
|
|
126
162
|
body: {
|
|
127
163
|
metrics: [{
|
|
128
164
|
type: 'webrtc',
|
|
129
|
-
version: '1.0
|
|
165
|
+
version: '1.1.0',
|
|
130
166
|
userId: this.webex.internal.device.userId,
|
|
131
167
|
meetingId: this.meetingId,
|
|
132
168
|
correlationId: this.correlationId,
|
|
169
|
+
connectionId: this.connectionId,
|
|
133
170
|
data: this.metricsQueue
|
|
134
171
|
}]
|
|
135
172
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["RtcMetrics","webex","meetingId","correlationId","intervalId","window","setInterval","sendMetricsInQueue","bind","setTimeout","metricsQueue","length","sendMetrics","data","
|
|
1
|
+
{"version":3,"names":["parseJsonPayload","payload","JSON","parse","_","RtcMetrics","webex","meetingId","correlationId","intervalId","window","setInterval","sendMetricsInQueue","bind","setNewConnectionId","setTimeout","metricsQueue","length","sendMetrics","data","name","map","anonymizeIp","push","parsedPayload","value","e","console","error","clearInterval","stats","type","ip","CallDiagnosticUtils","anonymizeIPAddress","undefined","address","relatedAddress","connectionId","uuid","v4","request","method","service","resource","headers","appId","RTC_METRICS","APP_ID","body","metrics","version","userId","internal","device"],"sources":["index.ts"],"sourcesContent":["/* eslint-disable class-methods-use-this */\nimport {CallDiagnosticUtils} from '@webex/internal-plugin-metrics';\nimport uuid from 'uuid';\nimport RTC_METRICS from './constants';\n\nconst parseJsonPayload = (payload: any[]): any | null => {\n try {\n if (payload && payload[0]) {\n return JSON.parse(payload[0]);\n }\n\n return null;\n } catch (_) {\n return null;\n }\n};\n\n/**\n * Rtc Metrics\n */\nexport default class RtcMetrics {\n /**\n * Array of MetricData items to be sent to the metrics service.\n */\n metricsQueue = [];\n\n intervalId: number;\n\n webex: any;\n\n meetingId: string;\n\n correlationId: string;\n\n connectionId: string;\n\n /**\n * Initialize the interval.\n *\n * @param {object} webex - The main `webex` object.\n * @param {string} meetingId - The meeting id.\n * @param {string} correlationId - The correlation id.\n */\n constructor(webex, meetingId, correlationId) {\n // `window` is used to prevent typescript from returning a NodeJS.Timer.\n this.intervalId = window.setInterval(this.sendMetricsInQueue.bind(this), 30 * 1000);\n this.meetingId = meetingId;\n this.webex = webex;\n this.correlationId = correlationId;\n this.setNewConnectionId();\n // Send the first set of metrics at 5 seconds in the case of a user leaving the call shortly after joining.\n setTimeout(this.sendMetricsInQueue.bind(this), 5 * 1000);\n }\n\n /**\n * Check to see if the metrics queue has any items.\n *\n * @returns {void}\n */\n public sendMetricsInQueue() {\n if (this.metricsQueue.length) {\n this.sendMetrics();\n this.metricsQueue = [];\n }\n }\n\n /**\n * Add metrics items to the metrics queue.\n *\n * @param {object} data - An object with a payload array of metrics items.\n *\n * @returns {void}\n */\n addMetrics(data) {\n if (data.payload.length) {\n if (data.name === 'stats-report') {\n data.payload = data.payload.map(this.anonymizeIp);\n }\n\n this.metricsQueue.push(data);\n\n try {\n // If a connection fails, send the rest of the metrics in queue and get a new connection id.\n const parsedPayload = parseJsonPayload(data.payload);\n if (\n data.name === 'onconnectionstatechange' &&\n parsedPayload &&\n parsedPayload.value === 'failed'\n ) {\n this.sendMetricsInQueue();\n this.setNewConnectionId();\n }\n } catch (e) {\n console.error(e);\n }\n }\n }\n\n /**\n * Clear the metrics interval.\n *\n * @returns {void}\n */\n closeMetrics() {\n this.sendMetricsInQueue();\n clearInterval(this.intervalId);\n }\n\n /**\n * Anonymize IP addresses.\n *\n * @param {array} stats - An RTCStatsReport organized into an array of strings.\n * @returns {string}\n */\n anonymizeIp(stats: string): string {\n const data = JSON.parse(stats);\n // on local and remote candidates, anonymize the last 4 bits.\n if (data.type === 'local-candidate' || data.type === 'remote-candidate') {\n data.ip = CallDiagnosticUtils.anonymizeIPAddress(data.ip) || undefined;\n data.address = CallDiagnosticUtils.anonymizeIPAddress(data.address) || undefined;\n data.relatedAddress =\n CallDiagnosticUtils.anonymizeIPAddress(data.relatedAddress) || undefined;\n }\n\n return JSON.stringify(data);\n }\n\n /**\n * Set a new connection id.\n *\n * @returns {void}\n */\n private setNewConnectionId() {\n this.connectionId = uuid.v4();\n }\n\n /**\n * Send metrics to the metrics service.\n *\n * @returns {void}\n */\n private sendMetrics() {\n this.webex.request({\n method: 'POST',\n service: 'unifiedTelemetry',\n resource: 'metric/v2',\n headers: {\n type: 'webrtcMedia',\n appId: RTC_METRICS.APP_ID,\n },\n body: {\n metrics: [\n {\n type: 'webrtc',\n version: '1.1.0',\n userId: this.webex.internal.device.userId,\n meetingId: this.meetingId,\n correlationId: this.correlationId,\n connectionId: this.connectionId,\n data: this.metricsQueue,\n },\n ],\n },\n });\n }\n}\n"],"mappings":"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"}
|
|
@@ -10,6 +10,7 @@ export default class RtcMetrics {
|
|
|
10
10
|
webex: any;
|
|
11
11
|
meetingId: string;
|
|
12
12
|
correlationId: string;
|
|
13
|
+
connectionId: string;
|
|
13
14
|
/**
|
|
14
15
|
* Initialize the interval.
|
|
15
16
|
*
|
|
@@ -45,6 +46,12 @@ export default class RtcMetrics {
|
|
|
45
46
|
* @returns {string}
|
|
46
47
|
*/
|
|
47
48
|
anonymizeIp(stats: string): string;
|
|
49
|
+
/**
|
|
50
|
+
* Set a new connection id.
|
|
51
|
+
*
|
|
52
|
+
* @returns {void}
|
|
53
|
+
*/
|
|
54
|
+
private setNewConnectionId;
|
|
48
55
|
/**
|
|
49
56
|
* Send metrics to the metrics service.
|
|
50
57
|
*
|
package/dist/webinar/index.js
CHANGED
|
@@ -62,7 +62,7 @@ var Webinar = _webexCore.WebexPlugin.extend({
|
|
|
62
62
|
updateCanManageWebcast: function updateCanManageWebcast(canManageWebcast) {
|
|
63
63
|
this.set('canManageWebcast', canManageWebcast);
|
|
64
64
|
},
|
|
65
|
-
version: "3.0.0-beta.
|
|
65
|
+
version: "3.0.0-beta.365"
|
|
66
66
|
});
|
|
67
67
|
var _default = Webinar;
|
|
68
68
|
exports.default = _default;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@webex/plugin-meetings",
|
|
3
|
-
"version": "3.0.0-beta.
|
|
3
|
+
"version": "3.0.0-beta.365",
|
|
4
4
|
"description": "",
|
|
5
5
|
"license": "Cisco EULA (https://www.cisco.com/c/en/us/products/end-user-license-agreement.html)",
|
|
6
6
|
"contributors": [
|
|
@@ -33,12 +33,12 @@
|
|
|
33
33
|
},
|
|
34
34
|
"devDependencies": {
|
|
35
35
|
"@peculiar/webcrypto": "^1.4.3",
|
|
36
|
-
"@webex/plugin-meetings": "3.0.0-beta.
|
|
37
|
-
"@webex/test-helper-chai": "3.0.0-beta.
|
|
38
|
-
"@webex/test-helper-mocha": "3.0.0-beta.
|
|
39
|
-
"@webex/test-helper-mock-webex": "3.0.0-beta.
|
|
40
|
-
"@webex/test-helper-retry": "3.0.0-beta.
|
|
41
|
-
"@webex/test-helper-test-users": "3.0.0-beta.
|
|
36
|
+
"@webex/plugin-meetings": "3.0.0-beta.365",
|
|
37
|
+
"@webex/test-helper-chai": "3.0.0-beta.365",
|
|
38
|
+
"@webex/test-helper-mocha": "3.0.0-beta.365",
|
|
39
|
+
"@webex/test-helper-mock-webex": "3.0.0-beta.365",
|
|
40
|
+
"@webex/test-helper-retry": "3.0.0-beta.365",
|
|
41
|
+
"@webex/test-helper-test-users": "3.0.0-beta.365",
|
|
42
42
|
"chai": "^4.3.4",
|
|
43
43
|
"chai-as-promised": "^7.1.1",
|
|
44
44
|
"jsdom-global": "3.0.2",
|
|
@@ -47,19 +47,19 @@
|
|
|
47
47
|
"typescript": "^4.7.4"
|
|
48
48
|
},
|
|
49
49
|
"dependencies": {
|
|
50
|
-
"@webex/common": "3.0.0-beta.
|
|
50
|
+
"@webex/common": "3.0.0-beta.365",
|
|
51
51
|
"@webex/internal-media-core": "2.2.7",
|
|
52
|
-
"@webex/internal-plugin-conversation": "3.0.0-beta.
|
|
53
|
-
"@webex/internal-plugin-device": "3.0.0-beta.
|
|
54
|
-
"@webex/internal-plugin-llm": "3.0.0-beta.
|
|
55
|
-
"@webex/internal-plugin-mercury": "3.0.0-beta.
|
|
56
|
-
"@webex/internal-plugin-metrics": "3.0.0-beta.
|
|
57
|
-
"@webex/internal-plugin-support": "3.0.0-beta.
|
|
58
|
-
"@webex/internal-plugin-user": "3.0.0-beta.
|
|
59
|
-
"@webex/media-helpers": "3.0.0-beta.
|
|
60
|
-
"@webex/plugin-people": "3.0.0-beta.
|
|
61
|
-
"@webex/plugin-rooms": "3.0.0-beta.
|
|
62
|
-
"@webex/webex-core": "3.0.0-beta.
|
|
52
|
+
"@webex/internal-plugin-conversation": "3.0.0-beta.365",
|
|
53
|
+
"@webex/internal-plugin-device": "3.0.0-beta.365",
|
|
54
|
+
"@webex/internal-plugin-llm": "3.0.0-beta.365",
|
|
55
|
+
"@webex/internal-plugin-mercury": "3.0.0-beta.365",
|
|
56
|
+
"@webex/internal-plugin-metrics": "3.0.0-beta.365",
|
|
57
|
+
"@webex/internal-plugin-support": "3.0.0-beta.365",
|
|
58
|
+
"@webex/internal-plugin-user": "3.0.0-beta.365",
|
|
59
|
+
"@webex/media-helpers": "3.0.0-beta.365",
|
|
60
|
+
"@webex/plugin-people": "3.0.0-beta.365",
|
|
61
|
+
"@webex/plugin-rooms": "3.0.0-beta.365",
|
|
62
|
+
"@webex/webex-core": "3.0.0-beta.365",
|
|
63
63
|
"ampersand-collection": "^2.0.2",
|
|
64
64
|
"bowser": "^2.11.0",
|
|
65
65
|
"btoa": "^1.2.1",
|
package/src/meeting/request.ts
CHANGED
|
@@ -185,6 +185,13 @@ export default class MeetingRequest extends StatelessWebexPlugin {
|
|
|
185
185
|
deviceCapabilities.push(ANNOTATION.ANNOTATION_ON_SHARE_SUPPORTED);
|
|
186
186
|
}
|
|
187
187
|
|
|
188
|
+
// append installationId to device config if it exists
|
|
189
|
+
// @ts-ignore
|
|
190
|
+
if (this.webex.internal.device.config.installationId) {
|
|
191
|
+
// @ts-ignore
|
|
192
|
+
body.device.installationId = this.webex.internal.device.config.installationId;
|
|
193
|
+
}
|
|
194
|
+
|
|
188
195
|
if (locale) {
|
|
189
196
|
body.locale = locale;
|
|
190
197
|
}
|
package/src/rtcMetrics/index.ts
CHANGED
|
@@ -1,7 +1,20 @@
|
|
|
1
1
|
/* eslint-disable class-methods-use-this */
|
|
2
2
|
import {CallDiagnosticUtils} from '@webex/internal-plugin-metrics';
|
|
3
|
+
import uuid from 'uuid';
|
|
3
4
|
import RTC_METRICS from './constants';
|
|
4
5
|
|
|
6
|
+
const parseJsonPayload = (payload: any[]): any | null => {
|
|
7
|
+
try {
|
|
8
|
+
if (payload && payload[0]) {
|
|
9
|
+
return JSON.parse(payload[0]);
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
return null;
|
|
13
|
+
} catch (_) {
|
|
14
|
+
return null;
|
|
15
|
+
}
|
|
16
|
+
};
|
|
17
|
+
|
|
5
18
|
/**
|
|
6
19
|
* Rtc Metrics
|
|
7
20
|
*/
|
|
@@ -19,6 +32,8 @@ export default class RtcMetrics {
|
|
|
19
32
|
|
|
20
33
|
correlationId: string;
|
|
21
34
|
|
|
35
|
+
connectionId: string;
|
|
36
|
+
|
|
22
37
|
/**
|
|
23
38
|
* Initialize the interval.
|
|
24
39
|
*
|
|
@@ -32,6 +47,7 @@ export default class RtcMetrics {
|
|
|
32
47
|
this.meetingId = meetingId;
|
|
33
48
|
this.webex = webex;
|
|
34
49
|
this.correlationId = correlationId;
|
|
50
|
+
this.setNewConnectionId();
|
|
35
51
|
// Send the first set of metrics at 5 seconds in the case of a user leaving the call shortly after joining.
|
|
36
52
|
setTimeout(this.sendMetricsInQueue.bind(this), 5 * 1000);
|
|
37
53
|
}
|
|
@@ -60,7 +76,23 @@ export default class RtcMetrics {
|
|
|
60
76
|
if (data.name === 'stats-report') {
|
|
61
77
|
data.payload = data.payload.map(this.anonymizeIp);
|
|
62
78
|
}
|
|
79
|
+
|
|
63
80
|
this.metricsQueue.push(data);
|
|
81
|
+
|
|
82
|
+
try {
|
|
83
|
+
// If a connection fails, send the rest of the metrics in queue and get a new connection id.
|
|
84
|
+
const parsedPayload = parseJsonPayload(data.payload);
|
|
85
|
+
if (
|
|
86
|
+
data.name === 'onconnectionstatechange' &&
|
|
87
|
+
parsedPayload &&
|
|
88
|
+
parsedPayload.value === 'failed'
|
|
89
|
+
) {
|
|
90
|
+
this.sendMetricsInQueue();
|
|
91
|
+
this.setNewConnectionId();
|
|
92
|
+
}
|
|
93
|
+
} catch (e) {
|
|
94
|
+
console.error(e);
|
|
95
|
+
}
|
|
64
96
|
}
|
|
65
97
|
}
|
|
66
98
|
|
|
@@ -93,6 +125,15 @@ export default class RtcMetrics {
|
|
|
93
125
|
return JSON.stringify(data);
|
|
94
126
|
}
|
|
95
127
|
|
|
128
|
+
/**
|
|
129
|
+
* Set a new connection id.
|
|
130
|
+
*
|
|
131
|
+
* @returns {void}
|
|
132
|
+
*/
|
|
133
|
+
private setNewConnectionId() {
|
|
134
|
+
this.connectionId = uuid.v4();
|
|
135
|
+
}
|
|
136
|
+
|
|
96
137
|
/**
|
|
97
138
|
* Send metrics to the metrics service.
|
|
98
139
|
*
|
|
@@ -111,10 +152,11 @@ export default class RtcMetrics {
|
|
|
111
152
|
metrics: [
|
|
112
153
|
{
|
|
113
154
|
type: 'webrtc',
|
|
114
|
-
version: '1.0
|
|
155
|
+
version: '1.1.0',
|
|
115
156
|
userId: this.webex.internal.device.userId,
|
|
116
157
|
meetingId: this.meetingId,
|
|
117
158
|
correlationId: this.correlationId,
|
|
159
|
+
connectionId: this.connectionId,
|
|
118
160
|
data: this.metricsQueue,
|
|
119
161
|
},
|
|
120
162
|
],
|
|
@@ -4,16 +4,19 @@ import MockWebex from '@webex/test-helper-mock-webex';
|
|
|
4
4
|
import Meetings from '@webex/plugin-meetings';
|
|
5
5
|
import MeetingRequest from '@webex/plugin-meetings/src/meeting/request';
|
|
6
6
|
import uuid from 'uuid';
|
|
7
|
-
import {
|
|
7
|
+
import {merge} from 'lodash';
|
|
8
8
|
import {IP_VERSION} from '@webex/plugin-meetings/src/constants';
|
|
9
9
|
import {CallDiagnosticUtils} from '@webex/internal-plugin-metrics';
|
|
10
10
|
|
|
11
|
-
|
|
12
11
|
describe('plugin-meetings', () => {
|
|
13
12
|
let meetingsRequest;
|
|
14
13
|
let locusDeltaRequestSpy;
|
|
15
14
|
let webex;
|
|
16
|
-
const geoHintInfoDefaults = {
|
|
15
|
+
const geoHintInfoDefaults = {
|
|
16
|
+
countryCode: 'US',
|
|
17
|
+
regionCode: 'WEST-COAST',
|
|
18
|
+
clientAddress: '127.0.0.1',
|
|
19
|
+
};
|
|
17
20
|
let anonymizeIpSpy;
|
|
18
21
|
|
|
19
22
|
beforeEach(() => {
|
|
@@ -30,6 +33,11 @@ describe('plugin-meetings', () => {
|
|
|
30
33
|
get: sinon.mock().returns('locusUrl'),
|
|
31
34
|
waitForCatalog: sinon.mock().returns(Promise.resolve({})),
|
|
32
35
|
},
|
|
36
|
+
device: {
|
|
37
|
+
config: {
|
|
38
|
+
installationId: 'installationId',
|
|
39
|
+
},
|
|
40
|
+
},
|
|
33
41
|
};
|
|
34
42
|
|
|
35
43
|
webex.boundedStorage.get = sinon
|
|
@@ -179,12 +187,13 @@ describe('plugin-meetings', () => {
|
|
|
179
187
|
});
|
|
180
188
|
|
|
181
189
|
describe('#joinMeeting', () => {
|
|
182
|
-
it('sends /call
|
|
190
|
+
it('sends /call request for join', async () => {
|
|
183
191
|
const locusUrl = 'locusURL';
|
|
184
192
|
const deviceUrl = 'deviceUrl';
|
|
185
193
|
const correlationId = 'random-uuid';
|
|
186
194
|
const roapMessage = 'roap-message';
|
|
187
195
|
const permissionToken = 'permission-token';
|
|
196
|
+
const installationId = 'installationId';
|
|
188
197
|
|
|
189
198
|
await meetingsRequest.joinMeeting({
|
|
190
199
|
locusUrl,
|
|
@@ -198,6 +207,7 @@ describe('plugin-meetings', () => {
|
|
|
198
207
|
assert.equal(requestParams.method, 'POST');
|
|
199
208
|
assert.equal(requestParams.uri, `${locusUrl}/participant?alternateRedirect=true`);
|
|
200
209
|
assert.equal(requestParams.body.device.url, deviceUrl);
|
|
210
|
+
assert.equal(requestParams.body.device.installationId, installationId);
|
|
201
211
|
assert.equal(requestParams.body.device.countryCode, 'US');
|
|
202
212
|
assert.equal(requestParams.body.permissionToken, 'permission-token');
|
|
203
213
|
assert.equal(requestParams.body.device.regionCode, 'WEST-COAST');
|
|
@@ -210,7 +220,7 @@ describe('plugin-meetings', () => {
|
|
|
210
220
|
beforeEach(() => {
|
|
211
221
|
webex.meetings.geoHintInfo = {};
|
|
212
222
|
});
|
|
213
|
-
|
|
223
|
+
|
|
214
224
|
// reset
|
|
215
225
|
afterEach(() => {
|
|
216
226
|
webex.meetings.geoHintInfo = {...geoHintInfoDefaults};
|
|
@@ -222,7 +232,7 @@ describe('plugin-meetings', () => {
|
|
|
222
232
|
const correlationId = 'random-uuid';
|
|
223
233
|
const roapMessage = 'roap-message';
|
|
224
234
|
const permissionToken = 'permission-token';
|
|
225
|
-
|
|
235
|
+
|
|
226
236
|
await meetingsRequest.joinMeeting({
|
|
227
237
|
locusUrl,
|
|
228
238
|
deviceUrl,
|
|
@@ -231,10 +241,10 @@ describe('plugin-meetings', () => {
|
|
|
231
241
|
permissionToken,
|
|
232
242
|
});
|
|
233
243
|
const requestParams = meetingsRequest.request.getCall(0).args[0];
|
|
234
|
-
|
|
244
|
+
|
|
235
245
|
assert.equal(requestParams.body.device.localIp, undefined);
|
|
236
246
|
});
|
|
237
|
-
})
|
|
247
|
+
});
|
|
238
248
|
|
|
239
249
|
it('sends /call with meetingNumber if inviteeAddress does not exist', async () => {
|
|
240
250
|
const deviceUrl = 'deviceUrl';
|
|
@@ -368,16 +378,16 @@ describe('plugin-meetings', () => {
|
|
|
368
378
|
correlationId,
|
|
369
379
|
roapMessage,
|
|
370
380
|
permissionToken,
|
|
371
|
-
ipVersion: IP_VERSION.ipv4_and_ipv6
|
|
381
|
+
ipVersion: IP_VERSION.ipv4_and_ipv6,
|
|
372
382
|
});
|
|
373
383
|
const requestParams = meetingsRequest.request.getCall(0).args[0];
|
|
374
384
|
|
|
375
385
|
assert.equal(requestParams.method, 'POST');
|
|
376
386
|
assert.equal(requestParams.uri, `${locusUrl}/participant?alternateRedirect=true`);
|
|
377
387
|
assert.deepEqual(requestParams.body.clientMediaPreferences, {
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
388
|
+
joinCookie: {anycastEntryPoint: 'aws-eu-west-1'},
|
|
389
|
+
preferTranscoding: true,
|
|
390
|
+
ipver: 1,
|
|
381
391
|
});
|
|
382
392
|
});
|
|
383
393
|
});
|
|
@@ -4,10 +4,15 @@ import {assert} from '@webex/test-helper-chai';
|
|
|
4
4
|
import sinon from 'sinon';
|
|
5
5
|
import RTC_METRICS from '../../../../src/rtcMetrics/constants';
|
|
6
6
|
|
|
7
|
-
const FAKE_METRICS_ITEM = {payload: ['fake-metrics']};
|
|
7
|
+
const FAKE_METRICS_ITEM = {payload: ['{"type":"string","value":"fake-metrics","id":""}']};
|
|
8
|
+
const FAILURE_METRICS_ITEM = {
|
|
9
|
+
name: "onconnectionstatechange",
|
|
10
|
+
payload: ['{"type":"string","value":"failed","id":""}'],
|
|
11
|
+
timestamp: 1707929986667
|
|
12
|
+
};
|
|
8
13
|
|
|
9
|
-
const STATS_WITH_IP = '{
|
|
10
|
-
const STATS_WITH_IP_RESULT = '{
|
|
14
|
+
const STATS_WITH_IP = '{"id":"RTCIceCandidate_/kQs0ZNU","type":"remote-candidate","transportId":"RTCTransport_0_1","isRemote":true,"ip":"11.22.111.255","address":"11.22.111.255","port":5004,"protocol":"udp","candidateType":"host","priority":2130706431}';
|
|
15
|
+
const STATS_WITH_IP_RESULT = '{"id":"RTCIceCandidate_/kQs0ZNU","type":"remote-candidate","transportId":"RTCTransport_0_1","isRemote":true,"ip":"11.22.111.240","address":"11.22.111.240","port":5004,"protocol":"udp","candidateType":"host","priority":2130706431}';
|
|
11
16
|
|
|
12
17
|
describe('RtcMetrics', () => {
|
|
13
18
|
let metrics: RtcMetrics;
|
|
@@ -82,6 +87,30 @@ describe('RtcMetrics', () => {
|
|
|
82
87
|
assert.callCount(webex.request, 1);
|
|
83
88
|
});
|
|
84
89
|
|
|
90
|
+
it('should clear out metrics on failure', () => {
|
|
91
|
+
assert.notCalled(webex.request);
|
|
92
|
+
|
|
93
|
+
metrics.addMetrics(FAILURE_METRICS_ITEM);
|
|
94
|
+
|
|
95
|
+
assert.callCount(webex.request, 1);
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
it('should have the same connectionId on success', () => {
|
|
99
|
+
const originalId = metrics.connectionId;
|
|
100
|
+
|
|
101
|
+
metrics.addMetrics(FAKE_METRICS_ITEM);
|
|
102
|
+
|
|
103
|
+
assert.strictEqual(originalId, metrics.connectionId);
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
it('should have a new connectionId on failure', () => {
|
|
107
|
+
const originalId = metrics.connectionId;
|
|
108
|
+
|
|
109
|
+
metrics.addMetrics(FAILURE_METRICS_ITEM);
|
|
110
|
+
|
|
111
|
+
assert.notEqual(originalId, metrics.connectionId);
|
|
112
|
+
});
|
|
113
|
+
|
|
85
114
|
it('should anonymize IP addresses', () => {
|
|
86
115
|
assert.strictEqual(metrics.anonymizeIp(STATS_WITH_IP), STATS_WITH_IP_RESULT);
|
|
87
116
|
});
|