@atlaskit/collab-provider 8.2.0 → 8.4.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 (72) hide show
  1. package/CHANGELOG.md +49 -0
  2. package/dist/cjs/analytics/index.js +67 -9
  3. package/dist/cjs/analytics/performance.js +46 -35
  4. package/dist/cjs/analytics/ufo.js +33 -0
  5. package/dist/cjs/channel.js +307 -162
  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 -2
  10. package/dist/cjs/{error-code-mapper.js → errors/error-code-mapper.js} +17 -2
  11. package/dist/cjs/errors/error-types.js +43 -0
  12. package/dist/cjs/helpers/const.js +4 -11
  13. package/dist/cjs/provider/catchup.js +8 -12
  14. package/dist/cjs/provider/commit-step.js +70 -0
  15. package/dist/cjs/provider/index.js +503 -566
  16. package/dist/cjs/provider/telepointers.js +78 -0
  17. package/dist/cjs/version-wrapper.js +1 -1
  18. package/dist/cjs/version.json +1 -1
  19. package/dist/es2019/analytics/index.js +58 -8
  20. package/dist/es2019/analytics/performance.js +47 -35
  21. package/dist/es2019/analytics/ufo.js +22 -0
  22. package/dist/es2019/channel.js +192 -93
  23. package/dist/es2019/connectivity/network.js +34 -0
  24. package/dist/es2019/connectivity/reconnect-helper.js +29 -0
  25. package/dist/es2019/connectivity/singleton.js +7 -0
  26. package/dist/es2019/disconnected-reason-mapper.js +17 -1
  27. package/dist/es2019/{error-code-mapper.js → errors/error-code-mapper.js} +17 -2
  28. package/dist/es2019/errors/error-types.js +13 -0
  29. package/dist/es2019/helpers/const.js +3 -8
  30. package/dist/es2019/provider/catchup.js +5 -12
  31. package/dist/es2019/provider/commit-step.js +57 -0
  32. package/dist/es2019/provider/index.js +428 -515
  33. package/dist/es2019/provider/telepointers.js +65 -0
  34. package/dist/es2019/version-wrapper.js +1 -1
  35. package/dist/es2019/version.json +1 -1
  36. package/dist/esm/analytics/index.js +68 -9
  37. package/dist/esm/analytics/performance.js +47 -35
  38. package/dist/esm/analytics/ufo.js +25 -0
  39. package/dist/esm/channel.js +308 -165
  40. package/dist/esm/connectivity/network.js +45 -0
  41. package/dist/esm/connectivity/reconnect-helper.js +42 -0
  42. package/dist/esm/connectivity/singleton.js +7 -0
  43. package/dist/esm/disconnected-reason-mapper.js +17 -1
  44. package/dist/esm/{error-code-mapper.js → errors/error-code-mapper.js} +17 -2
  45. package/dist/esm/errors/error-types.js +34 -0
  46. package/dist/esm/helpers/const.js +3 -8
  47. package/dist/esm/provider/catchup.js +8 -12
  48. package/dist/esm/provider/commit-step.js +62 -0
  49. package/dist/esm/provider/index.js +504 -567
  50. package/dist/esm/provider/telepointers.js +69 -0
  51. package/dist/esm/version-wrapper.js +1 -1
  52. package/dist/esm/version.json +1 -1
  53. package/dist/types/analytics/index.d.ts +8 -2
  54. package/dist/types/analytics/performance.d.ts +6 -5
  55. package/dist/types/analytics/ufo.d.ts +3 -0
  56. package/dist/types/channel.d.ts +16 -5
  57. package/dist/types/connectivity/network.d.ts +17 -0
  58. package/dist/types/connectivity/reconnect-helper.d.ts +8 -0
  59. package/dist/types/connectivity/singleton.d.ts +3 -0
  60. package/dist/types/disconnected-reason-mapper.d.ts +1 -0
  61. package/dist/types/{error-code-mapper.d.ts → errors/error-code-mapper.d.ts} +6 -2
  62. package/dist/types/errors/error-types.d.ts +8 -0
  63. package/dist/types/helpers/const.d.ts +133 -26
  64. package/dist/types/provider/commit-step.d.ts +14 -0
  65. package/dist/types/provider/index.d.ts +24 -6
  66. package/dist/types/provider/telepointers.d.ts +5 -0
  67. package/dist/types/socket-io-provider.d.ts +3 -2
  68. package/dist/types/types.d.ts +44 -12
  69. package/package.json +5 -6
  70. package/report.api.md +49 -3
  71. package/.vscode/settings.json +0 -3
  72. package/error-code-mapper/package.json +0 -15
