@atlaskit/collab-provider 8.2.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 (67) hide show
  1. package/CHANGELOG.md +33 -0
  2. package/dist/cjs/analytics/index.js +66 -9
  3. package/dist/cjs/analytics/performance.js +45 -35
  4. package/dist/cjs/analytics/ufo.js +33 -0
  5. package/dist/cjs/channel.js +89 -54
  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 +16 -1
  11. package/dist/cjs/helpers/const.js +5 -10
  12. package/dist/cjs/provider/catchup.js +8 -12
  13. package/dist/cjs/provider/commit-step.js +66 -0
  14. package/dist/cjs/provider/index.js +480 -558
  15. package/dist/cjs/provider/telepointers.js +78 -0
  16. package/dist/cjs/version-wrapper.js +1 -1
  17. package/dist/cjs/version.json +1 -1
  18. package/dist/es2019/analytics/index.js +57 -8
  19. package/dist/es2019/analytics/performance.js +46 -35
  20. package/dist/es2019/analytics/ufo.js +22 -0
  21. package/dist/es2019/channel.js +89 -58
  22. package/dist/es2019/connectivity/network.js +34 -0
  23. package/dist/es2019/connectivity/reconnect-helper.js +29 -0
  24. package/dist/es2019/connectivity/singleton.js +7 -0
  25. package/dist/es2019/disconnected-reason-mapper.js +17 -1
  26. package/dist/es2019/error-code-mapper.js +16 -1
  27. package/dist/es2019/helpers/const.js +4 -7
  28. package/dist/es2019/provider/catchup.js +5 -12
  29. package/dist/es2019/provider/commit-step.js +53 -0
  30. package/dist/es2019/provider/index.js +397 -496
  31. package/dist/es2019/provider/telepointers.js +65 -0
  32. package/dist/es2019/version-wrapper.js +1 -1
  33. package/dist/es2019/version.json +1 -1
  34. package/dist/esm/analytics/index.js +67 -9
  35. package/dist/esm/analytics/performance.js +46 -35
  36. package/dist/esm/analytics/ufo.js +25 -0
  37. package/dist/esm/channel.js +89 -56
  38. package/dist/esm/connectivity/network.js +45 -0
  39. package/dist/esm/connectivity/reconnect-helper.js +42 -0
  40. package/dist/esm/connectivity/singleton.js +7 -0
  41. package/dist/esm/disconnected-reason-mapper.js +17 -1
  42. package/dist/esm/error-code-mapper.js +16 -1
  43. package/dist/esm/helpers/const.js +4 -7
  44. package/dist/esm/provider/catchup.js +8 -12
  45. package/dist/esm/provider/commit-step.js +58 -0
  46. package/dist/esm/provider/index.js +482 -559
  47. package/dist/esm/provider/telepointers.js +69 -0
  48. package/dist/esm/version-wrapper.js +1 -1
  49. package/dist/esm/version.json +1 -1
  50. package/dist/types/analytics/index.d.ts +8 -2
  51. package/dist/types/analytics/performance.d.ts +5 -5
  52. package/dist/types/analytics/ufo.d.ts +3 -0
  53. package/dist/types/channel.d.ts +11 -5
  54. package/dist/types/connectivity/network.d.ts +17 -0
  55. package/dist/types/connectivity/reconnect-helper.d.ts +8 -0
  56. package/dist/types/connectivity/singleton.d.ts +3 -0
  57. package/dist/types/disconnected-reason-mapper.d.ts +1 -0
  58. package/dist/types/error-code-mapper.d.ts +5 -1
  59. package/dist/types/helpers/const.d.ts +109 -25
  60. package/dist/types/provider/commit-step.d.ts +14 -0
  61. package/dist/types/provider/index.d.ts +9 -5
  62. package/dist/types/provider/telepointers.d.ts +5 -0
  63. package/dist/types/socket-io-provider.d.ts +2 -1
  64. package/dist/types/types.d.ts +27 -10
  65. package/package.json +4 -5
  66. package/report.api.md +29 -0
  67. package/.vscode/settings.json +0 -3
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.socketIOReasons = exports.DisconnectReason = void 0;
6
+ exports.socketIOReasons = exports.disconnectedReasonMapper = exports.DisconnectReason = void 0;
7
7
  // See https://socket.io/docs/v3/client-socket-instance#disconnect for emitted reasons
