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