@webex/plugin-meetings 1.151.0 → 1.151.4
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/meeting/index.js +3 -1
- package/dist/meeting/index.js.map +1 -1
- package/dist/meeting-info/utilv2.js +81 -37
- package/dist/meeting-info/utilv2.js.map +1 -1
- package/dist/metrics/index.js +43 -48
- package/dist/metrics/index.js.map +1 -1
- package/package.json +6 -5
- package/src/meeting/index.js +1 -1
- package/src/meeting-info/utilv2.js +30 -5
- package/src/metrics/index.js +5 -15
- package/test/integration/spec/space-meeting.js +8 -3
- package/test/unit/spec/meeting/index.js +0 -1
- package/test/unit/spec/meeting-info/utilv2.js +65 -4
- package/test/unit/spec/metrics/index.js +42 -1
|
@@ -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","getLocalNetworkPrefix","localIp","undefined","parts","split","join","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","StaticConfig","metrics","clientName","toLowerCase","osInfo","process","env","NODE_ENV","metricName","metricFields","metricTags","fields","browser_version","os_version","sdk_version","tags","org_id","credentials","getOrgId","domain","client_id","config","Error","internal","submitClientMetrics","type"],"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';\n\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport {MEETING_ERRORS} from '../constants';\nimport StaticConfig from '../common/config';\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 getLocalNetworkPrefix = (localIp) => {\n if (!localIp) {\n return undefined;\n }\n const parts = localIp.split('.');\n\n // eslint-disable-next-line no-bitwise\n parts[3] &= 240;\n\n return parts.join('.');\n};\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: getLocalNetworkPrefix(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: getLocalNetworkPrefix(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', `${StaticConfig.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 operational 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 operational 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 sendOperationalMetric(metricName, metricFields = {}, metricTags = {}) {\n const fields = {\n ...metricFields,\n browser_version: getBrowserVersion(),\n os_version: getOSVersion(),\n sdk_version: this.webex.version\n };\n\n const tags = {\n ...metricTags,\n browser: getBrowserName(),\n org_id: this.webex.credentials.getOrgId(),\n os: getOSName(),\n domain: window.location.hostname,\n client_id: this.webex.credentials.config.client_id\n };\n\n if (!metricName) {\n throw Error('Missing operational metric name. Please provide one');\n }\n\n this.webex.internal.metrics.submitClientMetrics(metricName, {\n type: ['operational'],\n fields,\n tags\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","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","fields","browser_version","os_version","sdk_version","tags","org_id","credentials","getOrgId","domain","client_id","config","Error","internal","submitClientMetrics","type"],"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 operational 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 operational 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 sendOperationalMetric(metricName, metricFields = {}, metricTags = {}) {\n const fields = {\n ...metricFields,\n browser_version: getBrowserVersion(),\n os_version: getOSVersion(),\n sdk_version: this.webex.version\n };\n\n const tags = {\n ...metricTags,\n browser: getBrowserName(),\n org_id: this.webex.credentials.getOrgId(),\n os: getOSName(),\n domain: window.location.hostname,\n client_id: this.webex.credentials.config.client_id\n };\n\n if (!metricName) {\n throw Error('Missing operational metric name. Please provide one');\n }\n\n this.webex.internal.metrics.submitClientMetrics(metricName, {\n type: ['operational'],\n fields,\n tags\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.151.
|
|
3
|
+
"version": "1.151.4",
|
|
4
4
|
"description": "",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"contributors": [
|
|
@@ -24,17 +24,18 @@
|
|
|
24
24
|
},
|
|
25
25
|
"dependencies": {
|
|
26
26
|
"@babel/runtime-corejs2": "^7.14.8",
|
|
27
|
-
"@webex/webex-core": "1.151.
|
|
28
|
-
"@webex/internal-plugin-mercury": "1.151.
|
|
27
|
+
"@webex/webex-core": "1.151.4",
|
|
28
|
+
"@webex/internal-plugin-mercury": "1.151.4",
|
|
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.151.4",
|
|
34
35
|
"bowser": "^2.11.0",
|
|
35
36
|
"sdp-transform": "^2.12.0",
|
|
36
37
|
"readable-stream": "^3.6.0",
|
|
37
|
-
"@webex/common-timers": "1.151.
|
|
38
|
+
"@webex/common-timers": "1.151.4",
|
|
38
39
|
"btoa": "^1.2.1",
|
|
39
40
|
"javascript-state-machine": "^3.1.0",
|
|
40
41
|
"envify": "^4.1.0"
|
package/src/meeting/index.js
CHANGED
|
@@ -3787,7 +3787,7 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
3787
3787
|
const metricName = METRICS_OPERATIONAL_MEASURES.GET_USER_MEDIA_FAILURE;
|
|
3788
3788
|
const data = {
|
|
3789
3789
|
correlation_id: this.correlationId,
|
|
3790
|
-
locus_id: this.locusUrl
|
|
3790
|
+
locus_id: this.locusUrl?.split('/').pop(),
|
|
3791
3791
|
reason: error.message,
|
|
3792
3792
|
stack: error.stack
|
|
3793
3793
|
};
|
|
@@ -21,7 +21,8 @@ import {
|
|
|
21
21
|
MEET,
|
|
22
22
|
MEET_M,
|
|
23
23
|
HTTPS_PROTOCOL,
|
|
24
|
-
UUID_REG
|
|
24
|
+
UUID_REG,
|
|
25
|
+
VALID_EMAIL_ADDRESS
|
|
25
26
|
} from '../constants';
|
|
26
27
|
import ParameterError from '../common/errors/parameter';
|
|
27
28
|
import LoggerProxy from '../common/logs/logger-proxy';
|
|
@@ -116,8 +117,27 @@ MeetingInfoUtil.getSipUriFromHydraPersonId = (destination, webex) => webex.peopl
|
|
|
116
117
|
|
|
117
118
|
|
|
118
119
|
MeetingInfoUtil.getDestinationType = async (from) => {
|
|
119
|
-
const {
|
|
120
|
+
const {type, webex} = from;
|
|
121
|
+
let {destination} = from;
|
|
122
|
+
|
|
123
|
+
if (type === _PERSONAL_ROOM_) { // this case checks if your type is personal room
|
|
124
|
+
if (!destination) { // if we are not getting anything in desination we fetch org and user ids from webex instance
|
|
125
|
+
destination = {
|
|
126
|
+
userId: webex.internal.device.userId,
|
|
127
|
+
orgId: webex.internal.device.orgId
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
else {
|
|
131
|
+
const options = VALID_EMAIL_ADDRESS.test(destination) ? {email: destination} : {id: destination};// we are assuming userId as default
|
|
132
|
+
const res = await webex.people.list(options);
|
|
133
|
+
|
|
134
|
+
let {orgId, id: userId} = res.items[0];
|
|
120
135
|
|
|
136
|
+
userId = deconstructHydraId(userId).id;
|
|
137
|
+
orgId = deconstructHydraId(orgId).id;
|
|
138
|
+
destination = {userId, orgId};
|
|
139
|
+
}
|
|
140
|
+
}
|
|
121
141
|
if (type) {
|
|
122
142
|
return {
|
|
123
143
|
destination,
|
|
@@ -193,15 +213,17 @@ MeetingInfoUtil.getDestinationType = async (from) => {
|
|
|
193
213
|
*/
|
|
194
214
|
MeetingInfoUtil.getRequestBody = (options) => {
|
|
195
215
|
const {type, destination} = options;
|
|
196
|
-
const body = {
|
|
216
|
+
const body = {
|
|
217
|
+
supportHostKey: true
|
|
218
|
+
};
|
|
197
219
|
|
|
198
220
|
switch (type) {
|
|
199
221
|
case _SIP_URI_:
|
|
200
222
|
body.sipUrl = destination;
|
|
201
223
|
break;
|
|
202
224
|
case _PERSONAL_ROOM_:
|
|
203
|
-
body.userId = destination;
|
|
204
|
-
body.orgId =
|
|
225
|
+
body.userId = destination.userId;
|
|
226
|
+
body.orgId = destination.orgId;
|
|
205
227
|
break;
|
|
206
228
|
case _MEETING_ID_:
|
|
207
229
|
body.meetingKey = destination;
|
|
@@ -214,6 +236,9 @@ MeetingInfoUtil.getRequestBody = (options) => {
|
|
|
214
236
|
if (destination.info?.webExMeetingId) {
|
|
215
237
|
body.meetingKey = destination.info.webExMeetingId;
|
|
216
238
|
}
|
|
239
|
+
else if (destination.info?.sipUri) {
|
|
240
|
+
body.sipUrl = destination.info.sipUri;
|
|
241
|
+
}
|
|
217
242
|
break;
|
|
218
243
|
case _MEETING_LINK_:
|
|
219
244
|
body.meetingUrl = destination;
|
package/src/metrics/index.js
CHANGED
|
@@ -6,10 +6,10 @@ import util from 'util';
|
|
|
6
6
|
import {includes} from 'lodash';
|
|
7
7
|
import uuid from 'uuid';
|
|
8
8
|
import window from 'global/window';
|
|
9
|
+
import anonymize from 'ip-anonymize';
|
|
9
10
|
|
|
10
11
|
import LoggerProxy from '../common/logs/logger-proxy';
|
|
11
12
|
import {MEETING_ERRORS} from '../constants';
|
|
12
|
-
import StaticConfig from '../common/config';
|
|
13
13
|
import BrowserDetection from '../common/browser-detection';
|
|
14
14
|
|
|
15
15
|
import {
|
|
@@ -34,17 +34,7 @@ const {
|
|
|
34
34
|
} = BrowserDetection();
|
|
35
35
|
|
|
36
36
|
// Apply a CIDR /28 format to the IP address
|
|
37
|
-
const
|
|
38
|
-
if (!localIp) {
|
|
39
|
-
return undefined;
|
|
40
|
-
}
|
|
41
|
-
const parts = localIp.split('.');
|
|
42
|
-
|
|
43
|
-
// eslint-disable-next-line no-bitwise
|
|
44
|
-
parts[3] &= 240;
|
|
45
|
-
|
|
46
|
-
return parts.join('.');
|
|
47
|
-
};
|
|
37
|
+
const anonymizeIPAddress = (localIp) => anonymize(localIp);
|
|
48
38
|
|
|
49
39
|
const triggerTimers = ({event, meeting, data}) => {
|
|
50
40
|
switch (event) {
|
|
@@ -200,7 +190,7 @@ class Metrics {
|
|
|
200
190
|
clientInfo: {
|
|
201
191
|
clientType: options.clientType,
|
|
202
192
|
clientVersion: `${CLIENT_NAME}/${this.webex.version}`,
|
|
203
|
-
localNetworkPrefix:
|
|
193
|
+
localNetworkPrefix: anonymizeIPAddress(this.webex.meetings.geoHintInfo?.clientAddress),
|
|
204
194
|
osVersion: getOSVersion() || 'unknown',
|
|
205
195
|
subClientType: options.subClientType,
|
|
206
196
|
os: this.getOsName(),
|
|
@@ -291,7 +281,7 @@ class Metrics {
|
|
|
291
281
|
clientInfo: {
|
|
292
282
|
clientType: options.clientType, // TODO: Only clientType: 'TEAMS_CLIENT' is whitelisted
|
|
293
283
|
clientVersion: `${CLIENT_NAME}/${this.webex.version}`,
|
|
294
|
-
localNetworkPrefix:
|
|
284
|
+
localNetworkPrefix: anonymizeIPAddress(this.webex.meetings.geoHintInfo?.clientAddress),
|
|
295
285
|
os: this.getOsName(),
|
|
296
286
|
osVersion: getOSVersion() || UNKNOWN,
|
|
297
287
|
subClientType: options.subClientType,
|
|
@@ -476,7 +466,7 @@ class Metrics {
|
|
|
476
466
|
userAgentToString() {
|
|
477
467
|
let userAgentOption;
|
|
478
468
|
let browserInfo;
|
|
479
|
-
const clientInfo = util.format('client=%s', `${
|
|
469
|
+
const clientInfo = util.format('client=%s', `${this.webex.meetings?.metrics?.clientName}`);
|
|
480
470
|
|
|
481
471
|
if (['chrome', 'firefox', 'msie', 'msedge', 'safari'].indexOf(getBrowserName().toLowerCase()) !== -1) {
|
|
482
472
|
browserInfo = util.format('browser=%s', `${getBrowserName().toLowerCase()}/${getBrowserVersion().split('.')[0]}`);
|
|
@@ -65,8 +65,14 @@ skipInNode(describe)('plugin-meetings', () => {
|
|
|
65
65
|
testUtils.delayedPromise(alice.meeting.join()),
|
|
66
66
|
testUtils.waitForEvents([
|
|
67
67
|
{scope: bob.webex.meetings, event: 'meeting:added', user: bob},
|
|
68
|
-
{scope: chris.webex.meetings, event: 'meeting:added', user: chris}
|
|
69
|
-
|
|
68
|
+
{scope: chris.webex.meetings, event: 'meeting:added', user: chris}
|
|
69
|
+
])
|
|
70
|
+
]).then(() => {
|
|
71
|
+
// TODO Renenable after unified flag is enabled
|
|
72
|
+
// const {meetingNumber} = bob.meeting.meetingInfo;
|
|
73
|
+
|
|
74
|
+
// assert(meetingNumber === alice.meeting.meetingNumber, 'meetingNumber matches alice meeting number');
|
|
75
|
+
})));
|
|
70
76
|
|
|
71
77
|
xit('Should fetch user info using user hydra id with the new api', () => alice.webex.rooms.create({title: 'sample'})
|
|
72
78
|
.then((room) => MeetingInfoUtil.getDestinationType({
|
|
@@ -95,7 +101,6 @@ skipInNode(describe)('plugin-meetings', () => {
|
|
|
95
101
|
assert(meetingNumber === alice.meeting.meetingNumber, 'meetingNumber matches alice meeting number');
|
|
96
102
|
});
|
|
97
103
|
|
|
98
|
-
|
|
99
104
|
it('Bob and chris joins space meeting', () => testUtils.waitForStateChange(alice.meeting, 'JOINED')
|
|
100
105
|
.then(() => testUtils.waitForStateChange(bob.meeting, 'IDLE'))
|
|
101
106
|
.then(() => testUtils.waitForStateChange(chris.meeting, 'IDLE'))
|
|
@@ -110,7 +110,6 @@ describe('plugin-meetings', () => {
|
|
|
110
110
|
|
|
111
111
|
|
|
112
112
|
TriggerProxy.trigger = sinon.stub().returns(true);
|
|
113
|
-
Metrics.initPayload = sinon.stub();
|
|
114
113
|
Metrics.postEvent = sinon.stub();
|
|
115
114
|
Metrics.initialSetup(null, webex);
|
|
116
115
|
MediaUtil.createPeerConnection = sinon.stub().returns({});
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
|
-
import {assert} from '@webex/test-helper-chai';
|
|
5
|
+
import {assert, expect} from '@webex/test-helper-chai';
|
|
6
6
|
import sinon from 'sinon';
|
|
7
7
|
import {
|
|
8
8
|
_MEETING_ID_,
|
|
@@ -68,17 +68,78 @@ describe('plugin-meetings', () => {
|
|
|
68
68
|
assert.equal(res.type, _CONVERSATION_URL_);
|
|
69
69
|
assert.equal(res.destination, 'https://conv-a.wbx2.com/conversation/api/v1/conversations/bfb49280');
|
|
70
70
|
});
|
|
71
|
+
|
|
72
|
+
describe('PMR', () => {
|
|
73
|
+
const mockedListReturn = {userId: '01824b9b-adef-4b10-b5c1-8a2fe2fb7c0e', orgId: '1eb65fdf-9643-417f-9974-ad72cae0e10f'};
|
|
74
|
+
const mockedList = {
|
|
75
|
+
items: [{
|
|
76
|
+
id: 'Y2lzY29zcGFyazovL3VzL1BFT1BMRS8wMTgyNGI5Yi1hZGVmLTRiMTAtYjVjMS04YTJmZTJmYjdjMGU',
|
|
77
|
+
orgId: 'Y2lzY29zcGFyazovL3VzL09SR0FOSVpBVElPTi8xZWI2NWZkZi05NjQzLTQxN2YtOTk3NC1hZDcyY2FlMGUxMGY'
|
|
78
|
+
}]
|
|
79
|
+
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
it('should return a userID and orgID without passing a destination', async () => {
|
|
83
|
+
const res = await MeetingInfoUtil.getDestinationType({
|
|
84
|
+
type: _PERSONAL_ROOM_,
|
|
85
|
+
webex: {
|
|
86
|
+
internal: {
|
|
87
|
+
device: {
|
|
88
|
+
userId: '01824b9b-adef-4b10-b5c1-8a2fe2fb7c0e',
|
|
89
|
+
orgId: '1eb65fdf-9643-417f-9974-ad72cae0e10f'
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
expect(res.destination.userId).to.equal('01824b9b-adef-4b10-b5c1-8a2fe2fb7c0e');
|
|
96
|
+
expect(res.destination.orgId).to.equal('1eb65fdf-9643-417f-9974-ad72cae0e10f');
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
it('should return a userID and orgID when passing an email', async () => {
|
|
100
|
+
const res = await MeetingInfoUtil.getDestinationType({
|
|
101
|
+
type: _PERSONAL_ROOM_,
|
|
102
|
+
destination: 'amritesi@cisco.com',
|
|
103
|
+
webex: {
|
|
104
|
+
people: {list: sinon.stub().returns(mockedList)}
|
|
105
|
+
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
const {orgId, userId} = res.destination;
|
|
109
|
+
|
|
110
|
+
expect(userId).to.equal(mockedListReturn.userId);
|
|
111
|
+
expect(orgId).to.equal(mockedListReturn.orgId);
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
it('should return a userID and orgID when passing an id', async () => {
|
|
115
|
+
const res = await MeetingInfoUtil.getDestinationType({
|
|
116
|
+
type: _PERSONAL_ROOM_,
|
|
117
|
+
destination: '01824b9b-adef-4b10-b5c1-8a2fe2fb7c0e',
|
|
118
|
+
webex: {
|
|
119
|
+
people: {list: sinon.stub().returns(mockedList)}
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
});
|
|
123
|
+
const {orgId, userId} = res.destination;
|
|
124
|
+
|
|
125
|
+
expect(userId).to.equal(mockedListReturn.userId);
|
|
126
|
+
expect(orgId).to.equal(mockedListReturn.orgId);
|
|
127
|
+
});
|
|
128
|
+
});
|
|
71
129
|
});
|
|
72
130
|
|
|
73
131
|
describe('#getRequestBody', () => {
|
|
74
132
|
it('for _PERSONAL_ROOM_', () => {
|
|
75
133
|
const res = MeetingInfoUtil.getRequestBody({
|
|
76
134
|
type: _PERSONAL_ROOM_,
|
|
77
|
-
destination:
|
|
135
|
+
destination: {
|
|
136
|
+
userId: '01824b9b-adef-4b10-b5c1-8a2fe2fb7c0e',
|
|
137
|
+
orgId: '1eb65fdf-9643-417f-9974-ad72cae0e10f'
|
|
138
|
+
}
|
|
78
139
|
});
|
|
79
140
|
|
|
80
|
-
assert.equal(res.orgId, '');
|
|
81
|
-
assert.equal(res.userId, '
|
|
141
|
+
assert.equal(res.orgId, '1eb65fdf-9643-417f-9974-ad72cae0e10f');
|
|
142
|
+
assert.equal(res.userId, '01824b9b-adef-4b10-b5c1-8a2fe2fb7c0e');
|
|
82
143
|
});
|
|
83
144
|
|
|
84
145
|
it('for _MEETING_ID_', () => {
|
|
@@ -24,6 +24,14 @@ const {
|
|
|
24
24
|
browserOnly(describe)('Meeting metrics', () => {
|
|
25
25
|
let webex, mockSubmitMetric, sandbox;
|
|
26
26
|
|
|
27
|
+
const geoHintInfo = {
|
|
28
|
+
clientAddress: '2001:0db8:0000:08d3:0000:0000:0070:0000',
|
|
29
|
+
clientRegion: 'US-WEST',
|
|
30
|
+
countryCode: 'US',
|
|
31
|
+
regionCode: 'US-WEST',
|
|
32
|
+
timezone: 'America/Los_Angeles'
|
|
33
|
+
};
|
|
34
|
+
|
|
27
35
|
beforeEach(() => {
|
|
28
36
|
sandbox = sinon.createSandbox();
|
|
29
37
|
mockSubmitMetric = sandbox.stub();
|
|
@@ -40,7 +48,6 @@ browserOnly(describe)('Meeting metrics', () => {
|
|
|
40
48
|
clientId: 'mock-client-id'
|
|
41
49
|
}
|
|
42
50
|
};
|
|
43
|
-
|
|
44
51
|
webex.internal.metrics.submitClientMetrics = mockSubmitMetric;
|
|
45
52
|
metrics.initialSetup({}, webex);
|
|
46
53
|
});
|
|
@@ -49,6 +56,40 @@ browserOnly(describe)('Meeting metrics', () => {
|
|
|
49
56
|
sandbox.restore();
|
|
50
57
|
});
|
|
51
58
|
|
|
59
|
+
describe('initPayload / initMediaPayload', () => {
|
|
60
|
+
it('should create payload with masked IPv4', () => {
|
|
61
|
+
geoHintInfo.clientAddress = '128.0.0.1';
|
|
62
|
+
webex.meetings = {
|
|
63
|
+
geoHintInfo
|
|
64
|
+
};
|
|
65
|
+
metrics.initialSetup({}, webex);
|
|
66
|
+
const payload = metrics.initPayload('myMetric', {}, {clientType: 'TEAMS_CLIENT'});
|
|
67
|
+
|
|
68
|
+
assert(payload.origin.clientInfo.localNetworkPrefix === '128.0.0.0');
|
|
69
|
+
assert(payload.event.name === 'myMetric');
|
|
70
|
+
|
|
71
|
+
const payload2 = metrics.initMediaPayload('myMetric', {}, {clientType: 'TEAMS_CLIENT'});
|
|
72
|
+
|
|
73
|
+
assert(payload2.origin.clientInfo.localNetworkPrefix === '128.0.0.0');
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
it('should create payload with masked IPv6', () => {
|
|
77
|
+
geoHintInfo.clientAddress = '2001:0db8:0000:08d3:0000:0000:0070:0000';
|
|
78
|
+
webex.meetings = {
|
|
79
|
+
geoHintInfo
|
|
80
|
+
};
|
|
81
|
+
metrics.initialSetup({}, webex);
|
|
82
|
+
const payload = metrics.initPayload('myIPv6Metric', {}, {clientType: 'TEAMS_CLIENT'});
|
|
83
|
+
|
|
84
|
+
assert(payload.origin.clientInfo.localNetworkPrefix === '2001:d00::');
|
|
85
|
+
assert(payload.event.name === 'myIPv6Metric');
|
|
86
|
+
|
|
87
|
+
const payload2 = metrics.initMediaPayload('myIPv6Metric', {}, {clientType: 'TEAMS_CLIENT'});
|
|
88
|
+
|
|
89
|
+
assert(payload2.origin.clientInfo.localNetworkPrefix === '2001:d00::');
|
|
90
|
+
});
|
|
91
|
+
});
|
|
92
|
+
|
|
52
93
|
describe('#sendOperationalMetric', () => {
|
|
53
94
|
it('sends client metric via Metrics plugin', () => {
|
|
54
95
|
metrics.sendOperationalMetric('myMetric');
|