@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.
- package/CHANGELOG.md +27 -0
- package/dist/cjs/analytics/index.js +2 -11
- package/dist/cjs/analytics/performance.js +2 -16
- package/dist/cjs/channel.js +66 -115
- package/dist/cjs/disconnected-reason-mapper.js +0 -2
- package/dist/cjs/emitter.js +3 -11
- package/dist/cjs/error-code-mapper.js +4 -17
- package/dist/cjs/feature-flags/__test__/index.unit.js +27 -0
- package/dist/cjs/feature-flags/index.js +52 -0
- package/dist/cjs/feature-flags/types.js +12 -0
- package/dist/cjs/helpers/const.js +6 -10
- package/dist/cjs/helpers/utils.js +0 -12
- package/dist/cjs/index.js +0 -1
- package/dist/cjs/provider/catchup.js +38 -42
- package/dist/cjs/provider/index.js +153 -283
- package/dist/cjs/socket-io-provider.js +2 -12
- package/dist/cjs/types.js +0 -1
- package/dist/cjs/version-wrapper.js +1 -3
- package/dist/cjs/version.json +1 -1
- package/dist/es2019/analytics/index.js +2 -3
- package/dist/es2019/analytics/performance.js +2 -13
- package/dist/es2019/channel.js +57 -65
- package/dist/es2019/disconnected-reason-mapper.js +1 -2
- package/dist/es2019/emitter.js +3 -8
- package/dist/es2019/error-code-mapper.js +4 -12
- package/dist/es2019/feature-flags/__test__/index.unit.js +25 -0
- package/dist/es2019/feature-flags/index.js +31 -0
- package/dist/es2019/feature-flags/types.js +5 -0
- package/dist/es2019/helpers/const.js +4 -9
- package/dist/es2019/helpers/utils.js +0 -2
- package/dist/es2019/provider/catchup.js +33 -17
- package/dist/es2019/provider/index.js +119 -189
- package/dist/es2019/socket-io-provider.js +4 -2
- package/dist/es2019/types.js +1 -1
- package/dist/es2019/version-wrapper.js +1 -1
- package/dist/es2019/version.json +1 -1
- package/dist/esm/analytics/index.js +2 -6
- package/dist/esm/analytics/performance.js +2 -13
- package/dist/esm/channel.js +68 -108
- package/dist/esm/disconnected-reason-mapper.js +1 -2
- package/dist/esm/emitter.js +3 -6
- package/dist/esm/error-code-mapper.js +4 -12
- package/dist/esm/feature-flags/__test__/index.unit.js +25 -0
- package/dist/esm/feature-flags/index.js +43 -0
- package/dist/esm/feature-flags/types.js +5 -0
- package/dist/esm/helpers/const.js +4 -9
- package/dist/esm/helpers/utils.js +0 -3
- package/dist/esm/provider/catchup.js +38 -35
- package/dist/esm/provider/index.js +153 -285
- package/dist/esm/socket-io-provider.js +2 -5
- package/dist/esm/types.js +1 -1
- package/dist/esm/version-wrapper.js +1 -1
- package/dist/esm/version.json +1 -1
- package/dist/types/channel.d.ts +1 -0
- package/dist/types/error-code-mapper.d.ts +1 -1
- package/dist/types/feature-flags/__test__/index.unit.d.ts +1 -0
- package/dist/types/feature-flags/index.d.ts +9 -0
- package/dist/types/feature-flags/types.d.ts +11 -0
- package/dist/types/helpers/const.d.ts +19 -3
- package/dist/types/provider/catchup.d.ts +1 -1
- package/dist/types/provider/index.d.ts +1 -0
- package/dist/types/types.d.ts +9 -4
- package/package.json +10 -9
- 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
|
-
|
|
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
|
-
}
|
|
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"));
|
package/dist/cjs/channel.js
CHANGED
|
@@ -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
|
-
|
|
124
|
-
|
|
125
|
-
|
|
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
|
-
|
|
138
|
-
|
|
139
|
-
|
|
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
|
-
}
|
|
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
|
-
|
|
180
|
-
|
|
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
|
-
|
|
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
|
-
|
|
235
|
-
|
|
236
|
-
|
|
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
|
-
});
|
|
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
|
-
}());
|
|
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";
|
package/dist/cjs/emitter.js
CHANGED
|
@@ -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;
|