@atlaskit/collab-provider 8.1.0 → 8.2.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 (57) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/dist/cjs/analytics/index.js +2 -11
  3. package/dist/cjs/analytics/performance.js +2 -16
  4. package/dist/cjs/channel.js +63 -114
  5. package/dist/cjs/disconnected-reason-mapper.js +0 -2
  6. package/dist/cjs/emitter.js +3 -11
  7. package/dist/cjs/error-code-mapper.js +4 -17
  8. package/dist/cjs/feature-flags/__test__/index.unit.js +0 -1
  9. package/dist/cjs/feature-flags/index.js +5 -15
  10. package/dist/cjs/feature-flags/types.js +2 -0
  11. package/dist/cjs/helpers/const.js +2 -8
  12. package/dist/cjs/helpers/utils.js +0 -12
  13. package/dist/cjs/index.js +0 -1
  14. package/dist/cjs/provider/catchup.js +38 -42
  15. package/dist/cjs/provider/index.js +150 -281
  16. package/dist/cjs/socket-io-provider.js +2 -12
  17. package/dist/cjs/types.js +0 -1
  18. package/dist/cjs/version-wrapper.js +1 -3
  19. package/dist/cjs/version.json +1 -1
  20. package/dist/es2019/analytics/index.js +2 -3
  21. package/dist/es2019/analytics/performance.js +2 -13
  22. package/dist/es2019/channel.js +54 -64
  23. package/dist/es2019/disconnected-reason-mapper.js +1 -2
  24. package/dist/es2019/emitter.js +3 -8
  25. package/dist/es2019/error-code-mapper.js +4 -12
  26. package/dist/es2019/feature-flags/index.js +2 -5
  27. package/dist/es2019/feature-flags/types.js +2 -0
  28. package/dist/es2019/helpers/const.js +2 -8
  29. package/dist/es2019/helpers/utils.js +0 -2
  30. package/dist/es2019/provider/catchup.js +33 -17
  31. package/dist/es2019/provider/index.js +116 -187
  32. package/dist/es2019/socket-io-provider.js +4 -2
  33. package/dist/es2019/types.js +1 -1
  34. package/dist/es2019/version-wrapper.js +1 -1
  35. package/dist/es2019/version.json +1 -1
  36. package/dist/esm/analytics/index.js +2 -6
  37. package/dist/esm/analytics/performance.js +2 -13
  38. package/dist/esm/channel.js +65 -107
  39. package/dist/esm/disconnected-reason-mapper.js +1 -2
  40. package/dist/esm/emitter.js +3 -6
  41. package/dist/esm/error-code-mapper.js +4 -12
  42. package/dist/esm/feature-flags/index.js +5 -10
  43. package/dist/esm/feature-flags/types.js +2 -0
  44. package/dist/esm/helpers/const.js +2 -8
  45. package/dist/esm/helpers/utils.js +0 -3
  46. package/dist/esm/provider/catchup.js +38 -35
  47. package/dist/esm/provider/index.js +150 -283
  48. package/dist/esm/socket-io-provider.js +2 -5
  49. package/dist/esm/types.js +1 -1
  50. package/dist/esm/version-wrapper.js +1 -1
  51. package/dist/esm/version.json +1 -1
  52. package/dist/types/channel.d.ts +1 -0
  53. package/dist/types/error-code-mapper.d.ts +1 -1
  54. package/dist/types/helpers/const.d.ts +16 -3
  55. package/dist/types/types.d.ts +3 -1
  56. package/package.json +7 -5
  57. package/report.api.md +6 -0
package/CHANGELOG.md CHANGED
@@ -1,5 +1,20 @@
1
1
  # @atlaskit/collab-provider
2
2
 
