@webex/internal-plugin-metrics 3.0.0-beta.17 → 3.0.0-beta.171

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 (67) hide show
  1. package/dist/call-diagnostic/call-diagnostic-metrics-batcher.js +132 -0
  2. package/dist/call-diagnostic/call-diagnostic-metrics-batcher.js.map +1 -0
  3. package/dist/call-diagnostic/call-diagnostic-metrics-latencies.js +339 -0
  4. package/dist/call-diagnostic/call-diagnostic-metrics-latencies.js.map +1 -0
  5. package/dist/call-diagnostic/call-diagnostic-metrics.js +511 -0
  6. package/dist/call-diagnostic/call-diagnostic-metrics.js.map +1 -0
  7. package/dist/call-diagnostic/call-diagnostic-metrics.util.js +106 -0
  8. package/dist/call-diagnostic/call-diagnostic-metrics.util.js.map +1 -0
  9. package/dist/call-diagnostic/config.js +461 -0
  10. package/dist/call-diagnostic/config.js.map +1 -0
  11. package/dist/call-diagnostic/generated-types-temp/ClientEvent.js +7 -0
  12. package/dist/call-diagnostic/generated-types-temp/ClientEvent.js.map +1 -0
  13. package/dist/call-diagnostic/generated-types-temp/Event.js +7 -0
  14. package/dist/call-diagnostic/generated-types-temp/Event.js.map +1 -0
  15. package/dist/call-diagnostic/generated-types-temp/MediaQualityEvent.js +7 -0
  16. package/dist/call-diagnostic/generated-types-temp/MediaQualityEvent.js.map +1 -0
  17. package/dist/config.js +20 -1
  18. package/dist/config.js.map +1 -1
  19. package/dist/index.js +25 -1
  20. package/dist/index.js.map +1 -1
  21. package/dist/metrics.js +30 -30
  22. package/dist/metrics.js.map +1 -1
  23. package/dist/metrics.types.js +7 -0
  24. package/dist/metrics.types.js.map +1 -0
  25. package/dist/new-metrics.js +171 -0
  26. package/dist/new-metrics.js.map +1 -0
  27. package/dist/types/batcher.d.ts +2 -0
  28. package/dist/types/call-diagnostic/call-diagnostic-metrics-batcher.d.ts +2 -0
  29. package/dist/types/call-diagnostic/call-diagnostic-metrics-latencies.d.ts +154 -0
  30. package/dist/types/call-diagnostic/call-diagnostic-metrics.d.ts +324 -0
  31. package/dist/types/call-diagnostic/call-diagnostic-metrics.util.d.ts +31 -0
  32. package/dist/types/call-diagnostic/config.d.ts +57 -0
  33. package/dist/types/call-diagnostic/generated-types-temp/ClientEvent.d.ts +1112 -0
  34. package/dist/types/call-diagnostic/generated-types-temp/Event.d.ts +4851 -0
  35. package/dist/types/call-diagnostic/generated-types-temp/MediaQualityEvent.d.ts +2121 -0
  36. package/dist/types/client-metrics-batcher.d.ts +2 -0
  37. package/dist/types/config.d.ts +35 -0
  38. package/dist/types/index.d.ts +11 -0
  39. package/dist/types/metrics.d.ts +3 -0
  40. package/dist/types/metrics.types.d.ts +87 -0
  41. package/dist/types/new-metrics.d.ts +83 -0
  42. package/package.json +12 -8
  43. package/src/call-diagnostic/call-diagnostic-metrics-batcher.ts +146 -0
  44. package/src/call-diagnostic/call-diagnostic-metrics-latencies.ts +308 -0
  45. package/src/call-diagnostic/call-diagnostic-metrics.ts +528 -0
  46. package/src/call-diagnostic/call-diagnostic-metrics.util.ts +102 -0
  47. package/src/call-diagnostic/config.ts +455 -0
  48. package/src/call-diagnostic/generated-types-temp/ClientEvent.ts +2357 -0
  49. package/src/call-diagnostic/generated-types-temp/Event.ts +7669 -0
  50. package/src/call-diagnostic/generated-types-temp/MediaQualityEvent.ts +2321 -0
  51. package/src/config.js +19 -0
  52. package/src/index.ts +39 -0
  53. package/src/metrics.js +25 -27
  54. package/src/metrics.types.ts +132 -0
  55. package/src/new-metrics.ts +167 -0
  56. package/test/unit/spec/call-diagnostic/call-diagnostic-metrics-batcher.ts +235 -0
  57. package/test/unit/spec/call-diagnostic/call-diagnostic-metrics-latencies.ts +199 -0
  58. package/test/unit/spec/call-diagnostic/call-diagnostic-metrics.ts +722 -0
  59. package/test/unit/spec/call-diagnostic/call-diagnostic-metrics.util.ts +76 -0
  60. package/test/unit/spec/metrics.js +65 -97
  61. package/test/unit/spec/new-metrics.ts +88 -0
  62. package/tsconfig.json +6 -0
  63. package/dist/call-diagnostic-events-batcher.js +0 -60
  64. package/dist/call-diagnostic-events-batcher.js.map +0 -1
  65. package/src/call-diagnostic-events-batcher.js +0 -62
  66. package/src/index.js +0 -17
  67. package/test/unit/spec/call-diagnostic-events-batcher.js +0 -195
