@atlaskit/collab-provider 7.0.0 → 7.1.2

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 (37) hide show
  1. package/.vscode/settings.json +3 -0
  2. package/CHANGELOG.md +40 -0
  3. package/disconnected-reason-mapper/package.json +7 -0
  4. package/dist/cjs/analytics/index.js +1 -1
  5. package/dist/cjs/analytics/performance.js +1 -1
  6. package/dist/cjs/channel.js +56 -19
  7. package/dist/cjs/disconnected-reason-mapper.js +31 -0
  8. package/dist/cjs/error-code-mapper.js +43 -2
  9. package/dist/cjs/helpers/const.js +1 -1
  10. package/dist/cjs/helpers/utils.js +9 -14
  11. package/dist/cjs/provider/catchup.js +147 -0
  12. package/dist/cjs/{provider.js → provider/index.js} +176 -265
  13. package/dist/cjs/socket-io-provider.js +1 -1
  14. package/dist/cjs/version.json +1 -1
  15. package/dist/es2019/channel.js +34 -7
  16. package/dist/es2019/disconnected-reason-mapper.js +23 -0
  17. package/dist/es2019/error-code-mapper.js +38 -0
  18. package/dist/es2019/helpers/utils.js +9 -14
  19. package/dist/es2019/provider/catchup.js +91 -0
  20. package/dist/es2019/{provider.js → provider/index.js} +126 -195
  21. package/dist/es2019/version.json +1 -1
  22. package/dist/esm/channel.js +54 -19
  23. package/dist/esm/disconnected-reason-mapper.js +23 -0
  24. package/dist/esm/error-code-mapper.js +38 -0
  25. package/dist/esm/helpers/utils.js +8 -13
  26. package/dist/esm/provider/catchup.js +131 -0
  27. package/dist/esm/{provider.js → provider/index.js} +180 -267
  28. package/dist/esm/version.json +1 -1
  29. package/dist/types/channel.d.ts +18 -26
  30. package/dist/types/disconnected-reason-mapper.d.ts +15 -0
  31. package/dist/types/error-code-mapper.d.ts +3 -0
  32. package/dist/types/helpers/utils.d.ts +2 -2
  33. package/dist/types/index.d.ts +1 -1
  34. package/dist/types/provider/catchup.d.ts +24 -0
  35. package/dist/types/{provider.d.ts → provider/index.d.ts} +22 -11
  36. package/package.json +11 -8
  37. package/provider/package.json +0 -7
@@ -0,0 +1,3 @@
1
+ {
2
+ "typescript.tsdk": "node_modules/typescript/lib"
3
+ }
package/CHANGELOG.md CHANGED
@@ -1,5 +1,45 @@
1
1
  # @atlaskit/collab-provider
2
2
 
