@webex/plugin-meetings 1.156.4 → 1.158.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/README.md +3 -3
- package/browsers.js +1 -1
- package/dist/index.js +1 -2
- package/dist/index.js.map +1 -1
- package/dist/meeting/index.js +12 -1
- package/dist/meeting/index.js.map +1 -1
- package/dist/meeting-info/meeting-info-v2.js +12 -3
- package/dist/meeting-info/meeting-info-v2.js.map +1 -1
- package/dist/meeting-info/utilv2.js +44 -0
- package/dist/meeting-info/utilv2.js.map +1 -1
- package/dist/meetings/index.js +2 -2
- package/dist/meetings/index.js.map +1 -1
- package/dist/metrics/index.js +8 -1
- package/dist/metrics/index.js.map +1 -1
- package/package.json +5 -5
- package/src/index.js +0 -1
- package/src/meeting/index.js +13 -0
- package/src/meeting-info/meeting-info-v2.js +8 -2
- package/src/meeting-info/utilv2.js +39 -0
- package/src/meetings/index.js +1 -2
- package/src/metrics/index.js +9 -1
- package/test/{unit/spec/transcription/index.js → integration/spec/transcription.js} +1 -1
- package/test/unit/spec/common/browser-detection.js +1 -0
- package/test/unit/spec/locus-info/index.js +1 -1
- package/test/unit/spec/meeting/index.js +49 -3
- package/test/unit/spec/meeting-info/utilv2.js +72 -0
- package/test/unit/spec/meetings/index.js +266 -74
- package/test/unit/spec/members/index.js +1 -0
- package/test/unit/spec/metrics/index.js +7 -26
- package/test/unit/spec/networkQualityMonitor/index.js +1 -0
- package/test/unit/spec/peerconnection-manager/index.js +11 -1
- package/test/unit/spec/personal-meeting-room/personal-meeting-room.js +1 -0
- package/test/unit/spec/reconnection-manager/index.js +1 -0
- package/test/unit/spec/roap/util.js +1 -0
- package/test/unit/spec/stats-analyzer/index.js +1 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["index.js"],"names":["OSMap","OS_NAME","chrome","macOS","MAC","Windows","WINDOWS","iOS","IOS","Android","ANDROID","Linux","LINUX","getOSName","getOSVersion","getBrowserName","getBrowserVersion","anonymizeIPAddress","localIp","triggerTimers","event","meeting","data","eventType","CALL_INITIATED","setStartCallInitiateJoinReq","LOCUS_JOIN_REQUEST","setEndCallInitiateJoinReq","setStartJoinReqResp","LOCUS_JOIN_RESPONSE","setEndJoinReqResp","setStartSetupDelay","mediaType","AUDIO","VIDEO","setStartSendingMediaDelay","RECEIVING_MEDIA_START","setEndSetupDelay","SENDING_MEDIA_START","setEndSendingMediaDelay","LOCAL_SDP_GENERATED","setStartLocalSDPGenRemoteSDPRecvDelay","REMOTE_SDP_RECEIVED","setEndLocalSDPGenRemoteSDPRecvDelay","Metrics","instance","_events","meetingCollection","keys","webex","options","meetingId","indexOf","LoggerProxy","logger","error","get","callEvents","MEDIA_QUALITY","sendMediaQualityAnalyzerMetrics","push","sendCallAnalyzerMetrics","info","identifiers","payload","eventId","uuid","v4","version","origin","name","networkType","userAgent","userAgentToString","clientInfo","clientType","clientVersion","CLIENT_NAME","localNetworkPrefix","meetings","geoHintInfo","clientAddress","osVersion","subClientType","os","getOsName","browser","browserVersion","originTime","triggered","Date","toISOString","senderCountryCode","countryCode","canProceed","eventData","webClientDomain","window","location","hostname","Object","prototype","hasOwnProperty","call","errors","trigger","pstnAudioType","mediaCapabilities","recoveredBy","joinTimes","OTHERS","audioSetupDelay","videoSetupDelay","UNKNOWN","intervals","intervalData","sourceMetadata","applicationSoftwareType","applicationSoftwareVersion","mediaEngineSoftwareType","mediaEngineSoftwareVersion","startTime","err","showToUser","errorCode","body","ERROR_CODE","MEETING_ERRORS","FREE_USER_MAX_PARTICIPANTS_EXCEEDED","PAID_USER_MAX_PARTICIPANTS_EXCEEDED","SERVICE_MAX_PARTICIPANTS_EXCEEDED","INACTIVE","EXCEEDED_MAX_JOINED_PARTICIPANTS","EXCEEDED_SERVICE_MAX_PARTICIPANTS","MEETING_IS_LOCKED","MEETING_IS_TERMINATING","MEETING_REQUIRE_MODERATOR_PIN_INTENT","MEETING_REQUIRE_MODERATOR_PIN","MEETING_REQUIRE_MODERATOR_ROLE","JOIN_RESTRICTED_USER","GET_RESTRICTED_USER","CREATE_MEDIA_RESTRICTED_USER","JOIN_RESTRICTED_USER_NOT_IN_ROOM","MEETING_NOT_FOUND","NOT_WEBEX_SITE","INVALID_JOIN_TIME","PHONE_NUMBER_NOT_A_NUMBER","PHONE_NUMBER_TOO_LONG","INVALID_DIALABLE_KEY","ONE_ON_ONE_TO_SELF_NOT_ALLOWED","REMOVED_PARTICIPANT","MEETING_LINK_NOT_FOUND","PHONE_NUMBER_TOO_SHORT_AFTER_IDD","INVALID_INVITEE_ADDRESS","PMR_ACCOUNT_LOCKED","RESOURCE_GUEST_FORBIDDEN","PMR_ACCOUNT_SUSPENDED","EMPTY_PHONE_NUMBER_OR_COUNTRY_CODE","INVALID_SINCE_OR_SEQUENCE_HASH_IN_REQUEST","CONVERSATION_NOT_FOUND","RECORDING_CONTROL_NOT_SUPPORTED","RECORDING_NOT_STARTED","RECORDING_NOT_ENABLED","generateErrorPayload","LOCUS_RESPONSE","shownToUser","errorPayload","category","errorDescription","fatal","notFatalErrorList","OTHER","errorData","userAgentOption","browserInfo","util","format","metrics","clientName","toLowerCase","split","osInfo","process","env","NODE_ENV","metricName","metricFields","metricTags","internal","submitClientMetrics","type","config","fields","tags"],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\nimport util from 'util';\n\nimport {includes} from 'lodash';\nimport uuid from 'uuid';\nimport window from 'global/window';\nimport anonymize from 'ip-anonymize';\n\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport {MEETING_ERRORS} from '../constants';\nimport BrowserDetection from '../common/browser-detection';\n\nimport {\n error, eventType, errorCodes as ERROR_CODE, OS_NAME, UNKNOWN, CLIENT_NAME,\n mediaType\n} from './config';\n\nconst OSMap = {\n 'Chrome OS': OS_NAME.chrome,\n macOS: OS_NAME.MAC,\n Windows: OS_NAME.WINDOWS,\n iOS: OS_NAME.IOS,\n Android: OS_NAME.ANDROID,\n Linux: OS_NAME.LINUX\n};\n\nconst {\n getOSName,\n getOSVersion,\n getBrowserName,\n getBrowserVersion\n} = BrowserDetection();\n\n// Apply a CIDR /28 format to the IP address\nconst anonymizeIPAddress = (localIp) => anonymize(localIp);\n\nconst triggerTimers = ({event, meeting, data}) => {\n switch (event) {\n case eventType.CALL_INITIATED:\n meeting.setStartCallInitiateJoinReq();\n break;\n case eventType.LOCUS_JOIN_REQUEST:\n meeting.setEndCallInitiateJoinReq();\n meeting.setStartJoinReqResp();\n break;\n case eventType.LOCUS_JOIN_RESPONSE:\n meeting.setEndJoinReqResp();\n meeting.setStartSetupDelay(mediaType.AUDIO);\n meeting.setStartSetupDelay(mediaType.VIDEO);\n meeting.setStartSendingMediaDelay(mediaType.AUDIO);\n meeting.setStartSendingMediaDelay(mediaType.VIDEO);\n break;\n case eventType.RECEIVING_MEDIA_START:\n meeting.setEndSetupDelay(data.mediaType);\n break;\n case eventType.SENDING_MEDIA_START:\n meeting.setEndSendingMediaDelay(data.mediaType);\n break;\n case eventType.LOCAL_SDP_GENERATED:\n meeting.setStartLocalSDPGenRemoteSDPRecvDelay();\n break;\n case eventType.REMOTE_SDP_RECEIVED:\n meeting.setEndLocalSDPGenRemoteSDPRecvDelay();\n break;\n default:\n break;\n }\n};\n\n/**\n * @description Metrics handles all the call metrics events\n * @export\n * @class Metrics\n */\nclass Metrics {\n /**\n * Create Metrics Object\n * @constructor\n * @public\n * @memberof Meetings\n */\n constructor() {\n if (!Metrics.instance) {\n /**\n * @instance\n * @type {Array}\n * @private\n * @memberof Metrics\n */\n this._events = [];\n /**\n * @instance\n * @type {MeetingCollection}\n * @private\n * @memberof Metrics\n */\n this.meetingCollection = null;\n /**\n * @instance\n * @type {MeetingCollection}\n * @private\n * @memberof Metrics\n */\n this.keys = Object.values(eventType);\n /**\n * @instance\n * @type {Metrics}\n * @private\n * @memberof Metrics\n */\n Metrics.instance = this;\n }\n\n return Metrics.instance;\n }\n\n /**\n * Initializes the Metrics singleton with a meeting Collection.\n *\n * @param {Object} meetingCollection meetings object\n * @param {Object} webex webex SDK object\n *\n * @returns {void}\n */\n initialSetup(meetingCollection, webex) {\n this.meetingCollection = meetingCollection;\n this.webex = webex;\n }\n\n /**\n * poste Meeting event metrics\n * @param {object} options {meetingId/meeting} as a json object\n * @param {Meeting} options.meeting Meeting object\n * @param {String} options.meetingId\n * @param {object} options.data\n * @param {object} options.event\n * @returns {object} null\n */\n postEvent(options) {\n const {meetingId, data = {}, event} = options;\n let {meeting} = options;\n\n if (this.keys.indexOf(event) === -1) {\n LoggerProxy.logger.error(`Metrics:index#postEvent --> Event ${event} doesn't exist in dictionary`);\n }\n\n if (!meeting && meetingId) {\n meeting = this.meetingCollection.get(meetingId);\n options.meeting = meeting;\n }\n\n if (meeting) {\n triggerTimers(options);\n\n if (!meeting.callEvents) {\n meeting.callEvents = [];\n }\n if (event === eventType.MEDIA_QUALITY) {\n data.event = event;\n meeting.sendMediaQualityAnalyzerMetrics(data);\n }\n else {\n meeting.callEvents.push(event);\n data.event = event;\n meeting.sendCallAnalyzerMetrics(data);\n }\n }\n\n else {\n LoggerProxy.logger.info(`Metrics:index#postEvent --> Event received for meetingId:${meetingId}, but meeting not found in collection.`);\n }\n }\n\n /**\n * Docs for Call analyzer metrics\n * https://sqbu-github.cisco.com/WebExSquared/call-analyzer/wiki\n * https://sqbu-github.cisco.com/WebExSquared/event-dictionary/blob/master/diagnostic-events.raml\n */\n\n initPayload(eventType, identifiers, options) {\n const payload = {\n eventId: uuid.v4(),\n version: 1,\n origin: {\n name: 'endpoint',\n networkType: 'unknown',\n userAgent: this.userAgentToString(),\n clientInfo: {\n clientType: options.clientType,\n clientVersion: `${CLIENT_NAME}/${this.webex.version}`,\n localNetworkPrefix: anonymizeIPAddress(this.webex.meetings.geoHintInfo?.clientAddress),\n osVersion: getOSVersion() || 'unknown',\n subClientType: options.subClientType,\n os: this.getOsName(),\n browser: getBrowserName(),\n browserVersion: getBrowserVersion()\n }\n },\n originTime: {\n triggered: new Date().toISOString()\n },\n senderCountryCode: this.webex.meetings.geoHintInfo?.countryCode,\n event: {\n name: eventType,\n canProceed: true,\n identifiers,\n eventData: {webClientDomain: window.location.hostname}\n }\n };\n\n // TODO: more options should be checked and some of them should be mandatory in certain conditions\n if (options) {\n if (Object.prototype.hasOwnProperty.call(options, 'canProceed')) {\n payload.event.canProceed = options.canProceed;\n }\n if (options.errors) {\n payload.event.errors = options.errors;\n }\n if (options.mediaType) {\n payload.event.mediaType = options.mediaType;\n }\n if (options.trigger) {\n payload.event.trigger = options.trigger;\n }\n if (options.pstnAudioType) {\n payload.event.pstnAudioType = options.pstnAudioType;\n }\n if (options.mediaCapabilities) {\n payload.event.mediaCapabilities = options.mediaCapabilities;\n }\n if (options.recoveredBy) {\n payload.event.recoveredBy = options.recoveredBy;\n }\n if (options.joinTimes) {\n payload.event.joinTimes = options.joinTimes;\n }\n }\n\n return payload;\n }\n\n /**\n * returns metrics friendly OS versions\n * @param {String} osName Os name\n * @returns {String}\n * @private\n * @memberof Metrics\n */\n getOsName() {\n return OSMap[getOSName()] ?? OS_NAME.OTHERS;\n }\n\n /**\n * get the payload specific for a media quality event through call analyzer\n * @param {String} eventType the event name\n * @param {Object} identifiers contains the identifiers needed for CA\n * @param {String} identifiers.correlationId\n * @param {String} identifiers.locusUrl\n * @param {String} identifiers.locusId\n * @param {Object} options\n * @param {Object} options.intervalData\n * @param {String} options.clientType\n * @returns {Object}\n * @public\n * @memberof Metrics\n */\n initMediaPayload(eventType, identifiers, options = {}) {\n const {audioSetupDelay, videoSetupDelay, joinTimes} = options;\n\n const payload = {\n eventId: uuid.v4(),\n version: 1,\n origin: {\n audioSetupDelay,\n videoSetupDelay,\n name: 'endpoint',\n networkType: options.networkType || UNKNOWN,\n userAgent: this.userAgentToString(),\n clientInfo: {\n clientType: options.clientType, // TODO: Only clientType: 'TEAMS_CLIENT' is whitelisted\n clientVersion: `${CLIENT_NAME}/${this.webex.version}`,\n localNetworkPrefix: anonymizeIPAddress(this.webex.meetings.geoHintInfo?.clientAddress),\n os: this.getOsName(),\n osVersion: getOSVersion() || UNKNOWN,\n subClientType: options.subClientType,\n browser: getBrowserName(),\n browserVersion: getBrowserVersion()\n }\n },\n originTime: {\n triggered: new Date().toISOString()\n },\n senderCountryCode: this.webex.meetings.geoHintInfo?.countryCode,\n event: {\n name: eventType,\n canProceed: true,\n identifiers,\n intervals: [options.intervalData],\n joinTimes,\n eventData: {\n webClientDomain: window.location.hostname\n },\n sourceMetadata: {\n applicationSoftwareType: CLIENT_NAME,\n applicationSoftwareVersion: this.webex.version,\n mediaEngineSoftwareType: getBrowserName() || 'browser',\n mediaEngineSoftwareVersion: getOSVersion() || UNKNOWN,\n startTime: new Date().toISOString()\n }\n }\n };\n\n return payload;\n }\n\n /**\n * This function Parses a Locus error and returns a diagnostic event payload.\n * It should keep updating from:\n * https://sqbu-github.cisco.com/WebExSquared/spark-client-framework/blob/master/spark-client-framework/Adapters/TelephonyAdapter/TelephonyAdapter.cpp#L920\n *\n * @param {Object} err the error Object from Locus response\n * @param {boolean} showToUser true if a toast is shown to user\n * @returns {{showToUser: boolean, category: string, errorDescription: string,\n * errorCode: number, errorData: *, fatal: boolean, name: string}}\n */\n parseLocusError(err, showToUser) {\n let errorCode;\n\n if (err && err.body && err.body.errorCode) {\n switch (ERROR_CODE[err.body.errorCode]) {\n case MEETING_ERRORS.FREE_USER_MAX_PARTICIPANTS_EXCEEDED:\n errorCode = 3007;\n break;\n case MEETING_ERRORS.PAID_USER_MAX_PARTICIPANTS_EXCEEDED:\n case MEETING_ERRORS.SERVICE_MAX_PARTICIPANTS_EXCEEDED:\n errorCode = 3002;\n break;\n case MEETING_ERRORS.INACTIVE:\n errorCode = 4001;\n break;\n case MEETING_ERRORS.EXCEEDED_MAX_JOINED_PARTICIPANTS:\n case MEETING_ERRORS.EXCEEDED_SERVICE_MAX_PARTICIPANTS:\n errorCode = 3001;\n break;\n case MEETING_ERRORS.MEETING_IS_LOCKED:\n errorCode = 4002;\n break;\n case MEETING_ERRORS.MEETING_IS_TERMINATING:\n errorCode = 4003;\n break;\n case MEETING_ERRORS.MEETING_REQUIRE_MODERATOR_PIN_INTENT:\n errorCode = 4004;\n break;\n case MEETING_ERRORS.MEETING_REQUIRE_MODERATOR_PIN:\n errorCode = 4005;\n break;\n case MEETING_ERRORS.MEETING_REQUIRE_MODERATOR_ROLE:\n errorCode = 4006;\n break;\n case MEETING_ERRORS.JOIN_RESTRICTED_USER:\n case MEETING_ERRORS.GET_RESTRICTED_USER:\n case MEETING_ERRORS.CREATE_MEDIA_RESTRICTED_USER:\n errorCode = 3005;\n break;\n case MEETING_ERRORS.JOIN_RESTRICTED_USER_NOT_IN_ROOM:\n errorCode = 4007;\n break;\n case MEETING_ERRORS.MEETING_NOT_FOUND:\n errorCode = 4011;\n break;\n case MEETING_ERRORS.NOT_WEBEX_SITE:\n errorCode = 4012;\n break;\n case MEETING_ERRORS.INVALID_JOIN_TIME:\n errorCode = 4013;\n break;\n case MEETING_ERRORS.PHONE_NUMBER_NOT_A_NUMBER:\n errorCode = 4016;\n break;\n case MEETING_ERRORS.PHONE_NUMBER_TOO_LONG:\n errorCode = 4017;\n break;\n case MEETING_ERRORS.INVALID_DIALABLE_KEY:\n errorCode = 4018;\n break;\n case MEETING_ERRORS.ONE_ON_ONE_TO_SELF_NOT_ALLOWED:\n errorCode = 4019;\n break;\n case MEETING_ERRORS.REMOVED_PARTICIPANT:\n errorCode = 4020;\n break;\n case MEETING_ERRORS.MEETING_LINK_NOT_FOUND:\n errorCode = 4021;\n break;\n case MEETING_ERRORS.PHONE_NUMBER_TOO_SHORT_AFTER_IDD:\n errorCode = 4022;\n break;\n case MEETING_ERRORS.INVALID_INVITEE_ADDRESS:\n errorCode = 4023;\n break;\n case MEETING_ERRORS.PMR_ACCOUNT_LOCKED:\n errorCode = 4024;\n break;\n case MEETING_ERRORS.RESOURCE_GUEST_FORBIDDEN:\n errorCode = 4025;\n break;\n case MEETING_ERRORS.PMR_ACCOUNT_SUSPENDED:\n errorCode = 4026;\n break;\n case MEETING_ERRORS.EMPTY_PHONE_NUMBER_OR_COUNTRY_CODE:\n errorCode = 4027;\n break;\n case MEETING_ERRORS.INVALID_SINCE_OR_SEQUENCE_HASH_IN_REQUEST:\n errorCode = 1006;\n break;\n case MEETING_ERRORS.CONVERSATION_NOT_FOUND:\n errorCode = 4028;\n break;\n case MEETING_ERRORS.RECORDING_CONTROL_NOT_SUPPORTED:\n case MEETING_ERRORS.RECORDING_NOT_STARTED:\n case MEETING_ERRORS.RECORDING_NOT_ENABLED:\n errorCode = 4029;\n break;\n default:\n errorCode = 4008;\n }\n }\n else {\n errorCode = 4008;\n }\n\n return this.generateErrorPayload(\n errorCode, showToUser, error.name.LOCUS_RESPONSE, err\n );\n }\n\n\n generateErrorPayload(errorCode, shownToUser, name, err) {\n if (error.errors[errorCode]) {\n const errorPayload = {\n shownToUser: shownToUser || false,\n category: error.errors[errorCode][2],\n errorDescription: error.errors[errorCode][0],\n errorCode,\n fatal: !includes(error.notFatalErrorList, errorCode),\n name: name || error.name.OTHER\n };\n\n if (err && err.body) {\n errorPayload.errorData = err.body;\n }\n\n return errorPayload;\n }\n\n return null;\n }\n\n /**\n * Returns a formated string of the user agent.\n *\n * @returns {string} formatted user agent information\n */\n userAgentToString() {\n let userAgentOption;\n let browserInfo;\n const clientInfo = util.format('client=%s', `${this.webex.meetings?.metrics?.clientName}`);\n\n if (['chrome', 'firefox', 'msie', 'msedge', 'safari'].indexOf(getBrowserName().toLowerCase()) !== -1) {\n browserInfo = util.format('browser=%s', `${getBrowserName().toLowerCase()}/${getBrowserVersion().split('.')[0]}`);\n }\n const osInfo = util.format('os=%s', `${getOSName()}/${getOSVersion().split('.')[0]}`);\n\n if (browserInfo) {\n userAgentOption = `(${browserInfo}`;\n }\n if (osInfo) {\n userAgentOption = userAgentOption ? `${userAgentOption}; ${clientInfo}; ${osInfo}` : `${clientInfo}; (${osInfo}`;\n }\n if (userAgentOption) {\n userAgentOption += ')';\n\n return util.format('webex-js-sdk/%s %s', `${process.env.NODE_ENV}-${this.webex.version}`, userAgentOption);\n }\n\n return util.format('webex-js-sdk/%s', `${process.env.NODE_ENV}-${this.webex.version}`);\n }\n\n /**\n * Uploads given metric to the Metrics service as an Behavioral metric.\n * Metadata about the environment such as browser, OS, SDK and their versions\n * are automatically added when the metric is sent.\n *\n * The Metrics service will send an Behavioral metric to InfluxDB for\n * aggregation.\n * See https://confluence-eng-gpk2.cisco.com/conf/display/WBXT/Getting+started+with+Metrics+Service.\n *\n * @param {string} metricName Name of the metric (measurement) to send\n * @param {Object} metricFields Key-valye pairs of data or values about this metric\n * @param {Object} metricTags Key-value pairs of metric metadata\n *\n * @returns {void}\n */\n sendBehavioralMetric(metricName, metricFields = {}, metricTags = {}) {\n this.webex.internal.metrics.submitClientMetrics(metricName, {\n type: this.webex.config.metrics.type,\n fields: metricFields,\n tags: metricTags\n });\n }\n}\n\n// Export Metrics singleton ---------------------------------------------------\nconst instance = new Metrics();\n\nexport default instance;\n"]}
|
|
1
|
+
{"version":3,"sources":["index.js"],"names":["OSMap","OS_NAME","chrome","macOS","MAC","Windows","WINDOWS","iOS","IOS","Android","ANDROID","Linux","LINUX","getOSName","getOSVersion","getBrowserName","getBrowserVersion","anonymizeIPAddress","localIp","triggerTimers","event","meeting","data","eventType","CALL_INITIATED","setStartCallInitiateJoinReq","LOCUS_JOIN_REQUEST","setEndCallInitiateJoinReq","setStartJoinReqResp","LOCUS_JOIN_RESPONSE","setEndJoinReqResp","setStartSetupDelay","mediaType","AUDIO","VIDEO","setStartSendingMediaDelay","RECEIVING_MEDIA_START","setEndSetupDelay","SENDING_MEDIA_START","setEndSendingMediaDelay","LOCAL_SDP_GENERATED","setStartLocalSDPGenRemoteSDPRecvDelay","REMOTE_SDP_RECEIVED","setEndLocalSDPGenRemoteSDPRecvDelay","Metrics","instance","_events","meetingCollection","keys","webex","options","meetingId","indexOf","LoggerProxy","logger","error","get","callEvents","MEDIA_QUALITY","sendMediaQualityAnalyzerMetrics","push","sendCallAnalyzerMetrics","info","identifiers","payload","eventId","uuid","v4","version","origin","name","networkType","userAgent","userAgentToString","clientInfo","clientType","clientVersion","CLIENT_NAME","localNetworkPrefix","meetings","geoHintInfo","clientAddress","osVersion","subClientType","os","getOsName","browser","browserVersion","originTime","triggered","Date","toISOString","senderCountryCode","countryCode","canProceed","eventData","webClientDomain","window","location","hostname","Object","prototype","hasOwnProperty","call","errors","trigger","pstnAudioType","mediaCapabilities","recoveredBy","joinTimes","OTHERS","audioSetupDelay","videoSetupDelay","UNKNOWN","intervals","intervalData","sourceMetadata","applicationSoftwareType","applicationSoftwareVersion","mediaEngineSoftwareType","mediaEngineSoftwareVersion","startTime","err","showToUser","errorCode","statusCode","body","ERROR_CODE","MEETING_ERRORS","FREE_USER_MAX_PARTICIPANTS_EXCEEDED","PAID_USER_MAX_PARTICIPANTS_EXCEEDED","SERVICE_MAX_PARTICIPANTS_EXCEEDED","INACTIVE","EXCEEDED_MAX_JOINED_PARTICIPANTS","EXCEEDED_SERVICE_MAX_PARTICIPANTS","MEETING_IS_LOCKED","MEETING_IS_TERMINATING","MEETING_REQUIRE_MODERATOR_PIN_INTENT","MEETING_REQUIRE_MODERATOR_PIN","MEETING_REQUIRE_MODERATOR_ROLE","JOIN_RESTRICTED_USER","GET_RESTRICTED_USER","CREATE_MEDIA_RESTRICTED_USER","JOIN_RESTRICTED_USER_NOT_IN_ROOM","MEETING_NOT_FOUND","NOT_WEBEX_SITE","INVALID_JOIN_TIME","PHONE_NUMBER_NOT_A_NUMBER","PHONE_NUMBER_TOO_LONG","INVALID_DIALABLE_KEY","ONE_ON_ONE_TO_SELF_NOT_ALLOWED","REMOVED_PARTICIPANT","MEETING_LINK_NOT_FOUND","PHONE_NUMBER_TOO_SHORT_AFTER_IDD","INVALID_INVITEE_ADDRESS","PMR_ACCOUNT_LOCKED","RESOURCE_GUEST_FORBIDDEN","PMR_ACCOUNT_SUSPENDED","EMPTY_PHONE_NUMBER_OR_COUNTRY_CODE","INVALID_SINCE_OR_SEQUENCE_HASH_IN_REQUEST","CONVERSATION_NOT_FOUND","RECORDING_CONTROL_NOT_SUPPORTED","RECORDING_NOT_STARTED","RECORDING_NOT_ENABLED","generateErrorPayload","LOCUS_RESPONSE","shownToUser","errorPayload","category","errorDescription","fatal","notFatalErrorList","OTHER","errorData","httpCode","userAgentOption","browserInfo","util","format","metrics","clientName","toLowerCase","split","osInfo","process","env","NODE_ENV","metricName","metricFields","metricTags","internal","submitClientMetrics","type","config","fields","tags"],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\nimport util from 'util';\n\nimport {includes} from 'lodash';\nimport uuid from 'uuid';\nimport window from 'global/window';\nimport anonymize from 'ip-anonymize';\n\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport {MEETING_ERRORS} from '../constants';\nimport BrowserDetection from '../common/browser-detection';\n\nimport {\n error, eventType, errorCodes as ERROR_CODE, OS_NAME, UNKNOWN, CLIENT_NAME,\n mediaType\n} from './config';\n\nconst OSMap = {\n 'Chrome OS': OS_NAME.chrome,\n macOS: OS_NAME.MAC,\n Windows: OS_NAME.WINDOWS,\n iOS: OS_NAME.IOS,\n Android: OS_NAME.ANDROID,\n Linux: OS_NAME.LINUX\n};\n\nconst {\n getOSName,\n getOSVersion,\n getBrowserName,\n getBrowserVersion\n} = BrowserDetection();\n\n// Apply a CIDR /28 format to the IP address\nconst anonymizeIPAddress = (localIp) => anonymize(localIp);\n\nconst triggerTimers = ({event, meeting, data}) => {\n switch (event) {\n case eventType.CALL_INITIATED:\n meeting.setStartCallInitiateJoinReq();\n break;\n case eventType.LOCUS_JOIN_REQUEST:\n meeting.setEndCallInitiateJoinReq();\n meeting.setStartJoinReqResp();\n break;\n case eventType.LOCUS_JOIN_RESPONSE:\n meeting.setEndJoinReqResp();\n meeting.setStartSetupDelay(mediaType.AUDIO);\n meeting.setStartSetupDelay(mediaType.VIDEO);\n meeting.setStartSendingMediaDelay(mediaType.AUDIO);\n meeting.setStartSendingMediaDelay(mediaType.VIDEO);\n break;\n case eventType.RECEIVING_MEDIA_START:\n meeting.setEndSetupDelay(data.mediaType);\n break;\n case eventType.SENDING_MEDIA_START:\n meeting.setEndSendingMediaDelay(data.mediaType);\n break;\n case eventType.LOCAL_SDP_GENERATED:\n meeting.setStartLocalSDPGenRemoteSDPRecvDelay();\n break;\n case eventType.REMOTE_SDP_RECEIVED:\n meeting.setEndLocalSDPGenRemoteSDPRecvDelay();\n break;\n default:\n break;\n }\n};\n\n/**\n * @description Metrics handles all the call metrics events\n * @export\n * @class Metrics\n */\nclass Metrics {\n /**\n * Create Metrics Object\n * @constructor\n * @public\n * @memberof Meetings\n */\n constructor() {\n if (!Metrics.instance) {\n /**\n * @instance\n * @type {Array}\n * @private\n * @memberof Metrics\n */\n this._events = [];\n /**\n * @instance\n * @type {MeetingCollection}\n * @private\n * @memberof Metrics\n */\n this.meetingCollection = null;\n /**\n * @instance\n * @type {MeetingCollection}\n * @private\n * @memberof Metrics\n */\n this.keys = Object.values(eventType);\n /**\n * @instance\n * @type {Metrics}\n * @private\n * @memberof Metrics\n */\n Metrics.instance = this;\n }\n\n return Metrics.instance;\n }\n\n /**\n * Initializes the Metrics singleton with a meeting Collection.\n *\n * @param {Object} meetingCollection meetings object\n * @param {Object} webex webex SDK object\n *\n * @returns {void}\n */\n initialSetup(meetingCollection, webex) {\n this.meetingCollection = meetingCollection;\n this.webex = webex;\n }\n\n /**\n * poste Meeting event metrics\n * @param {object} options {meetingId/meeting} as a json object\n * @param {Meeting} options.meeting Meeting object\n * @param {String} options.meetingId\n * @param {object} options.data\n * @param {object} options.event\n * @returns {object} null\n */\n postEvent(options) {\n const {meetingId, data = {}, event} = options;\n let {meeting} = options;\n\n if (this.keys.indexOf(event) === -1) {\n LoggerProxy.logger.error(`Metrics:index#postEvent --> Event ${event} doesn't exist in dictionary`);\n }\n\n if (!meeting && meetingId) {\n meeting = this.meetingCollection.get(meetingId);\n options.meeting = meeting;\n }\n\n if (meeting) {\n triggerTimers(options);\n\n if (!meeting.callEvents) {\n meeting.callEvents = [];\n }\n if (event === eventType.MEDIA_QUALITY) {\n data.event = event;\n meeting.sendMediaQualityAnalyzerMetrics(data);\n }\n else {\n meeting.callEvents.push(event);\n data.event = event;\n meeting.sendCallAnalyzerMetrics(data);\n }\n }\n\n else {\n LoggerProxy.logger.info(`Metrics:index#postEvent --> Event received for meetingId:${meetingId}, but meeting not found in collection.`);\n }\n }\n\n /**\n * Docs for Call analyzer metrics\n * https://sqbu-github.cisco.com/WebExSquared/call-analyzer/wiki\n * https://sqbu-github.cisco.com/WebExSquared/event-dictionary/blob/master/diagnostic-events.raml\n */\n\n initPayload(eventType, identifiers, options) {\n const payload = {\n eventId: uuid.v4(),\n version: 1,\n origin: {\n name: 'endpoint',\n networkType: 'unknown',\n userAgent: this.userAgentToString(),\n clientInfo: {\n clientType: options.clientType,\n clientVersion: `${CLIENT_NAME}/${this.webex.version}`,\n localNetworkPrefix: anonymizeIPAddress(this.webex.meetings.geoHintInfo?.clientAddress),\n osVersion: getOSVersion() || 'unknown',\n subClientType: options.subClientType,\n os: this.getOsName(),\n browser: getBrowserName(),\n browserVersion: getBrowserVersion()\n }\n },\n originTime: {\n triggered: new Date().toISOString()\n },\n senderCountryCode: this.webex.meetings.geoHintInfo?.countryCode,\n event: {\n name: eventType,\n canProceed: true,\n identifiers,\n eventData: {webClientDomain: window.location.hostname}\n }\n };\n\n // TODO: more options should be checked and some of them should be mandatory in certain conditions\n if (options) {\n if (Object.prototype.hasOwnProperty.call(options, 'canProceed')) {\n payload.event.canProceed = options.canProceed;\n }\n if (options.errors) {\n payload.event.errors = options.errors;\n }\n if (options.mediaType) {\n payload.event.mediaType = options.mediaType;\n }\n if (options.trigger) {\n payload.event.trigger = options.trigger;\n }\n if (options.pstnAudioType) {\n payload.event.pstnAudioType = options.pstnAudioType;\n }\n if (options.mediaCapabilities) {\n payload.event.mediaCapabilities = options.mediaCapabilities;\n }\n if (options.recoveredBy) {\n payload.event.recoveredBy = options.recoveredBy;\n }\n if (options.joinTimes) {\n payload.event.joinTimes = options.joinTimes;\n }\n }\n\n return payload;\n }\n\n /**\n * returns metrics friendly OS versions\n * @param {String} osName Os name\n * @returns {String}\n * @private\n * @memberof Metrics\n */\n getOsName() {\n return OSMap[getOSName()] ?? OS_NAME.OTHERS;\n }\n\n /**\n * get the payload specific for a media quality event through call analyzer\n * @param {String} eventType the event name\n * @param {Object} identifiers contains the identifiers needed for CA\n * @param {String} identifiers.correlationId\n * @param {String} identifiers.locusUrl\n * @param {String} identifiers.locusId\n * @param {Object} options\n * @param {Object} options.intervalData\n * @param {String} options.clientType\n * @returns {Object}\n * @public\n * @memberof Metrics\n */\n initMediaPayload(eventType, identifiers, options = {}) {\n const {audioSetupDelay, videoSetupDelay, joinTimes} = options;\n\n const payload = {\n eventId: uuid.v4(),\n version: 1,\n origin: {\n audioSetupDelay,\n videoSetupDelay,\n name: 'endpoint',\n networkType: options.networkType || UNKNOWN,\n userAgent: this.userAgentToString(),\n clientInfo: {\n clientType: options.clientType, // TODO: Only clientType: 'TEAMS_CLIENT' is whitelisted\n clientVersion: `${CLIENT_NAME}/${this.webex.version}`,\n localNetworkPrefix: anonymizeIPAddress(this.webex.meetings.geoHintInfo?.clientAddress),\n os: this.getOsName(),\n osVersion: getOSVersion() || UNKNOWN,\n subClientType: options.subClientType,\n browser: getBrowserName(),\n browserVersion: getBrowserVersion()\n }\n },\n originTime: {\n triggered: new Date().toISOString()\n },\n senderCountryCode: this.webex.meetings.geoHintInfo?.countryCode,\n event: {\n name: eventType,\n canProceed: true,\n identifiers,\n intervals: [options.intervalData],\n joinTimes,\n eventData: {\n webClientDomain: window.location.hostname\n },\n sourceMetadata: {\n applicationSoftwareType: CLIENT_NAME,\n applicationSoftwareVersion: this.webex.version,\n mediaEngineSoftwareType: getBrowserName() || 'browser',\n mediaEngineSoftwareVersion: getOSVersion() || UNKNOWN,\n startTime: new Date().toISOString()\n }\n }\n };\n\n return payload;\n }\n\n /**\n * This function Parses a Locus error and returns a diagnostic event payload.\n * It should keep updating from:\n * https://sqbu-github.cisco.com/WebExSquared/spark-client-framework/blob/master/spark-client-framework/Adapters/TelephonyAdapter/TelephonyAdapter.cpp#L920\n *\n * @param {Object} err the error Object from Locus response\n * @param {boolean} showToUser true if a toast is shown to user\n * @returns {{showToUser: boolean, category: string, errorDescription: string,\n * errorCode: number, errorData: *, fatal: boolean, name: string}}\n */\n parseLocusError(err, showToUser) {\n let errorCode;\n\n if (err && err.statusCode && err.statusCode >= 500) {\n errorCode = 1003;\n }\n else if (err && err.body && err.body.errorCode) {\n // locus error codes: https://sqbu-github.cisco.com/WebExSquared/locus/blob/master/server/src/main/resources/locus-error-codes.properties\n switch (ERROR_CODE[err.body.errorCode]) {\n case MEETING_ERRORS.FREE_USER_MAX_PARTICIPANTS_EXCEEDED:\n errorCode = 3007;\n break;\n case MEETING_ERRORS.PAID_USER_MAX_PARTICIPANTS_EXCEEDED:\n case MEETING_ERRORS.SERVICE_MAX_PARTICIPANTS_EXCEEDED:\n errorCode = 3002;\n break;\n case MEETING_ERRORS.INACTIVE:\n errorCode = 4001;\n break;\n case MEETING_ERRORS.EXCEEDED_MAX_JOINED_PARTICIPANTS:\n case MEETING_ERRORS.EXCEEDED_SERVICE_MAX_PARTICIPANTS:\n errorCode = 3001;\n break;\n case MEETING_ERRORS.MEETING_IS_LOCKED:\n errorCode = 4002;\n break;\n case MEETING_ERRORS.MEETING_IS_TERMINATING:\n errorCode = 4003;\n break;\n case MEETING_ERRORS.MEETING_REQUIRE_MODERATOR_PIN_INTENT:\n errorCode = 4004;\n break;\n case MEETING_ERRORS.MEETING_REQUIRE_MODERATOR_PIN:\n errorCode = 4005;\n break;\n case MEETING_ERRORS.MEETING_REQUIRE_MODERATOR_ROLE:\n errorCode = 4006;\n break;\n case MEETING_ERRORS.JOIN_RESTRICTED_USER:\n case MEETING_ERRORS.GET_RESTRICTED_USER:\n case MEETING_ERRORS.CREATE_MEDIA_RESTRICTED_USER:\n errorCode = 3005;\n break;\n case MEETING_ERRORS.JOIN_RESTRICTED_USER_NOT_IN_ROOM:\n errorCode = 4007;\n break;\n case MEETING_ERRORS.MEETING_NOT_FOUND:\n errorCode = 4011;\n break;\n case MEETING_ERRORS.NOT_WEBEX_SITE:\n errorCode = 4012;\n break;\n case MEETING_ERRORS.INVALID_JOIN_TIME:\n errorCode = 4013;\n break;\n case MEETING_ERRORS.PHONE_NUMBER_NOT_A_NUMBER:\n errorCode = 4016;\n break;\n case MEETING_ERRORS.PHONE_NUMBER_TOO_LONG:\n errorCode = 4017;\n break;\n case MEETING_ERRORS.INVALID_DIALABLE_KEY:\n errorCode = 4018;\n break;\n case MEETING_ERRORS.ONE_ON_ONE_TO_SELF_NOT_ALLOWED:\n errorCode = 4019;\n break;\n case MEETING_ERRORS.REMOVED_PARTICIPANT:\n errorCode = 4020;\n break;\n case MEETING_ERRORS.MEETING_LINK_NOT_FOUND:\n errorCode = 4021;\n break;\n case MEETING_ERRORS.PHONE_NUMBER_TOO_SHORT_AFTER_IDD:\n errorCode = 4022;\n break;\n case MEETING_ERRORS.INVALID_INVITEE_ADDRESS:\n errorCode = 4023;\n break;\n case MEETING_ERRORS.PMR_ACCOUNT_LOCKED:\n errorCode = 4024;\n break;\n case MEETING_ERRORS.RESOURCE_GUEST_FORBIDDEN:\n errorCode = 4025;\n break;\n case MEETING_ERRORS.PMR_ACCOUNT_SUSPENDED:\n errorCode = 4026;\n break;\n case MEETING_ERRORS.EMPTY_PHONE_NUMBER_OR_COUNTRY_CODE:\n errorCode = 4027;\n break;\n case MEETING_ERRORS.INVALID_SINCE_OR_SEQUENCE_HASH_IN_REQUEST:\n errorCode = 1006;\n break;\n case MEETING_ERRORS.CONVERSATION_NOT_FOUND:\n errorCode = 4028;\n break;\n case MEETING_ERRORS.RECORDING_CONTROL_NOT_SUPPORTED:\n case MEETING_ERRORS.RECORDING_NOT_STARTED:\n case MEETING_ERRORS.RECORDING_NOT_ENABLED:\n errorCode = 4029;\n break;\n default:\n errorCode = 4008;\n }\n }\n else {\n errorCode = 4008;\n }\n\n return this.generateErrorPayload(\n errorCode, showToUser, error.name.LOCUS_RESPONSE, err\n );\n }\n\n\n generateErrorPayload(errorCode, shownToUser, name, err) {\n if (error.errors[errorCode]) {\n const errorPayload = {\n shownToUser: shownToUser || false,\n category: error.errors[errorCode][2],\n errorDescription: error.errors[errorCode][0],\n errorCode,\n fatal: !includes(error.notFatalErrorList, errorCode),\n name: name || error.name.OTHER\n };\n\n if (err && err.body) {\n errorPayload.errorData = err.body;\n }\n\n if (err && err.statusCode) {\n errorPayload.httpCode = err.statusCode;\n }\n\n return errorPayload;\n }\n\n return null;\n }\n\n /**\n * Returns a formated string of the user agent.\n *\n * @returns {string} formatted user agent information\n */\n userAgentToString() {\n let userAgentOption;\n let browserInfo;\n const clientInfo = util.format('client=%s', `${this.webex.meetings?.metrics?.clientName}`);\n\n if (['chrome', 'firefox', 'msie', 'msedge', 'safari'].indexOf(getBrowserName().toLowerCase()) !== -1) {\n browserInfo = util.format('browser=%s', `${getBrowserName().toLowerCase()}/${getBrowserVersion().split('.')[0]}`);\n }\n const osInfo = util.format('os=%s', `${getOSName()}/${getOSVersion().split('.')[0]}`);\n\n if (browserInfo) {\n userAgentOption = `(${browserInfo}`;\n }\n if (osInfo) {\n userAgentOption = userAgentOption ? `${userAgentOption}; ${clientInfo}; ${osInfo}` : `${clientInfo}; (${osInfo}`;\n }\n if (userAgentOption) {\n userAgentOption += ')';\n\n return util.format('webex-js-sdk/%s %s', `${process.env.NODE_ENV}-${this.webex.version}`, userAgentOption);\n }\n\n return util.format('webex-js-sdk/%s', `${process.env.NODE_ENV}-${this.webex.version}`);\n }\n\n /**\n * Uploads given metric to the Metrics service as an Behavioral metric.\n * Metadata about the environment such as browser, OS, SDK and their versions\n * are automatically added when the metric is sent.\n *\n * The Metrics service will send an Behavioral metric to InfluxDB for\n * aggregation.\n * See https://confluence-eng-gpk2.cisco.com/conf/display/WBXT/Getting+started+with+Metrics+Service.\n *\n * @param {string} metricName Name of the metric (measurement) to send\n * @param {Object} metricFields Key-valye pairs of data or values about this metric\n * @param {Object} metricTags Key-value pairs of metric metadata\n *\n * @returns {void}\n */\n sendBehavioralMetric(metricName, metricFields = {}, metricTags = {}) {\n this.webex.internal.metrics.submitClientMetrics(metricName, {\n type: this.webex.config.metrics.type,\n fields: metricFields,\n tags: metricTags\n });\n }\n}\n\n// Export Metrics singleton ---------------------------------------------------\nconst instance = new Metrics();\n\nexport default instance;\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@webex/plugin-meetings",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.158.0",
|
|
4
4
|
"description": "",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"contributors": [
|
|
@@ -24,18 +24,18 @@
|
|
|
24
24
|
},
|
|
25
25
|
"dependencies": {
|
|
26
26
|
"@babel/runtime-corejs2": "^7.14.8",
|
|
27
|
-
"@webex/webex-core": "1.
|
|
28
|
-
"@webex/internal-plugin-mercury": "1.
|
|
27
|
+
"@webex/webex-core": "1.158.0",
|
|
28
|
+
"@webex/internal-plugin-mercury": "1.158.0",
|
|
29
29
|
"webrtc-adapter": "^7.7.0",
|
|
30
30
|
"lodash": "^4.17.21",
|
|
31
31
|
"uuid": "^3.3.2",
|
|
32
32
|
"global": "^4.4.0",
|
|
33
33
|
"ip-anonymize": "^0.1.0",
|
|
34
|
-
"@webex/common": "1.
|
|
34
|
+
"@webex/common": "1.158.0",
|
|
35
35
|
"bowser": "^2.11.0",
|
|
36
36
|
"sdp-transform": "^2.12.0",
|
|
37
37
|
"readable-stream": "^3.6.0",
|
|
38
|
-
"@webex/common-timers": "1.
|
|
38
|
+
"@webex/common-timers": "1.158.0",
|
|
39
39
|
"btoa": "^1.2.1",
|
|
40
40
|
"javascript-state-machine": "^3.1.0",
|
|
41
41
|
"envify": "^4.1.0"
|
package/src/index.js
CHANGED
package/src/meeting/index.js
CHANGED
|
@@ -1154,6 +1154,7 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
1154
1154
|
* @param {String} options.trackingId
|
|
1155
1155
|
* @param {Object} options.locus
|
|
1156
1156
|
* @param {Array} options.mediaConnections
|
|
1157
|
+
* @param {Object} options.errors
|
|
1157
1158
|
* @returns {Object}
|
|
1158
1159
|
* @memberof Meeting
|
|
1159
1160
|
*/
|
|
@@ -1292,6 +1293,7 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
1292
1293
|
* @param {String} options.event
|
|
1293
1294
|
* @param {String} options.trackingId
|
|
1294
1295
|
* @param {Object} options.locus
|
|
1296
|
+
* @param {Object} options.errors
|
|
1295
1297
|
* @returns {Promise}
|
|
1296
1298
|
* @private
|
|
1297
1299
|
* @memberof Meeting
|
|
@@ -3624,6 +3626,17 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
3624
3626
|
this.meetingFiniteStateMachine.fail(error);
|
|
3625
3627
|
LoggerProxy.logger.error('Meeting:index#join --> Failed', error);
|
|
3626
3628
|
|
|
3629
|
+
Metrics.postEvent({
|
|
3630
|
+
event: eventType.LOCUS_JOIN_RESPONSE,
|
|
3631
|
+
meeting: this,
|
|
3632
|
+
meetingId: this.id,
|
|
3633
|
+
data: {
|
|
3634
|
+
errors: [
|
|
3635
|
+
Metrics.parseLocusError(error.error, true)
|
|
3636
|
+
]
|
|
3637
|
+
}
|
|
3638
|
+
});
|
|
3639
|
+
|
|
3627
3640
|
// TODO: change this to error codes and pre defined dictionary
|
|
3628
3641
|
Metrics.sendBehavioralMetric(
|
|
3629
3642
|
BEHAVIORAL_METRICS.JOIN_FAILURE,
|
|
@@ -97,12 +97,18 @@ export default class MeetingInfoV2 {
|
|
|
97
97
|
});
|
|
98
98
|
const body = await MeetingInfoUtil.getRequestBody({...destinationType, password, captchaInfo});
|
|
99
99
|
|
|
100
|
-
|
|
100
|
+
const options = {
|
|
101
101
|
method: HTTP_VERBS.POST,
|
|
102
102
|
service: 'webex-appapi-service',
|
|
103
103
|
resource: 'meetingInfo',
|
|
104
104
|
body
|
|
105
|
-
}
|
|
105
|
+
};
|
|
106
|
+
|
|
107
|
+
const directURI = await MeetingInfoUtil.getDirectMeetingInfoURI(destinationType);
|
|
108
|
+
|
|
109
|
+
if (directURI) options.directURI = directURI;
|
|
110
|
+
|
|
111
|
+
return this.webex.request(options)
|
|
106
112
|
.catch((err) => {
|
|
107
113
|
if (err?.statusCode === 403) {
|
|
108
114
|
throw new MeetingInfoV2PasswordError(err.body?.code, err.body?.data?.meetingInfo);
|
|
@@ -264,4 +264,43 @@ MeetingInfoUtil.getRequestBody = (options) => {
|
|
|
264
264
|
return body;
|
|
265
265
|
};
|
|
266
266
|
|
|
267
|
+
/**
|
|
268
|
+
* Helper function to parse the webex site/host from a URI string.
|
|
269
|
+
* @param {String} uri string (e.g. '10019857020@convergedats.webex.com')
|
|
270
|
+
* @returns {String} the site/host part of the URI string (e.g. 'convergedats.webex.com')
|
|
271
|
+
*/
|
|
272
|
+
MeetingInfoUtil.getWebexSite = (uri) => {
|
|
273
|
+
const exceptedDomains = ['meet.webex.com', 'meetup.webex.com', 'ciscospark.com'];
|
|
274
|
+
const site = uri?.match(/.+@(.+\..+\.*.)$/)?.[1];
|
|
275
|
+
|
|
276
|
+
return exceptedDomains.includes(site) ? null : site;
|
|
277
|
+
};
|
|
278
|
+
|
|
279
|
+
/**
|
|
280
|
+
* Helper function to return the direct URI for fetching meeting info (to avoid a redirect).
|
|
281
|
+
* @param {Object} options type and value to fetch meeting info
|
|
282
|
+
* @param {String} options.type One of [SIP_URI, PERSONAL_ROOM, MEETING_ID, CONVERSATION_URL, LOCUS_ID, MEETING_LINK]
|
|
283
|
+
* @param {Object} options.destination ?? value.value
|
|
284
|
+
* @returns {String} returns a URI string or null of there is no direct URI
|
|
285
|
+
*/
|
|
286
|
+
MeetingInfoUtil.getDirectMeetingInfoURI = (options) => {
|
|
287
|
+
const {
|
|
288
|
+
type, destination
|
|
289
|
+
} = options;
|
|
290
|
+
|
|
291
|
+
let preferredWebexSite = null;
|
|
292
|
+
|
|
293
|
+
switch (type) {
|
|
294
|
+
case _SIP_URI_:
|
|
295
|
+
preferredWebexSite = MeetingInfoUtil.getWebexSite(destination);
|
|
296
|
+
break;
|
|
297
|
+
case _LOCUS_ID_:
|
|
298
|
+
preferredWebexSite = destination.info?.webExSite;
|
|
299
|
+
break;
|
|
300
|
+
default:
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
return preferredWebexSite ? `https://${preferredWebexSite}/wbxappapi/v1/meetingInfo` : null;
|
|
304
|
+
};
|
|
305
|
+
|
|
267
306
|
export default MeetingInfoUtil;
|
package/src/meetings/index.js
CHANGED
|
@@ -176,8 +176,6 @@ export default class Meetings extends WebexPlugin {
|
|
|
176
176
|
getSupportedDevice: Media.getSupportedDevice
|
|
177
177
|
};
|
|
178
178
|
|
|
179
|
-
LoggerProxy.set(this.webex.logger);
|
|
180
|
-
|
|
181
179
|
this.onReady();
|
|
182
180
|
MeetingsUtil.checkH264Support({disableNotifications: true});
|
|
183
181
|
Metrics.initialSetup(this.meetingCollection, this.webex);
|
|
@@ -368,6 +366,7 @@ export default class Meetings extends WebexPlugin {
|
|
|
368
366
|
onReady() {
|
|
369
367
|
this.webex.once(READY, () => {
|
|
370
368
|
StaticConfig.set(this.config);
|
|
369
|
+
LoggerProxy.set(this.webex.logger);
|
|
371
370
|
LoggerConfig.set(this.config.logging);
|
|
372
371
|
|
|
373
372
|
/**
|
package/src/metrics/index.js
CHANGED
|
@@ -328,7 +328,11 @@ class Metrics {
|
|
|
328
328
|
parseLocusError(err, showToUser) {
|
|
329
329
|
let errorCode;
|
|
330
330
|
|
|
331
|
-
if (err && err.
|
|
331
|
+
if (err && err.statusCode && err.statusCode >= 500) {
|
|
332
|
+
errorCode = 1003;
|
|
333
|
+
}
|
|
334
|
+
else if (err && err.body && err.body.errorCode) {
|
|
335
|
+
// locus error codes: https://sqbu-github.cisco.com/WebExSquared/locus/blob/master/server/src/main/resources/locus-error-codes.properties
|
|
332
336
|
switch (ERROR_CODE[err.body.errorCode]) {
|
|
333
337
|
case MEETING_ERRORS.FREE_USER_MAX_PARTICIPANTS_EXCEEDED:
|
|
334
338
|
errorCode = 3007;
|
|
@@ -452,6 +456,10 @@ class Metrics {
|
|
|
452
456
|
errorPayload.errorData = err.body;
|
|
453
457
|
}
|
|
454
458
|
|
|
459
|
+
if (err && err.statusCode) {
|
|
460
|
+
errorPayload.httpCode = err.statusCode;
|
|
461
|
+
}
|
|
462
|
+
|
|
455
463
|
return errorPayload;
|
|
456
464
|
}
|
|
457
465
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
+
import Transcription from '@webex/plugin-meetings/src/transcription';
|
|
1
2
|
import {assert} from '@webex/test-helper-chai';
|
|
2
3
|
import sinon from 'sinon';
|
|
3
|
-
import Transcription from '@webex/plugin-meetings/src/transcription';
|
|
4
4
|
|
|
5
5
|
describe('transcription index', () => {
|
|
6
6
|
let webSocketUrl, members, sessionId, token, transcription;
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import 'jsdom-global/register';
|
|
1
2
|
import sinon from 'sinon';
|
|
2
3
|
import {cloneDeep} from 'lodash';
|
|
3
4
|
import {assert} from '@webex/test-helper-chai';
|
|
@@ -16,7 +17,6 @@ import {
|
|
|
16
17
|
|
|
17
18
|
import {self, selfWithInactivity} from './selfConstant';
|
|
18
19
|
|
|
19
|
-
|
|
20
20
|
describe('plugin-meetings', () => {
|
|
21
21
|
describe('LocusInfo index', () => {
|
|
22
22
|
const updateMeeting = () => {};
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
/*!
|
|
2
2
|
* Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.
|
|
3
3
|
*/
|
|
4
|
+
import 'jsdom-global/register';
|
|
4
5
|
import {cloneDeep, isEqual} from 'lodash';
|
|
5
6
|
import sinon from 'sinon';
|
|
6
7
|
import StateMachine from 'javascript-state-machine';
|
|
@@ -27,6 +28,7 @@ import LoggerConfig from '@webex/plugin-meetings/src/common/logs/logger-config';
|
|
|
27
28
|
import TriggerProxy from '@webex/plugin-meetings/src/common/events/trigger-proxy';
|
|
28
29
|
import BrowserDetection from '@webex/plugin-meetings/src/common/browser-detection';
|
|
29
30
|
import Metrics from '@webex/plugin-meetings/src/metrics';
|
|
31
|
+
import {eventType} from '@webex/plugin-meetings/src/metrics/config';
|
|
30
32
|
import {
|
|
31
33
|
FLOOR_ACTION,
|
|
32
34
|
SHARE_STATUS,
|
|
@@ -36,7 +38,7 @@ import {
|
|
|
36
38
|
EVENT_TRIGGERS,
|
|
37
39
|
_SIP_URI_
|
|
38
40
|
} from '@webex/plugin-meetings/src/constants';
|
|
39
|
-
import
|
|
41
|
+
import BEHAVIORAL_METRICS from '@webex/plugin-meetings/src/metrics/constants';
|
|
40
42
|
|
|
41
43
|
import {
|
|
42
44
|
UserNotJoinedError,
|
|
@@ -71,6 +73,43 @@ describe('plugin-meetings', () => {
|
|
|
71
73
|
};
|
|
72
74
|
|
|
73
75
|
before(() => {
|
|
76
|
+
const MediaStream = {
|
|
77
|
+
getVideoTracks: () => [{
|
|
78
|
+
applyConstraints: () => { }
|
|
79
|
+
}]
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
Object.defineProperty(global.window.navigator, 'mediaDevices', {
|
|
83
|
+
writable: true,
|
|
84
|
+
value: {
|
|
85
|
+
getDisplayMedia: sinon.stub().returns(Promise.resolve(MediaStream)),
|
|
86
|
+
enumerateDevices: sinon.stub().returns(Promise.resolve([
|
|
87
|
+
{
|
|
88
|
+
deviceId: '',
|
|
89
|
+
kind: 'audioinput',
|
|
90
|
+
label: '',
|
|
91
|
+
groupId: '29d9339cc77bffdd24cb69ee80f6d3200481099bcd0f29267558672de0430777',
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
deviceId: '',
|
|
95
|
+
kind: 'videoinput',
|
|
96
|
+
label: '',
|
|
97
|
+
groupId: '08d4f8200e7e4a3425ecf75b7edea9ae4acd934019f2a52217554bcc8e46604d',
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
deviceId: '',
|
|
101
|
+
kind: 'audiooutput',
|
|
102
|
+
label: '',
|
|
103
|
+
groupId: '29d9339cc77bffdd24cb69ee80f6d3200481099bcd0f29267558672de0430777',
|
|
104
|
+
}
|
|
105
|
+
])),
|
|
106
|
+
},
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
Object.defineProperty(global.window, 'MediaStream', {
|
|
110
|
+
writable: true,
|
|
111
|
+
value: MediaStream
|
|
112
|
+
});
|
|
74
113
|
LoggerConfig.set({verboseEvents: true, enable: false});
|
|
75
114
|
LoggerProxy.set(logger);
|
|
76
115
|
});
|
|
@@ -107,6 +146,9 @@ describe('plugin-meetings', () => {
|
|
|
107
146
|
metrics: {},
|
|
108
147
|
stats: {},
|
|
109
148
|
experimental: {enableUnifiedMeetings: true}
|
|
149
|
+
},
|
|
150
|
+
metrics: {
|
|
151
|
+
type: ['behavioral']
|
|
110
152
|
}
|
|
111
153
|
}
|
|
112
154
|
});
|
|
@@ -121,6 +163,7 @@ describe('plugin-meetings', () => {
|
|
|
121
163
|
Metrics.postEvent = sinon.stub();
|
|
122
164
|
Metrics.initialSetup(null, webex);
|
|
123
165
|
MediaUtil.createPeerConnection = sinon.stub().returns({});
|
|
166
|
+
MediaUtil.createMediaStream = sinon.stub().returns(true);
|
|
124
167
|
|
|
125
168
|
uuid1 = uuid.v4();
|
|
126
169
|
uuid2 = uuid.v4();
|
|
@@ -695,6 +738,11 @@ describe('plugin-meetings', () => {
|
|
|
695
738
|
assert.calledWith(MeetingUtil.joinMeeting, meeting, {moderator: false, pin: '1234'});
|
|
696
739
|
});
|
|
697
740
|
});
|
|
741
|
+
it('should post error event if failed', async () => {
|
|
742
|
+
await meeting.join().catch(() => {
|
|
743
|
+
assert.calledWithMatch(Metrics.postEvent, {event: eventType.LOCUS_JOIN_RESPONSE});
|
|
744
|
+
});
|
|
745
|
+
});
|
|
698
746
|
it('should fail if password is required', async () => {
|
|
699
747
|
meeting.passwordStatus = PASSWORD_STATUS.REQUIRED;
|
|
700
748
|
await assert.isRejected(meeting.join(), PasswordError);
|
|
@@ -2524,7 +2572,6 @@ describe('plugin-meetings', () => {
|
|
|
2524
2572
|
sandbox.stub(MeetingUtil, 'getTrack').returns({audioTrack: null, videoTrack: fakeTrack});
|
|
2525
2573
|
sandbox.stub(meeting.mediaProperties, 'setMediaSettings');
|
|
2526
2574
|
sandbox.stub(meeting.mediaProperties, 'setVideoDeviceId');
|
|
2527
|
-
sandbox.stub(MediaUtil, 'createMediaStream').returns(true);
|
|
2528
2575
|
|
|
2529
2576
|
meeting.setLocalTracks(fakeStream);
|
|
2530
2577
|
|
|
@@ -2565,7 +2612,6 @@ describe('plugin-meetings', () => {
|
|
|
2565
2612
|
});
|
|
2566
2613
|
describe('#setRemoteStream', () => {
|
|
2567
2614
|
beforeEach(() => {
|
|
2568
|
-
MediaUtil.createMediaStream = sinon.stub().returns(true);
|
|
2569
2615
|
meeting.statsAnalyzer = {startAnalyzer: sinon.stub()};
|
|
2570
2616
|
});
|
|
2571
2617
|
it('should trigger a media:ready event when remote stream track ontrack is fired', () => {
|
|
@@ -211,5 +211,77 @@ describe('plugin-meetings', () => {
|
|
|
211
211
|
assert.equal(res.conversationUrl, 'https://conv-a.wbx2.com/conversation/api/v1/conversations/bfb49280');
|
|
212
212
|
});
|
|
213
213
|
});
|
|
214
|
+
|
|
215
|
+
describe('#getWebexSite', () => {
|
|
216
|
+
it('SIP meeting address', () => {
|
|
217
|
+
assert.equal(MeetingInfoUtil.getWebexSite('10019857020@convergedats.webex.com'), 'convergedats.webex.com');
|
|
218
|
+
});
|
|
219
|
+
it('SIP meeting address from excepted domain', () => {
|
|
220
|
+
assert.equal(MeetingInfoUtil.getWebexSite('10019857020@meet.webex.com'), null);
|
|
221
|
+
});
|
|
222
|
+
it('invalid domain', () => {
|
|
223
|
+
assert.equal(MeetingInfoUtil.getWebexSite('invaliddomain'), null);
|
|
224
|
+
});
|
|
225
|
+
});
|
|
226
|
+
|
|
227
|
+
describe('#getDirectMeetingInfoURI', () => {
|
|
228
|
+
it('for _SIP_URI_', () => {
|
|
229
|
+
assert.equal(MeetingInfoUtil.getDirectMeetingInfoURI({
|
|
230
|
+
type: _SIP_URI_,
|
|
231
|
+
destination: 'testing@convergedats.webex.com'
|
|
232
|
+
}), 'https://convergedats.webex.com/wbxappapi/v1/meetingInfo');
|
|
233
|
+
});
|
|
234
|
+
|
|
235
|
+
it('for _LOCUS_ID_ with webExSite', () => {
|
|
236
|
+
assert.equal(MeetingInfoUtil.getDirectMeetingInfoURI({
|
|
237
|
+
type: _LOCUS_ID_,
|
|
238
|
+
destination: {
|
|
239
|
+
info: {
|
|
240
|
+
webExMeetingId: '123456',
|
|
241
|
+
webExSite: 'convergedats.webex.com'
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
}), 'https://convergedats.webex.com/wbxappapi/v1/meetingInfo');
|
|
245
|
+
});
|
|
246
|
+
|
|
247
|
+
// null means fall back to default meeting info URI
|
|
248
|
+
it('for _PERSONAL_ROOM_', () => {
|
|
249
|
+
assert.equal(MeetingInfoUtil.getDirectMeetingInfoURI({
|
|
250
|
+
type: _PERSONAL_ROOM_,
|
|
251
|
+
destination: {
|
|
252
|
+
userId: '01824b9b-adef-4b10-b5c1-8a2fe2fb7c0e',
|
|
253
|
+
orgId: '1eb65fdf-9643-417f-9974-ad72cae0e10f'
|
|
254
|
+
}
|
|
255
|
+
}), null);
|
|
256
|
+
});
|
|
257
|
+
|
|
258
|
+
it('for _MEETING_ID_', () => {
|
|
259
|
+
assert.equal(MeetingInfoUtil.getDirectMeetingInfoURI({
|
|
260
|
+
type: _MEETING_ID_,
|
|
261
|
+
destination: '1234323'
|
|
262
|
+
}), null);
|
|
263
|
+
});
|
|
264
|
+
|
|
265
|
+
it('for _MEETING_UUID_', () => {
|
|
266
|
+
assert.equal(MeetingInfoUtil.getDirectMeetingInfoURI({
|
|
267
|
+
type: _MEETING_UUID_,
|
|
268
|
+
destination: 'xsddsdsdsdssdsdsdsdsd'
|
|
269
|
+
}), null);
|
|
270
|
+
});
|
|
271
|
+
|
|
272
|
+
it('for _LOCUS_ID_ with sipUri with excepted domain', () => {
|
|
273
|
+
assert.equal(MeetingInfoUtil.getDirectMeetingInfoURI({
|
|
274
|
+
type: _LOCUS_ID_,
|
|
275
|
+
destination: {info: {webExMeetingId: '123456', sipUri: 'testing@meetup.webex.com'}}
|
|
276
|
+
}), null);
|
|
277
|
+
});
|
|
278
|
+
|
|
279
|
+
it('for _CONVERSATION_URL_', () => {
|
|
280
|
+
assert.equal(MeetingInfoUtil.getDirectMeetingInfoURI({
|
|
281
|
+
type: _CONVERSATION_URL_,
|
|
282
|
+
destination: 'https://conv-a.wbx2.com/conversation/api/v1/conversations/bfb49280'
|
|
283
|
+
}), null);
|
|
284
|
+
});
|
|
285
|
+
});
|
|
214
286
|
});
|
|
215
287
|
});
|