@atlaskit/collab-provider 10.3.4 → 10.4.1

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 (51) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/afm-cc/tsconfig.json +6 -0
  3. package/afm-jira/tsconfig.json +6 -0
  4. package/dist/cjs/analytics/analytics-helper.js +0 -2
  5. package/dist/cjs/api/api.js +26 -14
  6. package/dist/cjs/channel.js +0 -2
  7. package/dist/cjs/document/catchupv2.js +24 -10
  8. package/dist/cjs/document/document-service.js +35 -33
  9. package/dist/cjs/helpers/const.js +2 -1
  10. package/dist/cjs/helpers/utils.js +216 -2
  11. package/dist/cjs/participants/participants-service.js +0 -2
  12. package/dist/cjs/provider/commit-step.js +12 -1
  13. package/dist/cjs/provider/index.js +69 -33
  14. package/dist/cjs/version-wrapper.js +1 -1
  15. package/dist/es2019/analytics/analytics-helper.js +0 -2
  16. package/dist/es2019/api/api.js +13 -1
  17. package/dist/es2019/channel.js +0 -2
  18. package/dist/es2019/document/catchupv2.js +20 -6
  19. package/dist/es2019/document/document-service.js +8 -6
  20. package/dist/es2019/helpers/const.js +2 -1
  21. package/dist/es2019/helpers/utils.js +159 -1
  22. package/dist/es2019/participants/participants-service.js +0 -2
  23. package/dist/es2019/provider/commit-step.js +13 -1
  24. package/dist/es2019/provider/index.js +40 -17
  25. package/dist/es2019/version-wrapper.js +1 -1
  26. package/dist/esm/analytics/analytics-helper.js +0 -2
  27. package/dist/esm/api/api.js +26 -14
  28. package/dist/esm/channel.js +0 -2
  29. package/dist/esm/document/catchupv2.js +25 -11
  30. package/dist/esm/document/document-service.js +35 -33
  31. package/dist/esm/helpers/const.js +2 -1
  32. package/dist/esm/helpers/utils.js +212 -1
  33. package/dist/esm/participants/participants-service.js +0 -2
  34. package/dist/esm/provider/commit-step.js +12 -1
  35. package/dist/esm/provider/index.js +71 -35
  36. package/dist/esm/version-wrapper.js +1 -1
  37. package/dist/types/document/document-service.d.ts +1 -0
  38. package/dist/types/errors/custom-errors.d.ts +1 -1
  39. package/dist/types/helpers/const.d.ts +16 -2
  40. package/dist/types/helpers/utils.d.ts +49 -0
  41. package/dist/types/index.d.ts +1 -1
  42. package/dist/types/provider/commit-step.d.ts +2 -1
  43. package/dist/types/types.d.ts +3 -2
  44. package/dist/types-ts4.5/document/document-service.d.ts +1 -0
  45. package/dist/types-ts4.5/errors/custom-errors.d.ts +1 -1
  46. package/dist/types-ts4.5/helpers/const.d.ts +16 -2
  47. package/dist/types-ts4.5/helpers/utils.d.ts +49 -0
  48. package/dist/types-ts4.5/index.d.ts +1 -1
  49. package/dist/types-ts4.5/provider/commit-step.d.ts +2 -1
  50. package/dist/types-ts4.5/types.d.ts +3 -2
  51. package/package.json +16 -2
package/CHANGELOG.md CHANGED
@@ -1,5 +1,25 @@
1
1
  # @atlaskit/collab-provider
2
2
 
