@atlaskit/collab-provider 8.1.0 → 8.3.0

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 (87) hide show
  1. package/CHANGELOG.md +48 -0
  2. package/dist/cjs/analytics/index.js +68 -20
  3. package/dist/cjs/analytics/performance.js +45 -49
  4. package/dist/cjs/analytics/ufo.js +33 -0
  5. package/dist/cjs/channel.js +138 -154
  6. package/dist/cjs/connectivity/network.js +53 -0
  7. package/dist/cjs/connectivity/reconnect-helper.js +48 -0
  8. package/dist/cjs/connectivity/singleton.js +15 -0
  9. package/dist/cjs/disconnected-reason-mapper.js +19 -4
  10. package/dist/cjs/emitter.js +3 -11
  11. package/dist/cjs/error-code-mapper.js +14 -12
  12. package/dist/cjs/feature-flags/__test__/index.unit.js +0 -1
  13. package/dist/cjs/feature-flags/index.js +5 -15
  14. package/dist/cjs/feature-flags/types.js +2 -0
  15. package/dist/cjs/helpers/const.js +7 -18
  16. package/dist/cjs/helpers/utils.js +0 -12
  17. package/dist/cjs/index.js +0 -1
  18. package/dist/cjs/provider/catchup.js +35 -43
  19. package/dist/cjs/provider/commit-step.js +66 -0
  20. package/dist/cjs/provider/index.js +533 -742
  21. package/dist/cjs/provider/telepointers.js +78 -0
  22. package/dist/cjs/socket-io-provider.js +2 -12
  23. package/dist/cjs/types.js +0 -1
  24. package/dist/cjs/version-wrapper.js +1 -3
  25. package/dist/cjs/version.json +1 -1
  26. package/dist/es2019/analytics/index.js +59 -11
  27. package/dist/es2019/analytics/performance.js +46 -46
  28. package/dist/es2019/analytics/ufo.js +22 -0
  29. package/dist/es2019/channel.js +128 -107
  30. package/dist/es2019/connectivity/network.js +34 -0
  31. package/dist/es2019/connectivity/reconnect-helper.js +29 -0
  32. package/dist/es2019/connectivity/singleton.js +7 -0
  33. package/dist/es2019/disconnected-reason-mapper.js +18 -3
  34. package/dist/es2019/emitter.js +3 -8
  35. package/dist/es2019/error-code-mapper.js +14 -7
  36. package/dist/es2019/feature-flags/index.js +2 -5
  37. package/dist/es2019/feature-flags/types.js +2 -0
  38. package/dist/es2019/helpers/const.js +6 -15
  39. package/dist/es2019/helpers/utils.js +0 -2
  40. package/dist/es2019/provider/catchup.js +32 -23
  41. package/dist/es2019/provider/commit-step.js +53 -0
  42. package/dist/es2019/provider/index.js +446 -616
  43. package/dist/es2019/provider/telepointers.js +65 -0
  44. package/dist/es2019/socket-io-provider.js +4 -2
  45. package/dist/es2019/types.js +1 -1
  46. package/dist/es2019/version-wrapper.js +1 -1
  47. package/dist/es2019/version.json +1 -1
  48. package/dist/esm/analytics/index.js +69 -15
  49. package/dist/esm/analytics/performance.js +46 -46
  50. package/dist/esm/analytics/ufo.js +25 -0
  51. package/dist/esm/channel.js +139 -148
  52. package/dist/esm/connectivity/network.js +45 -0
  53. package/dist/esm/connectivity/reconnect-helper.js +42 -0
  54. package/dist/esm/connectivity/singleton.js +7 -0
  55. package/dist/esm/disconnected-reason-mapper.js +18 -3
  56. package/dist/esm/emitter.js +3 -6
  57. package/dist/esm/error-code-mapper.js +14 -7
  58. package/dist/esm/feature-flags/index.js +5 -10
  59. package/dist/esm/feature-flags/types.js +2 -0
  60. package/dist/esm/helpers/const.js +6 -15
  61. package/dist/esm/helpers/utils.js +0 -3
  62. package/dist/esm/provider/catchup.js +35 -36
  63. package/dist/esm/provider/commit-step.js +58 -0
  64. package/dist/esm/provider/index.js +535 -745
  65. package/dist/esm/provider/telepointers.js +69 -0
  66. package/dist/esm/socket-io-provider.js +2 -5
  67. package/dist/esm/types.js +1 -1
  68. package/dist/esm/version-wrapper.js +1 -1
  69. package/dist/esm/version.json +1 -1
  70. package/dist/types/analytics/index.d.ts +8 -2
  71. package/dist/types/analytics/performance.d.ts +5 -5
  72. package/dist/types/analytics/ufo.d.ts +3 -0
  73. package/dist/types/channel.d.ts +12 -5
  74. package/dist/types/connectivity/network.d.ts +17 -0
  75. package/dist/types/connectivity/reconnect-helper.d.ts +8 -0
  76. package/dist/types/connectivity/singleton.d.ts +3 -0
  77. package/dist/types/disconnected-reason-mapper.d.ts +1 -0
  78. package/dist/types/error-code-mapper.d.ts +4 -0
  79. package/dist/types/helpers/const.d.ts +116 -19
  80. package/dist/types/provider/commit-step.d.ts +14 -0
  81. package/dist/types/provider/index.d.ts +9 -5
  82. package/dist/types/provider/telepointers.d.ts +5 -0
  83. package/dist/types/socket-io-provider.d.ts +2 -1
  84. package/dist/types/types.d.ts +30 -11
  85. package/package.json +7 -6
  86. package/report.api.md +35 -0
  87. package/.vscode/settings.json +0 -3
