@webex/internal-plugin-metrics 3.12.0-webex-services-ready.2 → 3.12.0-webex-services-ready.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/dist/automated-user.js +19 -0
  2. package/dist/automated-user.js.map +1 -0
  3. package/dist/call-diagnostic/call-diagnostic-metrics-batcher.js +0 -23
  4. package/dist/call-diagnostic/call-diagnostic-metrics-batcher.js.map +1 -1
  5. package/dist/call-diagnostic/call-diagnostic-metrics-latencies.js +571 -15
  6. package/dist/call-diagnostic/call-diagnostic-metrics-latencies.js.map +1 -1
  7. package/dist/call-diagnostic/call-diagnostic-metrics.js +51 -26
  8. package/dist/call-diagnostic/call-diagnostic-metrics.js.map +1 -1
  9. package/dist/index.js +15 -0
  10. package/dist/index.js.map +1 -1
  11. package/dist/metrics.js +1 -1
  12. package/dist/metrics.types.js +4 -0
  13. package/dist/metrics.types.js.map +1 -1
  14. package/dist/new-metrics.js +16 -6
  15. package/dist/new-metrics.js.map +1 -1
  16. package/dist/prelogin-metrics-batcher.js +0 -23
  17. package/dist/prelogin-metrics-batcher.js.map +1 -1
  18. package/dist/types/automated-user.d.ts +2 -0
  19. package/dist/types/call-diagnostic/call-diagnostic-metrics-latencies.d.ts +199 -5
  20. package/dist/types/call-diagnostic/call-diagnostic-metrics.d.ts +27 -2
  21. package/dist/types/index.d.ts +5 -3
  22. package/dist/types/metrics.types.d.ts +4 -2
  23. package/dist/types/new-metrics.d.ts +4 -0
  24. package/package.json +12 -11
  25. package/src/automated-user.ts +16 -0
  26. package/src/call-diagnostic/call-diagnostic-metrics-batcher.ts +0 -26
  27. package/src/call-diagnostic/call-diagnostic-metrics-latencies.ts +661 -5
  28. package/src/call-diagnostic/call-diagnostic-metrics.ts +40 -18
  29. package/src/index.ts +5 -0
  30. package/src/metrics.types.ts +15 -2
  31. package/src/new-metrics.ts +12 -4
  32. package/src/prelogin-metrics-batcher.ts +0 -26
  33. package/test/unit/spec/automated-user.ts +43 -0
  34. package/test/unit/spec/call-diagnostic/call-diagnostic-metrics-batcher.ts +0 -136
  35. package/test/unit/spec/call-diagnostic/call-diagnostic-metrics-latencies.ts +1192 -16
  36. package/test/unit/spec/call-diagnostic/call-diagnostic-metrics.ts +75 -11
  37. package/test/unit/spec/new-metrics.ts +13 -2
  38. package/test/unit/spec/prelogin-metrics-batcher.ts +1 -120
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+
3
+ var _Object$defineProperty = require("@babel/runtime-corejs2/core-js/object/define-property");
4
+ _Object$defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.isAutomatedUserAgent = exports.isAutomatedUser = void 0;
8
+ var _isbot = require("isbot");
9
+ var isAutomatedUserAgent = exports.isAutomatedUserAgent = function isAutomatedUserAgent(userAgent) {
10
+ return (0, _isbot.isBot)(userAgent);
11
+ };
12
+ var automatedUser;
13
+ var isAutomatedUser = exports.isAutomatedUser = function isAutomatedUser() {
14
+ if (automatedUser === undefined) {
15
+ automatedUser = typeof window !== 'undefined' && typeof navigator !== 'undefined' && (Boolean(navigator.webdriver) || isAutomatedUserAgent(navigator.userAgent));
16
+ }
17
+ return automatedUser;
18
+ };
19
+ //# sourceMappingURL=automated-user.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_isbot","require","isAutomatedUserAgent","exports","userAgent","isBot","automatedUser","isAutomatedUser","undefined","window","navigator","Boolean","webdriver"],"sources":["automated-user.ts"],"sourcesContent":["import {isBot} from 'isbot';\n\nexport const isAutomatedUserAgent = (userAgent?: string | null): boolean => isBot(userAgent);\n\nlet automatedUser: boolean | undefined;\n\nexport const isAutomatedUser = (): boolean => {\n if (automatedUser === undefined) {\n automatedUser =\n typeof window !== 'undefined' &&\n typeof navigator !== 'undefined' &&\n (Boolean(navigator.webdriver) || isAutomatedUserAgent(navigator.userAgent));\n }\n\n return automatedUser;\n};\n"],"mappings":";;;;;;;AAAA,IAAAA,MAAA,GAAAC,OAAA;AAEO,IAAMC,oBAAoB,GAAAC,OAAA,CAAAD,oBAAA,GAAG,SAAvBA,oBAAoBA,CAAIE,SAAyB;EAAA,OAAc,IAAAC,YAAK,EAACD,SAAS,CAAC;AAAA;AAE5F,IAAIE,aAAkC;AAE/B,IAAMC,eAAe,GAAAJ,OAAA,CAAAI,eAAA,GAAG,SAAlBA,eAAeA,CAAA,EAAkB;EAC5C,IAAID,aAAa,KAAKE,SAAS,EAAE;IAC/BF,aAAa,GACX,OAAOG,MAAM,KAAK,WAAW,IAC7B,OAAOC,SAAS,KAAK,WAAW,KAC/BC,OAAO,CAACD,SAAS,CAACE,SAAS,CAAC,IAAIV,oBAAoB,CAACQ,SAAS,CAACN,SAAS,CAAC,CAAC;EAC/E;EAEA,OAAOE,aAAa;AACtB,CAAC","ignoreList":[]}
@@ -7,7 +7,6 @@ _Object$defineProperty(exports, "__esModule", {
7
7
  });
