@atlaskit/collab-provider 8.0.1 → 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 (64) hide show
  1. package/CHANGELOG.md +27 -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 +66 -115
  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 +27 -0
  9. package/dist/cjs/feature-flags/index.js +52 -0
  10. package/dist/cjs/feature-flags/types.js +12 -0
  11. package/dist/cjs/helpers/const.js +6 -10
  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 +153 -283
  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 +57 -65
  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/__test__/index.unit.js +25 -0
  27. package/dist/es2019/feature-flags/index.js +31 -0
  28. package/dist/es2019/feature-flags/types.js +5 -0
  29. package/dist/es2019/helpers/const.js +4 -9
  30. package/dist/es2019/helpers/utils.js +0 -2
  31. package/dist/es2019/provider/catchup.js +33 -17
  32. package/dist/es2019/provider/index.js +119 -189
  33. package/dist/es2019/socket-io-provider.js +4 -2
  34. package/dist/es2019/types.js +1 -1
  35. package/dist/es2019/version-wrapper.js +1 -1
  36. package/dist/es2019/version.json +1 -1
  37. package/dist/esm/analytics/index.js +2 -6
  38. package/dist/esm/analytics/performance.js +2 -13
  39. package/dist/esm/channel.js +68 -108
  40. package/dist/esm/disconnected-reason-mapper.js +1 -2
  41. package/dist/esm/emitter.js +3 -6
  42. package/dist/esm/error-code-mapper.js +4 -12
  43. package/dist/esm/feature-flags/__test__/index.unit.js +25 -0
  44. package/dist/esm/feature-flags/index.js +43 -0
  45. package/dist/esm/feature-flags/types.js +5 -0
  46. package/dist/esm/helpers/const.js +4 -9
  47. package/dist/esm/helpers/utils.js +0 -3
  48. package/dist/esm/provider/catchup.js +38 -35
  49. package/dist/esm/provider/index.js +153 -285
  50. package/dist/esm/socket-io-provider.js +2 -5
  51. package/dist/esm/types.js +1 -1
  52. package/dist/esm/version-wrapper.js +1 -1
  53. package/dist/esm/version.json +1 -1
  54. package/dist/types/channel.d.ts +1 -0
  55. package/dist/types/error-code-mapper.d.ts +1 -1
  56. package/dist/types/feature-flags/__test__/index.unit.d.ts +1 -0
  57. package/dist/types/feature-flags/index.d.ts +9 -0
  58. package/dist/types/feature-flags/types.d.ts +11 -0
  59. package/dist/types/helpers/const.d.ts +19 -3
  60. package/dist/types/provider/catchup.d.ts +1 -1
  61. package/dist/types/provider/index.d.ts +1 -0
  62. package/dist/types/types.d.ts +9 -4
  63. package/package.json +10 -9
  64. package/report.api.md +11 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,32 @@
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
+
18
+ ## 8.1.0
19
+
20
+ ### Minor Changes
21
+
22
+ - [`59e998e408f`](https://bitbucket.org/atlassian/atlassian-frontend/commits/59e998e408f) - [ESS-2914] Switch to the forked prosemirror-collab library (based on version 1.3.0) to filter out analytics steps
23
+ - [`ec0ebbf16bc`](https://bitbucket.org/atlassian/atlassian-frontend/commits/ec0ebbf16bc) - Adding Feature Flag to Collab Provider
24
+
25
+ ### Patch Changes
26
+
27
+ - [`6eb720b7d3b`](https://bitbucket.org/atlassian/atlassian-frontend/commits/6eb720b7d3b) - A page recovery attribute and ttl attribute to metrics to monitor ttl effect on tti
28
+ - Updated dependencies
29
+
3
30
  ## 8.0.1
4
31
 
5
32
  ### Patch 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,28 +99,26 @@ 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: {
116
109
  eventStatus: _const.EVENT_STATUS.SUCCESS,
117
110
  // TODO: detect when document init fails and fire corresponding event for it
118
111
  latency: measure === null || measure === void 0 ? void 0 : measure.duration,
119
- documentAri: _this.config.documentAri
112
+ documentAri: _this.config.documentAri,
113
+ requiredPageRecovery: data === null || data === void 0 ? void 0 : data.requiredPageRecovery,
114
+ ttlEnabled: data === null || data === void 0 ? void 0 : data.ttlEnabled
120
115
  }
121
116
  }, _this.analyticsClient);