8
8
  var socketIOReasons = {
9
9
  IO_CLIENT_DISCONNECT: 'io client disconnect',
@@ -26,4 +26,21 @@ exports.DisconnectReason = DisconnectReason;
26
26
  DisconnectReason["SOCKET_ERROR"] = "SOCKET_ERROR";
27
27
  DisconnectReason["SOCKET_TIMEOUT"] = "SOCKET_TIMEOUT";
28
28
  DisconnectReason["UNKNOWN_DISCONNECT"] = "UNKNOWN_DISCONNECT";
29
- })(DisconnectReason || (exports.DisconnectReason = DisconnectReason = {}));
29
+ })(DisconnectReason || (exports.DisconnectReason = DisconnectReason = {}));
30
+ var disconnectedReasonMapper = function disconnectedReasonMapper(reason) {
31
+ switch (reason) {
32
+ case socketIOReasons.IO_CLIENT_DISCONNECT:
33
+ return DisconnectReason.CLIENT_DISCONNECT;
34
+ case socketIOReasons.IO_SERVER_DISCONNECT:
35
+ return DisconnectReason.SERVER_DISCONNECT;
36
+ case socketIOReasons.TRANSPORT_CLOSED:
37
+ return DisconnectReason.SOCKET_CLOSED;
38
+ case socketIOReasons.TRANSPORT_ERROR:
39
+ return DisconnectReason.SOCKET_ERROR;
40
+ case socketIOReasons.PING_TIMEOUT:
41
+ return DisconnectReason.SOCKET_TIMEOUT;
42
+ default:
43
+ return DisconnectReason.UNKNOWN_DISCONNECT;
44
+ }
45
+ };
46
+ exports.disconnectedReasonMapper = disconnectedReasonMapper;
@@ -31,6 +31,10 @@ var ErrorCodeMapper = {
31
31
  code: 'FAIL_TO_SAVE',
32
32
  message: 'Collab service is not able to save changes'
33
33
  },
34
+ restoreError: {
35
+ code: 'DOCUMENT_RESTORE_ERROR',
36
+ message: 'Collab service unable to restore document'
37
+ },
34
38
  internalError: {
35
39
  code: 'INTERNAL_SERVICE_ERROR',
36
40
  message: 'Collab service has experienced an internal server error'
@@ -62,12 +66,23 @@ var errorCodeMapper = function errorCodeMapper(error) {
62
66
  code: ErrorCodeMapper.failToSave.code,
63
67
  message: ErrorCodeMapper.failToSave.message
64
68
  };
65
- default:
69
+ case 'DOCUMENT_RESTORE_ERROR':
70
+ return {
71
+ status: 500,
72
+ code: ErrorCodeMapper.restoreError.code,
73
+ message: ErrorCodeMapper.restoreError.message
74
+ };
75
+ // Temporarily re-added so we don't emit errors to Confluence by default as they will disconnect the collab provider
76
+ case 'CATCHUP_FAILED':
77
+ case 'GET_QUERY_TIME_OUT':
78
+ case 'INIT_DATA_LOAD_FAILED':
66
79
  return {
67
80
  status: 500,
68
81
  code: ErrorCodeMapper.internalError.code,
69
82
  message: ErrorCodeMapper.internalError.message
70
83
  };
84
+ default:
85
+ break;
71
86
  }
72
87
  };
73
88
  exports.errorCodeMapper = errorCodeMapper;
@@ -3,28 +3,23 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.EVENT_SUBJECT = exports.EVENT_STATUS = exports.EVENT_ACTION = exports.CONFLUENCE = exports.COLLAB_SERVICE = exports.ADD_STEPS_TYPE = exports.ACK_MAX_TRY = void 0;
7
- var EVENT_SUBJECT = 'collab';
8
- exports.EVENT_SUBJECT = EVENT_SUBJECT;
9
- var COLLAB_SERVICE;
10
- exports.COLLAB_SERVICE = COLLAB_SERVICE;
11
- (function (COLLAB_SERVICE) {
12
- COLLAB_SERVICE["NCS"] = "ncs";
13
- COLLAB_SERVICE["SYNCHRONY"] = "synchrony";
14
- })(COLLAB_SERVICE || (exports.COLLAB_SERVICE = COLLAB_SERVICE = {}));
6
+ exports.EVENT_STATUS = exports.EVENT_ACTION = exports.CONFLUENCE = exports.ADD_STEPS_TYPE = exports.ACK_MAX_TRY = void 0;
15
7
  var EVENT_ACTION;
16
8
  exports.EVENT_ACTION = EVENT_ACTION;
