@webex/internal-plugin-metrics 3.0.0-beta.16 → 3.0.0-beta.160

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/config.js CHANGED
@@ -4,7 +4,7 @@ var _Object$defineProperty = require("@babel/runtime-corejs2/core-js/object/defi
4
4
  _Object$defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
- exports.default = exports.CLIENT_NAME = void 0;
7
+ exports.default = exports.OS_NAME = exports.OSMap = exports.CLIENT_NAME = void 0;
8
8
  var _common = require("@webex/common");
9
9
  /*!
10
10
  * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.
@@ -28,4 +28,23 @@ var _default = {
28
28
  }
29
29
  };
30
30
  exports.default = _default;
31
+ var OS_NAME = {
32
+ WINDOWS: 'windows',
33
+ MAC: 'mac',
34
+ IOS: 'ios',
35
+ ANDROID: 'android',
36
+ CHROME: 'chrome',
37
+ LINUX: 'linux',
38
+ OTHERS: 'other'
39
+ };
40
+ exports.OS_NAME = OS_NAME;
41
+ var OSMap = {
42
+ 'Chrome OS': OS_NAME.CHROME,
43
+ macOS: OS_NAME.MAC,
44
+ Windows: OS_NAME.WINDOWS,
45
+ iOS: OS_NAME.IOS,
46
+ Android: OS_NAME.ANDROID,
47
+ Linux: OS_NAME.LINUX
48
+ };
49
+ exports.OSMap = OSMap;
31
50
  //# sourceMappingURL=config.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["CLIENT_NAME","device","preDiscoveryServices","metricsServiceUrl","process","env","METRICS_SERVICE_URL","metrics","appType","inBrowser","batcherWait","batcherMaxCalls","batcherMaxWait","batcherRetryPlateau"],"sources":["config.js"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\nimport {inBrowser} from '@webex/common';\n\nexport const CLIENT_NAME = 'webex-js-sdk';\nexport default {\n device: {\n preDiscoveryServices: {\n metricsServiceUrl:\n process.env.METRICS_SERVICE_URL || 'https://metrics-a.wbx2.com/metrics/api/v1',\n metrics: process.env.METRICS_SERVICE_URL || 'https://metrics-a.wbx2.com/metrics/api/v1',\n },\n },\n metrics: {\n appType: inBrowser ? 'browser' : 'nodejs',\n batcherWait: 500,\n batcherMaxCalls: 50,\n batcherMaxWait: 1500,\n batcherRetryPlateau: 32000,\n },\n};\n"],"mappings":";;;;;;;AAIA;AAJA;AACA;AACA;;AAIO,IAAMA,WAAW,GAAG,cAAc;AAAC;AAAA,eAC3B;EACbC,MAAM,EAAE;IACNC,oBAAoB,EAAE;MACpBC,iBAAiB,EACfC,OAAO,CAACC,GAAG,CAACC,mBAAmB,IAAI,2CAA2C;MAChFC,OAAO,EAAEH,OAAO,CAACC,GAAG,CAACC,mBAAmB,IAAI;IAC9C;EACF,CAAC;EACDC,OAAO,EAAE;IACPC,OAAO,EAAEC,iBAAS,GAAG,SAAS,GAAG,QAAQ;IACzCC,WAAW,EAAE,GAAG;IAChBC,eAAe,EAAE,EAAE;IACnBC,cAAc,EAAE,IAAI;IACpBC,mBAAmB,EAAE;EACvB;AACF,CAAC;AAAA"}
1
+ {"version":3,"names":["CLIENT_NAME","device","preDiscoveryServices","metricsServiceUrl","process","env","METRICS_SERVICE_URL","metrics","appType","inBrowser","batcherWait","batcherMaxCalls","batcherMaxWait","batcherRetryPlateau","OS_NAME","WINDOWS","MAC","IOS","ANDROID","CHROME","LINUX","OTHERS","OSMap","macOS","Windows","iOS","Android","Linux"],"sources":["config.js"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\nimport {inBrowser} from '@webex/common';\n\nexport const CLIENT_NAME = 'webex-js-sdk';\nexport default {\n device: {\n preDiscoveryServices: {\n metricsServiceUrl:\n process.env.METRICS_SERVICE_URL || 'https://metrics-a.wbx2.com/metrics/api/v1',\n metrics: process.env.METRICS_SERVICE_URL || 'https://metrics-a.wbx2.com/metrics/api/v1',\n },\n },\n metrics: {\n appType: inBrowser ? 'browser' : 'nodejs',\n batcherWait: 500,\n batcherMaxCalls: 50,\n batcherMaxWait: 1500,\n batcherRetryPlateau: 32000,\n },\n};\n\nexport const OS_NAME = {\n WINDOWS: 'windows',\n MAC: 'mac',\n IOS: 'ios',\n ANDROID: 'android',\n CHROME: 'chrome',\n LINUX: 'linux',\n OTHERS: 'other',\n};\n\nexport const OSMap = {\n 'Chrome OS': OS_NAME.CHROME,\n macOS: OS_NAME.MAC,\n Windows: OS_NAME.WINDOWS,\n iOS: OS_NAME.IOS,\n Android: OS_NAME.ANDROID,\n Linux: OS_NAME.LINUX,\n};\n"],"mappings":";;;;;;;AAIA;AAJA;AACA;AACA;;AAIO,IAAMA,WAAW,GAAG,cAAc;AAAC;AAAA,eAC3B;EACbC,MAAM,EAAE;IACNC,oBAAoB,EAAE;MACpBC,iBAAiB,EACfC,OAAO,CAACC,GAAG,CAACC,mBAAmB,IAAI,2CAA2C;MAChFC,OAAO,EAAEH,OAAO,CAACC,GAAG,CAACC,mBAAmB,IAAI;IAC9C;EACF,CAAC;EACDC,OAAO,EAAE;IACPC,OAAO,EAAEC,iBAAS,GAAG,SAAS,GAAG,QAAQ;IACzCC,WAAW,EAAE,GAAG;IAChBC,eAAe,EAAE,EAAE;IACnBC,cAAc,EAAE,IAAI;IACpBC,mBAAmB,EAAE;EACvB;AACF,CAAC;AAAA;AAEM,IAAMC,OAAO,GAAG;EACrBC,OAAO,EAAE,SAAS;EAClBC,GAAG,EAAE,KAAK;EACVC,GAAG,EAAE,KAAK;EACVC,OAAO,EAAE,SAAS;EAClBC,MAAM,EAAE,QAAQ;EAChBC,KAAK,EAAE,OAAO;EACdC,MAAM,EAAE;AACV,CAAC;AAAC;AAEK,IAAMC,KAAK,GAAG;EACnB,WAAW,EAAER,OAAO,CAACK,MAAM;EAC3BI,KAAK,EAAET,OAAO,CAACE,GAAG;EAClBQ,OAAO,EAAEV,OAAO,CAACC,OAAO;EACxBU,GAAG,EAAEX,OAAO,CAACG,GAAG;EAChBS,OAAO,EAAEZ,OAAO,CAACI,OAAO;EACxBS,KAAK,EAAEb,OAAO,CAACM;AACjB,CAAC;AAAC"}
package/dist/index.js CHANGED
@@ -1,6 +1,9 @@
1
1
  "use strict";
2
2
 
3
+ var _typeof = require("@babel/runtime-corejs2/helpers/typeof");
4
+ var _WeakMap = require("@babel/runtime-corejs2/core-js/weak-map");
3
5
  var _Object$defineProperty = require("@babel/runtime-corejs2/core-js/object/define-property");
6
+ var _Object$getOwnPropertyDescriptor = require("@babel/runtime-corejs2/core-js/object/get-own-property-descriptor");
4
7
  var _interopRequireDefault = require("@babel/runtime-corejs2/helpers/interopRequireDefault");
5
8
  _Object$defineProperty(exports, "__esModule", {
6
9
  value: true
@@ -17,10 +20,18 @@ _Object$defineProperty(exports, "default", {
17
20
  return _metrics.default;
18
21
  }
19
22
  });
23
+ _Object$defineProperty(exports, "getOSNameInternal", {
24
+ enumerable: true,
25
+ get: function get() {
26
+ return _metrics.getOSNameInternal;
27
+ }
28
+ });
20
29
  require("@webex/internal-plugin-device");
21
30
  var _webexCore = require("@webex/webex-core");
22
- var _metrics = _interopRequireDefault(require("./metrics"));
31
+ var _metrics = _interopRequireWildcard(require("./metrics"));
23
32
  var _config = _interopRequireDefault(require("./config"));
33
+ function _getRequireWildcardCache(nodeInterop) { if (typeof _WeakMap !== "function") return null; var cacheBabelInterop = new _WeakMap(); var cacheNodeInterop = new _WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
34
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = _Object$defineProperty && _Object$getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? _Object$getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { _Object$defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
24
35
  /*!
25
36
  * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.
26
37
  */
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"names":["registerInternalPlugin","Metrics","config"],"sources":["index.js"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\nimport '@webex/internal-plugin-device';\n\nimport {registerInternalPlugin} from '@webex/webex-core';\n\nimport Metrics from './metrics';\nimport config from './config';\n\nregisterInternalPlugin('metrics', Metrics, {\n config,\n});\n\nexport {default} from './metrics';\nexport {config};\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAIA;AAEA;AAEA;AACA;AATA;AACA;AACA;;AASA,IAAAA,iCAAsB,EAAC,SAAS,EAAEC,gBAAO,EAAE;EACzCC,MAAM,EAANA;AACF,CAAC,CAAC"}
1
+ {"version":3,"names":["registerInternalPlugin","Metrics","config"],"sources":["index.js"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\nimport '@webex/internal-plugin-device';\n\nimport {registerInternalPlugin} from '@webex/webex-core';\n\nimport Metrics from './metrics';\nimport config from './config';\n\nregisterInternalPlugin('metrics', Metrics, {\n config,\n});\n\nexport {default, getOSNameInternal} from './metrics';\nexport {config};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAIA;AAEA;AAEA;AACA;AAA8B;AAAA;AAT9B;AACA;AACA;;AASA,IAAAA,iCAAsB,EAAC,SAAS,EAAEC,gBAAO,EAAE;EACzCC,MAAM,EAANA;AACF,CAAC,CAAC"}
package/dist/metrics.js CHANGED
@@ -11,6 +11,7 @@ _Object$defineProperty(exports, "__esModule", {
11
11
  value: true
12
12
  });
13
13
  exports.default = void 0;
14
+ exports.getOSNameInternal = getOSNameInternal;
14
15
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/defineProperty"));
15
16
  var _webexCore = require("@webex/webex-core");
16
17
  var _common = require("@webex/common");
@@ -25,6 +26,10 @@ var _BrowserDetection = (0, _common.BrowserDetection)(),
25
26
  getOSVersion = _BrowserDetection.getOSVersion,
26
27
  getBrowserName = _BrowserDetection.getBrowserName,
27
28
  getBrowserVersion = _BrowserDetection.getBrowserVersion;
29
+ function getOSNameInternal() {
30
+ var _OSMap$getOSName;
31
+ return (_OSMap$getOSName = _config.OSMap[getOSName()]) !== null && _OSMap$getOSName !== void 0 ? _OSMap$getOSName : _config.OS_NAME.OTHERS;
32
+ }
28
33
  function getSparkUserAgent(webex) {
29
34
  var _webex$config;
30
35
  var _ref = (_webex$config = webex === null || webex === void 0 ? void 0 : webex.config) !== null && _webex$config !== void 0 ? _webex$config : {},
@@ -53,15 +58,12 @@ var Metrics = _webexCore.WebexPlugin.extend({
53
58
  }, value));
54
59
  },
55
60
  /**
56
- * This corresponds to #sendSemiStructured() in the deprecated metrics handler
61
+ * Returns the payload for submitting client metrics.
57
62
  * @param {string} eventName
58
- * @param {Object} props
59
- * @param {string} preLoginId
60
- * @returns {Object} HttpResponse object
63
+ * @param {any} props
64
+ * @returns {any} - the payload
61
65
  */
62
- submitClientMetrics: function submitClientMetrics(eventName) {
63
- var props = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
64
- var preLoginId = arguments.length > 2 ? arguments[2] : undefined;
66
+ getClientMetricsPayload: function getClientMetricsPayload(eventName, props) {
65
67
  if (!eventName) {
66
68
  throw Error('Missing behavioral metric name. Please provide one');
67
69
  }
@@ -70,25 +72,19 @@ var Metrics = _webexCore.WebexPlugin.extend({
70
72
  };
71
73
  payload.tags = _objectSpread(_objectSpread({}, props.tags), {}, {
72
74
  browser: getBrowserName(),
73
- os: getOSName(),
75
+ os: getOSNameInternal(),
74
76
  // Node does not like this so we need to check if it exists or not
75
77
  // eslint-disable-next-line no-undef
76
- domain: typeof window !== 'undefined' ? window.location.hostname || 'non-browser' : 'non-browser',
77
- // Check what else we could measure
78
- client_id: this.webex.credentials.config.client_id,
79
- user_id: this.webex.internal.device.userId
78
+ domain: typeof window !== 'undefined' ? window.location.hostname || 'non-browser' : 'non-browser' // Check what else we could measure
80
79
  });
81
- try {
82
- payload.tags.org_id = this.webex.credentials.getOrgId();
83
- } catch (_unused) {
84
- this.logger.info('metrics: unable to get orgId');
85
- }
80
+
86
81
  payload.fields = _objectSpread(_objectSpread({}, props.fields), {}, {
87
82
  browser_version: getBrowserVersion(),
88
83
  os_version: getOSVersion(),
89
84
  sdk_version: this.webex.version,
90
85
  platform: 'Web',
91
- spark_user_agent: getSparkUserAgent(this.webex)
86
+ spark_user_agent: getSparkUserAgent(this.webex),
87
+ client_id: this.webex.credentials.config.client_id
92
88
  });
93
89
  payload.type = props.type || this.webex.config.metrics.type;
94
90
  payload.context = _objectSpread(_objectSpread({}, props.context), {}, {
@@ -97,7 +93,7 @@ var Metrics = _webexCore.WebexPlugin.extend({
97
93
  },
98
94
  locale: 'en-US',
99
95
  os: {
100
- name: getOSName(),
96
+ name: getOSNameInternal(),
101
97
  version: getOSVersion()
102
98
  }
103
99
  });
@@ -108,6 +104,19 @@ var Metrics = _webexCore.WebexPlugin.extend({
108
104
  // Mocking the time in tests when running in node
109
105
  // is impossible so unable to use Date.now()
110
106
  payload.timestamp = new Date().valueOf();
107
+ return payload;
108
+ },
109
+ /**
110
+ * This corresponds to #sendSemiStructured() in the deprecated metrics handler
111
+ * @param {string} eventName
112
+ * @param {Object} props
113
+ * @param {string} preLoginId
114
+ * @returns {Object} HttpResponse object
115
+ */
116
+ submitClientMetrics: function submitClientMetrics(eventName) {
117
+ var props = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
118
+ var preLoginId = arguments.length > 2 ? arguments[2] : undefined;
119
+ var payload = this.getClientMetricsPayload(eventName, props);
111
120
  if (preLoginId) {
112
121
  var _payload = {
113
122
  metrics: [payload]
@@ -161,7 +170,7 @@ var Metrics = _webexCore.WebexPlugin.extend({
161
170
  };
162
171
  return this.callDiagnosticEventsBatcher.request(event);
163
172
  },
164
- version: "3.0.0-beta.16"
173
+ version: "3.0.0-beta.160"
165
174
  });
166
175
  var _default = Metrics;
167
176
  exports.default = _default;
@@ -1 +1 @@
1
- {"version":3,"names":["BrowserDetection","getOSName","getOSVersion","getBrowserName","getBrowserVersion","getSparkUserAgent","webex","config","appName","appVersion","appPlatform","sparkUserAgent","CLIENT_NAME","Metrics","WebexPlugin","extend","children","batcher","Batcher","clientMetricsBatcher","ClientMetricsBatcher","callDiagnosticEventsBatcher","CallDiagnosticEventsBatcher","namespace","submit","key","value","request","submitClientMetrics","eventName","props","preLoginId","Error","payload","metricName","tags","browser","os","domain","window","location","hostname","client_id","credentials","user_id","internal","device","userId","org_id","getOrgId","logger","info","fields","browser_version","os_version","sdk_version","version","platform","spark_user_agent","type","metrics","context","app","locale","name","eventPayload","timestamp","Date","valueOf","_payload","postPreLoginMetric","aliasUser","method","api","resource","headers","body","qs","alias","getClientToken","then","token","authorization","toString","submitCallDiagnosticEvents","event"],"sources":["metrics.js"],"sourcesContent":["/* eslint-disable default-param-last */\n\n/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\nimport {WebexPlugin} from '@webex/webex-core';\nimport {BrowserDetection} from '@webex/common';\n\nimport {CLIENT_NAME} from './config';\nimport Batcher from './batcher';\nimport ClientMetricsBatcher from './client-metrics-batcher';\nimport CallDiagnosticEventsBatcher from './call-diagnostic-events-batcher';\n\nconst {getOSName, getOSVersion, getBrowserName, getBrowserVersion} = BrowserDetection();\n\nfunction getSparkUserAgent(webex) {\n const {appName, appVersion, appPlatform} = webex?.config ?? {};\n\n let sparkUserAgent = CLIENT_NAME;\n\n if (appName) {\n sparkUserAgent += ` ${appName}/${appVersion ?? '0.0'}`;\n }\n\n if (appPlatform) {\n sparkUserAgent += ` ${appPlatform}`;\n }\n\n return sparkUserAgent;\n}\n\nconst Metrics = WebexPlugin.extend({\n children: {\n batcher: Batcher,\n clientMetricsBatcher: ClientMetricsBatcher,\n callDiagnosticEventsBatcher: CallDiagnosticEventsBatcher,\n },\n\n namespace: 'Metrics',\n\n submit(key, value) {\n return this.batcher.request({key, ...value});\n },\n\n /**\n * This corresponds to #sendSemiStructured() in the deprecated metrics handler\n * @param {string} eventName\n * @param {Object} props\n * @param {string} preLoginId\n * @returns {Object} HttpResponse object\n */\n submitClientMetrics(eventName, props = {}, preLoginId) {\n if (!eventName) {\n throw Error('Missing behavioral metric name. Please provide one');\n }\n const payload = {metricName: eventName};\n\n payload.tags = {\n ...props.tags,\n browser: getBrowserName(),\n os: getOSName(),\n\n // Node does not like this so we need to check if it exists or not\n // eslint-disable-next-line no-undef\n domain:\n typeof window !== 'undefined' ? window.location.hostname || 'non-browser' : 'non-browser', // Check what else we could measure\n client_id: this.webex.credentials.config.client_id,\n user_id: this.webex.internal.device.userId,\n };\n\n try {\n payload.tags.org_id = this.webex.credentials.getOrgId();\n } catch {\n this.logger.info('metrics: unable to get orgId');\n }\n\n payload.fields = {\n ...props.fields,\n browser_version: getBrowserVersion(),\n os_version: getOSVersion(),\n sdk_version: this.webex.version,\n platform: 'Web',\n spark_user_agent: getSparkUserAgent(this.webex),\n };\n\n payload.type = props.type || this.webex.config.metrics.type;\n\n payload.context = {\n ...props.context,\n app: {\n version: this.webex.version,\n },\n locale: 'en-US',\n os: {\n name: getOSName(),\n version: getOSVersion(),\n },\n };\n\n if (props.eventPayload) {\n payload.eventPayload = props.eventPayload;\n }\n\n // Mocking the time in tests when running in node\n // is impossible so unable to use Date.now()\n payload.timestamp = new Date().valueOf();\n\n if (preLoginId) {\n const _payload = {\n metrics: [payload],\n };\n\n // Do not batch these because pre-login events occur during onboarding, so we will be partially blind\n // to users' progress through the reg flow if we wait to persist pre-login metrics for people who drop off because\n // their metrics will not post from a queue flush in time\n return this.postPreLoginMetric(_payload, preLoginId);\n }\n\n return this.clientMetricsBatcher.request(payload);\n },\n\n /**\n * Issue request to alias a user's pre-login ID with their CI UUID\n * @param {string} preLoginId\n * @returns {Object} HttpResponse object\n */\n aliasUser(preLoginId) {\n return this.request({\n method: 'POST',\n api: 'metrics',\n resource: 'clientmetrics',\n headers: {\n 'x-prelogin-userid': preLoginId,\n },\n body: {},\n qs: {\n alias: true,\n },\n });\n },\n\n postPreLoginMetric(payload, preLoginId) {\n return this.webex.credentials.getClientToken().then((token) =>\n this.request({\n method: 'POST',\n api: 'metrics',\n resource: 'clientmetrics-prelogin',\n headers: {\n authorization: token.toString(),\n 'x-prelogin-userid': preLoginId,\n },\n body: payload,\n })\n );\n },\n\n submitCallDiagnosticEvents(payload) {\n const event = {\n type: 'diagnostic-event',\n eventPayload: payload,\n };\n\n return this.callDiagnosticEventsBatcher.request(event);\n },\n});\n\nexport default Metrics;\n"],"mappings":"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"}
1
+ {"version":3,"names":["BrowserDetection","getOSName","getOSVersion","getBrowserName","getBrowserVersion","getOSNameInternal","OSMap","OS_NAME","OTHERS","getSparkUserAgent","webex","config","appName","appVersion","appPlatform","sparkUserAgent","CLIENT_NAME","Metrics","WebexPlugin","extend","children","batcher","Batcher","clientMetricsBatcher","ClientMetricsBatcher","callDiagnosticEventsBatcher","CallDiagnosticEventsBatcher","namespace","submit","key","value","request","getClientMetricsPayload","eventName","props","Error","payload","metricName","tags","browser","os","domain","window","location","hostname","fields","browser_version","os_version","sdk_version","version","platform","spark_user_agent","client_id","credentials","type","metrics","context","app","locale","name","eventPayload","timestamp","Date","valueOf","submitClientMetrics","preLoginId","_payload","postPreLoginMetric","aliasUser","method","api","resource","headers","body","qs","alias","getClientToken","then","token","authorization","toString","submitCallDiagnosticEvents","event"],"sources":["metrics.js"],"sourcesContent":["/* eslint-disable default-param-last */\n\n/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\nimport {WebexPlugin} from '@webex/webex-core';\nimport {BrowserDetection} from '@webex/common';\nimport {OS_NAME, OSMap, CLIENT_NAME} from './config';\n\nimport Batcher from './batcher';\nimport ClientMetricsBatcher from './client-metrics-batcher';\nimport CallDiagnosticEventsBatcher from './call-diagnostic-events-batcher';\n\nconst {getOSName, getOSVersion, getBrowserName, getBrowserVersion} = BrowserDetection();\n\nexport function getOSNameInternal() {\n return OSMap[getOSName()] ?? OS_NAME.OTHERS;\n}\n\nfunction getSparkUserAgent(webex) {\n const {appName, appVersion, appPlatform} = webex?.config ?? {};\n\n let sparkUserAgent = CLIENT_NAME;\n\n if (appName) {\n sparkUserAgent += ` ${appName}/${appVersion ?? '0.0'}`;\n }\n\n if (appPlatform) {\n sparkUserAgent += ` ${appPlatform}`;\n }\n\n return sparkUserAgent;\n}\n\nconst Metrics = WebexPlugin.extend({\n children: {\n batcher: Batcher,\n clientMetricsBatcher: ClientMetricsBatcher,\n callDiagnosticEventsBatcher: CallDiagnosticEventsBatcher,\n },\n\n namespace: 'Metrics',\n\n submit(key, value) {\n return this.batcher.request({key, ...value});\n },\n\n /**\n * Returns the payload for submitting client metrics.\n * @param {string} eventName\n * @param {any} props\n * @returns {any} - the payload\n */\n getClientMetricsPayload(eventName, props) {\n if (!eventName) {\n throw Error('Missing behavioral metric name. Please provide one');\n }\n const payload = {metricName: eventName};\n\n payload.tags = {\n ...props.tags,\n browser: getBrowserName(),\n os: getOSNameInternal(),\n\n // Node does not like this so we need to check if it exists or not\n // eslint-disable-next-line no-undef\n domain:\n typeof window !== 'undefined' ? window.location.hostname || 'non-browser' : 'non-browser', // Check what else we could measure\n };\n\n payload.fields = {\n ...props.fields,\n browser_version: getBrowserVersion(),\n os_version: getOSVersion(),\n sdk_version: this.webex.version,\n platform: 'Web',\n spark_user_agent: getSparkUserAgent(this.webex),\n client_id: this.webex.credentials.config.client_id,\n };\n\n payload.type = props.type || this.webex.config.metrics.type;\n\n payload.context = {\n ...props.context,\n app: {\n version: this.webex.version,\n },\n locale: 'en-US',\n os: {\n name: getOSNameInternal(),\n version: getOSVersion(),\n },\n };\n\n if (props.eventPayload) {\n payload.eventPayload = props.eventPayload;\n }\n\n // Mocking the time in tests when running in node\n // is impossible so unable to use Date.now()\n payload.timestamp = new Date().valueOf();\n\n return payload;\n },\n\n /**\n * This corresponds to #sendSemiStructured() in the deprecated metrics handler\n * @param {string} eventName\n * @param {Object} props\n * @param {string} preLoginId\n * @returns {Object} HttpResponse object\n */\n submitClientMetrics(eventName, props = {}, preLoginId) {\n const payload = this.getClientMetricsPayload(eventName, props);\n\n if (preLoginId) {\n const _payload = {\n metrics: [payload],\n };\n\n // Do not batch these because pre-login events occur during onboarding, so we will be partially blind\n // to users' progress through the reg flow if we wait to persist pre-login metrics for people who drop off because\n // their metrics will not post from a queue flush in time\n return this.postPreLoginMetric(_payload, preLoginId);\n }\n\n return this.clientMetricsBatcher.request(payload);\n },\n\n /**\n * Issue request to alias a user's pre-login ID with their CI UUID\n * @param {string} preLoginId\n * @returns {Object} HttpResponse object\n */\n aliasUser(preLoginId) {\n return this.request({\n method: 'POST',\n api: 'metrics',\n resource: 'clientmetrics',\n headers: {\n 'x-prelogin-userid': preLoginId,\n },\n body: {},\n qs: {\n alias: true,\n },\n });\n },\n\n postPreLoginMetric(payload, preLoginId) {\n return this.webex.credentials.getClientToken().then((token) =>\n this.request({\n method: 'POST',\n api: 'metrics',\n resource: 'clientmetrics-prelogin',\n headers: {\n authorization: token.toString(),\n 'x-prelogin-userid': preLoginId,\n },\n body: payload,\n })\n );\n },\n\n submitCallDiagnosticEvents(payload) {\n const event = {\n type: 'diagnostic-event',\n eventPayload: payload,\n };\n\n return this.callDiagnosticEventsBatcher.request(event);\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.16",
3
+ "version": "3.0.0-beta.160",
4
4
  "description": "",
5
5
  "license": "MIT",
6
6
  "main": "dist/index.js",
@@ -24,12 +24,12 @@
24
24
  "sinon": "^9.2.4"
25
25
  },
26
26
  "dependencies": {
27
- "@webex/common": "3.0.0-beta.16",
28
- "@webex/common-timers": "3.0.0-beta.16",
29
- "@webex/internal-plugin-device": "3.0.0-beta.16",
30
- "@webex/internal-plugin-metrics": "3.0.0-beta.16",
31
- "@webex/test-helper-chai": "3.0.0-beta.16",
32
- "@webex/test-helper-mock-webex": "3.0.0-beta.16",
33
- "@webex/webex-core": "3.0.0-beta.16"
27
+ "@webex/common": "3.0.0-beta.160",
28
+ "@webex/common-timers": "3.0.0-beta.160",
29
+ "@webex/internal-plugin-device": "3.0.0-beta.160",
30
+ "@webex/internal-plugin-metrics": "3.0.0-beta.160",
31
+ "@webex/test-helper-chai": "3.0.0-beta.160",
32
+ "@webex/test-helper-mock-webex": "3.0.0-beta.160",
33
+ "@webex/webex-core": "3.0.0-beta.160"
34
34
  }
35
35
  }
package/src/config.js CHANGED
@@ -21,3 +21,22 @@ export default {
21
21
  batcherRetryPlateau: 32000,
22
22
  },
23
23
  };
24
+
25
+ export const OS_NAME = {
26
+ WINDOWS: 'windows',
27
+ MAC: 'mac',
28
+ IOS: 'ios',
29
+ ANDROID: 'android',
30
+ CHROME: 'chrome',
31
+ LINUX: 'linux',
32
+ OTHERS: 'other',
33
+ };
34
+
35
+ export const OSMap = {
36
+ 'Chrome OS': OS_NAME.CHROME,
37
+ macOS: OS_NAME.MAC,
38
+ Windows: OS_NAME.WINDOWS,
39
+ iOS: OS_NAME.IOS,
40
+ Android: OS_NAME.ANDROID,
41
+ Linux: OS_NAME.LINUX,
42
+ };
package/src/index.js CHANGED
@@ -13,5 +13,5 @@ registerInternalPlugin('metrics', Metrics, {
13
13
  config,
14
14
  });
15
15
 
16
- export {default} from './metrics';
16
+ export {default, getOSNameInternal} from './metrics';
17
17
  export {config};
package/src/metrics.js CHANGED
@@ -6,14 +6,18 @@
6
6
 
7
7
  import {WebexPlugin} from '@webex/webex-core';
8
8
  import {BrowserDetection} from '@webex/common';
9
+ import {OS_NAME, OSMap, CLIENT_NAME} from './config';
9
10
 
10
- import {CLIENT_NAME} from './config';
11
11
  import Batcher from './batcher';
12
12
  import ClientMetricsBatcher from './client-metrics-batcher';
13
13
  import CallDiagnosticEventsBatcher from './call-diagnostic-events-batcher';
14
14
 
15
15
  const {getOSName, getOSVersion, getBrowserName, getBrowserVersion} = BrowserDetection();
16
16
 
17
+ export function getOSNameInternal() {
18
+ return OSMap[getOSName()] ?? OS_NAME.OTHERS;
19
+ }
20
+
17
21
  function getSparkUserAgent(webex) {
18
22
  const {appName, appVersion, appPlatform} = webex?.config ?? {};
19
23
 
@@ -44,13 +48,12 @@ const Metrics = WebexPlugin.extend({
44
48
  },
45
49
 
46
50
  /**
47
- * This corresponds to #sendSemiStructured() in the deprecated metrics handler
51
+ * Returns the payload for submitting client metrics.
48
52
  * @param {string} eventName
49
- * @param {Object} props
50
- * @param {string} preLoginId
51
- * @returns {Object} HttpResponse object
53
+ * @param {any} props
54
+ * @returns {any} - the payload
52
55
  */
53
- submitClientMetrics(eventName, props = {}, preLoginId) {
56
+ getClientMetricsPayload(eventName, props) {
54
57
  if (!eventName) {
55
58
  throw Error('Missing behavioral metric name. Please provide one');
56
59
  }
@@ -59,22 +62,14 @@ const Metrics = WebexPlugin.extend({
59
62
  payload.tags = {
60
63
  ...props.tags,
61
64
  browser: getBrowserName(),
62
- os: getOSName(),
65
+ os: getOSNameInternal(),
63
66
 
64
67
  // Node does not like this so we need to check if it exists or not
65
68
  // eslint-disable-next-line no-undef
66
69
  domain:
67
70
  typeof window !== 'undefined' ? window.location.hostname || 'non-browser' : 'non-browser', // Check what else we could measure
68
- client_id: this.webex.credentials.config.client_id,
69
- user_id: this.webex.internal.device.userId,
70
71
  };
71
72
 
72
- try {
73
- payload.tags.org_id = this.webex.credentials.getOrgId();
74
- } catch {
75
- this.logger.info('metrics: unable to get orgId');
76
- }
77
-
78
73
  payload.fields = {
79
74
  ...props.fields,
80
75
  browser_version: getBrowserVersion(),
@@ -82,6 +77,7 @@ const Metrics = WebexPlugin.extend({
82
77
  sdk_version: this.webex.version,
83
78
  platform: 'Web',
84
79
  spark_user_agent: getSparkUserAgent(this.webex),
80
+ client_id: this.webex.credentials.config.client_id,
85
81
  };
86
82
 
87
83
  payload.type = props.type || this.webex.config.metrics.type;
@@ -93,7 +89,7 @@ const Metrics = WebexPlugin.extend({
93
89
  },
94
90
  locale: 'en-US',
95
91
  os: {
96
- name: getOSName(),
92
+ name: getOSNameInternal(),
97
93
  version: getOSVersion(),
98
94
  },
99
95
  };
@@ -106,6 +102,19 @@ const Metrics = WebexPlugin.extend({
106
102
  // is impossible so unable to use Date.now()
107
103
  payload.timestamp = new Date().valueOf();
108
104
 
105
+ return payload;
106
+ },
107
+
108
+ /**
109
+ * This corresponds to #sendSemiStructured() in the deprecated metrics handler
110
+ * @param {string} eventName
111
+ * @param {Object} props
112
+ * @param {string} preLoginId
113
+ * @returns {Object} HttpResponse object
114
+ */
115
+ submitClientMetrics(eventName, props = {}, preLoginId) {
116
+ const payload = this.getClientMetricsPayload(eventName, props);
117
+
109
118
  if (preLoginId) {
110
119
  const _payload = {
111
120
  metrics: [payload],
@@ -8,6 +8,9 @@ import {Token, Credentials} from '@webex/webex-core';
8
8
  import FakeTimers from '@sinonjs/fake-timers';
9
9
  import sinon from 'sinon';
10
10
  import Metrics, {config} from '@webex/internal-plugin-metrics';
11
+ import {BrowserDetection} from '@webex/common';
12
+
13
+ const {getOSVersion} = BrowserDetection();
11
14
 
12
15
  function promiseTick(count) {
13
16
  let promise = Promise.resolve();
@@ -131,6 +134,67 @@ describe('plugin-metrics', () => {
131
134
  });
132
135
  });
133
136
 
137
+ describe.only('#getClientMetricsPayload()', () => {
138
+ it('returns the expected payload', () => {
139
+ webex.credentials.supertoken = new Token(
140
+ {
141
+ access_token: 'a_b_orgid',
142
+ },
143
+ {parent: webex}
144
+ );
145
+
146
+ const testPayload = {
147
+ tags: {success: true},
148
+ fields: {perceivedDurationInMillis: 314},
149
+ context: {},
150
+ eventPayload: {value: 'splunk business metric payload'},
151
+ };
152
+ const date = clock.now;
153
+
154
+ const result = metrics.getClientMetricsPayload('test', testPayload);
155
+
156
+ assert.deepEqual(result, {
157
+ context: {
158
+ app: {
159
+ version: undefined,
160
+ },
161
+ locale: 'en-US',
162
+ os: {
163
+ name: 'other',
164
+ version: getOSVersion(),
165
+ },
166
+ },
167
+ eventPayload: {
168
+ value: 'splunk business metric payload',
169
+ },
170
+ fields: {
171
+ browser_version: '',
172
+ client_id: 'fake',
173
+ os_version: getOSVersion(),
174
+ perceivedDurationInMillis: 314,
175
+ platform: 'Web',
176
+ sdk_version: undefined,
177
+ spark_user_agent: 'webex-js-sdk appName/appVersion appPlatform',
178
+ },
179
+ metricName: 'test',
180
+ tags: {
181
+ browser: '',
182
+ domain: 'non-browser',
183
+ os: 'other',
184
+ success: true,
185
+ },
186
+ timestamp: 0,
187
+ type: ['operational'],
188
+ });
189
+ });
190
+
191
+ it('throws when no event name is specified', () => {
192
+ assert.throws(() => {
193
+ metrics.getClientMetricsPayload();
194
+ }, 'Missing behavioral metric name. Please provide one');
195
+ });
196
+ });
197
+
134
198
  describe('#submitClientMetrics()', () => {
135
199
  describe('before login', () => {
136
200
  it('posts pre-login metric', () => {
@@ -199,17 +263,15 @@ describe('plugin-metrics', () => {
199
263
  assert.property(metric, 'eventPayload');
200
264
 
201
265
  assert.property(metric.tags, 'browser');
202
- assert.property(metric.tags, 'org_id');
203
266
  assert.property(metric.tags, 'os');
204
267
  assert.property(metric.tags, 'domain');
205
- assert.property(metric.tags, 'client_id');
206
- assert.property(metric.tags, 'user_id');
207
268
 
208
269
  assert.property(metric.fields, 'browser_version');
209
270
  assert.property(metric.fields, 'os_version');
210
271
  assert.property(metric.fields, 'sdk_version');
211
272
  assert.property(metric.fields, 'platform');
212
273
  assert.property(metric.fields, 'spark_user_agent');
274
+ assert.property(metric.fields, 'client_id');
213
275
 
214
276
  assert.property(metric.context, 'app');
215
277
  assert.property(metric.context, 'locale');