package/CHANGELOG.md CHANGED
@@ -1,5 +1,54 @@
1
1
  # @atlaskit/collab-provider
2
2
 
3
+ ## 8.4.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [`eae755e434a`](https://bitbucket.org/atlassian/atlassian-frontend/commits/eae755e434a) - [ESS-3269] Don't return an empty document if something goes wrong when returning the final acknowledge state from the collab provider
8
+ - [`ca548613b49`](https://bitbucket.org/atlassian/atlassian-frontend/commits/ca548613b49) - ESS-3218 Add new configuration option throwOnNotConnected, which will throw not connected errors when attempting to save data whilst client is offline.
9
+ - [`329d3bb4e05`](https://bitbucket.org/atlassian/atlassian-frontend/commits/329d3bb4e05) - ESS-2962: added canCache flag in Config for Collab-provider. Channel now stores token locally if canCache flag is passed. Uses local token for reconnections if connection is lost for errors other that 401 and 403.
10
+ - [`1b9c38c7f48`](https://bitbucket.org/atlassian/atlassian-frontend/commits/1b9c38c7f48) - [ESS-3269] Added error handling and metrics for retrieving the current state
11
+
12
+ ### Patch Changes
13
+
14
+ - [`2a076027203`](https://bitbucket.org/atlassian/atlassian-frontend/commits/2a076027203) - NO-ISSUE fix the permission error on permissionTokenRefresh
15
+ - [`bde10feab09`](https://bitbucket.org/atlassian/atlassian-frontend/commits/bde10feab09) - Avoid using callbacks when initialising socket connection
16
+ - [`f9a6a671d14`](https://bitbucket.org/atlassian/atlassian-frontend/commits/f9a6a671d14) - add comment to indicate that disconnect handler will be called when Firefox reload
17
+ - Updated dependencies
18
+
19
+ ## 8.3.0
20
+
21
+ ### Minor Changes
22
+
23
+ - [`1d36e909618`](https://bitbucket.org/atlassian/atlassian-frontend/commits/1d36e909618) - Log error on document restore
24
+ - [`0529b1b833c`](https://bitbucket.org/atlassian/atlassian-frontend/commits/0529b1b833c) - Trigger catch up call on process steps failing
25
+ - [`4f005660ce2`](https://bitbucket.org/atlassian/atlassian-frontend/commits/4f005660ce2) - Log step commit errors to analytics
26
+ - [`6034004a812`](https://bitbucket.org/atlassian/atlassian-frontend/commits/6034004a812) - Log errors on reconnection failure
27
+ - [`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
28
+ - [`7f35ae7d99c`](https://bitbucket.org/atlassian/atlassian-frontend/commits/7f35ae7d99c) - [ESS-2815] Added network status to analytics events
29
+ - [`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
30
+ - [`611d9c643c6`](https://bitbucket.org/atlassian/atlassian-frontend/commits/611d9c643c6) - [ESS-3183] Retry syncing unconfirmed steps
31
+
32
+ ### Patch Changes
33
+
34
+ - [`fccc5952d49`](https://bitbucket.org/atlassian/atlassian-frontend/commits/fccc5952d49) - Revert emitting errors to Confluence by default
35
+ - [`0d25bcca6bb`](https://bitbucket.org/atlassian/atlassian-frontend/commits/0d25bcca6bb) - Added more comprehensive error handling for performance/analytics/ufo events in collab provider
36
+ - [`e97495c5748`](https://bitbucket.org/atlassian/atlassian-frontend/commits/e97495c5748) - Extract emitTelepointer logic from Provider
37
+ - [`260d1355cc6`](https://bitbucket.org/atlassian/atlassian-frontend/commits/260d1355cc6) - Reconnect collab provider immediately when browser emits online event.
38
+ - [`5725fb45955`](https://bitbucket.org/atlassian/atlassian-frontend/commits/5725fb45955) - Introduce a file for UFO.
39
+
40
+ Introduce a file for commit step logic, which was already separate from the provider class
41
+
42
+ - [`2b648e4db70`](https://bitbucket.org/atlassian/atlassian-frontend/commits/2b648e4db70) - NO-ISSUE Remove the analytics fall-back after validating acks work as expected
43
+ - [`35c5e7dd9d5`](https://bitbucket.org/atlassian/atlassian-frontend/commits/35c5e7dd9d5) - NO-ISSUE deduplicate the analytics types dependency (again)
44
+ - [`1c255047a29`](https://bitbucket.org/atlassian/atlassian-frontend/commits/1c255047a29) - improve catchup error handling
45
+ - [`c9ad25cf224`](https://bitbucket.org/atlassian/atlassian-frontend/commits/c9ad25cf224) - [ESS-3183] Create abstraction around sending analytics events for errors or action events
46
+ - [`607a34f4426`](https://bitbucket.org/atlassian/atlassian-frontend/commits/607a34f4426) - Pass through the analytics web client in places it was missing
47
+ - [`efb112b06ab`](https://bitbucket.org/atlassian/atlassian-frontend/commits/efb112b06ab) - Move disonnected reason mapper
48
+ - [`9e6ceda8977`](https://bitbucket.org/atlassian/atlassian-frontend/commits/9e6ceda8977) - Provide the reason for a page reset
49
+ - [`6956eedc944`](https://bitbucket.org/atlassian/atlassian-frontend/commits/6956eedc944) - Tighten type definitions on analytics events
50
+ - Updated dependencies
51
+
3
52
  ## 8.2.0
4
53
 
5
54
  ### Minor Changes
@@ -4,34 +4,92 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
4
4
  Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
- exports.triggerAnalyticsEvent = void 0;
7
+ exports.default = void 0;
8
+ var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
9
+ var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
8
10
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
9
11
  var _const = require("../helpers/const");
10
12
  var _versionWrapper = require("../version-wrapper");
13
+ var _singleton = require("../connectivity/singleton");
11
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; }
12
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; }
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 = {}));
13
22
  var triggerAnalyticsEvent = function triggerAnalyticsEvent(analyticsEvent, analyticsClient) {
14
23
  if (!analyticsClient) {
15
24
  return;
16
25
  }
17
26
  var payload = {
18
- actionSubject: _const.EVENT_SUBJECT,
27
+ actionSubject: EVENT_SUBJECT,
19
28
  attributes: _objectSpread({
20
29
  packageName: _versionWrapper.name,
21
30
  packageVersion: _versionWrapper.version,
22
- collabService: _const.COLLAB_SERVICE.NCS
31
+ collabService: COLLAB_SERVICE.NCS,
32
+ network: {
33
+ status: _singleton.network.getStatus()
34
+ }
23
35
  }, analyticsEvent.attributes),
24
36
  tags: ['editor'],
25
37
  action: analyticsEvent.eventAction,
26
38
  source: 'unknown' // Adds zero analytics value, but event validation throws an error if you don't add it :-(
27
39
  };
28
40
 
41
+ if (analyticsEvent.eventAction === _const.EVENT_ACTION.ERROR) {
42
+ payload.nonPrivacySafeAttributes = analyticsEvent.nonPrivacySafeAttributes;
43
+ }
44
+
29
45
  // Let the browser figure out
30
46
  // when it should send those events
31
- var requestIdleCallbackFunction = window.requestIdleCallback;
32
- var runItLater = typeof requestIdleCallbackFunction === 'function' ? requestIdleCallbackFunction : window.requestAnimationFrame;
33
- runItLater(function () {
34
- analyticsClient.sendOperationalEvent(payload);
35
- });
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
+ }
36
56
  };
37
- 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
+ errorName: error instanceof Error ? error.name : undefined
72
+ },
73
+ nonPrivacySafeAttributes: {
74
+ error: error
75
+ }
76
+ };
77
+ triggerAnalyticsEvent(errorAnalyticsEvent, this.analyticsClient);
78
+ }
79
+ }, {
80
+ key: "sendActionEvent",
81
+ value: function sendActionEvent(action, status, attributes // This breaks discriminated unions, because there is no obvious field to discriminate against any more
82
+ ) {
83
+ var analyticsEvent = {
84
+ eventAction: action,
85
+ attributes: _objectSpread({
86
+ documentAri: this.documentAri,
87
+ eventStatus: status
88
+ }, attributes)
89
+ };
90
+ triggerAnalyticsEvent(analyticsEvent, this.analyticsClient);
91
+ }
92
+ }]);
93
+ return AnalyticsHelper;
94
+ }();
95
+ exports.default = AnalyticsHelper;
@@ -4,7 +4,6 @@ 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;
@@ -12,8 +11,9 @@ exports.MEASURE_NAME = MEASURE_NAME;
12
11
  (function (MEASURE_NAME) {
13
12
  MEASURE_NAME["SOCKET_CONNECT"] = "socketConnect";
14
13
  MEASURE_NAME["DOCUMENT_INIT"] = "documentInit";
15
- MEASURE_NAME["CONVERT_PM_TO_ADF"] = "convertPMToADF";
16
14
  MEASURE_NAME["COMMIT_UNCONFIRMED_STEPS"] = "commitUnconfirmedSteps";
15
+ MEASURE_NAME["PUBLISH_PAGE"] = "publishPage";
16
+ MEASURE_NAME["GET_CURRENT_STATE"] = "getCurrentState";
17
17
  })(MEASURE_NAME || (exports.MEASURE_NAME = MEASURE_NAME = {}));
18
18
  var isPerformanceAPIAvailable = function isPerformanceAPIAvailable() {
19
19
  return typeof window !== 'undefined' && 'performance' in window && ['measure', 'clearMeasures', 'clearMarks', 'getEntriesByName', 'getEntriesByType'].every(function (api) {
@@ -22,45 +22,56 @@ var isPerformanceAPIAvailable = function isPerformanceAPIAvailable() {
22
22
  };
23
23
  var hasPerformanceAPIAvailable = isPerformanceAPIAvailable();
24
24
  var measureMap = new Map();
25
- function startMeasure(measureName) {
26
- if (!hasPerformanceAPIAvailable) {
27
- return;
25
+ function startMeasure(measureName, analyticsHelper) {
26
+ try {
27
+ if (!hasPerformanceAPIAvailable) {
28
+ return;
29
+ }
30
+ performance.mark("".concat(measureName, "::start"));
31
+ measureMap.set(measureName, performance.now());
32
+ } catch (error) {
33
+ analyticsHelper === null || analyticsHelper === void 0 ? void 0 : analyticsHelper.sendErrorEvent(error, 'Error while measuring performance when marking the start');
28
34
  }
29
- performance.mark("".concat(measureName, "::start"));
30
- measureMap.set(measureName, performance.now());
31
35
  }
32
- function stopMeasure(measureName, onMeasureComplete) {
33
- if (!hasPerformanceAPIAvailable) {
34
- return;
35
- }
36
-
37
- // `startMeasure` is not called with `measureName` before.
38
- if (!measureMap.get(measureName)) {
39
- return;
40
- }
41
- performance.mark("".concat(measureName, "::end"));
42
- var start = onMeasureComplete ? measureMap.get(measureName) : undefined;
36
+ function stopMeasure(measureName, analyticsHelper, onMeasureComplete) {
37
+ var start;
43
38
  try {
39
+ if (!hasPerformanceAPIAvailable) {
40
+ return;
41
+ }
42
+
43
+ // `startMeasure` is not called with `measureName` before.
44
+ if (!measureMap.get(measureName)) {
45
+ return;
46
+ }
47
+ performance.mark("".concat(measureName, "::end"));
48
+ start = onMeasureComplete ? measureMap.get(measureName) : undefined;
44
49
  performance.measure(measureName, "".concat(measureName, "::start"), "".concat(measureName, "::end"));
45
- } catch (e) {}
46
- var entry = performance.getEntriesByName(measureName).pop();
47
- clearMeasure(measureName);
48
- var measure;
49
- if (entry) {
50
- measure = {
51
- duration: entry.duration,
52
- startTime: entry.startTime
53
- };
54
- } else if (start) {
55
- measure = {
56
- duration: performance.now() - start,
57
- startTime: start
58
- };
50
+ } catch (error) {
51
+ analyticsHelper === null || analyticsHelper === void 0 ? void 0 : analyticsHelper.sendErrorEvent(error, 'Error while measuring performance when marking the end');
59
52
  }
60
- if (measure && onMeasureComplete) {
61
- onMeasureComplete(measure.duration, measure.startTime);
53
+ try {
54
+ var entry = performance.getEntriesByName(measureName).pop();
55
+ clearMeasure(measureName);
56
+ var measure;
57
+ if (entry) {
58
+ measure = {
59
+ duration: entry.duration,
60
+ startTime: entry.startTime
61
+ };
62
+ } else if (start) {
63
+ measure = {
64
+ duration: performance.now() - start,
65
+ startTime: start
66
+ };
67
+ }
68
+ if (measure && onMeasureComplete) {
69
+ onMeasureComplete(measure.duration, measure.startTime);
70
+ }
71
+ return measure;
72
+ } catch (error) {
73
+ analyticsHelper === null || analyticsHelper === void 0 ? void 0 : analyticsHelper.sendErrorEvent(error, 'Error while measuring performance when completing the measurement');
62
74
  }
63
- return measure;
64
75
  }
65
76
  function clearMeasure(measureName) {
66
77
  if (!hasPerformanceAPIAvailable) {
@@ -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;