package/CHANGELOG.md CHANGED
@@ -1,5 +1,53 @@
1
1
  # @atlaskit/collab-provider
2
2
 
3
+ ## 8.3.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [`1d36e909618`](https://bitbucket.org/atlassian/atlassian-frontend/commits/1d36e909618) - Log error on document restore
8
+ - [`0529b1b833c`](https://bitbucket.org/atlassian/atlassian-frontend/commits/0529b1b833c) - Trigger catch up call on process steps failing
9
+ - [`4f005660ce2`](https://bitbucket.org/atlassian/atlassian-frontend/commits/4f005660ce2) - Log step commit errors to analytics
10
+ - [`6034004a812`](https://bitbucket.org/atlassian/atlassian-frontend/commits/6034004a812) - Log errors on reconnection failure
11
+ - [`a261b2a9e6a`](https://bitbucket.org/atlassian/atlassian-frontend/commits/a261b2a9e6a) - [ESS-3183] Catch any errors in Presence functionality so an uncaught error there doesn't impact regular operation of the collab provider
12
+ - [`7f35ae7d99c`](https://bitbucket.org/atlassian/atlassian-frontend/commits/7f35ae7d99c) - [ESS-2815] Added network status to analytics events
13
+ - [`80feb6de229`](https://bitbucket.org/atlassian/atlassian-frontend/commits/80feb6de229) - [ESS-2815] Emit an error to consumers if the reconnections fails 8 times due to the network issues
14
+ - [`611d9c643c6`](https://bitbucket.org/atlassian/atlassian-frontend/commits/611d9c643c6) - [ESS-3183] Retry syncing unconfirmed steps
15
+
16
+ ### Patch Changes
17
+
18
+ - [`fccc5952d49`](https://bitbucket.org/atlassian/atlassian-frontend/commits/fccc5952d49) - Revert emitting errors to Confluence by default
19
+ - [`0d25bcca6bb`](https://bitbucket.org/atlassian/atlassian-frontend/commits/0d25bcca6bb) - Added more comprehensive error handling for performance/analytics/ufo events in collab provider
20
+ - [`e97495c5748`](https://bitbucket.org/atlassian/atlassian-frontend/commits/e97495c5748) - Extract emitTelepointer logic from Provider
21
+ - [`260d1355cc6`](https://bitbucket.org/atlassian/atlassian-frontend/commits/260d1355cc6) - Reconnect collab provider immediately when browser emits online event.
22
+ - [`5725fb45955`](https://bitbucket.org/atlassian/atlassian-frontend/commits/5725fb45955) - Introduce a file for UFO.
23
+
24
+ Introduce a file for commit step logic, which was already separate from the provider class
25
+
26
+ - [`2b648e4db70`](https://bitbucket.org/atlassian/atlassian-frontend/commits/2b648e4db70) - NO-ISSUE Remove the analytics fall-back after validating acks work as expected
27
+ - [`35c5e7dd9d5`](https://bitbucket.org/atlassian/atlassian-frontend/commits/35c5e7dd9d5) - NO-ISSUE deduplicate the analytics types dependency (again)
28
+ - [`1c255047a29`](https://bitbucket.org/atlassian/atlassian-frontend/commits/1c255047a29) - improve catchup error handling
29
+ - [`c9ad25cf224`](https://bitbucket.org/atlassian/atlassian-frontend/commits/c9ad25cf224) - [ESS-3183] Create abstraction around sending analytics events for errors or action events
30
+ - [`607a34f4426`](https://bitbucket.org/atlassian/atlassian-frontend/commits/607a34f4426) - Pass through the analytics web client in places it was missing
31
+ - [`efb112b06ab`](https://bitbucket.org/atlassian/atlassian-frontend/commits/efb112b06ab) - Move disonnected reason mapper
32
+ - [`9e6ceda8977`](https://bitbucket.org/atlassian/atlassian-frontend/commits/9e6ceda8977) - Provide the reason for a page reset
33
+ - [`6956eedc944`](https://bitbucket.org/atlassian/atlassian-frontend/commits/6956eedc944) - Tighten type definitions on analytics events
34
+ - Updated dependencies
35
+
36
+ ## 8.2.0
37
+
38
+ ### Minor Changes
39
+
40
+ - [`945413f0b29`](https://bitbucket.org/atlassian/atlassian-frontend/commits/945413f0b29) - trigger page recovery when catchup returns 404
41
+ - [`06119d7fed4`](https://bitbucket.org/atlassian/atlassian-frontend/commits/06119d7fed4) - handle catchup after page recovery
42
+ - [`a66427c3fe5`](https://bitbucket.org/atlassian/atlassian-frontend/commits/a66427c3fe5) - Add analytics logging to error handling
43
+ - [`56a21fe7209`](https://bitbucket.org/atlassian/atlassian-frontend/commits/56a21fe7209) - Improve error handling logic
44
+ - [`77aee68579e`](https://bitbucket.org/atlassian/atlassian-frontend/commits/77aee68579e) - adding a connecting event to be emitted when collab-provider is first initialized
45
+
46
+ ### Patch Changes
47
+
48
+ - [`625f3c20f8c`](https://bitbucket.org/atlassian/atlassian-frontend/commits/625f3c20f8c) - Handle init errors
49
+ - Updated dependencies
50
+
3
51
  ## 8.1.0
4
52
 
5
53
  ### Minor Changes
@@ -1,46 +1,94 @@
1
1
  "use strict";
2
2
 
3
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
4
  Object.defineProperty(exports, "__esModule", {
6
5
  value: true
7
6
  });
8
- exports.triggerAnalyticsEvent = void 0;
9
-
7
+ exports.default = void 0;
8
+ var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
9
+ var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
10
10
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
11
-
12
11
  var _const = require("../helpers/const");
13
-
14
12
  var _versionWrapper = require("../version-wrapper");
15
-
13
+ var _singleton = require("../connectivity/singleton");
16
14
  function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
17
-
18
15
  function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
19
-
16
+ var EVENT_SUBJECT = 'collab';
17
+ var COLLAB_SERVICE;
18
+ (function (COLLAB_SERVICE) {
19
+ COLLAB_SERVICE["NCS"] = "ncs";
20
+ COLLAB_SERVICE["SYNCHRONY"] = "synchrony";
21
+ })(COLLAB_SERVICE || (COLLAB_SERVICE = {}));
20
22
  var triggerAnalyticsEvent = function triggerAnalyticsEvent(analyticsEvent, analyticsClient) {
21
23
  if (!analyticsClient) {
22
24
  return;
23
25
  }
24
-
25
26
  var payload = {
26
- actionSubject: _const.EVENT_SUBJECT,
27
+ actionSubject: EVENT_SUBJECT,
27
28
  attributes: _objectSpread({
28
29
  packageName: _versionWrapper.name,
29
30
  packageVersion: _versionWrapper.version,
30
- collabService: _const.COLLAB_SERVICE.NCS
31
+ collabService: COLLAB_SERVICE.NCS,
32
+ network: {
33
+ status: _singleton.network.getStatus()
34
+ }
31
35
  }, analyticsEvent.attributes),
32
36
  tags: ['editor'],
33
37
  action: analyticsEvent.eventAction,
34
38
  source: 'unknown' // Adds zero analytics value, but event validation throws an error if you don't add it :-(
39
+ };
35
40
 
36
- }; // Let the browser figure out
37
- // when it should send those events
41
+ if (analyticsEvent.eventAction === _const.EVENT_ACTION.ERROR) {
42
+ payload.nonPrivacySafeAttributes = analyticsEvent.nonPrivacySafeAttributes;
43
+ }
38
44
 
39
- var requestIdleCallbackFunction = window.requestIdleCallback;
40
- var runItLater = typeof requestIdleCallbackFunction === 'function' ? requestIdleCallbackFunction : window.requestAnimationFrame;
41
- runItLater(function () {
42
- analyticsClient.sendOperationalEvent(payload);
43
- });
45
+ // Let the browser figure out
46
+ // when it should send those events
47
+ try {
48
+ var requestIdleCallbackFunction = window.requestIdleCallback;
49
+ var runItLater = typeof requestIdleCallbackFunction === 'function' ? requestIdleCallbackFunction : window.requestAnimationFrame;
50
+ runItLater(function () {
51
+ analyticsClient.sendOperationalEvent(payload);
52
+ });
53
+ } catch (error) {
54
+ // silently fail for now https://product-fabric.atlassian.net/browse/ESS-3112
55
+ }
44
56
  };
45
-
46
- exports.triggerAnalyticsEvent = triggerAnalyticsEvent;
57
+ var AnalyticsHelper = /*#__PURE__*/function () {
58
+ function AnalyticsHelper(documentAri, analyticsClient) {
59
+ (0, _classCallCheck2.default)(this, AnalyticsHelper);
60
+ this.analyticsClient = analyticsClient;
61
+ this.documentAri = documentAri;
62
+ }
63
+ (0, _createClass2.default)(AnalyticsHelper, [{
64
+ key: "sendErrorEvent",
65
+ value: function sendErrorEvent(error, errorMessage) {
66
+ var errorAnalyticsEvent = {
67
+ eventAction: _const.EVENT_ACTION.ERROR,
68
+ attributes: {
69
+ documentAri: this.documentAri,
70
+ errorMessage: errorMessage
71
+ },
72
+ nonPrivacySafeAttributes: {
73
+ error: error
74
+ }
75
+ };
76
+ triggerAnalyticsEvent(errorAnalyticsEvent, this.analyticsClient);
77
+ }
78
+ }, {
79
+ key: "sendActionEvent",
80
+ value: function sendActionEvent(action, status, attributes // This breaks discriminated unions, because there is no obvious field to discriminate against any more
81
+ ) {
82
+ var analyticsEvent = {
83
+ eventAction: action,
84
+ attributes: _objectSpread({
85
+ documentAri: this.documentAri,
86
+ eventStatus: status
87
+ }, attributes)
88
+ };
89
+ triggerAnalyticsEvent(analyticsEvent, this.analyticsClient);
90
+ }
91
+ }]);
92
+ return AnalyticsHelper;
93
+ }();
94
+ exports.default = AnalyticsHelper;
@@ -4,82 +4,78 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.MEASURE_NAME = void 0;
7
- exports.clearMeasure = clearMeasure;
8
7
  exports.startMeasure = startMeasure;
9
8
  exports.stopMeasure = stopMeasure;
10
9
  var MEASURE_NAME;
11
10
  exports.MEASURE_NAME = MEASURE_NAME;
12
-
13
11
  (function (MEASURE_NAME) {
14
12
  MEASURE_NAME["SOCKET_CONNECT"] = "socketConnect";
15
13
  MEASURE_NAME["DOCUMENT_INIT"] = "documentInit";
16
- MEASURE_NAME["CONVERT_PM_TO_ADF"] = "convertPMToADF";
17
14
  MEASURE_NAME["COMMIT_UNCONFIRMED_STEPS"] = "commitUnconfirmedSteps";
15
+ MEASURE_NAME["PUBLISH_PAGE"] = "publishPage";
18
16
  })(MEASURE_NAME || (exports.MEASURE_NAME = MEASURE_NAME = {}));
19
-
20
17
  var isPerformanceAPIAvailable = function isPerformanceAPIAvailable() {
21
18
  return typeof window !== 'undefined' && 'performance' in window && ['measure', 'clearMeasures', 'clearMarks', 'getEntriesByName', 'getEntriesByType'].every(function (api) {
22
19
  return !!performance[api];
23
20
  });
24
21
  };
25
-
26
22
  var hasPerformanceAPIAvailable = isPerformanceAPIAvailable();
27
23
  var measureMap = new Map();
28
-
29
- function startMeasure(measureName) {
30
- if (!hasPerformanceAPIAvailable) {
31
- return;
24
+ function startMeasure(measureName, analyticsHelper) {
25
+ try {
26
+ if (!hasPerformanceAPIAvailable) {
27
+ return;
28
+ }
29
+ performance.mark("".concat(measureName, "::start"));
30
+ measureMap.set(measureName, performance.now());
31
+ } catch (error) {
32
+ analyticsHelper === null || analyticsHelper === void 0 ? void 0 : analyticsHelper.sendErrorEvent(error, 'Error while measuring performance when marking the start');
32
33
  }
33
-
34
- performance.mark("".concat(measureName, "::start"));
35
- measureMap.set(measureName, performance.now());
36
34
  }
37
-
38
- function stopMeasure(measureName, onMeasureComplete) {
39
- if (!hasPerformanceAPIAvailable) {
40
- return;
41
- } // `startMeasure` is not called with `measureName` before.
42
-
43
-
44
- if (!measureMap.get(measureName)) {
45
- return;
46
- }
47
-
48
- performance.mark("".concat(measureName, "::end"));
49
- var start = onMeasureComplete ? measureMap.get(measureName) : undefined;
50
-
35
+ function stopMeasure(measureName, analyticsHelper, onMeasureComplete) {
36
+ var start;
51
37
  try {
38
+ if (!hasPerformanceAPIAvailable) {
39
+ return;
40
+ }
41
+
42
+ // `startMeasure` is not called with `measureName` before.
43
+ if (!measureMap.get(measureName)) {
44
+ return;
45
+ }
46
+ performance.mark("".concat(measureName, "::end"));
47
+ start = onMeasureComplete ? measureMap.get(measureName) : undefined;
52
48
  performance.measure(measureName, "".concat(measureName, "::start"), "".concat(measureName, "::end"));
53
- } catch (e) {}
54
-
55
- var entry = performance.getEntriesByName(measureName).pop();
56
- clearMeasure(measureName);
57
- var measure;
58
-
59
- if (entry) {
60
- measure = {
61
- duration: entry.duration,
62
- startTime: entry.startTime
63
- };
64
- } else if (start) {
65
- measure = {
66
- duration: performance.now() - start,
67
- startTime: start
68
- };
49
+ } catch (error) {
50
+ analyticsHelper === null || analyticsHelper === void 0 ? void 0 : analyticsHelper.sendErrorEvent(error, 'Error while measuring performance when marking the end');
69
51
  }
70
-
71
- if (measure && onMeasureComplete) {
72
- onMeasureComplete(measure.duration, measure.startTime);
52
+ try {
53
+ var entry = performance.getEntriesByName(measureName).pop();
54
+ clearMeasure(measureName);
55
+ var measure;
56
+ if (entry) {
57
+ measure = {
58
+ duration: entry.duration,
59
+ startTime: entry.startTime
60
+ };
61
+ } else if (start) {
62
+ measure = {
63
+ duration: performance.now() - start,
64
+ startTime: start
65
+ };
66
+ }
67
+ if (measure && onMeasureComplete) {
68
+ onMeasureComplete(measure.duration, measure.startTime);
69
+ }
70
+ return measure;
71
+ } catch (error) {
72
+ analyticsHelper === null || analyticsHelper === void 0 ? void 0 : analyticsHelper.sendErrorEvent(error, 'Error while measuring performance when completing the measurement');
73
73
  }
74
-
75
- return measure;
76
74
  }
77
-
78
75
  function clearMeasure(measureName) {
79
76
  if (!hasPerformanceAPIAvailable) {
80
77
  return;
81
78
  }
82
-
83
79
  measureMap.delete(measureName);
84
80
  performance.clearMarks("".concat(measureName, "::start"));
85
81
  performance.clearMarks("".concat(measureName, "::end"));
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.createDocInitExp = void 0;
8
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
9
+ var _ufo = require("@atlaskit/ufo");
10
+ var createDocumentInitExperience = function createDocumentInitExperience() {
11
+ return new _ufo.UFOExperience('collab-provider.document-init', {
12
+ type: _ufo.ExperienceTypes.Load,
13
+ performanceType: _ufo.ExperiencePerformanceTypes.Custom,
14
+ performanceConfig: {
15
+ histogram: (0, _defineProperty2.default)({}, _ufo.ExperiencePerformanceTypes.Custom, {
16
+ duration: '250_500_1000_1500_2000_3000_4000'
17
+ })
18
+ }
19
+ });
20
+ };
21
+ var withErrorHandling = function withErrorHandling(createExperience, analyticsHelper) {
22
+ var initExperience;
23
+ try {
24
+ initExperience = createExperience();
25
+ } catch (error) {
26
+ analyticsHelper === null || analyticsHelper === void 0 ? void 0 : analyticsHelper.sendErrorEvent(error, 'Error while initialising a UFO experience');
27
+ }
28
+ return initExperience;
29
+ };
30
+ var createDocInitExp = function createDocInitExp(analyticsHelper) {
31
+ return withErrorHandling(createDocumentInitExperience, analyticsHelper);
32
+ };
33
+ exports.createDocInitExp = createDocInitExp;