@webex/internal-plugin-metrics 3.0.0-next.9 → 3.1.0-next.1

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.
Files changed (32) hide show
  1. package/dist/call-diagnostic/call-diagnostic-metrics-latencies.js +33 -9
  2. package/dist/call-diagnostic/call-diagnostic-metrics-latencies.js.map +1 -1
  3. package/dist/call-diagnostic/call-diagnostic-metrics.js +1 -0
  4. package/dist/call-diagnostic/call-diagnostic-metrics.js.map +1 -1
  5. package/dist/call-diagnostic/call-diagnostic-metrics.util.js +4 -2
  6. package/dist/call-diagnostic/call-diagnostic-metrics.util.js.map +1 -1
  7. package/dist/client-metrics-prelogin-batcher.js +32 -0
  8. package/dist/client-metrics-prelogin-batcher.js.map +1 -0
  9. package/dist/metrics.js +6 -25
  10. package/dist/metrics.js.map +1 -1
  11. package/dist/metrics.types.js.map +1 -1
  12. package/dist/prelogin-metrics-batcher.js +1 -1
  13. package/dist/prelogin-metrics-batcher.js.map +1 -1
  14. package/dist/types/call-diagnostic/call-diagnostic-metrics-latencies.d.ts +18 -7
  15. package/dist/types/call-diagnostic/call-diagnostic-metrics.d.ts +2 -2
  16. package/dist/types/client-metrics-prelogin-batcher.d.ts +2 -0
  17. package/dist/types/metrics.types.d.ts +1 -1
  18. package/package.json +12 -12
  19. package/src/call-diagnostic/call-diagnostic-metrics-latencies.ts +36 -10
  20. package/src/call-diagnostic/call-diagnostic-metrics.ts +1 -0
  21. package/src/call-diagnostic/call-diagnostic-metrics.util.ts +11 -2
  22. package/src/client-metrics-prelogin-batcher.ts +26 -0
  23. package/src/metrics.js +5 -23
  24. package/src/metrics.types.ts +3 -1
  25. package/src/prelogin-metrics-batcher.ts +1 -1
  26. package/test/unit/spec/call-diagnostic/call-diagnostic-metrics-batcher.ts +9 -1
  27. package/test/unit/spec/call-diagnostic/call-diagnostic-metrics-latencies.ts +47 -22
  28. package/test/unit/spec/call-diagnostic/call-diagnostic-metrics.ts +57 -23
  29. package/test/unit/spec/call-diagnostic/call-diagnostic-metrics.util.ts +27 -13
  30. package/test/unit/spec/client-metrics-prelogin-batcher.ts +54 -0
  31. package/test/unit/spec/metrics.js +1 -31
  32. package/test/unit/spec/prelogin-metrics-batcher.ts +5 -3