8
8
  exports.default = void 0;
9
9
  var _promise = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/promise"));
10
- var _isArray = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/array/is-array"));
11
10
  var _lodash = require("lodash");
12
11
  var _batcher = _interopRequireDefault(require("../batcher"));
13
12
  var _callDiagnosticMetrics = require("./call-diagnostic-metrics.util");
@@ -54,33 +53,11 @@ var CallDiagnosticEventsBatcher = _batcher.default.extend({
54
53
  waitForServiceTimeout: this.webex.config.metrics.waitForServiceTimeout
55
54
  }).then(function (res) {
56
55
  _this.webex.logger.log(_config.CALL_DIAGNOSTIC_LOG_IDENTIFIER, "CallDiagnosticEventsBatcher: @submitHttpRequest#".concat(batchId, ". Request successful."));
57
- _this.handleHttpResponseStatus(res === null || res === void 0 ? void 0 : res.statusCode, payload);
58
56
  return res;
59
57
  }).catch(function (err) {
60
58
  _this.webex.logger.error(_config.CALL_DIAGNOSTIC_LOG_IDENTIFIER, "CallDiagnosticEventsBatcher: @submitHttpRequest#".concat(batchId, ". Request failed:"), "error: ".concat((0, _utils.generateCommonErrorMetadata)(err)));
61
- _this.handleHttpResponseStatus(err === null || err === void 0 ? void 0 : err.statusCode, payload);
62
59
  return _promise.default.reject(err);
63
60
  });
64
- },
65
- /**
66
- * React to the HTTP status code returned by the metrics endpoint.
67
- * Only items submitted with `markTelemetryOptOutOnResponse: true` opt into
68
- * this behavior.
69
- * @param {number | undefined} statusCode
70
- * @param {any[]} payload Items flushed in this HTTP batch.
71
- * @returns {void}
72
- */
73
- handleHttpResponseStatus: function handleHttpResponseStatus(statusCode, payload) {
74
- var shouldMark = (0, _isArray.default)(payload) && payload.some(function (item) {
75
- return (item === null || item === void 0 ? void 0 : item.markTelemetryOptOutOnResponse) === true;
76
- });
77
- if (!shouldMark) {
78
- return;
79
- }
80
- if (statusCode === 200) {
81
- var _this$webex$internal$, _this$webex$internal$2;
82
- (_this$webex$internal$ = this.webex.internal.newMetrics) === null || _this$webex$internal$ === void 0 ? void 0 : (_this$webex$internal$2 = _this$webex$internal$.callDiagnosticMetrics) === null || _this$webex$internal$2 === void 0 ? void 0 : _this$webex$internal$2.setIsTelemetryOptOutAutomatic(true);
83
- }
84
61
  }
