@webex/internal-plugin-metrics 3.0.0-beta.310 → 3.0.0-beta.311
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/call-diagnostic/call-diagnostic-metrics-batcher.js +2 -3
- package/dist/call-diagnostic/call-diagnostic-metrics-batcher.js.map +1 -1
- package/dist/call-diagnostic/call-diagnostic-metrics.js +2 -8
- package/dist/call-diagnostic/call-diagnostic-metrics.js.map +1 -1
- package/dist/metrics.js +1 -1
- package/dist/new-metrics.js +2 -2
- package/dist/new-metrics.js.map +1 -1
- package/package.json +8 -8
- package/src/call-diagnostic/call-diagnostic-metrics-batcher.ts +2 -10
- package/src/call-diagnostic/call-diagnostic-metrics.ts +2 -35
- package/src/new-metrics.ts +2 -2
- package/test/unit/spec/call-diagnostic/call-diagnostic-metrics-batcher.ts +1 -14
- package/test/unit/spec/call-diagnostic/call-diagnostic-metrics.ts +3 -131
- package/test/unit/spec/new-metrics.ts +3 -5
|
@@ -42,8 +42,7 @@ var CallDiagnosticEventsBatcher = _batcher.default.extend({
|
|
|
42
42
|
*/
|
|
43
43
|
submitHttpRequest: function submitHttpRequest(payload) {
|
|
44
44
|
var _this = this;
|
|
45
|
-
var batchId = (0, _uniqueId2.default)('
|
|
46
|
-
this.webex.logger.log(_config.CALL_DIAGNOSTIC_LOG_IDENTIFIER, "CallDiagnosticEventsBatcher: @submitHttpRequest#".concat(batchId, ". Sending the request:"), 'payload:', payload);
|
|
45
|
+
var batchId = (0, _uniqueId2.default)('ca-batch-');
|
|
47
46
|
return this.webex.request({
|
|
48
47
|
method: 'POST',
|
|
49
48
|
service: 'metrics',
|
|
@@ -53,7 +52,7 @@ var CallDiagnosticEventsBatcher = _batcher.default.extend({
|
|
|
53
52
|
},
|
|
54
53
|
waitForServiceTimeout: this.webex.config.metrics.waitForServiceTimeout
|
|
55
54
|
}).then(function (res) {
|
|
56
|
-
_this.webex.logger.log(_config.CALL_DIAGNOSTIC_LOG_IDENTIFIER, "CallDiagnosticEventsBatcher: @submitHttpRequest#".concat(batchId, ". Request successful
|
|
55
|
+
_this.webex.logger.log(_config.CALL_DIAGNOSTIC_LOG_IDENTIFIER, "CallDiagnosticEventsBatcher: @submitHttpRequest#".concat(batchId, ". Request successful."));
|
|
57
56
|
return res;
|
|
58
57
|
}).catch(function (err) {
|
|
59
58
|
_this.webex.logger.error(_config.CALL_DIAGNOSTIC_LOG_IDENTIFIER, "CallDiagnosticEventsBatcher: @submitHttpRequest#".concat(batchId, ". Request failed:"), "error: ".concat((0, _utils.generateCommonErrorMetadata)(err)));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["CallDiagnosticEventsBatcher","Batcher","extend","namespace","prepareItem","item","resolve","prepareDiagnosticMetricItem","webex","prepareRequest","queue","forEach","eventPayload","originTime","sent","Date","toISOString","submitHttpRequest","payload","batchId","
|
|
1
|
+
{"version":3,"names":["CallDiagnosticEventsBatcher","Batcher","extend","namespace","prepareItem","item","resolve","prepareDiagnosticMetricItem","webex","prepareRequest","queue","forEach","eventPayload","originTime","sent","Date","toISOString","submitHttpRequest","payload","batchId","request","method","service","resource","body","metrics","waitForServiceTimeout","config","then","res","logger","log","CALL_DIAGNOSTIC_LOG_IDENTIFIER","catch","err","error","generateCommonErrorMetadata","reject"],"sources":["call-diagnostic-metrics-batcher.ts"],"sourcesContent":["/* eslint-disable class-methods-use-this */\n/* eslint-disable valid-jsdoc */\n\nimport {uniqueId} from 'lodash';\nimport Batcher from '../batcher';\nimport {prepareDiagnosticMetricItem} from './call-diagnostic-metrics.util';\nimport {CALL_DIAGNOSTIC_LOG_IDENTIFIER} from './config';\nimport {generateCommonErrorMetadata} from '../utils';\n\nconst CallDiagnosticEventsBatcher = Batcher.extend({\n namespace: 'Metrics',\n\n /**\n * Prepare item\n * @param item\n * @returns\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 queue\n * @returns\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 payload\n * @returns\n */\n submitHttpRequest(payload) {\n const batchId = uniqueId('ca-batch-');\n\n return this.webex\n .request({\n method: 'POST',\n service: 'metrics',\n resource: 'clientmetrics',\n body: {\n metrics: payload,\n },\n waitForServiceTimeout: this.webex.config.metrics.waitForServiceTimeout,\n })\n .then((res) => {\n this.webex.logger.log(\n CALL_DIAGNOSTIC_LOG_IDENTIFIER,\n `CallDiagnosticEventsBatcher: @submitHttpRequest#${batchId}. Request successful.`\n );\n\n return res;\n })\n .catch((err) => {\n this.webex.logger.error(\n CALL_DIAGNOSTIC_LOG_IDENTIFIER,\n `CallDiagnosticEventsBatcher: @submitHttpRequest#${batchId}. Request failed:`,\n `error: ${generateCommonErrorMetadata(err)}`\n );\n\n return Promise.reject(err);\n });\n },\n});\n\nexport default CallDiagnosticEventsBatcher;\n"],"mappings":";;;;;;;;;;AAIA;AACA;AACA;AACA;AAEA,IAAMA,2BAA2B,GAAGC,gBAAO,CAACC,MAAM,CAAC;EACjDC,SAAS,EAAE,SAAS;EAEpB;AACF;AACA;AACA;AACA;EACEC,WAAW,uBAACC,IAAI,EAAE;IAChB,OAAO,iBAAQC,OAAO,CAAC,IAAAC,kDAA2B,EAAC,IAAI,CAACC,KAAK,EAAEH,IAAI,CAAC,CAAC;EACvE,CAAC;EAED;AACF;AACA;AACA;AACA;EACEI,cAAc,0BAACC,KAAK,EAAE;IACpB;IACAA,KAAK,CAACC,OAAO,CAAC,UAACN,IAAI,EAAK;MACtBA,IAAI,CAACO,YAAY,CAACC,UAAU,GAAGR,IAAI,CAACO,YAAY,CAACC,UAAU,IAAI,CAAC,CAAC;MACjER,IAAI,CAACO,YAAY,CAACC,UAAU,CAACC,IAAI,GAAG,IAAIC,IAAI,EAAE,CAACC,WAAW,EAAE;IAC9D,CAAC,CAAC;IAEF,OAAO,iBAAQV,OAAO,CAACI,KAAK,CAAC;EAC/B,CAAC;EAED;AACF;AACA;AACA;AACA;EACEO,iBAAiB,6BAACC,OAAO,EAAE;IAAA;IACzB,IAAMC,OAAO,GAAG,wBAAS,WAAW,CAAC;IAErC,OAAO,IAAI,CAACX,KAAK,CACdY,OAAO,CAAC;MACPC,MAAM,EAAE,MAAM;MACdC,OAAO,EAAE,SAAS;MAClBC,QAAQ,EAAE,eAAe;MACzBC,IAAI,EAAE;QACJC,OAAO,EAAEP;MACX,CAAC;MACDQ,qBAAqB,EAAE,IAAI,CAAClB,KAAK,CAACmB,MAAM,CAACF,OAAO,CAACC;IACnD,CAAC,CAAC,CACDE,IAAI,CAAC,UAACC,GAAG,EAAK;MACb,KAAI,CAACrB,KAAK,CAACsB,MAAM,CAACC,GAAG,CACnBC,sCAA8B,4DACqBb,OAAO,2BAC3D;MAED,OAAOU,GAAG;IACZ,CAAC,CAAC,CACDI,KAAK,CAAC,UAACC,GAAG,EAAK;MACd,KAAI,CAAC1B,KAAK,CAACsB,MAAM,CAACK,KAAK,CACrBH,sCAA8B,4DACqBb,OAAO,yCAChD,IAAAiB,kCAA2B,EAACF,GAAG,CAAC,EAC3C;MAED,OAAO,iBAAQG,MAAM,CAACH,GAAG,CAAC;IAC5B,CAAC,CAAC;EACN;AACF,CAAC,CAAC;AAAC,eAEYlC,2BAA2B;AAAA"}
|
|
@@ -32,7 +32,6 @@ var _callDiagnosticMetrics = require("./call-diagnostic-metrics.util");
|
|
|
32
32
|
var _config = require("../config");
|
|
33
33
|
var _callDiagnosticMetricsBatcher = _interopRequireDefault(require("./call-diagnostic-metrics-batcher"));
|
|
34
34
|
var _config2 = require("./config");
|
|
35
|
-
var _utils = require("../utils");
|
|
36
35
|
function ownKeys(object, enumerableOnly) { var keys = _Object$keys(object); if (_Object$getOwnPropertySymbols) { var symbols = _Object$getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return _Object$getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
|
|
37
36
|
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }) : _Object$getOwnPropertyDescriptors ? _Object$defineProperties(target, _Object$getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { _Object$defineProperty(target, key, _Object$getOwnPropertyDescriptor(source, key)); }); } return target; }
|
|
38
37
|
function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2.default)(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2.default)(this).constructor; result = _Reflect$construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2.default)(this, result); }; }
|
|
@@ -85,7 +84,6 @@ var CallDiagnosticMetrics = /*#__PURE__*/function (_StatelessWebexPlugin) {
|
|
|
85
84
|
|
|
86
85
|
// append sent timestamp
|
|
87
86
|
diagnosticEvent.eventPayload.originTime.sent = new Date().toISOString();
|
|
88
|
-
_this.logger.log(_config2.CALL_DIAGNOSTIC_LOG_IDENTIFIER, "CallDiagnosticMetrics: @submitToCallDiagnosticsPreLogin. Sending the request:", "diagnosticEvent: ".concat((0, _stringify.default)(diagnosticEvent)));
|
|
89
87
|
|
|
90
88
|
// @ts-ignore
|
|
91
89
|
return _this.webex.internal.newMetrics.postPreLoginMetric(diagnosticEvent, preLoginId);
|
|
@@ -540,7 +538,6 @@ var CallDiagnosticMetrics = /*#__PURE__*/function (_StatelessWebexPlugin) {
|
|
|
540
538
|
var name = _ref4.name,
|
|
541
539
|
options = _ref4.options,
|
|
542
540
|
errors = _ref4.errors;
|
|
543
|
-
this.logger.log(_config2.CALL_DIAGNOSTIC_LOG_IDENTIFIER, 'CallDiagnosticMetrics: @createClientEventObjectInMeeting. Creating in meeting event object.', "name: ".concat(name));
|
|
544
541
|
var meetingId = options.meetingId,
|
|
545
542
|
mediaConnections = options.mediaConnections,
|
|
546
543
|
globalMeetingId = options.globalMeetingId,
|
|
@@ -606,7 +603,6 @@ var CallDiagnosticMetrics = /*#__PURE__*/function (_StatelessWebexPlugin) {
|
|
|
606
603
|
var name = _ref5.name,
|
|
607
604
|
options = _ref5.options,
|
|
608
605
|
errors = _ref5.errors;
|
|
609
|
-
this.logger.log(_config2.CALL_DIAGNOSTIC_LOG_IDENTIFIER, 'CallDiagnosticMetrics: @createClientEventObjectPreMeeting. Creating pre meeting event object.', "name: ".concat(name));
|
|
610
606
|
var correlationId = options.correlationId,
|
|
611
607
|
globalMeetingId = options.globalMeetingId,
|
|
612
608
|
webexConferenceIdStr = options.webexConferenceIdStr,
|
|
@@ -662,7 +658,6 @@ var CallDiagnosticMetrics = /*#__PURE__*/function (_StatelessWebexPlugin) {
|
|
|
662
658
|
// check if we need to generate errors
|
|
663
659
|
var errors = [];
|
|
664
660
|
if (rawError) {
|
|
665
|
-
this.logger.log(_config2.CALL_DIAGNOSTIC_LOG_IDENTIFIER, 'CallDiagnosticMetrics: @prepareClientEvent. Error detected, attempting to map and attach it to the event...', "name: ".concat(name), "rawError: ".concat((0, _utils.generateCommonErrorMetadata)(rawError)));
|
|
666
661
|
var generatedError = this.generateClientEventErrorPayload(rawError);
|
|
667
662
|
if (generatedError) {
|
|
668
663
|
errors.push(generatedError);
|
|
@@ -710,7 +705,7 @@ var CallDiagnosticMetrics = /*#__PURE__*/function (_StatelessWebexPlugin) {
|
|
|
710
705
|
var name = _ref7.name,
|
|
711
706
|
payload = _ref7.payload,
|
|
712
707
|
options = _ref7.options;
|
|
713
|
-
this.logger.log(_config2.CALL_DIAGNOSTIC_LOG_IDENTIFIER, 'CallDiagnosticMetrics: @submitClientEvent. Submit Client Event CA event.', "name: ".concat(name)
|
|
708
|
+
this.logger.log(_config2.CALL_DIAGNOSTIC_LOG_IDENTIFIER, 'CallDiagnosticMetrics: @submitClientEvent. Submit Client Event CA event.', "name: ".concat(name));
|
|
714
709
|
var diagnosticEvent = this.prepareClientEvent({
|
|
715
710
|
name: name,
|
|
716
711
|
payload: payload,
|
|
@@ -739,7 +734,6 @@ var CallDiagnosticMetrics = /*#__PURE__*/function (_StatelessWebexPlugin) {
|
|
|
739
734
|
eventPayload: event,
|
|
740
735
|
type: ['diagnostic-event']
|
|
741
736
|
};
|
|
742
|
-
this.logger.log(_config2.CALL_DIAGNOSTIC_LOG_IDENTIFIER, 'CallDiagnosticMetrics: @submitToCallDiagnostics. Preparing to send the request', "finalEvent: ".concat((0, _stringify.default)(finalEvent)));
|
|
743
737
|
return this.callDiagnosticEventsBatcher.request(finalEvent);
|
|
744
738
|
}
|
|
745
739
|
|
|
@@ -768,7 +762,7 @@ var CallDiagnosticMetrics = /*#__PURE__*/function (_StatelessWebexPlugin) {
|
|
|
768
762
|
while (1) switch (_context.prev = _context.next) {
|
|
769
763
|
case 0:
|
|
770
764
|
name = _ref8.name, payload = _ref8.payload, options = _ref8.options;
|
|
771
|
-
this.logger.log(_config2.CALL_DIAGNOSTIC_LOG_IDENTIFIER, 'CallDiagnosticMetrics: @buildClientEventFetchRequestOptions. Building request options object for fetch()...', "name: ".concat(name)
|
|
765
|
+
this.logger.log(_config2.CALL_DIAGNOSTIC_LOG_IDENTIFIER, 'CallDiagnosticMetrics: @buildClientEventFetchRequestOptions. Building request options object for fetch()...', "name: ".concat(name));
|
|
772
766
|
clientEvent = this.prepareClientEvent({
|
|
773
767
|
name: name,
|
|
774
768
|
payload: payload,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["BrowserDetection","getOSVersion","getBrowserName","getBrowserVersion","CallDiagnosticMetrics","args","options","resolve","event","valid","preLoginId","diagnosticEvent","prepareDiagnosticMetricItem","webex","eventPayload","type","originTime","sent","Date","toISOString","logger","log","CALL_DIAGNOSTIC_LOG_IDENTIFIER","internal","newMetrics","postPreLoginMetric","callDiagnosticEventsBatcher","CallDiagnosticEventsBatcher","parent","canAuthorize","credentials","isUnverifiedGuest","meetingId","meeting","meetings","meetingCollection","get","meetingInfo","enableConvergedArchitecture","undefined","webexScheduled","enableEvent","pmr","WEBEX_SUB_SERVICE_TYPES","PMR","SCHEDULED_MEETING","WEBINAR","defaultClientType","config","metrics","clientType","defaultSubClientType","subClientType","providedClientVersion","clientVersion","defaultSDKClientVersion","CLIENT_NAME","version","versionMetadata","extractVersionMetadata","origin","name","networkType","userAgent","userAgentToString","clientName","webexVersion","clientInfo","localNetworkPrefix","anonymizeIPAddress","geoHintInfo","clientAddress","osVersion","os","getOSNameInternal","browser","browserVersion","environment","newEnvironment","clientLaunchMethod","Error","mediaConnections","correlationId","webexConferenceIdStr","globalMeetingId","identifiers","device","userId","deviceId","url","orgId","locusUrl","services","locusInfo","fullState","locusId","split","pop","locusStartTime","lastActive","confIdStr","confID","siteName","webexSiteName","mediaAgentAlias","mediaAgentGroupId","eventData","getOrigin","eventId","uuid","v4","triggered","senderCountryCode","countryCode","clearEmptyKeysRecursively","payload","console","warn","submitClientMetrics","CALL_DIAGNOSTIC_EVENT_FAILED_TO_SEND","fields","getIdentifiers","clientEventObject","canProceed","webClientDomain","window","location","hostname","intervals","sourceMetadata","applicationSoftwareType","applicationSoftwareVersion","mediaEngineSoftwareType","mediaEngineSoftwareVersion","startTime","prepareDiagnosticEvent","validator","submitToCallDiagnostics","clientErrorCode","serviceErrorCode","serviceErrorName","payloadOverrides","error","partialParsedError","CLIENT_ERROR_CODE_TO_ERROR_PAYLOAD","fatal","shownToUser","category","errorCode","errorData","errorName","rawError","isBrowserMediaErrorName","getErrorPayloadForClientErrorCode","BROWSER_MEDIA_ERROR_NAME_TO_CLIENT_ERROR_CODES_MAP","body","code","reason","reasonCode","SERVICE_ERROR_CODES_TO_CLIENT_ERROR_CODES_MAP","isLocusServiceErrorCode","NEW_LOCUS_ERROR_CLIENT_CODE","isMeetingInfoServiceError","MEETING_INFO_LOOKUP_ERROR_CLIENT_CODE","isNetworkError","NETWORK_ERROR","errorDescription","message","isUnauthorizedError","AUTHENTICATION_FAILED_CODE","UNKNOWN_ERROR","errors","userType","getCurUserType","loginType","getCurLoginType","isConvergedArchitectureEnabled","getIsConvergedArchitectureEnabled","webexSubServiceType","getSubServiceType","rawErrorMessage","generateCommonErrorMetadata","generatedError","generateClientEventErrorPayload","push","createClientEventObjectInMeeting","createClientEventObjectPreMeeting","prepareClientEvent","submitToCallDiagnosticsPreLogin","finalEvent","request","clientEvent","method","service","resource","headers","waitForServiceTimeout","authorization","prepareFetchOptions","clientErrorPayload","StatelessWebexPlugin"],"sources":["call-diagnostic-metrics.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-unused-vars */\n/* eslint-disable class-methods-use-this */\n/* eslint-disable valid-jsdoc */\nimport {getOSNameInternal} from '@webex/internal-plugin-metrics';\nimport {BrowserDetection} from '@webex/common';\nimport uuid from 'uuid';\nimport {merge} from 'lodash';\nimport {StatelessWebexPlugin} from '@webex/webex-core';\n\nimport {\n anonymizeIPAddress,\n clearEmptyKeysRecursively,\n isLocusServiceErrorCode,\n prepareDiagnosticMetricItem,\n userAgentToString,\n extractVersionMetadata,\n isMeetingInfoServiceError,\n isBrowserMediaErrorName,\n isNetworkError,\n isUnauthorizedError,\n} from './call-diagnostic-metrics.util';\nimport {CLIENT_NAME} from '../config';\nimport {\n Event,\n ClientType,\n SubClientType,\n NetworkType,\n EnvironmentType,\n NewEnvironmentType,\n ClientEvent,\n SubmitClientEventOptions,\n MediaQualityEvent,\n SubmitMQEOptions,\n SubmitMQEPayload,\n ClientLaunchMethodType,\n ClientEventError,\n ClientEventPayload,\n ClientInfo,\n ClientEventPayloadError,\n ClientSubServiceType,\n} from '../metrics.types';\nimport CallDiagnosticEventsBatcher from './call-diagnostic-metrics-batcher';\nimport {\n CLIENT_ERROR_CODE_TO_ERROR_PAYLOAD,\n CALL_DIAGNOSTIC_EVENT_FAILED_TO_SEND,\n NEW_LOCUS_ERROR_CLIENT_CODE,\n SERVICE_ERROR_CODES_TO_CLIENT_ERROR_CODES_MAP,\n UNKNOWN_ERROR,\n BROWSER_MEDIA_ERROR_NAME_TO_CLIENT_ERROR_CODES_MAP,\n MEETING_INFO_LOOKUP_ERROR_CLIENT_CODE,\n CALL_DIAGNOSTIC_LOG_IDENTIFIER,\n NETWORK_ERROR,\n AUTHENTICATION_FAILED_CODE,\n WEBEX_SUB_SERVICE_TYPES,\n} from './config';\nimport {generateCommonErrorMetadata} from '../utils';\n\nconst {getOSVersion, getBrowserName, getBrowserVersion} = BrowserDetection();\n\ntype GetOriginOptions = {\n clientType: ClientType;\n subClientType: SubClientType;\n networkType?: NetworkType;\n clientLaunchMethod?: ClientLaunchMethodType;\n environment?: EnvironmentType;\n newEnvironment?: NewEnvironmentType;\n};\n\ntype GetIdentifiersOptions = {\n meeting?: any;\n mediaConnections?: any[];\n correlationId?: string;\n preLoginId?: string;\n globalMeetingId?: string;\n webexConferenceIdStr?: string;\n};\n\n/**\n * @description Util class to handle Call Analyzer Metrics\n * @export\n * @class CallDiagnosticMetrics\n */\nexport default class CallDiagnosticMetrics extends StatelessWebexPlugin {\n // @ts-ignore\n private callDiagnosticEventsBatcher: CallDiagnosticEventsBatcher;\n private logger: any; // to avoid adding @ts-ignore everywhere\n // the default validator before piping an event to the batcher\n // this function can be overridden by the user\n public validator: (options: {\n type: 'mqe' | 'ce';\n event: Event;\n }) => Promise<{event: Event; valid: boolean}> = (options: {type: 'mqe' | 'ce'; event: Event}) =>\n Promise.resolve({event: options?.event, valid: true});\n\n /**\n * Constructor\n * @param args\n */\n constructor(...args) {\n super(...args);\n // @ts-ignore\n this.logger = this.webex.logger;\n // @ts-ignore\n this.callDiagnosticEventsBatcher = new CallDiagnosticEventsBatcher({}, {parent: this.webex});\n }\n\n /**\n * Returns the login type of the current user\n * @returns one of 'login-ci','unverified-guest', null\n */\n getCurLoginType() {\n // @ts-ignore\n if (this.webex.canAuthorize) {\n // @ts-ignore\n return this.webex.credentials.isUnverifiedGuest ? 'unverified-guest' : 'login-ci';\n }\n\n return null;\n }\n\n /**\n * Returns if the meeting has converged architecture enabled\n * @param options.meetingId\n */\n getIsConvergedArchitectureEnabled({meetingId}: {meetingId?: string}): boolean {\n if (meetingId) {\n // @ts-ignore\n const meeting = this.webex.meetings.meetingCollection.get(meetingId);\n\n return meeting?.meetingInfo?.enableConvergedArchitecture;\n }\n\n return undefined;\n }\n\n /**\n * Returns meeting's subServiceType\n * @param meeting\n * @returns\n */\n getSubServiceType(meeting?: any): ClientSubServiceType {\n if (meeting) {\n // @ts-ignore\n const meetingInfo = meeting?.meetingInfo;\n // if not Scheduled, not Webinar, pmr - then pmr\n if (!meetingInfo?.webexScheduled && !meetingInfo?.enableEvent && meetingInfo?.pmr) {\n return WEBEX_SUB_SERVICE_TYPES.PMR;\n }\n // if Scheduled, not Webinar, not pmr - then ScheduledMeeting\n if (meetingInfo?.webexScheduled && !meetingInfo?.enableEvent && !meetingInfo?.pmr) {\n return WEBEX_SUB_SERVICE_TYPES.SCHEDULED_MEETING;\n }\n // if Scheduled, Webinar, not pmr - then Webinar\n if (meetingInfo?.webexScheduled && meetingInfo?.enableEvent && !meetingInfo?.pmr) {\n return WEBEX_SUB_SERVICE_TYPES.WEBINAR;\n }\n }\n\n return undefined;\n }\n\n /**\n * Get origin object for Call Diagnostic Event payload.\n * @param options\n * @param meetingId\n * @returns\n */\n getOrigin(options: GetOriginOptions, meetingId?: string) {\n const defaultClientType: ClientType =\n // @ts-ignore\n this.webex.meetings.config?.metrics?.clientType;\n const defaultSubClientType: SubClientType =\n // @ts-ignore\n this.webex.meetings.config?.metrics?.subClientType;\n // @ts-ignore\n const providedClientVersion: string = this.webex.meetings.config?.metrics?.clientVersion;\n // @ts-ignore\n const defaultSDKClientVersion = `${CLIENT_NAME}/${this.webex.version}`;\n\n let versionMetadata: Pick<ClientInfo, 'majorVersion' | 'minorVersion'> = {};\n\n // sdk version split doesn't really make sense for now...\n if (providedClientVersion) {\n versionMetadata = extractVersionMetadata(providedClientVersion);\n }\n\n if (\n (defaultClientType && defaultSubClientType) ||\n (options.clientType && options.subClientType)\n ) {\n const origin: Event['origin'] = {\n name: 'endpoint',\n networkType: options?.networkType || 'unknown',\n userAgent: userAgentToString({\n // @ts-ignore\n clientName: this.webex.meetings?.config?.metrics?.clientName,\n // @ts-ignore\n webexVersion: this.webex.version,\n }),\n clientInfo: {\n clientType: options?.clientType || defaultClientType,\n clientVersion: providedClientVersion || defaultSDKClientVersion,\n ...versionMetadata,\n localNetworkPrefix:\n // @ts-ignore\n anonymizeIPAddress(this.webex.meetings.geoHintInfo?.clientAddress) || undefined,\n osVersion: getOSVersion() || 'unknown',\n subClientType: options?.subClientType || defaultSubClientType,\n os: getOSNameInternal(),\n browser: getBrowserName(),\n browserVersion: getBrowserVersion(),\n },\n };\n\n if (meetingId) {\n // @ts-ignore\n const meeting = this.webex.meetings.meetingCollection.get(meetingId);\n if (meeting?.environment) {\n origin.environment = meeting.environment;\n }\n }\n\n if (options?.environment) {\n origin.environment = options.environment;\n }\n\n if (options?.newEnvironment) {\n origin.newEnvironment = options.newEnvironment;\n }\n\n if (options?.clientLaunchMethod) {\n origin.clientInfo.clientLaunchMethod = options.clientLaunchMethod;\n }\n\n return origin;\n }\n\n throw new Error(\"ClientType and SubClientType can't be undefined\");\n }\n\n /**\n * Gather identifier details for call diagnostic payload.\n * @throws Error if initialization fails.\n * @param options\n */\n getIdentifiers(options: GetIdentifiersOptions) {\n const {\n meeting,\n mediaConnections,\n correlationId,\n webexConferenceIdStr,\n globalMeetingId,\n preLoginId,\n } = options;\n const identifiers: Event['event']['identifiers'] = {\n correlationId: 'unknown',\n };\n\n if (meeting) {\n identifiers.correlationId = meeting.correlationId;\n }\n\n if (correlationId) {\n identifiers.correlationId = correlationId;\n }\n // @ts-ignore\n if (this.webex.internal) {\n // @ts-ignore\n const {device} = this.webex.internal;\n identifiers.userId = device.userId || preLoginId;\n identifiers.deviceId = device.url;\n identifiers.orgId = device.orgId;\n // @ts-ignore\n identifiers.locusUrl = this.webex.internal.services.get('locus');\n }\n\n if (meeting?.locusInfo?.fullState) {\n identifiers.locusUrl = meeting.locusUrl;\n identifiers.locusId = meeting.locusUrl && meeting.locusUrl.split('/').pop();\n identifiers.locusStartTime =\n meeting.locusInfo.fullState && meeting.locusInfo.fullState.lastActive;\n }\n\n if (meeting?.meetingInfo?.confIdStr || meeting?.meetingInfo?.confID) {\n identifiers.webexConferenceIdStr = `${\n meeting.meetingInfo?.confIdStr || meeting.meetingInfo?.confID\n }`;\n }\n\n if (meeting?.meetingInfo?.meetingId) {\n identifiers.globalMeetingId = meeting.meetingInfo?.meetingId;\n }\n\n if (meeting?.meetingInfo?.siteName) {\n identifiers.webexSiteName = meeting.meetingInfo?.siteName;\n }\n\n if (mediaConnections) {\n identifiers.mediaAgentAlias = mediaConnections?.[0]?.mediaAgentAlias;\n identifiers.mediaAgentGroupId = mediaConnections?.[0]?.mediaAgentGroupId;\n }\n\n if (!identifiers?.webexConferenceIdStr && webexConferenceIdStr) {\n identifiers.webexConferenceIdStr = `${webexConferenceIdStr}`;\n }\n\n if (!identifiers?.globalMeetingId && globalMeetingId) {\n identifiers.globalMeetingId = globalMeetingId;\n }\n\n if (identifiers.correlationId === undefined) {\n throw new Error('Identifiers initialization failed.');\n }\n\n return identifiers;\n }\n\n /**\n * Create diagnostic event, which can hold client event, feature event or MQE event data.\n * This just initiates the shared properties that are required for all the 3 event categories.\n * @param eventData\n * @param options\n * @returns\n */\n prepareDiagnosticEvent(eventData: Event['event'], options: any) {\n const {meetingId} = options;\n const origin = this.getOrigin(options, meetingId);\n\n const event: Event = {\n eventId: uuid.v4(),\n version: 1,\n origin,\n originTime: {\n triggered: new Date().toISOString(),\n // is overridden in prepareRequest batcher\n sent: 'not_defined_yet',\n },\n // @ts-ignore\n senderCountryCode: this.webex.meetings.geoHintInfo?.countryCode,\n event: eventData,\n };\n\n // sanitize (remove empty properties, CA requires it)\n // but we don't want to sanitize MQE as most of the times\n // values will be 0, [] etc, and they are required.\n if (eventData.name !== 'client.mediaquality.event') {\n clearEmptyKeysRecursively(event);\n }\n\n return event;\n }\n\n /**\n * TODO: NOT IMPLEMENTED\n * Submit Feature Event\n * @returns\n */\n public submitFeatureEvent() {\n throw Error('Not implemented');\n }\n\n /**\n * Submit Media Quality Event\n * @param args - submit params\n * @param arg.name - event key\n * @param arg.payload - additional payload to be merge with the default payload\n * @param arg.options - options\n */\n submitMQE({\n name,\n payload,\n options,\n }: {\n name: MediaQualityEvent['name'];\n payload: SubmitMQEPayload;\n options: SubmitMQEOptions;\n }) {\n const {meetingId, mediaConnections, webexConferenceIdStr, globalMeetingId} = options;\n\n // events that will most likely happen in join phase\n if (meetingId) {\n // @ts-ignore\n const meeting = this.webex.meetings.meetingCollection.get(meetingId);\n\n if (!meeting) {\n console.warn(\n 'Attempt to send MQE but no meeting was found...',\n `event: ${name}, meetingId: ${meetingId}`\n );\n // @ts-ignore\n this.webex.internal.metrics.submitClientMetrics(CALL_DIAGNOSTIC_EVENT_FAILED_TO_SEND, {\n fields: {\n meetingId,\n name,\n },\n });\n\n return;\n }\n\n // merge identifiers\n const identifiers = this.getIdentifiers({\n meeting,\n mediaConnections: meeting.mediaConnections || mediaConnections,\n webexConferenceIdStr,\n globalMeetingId,\n });\n\n // create media quality event object\n let clientEventObject: MediaQualityEvent['payload'] = {\n name,\n canProceed: true,\n identifiers,\n eventData: {\n webClientDomain: window.location.hostname,\n },\n intervals: payload.intervals,\n sourceMetadata: {\n applicationSoftwareType: CLIENT_NAME,\n // @ts-ignore\n applicationSoftwareVersion: this.webex.version,\n mediaEngineSoftwareType: getBrowserName() || 'browser',\n mediaEngineSoftwareVersion: getOSVersion() || 'unknown',\n startTime: new Date().toISOString(),\n },\n };\n\n // merge any new properties, or override existing ones\n clientEventObject = merge(clientEventObject, payload);\n\n // append media quality event data to the call diagnostic event\n const diagnosticEvent = this.prepareDiagnosticEvent(clientEventObject, options);\n this.validator({type: 'mqe', event: diagnosticEvent});\n this.submitToCallDiagnostics(diagnosticEvent);\n } else {\n throw new Error(\n 'Media quality events cant be sent outside the context of a meeting. Meeting id is required.'\n );\n }\n }\n\n /**\n * Return Client Event payload by client error code\n * @param arg - get error arg\n * @param arg.clientErrorCode\n * @param arg.serviceErrorCode\n * @param arg.payloadOverrides\n * @returns\n */\n public getErrorPayloadForClientErrorCode({\n clientErrorCode,\n serviceErrorCode,\n serviceErrorName,\n payloadOverrides,\n }: {\n clientErrorCode: number;\n serviceErrorCode: any;\n serviceErrorName?: any;\n payloadOverrides?: any;\n }): ClientEventError {\n let error: ClientEventError;\n\n if (clientErrorCode) {\n const partialParsedError = CLIENT_ERROR_CODE_TO_ERROR_PAYLOAD[clientErrorCode];\n\n if (partialParsedError) {\n error = merge(\n {fatal: true, shownToUser: false, name: 'other', category: 'other'}, // default values\n {errorCode: clientErrorCode},\n serviceErrorName ? {errorData: {errorName: serviceErrorName}} : {},\n {serviceErrorCode},\n partialParsedError,\n payloadOverrides || {}\n );\n\n return error;\n }\n }\n\n return undefined;\n }\n\n /**\n * Generate error payload for Client Event\n * @param rawError\n */\n generateClientEventErrorPayload(rawError: any) {\n if (rawError.name) {\n if (isBrowserMediaErrorName(rawError.name)) {\n return this.getErrorPayloadForClientErrorCode({\n serviceErrorCode: undefined,\n clientErrorCode: BROWSER_MEDIA_ERROR_NAME_TO_CLIENT_ERROR_CODES_MAP[rawError.name],\n serviceErrorName: rawError.name,\n });\n }\n }\n\n const serviceErrorCode =\n rawError?.error?.body?.errorCode ||\n rawError?.body?.errorCode ||\n rawError?.body?.code ||\n rawError?.body?.reason?.reasonCode;\n\n if (serviceErrorCode) {\n const clientErrorCode = SERVICE_ERROR_CODES_TO_CLIENT_ERROR_CODES_MAP[serviceErrorCode];\n if (clientErrorCode) {\n return this.getErrorPayloadForClientErrorCode({clientErrorCode, serviceErrorCode});\n }\n\n // by default, if it is locus error, return new locus err\n if (isLocusServiceErrorCode(serviceErrorCode)) {\n return this.getErrorPayloadForClientErrorCode({\n clientErrorCode: NEW_LOCUS_ERROR_CLIENT_CODE,\n serviceErrorCode,\n });\n }\n }\n\n if (isMeetingInfoServiceError(rawError)) {\n return this.getErrorPayloadForClientErrorCode({\n clientErrorCode: MEETING_INFO_LOOKUP_ERROR_CLIENT_CODE,\n serviceErrorCode,\n });\n }\n\n if (isNetworkError(rawError)) {\n const payload = this.getErrorPayloadForClientErrorCode({\n clientErrorCode: NETWORK_ERROR,\n serviceErrorCode,\n payloadOverrides: rawError.payloadOverrides,\n });\n payload.errorDescription = rawError.message;\n\n return payload;\n }\n\n if (isUnauthorizedError(rawError)) {\n const payload = this.getErrorPayloadForClientErrorCode({\n clientErrorCode: AUTHENTICATION_FAILED_CODE,\n serviceErrorCode,\n payloadOverrides: rawError.payloadOverrides,\n });\n payload.errorDescription = rawError.message;\n\n return payload;\n }\n\n // otherwise return unkown error\n return this.getErrorPayloadForClientErrorCode({\n clientErrorCode: UNKNOWN_ERROR,\n serviceErrorCode: UNKNOWN_ERROR,\n });\n }\n\n /**\n * Create client event object for in meeting events\n * @param arg - create args\n * @param arg.event - event key\n * @param arg.options - options\n * @returns object\n */\n private createClientEventObjectInMeeting({\n name,\n options,\n errors,\n }: {\n name: ClientEvent['name'];\n options?: SubmitClientEventOptions;\n errors?: ClientEventPayloadError;\n }) {\n this.logger.log(\n CALL_DIAGNOSTIC_LOG_IDENTIFIER,\n 'CallDiagnosticMetrics: @createClientEventObjectInMeeting. Creating in meeting event object.',\n `name: ${name}`\n );\n const {meetingId, mediaConnections, globalMeetingId, webexConferenceIdStr} = options;\n\n // @ts-ignore\n const meeting = this.webex.meetings.meetingCollection.get(meetingId);\n\n if (!meeting) {\n console.warn(\n 'Attempt to send client event but no meeting was found...',\n `name: ${name}, meetingId: ${meetingId}`\n );\n // @ts-ignore\n this.webex.internal.metrics.submitClientMetrics(CALL_DIAGNOSTIC_EVENT_FAILED_TO_SEND, {\n fields: {\n meetingId,\n name,\n },\n });\n\n return undefined;\n }\n\n // grab identifiers\n const identifiers = this.getIdentifiers({\n meeting,\n mediaConnections: meeting?.mediaConnections || mediaConnections,\n webexConferenceIdStr,\n globalMeetingId,\n });\n\n // create client event object\n const clientEventObject: ClientEvent['payload'] = {\n name,\n canProceed: true,\n identifiers,\n errors,\n eventData: {\n webClientDomain: window.location.hostname,\n },\n userType: meeting.getCurUserType(),\n loginType: this.getCurLoginType(),\n isConvergedArchitectureEnabled: this.getIsConvergedArchitectureEnabled({\n meetingId,\n }),\n webexSubServiceType: this.getSubServiceType(meeting),\n };\n\n if (options?.rawError?.message) {\n // @ts-ignore\n clientEventObject.eventData.rawErrorMessage = options?.rawError?.message;\n }\n\n return clientEventObject;\n }\n\n /**\n * Create client event object for pre meeting events\n * @param arg - create args\n * @param arg.event - event key\n * @param arg.options - payload\n * @returns object\n */\n private createClientEventObjectPreMeeting({\n name,\n options,\n errors,\n }: {\n name: ClientEvent['name'];\n options?: SubmitClientEventOptions;\n errors?: ClientEventPayloadError;\n }) {\n this.logger.log(\n CALL_DIAGNOSTIC_LOG_IDENTIFIER,\n 'CallDiagnosticMetrics: @createClientEventObjectPreMeeting. Creating pre meeting event object.',\n `name: ${name}`\n );\n const {correlationId, globalMeetingId, webexConferenceIdStr, preLoginId} = options;\n\n // grab identifiers\n const identifiers = this.getIdentifiers({\n correlationId,\n preLoginId,\n globalMeetingId,\n webexConferenceIdStr,\n });\n\n // create client event object\n const clientEventObject: ClientEvent['payload'] = {\n name,\n errors,\n canProceed: true,\n identifiers,\n eventData: {\n webClientDomain: window.location.hostname,\n },\n loginType: this.getCurLoginType(),\n };\n\n if (options?.rawError?.message) {\n // @ts-ignore\n clientEventObject.eventData.rawErrorMessage = options?.rawError?.message;\n }\n\n return clientEventObject;\n }\n\n /**\n * Prepare Client Event CA event.\n * @param arg - submit params\n * @param arg.event - event key\n * @param arg.payload - additional payload to be merged with default payload\n * @param arg.options - payload\n * @returns {any} options to be with fetch\n * @throws\n */\n private prepareClientEvent({\n name,\n payload,\n options,\n }: {\n name: ClientEvent['name'];\n payload?: ClientEventPayload;\n options?: SubmitClientEventOptions;\n }) {\n const {meetingId, correlationId, rawError} = options;\n let clientEventObject: ClientEvent['payload'];\n\n // check if we need to generate errors\n const errors: ClientEventPayloadError = [];\n\n if (rawError) {\n this.logger.log(\n CALL_DIAGNOSTIC_LOG_IDENTIFIER,\n 'CallDiagnosticMetrics: @prepareClientEvent. Error detected, attempting to map and attach it to the event...',\n `name: ${name}`,\n `rawError: ${generateCommonErrorMetadata(rawError)}`\n );\n\n const generatedError = this.generateClientEventErrorPayload(rawError);\n if (generatedError) {\n errors.push(generatedError);\n }\n this.logger.log(\n CALL_DIAGNOSTIC_LOG_IDENTIFIER,\n 'CallDiagnosticMetrics: @prepareClientEvent. Generated errors:',\n `generatedError: ${JSON.stringify(generatedError)}`\n );\n }\n\n // events that will most likely happen in join phase\n if (meetingId) {\n clientEventObject = this.createClientEventObjectInMeeting({name, options, errors});\n } else if (correlationId) {\n // any pre join events or events that are outside the meeting.\n clientEventObject = this.createClientEventObjectPreMeeting({name, options, errors});\n } else {\n throw new Error('Not implemented');\n }\n\n // merge any new properties, or override existing ones\n clientEventObject = merge(clientEventObject, payload);\n\n // append client event data to the call diagnostic event\n const diagnosticEvent = this.prepareDiagnosticEvent(clientEventObject, options);\n\n return diagnosticEvent;\n }\n\n /**\n * Submit Client Event CA event.\n * @param arg - submit params\n * @param arg.event - event key\n * @param arg.payload - additional payload to be merged with default payload\n * @param arg.options - payload\n * @throws\n */\n public submitClientEvent({\n name,\n payload,\n options,\n }: {\n name: ClientEvent['name'];\n payload?: ClientEventPayload;\n options?: SubmitClientEventOptions;\n }) {\n this.logger.log(\n CALL_DIAGNOSTIC_LOG_IDENTIFIER,\n 'CallDiagnosticMetrics: @submitClientEvent. Submit Client Event CA event.',\n `name: ${name}`,\n `payload: ${JSON.stringify(payload)}`,\n `options: ${JSON.stringify(options)}`\n );\n const diagnosticEvent = this.prepareClientEvent({name, payload, options});\n\n if (options?.preLoginId) {\n return this.submitToCallDiagnosticsPreLogin(diagnosticEvent, options?.preLoginId);\n }\n\n this.validator({type: 'ce', event: diagnosticEvent});\n\n return this.submitToCallDiagnostics(diagnosticEvent);\n }\n\n /**\n * Prepare the event and send the request to metrics-a service.\n * @param event\n * @returns promise\n */\n submitToCallDiagnostics(event: Event): Promise<any> {\n // build metrics-a event type\n const finalEvent = {\n eventPayload: event,\n type: ['diagnostic-event'],\n };\n\n this.logger.log(\n CALL_DIAGNOSTIC_LOG_IDENTIFIER,\n 'CallDiagnosticMetrics: @submitToCallDiagnostics. Preparing to send the request',\n `finalEvent: ${JSON.stringify(finalEvent)}`\n );\n\n return this.callDiagnosticEventsBatcher.request(finalEvent);\n }\n\n /**\n * Pre login events are not batched. We make the request directly.\n * @param event\n * @param preLoginId\n * @returns\n */\n public submitToCallDiagnosticsPreLogin = (event: Event, preLoginId?: string): Promise<any> => {\n // build metrics-a event type\n // @ts-ignore\n const diagnosticEvent = prepareDiagnosticMetricItem(this.webex, {\n eventPayload: event,\n type: ['diagnostic-event'],\n });\n\n // append sent timestamp\n diagnosticEvent.eventPayload.originTime.sent = new Date().toISOString();\n\n this.logger.log(\n CALL_DIAGNOSTIC_LOG_IDENTIFIER,\n `CallDiagnosticMetrics: @submitToCallDiagnosticsPreLogin. Sending the request:`,\n `diagnosticEvent: ${JSON.stringify(diagnosticEvent)}`\n );\n\n // @ts-ignore\n return this.webex.internal.newMetrics.postPreLoginMetric(diagnosticEvent, preLoginId);\n };\n\n /**\n * Builds a request options object to later be passed to fetch().\n * @param arg - submit params\n * @param arg.event - event key\n * @param arg.payload - additional payload to be merged with default payload\n * @param arg.options - client event options\n * @returns {Promise<any>}\n * @throws\n */\n public async buildClientEventFetchRequestOptions({\n name,\n payload,\n options,\n }: {\n name: ClientEvent['name'];\n payload?: ClientEventPayload;\n options?: SubmitClientEventOptions;\n }): Promise<any> {\n this.logger.log(\n CALL_DIAGNOSTIC_LOG_IDENTIFIER,\n 'CallDiagnosticMetrics: @buildClientEventFetchRequestOptions. Building request options object for fetch()...',\n `name: ${name}`,\n `payload: ${JSON.stringify(payload)}`,\n `options: ${JSON.stringify(options)}`\n );\n\n const clientEvent = this.prepareClientEvent({name, payload, options});\n\n // build metrics-a event type\n // @ts-ignore\n const diagnosticEvent = prepareDiagnosticMetricItem(this.webex, {\n eventPayload: clientEvent,\n type: ['diagnostic-event'],\n });\n\n const request = {\n method: 'POST',\n service: 'metrics',\n resource: 'clientmetrics',\n body: {\n metrics: [diagnosticEvent],\n },\n headers: {},\n // @ts-ignore\n waitForServiceTimeout: this.webex.internal.metrics.config.waitForServiceTimeout,\n };\n\n if (options.preLoginId) {\n request.headers = {\n authorization: false,\n 'x-prelogin-userid': options.preLoginId,\n };\n request.resource = 'clientmetrics-prelogin';\n }\n\n // @ts-ignore\n return this.webex.prepareFetchOptions(request);\n }\n\n /**\n * Returns true if the specified serviceErrorCode maps to an expected error.\n * @param {number} serviceErrorCode the service error code\n * @returns {boolean}\n */\n public isServiceErrorExpected(serviceErrorCode: number): boolean {\n const clientErrorCode = SERVICE_ERROR_CODES_TO_CLIENT_ERROR_CODES_MAP[serviceErrorCode];\n const clientErrorPayload = CLIENT_ERROR_CODE_TO_ERROR_PAYLOAD[clientErrorCode];\n\n return clientErrorPayload?.category === 'expected';\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"names":["BrowserDetection","getOSVersion","getBrowserName","getBrowserVersion","CallDiagnosticMetrics","args","options","resolve","event","valid","preLoginId","diagnosticEvent","prepareDiagnosticMetricItem","webex","eventPayload","type","originTime","sent","Date","toISOString","internal","newMetrics","postPreLoginMetric","logger","callDiagnosticEventsBatcher","CallDiagnosticEventsBatcher","parent","canAuthorize","credentials","isUnverifiedGuest","meetingId","meeting","meetings","meetingCollection","get","meetingInfo","enableConvergedArchitecture","undefined","webexScheduled","enableEvent","pmr","WEBEX_SUB_SERVICE_TYPES","PMR","SCHEDULED_MEETING","WEBINAR","defaultClientType","config","metrics","clientType","defaultSubClientType","subClientType","providedClientVersion","clientVersion","defaultSDKClientVersion","CLIENT_NAME","version","versionMetadata","extractVersionMetadata","origin","name","networkType","userAgent","userAgentToString","clientName","webexVersion","clientInfo","localNetworkPrefix","anonymizeIPAddress","geoHintInfo","clientAddress","osVersion","os","getOSNameInternal","browser","browserVersion","environment","newEnvironment","clientLaunchMethod","Error","mediaConnections","correlationId","webexConferenceIdStr","globalMeetingId","identifiers","device","userId","deviceId","url","orgId","locusUrl","services","locusInfo","fullState","locusId","split","pop","locusStartTime","lastActive","confIdStr","confID","siteName","webexSiteName","mediaAgentAlias","mediaAgentGroupId","eventData","getOrigin","eventId","uuid","v4","triggered","senderCountryCode","countryCode","clearEmptyKeysRecursively","payload","console","warn","submitClientMetrics","CALL_DIAGNOSTIC_EVENT_FAILED_TO_SEND","fields","getIdentifiers","clientEventObject","canProceed","webClientDomain","window","location","hostname","intervals","sourceMetadata","applicationSoftwareType","applicationSoftwareVersion","mediaEngineSoftwareType","mediaEngineSoftwareVersion","startTime","prepareDiagnosticEvent","validator","submitToCallDiagnostics","clientErrorCode","serviceErrorCode","serviceErrorName","payloadOverrides","error","partialParsedError","CLIENT_ERROR_CODE_TO_ERROR_PAYLOAD","fatal","shownToUser","category","errorCode","errorData","errorName","rawError","isBrowserMediaErrorName","getErrorPayloadForClientErrorCode","BROWSER_MEDIA_ERROR_NAME_TO_CLIENT_ERROR_CODES_MAP","body","code","reason","reasonCode","SERVICE_ERROR_CODES_TO_CLIENT_ERROR_CODES_MAP","isLocusServiceErrorCode","NEW_LOCUS_ERROR_CLIENT_CODE","isMeetingInfoServiceError","MEETING_INFO_LOOKUP_ERROR_CLIENT_CODE","isNetworkError","NETWORK_ERROR","errorDescription","message","isUnauthorizedError","AUTHENTICATION_FAILED_CODE","UNKNOWN_ERROR","errors","userType","getCurUserType","loginType","getCurLoginType","isConvergedArchitectureEnabled","getIsConvergedArchitectureEnabled","webexSubServiceType","getSubServiceType","rawErrorMessage","generatedError","generateClientEventErrorPayload","push","log","CALL_DIAGNOSTIC_LOG_IDENTIFIER","createClientEventObjectInMeeting","createClientEventObjectPreMeeting","prepareClientEvent","submitToCallDiagnosticsPreLogin","finalEvent","request","clientEvent","method","service","resource","headers","waitForServiceTimeout","authorization","prepareFetchOptions","clientErrorPayload","StatelessWebexPlugin"],"sources":["call-diagnostic-metrics.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-unused-vars */\n/* eslint-disable class-methods-use-this */\n/* eslint-disable valid-jsdoc */\nimport {getOSNameInternal} from '@webex/internal-plugin-metrics';\nimport {BrowserDetection} from '@webex/common';\nimport uuid from 'uuid';\nimport {merge} from 'lodash';\nimport {StatelessWebexPlugin} from '@webex/webex-core';\n\nimport {\n anonymizeIPAddress,\n clearEmptyKeysRecursively,\n isLocusServiceErrorCode,\n prepareDiagnosticMetricItem,\n userAgentToString,\n extractVersionMetadata,\n isMeetingInfoServiceError,\n isBrowserMediaErrorName,\n isNetworkError,\n isUnauthorizedError,\n} from './call-diagnostic-metrics.util';\nimport {CLIENT_NAME} from '../config';\nimport {\n Event,\n ClientType,\n SubClientType,\n NetworkType,\n EnvironmentType,\n NewEnvironmentType,\n ClientEvent,\n SubmitClientEventOptions,\n MediaQualityEvent,\n SubmitMQEOptions,\n SubmitMQEPayload,\n ClientLaunchMethodType,\n ClientEventError,\n ClientEventPayload,\n ClientInfo,\n ClientEventPayloadError,\n ClientSubServiceType,\n} from '../metrics.types';\nimport CallDiagnosticEventsBatcher from './call-diagnostic-metrics-batcher';\nimport {\n CLIENT_ERROR_CODE_TO_ERROR_PAYLOAD,\n CALL_DIAGNOSTIC_EVENT_FAILED_TO_SEND,\n NEW_LOCUS_ERROR_CLIENT_CODE,\n SERVICE_ERROR_CODES_TO_CLIENT_ERROR_CODES_MAP,\n UNKNOWN_ERROR,\n BROWSER_MEDIA_ERROR_NAME_TO_CLIENT_ERROR_CODES_MAP,\n MEETING_INFO_LOOKUP_ERROR_CLIENT_CODE,\n CALL_DIAGNOSTIC_LOG_IDENTIFIER,\n NETWORK_ERROR,\n AUTHENTICATION_FAILED_CODE,\n WEBEX_SUB_SERVICE_TYPES,\n} from './config';\nimport {generateCommonErrorMetadata} from '../utils';\n\nconst {getOSVersion, getBrowserName, getBrowserVersion} = BrowserDetection();\n\ntype GetOriginOptions = {\n clientType: ClientType;\n subClientType: SubClientType;\n networkType?: NetworkType;\n clientLaunchMethod?: ClientLaunchMethodType;\n environment?: EnvironmentType;\n newEnvironment?: NewEnvironmentType;\n};\n\ntype GetIdentifiersOptions = {\n meeting?: any;\n mediaConnections?: any[];\n correlationId?: string;\n preLoginId?: string;\n globalMeetingId?: string;\n webexConferenceIdStr?: string;\n};\n\n/**\n * @description Util class to handle Call Analyzer Metrics\n * @export\n * @class CallDiagnosticMetrics\n */\nexport default class CallDiagnosticMetrics extends StatelessWebexPlugin {\n // @ts-ignore\n private callDiagnosticEventsBatcher: CallDiagnosticEventsBatcher;\n private logger: any; // to avoid adding @ts-ignore everywhere\n // the default validator before piping an event to the batcher\n // this function can be overridden by the user\n public validator: (options: {\n type: 'mqe' | 'ce';\n event: Event;\n }) => Promise<{event: Event; valid: boolean}> = (options: {type: 'mqe' | 'ce'; event: Event}) =>\n Promise.resolve({event: options?.event, valid: true});\n\n /**\n * Constructor\n * @param args\n */\n constructor(...args) {\n super(...args);\n // @ts-ignore\n this.logger = this.webex.logger;\n // @ts-ignore\n this.callDiagnosticEventsBatcher = new CallDiagnosticEventsBatcher({}, {parent: this.webex});\n }\n\n /**\n * Returns the login type of the current user\n * @returns one of 'login-ci','unverified-guest', null\n */\n getCurLoginType() {\n // @ts-ignore\n if (this.webex.canAuthorize) {\n // @ts-ignore\n return this.webex.credentials.isUnverifiedGuest ? 'unverified-guest' : 'login-ci';\n }\n\n return null;\n }\n\n /**\n * Returns if the meeting has converged architecture enabled\n * @param options.meetingId\n */\n getIsConvergedArchitectureEnabled({meetingId}: {meetingId?: string}): boolean {\n if (meetingId) {\n // @ts-ignore\n const meeting = this.webex.meetings.meetingCollection.get(meetingId);\n\n return meeting?.meetingInfo?.enableConvergedArchitecture;\n }\n\n return undefined;\n }\n\n /**\n * Returns meeting's subServiceType\n * @param meeting\n * @returns\n */\n getSubServiceType(meeting?: any): ClientSubServiceType {\n if (meeting) {\n // @ts-ignore\n const meetingInfo = meeting?.meetingInfo;\n // if not Scheduled, not Webinar, pmr - then pmr\n if (!meetingInfo?.webexScheduled && !meetingInfo?.enableEvent && meetingInfo?.pmr) {\n return WEBEX_SUB_SERVICE_TYPES.PMR;\n }\n // if Scheduled, not Webinar, not pmr - then ScheduledMeeting\n if (meetingInfo?.webexScheduled && !meetingInfo?.enableEvent && !meetingInfo?.pmr) {\n return WEBEX_SUB_SERVICE_TYPES.SCHEDULED_MEETING;\n }\n // if Scheduled, Webinar, not pmr - then Webinar\n if (meetingInfo?.webexScheduled && meetingInfo?.enableEvent && !meetingInfo?.pmr) {\n return WEBEX_SUB_SERVICE_TYPES.WEBINAR;\n }\n }\n\n return undefined;\n }\n\n /**\n * Get origin object for Call Diagnostic Event payload.\n * @param options\n * @param meetingId\n * @returns\n */\n getOrigin(options: GetOriginOptions, meetingId?: string) {\n const defaultClientType: ClientType =\n // @ts-ignore\n this.webex.meetings.config?.metrics?.clientType;\n const defaultSubClientType: SubClientType =\n // @ts-ignore\n this.webex.meetings.config?.metrics?.subClientType;\n // @ts-ignore\n const providedClientVersion: string = this.webex.meetings.config?.metrics?.clientVersion;\n // @ts-ignore\n const defaultSDKClientVersion = `${CLIENT_NAME}/${this.webex.version}`;\n\n let versionMetadata: Pick<ClientInfo, 'majorVersion' | 'minorVersion'> = {};\n\n // sdk version split doesn't really make sense for now...\n if (providedClientVersion) {\n versionMetadata = extractVersionMetadata(providedClientVersion);\n }\n\n if (\n (defaultClientType && defaultSubClientType) ||\n (options.clientType && options.subClientType)\n ) {\n const origin: Event['origin'] = {\n name: 'endpoint',\n networkType: options?.networkType || 'unknown',\n userAgent: userAgentToString({\n // @ts-ignore\n clientName: this.webex.meetings?.config?.metrics?.clientName,\n // @ts-ignore\n webexVersion: this.webex.version,\n }),\n clientInfo: {\n clientType: options?.clientType || defaultClientType,\n clientVersion: providedClientVersion || defaultSDKClientVersion,\n ...versionMetadata,\n localNetworkPrefix:\n // @ts-ignore\n anonymizeIPAddress(this.webex.meetings.geoHintInfo?.clientAddress) || undefined,\n osVersion: getOSVersion() || 'unknown',\n subClientType: options?.subClientType || defaultSubClientType,\n os: getOSNameInternal(),\n browser: getBrowserName(),\n browserVersion: getBrowserVersion(),\n },\n };\n\n if (meetingId) {\n // @ts-ignore\n const meeting = this.webex.meetings.meetingCollection.get(meetingId);\n if (meeting?.environment) {\n origin.environment = meeting.environment;\n }\n }\n\n if (options?.environment) {\n origin.environment = options.environment;\n }\n\n if (options?.newEnvironment) {\n origin.newEnvironment = options.newEnvironment;\n }\n\n if (options?.clientLaunchMethod) {\n origin.clientInfo.clientLaunchMethod = options.clientLaunchMethod;\n }\n\n return origin;\n }\n\n throw new Error(\"ClientType and SubClientType can't be undefined\");\n }\n\n /**\n * Gather identifier details for call diagnostic payload.\n * @throws Error if initialization fails.\n * @param options\n */\n getIdentifiers(options: GetIdentifiersOptions) {\n const {\n meeting,\n mediaConnections,\n correlationId,\n webexConferenceIdStr,\n globalMeetingId,\n preLoginId,\n } = options;\n const identifiers: Event['event']['identifiers'] = {\n correlationId: 'unknown',\n };\n\n if (meeting) {\n identifiers.correlationId = meeting.correlationId;\n }\n\n if (correlationId) {\n identifiers.correlationId = correlationId;\n }\n // @ts-ignore\n if (this.webex.internal) {\n // @ts-ignore\n const {device} = this.webex.internal;\n identifiers.userId = device.userId || preLoginId;\n identifiers.deviceId = device.url;\n identifiers.orgId = device.orgId;\n // @ts-ignore\n identifiers.locusUrl = this.webex.internal.services.get('locus');\n }\n\n if (meeting?.locusInfo?.fullState) {\n identifiers.locusUrl = meeting.locusUrl;\n identifiers.locusId = meeting.locusUrl && meeting.locusUrl.split('/').pop();\n identifiers.locusStartTime =\n meeting.locusInfo.fullState && meeting.locusInfo.fullState.lastActive;\n }\n\n if (meeting?.meetingInfo?.confIdStr || meeting?.meetingInfo?.confID) {\n identifiers.webexConferenceIdStr = `${\n meeting.meetingInfo?.confIdStr || meeting.meetingInfo?.confID\n }`;\n }\n\n if (meeting?.meetingInfo?.meetingId) {\n identifiers.globalMeetingId = meeting.meetingInfo?.meetingId;\n }\n\n if (meeting?.meetingInfo?.siteName) {\n identifiers.webexSiteName = meeting.meetingInfo?.siteName;\n }\n\n if (mediaConnections) {\n identifiers.mediaAgentAlias = mediaConnections?.[0]?.mediaAgentAlias;\n identifiers.mediaAgentGroupId = mediaConnections?.[0]?.mediaAgentGroupId;\n }\n\n if (!identifiers?.webexConferenceIdStr && webexConferenceIdStr) {\n identifiers.webexConferenceIdStr = `${webexConferenceIdStr}`;\n }\n\n if (!identifiers?.globalMeetingId && globalMeetingId) {\n identifiers.globalMeetingId = globalMeetingId;\n }\n\n if (identifiers.correlationId === undefined) {\n throw new Error('Identifiers initialization failed.');\n }\n\n return identifiers;\n }\n\n /**\n * Create diagnostic event, which can hold client event, feature event or MQE event data.\n * This just initiates the shared properties that are required for all the 3 event categories.\n * @param eventData\n * @param options\n * @returns\n */\n prepareDiagnosticEvent(eventData: Event['event'], options: any) {\n const {meetingId} = options;\n const origin = this.getOrigin(options, meetingId);\n\n const event: Event = {\n eventId: uuid.v4(),\n version: 1,\n origin,\n originTime: {\n triggered: new Date().toISOString(),\n // is overridden in prepareRequest batcher\n sent: 'not_defined_yet',\n },\n // @ts-ignore\n senderCountryCode: this.webex.meetings.geoHintInfo?.countryCode,\n event: eventData,\n };\n\n // sanitize (remove empty properties, CA requires it)\n // but we don't want to sanitize MQE as most of the times\n // values will be 0, [] etc, and they are required.\n if (eventData.name !== 'client.mediaquality.event') {\n clearEmptyKeysRecursively(event);\n }\n\n return event;\n }\n\n /**\n * TODO: NOT IMPLEMENTED\n * Submit Feature Event\n * @returns\n */\n public submitFeatureEvent() {\n throw Error('Not implemented');\n }\n\n /**\n * Submit Media Quality Event\n * @param args - submit params\n * @param arg.name - event key\n * @param arg.payload - additional payload to be merge with the default payload\n * @param arg.options - options\n */\n submitMQE({\n name,\n payload,\n options,\n }: {\n name: MediaQualityEvent['name'];\n payload: SubmitMQEPayload;\n options: SubmitMQEOptions;\n }) {\n const {meetingId, mediaConnections, webexConferenceIdStr, globalMeetingId} = options;\n\n // events that will most likely happen in join phase\n if (meetingId) {\n // @ts-ignore\n const meeting = this.webex.meetings.meetingCollection.get(meetingId);\n\n if (!meeting) {\n console.warn(\n 'Attempt to send MQE but no meeting was found...',\n `event: ${name}, meetingId: ${meetingId}`\n );\n // @ts-ignore\n this.webex.internal.metrics.submitClientMetrics(CALL_DIAGNOSTIC_EVENT_FAILED_TO_SEND, {\n fields: {\n meetingId,\n name,\n },\n });\n\n return;\n }\n\n // merge identifiers\n const identifiers = this.getIdentifiers({\n meeting,\n mediaConnections: meeting.mediaConnections || mediaConnections,\n webexConferenceIdStr,\n globalMeetingId,\n });\n\n // create media quality event object\n let clientEventObject: MediaQualityEvent['payload'] = {\n name,\n canProceed: true,\n identifiers,\n eventData: {\n webClientDomain: window.location.hostname,\n },\n intervals: payload.intervals,\n sourceMetadata: {\n applicationSoftwareType: CLIENT_NAME,\n // @ts-ignore\n applicationSoftwareVersion: this.webex.version,\n mediaEngineSoftwareType: getBrowserName() || 'browser',\n mediaEngineSoftwareVersion: getOSVersion() || 'unknown',\n startTime: new Date().toISOString(),\n },\n };\n\n // merge any new properties, or override existing ones\n clientEventObject = merge(clientEventObject, payload);\n\n // append media quality event data to the call diagnostic event\n const diagnosticEvent = this.prepareDiagnosticEvent(clientEventObject, options);\n this.validator({type: 'mqe', event: diagnosticEvent});\n this.submitToCallDiagnostics(diagnosticEvent);\n } else {\n throw new Error(\n 'Media quality events cant be sent outside the context of a meeting. Meeting id is required.'\n );\n }\n }\n\n /**\n * Return Client Event payload by client error code\n * @param arg - get error arg\n * @param arg.clientErrorCode\n * @param arg.serviceErrorCode\n * @param arg.payloadOverrides\n * @returns\n */\n public getErrorPayloadForClientErrorCode({\n clientErrorCode,\n serviceErrorCode,\n serviceErrorName,\n payloadOverrides,\n }: {\n clientErrorCode: number;\n serviceErrorCode: any;\n serviceErrorName?: any;\n payloadOverrides?: any;\n }): ClientEventError {\n let error: ClientEventError;\n\n if (clientErrorCode) {\n const partialParsedError = CLIENT_ERROR_CODE_TO_ERROR_PAYLOAD[clientErrorCode];\n\n if (partialParsedError) {\n error = merge(\n {fatal: true, shownToUser: false, name: 'other', category: 'other'}, // default values\n {errorCode: clientErrorCode},\n serviceErrorName ? {errorData: {errorName: serviceErrorName}} : {},\n {serviceErrorCode},\n partialParsedError,\n payloadOverrides || {}\n );\n\n return error;\n }\n }\n\n return undefined;\n }\n\n /**\n * Generate error payload for Client Event\n * @param rawError\n */\n generateClientEventErrorPayload(rawError: any) {\n if (rawError.name) {\n if (isBrowserMediaErrorName(rawError.name)) {\n return this.getErrorPayloadForClientErrorCode({\n serviceErrorCode: undefined,\n clientErrorCode: BROWSER_MEDIA_ERROR_NAME_TO_CLIENT_ERROR_CODES_MAP[rawError.name],\n serviceErrorName: rawError.name,\n });\n }\n }\n\n const serviceErrorCode =\n rawError?.error?.body?.errorCode ||\n rawError?.body?.errorCode ||\n rawError?.body?.code ||\n rawError?.body?.reason?.reasonCode;\n\n if (serviceErrorCode) {\n const clientErrorCode = SERVICE_ERROR_CODES_TO_CLIENT_ERROR_CODES_MAP[serviceErrorCode];\n if (clientErrorCode) {\n return this.getErrorPayloadForClientErrorCode({clientErrorCode, serviceErrorCode});\n }\n\n // by default, if it is locus error, return new locus err\n if (isLocusServiceErrorCode(serviceErrorCode)) {\n return this.getErrorPayloadForClientErrorCode({\n clientErrorCode: NEW_LOCUS_ERROR_CLIENT_CODE,\n serviceErrorCode,\n });\n }\n }\n\n if (isMeetingInfoServiceError(rawError)) {\n return this.getErrorPayloadForClientErrorCode({\n clientErrorCode: MEETING_INFO_LOOKUP_ERROR_CLIENT_CODE,\n serviceErrorCode,\n });\n }\n\n if (isNetworkError(rawError)) {\n const payload = this.getErrorPayloadForClientErrorCode({\n clientErrorCode: NETWORK_ERROR,\n serviceErrorCode,\n payloadOverrides: rawError.payloadOverrides,\n });\n payload.errorDescription = rawError.message;\n\n return payload;\n }\n\n if (isUnauthorizedError(rawError)) {\n const payload = this.getErrorPayloadForClientErrorCode({\n clientErrorCode: AUTHENTICATION_FAILED_CODE,\n serviceErrorCode,\n payloadOverrides: rawError.payloadOverrides,\n });\n payload.errorDescription = rawError.message;\n\n return payload;\n }\n\n // otherwise return unkown error\n return this.getErrorPayloadForClientErrorCode({\n clientErrorCode: UNKNOWN_ERROR,\n serviceErrorCode: UNKNOWN_ERROR,\n });\n }\n\n /**\n * Create client event object for in meeting events\n * @param arg - create args\n * @param arg.event - event key\n * @param arg.options - options\n * @returns object\n */\n private createClientEventObjectInMeeting({\n name,\n options,\n errors,\n }: {\n name: ClientEvent['name'];\n options?: SubmitClientEventOptions;\n errors?: ClientEventPayloadError;\n }) {\n const {meetingId, mediaConnections, globalMeetingId, webexConferenceIdStr} = options;\n\n // @ts-ignore\n const meeting = this.webex.meetings.meetingCollection.get(meetingId);\n\n if (!meeting) {\n console.warn(\n 'Attempt to send client event but no meeting was found...',\n `name: ${name}, meetingId: ${meetingId}`\n );\n // @ts-ignore\n this.webex.internal.metrics.submitClientMetrics(CALL_DIAGNOSTIC_EVENT_FAILED_TO_SEND, {\n fields: {\n meetingId,\n name,\n },\n });\n\n return undefined;\n }\n\n // grab identifiers\n const identifiers = this.getIdentifiers({\n meeting,\n mediaConnections: meeting?.mediaConnections || mediaConnections,\n webexConferenceIdStr,\n globalMeetingId,\n });\n\n // create client event object\n const clientEventObject: ClientEvent['payload'] = {\n name,\n canProceed: true,\n identifiers,\n errors,\n eventData: {\n webClientDomain: window.location.hostname,\n },\n userType: meeting.getCurUserType(),\n loginType: this.getCurLoginType(),\n isConvergedArchitectureEnabled: this.getIsConvergedArchitectureEnabled({\n meetingId,\n }),\n webexSubServiceType: this.getSubServiceType(meeting),\n };\n\n if (options?.rawError?.message) {\n // @ts-ignore\n clientEventObject.eventData.rawErrorMessage = options?.rawError?.message;\n }\n\n return clientEventObject;\n }\n\n /**\n * Create client event object for pre meeting events\n * @param arg - create args\n * @param arg.event - event key\n * @param arg.options - payload\n * @returns object\n */\n private createClientEventObjectPreMeeting({\n name,\n options,\n errors,\n }: {\n name: ClientEvent['name'];\n options?: SubmitClientEventOptions;\n errors?: ClientEventPayloadError;\n }) {\n const {correlationId, globalMeetingId, webexConferenceIdStr, preLoginId} = options;\n\n // grab identifiers\n const identifiers = this.getIdentifiers({\n correlationId,\n preLoginId,\n globalMeetingId,\n webexConferenceIdStr,\n });\n\n // create client event object\n const clientEventObject: ClientEvent['payload'] = {\n name,\n errors,\n canProceed: true,\n identifiers,\n eventData: {\n webClientDomain: window.location.hostname,\n },\n loginType: this.getCurLoginType(),\n };\n\n if (options?.rawError?.message) {\n // @ts-ignore\n clientEventObject.eventData.rawErrorMessage = options?.rawError?.message;\n }\n\n return clientEventObject;\n }\n\n /**\n * Prepare Client Event CA event.\n * @param arg - submit params\n * @param arg.event - event key\n * @param arg.payload - additional payload to be merged with default payload\n * @param arg.options - payload\n * @returns {any} options to be with fetch\n * @throws\n */\n private prepareClientEvent({\n name,\n payload,\n options,\n }: {\n name: ClientEvent['name'];\n payload?: ClientEventPayload;\n options?: SubmitClientEventOptions;\n }) {\n const {meetingId, correlationId, rawError} = options;\n let clientEventObject: ClientEvent['payload'];\n\n // check if we need to generate errors\n const errors: ClientEventPayloadError = [];\n\n if (rawError) {\n const generatedError = this.generateClientEventErrorPayload(rawError);\n if (generatedError) {\n errors.push(generatedError);\n }\n this.logger.log(\n CALL_DIAGNOSTIC_LOG_IDENTIFIER,\n 'CallDiagnosticMetrics: @prepareClientEvent. Generated errors:',\n `generatedError: ${JSON.stringify(generatedError)}`\n );\n }\n\n // events that will most likely happen in join phase\n if (meetingId) {\n clientEventObject = this.createClientEventObjectInMeeting({name, options, errors});\n } else if (correlationId) {\n // any pre join events or events that are outside the meeting.\n clientEventObject = this.createClientEventObjectPreMeeting({name, options, errors});\n } else {\n throw new Error('Not implemented');\n }\n\n // merge any new properties, or override existing ones\n clientEventObject = merge(clientEventObject, payload);\n\n // append client event data to the call diagnostic event\n const diagnosticEvent = this.prepareDiagnosticEvent(clientEventObject, options);\n\n return diagnosticEvent;\n }\n\n /**\n * Submit Client Event CA event.\n * @param arg - submit params\n * @param arg.event - event key\n * @param arg.payload - additional payload to be merged with default payload\n * @param arg.options - payload\n * @throws\n */\n public submitClientEvent({\n name,\n payload,\n options,\n }: {\n name: ClientEvent['name'];\n payload?: ClientEventPayload;\n options?: SubmitClientEventOptions;\n }) {\n this.logger.log(\n CALL_DIAGNOSTIC_LOG_IDENTIFIER,\n 'CallDiagnosticMetrics: @submitClientEvent. Submit Client Event CA event.',\n `name: ${name}`\n );\n const diagnosticEvent = this.prepareClientEvent({name, payload, options});\n\n if (options?.preLoginId) {\n return this.submitToCallDiagnosticsPreLogin(diagnosticEvent, options?.preLoginId);\n }\n\n this.validator({type: 'ce', event: diagnosticEvent});\n\n return this.submitToCallDiagnostics(diagnosticEvent);\n }\n\n /**\n * Prepare the event and send the request to metrics-a service.\n * @param event\n * @returns promise\n */\n submitToCallDiagnostics(event: Event): Promise<any> {\n // build metrics-a event type\n const finalEvent = {\n eventPayload: event,\n type: ['diagnostic-event'],\n };\n\n return this.callDiagnosticEventsBatcher.request(finalEvent);\n }\n\n /**\n * Pre login events are not batched. We make the request directly.\n * @param event\n * @param preLoginId\n * @returns\n */\n public submitToCallDiagnosticsPreLogin = (event: Event, preLoginId?: string): Promise<any> => {\n // build metrics-a event type\n // @ts-ignore\n const diagnosticEvent = prepareDiagnosticMetricItem(this.webex, {\n eventPayload: event,\n type: ['diagnostic-event'],\n });\n\n // append sent timestamp\n diagnosticEvent.eventPayload.originTime.sent = new Date().toISOString();\n\n // @ts-ignore\n return this.webex.internal.newMetrics.postPreLoginMetric(diagnosticEvent, preLoginId);\n };\n\n /**\n * Builds a request options object to later be passed to fetch().\n * @param arg - submit params\n * @param arg.event - event key\n * @param arg.payload - additional payload to be merged with default payload\n * @param arg.options - client event options\n * @returns {Promise<any>}\n * @throws\n */\n public async buildClientEventFetchRequestOptions({\n name,\n payload,\n options,\n }: {\n name: ClientEvent['name'];\n payload?: ClientEventPayload;\n options?: SubmitClientEventOptions;\n }): Promise<any> {\n this.logger.log(\n CALL_DIAGNOSTIC_LOG_IDENTIFIER,\n 'CallDiagnosticMetrics: @buildClientEventFetchRequestOptions. Building request options object for fetch()...',\n `name: ${name}`\n );\n\n const clientEvent = this.prepareClientEvent({name, payload, options});\n\n // build metrics-a event type\n // @ts-ignore\n const diagnosticEvent = prepareDiagnosticMetricItem(this.webex, {\n eventPayload: clientEvent,\n type: ['diagnostic-event'],\n });\n\n const request = {\n method: 'POST',\n service: 'metrics',\n resource: 'clientmetrics',\n body: {\n metrics: [diagnosticEvent],\n },\n headers: {},\n // @ts-ignore\n waitForServiceTimeout: this.webex.internal.metrics.config.waitForServiceTimeout,\n };\n\n if (options.preLoginId) {\n request.headers = {\n authorization: false,\n 'x-prelogin-userid': options.preLoginId,\n };\n request.resource = 'clientmetrics-prelogin';\n }\n\n // @ts-ignore\n return this.webex.prepareFetchOptions(request);\n }\n\n /**\n * Returns true if the specified serviceErrorCode maps to an expected error.\n * @param {number} serviceErrorCode the service error code\n * @returns {boolean}\n */\n public isServiceErrorExpected(serviceErrorCode: number): boolean {\n const clientErrorCode = SERVICE_ERROR_CODES_TO_CLIENT_ERROR_CODES_MAP[serviceErrorCode];\n const clientErrorPayload = CLIENT_ERROR_CODE_TO_ERROR_PAYLOAD[clientErrorCode];\n\n return clientErrorPayload?.category === 'expected';\n }\n}\n"],"mappings":"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"}
|
package/dist/metrics.js
CHANGED
package/dist/new-metrics.js
CHANGED
|
@@ -212,7 +212,7 @@ var Metrics = /*#__PURE__*/function (_WebexPlugin) {
|
|
|
212
212
|
}
|
|
213
213
|
}).then(function (res) {
|
|
214
214
|
// @ts-ignore
|
|
215
|
-
_this3.webex.logger.log("NewMetrics: @postPreLoginMetric. Request successful
|
|
215
|
+
_this3.webex.logger.log("NewMetrics: @postPreLoginMetric. Request successful.");
|
|
216
216
|
return res;
|
|
217
217
|
}).catch(function (err) {
|
|
218
218
|
// @ts-ignore
|
|
@@ -244,7 +244,7 @@ var Metrics = /*#__PURE__*/function (_WebexPlugin) {
|
|
|
244
244
|
}
|
|
245
245
|
}).then(function (res) {
|
|
246
246
|
// @ts-ignore
|
|
247
|
-
_this4.webex.logger.log("NewMetrics: @clientMetricsAliasUser. Request successful
|
|
247
|
+
_this4.webex.logger.log("NewMetrics: @clientMetricsAliasUser. Request successful.");
|
|
248
248
|
return res;
|
|
249
249
|
}).catch(function (err) {
|
|
250
250
|
// @ts-ignore
|
package/dist/new-metrics.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["Metrics","args","onReady","webex","once","callDiagnosticMetrics","CallDiagnosticMetrics","parent","callDiagnosticLatencies","CallDiagnosticLatencies","name","payload","options","clearTimestamps","saveTimestamp","key","Error","submitMQE","logger","log","resolve","meetingId","submitClientEvent","preLoginId","request","method","api","resource","headers","authorization","body","metrics","then","res","catch","err","error","generateCommonErrorMetadata","reject","qs","alias","buildClientEventFetchRequestOptions","setTimingsAndFetch","setMetricTimings","serviceErrorCode","isServiceErrorExpected","WebexPlugin"],"sources":["new-metrics.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-unused-vars */\n/* eslint-disable class-methods-use-this */\n/* eslint-disable valid-jsdoc */\n\n// @ts-ignore\nimport {WebexPlugin} from '@webex/webex-core';\n\nimport CallDiagnosticMetrics from './call-diagnostic/call-diagnostic-metrics';\nimport {\n RecursivePartial,\n ClientEvent,\n FeatureEvent,\n BehavioralEvent,\n OperationalEvent,\n MediaQualityEvent,\n InternalEvent,\n SubmitClientEventOptions,\n} from './metrics.types';\nimport CallDiagnosticLatencies from './call-diagnostic/call-diagnostic-metrics-latencies';\nimport {setMetricTimings} from './call-diagnostic/call-diagnostic-metrics.util';\nimport {generateCommonErrorMetadata} from './utils';\n\n/**\n * Metrics plugin to centralize all types of metrics.\n * @class\n */\nclass Metrics extends WebexPlugin {\n // eslint-disable-next-line no-use-before-define\n static instance: Metrics;\n\n // Call Diagnostic latencies\n callDiagnosticLatencies: CallDiagnosticLatencies;\n // Helper classes to handle the different types of metrics\n callDiagnosticMetrics: CallDiagnosticMetrics;\n\n /**\n * Constructor\n * @param args\n * @constructor\n * @private\n * @returns\n */\n constructor(...args) {\n super(...args);\n\n this.onReady();\n }\n\n /**\n * On Ready\n */\n private onReady() {\n // @ts-ignore\n this.webex.once('ready', () => {\n // @ts-ignore\n this.callDiagnosticMetrics = new CallDiagnosticMetrics({}, {parent: this.webex});\n // @ts-ignore\n this.callDiagnosticLatencies = new CallDiagnosticLatencies({}, {parent: this.webex});\n });\n }\n\n /**\n * Used for internal purposes only\n * @param args\n */\n submitInternalEvent({\n name,\n payload,\n options,\n }: {\n name: InternalEvent['name'];\n payload?: RecursivePartial<InternalEvent['payload']>;\n options?: any;\n }) {\n if (name === 'internal.reset.join.latencies') {\n this.callDiagnosticLatencies.clearTimestamps();\n } else {\n this.callDiagnosticLatencies.saveTimestamp({key: name});\n }\n }\n\n /**\n * Behavioral event\n * @param args\n */\n submitBehavioralEvent({\n name,\n payload,\n options,\n }: {\n name: BehavioralEvent['name'];\n payload?: RecursivePartial<BehavioralEvent['payload']>;\n options?: any;\n }) {\n this.callDiagnosticLatencies.saveTimestamp({key: name});\n throw new Error('Not implemented.');\n }\n\n /**\n * Operational event\n * @param args\n */\n submitOperationalEvent({\n name,\n payload,\n options,\n }: {\n name: OperationalEvent['name'];\n payload?: RecursivePartial<OperationalEvent['payload']>;\n options?: any;\n }) {\n throw new Error('Not implemented.');\n }\n\n /**\n * Call Analyzer: Media Quality Event\n * @param args\n */\n submitMQE({\n name,\n payload,\n options,\n }: {\n name: MediaQualityEvent['name'];\n payload: RecursivePartial<MediaQualityEvent['payload']> & {\n intervals: MediaQualityEvent['payload']['intervals'];\n };\n options: any;\n }) {\n this.callDiagnosticLatencies.saveTimestamp({key: name});\n this.callDiagnosticMetrics.submitMQE({name, payload, options});\n }\n\n /**\n * Call Analyzer: Feature Usage Event\n * @param args\n */\n submitFeatureEvent({\n name,\n payload,\n options,\n }: {\n name: FeatureEvent['name'];\n payload?: RecursivePartial<FeatureEvent['payload']>;\n options: any;\n }) {\n throw new Error('Not implemented.');\n }\n\n /**\n * Call Analyzer: Client Event\n * @public\n * @param args\n */\n public submitClientEvent({\n name,\n payload,\n options,\n }: {\n name: ClientEvent['name'];\n payload?: RecursivePartial<ClientEvent['payload']>;\n options?: SubmitClientEventOptions;\n }): Promise<any> {\n if (!this.callDiagnosticLatencies || !this.callDiagnosticMetrics) {\n // @ts-ignore\n this.webex.logger.log(\n `NewMetrics: @submitClientEvent. Attempted to submit before webex.ready. Event name: ${name}`\n );\n\n return Promise.resolve();\n }\n this.callDiagnosticLatencies.saveTimestamp({\n key: name,\n options: {meetingId: options?.meetingId},\n });\n\n return this.callDiagnosticMetrics.submitClientEvent({name, payload, options});\n }\n\n /**\n * Submit a pre-login metric to clientmetrics\n * @public\n * @param payload\n * @param preLoginId - pre-login ID of user\n * @returns\n */\n public postPreLoginMetric(payload: any, preLoginId: string): Promise<any> {\n // @ts-ignore\n return this.webex\n .request({\n method: 'POST',\n api: 'metrics',\n resource: 'clientmetrics-prelogin',\n headers: {\n authorization: false,\n 'x-prelogin-userid': preLoginId,\n },\n body: {\n metrics: [payload],\n },\n })\n .then((res) => {\n // @ts-ignore\n this.webex.logger.log(`NewMetrics: @postPreLoginMetric. Request successful:`, res);\n\n return res;\n })\n .catch((err) => {\n // @ts-ignore\n this.logger.error(\n `NewMetrics: @postPreLoginMetric. Request failed:`,\n `err: ${generateCommonErrorMetadata(err)}`\n );\n\n return Promise.reject(err);\n });\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 public clientMetricsAliasUser(preLoginId: string) {\n // @ts-ignore\n return this.webex\n .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 .then((res) => {\n // @ts-ignore\n this.webex.logger.log(`NewMetrics: @clientMetricsAliasUser. Request successful:`, res);\n\n return res;\n })\n .catch((err) => {\n // @ts-ignore\n this.logger.error(\n `NewMetrics: @clientMetricsAliasUser. Request failed:`,\n `err: ${generateCommonErrorMetadata(err)}`\n );\n\n return Promise.reject(err);\n });\n }\n\n /**\n * Returns a promise that will resolve to fetch options for submitting a metric.\n *\n * This is to support quickly submitting metrics when the browser/tab is closing.\n * Calling submitClientEvent will not work because there some async steps that will\n * not complete before the browser is closed. Instead, we pre-gather all the\n * information/options needed for the request(s), and then simply and quickly\n * fire the fetch(es) when beforeUnload is triggered.\n *\n * We must use fetch instead of request because fetch has a keepalive option that\n * allows the request it to outlive the page.\n *\n * Note: the timings values will be wrong, but setMetricTimingsAndFetch() will\n * properly adjust them before submitting.\n *\n * @public\n * @param {Object} arg\n * @param {String} arg.name - event name\n * @param {Object} arg.payload - event payload\n * @param {Object} arg.options - other options\n * @returns {Promise} promise that resolves to options to be used with fetch\n */\n public async buildClientEventFetchRequestOptions({\n name,\n payload,\n options,\n }: {\n name: ClientEvent['name'];\n payload?: RecursivePartial<ClientEvent['payload']>;\n options?: SubmitClientEventOptions;\n }): Promise<any> {\n return this.callDiagnosticMetrics.buildClientEventFetchRequestOptions({\n name,\n payload,\n options,\n });\n }\n\n /**\n * Submits a metric from pre-built request options via the fetch API. Updates\n * the \"$timings\" and \"originTime\" values to Date.now() since the existing times\n * were set when the options were built (not submitted).\n\n * @param {any} options - the pre-built request options for submitting a metric\n * @returns {Promise} promise that resolves to the response object\n */\n public setMetricTimingsAndFetch(options: any): Promise<any> {\n // @ts-ignore\n return this.webex.setTimingsAndFetch(setMetricTimings(options));\n }\n\n /**\n * Returns true if the specified serviceErrorCode maps to an expected error.\n * @param {number} serviceErrorCode the service error code\n * @returns {boolean}\n */\n public isServiceErrorExpected(serviceErrorCode: number): boolean {\n return this.callDiagnosticMetrics.isServiceErrorExpected(serviceErrorCode);\n }\n}\n\nexport default Metrics;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"names":["Metrics","args","onReady","webex","once","callDiagnosticMetrics","CallDiagnosticMetrics","parent","callDiagnosticLatencies","CallDiagnosticLatencies","name","payload","options","clearTimestamps","saveTimestamp","key","Error","submitMQE","logger","log","resolve","meetingId","submitClientEvent","preLoginId","request","method","api","resource","headers","authorization","body","metrics","then","res","catch","err","error","generateCommonErrorMetadata","reject","qs","alias","buildClientEventFetchRequestOptions","setTimingsAndFetch","setMetricTimings","serviceErrorCode","isServiceErrorExpected","WebexPlugin"],"sources":["new-metrics.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-unused-vars */\n/* eslint-disable class-methods-use-this */\n/* eslint-disable valid-jsdoc */\n\n// @ts-ignore\nimport {WebexPlugin} from '@webex/webex-core';\n\nimport CallDiagnosticMetrics from './call-diagnostic/call-diagnostic-metrics';\nimport {\n RecursivePartial,\n ClientEvent,\n FeatureEvent,\n BehavioralEvent,\n OperationalEvent,\n MediaQualityEvent,\n InternalEvent,\n SubmitClientEventOptions,\n} from './metrics.types';\nimport CallDiagnosticLatencies from './call-diagnostic/call-diagnostic-metrics-latencies';\nimport {setMetricTimings} from './call-diagnostic/call-diagnostic-metrics.util';\nimport {generateCommonErrorMetadata} from './utils';\n\n/**\n * Metrics plugin to centralize all types of metrics.\n * @class\n */\nclass Metrics extends WebexPlugin {\n // eslint-disable-next-line no-use-before-define\n static instance: Metrics;\n\n // Call Diagnostic latencies\n callDiagnosticLatencies: CallDiagnosticLatencies;\n // Helper classes to handle the different types of metrics\n callDiagnosticMetrics: CallDiagnosticMetrics;\n\n /**\n * Constructor\n * @param args\n * @constructor\n * @private\n * @returns\n */\n constructor(...args) {\n super(...args);\n\n this.onReady();\n }\n\n /**\n * On Ready\n */\n private onReady() {\n // @ts-ignore\n this.webex.once('ready', () => {\n // @ts-ignore\n this.callDiagnosticMetrics = new CallDiagnosticMetrics({}, {parent: this.webex});\n // @ts-ignore\n this.callDiagnosticLatencies = new CallDiagnosticLatencies({}, {parent: this.webex});\n });\n }\n\n /**\n * Used for internal purposes only\n * @param args\n */\n submitInternalEvent({\n name,\n payload,\n options,\n }: {\n name: InternalEvent['name'];\n payload?: RecursivePartial<InternalEvent['payload']>;\n options?: any;\n }) {\n if (name === 'internal.reset.join.latencies') {\n this.callDiagnosticLatencies.clearTimestamps();\n } else {\n this.callDiagnosticLatencies.saveTimestamp({key: name});\n }\n }\n\n /**\n * Behavioral event\n * @param args\n */\n submitBehavioralEvent({\n name,\n payload,\n options,\n }: {\n name: BehavioralEvent['name'];\n payload?: RecursivePartial<BehavioralEvent['payload']>;\n options?: any;\n }) {\n this.callDiagnosticLatencies.saveTimestamp({key: name});\n throw new Error('Not implemented.');\n }\n\n /**\n * Operational event\n * @param args\n */\n submitOperationalEvent({\n name,\n payload,\n options,\n }: {\n name: OperationalEvent['name'];\n payload?: RecursivePartial<OperationalEvent['payload']>;\n options?: any;\n }) {\n throw new Error('Not implemented.');\n }\n\n /**\n * Call Analyzer: Media Quality Event\n * @param args\n */\n submitMQE({\n name,\n payload,\n options,\n }: {\n name: MediaQualityEvent['name'];\n payload: RecursivePartial<MediaQualityEvent['payload']> & {\n intervals: MediaQualityEvent['payload']['intervals'];\n };\n options: any;\n }) {\n this.callDiagnosticLatencies.saveTimestamp({key: name});\n this.callDiagnosticMetrics.submitMQE({name, payload, options});\n }\n\n /**\n * Call Analyzer: Feature Usage Event\n * @param args\n */\n submitFeatureEvent({\n name,\n payload,\n options,\n }: {\n name: FeatureEvent['name'];\n payload?: RecursivePartial<FeatureEvent['payload']>;\n options: any;\n }) {\n throw new Error('Not implemented.');\n }\n\n /**\n * Call Analyzer: Client Event\n * @public\n * @param args\n */\n public submitClientEvent({\n name,\n payload,\n options,\n }: {\n name: ClientEvent['name'];\n payload?: RecursivePartial<ClientEvent['payload']>;\n options?: SubmitClientEventOptions;\n }): Promise<any> {\n if (!this.callDiagnosticLatencies || !this.callDiagnosticMetrics) {\n // @ts-ignore\n this.webex.logger.log(\n `NewMetrics: @submitClientEvent. Attempted to submit before webex.ready. Event name: ${name}`\n );\n\n return Promise.resolve();\n }\n this.callDiagnosticLatencies.saveTimestamp({\n key: name,\n options: {meetingId: options?.meetingId},\n });\n\n return this.callDiagnosticMetrics.submitClientEvent({name, payload, options});\n }\n\n /**\n * Submit a pre-login metric to clientmetrics\n * @public\n * @param payload\n * @param preLoginId - pre-login ID of user\n * @returns\n */\n public postPreLoginMetric(payload: any, preLoginId: string): Promise<any> {\n // @ts-ignore\n return this.webex\n .request({\n method: 'POST',\n api: 'metrics',\n resource: 'clientmetrics-prelogin',\n headers: {\n authorization: false,\n 'x-prelogin-userid': preLoginId,\n },\n body: {\n metrics: [payload],\n },\n })\n .then((res) => {\n // @ts-ignore\n this.webex.logger.log(`NewMetrics: @postPreLoginMetric. Request successful.`);\n\n return res;\n })\n .catch((err) => {\n // @ts-ignore\n this.logger.error(\n `NewMetrics: @postPreLoginMetric. Request failed:`,\n `err: ${generateCommonErrorMetadata(err)}`\n );\n\n return Promise.reject(err);\n });\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 public clientMetricsAliasUser(preLoginId: string) {\n // @ts-ignore\n return this.webex\n .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 .then((res) => {\n // @ts-ignore\n this.webex.logger.log(`NewMetrics: @clientMetricsAliasUser. Request successful.`);\n\n return res;\n })\n .catch((err) => {\n // @ts-ignore\n this.logger.error(\n `NewMetrics: @clientMetricsAliasUser. Request failed:`,\n `err: ${generateCommonErrorMetadata(err)}`\n );\n\n return Promise.reject(err);\n });\n }\n\n /**\n * Returns a promise that will resolve to fetch options for submitting a metric.\n *\n * This is to support quickly submitting metrics when the browser/tab is closing.\n * Calling submitClientEvent will not work because there some async steps that will\n * not complete before the browser is closed. Instead, we pre-gather all the\n * information/options needed for the request(s), and then simply and quickly\n * fire the fetch(es) when beforeUnload is triggered.\n *\n * We must use fetch instead of request because fetch has a keepalive option that\n * allows the request it to outlive the page.\n *\n * Note: the timings values will be wrong, but setMetricTimingsAndFetch() will\n * properly adjust them before submitting.\n *\n * @public\n * @param {Object} arg\n * @param {String} arg.name - event name\n * @param {Object} arg.payload - event payload\n * @param {Object} arg.options - other options\n * @returns {Promise} promise that resolves to options to be used with fetch\n */\n public async buildClientEventFetchRequestOptions({\n name,\n payload,\n options,\n }: {\n name: ClientEvent['name'];\n payload?: RecursivePartial<ClientEvent['payload']>;\n options?: SubmitClientEventOptions;\n }): Promise<any> {\n return this.callDiagnosticMetrics.buildClientEventFetchRequestOptions({\n name,\n payload,\n options,\n });\n }\n\n /**\n * Submits a metric from pre-built request options via the fetch API. Updates\n * the \"$timings\" and \"originTime\" values to Date.now() since the existing times\n * were set when the options were built (not submitted).\n\n * @param {any} options - the pre-built request options for submitting a metric\n * @returns {Promise} promise that resolves to the response object\n */\n public setMetricTimingsAndFetch(options: any): Promise<any> {\n // @ts-ignore\n return this.webex.setTimingsAndFetch(setMetricTimings(options));\n }\n\n /**\n * Returns true if the specified serviceErrorCode maps to an expected error.\n * @param {number} serviceErrorCode the service error code\n * @returns {boolean}\n */\n public isServiceErrorExpected(serviceErrorCode: number): boolean {\n return this.callDiagnosticMetrics.isServiceErrorExpected(serviceErrorCode);\n }\n}\n\nexport default Metrics;\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@webex/internal-plugin-metrics",
|
|
3
|
-
"version": "3.0.0-beta.
|
|
3
|
+
"version": "3.0.0-beta.311",
|
|
4
4
|
"description": "",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -28,13 +28,13 @@
|
|
|
28
28
|
"build": "yarn run -T tsc --declaration true --declarationDir ./dist/types"
|
|
29
29
|
},
|
|
30
30
|
"dependencies": {
|
|
31
|
-
"@webex/common": "3.0.0-beta.
|
|
32
|
-
"@webex/common-timers": "3.0.0-beta.
|
|
31
|
+
"@webex/common": "3.0.0-beta.311",
|
|
32
|
+
"@webex/common-timers": "3.0.0-beta.311",
|
|
33
33
|
"@webex/event-dictionary-ts": "^1.0.1313",
|
|
34
|
-
"@webex/internal-plugin-device": "3.0.0-beta.
|
|
35
|
-
"@webex/internal-plugin-metrics": "3.0.0-beta.
|
|
36
|
-
"@webex/test-helper-chai": "3.0.0-beta.
|
|
37
|
-
"@webex/test-helper-mock-webex": "3.0.0-beta.
|
|
38
|
-
"@webex/webex-core": "3.0.0-beta.
|
|
34
|
+
"@webex/internal-plugin-device": "3.0.0-beta.311",
|
|
35
|
+
"@webex/internal-plugin-metrics": "3.0.0-beta.311",
|
|
36
|
+
"@webex/test-helper-chai": "3.0.0-beta.311",
|
|
37
|
+
"@webex/test-helper-mock-webex": "3.0.0-beta.311",
|
|
38
|
+
"@webex/webex-core": "3.0.0-beta.311"
|
|
39
39
|
}
|
|
40
40
|
}
|
|
@@ -40,13 +40,7 @@ const CallDiagnosticEventsBatcher = Batcher.extend({
|
|
|
40
40
|
* @returns
|
|
41
41
|
*/
|
|
42
42
|
submitHttpRequest(payload) {
|
|
43
|
-
const batchId = uniqueId('
|
|
44
|
-
this.webex.logger.log(
|
|
45
|
-
CALL_DIAGNOSTIC_LOG_IDENTIFIER,
|
|
46
|
-
`CallDiagnosticEventsBatcher: @submitHttpRequest#${batchId}. Sending the request:`,
|
|
47
|
-
'payload:',
|
|
48
|
-
payload
|
|
49
|
-
);
|
|
43
|
+
const batchId = uniqueId('ca-batch-');
|
|
50
44
|
|
|
51
45
|
return this.webex
|
|
52
46
|
.request({
|
|
@@ -61,9 +55,7 @@ const CallDiagnosticEventsBatcher = Batcher.extend({
|
|
|
61
55
|
.then((res) => {
|
|
62
56
|
this.webex.logger.log(
|
|
63
57
|
CALL_DIAGNOSTIC_LOG_IDENTIFIER,
|
|
64
|
-
`CallDiagnosticEventsBatcher: @submitHttpRequest#${batchId}. Request successful
|
|
65
|
-
`response:`,
|
|
66
|
-
res
|
|
58
|
+
`CallDiagnosticEventsBatcher: @submitHttpRequest#${batchId}. Request successful.`
|
|
67
59
|
);
|
|
68
60
|
|
|
69
61
|
return res;
|
|
@@ -568,11 +568,6 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
|
|
|
568
568
|
options?: SubmitClientEventOptions;
|
|
569
569
|
errors?: ClientEventPayloadError;
|
|
570
570
|
}) {
|
|
571
|
-
this.logger.log(
|
|
572
|
-
CALL_DIAGNOSTIC_LOG_IDENTIFIER,
|
|
573
|
-
'CallDiagnosticMetrics: @createClientEventObjectInMeeting. Creating in meeting event object.',
|
|
574
|
-
`name: ${name}`
|
|
575
|
-
);
|
|
576
571
|
const {meetingId, mediaConnections, globalMeetingId, webexConferenceIdStr} = options;
|
|
577
572
|
|
|
578
573
|
// @ts-ignore
|
|
@@ -643,11 +638,6 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
|
|
|
643
638
|
options?: SubmitClientEventOptions;
|
|
644
639
|
errors?: ClientEventPayloadError;
|
|
645
640
|
}) {
|
|
646
|
-
this.logger.log(
|
|
647
|
-
CALL_DIAGNOSTIC_LOG_IDENTIFIER,
|
|
648
|
-
'CallDiagnosticMetrics: @createClientEventObjectPreMeeting. Creating pre meeting event object.',
|
|
649
|
-
`name: ${name}`
|
|
650
|
-
);
|
|
651
641
|
const {correlationId, globalMeetingId, webexConferenceIdStr, preLoginId} = options;
|
|
652
642
|
|
|
653
643
|
// grab identifiers
|
|
@@ -703,13 +693,6 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
|
|
|
703
693
|
const errors: ClientEventPayloadError = [];
|
|
704
694
|
|
|
705
695
|
if (rawError) {
|
|
706
|
-
this.logger.log(
|
|
707
|
-
CALL_DIAGNOSTIC_LOG_IDENTIFIER,
|
|
708
|
-
'CallDiagnosticMetrics: @prepareClientEvent. Error detected, attempting to map and attach it to the event...',
|
|
709
|
-
`name: ${name}`,
|
|
710
|
-
`rawError: ${generateCommonErrorMetadata(rawError)}`
|
|
711
|
-
);
|
|
712
|
-
|
|
713
696
|
const generatedError = this.generateClientEventErrorPayload(rawError);
|
|
714
697
|
if (generatedError) {
|
|
715
698
|
errors.push(generatedError);
|
|
@@ -760,9 +743,7 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
|
|
|
760
743
|
this.logger.log(
|
|
761
744
|
CALL_DIAGNOSTIC_LOG_IDENTIFIER,
|
|
762
745
|
'CallDiagnosticMetrics: @submitClientEvent. Submit Client Event CA event.',
|
|
763
|
-
`name: ${name}
|
|
764
|
-
`payload: ${JSON.stringify(payload)}`,
|
|
765
|
-
`options: ${JSON.stringify(options)}`
|
|
746
|
+
`name: ${name}`
|
|
766
747
|
);
|
|
767
748
|
const diagnosticEvent = this.prepareClientEvent({name, payload, options});
|
|
768
749
|
|
|
@@ -787,12 +768,6 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
|
|
|
787
768
|
type: ['diagnostic-event'],
|
|
788
769
|
};
|
|
789
770
|
|
|
790
|
-
this.logger.log(
|
|
791
|
-
CALL_DIAGNOSTIC_LOG_IDENTIFIER,
|
|
792
|
-
'CallDiagnosticMetrics: @submitToCallDiagnostics. Preparing to send the request',
|
|
793
|
-
`finalEvent: ${JSON.stringify(finalEvent)}`
|
|
794
|
-
);
|
|
795
|
-
|
|
796
771
|
return this.callDiagnosticEventsBatcher.request(finalEvent);
|
|
797
772
|
}
|
|
798
773
|
|
|
@@ -813,12 +788,6 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
|
|
|
813
788
|
// append sent timestamp
|
|
814
789
|
diagnosticEvent.eventPayload.originTime.sent = new Date().toISOString();
|
|
815
790
|
|
|
816
|
-
this.logger.log(
|
|
817
|
-
CALL_DIAGNOSTIC_LOG_IDENTIFIER,
|
|
818
|
-
`CallDiagnosticMetrics: @submitToCallDiagnosticsPreLogin. Sending the request:`,
|
|
819
|
-
`diagnosticEvent: ${JSON.stringify(diagnosticEvent)}`
|
|
820
|
-
);
|
|
821
|
-
|
|
822
791
|
// @ts-ignore
|
|
823
792
|
return this.webex.internal.newMetrics.postPreLoginMetric(diagnosticEvent, preLoginId);
|
|
824
793
|
};
|
|
@@ -844,9 +813,7 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
|
|
|
844
813
|
this.logger.log(
|
|
845
814
|
CALL_DIAGNOSTIC_LOG_IDENTIFIER,
|
|
846
815
|
'CallDiagnosticMetrics: @buildClientEventFetchRequestOptions. Building request options object for fetch()...',
|
|
847
|
-
`name: ${name}
|
|
848
|
-
`payload: ${JSON.stringify(payload)}`,
|
|
849
|
-
`options: ${JSON.stringify(options)}`
|
|
816
|
+
`name: ${name}`
|
|
850
817
|
);
|
|
851
818
|
|
|
852
819
|
const clientEvent = this.prepareClientEvent({name, payload, options});
|
package/src/new-metrics.ts
CHANGED
|
@@ -201,7 +201,7 @@ class Metrics extends WebexPlugin {
|
|
|
201
201
|
})
|
|
202
202
|
.then((res) => {
|
|
203
203
|
// @ts-ignore
|
|
204
|
-
this.webex.logger.log(`NewMetrics: @postPreLoginMetric. Request successful
|
|
204
|
+
this.webex.logger.log(`NewMetrics: @postPreLoginMetric. Request successful.`);
|
|
205
205
|
|
|
206
206
|
return res;
|
|
207
207
|
})
|
|
@@ -238,7 +238,7 @@ class Metrics extends WebexPlugin {
|
|
|
238
238
|
})
|
|
239
239
|
.then((res) => {
|
|
240
240
|
// @ts-ignore
|
|
241
|
-
this.webex.logger.log(`NewMetrics: @clientMetricsAliasUser. Request successful
|
|
241
|
+
this.webex.logger.log(`NewMetrics: @clientMetricsAliasUser. Request successful.`);
|
|
242
242
|
|
|
243
243
|
return res;
|
|
244
244
|
})
|
|
@@ -379,29 +379,16 @@ describe('plugin-metrics', () => {
|
|
|
379
379
|
error = e;
|
|
380
380
|
});
|
|
381
381
|
|
|
382
|
-
const loggerLogCalls = webex.logger.log.getCalls();
|
|
383
|
-
|
|
384
|
-
assert.deepEqual(loggerLogCalls[0].args, [
|
|
385
|
-
'call-diagnostic-events -> ',
|
|
386
|
-
'CallDiagnosticMetrics: @submitToCallDiagnostics. Preparing to send the request',
|
|
387
|
-
`finalEvent: {"eventPayload":{"event":"my.event"},"type":["diagnostic-event"]}`,
|
|
388
|
-
]);
|
|
389
|
-
|
|
390
382
|
// This is horrific, but stubbing lodash is proving difficult
|
|
391
383
|
const expectedBatchId = parseInt(uniqueId()) - 1;
|
|
392
384
|
|
|
393
|
-
assert.deepEqual(
|
|
394
|
-
JSON.stringify(loggerLogCalls[1].args),
|
|
395
|
-
`["call-diagnostic-events -> ","CallDiagnosticEventsBatcher: @submitHttpRequest#call-diagnostic-metrics-batch-${expectedBatchId}. Sending the request:","payload:",[{"eventPayload":{"event":"my.event","origin":{"buildType":"test","networkType":"unknown"}},"type":["diagnostic-event"]}]]`
|
|
396
|
-
);
|
|
397
|
-
|
|
398
385
|
// check that promise was rejected with the original error of the webex.request
|
|
399
386
|
assert.deepEqual(err, error);
|
|
400
387
|
|
|
401
388
|
assert.calledOnceWithExactly(
|
|
402
389
|
webex.logger.error,
|
|
403
390
|
'call-diagnostic-events -> ',
|
|
404
|
-
`CallDiagnosticEventsBatcher: @submitHttpRequest#
|
|
391
|
+
`CallDiagnosticEventsBatcher: @submitHttpRequest#ca-batch-${expectedBatchId}. Request failed:`,
|
|
405
392
|
`error: formattedError`
|
|
406
393
|
);
|
|
407
394
|
assert.lengthOf(
|
|
@@ -586,22 +586,7 @@ describe('internal-plugin-metrics', () => {
|
|
|
586
586
|
'call-diagnostic-events -> ',
|
|
587
587
|
'CallDiagnosticMetrics: @submitClientEvent. Submit Client Event CA event.',
|
|
588
588
|
`name: client.alert.displayed`,
|
|
589
|
-
`payload: undefined`,
|
|
590
|
-
`options: ${JSON.stringify(options)}`,
|
|
591
589
|
]);
|
|
592
|
-
|
|
593
|
-
assert.deepEqual(webexLoggerLogCalls[1].args, [
|
|
594
|
-
'call-diagnostic-events -> ',
|
|
595
|
-
'CallDiagnosticMetrics: @createClientEventObjectInMeeting. Creating in meeting event object.',
|
|
596
|
-
`name: client.alert.displayed`
|
|
597
|
-
]);
|
|
598
|
-
|
|
599
|
-
assert.deepEqual(webexLoggerLogCalls[2].args, [
|
|
600
|
-
'call-diagnostic-events -> ',
|
|
601
|
-
'CallDiagnosticMetrics: @submitToCallDiagnostics. Preparing to send the request',
|
|
602
|
-
`finalEvent: {"eventPayload":{"eventId":"my-fake-id","version":1,"origin":{"origin":"fake-origin"},"originTime":{"triggered":"${now.toISOString()}","sent":"not_defined_yet"},"senderCountryCode":"UK","event":{"name":"client.alert.displayed","canProceed":true,"identifiers":{"correlationId":"correlationId","userId":"userId","deviceId":"deviceUrl","orgId":"orgId","locusUrl":"locus/url","locusId":"url","locusStartTime":"lastActive","mediaAgentAlias":"alias","mediaAgentGroupId":"1"},"eventData":{"webClientDomain":"whatever"},"userType":"host","loginType":"login-ci"}},"type":["diagnostic-event"]}`,
|
|
603
|
-
]);
|
|
604
|
-
|
|
605
590
|
});
|
|
606
591
|
|
|
607
592
|
it('should submit client event successfully with correlationId, webexConferenceIdStr and globalMeetingId', () => {
|
|
@@ -687,23 +672,8 @@ describe('internal-plugin-metrics', () => {
|
|
|
687
672
|
'call-diagnostic-events -> ',
|
|
688
673
|
'CallDiagnosticMetrics: @submitClientEvent. Submit Client Event CA event.',
|
|
689
674
|
`name: client.alert.displayed`,
|
|
690
|
-
`payload: undefined`,
|
|
691
|
-
`options: ${JSON.stringify(options)}`,
|
|
692
675
|
]);
|
|
693
676
|
|
|
694
|
-
assert.deepEqual(webexLoggerLogCalls[1].args, [
|
|
695
|
-
'call-diagnostic-events -> ',
|
|
696
|
-
'CallDiagnosticMetrics: @createClientEventObjectPreMeeting. Creating pre meeting event object.',
|
|
697
|
-
`name: client.alert.displayed`
|
|
698
|
-
]);
|
|
699
|
-
|
|
700
|
-
assert.deepEqual(webexLoggerLogCalls[2].args, [
|
|
701
|
-
'call-diagnostic-events -> ',
|
|
702
|
-
'CallDiagnosticMetrics: @submitToCallDiagnostics. Preparing to send the request',
|
|
703
|
-
`finalEvent: {"eventPayload":{"eventId":"my-fake-id","version":1,"origin":{"origin":"fake-origin"},"originTime":{"triggered":"${now.toISOString()}","sent":"not_defined_yet"},"senderCountryCode":"UK","event":{"name":"client.alert.displayed","canProceed":true,"identifiers":{"correlationId":"correlationId","userId":"userId","deviceId":"deviceUrl","orgId":"orgId","locusUrl":"locus-url","webexConferenceIdStr":"webexConferenceIdStr1","globalMeetingId":"globalMeetingId1"},"eventData":{"webClientDomain":"whatever"},"loginType":"login-ci"}},"type":["diagnostic-event"]}`,
|
|
704
|
-
]);
|
|
705
|
-
|
|
706
|
-
|
|
707
677
|
});
|
|
708
678
|
|
|
709
679
|
it('should submit client event successfully with preLoginId', () => {
|
|
@@ -861,35 +831,14 @@ describe('internal-plugin-metrics', () => {
|
|
|
861
831
|
'call-diagnostic-events -> ',
|
|
862
832
|
'CallDiagnosticMetrics: @submitClientEvent. Submit Client Event CA event.',
|
|
863
833
|
`name: client.alert.displayed`,
|
|
864
|
-
`payload: undefined`,
|
|
865
|
-
`options: ${JSON.stringify(options)}`,
|
|
866
|
-
]);
|
|
867
|
-
|
|
868
834
|
|
|
869
|
-
assert.deepEqual(webexLoggerLogCalls[1].args, [
|
|
870
|
-
'call-diagnostic-events -> ',
|
|
871
|
-
'CallDiagnosticMetrics: @prepareClientEvent. Error detected, attempting to map and attach it to the event...',
|
|
872
|
-
`name: client.alert.displayed`,
|
|
873
|
-
`rawError: ${options.rawError}`
|
|
874
835
|
]);
|
|
875
836
|
|
|
876
|
-
assert.deepEqual(webexLoggerLogCalls[
|
|
837
|
+
assert.deepEqual(webexLoggerLogCalls[1].args, [
|
|
877
838
|
'call-diagnostic-events -> ',
|
|
878
839
|
'CallDiagnosticMetrics: @prepareClientEvent. Generated errors:',
|
|
879
840
|
`generatedError: {"fatal":true,"shownToUser":false,"name":"other","category":"expected","errorCode":4029,"serviceErrorCode":2409005,"errorDescription":"StartRecordingFailed"}`
|
|
880
841
|
])
|
|
881
|
-
|
|
882
|
-
assert.deepEqual(webexLoggerLogCalls[3].args, [
|
|
883
|
-
'call-diagnostic-events -> ',
|
|
884
|
-
'CallDiagnosticMetrics: @createClientEventObjectInMeeting. Creating in meeting event object.',
|
|
885
|
-
`name: client.alert.displayed`
|
|
886
|
-
]);
|
|
887
|
-
|
|
888
|
-
assert.deepEqual(webexLoggerLogCalls[4].args, [
|
|
889
|
-
'call-diagnostic-events -> ',
|
|
890
|
-
'CallDiagnosticMetrics: @submitToCallDiagnostics. Preparing to send the request',
|
|
891
|
-
`finalEvent: {"eventPayload":{"eventId":"my-fake-id","version":1,"origin":{"origin":"fake-origin"},"originTime":{"triggered":"${now.toISOString()}","sent":"not_defined_yet"},"senderCountryCode":"UK","event":{"name":"client.alert.displayed","canProceed":true,"identifiers":{"correlationId":"correlationId","userId":"userId","deviceId":"deviceUrl","orgId":"orgId","locusUrl":"locus/url","locusId":"url","locusStartTime":"lastActive","mediaAgentAlias":"alias","mediaAgentGroupId":"1","webexConferenceIdStr":"webexConferenceIdStr1","globalMeetingId":"globalMeetingId1"},"errors":[{"fatal":true,"shownToUser":false,"name":"other","category":"expected","errorCode":4029,"serviceErrorCode":2409005,"errorDescription":"StartRecordingFailed"}],"eventData":{"webClientDomain":"whatever"},"userType":"host","loginType":"login-ci"}},"type":["diagnostic-event"]}`,
|
|
892
|
-
]);
|
|
893
842
|
});
|
|
894
843
|
|
|
895
844
|
it('it send the raw error message if meetingId provided', () => {
|
|
@@ -961,38 +910,13 @@ describe('internal-plugin-metrics', () => {
|
|
|
961
910
|
'call-diagnostic-events -> ',
|
|
962
911
|
'CallDiagnosticMetrics: @submitClientEvent. Submit Client Event CA event.',
|
|
963
912
|
`name: client.alert.displayed`,
|
|
964
|
-
`payload: undefined`,
|
|
965
|
-
`options: ${JSON.stringify(options)}`,
|
|
966
913
|
]);
|
|
967
914
|
|
|
968
915
|
assert.deepEqual(webexLoggerLogCalls[1].args, [
|
|
969
|
-
'call-diagnostic-events -> ',
|
|
970
|
-
'CallDiagnosticMetrics: @prepareClientEvent. Error detected, attempting to map and attach it to the event...',
|
|
971
|
-
`name: client.alert.displayed`,
|
|
972
|
-
`rawError: ${JSON.stringify({
|
|
973
|
-
message: options.rawError.message,
|
|
974
|
-
name: options.rawError.name,
|
|
975
|
-
stack: options.rawError.stack,
|
|
976
|
-
})}`,
|
|
977
|
-
]);
|
|
978
|
-
|
|
979
|
-
assert.deepEqual(webexLoggerLogCalls[2].args, [
|
|
980
916
|
'call-diagnostic-events -> ',
|
|
981
917
|
'CallDiagnosticMetrics: @prepareClientEvent. Generated errors:',
|
|
982
918
|
`generatedError: {"fatal":true,"shownToUser":false,"name":"other","category":"other","errorCode":9999,"serviceErrorCode":9999,"errorDescription":"UnknownError"}`,
|
|
983
919
|
]);
|
|
984
|
-
|
|
985
|
-
assert.deepEqual(webexLoggerLogCalls[3].args, [
|
|
986
|
-
'call-diagnostic-events -> ',
|
|
987
|
-
'CallDiagnosticMetrics: @createClientEventObjectInMeeting. Creating in meeting event object.',
|
|
988
|
-
`name: client.alert.displayed`,
|
|
989
|
-
]);
|
|
990
|
-
|
|
991
|
-
assert.deepEqual(webexLoggerLogCalls[4].args, [
|
|
992
|
-
'call-diagnostic-events -> ',
|
|
993
|
-
'CallDiagnosticMetrics: @submitToCallDiagnostics. Preparing to send the request',
|
|
994
|
-
`finalEvent: {"eventPayload":{"eventId":"my-fake-id","version":1,"origin":{"origin":"fake-origin"},"originTime":{"triggered":"${now.toISOString()}","sent":"not_defined_yet"},"senderCountryCode":"UK","event":{"name":"client.alert.displayed","canProceed":true,"identifiers":{"correlationId":"correlationId","userId":"userId","deviceId":"deviceUrl","orgId":"orgId","locusUrl":"locus/url","locusId":"url","locusStartTime":"lastActive","mediaAgentAlias":"alias","mediaAgentGroupId":"1"},"errors":[{"fatal":true,"shownToUser":false,"name":"other","category":"other","errorCode":9999,"serviceErrorCode":9999,"errorDescription":"UnknownError"}],"eventData":{"webClientDomain":"whatever","rawErrorMessage":"bad times"},"userType":"host","loginType":"login-ci"}},"type":["diagnostic-event"]}`,
|
|
995
|
-
]);
|
|
996
920
|
});
|
|
997
921
|
|
|
998
922
|
it('it should include errors if provided with correlationId', () => {
|
|
@@ -1055,39 +979,15 @@ describe('internal-plugin-metrics', () => {
|
|
|
1055
979
|
'call-diagnostic-events -> ',
|
|
1056
980
|
'CallDiagnosticMetrics: @submitClientEvent. Submit Client Event CA event.',
|
|
1057
981
|
`name: client.alert.displayed`,
|
|
1058
|
-
`payload: undefined`,
|
|
1059
|
-
`options: ${JSON.stringify(options)}`,
|
|
1060
982
|
]);
|
|
1061
983
|
|
|
1062
984
|
|
|
1063
985
|
assert.deepEqual(webexLoggerLogCalls[1].args, [
|
|
1064
|
-
'call-diagnostic-events -> ',
|
|
1065
|
-
'CallDiagnosticMetrics: @prepareClientEvent. Error detected, attempting to map and attach it to the event...',
|
|
1066
|
-
`name: client.alert.displayed`,
|
|
1067
|
-
`rawError: ${JSON.stringify({
|
|
1068
|
-
message: options.rawError.message,
|
|
1069
|
-
name: options.rawError.name,
|
|
1070
|
-
stack: options.rawError.stack,
|
|
1071
|
-
})}`,
|
|
1072
|
-
]);
|
|
1073
|
-
|
|
1074
|
-
assert.deepEqual(webexLoggerLogCalls[2].args, [
|
|
1075
986
|
'call-diagnostic-events -> ',
|
|
1076
987
|
'CallDiagnosticMetrics: @prepareClientEvent. Generated errors:',
|
|
1077
988
|
`generatedError: {"fatal":true,"shownToUser":false,"name":"other","category":"other","errorCode":9999,"serviceErrorCode":9999,"errorDescription":"UnknownError"}`,
|
|
1078
989
|
]);
|
|
1079
990
|
|
|
1080
|
-
assert.deepEqual(webexLoggerLogCalls[3].args, [
|
|
1081
|
-
'call-diagnostic-events -> ',
|
|
1082
|
-
'CallDiagnosticMetrics: @createClientEventObjectPreMeeting. Creating pre meeting event object.',
|
|
1083
|
-
`name: client.alert.displayed`
|
|
1084
|
-
]);
|
|
1085
|
-
|
|
1086
|
-
assert.deepEqual(webexLoggerLogCalls[4].args, [
|
|
1087
|
-
'call-diagnostic-events -> ',
|
|
1088
|
-
'CallDiagnosticMetrics: @submitToCallDiagnostics. Preparing to send the request',
|
|
1089
|
-
`finalEvent: {"eventPayload":{"eventId":"my-fake-id","version":1,"origin":{"origin":"fake-origin"},"originTime":{"triggered":"${now.toISOString()}","sent":"not_defined_yet"},"senderCountryCode":"UK","event":{"name":"client.alert.displayed","errors":[{"fatal":true,"shownToUser":false,"name":"other","category":"other","errorCode":9999,"serviceErrorCode":9999,"errorDescription":"UnknownError"}],"canProceed":true,"identifiers":{"correlationId":"correlationId","userId":"userId","deviceId":"deviceUrl","orgId":"orgId","locusUrl":"locus-url"},"eventData":{"webClientDomain":"whatever","rawErrorMessage":"bad times"},"loginType":"login-ci"}},"type":["diagnostic-event"]}`,
|
|
1090
|
-
]);
|
|
1091
991
|
});
|
|
1092
992
|
|
|
1093
993
|
it('it should send the raw error message if provided with correlationId', () => {
|
|
@@ -1153,34 +1053,14 @@ describe('internal-plugin-metrics', () => {
|
|
|
1153
1053
|
'call-diagnostic-events -> ',
|
|
1154
1054
|
'CallDiagnosticMetrics: @submitClientEvent. Submit Client Event CA event.',
|
|
1155
1055
|
`name: client.alert.displayed`,
|
|
1156
|
-
`payload: undefined`,
|
|
1157
|
-
`options: ${JSON.stringify(options)}`,
|
|
1158
1056
|
]);
|
|
1159
1057
|
|
|
1160
1058
|
assert.deepEqual(webexLoggerLogCalls[1].args, [
|
|
1161
|
-
'call-diagnostic-events -> ',
|
|
1162
|
-
'CallDiagnosticMetrics: @prepareClientEvent. Error detected, attempting to map and attach it to the event...',
|
|
1163
|
-
`name: client.alert.displayed`,
|
|
1164
|
-
`rawError: ${options.rawError}`,
|
|
1165
|
-
]);
|
|
1166
|
-
|
|
1167
|
-
assert.deepEqual(webexLoggerLogCalls[2].args, [
|
|
1168
1059
|
'call-diagnostic-events -> ',
|
|
1169
1060
|
'CallDiagnosticMetrics: @prepareClientEvent. Generated errors:',
|
|
1170
1061
|
`generatedError: {"fatal":true,"shownToUser":false,"name":"other","category":"expected","errorCode":4029,"serviceErrorCode":2409005,"errorDescription":"StartRecordingFailed"}`,
|
|
1171
1062
|
]);
|
|
1172
1063
|
|
|
1173
|
-
assert.deepEqual(webexLoggerLogCalls[3].args, [
|
|
1174
|
-
'call-diagnostic-events -> ',
|
|
1175
|
-
'CallDiagnosticMetrics: @createClientEventObjectPreMeeting. Creating pre meeting event object.',
|
|
1176
|
-
`name: client.alert.displayed`,
|
|
1177
|
-
]);
|
|
1178
|
-
|
|
1179
|
-
assert.deepEqual(webexLoggerLogCalls[4].args, [
|
|
1180
|
-
'call-diagnostic-events -> ',
|
|
1181
|
-
'CallDiagnosticMetrics: @submitToCallDiagnostics. Preparing to send the request',
|
|
1182
|
-
`finalEvent: {"eventPayload":{"eventId":"my-fake-id","version":1,"origin":{"origin":"fake-origin"},"originTime":{"triggered":"${now.toISOString()}","sent":"not_defined_yet"},"senderCountryCode":"UK","event":{"name":"client.alert.displayed","errors":[{"fatal":true,"shownToUser":false,"name":"other","category":"expected","errorCode":4029,"serviceErrorCode":2409005,"errorDescription":"StartRecordingFailed"}],"canProceed":true,"identifiers":{"correlationId":"correlationId","userId":"userId","deviceId":"deviceUrl","orgId":"orgId","locusUrl":"locus-url"},"eventData":{"webClientDomain":"whatever"},"loginType":"login-ci"}},"type":["diagnostic-event"]}`,
|
|
1183
|
-
]);
|
|
1184
1064
|
});
|
|
1185
1065
|
|
|
1186
1066
|
it('should include errors in payload if provided via payload', () => {
|
|
@@ -1698,7 +1578,7 @@ describe('internal-plugin-metrics', () => {
|
|
|
1698
1578
|
body: {},
|
|
1699
1579
|
options: {headers: {}, url: 'https://example.com'},
|
|
1700
1580
|
});
|
|
1701
|
-
|
|
1581
|
+
|
|
1702
1582
|
error.payloadOverrides = {
|
|
1703
1583
|
shownToUser: true,
|
|
1704
1584
|
category: 'expected'
|
|
@@ -1814,7 +1694,7 @@ describe('internal-plugin-metrics', () => {
|
|
|
1814
1694
|
fakeMeeting.meetingInfo ={}
|
|
1815
1695
|
assert.deepEqual(cd.getSubServiceType(fakeMeeting), undefined);
|
|
1816
1696
|
});
|
|
1817
|
-
|
|
1697
|
+
|
|
1818
1698
|
});
|
|
1819
1699
|
|
|
1820
1700
|
describe('#getIsConvergedArchitectureEnabled', () => {
|
|
@@ -1936,14 +1816,6 @@ describe('internal-plugin-metrics', () => {
|
|
|
1936
1816
|
'call-diagnostic-events -> ',
|
|
1937
1817
|
'CallDiagnosticMetrics: @buildClientEventFetchRequestOptions. Building request options object for fetch()...',
|
|
1938
1818
|
`name: client.exit.app`,
|
|
1939
|
-
`payload: {"trigger":"user-interaction","canProceed":false}`,
|
|
1940
|
-
`options: ${JSON.stringify(options)}`,
|
|
1941
|
-
]);
|
|
1942
|
-
|
|
1943
|
-
assert.deepEqual(webexLoggerLogCalls[1].args, [
|
|
1944
|
-
'call-diagnostic-events -> ',
|
|
1945
|
-
'CallDiagnosticMetrics: @createClientEventObjectInMeeting. Creating in meeting event object.',
|
|
1946
|
-
`name: client.exit.app`
|
|
1947
1819
|
]);
|
|
1948
1820
|
});
|
|
1949
1821
|
});
|
|
@@ -38,7 +38,7 @@ describe('internal-plugin-metrics', () => {
|
|
|
38
38
|
);
|
|
39
39
|
});
|
|
40
40
|
});
|
|
41
|
-
|
|
41
|
+
|
|
42
42
|
describe('new-metrics', () => {
|
|
43
43
|
let webex;
|
|
44
44
|
|
|
@@ -156,8 +156,7 @@ describe('internal-plugin-metrics', () => {
|
|
|
156
156
|
});
|
|
157
157
|
assert.calledWith(
|
|
158
158
|
webex.logger.log,
|
|
159
|
-
'NewMetrics: @clientMetricsAliasUser. Request successful
|
|
160
|
-
{ response: 'abc' }
|
|
159
|
+
'NewMetrics: @clientMetricsAliasUser. Request successful.'
|
|
161
160
|
);
|
|
162
161
|
});
|
|
163
162
|
|
|
@@ -189,8 +188,7 @@ describe('internal-plugin-metrics', () => {
|
|
|
189
188
|
});
|
|
190
189
|
assert.calledWith(
|
|
191
190
|
webex.logger.log,
|
|
192
|
-
'NewMetrics: @postPreLoginMetric. Request successful
|
|
193
|
-
{ response: 'abc' }
|
|
191
|
+
'NewMetrics: @postPreLoginMetric. Request successful.'
|
|
194
192
|
);
|
|
195
193
|
});
|
|
196
194
|
|