@@ -0,0 +1,132 @@
1
+ "use strict";
2
+
3
+ var _Object$defineProperty = require("@babel/runtime-corejs2/core-js/object/define-property");
4
+ var _interopRequireDefault = require("@babel/runtime-corejs2/helpers/interopRequireDefault");
5
+ _Object$defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.default = void 0;
9
+ var _assign = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/object/assign"));
10
+ var _promise = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/promise"));
11
+ var _merge2 = _interopRequireDefault(require("lodash/merge"));
12
+ var _isEmpty2 = _interopRequireDefault(require("lodash/isEmpty"));
13
+ var _batcher = _interopRequireDefault(require("../batcher"));
14
+ var CallDiagnosticEventsBatcher = _batcher.default.extend({
15
+ namespace: 'Metrics',
16
+ /**
17
+ * @param webClientDomain
18
+ * @returns
19
+ */
20
+ getBuildType: function getBuildType(webClientDomain) {
21
+ 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') {
22
+ return 'test';
23
+ }
24
+ return process.env.NODE_ENV === 'production' ? 'prod' : 'test';
25
+ },
26
+ /**
27
+ * Prepare item
28
+ * @param item
29
+ * @returns
30
+ */
31
+ prepareItem: function prepareItem(item) {
32
+ var _item$event, _item$event$eventData, _item$eventPayload, _item$eventPayload$ev;
33
+ var origin = {
34
+ buildType: this.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),
35
+ networkType: 'unknown'
36
+ };
37
+
38
+ // check event names and append latencies?
39
+ 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;
40
+ var joinTimes = {};
41
+ var audioSetupDelay = {};
42
+ var videoSetupDelay = {};
43
+ var cdl = this.webex.internal.newMetrics.callDiagnosticLatencies;
44
+ switch (eventName) {
45
+ case 'client.interstitial-window.launched':
46
+ joinTimes.meetingInfoReqResp = cdl.getMeetingInfoReqResp();
47
+ joinTimes.clickToInterstitial = cdl.getClickToInterstitial();
48
+ break;
49
+ case 'client.call.initiated':
50
+ joinTimes.meetingInfoReqResp = cdl.getMeetingInfoReqResp();
51
+ joinTimes.showInterstitialTime = cdl.getShowInterstitialTime();
52
+ break;
53
+ case 'client.locus.join.response':
54
+ joinTimes.meetingInfoReqResp = cdl.getMeetingInfoReqResp();
55
+ joinTimes.callInitJoinReq = cdl.getCallInitJoinReq();
56
+ joinTimes.joinReqResp = cdl.getJoinReqResp();
57
+ joinTimes.joinReqSentReceived = cdl.getJoinRespSentReceived();
58
+ joinTimes.pageJmt = cdl.getPageJMT();
59
+ joinTimes.clickToInterstitial = cdl.getClickToInterstitial();
60
+ joinTimes.interstitialToJoinOK = cdl.getInterstitialToJoinOK();
61
+ joinTimes.totalJmt = cdl.getTotalJMT();
62
+ break;
63
+ case 'client.ice.end':
64
+ joinTimes.ICESetupTime = cdl.getICESetupTime();
65
+ joinTimes.audioICESetupTime = cdl.getAudioICESetupTime();
66
+ joinTimes.videoICESetupTime = cdl.getVideoICESetupTime();
67
+ joinTimes.shareICESetupTime = cdl.getShareICESetupTime();
68
+ break;
69
+ case 'client.media.rx.start':
70
+ joinTimes.localSDPGenRemoteSDPRecv = cdl.getLocalSDPGenRemoteSDPRecv();
71
+ break;
72
+ case 'client.media-engine.ready':
73
+ joinTimes.totalMediaJMT = cdl.getTotalMediaJMT();
74
+ joinTimes.interstitialToMediaOKJMT = cdl.getInterstitialToMediaOKJMT();
75
+ joinTimes.callInitMediaEngineReady = cdl.getInterstitialToMediaOKJMT(); // same as interstitialToMediaOKJMT
76
+ break;
77
+ case 'client.mediaquality.event':
78
+ audioSetupDelay.joinRespRxStart = cdl.getAudioJoinRespRxStart();
79
+ audioSetupDelay.joinRespTxStart = cdl.getAudioJoinRespTxStart();
80
+ videoSetupDelay.joinRespRxStart = cdl.getVideoJoinRespRxStart();
81
+ videoSetupDelay.joinRespTxStart = cdl.getVideoJoinRespTxStart();
82
+ }
83
+ if (!(0, _isEmpty2.default)(joinTimes)) {
84
+ item.eventPayload.event = (0, _merge2.default)(item.eventPayload.event, {
85
+ joinTimes: joinTimes
86
+ });
87
+ }
88
+ if (!(0, _isEmpty2.default)(audioSetupDelay)) {
89
+ item.eventPayload.event = (0, _merge2.default)(item.eventPayload.event, {
90
+ audioSetupDelay: audioSetupDelay
91
+ });
92
+ }
93
+ if (!(0, _isEmpty2.default)(videoSetupDelay)) {
94
+ item.eventPayload.event = (0, _merge2.default)(item.eventPayload.event, {
95
+ videoSetupDelay: videoSetupDelay
96
+ });
97
+ }
98
+ item.eventPayload.origin = (0, _assign.default)(origin, item.eventPayload.origin);
99
+ return _promise.default.resolve(item);
100
+ },
101
+ /**
102
+ * Prepare request, add time sensitive date etc.
103
+ * @param queue
104
+ * @returns
105
+ */
106
+ prepareRequest: function prepareRequest(queue) {
107
+ // Add sent timestamp
108
+ queue.forEach(function (item) {
109
+ item.eventPayload.originTime = item.eventPayload.originTime || {};
110
+ item.eventPayload.originTime.sent = new Date().toISOString();
111
+ });
112
+ return _promise.default.resolve(queue);
113
+ },
114
+ /**
115
+ *
116
+ * @param payload
117
+ * @returns
118
+ */
119
+ submitHttpRequest: function submitHttpRequest(payload) {
120
+ return this.webex.request({
121
+ method: 'POST',
122
+ service: 'metrics',
123
+ resource: 'clientmetrics',
124
+ body: {
125
+ metrics: payload
126
+ }
127
+ });
128
+ }
129
+ });
130
+ var _default = CallDiagnosticEventsBatcher;
131
+ exports.default = _default;
132
+ //# sourceMappingURL=call-diagnostic-metrics-batcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["CallDiagnosticEventsBatcher","Batcher","extend","namespace","getBuildType","webClientDomain","includes","process","env","NODE_ENV","prepareItem","item","origin","buildType","event","eventData","networkType","eventName","eventPayload","name","joinTimes","audioSetupDelay","videoSetupDelay","cdl","webex","internal","newMetrics","callDiagnosticLatencies","meetingInfoReqResp","getMeetingInfoReqResp","clickToInterstitial","getClickToInterstitial","showInterstitialTime","getShowInterstitialTime","callInitJoinReq","getCallInitJoinReq","joinReqResp","getJoinReqResp","joinReqSentReceived","getJoinRespSentReceived","pageJmt","getPageJMT","interstitialToJoinOK","getInterstitialToJoinOK","totalJmt","getTotalJMT","ICESetupTime","getICESetupTime","audioICESetupTime","getAudioICESetupTime","videoICESetupTime","getVideoICESetupTime","shareICESetupTime","getShareICESetupTime","localSDPGenRemoteSDPRecv","getLocalSDPGenRemoteSDPRecv","totalMediaJMT","getTotalMediaJMT","interstitialToMediaOKJMT","getInterstitialToMediaOKJMT","callInitMediaEngineReady","joinRespRxStart","getAudioJoinRespRxStart","joinRespTxStart","getAudioJoinRespTxStart","getVideoJoinRespRxStart","getVideoJoinRespTxStart","resolve","prepareRequest","queue","forEach","originTime","sent","Date","toISOString","submitHttpRequest","payload","request","method","service","resource","body","metrics"],"sources":["call-diagnostic-metrics-batcher.ts"],"sourcesContent":["/* eslint-disable class-methods-use-this */\n/* eslint-disable valid-jsdoc */\n\nimport {isEmpty, merge} from 'lodash';\nimport Batcher from '../batcher';\nimport {\n ClientEvent,\n MetricEventNames,\n MediaQualityEventAudioSetupDelayPayload,\n MediaQualityEventVideoSetupDelayPayload,\n} from '../metrics.types';\n\nconst CallDiagnosticEventsBatcher = Batcher.extend({\n namespace: 'Metrics',\n\n /**\n * @param webClientDomain\n * @returns\n */\n 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 process.env.NODE_ENV === 'production' ? 'prod' : 'test';\n },\n\n /**\n * Prepare item\n * @param item\n * @returns\n */\n prepareItem(item) {\n const origin = {\n buildType: this.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 = this.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 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.getInterstitialToMediaOKJMT(); // same as interstitialToMediaOKJMT\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 Promise.resolve(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 return this.webex.request({\n method: 'POST',\n service: 'metrics',\n resource: 'clientmetrics',\n body: {\n metrics: payload,\n },\n });\n },\n});\n\nexport default CallDiagnosticEventsBatcher;\n"],"mappings":"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"}
@@ -0,0 +1,339 @@
1
+ "use strict";
2
+
3
+ var _Object$defineProperty = require("@babel/runtime-corejs2/core-js/object/define-property");
4
+ var _interopRequireDefault = require("@babel/runtime-corejs2/helpers/interopRequireDefault");
5
+ _Object$defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.default = void 0;
9
+ var _map = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/map"));
10
+ var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/classCallCheck"));
11
+ var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/createClass"));
12
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/defineProperty"));
13
+ /* eslint-disable class-methods-use-this */
14
+ /* eslint-disable valid-jsdoc */
15
+ // we only care about client event and feature event for now
16
+ /**
17
+ * @description Helper class to store latencies timestamp and to calculate various latencies for CA.
18
+ * @exports
19
+ * @class CallDiagnosticLatencies
20
+ */
21
+ var CallDiagnosticLatencies = /*#__PURE__*/function () {
22
+ /**
23
+ * @constructor
24
+ */
25
+ function CallDiagnosticLatencies() {
26
+ (0, _classCallCheck2.default)(this, CallDiagnosticLatencies);
27
+ (0, _defineProperty2.default)(this, "latencyTimestamps", void 0);
28
+ this.latencyTimestamps = new _map.default();
29
+ }
30
+
31
+ /**
32
+ * Clear timestamps
33
+ */
34
+ (0, _createClass2.default)(CallDiagnosticLatencies, [{
35
+ key: "clearTimestamps",
36
+ value: function clearTimestamps() {
37
+ this.latencyTimestamps.clear();
38
+ }
39
+
40
+ /**
41
+ * Store timestamp value
42
+ * @param key - key
43
+ * @param value -value
44
+ * @throws
45
+ * @returns
46
+ */
47
+ }, {
48
+ key: "saveTimestamp",
49
+ value: function saveTimestamp(key) {
50
+ var value = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : new Date().getTime();
51
+ this.latencyTimestamps.set(key, value);
52
+ }
53
+
54
+ /**
55
+ * Helper to calculate end - start
56
+ * @param a start
57
+ * @param b end
58
+ * @returns latency
59
+ */
60
+ }, {
61
+ key: "getDiffBetweenTimestamps",
62
+ value: function getDiffBetweenTimestamps(a, b) {
63
+ var start = this.latencyTimestamps.get(a);
64
+ var end = this.latencyTimestamps.get(b);
65
+ if (start && end) {
66
+ return end - start;
67
+ }
68
+ return undefined;
69
+ }
70
+
71
+ /**
72
+ * Meeting Info Request
73
+ * @note Meeting Info request happen not just in the join phase. CA requires
74
+ * metrics around meeting info request that are only part of join phase.
75
+ * This internal.* event is used to track the real timestamps
76
+ * (when the actual request/response happen). This is because the actual CA event is
77
+ * sent inside the join method on the meeting object based on some logic, but that's not exactly when
78
+ * those events are actually fired. The logic only confirms that they have happened, and we send them over.
79
+ * @returns - latency
80
+ */
81
+ }, {
82
+ key: "getMeetingInfoReqResp",
83
+ value: function getMeetingInfoReqResp() {
84
+ return this.getDiffBetweenTimestamps('internal.client.meetinginfo.request', 'internal.client.meetinginfo.response');
85
+ }
86
+
87
+ /**
88
+ * Interstitial Time
89
+ * @returns - latency
90
+ */
91
+ }, {
92
+ key: "getShowInterstitialTime",
93
+ value: function getShowInterstitialTime() {
94
+ return this.getDiffBetweenTimestamps('internal.client.interstitial-window.launched', 'internal.client.interstitial-window.click.joinbutton');
95
+ }
96
+
97
+ /**
98
+ * Call Init Join Request
99
+ * @returns - latency
100
+ */
101
+ }, {
102
+ key: "getCallInitJoinReq",
103
+ value: function getCallInitJoinReq() {
104
+ return this.getDiffBetweenTimestamps('internal.client.meeting.click.joinbutton', 'client.locus.join.request');
105
+ }
106
+
107
+ /**
108
+ * Locus Join Request
109
+ * @returns - latency
110
+ */
111
+ }, {
112
+ key: "getJoinReqResp",
113
+ value: function getJoinReqResp() {
114
+ return this.getDiffBetweenTimestamps('client.locus.join.request', 'client.locus.join.response');
115
+ }
116
+
117
+ /**
118
+ * Locus Join Response Sent Received
119
+ * @returns - latency
120
+ */
121
+ }, {
122
+ key: "getJoinRespSentReceived",
123
+ value: function getJoinRespSentReceived() {
124
+ // TODO: not clear SPARK-440554
125
+ return undefined;
126
+ }
127
+
128
+ /**
129
+ * Local SDP Generated Remote SDP REceived
130
+ * @returns - latency
131
+ */
132
+ }, {
133
+ key: "getLocalSDPGenRemoteSDPRecv",
134
+ value: function getLocalSDPGenRemoteSDPRecv() {
135
+ return this.getDiffBetweenTimestamps('client.media-engine.local-sdp-generated', 'client.media-engine.remote-sdp-received');
136
+ }
137
+
138
+ /**
139
+ * ICE Setup Time
140
+ * @returns - latency
141
+ */
142
+ }, {
143
+ key: "getICESetupTime",
144
+ value: function getICESetupTime() {
145
+ return this.getDiffBetweenTimestamps('client.ice.start', 'client.ice.end');
146
+ }
147
+
148
+ /**
149
+ * Audio ICE time
150
+ * @returns - latency
151
+ */
152
+ }, {
153
+ key: "getAudioICESetupTime",
154
+ value: function getAudioICESetupTime() {
155
+ return this.getDiffBetweenTimestamps('client.ice.start', 'client.ice.end');
156
+ }
157
+
158
+ /**
159
+ * Video ICE Time
160
+ * @returns - latency
161
+ */
162
+ }, {
163
+ key: "getVideoICESetupTime",
164
+ value: function getVideoICESetupTime() {
165
+ return this.getDiffBetweenTimestamps('client.ice.start', 'client.ice.end');
166
+ }
167
+
168
+ /**
169
+ * Share ICE Time
170
+ * @returns - latency
171
+ */
172
+ }, {
173
+ key: "getShareICESetupTime",
174
+ value: function getShareICESetupTime() {
175
+ return this.getDiffBetweenTimestamps('client.ice.start', 'client.ice.end');
176
+ }
177
+
178
+ /**
179
+ * Stay Lobby Time
180
+ * @returns - latency
181
+ */
182
+ }, {
183
+ key: "getStayLobbyTime",
184
+ value: function getStayLobbyTime() {
185
+ return this.getDiffBetweenTimestamps('client.locus.join.response', 'internal.host.meeting.participant.admitted');
186
+ }
187
+
188
+ /**
189
+ * Page JMT
190
+ * @returns - latency
191
+ */
192
+ }, {
193
+ key: "getPageJMT",
194
+ value: function getPageJMT() {
195
+ return this.latencyTimestamps.get('internal.client.pageJMT.received') || undefined;
196
+ }
197
+
198
+ /**
199
+ * Click To Interstitial
200
+ * @returns - latency
201
+ */
202
+ }, {
203
+ key: "getClickToInterstitial",
204
+ value: function getClickToInterstitial() {
205
+ return this.getDiffBetweenTimestamps('internal.client.meeting.click.joinbutton', 'internal.client.meeting.interstitial-window.showed');
206
+ }
207
+
208
+ /**
209
+ * Interstitial To Join Ok
210
+ * @returns - latency
211
+ */
212
+ }, {
213
+ key: "getInterstitialToJoinOK",
214
+ value: function getInterstitialToJoinOK() {
215
+ return this.getDiffBetweenTimestamps('internal.client.meeting.click.joinbutton', 'client.locus.join.response');
216
+ }
217
+
218
+ /**
219
+ * Interstitial To Media Ok
220
+ * @returns - latency
221
+ */
222
+ }, {
223
+ key: "getInterstitialToMediaOK",
224
+ value: function getInterstitialToMediaOK() {
225
+ return this.getDiffBetweenTimestamps('internal.client.meeting.click.joinbutton', 'sdk.media-flow.started');
226
+ }
227
+
228
+ /**
229
+ * Total JMT
230
+ * @returns - latency
231
+ */
232
+ }, {
233
+ key: "getTotalJMT",
234
+ value: function getTotalJMT() {
235
+ var clickToInterstitial = this.getClickToInterstitial();
236
+ var interstitialToJoinOk = this.getInterstitialToJoinOK();
237
+ if (clickToInterstitial && interstitialToJoinOk) {
238
+ return clickToInterstitial + interstitialToJoinOk;
239
+ }
240
+ return undefined;
241
+ }
242
+
243
+ /**
244
+ * Join Conf JMT
245
+ * @returns - latency
246
+ */
247
+ }, {
248
+ key: "getJoinConfJMT",
249
+ value: function getJoinConfJMT() {
250
+ var joinReqResp = this.getJoinReqResp();
251
+ var ICESetupTime = this.getICESetupTime();
252
+ if (joinReqResp && ICESetupTime) {
253
+ return joinReqResp + ICESetupTime;
254
+ }
255
+ return undefined;
256
+ }
257
+
258
+ /**
259
+ * Total Media JMT
260
+ * @returns - latency
261
+ */
262
+ }, {
263
+ key: "getTotalMediaJMT",
264
+ value: function getTotalMediaJMT() {
265
+ var clickToInterstitial = this.getClickToInterstitial();
266
+ var interstitialToJoinOk = this.getInterstitialToJoinOK();
267
+ var joinConfJMT = this.getJoinConfJMT();
268
+ var stayLobbyTime = this.getStayLobbyTime() || 0;
269
+ if (clickToInterstitial && interstitialToJoinOk && joinConfJMT) {
270
+ return clickToInterstitial + interstitialToJoinOk + joinConfJMT - stayLobbyTime;
271
+ }
272
+ return undefined;
273
+ }
274
+
275
+ /**
276
+ * Client JMT
277
+ * @returns - latency
278
+ */
279
+ }, {
280
+ key: "getClientJMT",
281
+ value: function getClientJMT() {
282
+ var interstitialToJoinOk = this.getInterstitialToJoinOK();
283
+ var joinConfJMT = this.getJoinConfJMT();
284
+ if (interstitialToJoinOk && joinConfJMT) {
285
+ return interstitialToJoinOk + joinConfJMT;
286
+ }
287
+ return undefined;
288
+ }
289
+
290
+ /**
291
+ * Interstitial To Media OK JMT
292
+ * @returns - latency
293
+ */
294
+ }, {
295
+ key: "getInterstitialToMediaOKJMT",
296
+ value: function getInterstitialToMediaOKJMT() {
297
+ return this.getDiffBetweenTimestamps('internal.client.interstitial-window.click.joinbutton', 'client.media-engine.ready');
298
+ }
299
+
300
+ /**
301
+ * Audio setup delay receive
302
+ */
303
+ }, {
304
+ key: "getAudioJoinRespRxStart",
305
+ value: function getAudioJoinRespRxStart() {
306
+ return this.getDiffBetweenTimestamps('client.locus.join.response', 'client.media.rx.start');
307
+ }
308
+
309
+ /**
310
+ * Video setup delay receive
311
+ */
312
+ }, {
313
+ key: "getVideoJoinRespRxStart",
314
+ value: function getVideoJoinRespRxStart() {
315
+ return this.getDiffBetweenTimestamps('client.locus.join.response', 'client.media.rx.start');
316
+ }
317
+
318
+ /**
319
+ * Audio setup delay transmit
320
+ */
321
+ }, {
322
+ key: "getAudioJoinRespTxStart",
323
+ value: function getAudioJoinRespTxStart() {
324
+ return this.getDiffBetweenTimestamps('client.locus.join.response', 'client.media.tx.start');
325
+ }
326
+
327
+ /**
328
+ * Video setup delay transmit
329
+ */
330
+ }, {
331
+ key: "getVideoJoinRespTxStart",
332
+ value: function getVideoJoinRespTxStart() {
333
+ return this.getDiffBetweenTimestamps('client.locus.join.response', 'client.media.tx.start');
334
+ }
335
+ }]);
336
+ return CallDiagnosticLatencies;
337
+ }();
338
+ exports.default = CallDiagnosticLatencies;
339
+ //# sourceMappingURL=call-diagnostic-metrics-latencies.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["CallDiagnosticLatencies","latencyTimestamps","clear","key","value","Date","getTime","set","a","b","start","get","end","undefined","getDiffBetweenTimestamps","clickToInterstitial","getClickToInterstitial","interstitialToJoinOk","getInterstitialToJoinOK","joinReqResp","getJoinReqResp","ICESetupTime","getICESetupTime","joinConfJMT","getJoinConfJMT","stayLobbyTime","getStayLobbyTime"],"sources":["call-diagnostic-metrics-latencies.ts"],"sourcesContent":["/* eslint-disable class-methods-use-this */\n/* eslint-disable valid-jsdoc */\n\nimport {MetricEventNames} from '../metrics.types';\n\n// we only care about client event and feature event for now\n\n/**\n * @description Helper class to store latencies timestamp and to calculate various latencies for CA.\n * @exports\n * @class CallDiagnosticLatencies\n */\nexport default class CallDiagnosticLatencies {\n latencyTimestamps: Map<MetricEventNames, number>;\n\n /**\n * @constructor\n */\n constructor() {\n this.latencyTimestamps = new Map();\n }\n\n /**\n * Clear timestamps\n */\n public clearTimestamps() {\n this.latencyTimestamps.clear();\n }\n\n /**\n * Store timestamp value\n * @param key - key\n * @param value -value\n * @throws\n * @returns\n */\n public saveTimestamp(key: MetricEventNames, value: number = new Date().getTime()) {\n this.latencyTimestamps.set(key, value);\n }\n\n /**\n * Helper to calculate end - start\n * @param a start\n * @param b end\n * @returns latency\n */\n public getDiffBetweenTimestamps(a: MetricEventNames, b: MetricEventNames) {\n const start = this.latencyTimestamps.get(a);\n const end = this.latencyTimestamps.get(b);\n if (start && end) {\n return end - start;\n }\n\n return undefined;\n }\n\n /**\n * Meeting Info Request\n * @note Meeting Info request happen not just in the join phase. CA requires\n * metrics around meeting info request that are only part of join phase.\n * This internal.* event is used to track the real timestamps\n * (when the actual request/response happen). This is because the actual CA event is\n * sent inside the join method on the meeting object based on some logic, but that's not exactly when\n * those events are actually fired. The logic only confirms that they have happened, and we send them over.\n * @returns - latency\n */\n public getMeetingInfoReqResp() {\n return this.getDiffBetweenTimestamps(\n 'internal.client.meetinginfo.request',\n 'internal.client.meetinginfo.response'\n );\n }\n\n /**\n * Interstitial Time\n * @returns - latency\n */\n public getShowInterstitialTime() {\n return this.getDiffBetweenTimestamps(\n 'internal.client.interstitial-window.launched',\n 'internal.client.interstitial-window.click.joinbutton'\n );\n }\n\n /**\n * Call Init Join Request\n * @returns - latency\n */\n public getCallInitJoinReq() {\n return this.getDiffBetweenTimestamps(\n 'internal.client.meeting.click.joinbutton',\n 'client.locus.join.request'\n );\n }\n\n /**\n * Locus Join Request\n * @returns - latency\n */\n public getJoinReqResp() {\n return this.getDiffBetweenTimestamps('client.locus.join.request', 'client.locus.join.response');\n }\n\n /**\n * Locus Join Response Sent Received\n * @returns - latency\n */\n public getJoinRespSentReceived() {\n // TODO: not clear SPARK-440554\n return undefined;\n }\n\n /**\n * Local SDP Generated Remote SDP REceived\n * @returns - latency\n */\n public getLocalSDPGenRemoteSDPRecv() {\n return this.getDiffBetweenTimestamps(\n 'client.media-engine.local-sdp-generated',\n 'client.media-engine.remote-sdp-received'\n );\n }\n\n /**\n * ICE Setup Time\n * @returns - latency\n */\n public getICESetupTime() {\n return this.getDiffBetweenTimestamps('client.ice.start', 'client.ice.end');\n }\n\n /**\n * Audio ICE time\n * @returns - latency\n */\n public getAudioICESetupTime() {\n return this.getDiffBetweenTimestamps('client.ice.start', 'client.ice.end');\n }\n\n /**\n * Video ICE Time\n * @returns - latency\n */\n public getVideoICESetupTime() {\n return this.getDiffBetweenTimestamps('client.ice.start', 'client.ice.end');\n }\n\n /**\n * Share ICE Time\n * @returns - latency\n */\n public getShareICESetupTime() {\n return this.getDiffBetweenTimestamps('client.ice.start', 'client.ice.end');\n }\n\n /**\n * Stay Lobby Time\n * @returns - latency\n */\n public getStayLobbyTime() {\n return this.getDiffBetweenTimestamps(\n 'client.locus.join.response',\n 'internal.host.meeting.participant.admitted'\n );\n }\n\n /**\n * Page JMT\n * @returns - latency\n */\n public getPageJMT() {\n return this.latencyTimestamps.get('internal.client.pageJMT.received') || undefined;\n }\n\n /**\n * Click To Interstitial\n * @returns - latency\n */\n public getClickToInterstitial() {\n return this.getDiffBetweenTimestamps(\n 'internal.client.meeting.click.joinbutton',\n 'internal.client.meeting.interstitial-window.showed'\n );\n }\n\n /**\n * Interstitial To Join Ok\n * @returns - latency\n */\n public getInterstitialToJoinOK() {\n return this.getDiffBetweenTimestamps(\n 'internal.client.meeting.click.joinbutton',\n 'client.locus.join.response'\n );\n }\n\n /**\n * Interstitial To Media Ok\n * @returns - latency\n */\n public getInterstitialToMediaOK() {\n return this.getDiffBetweenTimestamps(\n 'internal.client.meeting.click.joinbutton',\n 'sdk.media-flow.started'\n );\n }\n\n /**\n * Total JMT\n * @returns - latency\n */\n public getTotalJMT() {\n const clickToInterstitial = this.getClickToInterstitial();\n const interstitialToJoinOk = this.getInterstitialToJoinOK();\n\n if (clickToInterstitial && interstitialToJoinOk) {\n return clickToInterstitial + interstitialToJoinOk;\n }\n\n return undefined;\n }\n\n /**\n * Join Conf JMT\n * @returns - latency\n */\n public getJoinConfJMT() {\n const joinReqResp = this.getJoinReqResp();\n const ICESetupTime = this.getICESetupTime();\n\n if (joinReqResp && ICESetupTime) {\n return joinReqResp + ICESetupTime;\n }\n\n return undefined;\n }\n\n /**\n * Total Media JMT\n * @returns - latency\n */\n public getTotalMediaJMT() {\n const clickToInterstitial = this.getClickToInterstitial();\n const interstitialToJoinOk = this.getInterstitialToJoinOK();\n const joinConfJMT = this.getJoinConfJMT();\n const stayLobbyTime = this.getStayLobbyTime() || 0;\n\n if (clickToInterstitial && interstitialToJoinOk && joinConfJMT) {\n return clickToInterstitial + interstitialToJoinOk + joinConfJMT - stayLobbyTime;\n }\n\n return undefined;\n }\n\n /**\n * Client JMT\n * @returns - latency\n */\n public getClientJMT() {\n const interstitialToJoinOk = this.getInterstitialToJoinOK();\n const joinConfJMT = this.getJoinConfJMT();\n\n if (interstitialToJoinOk && joinConfJMT) {\n return interstitialToJoinOk + joinConfJMT;\n }\n\n return undefined;\n }\n\n /**\n * Interstitial To Media OK JMT\n * @returns - latency\n */\n public getInterstitialToMediaOKJMT() {\n return this.getDiffBetweenTimestamps(\n 'internal.client.interstitial-window.click.joinbutton',\n 'client.media-engine.ready'\n );\n }\n\n /**\n * Audio setup delay receive\n */\n public getAudioJoinRespRxStart() {\n return this.getDiffBetweenTimestamps('client.locus.join.response', 'client.media.rx.start');\n }\n\n /**\n * Video setup delay receive\n */\n public getVideoJoinRespRxStart() {\n return this.getDiffBetweenTimestamps('client.locus.join.response', 'client.media.rx.start');\n }\n\n /**\n * Audio setup delay transmit\n */\n public getAudioJoinRespTxStart() {\n return this.getDiffBetweenTimestamps('client.locus.join.response', 'client.media.tx.start');\n }\n\n /**\n * Video setup delay transmit\n */\n public getVideoJoinRespTxStart() {\n return this.getDiffBetweenTimestamps('client.locus.join.response', 'client.media.tx.start');\n }\n}\n"],"mappings":"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"}