3
+ ## 7.1.2
4
+
5
+ ### Patch Changes
6
+
7
+ - Updated dependencies
8
+
9
+ ## 7.1.1
10
+
11
+ ### Patch Changes
12
+
13
+ - [`c6feed82071`](https://bitbucket.org/atlassian/atlassian-frontend/commits/c6feed82071) - ED-11632: Bump prosemirror packages;
14
+
15
+ - prosmirror-commands 1.1.4 -> 1.1.11,
16
+ - prosemirror-model 1.11.0 -> 1.14.3,
17
+ - prosemirror-state 1.3.3 -> 1.3.4,
18
+ - prosemirror-transform 1.2.8 -> 1.3.2,
19
+ - prosemirror-view 1.15.4 + 1.18.8 -> 1.20.2.
20
+
21
+ - [`b670f0469c4`](https://bitbucket.org/atlassian/atlassian-frontend/commits/b670f0469c4) - COLLAB-990: fixing duplciated avatar
22
+ - Updated dependencies
23
+
24
+ ## 7.1.0
25
+
26
+ ### Minor Changes
27
+
28
+ - [`cf853e39278`](https://bitbucket.org/atlassian/atlassian-frontend/commits/cf853e39278) - COLLAB-411-change-to-metadata: 'setTitle' and 'setEditorWidth' are deprecated, going to be removed in the next release, use 'setMetadata' instead.
29
+ - [`10d7bc384aa`](https://bitbucket.org/atlassian/atlassian-frontend/commits/10d7bc384aa) - COLLAB-933: add disconnected event
30
+
31
+ ### Patch Changes
32
+
33
+ - Updated dependencies
34
+
35
+ ## 7.0.1
36
+
37
+ ### Patch Changes
38
+
39
+ - [`2f5b81920af`](https://bitbucket.org/atlassian/atlassian-frontend/commits/2f5b81920af) - Refactor the provider class in collab provider
40
+ - [`0ec1c930f96`](https://bitbucket.org/atlassian/atlassian-frontend/commits/0ec1c930f96) - NONE: tuning catchup trigger
41
+ - Updated dependencies
42
+
3
43
  ## 7.0.0
4
44
 
5
45
  ### Major Changes
@@ -0,0 +1,7 @@
1
+ {
2
+ "name": "@atlaskit/collab-provider/disconnected-reason-mapper",
3
+ "main": "../dist/cjs/disconnected-reason-mapper.js",
4
+ "module": "../dist/esm/disconnected-reason-mapper.js",
5
+ "module:es2019": "../dist/es2019/disconnected-reason-mapper.js",
6
+ "types": "../dist/types/disconnected-reason-mapper.d.ts"
7
+ }
@@ -5,7 +5,7 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
5
5
  Object.defineProperty(exports, "__esModule", {
6
6
  value: true
7
7
  });
8
- exports.triggerAnalyticsForCatchupSuccessfulWithLatency = exports.triggerAnalyticsForCatchupFailed = exports.triggerAnalyticsForStepsRejected = exports.triggerAnalyticsForStepsAddedSuccessfully = exports.fireAnalyticsEvent = exports.buildAnalyticsPayload = void 0;
8
+ exports.triggerAnalyticsForStepsRejected = exports.triggerAnalyticsForStepsAddedSuccessfully = exports.triggerAnalyticsForCatchupSuccessfulWithLatency = exports.triggerAnalyticsForCatchupFailed = exports.fireAnalyticsEvent = exports.buildAnalyticsPayload = void 0;
9
9
 
10
10
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
11
11
 
@@ -3,9 +3,9 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
+ exports.clearMeasure = clearMeasure;
6
7
  exports.startMeasure = startMeasure;
7
8
  exports.stopMeasure = stopMeasure;
8
- exports.clearMeasure = clearMeasure;
9
9
 
10
10
  var isPerformanceAPIAvailable = function isPerformanceAPIAvailable() {
11
11
  return typeof window !== 'undefined' && 'performance' in window && ['measure', 'clearMeasures', 'clearMarks', 'getEntriesByName', 'getEntriesByType'].every(function (api) {
@@ -33,6 +33,10 @@ var _errorCodeMapper = require("./error-code-mapper");
33
33
 
34
34
  var _utils = require("./helpers/utils");
35
35
 
36
+ var _performance = require("./analytics/performance");
37
+
38
+ var _analytics = require("./analytics");
39
+
36
40
  function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
37
41
 
38
42
  function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
@@ -98,6 +102,11 @@ var Channel = /*#__PURE__*/function (_Emitter) {
98
102
  }
99
103
  });
100
104
  _this.config = config;
105
+
106
+ if (config.analyticsClient) {
107
+ _this.analyticsClient = config.analyticsClient;
108
+ }
109
+
101
110
  return _this;
102
111
  } // read-only getters used for tests
103
112
 
@@ -154,8 +163,11 @@ var Channel = /*#__PURE__*/function (_Emitter) {
154
163
  this.socket.on('participant:telepointer', function (payload) {
155
164
  _this2.emit('participant:telepointer', payload.data);
156
165
  });
157
- this.socket.on('participant:joined', function (data) {
158
- _this2.emit('participant:joined', data);
166
+ this.socket.on('presence:joined', function (data) {
167
+ _this2.emit('presence:joined', data);
168
+ });
169
+ this.socket.on('presence', function (data) {
170
+ _this2.emit('presence', data);
159
171
  });
160
172
  this.socket.on('participant:left', function (data) {
161
173
  _this2.emit('participant:left', data);
@@ -172,11 +184,8 @@ var Channel = /*#__PURE__*/function (_Emitter) {
172
184
  clientId: clientId
173
185
  }, data));
174
186
  });
175
- this.socket.on('title:changed', function (payload) {
176
- _this2.emit('title:changed', payload.data);
177
- });
178
- this.socket.on('width:changed', function (payload) {
179
- _this2.emit('width:changed', payload.data);
187
+ this.socket.on('metadata:changed', function (payload) {
188
+ _this2.emit('metadata:changed', payload);
180
189
  });
181
190
  this.socket.on('disconnect', /*#__PURE__*/function () {
182
191
  var _ref2 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(reason) {
@@ -235,6 +244,8 @@ var Channel = /*#__PURE__*/function (_Emitter) {
235
244
  key: "fetchCatchup",
236
245
  value: function () {
237
246
  var _fetchCatchup = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee2(fromVersion) {
247
+ var _this3 = this;
248
+
238
249
  var _yield$utils$requestS, doc, version, stepMaps, metadata, errorCatchup;
239
250
 
240
251
  return _regenerator.default.wrap(function _callee2$(_context2) {
@@ -242,6 +253,7 @@ var Channel = /*#__PURE__*/function (_Emitter) {
242
253
  switch (_context2.prev = _context2.next) {
243
254
  case 0:
244
255
  _context2.prev = 0;
256
+ (0, _performance.startMeasure)('callingCatchupApi');
245
257
  _context2.t0 = _utilServiceSupport.utils;
246
258
  _context2.t1 = this.config;
247
259
  _context2.t2 = _objectSpread;
@@ -253,14 +265,14 @@ var Channel = /*#__PURE__*/function (_Emitter) {
253
265
  };
254
266
 
255
267
  if (!this.config.permissionTokenRefresh) {
256
- _context2.next = 14;
268
+ _context2.next = 15;
257
269
  break;
258
270
  }
259
271
 
260
- _context2.next = 8;
272
+ _context2.next = 9;
261
273
  return this.config.permissionTokenRefresh();
262
274
 
263
- case 8:
275
+ case 9:
264
276
  _context2.t5 = _context2.sent;
265
277
  _context2.t6 = {
266
278
  'x-token': _context2.t5
@@ -271,19 +283,19 @@ var Channel = /*#__PURE__*/function (_Emitter) {
271
283
  _context2.t4 = {
272
284
  requestInit: _context2.t7
273
285
  };
274
- _context2.next = 15;
286
+ _context2.next = 16;
275
287
  break;
276
288
 
277
- case 14:
289
+ case 15:
278
290
  _context2.t4 = {};
279
291
 
280
- case 15:
292
+ case 16:
281
293
  _context2.t8 = _context2.t4;
282
294
  _context2.t9 = (0, _context2.t2)(_context2.t3, _context2.t8);
283
- _context2.next = 19;
295
+ _context2.next = 20;
284
296
  return _context2.t0.requestService.call(_context2.t0, _context2.t1, _context2.t9);
285
297
 
286
- case 19:
298
+ case 20:
287
299
  _yield$utils$requestS = _context2.sent;
288
300
  doc = _yield$utils$requestS.doc;
289
301
  version = _yield$utils$requestS.version;
@@ -296,8 +308,8 @@ var Channel = /*#__PURE__*/function (_Emitter) {
296
308
  metadata: metadata
297
309
  });
298
310
 
299
- case 27:
300
- _context2.prev = 27;
311
+ case 28:
312
+ _context2.prev = 28;
301
313
  _context2.t10 = _context2["catch"](0);
302
314
  logger("Can't fetch the catchup", _context2.t10.message);
303
315
  errorCatchup = {
@@ -310,12 +322,19 @@ var Channel = /*#__PURE__*/function (_Emitter) {
310
322
  this.emit('error', errorCatchup);
311
323
  return _context2.abrupt("return", {});
312
324
 
313
- case 33:
325
+ case 34:
326
+ _context2.prev = 34;
327
+ (0, _performance.stopMeasure)('callingCatchupApi', function (duration, _) {
328
+ (0, _analytics.triggerAnalyticsForCatchupSuccessfulWithLatency)(_this3.analyticsClient, duration);
329
+ });
330
+ return _context2.finish(34);
331
+
332
+ case 37:
314
333
  case "end":
315
334
  return _context2.stop();
316
335
  }
317
336
  }
318
- }, _callee2, this, [[0, 27]]);
337
+ }, _callee2, this, [[0, 28, 34, 37]]);
319
338
  }));
320
339
 
321
340
  function fetchCatchup(_x2) {
@@ -339,6 +358,24 @@ var Channel = /*#__PURE__*/function (_Emitter) {
339
358
  type: type
340
359
  }, data));
341
360
  }
361
+ }, {
362
+ key: "sendMetadata",
363
+ value: function sendMetadata(metadata) {
364
+ if (!this.connected || !this.socket) {
365
+ return;
366
+ }
367
+
368
+ this.socket.emit('metadata', metadata);
369
+ }
370
+ }, {
371
+ key: "sendPresenceJoined",
372
+ value: function sendPresenceJoined() {
373
+ if (!this.connected || !this.socket) {
374
+ return;
375
+ }
376
+
377
+ this.socket.emit('presence:joined');
378
+ }
342
379
  }, {
343
380
  key: "disconnect",
344
381
  value: function disconnect() {
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.socketIOReasons = exports.DisconnectReason = void 0;
7
+ // See https://socket.io/docs/v3/client-socket-instance#disconnect for emitted reasons
8
+ var socketIOReasons = {
9
+ IO_CLIENT_DISCONNECT: 'io client disconnect',
10
+ // The socket was manually disconnected using socket.disconnect()
11
+ IO_SERVER_DISCONNECT: 'io server disconnect',
12
+ // The server has forcefully disconnected the socket with socket.disconnect()
13
+ TRANSPORT_CLOSED: 'transport close',
14
+ // The server did not send a PING within the pingInterval + pingTimeout range
15
+ TRANSPORT_ERROR: 'transport error',
16
+ // The connection was closed (example: the user has lost connection, or the network was changed from WiFi to 4G)
17
+ PING_TIMEOUT: 'ping timeout' // The connection has encountered an error (example: the server was killed during a HTTP long-polling cycle)
18
+
19
+ };
20
+ exports.socketIOReasons = socketIOReasons;
21
+ var DisconnectReason;
22
+ exports.DisconnectReason = DisconnectReason;
23
+
24
+ (function (DisconnectReason) {
25
+ DisconnectReason["CLIENT_DISCONNECT"] = "CLIENT_DISCONNECT";
26
+ DisconnectReason["SERVER_DISCONNECT"] = "SERVER_DISCONNECT";
27
+ DisconnectReason["SOCKET_CLOSED"] = "SOCKET_CLOSED";
28
+ DisconnectReason["SOCKET_ERROR"] = "SOCKET_ERROR";
29
+ DisconnectReason["SOCKET_TIMEOUT"] = "SOCKET_TIMEOUT";
30
+ DisconnectReason["UNKNOWN_DISCONNECT"] = "UNKNOWN_DISCONNECT";
31
+ })(DisconnectReason || (exports.DisconnectReason = DisconnectReason = {}));
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.ErrorCodeMapper = void 0;
6
+ exports.errorCodeMapper = exports.ErrorCodeMapper = void 0;
7
7
  var ErrorCodeMapper = {
8
8
  noPermissionError: {
9
9
  code: 'NO_PERMISSION_ERROR',
@@ -34,4 +34,45 @@ var ErrorCodeMapper = {
34
34
  message: 'Collab service has return internal server error'
35
35
  }
36
36
  };
37
- exports.ErrorCodeMapper = ErrorCodeMapper;
37
+ exports.ErrorCodeMapper = ErrorCodeMapper;
38
+
39
+ var errorCodeMapper = function errorCodeMapper(error) {
40
+ if (error.data) {
41
+ switch (error.data.code) {
42
+ case 'INSUFFICIENT_EDITING_PERMISSION':
43
+ return {
44
+ status: 403,
45
+ code: ErrorCodeMapper.noPermissionError.code,
46
+ message: ErrorCodeMapper.noPermissionError.message
47
+ };
48
+
49
+ case 'DOCUMENT_NOT_FOUND':
50
+ return {
51
+ status: 404,
52
+ code: ErrorCodeMapper.documentNotFound.code,
53
+ message: ErrorCodeMapper.documentNotFound.message
54
+ };
55
+
56
+ case 'FAILED_ON_S3':
57
+ case 'DYNAMO_ERROR':
58
+ return {
59
+ status: 500,
60
+ code: ErrorCodeMapper.failToSave.code,
61
+ message: ErrorCodeMapper.failToSave.message
62
+ };
63
+
64
+ case 'CATCHUP_FAILED':
65
+ case 'GET_QUERY_TIME_OUT':
66
+ return {
67
+ status: 500,
68
+ code: ErrorCodeMapper.internalError.code,
69
+ message: ErrorCodeMapper.internalError.message
70
+ };
71
+
72
+ default:
73
+ break;
74
+ }
75
+ }
76
+ };
77
+
78
+ exports.errorCodeMapper = errorCodeMapper;
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.ACK_MAX_TRY = exports.CATCHUP_FAILURE = exports.CATCHUP_SUCCESS = exports.ATTRIBUTES_PACKAGE = exports.STEPS_REJECTED = exports.STEPS_ADDED = void 0;
6
+ exports.STEPS_REJECTED = exports.STEPS_ADDED = exports.CATCHUP_SUCCESS = exports.CATCHUP_FAILURE = exports.ATTRIBUTES_PACKAGE = exports.ACK_MAX_TRY = void 0;
7
7
  var STEPS_ADDED = 'collabStepsAddedSuccess';
8
8
  exports.STEPS_ADDED = STEPS_ADDED;
9
9
  var STEPS_REJECTED = 'collabStepsAddedRejected';
@@ -3,8 +3,8 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.sleep = sleep;
7
6
  exports.getParticipant = exports.createLogger = void 0;
7
+ exports.sleep = sleep;
8
8
 
9
9
  var createLogger = function createLogger(prefix) {
10
10
  var color = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'blue';
@@ -13,27 +13,22 @@ var createLogger = function createLogger(prefix) {
13
13
 
14
14
  if (window.COLLAB_PROVIDER_LOGGER) {
15
15
  // eslint-disable-next-line no-console
16
- console.log("%cCollab-".concat(prefix, ": ").concat(msg), "color: ".concat(color, "; font-weight: bold"));
17
-
18
- if (data) {
19
- // eslint-disable-next-line no-console
20
- console.log(data);
21
- }
16
+ console.log("%cCollab-".concat(prefix, ": ").concat(msg), "color: ".concat(color, "; font-weight: bold"), data);
22
17
  }
23
18
  };
24
19
  };
25
20
 
26
21
  exports.createLogger = createLogger;
22
+ var logger = createLogger('Helper:util', 'black');
27
23
 
28
24
  var getParticipant = function getParticipant(userId) {
29
- // eslint-disable-next-line no-bitwise
30
- var name = 'Demo User';
31
- return Promise.resolve({
25
+ logger('getParticipant: ', userId);
26
+ return {
32
27
  userId: userId,
33
- name: name,
34
- avatar: "https://api.adorable.io/avatars/80/".concat(name.replace(/\s/g, ''), ".png"),
35
- email: "".concat(name.replace(/\s/g, '').toLocaleLowerCase(), "@atlassian.com")
36
- });
28
+ name: userId,
29
+ avatar: '',
30
+ email: "".concat(userId.replace(/\s/g, '').toLocaleLowerCase(), "@atlassian.com")
31
+ };
37
32
  };
38
33
 
39
34
  exports.getParticipant = getParticipant;
@@ -0,0 +1,147 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.catchup = void 0;
9
+ exports.rebaseSteps = rebaseSteps;
10
+
11
+ var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
12
+
13
+ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
14
+
15
+ var _utils = require("../helpers/utils");
16
+
17
+ var _prosemirrorTransform = require("prosemirror-transform");
18
+
19
+ function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
20
+
21
+ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
22
+
23
+ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
24
+
25
+ var logger = (0, _utils.createLogger)('Catchup', 'red');
26
+ /**
27
+ * Rebase the steps based on the mapping pipeline.
28
+ * Some steps could be lost, if they are no longer
29
+ * invalid after rebased.
30
+ */
31
+
32
+ function rebaseSteps(steps, mapping) {
33
+ var newSteps = [];
34
+
35
+ var _iterator = _createForOfIteratorHelper(steps),
36
+ _step;
37
+
38
+ try {
39
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
40
+ var step = _step.value;
41
+ var newStep = step.map(mapping); // newStep could be null(means invalid after rebase) when can't rebase.
42
+
43
+ if (newStep) {
44
+ newSteps.push(newStep);
45
+ }
46
+ }
47
+ } catch (err) {
48
+ _iterator.e(err);
49
+ } finally {
50
+ _iterator.f();
51
+ }
52
+
53
+ return newSteps;
54
+ }
55
+
56
+ var catchup = /*#__PURE__*/function () {
57
+ var _ref = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(opt) {
58
+ var _yield$opt$fetchCatch, doc, serverStepMaps, serverVersion, metadata, currentPmVersion, _ref2, unconfirmedSteps, stepMaps, mapping, newUnconfirmedSteps;
59
+
60
+ return _regenerator.default.wrap(function _callee$(_context) {
61
+ while (1) {
62
+ switch (_context.prev = _context.next) {
63
+ case 0:
64
+ _context.next = 2;
65
+ return opt.fetchCatchup(opt.getCurrentPmVersion());
66
+
67
+ case 2:
68
+ _yield$opt$fetchCatch = _context.sent;
69
+ doc = _yield$opt$fetchCatch.doc;
70
+ serverStepMaps = _yield$opt$fetchCatch.stepMaps;
71
+ serverVersion = _yield$opt$fetchCatch.version;
72
+ metadata = _yield$opt$fetchCatch.metadata;
73
+
74
+ if (doc) {
75
+ currentPmVersion = opt.getCurrentPmVersion();
76
+
77
+ if (typeof serverVersion === 'undefined') {
78
+ logger("Could not determine server version");
79
+ } else if (serverVersion <= currentPmVersion) {
80
+ logger("Catchup steps we already have. Ignoring.");
81
+ } else {
82
+ // Please, do not use those steps inside of async
83
+ // method. That will lead to outdated steps
84
+ _ref2 = opt.getUnconfirmedSteps() || {
85
+ steps: []
86
+ }, unconfirmedSteps = _ref2.steps;
87
+ logger("Too far behind[current: v".concat(currentPmVersion, ", server: v").concat(serverVersion, ". ").concat(serverStepMaps.length, " steps need to catchup]"));
88
+ /**
89
+ * Remove steps from queue where the version is older than
90
+ * the version we received from service. Keep steps that might be
91
+ * newer.
92
+ */
93
+
94
+ opt.fitlerQueue(function (data) {
95
+ return data.version > serverVersion;
96
+ }); // We are too far behind - replace the entire document
97
+
98
+ logger("Replacing document: ".concat(doc));
99
+ logger("getting metadata: ".concat(metadata)); // Replace local document and version number
100
+
101
+ opt.updateDocumentWithMetadata({
102
+ doc: JSON.parse(doc),
103
+ version: serverVersion,
104
+ metadata: metadata,
105
+ reserveCursor: true
106
+ }); // After replacing the whole document in the editor, we need to reapply the unconfirmed
107
+ // steps back into the editor, so we don't lose any data. But before that, we need to rebase
108
+ // those steps since their position could be changed after replacing.
109
+ // https://prosemirror.net/docs/guide/#transform.rebasing
110
+
111
+ if (unconfirmedSteps.length) {
112
+ // Create StepMap from StepMap JSON
113
+ // eslint-disable-next-line no-unused-vars
114
+ stepMaps = serverStepMaps.map(function (_ref3) {
115
+ var ranges = _ref3.ranges,
116
+ inverted = _ref3.inverted;
117
+ // Due to @types/prosemirror-transform mismatch with the actual
118
+ // constructor, hack to set the `inverted`.
119
+ var stepMap = new _prosemirrorTransform.StepMap(ranges);
120
+ stepMap.inverted = inverted;
121
+ return stepMap;
122
+ }); // create Mappng used for Step.map
123
+
124
+ mapping = new _prosemirrorTransform.Mapping(stepMaps);
125
+ logger("".concat(unconfirmedSteps.length, " unconfirmed steps before rebased: ").concat(JSON.stringify(unconfirmedSteps)));
126
+ newUnconfirmedSteps = rebaseSteps(unconfirmedSteps, mapping);
127
+ logger("Re-aply ".concat(newUnconfirmedSteps.length, " mapped unconfirmed steps: ").concat(JSON.stringify(newUnconfirmedSteps))); // Re-aply local steps
128
+
129
+ opt.applyLocalsteps(newUnconfirmedSteps);
130
+ }
131
+ }
132
+ }
133
+
134
+ case 8:
135
+ case "end":
136
+ return _context.stop();
137
+ }
138
+ }
139
+ }, _callee);
140
+ }));
141
+
142
+ return function catchup(_x) {
143
+ return _ref.apply(this, arguments);
144
+ };
145
+ }();
146
+
147
+ exports.catchup = catchup;