@webex/plugin-meetings 2.12.0 → 2.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/constants.js +9 -2
- package/dist/constants.js.map +1 -1
- package/dist/meeting/effectsState.js +328 -0
- package/dist/meeting/effectsState.js.map +1 -0
- package/dist/meeting/index.js +190 -172
- package/dist/meeting/index.js.map +1 -1
- package/dist/meeting-info/meeting-info-v2.js +3 -1
- package/dist/meeting-info/meeting-info-v2.js.map +1 -1
- package/package.json +7 -7
- package/src/constants.js +7 -0
- package/src/meeting/effectsState.js +206 -0
- package/src/meeting/index.js +98 -71
- package/src/meeting-info/meeting-info-v2.js +3 -1
- package/test/unit/spec/meeting/effectsState.js +292 -0
- package/test/unit/spec/meeting/index.js +54 -142
- package/test/unit/spec/meeting-info/meetinginfov2.js +21 -5
|
@@ -363,8 +363,10 @@ var MeetingInfoV2 = /*#__PURE__*/function () {
|
|
|
363
363
|
case 14:
|
|
364
364
|
directURI = _context2.sent;
|
|
365
365
|
if (directURI) options.directURI = directURI;
|
|
366
|
-
return _context2.abrupt("return", this.webex.request(options).then(function () {
|
|
366
|
+
return _context2.abrupt("return", this.webex.request(options).then(function (response) {
|
|
367
367
|
_metrics.default.sendBehavioralMetric(_constants2.default.FETCH_MEETING_INFO_V1_SUCCESS);
|
|
368
|
+
|
|
369
|
+
return response;
|
|
368
370
|
}).catch(function (err) {
|
|
369
371
|
if ((err === null || err === void 0 ? void 0 : err.statusCode) === 403) {
|
|
370
372
|
var _err$body5, _err$body6, _err$body6$data;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["PASSWORD_ERROR_DEFAULT_MESSAGE","CAPTCHA_ERROR_DEFAULT_MESSAGE","ADHOC_MEETING_DEFAULT_ERROR","CAPTCHA_ERROR_REQUIRES_PASSWORD_CODES","MeetingInfoV2PasswordError","wbxAppApiErrorCode","meetingInfo","message","name","sdkMessage","stack","Error","wbxAppApiCode","MeetingInfoV2AdhocMeetingError","MeetingInfoV2CaptchaError","captchaInfo","isPasswordRequired","includes","MeetingInfoV2","webex","destination","type","MeetingInfoUtil","getDestinationType","conversationUrl","meetings","preferredWebexSite","getInvitees","particpants","invitees","forEach","participant","push","email","emailAddress","ciUserUuid","entryUUID","internal","conversation","get","url","includeParticipants","disableTransform","then","body","title","displayName","spaceUrl","keyUrl","encryptionKeyUrl","kroUrl","kmsResourceObjectUrl","participants","items","uri","Metrics","sendBehavioralMetric","BEHAVIORAL_METRICS","ADHOC_MEETING_SUCCESS","request","method","HTTP_VERBS","POST","catch","err","code","ADHOC_MEETING_FAILURE","reason","password","destinationType","_CONVERSATION_URL_","config","experimental","enableAdhocMeetings","createAdhocSpaceMeeting","getRequestBody","options","service","resource","getDirectMeetingInfoURI","directURI","FETCH_MEETING_INFO_V1_SUCCESS","statusCode","VERIFY_PASSWORD_ERROR","data","VERIFY_CAPTCHA_ERROR","captchaId","captchaID","verificationImageURL","verificationAudioURL","refreshURL","FETCH_MEETING_INFO_V1_FAILURE"],"sources":["meeting-info-v2.js"],"sourcesContent":["\nimport {HTTP_VERBS, _CONVERSATION_URL_} from '../constants';\nimport Metrics from '../metrics';\nimport BEHAVIORAL_METRICS from '../metrics/constants';\n\nimport MeetingInfoUtil from './utilv2';\n\nconst PASSWORD_ERROR_DEFAULT_MESSAGE = 'Password required. Call fetchMeetingInfo() with password argument';\nconst CAPTCHA_ERROR_DEFAULT_MESSAGE = 'Captcha required. Call fetchMeetingInfo() with captchaInfo argument';\nconst ADHOC_MEETING_DEFAULT_ERROR = 'Failed starting the adhoc meeting, Please contact support team ';\nconst CAPTCHA_ERROR_REQUIRES_PASSWORD_CODES = [423005, 423006];\n\n/**\n * Error to indicate that wbxappapi requires a password\n */\nexport class MeetingInfoV2PasswordError extends Error {\n /**\n *\n * @constructor\n * @param {Number} [wbxAppApiErrorCode]\n * @param {Object} [meetingInfo]\n * @param {String} [message]\n */\n constructor(wbxAppApiErrorCode, meetingInfo, message = PASSWORD_ERROR_DEFAULT_MESSAGE) {\n super(`${message}, code=${wbxAppApiErrorCode}`);\n this.name = 'MeetingInfoV2PasswordError';\n this.sdkMessage = message;\n this.stack = (new Error()).stack;\n this.wbxAppApiCode = wbxAppApiErrorCode;\n this.meetingInfo = meetingInfo;\n }\n}\n\n/**\n * Error generating a adhoc space meeting\n */\nexport class MeetingInfoV2AdhocMeetingError extends Error {\n /**\n *\n * @constructor\n * @param {Number} [wbxAppApiErrorCode]\n * @param {String} [message]\n */\n constructor(wbxAppApiErrorCode, message = ADHOC_MEETING_DEFAULT_ERROR) {\n super(`${message}, code=${wbxAppApiErrorCode}`);\n this.name = 'MeetingInfoV2AdhocMeetingError';\n this.sdkMessage = message;\n this.stack = (new Error()).stack;\n this.wbxAppApiCode = wbxAppApiErrorCode;\n }\n}\n\n\n/**\n * Error to indicate that preferred webex site not present to start adhoc meeting\n */\nexport class MeetingInfoV2CaptchaError extends Error {\n /**\n *\n * @constructor\n * @param {Number} [wbxAppApiErrorCode]\n * @param {Object} [captchaInfo]\n * @param {String} [message]\n */\n constructor(wbxAppApiErrorCode, captchaInfo, message = CAPTCHA_ERROR_DEFAULT_MESSAGE) {\n super(`${message}, code=${wbxAppApiErrorCode}`);\n this.name = 'MeetingInfoV2PasswordError';\n this.sdkMessage = message;\n this.stack = (new Error()).stack;\n this.wbxAppApiCode = wbxAppApiErrorCode;\n this.isPasswordRequired = CAPTCHA_ERROR_REQUIRES_PASSWORD_CODES.includes(wbxAppApiErrorCode);\n this.captchaInfo = captchaInfo;\n }\n}\n\n/**\n * @class MeetingInfo\n */\nexport default class MeetingInfoV2 {\n /**\n *\n * @param {WebexSDK} webex\n */\n constructor(webex) {\n this.webex = webex;\n }\n\n /**\n * converts hydra id into conversation url and persons Id\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} destination and type\n * @public\n * @memberof MeetingInfo\n */\n fetchInfoOptions(destination, type = null) {\n return MeetingInfoUtil.getDestinationType({\n destination,\n type,\n webex: this.webex\n });\n }\n\n /**\n * Creates adhoc space meetings for a space by fetching the conversation infomation\n * @param {String} conversationUrl conversationUrl to start adhoc meeting on\n * @returns {Promise} returns a meeting info object\n * @public\n * @memberof MeetingInfo\n */\n async createAdhocSpaceMeeting(conversationUrl) {\n if (!this.webex.meetings.preferredWebexSite) {\n throw Error('No preferred webex site found');\n }\n const getInvitees = (particpants = []) => {\n const invitees = [];\n\n if (particpants) {\n particpants.forEach((participant) => {\n invitees.push({\n email: participant.emailAddress,\n ciUserUuid: participant.entryUUID\n });\n });\n }\n\n return invitees;\n };\n\n return this.webex.internal.conversation.get(\n {url: conversationUrl},\n {includeParticipants: true, disableTransform: true}\n )\n .then((conversation) => {\n const body = {\n title: conversation.displayName,\n spaceUrl: conversation.url,\n keyUrl: conversation.encryptionKeyUrl,\n kroUrl: conversation.kmsResourceObjectUrl,\n invitees: getInvitees(conversation.participants?.items)\n };\n\n const uri = this.webex.meetings.preferredWebexSite ?\n `https://${this.webex.meetings.preferredWebexSite}/wbxappapi/v2/meetings/spaceInstant` : '';\n\n Metrics.sendBehavioralMetric(\n BEHAVIORAL_METRICS.ADHOC_MEETING_SUCCESS\n );\n\n return this.webex.request({\n method: HTTP_VERBS.POST,\n uri,\n body\n })\n .catch((err) => {\n throw new MeetingInfoV2AdhocMeetingError(err.body?.code, err.body?.message);\n });\n })\n .catch((err) => {\n Metrics.sendBehavioralMetric(\n BEHAVIORAL_METRICS.ADHOC_MEETING_FAILURE,\n {\n reason: err.message,\n stack: err.stack\n }\n );\n throw new MeetingInfoV2AdhocMeetingError(err.body?.code, err.body?.message);\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 * @param {String} password\n * @param {Object} captchaInfo\n * @param {String} captchaInfo.code\n * @param {String} captchaInfo.id\n * @returns {Promise} returns a meeting info object\n * @public\n * @memberof MeetingInfo\n */\n async fetchMeetingInfo(destination, type = null, password = null, captchaInfo = null) {\n const destinationType = await MeetingInfoUtil.getDestinationType({\n destination,\n type,\n webex: this.webex\n });\n\n if (destinationType.type === _CONVERSATION_URL_ && this.webex.config.meetings.experimental.enableAdhocMeetings) {\n return this.createAdhocSpaceMeeting(destinationType.destination);\n }\n\n const body = await MeetingInfoUtil.getRequestBody({...destinationType, password, captchaInfo});\n\n const options = {\n method: HTTP_VERBS.POST,\n service: 'webex-appapi-service',\n resource: 'meetingInfo',\n body\n };\n\n const directURI = await MeetingInfoUtil.getDirectMeetingInfoURI(destinationType);\n\n if (directURI) options.directURI = directURI;\n\n return this.webex.request(options)\n .then(() => {\n Metrics.sendBehavioralMetric(\n BEHAVIORAL_METRICS.FETCH_MEETING_INFO_V1_SUCCESS\n );\n })\n .catch((err) => {\n if (err?.statusCode === 403) {\n Metrics.sendBehavioralMetric(\n BEHAVIORAL_METRICS.VERIFY_PASSWORD_ERROR,\n {\n reason: err.message,\n stack: err.stack\n }\n );\n\n throw new MeetingInfoV2PasswordError(err.body?.code, err.body?.data?.meetingInfo);\n }\n if (err?.statusCode === 423) {\n Metrics.sendBehavioralMetric(\n BEHAVIORAL_METRICS.VERIFY_CAPTCHA_ERROR,\n {\n reason: err.message,\n stack: err.stack\n }\n );\n\n throw new MeetingInfoV2CaptchaError(err.body?.code, {\n captchaId: err.body.captchaID,\n verificationImageURL: err.body.verificationImageURL,\n verificationAudioURL: err.body.verificationAudioURL,\n refreshURL: err.body.refreshURL\n });\n }\n\n Metrics.sendBehavioralMetric(\n BEHAVIORAL_METRICS.FETCH_MEETING_INFO_V1_FAILURE,\n {\n reason: err.message,\n stack: err.stack\n }\n );\n throw err;\n });\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"names":["PASSWORD_ERROR_DEFAULT_MESSAGE","CAPTCHA_ERROR_DEFAULT_MESSAGE","ADHOC_MEETING_DEFAULT_ERROR","CAPTCHA_ERROR_REQUIRES_PASSWORD_CODES","MeetingInfoV2PasswordError","wbxAppApiErrorCode","meetingInfo","message","name","sdkMessage","stack","Error","wbxAppApiCode","MeetingInfoV2AdhocMeetingError","MeetingInfoV2CaptchaError","captchaInfo","isPasswordRequired","includes","MeetingInfoV2","webex","destination","type","MeetingInfoUtil","getDestinationType","conversationUrl","meetings","preferredWebexSite","getInvitees","particpants","invitees","forEach","participant","push","email","emailAddress","ciUserUuid","entryUUID","internal","conversation","get","url","includeParticipants","disableTransform","then","body","title","displayName","spaceUrl","keyUrl","encryptionKeyUrl","kroUrl","kmsResourceObjectUrl","participants","items","uri","Metrics","sendBehavioralMetric","BEHAVIORAL_METRICS","ADHOC_MEETING_SUCCESS","request","method","HTTP_VERBS","POST","catch","err","code","ADHOC_MEETING_FAILURE","reason","password","destinationType","_CONVERSATION_URL_","config","experimental","enableAdhocMeetings","createAdhocSpaceMeeting","getRequestBody","options","service","resource","getDirectMeetingInfoURI","directURI","response","FETCH_MEETING_INFO_V1_SUCCESS","statusCode","VERIFY_PASSWORD_ERROR","data","VERIFY_CAPTCHA_ERROR","captchaId","captchaID","verificationImageURL","verificationAudioURL","refreshURL","FETCH_MEETING_INFO_V1_FAILURE"],"sources":["meeting-info-v2.js"],"sourcesContent":["\nimport {HTTP_VERBS, _CONVERSATION_URL_} from '../constants';\nimport Metrics from '../metrics';\nimport BEHAVIORAL_METRICS from '../metrics/constants';\n\nimport MeetingInfoUtil from './utilv2';\n\nconst PASSWORD_ERROR_DEFAULT_MESSAGE = 'Password required. Call fetchMeetingInfo() with password argument';\nconst CAPTCHA_ERROR_DEFAULT_MESSAGE = 'Captcha required. Call fetchMeetingInfo() with captchaInfo argument';\nconst ADHOC_MEETING_DEFAULT_ERROR = 'Failed starting the adhoc meeting, Please contact support team ';\nconst CAPTCHA_ERROR_REQUIRES_PASSWORD_CODES = [423005, 423006];\n\n/**\n * Error to indicate that wbxappapi requires a password\n */\nexport class MeetingInfoV2PasswordError extends Error {\n /**\n *\n * @constructor\n * @param {Number} [wbxAppApiErrorCode]\n * @param {Object} [meetingInfo]\n * @param {String} [message]\n */\n constructor(wbxAppApiErrorCode, meetingInfo, message = PASSWORD_ERROR_DEFAULT_MESSAGE) {\n super(`${message}, code=${wbxAppApiErrorCode}`);\n this.name = 'MeetingInfoV2PasswordError';\n this.sdkMessage = message;\n this.stack = (new Error()).stack;\n this.wbxAppApiCode = wbxAppApiErrorCode;\n this.meetingInfo = meetingInfo;\n }\n}\n\n/**\n * Error generating a adhoc space meeting\n */\nexport class MeetingInfoV2AdhocMeetingError extends Error {\n /**\n *\n * @constructor\n * @param {Number} [wbxAppApiErrorCode]\n * @param {String} [message]\n */\n constructor(wbxAppApiErrorCode, message = ADHOC_MEETING_DEFAULT_ERROR) {\n super(`${message}, code=${wbxAppApiErrorCode}`);\n this.name = 'MeetingInfoV2AdhocMeetingError';\n this.sdkMessage = message;\n this.stack = (new Error()).stack;\n this.wbxAppApiCode = wbxAppApiErrorCode;\n }\n}\n\n\n/**\n * Error to indicate that preferred webex site not present to start adhoc meeting\n */\nexport class MeetingInfoV2CaptchaError extends Error {\n /**\n *\n * @constructor\n * @param {Number} [wbxAppApiErrorCode]\n * @param {Object} [captchaInfo]\n * @param {String} [message]\n */\n constructor(wbxAppApiErrorCode, captchaInfo, message = CAPTCHA_ERROR_DEFAULT_MESSAGE) {\n super(`${message}, code=${wbxAppApiErrorCode}`);\n this.name = 'MeetingInfoV2PasswordError';\n this.sdkMessage = message;\n this.stack = (new Error()).stack;\n this.wbxAppApiCode = wbxAppApiErrorCode;\n this.isPasswordRequired = CAPTCHA_ERROR_REQUIRES_PASSWORD_CODES.includes(wbxAppApiErrorCode);\n this.captchaInfo = captchaInfo;\n }\n}\n\n/**\n * @class MeetingInfo\n */\nexport default class MeetingInfoV2 {\n /**\n *\n * @param {WebexSDK} webex\n */\n constructor(webex) {\n this.webex = webex;\n }\n\n /**\n * converts hydra id into conversation url and persons Id\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} destination and type\n * @public\n * @memberof MeetingInfo\n */\n fetchInfoOptions(destination, type = null) {\n return MeetingInfoUtil.getDestinationType({\n destination,\n type,\n webex: this.webex\n });\n }\n\n /**\n * Creates adhoc space meetings for a space by fetching the conversation infomation\n * @param {String} conversationUrl conversationUrl to start adhoc meeting on\n * @returns {Promise} returns a meeting info object\n * @public\n * @memberof MeetingInfo\n */\n async createAdhocSpaceMeeting(conversationUrl) {\n if (!this.webex.meetings.preferredWebexSite) {\n throw Error('No preferred webex site found');\n }\n const getInvitees = (particpants = []) => {\n const invitees = [];\n\n if (particpants) {\n particpants.forEach((participant) => {\n invitees.push({\n email: participant.emailAddress,\n ciUserUuid: participant.entryUUID\n });\n });\n }\n\n return invitees;\n };\n\n return this.webex.internal.conversation.get(\n {url: conversationUrl},\n {includeParticipants: true, disableTransform: true}\n )\n .then((conversation) => {\n const body = {\n title: conversation.displayName,\n spaceUrl: conversation.url,\n keyUrl: conversation.encryptionKeyUrl,\n kroUrl: conversation.kmsResourceObjectUrl,\n invitees: getInvitees(conversation.participants?.items)\n };\n\n const uri = this.webex.meetings.preferredWebexSite ?\n `https://${this.webex.meetings.preferredWebexSite}/wbxappapi/v2/meetings/spaceInstant` : '';\n\n Metrics.sendBehavioralMetric(\n BEHAVIORAL_METRICS.ADHOC_MEETING_SUCCESS\n );\n\n return this.webex.request({\n method: HTTP_VERBS.POST,\n uri,\n body\n })\n .catch((err) => {\n throw new MeetingInfoV2AdhocMeetingError(err.body?.code, err.body?.message);\n });\n })\n .catch((err) => {\n Metrics.sendBehavioralMetric(\n BEHAVIORAL_METRICS.ADHOC_MEETING_FAILURE,\n {\n reason: err.message,\n stack: err.stack\n }\n );\n throw new MeetingInfoV2AdhocMeetingError(err.body?.code, err.body?.message);\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 * @param {String} password\n * @param {Object} captchaInfo\n * @param {String} captchaInfo.code\n * @param {String} captchaInfo.id\n * @returns {Promise} returns a meeting info object\n * @public\n * @memberof MeetingInfo\n */\n async fetchMeetingInfo(destination, type = null, password = null, captchaInfo = null) {\n const destinationType = await MeetingInfoUtil.getDestinationType({\n destination,\n type,\n webex: this.webex\n });\n\n if (destinationType.type === _CONVERSATION_URL_ && this.webex.config.meetings.experimental.enableAdhocMeetings) {\n return this.createAdhocSpaceMeeting(destinationType.destination);\n }\n\n const body = await MeetingInfoUtil.getRequestBody({...destinationType, password, captchaInfo});\n\n const options = {\n method: HTTP_VERBS.POST,\n service: 'webex-appapi-service',\n resource: 'meetingInfo',\n body\n };\n\n const directURI = await MeetingInfoUtil.getDirectMeetingInfoURI(destinationType);\n\n if (directURI) options.directURI = directURI;\n\n return this.webex.request(options)\n .then((response) => {\n Metrics.sendBehavioralMetric(\n BEHAVIORAL_METRICS.FETCH_MEETING_INFO_V1_SUCCESS\n );\n\n return response;\n })\n .catch((err) => {\n if (err?.statusCode === 403) {\n Metrics.sendBehavioralMetric(\n BEHAVIORAL_METRICS.VERIFY_PASSWORD_ERROR,\n {\n reason: err.message,\n stack: err.stack\n }\n );\n\n throw new MeetingInfoV2PasswordError(err.body?.code, err.body?.data?.meetingInfo);\n }\n if (err?.statusCode === 423) {\n Metrics.sendBehavioralMetric(\n BEHAVIORAL_METRICS.VERIFY_CAPTCHA_ERROR,\n {\n reason: err.message,\n stack: err.stack\n }\n );\n\n throw new MeetingInfoV2CaptchaError(err.body?.code, {\n captchaId: err.body.captchaID,\n verificationImageURL: err.body.verificationImageURL,\n verificationAudioURL: err.body.verificationAudioURL,\n refreshURL: err.body.refreshURL\n });\n }\n\n Metrics.sendBehavioralMetric(\n BEHAVIORAL_METRICS.FETCH_MEETING_INFO_V1_FAILURE,\n {\n reason: err.message,\n stack: err.stack\n }\n );\n throw err;\n });\n }\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@webex/plugin-meetings",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.14.0",
|
|
4
4
|
"description": "",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"contributors": [
|
|
@@ -24,21 +24,21 @@
|
|
|
24
24
|
},
|
|
25
25
|
"dependencies": {
|
|
26
26
|
"@babel/runtime-corejs2": "^7.14.8",
|
|
27
|
-
"@webex/webex-core": "2.
|
|
28
|
-
"@webex/internal-plugin-mercury": "2.
|
|
29
|
-
"@webex/internal-plugin-conversation": "2.
|
|
27
|
+
"@webex/webex-core": "2.14.0",
|
|
28
|
+
"@webex/internal-plugin-mercury": "2.14.0",
|
|
29
|
+
"@webex/internal-plugin-conversation": "2.14.0",
|
|
30
30
|
"webrtc-adapter": "^7.7.0",
|
|
31
31
|
"lodash": "^4.17.21",
|
|
32
32
|
"uuid": "^3.3.2",
|
|
33
33
|
"global": "^4.4.0",
|
|
34
34
|
"ip-anonymize": "^0.1.0",
|
|
35
|
-
"@webex/common": "2.
|
|
35
|
+
"@webex/common": "2.14.0",
|
|
36
36
|
"bowser": "^2.11.0",
|
|
37
37
|
"sdp-transform": "^2.12.0",
|
|
38
38
|
"readable-stream": "^3.6.0",
|
|
39
|
-
"@webex/common-timers": "2.
|
|
39
|
+
"@webex/common-timers": "2.14.0",
|
|
40
40
|
"btoa": "^1.2.1",
|
|
41
|
-
"@webex/internal-media-core": "^0.0.
|
|
41
|
+
"@webex/internal-media-core": "^0.0.6-beta",
|
|
42
42
|
"javascript-state-machine": "^3.1.0",
|
|
43
43
|
"envify": "^4.1.0"
|
|
44
44
|
}
|
package/src/constants.js
CHANGED
|
@@ -1241,3 +1241,10 @@ export const MEETING_INFO_FAILURE_REASON = {
|
|
|
1241
1241
|
WRONG_CAPTCHA: 'WRONG_CAPTCHA', // wbxappapi requires a captcha code or a wrong captcha code was provided
|
|
1242
1242
|
OTHER: 'OTHER' // any other error (network, etc)
|
|
1243
1243
|
};
|
|
1244
|
+
|
|
1245
|
+
export const BNR_STATUS = {
|
|
1246
|
+
SHOULD_ENABLE: 'SHOULD_ENABLE',
|
|
1247
|
+
ENABLED: 'ENABLED',
|
|
1248
|
+
SHOULD_DISABLE: 'SHOULD_DISABLE',
|
|
1249
|
+
NOT_ENABLED: 'NOT_ENABLED'
|
|
1250
|
+
};
|
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
/* eslint-disable no-param-reassign */
|
|
2
|
+
import {Media as WebRTCMedia} from '@webex/internal-media-core';
|
|
3
|
+
|
|
4
|
+
import BEHAVIORAL_METRICS from '../metrics/constants';
|
|
5
|
+
import Metrics from '../metrics';
|
|
6
|
+
import MediaUtil from '../media/util';
|
|
7
|
+
import LoggerProxy from '../common/logs/logger-proxy';
|
|
8
|
+
import {BNR_STATUS} from '../constants';
|
|
9
|
+
|
|
10
|
+
const createEffectsState = (type) => {
|
|
11
|
+
LoggerProxy.logger.info(`Meeting:effectState#createEffectsState --> creating effectsState for effect ${type}`);
|
|
12
|
+
|
|
13
|
+
return new EffectsState(type);
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
/* The purpose of this class is to manage the effects state(for eg., BNR).
|
|
17
|
+
*/
|
|
18
|
+
class EffectsState {
|
|
19
|
+
constructor(type) {
|
|
20
|
+
this.effectType = type;
|
|
21
|
+
this.state = {
|
|
22
|
+
bnr: {
|
|
23
|
+
enabled: BNR_STATUS.NOT_ENABLED
|
|
24
|
+
},
|
|
25
|
+
callToWebrtcBNRInProgress: false
|
|
26
|
+
};
|
|
27
|
+
// these 2 hold the resolve, reject methods for the promise we returned to the client in last handleClientRequest() call
|
|
28
|
+
this.pendingPromiseResolve = null;
|
|
29
|
+
this.pendingPromiseReject = null;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* @memberof EffectsState
|
|
34
|
+
* @param {Boolean} [isEnable] true for enableBNR, false for disableBNR request
|
|
35
|
+
* @param {Object} [meeting] the meeting object
|
|
36
|
+
* @returns {Promise}
|
|
37
|
+
*/
|
|
38
|
+
async handleClientRequest(isEnable, meeting) {
|
|
39
|
+
return new Promise((resolve, reject) => {
|
|
40
|
+
if (this.pendingPromiseResolve) {
|
|
41
|
+
// resolve the last promise we returned to the client as the client has issued a new request that has superseded the previous one
|
|
42
|
+
this.pendingPromiseResolve();
|
|
43
|
+
}
|
|
44
|
+
this.pendingPromiseResolve = resolve;
|
|
45
|
+
this.pendingPromiseReject = reject;
|
|
46
|
+
|
|
47
|
+
if (isEnable) this.enableBNR(meeting);
|
|
48
|
+
else this.disableBNR(meeting);
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Internal API to return status of BNR
|
|
54
|
+
* @memberof EffectsState
|
|
55
|
+
* @returns {Boolean}
|
|
56
|
+
* @public
|
|
57
|
+
* @memberof Meeting
|
|
58
|
+
*/
|
|
59
|
+
isBnrEnabled() {
|
|
60
|
+
return this.state.bnr.enabled === BNR_STATUS.ENABLED;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
resolvePromise() {
|
|
64
|
+
if (this.pendingPromiseResolve) {
|
|
65
|
+
this.pendingPromiseResolve(true);
|
|
66
|
+
}
|
|
67
|
+
this.pendingPromiseResolve = null;
|
|
68
|
+
this.pendingPromiseReject = null;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
rejectPromise(e) {
|
|
72
|
+
if (this.pendingPromiseReject) {
|
|
73
|
+
this.pendingPromiseReject(e);
|
|
74
|
+
}
|
|
75
|
+
this.pendingPromiseResolve = null;
|
|
76
|
+
this.pendingPromiseReject = null;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* enableBNR API
|
|
81
|
+
* @param {Object} meeting the meeting object
|
|
82
|
+
* @returns {Promise<Boolean>}
|
|
83
|
+
* @public
|
|
84
|
+
* @memberof EffectsState
|
|
85
|
+
*/
|
|
86
|
+
async enableBNR(meeting) {
|
|
87
|
+
LoggerProxy.logger.info('Meeting:effectState#enableBNR. Enable BNR called');
|
|
88
|
+
|
|
89
|
+
if (this.isBnrEnabled()) {
|
|
90
|
+
LoggerProxy.logger.warn('Meeting:index#enableBNR. BNR is already enabled');
|
|
91
|
+
|
|
92
|
+
return this.resolvePromise();
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
if (this.state.callToWebrtcBNRInProgress) {
|
|
96
|
+
LoggerProxy.logger.warn('Meeting:effectState#enableBNR. Call to WebRTC in progress, we need to wait for it to complete');
|
|
97
|
+
|
|
98
|
+
return this.resolvePromise();
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
const {bnr} = this.state;
|
|
102
|
+
|
|
103
|
+
try {
|
|
104
|
+
bnr.enabled = BNR_STATUS.SHOULD_ENABLE;
|
|
105
|
+
this.state.callToWebrtcBNRInProgress = true;
|
|
106
|
+
const audioStream = MediaUtil.createMediaStream([meeting.mediaProperties.audioTrack]);
|
|
107
|
+
|
|
108
|
+
LoggerProxy.logger.info('Meeting:effectState#enableBNR. MediaStream created from meeting & sent to updateAudio');
|
|
109
|
+
await meeting.updateAudio({
|
|
110
|
+
sendAudio: true,
|
|
111
|
+
receiveAudio: meeting.mediaProperties.mediaDirection.receiveAudio,
|
|
112
|
+
stream: audioStream,
|
|
113
|
+
bnrEnabled: bnr.enabled
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
LoggerProxy.logger.info('Meeting:effectState#enableBNR. Updated meeting audio with bnr enabled track');
|
|
117
|
+
bnr.enabled = BNR_STATUS.ENABLED;
|
|
118
|
+
this.state.callToWebrtcBNRInProgress = false;
|
|
119
|
+
Metrics.sendBehavioralMetric(
|
|
120
|
+
BEHAVIORAL_METRICS.ENABLE_BNR_SUCCESS,
|
|
121
|
+
);
|
|
122
|
+
}
|
|
123
|
+
catch (error) {
|
|
124
|
+
bnr.enabled = BNR_STATUS.NOT_ENABLED;
|
|
125
|
+
this.state.callToWebrtcBNRInProgress = false;
|
|
126
|
+
LoggerProxy.logger.error('Meeting:index#enableBNR.', error);
|
|
127
|
+
|
|
128
|
+
Metrics.sendBehavioralMetric(
|
|
129
|
+
BEHAVIORAL_METRICS.ENABLE_BNR_FAILURE,
|
|
130
|
+
{
|
|
131
|
+
reason: error.message,
|
|
132
|
+
stack: error.stack
|
|
133
|
+
}
|
|
134
|
+
);
|
|
135
|
+
this.rejectPromise(error);
|
|
136
|
+
|
|
137
|
+
throw error;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
return this.resolvePromise();
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* disableBNR API
|
|
145
|
+
* @param {Object} meeting the meeting object
|
|
146
|
+
* @returns {Promise<Boolean>}
|
|
147
|
+
* @public
|
|
148
|
+
* @memberof EffectsState
|
|
149
|
+
*/
|
|
150
|
+
async disableBNR(meeting) {
|
|
151
|
+
LoggerProxy.logger.info('Meeting:effectState#disableBNR. Disable BNR called');
|
|
152
|
+
|
|
153
|
+
const {bnr} = this.state;
|
|
154
|
+
|
|
155
|
+
try {
|
|
156
|
+
if (this.state.callToWebrtcBNRInProgress) {
|
|
157
|
+
LoggerProxy.logger.info('Meeting:effectState#disableBNR. Call to WebRTC in progress, we need to wait for it to complete');
|
|
158
|
+
|
|
159
|
+
return this.resolvePromise();
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
bnr.enabled = BNR_STATUS.SHOULD_DISABLE;
|
|
163
|
+
this.state.callToWebrtcBNRInProgress = true;
|
|
164
|
+
|
|
165
|
+
const audioTrack = WebRTCMedia.Effects.BNR.disableBNR(meeting.mediaProperties.audioTrack);
|
|
166
|
+
|
|
167
|
+
const audioStream = MediaUtil.createMediaStream([audioTrack]);
|
|
168
|
+
|
|
169
|
+
LoggerProxy.logger.info('Meeting:effectState#disableBNR. Raw media track obtained from WebRTC & sent to updateAudio');
|
|
170
|
+
|
|
171
|
+
await meeting.updateAudio({
|
|
172
|
+
sendAudio: true,
|
|
173
|
+
receiveAudio: meeting.mediaProperties.mediaDirection.receiveAudio,
|
|
174
|
+
stream: audioStream
|
|
175
|
+
});
|
|
176
|
+
|
|
177
|
+
bnr.enabled = BNR_STATUS.NOT_ENABLED;
|
|
178
|
+
|
|
179
|
+
this.state.callToWebrtcBNRInProgress = false;
|
|
180
|
+
|
|
181
|
+
Metrics.sendBehavioralMetric(
|
|
182
|
+
BEHAVIORAL_METRICS.DISABLE_BNR_SUCCESS
|
|
183
|
+
);
|
|
184
|
+
}
|
|
185
|
+
catch (error) {
|
|
186
|
+
bnr.enabled = BNR_STATUS.ENABLED;
|
|
187
|
+
this.state.callToWebrtcBNRInProgress = false;
|
|
188
|
+
LoggerProxy.logger.error(`Meeting:index#disableBNR. ${error}`);
|
|
189
|
+
|
|
190
|
+
Metrics.sendBehavioralMetric(
|
|
191
|
+
BEHAVIORAL_METRICS.DISABLE_BNR_FAILURE,
|
|
192
|
+
{
|
|
193
|
+
reason: error.message,
|
|
194
|
+
stack: error.stack
|
|
195
|
+
}
|
|
196
|
+
);
|
|
197
|
+
this.rejectPromise(error);
|
|
198
|
+
|
|
199
|
+
throw error;
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
return this.resolvePromise();
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
export default createEffectsState;
|
package/src/meeting/index.js
CHANGED
|
@@ -16,6 +16,7 @@ import Media from '../media';
|
|
|
16
16
|
import MediaProperties from '../media/properties';
|
|
17
17
|
import MeetingStateMachine from '../meeting/state';
|
|
18
18
|
import createMuteState from '../meeting/muteState';
|
|
19
|
+
import createEffectsState from '../meeting/effectsState';
|
|
19
20
|
import LocusInfo from '../locus-info';
|
|
20
21
|
import PeerConnectionManager from '../peer-connection-manager';
|
|
21
22
|
import Metrics from '../metrics';
|
|
@@ -72,6 +73,7 @@ import {
|
|
|
72
73
|
STATS,
|
|
73
74
|
VIDEO_RESOLUTIONS,
|
|
74
75
|
VIDEO,
|
|
76
|
+
BNR_STATUS,
|
|
75
77
|
HTTP_VERBS
|
|
76
78
|
} from '../constants';
|
|
77
79
|
import BEHAVIORAL_METRICS from '../metrics/constants';
|
|
@@ -530,6 +532,14 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
530
532
|
* @memberof Meeting
|
|
531
533
|
*/
|
|
532
534
|
this.video = null;
|
|
535
|
+
/**
|
|
536
|
+
* created later
|
|
537
|
+
* @instance
|
|
538
|
+
* @type {EffectsState}
|
|
539
|
+
* @private
|
|
540
|
+
* @memberof Meeting
|
|
541
|
+
*/
|
|
542
|
+
this.effects = null;
|
|
533
543
|
/**
|
|
534
544
|
* @instance
|
|
535
545
|
* @type {MeetingStateMachine}
|
|
@@ -4482,18 +4492,26 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
4482
4492
|
* @public
|
|
4483
4493
|
* @memberof Meeting
|
|
4484
4494
|
*/
|
|
4485
|
-
updateAudio(options) {
|
|
4495
|
+
async updateAudio(options) {
|
|
4486
4496
|
if (!this.canUpdateMedia()) {
|
|
4487
4497
|
return this.enqueueMediaUpdate(MEDIA_UPDATE_TYPE.AUDIO, options);
|
|
4488
4498
|
}
|
|
4489
|
-
const {
|
|
4499
|
+
const {
|
|
4500
|
+
sendAudio, receiveAudio, stream, bnrEnabled
|
|
4501
|
+
} = options;
|
|
4490
4502
|
const {audioTransceiver} = this.mediaProperties.peerConnection;
|
|
4491
|
-
|
|
4503
|
+
let track = MeetingUtil.getTrack(stream).audioTrack;
|
|
4492
4504
|
|
|
4493
4505
|
if (typeof sendAudio !== 'boolean' || typeof receiveAudio !== 'boolean') {
|
|
4494
4506
|
return Promise.reject(new ParameterError('Pass sendAudio and receiveAudio parameter'));
|
|
4495
4507
|
}
|
|
4496
4508
|
|
|
4509
|
+
if (sendAudio && !this.isAudioMuted() && (bnrEnabled === BNR_STATUS.ENABLED || bnrEnabled === BNR_STATUS.SHOULD_ENABLE)) {
|
|
4510
|
+
LoggerProxy.logger.info('Meeting:index#updateAudio. Calling WebRTC enable bnr method');
|
|
4511
|
+
track = await this.internal_enableBNR(track);
|
|
4512
|
+
LoggerProxy.logger.info('Meeting:index#updateAudio. WebRTC enable bnr request completed');
|
|
4513
|
+
}
|
|
4514
|
+
|
|
4497
4515
|
return MeetingUtil.validateOptions({sendAudio, localStream: stream})
|
|
4498
4516
|
.then(() => {
|
|
4499
4517
|
let previousMediaDirection = {};
|
|
@@ -5751,95 +5769,104 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
5751
5769
|
};
|
|
5752
5770
|
|
|
5753
5771
|
/**
|
|
5754
|
-
*
|
|
5755
|
-
* @returns {
|
|
5772
|
+
* Internal API to return status of BNR
|
|
5773
|
+
* @returns {Boolean}
|
|
5756
5774
|
* @public
|
|
5757
5775
|
* @memberof Meeting
|
|
5758
5776
|
*/
|
|
5759
|
-
|
|
5760
|
-
|
|
5761
|
-
|
|
5777
|
+
isBnrEnabled() {
|
|
5778
|
+
return this.effects && this.effects.isBnrEnabled();
|
|
5779
|
+
}
|
|
5762
5780
|
|
|
5781
|
+
/**
|
|
5782
|
+
* Internal API to obtain BNR enabled MediaStream
|
|
5783
|
+
* @returns {Promise<MediaStreamTrack>}
|
|
5784
|
+
* @private
|
|
5785
|
+
* @param {MedaiStreamTrack} audioTrack from updateAudio
|
|
5786
|
+
* @memberof Meeting
|
|
5787
|
+
*/
|
|
5788
|
+
async internal_enableBNR(audioTrack) {
|
|
5763
5789
|
try {
|
|
5764
|
-
|
|
5765
|
-
|
|
5766
|
-
|
|
5767
|
-
|
|
5768
|
-
|
|
5769
|
-
|
|
5770
|
-
LoggerProxy.logger.info('Meeting:index#enableBNR. BNR enabled track obtained from WebRTC & sent to updateAudio');
|
|
5771
|
-
await this.updateAudio({
|
|
5772
|
-
sendAudio: true,
|
|
5773
|
-
receiveAudio: true,
|
|
5774
|
-
stream: audioStream
|
|
5775
|
-
});
|
|
5776
|
-
this.isBnrEnabled = true;
|
|
5777
|
-
isSuccess = true;
|
|
5778
|
-
Metrics.sendBehavioralMetric(
|
|
5779
|
-
BEHAVIORAL_METRICS.ENABLE_BNR_SUCCESS,
|
|
5780
|
-
);
|
|
5790
|
+
LoggerProxy.logger.info('Meeting:index#internal_enableBNR. Internal enable BNR called');
|
|
5791
|
+
const bnrAudioTrack = await WebRTCMedia.Effects.BNR.enableBNR(audioTrack);
|
|
5792
|
+
|
|
5793
|
+
LoggerProxy.logger.info('Meeting:index#internal_enableBNR. BNR enabled track obtained from WebRTC & returned as stream');
|
|
5794
|
+
|
|
5795
|
+
return bnrAudioTrack;
|
|
5781
5796
|
}
|
|
5782
5797
|
catch (error) {
|
|
5783
|
-
LoggerProxy.logger.error(
|
|
5798
|
+
LoggerProxy.logger.error('Meeting:index#internal_enableBNR.', error);
|
|
5799
|
+
throw error;
|
|
5800
|
+
}
|
|
5801
|
+
}
|
|
5784
5802
|
|
|
5785
|
-
|
|
5786
|
-
|
|
5787
|
-
|
|
5788
|
-
|
|
5789
|
-
|
|
5790
|
-
|
|
5791
|
-
|
|
5803
|
+
/**
|
|
5804
|
+
* Enable the audio track with BNR for a meeting
|
|
5805
|
+
* @returns {Promise} resolves the data from enable bnr or rejects if there is no audio or audio is muted
|
|
5806
|
+
* @public
|
|
5807
|
+
* @memberof Meeting
|
|
5808
|
+
*/
|
|
5809
|
+
enableBNR() {
|
|
5810
|
+
if (typeof this.mediaProperties === 'undefined' || typeof this.mediaProperties.audioTrack === 'undefined') {
|
|
5811
|
+
return Promise.reject(new Error("Meeting doesn't have an audioTrack attached"));
|
|
5812
|
+
}
|
|
5792
5813
|
|
|
5793
|
-
|
|
5814
|
+
if (this.isAudioMuted()) {
|
|
5815
|
+
return Promise.reject(new Error('Cannot enable BNR while meeting is muted'));
|
|
5794
5816
|
}
|
|
5795
5817
|
|
|
5796
|
-
|
|
5818
|
+
this.effects = this.effects || createEffectsState('BNR');
|
|
5819
|
+
|
|
5820
|
+
const LOG_HEADER = 'Meeting:index#enableBNR -->';
|
|
5821
|
+
|
|
5822
|
+
return logRequest(this.effects.handleClientRequest(true, this)
|
|
5823
|
+
.then((res) => {
|
|
5824
|
+
LoggerProxy.logger.info('Meeting:index#enableBNR. Enable bnr completed');
|
|
5825
|
+
|
|
5826
|
+
return res;
|
|
5827
|
+
})
|
|
5828
|
+
.catch((error) => {
|
|
5829
|
+
throw error;
|
|
5830
|
+
}),
|
|
5831
|
+
{
|
|
5832
|
+
header: `${LOG_HEADER} enable bnr`,
|
|
5833
|
+
success: `${LOG_HEADER} enable bnr success`,
|
|
5834
|
+
failure: `${LOG_HEADER} enable bnr failure, `
|
|
5835
|
+
});
|
|
5797
5836
|
}
|
|
5798
5837
|
|
|
5799
5838
|
/**
|
|
5800
|
-
*
|
|
5801
|
-
* @returns {Promise
|
|
5839
|
+
* Disable the BNR for an audio track
|
|
5840
|
+
* @returns {Promise} resolves the data from disable bnr or rejects if there is no audio set
|
|
5802
5841
|
* @public
|
|
5803
5842
|
* @memberof Meeting
|
|
5804
5843
|
*/
|
|
5805
|
-
|
|
5806
|
-
|
|
5807
|
-
|
|
5808
|
-
|
|
5809
|
-
try {
|
|
5810
|
-
if (typeof this.mediaProperties === 'undefined' || typeof this.mediaProperties.audioTrack === 'undefined') {
|
|
5811
|
-
throw new Error("Meeting doesn't have an audioTrack attached");
|
|
5812
|
-
}
|
|
5813
|
-
this.mediaProperties.audioTrack = WebRTCMedia.Effects.BNR.disableBNR(this.mediaProperties.audioTrack);
|
|
5814
|
-
const audioStream = MediaUtil.createMediaStream([this.mediaProperties.audioTrack]);
|
|
5815
|
-
|
|
5816
|
-
LoggerProxy.logger.info('Meeting:index#disableBNR. Raw media track obtained from WebRTC & sent to updateAudio');
|
|
5817
|
-
await this.updateAudio({
|
|
5818
|
-
sendAudio: true,
|
|
5819
|
-
receiveAudio: true,
|
|
5820
|
-
stream: audioStream
|
|
5821
|
-
});
|
|
5822
|
-
this.isBnrEnabled = false;
|
|
5823
|
-
isSuccess = true;
|
|
5844
|
+
disableBNR() {
|
|
5845
|
+
if (typeof this.mediaProperties === 'undefined' || typeof this.mediaProperties.audioTrack === 'undefined') {
|
|
5846
|
+
return Promise.reject(new Error("Meeting doesn't have an audioTrack attached"));
|
|
5847
|
+
}
|
|
5824
5848
|
|
|
5825
|
-
|
|
5826
|
-
|
|
5827
|
-
);
|
|
5849
|
+
if (!this.isBnrEnabled()) {
|
|
5850
|
+
return Promise.reject(new Error('Can not disable as BNR is not enabled'));
|
|
5828
5851
|
}
|
|
5829
|
-
catch (error) {
|
|
5830
|
-
LoggerProxy.logger.error(`Meeting:index#disableBNR. ${error}`);
|
|
5831
5852
|
|
|
5832
|
-
|
|
5833
|
-
BEHAVIORAL_METRICS.DISABLE_BNR_FAILURE,
|
|
5834
|
-
{
|
|
5835
|
-
reason: error.message,
|
|
5836
|
-
stack: error.stack
|
|
5837
|
-
}
|
|
5838
|
-
);
|
|
5853
|
+
this.effects = this.effects || createEffectsState('BNR');
|
|
5839
5854
|
|
|
5840
|
-
|
|
5841
|
-
|
|
5855
|
+
const LOG_HEADER = 'Meeting:index#disableBNR -->';
|
|
5856
|
+
|
|
5857
|
+
return logRequest(this.effects.handleClientRequest(false, this)
|
|
5858
|
+
.then((res) => {
|
|
5859
|
+
LoggerProxy.logger.info('Meeting:index#disableBNR. Disable bnr completed');
|
|
5842
5860
|
|
|
5843
|
-
|
|
5861
|
+
return res;
|
|
5862
|
+
})
|
|
5863
|
+
.catch((error) => {
|
|
5864
|
+
throw error;
|
|
5865
|
+
}),
|
|
5866
|
+
{
|
|
5867
|
+
header: `${LOG_HEADER} disable bnr`,
|
|
5868
|
+
success: `${LOG_HEADER} disable bnr success`,
|
|
5869
|
+
failure: `${LOG_HEADER} disable bnr failure, `
|
|
5870
|
+
});
|
|
5844
5871
|
}
|
|
5845
5872
|
}
|
|
@@ -205,10 +205,12 @@ export default class MeetingInfoV2 {
|
|
|
205
205
|
if (directURI) options.directURI = directURI;
|
|
206
206
|
|
|
207
207
|
return this.webex.request(options)
|
|
208
|
-
.then(() => {
|
|
208
|
+
.then((response) => {
|
|
209
209
|
Metrics.sendBehavioralMetric(
|
|
210
210
|
BEHAVIORAL_METRICS.FETCH_MEETING_INFO_V1_SUCCESS
|
|
211
211
|
);
|
|
212
|
+
|
|
213
|
+
return response;
|
|
212
214
|
})
|
|
213
215
|
.catch((err) => {
|
|
214
216
|
if (err?.statusCode === 403) {
|