85
62
  });
86
63
  var _default = exports.default = CallDiagnosticEventsBatcher;
@@ -1 +1 @@
1
- {"version":3,"names":["_lodash","require","_batcher","_interopRequireDefault","_callDiagnosticMetrics","_config","_utils","CallDiagnosticEventsBatcher","Batcher","extend","namespace","prepareItem","item","_promise","default","resolve","prepareDiagnosticMetricItem","webex","prepareRequest","queue","forEach","eventPayload","originTime","sent","Date","toISOString","submitHttpRequest","payload","_this","batchId","uniqueId","request","method","service","resource","body","metrics","waitForServiceTimeout","config","then","res","logger","log","CALL_DIAGNOSTIC_LOG_IDENTIFIER","concat","handleHttpResponseStatus","statusCode","catch","err","error","generateCommonErrorMetadata","reject","shouldMark","_isArray","some","markTelemetryOptOutOnResponse","_this$webex$internal$","_this$webex$internal$2","internal","newMetrics","callDiagnosticMetrics","setIsTelemetryOptOutAutomatic","_default","exports"],"sources":["call-diagnostic-metrics-batcher.ts"],"sourcesContent":["import {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 {any} item\n * @returns {Promise<any>}\n */\n prepareItem(item) {\n return Promise.resolve(prepareDiagnosticMetricItem(this.webex, item));\n },\n\n /**\n * Prepare request, add time sensitive date etc.\n * @param {any[]} queue\n * @returns {Promise<any[]>}\n */\n prepareRequest(queue) {\n // Add sent timestamp\n queue.forEach((item) => {\n item.eventPayload.originTime = item.eventPayload.originTime || {};\n item.eventPayload.originTime.sent = new Date().toISOString();\n });\n\n return Promise.resolve(queue);\n },\n\n /**\n *\n * @param {any} payload\n * @returns {Promise<any>}\n */\n submitHttpRequest(payload) {\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 this.handleHttpResponseStatus(res?.statusCode, payload);\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 this.handleHttpResponseStatus(err?.statusCode, payload);\n\n return Promise.reject(err);\n });\n },\n\n /**\n * React to the HTTP status code returned by the metrics endpoint.\n * Only items submitted with `markTelemetryOptOutOnResponse: true` opt into\n * this behavior.\n * @param {number | undefined} statusCode\n * @param {any[]} payload Items flushed in this HTTP batch.\n * @returns {void}\n */\n handleHttpResponseStatus(statusCode: number | undefined, payload: any[]) {\n const shouldMark =\n Array.isArray(payload) &&\n payload.some((item) => item?.markTelemetryOptOutOnResponse === true);\n\n if (!shouldMark) {\n return;\n }\n\n if (statusCode === 200) {\n this.webex.internal.newMetrics?.callDiagnosticMetrics?.setIsTelemetryOptOutAutomatic(true);\n }\n },\n});\n\nexport default CallDiagnosticEventsBatcher;\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_lodash","require","_batcher","_interopRequireDefault","_callDiagnosticMetrics","_config","_utils","CallDiagnosticEventsBatcher","Batcher","extend","namespace","prepareItem","item","_promise","default","resolve","prepareDiagnosticMetricItem","webex","prepareRequest","queue","forEach","eventPayload","originTime","sent","Date","toISOString","submitHttpRequest","payload","_this","batchId","uniqueId","request","method","service","resource","body","metrics","waitForServiceTimeout","config","then","res","logger","log","CALL_DIAGNOSTIC_LOG_IDENTIFIER","concat","catch","err","error","generateCommonErrorMetadata","reject","_default","exports"],"sources":["call-diagnostic-metrics-batcher.ts"],"sourcesContent":["import {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 {any} item\n * @returns {Promise<any>}\n */\n prepareItem(item) {\n return Promise.resolve(prepareDiagnosticMetricItem(this.webex, item));\n },\n\n /**\n * Prepare request, add time sensitive date etc.\n * @param {any[]} queue\n * @returns {Promise<any[]>}\n */\n prepareRequest(queue) {\n // Add sent timestamp\n queue.forEach((item) => {\n item.eventPayload.originTime = item.eventPayload.originTime || {};\n item.eventPayload.originTime.sent = new Date().toISOString();\n });\n\n return Promise.resolve(queue);\n },\n\n /**\n *\n * @param {any} payload\n * @returns {Promise<any>}\n */\n submitHttpRequest(payload) {\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":";;;;;;;;;AAAA,IAAAA,OAAA,GAAAC,OAAA;AACA,IAAAC,QAAA,GAAAC,sBAAA,CAAAF,OAAA;AACA,IAAAG,sBAAA,GAAAH,OAAA;AACA,IAAAI,OAAA,GAAAJ,OAAA;AACA,IAAAK,MAAA,GAAAL,OAAA;AAEA,IAAMM,2BAA2B,GAAGC,gBAAO,CAACC,MAAM,CAAC;EACjDC,SAAS,EAAE,SAAS;EAEpB;AACF;AACA;AACA;AACA;EACEC,WAAW,WAAXA,WAAWA,CAACC,IAAI,EAAE;IAChB,OAAOC,QAAA,CAAAC,OAAA,CAAQC,OAAO,CAAC,IAAAC,kDAA2B,EAAC,IAAI,CAACC,KAAK,EAAEL,IAAI,CAAC,CAAC;EACvE,CAAC;EAED;AACF;AACA;AACA;AACA;EACEM,cAAc,WAAdA,cAAcA,CAACC,KAAK,EAAE;IACpB;IACAA,KAAK,CAACC,OAAO,CAAC,UAACR,IAAI,EAAK;MACtBA,IAAI,CAACS,YAAY,CAACC,UAAU,GAAGV,IAAI,CAACS,YAAY,CAACC,UAAU,IAAI,CAAC,CAAC;MACjEV,IAAI,CAACS,YAAY,CAACC,UAAU,CAACC,IAAI,GAAG,IAAIC,IAAI,CAAC,CAAC,CAACC,WAAW,CAAC,CAAC;IAC9D,CAAC,CAAC;IAEF,OAAOZ,QAAA,CAAAC,OAAA,CAAQC,OAAO,CAACI,KAAK,CAAC;EAC/B,CAAC;EAED;AACF;AACA;AACA;AACA;EACEO,iBAAiB,WAAjBA,iBAAiBA,CAACC,OAAO,EAAE;IAAA,IAAAC,KAAA;IACzB,IAAMC,OAAO,GAAG,IAAAC,gBAAQ,EAAC,WAAW,CAAC;IAErC,OAAO,IAAI,CAACb,KAAK,CACdc,OAAO,CAAC;MACPC,MAAM,EAAE,MAAM;MACdC,OAAO,EAAE,SAAS;MAClBC,QAAQ,EAAE,eAAe;MACzBC,IAAI,EAAE;QACJC,OAAO,EAAET;MACX,CAAC;MACDU,qBAAqB,EAAE,IAAI,CAACpB,KAAK,CAACqB,MAAM,CAACF,OAAO,CAACC;IACnD,CAAC,CAAC,CACDE,IAAI,CAAC,UAACC,GAAG,EAAK;MACbZ,KAAI,CAACX,KAAK,CAACwB,MAAM,CAACC,GAAG,CACnBC,sCAA8B,qDAAAC,MAAA,CACqBf,OAAO,0BAC5D,CAAC;MAED,OAAOW,GAAG;IACZ,CAAC,CAAC,CACDK,KAAK,CAAC,UAACC,GAAG,EAAK;MACdlB,KAAI,CAACX,KAAK,CAACwB,MAAM,CAACM,KAAK,CACrBJ,sCAA8B,qDAAAC,MAAA,CACqBf,OAAO,kCAAAe,MAAA,CAChD,IAAAI,kCAA2B,EAACF,GAAG,CAAC,CAC5C,CAAC;MAED,OAAOjC,QAAA,CAAAC,OAAA,CAAQmC,MAAM,CAACH,GAAG,CAAC;IAC5B,CAAC,CAAC;EACN;AACF,CAAC,CAAC;AAAC,IAAAI,QAAA,GAAAC,OAAA,CAAArC,OAAA,GAEYP,2BAA2B","ignoreList":[]}