@@ -1 +1 @@
1
- {"version":3,"names":["_ipAnonymize","_interopRequireDefault","require","_util","_common","_webexCore","_lodash","_config","_BrowserDetection","BrowserDetection","getOSName","getOSVersion","getBrowserName","getBrowserVersion","anonymizeIPAddress","exports","localIp","anonymize","userAgentToString","_ref","clientName","webexVersion","userAgentOption","browserInfo","clientInfo","util","format","concat","indexOf","toLowerCase","split","osInfo","process","env","NODE_ENV","clearEmptyKeysRecursively","obj","_keys","default","length","forEach","key","_typeof2","_isArray","isEmpty","_toConsumableArray2","filter","x","isLocusServiceErrorCode","errorCode","code","charAt","isMeetingInfoServiceError","rawError","_rawError$body","_rawError$body$data","_rawError$body2","_rawError$body2$url","body","data","meetingInfo","url","includes","WBX_APP_API_URL","isNetworkError","WebexHttpError","NetworkOrCORSError","isUnauthorizedError","Unauthorized","isSdpOfferCreationError","name","ERROR_DESCRIPTIONS","SDP_OFFER_CREATION_ERROR","isBrowserMediaErrorName","errorName","BROWSER_MEDIA_ERROR_NAME_TO_CLIENT_ERROR_CODES_MAP","getBuildType","webClientDomain","markAsTestEvent","arguments","undefined","prepareDiagnosticMetricItem","webex","item","_item$eventPayload","_item$eventPayload$ev","_item$eventPayload$ev2","_item$eventPayload2","_item$eventPayload2$e","_item$eventPayload2$e2","_item$eventPayload3","_item$eventPayload3$e","origin","buildType","eventPayload","event","eventData","networkType","eventName","joinTimes","audioSetupDelay","videoSetupDelay","cdl","internal","newMetrics","callDiagnosticLatencies","downloadTime","getDownloadTimeJMT","otherAppApiReqResp","getOtherAppApiReqResp","exchangeCITokenJMT","getExchangeCITokenJMT","meetingInfoReqResp","getMeetingInfoReqResp","clickToInterstitial","getClickToInterstitial","refreshCaptchaServiceReqResp","getRefreshCaptchaReqResp","showInterstitialTime","getShowInterstitialTime","registerWDMDeviceJMT","getRegisterWDMDeviceJMT","getU2CTime","callInitJoinReq","getCallInitJoinReq","joinReqResp","getJoinReqResp","pageJmt","getPageJMT","interstitialToJoinOK","getInterstitialToJoinOK","totalJmt","getTotalJMT","clientJmt","getClientJMT","ICESetupTime","getICESetupTime","audioICESetupTime","getAudioICESetupTime","videoICESetupTime","getVideoICESetupTime","shareICESetupTime","getShareICESetupTime","localSDPGenRemoteSDPRecv","getLocalSDPGenRemoteSDPRecv","totalMediaJMT","getTotalMediaJMT","interstitialToMediaOKJMT","getInterstitialToMediaOKJMT","callInitMediaEngineReady","getCallInitMediaEngineReady","stayLobbyTime","getStayLobbyTime","joinRespRxStart","getAudioJoinRespRxStart","joinRespTxStart","getAudioJoinRespTxStart","getVideoJoinRespRxStart","getVideoJoinRespTxStart","merge","_assign","logger","log","_stringify","latencies","Object","fromEntries","latencyTimestamps","setMetricTimings","options","json","_body$metrics","JSON","parse","now","Date","toISOString","metrics","metric","originTime","triggered","sent","extractVersionMetadata","version","_version$split","_version$split2","_slicedToArray2","majorVersion","minorVersion","_parseInt2","generateClientErrorCodeForIceFailure","_ref2","signalingState","iceConnectionState","turnServerUsed","ICE_FAILURE_CLIENT_CODE","MISSING_ROAP_ANSWER_CLIENT_CODE","DTLS_HANDSHAKE_FAILED_CLIENT_CODE","ICE_FAILED_WITH_TURN_TLS_CLIENT_CODE","ICE_FAILED_WITHOUT_TURN_TLS_CLIENT_CODE"],"sources":["call-diagnostic-metrics.util.ts"],"sourcesContent":["/* eslint-disable valid-jsdoc */\nimport anonymize from 'ip-anonymize';\nimport util from 'util';\n\nimport {BrowserDetection} from '@webex/common';\nimport {WebexHttpError} from '@webex/webex-core';\nimport {isEmpty, merge} from 'lodash';\nimport {\n ClientEvent,\n Event,\n MediaQualityEventAudioSetupDelayPayload,\n MediaQualityEventVideoSetupDelayPayload,\n MetricEventNames,\n} from '../metrics.types';\nimport {\n BROWSER_MEDIA_ERROR_NAME_TO_CLIENT_ERROR_CODES_MAP,\n DTLS_HANDSHAKE_FAILED_CLIENT_CODE,\n ICE_FAILED_WITHOUT_TURN_TLS_CLIENT_CODE,\n ICE_FAILED_WITH_TURN_TLS_CLIENT_CODE,\n ICE_FAILURE_CLIENT_CODE,\n MISSING_ROAP_ANSWER_CLIENT_CODE,\n WBX_APP_API_URL,\n ERROR_DESCRIPTIONS,\n} from './config';\n\nconst {getOSName, getOSVersion, getBrowserName, getBrowserVersion} = BrowserDetection();\n\nexport const anonymizeIPAddress = (localIp) => anonymize(localIp, 28, 96);\n\n/**\n * Returns a formated string of the user agent.\n *\n * @returns {string} formatted user agent information\n */\nexport const userAgentToString = ({clientName, webexVersion}) => {\n let userAgentOption;\n let browserInfo;\n const clientInfo = util.format('client=%s', `${clientName}`);\n\n if (\n ['chrome', 'firefox', 'msie', 'msedge', 'safari'].indexOf(getBrowserName().toLowerCase()) !== -1\n ) {\n browserInfo = util.format(\n 'browser=%s',\n `${getBrowserName().toLowerCase()}/${getBrowserVersion().split('.')[0]}`\n );\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\n ? `${userAgentOption}; ${clientInfo}; ${osInfo}`\n : `${clientInfo}; (${osInfo}`;\n }\n if (userAgentOption) {\n userAgentOption += ')';\n\n return util.format(\n 'webex-js-sdk/%s %s',\n `${process.env.NODE_ENV}-${webexVersion}`,\n userAgentOption\n );\n }\n\n return util.format('webex-js-sdk/%s', `${process.env.NODE_ENV}-${webexVersion}`);\n};\n\n/**\n * Iterates object recursively and removes any\n * property that returns isEmpty for it's associated value\n * isEmpty = implementation from Lodash.\n *\n * It modifies the object in place (mutable)\n *\n * @param obj - input\n * @returns\n */\nexport const clearEmptyKeysRecursively = (obj: any) => {\n // Check if the object is empty\n if (Object.keys(obj).length === 0) {\n return;\n }\n\n Object.keys(obj).forEach((key) => {\n if (\n (typeof obj[key] === 'object' || typeof obj[key] === 'string' || Array.isArray(obj[key])) &&\n isEmpty(obj[key])\n ) {\n delete obj[key];\n }\n if (Array.isArray(obj[key])) {\n obj[key] = [...obj[key].filter((x) => !!x)];\n }\n if (typeof obj[key] === 'object') {\n clearEmptyKeysRecursively(obj[key]);\n }\n });\n};\n\n/**\n * Locus error codes start with 2. The next three digits are the\n * HTTP status code related to the error code (like 400, 403, 502, etc.)\n * The remaining three digits are just an increasing integer.\n * If it is 7 digits and starts with a 2, it is locus.\n *\n * @param errorCode\n * @returns {boolean}\n */\nexport const isLocusServiceErrorCode = (errorCode: string | number) => {\n const code = `${errorCode}`;\n\n if (code.length === 7 && code.charAt(0) === '2') {\n return true;\n }\n\n return false;\n};\n\n/**\n * MeetingInfo errors sometimes has body.data.meetingInfo object\n * MeetingInfo errors come with a wbxappapi url\n *\n * @param {Object} rawError\n * @returns {boolean}\n */\nexport const isMeetingInfoServiceError = (rawError: any) => {\n if (rawError.body?.data?.meetingInfo || rawError.body?.url?.includes(WBX_APP_API_URL)) {\n return true;\n }\n\n return false;\n};\n\n/**\n * Returns true if the raw error is a network related error\n *\n * @param {Object} rawError\n * @returns {boolean}\n */\nexport const isNetworkError = (rawError: any) => {\n if (rawError instanceof WebexHttpError.NetworkOrCORSError) {\n return true;\n }\n\n return false;\n};\n\n/**\n * Returns true if the error is an unauthorized error\n *\n * @param {Object} rawError\n * @returns {boolean}\n */\nexport const isUnauthorizedError = (rawError: any) => {\n if (rawError instanceof WebexHttpError.Unauthorized) {\n return true;\n }\n\n return false;\n};\n\n/**\n * Returns true if the error is an SdpOfferCreation error\n *\n * @param {Object} rawError\n * @returns {boolean}\n */\nexport const isSdpOfferCreationError = (rawError: any) => {\n // would LIKE to do rawError instanceof Errors.SdpOfferCreationError\n // but including internal-media-core in plugin-metrics breaks meetings and metrics unit tests\n if (rawError.name === ERROR_DESCRIPTIONS.SDP_OFFER_CREATION_ERROR) {\n return true;\n }\n\n return false;\n};\n\n/**\n * MDN Media Devices getUserMedia() method returns a name if it errs\n * Documentation can be found here: https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/getUserMedia\n *\n * @param errorCode\n * @returns\n */\nexport const isBrowserMediaErrorName = (errorName: any) => {\n if (BROWSER_MEDIA_ERROR_NAME_TO_CLIENT_ERROR_CODES_MAP[errorName]) {\n return true;\n }\n\n return false;\n};\n\n/**\n * @param webClientDomain\n * @returns\n */\nexport const getBuildType = (\n webClientDomain,\n markAsTestEvent = false\n): Event['origin']['buildType'] => {\n // used temporary to test pre join in production without creating noise data, SPARK-468456\n if (markAsTestEvent) {\n return 'test';\n }\n\n if (\n webClientDomain?.includes('localhost') ||\n webClientDomain?.includes('127.0.0.1') ||\n process.env.NODE_ENV !== 'production'\n ) {\n return 'test';\n }\n\n return 'prod';\n};\n\n/**\n * Prepare metric item for submission.\n * @param {Object} webex sdk instance\n * @param {Object} item\n * @returns {Object} prepared item\n */\nexport const prepareDiagnosticMetricItem = (webex: any, item: any) => {\n const origin: Partial<Event['origin']> = {\n buildType: exports.getBuildType(\n item.eventPayload?.event?.eventData?.webClientDomain,\n item.eventPayload?.event?.eventData?.markAsTestEvent\n ),\n networkType: 'unknown',\n };\n\n // check event names and append latencies?\n const eventName = item.eventPayload?.event?.name as MetricEventNames;\n const joinTimes: ClientEvent['payload']['joinTimes'] = {};\n const audioSetupDelay: MediaQualityEventAudioSetupDelayPayload = {};\n const videoSetupDelay: MediaQualityEventVideoSetupDelayPayload = {};\n\n const cdl = webex.internal.newMetrics.callDiagnosticLatencies;\n\n switch (eventName) {\n case 'client.webexapp.launched':\n joinTimes.downloadTime = cdl.getDownloadTimeJMT();\n break;\n case 'client.login.end':\n joinTimes.otherAppApiReqResp = cdl.getOtherAppApiReqResp();\n joinTimes.exchangeCITokenJMT = cdl.getExchangeCITokenJMT();\n break;\n case 'client.interstitial-window.launched':\n joinTimes.meetingInfoReqResp = cdl.getMeetingInfoReqResp();\n joinTimes.clickToInterstitial = cdl.getClickToInterstitial();\n joinTimes.refreshCaptchaServiceReqResp = cdl.getRefreshCaptchaReqResp();\n break;\n\n case 'client.call.initiated':\n joinTimes.meetingInfoReqResp = cdl.getMeetingInfoReqResp();\n joinTimes.showInterstitialTime = cdl.getShowInterstitialTime();\n joinTimes.registerWDMDeviceJMT = cdl.getRegisterWDMDeviceJMT();\n joinTimes.getU2CTime = cdl.getU2CTime();\n break;\n\n case 'client.locus.join.response':\n joinTimes.meetingInfoReqResp = cdl.getMeetingInfoReqResp();\n joinTimes.callInitJoinReq = cdl.getCallInitJoinReq();\n joinTimes.joinReqResp = cdl.getJoinReqResp();\n joinTimes.pageJmt = cdl.getPageJMT();\n joinTimes.clickToInterstitial = cdl.getClickToInterstitial();\n joinTimes.interstitialToJoinOK = cdl.getInterstitialToJoinOK();\n joinTimes.totalJmt = cdl.getTotalJMT();\n joinTimes.clientJmt = cdl.getClientJMT();\n joinTimes.downloadTime = cdl.getDownloadTimeJMT();\n break;\n\n case 'client.ice.end':\n joinTimes.ICESetupTime = cdl.getICESetupTime();\n joinTimes.audioICESetupTime = cdl.getAudioICESetupTime();\n joinTimes.videoICESetupTime = cdl.getVideoICESetupTime();\n joinTimes.shareICESetupTime = cdl.getShareICESetupTime();\n break;\n\n case 'client.media.rx.start':\n joinTimes.localSDPGenRemoteSDPRecv = cdl.getLocalSDPGenRemoteSDPRecv();\n break;\n\n case 'client.media-engine.ready':\n joinTimes.totalMediaJMT = cdl.getTotalMediaJMT();\n joinTimes.interstitialToMediaOKJMT = cdl.getInterstitialToMediaOKJMT();\n joinTimes.callInitMediaEngineReady = cdl.getCallInitMediaEngineReady();\n joinTimes.stayLobbyTime = cdl.getStayLobbyTime();\n break;\n\n case 'client.mediaquality.event':\n audioSetupDelay.joinRespRxStart = cdl.getAudioJoinRespRxStart();\n audioSetupDelay.joinRespTxStart = cdl.getAudioJoinRespTxStart();\n videoSetupDelay.joinRespRxStart = cdl.getVideoJoinRespRxStart();\n videoSetupDelay.joinRespTxStart = cdl.getVideoJoinRespTxStart();\n }\n\n if (!isEmpty(joinTimes)) {\n item.eventPayload.event = merge(item.eventPayload.event, {joinTimes});\n }\n\n if (!isEmpty(audioSetupDelay)) {\n item.eventPayload.event = merge(item.eventPayload.event, {audioSetupDelay});\n }\n\n if (!isEmpty(videoSetupDelay)) {\n item.eventPayload.event = merge(item.eventPayload.event, {videoSetupDelay});\n }\n\n item.eventPayload.origin = Object.assign(origin, item.eventPayload.origin);\n\n // @ts-ignore\n webex.logger.log(\n `CallDiagnosticLatencies,prepareDiagnosticMetricItem: ${JSON.stringify({\n latencies: Object.fromEntries(cdl.latencyTimestamps),\n event: item,\n })}`\n );\n\n return item;\n};\n\n/**\n * Sets the originTime value(s) before the request/fetch.\n * This function is only useful if you are about to submit a metrics\n * request using pre-built fetch options;\n *\n * @param {any} options\n * @returns {any} the updated options object\n */\nexport const setMetricTimings = (options) => {\n if (options.body && options.json) {\n const body = JSON.parse(options.body);\n\n const now = new Date().toISOString();\n body.metrics?.forEach((metric) => {\n if (metric.eventPayload) {\n // The event will effectively be triggered and sent at the same time.\n // The existing triggered time is from when the options were built.\n metric.eventPayload.originTime = {\n triggered: now,\n sent: now,\n };\n }\n });\n options.body = JSON.stringify(body);\n }\n\n return options;\n};\n\nexport const extractVersionMetadata = (version: string) => {\n // extract major and minor version\n const [majorVersion, minorVersion] = version.split('.');\n\n return {\n majorVersion: parseInt(majorVersion, 10),\n minorVersion: parseInt(minorVersion, 10),\n };\n};\n\n/**\n * Generates client error codes for specific ice failures\n * that happen when trying to add media in a meeting.\n */\nexport const generateClientErrorCodeForIceFailure = ({\n signalingState,\n iceConnectionState,\n turnServerUsed,\n}: {\n signalingState: RTCPeerConnection['signalingState'];\n iceConnectionState: RTCPeerConnection['iceConnectionState'];\n turnServerUsed: boolean;\n}) => {\n let errorCode = ICE_FAILURE_CLIENT_CODE; // default;\n\n if (signalingState === 'have-local-offer') {\n errorCode = MISSING_ROAP_ANSWER_CLIENT_CODE;\n }\n\n if (signalingState === 'stable' && iceConnectionState === 'connected') {\n errorCode = DTLS_HANDSHAKE_FAILED_CLIENT_CODE;\n }\n\n if (signalingState !== 'have-local-offer' && iceConnectionState !== 'connected') {\n if (turnServerUsed) {\n errorCode = ICE_FAILED_WITH_TURN_TLS_CLIENT_CODE;\n } else {\n errorCode = ICE_FAILED_WITHOUT_TURN_TLS_CLIENT_CODE;\n }\n }\n\n return errorCode;\n};\n"],"mappings":"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"}
1
+ {"version":3,"names":["_ipAnonymize","_interopRequireDefault","require","_util","_common","_webexCore","_lodash","_config","_BrowserDetection","BrowserDetection","getOSName","getOSVersion","getBrowserName","getBrowserVersion","anonymizeIPAddress","exports","localIp","anonymize","userAgentToString","_ref","clientName","webexVersion","userAgentOption","browserInfo","clientInfo","util","format","concat","indexOf","toLowerCase","split","osInfo","process","env","NODE_ENV","clearEmptyKeysRecursively","obj","_keys","default","length","forEach","key","_typeof2","_isArray","isEmpty","_toConsumableArray2","filter","x","isLocusServiceErrorCode","errorCode","code","charAt","isMeetingInfoServiceError","rawError","_rawError$body","_rawError$body$data","_rawError$body2","_rawError$body2$url","body","data","meetingInfo","url","includes","WBX_APP_API_URL","isNetworkError","WebexHttpError","NetworkOrCORSError","isUnauthorizedError","Unauthorized","isSdpOfferCreationError","name","ERROR_DESCRIPTIONS","SDP_OFFER_CREATION_ERROR","isBrowserMediaErrorName","errorName","BROWSER_MEDIA_ERROR_NAME_TO_CLIENT_ERROR_CODES_MAP","getBuildType","webClientDomain","markAsTestEvent","arguments","undefined","prepareDiagnosticMetricItem","webex","item","_item$eventPayload","_item$eventPayload$ev","_item$eventPayload$ev2","_item$eventPayload2","_item$eventPayload2$e","_item$eventPayload2$e2","_item$eventPayload3","_item$eventPayload3$e","origin","buildType","eventPayload","event","eventData","networkType","eventName","joinTimes","audioSetupDelay","videoSetupDelay","cdl","internal","newMetrics","callDiagnosticLatencies","downloadTime","getDownloadTimeJMT","otherAppApiReqResp","getOtherAppApiReqResp","exchangeCITokenJMT","getExchangeCITokenJMT","meetingInfoReqResp","getMeetingInfoReqResp","clickToInterstitial","getClickToInterstitial","refreshCaptchaServiceReqResp","getRefreshCaptchaReqResp","downloadIntelligenceModelsReqResp","getDownloadIntelligenceModelsReqResp","showInterstitialTime","getShowInterstitialTime","registerWDMDeviceJMT","getRegisterWDMDeviceJMT","getU2CTime","getReachabilityClustersReqResp","callInitJoinReq","getCallInitJoinReq","joinReqResp","getJoinReqResp","pageJmt","getPageJMT","interstitialToJoinOK","getInterstitialToJoinOK","totalJmt","getTotalJMT","clientJmt","getClientJMT","ICESetupTime","getICESetupTime","audioICESetupTime","getAudioICESetupTime","videoICESetupTime","getVideoICESetupTime","shareICESetupTime","getShareICESetupTime","localSDPGenRemoteSDPRecv","getLocalSDPGenRemoteSDPRecv","totalMediaJMT","getTotalMediaJMT","interstitialToMediaOKJMT","getInterstitialToMediaOKJMT","callInitMediaEngineReady","getCallInitMediaEngineReady","stayLobbyTime","getStayLobbyTime","joinRespRxStart","getAudioJoinRespRxStart","joinRespTxStart","getAudioJoinRespTxStart","getVideoJoinRespRxStart","getVideoJoinRespTxStart","merge","_assign","logger","log","_stringify","latencies","Object","fromEntries","latencyTimestamps","setMetricTimings","options","json","_body$metrics","JSON","parse","now","Date","toISOString","metrics","metric","originTime","triggered","sent","extractVersionMetadata","version","_version$split","_version$split2","_slicedToArray2","majorVersion","minorVersion","_parseInt2","generateClientErrorCodeForIceFailure","_ref2","signalingState","iceConnectionState","turnServerUsed","ICE_FAILURE_CLIENT_CODE","MISSING_ROAP_ANSWER_CLIENT_CODE","DTLS_HANDSHAKE_FAILED_CLIENT_CODE","ICE_FAILED_WITH_TURN_TLS_CLIENT_CODE","ICE_FAILED_WITHOUT_TURN_TLS_CLIENT_CODE"],"sources":["call-diagnostic-metrics.util.ts"],"sourcesContent":["/* eslint-disable valid-jsdoc */\nimport anonymize from 'ip-anonymize';\nimport util from 'util';\n\nimport {BrowserDetection} from '@webex/common';\nimport {WebexHttpError} from '@webex/webex-core';\nimport {isEmpty, merge} from 'lodash';\nimport {\n ClientEvent,\n Event,\n MediaQualityEventAudioSetupDelayPayload,\n MediaQualityEventVideoSetupDelayPayload,\n MetricEventNames,\n} from '../metrics.types';\nimport {\n BROWSER_MEDIA_ERROR_NAME_TO_CLIENT_ERROR_CODES_MAP,\n DTLS_HANDSHAKE_FAILED_CLIENT_CODE,\n ICE_FAILED_WITHOUT_TURN_TLS_CLIENT_CODE,\n ICE_FAILED_WITH_TURN_TLS_CLIENT_CODE,\n ICE_FAILURE_CLIENT_CODE,\n MISSING_ROAP_ANSWER_CLIENT_CODE,\n WBX_APP_API_URL,\n ERROR_DESCRIPTIONS,\n} from './config';\n\nconst {getOSName, getOSVersion, getBrowserName, getBrowserVersion} = BrowserDetection();\n\nexport const anonymizeIPAddress = (localIp) => anonymize(localIp, 28, 96);\n\n/**\n * Returns a formated string of the user agent.\n *\n * @returns {string} formatted user agent information\n */\nexport const userAgentToString = ({clientName, webexVersion}) => {\n let userAgentOption;\n let browserInfo;\n const clientInfo = util.format('client=%s', `${clientName}`);\n\n if (\n ['chrome', 'firefox', 'msie', 'msedge', 'safari'].indexOf(getBrowserName().toLowerCase()) !== -1\n ) {\n browserInfo = util.format(\n 'browser=%s',\n `${getBrowserName().toLowerCase()}/${getBrowserVersion().split('.')[0]}`\n );\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\n ? `${userAgentOption}; ${clientInfo}; ${osInfo}`\n : `${clientInfo}; (${osInfo}`;\n }\n if (userAgentOption) {\n userAgentOption += ')';\n\n return util.format(\n 'webex-js-sdk/%s %s',\n `${process.env.NODE_ENV}-${webexVersion}`,\n userAgentOption\n );\n }\n\n return util.format('webex-js-sdk/%s', `${process.env.NODE_ENV}-${webexVersion}`);\n};\n\n/**\n * Iterates object recursively and removes any\n * property that returns isEmpty for it's associated value\n * isEmpty = implementation from Lodash.\n *\n * It modifies the object in place (mutable)\n *\n * @param obj - input\n * @returns\n */\nexport const clearEmptyKeysRecursively = (obj: any) => {\n // Check if the object is empty\n if (Object.keys(obj).length === 0) {\n return;\n }\n\n Object.keys(obj).forEach((key) => {\n if (\n (typeof obj[key] === 'object' || typeof obj[key] === 'string' || Array.isArray(obj[key])) &&\n isEmpty(obj[key])\n ) {\n delete obj[key];\n }\n if (Array.isArray(obj[key])) {\n obj[key] = [...obj[key].filter((x) => !!x)];\n }\n if (typeof obj[key] === 'object') {\n clearEmptyKeysRecursively(obj[key]);\n }\n });\n};\n\n/**\n * Locus error codes start with 2. The next three digits are the\n * HTTP status code related to the error code (like 400, 403, 502, etc.)\n * The remaining three digits are just an increasing integer.\n * If it is 7 digits and starts with a 2, it is locus.\n *\n * @param errorCode\n * @returns {boolean}\n */\nexport const isLocusServiceErrorCode = (errorCode: string | number) => {\n const code = `${errorCode}`;\n\n if (code.length === 7 && code.charAt(0) === '2') {\n return true;\n }\n\n return false;\n};\n\n/**\n * MeetingInfo errors sometimes has body.data.meetingInfo object\n * MeetingInfo errors come with a wbxappapi url\n *\n * @param {Object} rawError\n * @returns {boolean}\n */\nexport const isMeetingInfoServiceError = (rawError: any) => {\n if (rawError.body?.data?.meetingInfo || rawError.body?.url?.includes(WBX_APP_API_URL)) {\n return true;\n }\n\n return false;\n};\n\n/**\n * Returns true if the raw error is a network related error\n *\n * @param {Object} rawError\n * @returns {boolean}\n */\nexport const isNetworkError = (rawError: any) => {\n if (rawError instanceof WebexHttpError.NetworkOrCORSError) {\n return true;\n }\n\n return false;\n};\n\n/**\n * Returns true if the error is an unauthorized error\n *\n * @param {Object} rawError\n * @returns {boolean}\n */\nexport const isUnauthorizedError = (rawError: any) => {\n if (rawError instanceof WebexHttpError.Unauthorized) {\n return true;\n }\n\n return false;\n};\n\n/**\n * Returns true if the error is an SdpOfferCreation error\n *\n * @param {Object} rawError\n * @returns {boolean}\n */\nexport const isSdpOfferCreationError = (rawError: any) => {\n // would LIKE to do rawError instanceof Errors.SdpOfferCreationError\n // but including internal-media-core in plugin-metrics breaks meetings and metrics unit tests\n if (rawError.name === ERROR_DESCRIPTIONS.SDP_OFFER_CREATION_ERROR) {\n return true;\n }\n\n return false;\n};\n\n/**\n * MDN Media Devices getUserMedia() method returns a name if it errs\n * Documentation can be found here: https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/getUserMedia\n *\n * @param errorCode\n * @returns\n */\nexport const isBrowserMediaErrorName = (errorName: any) => {\n if (BROWSER_MEDIA_ERROR_NAME_TO_CLIENT_ERROR_CODES_MAP[errorName]) {\n return true;\n }\n\n return false;\n};\n\n/**\n * @param webClientDomain\n * @returns\n */\nexport const getBuildType = (\n webClientDomain,\n markAsTestEvent = false\n): Event['origin']['buildType'] => {\n // used temporary to test pre join in production without creating noise data, SPARK-468456\n if (markAsTestEvent) {\n return 'test';\n }\n\n if (\n webClientDomain?.includes('localhost') ||\n webClientDomain?.includes('127.0.0.1') ||\n process.env.NODE_ENV !== 'production'\n ) {\n return 'test';\n }\n\n return 'prod';\n};\n\n/**\n * Prepare metric item for submission.\n * @param {Object} webex sdk instance\n * @param {Object} item\n * @returns {Object} prepared item\n */\nexport const prepareDiagnosticMetricItem = (webex: any, item: any) => {\n const origin: Partial<Event['origin']> = {\n buildType: exports.getBuildType(\n item.eventPayload?.event?.eventData?.webClientDomain,\n item.eventPayload?.event?.eventData?.markAsTestEvent\n ),\n networkType: 'unknown',\n };\n\n // check event names and append latencies?\n const eventName = item.eventPayload?.event?.name as MetricEventNames;\n const joinTimes: ClientEvent['payload']['joinTimes'] = {};\n const audioSetupDelay: MediaQualityEventAudioSetupDelayPayload = {};\n const videoSetupDelay: MediaQualityEventVideoSetupDelayPayload = {};\n\n const cdl = webex.internal.newMetrics.callDiagnosticLatencies;\n\n switch (eventName) {\n case 'client.webexapp.launched':\n joinTimes.downloadTime = cdl.getDownloadTimeJMT();\n break;\n case 'client.login.end':\n joinTimes.otherAppApiReqResp = cdl.getOtherAppApiReqResp();\n joinTimes.exchangeCITokenJMT = cdl.getExchangeCITokenJMT();\n break;\n case 'client.interstitial-window.launched':\n joinTimes.meetingInfoReqResp = cdl.getMeetingInfoReqResp();\n joinTimes.clickToInterstitial = cdl.getClickToInterstitial();\n joinTimes.refreshCaptchaServiceReqResp = cdl.getRefreshCaptchaReqResp();\n joinTimes.downloadIntelligenceModelsReqResp = cdl.getDownloadIntelligenceModelsReqResp();\n break;\n\n case 'client.call.initiated':\n joinTimes.meetingInfoReqResp = cdl.getMeetingInfoReqResp();\n joinTimes.showInterstitialTime = cdl.getShowInterstitialTime();\n joinTimes.registerWDMDeviceJMT = cdl.getRegisterWDMDeviceJMT();\n joinTimes.getU2CTime = cdl.getU2CTime();\n joinTimes.getReachabilityClustersReqResp = cdl.getReachabilityClustersReqResp();\n break;\n\n case 'client.locus.join.response':\n joinTimes.meetingInfoReqResp = cdl.getMeetingInfoReqResp();\n joinTimes.callInitJoinReq = cdl.getCallInitJoinReq();\n joinTimes.joinReqResp = cdl.getJoinReqResp();\n joinTimes.pageJmt = cdl.getPageJMT();\n joinTimes.clickToInterstitial = cdl.getClickToInterstitial();\n joinTimes.interstitialToJoinOK = cdl.getInterstitialToJoinOK();\n joinTimes.totalJmt = cdl.getTotalJMT();\n joinTimes.clientJmt = cdl.getClientJMT();\n joinTimes.downloadTime = cdl.getDownloadTimeJMT();\n break;\n\n case 'client.ice.end':\n joinTimes.ICESetupTime = cdl.getICESetupTime();\n joinTimes.audioICESetupTime = cdl.getAudioICESetupTime();\n joinTimes.videoICESetupTime = cdl.getVideoICESetupTime();\n joinTimes.shareICESetupTime = cdl.getShareICESetupTime();\n break;\n\n case 'client.media.rx.start':\n joinTimes.localSDPGenRemoteSDPRecv = cdl.getLocalSDPGenRemoteSDPRecv();\n break;\n\n case 'client.media-engine.ready':\n joinTimes.totalMediaJMT = cdl.getTotalMediaJMT();\n joinTimes.interstitialToMediaOKJMT = cdl.getInterstitialToMediaOKJMT();\n joinTimes.callInitMediaEngineReady = cdl.getCallInitMediaEngineReady();\n joinTimes.stayLobbyTime = cdl.getStayLobbyTime();\n break;\n\n case 'client.mediaquality.event':\n audioSetupDelay.joinRespRxStart = cdl.getAudioJoinRespRxStart();\n audioSetupDelay.joinRespTxStart = cdl.getAudioJoinRespTxStart();\n videoSetupDelay.joinRespRxStart = cdl.getVideoJoinRespRxStart();\n videoSetupDelay.joinRespTxStart = cdl.getVideoJoinRespTxStart();\n }\n\n if (!isEmpty(joinTimes)) {\n item.eventPayload.event = merge(item.eventPayload.event, {joinTimes});\n }\n\n if (!isEmpty(audioSetupDelay)) {\n item.eventPayload.event = merge(item.eventPayload.event, {audioSetupDelay});\n }\n\n if (!isEmpty(videoSetupDelay)) {\n item.eventPayload.event = merge(item.eventPayload.event, {videoSetupDelay});\n }\n\n item.eventPayload.origin = Object.assign(origin, item.eventPayload.origin);\n\n // @ts-ignore\n webex.logger.log(\n `CallDiagnosticLatencies,prepareDiagnosticMetricItem: ${JSON.stringify({\n latencies: Object.fromEntries(cdl.latencyTimestamps),\n event: item,\n })}`\n );\n\n return item;\n};\n\n/**\n * Sets the originTime value(s) before the request/fetch.\n * This function is only useful if you are about to submit a metrics\n * request using pre-built fetch options;\n *\n * @param {any} options\n * @returns {any} the updated options object\n */\nexport const setMetricTimings = (options) => {\n if (options.body && options.json) {\n const body = JSON.parse(options.body);\n\n const now = new Date().toISOString();\n body.metrics?.forEach((metric) => {\n if (metric.eventPayload) {\n // The event will effectively be triggered and sent at the same time.\n // The existing triggered time is from when the options were built.\n metric.eventPayload.originTime = {\n triggered: now,\n sent: now,\n };\n }\n });\n options.body = JSON.stringify(body);\n }\n\n return options;\n};\n\nexport const extractVersionMetadata = (version: string) => {\n // extract major and minor version\n const [majorVersion, minorVersion] = version.split('.');\n\n return {\n majorVersion: parseInt(majorVersion, 10),\n minorVersion: parseInt(minorVersion, 10),\n };\n};\n\n/**\n * Generates client error codes for specific ice failures\n * that happen when trying to add media in a meeting.\n */\nexport const generateClientErrorCodeForIceFailure = ({\n signalingState,\n iceConnectionState,\n turnServerUsed,\n}: {\n signalingState: RTCPeerConnection['signalingState'];\n iceConnectionState: RTCPeerConnection['iceConnectionState'];\n turnServerUsed: boolean;\n}) => {\n let errorCode = ICE_FAILURE_CLIENT_CODE; // default;\n\n if (signalingState === 'have-local-offer') {\n errorCode = MISSING_ROAP_ANSWER_CLIENT_CODE;\n }\n\n if (\n signalingState === 'stable' &&\n (iceConnectionState === 'connected' || iceConnectionState === 'disconnected')\n ) {\n errorCode = DTLS_HANDSHAKE_FAILED_CLIENT_CODE;\n }\n\n if (\n signalingState !== 'have-local-offer' &&\n iceConnectionState !== 'connected' &&\n iceConnectionState !== 'disconnected'\n ) {\n if (turnServerUsed) {\n errorCode = ICE_FAILED_WITH_TURN_TLS_CLIENT_CODE;\n } else {\n errorCode = ICE_FAILED_WITHOUT_TURN_TLS_CLIENT_CODE;\n }\n }\n\n return errorCode;\n};\n"],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+
3
+ var _Object$defineProperty = require("@babel/runtime-corejs2/core-js/object/define-property");
4
+ var _interopRequireDefault = require("@babel/runtime-corejs2/helpers/interopRequireDefault");
5
+ _Object$defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.default = void 0;
9
+ var _promise = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/promise"));
10
+ var _preloginMetricsBatcher = _interopRequireDefault(require("./prelogin-metrics-batcher"));
11
+ var ClientMetricsPreloginBatcher = _preloginMetricsBatcher.default.extend({
12
+ namespace: 'Metrics',
13
+ /**
14
+ * Prepare item
15
+ * @param {any} item
16
+ * @returns {Promise<any>}
17
+ */
18
+ prepareItem: function prepareItem(item) {
19
+ // Add more defaults to payload when the clientmetrics endpoint evolves to support richer payloads
20
+ return _promise.default.resolve(item);
21
+ },
22
+ /**
23
+ * Prepare request, add time sensitive date etc.
24
+ * @param {any[]} queue
25
+ * @returns {Promise<any[]>}
26
+ */
27
+ prepareRequest: function prepareRequest(queue) {
28
+ return _promise.default.resolve(queue);
29
+ }
30
+ });
31
+ var _default = exports.default = ClientMetricsPreloginBatcher;
32
+ //# sourceMappingURL=client-metrics-prelogin-batcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_preloginMetricsBatcher","_interopRequireDefault","require","ClientMetricsPreloginBatcher","PreLoginMetricsBatcher","extend","namespace","prepareItem","item","_promise","default","resolve","prepareRequest","queue","_default","exports"],"sources":["client-metrics-prelogin-batcher.ts"],"sourcesContent":["import PreLoginMetricsBatcher from './prelogin-metrics-batcher';\n\nconst ClientMetricsPreloginBatcher = PreLoginMetricsBatcher.extend({\n namespace: 'Metrics',\n\n /**\n * Prepare item\n * @param {any} item\n * @returns {Promise<any>}\n */\n prepareItem(item) {\n // Add more defaults to payload when the clientmetrics endpoint evolves to support richer payloads\n return Promise.resolve(item);\n },\n\n /**\n * Prepare request, add time sensitive date etc.\n * @param {any[]} queue\n * @returns {Promise<any[]>}\n */\n prepareRequest(queue) {\n return Promise.resolve(queue);\n },\n});\n\nexport default ClientMetricsPreloginBatcher;\n"],"mappings":";;;;;;;;;AAAA,IAAAA,uBAAA,GAAAC,sBAAA,CAAAC,OAAA;AAEA,IAAMC,4BAA4B,GAAGC,+BAAsB,CAACC,MAAM,CAAC;EACjEC,SAAS,EAAE,SAAS;EAEpB;AACF;AACA;AACA;AACA;EACEC,WAAW,WAAAA,YAACC,IAAI,EAAE;IAChB;IACA,OAAOC,QAAA,CAAAC,OAAA,CAAQC,OAAO,CAACH,IAAI,CAAC;EAC9B,CAAC;EAED;AACF;AACA;AACA;AACA;EACEI,cAAc,WAAAA,eAACC,KAAK,EAAE;IACpB,OAAOJ,QAAA,CAAAC,OAAA,CAAQC,OAAO,CAACE,KAAK,CAAC;EAC/B;AACF,CAAC,CAAC;AAAC,IAAAC,QAAA,GAAAC,OAAA,CAAAL,OAAA,GAEYP,4BAA4B"}
package/dist/metrics.js CHANGED
@@ -18,6 +18,7 @@ var _common = require("@webex/common");
18
18
  var _config = require("./config");
19
19
  var _batcher = _interopRequireDefault(require("./batcher"));
20
20
  var _clientMetricsBatcher = _interopRequireDefault(require("./client-metrics-batcher"));
21
+ var _clientMetricsPreloginBatcher = _interopRequireDefault(require("./client-metrics-prelogin-batcher"));
21
22
  function ownKeys(e, r) { var t = _Object$keys(e); if (_Object$getOwnPropertySymbols) { var o = _Object$getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return _Object$getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
22
23
  function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2.default)(e, r, t[r]); }) : _Object$getOwnPropertyDescriptors ? _Object$defineProperties(e, _Object$getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { _Object$defineProperty(e, r, _Object$getOwnPropertyDescriptor(t, r)); }); } return e; } /* eslint-disable default-param-last */ /*!
23
24
  * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.
@@ -49,7 +50,8 @@ function getSparkUserAgent(webex) {
49
50
  var Metrics = _webexCore.WebexPlugin.extend({
50
51
  children: {
51
52
  batcher: _batcher.default,
52
- clientMetricsBatcher: _clientMetricsBatcher.default
53
+ clientMetricsBatcher: _clientMetricsBatcher.default,
54
+ clientMetricsPreloginBatcher: _clientMetricsPreloginBatcher.default
53
55
  },
54
56
  namespace: 'Metrics',
55
57
  submit: function submit(key, value) {
@@ -122,14 +124,8 @@ var Metrics = _webexCore.WebexPlugin.extend({
122
124
  var preLoginId = arguments.length > 2 ? arguments[2] : undefined;
123
125
  var payload = this.getClientMetricsPayload(eventName, props);
124
126
  if (preLoginId) {
125
- var _payload = {
126
- metrics: [payload]
127
- };
128
-
129
- // Do not batch these because pre-login events occur during onboarding, so we will be partially blind
130
- // to users' progress through the reg flow if we wait to persist pre-login metrics for people who drop off because
131
- // their metrics will not post from a queue flush in time
132
- return this.postPreLoginMetric(_payload, preLoginId);
127
+ this.clientMetricsPreloginBatcher.savePreLoginId(preLoginId);
128
+ return this.clientMetricsPreloginBatcher.request(payload);
133
129
  }
134
130
  return this.clientMetricsBatcher.request(payload);
135
131
  },
@@ -152,22 +148,7 @@ var Metrics = _webexCore.WebexPlugin.extend({
152
148
  }
153
149
  });
154
150
  },
155
- postPreLoginMetric: function postPreLoginMetric(payload, preLoginId) {
156
- var _this = this;
157
- return this.webex.credentials.getClientToken().then(function (token) {
158
- return _this.request({
159
- method: 'POST',
160
- api: 'metrics',
161
- resource: 'clientmetrics-prelogin',
162
- headers: {
163
- authorization: token.toString(),
164
- 'x-prelogin-userid': preLoginId
165
- },
166
- body: payload
167
- });
168
- });
169
- },
170
- version: "3.0.0-next.9"
151
+ version: "3.1.0-next.1"
171
152
  });
172
153
  var _default = exports.default = Metrics;
173
154
  //# sourceMappingURL=metrics.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["_webexCore","require","_common","_config","_batcher","_interopRequireDefault","_clientMetricsBatcher","ownKeys","e","r","t","_Object$keys","_Object$getOwnPropertySymbols","o","filter","_Object$getOwnPropertyDescriptor","enumerable","push","apply","_objectSpread","arguments","length","Object","forEach","_defineProperty2","default","_Object$getOwnPropertyDescriptors","_Object$defineProperties","_Object$defineProperty","_BrowserDetection","BrowserDetection","getOSName","getOSVersion","getBrowserName","getBrowserVersion","getOSNameInternal","_OSMap$getOSName","OSMap","OS_NAME","OTHERS","getSparkUserAgent","webex","_webex$config","_ref","config","appName","appVersion","appPlatform","sparkUserAgent","CLIENT_NAME","concat","Metrics","WebexPlugin","extend","children","batcher","Batcher","clientMetricsBatcher","ClientMetricsBatcher","namespace","submit","key","value","request","getClientMetricsPayload","eventName","props","_this$webex$meetings","_this$webex$meetings$","_this$webex$meetings$2","Error","payload","metricName","providedClientVersion","meetings","metrics","clientVersion","tags","browser","os","domain","window","location","hostname","fields","browser_version","os_version","sdk_version","version","platform","spark_user_agent","client_id","credentials","type","context","app","locale","name","eventPayload","timestamp","Date","valueOf","submitClientMetrics","undefined","preLoginId","_payload","postPreLoginMetric","aliasUser","method","api","resource","headers","body","qs","alias","_this","getClientToken","then","token","authorization","toString","_default","exports"],"sources":["metrics.js"],"sourcesContent":["/* eslint-disable default-param-last */\n\n/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\nimport {WebexPlugin} from '@webex/webex-core';\nimport {BrowserDetection} from '@webex/common';\nimport {OS_NAME, OSMap, CLIENT_NAME} from './config';\n\nimport Batcher from './batcher';\nimport ClientMetricsBatcher from './client-metrics-batcher';\n\nconst {getOSName, getOSVersion, getBrowserName, getBrowserVersion} = BrowserDetection();\n\nexport function getOSNameInternal() {\n return OSMap[getOSName()] ?? OS_NAME.OTHERS;\n}\n\nfunction getSparkUserAgent(webex) {\n const {appName, appVersion, appPlatform} = webex?.config ?? {};\n\n let sparkUserAgent = CLIENT_NAME;\n\n if (appName) {\n sparkUserAgent += ` ${appName}/${appVersion ?? '0.0'}`;\n }\n\n if (appPlatform) {\n sparkUserAgent += ` ${appPlatform}`;\n }\n\n return sparkUserAgent;\n}\n\nconst Metrics = WebexPlugin.extend({\n children: {\n batcher: Batcher,\n clientMetricsBatcher: ClientMetricsBatcher,\n },\n\n namespace: 'Metrics',\n\n submit(key, value) {\n return this.batcher.request({key, ...value});\n },\n\n /**\n * Returns the payload for submitting client metrics.\n * @param {string} eventName\n * @param {any} props\n * @returns {any} - the payload\n */\n getClientMetricsPayload(eventName, props) {\n if (!eventName) {\n throw Error('Missing behavioral metric name. Please provide one');\n }\n const payload = {metricName: eventName};\n // @ts-ignore\n const providedClientVersion = this.webex.meetings?.config?.metrics?.clientVersion;\n\n payload.tags = {\n ...props.tags,\n browser: getBrowserName(),\n os: getOSNameInternal(),\n appVersion: providedClientVersion,\n\n // Node does not like this so we need to check if it exists or not\n // eslint-disable-next-line no-undef\n domain:\n typeof window !== 'undefined' ? window.location.hostname || 'non-browser' : 'non-browser', // Check what else we could measure\n };\n\n payload.fields = {\n ...props.fields,\n browser_version: getBrowserVersion(),\n os_version: getOSVersion(),\n sdk_version: this.webex.version,\n platform: 'Web',\n spark_user_agent: getSparkUserAgent(this.webex),\n client_id: this.webex.credentials.config.client_id,\n };\n\n payload.type = props.type || this.webex.config.metrics.type;\n\n payload.context = {\n ...props.context,\n app: {\n version: this.webex.version,\n },\n locale: 'en-US',\n os: {\n name: getOSNameInternal(),\n version: getOSVersion(),\n },\n };\n\n if (props.eventPayload) {\n payload.eventPayload = props.eventPayload;\n }\n\n // Mocking the time in tests when running in node\n // is impossible so unable to use Date.now()\n payload.timestamp = new Date().valueOf();\n\n return payload;\n },\n\n /**\n * This corresponds to #sendSemiStructured() in the deprecated metrics handler\n * @param {string} eventName\n * @param {Object} props\n * @param {string} preLoginId\n * @returns {Object} HttpResponse object\n */\n submitClientMetrics(eventName, props = {}, preLoginId) {\n const payload = this.getClientMetricsPayload(eventName, props);\n\n if (preLoginId) {\n const _payload = {\n metrics: [payload],\n };\n\n // Do not batch these because pre-login events occur during onboarding, so we will be partially blind\n // to users' progress through the reg flow if we wait to persist pre-login metrics for people who drop off because\n // their metrics will not post from a queue flush in time\n return this.postPreLoginMetric(_payload, preLoginId);\n }\n\n return this.clientMetricsBatcher.request(payload);\n },\n\n /**\n * Issue request to alias a user's pre-login ID with their CI UUID\n * @param {string} preLoginId\n * @returns {Object} HttpResponse object\n */\n aliasUser(preLoginId) {\n return this.request({\n method: 'POST',\n api: 'metrics',\n resource: 'clientmetrics',\n headers: {\n 'x-prelogin-userid': preLoginId,\n },\n body: {},\n qs: {\n alias: true,\n },\n });\n },\n\n postPreLoginMetric(payload, preLoginId) {\n return this.webex.credentials.getClientToken().then((token) =>\n this.request({\n method: 'POST',\n api: 'metrics',\n resource: 'clientmetrics-prelogin',\n headers: {\n authorization: token.toString(),\n 'x-prelogin-userid': preLoginId,\n },\n body: payload,\n })\n );\n },\n});\n\nexport default Metrics;\n"],"mappings":"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"}
1
+ {"version":3,"names":["_webexCore","require","_common","_config","_batcher","_interopRequireDefault","_clientMetricsBatcher","_clientMetricsPreloginBatcher","ownKeys","e","r","t","_Object$keys","_Object$getOwnPropertySymbols","o","filter","_Object$getOwnPropertyDescriptor","enumerable","push","apply","_objectSpread","arguments","length","Object","forEach","_defineProperty2","default","_Object$getOwnPropertyDescriptors","_Object$defineProperties","_Object$defineProperty","_BrowserDetection","BrowserDetection","getOSName","getOSVersion","getBrowserName","getBrowserVersion","getOSNameInternal","_OSMap$getOSName","OSMap","OS_NAME","OTHERS","getSparkUserAgent","webex","_webex$config","_ref","config","appName","appVersion","appPlatform","sparkUserAgent","CLIENT_NAME","concat","Metrics","WebexPlugin","extend","children","batcher","Batcher","clientMetricsBatcher","ClientMetricsBatcher","clientMetricsPreloginBatcher","ClientMetricsPreloginBatcher","namespace","submit","key","value","request","getClientMetricsPayload","eventName","props","_this$webex$meetings","_this$webex$meetings$","_this$webex$meetings$2","Error","payload","metricName","providedClientVersion","meetings","metrics","clientVersion","tags","browser","os","domain","window","location","hostname","fields","browser_version","os_version","sdk_version","version","platform","spark_user_agent","client_id","credentials","type","context","app","locale","name","eventPayload","timestamp","Date","valueOf","submitClientMetrics","undefined","preLoginId","savePreLoginId","aliasUser","method","api","resource","headers","body","qs","alias","_default","exports"],"sources":["metrics.js"],"sourcesContent":["/* eslint-disable default-param-last */\n\n/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\nimport {WebexPlugin} from '@webex/webex-core';\nimport {BrowserDetection} from '@webex/common';\nimport {OS_NAME, OSMap, CLIENT_NAME} from './config';\n\nimport Batcher from './batcher';\nimport ClientMetricsBatcher from './client-metrics-batcher';\nimport ClientMetricsPreloginBatcher from './client-metrics-prelogin-batcher';\n\nconst {getOSName, getOSVersion, getBrowserName, getBrowserVersion} = BrowserDetection();\n\nexport function getOSNameInternal() {\n return OSMap[getOSName()] ?? OS_NAME.OTHERS;\n}\n\nfunction getSparkUserAgent(webex) {\n const {appName, appVersion, appPlatform} = webex?.config ?? {};\n\n let sparkUserAgent = CLIENT_NAME;\n\n if (appName) {\n sparkUserAgent += ` ${appName}/${appVersion ?? '0.0'}`;\n }\n\n if (appPlatform) {\n sparkUserAgent += ` ${appPlatform}`;\n }\n\n return sparkUserAgent;\n}\n\nconst Metrics = WebexPlugin.extend({\n children: {\n batcher: Batcher,\n clientMetricsBatcher: ClientMetricsBatcher,\n clientMetricsPreloginBatcher: ClientMetricsPreloginBatcher,\n },\n\n namespace: 'Metrics',\n\n submit(key, value) {\n return this.batcher.request({key, ...value});\n },\n\n /**\n * Returns the payload for submitting client metrics.\n * @param {string} eventName\n * @param {any} props\n * @returns {any} - the payload\n */\n getClientMetricsPayload(eventName, props) {\n if (!eventName) {\n throw Error('Missing behavioral metric name. Please provide one');\n }\n const payload = {metricName: eventName};\n // @ts-ignore\n const providedClientVersion = this.webex.meetings?.config?.metrics?.clientVersion;\n\n payload.tags = {\n ...props.tags,\n browser: getBrowserName(),\n os: getOSNameInternal(),\n appVersion: providedClientVersion,\n\n // Node does not like this so we need to check if it exists or not\n // eslint-disable-next-line no-undef\n domain:\n typeof window !== 'undefined' ? window.location.hostname || 'non-browser' : 'non-browser', // Check what else we could measure\n };\n\n payload.fields = {\n ...props.fields,\n browser_version: getBrowserVersion(),\n os_version: getOSVersion(),\n sdk_version: this.webex.version,\n platform: 'Web',\n spark_user_agent: getSparkUserAgent(this.webex),\n client_id: this.webex.credentials.config.client_id,\n };\n\n payload.type = props.type || this.webex.config.metrics.type;\n\n payload.context = {\n ...props.context,\n app: {\n version: this.webex.version,\n },\n locale: 'en-US',\n os: {\n name: getOSNameInternal(),\n version: getOSVersion(),\n },\n };\n\n if (props.eventPayload) {\n payload.eventPayload = props.eventPayload;\n }\n\n // Mocking the time in tests when running in node\n // is impossible so unable to use Date.now()\n payload.timestamp = new Date().valueOf();\n\n return payload;\n },\n\n /**\n * This corresponds to #sendSemiStructured() in the deprecated metrics handler\n * @param {string} eventName\n * @param {Object} props\n * @param {string} preLoginId\n * @returns {Object} HttpResponse object\n */\n submitClientMetrics(eventName, props = {}, preLoginId) {\n const payload = this.getClientMetricsPayload(eventName, props);\n\n if (preLoginId) {\n this.clientMetricsPreloginBatcher.savePreLoginId(preLoginId);\n\n return this.clientMetricsPreloginBatcher.request(payload);\n }\n\n return this.clientMetricsBatcher.request(payload);\n },\n\n /**\n * Issue request to alias a user's pre-login ID with their CI UUID\n * @param {string} preLoginId\n * @returns {Object} HttpResponse object\n */\n aliasUser(preLoginId) {\n return this.request({\n method: 'POST',\n api: 'metrics',\n resource: 'clientmetrics',\n headers: {\n 'x-prelogin-userid': preLoginId,\n },\n body: {},\n qs: {\n alias: true,\n },\n });\n },\n});\n\nexport default Metrics;\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["metrics.types.ts"],"sourcesContent":["import {\n ClientEvent as RawClientEvent,\n Event as RawEvent,\n MediaQualityEvent as RawMediaQualityEvent,\n} from '@webex/event-dictionary-ts';\n\nexport type Event = Omit<RawEvent, 'event'> & {event: RawClientEvent | RawMediaQualityEvent};\n\nexport type ClientEventError = NonNullable<RawClientEvent['errors']>[0];\n\nexport type EnvironmentType = NonNullable<RawEvent['origin']['environment']>;\n\nexport type NewEnvironmentType = NonNullable<RawEvent['origin']['newEnvironment']>;\n\nexport type ClientLaunchMethodType = NonNullable<\n RawEvent['origin']['clientInfo']\n>['clientLaunchMethod'];\n\nexport type BrowserLaunchMethodType = NonNullable<\n RawEvent['origin']['clientInfo']\n>['browserLaunchMethod'];\n\nexport type SubmitClientEventOptions = {\n meetingId?: string;\n mediaConnections?: any[];\n rawError?: any;\n correlationId?: string;\n preLoginId?: string;\n environment?: EnvironmentType;\n newEnvironmentType?: NewEnvironmentType;\n clientLaunchMethod?: ClientLaunchMethodType;\n browserLaunchMethod?: BrowserLaunchMethodType;\n webexConferenceIdStr?: string;\n globalMeetingId?: string;\n};\n\nexport type SubmitMQEOptions = {\n meetingId: string;\n mediaConnections?: any[];\n networkType?: Event['origin']['networkType'];\n webexConferenceIdStr?: string;\n globalMeetingId?: string;\n};\n\nexport type InternalEvent = {\n name:\n | 'internal.client.meetinginfo.request'\n | 'internal.client.meetinginfo.response'\n | 'internal.register.device.request'\n | 'internal.register.device.response'\n | 'internal.reset.join.latencies'\n | 'internal.client.meeting.click.joinbutton'\n | 'internal.host.meeting.participant.admitted'\n | 'internal.client.meeting.interstitial-window.showed'\n | 'internal.client.interstitial-window.click.joinbutton'\n | 'internal.client.add-media.turn-discovery.start'\n | 'internal.client.add-media.turn-discovery.end';\n\n payload?: never;\n options?: never;\n};\n\nexport interface ClientEvent {\n name: RawClientEvent['name'];\n payload?: RawClientEvent;\n options?: SubmitClientEventOptions;\n}\n\nexport interface BehavioralEvent {\n // TODO: not implemented\n name: 'host.meeting.participant.admitted' | 'sdk.media-flow.started';\n payload?: never;\n options?: never;\n}\n\nexport interface OperationalEvent {\n // TODO: not implemented\n name: never;\n payload?: never;\n options?: never;\n}\n\nexport interface FeatureEvent {\n // TODO: not implemented\n name: never;\n payload?: never;\n options?: never;\n}\n\nexport interface MediaQualityEvent {\n name: RawMediaQualityEvent['name'];\n payload?: RawMediaQualityEvent;\n options: SubmitMQEOptions;\n}\n\nexport type RecursivePartial<T> = {\n [P in keyof T]?: T[P] extends (infer U)[]\n ? RecursivePartial<U>[]\n : T[P] extends object\n ? RecursivePartial<T[P]>\n : T[P];\n};\n\nexport type MetricEventNames =\n | InternalEvent['name']\n | ClientEvent['name']\n | BehavioralEvent['name']\n | OperationalEvent['name']\n | FeatureEvent['name']\n | MediaQualityEvent['name'];\n\nexport type ClientInfo = NonNullable<RawEvent['origin']['clientInfo']>;\nexport type ClientType = NonNullable<RawEvent['origin']['clientInfo']>['clientType'];\nexport type SubClientType = NonNullable<RawEvent['origin']['clientInfo']>['subClientType'];\nexport type NetworkType = NonNullable<RawEvent['origin']>['networkType'];\n\nexport type ClientSubServiceType = ClientEvent['payload']['webexSubServiceType'];\nexport type ClientEventPayload = RecursivePartial<ClientEvent['payload']>;\nexport type ClientEventLeaveReason = ClientEvent['payload']['leaveReason'];\nexport type ClientEventPayloadError = ClientEvent['payload']['errors'];\n\nexport type MediaQualityEventAudioSetupDelayPayload = NonNullable<\n MediaQualityEvent['payload']\n>['audioSetupDelay'];\nexport type MediaQualityEventVideoSetupDelayPayload = NonNullable<\n MediaQualityEvent['payload']\n>['videoSetupDelay'];\n\nexport type SubmitMQEPayload = RecursivePartial<MediaQualityEvent['payload']> & {\n intervals: NonNullable<MediaQualityEvent['payload']>['intervals'];\n};\n\nexport type SubmitInternalEvent = (args: {\n name: InternalEvent['name'];\n payload?: RecursivePartial<InternalEvent['payload']>;\n options?: any;\n}) => void;\n\nexport type SubmitBehavioralEvent = (args: {\n name: BehavioralEvent['name'];\n payload?: RecursivePartial<BehavioralEvent['payload']>;\n options?: any;\n}) => void;\n\nexport type SubmitClientEvent = (args: {\n name: ClientEvent['name'];\n payload?: RecursivePartial<ClientEvent['payload']>;\n options?: SubmitClientEventOptions;\n}) => Promise<any>;\n\nexport type SubmitOperationalEvent = (args: {\n name: OperationalEvent['name'];\n payload?: RecursivePartial<OperationalEvent['payload']>;\n options?: any;\n}) => void;\n\nexport type SubmitMQE = (args: {\n name: MediaQualityEvent['name'];\n payload: SubmitMQEPayload;\n options: any;\n}) => void;\n\nexport type BuildClientEventFetchRequestOptions = (args: {\n name: ClientEvent['name'];\n payload?: RecursivePartial<ClientEvent['payload']>;\n options?: SubmitClientEventOptions;\n}) => Promise<any>;\n\nexport type PreComputedLatencies =\n | 'internal.client.pageJMT'\n | 'internal.download.time'\n | 'internal.click.to.interstitial'\n | 'internal.refresh.captcha.time'\n | 'internal.exchange.ci.token.time'\n | 'internal.get.u2c.time'\n | 'internal.call.init.join.req'\n | 'internal.other.app.api.time';\n"],"mappings":""}
1
+ {"version":3,"names":[],"sources":["metrics.types.ts"],"sourcesContent":["import {\n ClientEvent as RawClientEvent,\n Event as RawEvent,\n MediaQualityEvent as RawMediaQualityEvent,\n} from '@webex/event-dictionary-ts';\n\nexport type Event = Omit<RawEvent, 'event'> & {event: RawClientEvent | RawMediaQualityEvent};\n\nexport type ClientEventError = NonNullable<RawClientEvent['errors']>[0];\n\nexport type EnvironmentType = NonNullable<RawEvent['origin']['environment']>;\n\nexport type NewEnvironmentType = NonNullable<RawEvent['origin']['newEnvironment']>;\n\nexport type ClientLaunchMethodType = NonNullable<\n RawEvent['origin']['clientInfo']\n>['clientLaunchMethod'];\n\nexport type BrowserLaunchMethodType = NonNullable<\n RawEvent['origin']['clientInfo']\n>['browserLaunchMethod'];\n\nexport type SubmitClientEventOptions = {\n meetingId?: string;\n mediaConnections?: any[];\n rawError?: any;\n correlationId?: string;\n preLoginId?: string;\n environment?: EnvironmentType;\n newEnvironmentType?: NewEnvironmentType;\n clientLaunchMethod?: ClientLaunchMethodType;\n browserLaunchMethod?: BrowserLaunchMethodType;\n webexConferenceIdStr?: string;\n globalMeetingId?: string;\n};\n\nexport type SubmitMQEOptions = {\n meetingId: string;\n mediaConnections?: any[];\n networkType?: Event['origin']['networkType'];\n webexConferenceIdStr?: string;\n globalMeetingId?: string;\n};\n\nexport type InternalEvent = {\n name:\n | 'internal.client.meetinginfo.request'\n | 'internal.client.meetinginfo.response'\n | 'internal.register.device.request'\n | 'internal.register.device.response'\n | 'internal.reset.join.latencies'\n | 'internal.client.meeting.click.joinbutton'\n | 'internal.host.meeting.participant.admitted'\n | 'internal.client.meeting.interstitial-window.showed'\n | 'internal.client.interstitial-window.click.joinbutton'\n | 'internal.client.add-media.turn-discovery.start'\n | 'internal.client.add-media.turn-discovery.end';\n\n payload?: never;\n options?: never;\n};\n\nexport interface ClientEvent {\n name: RawClientEvent['name'];\n payload?: RawClientEvent;\n options?: SubmitClientEventOptions;\n}\n\nexport interface BehavioralEvent {\n // TODO: not implemented\n name: 'host.meeting.participant.admitted' | 'sdk.media-flow.started';\n payload?: never;\n options?: never;\n}\n\nexport interface OperationalEvent {\n // TODO: not implemented\n name: never;\n payload?: never;\n options?: never;\n}\n\nexport interface FeatureEvent {\n // TODO: not implemented\n name: never;\n payload?: never;\n options?: never;\n}\n\nexport interface MediaQualityEvent {\n name: RawMediaQualityEvent['name'];\n payload?: RawMediaQualityEvent;\n options: SubmitMQEOptions;\n}\n\nexport type RecursivePartial<T> = {\n [P in keyof T]?: T[P] extends (infer U)[]\n ? RecursivePartial<U>[]\n : T[P] extends object\n ? RecursivePartial<T[P]>\n : T[P];\n};\n\nexport type MetricEventNames =\n | InternalEvent['name']\n | ClientEvent['name']\n | BehavioralEvent['name']\n | OperationalEvent['name']\n | FeatureEvent['name']\n | MediaQualityEvent['name'];\n\nexport type ClientInfo = NonNullable<RawEvent['origin']['clientInfo']>;\nexport type ClientType = NonNullable<RawEvent['origin']['clientInfo']>['clientType'];\nexport type SubClientType = NonNullable<RawEvent['origin']['clientInfo']>['subClientType'];\nexport type NetworkType = NonNullable<RawEvent['origin']>['networkType'];\n\nexport type ClientSubServiceType = ClientEvent['payload']['webexSubServiceType'];\nexport type ClientEventPayload = RecursivePartial<ClientEvent['payload']>;\nexport type ClientEventLeaveReason = ClientEvent['payload']['leaveReason'];\nexport type ClientEventPayloadError = ClientEvent['payload']['errors'];\n\nexport type MediaQualityEventAudioSetupDelayPayload = NonNullable<\n MediaQualityEvent['payload']\n>['audioSetupDelay'];\nexport type MediaQualityEventVideoSetupDelayPayload = NonNullable<\n MediaQualityEvent['payload']\n>['videoSetupDelay'];\n\nexport type SubmitMQEPayload = RecursivePartial<MediaQualityEvent['payload']> & {\n intervals: NonNullable<MediaQualityEvent['payload']>['intervals'];\n};\n\nexport type SubmitInternalEvent = (args: {\n name: InternalEvent['name'];\n payload?: RecursivePartial<InternalEvent['payload']>;\n options?: any;\n}) => void;\n\nexport type SubmitBehavioralEvent = (args: {\n name: BehavioralEvent['name'];\n payload?: RecursivePartial<BehavioralEvent['payload']>;\n options?: any;\n}) => void;\n\nexport type SubmitClientEvent = (args: {\n name: ClientEvent['name'];\n payload?: RecursivePartial<ClientEvent['payload']>;\n options?: SubmitClientEventOptions;\n}) => Promise<any>;\n\nexport type SubmitOperationalEvent = (args: {\n name: OperationalEvent['name'];\n payload?: RecursivePartial<OperationalEvent['payload']>;\n options?: any;\n}) => void;\n\nexport type SubmitMQE = (args: {\n name: MediaQualityEvent['name'];\n payload: SubmitMQEPayload;\n options: any;\n}) => void;\n\nexport type BuildClientEventFetchRequestOptions = (args: {\n name: ClientEvent['name'];\n payload?: RecursivePartial<ClientEvent['payload']>;\n options?: SubmitClientEventOptions;\n}) => Promise<any>;\n\nexport type PreComputedLatencies =\n | 'internal.client.pageJMT'\n | 'internal.download.time'\n | 'internal.get.cluster.time'\n | 'internal.click.to.interstitial'\n | 'internal.refresh.captcha.time'\n | 'internal.exchange.ci.token.time'\n | 'internal.get.u2c.time'\n | 'internal.call.init.join.req'\n | 'internal.other.app.api.time'\n | 'internal.api.fetch.intelligence.models';\n"],"mappings":""}
@@ -51,7 +51,7 @@ var PreLoginMetricsBatcher = _batcher.default.extend({
51
51
  */
52
52
  submitHttpRequest: function submitHttpRequest(payload) {
53
53
  var _this = this;
54
- var batchId = (0, _lodash.uniqueId)('prelogin-ca-batch-');
54
+ var batchId = (0, _lodash.uniqueId)('prelogin-batch-');
55
55
  if (this.preLoginId === undefined) {
56
56
  this.webex.logger.error(PRE_LOGIN_METRICS_IDENTIFIER, "PreLoginMetricsBatcher: @submitHttpRequest#".concat(batchId, ". PreLoginId is not set."));
57
57
  return _promise.default.reject(new Error('PreLoginId is not set.'));
@@ -1 +1 @@
1
- {"version":3,"names":["_lodash","require","_batcher","_interopRequireDefault","_callDiagnosticMetrics","_utils","PRE_LOGIN_METRICS_IDENTIFIER","PreLoginMetricsBatcher","Batcher","extend","namespace","preLoginId","undefined","savePreLoginId","prepareItem","item","_promise","default","resolve","prepareDiagnosticMetricItem","webex","prepareRequest","queue","forEach","eventPayload","originTime","sent","Date","toISOString","submitHttpRequest","payload","_this","batchId","uniqueId","logger","error","concat","reject","Error","request","method","service","resource","headers","authorization","body","metrics","waitForServiceTimeout","config","then","res","log","catch","err","generateCommonErrorMetadata","_default","exports"],"sources":["prelogin-metrics-batcher.ts"],"sourcesContent":["import {uniqueId} from 'lodash';\nimport Batcher from './batcher';\nimport {prepareDiagnosticMetricItem} from './call-diagnostic/call-diagnostic-metrics.util';\nimport {generateCommonErrorMetadata} from './utils';\n\nconst PRE_LOGIN_METRICS_IDENTIFIER = 'Pre Login Metrics -->';\n\nconst PreLoginMetricsBatcher = Batcher.extend({\n namespace: 'Metrics',\n preLoginId: undefined,\n\n /**\n * Save the pre-login ID.\n * @param {string} preLoginId The pre-login ID to be saved.\n * @returns {void}\n */\n savePreLoginId(preLoginId) {\n this.preLoginId = preLoginId;\n },\n\n /**\n * Prepare item\n * @param {any} item\n * @returns {Promise<any>}\n */\n prepareItem(item) {\n return Promise.resolve(prepareDiagnosticMetricItem(this.webex, item));\n },\n\n /**\n * Prepare request, add time sensitive date etc.\n * @param {any[]} queue\n * @returns {Promise<any[]>}\n */\n prepareRequest(queue) {\n // Add sent timestamp\n queue.forEach((item) => {\n item.eventPayload.originTime = item.eventPayload.originTime || {};\n item.eventPayload.originTime.sent = new Date().toISOString();\n });\n\n return Promise.resolve(queue);\n },\n\n /**\n *\n * @param {any} payload\n * @returns {Promise<any>}\n */\n submitHttpRequest(payload: any) {\n const batchId = uniqueId('prelogin-ca-batch-');\n if (this.preLoginId === undefined) {\n this.webex.logger.error(\n PRE_LOGIN_METRICS_IDENTIFIER,\n `PreLoginMetricsBatcher: @submitHttpRequest#${batchId}. PreLoginId is not set.`\n );\n\n return Promise.reject(new Error('PreLoginId is not set.'));\n }\n\n return this.webex\n .request({\n method: 'POST',\n service: 'metrics',\n resource: 'clientmetrics-prelogin',\n headers: {\n authorization: false,\n 'x-prelogin-userid': this.preLoginId,\n },\n body: {\n metrics: payload,\n },\n waitForServiceTimeout: this.webex.config.metrics.waitForServiceTimeout,\n })\n .then((res) => {\n this.webex.logger.log(\n PRE_LOGIN_METRICS_IDENTIFIER,\n `PreLoginMetricsBatcher: @submitHttpRequest#${batchId}. Request successful.`\n );\n\n return res;\n })\n .catch((err) => {\n this.webex.logger.error(\n PRE_LOGIN_METRICS_IDENTIFIER,\n `PreLoginMetricsBatcher: @submitHttpRequest#${batchId}. Request failed:`,\n `error: ${generateCommonErrorMetadata(err)}`\n );\n\n return Promise.reject(err);\n });\n },\n});\n\nexport default PreLoginMetricsBatcher;\n"],"mappings":"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"}
1
+ {"version":3,"names":["_lodash","require","_batcher","_interopRequireDefault","_callDiagnosticMetrics","_utils","PRE_LOGIN_METRICS_IDENTIFIER","PreLoginMetricsBatcher","Batcher","extend","namespace","preLoginId","undefined","savePreLoginId","prepareItem","item","_promise","default","resolve","prepareDiagnosticMetricItem","webex","prepareRequest","queue","forEach","eventPayload","originTime","sent","Date","toISOString","submitHttpRequest","payload","_this","batchId","uniqueId","logger","error","concat","reject","Error","request","method","service","resource","headers","authorization","body","metrics","waitForServiceTimeout","config","then","res","log","catch","err","generateCommonErrorMetadata","_default","exports"],"sources":["prelogin-metrics-batcher.ts"],"sourcesContent":["import {uniqueId} from 'lodash';\nimport Batcher from './batcher';\nimport {prepareDiagnosticMetricItem} from './call-diagnostic/call-diagnostic-metrics.util';\nimport {generateCommonErrorMetadata} from './utils';\n\nconst PRE_LOGIN_METRICS_IDENTIFIER = 'Pre Login Metrics -->';\n\nconst PreLoginMetricsBatcher = Batcher.extend({\n namespace: 'Metrics',\n preLoginId: undefined,\n\n /**\n * Save the pre-login ID.\n * @param {string} preLoginId The pre-login ID to be saved.\n * @returns {void}\n */\n savePreLoginId(preLoginId) {\n this.preLoginId = preLoginId;\n },\n\n /**\n * Prepare item\n * @param {any} item\n * @returns {Promise<any>}\n */\n prepareItem(item) {\n return Promise.resolve(prepareDiagnosticMetricItem(this.webex, item));\n },\n\n /**\n * Prepare request, add time sensitive date etc.\n * @param {any[]} queue\n * @returns {Promise<any[]>}\n */\n prepareRequest(queue) {\n // Add sent timestamp\n queue.forEach((item) => {\n item.eventPayload.originTime = item.eventPayload.originTime || {};\n item.eventPayload.originTime.sent = new Date().toISOString();\n });\n\n return Promise.resolve(queue);\n },\n\n /**\n *\n * @param {any} payload\n * @returns {Promise<any>}\n */\n submitHttpRequest(payload: any) {\n const batchId = uniqueId('prelogin-batch-');\n if (this.preLoginId === undefined) {\n this.webex.logger.error(\n PRE_LOGIN_METRICS_IDENTIFIER,\n `PreLoginMetricsBatcher: @submitHttpRequest#${batchId}. PreLoginId is not set.`\n );\n\n return Promise.reject(new Error('PreLoginId is not set.'));\n }\n\n return this.webex\n .request({\n method: 'POST',\n service: 'metrics',\n resource: 'clientmetrics-prelogin',\n headers: {\n authorization: false,\n 'x-prelogin-userid': this.preLoginId,\n },\n body: {\n metrics: payload,\n },\n waitForServiceTimeout: this.webex.config.metrics.waitForServiceTimeout,\n })\n .then((res) => {\n this.webex.logger.log(\n PRE_LOGIN_METRICS_IDENTIFIER,\n `PreLoginMetricsBatcher: @submitHttpRequest#${batchId}. Request successful.`\n );\n\n return res;\n })\n .catch((err) => {\n this.webex.logger.error(\n PRE_LOGIN_METRICS_IDENTIFIER,\n `PreLoginMetricsBatcher: @submitHttpRequest#${batchId}. Request failed:`,\n `error: ${generateCommonErrorMetadata(err)}`\n );\n\n return Promise.reject(err);\n });\n },\n});\n\nexport default PreLoginMetricsBatcher;\n"],"mappings":";;;;;;;;;AAAA,IAAAA,OAAA,GAAAC,OAAA;AACA,IAAAC,QAAA,GAAAC,sBAAA,CAAAF,OAAA;AACA,IAAAG,sBAAA,GAAAH,OAAA;AACA,IAAAI,MAAA,GAAAJ,OAAA;AAEA,IAAMK,4BAA4B,GAAG,uBAAuB;AAE5D,IAAMC,sBAAsB,GAAGC,gBAAO,CAACC,MAAM,CAAC;EAC5CC,SAAS,EAAE,SAAS;EACpBC,UAAU,EAAEC,SAAS;EAErB;AACF;AACA;AACA;AACA;EACEC,cAAc,WAAAA,eAACF,UAAU,EAAE;IACzB,IAAI,CAACA,UAAU,GAAGA,UAAU;EAC9B,CAAC;EAED;AACF;AACA;AACA;AACA;EACEG,WAAW,WAAAA,YAACC,IAAI,EAAE;IAChB,OAAOC,QAAA,CAAAC,OAAA,CAAQC,OAAO,CAAC,IAAAC,kDAA2B,EAAC,IAAI,CAACC,KAAK,EAAEL,IAAI,CAAC,CAAC;EACvE,CAAC;EAED;AACF;AACA;AACA;AACA;EACEM,cAAc,WAAAA,eAACC,KAAK,EAAE;IACpB;IACAA,KAAK,CAACC,OAAO,CAAC,UAACR,IAAI,EAAK;MACtBA,IAAI,CAACS,YAAY,CAACC,UAAU,GAAGV,IAAI,CAACS,YAAY,CAACC,UAAU,IAAI,CAAC,CAAC;MACjEV,IAAI,CAACS,YAAY,CAACC,UAAU,CAACC,IAAI,GAAG,IAAIC,IAAI,CAAC,CAAC,CAACC,WAAW,CAAC,CAAC;IAC9D,CAAC,CAAC;IAEF,OAAOZ,QAAA,CAAAC,OAAA,CAAQC,OAAO,CAACI,KAAK,CAAC;EAC/B,CAAC;EAED;AACF;AACA;AACA;AACA;EACEO,iBAAiB,WAAAA,kBAACC,OAAY,EAAE;IAAA,IAAAC,KAAA;IAC9B,IAAMC,OAAO,GAAG,IAAAC,gBAAQ,EAAC,iBAAiB,CAAC;IAC3C,IAAI,IAAI,CAACtB,UAAU,KAAKC,SAAS,EAAE;MACjC,IAAI,CAACQ,KAAK,CAACc,MAAM,CAACC,KAAK,CACrB7B,4BAA4B,gDAAA8B,MAAA,CACkBJ,OAAO,6BACvD,CAAC;MAED,OAAOhB,QAAA,CAAAC,OAAA,CAAQoB,MAAM,CAAC,IAAIC,KAAK,CAAC,wBAAwB,CAAC,CAAC;IAC5D;IAEA,OAAO,IAAI,CAAClB,KAAK,CACdmB,OAAO,CAAC;MACPC,MAAM,EAAE,MAAM;MACdC,OAAO,EAAE,SAAS;MAClBC,QAAQ,EAAE,wBAAwB;MAClCC,OAAO,EAAE;QACPC,aAAa,EAAE,KAAK;QACpB,mBAAmB,EAAE,IAAI,CAACjC;MAC5B,CAAC;MACDkC,IAAI,EAAE;QACJC,OAAO,EAAEhB;MACX,CAAC;MACDiB,qBAAqB,EAAE,IAAI,CAAC3B,KAAK,CAAC4B,MAAM,CAACF,OAAO,CAACC;IACnD,CAAC,CAAC,CACDE,IAAI,CAAC,UAACC,GAAG,EAAK;MACbnB,KAAI,CAACX,KAAK,CAACc,MAAM,CAACiB,GAAG,CACnB7C,4BAA4B,gDAAA8B,MAAA,CACkBJ,OAAO,0BACvD,CAAC;MAED,OAAOkB,GAAG;IACZ,CAAC,CAAC,CACDE,KAAK,CAAC,UAACC,GAAG,EAAK;MACdtB,KAAI,CAACX,KAAK,CAACc,MAAM,CAACC,KAAK,CACrB7B,4BAA4B,gDAAA8B,MAAA,CACkBJ,OAAO,kCAAAI,MAAA,CAC3C,IAAAkB,kCAA2B,EAACD,GAAG,CAAC,CAC5C,CAAC;MAED,OAAOrC,QAAA,CAAAC,OAAA,CAAQoB,MAAM,CAACgB,GAAG,CAAC;IAC5B,CAAC,CAAC;EACN;AACF,CAAC,CAAC;AAAC,IAAAE,QAAA,GAAAC,OAAA,CAAAvC,OAAA,GAEYV,sBAAsB"}
@@ -30,7 +30,8 @@ export default class CallDiagnosticLatencies extends WebexPlugin {
30
30
  /**
31
31
  * Store timestamp value
32
32
  * @param key - key
33
- * @param value -value
33
+ * @param value - value
34
+ * @param options - store options
34
35
  * @throws
35
36
  * @returns
36
37
  */
@@ -45,19 +46,19 @@ export default class CallDiagnosticLatencies extends WebexPlugin {
45
46
  * Store precomputed latency value
46
47
  * @param key - key
47
48
  * @param value - value
48
- * @param overwrite - overwrite existing value or add it
49
+ * @param accumulate - when it is true, it overwrites existing value with sum of the current value and the new measurement otherwise just store the new measurement
49
50
  * @throws
50
51
  * @returns
51
52
  */
52
- saveLatency(key: PreComputedLatencies, value: number, overwrite?: boolean): void;
53
+ saveLatency(key: PreComputedLatencies, value: number, accumulate?: boolean): void;
53
54
  /**
54
55
  * Measure latency for a request
55
- * @param key - key
56
56
  * @param callback - callback for which you would like to measure latency
57
- * @param overwrite - overwite existing value or add to it
57
+ * @param key - key
58
+ * @param accumulate - when it is true, it overwrites existing value with sum of the current value and the new measurement otherwise just store the new measurement
58
59
  * @returns
59
60
  */
60
- measureLatency(callback: () => Promise<any>, key: PreComputedLatencies, overwrite?: boolean): Promise<any>;
61
+ measureLatency(callback: () => Promise<unknown>, key: PreComputedLatencies, accumulate?: boolean): Promise<unknown>;
61
62
  /**
62
63
  * Store only the first timestamp value for the given key
63
64
  * @param key - key
@@ -202,6 +203,10 @@ export default class CallDiagnosticLatencies extends WebexPlugin {
202
203
  * Video setup delay receive
203
204
  */
204
205
  getVideoJoinRespRxStart(): number;
206
+ /**
207
+ * Total latency for all get cluster request.
208
+ */
209
+ getReachabilityClustersReqResp(): number;
205
210
  /**
206
211
  * Audio setup delay transmit
207
212
  */
@@ -219,8 +224,14 @@ export default class CallDiagnosticLatencies extends WebexPlugin {
219
224
  */
220
225
  getRefreshCaptchaReqResp(): number;
221
226
  /**
222
- * Total latency for all other app api requests.
227
+ * Get the latency for downloading intelligence models.
228
+ * @returns - latency
229
+ */
230
+ getDownloadIntelligenceModelsReqResp(): number;
231
+ /**
232
+ * Get the total latency for all other app API requests.
223
233
  * Excludes meeting info, because it's measured separately.
234
+ * @returns - latency
224
235
  */
225
236
  getOtherAppApiReqResp(): number;
226
237
  }
@@ -76,7 +76,7 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
76
76
  environment?: string;
77
77
  newEnvironment?: string;
78
78
  clientInfo?: {
79
- os?: "windows" | "mac" | "ios" | "android" | "chrome" | "linux" | "other" | "android-x64" | "android-arm64" | "uwp-arm64";
79
+ os?: "other" | "chrome" | "windows" | "mac" | "ios" | "android" | "linux" | "android-x64" | "android-arm64" | "uwp-arm64";
80
80
  osVersion?: string;
81
81
  localIP?: string;
82
82
  gatewayIP?: string;
@@ -335,7 +335,7 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
335
335
  */
336
336
  generateClientEventErrorPayload(rawError: any): {
337
337
  fatal: boolean;
338
- category: "other" | "signaling" | "media" | "network" | "expected";
338
+ category: "signaling" | "media" | "network" | "other" | "expected";
339
339
  errorDescription?: string;
340
340
  errorCode?: number;
341
341
  errorCodeStr?: string;
@@ -0,0 +1,2 @@
1
+ declare const ClientMetricsPreloginBatcher: any;
2
+ export default ClientMetricsPreloginBatcher;
@@ -104,4 +104,4 @@ export type BuildClientEventFetchRequestOptions = (args: {
104
104
  payload?: RecursivePartial<ClientEvent['payload']>;
105
105
  options?: SubmitClientEventOptions;
106
106
  }) => Promise<any>;
107
- export type PreComputedLatencies = 'internal.client.pageJMT' | 'internal.download.time' | 'internal.click.to.interstitial' | 'internal.refresh.captcha.time' | 'internal.exchange.ci.token.time' | 'internal.get.u2c.time' | 'internal.call.init.join.req' | 'internal.other.app.api.time';
107
+ export type PreComputedLatencies = 'internal.client.pageJMT' | 'internal.download.time' | 'internal.get.cluster.time' | 'internal.click.to.interstitial' | 'internal.refresh.captcha.time' | 'internal.exchange.ci.token.time' | 'internal.get.u2c.time' | 'internal.call.init.join.req' | 'internal.other.app.api.time' | 'internal.api.fetch.intelligence.models';
package/package.json CHANGED
@@ -26,23 +26,23 @@
26
26
  "@webex/eslint-config-legacy": "0.0.0",
27
27
  "@webex/jest-config-legacy": "0.0.0",
28
28
  "@webex/legacy-tools": "0.0.0",
29
- "@webex/test-helper-chai": "3.0.0-next.9",
30
- "@webex/test-helper-mocha": "3.0.0-next.9",
31
- "@webex/test-helper-mock-webex": "3.0.0-next.9",
32
- "@webex/test-helper-test-users": "3.0.0-next.9",
29
+ "@webex/test-helper-chai": "3.1.0-next.1",
30
+ "@webex/test-helper-mocha": "3.1.0-next.1",
31
+ "@webex/test-helper-mock-webex": "3.1.0-next.1",
32
+ "@webex/test-helper-test-users": "3.1.0-next.1",
33
33
  "eslint": "^8.24.0",
34
34
  "prettier": "^2.7.1",
35
35
  "sinon": "^9.2.4"
36
36
  },
37
37
  "dependencies": {
38
- "@webex/common": "3.0.0-next.9",
39
- "@webex/common-timers": "3.0.0-next.9",
38
+ "@webex/common": "3.1.0-next.1",
39
+ "@webex/common-timers": "3.1.0-next.1",
40
40
  "@webex/event-dictionary-ts": "^1.0.1406",
41
- "@webex/internal-plugin-device": "3.0.0-next.9",
42
- "@webex/internal-plugin-metrics": "3.0.0-next.9",
43
- "@webex/test-helper-chai": "3.0.0-next.9",
44
- "@webex/test-helper-mock-webex": "3.0.0-next.9",
45
- "@webex/webex-core": "3.0.0-next.9",
41
+ "@webex/internal-plugin-device": "3.1.0-next.1",
42
+ "@webex/internal-plugin-metrics": "3.1.0-next.1",
43
+ "@webex/test-helper-chai": "3.1.0-next.1",
44
+ "@webex/test-helper-mock-webex": "3.1.0-next.1",
45
+ "@webex/webex-core": "3.1.0-next.1",
46
46
  "ip-anonymize": "^0.1.0",
47
47
  "lodash": "^4.17.21",
48
48
  "uuid": "^3.3.2"
@@ -55,5 +55,5 @@
55
55
  "test:style": "eslint ./src/**/*.*",
56
56
  "test:unit": "webex-legacy-tools test --unit --runner mocha"
57
57
  },
58
- "version": "3.0.0-next.9"
58
+ "version": "3.1.0-next.1"
59
59
  }
@@ -31,6 +31,7 @@ export default class CallDiagnosticLatencies extends WebexPlugin {
31
31
  */
32
32
  public clearTimestamps() {
33
33
  this.latencyTimestamps.clear();
34
+ this.precomputedLatencies.clear();
34
35
  }
35
36
 
36
37
  /**
@@ -57,7 +58,8 @@ export default class CallDiagnosticLatencies extends WebexPlugin {
57
58
  /**
58
59
  * Store timestamp value
59
60
  * @param key - key
60
- * @param value -value
61
+ * @param value - value
62
+ * @param options - store options
61
63
  * @throws
62
64
  * @returns
63
65
  */
@@ -93,31 +95,31 @@ export default class CallDiagnosticLatencies extends WebexPlugin {
93
95
  * Store precomputed latency value
94
96
  * @param key - key
95
97
  * @param value - value
96
- * @param overwrite - overwrite existing value or add it
98
+ * @param accumulate - when it is true, it overwrites existing value with sum of the current value and the new measurement otherwise just store the new measurement
97
99
  * @throws
98
100
  * @returns
99
101
  */
100
- public saveLatency(key: PreComputedLatencies, value: number, overwrite = true) {
101
- const existingValue = overwrite ? 0 : this.precomputedLatencies.get(key) || 0;
102
+ public saveLatency(key: PreComputedLatencies, value: number, accumulate = false) {
103
+ const existingValue = accumulate ? this.precomputedLatencies.get(key) || 0 : 0;
102
104
  this.precomputedLatencies.set(key, value + existingValue);
103
105
  }
104
106
 
105
107
  /**
106
108
  * Measure latency for a request
107
- * @param key - key
108
109
  * @param callback - callback for which you would like to measure latency
109
- * @param overwrite - overwite existing value or add to it
110
+ * @param key - key
111
+ * @param accumulate - when it is true, it overwrites existing value with sum of the current value and the new measurement otherwise just store the new measurement
110
112
  * @returns
111
113
  */
112
114
  public measureLatency(
113
- callback: () => Promise<any>,
115
+ callback: () => Promise<unknown>,
114
116
  key: PreComputedLatencies,
115
- overwrite = false
117
+ accumulate = false
116
118
  ) {
117
119
  const start = performance.now();
118
120
 
119
121
  return callback().finally(() => {
120
- this.saveLatency(key, performance.now() - start, overwrite);
122
+ this.saveLatency(key, performance.now() - start, accumulate);
121
123
  });
122
124
  }
123
125
 
@@ -441,6 +443,15 @@ export default class CallDiagnosticLatencies extends WebexPlugin {
441
443
  return this.getDiffBetweenTimestamps('client.locus.join.response', 'client.media.rx.start');
442
444
  }
443
445
 
446
+ /**
447
+ * Total latency for all get cluster request.
448
+ */
449
+ public getReachabilityClustersReqResp() {
450
+ const reachablityClusterReqResp = this.precomputedLatencies.get('internal.get.cluster.time');
451
+
452
+ return reachablityClusterReqResp ? Math.floor(reachablityClusterReqResp) : undefined;
453
+ }
454
+
444
455
  /**
445
456
  * Audio setup delay transmit
446
457
  */
@@ -474,8 +485,23 @@ export default class CallDiagnosticLatencies extends WebexPlugin {
474
485
  }
475
486
 
476
487
  /**
477
- * Total latency for all other app api requests.
488
+ * Get the latency for downloading intelligence models.
489
+ * @returns - latency
490
+ */
491
+ public getDownloadIntelligenceModelsReqResp() {
492
+ const downloadIntelligenceModelsReqResp = this.precomputedLatencies.get(
493
+ 'internal.api.fetch.intelligence.models'
494
+ );
495
+
496
+ return downloadIntelligenceModelsReqResp
497
+ ? Math.floor(downloadIntelligenceModelsReqResp)
498
+ : undefined;
499
+ }
500
+
501
+ /**
502
+ * Get the total latency for all other app API requests.
478
503
  * Excludes meeting info, because it's measured separately.
504
+ * @returns - latency
479
505
  */
480
506
  public getOtherAppApiReqResp() {
481
507
  const otherAppApiJMT = this.precomputedLatencies.get('internal.other.app.api.time');
@@ -453,6 +453,7 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
453
453
  webClientDomain: window.location.hostname,
454
454
  },
455
455
  intervals: payload.intervals,
456
+ callingServiceType: 'LOCUS',
456
457
  sourceMetadata: {
457
458
  applicationSoftwareType: CLIENT_NAME,
458
459
  // @ts-ignore