3
+ ## 8.2.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [`945413f0b29`](https://bitbucket.org/atlassian/atlassian-frontend/commits/945413f0b29) - trigger page recovery when catchup returns 404
8
+ - [`06119d7fed4`](https://bitbucket.org/atlassian/atlassian-frontend/commits/06119d7fed4) - handle catchup after page recovery
9
+ - [`a66427c3fe5`](https://bitbucket.org/atlassian/atlassian-frontend/commits/a66427c3fe5) - Add analytics logging to error handling
10
+ - [`56a21fe7209`](https://bitbucket.org/atlassian/atlassian-frontend/commits/56a21fe7209) - Improve error handling logic
11
+ - [`77aee68579e`](https://bitbucket.org/atlassian/atlassian-frontend/commits/77aee68579e) - adding a connecting event to be emitted when collab-provider is first initialized
12
+
13
+ ### Patch Changes
14
+
15
+ - [`625f3c20f8c`](https://bitbucket.org/atlassian/atlassian-frontend/commits/625f3c20f8c) - Handle init errors
16
+ - Updated dependencies
17
+
3
18
  ## 8.1.0
4
19
 
5
20
  ### Minor Changes
@@ -1,27 +1,19 @@
1
1
  "use strict";
2
2
 
3
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
4
  Object.defineProperty(exports, "__esModule", {
6
5
  value: true
7
6
  });
8
7
  exports.triggerAnalyticsEvent = void 0;
9
-
10
8
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
11
-
12
9
  var _const = require("../helpers/const");
13
-
14
10
  var _versionWrapper = require("../version-wrapper");
15
-
16
11
  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; }
17
-
18
12
  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; }
19
-
20
13
  var triggerAnalyticsEvent = function triggerAnalyticsEvent(analyticsEvent, analyticsClient) {
21
14
  if (!analyticsClient) {
22
15
  return;
23
16
  }
24
-
25
17
  var payload = {
26
18
  actionSubject: _const.EVENT_SUBJECT,
27
19
  attributes: _objectSpread({
@@ -32,15 +24,14 @@ var triggerAnalyticsEvent = function triggerAnalyticsEvent(analyticsEvent, analy
32
24
  tags: ['editor'],
33
25
  action: analyticsEvent.eventAction,
34
26
  source: 'unknown' // Adds zero analytics value, but event validation throws an error if you don't add it :-(
27
+ };
35
28
 
36
- }; // Let the browser figure out
29
+ // Let the browser figure out
37
30
  // when it should send those events
38
-
39
31
  var requestIdleCallbackFunction = window.requestIdleCallback;
40
32
  var runItLater = typeof requestIdleCallbackFunction === 'function' ? requestIdleCallbackFunction : window.requestAnimationFrame;
41
33
  runItLater(function () {
42
34
  analyticsClient.sendOperationalEvent(payload);
43
35
  });
44
36
  };
45
-
46
37
  exports.triggerAnalyticsEvent = triggerAnalyticsEvent;
@@ -9,53 +9,43 @@ exports.startMeasure = startMeasure;
9
9
  exports.stopMeasure = stopMeasure;
10
10
  var MEASURE_NAME;
11
11
  exports.MEASURE_NAME = MEASURE_NAME;
12
-
13
12
  (function (MEASURE_NAME) {
14
13
  MEASURE_NAME["SOCKET_CONNECT"] = "socketConnect";
15
14
  MEASURE_NAME["DOCUMENT_INIT"] = "documentInit";
16
15
  MEASURE_NAME["CONVERT_PM_TO_ADF"] = "convertPMToADF";
17
16
  MEASURE_NAME["COMMIT_UNCONFIRMED_STEPS"] = "commitUnconfirmedSteps";
18
17
  })(MEASURE_NAME || (exports.MEASURE_NAME = MEASURE_NAME = {}));
19
-
20
18
  var isPerformanceAPIAvailable = function isPerformanceAPIAvailable() {
21
19
  return typeof window !== 'undefined' && 'performance' in window && ['measure', 'clearMeasures', 'clearMarks', 'getEntriesByName', 'getEntriesByType'].every(function (api) {
22
20
  return !!performance[api];
23
21
  });
24
22
  };
25
-
26
23
  var hasPerformanceAPIAvailable = isPerformanceAPIAvailable();
27
24
  var measureMap = new Map();
28
-
29
25
  function startMeasure(measureName) {
30
26
  if (!hasPerformanceAPIAvailable) {
31
27
  return;
32
28
  }
33
-
34
29
  performance.mark("".concat(measureName, "::start"));
35
30
  measureMap.set(measureName, performance.now());
36
31
  }
37
-
38
32
  function stopMeasure(measureName, onMeasureComplete) {
39
33
  if (!hasPerformanceAPIAvailable) {
40
34
  return;
41
- } // `startMeasure` is not called with `measureName` before.
42
-
35
+ }
43
36
 
37
+ // `startMeasure` is not called with `measureName` before.
44
38
  if (!measureMap.get(measureName)) {
45
39
  return;
46
40
  }
47
-
48
41
  performance.mark("".concat(measureName, "::end"));
49
42
  var start = onMeasureComplete ? measureMap.get(measureName) : undefined;
50
-
51
43
  try {
52
44
  performance.measure(measureName, "".concat(measureName, "::start"), "".concat(measureName, "::end"));
53
45
  } catch (e) {}
54
-
55
46
  var entry = performance.getEntriesByName(measureName).pop();
56
47
  clearMeasure(measureName);
57
48
  var measure;
58
-
59
49
  if (entry) {
60
50
  measure = {
61
51
  duration: entry.duration,
@@ -67,19 +57,15 @@ function stopMeasure(measureName, onMeasureComplete) {
67
57
  startTime: start
68
58
  };
69
59
  }
70
-
71
60
  if (measure && onMeasureComplete) {
72
61
  onMeasureComplete(measure.duration, measure.startTime);
73
62
  }
74
-
75
63
  return measure;
76
64
  }
77
-
78
65
  function clearMeasure(measureName) {
79
66
  if (!hasPerformanceAPIAvailable) {
80
67
  return;
81
68
  }
82
-
83
69
  measureMap.delete(measureName);
84
70
  performance.clearMarks("".concat(measureName, "::start"));
85
71
  performance.clearMarks("".concat(measureName, "::end"));
@@ -1,64 +1,37 @@
1
1
  "use strict";
2
2
 
3
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
4
  Object.defineProperty(exports, "__esModule", {
6
5
  value: true
7
6
  });
8
7
  exports.Channel = void 0;
9
-
10
8
  var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
11
-
12
9
  var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
13
-
14
10
  var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
15
-
16
11
  var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
17
-
18
12
  var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized"));
19
-
20
13
  var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
21
-
22
14
  var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
23
-
24
15
  var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
25
-
26
16
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
27
-
28
17
  var _utilServiceSupport = require("@atlaskit/util-service-support");
29
-
30
18
  var _emitter = require("./emitter");
31
-
32
19
  var _errorCodeMapper = require("./error-code-mapper");
33
-
34
20
  var _utils = require("./helpers/utils");
35
-
36
21
  var _performance = require("./analytics/performance");
37
-
38
22
  var _analytics = require("./analytics");
39
-
40
23
  var _const = require("./helpers/const");
41
-
42
24
  var _ufo = require("@atlaskit/ufo");
43
-
44
25
  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; }
45
-
46
26
  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; }
47
-
48
27
  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
-
50
28
  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; } }
51
-
52
29
  var logger = (0, _utils.createLogger)('Channel', 'green');
53
-
54
30
  var Channel = /*#__PURE__*/function (_Emitter) {
55
31
  (0, _inherits2.default)(Channel, _Emitter);
56
-
57
32
  var _super = _createSuper(Channel);
58
-
59
33
  function Channel(config) {
60
34
  var _this;
61
-
62
35
  (0, _classCallCheck2.default)(this, Channel);
63
36
  _this = _super.call(this);
64
37
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "connected", false);
@@ -82,6 +55,30 @@ var Channel = /*#__PURE__*/function (_Emitter) {
82
55
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "getSocket", function () {
83
56
  return _this.socket;
84
57
  });
58
+ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "onConnectError", function (error) {
59
+ var measure = (0, _performance.stopMeasure)(_performance.MEASURE_NAME.SOCKET_CONNECT);
60
+ (0, _analytics.triggerAnalyticsEvent)({
61
+ eventAction: _const.EVENT_ACTION.CONNECTION,
62
+ attributes: {
63
+ eventStatus: _const.EVENT_STATUS.FAILURE,
64
+ error: error,
65
+ latency: measure === null || measure === void 0 ? void 0 : measure.duration,
66
+ documentAri: _this.config.documentAri
67
+ }
68
+ }, _this.analyticsClient);
69
+ // If error received with `data`, it means the connection is rejected
70
+ // by the server on purpose for example no permission, so no need to
71
+ // keep the underneath connection, need to close. But some error like
72
+ // `xhr polling error` needs to retry.
73
+ if (!!error.data) {
74
+ var _this$socket;
75
+ (_this$socket = _this.socket) === null || _this$socket === void 0 ? void 0 : _this$socket.close();
76
+ }
77
+ _this.emit('error', {
78
+ message: error.message,
79
+ data: error.data
80
+ });
81
+ });
85
82
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "onConnect", function () {
86
83
  _this.connected = true;
87
84
  logger('Connected.', _this.socket.id);
@@ -94,7 +91,6 @@ var Channel = /*#__PURE__*/function (_Emitter) {
94
91
  documentAri: _this.config.documentAri
95
92
  }
96
93
  }, _this.analyticsClient);
97
-
98
94
  _this.emit('connected', {
99
95
  sid: _this.socket.id,
100
96
  initialized: _this.initialized
@@ -103,13 +99,10 @@ var Channel = /*#__PURE__*/function (_Emitter) {
103
99
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "onReceiveData", function (data) {
104
100
  logger('Received data', data);
105
101
  logger('Session ID is', _this.socket.id);
106
-
107
102
  if (data.type === 'initial') {
108
103
  if (!_this.initialized) {
109
104
  var measure = (0, _performance.stopMeasure)(_performance.MEASURE_NAME.DOCUMENT_INIT);
110
-
111
105
  _this.initExperience.success();
112
-
113
106
  (0, _analytics.triggerAnalyticsEvent)({
114
107
  eventAction: _const.EVENT_ACTION.DOCUMENT_INIT,
115
108
  attributes: {
@@ -122,11 +115,10 @@ var Channel = /*#__PURE__*/function (_Emitter) {
122
115
  }
123
116
  }, _this.analyticsClient);
124
117
  var doc = data.doc,
125
- version = data.version,
126
- userId = data.userId,
127
- metadata = data.metadata;
118
+ version = data.version,
119
+ userId = data.userId,
120
+ metadata = data.metadata;
128
121
  _this.initialized = true;
129
-
130
122
  _this.emit('init', {
131
123
  doc: doc,
132
124
  version: version,
@@ -136,10 +128,9 @@ var Channel = /*#__PURE__*/function (_Emitter) {
136
128
  } else {
137
129
  // Page is been just restored, need to fix all the participants as well.
138
130
  var _doc = data.doc,
139
- _version = data.version,
140
- _userId = data.userId,
141
- _metadata = data.metadata;
142
-
131
+ _version = data.version,
132
+ _userId = data.userId,
133
+ _metadata = data.metadata;
143
134
  _this.emit('restore', {
144
135
  doc: _doc,
145
136
  version: _version,
@@ -152,15 +143,13 @@ var Channel = /*#__PURE__*/function (_Emitter) {
152
143
  }
153
144
  });
154
145
  _this.config = config;
155
-
156
146
  if (config.analyticsClient) {
157
147
  _this.analyticsClient = config.analyticsClient;
158
148
  }
159
-
160
149
  return _this;
161
- } // read-only getters used for tests
162
-
150
+ }
163
151
 
152
+ // read-only getters used for tests
164
153
  (0, _createClass2.default)(Channel, [{
165
154
  key: "connect",
166
155
  value:
@@ -169,21 +158,17 @@ var Channel = /*#__PURE__*/function (_Emitter) {
169
158
  */
170
159
  function connect() {
171
160
  var _this2 = this;
172
-
173
161
  (0, _performance.startMeasure)(_performance.MEASURE_NAME.SOCKET_CONNECT);
174
-
175
162
  if (!this.initialized) {
176
163
  (0, _performance.startMeasure)(_performance.MEASURE_NAME.DOCUMENT_INIT);
177
164
  this.initExperience.start();
178
165
  }
179
-
180
166
  var _this$config = this.config,
181
- documentAri = _this$config.documentAri,
182
- url = _this$config.url;
167
+ documentAri = _this$config.documentAri,
168
+ url = _this$config.url;
183
169
  var createSocket = this.config.createSocket;
184
170
  var permissionTokenRefresh = this.config.permissionTokenRefresh;
185
171
  var authCb = null;
186
-
187
172
  if (permissionTokenRefresh) {
188
173
  authCb = function authCb(cb) {
189
174
  permissionTokenRefresh().then(function (token) {
@@ -209,11 +194,11 @@ var Channel = /*#__PURE__*/function (_Emitter) {
209
194
  });
210
195
  };
211
196
  }
197
+ this.socket = createSocket("".concat(url, "/session/").concat(documentAri), authCb, this.config.productInfo);
212
198
 
213
- this.socket = createSocket("".concat(url, "/session/").concat(documentAri), authCb, this.config.productInfo); // Due to https://github.com/socketio/socket.io-client/issues/1473,
199
+ // Due to https://github.com/socketio/socket.io-client/issues/1473,
214
200
  // reconnect no longer fired on the socket.
215
201
  // We should use `connect` for better cross platform compatibility(Mobile/Web).
216
-
217
202
  this.socket.on('connect', this.onConnect);
218
203
  this.socket.on('data', this.onReceiveData);
219
204
  this.socket.on('steps:added', function (data) {
@@ -233,10 +218,9 @@ var Channel = /*#__PURE__*/function (_Emitter) {
233
218
  });
234
219
  this.socket.on('participant:updated', function (_ref) {
235
220
  var sessionId = _ref.sessionId,
236
- timestamp = _ref.timestamp,
237
- data = _ref.data,
238
- clientId = _ref.clientId;
239
-
221
+ timestamp = _ref.timestamp,
222
+ data = _ref.data,
223
+ clientId = _ref.clientId;
240
224
  _this2.emit('participant:updated', _objectSpread({
241
225
  sessionId: sessionId,
242
226
  timestamp: timestamp,
@@ -245,8 +229,9 @@ var Channel = /*#__PURE__*/function (_Emitter) {
245
229
  });
246
230
  this.socket.on('metadata:changed', function (payload) {
247
231
  _this2.emit('metadata:changed', payload);
248
- }); // ESS-2916 namespace status event - lock/unlock
232
+ });
249
233
 
234
+ // ESS-2916 namespace status event - lock/unlock
250
235
  this.socket.on('status', function (data) {
251
236
  _this2.emit('status', data);
252
237
  });
@@ -258,16 +243,13 @@ var Channel = /*#__PURE__*/function (_Emitter) {
258
243
  case 0:
259
244
  _this2.connected = false;
260
245
  logger("disconnect reason: ".concat(reason));
261
-
262
246
  _this2.emit('disconnect', {
263
247
  reason: reason
264
248
  });
265
-
266
249
  if (reason === 'io server disconnect' && _this2.socket) {
267
250
  // The disconnection was initiated by the server, we need to reconnect manually.
268
251
  _this2.socket.connect();
269
252
  }
270
-
271
253
  case 4:
272
254
  case "end":
273
255
  return _context.stop();
@@ -275,50 +257,25 @@ var Channel = /*#__PURE__*/function (_Emitter) {
275
257
  }
276
258
  }, _callee);
277
259
  }));
278
-
279
260
  return function (_x) {
280
261
  return _ref2.apply(this, arguments);
281
262
  };
282
- }()); // Socket error, including errors from `packetMiddleware`, `controllers` and `onconnect` and more. Paramter is a plain JSON object.
263
+ }());
283
264
 
265
+ // Socket error, including errors from `packetMiddleware`, `controllers` and `onconnect` and more. Paramter is a plain JSON object.
284
266
  this.socket.on('error', function (error) {
285
267
  _this2.emit('error', error);
286
- }); // `connect_error`'s paramter type is `Error`.
287
- // Ensure the error emit to the provider has the same structure, so we can handle them unified.
288
-
289
- this.socket.on('connect_error', function (error) {
290
- var measure = (0, _performance.stopMeasure)(_performance.MEASURE_NAME.SOCKET_CONNECT);
291
- (0, _analytics.triggerAnalyticsEvent)({
292
- eventAction: _const.EVENT_ACTION.CONNECTION,
293
- attributes: {
294
- eventStatus: _const.EVENT_STATUS.FAILURE,
295
- error: error,
296
- latency: measure === null || measure === void 0 ? void 0 : measure.duration,
297
- documentAri: _this2.config.documentAri
298
- }
299
- }, _this2.analyticsClient); // If error received with `data`, it means the connection is rejected
300
- // by the server on purpose for example no permission, so no need to
301
- // keep the underneath connection, need to close. But some error like
302
- // `xhr polling error` needs to retry.
303
-
304
- if (!!error.data) {
305
- var _this2$socket;
306
-
307
- (_this2$socket = _this2.socket) === null || _this2$socket === void 0 ? void 0 : _this2$socket.close();
308
- }
309
-
310
- _this2.emit('error', {
311
- message: error.message,
312
- data: error.data
313
- });
314
268
  });
269
+
270
+ // `connect_error`'s paramter type is `Error`.
271
+ // Ensure the error emit to the provider has the same structure, so we can handle them unified.
272
+ this.socket.on('connect_error', this.onConnectError);
315
273
  }
316
274
  }, {
317
275
  key: "fetchCatchup",
318
276
  value: function () {
319
277
  var _fetchCatchup = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee2(fromVersion) {
320
- var _yield$this$config$pe, _yield$utils$requestS, doc, version, stepMaps, metadata, errorCatchup;
321
-
278
+ var _yield$this$config$pe, _yield$utils$requestS, doc, version, stepMaps, metadata, errorNotFound, errorCatchup;
322
279
  return _regenerator.default.wrap(function _callee2$(_context2) {
323
280
  while (1) {
324
281
  switch (_context2.prev = _context2.next) {
@@ -333,39 +290,30 @@ var Channel = /*#__PURE__*/function (_Emitter) {
333
290
  _context2.t4 = _objectSpread;
334
291
  _context2.t5 = _objectSpread;
335
292
  _context2.t6 = {};
336
-
337
293
  if (!this.config.permissionTokenRefresh) {
338
294
  _context2.next = 24;
339
295
  break;
340
296
  }
341
-
342
297
  _context2.next = 11;
343
298
  return this.config.permissionTokenRefresh();
344
-
345
299
  case 11:
346
300
  _context2.t9 = _yield$this$config$pe = _context2.sent;
347
301
  _context2.t8 = _context2.t9 !== null;
348
-
349
302
  if (!_context2.t8) {
350
303
  _context2.next = 15;
351
304
  break;
352
305
  }
353
-
354
306
  _context2.t8 = _yield$this$config$pe !== void 0;
355
-
356
307
  case 15:
357
308
  if (!_context2.t8) {
358
309
  _context2.next = 19;
359
310
  break;
360
311
  }
361
-
362
312
  _context2.t10 = _yield$this$config$pe;
363
313
  _context2.next = 20;
364
314
  break;
365
-
366
315
  case 19:
367
316
  _context2.t10 = undefined;
368
-
369
317
  case 20:
370
318
  _context2.t11 = _context2.t10;
371
319
  _context2.t7 = {
@@ -373,10 +321,8 @@ var Channel = /*#__PURE__*/function (_Emitter) {
373
321
  };
374
322
  _context2.next = 25;
375
323
  break;
376
-
377
324
  case 24:
378
325
  _context2.t7 = {};
379
-
380
326
  case 25:
381
327
  _context2.t12 = _context2.t7;
382
328
  _context2.t13 = (0, _context2.t5)(_context2.t6, _context2.t12);
@@ -396,7 +342,6 @@ var Channel = /*#__PURE__*/function (_Emitter) {
396
342
  };
397
343
  _context2.next = 34;
398
344
  return _context2.t0.requestService.call(_context2.t0, _context2.t1, _context2.t18);
399
-
400
345
  case 34:
401
346
  _yield$utils$requestS = _context2.sent;
402
347
  doc = _yield$utils$requestS.doc;
@@ -409,10 +354,23 @@ var Channel = /*#__PURE__*/function (_Emitter) {
409
354
  stepMaps: stepMaps,
410
355
  metadata: metadata
411
356
  });
412
-
413
357
  case 42:
414
358
  _context2.prev = 42;
415
359
  _context2.t19 = _context2["catch"](0);
360
+ if (!(_context2.t19.code === 404)) {
361
+ _context2.next = 48;
362
+ break;
363
+ }
364
+ errorNotFound = {
365
+ message: _errorCodeMapper.ErrorCodeMapper.documentNotFound.message,
366
+ data: {
367
+ status: _context2.t19.code,
368
+ code: _errorCodeMapper.ErrorCodeMapper.documentNotFound.code
369
+ }
370
+ };
371
+ this.emit('error', errorNotFound);
372
+ return _context2.abrupt("return", {});
373
+ case 48:
416
374
  logger("Can't fetch the catchup", _context2.t19.message);
417
375
  errorCatchup = {
418
376
  message: _errorCodeMapper.ErrorCodeMapper.catchupFail.message,
@@ -423,32 +381,27 @@ var Channel = /*#__PURE__*/function (_Emitter) {
423
381
  };
424
382
  this.emit('error', errorCatchup);
425
383
  return _context2.abrupt("return", {});
426
-
427
- case 48:
384
+ case 52:
428
385
  case "end":
429
386
  return _context2.stop();
430
387
  }
431
388
  }
432
389
  }, _callee2, this, [[0, 42]]);
433
390
  }));
434
-
435
391
  function fetchCatchup(_x2) {
436
392
  return _fetchCatchup.apply(this, arguments);
437
393
  }
438
-
439
394
  return fetchCatchup;
440
395
  }()
441
396
  /**
442
397
  * Send message to service. Timestamp will be added server side.
443
398
  */
444
-
445
399
  }, {
446
400
  key: "broadcast",
447
401
  value: function broadcast(type, data, callback) {
448
402
  if (!this.connected || !this.socket) {
449
403
  return;
450
404
  }
451
-
452
405
  this.socket.emit('broadcast', _objectSpread({
453
406
  type: type
454
407
  }, data), callback);
@@ -459,7 +412,6 @@ var Channel = /*#__PURE__*/function (_Emitter) {
459
412
  if (!this.connected || !this.socket) {
460
413
  return;
461
414
  }
462
-
463
415
  this.socket.emit('metadata', metadata);
464
416
  }
465
417
  }, {
@@ -468,14 +420,12 @@ var Channel = /*#__PURE__*/function (_Emitter) {
468
420
  if (!this.connected || !this.socket) {
469
421
  return;
470
422
  }
471
-
472
423
  this.socket.emit('presence:joined');
473
424
  }
474
425
  }, {
475
426
  key: "disconnect",
476
427
  value: function disconnect() {
477
428
  this.unsubscribeAll();
478
-
479
429
  if (this.socket) {
480
430
  this.socket.close();
481
431
  this.socket = null;
@@ -484,5 +434,4 @@ var Channel = /*#__PURE__*/function (_Emitter) {
484
434
  }]);
485
435
  return Channel;
486
436
  }(_emitter.Emitter);
487
-
488
437
  exports.Channel = Channel;
@@ -15,12 +15,10 @@ var socketIOReasons = {
15
15
  TRANSPORT_ERROR: 'transport error',
16
16
  // The connection was closed (example: the user has lost connection, or the network was changed from WiFi to 4G)
17
17
  PING_TIMEOUT: 'ping timeout' // The connection has encountered an error (example: the server was killed during a HTTP long-polling cycle)
18
-
19
18
  };
20
19
  exports.socketIOReasons = socketIOReasons;
21
20
  var DisconnectReason;
22
21
  exports.DisconnectReason = DisconnectReason;
23
-
24
22
  (function (DisconnectReason) {
25
23
  DisconnectReason["CLIENT_DISCONNECT"] = "CLIENT_DISCONNECT";
26
24
  DisconnectReason["SERVER_DISCONNECT"] = "SERVER_DISCONNECT";
@@ -1,26 +1,19 @@
1
1
  "use strict";
2
2
 
3
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
4
  Object.defineProperty(exports, "__esModule", {
6
5
  value: true
7
6
  });
8
7
  exports.Emitter = void 0;
9
-
10
8
  var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
11
-
12
9
  var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
13
-
14
10
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
15
-
16
11
  var _eventemitter = require("eventemitter2");
17
-
18
12
  var Emitter = /*#__PURE__*/function () {
19
13
  function Emitter() {
20
14
  (0, _classCallCheck2.default)(this, Emitter);
21
15
  (0, _defineProperty2.default)(this, "eventEmitter", new _eventemitter.EventEmitter2());
22
16
  }
23
-
24
17
  (0, _createClass2.default)(Emitter, [{
25
18
  key: "emit",
26
19
  value:
@@ -31,30 +24,30 @@ var Emitter = /*#__PURE__*/function () {
31
24
  this.eventEmitter.emit(evt, data);
32
25
  return this;
33
26
  }
27
+
34
28
  /**
35
29
  * Subscribe to events emitted by this provider
36
30
  */
37
-
38
31
  }, {
39
32
  key: "on",
40
33
  value: function on(evt, handler) {
41
34
  this.eventEmitter.on(evt, handler);
42
35
  return this;
43
36
  }
37
+
44
38
  /**
45
39
  * Unsubscribe from events emitted by this provider
46
40
  */
47
-
48
41
  }, {
49
42
  key: "off",
50
43
  value: function off(evt, handler) {
51
44
  this.eventEmitter.off(evt, handler);
52
45
  return this;
53
46
  }
47
+
54
48
  /**
55
49
  * Unsubscribe from all events emitted by this provider.
56
50
  */
57
-
58
51
  }, {
59
52
  key: "unsubscribeAll",
60
53
  value: function unsubscribeAll(evt) {
@@ -64,5 +57,4 @@ var Emitter = /*#__PURE__*/function () {
64
57
  }]);
65
58
  return Emitter;
66
59
  }();
67
-
68
60
  exports.Emitter = Emitter;