@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.
Files changed (42) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/dist/cjs/analytics/index.js +2 -1
  3. package/dist/cjs/analytics/performance.js +1 -0
  4. package/dist/cjs/channel.js +230 -120
  5. package/dist/cjs/{error-code-mapper.js → errors/error-code-mapper.js} +1 -1
  6. package/dist/cjs/errors/error-types.js +43 -0
  7. package/dist/cjs/helpers/const.js +2 -4
  8. package/dist/cjs/provider/commit-step.js +39 -35
  9. package/dist/cjs/provider/index.js +71 -56
  10. package/dist/cjs/version-wrapper.js +1 -1
  11. package/dist/cjs/version.json +1 -1
  12. package/dist/es2019/analytics/index.js +2 -1
  13. package/dist/es2019/analytics/performance.js +1 -0
  14. package/dist/es2019/channel.js +116 -48
  15. package/dist/es2019/{error-code-mapper.js → errors/error-code-mapper.js} +1 -1
  16. package/dist/es2019/errors/error-types.js +13 -0
  17. package/dist/es2019/helpers/const.js +2 -4
  18. package/dist/es2019/provider/commit-step.js +37 -33
  19. package/dist/es2019/provider/index.js +83 -71
  20. package/dist/es2019/version-wrapper.js +1 -1
  21. package/dist/es2019/version.json +1 -1
  22. package/dist/esm/analytics/index.js +2 -1
  23. package/dist/esm/analytics/performance.js +1 -0
  24. package/dist/esm/channel.js +231 -121
  25. package/dist/esm/{error-code-mapper.js → errors/error-code-mapper.js} +1 -1
  26. package/dist/esm/errors/error-types.js +34 -0
  27. package/dist/esm/helpers/const.js +2 -4
  28. package/dist/esm/provider/commit-step.js +39 -35
  29. package/dist/esm/provider/index.js +70 -56
  30. package/dist/esm/version-wrapper.js +1 -1
  31. package/dist/esm/version.json +1 -1
  32. package/dist/types/analytics/performance.d.ts +2 -1
  33. package/dist/types/channel.d.ts +5 -0
  34. package/dist/types/{error-code-mapper.d.ts → errors/error-code-mapper.d.ts} +1 -1
  35. package/dist/types/errors/error-types.d.ts +8 -0
  36. package/dist/types/helpers/const.d.ts +29 -6
  37. package/dist/types/provider/index.d.ts +15 -1
  38. package/dist/types/socket-io-provider.d.ts +2 -2
  39. package/dist/types/types.d.ts +18 -3
  40. package/package.json +3 -3
  41. package/report.api.md +21 -4
  42. 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) {
@@ -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$analyticsHelper, _this$analyticsHelper2;
77
+ var _this$analyticsHelper2, _this$analyticsHelper3;
54
78
  var measure = (0, _performance.stopMeasure)(_performance.MEASURE_NAME.SOCKET_CONNECT, _this.analyticsHelper);
55
- (_this$analyticsHelper = _this.analyticsHelper) === null || _this$analyticsHelper === void 0 ? void 0 : _this$analyticsHelper.sendActionEvent(_const.EVENT_ACTION.CONNECTION, _const.EVENT_STATUS.FAILURE, {
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$analyticsHelper2 = _this.analyticsHelper) === null || _this$analyticsHelper2 === void 0 ? void 0 : _this$analyticsHelper2.sendErrorEvent(error, 'Error while establishing connection');
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
- if (!!error.data) {
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: error.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$analyticsHelper3;
77
- (_this$analyticsHelper3 = _this.analyticsHelper) === null || _this$analyticsHelper3 === void 0 ? void 0 : _this$analyticsHelper3.sendErrorEvent(error, 'Likely network issue while reconnecting the channel');
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$analyticsHelper4;
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$analyticsHelper4 = _this.analyticsHelper) === null || _this$analyticsHelper4 === void 0 ? void 0 : _this$analyticsHelper4.sendActionEvent(_const.EVENT_ACTION.CONNECTION, _const.EVENT_STATUS.SUCCESS, {
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$analyticsHelper5;
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$analyticsHelper5 = _this.analyticsHelper) === null || _this$analyticsHelper5 === void 0 ? void 0 : _this$analyticsHelper5.sendActionEvent(_const.EVENT_ACTION.DOCUMENT_INIT,
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 permissionTokenRefresh = this.config.permissionTokenRefresh;
177
- var authCb = null;
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
- authCb = function authCb(cb) {
180
- permissionTokenRefresh().then(function (token) {
181
- cb(_objectSpread(_objectSpread({}, token ? {
182
- token: token
183
- } : {}), {}, {
184
- // The initialized status. If false, BE will send document, otherwise not.
185
- initialized: _this2.initialized,
186
- // ESS-1009 Allow to opt-in into 404 response
187
- need404: _this2.config.need404
188
- }));
189
- }).catch(function (err) {
190
- _this2.emit('error', err);
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
- authCb = function authCb(cb) {
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), authCb, this.config.productInfo);
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 (_ref) {
226
- var sessionId = _ref.sessionId,
227
- timestamp = _ref.timestamp,
228
- data = _ref.data,
229
- clientId = _ref.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 _ref2 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(reason) {
323
+ var _ref3 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee2(reason) {
246
324
  var _this2$analyticsHelpe;
247
- return _regenerator.default.wrap(function _callee$(_context) {
325
+ return _regenerator.default.wrap(function _callee2$(_context2) {
248
326
  while (1) {
249
- switch (_context.prev = _context.next) {
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 === 'io server disconnect' && _this2.socket) {
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 _context.stop();
351
+ return _context2.stop();
274
352
  }
275
353
  }
276
- }, _callee);
354
+ }, _callee2);
277
355
  }));
278
- return function (_x) {
279
- return _ref2.apply(this, arguments);
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 _callee2(fromVersion) {
308
- var _yield$this$config$pe, _yield$utils$requestS, doc, version, stepMaps, metadata, errorNotFound, errorCatchup;
309
- return _regenerator.default.wrap(function _callee2$(_context2) {
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 (_context2.prev = _context2.next) {
391
+ switch (_context3.prev = _context3.next) {
312
392
  case 0:
313
- _context2.prev = 0;
314
- _context2.t0 = _utilServiceSupport.utils;
315
- _context2.t1 = this.config;
316
- _context2.t2 = "document/".concat(encodeURIComponent(this.config.documentAri), "/catchup");
317
- _context2.t3 = {
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
- _context2.t4 = _objectSpread;
321
- _context2.t5 = _objectSpread;
322
- _context2.t6 = {};
400
+ _context3.t4 = _objectSpread;
401
+ _context3.t5 = _objectSpread;
402
+ _context3.t6 = {};
323
403
  if (!this.config.permissionTokenRefresh) {
324
- _context2.next = 24;
404
+ _context3.next = 29;
325
405
  break;
326
406
  }
327
- _context2.next = 11;
328
- return this.config.permissionTokenRefresh();
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
- _context2.t8 = _yield$this$config$pe !== void 0;
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
- if (!_context2.t8) {
339
- _context2.next = 19;
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
- _context2.t10 = _yield$this$config$pe;
343
- _context2.next = 20;
344
- break;
345
- case 19:
346
- _context2.t10 = undefined;
431
+ _context3.t8 = _ref4 !== void 0;
347
432
  case 20:
348
- _context2.t11 = _context2.t10;
349
- _context2.t7 = {
350
- 'x-token': _context2.t11
351
- };
352
- _context2.next = 25;
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
- _context2.t7 = {};
441
+ _context3.t11 = undefined;
356
442
  case 25:
357
- _context2.t12 = _context2.t7;
358
- _context2.t13 = (0, _context2.t5)(_context2.t6, _context2.t12);
359
- _context2.t14 = {};
360
- _context2.t15 = {
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
- _context2.t16 = (0, _context2.t4)(_context2.t13, _context2.t14, _context2.t15);
365
- _context2.t17 = {
366
- headers: _context2.t16
459
+ _context3.t17 = (0, _context3.t4)(_context3.t14, _context3.t15, _context3.t16);
460
+ _context3.t18 = {
461
+ headers: _context3.t17
367
462
  };
368
- _context2.t18 = {
369
- path: _context2.t2,
370
- queryParams: _context2.t3,
371
- requestInit: _context2.t17
463
+ _context3.t19 = {
464
+ path: _context3.t2,
465
+ queryParams: _context3.t3,
466
+ requestInit: _context3.t18
372
467
  };
373
- _context2.next = 34;
374
- return _context2.t0.requestService.call(_context2.t0, _context2.t1, _context2.t18);
375
- case 34:
376
- _yield$utils$requestS = _context2.sent;
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 _context2.abrupt("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 42:
388
- _context2.prev = 42;
389
- _context2.t19 = _context2["catch"](0);
390
- if (!(_context2.t19.code === 404)) {
391
- _context2.next = 48;
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: _context2.t19.code,
492
+ status: _context3.t20.code,
398
493
  code: _errorCodeMapper.ErrorCodeMapper.documentNotFound.code
399
494
  }
400
495
  };
401
496
  this.emit('error', errorNotFound);
402
- return _context2.abrupt("return", {});
403
- case 48:
404
- logger("Can't fetch the catchup", _context2.t19.message);
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: _context2.t19.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 _context2.t19;
414
- case 52:
510
+ throw _context3.t20;
511
+ case 58:
415
512
  case "end":
416
- return _context2.stop();
513
+ return _context3.stop();
417
514
  }
418
515
  }
419
- }, _callee2, this, [[0, 42]]);
516
+ }, _callee3, this, [[0, 47]]);
420
517
  }));
421
- function fetchCatchup(_x2) {
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.connected || !this.socket) {
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.connected || !this.socket) {
443
- return;
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;