@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.
- package/.vscode/settings.json +3 -0
- package/CHANGELOG.md +40 -0
- package/disconnected-reason-mapper/package.json +7 -0
- package/dist/cjs/analytics/index.js +1 -1
- package/dist/cjs/analytics/performance.js +1 -1
- package/dist/cjs/channel.js +56 -19
- package/dist/cjs/disconnected-reason-mapper.js +31 -0
- package/dist/cjs/error-code-mapper.js +43 -2
- package/dist/cjs/helpers/const.js +1 -1
- package/dist/cjs/helpers/utils.js +9 -14
- package/dist/cjs/provider/catchup.js +147 -0
- package/dist/cjs/{provider.js → provider/index.js} +176 -265
- package/dist/cjs/socket-io-provider.js +1 -1
- package/dist/cjs/version.json +1 -1
- package/dist/es2019/channel.js +34 -7
- package/dist/es2019/disconnected-reason-mapper.js +23 -0
- package/dist/es2019/error-code-mapper.js +38 -0
- package/dist/es2019/helpers/utils.js +9 -14
- package/dist/es2019/provider/catchup.js +91 -0
- package/dist/es2019/{provider.js → provider/index.js} +126 -195
- package/dist/es2019/version.json +1 -1
- package/dist/esm/channel.js +54 -19
- package/dist/esm/disconnected-reason-mapper.js +23 -0
- package/dist/esm/error-code-mapper.js +38 -0
- package/dist/esm/helpers/utils.js +8 -13
- package/dist/esm/provider/catchup.js +131 -0
- package/dist/esm/{provider.js → provider/index.js} +180 -267
- package/dist/esm/version.json +1 -1
- package/dist/types/channel.d.ts +18 -26
- package/dist/types/disconnected-reason-mapper.d.ts +15 -0
- package/dist/types/error-code-mapper.d.ts +3 -0
- package/dist/types/helpers/utils.d.ts +2 -2
- package/dist/types/index.d.ts +1 -1
- package/dist/types/provider/catchup.d.ts +24 -0
- package/dist/types/{provider.d.ts → provider/index.d.ts} +22 -11
- package/package.json +11 -8
- package/provider/package.json +0 -7
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.
|
|
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) {
|
package/dist/cjs/channel.js
CHANGED
|
@@ -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('
|
|
158
|
-
_this2.emit('
|
|
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('
|
|
176
|
-
_this2.emit('
|
|
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 =
|
|
268
|
+
_context2.next = 15;
|
|
257
269
|
break;
|
|
258
270
|
}
|
|
259
271
|
|
|
260
|
-
_context2.next =
|
|
272
|
+
_context2.next = 9;
|
|
261
273
|
return this.config.permissionTokenRefresh();
|
|
262
274
|
|
|
263
|
-
case
|
|
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 =
|
|
286
|
+
_context2.next = 16;
|
|
275
287
|
break;
|
|
276
288
|
|
|
277
|
-
case
|
|
289
|
+
case 15:
|
|
278
290
|
_context2.t4 = {};
|
|
279
291
|
|
|
280
|
-
case
|
|
292
|
+
case 16:
|
|
281
293
|
_context2.t8 = _context2.t4;
|
|
282
294
|
_context2.t9 = (0, _context2.t2)(_context2.t3, _context2.t8);
|
|
283
|
-
_context2.next =
|
|
295
|
+
_context2.next = 20;
|
|
284
296
|
return _context2.t0.requestService.call(_context2.t0, _context2.t1, _context2.t9);
|
|
285
297
|
|
|
286
|
-
case
|
|
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
|
|
300
|
-
_context2.prev =
|
|
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
|
|
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,
|
|
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.
|
|
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
|
-
|
|
30
|
-
|
|
31
|
-
return Promise.resolve({
|
|
25
|
+
logger('getParticipant: ', userId);
|
|
26
|
+
return {
|
|
32
27
|
userId: userId,
|
|
33
|
-
name:
|
|
34
|
-
avatar:
|
|
35
|
-
email: "".concat(
|
|
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;
|