17
9
  (function (EVENT_ACTION) {
18
10
  EVENT_ACTION["CONNECTION"] = "connection";
11
+ EVENT_ACTION["RECONNECTION"] = "reconnection";
19
12
  EVENT_ACTION["CATCHUP"] = "catchup";
20
13
  EVENT_ACTION["DOCUMENT_INIT"] = "documentInit";
21
14
  EVENT_ACTION["ADD_STEPS"] = "addSteps";
22
- EVENT_ACTION["CONVERT_PM_TO_ADF"] = "convertPMToADF";
23
15
  EVENT_ACTION["UPDATE_PARTICIPANTS"] = "updateParticipants";
24
16
  EVENT_ACTION["COMMIT_UNCONFIRMED_STEPS"] = "commitUnconfirmedSteps";
25
17
  EVENT_ACTION["REINITIALISE_DOCUMENT"] = "reinitialiseDocument";
26
18
  EVENT_ACTION["INIT_PROVIDER"] = "initProvider";
27
19
  EVENT_ACTION["ERROR"] = "error";
20
+ EVENT_ACTION["MEASURE_PERFORMANCE"] = "measurePerformance";
21
+ EVENT_ACTION["INIT_UFO_EXPERIENCE"] = "initUFOExperience";
22
+ EVENT_ACTION["PUBLISH_PAGE"] = "publishPage";
28
23
  })(EVENT_ACTION || (exports.EVENT_ACTION = EVENT_ACTION = {}));
29
24
  var EVENT_STATUS;
30
25
  exports.EVENT_STATUS = EVENT_STATUS;
@@ -42,7 +42,7 @@ function rebaseSteps(steps, mapping) {
42
42
  }
