@atlaskit/collab-provider 8.3.0 → 8.4.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 +16 -0
- package/dist/cjs/analytics/index.js +2 -1
- package/dist/cjs/analytics/performance.js +1 -0
- package/dist/cjs/channel.js +230 -120
- package/dist/cjs/{error-code-mapper.js → errors/error-code-mapper.js} +1 -1
- package/dist/cjs/errors/error-types.js +43 -0
- package/dist/cjs/helpers/const.js +2 -4
- package/dist/cjs/provider/commit-step.js +39 -35
- package/dist/cjs/provider/index.js +71 -56
- package/dist/cjs/version-wrapper.js +1 -1
- package/dist/cjs/version.json +1 -1
- package/dist/es2019/analytics/index.js +2 -1
- package/dist/es2019/analytics/performance.js +1 -0
- package/dist/es2019/channel.js +116 -48
- package/dist/es2019/{error-code-mapper.js → errors/error-code-mapper.js} +1 -1
- package/dist/es2019/errors/error-types.js +13 -0
- package/dist/es2019/helpers/const.js +2 -4
- package/dist/es2019/provider/commit-step.js +37 -33
- package/dist/es2019/provider/index.js +83 -71
- package/dist/es2019/version-wrapper.js +1 -1
- package/dist/es2019/version.json +1 -1
- package/dist/esm/analytics/index.js +2 -1
- package/dist/esm/analytics/performance.js +1 -0
- package/dist/esm/channel.js +231 -121
- package/dist/esm/{error-code-mapper.js → errors/error-code-mapper.js} +1 -1
- package/dist/esm/errors/error-types.js +34 -0
- package/dist/esm/helpers/const.js +2 -4
- package/dist/esm/provider/commit-step.js +39 -35
- package/dist/esm/provider/index.js +70 -56
- package/dist/esm/version-wrapper.js +1 -1
- package/dist/esm/version.json +1 -1
- package/dist/types/analytics/performance.d.ts +2 -1
- package/dist/types/channel.d.ts +5 -0
- package/dist/types/{error-code-mapper.d.ts → errors/error-code-mapper.d.ts} +1 -1
- package/dist/types/errors/error-types.d.ts +8 -0
- package/dist/types/helpers/const.d.ts +29 -6
- package/dist/types/provider/index.d.ts +15 -1
- package/dist/types/socket-io-provider.d.ts +2 -2
- package/dist/types/types.d.ts +18 -3
- package/package.json +3 -3
- package/report.api.md +21 -4
- package/error-code-mapper/package.json +0 -15
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,21 @@
|
|
|
1
1
|
# @atlaskit/collab-provider
|
|
2
2
|
|
|
3
|
+
## 8.4.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- [`eae755e434a`](https://bitbucket.org/atlassian/atlassian-frontend/commits/eae755e434a) - [ESS-3269] Don't return an empty document if something goes wrong when returning the final acknowledge state from the collab provider
|
|
8
|
+
- [`ca548613b49`](https://bitbucket.org/atlassian/atlassian-frontend/commits/ca548613b49) - ESS-3218 Add new configuration option throwOnNotConnected, which will throw not connected errors when attempting to save data whilst client is offline.
|
|
9
|
+
- [`329d3bb4e05`](https://bitbucket.org/atlassian/atlassian-frontend/commits/329d3bb4e05) - ESS-2962: added canCache flag in Config for Collab-provider. Channel now stores token locally if canCache flag is passed. Uses local token for reconnections if connection is lost for errors other that 401 and 403.
|
|
10
|
+
- [`1b9c38c7f48`](https://bitbucket.org/atlassian/atlassian-frontend/commits/1b9c38c7f48) - [ESS-3269] Added error handling and metrics for retrieving the current state
|
|
11
|
+
|
|
12
|
+
### Patch Changes
|
|
13
|
+
|
|
14
|
+
- [`2a076027203`](https://bitbucket.org/atlassian/atlassian-frontend/commits/2a076027203) - NO-ISSUE fix the permission error on permissionTokenRefresh
|
|
15
|
+
- [`bde10feab09`](https://bitbucket.org/atlassian/atlassian-frontend/commits/bde10feab09) - Avoid using callbacks when initialising socket connection
|
|
16
|
+
- [`f9a6a671d14`](https://bitbucket.org/atlassian/atlassian-frontend/commits/f9a6a671d14) - add comment to indicate that disconnect handler will be called when Firefox reload
|
|
17
|
+
- Updated dependencies
|
|
18
|
+
|
|
3
19
|
## 8.3.0
|
|
4
20
|
|
|
5
21
|
### Minor Changes
|
|
@@ -67,7 +67,8 @@ var AnalyticsHelper = /*#__PURE__*/function () {
|
|
|
67
67
|
eventAction: _const.EVENT_ACTION.ERROR,
|
|
68
68
|
attributes: {
|
|
69
69
|
documentAri: this.documentAri,
|
|
70
|
-
errorMessage: errorMessage
|
|
70
|
+
errorMessage: errorMessage,
|
|
71
|
+
errorName: error instanceof Error ? error.name : undefined
|
|
71
72
|
},
|
|
72
73
|
nonPrivacySafeAttributes: {
|
|
73
74
|
error: error
|
|
@@ -13,6 +13,7 @@ exports.MEASURE_NAME = MEASURE_NAME;
|
|
|
13
13
|
MEASURE_NAME["DOCUMENT_INIT"] = "documentInit";
|
|
14
14
|
MEASURE_NAME["COMMIT_UNCONFIRMED_STEPS"] = "commitUnconfirmedSteps";
|
|
15
15
|
MEASURE_NAME["PUBLISH_PAGE"] = "publishPage";
|
|
16
|
+
MEASURE_NAME["GET_CURRENT_STATE"] = "getCurrentState";
|
|
16
17
|
})(MEASURE_NAME || (exports.MEASURE_NAME = MEASURE_NAME = {}));
|
|
17
18
|
var isPerformanceAPIAvailable = function isPerformanceAPIAvailable() {
|
|
18
19
|
return typeof window !== 'undefined' && 'performance' in window && ['measure', 'clearMeasures', 'clearMarks', 'getEntriesByName', 'getEntriesByType'].every(function (api) {
|
package/dist/cjs/channel.js
CHANGED
|
@@ -16,13 +16,15 @@ var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/ge
|
|
|
16
16
|
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
17
17
|
var _utilServiceSupport = require("@atlaskit/util-service-support");
|
|
18
18
|
var _emitter = require("./emitter");
|
|
19
|
-
var _errorCodeMapper = require("./error-code-mapper");
|
|
19
|
+
var _errorCodeMapper = require("./errors/error-code-mapper");
|
|
20
20
|
var _utils = require("./helpers/utils");
|
|
21
21
|
var _performance = require("./analytics/performance");
|
|
22
22
|
var _const = require("./helpers/const");
|
|
23
23
|
var _reconnectHelper = _interopRequireDefault(require("./connectivity/reconnect-helper"));
|
|
24
24
|
var _ufo = require("./analytics/ufo");
|
|
25
|
+
var _disconnectedReasonMapper = require("./disconnected-reason-mapper");
|
|
25
26
|
var _network = _interopRequireDefault(require("./connectivity/network"));
|
|
27
|
+
var _errorTypes = require("./errors/error-types");
|
|
26
28
|
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; }
|
|
27
29
|
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
|
|
28
30
|
function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2.default)(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2.default)(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2.default)(this, result); }; }
|
|
@@ -49,32 +51,63 @@ var Channel = /*#__PURE__*/function (_Emitter) {
|
|
|
49
51
|
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "getSocket", function () {
|
|
50
52
|
return _this.socket;
|
|
51
53
|
});
|
|
54
|
+
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "getToken", function () {
|
|
55
|
+
return _this.token;
|
|
56
|
+
});
|
|
57
|
+
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "setToken", function (value) {
|
|
58
|
+
if (_this.config.cacheToken) {
|
|
59
|
+
_this.token = value;
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "unsetToken", function () {
|
|
63
|
+
return _this.setToken();
|
|
64
|
+
});
|
|
65
|
+
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "handlePermissionInvalidateToken", function (data) {
|
|
66
|
+
var _this$analyticsHelper;
|
|
67
|
+
logger('Received permission invalidate event ', data);
|
|
68
|
+
(_this$analyticsHelper = _this.analyticsHelper) === null || _this$analyticsHelper === void 0 ? void 0 : _this$analyticsHelper.sendActionEvent(_const.EVENT_ACTION.INVALIDATE_TOKEN, _const.EVENT_STATUS.SUCCESS, {
|
|
69
|
+
reason: data.reason,
|
|
70
|
+
// Potentially incorrect when value of token changes between connecting and connect.
|
|
71
|
+
// See: https://bitbucket.org/atlassian/%7Bc8e2f021-38d2-46d0-9b7a-b3f7b428f724%7D/pull-requests/29905#comment-375308874
|
|
72
|
+
usedCachedToken: _this.token ? true : false
|
|
73
|
+
});
|
|
74
|
+
_this.unsetToken();
|
|
75
|
+
});
|
|
52
76
|
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "onConnectError", function (error) {
|
|
53
|
-
var _this$
|
|
77
|
+
var _this$analyticsHelper2, _this$analyticsHelper3;
|
|
54
78
|
var measure = (0, _performance.stopMeasure)(_performance.MEASURE_NAME.SOCKET_CONNECT, _this.analyticsHelper);
|
|
55
|
-
(_this$
|
|
56
|
-
latency: measure === null || measure === void 0 ? void 0 : measure.duration
|
|
79
|
+
(_this$analyticsHelper2 = _this.analyticsHelper) === null || _this$analyticsHelper2 === void 0 ? void 0 : _this$analyticsHelper2.sendActionEvent(_const.EVENT_ACTION.CONNECTION, _const.EVENT_STATUS.FAILURE, {
|
|
80
|
+
latency: measure === null || measure === void 0 ? void 0 : measure.duration,
|
|
81
|
+
// Potentially incorrect when value of token changes between connecting and connect.
|
|
82
|
+
// See: https://bitbucket.org/atlassian/%7Bc8e2f021-38d2-46d0-9b7a-b3f7b428f724%7D/pull-requests/29905#comment-375308874
|
|
83
|
+
usedCachedToken: _this.token ? true : false
|
|
57
84
|
});
|
|
58
|
-
(_this$
|
|
85
|
+
(_this$analyticsHelper3 = _this.analyticsHelper) === null || _this$analyticsHelper3 === void 0 ? void 0 : _this$analyticsHelper3.sendErrorEvent(error, 'Error while establishing connection');
|
|
59
86
|
// If error received with `data`, it means the connection is rejected
|
|
60
87
|
// by the server on purpose for example no permission, so no need to
|
|
61
88
|
// keep the underneath connection, need to close. But some error like
|
|
62
89
|
// `xhr polling error` needs to retry.
|
|
63
|
-
|
|
90
|
+
var errorData = error.data;
|
|
91
|
+
if (errorData) {
|
|
64
92
|
var _this$socket;
|
|
93
|
+
// We only want to refresh the token if only its invalid
|
|
94
|
+
if ([401, 403].includes(errorData.status)) {
|
|
95
|
+
//nullify token so it is forced to generate new token on reconnect
|
|
96
|
+
_this.unsetToken();
|
|
97
|
+
}
|
|
65
98
|
(_this$socket = _this.socket) === null || _this$socket === void 0 ? void 0 : _this$socket.close();
|
|
66
99
|
}
|
|
67
100
|
_this.emit('error', {
|
|
68
101
|
message: error.message,
|
|
69
|
-
data:
|
|
102
|
+
data: errorData
|
|
70
103
|
});
|
|
71
104
|
});
|
|
72
105
|
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "onReconnectError", function (error) {
|
|
73
106
|
var _this$reconnectHelper, _this$reconnectHelper2;
|
|
74
107
|
(_this$reconnectHelper = _this.reconnectHelper) === null || _this$reconnectHelper === void 0 ? void 0 : _this$reconnectHelper.countReconnectError();
|
|
75
108
|
if ((_this$reconnectHelper2 = _this.reconnectHelper) !== null && _this$reconnectHelper2 !== void 0 && _this$reconnectHelper2.isLikelyNetworkIssue()) {
|
|
76
|
-
var _this$
|
|
77
|
-
(_this$
|
|
109
|
+
var _this$analyticsHelper4;
|
|
110
|
+
(_this$analyticsHelper4 = _this.analyticsHelper) === null || _this$analyticsHelper4 === void 0 ? void 0 : _this$analyticsHelper4.sendErrorEvent(error, 'Likely network issue while reconnecting the channel');
|
|
78
111
|
_this.emit('error', {
|
|
79
112
|
message: 'Reconnection failed 8 times when browser was offline, likely there was a network issue.',
|
|
80
113
|
data: {
|
|
@@ -85,12 +118,15 @@ var Channel = /*#__PURE__*/function (_Emitter) {
|
|
|
85
118
|
}
|
|
86
119
|
});
|
|
87
120
|
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "onConnect", function () {
|
|
88
|
-
var _this$
|
|
121
|
+
var _this$analyticsHelper5;
|
|
89
122
|
_this.connected = true;
|
|
90
123
|
logger('Connected.', _this.socket.id);
|
|
91
124
|
var measure = (0, _performance.stopMeasure)(_performance.MEASURE_NAME.SOCKET_CONNECT, _this.analyticsHelper);
|
|
92
|
-
(_this$
|
|
93
|
-
latency: measure === null || measure === void 0 ? void 0 : measure.duration
|
|
125
|
+
(_this$analyticsHelper5 = _this.analyticsHelper) === null || _this$analyticsHelper5 === void 0 ? void 0 : _this$analyticsHelper5.sendActionEvent(_const.EVENT_ACTION.CONNECTION, _const.EVENT_STATUS.SUCCESS, {
|
|
126
|
+
latency: measure === null || measure === void 0 ? void 0 : measure.duration,
|
|
127
|
+
// Potentially incorrect when value of token changes between connecting and connect.
|
|
128
|
+
// See: https://bitbucket.org/atlassian/%7Bc8e2f021-38d2-46d0-9b7a-b3f7b428f724%7D/pull-requests/29905#comment-375308874
|
|
129
|
+
usedCachedToken: _this.token ? true : false
|
|
94
130
|
});
|
|
95
131
|
_this.emit('connected', {
|
|
96
132
|
sid: _this.socket.id,
|
|
@@ -102,10 +138,10 @@ var Channel = /*#__PURE__*/function (_Emitter) {
|
|
|
102
138
|
logger('Session ID is', _this.socket.id);
|
|
103
139
|
if (data.type === 'initial') {
|
|
104
140
|
if (!_this.initialized) {
|
|
105
|
-
var _this$initExperience, _this$
|
|
141
|
+
var _this$initExperience, _this$analyticsHelper6;
|
|
106
142
|
var measure = (0, _performance.stopMeasure)(_performance.MEASURE_NAME.DOCUMENT_INIT, _this.analyticsHelper);
|
|
107
143
|
(_this$initExperience = _this.initExperience) === null || _this$initExperience === void 0 ? void 0 : _this$initExperience.success();
|
|
108
|
-
(_this$
|
|
144
|
+
(_this$analyticsHelper6 = _this.analyticsHelper) === null || _this$analyticsHelper6 === void 0 ? void 0 : _this$analyticsHelper6.sendActionEvent(_const.EVENT_ACTION.DOCUMENT_INIT,
|
|
109
145
|
// TODO: detect when document init fails and fire corresponding event for it
|
|
110
146
|
_const.EVENT_STATUS.SUCCESS, {
|
|
111
147
|
latency: measure === null || measure === void 0 ? void 0 : measure.duration,
|
|
@@ -173,34 +209,76 @@ var Channel = /*#__PURE__*/function (_Emitter) {
|
|
|
173
209
|
documentAri = _this$config.documentAri,
|
|
174
210
|
url = _this$config.url;
|
|
175
211
|
var createSocket = this.config.createSocket;
|
|
176
|
-
var
|
|
177
|
-
|
|
212
|
+
var _this$config2 = this.config,
|
|
213
|
+
permissionTokenRefresh = _this$config2.permissionTokenRefresh,
|
|
214
|
+
cacheToken = _this$config2.cacheToken;
|
|
215
|
+
var auth;
|
|
216
|
+
var authData = {
|
|
217
|
+
// The initialized status. If false, BE will send document, otherwise not.
|
|
218
|
+
initialized: this.initialized,
|
|
219
|
+
// ESS-1009 Allow to opt-in into 404 response
|
|
220
|
+
need404: this.config.need404
|
|
221
|
+
};
|
|
178
222
|
if (permissionTokenRefresh) {
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
223
|
+
auth = /*#__PURE__*/function () {
|
|
224
|
+
var _ref = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(cb) {
|
|
225
|
+
var token, newErr;
|
|
226
|
+
return _regenerator.default.wrap(function _callee$(_context) {
|
|
227
|
+
while (1) {
|
|
228
|
+
switch (_context.prev = _context.next) {
|
|
229
|
+
case 0:
|
|
230
|
+
if (!(cacheToken && _this2.token)) {
|
|
231
|
+
_context.next = 5;
|
|
232
|
+
break;
|
|
233
|
+
}
|
|
234
|
+
authData.token = _this2.token;
|
|
235
|
+
cb(authData);
|
|
236
|
+
_context.next = 17;
|
|
237
|
+
break;
|
|
238
|
+
case 5:
|
|
239
|
+
_context.prev = 5;
|
|
240
|
+
_context.next = 8;
|
|
241
|
+
return permissionTokenRefresh();
|
|
242
|
+
case 8:
|
|
243
|
+
token = _context.sent;
|
|
244
|
+
if (token) {
|
|
245
|
+
// save token locally
|
|
246
|
+
_this2.setToken(token);
|
|
247
|
+
authData.token = token;
|
|
248
|
+
}
|
|
249
|
+
cb(authData);
|
|
250
|
+
_context.next = 17;
|
|
251
|
+
break;
|
|
252
|
+
case 13:
|
|
253
|
+
_context.prev = 13;
|
|
254
|
+
_context.t0 = _context["catch"](5);
|
|
255
|
+
newErr = {
|
|
256
|
+
message: _context.t0.message ? _context.t0.message : 'Content not found',
|
|
257
|
+
data: {
|
|
258
|
+
status: 403,
|
|
259
|
+
code: _context.t0.data.code ? _context.t0.data.code : 'INSUFFICIENT_EDITING_PERMISSION',
|
|
260
|
+
meta: {
|
|
261
|
+
description: _context.t0.data.meta.description ? _context.t0.data.meta.description : 'RESOURCE_DELETED',
|
|
262
|
+
reason: _context.t0.data.meta.reason ? _context.t0.data.meta.reason : 'RESOURCE_DELETED'
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
};
|
|
266
|
+
_this2.emit('error', newErr);
|
|
267
|
+
case 17:
|
|
268
|
+
case "end":
|
|
269
|
+
return _context.stop();
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
}, _callee, null, [[5, 13]]);
|
|
273
|
+
}));
|
|
274
|
+
return function auth(_x) {
|
|
275
|
+
return _ref.apply(this, arguments);
|
|
276
|
+
};
|
|
277
|
+
}();
|
|
193
278
|
} else {
|
|
194
|
-
|
|
195
|
-
cb({
|
|
196
|
-
// The initialized status. If false, BE will send document, otherwise not.
|
|
197
|
-
initialized: _this2.initialized,
|
|
198
|
-
// ESS-1009 Allow to opt-in into 404 response
|
|
199
|
-
need404: _this2.config.need404
|
|
200
|
-
});
|
|
201
|
-
};
|
|
279
|
+
auth = authData;
|
|
202
280
|
}
|
|
203
|
-
this.socket = createSocket("".concat(url, "/session/").concat(documentAri),
|
|
281
|
+
this.socket = createSocket("".concat(url, "/session/").concat(documentAri), auth, this.config.productInfo);
|
|
204
282
|
|
|
205
283
|
// Due to https://github.com/socketio/socket.io-client/issues/1473,
|
|
206
284
|
// reconnect no longer fired on the socket.
|
|
@@ -222,11 +300,11 @@ var Channel = /*#__PURE__*/function (_Emitter) {
|
|
|
222
300
|
this.socket.on('participant:left', function (data) {
|
|
223
301
|
_this2.emit('participant:left', data);
|
|
224
302
|
});
|
|
225
|
-
this.socket.on('participant:updated', function (
|
|
226
|
-
var sessionId =
|
|
227
|
-
timestamp =
|
|
228
|
-
data =
|
|
229
|
-
clientId =
|
|
303
|
+
this.socket.on('participant:updated', function (_ref2) {
|
|
304
|
+
var sessionId = _ref2.sessionId,
|
|
305
|
+
timestamp = _ref2.timestamp,
|
|
306
|
+
data = _ref2.data,
|
|
307
|
+
clientId = _ref2.clientId;
|
|
230
308
|
_this2.emit('participant:updated', _objectSpread({
|
|
231
309
|
sessionId: sessionId,
|
|
232
310
|
timestamp: timestamp,
|
|
@@ -242,18 +320,18 @@ var Channel = /*#__PURE__*/function (_Emitter) {
|
|
|
242
320
|
_this2.emit('status', data);
|
|
243
321
|
});
|
|
244
322
|
this.socket.on('disconnect', /*#__PURE__*/function () {
|
|
245
|
-
var
|
|
323
|
+
var _ref3 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee2(reason) {
|
|
246
324
|
var _this2$analyticsHelpe;
|
|
247
|
-
return _regenerator.default.wrap(function
|
|
325
|
+
return _regenerator.default.wrap(function _callee2$(_context2) {
|
|
248
326
|
while (1) {
|
|
249
|
-
switch (
|
|
327
|
+
switch (_context2.prev = _context2.next) {
|
|
250
328
|
case 0:
|
|
251
329
|
_this2.connected = false;
|
|
252
330
|
logger("disconnect reason: ".concat(reason));
|
|
253
331
|
_this2.emit('disconnect', {
|
|
254
332
|
reason: reason
|
|
255
333
|
});
|
|
256
|
-
if (reason ===
|
|
334
|
+
if (reason === _disconnectedReasonMapper.socketIOReasons.IO_SERVER_DISCONNECT && _this2.socket) {
|
|
257
335
|
// The disconnection was initiated by the server, we need to reconnect manually.
|
|
258
336
|
try {
|
|
259
337
|
_this2.socket.connect();
|
|
@@ -270,13 +348,13 @@ var Channel = /*#__PURE__*/function (_Emitter) {
|
|
|
270
348
|
}
|
|
271
349
|
case 4:
|
|
272
350
|
case "end":
|
|
273
|
-
return
|
|
351
|
+
return _context2.stop();
|
|
274
352
|
}
|
|
275
353
|
}
|
|
276
|
-
},
|
|
354
|
+
}, _callee2);
|
|
277
355
|
}));
|
|
278
|
-
return function (
|
|
279
|
-
return
|
|
356
|
+
return function (_x2) {
|
|
357
|
+
return _ref3.apply(this, arguments);
|
|
280
358
|
};
|
|
281
359
|
}());
|
|
282
360
|
|
|
@@ -288,6 +366,7 @@ var Channel = /*#__PURE__*/function (_Emitter) {
|
|
|
288
366
|
// `connect_error`'s parameter type is `Error`.
|
|
289
367
|
// Ensure the error emit to the provider has the same structure, so we can handle them unified.
|
|
290
368
|
this.socket.on('connect_error', this.onConnectError);
|
|
369
|
+
this.socket.on('permission:invalidateToken', this.handlePermissionInvalidateToken);
|
|
291
370
|
|
|
292
371
|
// To trigger reconnection when browser comes back online
|
|
293
372
|
if (!this.network) {
|
|
@@ -304,121 +383,139 @@ var Channel = /*#__PURE__*/function (_Emitter) {
|
|
|
304
383
|
}, {
|
|
305
384
|
key: "fetchCatchup",
|
|
306
385
|
value: function () {
|
|
307
|
-
var _fetchCatchup = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function
|
|
308
|
-
var
|
|
309
|
-
|
|
386
|
+
var _fetchCatchup = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee3(fromVersion) {
|
|
387
|
+
var _this3 = this;
|
|
388
|
+
var _ref4, _this$token, _yield$utils$requestS, doc, version, stepMaps, metadata, errorNotFound, errorCatchup;
|
|
389
|
+
return _regenerator.default.wrap(function _callee3$(_context3) {
|
|
310
390
|
while (1) {
|
|
311
|
-
switch (
|
|
391
|
+
switch (_context3.prev = _context3.next) {
|
|
312
392
|
case 0:
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
393
|
+
_context3.prev = 0;
|
|
394
|
+
_context3.t0 = _utilServiceSupport.utils;
|
|
395
|
+
_context3.t1 = this.config;
|
|
396
|
+
_context3.t2 = "document/".concat(encodeURIComponent(this.config.documentAri), "/catchup");
|
|
397
|
+
_context3.t3 = {
|
|
318
398
|
version: fromVersion
|
|
319
399
|
};
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
400
|
+
_context3.t4 = _objectSpread;
|
|
401
|
+
_context3.t5 = _objectSpread;
|
|
402
|
+
_context3.t6 = {};
|
|
323
403
|
if (!this.config.permissionTokenRefresh) {
|
|
324
|
-
|
|
404
|
+
_context3.next = 29;
|
|
325
405
|
break;
|
|
326
406
|
}
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
case 11:
|
|
330
|
-
_context2.t9 = _yield$this$config$pe = _context2.sent;
|
|
331
|
-
_context2.t8 = _context2.t9 !== null;
|
|
332
|
-
if (!_context2.t8) {
|
|
333
|
-
_context2.next = 15;
|
|
407
|
+
if (!((_this$token = this.token) !== null && _this$token !== void 0)) {
|
|
408
|
+
_context3.next = 13;
|
|
334
409
|
break;
|
|
335
410
|
}
|
|
336
|
-
|
|
411
|
+
_context3.t9 = _this$token;
|
|
412
|
+
_context3.next = 16;
|
|
413
|
+
break;
|
|
414
|
+
case 13:
|
|
415
|
+
_context3.next = 15;
|
|
416
|
+
return this.config.permissionTokenRefresh().then(function (token) {
|
|
417
|
+
if (token) {
|
|
418
|
+
_this3.setToken(token);
|
|
419
|
+
}
|
|
420
|
+
return token;
|
|
421
|
+
});
|
|
337
422
|
case 15:
|
|
338
|
-
|
|
339
|
-
|
|
423
|
+
_context3.t9 = _context3.sent;
|
|
424
|
+
case 16:
|
|
425
|
+
_context3.t10 = _ref4 = _context3.t9;
|
|
426
|
+
_context3.t8 = _context3.t10 !== null;
|
|
427
|
+
if (!_context3.t8) {
|
|
428
|
+
_context3.next = 20;
|
|
340
429
|
break;
|
|
341
430
|
}
|
|
342
|
-
|
|
343
|
-
_context2.next = 20;
|
|
344
|
-
break;
|
|
345
|
-
case 19:
|
|
346
|
-
_context2.t10 = undefined;
|
|
431
|
+
_context3.t8 = _ref4 !== void 0;
|
|
347
432
|
case 20:
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
}
|
|
352
|
-
|
|
433
|
+
if (!_context3.t8) {
|
|
434
|
+
_context3.next = 24;
|
|
435
|
+
break;
|
|
436
|
+
}
|
|
437
|
+
_context3.t11 = _ref4;
|
|
438
|
+
_context3.next = 25;
|
|
353
439
|
break;
|
|
354
440
|
case 24:
|
|
355
|
-
|
|
441
|
+
_context3.t11 = undefined;
|
|
356
442
|
case 25:
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
443
|
+
_context3.t12 = _context3.t11;
|
|
444
|
+
_context3.t7 = {
|
|
445
|
+
'x-token': _context3.t12
|
|
446
|
+
};
|
|
447
|
+
_context3.next = 30;
|
|
448
|
+
break;
|
|
449
|
+
case 29:
|
|
450
|
+
_context3.t7 = {};
|
|
451
|
+
case 30:
|
|
452
|
+
_context3.t13 = _context3.t7;
|
|
453
|
+
_context3.t14 = (0, _context3.t5)(_context3.t6, _context3.t13);
|
|
454
|
+
_context3.t15 = {};
|
|
455
|
+
_context3.t16 = {
|
|
361
456
|
'x-product': (0, _utils.getProduct)(this.config.productInfo),
|
|
362
457
|
'x-subproduct': (0, _utils.getSubProduct)(this.config.productInfo)
|
|
363
458
|
};
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
headers:
|
|
459
|
+
_context3.t17 = (0, _context3.t4)(_context3.t14, _context3.t15, _context3.t16);
|
|
460
|
+
_context3.t18 = {
|
|
461
|
+
headers: _context3.t17
|
|
367
462
|
};
|
|
368
|
-
|
|
369
|
-
path:
|
|
370
|
-
queryParams:
|
|
371
|
-
requestInit:
|
|
463
|
+
_context3.t19 = {
|
|
464
|
+
path: _context3.t2,
|
|
465
|
+
queryParams: _context3.t3,
|
|
466
|
+
requestInit: _context3.t18
|
|
372
467
|
};
|
|
373
|
-
|
|
374
|
-
return
|
|
375
|
-
case
|
|
376
|
-
_yield$utils$requestS =
|
|
468
|
+
_context3.next = 39;
|
|
469
|
+
return _context3.t0.requestService.call(_context3.t0, _context3.t1, _context3.t19);
|
|
470
|
+
case 39:
|
|
471
|
+
_yield$utils$requestS = _context3.sent;
|
|
377
472
|
doc = _yield$utils$requestS.doc;
|
|
378
473
|
version = _yield$utils$requestS.version;
|
|
379
474
|
stepMaps = _yield$utils$requestS.stepMaps;
|
|
380
475
|
metadata = _yield$utils$requestS.metadata;
|
|
381
|
-
return
|
|
476
|
+
return _context3.abrupt("return", {
|
|
382
477
|
doc: doc,
|
|
383
478
|
version: version,
|
|
384
479
|
stepMaps: stepMaps,
|
|
385
480
|
metadata: metadata
|
|
386
481
|
});
|
|
387
|
-
case
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
if (!(
|
|
391
|
-
|
|
482
|
+
case 47:
|
|
483
|
+
_context3.prev = 47;
|
|
484
|
+
_context3.t20 = _context3["catch"](0);
|
|
485
|
+
if (!(_context3.t20.code === 404)) {
|
|
486
|
+
_context3.next = 53;
|
|
392
487
|
break;
|
|
393
488
|
}
|
|
394
489
|
errorNotFound = {
|
|
395
490
|
message: _errorCodeMapper.ErrorCodeMapper.documentNotFound.message,
|
|
396
491
|
data: {
|
|
397
|
-
status:
|
|
492
|
+
status: _context3.t20.code,
|
|
398
493
|
code: _errorCodeMapper.ErrorCodeMapper.documentNotFound.code
|
|
399
494
|
}
|
|
400
495
|
};
|
|
401
496
|
this.emit('error', errorNotFound);
|
|
402
|
-
return
|
|
403
|
-
case
|
|
404
|
-
|
|
497
|
+
return _context3.abrupt("return", {});
|
|
498
|
+
case 53:
|
|
499
|
+
//nullify token so it is forced to generate new token on reconnect
|
|
500
|
+
this.unsetToken();
|
|
501
|
+
logger("Can't fetch the catchup", _context3.t20.message);
|
|
405
502
|
errorCatchup = {
|
|
406
503
|
message: _errorCodeMapper.ErrorCodeMapper.catchupFail.message,
|
|
407
504
|
data: {
|
|
408
|
-
status:
|
|
505
|
+
status: _context3.t20.status,
|
|
409
506
|
code: _errorCodeMapper.ErrorCodeMapper.catchupFail.code
|
|
410
507
|
}
|
|
411
508
|
};
|
|
412
509
|
this.emit('error', errorCatchup);
|
|
413
|
-
throw
|
|
414
|
-
case
|
|
510
|
+
throw _context3.t20;
|
|
511
|
+
case 58:
|
|
415
512
|
case "end":
|
|
416
|
-
return
|
|
513
|
+
return _context3.stop();
|
|
417
514
|
}
|
|
418
515
|
}
|
|
419
|
-
},
|
|
516
|
+
}, _callee3, this, [[0, 47]]);
|
|
420
517
|
}));
|
|
421
|
-
function fetchCatchup(
|
|
518
|
+
function fetchCatchup(_x3) {
|
|
422
519
|
return _fetchCatchup.apply(this, arguments);
|
|
423
520
|
}
|
|
424
521
|
return fetchCatchup;
|
|
@@ -429,7 +526,13 @@ var Channel = /*#__PURE__*/function (_Emitter) {
|
|
|
429
526
|
}, {
|
|
430
527
|
key: "broadcast",
|
|
431
528
|
value: function broadcast(type, data, callback) {
|
|
432
|
-
if (!this.
|
|
529
|
+
if (!this.socket) {
|
|
530
|
+
throw new _errorTypes.NotInitializedError('Cannot broadcast, not initialized yet');
|
|
531
|
+
}
|
|
532
|
+
if (!this.connected) {
|
|
533
|
+
if (this.config.throwOnNotConnected) {
|
|
534
|
+
throw new _errorTypes.NotConnectedError('Cannot broadcast, currently offline.');
|
|
535
|
+
}
|
|
433
536
|
return;
|
|
434
537
|
}
|
|
435
538
|
this.socket.emit('broadcast', _objectSpread({
|
|
@@ -439,8 +542,13 @@ var Channel = /*#__PURE__*/function (_Emitter) {
|
|
|
439
542
|
}, {
|
|
440
543
|
key: "sendMetadata",
|
|
441
544
|
value: function sendMetadata(metadata) {
|
|
442
|
-
if (!this.
|
|
443
|
-
|
|
545
|
+
if (!this.socket) {
|
|
546
|
+
throw new _errorTypes.NotInitializedError('Cannot send metadata, not initialized yet');
|
|
547
|
+
}
|
|
548
|
+
if (!this.connected) {
|
|
549
|
+
if (this.config.throwOnNotConnected) {
|
|
550
|
+
throw new _errorTypes.NotConnectedError('Cannot send metadata, currently offline.');
|
|
551
|
+
}
|
|
444
552
|
}
|
|
445
553
|
this.socket.emit('metadata', metadata);
|
|
446
554
|
}
|
|
@@ -459,6 +567,8 @@ var Channel = /*#__PURE__*/function (_Emitter) {
|
|
|
459
567
|
this.unsubscribeAll();
|
|
460
568
|
(_this$network = this.network) === null || _this$network === void 0 ? void 0 : _this$network.destroy();
|
|
461
569
|
this.network = null;
|
|
570
|
+
//nullify token so it is forced to generate new token on reconnect
|
|
571
|
+
this.unsetToken();
|
|
462
572
|
if (this.socket) {
|
|
463
573
|
var _this$reconnectHelper3;
|
|
464
574
|
this.socket.close();
|
|
@@ -9,7 +9,7 @@ var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
|
|
|
9
9
|
var ErrorCodeMapper = {
|
|
10
10
|
noPermissionError: {
|
|
11
11
|
code: 'NO_PERMISSION_ERROR',
|
|
12
|
-
message: 'User does not have permissions to access this document'
|
|
12
|
+
message: 'User does not have permissions to access this document or document is not found'
|
|
13
13
|
},
|
|
14
14
|
documentNotFound: {
|
|
15
15
|
code: 'DOCUMENT_NOT_FOUND',
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.NotInitializedError = exports.NotConnectedError = void 0;
|
|
8
|
+
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
|
|
9
|
+
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
|
|
10
|
+
var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized"));
|
|
11
|
+
var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
|
|
12
|
+
var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
|
|
13
|
+
var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
|
|
14
|
+
var _wrapNativeSuper2 = _interopRequireDefault(require("@babel/runtime/helpers/wrapNativeSuper"));
|
|
15
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
16
|
+
function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2.default)(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2.default)(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2.default)(this, result); }; }
|
|
17
|
+
function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
|
|
18
|
+
var NotConnectedError = /*#__PURE__*/function (_Error) {
|
|
19
|
+
(0, _inherits2.default)(NotConnectedError, _Error);
|
|
20
|
+
var _super = _createSuper(NotConnectedError);
|
|
21
|
+
function NotConnectedError(message) {
|
|
22
|
+
var _this;
|
|
23
|
+
(0, _classCallCheck2.default)(this, NotConnectedError);
|
|
24
|
+
_this = _super.call(this, message);
|
|
25
|
+
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "name", 'NotConnectedError');
|
|
26
|
+
return _this;
|
|
27
|
+
}
|
|
28
|
+
return (0, _createClass2.default)(NotConnectedError);
|
|
29
|
+
}( /*#__PURE__*/(0, _wrapNativeSuper2.default)(Error));
|
|
30
|
+
exports.NotConnectedError = NotConnectedError;
|
|
31
|
+
var NotInitializedError = /*#__PURE__*/function (_Error2) {
|
|
32
|
+
(0, _inherits2.default)(NotInitializedError, _Error2);
|
|
33
|
+
var _super2 = _createSuper(NotInitializedError);
|
|
34
|
+
function NotInitializedError(message) {
|
|
35
|
+
var _this2;
|
|
36
|
+
(0, _classCallCheck2.default)(this, NotInitializedError);
|
|
37
|
+
_this2 = _super2.call(this, message);
|
|
38
|
+
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this2), "name", 'NotInitializedError');
|
|
39
|
+
return _this2;
|
|
40
|
+
}
|
|
41
|
+
return (0, _createClass2.default)(NotInitializedError);
|
|
42
|
+
}( /*#__PURE__*/(0, _wrapNativeSuper2.default)(Error));
|
|
43
|
+
exports.NotInitializedError = NotInitializedError;
|