3
+ ## 10.4.1
4
+
5
+ ### Patch Changes
6
+
7
+ - [#104569](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/pull-requests/104569)
8
+ [`b79a89c03faf9`](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/commits/b79a89c03faf9) -
9
+ log obfuscated steps for transactions in view only
10
+
11
+ ## 10.4.0
12
+
13
+ ### Minor Changes
14
+
15
+ - [#102499](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/pull-requests/102499)
16
+ [`c1bfe8b68a35e`](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/commits/c1bfe8b68a35e) -
17
+ log obfuscated steps in collab provider when catchup out of sync
18
+
19
+ ### Patch Changes
20
+
21
+ - Updated dependencies
22
+
3
23
  ## 10.3.4
4
24
 
5
25
  ### Patch Changes
@@ -17,6 +17,9 @@
17
17
  "../src/**/test.*"
18
18
  ],
19
19
  "references": [
20
+ {
21
+ "path": "../../adf-utils/afm-cc/tsconfig.json"
22
+ },
20
23
  {
21
24
  "path": "../../../analytics/analytics-gas-types/afm-cc/tsconfig.json"
22
25
  },
@@ -38,6 +41,9 @@
38
41
  {
39
42
  "path": "../../prosemirror-collab/afm-cc/tsconfig.json"
40
43
  },
44
+ {
45
+ "path": "../../../react-ufo/atlaskit/afm-cc/tsconfig.json"
46
+ },
41
47
  {
42
48
  "path": "../../../data/ufo-external/afm-cc/tsconfig.json"
43
49
  },
@@ -17,6 +17,9 @@
17
17
  "../src/**/test.*"
18
18
  ],
19
19
  "references": [
20
+ {
21
+ "path": "../../adf-utils/afm-jira/tsconfig.json"
22
+ },
20
23
  {
21
24
  "path": "../../../analytics/analytics-gas-types/afm-jira/tsconfig.json"
22
25
  },
@@ -38,6 +41,9 @@
38
41
  {
39
42
  "path": "../../prosemirror-collab/afm-jira/tsconfig.json"
40
43
  },
44
+ {
45
+ "path": "../../../react-ufo/atlaskit/afm-jira/tsconfig.json"
46
+ },
41
47
  {
42
48
  "path": "../../../data/ufo-external/afm-jira/tsconfig.json"
43
49
  },
@@ -71,8 +71,6 @@ var triggerAnalyticsEvent = function triggerAnalyticsEvent(analyticsEvent, analy
71
71
  }
72
72
  };
73
73
  var AnalyticsHelper = exports.default = /*#__PURE__*/function () {
74
- // Ignored via go/ees005
75
- // eslint-disable-next-line @typescript-eslint/max-params
76
74
  function AnalyticsHelper(documentAri, subProduct, analyticsClient, getAnalyticsClient) {
77
75
  (0, _classCallCheck2.default)(this, AnalyticsHelper);
78
76
  this.documentAri = documentAri;
@@ -15,6 +15,9 @@ var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/ge
15
15
  var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
16
16
  var _wrapNativeSuper2 = _interopRequireDefault(require("@babel/runtime/helpers/wrapNativeSuper"));
17
17
  var _utils = require("../helpers/utils");
18
+ var _experienceTraceIdContext = require("@atlaskit/react-ufo/experience-trace-id-context");
19
+ var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
20
+ var _featureFlagsAccessed = require("@atlaskit/react-ufo/feature-flags-accessed");
18
21
  function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
19
22
  function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2.default)(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
20
23
  function _callSuper(t, o, e) { return o = (0, _getPrototypeOf2.default)(o), (0, _possibleConstructorReturn2.default)(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], (0, _getPrototypeOf2.default)(t).constructor) : o.apply(t, e)); }
@@ -46,7 +49,7 @@ var Api = exports.Api = /*#__PURE__*/function () {
46
49
  (0, _classCallCheck2.default)(this, Api);
47
50
  (0, _defineProperty2.default)(this, "submitComment", /*#__PURE__*/function () {
48
51
  var _ref = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(steps, version) {
49
- var reqBody, url, fetchOptions;
52
+ var reqBody, url, tracingHeaderEnabled, tracingHeaders, fetchOptions;
50
53
  return _regenerator.default.wrap(function _callee$(_context) {
51
54
  while (1) switch (_context.prev = _context.next) {
52
55
  case 0:
@@ -57,25 +60,33 @@ var Api = exports.Api = /*#__PURE__*/function () {
57
60
  });
58
61
  url = "".concat(_this2.config.url, "/document/").concat(encodeURIComponent(_this2.config.documentAri), "/comment");
59
62
  logger("Request url: ", url);
63
+
64
+ //Get tracing headers from UFO
65
+ tracingHeaderEnabled = (0, _platformFeatureFlags.fg)('platform_collab_provider_tracingheaders');
66
+ (0, _featureFlagsAccessed.addFeatureFlagAccessed)('platform_collab_provider_tracingheaders', tracingHeaderEnabled);
67
+ tracingHeaders = {};
68
+ if (tracingHeaderEnabled) {
69
+ tracingHeaders = (0, _experienceTraceIdContext.getActiveTraceHttpRequestHeaders)(url);
70
+ }
60
71
  _context.t0 = _objectSpread;
61
72
  _context.t1 = _objectSpread;
62
73
  _context.t2 = {};
63
74
  if (!_this2.config.permissionTokenRefresh) {
64
- _context.next = 13;
75
+ _context.next = 17;
65
76
  break;
66
77
  }
67
- _context.next = 9;
78
+ _context.next = 13;
68
79
  return _this2.channel.getChannelToken();
69
- case 9:
80
+ case 13:
70
81
  _context.t4 = _context.sent;
71
82
  _context.t3 = {
72
83
  'x-token': _context.t4
73
84
  };
74
- _context.next = 14;
85
+ _context.next = 18;
75
86
  break;
76
- case 13:
87
+ case 17:
77
88
  _context.t3 = {};
78
- case 14:
89
+ case 18:
79
90
  _context.t5 = _context.t3;
80
91
  _context.t6 = (0, _context.t1)(_context.t2, _context.t5);
81
92
  _context.t7 = {};
@@ -84,19 +95,20 @@ var Api = exports.Api = /*#__PURE__*/function () {
84
95
  'x-subproduct': (0, _utils.getSubProduct)(_this2.config.productInfo),
85
96
  'Content-Type': 'application/json'
86
97
  };
87
- _context.t9 = (0, _context.t0)(_context.t6, _context.t7, _context.t8);
88
- _context.t10 = reqBody;
98
+ _context.t9 = tracingHeaders;
99
+ _context.t10 = (0, _context.t0)(_context.t6, _context.t7, _context.t8, _context.t9);
100
+ _context.t11 = reqBody;
89
101
  fetchOptions = {
90
102
  credentials: 'include',
91
- headers: _context.t9,
103
+ headers: _context.t10,
92
104
  method: 'POST',
93
- body: _context.t10
105
+ body: _context.t11
94
106
  };
95
- _context.next = 23;
107
+ _context.next = 28;
96
108
  return fetch(url, fetchOptions);
97
- case 23:
109
+ case 28:
98
110
  return _context.abrupt("return", _context.sent);
99
- case 24:
111
+ case 29:
100
112
  case "end":
101
113
  return _context.stop();
102
114
  }
@@ -235,8 +235,6 @@ var Channel = exports.Channel = /*#__PURE__*/function (_Emitter) {
235
235
  _this.emit('steps:added', data);
236
236
  }
237
237
  });
238
- // Ignored via go/ees005
239
- // eslint-disable-next-line @typescript-eslint/max-params
240
238
  (0, _defineProperty2.default)(_this, "fetchCatchupv2", /*#__PURE__*/function () {
241
239
  var _ref2 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee2(fromVersion, clientId, catchUpOutofSync, reason) {
242
240
  var _yield$utils$requestS, steps, metadata, errorNotFound, errorCatchupv2;
@@ -7,11 +7,13 @@ Object.defineProperty(exports, "__esModule", {
7
7
  exports.isOutOfSync = exports.catchupv2 = void 0;
8
8
  var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
9
9
  var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
10
+ var _const = require("../helpers/const");
10
11
  var _utils = require("../helpers/utils");
12
+ var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
11
13
  var logger = (0, _utils.createLogger)('Catchupv2', 'red');
12
14
  var catchupv2 = exports.catchupv2 = /*#__PURE__*/function () {
13
15
  var _ref = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(opt) {
14
- var steps, metadata, fromVersion, _yield$opt$fetchCatch, _opt$analyticsHelper, _opt$onCatchupComplet, version, stepsPayload, _opt$analyticsHelper2;
16
+ var steps, metadata, fromVersion, _yield$opt$fetchCatch, _opt$analyticsHelper, _opt$onCatchupComplet, version, stepsPayload, clientOutOfSync, _opt$analyticsHelper2;
15
17
  return _regenerator.default.wrap(function _callee$(_context) {
16
18
  while (1) switch (_context.prev = _context.next) {
17
19
  case 0:
@@ -53,23 +55,38 @@ var catchupv2 = exports.catchupv2 = /*#__PURE__*/function () {
53
55
  };
54
56
  opt.onStepsAdded(stepsPayload);
55
57
  opt.updateMetadata(metadata);
56
- return _context.abrupt("return", Boolean(opt.clientId && isOutOfSync(fromVersion, opt.getCurrentPmVersion(), steps, opt.clientId)));
57
- case 26:
58
- _context.prev = 26;
58
+ clientOutOfSync = Boolean(opt.clientId && isOutOfSync(fromVersion, opt.getCurrentPmVersion(), steps, opt.clientId));
59
+ if (clientOutOfSync) {
60
+ logObfuscatedSteps(steps, opt);
61
+ }
62
+ return _context.abrupt("return", clientOutOfSync);
63
+ case 28:
64
+ _context.prev = 28;
59
65
  _context.t1 = _context["catch"](14);
60
66
  (_opt$analyticsHelper2 = opt.analyticsHelper) === null || _opt$analyticsHelper2 === void 0 || _opt$analyticsHelper2.sendErrorEvent(_context.t1, 'Failed to apply catchupv2 result in the editor');
61
67
  logger("Apply catchupv2 steps failed:", _context.t1.message);
62
68
  throw _context.t1;
63
- case 31:
69
+ case 33:
64
70
  case "end":
65
71
  return _context.stop();
66
72
  }
67
- }, _callee, null, [[1, 9], [14, 26]]);
73
+ }, _callee, null, [[1, 9], [14, 28]]);
68
74
  }));
69
75
  return function catchupv2(_x) {
70
76
  return _ref.apply(this, arguments);
71
77
  };
72
78
  }();
79
+ var logObfuscatedSteps = function logObfuscatedSteps(steps, opt) {
80
+ if ((0, _platformFeatureFlags.fg)('platform_editor_log_obfuscated_steps')) {
81
+ var _opt$getState, _opt$analyticsHelper3;
82
+ var state = (_opt$getState = opt.getState) === null || _opt$getState === void 0 ? void 0 : _opt$getState.call(opt);
83
+ (_opt$analyticsHelper3 = opt.analyticsHelper) === null || _opt$analyticsHelper3 === void 0 || _opt$analyticsHelper3.sendActionEvent(_const.EVENT_ACTION.OUT_OF_SYNC, _const.EVENT_STATUS.FAILURE, {
84
+ obfuscatedSteps: (0, _utils.getObfuscatedSteps)(steps),
85
+ obfuscatedDoc: state ? (0, _utils.getDocAdfWithObfuscation)(state.doc) : null,
86
+ catchupReason: opt.reason
87
+ });
88
+ }
89
+ };
73
90
 
74
91
  /**
75
92
  * Checks if we're out of sync with the backend because catchup failed to apply, and thus the doc should be reset.
@@ -79,10 +96,7 @@ var catchupv2 = exports.catchupv2 = /*#__PURE__*/function () {
79
96
  * @param clientId The ID of the currently connected session (one user can have multiple if theu have multiple tabs open)
80
97
  * @returns True if we're out of sync, false if not.
81
98
  */
82
- var isOutOfSync = exports.isOutOfSync = function isOutOfSync(fromVersion, currentVersion, steps, clientId
83
- // Ignored via go/ees005
84
- // eslint-disable-next-line @typescript-eslint/max-params
85
- ) {
99
+ var isOutOfSync = exports.isOutOfSync = function isOutOfSync(fromVersion, currentVersion, steps, clientId) {
86
100
  return (
87
101
  // If version number hasn't increased, and steps are not from our client, we're out of sync
88
102
  Boolean(fromVersion >= currentVersion && steps.some(function (step) {
@@ -47,8 +47,6 @@ var DocumentService = exports.DocumentService = /*#__PURE__*/function () {
47
47
  * @param enableErrorOnFailedDocumentApply - Enable failed document update exceptions.
48
48
  * @param getConnected - if the channel is currently connected
49
49
  */
50
- // Ignored via go/ees005
51
- // eslint-disable-next-line @typescript-eslint/max-params
52
50
  function DocumentService(participantsService, analyticsHelper, fetchCatchupv2, fetchReconcile,
53
51
  // Ignored via go/ees005
54
52
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
@@ -64,6 +62,7 @@ var DocumentService = exports.DocumentService = /*#__PURE__*/function () {
64
62
  (0, _defineProperty2.default)(this, "stepRejectCounter", 0);
65
63
  (0, _defineProperty2.default)(this, "aggressiveCatchup", false);
66
64
  (0, _defineProperty2.default)(this, "catchUpOutofSync", false);
65
+ (0, _defineProperty2.default)(this, "hasRecovered", false);
67
66
  /**
68
67
  * To prevent calling catchup to often, use lodash throttle to reduce the frequency
69
68
  * @param reason - optional reason to attach.
@@ -122,7 +121,8 @@ var DocumentService = exports.DocumentService = /*#__PURE__*/function () {
122
121
  remoteStepsLength: (_steps$length = steps === null || steps === void 0 ? void 0 : steps.length) !== null && _steps$length !== void 0 ? _steps$length : 0
123
122
  }));
124
123
  }
125
- }
124
+ },
125
+ getState: _this.getState
126
126
  });
127
127
  case 11:
128
128
  _this.catchUpOutofSync = _context.sent;
@@ -314,21 +314,24 @@ var DocumentService = exports.DocumentService = /*#__PURE__*/function () {
314
314
  while (1) switch (_context3.prev = _context3.next) {
315
315
  case 0:
316
316
  doc = _ref6.doc, version = _ref6.version, metadata = _ref6.metadata, targetClientId = _ref6.targetClientId;
317
+ if (!targetClientId) {
318
+ _this.hasRecovered = true;
319
+ }
317
320
  if (!(targetClientId && _this.clientId !== targetClientId)) {
318
- _context3.next = 3;
321
+ _context3.next = 4;
319
322
  break;
320
323
  }
321
324
  return _context3.abrupt("return");
322
- case 3:
325
+ case 4:
323
326
  // We preserve these as they will be lost apon this.updateDocument. This is because we are using document recovery.
324
327
  // We can then reconcile the document with the preserved state.
325
328
  unconfirmedSteps = _this.getUnconfirmedSteps();
326
- _context3.next = 6;
329
+ _context3.next = 7;
327
330
  return _this.getCurrentState();
328
- case 6:
331
+ case 7:
329
332
  currentState = _context3.sent;
330
333
  useReconcile = Boolean((unconfirmedSteps === null || unconfirmedSteps === void 0 ? void 0 : unconfirmedSteps.length) && currentState && !targetClientId);
331
- _context3.prev = 8;
334
+ _context3.prev = 9;
332
335
  // Reset the editor,
333
336
  // - Replace the document, keep in sync with the server
334
337
  // - Replace the version number, so editor is in sync with NCS server and can commit new changes.
@@ -343,10 +346,10 @@ var DocumentService = exports.DocumentService = /*#__PURE__*/function () {
343
346
  });
344
347
  _this.metadataService.updateMetadata(metadata);
345
348
  if (!(0, _platformFeatureFlags.fg)('restore_localstep_fallback_reconcile')) {
346
- _context3.next = 25;
349
+ _context3.next = 26;
347
350
  break;
348
351
  }
349
- _context3.prev = 12;
352
+ _context3.prev = 13;
350
353
  (_this$analyticsHelper13 = _this.analyticsHelper) === null || _this$analyticsHelper13 === void 0 || _this$analyticsHelper13.sendActionEvent(_const.EVENT_ACTION.REINITIALISE_DOCUMENT, _const.EVENT_STATUS.INFO, {
351
354
  numUnconfirmedSteps: unconfirmedSteps === null || unconfirmedSteps === void 0 ? void 0 : unconfirmedSteps.length,
352
355
  hasTitle: !!(metadata !== null && metadata !== void 0 && metadata.title),
@@ -357,35 +360,35 @@ var DocumentService = exports.DocumentService = /*#__PURE__*/function () {
357
360
  if (unconfirmedSteps !== null && unconfirmedSteps !== void 0 && unconfirmedSteps.length) {
358
361
  _this.applyLocalSteps(unconfirmedSteps);
359
362
  }
360
- _context3.next = 23;
363
+ _context3.next = 24;
361
364
  break;
362
- case 17:
363
- _context3.prev = 17;
364
- _context3.t0 = _context3["catch"](12);
365
+ case 18:
366
+ _context3.prev = 18;
367
+ _context3.t0 = _context3["catch"](13);
365
368
  (_this$analyticsHelper14 = _this.analyticsHelper) === null || _this$analyticsHelper14 === void 0 || _this$analyticsHelper14.sendErrorEvent(_context3.t0, "Error while onRestore with applyLocalSteps. Will fallback to fetchReconcile");
366
369
  useReconcile = true;
367
- _context3.next = 23;
370
+ _context3.next = 24;
368
371
  return _this.fetchReconcile(JSON.stringify(currentState.content), 'fe-restore');
369
- case 23:
370
- _context3.next = 31;
372
+ case 24:
373
+ _context3.next = 32;
371
374
  break;
372
- case 25:
375
+ case 26:
373
376
  if (!(useReconcile && currentState)) {
374
- _context3.next = 30;
377
+ _context3.next = 31;
375
378
  break;
376
379
  }
377
- _context3.next = 28;
380
+ _context3.next = 29;
378
381
  return _this.fetchReconcile(JSON.stringify(currentState.content), 'fe-restore');
379
- case 28:
380
- _context3.next = 31;
382
+ case 29:
383
+ _context3.next = 32;
381
384
  break;
382
- case 30:
385
+ case 31:
383
386
  if (unconfirmedSteps !== null && unconfirmedSteps !== void 0 && unconfirmedSteps.length) {
384
387
  // we don't want to use reconcile for restore triggered by catchup client out of sync (when targetClientId is provided)
385
388
  // as this results in all changes made while the client was out of sync being lost
386
389
  _this.applyLocalSteps(unconfirmedSteps);
387
390
  }
388
- case 31:
391
+ case 32:
389
392
  (_this$analyticsHelper15 = _this.analyticsHelper) === null || _this$analyticsHelper15 === void 0 || _this$analyticsHelper15.sendActionEvent(_const.EVENT_ACTION.REINITIALISE_DOCUMENT, _const.EVENT_STATUS.SUCCESS, {
390
393
  numUnconfirmedSteps: unconfirmedSteps === null || unconfirmedSteps === void 0 ? void 0 : unconfirmedSteps.length,
391
394
  hasTitle: !!(metadata !== null && metadata !== void 0 && metadata.title),
@@ -394,11 +397,11 @@ var DocumentService = exports.DocumentService = /*#__PURE__*/function () {
394
397
  targetClientId: targetClientId,
395
398
  triggeredByCatchup: targetClientId ? true : false
396
399
  });
397
- _context3.next = 39;
400
+ _context3.next = 40;
398
401
  break;
399
- case 34:
400
- _context3.prev = 34;
401
- _context3.t1 = _context3["catch"](8);
402
+ case 35:
403
+ _context3.prev = 35;
404
+ _context3.t1 = _context3["catch"](9);
402
405
  (_this$analyticsHelper16 = _this.analyticsHelper) === null || _this$analyticsHelper16 === void 0 || _this$analyticsHelper16.sendActionEvent(_const.EVENT_ACTION.REINITIALISE_DOCUMENT, _const.EVENT_STATUS.FAILURE, {
403
406
  numUnconfirmedSteps: unconfirmedSteps === null || unconfirmedSteps === void 0 ? void 0 : unconfirmedSteps.length,
404
407
  useReconcile: useReconcile,
@@ -415,11 +418,11 @@ var DocumentService = exports.DocumentService = /*#__PURE__*/function () {
415
418
  code: _internalErrors.INTERNAL_ERROR_CODE.DOCUMENT_RESTORE_ERROR
416
419
  }
417
420
  });
418
- case 39:
421
+ case 40:
419
422
  case "end":
420
423
  return _context3.stop();
421
424
  }
422
- }, _callee3, null, [[8, 34], [12, 17]]);
425
+ }, _callee3, null, [[9, 35], [13, 18]]);
423
426
  }));
424
427
  return function (_x3) {
425
428
  return _ref7.apply(this, arguments);
@@ -830,8 +833,6 @@ var DocumentService = exports.DocumentService = /*#__PURE__*/function () {
830
833
  * Send steps from transaction to other participants
831
834
  * It needs the superfluous arguments because we keep the interface of the send API the same as the Synchrony plugin
832
835
  */
833
- // Ignored via go/ees005
834
- // eslint-disable-next-line @typescript-eslint/max-params
835
836
  function send(_tr, _oldState, newState, sendAnalyticsEvent) {
836
837
  var unconfirmedStepsData = (0, _prosemirrorCollab.sendableSteps)(newState);
837
838
  var version = this.getVersionFromCollabState(newState, 'collab-provider: send');
@@ -889,7 +890,8 @@ var DocumentService = exports.DocumentService = /*#__PURE__*/function () {
889
890
  onErrorHandled: this.onErrorHandled,
890
891
  analyticsHelper: this.analyticsHelper,
891
892
  emit: this.providerEmitCallback,
892
- __livePage: this.options.__livePage
893
+ __livePage: this.options.__livePage,
894
+ hasRecovered: this.hasRecovered
893
895
  });
894
896
  }
895
897
  }]);
@@ -25,8 +25,9 @@ var EVENT_ACTION = exports.EVENT_ACTION = /*#__PURE__*/function (EVENT_ACTION) {
25
25
  EVENT_ACTION["RECONNECTION"] = "providerReconnection";
26
26
  EVENT_ACTION["PROVIDER_SETUP"] = "providerSetup";
27
27
  EVENT_ACTION["HAS_UNCONFIRMED_STEPS"] = "hasUnconfirmedSteps";
28
+ EVENT_ACTION["OUT_OF_SYNC"] = "outOfSync";
28
29
  return EVENT_ACTION;
29
- }({}); // https://data-portal.internal.atlassian.com/analytics/registry/56141
30
+ }({}); // https://data-portal.internal.atlassian.com/analytics/registry/74993
30
31
  var EVENT_STATUS = exports.EVENT_STATUS = /*#__PURE__*/function (EVENT_STATUS) {
31
32
  EVENT_STATUS["SUCCESS"] = "SUCCESS";
32
33
  EVENT_STATUS["FAILURE"] = "FAILURE";
@@ -1,10 +1,21 @@
1
1
  "use strict";
2
2
 
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
3
4
  Object.defineProperty(exports, "__esModule", {
4
5
  value: true
5
6
  });
6
- exports.isAIProviderID = exports.getSubProduct = exports.getStepUGCFreeDetails = exports.getProduct = exports.createLogger = void 0;
7
+ exports.isAIProviderID = exports.getSubProduct = exports.getStepsAdfWithObfuscation = exports.getStepUGCFreeDetails = exports.getStepTypes = exports.getStepPositions = exports.getProduct = exports.getObfuscatedSteps = exports.getDocAdfWithObfuscation = exports.createLogger = void 0;
8
+ exports.logObfuscatedSteps = logObfuscatedSteps;
7
9
  exports.sleep = sleep;
10
+ exports.toObfuscatedSteps = toObfuscatedSteps;
11
+ var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
12
+ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
13
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
14
+ var _scrub = require("@atlaskit/adf-utils/scrub");
15
+ var _prosemirrorCollab = require("@atlaskit/prosemirror-collab");
16
+ var _customErrors = require("../errors/custom-errors");
17
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
18
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2.default)(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
8
19
  var createLogger = exports.createLogger = function createLogger(prefix) {
9
20
  var color = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'blue';
10
21
  return (
@@ -64,4 +75,207 @@ var getStepUGCFreeDetails = exports.getStepUGCFreeDetails = function getStepUGCF
64
75
  contentTypes: contentTypes,
65
76
  stepSizeInBytes: Buffer.byteLength(JSON.stringify(step))
66
77
  };
67
- };
78
+ };
79
+ var stepWithNextDocument = function stepWithNextDocument(stepJson) {
80
+ return stepJson.stepType === 'override-document' && 'nextDocument' in stepJson;
81
+ };
82
+ var stepWithMark = function stepWithMark(stepJson) {
83
+ return stepJson.stepType === 'addMark' || stepJson.stepType === 'addNodeMark';
84
+ };
85
+ var stepWithAttrs = function stepWithAttrs(stepJson) {
86
+ return stepJson.stepType === 'setAttrs' && 'attrs' in stepJson;
87
+ };
88
+ var stepWithBatchAttrs = function stepWithBatchAttrs(stepJson) {
89
+ return stepJson.stepType === 'batchAttrs' && 'data' in stepJson;
90
+ };
91
+ var stepWithFromTo = function stepWithFromTo(stepJson) {
92
+ return 'from' in stepJson && typeof stepJson.from === 'number' && 'to' in stepJson && typeof stepJson.to === 'number';
93
+ };
94
+ var stepWithGapFromTo = function stepWithGapFromTo(stepJson) {
95
+ return 'gapFrom' in stepJson && typeof stepJson.gapFrom === 'number' && 'gapTo' in stepJson && typeof stepJson.gapTo === 'number';
96
+ };
97
+ var stepWithInsert = function stepWithInsert(stepJson) {
98
+ return 'insert' in stepJson && typeof stepJson.insert === 'number';
99
+ };
100
+ var stepWithPos = function stepWithPos(stepJson) {
101
+ return 'pos' in stepJson && typeof stepJson.pos === 'number';
102
+ };
103
+ var stepWithSlice = function stepWithSlice(stepJson) {
104
+ var _stepJson$slice3;
105
+ return 'slice' in stepJson && Array.isArray((_stepJson$slice3 = stepJson.slice) === null || _stepJson$slice3 === void 0 ? void 0 : _stepJson$slice3.content);
106
+ };
107
+
108
+ // Get as step info which is known not to contain user generated content.
109
+ var getStepTypes = exports.getStepTypes = function getStepTypes(stepJson) {
110
+ var contentTypes = null;
111
+ if (stepWithSlice(stepJson)) {
112
+ contentTypes = stepJson.slice.content.map(function (c) {
113
+ return (c === null || c === void 0 ? void 0 : c.type) || 'unknown';
114
+ }).join(', ');
115
+ }
116
+ return {
117
+ type: stepJson.stepType || 'unknown',
118
+ contentTypes: contentTypes
119
+ };
120
+ };
121
+ var getStepsAdfWithObfuscation = exports.getStepsAdfWithObfuscation = function getStepsAdfWithObfuscation(stepJson) {
122
+ var stepContentAsAdf = stepToAdf(stepJson);
123
+ if (!stepContentAsAdf) {
124
+ return null;
125
+ }
126
+ var scrubbedSteps = stepContentAsAdf.map(function (adf) {
127
+ return (0, _scrub.scrubAdf)(adf);
128
+ }).filter(function (adf) {
129
+ return !!adf;
130
+ });
131
+ return scrubbedSteps;
132
+ };
133
+ var getDocAdfWithObfuscation = exports.getDocAdfWithObfuscation = function getDocAdfWithObfuscation(doc) {
134
+ var docJson = doc.toJSON();
135
+ var scrubbedDoc = (0, _scrub.scrubAdf)(docJson);
136
+ if (!scrubbedDoc) {
137
+ return null;
138
+ }
139
+ return scrubbedDoc;
140
+ };
141
+ var getStepPositions = exports.getStepPositions = function getStepPositions(stepJson) {
142
+ return _objectSpread(_objectSpread(_objectSpread(_objectSpread({}, stepWithFromTo(stepJson) && {
143
+ from: stepJson.from,
144
+ to: stepJson.to
145
+ }), stepWithGapFromTo(stepJson) && {
146
+ gapFrom: stepJson.gapFrom,
147
+ gapTo: stepJson.gapTo
148
+ }), stepWithInsert(stepJson) && {
149
+ insert: stepJson.insert
150
+ }), stepWithPos(stepJson) && {
151
+ pos: stepJson.pos
152
+ });
153
+ };
154
+
155
+ /**
156
+ * Returns the metadata for Step
157
+ * @description metadata is applied by transform overrides [here](https://bitbucket.org/atlassian/adf-schema/src/e13bbece84ede8f245067dc53dd7ce694f427eda/packages/editor-prosemirror/src/transform-override.ts#lines-12)
158
+ */
159
+ var getStepMetadata = function getStepMetadata(stepJson) {
160
+ return stepJson.metadata;
161
+ };
162
+ var getObfuscatedSteps = exports.getObfuscatedSteps = function getObfuscatedSteps(steps) {
163
+ var endIndex = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : undefined;
164
+ return steps.slice(0, endIndex).map(function (step) {
165
+ return {
166
+ stepType: getStepTypes(step),
167
+ stepContent: getStepsAdfWithObfuscation(step),
168
+ stepPositions: getStepPositions(step),
169
+ stepMetadata: getStepMetadata(step)
170
+ };
171
+ });
172
+ };
173
+ var stepToAdf = function stepToAdf(step) {
174
+ if (stepWithSlice(step)) {
175
+ return [{
176
+ type: 'doc',
177
+ content: step.slice.content.filter(function (el) {
178
+ return el !== null;
179
+ })
180
+ }];
181
+ } else if (stepWithNextDocument(step)) {
182
+ return [{
183
+ type: 'doc',
184
+ content: step.nextDocument.content
185
+ }];
186
+ } else if (stepWithMark(step) && step.mark) {
187
+ return [{
188
+ type: 'doc',
189
+ marks: [{
190
+ type: step.mark.type || 'unknown',
191
+ attrs: step.mark.attrs
192
+ }]
193
+ }];
194
+ } else if (stepWithAttrs(step)) {
195
+ return [{
196
+ type: 'doc',
197
+ attrs: step.attrs
198
+ }];
199
+ } else if (stepWithBatchAttrs(step)) {
200
+ return step.data.map(function (stepData) {
201
+ return {
202
+ type: 'doc',
203
+ attrs: stepData.attrs
204
+ };
205
+ });
206
+ }
207
+ return [];
208
+ };
209
+ function logObfuscatedSteps(_x, _x2) {
210
+ return _logObfuscatedSteps.apply(this, arguments);
211
+ }
212
+ function _logObfuscatedSteps() {
213
+ _logObfuscatedSteps = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(oldState, newState) {
214
+ var _states$new, _states$old, stepsFromOldState, stepsFromNewState, states;
215
+ return _regenerator.default.wrap(function _callee$(_context) {
216
+ while (1) switch (_context.prev = _context.next) {
217
+ case 0:
218
+ _context.prev = 0;
219
+ stepsFromOldState = '', stepsFromNewState = '';
220
+ states = {
221
+ old: oldState ? (0, _prosemirrorCollab.sendableSteps)(oldState) : null,
222
+ new: (0, _prosemirrorCollab.sendableSteps)(newState)
223
+ };
224
+ if (!((_states$new = states.new) !== null && _states$new !== void 0 && _states$new.steps)) {
225
+ _context.next = 7;
226
+ break;
227
+ }
228
+ _context.next = 6;
229
+ return toObfuscatedSteps(states.new.steps);
230
+ case 6:
231
+ stepsFromNewState = _context.sent;
232
+ case 7:
233
+ if (!((_states$old = states.old) !== null && _states$old !== void 0 && _states$old.steps)) {
234
+ _context.next = 11;
235
+ break;
236
+ }
237
+ _context.next = 10;
238
+ return toObfuscatedSteps(states.old.steps);
239
+ case 10:
240
+ stepsFromOldState = _context.sent;
241
+ case 11:
242
+ return _context.abrupt("return", {
243
+ stepsFromOldState: stepsFromOldState,
244
+ stepsFromNewState: stepsFromNewState
245
+ });
246
+ case 14:
247
+ _context.prev = 14;
248
+ _context.t0 = _context["catch"](0);
249
+ return _context.abrupt("return", new _customErrors.CustomError('Failed to obfuscate steps', _context.t0));
250
+ case 17:
251
+ case "end":
252
+ return _context.stop();
253
+ }
254
+ }, _callee, null, [[0, 14]]);
255
+ }));
256
+ return _logObfuscatedSteps.apply(this, arguments);
257
+ }
258
+ function toObfuscatedSteps(_x3) {
259
+ return _toObfuscatedSteps.apply(this, arguments);
260
+ }
261
+ function _toObfuscatedSteps() {
262
+ _toObfuscatedSteps = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee2(steps) {
263
+ var _steps;
264
+ return _regenerator.default.wrap(function _callee2$(_context2) {
265
+ while (1) switch (_context2.prev = _context2.next) {
266
+ case 0:
267
+ _context2.next = 2;
268
+ return Promise.resolve(steps.slice().map(function (s) {
269
+ return s.toJSON();
270
+ }));
271
+ case 2:
272
+ _steps = _context2.sent;
273
+ return _context2.abrupt("return", JSON.stringify(getObfuscatedSteps(_steps)));
274
+ case 4:
275
+ case "end":
276
+ return _context2.stop();
277
+ }
278
+ }, _callee2);
279
+ }));
280
+ return _toObfuscatedSteps.apply(this, arguments);
281
+ }