@webex/internal-plugin-metrics 3.0.0-beta.20 → 3.0.0-beta.200
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 +56 -0
- package/dist/call-diagnostic/call-diagnostic-metrics-batcher.js.map +1 -0
- package/dist/call-diagnostic/call-diagnostic-metrics-latencies.js +451 -0
- package/dist/call-diagnostic/call-diagnostic-metrics-latencies.js.map +1 -0
- package/dist/call-diagnostic/call-diagnostic-metrics.js +584 -0
- package/dist/call-diagnostic/call-diagnostic-metrics.js.map +1 -0
- package/dist/call-diagnostic/call-diagnostic-metrics.util.js +225 -0
- package/dist/call-diagnostic/call-diagnostic-metrics.util.js.map +1 -0
- package/dist/call-diagnostic/config.js +461 -0
- package/dist/call-diagnostic/config.js.map +1 -0
- package/dist/call-diagnostic/generated-types-temp/ClientEvent.js +7 -0
- package/dist/call-diagnostic/generated-types-temp/ClientEvent.js.map +1 -0
- package/dist/call-diagnostic/generated-types-temp/Event.js +7 -0
- package/dist/call-diagnostic/generated-types-temp/Event.js.map +1 -0
- package/dist/call-diagnostic/generated-types-temp/MediaQualityEvent.js +7 -0
- package/dist/call-diagnostic/generated-types-temp/MediaQualityEvent.js.map +1 -0
- package/dist/config.js +20 -1
- package/dist/config.js.map +1 -1
- package/dist/index.js +25 -1
- package/dist/index.js.map +1 -1
- package/dist/metrics.js +30 -30
- package/dist/metrics.js.map +1 -1
- package/dist/metrics.types.js +7 -0
- package/dist/metrics.types.js.map +1 -0
- package/dist/new-metrics.js +249 -0
- package/dist/new-metrics.js.map +1 -0
- package/dist/types/batcher.d.ts +2 -0
- package/dist/types/call-diagnostic/call-diagnostic-metrics-batcher.d.ts +2 -0
- package/dist/types/call-diagnostic/call-diagnostic-metrics-latencies.d.ts +189 -0
- package/dist/types/call-diagnostic/call-diagnostic-metrics.d.ts +348 -0
- package/dist/types/call-diagnostic/call-diagnostic-metrics.util.d.ts +52 -0
- package/dist/types/call-diagnostic/config.d.ts +57 -0
- package/dist/types/call-diagnostic/generated-types-temp/ClientEvent.d.ts +1112 -0
- package/dist/types/call-diagnostic/generated-types-temp/Event.d.ts +4851 -0
- package/dist/types/call-diagnostic/generated-types-temp/MediaQualityEvent.d.ts +2121 -0
- package/dist/types/client-metrics-batcher.d.ts +2 -0
- package/dist/types/config.d.ts +35 -0
- package/dist/types/index.d.ts +11 -0
- package/dist/types/metrics.d.ts +3 -0
- package/dist/types/metrics.types.d.ts +92 -0
- package/dist/types/new-metrics.d.ts +119 -0
- package/package.json +12 -8
- package/src/call-diagnostic/call-diagnostic-metrics-batcher.ts +51 -0
- package/src/call-diagnostic/call-diagnostic-metrics-latencies.ts +408 -0
- package/src/call-diagnostic/call-diagnostic-metrics.ts +591 -0
- package/src/call-diagnostic/call-diagnostic-metrics.util.ts +233 -0
- package/src/call-diagnostic/config.ts +455 -0
- package/src/call-diagnostic/generated-types-temp/ClientEvent.ts +2395 -0
- package/src/call-diagnostic/generated-types-temp/Event.ts +7762 -0
- package/src/call-diagnostic/generated-types-temp/MediaQualityEvent.ts +2321 -0
- package/src/config.js +19 -0
- package/src/index.ts +39 -0
- package/src/metrics.js +25 -27
- package/src/metrics.types.ts +137 -0
- package/src/new-metrics.ts +223 -0
- package/test/unit/spec/call-diagnostic/call-diagnostic-metrics-batcher.ts +243 -0
- package/test/unit/spec/call-diagnostic/call-diagnostic-metrics-latencies.ts +474 -0
- package/test/unit/spec/call-diagnostic/call-diagnostic-metrics.ts +820 -0
- package/test/unit/spec/call-diagnostic/call-diagnostic-metrics.util.ts +336 -0
- package/test/unit/spec/metrics.js +65 -97
- package/test/unit/spec/new-metrics.ts +153 -0
- package/tsconfig.json +6 -0
- package/dist/call-diagnostic-events-batcher.js +0 -60
- package/dist/call-diagnostic-events-batcher.js.map +0 -1
- package/src/call-diagnostic-events-batcher.js +0 -62
- package/src/index.js +0 -17
- package/test/unit/spec/call-diagnostic-events-batcher.js +0 -195
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _Object$defineProperty = require("@babel/runtime-corejs2/core-js/object/define-property");
|
|
4
|
+
var _interopRequireDefault = require("@babel/runtime-corejs2/helpers/interopRequireDefault");
|
|
5
|
+
_Object$defineProperty(exports, "__esModule", {
|
|
6
|
+
value: true
|
|
7
|
+
});
|
|
8
|
+
exports.userAgentToString = exports.setMetricTimings = exports.prepareDiagnosticMetricItem = exports.isLocusServiceErrorCode = exports.getBuildType = exports.clearEmptyKeysRecursively = exports.anonymizeIPAddress = void 0;
|
|
9
|
+
var _keys = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/object/keys"));
|
|
10
|
+
var _isArray = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/array/is-array"));
|
|
11
|
+
var _assign = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/object/assign"));
|
|
12
|
+
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/toConsumableArray"));
|
|
13
|
+
var _typeof2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/typeof"));
|
|
14
|
+
var _merge2 = _interopRequireDefault(require("lodash/merge"));
|
|
15
|
+
var _isEmpty2 = _interopRequireDefault(require("lodash/isEmpty"));
|
|
16
|
+
var _ipAnonymize = _interopRequireDefault(require("ip-anonymize"));
|
|
17
|
+
var _util = _interopRequireDefault(require("util"));
|
|
18
|
+
var _common = require("@webex/common");
|
|
19
|
+
/* eslint-disable valid-jsdoc */
|
|
20
|
+
|
|
21
|
+
var _BrowserDetection = (0, _common.BrowserDetection)(),
|
|
22
|
+
getOSName = _BrowserDetection.getOSName,
|
|
23
|
+
getOSVersion = _BrowserDetection.getOSVersion,
|
|
24
|
+
getBrowserName = _BrowserDetection.getBrowserName,
|
|
25
|
+
getBrowserVersion = _BrowserDetection.getBrowserVersion;
|
|
26
|
+
var anonymizeIPAddress = function anonymizeIPAddress(localIp) {
|
|
27
|
+
return (0, _ipAnonymize.default)(localIp, 28, 96);
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Returns a formated string of the user agent.
|
|
32
|
+
*
|
|
33
|
+
* @returns {string} formatted user agent information
|
|
34
|
+
*/
|
|
35
|
+
exports.anonymizeIPAddress = anonymizeIPAddress;
|
|
36
|
+
var userAgentToString = function userAgentToString(_ref) {
|
|
37
|
+
var clientName = _ref.clientName,
|
|
38
|
+
webexVersion = _ref.webexVersion;
|
|
39
|
+
var userAgentOption;
|
|
40
|
+
var browserInfo;
|
|
41
|
+
var clientInfo = _util.default.format('client=%s', "".concat(clientName));
|
|
42
|
+
if (['chrome', 'firefox', 'msie', 'msedge', 'safari'].indexOf(getBrowserName().toLowerCase()) !== -1) {
|
|
43
|
+
browserInfo = _util.default.format('browser=%s', "".concat(getBrowserName().toLowerCase(), "/").concat(getBrowserVersion().split('.')[0]));
|
|
44
|
+
}
|
|
45
|
+
var osInfo = _util.default.format('os=%s', "".concat(getOSName(), "/").concat(getOSVersion().split('.')[0]));
|
|
46
|
+
if (browserInfo) {
|
|
47
|
+
userAgentOption = "(".concat(browserInfo);
|
|
48
|
+
}
|
|
49
|
+
if (osInfo) {
|
|
50
|
+
userAgentOption = userAgentOption ? "".concat(userAgentOption, "; ").concat(clientInfo, "; ").concat(osInfo) : "".concat(clientInfo, "; (").concat(osInfo);
|
|
51
|
+
}
|
|
52
|
+
if (userAgentOption) {
|
|
53
|
+
userAgentOption += ')';
|
|
54
|
+
return _util.default.format('webex-js-sdk/%s %s', "".concat(process.env.NODE_ENV, "-").concat(webexVersion), userAgentOption);
|
|
55
|
+
}
|
|
56
|
+
return _util.default.format('webex-js-sdk/%s', "".concat(process.env.NODE_ENV, "-").concat(webexVersion));
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Iterates object recursively and removes any
|
|
61
|
+
* property that returns isEmpty for it's associated value
|
|
62
|
+
* isEmpty = implementation from Lodash.
|
|
63
|
+
*
|
|
64
|
+
* It modifies the object in place (mutable)
|
|
65
|
+
*
|
|
66
|
+
* @param obj - input
|
|
67
|
+
* @returns
|
|
68
|
+
*/
|
|
69
|
+
exports.userAgentToString = userAgentToString;
|
|
70
|
+
var clearEmptyKeysRecursively = function clearEmptyKeysRecursively(obj) {
|
|
71
|
+
// Check if the object is empty
|
|
72
|
+
if ((0, _keys.default)(obj).length === 0) {
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
(0, _keys.default)(obj).forEach(function (key) {
|
|
76
|
+
if (((0, _typeof2.default)(obj[key]) === 'object' || typeof obj[key] === 'string' || (0, _isArray.default)(obj[key])) && (0, _isEmpty2.default)(obj[key])) {
|
|
77
|
+
delete obj[key];
|
|
78
|
+
}
|
|
79
|
+
if ((0, _isArray.default)(obj[key])) {
|
|
80
|
+
obj[key] = (0, _toConsumableArray2.default)(obj[key].filter(function (x) {
|
|
81
|
+
return !!x;
|
|
82
|
+
}));
|
|
83
|
+
}
|
|
84
|
+
if ((0, _typeof2.default)(obj[key]) === 'object') {
|
|
85
|
+
clearEmptyKeysRecursively(obj[key]);
|
|
86
|
+
}
|
|
87
|
+
});
|
|
88
|
+
};
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* Locus error codes start with 2. The next three digits are the
|
|
92
|
+
* HTTP status code related to the error code (like 400, 403, 502, etc.)
|
|
93
|
+
* The remaining three digits are just an increasing integer.
|
|
94
|
+
* If it is 7 digits and starts with a 2, it is locus.
|
|
95
|
+
*
|
|
96
|
+
* @param errorCode
|
|
97
|
+
* @returns
|
|
98
|
+
*/
|
|
99
|
+
exports.clearEmptyKeysRecursively = clearEmptyKeysRecursively;
|
|
100
|
+
var isLocusServiceErrorCode = function isLocusServiceErrorCode(errorCode) {
|
|
101
|
+
var code = "".concat(errorCode);
|
|
102
|
+
if (code.length === 7 && code.charAt(0) === '2') {
|
|
103
|
+
return true;
|
|
104
|
+
}
|
|
105
|
+
return false;
|
|
106
|
+
};
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* @param webClientDomain
|
|
110
|
+
* @returns
|
|
111
|
+
*/
|
|
112
|
+
exports.isLocusServiceErrorCode = isLocusServiceErrorCode;
|
|
113
|
+
var getBuildType = function getBuildType(webClientDomain) {
|
|
114
|
+
if (webClientDomain !== null && webClientDomain !== void 0 && webClientDomain.includes('localhost') || webClientDomain !== null && webClientDomain !== void 0 && webClientDomain.includes('127.0.0.1') || process.env.NODE_ENV !== 'production') {
|
|
115
|
+
return 'test';
|
|
116
|
+
}
|
|
117
|
+
return 'production';
|
|
118
|
+
};
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* Prepare metric item for submission.
|
|
122
|
+
* @param {Object} webex sdk instance
|
|
123
|
+
* @param {Object} item
|
|
124
|
+
* @returns {Object} prepared item
|
|
125
|
+
*/
|
|
126
|
+
exports.getBuildType = getBuildType;
|
|
127
|
+
var prepareDiagnosticMetricItem = function prepareDiagnosticMetricItem(webex, item) {
|
|
128
|
+
var _item$event, _item$event$eventData, _item$eventPayload, _item$eventPayload$ev;
|
|
129
|
+
var origin = {
|
|
130
|
+
buildType: getBuildType((_item$event = item.event) === null || _item$event === void 0 ? void 0 : (_item$event$eventData = _item$event.eventData) === null || _item$event$eventData === void 0 ? void 0 : _item$event$eventData.webClientDomain),
|
|
131
|
+
networkType: 'unknown'
|
|
132
|
+
};
|
|
133
|
+
|
|
134
|
+
// check event names and append latencies?
|
|
135
|
+
var eventName = (_item$eventPayload = item.eventPayload) === null || _item$eventPayload === void 0 ? void 0 : (_item$eventPayload$ev = _item$eventPayload.event) === null || _item$eventPayload$ev === void 0 ? void 0 : _item$eventPayload$ev.name;
|
|
136
|
+
var joinTimes = {};
|
|
137
|
+
var audioSetupDelay = {};
|
|
138
|
+
var videoSetupDelay = {};
|
|
139
|
+
var cdl = webex.internal.newMetrics.callDiagnosticLatencies;
|
|
140
|
+
switch (eventName) {
|
|
141
|
+
case 'client.interstitial-window.launched':
|
|
142
|
+
joinTimes.meetingInfoReqResp = cdl.getMeetingInfoReqResp();
|
|
143
|
+
joinTimes.clickToInterstitial = cdl.getClickToInterstitial();
|
|
144
|
+
break;
|
|
145
|
+
case 'client.call.initiated':
|
|
146
|
+
joinTimes.meetingInfoReqResp = cdl.getMeetingInfoReqResp();
|
|
147
|
+
joinTimes.showInterstitialTime = cdl.getShowInterstitialTime();
|
|
148
|
+
break;
|
|
149
|
+
case 'client.locus.join.response':
|
|
150
|
+
joinTimes.meetingInfoReqResp = cdl.getMeetingInfoReqResp();
|
|
151
|
+
joinTimes.callInitJoinReq = cdl.getCallInitJoinReq();
|
|
152
|
+
joinTimes.joinReqResp = cdl.getJoinReqResp();
|
|
153
|
+
joinTimes.joinReqSentReceived = cdl.getJoinRespSentReceived();
|
|
154
|
+
joinTimes.pageJmt = cdl.getPageJMT();
|
|
155
|
+
joinTimes.clickToInterstitial = cdl.getClickToInterstitial();
|
|
156
|
+
joinTimes.interstitialToJoinOK = cdl.getInterstitialToJoinOK();
|
|
157
|
+
joinTimes.totalJmt = cdl.getTotalJMT();
|
|
158
|
+
joinTimes.clientJmt = cdl.getClientJMT();
|
|
159
|
+
break;
|
|
160
|
+
case 'client.ice.end':
|
|
161
|
+
joinTimes.ICESetupTime = cdl.getICESetupTime();
|
|
162
|
+
joinTimes.audioICESetupTime = cdl.getAudioICESetupTime();
|
|
163
|
+
joinTimes.videoICESetupTime = cdl.getVideoICESetupTime();
|
|
164
|
+
joinTimes.shareICESetupTime = cdl.getShareICESetupTime();
|
|
165
|
+
break;
|
|
166
|
+
case 'client.media.rx.start':
|
|
167
|
+
joinTimes.localSDPGenRemoteSDPRecv = cdl.getLocalSDPGenRemoteSDPRecv();
|
|
168
|
+
break;
|
|
169
|
+
case 'client.media-engine.ready':
|
|
170
|
+
joinTimes.totalMediaJMT = cdl.getTotalMediaJMT();
|
|
171
|
+
joinTimes.interstitialToMediaOKJMT = cdl.getInterstitialToMediaOKJMT();
|
|
172
|
+
joinTimes.callInitMediaEngineReady = cdl.getCallInitMediaEngineReady();
|
|
173
|
+
joinTimes.stayLobbyTime = cdl.getStayLobbyTime();
|
|
174
|
+
break;
|
|
175
|
+
case 'client.mediaquality.event':
|
|
176
|
+
audioSetupDelay.joinRespRxStart = cdl.getAudioJoinRespRxStart();
|
|
177
|
+
audioSetupDelay.joinRespTxStart = cdl.getAudioJoinRespTxStart();
|
|
178
|
+
videoSetupDelay.joinRespRxStart = cdl.getVideoJoinRespRxStart();
|
|
179
|
+
videoSetupDelay.joinRespTxStart = cdl.getVideoJoinRespTxStart();
|
|
180
|
+
}
|
|
181
|
+
if (!(0, _isEmpty2.default)(joinTimes)) {
|
|
182
|
+
item.eventPayload.event = (0, _merge2.default)(item.eventPayload.event, {
|
|
183
|
+
joinTimes: joinTimes
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
if (!(0, _isEmpty2.default)(audioSetupDelay)) {
|
|
187
|
+
item.eventPayload.event = (0, _merge2.default)(item.eventPayload.event, {
|
|
188
|
+
audioSetupDelay: audioSetupDelay
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
if (!(0, _isEmpty2.default)(videoSetupDelay)) {
|
|
192
|
+
item.eventPayload.event = (0, _merge2.default)(item.eventPayload.event, {
|
|
193
|
+
videoSetupDelay: videoSetupDelay
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
item.eventPayload.origin = (0, _assign.default)(origin, item.eventPayload.origin);
|
|
197
|
+
return item;
|
|
198
|
+
};
|
|
199
|
+
|
|
200
|
+
/**
|
|
201
|
+
* Sets the originTime value(s) before the request/fetch.
|
|
202
|
+
* This function is only useful if you are about to submit a metrics
|
|
203
|
+
* request using pre-built fetch options;
|
|
204
|
+
*
|
|
205
|
+
* @param {any} options
|
|
206
|
+
* @returns {any} the updated options object
|
|
207
|
+
*/
|
|
208
|
+
exports.prepareDiagnosticMetricItem = prepareDiagnosticMetricItem;
|
|
209
|
+
var setMetricTimings = function setMetricTimings(options) {
|
|
210
|
+
var _options$body;
|
|
211
|
+
if ((_options$body = options.body) !== null && _options$body !== void 0 && _options$body.metrics) {
|
|
212
|
+
var now = new Date().toISOString();
|
|
213
|
+
options.body.metrics.forEach(function (metric) {
|
|
214
|
+
if (metric.eventPayload) {
|
|
215
|
+
metric.eventPayload.originTime = {
|
|
216
|
+
triggered: now,
|
|
217
|
+
sent: now
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
return options;
|
|
223
|
+
};
|
|
224
|
+
exports.setMetricTimings = setMetricTimings;
|
|
225
|
+
//# sourceMappingURL=call-diagnostic-metrics.util.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["BrowserDetection","getOSName","getOSVersion","getBrowserName","getBrowserVersion","anonymizeIPAddress","localIp","anonymize","userAgentToString","clientName","webexVersion","userAgentOption","browserInfo","clientInfo","util","format","indexOf","toLowerCase","split","osInfo","process","env","NODE_ENV","clearEmptyKeysRecursively","obj","length","forEach","key","filter","x","isLocusServiceErrorCode","errorCode","code","charAt","getBuildType","webClientDomain","includes","prepareDiagnosticMetricItem","webex","item","origin","buildType","event","eventData","networkType","eventName","eventPayload","name","joinTimes","audioSetupDelay","videoSetupDelay","cdl","internal","newMetrics","callDiagnosticLatencies","meetingInfoReqResp","getMeetingInfoReqResp","clickToInterstitial","getClickToInterstitial","showInterstitialTime","getShowInterstitialTime","callInitJoinReq","getCallInitJoinReq","joinReqResp","getJoinReqResp","joinReqSentReceived","getJoinRespSentReceived","pageJmt","getPageJMT","interstitialToJoinOK","getInterstitialToJoinOK","totalJmt","getTotalJMT","clientJmt","getClientJMT","ICESetupTime","getICESetupTime","audioICESetupTime","getAudioICESetupTime","videoICESetupTime","getVideoICESetupTime","shareICESetupTime","getShareICESetupTime","localSDPGenRemoteSDPRecv","getLocalSDPGenRemoteSDPRecv","totalMediaJMT","getTotalMediaJMT","interstitialToMediaOKJMT","getInterstitialToMediaOKJMT","callInitMediaEngineReady","getCallInitMediaEngineReady","stayLobbyTime","getStayLobbyTime","joinRespRxStart","getAudioJoinRespRxStart","joinRespTxStart","getAudioJoinRespTxStart","getVideoJoinRespRxStart","getVideoJoinRespTxStart","setMetricTimings","options","body","metrics","now","Date","toISOString","metric","originTime","triggered","sent"],"sources":["call-diagnostic-metrics.util.ts"],"sourcesContent":["/* eslint-disable valid-jsdoc */\nimport anonymize from 'ip-anonymize';\nimport util from 'util';\n\nimport {BrowserDetection} from '@webex/common';\nimport {isEmpty, merge} from 'lodash';\nimport {\n ClientEvent,\n MediaQualityEventAudioSetupDelayPayload,\n MediaQualityEventVideoSetupDelayPayload,\n MetricEventNames,\n} from '../metrics.types';\n\nconst {getOSName, getOSVersion, getBrowserName, getBrowserVersion} = BrowserDetection();\n\nexport const anonymizeIPAddress = (localIp) => anonymize(localIp, 28, 96);\n\n/**\n * Returns a formated string of the user agent.\n *\n * @returns {string} formatted user agent information\n */\nexport const userAgentToString = ({clientName, webexVersion}) => {\n let userAgentOption;\n let browserInfo;\n const clientInfo = util.format('client=%s', `${clientName}`);\n\n if (\n ['chrome', 'firefox', 'msie', 'msedge', 'safari'].indexOf(getBrowserName().toLowerCase()) !== -1\n ) {\n browserInfo = util.format(\n 'browser=%s',\n `${getBrowserName().toLowerCase()}/${getBrowserVersion().split('.')[0]}`\n );\n }\n const osInfo = util.format('os=%s', `${getOSName()}/${getOSVersion().split('.')[0]}`);\n\n if (browserInfo) {\n userAgentOption = `(${browserInfo}`;\n }\n if (osInfo) {\n userAgentOption = userAgentOption\n ? `${userAgentOption}; ${clientInfo}; ${osInfo}`\n : `${clientInfo}; (${osInfo}`;\n }\n if (userAgentOption) {\n userAgentOption += ')';\n\n return util.format(\n 'webex-js-sdk/%s %s',\n `${process.env.NODE_ENV}-${webexVersion}`,\n userAgentOption\n );\n }\n\n return util.format('webex-js-sdk/%s', `${process.env.NODE_ENV}-${webexVersion}`);\n};\n\n/**\n * Iterates object recursively and removes any\n * property that returns isEmpty for it's associated value\n * isEmpty = implementation from Lodash.\n *\n * It modifies the object in place (mutable)\n *\n * @param obj - input\n * @returns\n */\nexport const clearEmptyKeysRecursively = (obj: any) => {\n // Check if the object is empty\n if (Object.keys(obj).length === 0) {\n return;\n }\n\n Object.keys(obj).forEach((key) => {\n if (\n (typeof obj[key] === 'object' || typeof obj[key] === 'string' || Array.isArray(obj[key])) &&\n isEmpty(obj[key])\n ) {\n delete obj[key];\n }\n if (Array.isArray(obj[key])) {\n obj[key] = [...obj[key].filter((x) => !!x)];\n }\n if (typeof obj[key] === 'object') {\n clearEmptyKeysRecursively(obj[key]);\n }\n });\n};\n\n/**\n * Locus error codes start with 2. The next three digits are the\n * HTTP status code related to the error code (like 400, 403, 502, etc.)\n * The remaining three digits are just an increasing integer.\n * If it is 7 digits and starts with a 2, it is locus.\n *\n * @param errorCode\n * @returns\n */\nexport const isLocusServiceErrorCode = (errorCode: string | number) => {\n const code = `${errorCode}`;\n\n if (code.length === 7 && code.charAt(0) === '2') {\n return true;\n }\n\n return false;\n};\n\n/**\n * @param webClientDomain\n * @returns\n */\nexport const getBuildType = (webClientDomain) => {\n if (\n webClientDomain?.includes('localhost') ||\n webClientDomain?.includes('127.0.0.1') ||\n process.env.NODE_ENV !== 'production'\n ) {\n return 'test';\n }\n\n return 'production';\n};\n\n/**\n * Prepare metric item for submission.\n * @param {Object} webex sdk instance\n * @param {Object} item\n * @returns {Object} prepared item\n */\nexport const prepareDiagnosticMetricItem = (webex: any, item: any) => {\n const origin = {\n buildType: getBuildType(item.event?.eventData?.webClientDomain),\n networkType: 'unknown',\n };\n\n // check event names and append latencies?\n const eventName = item.eventPayload?.event?.name as MetricEventNames;\n const joinTimes: ClientEvent['payload']['joinTimes'] = {};\n const audioSetupDelay: MediaQualityEventAudioSetupDelayPayload = {};\n const videoSetupDelay: MediaQualityEventVideoSetupDelayPayload = {};\n\n const cdl = webex.internal.newMetrics.callDiagnosticLatencies;\n\n switch (eventName) {\n case 'client.interstitial-window.launched':\n joinTimes.meetingInfoReqResp = cdl.getMeetingInfoReqResp();\n joinTimes.clickToInterstitial = cdl.getClickToInterstitial();\n break;\n\n case 'client.call.initiated':\n joinTimes.meetingInfoReqResp = cdl.getMeetingInfoReqResp();\n joinTimes.showInterstitialTime = cdl.getShowInterstitialTime();\n break;\n\n case 'client.locus.join.response':\n joinTimes.meetingInfoReqResp = cdl.getMeetingInfoReqResp();\n joinTimes.callInitJoinReq = cdl.getCallInitJoinReq();\n joinTimes.joinReqResp = cdl.getJoinReqResp();\n joinTimes.joinReqSentReceived = cdl.getJoinRespSentReceived();\n joinTimes.pageJmt = cdl.getPageJMT();\n joinTimes.clickToInterstitial = cdl.getClickToInterstitial();\n joinTimes.interstitialToJoinOK = cdl.getInterstitialToJoinOK();\n joinTimes.totalJmt = cdl.getTotalJMT();\n joinTimes.clientJmt = cdl.getClientJMT();\n break;\n\n case 'client.ice.end':\n joinTimes.ICESetupTime = cdl.getICESetupTime();\n joinTimes.audioICESetupTime = cdl.getAudioICESetupTime();\n joinTimes.videoICESetupTime = cdl.getVideoICESetupTime();\n joinTimes.shareICESetupTime = cdl.getShareICESetupTime();\n break;\n\n case 'client.media.rx.start':\n joinTimes.localSDPGenRemoteSDPRecv = cdl.getLocalSDPGenRemoteSDPRecv();\n break;\n\n case 'client.media-engine.ready':\n joinTimes.totalMediaJMT = cdl.getTotalMediaJMT();\n joinTimes.interstitialToMediaOKJMT = cdl.getInterstitialToMediaOKJMT();\n joinTimes.callInitMediaEngineReady = cdl.getCallInitMediaEngineReady();\n joinTimes.stayLobbyTime = cdl.getStayLobbyTime();\n break;\n\n case 'client.mediaquality.event':\n audioSetupDelay.joinRespRxStart = cdl.getAudioJoinRespRxStart();\n audioSetupDelay.joinRespTxStart = cdl.getAudioJoinRespTxStart();\n videoSetupDelay.joinRespRxStart = cdl.getVideoJoinRespRxStart();\n videoSetupDelay.joinRespTxStart = cdl.getVideoJoinRespTxStart();\n }\n\n if (!isEmpty(joinTimes)) {\n item.eventPayload.event = merge(item.eventPayload.event, {joinTimes});\n }\n\n if (!isEmpty(audioSetupDelay)) {\n item.eventPayload.event = merge(item.eventPayload.event, {audioSetupDelay});\n }\n\n if (!isEmpty(videoSetupDelay)) {\n item.eventPayload.event = merge(item.eventPayload.event, {videoSetupDelay});\n }\n\n item.eventPayload.origin = Object.assign(origin, item.eventPayload.origin);\n\n return item;\n};\n\n/**\n * Sets the originTime value(s) before the request/fetch.\n * This function is only useful if you are about to submit a metrics\n * request using pre-built fetch options;\n *\n * @param {any} options\n * @returns {any} the updated options object\n */\nexport const setMetricTimings = (options) => {\n if (options.body?.metrics) {\n const now = new Date().toISOString();\n options.body.metrics.forEach((metric) => {\n if (metric.eventPayload) {\n metric.eventPayload.originTime = {\n triggered: now,\n sent: now,\n };\n }\n });\n }\n\n return options;\n};\n"],"mappings":"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"}
|