122
117
  var doc = data.doc,
123
- version = data.version,
124
- userId = data.userId,
125
- metadata = data.metadata;
118
+ version = data.version,
119
+ userId = data.userId,
120
+ metadata = data.metadata;
126
121
  _this.initialized = true;
127
-
128
122
  _this.emit('init', {
129
123
  doc: doc,
130
124
  version: version,
@@ -134,10 +128,9 @@ var Channel = /*#__PURE__*/function (_Emitter) {
134
128
  } else {
135
129
  // Page is been just restored, need to fix all the participants as well.
136
130
  var _doc = data.doc,
137
- _version = data.version,
138
- _userId = data.userId,
139
- _metadata = data.metadata;
140
-
131
+ _version = data.version,
132
+ _userId = data.userId,
133
+ _metadata = data.metadata;
141
134
  _this.emit('restore', {
142
135
  doc: _doc,
143
136
  version: _version,
@@ -150,15 +143,13 @@ var Channel = /*#__PURE__*/function (_Emitter) {
150
143
  }
151
144
  });
152
145
  _this.config = config;
153
-
154
146
  if (config.analyticsClient) {
155
147
  _this.analyticsClient = config.analyticsClient;
156
148
  }
157
-
158
149
  return _this;
159
- } // read-only getters used for tests
160
-
150
+ }
161
151
 
152
+ // read-only getters used for tests
162
153
  (0, _createClass2.default)(Channel, [{
163
154
  key: "connect",
164
155
  value:
@@ -167,21 +158,17 @@ var Channel = /*#__PURE__*/function (_Emitter) {
167
158
  */
168
159
  function connect() {
169
160
  var _this2 = this;
170
-
171
161
  (0, _performance.startMeasure)(_performance.MEASURE_NAME.SOCKET_CONNECT);
172
-
173
162
  if (!this.initialized) {
174
163
  (0, _performance.startMeasure)(_performance.MEASURE_NAME.DOCUMENT_INIT);
175
164
  this.initExperience.start();
176
165
  }
177
-
178
166
  var _this$config = this.config,
179
- documentAri = _this$config.documentAri,
180
- url = _this$config.url;
167
+ documentAri = _this$config.documentAri,
168
+ url = _this$config.url;
181
169
  var createSocket = this.config.createSocket;
182
170
  var permissionTokenRefresh = this.config.permissionTokenRefresh;
183
171
  var authCb = null;
184
-
185
172
  if (permissionTokenRefresh) {
186
173
  authCb = function authCb(cb) {
187
174
  permissionTokenRefresh().then(function (token) {
@@ -207,11 +194,11 @@ var Channel = /*#__PURE__*/function (_Emitter) {
207
194
  });
208
195
  };
209
196
  }
197
+ this.socket = createSocket("".concat(url, "/session/").concat(documentAri), authCb, this.config.productInfo);
210
198
 
211
- 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,
212
200
  // reconnect no longer fired on the socket.
213
201
  // We should use `connect` for better cross platform compatibility(Mobile/Web).
214
-
215
202
  this.socket.on('connect', this.onConnect);
216
203
  this.socket.on('data', this.onReceiveData);
217
204
  this.socket.on('steps:added', function (data) {
@@ -231,10 +218,9 @@ var Channel = /*#__PURE__*/function (_Emitter) {
231
218
  });
232
219
  this.socket.on('participant:updated', function (_ref) {
233
220
  var sessionId = _ref.sessionId,
234
- timestamp = _ref.timestamp,
235
- data = _ref.data,
236
- clientId = _ref.clientId;
237
-
221
+ timestamp = _ref.timestamp,
222
+ data = _ref.data,
223
+ clientId = _ref.clientId;
238
224
  _this2.emit('participant:updated', _objectSpread({
239
225
  sessionId: sessionId,
240
226
  timestamp: timestamp,
@@ -243,8 +229,9 @@ var Channel = /*#__PURE__*/function (_Emitter) {
243
229
  });
244
230
  this.socket.on('metadata:changed', function (payload) {
245
231
  _this2.emit('metadata:changed', payload);
246
- }); // ESS-2916 namespace status event - lock/unlock
232
+ });
247
233
 
234
+ // ESS-2916 namespace status event - lock/unlock
248
235
  this.socket.on('status', function (data) {
249
236
  _this2.emit('status', data);
250
237
  });
@@ -256,16 +243,13 @@ var Channel = /*#__PURE__*/function (_Emitter) {
256
243
  case 0:
257
244
  _this2.connected = false;
258
245
  logger("disconnect reason: ".concat(reason));
259
-
260
246
  _this2.emit('disconnect', {
261
247
  reason: reason
262
248
  });
263
-
264
249
  if (reason === 'io server disconnect' && _this2.socket) {
265
250
  // The disconnection was initiated by the server, we need to reconnect manually.
266
251
  _this2.socket.connect();
267
252
  }
268
-
269
253
  case 4:
270
254
  case "end":
271
255
  return _context.stop();
@@ -273,50 +257,25 @@ var Channel = /*#__PURE__*/function (_Emitter) {
273
257
  }
274
258
  }, _callee);
275
259
  }));
276
-
277
260
  return function (_x) {
278
261
  return _ref2.apply(this, arguments);
279
262
  };
280
- }()); // Socket error, including errors from `packetMiddleware`, `controllers` and `onconnect` and more. Paramter is a plain JSON object.
263
+ }());
281
264
 
265
+ // Socket error, including errors from `packetMiddleware`, `controllers` and `onconnect` and more. Paramter is a plain JSON object.
282
266
  this.socket.on('error', function (error) {
283
267
  _this2.emit('error', error);
284
- }); // `connect_error`'s paramter type is `Error`.
285
- // Ensure the error emit to the provider has the same structure, so we can handle them unified.
286
-
287
- this.socket.on('connect_error', function (error) {
288
- var measure = (0, _performance.stopMeasure)(_performance.MEASURE_NAME.SOCKET_CONNECT);
289
- (0, _analytics.triggerAnalyticsEvent)({
290
- eventAction: _const.EVENT_ACTION.CONNECTION,
291
- attributes: {
292
- eventStatus: _const.EVENT_STATUS.FAILURE,
293
- error: error,
294
- latency: measure === null || measure === void 0 ? void 0 : measure.duration,
295
- documentAri: _this2.config.documentAri
296
- }
297
- }, _this2.analyticsClient); // If error received with `data`, it means the connection is rejected
298
- // by the server on purpose for example no permission, so no need to
299
- // keep the underneath connection, need to close. But some error like
300
- // `xhr polling error` needs to retry.
301
-
302
- if (!!error.data) {
303
- var _this2$socket;
304
-
305
- (_this2$socket = _this2.socket) === null || _this2$socket === void 0 ? void 0 : _this2$socket.close();
306
- }
307
-
308
- _this2.emit('error', {
309
- message: error.message,
310
- data: error.data
311
- });
312
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);
313
273
  }
314
274
  }, {
315
275
  key: "fetchCatchup",
316
276
  value: function () {
317
277
  var _fetchCatchup = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee2(fromVersion) {
318
- var _yield$this$config$pe, _yield$utils$requestS, doc, version, stepMaps, metadata, errorCatchup;
319
-
278
+ var _yield$this$config$pe, _yield$utils$requestS, doc, version, stepMaps, metadata, errorNotFound, errorCatchup;
320
279
  return _regenerator.default.wrap(function _callee2$(_context2) {
321
280
  while (1) {
322
281
  switch (_context2.prev = _context2.next) {
@@ -331,39 +290,30 @@ var Channel = /*#__PURE__*/function (_Emitter) {
331
290
  _context2.t4 = _objectSpread;
332
291
  _context2.t5 = _objectSpread;
333
292
  _context2.t6 = {};
334
-
335
293
  if (!this.config.permissionTokenRefresh) {
336
294
  _context2.next = 24;
337
295
  break;
338
296
  }
339
-
340
297
  _context2.next = 11;
341
298
  return this.config.permissionTokenRefresh();
342
-
343
299
  case 11:
344
300
  _context2.t9 = _yield$this$config$pe = _context2.sent;
345
301
  _context2.t8 = _context2.t9 !== null;
346
-
347
302
  if (!_context2.t8) {
348
303
  _context2.next = 15;
349
304
  break;
350
305
  }
351
-
352
306
  _context2.t8 = _yield$this$config$pe !== void 0;
353
-
354
307
  case 15:
355
308
  if (!_context2.t8) {
356
309
  _context2.next = 19;
357
310
  break;
358
311
  }
359
-
360
312
  _context2.t10 = _yield$this$config$pe;
361
313
  _context2.next = 20;
362
314
  break;
363
-
364
315
  case 19:
365
316
  _context2.t10 = undefined;
366
-
367
317
  case 20:
368
318
  _context2.t11 = _context2.t10;
369
319
  _context2.t7 = {
@@ -371,10 +321,8 @@ var Channel = /*#__PURE__*/function (_Emitter) {
371
321
  };
372
322
  _context2.next = 25;
373
323
  break;
374
-
375
324
  case 24:
376
325
  _context2.t7 = {};
377
-
378
326
  case 25:
379
327
  _context2.t12 = _context2.t7;
380
328
  _context2.t13 = (0, _context2.t5)(_context2.t6, _context2.t12);
@@ -394,7 +342,6 @@ var Channel = /*#__PURE__*/function (_Emitter) {
394
342
  };
395
343
  _context2.next = 34;
396
344
  return _context2.t0.requestService.call(_context2.t0, _context2.t1, _context2.t18);
397
-
398
345
  case 34:
399
346
  _yield$utils$requestS = _context2.sent;
400
347
  doc = _yield$utils$requestS.doc;
@@ -407,10 +354,23 @@ var Channel = /*#__PURE__*/function (_Emitter) {
407
354
  stepMaps: stepMaps,
408
355
  metadata: metadata
409
356
  });
410
-
411
357
  case 42:
412
358
  _context2.prev = 42;
413
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:
414
374
  logger("Can't fetch the catchup", _context2.t19.message);
415
375
  errorCatchup = {
416
376
  message: _errorCodeMapper.ErrorCodeMapper.catchupFail.message,
@@ -421,32 +381,27 @@ var Channel = /*#__PURE__*/function (_Emitter) {
421
381
  };
422
382
  this.emit('error', errorCatchup);
423
383
  return _context2.abrupt("return", {});
424
-
425
- case 48:
384
+ case 52:
426
385
  case "end":
427
386
  return _context2.stop();
428
387
  }
429
388
  }
430
389
  }, _callee2, this, [[0, 42]]);
431
390
  }));
432
-
433
391
  function fetchCatchup(_x2) {
434
392
  return _fetchCatchup.apply(this, arguments);
435
393
  }
436
-
437
394
  return fetchCatchup;
438
395
  }()
439
396
  /**
440
397
  * Send message to service. Timestamp will be added server side.
441
398
  */
442
-
443
399
  }, {
444
400
  key: "broadcast",
445
401
  value: function broadcast(type, data, callback) {
446
402
  if (!this.connected || !this.socket) {
447
403
  return;
448
404
  }
449
-
450
405
  this.socket.emit('broadcast', _objectSpread({
451
406
  type: type
452
407
  }, data), callback);
@@ -457,7 +412,6 @@ var Channel = /*#__PURE__*/function (_Emitter) {
457
412
  if (!this.connected || !this.socket) {
458
413
  return;
459
414
  }
460
-
461
415
  this.socket.emit('metadata', metadata);
462
416
  }
463
417
  }, {
@@ -466,14 +420,12 @@ var Channel = /*#__PURE__*/function (_Emitter) {
466
420
  if (!this.connected || !this.socket) {
467
421
  return;
468
422
  }
469
-
470
423
  this.socket.emit('presence:joined');
471
424
  }
472
425
  }, {
473
426
  key: "disconnect",
474
427
  value: function disconnect() {
475
428
  this.unsubscribeAll();
476
-
477
429
  if (this.socket) {
478
430
  this.socket.close();
479
431
  this.socket = null;
@@ -482,5 +434,4 @@ var Channel = /*#__PURE__*/function (_Emitter) {
482
434
  }]);
483
435
  return Channel;
484
436
  }(_emitter.Emitter);
485
-
486
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;