@webex/plugin-meetings 2.2.3 → 2.2.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.
@@ -50,11 +50,12 @@ var _BrowserDetection = (0, _browserDetection.default)(),
50
50
  getOSName = _BrowserDetection.getOSName,
51
51
  getOSVersion = _BrowserDetection.getOSVersion,
52
52
  getBrowserName = _BrowserDetection.getBrowserName,
53
- getBrowserVersion = _BrowserDetection.getBrowserVersion; // Apply a CIDR /28 format to the IP address
53
+ getBrowserVersion = _BrowserDetection.getBrowserVersion; // Apply a CIDR /28 format to the IPV4 and /96 to the IPV6 addresses
54
+ // For reference : https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing
54
55
 
55
56
 
56
57
  var anonymizeIPAddress = function anonymizeIPAddress(localIp) {
57
- return (0, _ipAnonymize.default)(localIp);
58
+ return (0, _ipAnonymize.default)(localIp, 28, 96);
58
59
  };
59
60
 
60
61
  var triggerTimers = function triggerTimers(_ref) {
@@ -1 +1 @@
1
- {"version":3,"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"],"sources":["index.js"],"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"],"mappings":"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"}
1
+ {"version":3,"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"],"sources":["index.js"],"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 IPV4 and /96 to the IPV6 addresses\n// For reference : https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing\nconst anonymizeIPAddress = (localIp) => anonymize(localIp, 28, 96);\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"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@webex/plugin-meetings",
3
- "version": "2.2.3",
3
+ "version": "2.2.4",
4
4
  "description": "",
5
5
  "license": "MIT",
6
6
  "contributors": [
@@ -24,19 +24,19 @@
24
24
  },
25
25
  "dependencies": {
26
26
  "@babel/runtime-corejs2": "^7.14.8",
27
- "@webex/webex-core": "2.2.3",
28
- "@webex/internal-plugin-mercury": "2.2.3",
29
- "@webex/internal-plugin-conversation": "2.2.3",
27
+ "@webex/webex-core": "2.2.4",
28
+ "@webex/internal-plugin-mercury": "2.2.4",
29
+ "@webex/internal-plugin-conversation": "2.2.4",
30
30
  "webrtc-adapter": "^7.7.0",
31
31
  "lodash": "^4.17.21",
32
32
  "uuid": "^3.3.2",
33
33
  "global": "^4.4.0",
34
34
  "ip-anonymize": "^0.1.0",
35
- "@webex/common": "2.2.3",
35
+ "@webex/common": "2.2.4",
36
36
  "bowser": "^2.11.0",
37
37
  "sdp-transform": "^2.12.0",
38
38
  "readable-stream": "^3.6.0",
39
- "@webex/common-timers": "2.2.3",
39
+ "@webex/common-timers": "2.2.4",
40
40
  "btoa": "^1.2.1",
41
41
  "javascript-state-machine": "^3.1.0",
42
42
  "envify": "^4.1.0"
@@ -33,8 +33,9 @@ const {
33
33
  getBrowserVersion
34
34
  } = BrowserDetection();
35
35
 
36
- // Apply a CIDR /28 format to the IP address
37
- const anonymizeIPAddress = (localIp) => anonymize(localIp);
36
+ // Apply a CIDR /28 format to the IPV4 and /96 to the IPV6 addresses
37
+ // For reference : https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing
38
+ const anonymizeIPAddress = (localIp) => anonymize(localIp, 28, 96);
38
39
 
39
40
  const triggerTimers = ({event, meeting, data}) => {
40
41
  switch (event) {
@@ -76,12 +76,12 @@ browserOnly(describe)('Meeting metrics', () => {
76
76
  metrics.initialSetup({}, webex);
77
77
  const payload = metrics.initPayload('myIPv6Metric', {}, {clientType: 'TEAMS_CLIENT'});
78
78
 
79
- assert(payload.origin.clientInfo.localNetworkPrefix === '2001:d00::');
79
+ assert(payload.origin.clientInfo.localNetworkPrefix === '2001:db8:0:8d3::');
80
80
  assert(payload.event.name === 'myIPv6Metric');
81
81
 
82
82
  const payload2 = metrics.initMediaPayload('myIPv6Metric', {}, {clientType: 'TEAMS_CLIENT'});
83
83
 
84
- assert(payload2.origin.clientInfo.localNetworkPrefix === '2001:d00::');
84
+ assert(payload2.origin.clientInfo.localNetworkPrefix === '2001:db8:0:8d3::');
85
85
  });
86
86
  });
87
87