43
43
  var catchup = /*#__PURE__*/function () {
44
44
  var _ref = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(opt) {
45
- var _yield$opt$fetchCatch, doc, serverStepMaps, serverVersion, metadata, currentPmVersion, _ref2, unconfirmedSteps, _ref3, _unconfirmedSteps, stepMaps, mapping, newUnconfirmedSteps;
45
+ var _yield$opt$fetchCatch, doc, serverStepMaps, serverVersion, metadata, currentPmVersion, unconfirmedSteps, _unconfirmedSteps, stepMaps, mapping, newUnconfirmedSteps;
46
46
  return _regenerator.default.wrap(function _callee$(_context) {
47
47
  while (1) {
48
48
  switch (_context.prev = _context.next) {
@@ -61,9 +61,7 @@ var catchup = /*#__PURE__*/function () {
61
61
  logger("Could not determine server version");
62
62
  } else if (serverVersion <= currentPmVersion) {
63
63
  // there are no step maps in this case after page recovery
64
- _ref2 = opt.getUnconfirmedSteps() || {
65
- steps: []
66
- }, unconfirmedSteps = _ref2.steps; // replace the entire document
64
+ unconfirmedSteps = opt.getUnconfirmedSteps(); // replace the entire document
67
65
  logger("Replacing document: ".concat(doc));
68
66
  logger("getting metadata: ".concat(metadata));
69
67
  // Replace local document and version number
@@ -73,15 +71,13 @@ var catchup = /*#__PURE__*/function () {
73
71
  metadata: metadata,
74
72
  reserveCursor: true
75
73
  });
76
- if (unconfirmedSteps.length) {
74
+ if (unconfirmedSteps !== null && unconfirmedSteps !== void 0 && unconfirmedSteps.length) {
77
75
  opt.applyLocalSteps(unconfirmedSteps);
78
76
  }
79
77
  } else {
80
78
  // Please, do not use those steps inside of async
81
79
  // method. That will lead to outdated steps
82
- _ref3 = opt.getUnconfirmedSteps() || {
83
- steps: []
84
- }, _unconfirmedSteps = _ref3.steps;
80
+ _unconfirmedSteps = opt.getUnconfirmedSteps();
85
81
  logger("Too far behind[current: v".concat(currentPmVersion, ", server: v").concat(serverVersion, ". ").concat(serverStepMaps.length, " steps need to catchup]"));
86
82
  /**
87
83
  * Remove steps from queue where the version is older than
@@ -108,12 +104,12 @@ var catchup = /*#__PURE__*/function () {
108
104
  // steps back into the editor, so we don't lose any data. But before that, we need to rebase
109
105
  // those steps since their position could be changed after replacing.
110
106
  // https://prosemirror.net/docs/guide/#transform.rebasing
111
- if (_unconfirmedSteps.length) {
107
+ if (_unconfirmedSteps !== null && _unconfirmedSteps !== void 0 && _unconfirmedSteps.length) {
112
108
  // Create StepMap from StepMap JSON
113
109
  // eslint-disable-next-line no-unused-vars
114
- stepMaps = serverStepMaps.map(function (_ref4) {
115
- var ranges = _ref4.ranges,
116
- inverted = _ref4.inverted;
110
+ stepMaps = serverStepMaps.map(function (_ref2) {
111
+ var ranges = _ref2.ranges,
112
+ inverted = _ref2.inverted;
117
113
  // Due to @types/prosemirror-transform mismatch with the actual
118
114
  // constructor, hack to set the `inverted`.
119
115
  var stepMap = new _prosemirrorTransform.StepMap(ranges);
@@ -0,0 +1,66 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.commitStep = void 0;
8
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
9
+ var _countBy = _interopRequireDefault(require("lodash/countBy"));
10
+ var _const = require("../helpers/const");
11
+ var _types = require("../types");
12
+ 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; }
13
+ 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; }
14
+ var commitStep = function commitStep(_ref) {
15
+ var channel = _ref.channel,
16
+ steps = _ref.steps,
17
+ version = _ref.version,
18
+ userId = _ref.userId,
19
+ clientId = _ref.clientId,
20
+ onStepsAdded = _ref.onStepsAdded,
21
+ onErrorHandled = _ref.onErrorHandled,
22
+ analyticsHelper = _ref.analyticsHelper;
23
+ var stepsWithClientAndUserId = steps.map(function (step) {
24
+ return _objectSpread(_objectSpread({}, step.toJSON()), {}, {
25
+ clientId: clientId,
26
+ userId: userId
27
+ });
28
+ });
29
+ var start = new Date().getTime();
30
+ channel.broadcast('steps:commit', {
31
+ steps: stepsWithClientAndUserId,
32
+ version: version,
33
+ userId: userId
34
+ }, function (response) {
35
+ var latency = new Date().getTime() - start;
36
+ if (response.type === _types.AcknowledgementResponseTypes.SUCCESS) {
37
+ onStepsAdded({
38
+ steps: stepsWithClientAndUserId,
39
+ version: response.version
40
+ });
41
+ analyticsHelper === null || analyticsHelper === void 0 ? void 0 : analyticsHelper.sendActionEvent(_const.EVENT_ACTION.ADD_STEPS, _const.EVENT_STATUS.SUCCESS, {
42
+ type: _const.ADD_STEPS_TYPE.ACCEPTED,
43
+ latency: latency,
44
+ stepType: (0, _countBy.default)(stepsWithClientAndUserId, function (stepWithClientAndUserId) {
45
+ return stepWithClientAndUserId.stepType;
46
+ })
47
+ });
48
+ } else if (response.type === _types.AcknowledgementResponseTypes.ERROR) {
49
+ var _response$error, _response$error$data, _response$error2, _response$error2$data;
50
+ onErrorHandled(response.error);
51
+ analyticsHelper === null || analyticsHelper === void 0 ? void 0 : analyticsHelper.sendActionEvent(_const.EVENT_ACTION.ADD_STEPS, _const.EVENT_STATUS.FAILURE, {
52
+ // User tried committing steps but they were rejected because:
53
+ // - HEAD_VERSION_UPDATE_FAILED: the collab service's latest stored step tail version didn't correspond to the head version of the first step submitted
54
+ // - VERSION_NUMBER_ALREADY_EXISTS: while storing the steps there was a conflict meaning someone else wrote steps into the database more quickly
55
+ type: ((_response$error = response.error) === null || _response$error === void 0 ? void 0 : (_response$error$data = _response$error.data) === null || _response$error$data === void 0 ? void 0 : _response$error$data.code) === 'HEAD_VERSION_UPDATE_FAILED' || ((_response$error2 = response.error) === null || _response$error2 === void 0 ? void 0 : (_response$error2$data = _response$error2.data) === null || _response$error2$data === void 0 ? void 0 : _response$error2$data.code) === 'VERSION_NUMBER_ALREADY_EXISTS' ? _const.ADD_STEPS_TYPE.REJECTED : _const.ADD_STEPS_TYPE.ERROR,
56
+ latency: latency
57
+ });
58
+ analyticsHelper === null || analyticsHelper === void 0 ? void 0 : analyticsHelper.sendErrorEvent(response.error, 'Error while adding steps - Acknowledgement Error');
59
+ } else {
60
+ analyticsHelper === null || analyticsHelper === void 0 ? void 0 : analyticsHelper.sendErrorEvent(
61
+ // @ts-expect-error We didn't type the invalid type case
62
+ new Error("Response type: ".concat((response === null || response === void 0 ? void 0 : response.type) || 'No response type')), 'Error while adding steps - Invalid Acknowledgement');
63
+ }
64
+ });
65
+ };
66
+ exports.commitStep = commitStep;