@atlaskit/collab-provider 9.7.1 → 9.7.2
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 +6 -0
- package/dist/cjs/channel.js +12 -1
- package/dist/cjs/feature-flags/__test__/index.unit.js +3 -2
- package/dist/cjs/feature-flags/index.js +4 -2
- package/dist/cjs/helpers/const.js +2 -1
- package/dist/cjs/helpers/socket-message-metrics.js +54 -0
- package/dist/cjs/version-wrapper.js +1 -1
- package/dist/cjs/version.json +1 -1
- package/dist/es2019/channel.js +11 -0
- package/dist/es2019/feature-flags/__test__/index.unit.js +3 -2
- package/dist/es2019/feature-flags/index.js +4 -2
- package/dist/es2019/helpers/const.js +2 -1
- package/dist/es2019/helpers/socket-message-metrics.js +40 -0
- package/dist/es2019/version-wrapper.js +1 -1
- package/dist/es2019/version.json +1 -1
- package/dist/esm/channel.js +12 -1
- package/dist/esm/feature-flags/__test__/index.unit.js +3 -2
- package/dist/esm/feature-flags/index.js +4 -2
- package/dist/esm/helpers/const.js +2 -1
- package/dist/esm/helpers/socket-message-metrics.js +45 -0
- 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/feature-flags/types.d.ts +1 -0
- package/dist/types/helpers/const.d.ts +12 -2
- package/dist/types/helpers/socket-message-metrics.d.ts +14 -0
- package/dist/types-ts4.5/channel.d.ts +1 -0
- package/dist/types-ts4.5/feature-flags/types.d.ts +1 -0
- package/dist/types-ts4.5/helpers/const.d.ts +12 -2
- package/dist/types-ts4.5/helpers/socket-message-metrics.d.ts +14 -0
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
package/dist/cjs/channel.js
CHANGED
|
@@ -24,6 +24,8 @@ var _ufo = require("./analytics/ufo");
|
|
|
24
24
|
var _disconnectedReasonMapper = require("./disconnected-reason-mapper");
|
|
25
25
|
var _network = _interopRequireDefault(require("./connectivity/network"));
|
|
26
26
|
var _errorTypes = require("./errors/error-types");
|
|
27
|
+
var _socketMessageMetrics = require("./helpers/socket-message-metrics");
|
|
28
|
+
var _featureFlags = require("./feature-flags");
|
|
27
29
|
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; }
|
|
28
30
|
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; }
|
|
29
31
|
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); }; }
|
|
@@ -125,6 +127,9 @@ var Channel = /*#__PURE__*/function (_Emitter) {
|
|
|
125
127
|
});
|
|
126
128
|
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "onConnect", function () {
|
|
127
129
|
var _this$analyticsHelper5;
|
|
130
|
+
if ((0, _featureFlags.getCollabProviderFeatureFlag)('socketMessageMetricsFF', _this.config.featureFlags) && _this.socketMessageMetrics) {
|
|
131
|
+
_this.socketMessageMetrics.setupSocketMessageMetrics();
|
|
132
|
+
}
|
|
128
133
|
_this.connected = true;
|
|
129
134
|
logger('Connected.', _this.socket.id);
|
|
130
135
|
var measure = (0, _performance.stopMeasure)(_performance.MEASURE_NAME.SOCKET_CONNECT, _this.analyticsHelper);
|
|
@@ -474,6 +479,9 @@ var Channel = /*#__PURE__*/function (_Emitter) {
|
|
|
474
479
|
};
|
|
475
480
|
}
|
|
476
481
|
this.socket = createSocket("".concat(url, "/session/").concat(documentAri), auth, this.config.productInfo);
|
|
482
|
+
if (this.socket && this.analyticsHelper) {
|
|
483
|
+
this.socketMessageMetrics = new _socketMessageMetrics.SocketMessageMetrics(this.socket, this.analyticsHelper);
|
|
484
|
+
}
|
|
477
485
|
|
|
478
486
|
// Due to https://github.com/socketio/socket.io-client/issues/1473,
|
|
479
487
|
// reconnect no longer fired on the socket.
|
|
@@ -525,6 +533,9 @@ var Channel = /*#__PURE__*/function (_Emitter) {
|
|
|
525
533
|
return _regenerator.default.wrap(function _callee3$(_context3) {
|
|
526
534
|
while (1) switch (_context3.prev = _context3.next) {
|
|
527
535
|
case 0:
|
|
536
|
+
if ((0, _featureFlags.getCollabProviderFeatureFlag)('socketMessageMetricsFF', _this2.config.featureFlags) && _this2.socketMessageMetrics) {
|
|
537
|
+
_this2.socketMessageMetrics.closeSocketMessageMetrics();
|
|
538
|
+
}
|
|
528
539
|
_this2.connected = false;
|
|
529
540
|
logger("disconnect reason: ".concat(reason));
|
|
530
541
|
_this2.emit('disconnect', {
|
|
@@ -546,7 +557,7 @@ var Channel = /*#__PURE__*/function (_Emitter) {
|
|
|
546
557
|
_this2.emit('error', reconnectionError);
|
|
547
558
|
}
|
|
548
559
|
}
|
|
549
|
-
case
|
|
560
|
+
case 5:
|
|
550
561
|
case "end":
|
|
551
562
|
return _context3.stop();
|
|
552
563
|
}
|
|
@@ -4,9 +4,10 @@ var _index = require("../index");
|
|
|
4
4
|
describe('Feature flags', function () {
|
|
5
5
|
it('getProductSpecificFeatureFlags', function () {
|
|
6
6
|
var result = (0, _index.getProductSpecificFeatureFlags)({
|
|
7
|
-
testFF: true
|
|
7
|
+
testFF: true,
|
|
8
|
+
socketMessageMetricsFF: true
|
|
8
9
|
}, 'confluence');
|
|
9
|
-
expect(result).toEqual(['confluence.fe.collab.provider.testFF']);
|
|
10
|
+
expect(result).toEqual(['confluence.fe.collab.provider.testFF', 'confluence.fe.collab.provider.socketMessageMetricsFF']);
|
|
10
11
|
});
|
|
11
12
|
it('getCollabProviderFeatureFlag return true', function () {
|
|
12
13
|
var result = (0, _index.getCollabProviderFeatureFlag)('testFF', {
|
|
@@ -8,7 +8,8 @@ exports.getCollabProviderFeatureFlag = getCollabProviderFeatureFlag;
|
|
|
8
8
|
exports.getProductSpecificFeatureFlags = void 0;
|
|
9
9
|
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
|
|
10
10
|
var defaultNCSFeatureFlags = {
|
|
11
|
-
testFF: false
|
|
11
|
+
testFF: false,
|
|
12
|
+
socketMessageMetricsFF: false
|
|
12
13
|
};
|
|
13
14
|
|
|
14
15
|
/**
|
|
@@ -16,7 +17,8 @@ var defaultNCSFeatureFlags = {
|
|
|
16
17
|
*/
|
|
17
18
|
var productKeys = {
|
|
18
19
|
confluence: {
|
|
19
|
-
testFF: 'confluence.fe.collab.provider.testFF'
|
|
20
|
+
testFF: 'confluence.fe.collab.provider.testFF',
|
|
21
|
+
socketMessageMetricsFF: 'confluence.fe.collab.provider.socketMessageMetricsFF'
|
|
20
22
|
}
|
|
21
23
|
};
|
|
22
24
|
var filterFeatureFlagNames = function filterFeatureFlagNames(flags) {
|
|
@@ -19,8 +19,9 @@ var EVENT_ACTION = /*#__PURE__*/function (EVENT_ACTION) {
|
|
|
19
19
|
EVENT_ACTION["SEND_STEPS_RETRY"] = "sendStepsRetry";
|
|
20
20
|
EVENT_ACTION["CATCHUP_AFTER_MAX_SEND_STEPS_RETRY"] = "catchupAfterMaxSendStepsRetry";
|
|
21
21
|
EVENT_ACTION["DROPPED_STEPS"] = "droppedStepInCatchup";
|
|
22
|
+
EVENT_ACTION["WEBSOCKET_MESSAGE_VOLUME_METRIC"] = "websocketMessageVolumeMetric";
|
|
22
23
|
return EVENT_ACTION;
|
|
23
|
-
}({}); // https://data-portal.internal.atlassian.com/analytics/registry/
|
|
24
|
+
}({}); // https://data-portal.internal.atlassian.com/analytics/registry/53596
|
|
24
25
|
exports.EVENT_ACTION = EVENT_ACTION;
|
|
25
26
|
var EVENT_STATUS = /*#__PURE__*/function (EVENT_STATUS) {
|
|
26
27
|
EVENT_STATUS["SUCCESS"] = "SUCCESS";
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.WEBSOCKET_MESSAGE_VOLUME_METRIC_SEND_INTERVAL_MS = exports.SocketMessageMetrics = void 0;
|
|
8
|
+
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
|
|
9
|
+
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
|
|
10
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
11
|
+
var _const = require("./const");
|
|
12
|
+
var _utils = require("./utils");
|
|
13
|
+
var logger = (0, _utils.createLogger)('SocketMessageMetrics', 'green');
|
|
14
|
+
var WEBSOCKET_MESSAGE_VOLUME_METRIC_SEND_INTERVAL_MS = 60000;
|
|
15
|
+
exports.WEBSOCKET_MESSAGE_VOLUME_METRIC_SEND_INTERVAL_MS = WEBSOCKET_MESSAGE_VOLUME_METRIC_SEND_INTERVAL_MS;
|
|
16
|
+
var SocketMessageMetrics = /*#__PURE__*/(0, _createClass2.default)(function SocketMessageMetrics(socket, analyticsHelper) {
|
|
17
|
+
var _this = this;
|
|
18
|
+
(0, _classCallCheck2.default)(this, SocketMessageMetrics);
|
|
19
|
+
(0, _defineProperty2.default)(this, "messageCount", 0);
|
|
20
|
+
(0, _defineProperty2.default)(this, "totalMessageSize", 0);
|
|
21
|
+
(0, _defineProperty2.default)(this, "metricsIntervalID", undefined);
|
|
22
|
+
(0, _defineProperty2.default)(this, "socketMessageMetricsListener", function (event) {
|
|
23
|
+
_this.messageCount++;
|
|
24
|
+
for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
|
|
25
|
+
args[_key - 1] = arguments[_key];
|
|
26
|
+
}
|
|
27
|
+
_this.totalMessageSize += Buffer.byteLength(JSON.stringify(args), 'utf8');
|
|
28
|
+
});
|
|
29
|
+
(0, _defineProperty2.default)(this, "setupSocketMessageMetrics", function () {
|
|
30
|
+
if (_this.metricsIntervalID !== undefined) {
|
|
31
|
+
logger('calling setupSocketMessageMetrics function with metricsIntervalID that is not undefined');
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
_this.socket.onAnyOutgoing(_this.socketMessageMetricsListener);
|
|
35
|
+
|
|
36
|
+
// send metrics every 60 seconds
|
|
37
|
+
_this.metricsIntervalID = window.setInterval(function () {
|
|
38
|
+
_this.analyticsHelper.sendActionEvent(_const.EVENT_ACTION.WEBSOCKET_MESSAGE_VOLUME_METRIC, _const.EVENT_STATUS.INFO, {
|
|
39
|
+
messageCount: _this.messageCount,
|
|
40
|
+
totalMessageSize: _this.totalMessageSize
|
|
41
|
+
});
|
|
42
|
+
_this.messageCount = 0;
|
|
43
|
+
_this.totalMessageSize = 0;
|
|
44
|
+
}, WEBSOCKET_MESSAGE_VOLUME_METRIC_SEND_INTERVAL_MS);
|
|
45
|
+
});
|
|
46
|
+
(0, _defineProperty2.default)(this, "closeSocketMessageMetrics", function () {
|
|
47
|
+
clearInterval(_this.metricsIntervalID);
|
|
48
|
+
_this.metricsIntervalID = undefined;
|
|
49
|
+
_this.socket.offAnyOutgoing(_this.socketMessageMetricsListener);
|
|
50
|
+
});
|
|
51
|
+
this.socket = socket;
|
|
52
|
+
this.analyticsHelper = analyticsHelper;
|
|
53
|
+
});
|
|
54
|
+
exports.SocketMessageMetrics = SocketMessageMetrics;
|
|
@@ -6,7 +6,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
6
6
|
exports.version = exports.nextMajorVersion = exports.name = void 0;
|
|
7
7
|
var name = "@atlaskit/collab-provider";
|
|
8
8
|
exports.name = name;
|
|
9
|
-
var version = "9.7.
|
|
9
|
+
var version = "9.7.2";
|
|
10
10
|
exports.version = version;
|
|
11
11
|
var nextMajorVersion = function nextMajorVersion() {
|
|
12
12
|
return [Number(version.split('.')[0]) + 1, 0, 0].join('.');
|
package/dist/cjs/version.json
CHANGED
package/dist/es2019/channel.js
CHANGED
|
@@ -9,6 +9,8 @@ import { createDocInitExp } from './analytics/ufo';
|
|
|
9
9
|
import { socketIOReasons } from './disconnected-reason-mapper';
|
|
10
10
|
import Network from './connectivity/network';
|
|
11
11
|
import { NotConnectedError, NotInitializedError, INTERNAL_ERROR_CODE } from './errors/error-types';
|
|
12
|
+
import { SocketMessageMetrics } from './helpers/socket-message-metrics';
|
|
13
|
+
import { getCollabProviderFeatureFlag } from './feature-flags';
|
|
12
14
|
const logger = createLogger('Channel', 'green');
|
|
13
15
|
export class Channel extends Emitter {
|
|
14
16
|
constructor(config, analyticsHelper) {
|
|
@@ -93,6 +95,9 @@ export class Channel extends Emitter {
|
|
|
93
95
|
});
|
|
94
96
|
_defineProperty(this, "onConnect", () => {
|
|
95
97
|
var _this$analyticsHelper5;
|
|
98
|
+
if (getCollabProviderFeatureFlag('socketMessageMetricsFF', this.config.featureFlags) && this.socketMessageMetrics) {
|
|
99
|
+
this.socketMessageMetrics.setupSocketMessageMetrics();
|
|
100
|
+
}
|
|
96
101
|
this.connected = true;
|
|
97
102
|
logger('Connected.', this.socket.id);
|
|
98
103
|
const measure = stopMeasure(MEASURE_NAME.SOCKET_CONNECT, this.analyticsHelper);
|
|
@@ -350,6 +355,9 @@ export class Channel extends Emitter {
|
|
|
350
355
|
};
|
|
351
356
|
}
|
|
352
357
|
this.socket = createSocket(`${url}/session/${documentAri}`, auth, this.config.productInfo);
|
|
358
|
+
if (this.socket && this.analyticsHelper) {
|
|
359
|
+
this.socketMessageMetrics = new SocketMessageMetrics(this.socket, this.analyticsHelper);
|
|
360
|
+
}
|
|
353
361
|
|
|
354
362
|
// Due to https://github.com/socketio/socket.io-client/issues/1473,
|
|
355
363
|
// reconnect no longer fired on the socket.
|
|
@@ -400,6 +408,9 @@ export class Channel extends Emitter {
|
|
|
400
408
|
this.emit('status', data);
|
|
401
409
|
});
|
|
402
410
|
this.socket.on('disconnect', async reason => {
|
|
411
|
+
if (getCollabProviderFeatureFlag('socketMessageMetricsFF', this.config.featureFlags) && this.socketMessageMetrics) {
|
|
412
|
+
this.socketMessageMetrics.closeSocketMessageMetrics();
|
|
413
|
+
}
|
|
403
414
|
this.connected = false;
|
|
404
415
|
logger(`disconnect reason: ${reason}`);
|
|
405
416
|
this.emit('disconnect', {
|
|
@@ -2,9 +2,10 @@ import { getProductSpecificFeatureFlags, getCollabProviderFeatureFlag } from '..
|
|
|
2
2
|
describe('Feature flags', () => {
|
|
3
3
|
it('getProductSpecificFeatureFlags', () => {
|
|
4
4
|
const result = getProductSpecificFeatureFlags({
|
|
5
|
-
testFF: true
|
|
5
|
+
testFF: true,
|
|
6
|
+
socketMessageMetricsFF: true
|
|
6
7
|
}, 'confluence');
|
|
7
|
-
expect(result).toEqual(['confluence.fe.collab.provider.testFF']);
|
|
8
|
+
expect(result).toEqual(['confluence.fe.collab.provider.testFF', 'confluence.fe.collab.provider.socketMessageMetricsFF']);
|
|
8
9
|
});
|
|
9
10
|
it('getCollabProviderFeatureFlag return true', () => {
|
|
10
11
|
const result = getCollabProviderFeatureFlag('testFF', {
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
const defaultNCSFeatureFlags = {
|
|
2
|
-
testFF: false
|
|
2
|
+
testFF: false,
|
|
3
|
+
socketMessageMetricsFF: false
|
|
3
4
|
};
|
|
4
5
|
|
|
5
6
|
/**
|
|
@@ -7,7 +8,8 @@ const defaultNCSFeatureFlags = {
|
|
|
7
8
|
*/
|
|
8
9
|
const productKeys = {
|
|
9
10
|
confluence: {
|
|
10
|
-
testFF: 'confluence.fe.collab.provider.testFF'
|
|
11
|
+
testFF: 'confluence.fe.collab.provider.testFF',
|
|
12
|
+
socketMessageMetricsFF: 'confluence.fe.collab.provider.socketMessageMetricsFF'
|
|
11
13
|
}
|
|
12
14
|
};
|
|
13
15
|
const filterFeatureFlagNames = flags => {
|
|
@@ -13,8 +13,9 @@ export let EVENT_ACTION = /*#__PURE__*/function (EVENT_ACTION) {
|
|
|
13
13
|
EVENT_ACTION["SEND_STEPS_RETRY"] = "sendStepsRetry";
|
|
14
14
|
EVENT_ACTION["CATCHUP_AFTER_MAX_SEND_STEPS_RETRY"] = "catchupAfterMaxSendStepsRetry";
|
|
15
15
|
EVENT_ACTION["DROPPED_STEPS"] = "droppedStepInCatchup";
|
|
16
|
+
EVENT_ACTION["WEBSOCKET_MESSAGE_VOLUME_METRIC"] = "websocketMessageVolumeMetric";
|
|
16
17
|
return EVENT_ACTION;
|
|
17
|
-
}({}); // https://data-portal.internal.atlassian.com/analytics/registry/
|
|
18
|
+
}({}); // https://data-portal.internal.atlassian.com/analytics/registry/53596
|
|
18
19
|
export let EVENT_STATUS = /*#__PURE__*/function (EVENT_STATUS) {
|
|
19
20
|
EVENT_STATUS["SUCCESS"] = "SUCCESS";
|
|
20
21
|
EVENT_STATUS["FAILURE"] = "FAILURE";
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import _defineProperty from "@babel/runtime/helpers/defineProperty";
|
|
2
|
+
import { EVENT_ACTION, EVENT_STATUS } from './const';
|
|
3
|
+
import { createLogger } from './utils';
|
|
4
|
+
const logger = createLogger('SocketMessageMetrics', 'green');
|
|
5
|
+
export const WEBSOCKET_MESSAGE_VOLUME_METRIC_SEND_INTERVAL_MS = 60000;
|
|
6
|
+
export class SocketMessageMetrics {
|
|
7
|
+
constructor(socket, analyticsHelper) {
|
|
8
|
+
_defineProperty(this, "messageCount", 0);
|
|
9
|
+
_defineProperty(this, "totalMessageSize", 0);
|
|
10
|
+
_defineProperty(this, "metricsIntervalID", undefined);
|
|
11
|
+
_defineProperty(this, "socketMessageMetricsListener", (event, ...args) => {
|
|
12
|
+
this.messageCount++;
|
|
13
|
+
this.totalMessageSize += Buffer.byteLength(JSON.stringify(args), 'utf8');
|
|
14
|
+
});
|
|
15
|
+
_defineProperty(this, "setupSocketMessageMetrics", () => {
|
|
16
|
+
if (this.metricsIntervalID !== undefined) {
|
|
17
|
+
logger('calling setupSocketMessageMetrics function with metricsIntervalID that is not undefined');
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
this.socket.onAnyOutgoing(this.socketMessageMetricsListener);
|
|
21
|
+
|
|
22
|
+
// send metrics every 60 seconds
|
|
23
|
+
this.metricsIntervalID = window.setInterval(() => {
|
|
24
|
+
this.analyticsHelper.sendActionEvent(EVENT_ACTION.WEBSOCKET_MESSAGE_VOLUME_METRIC, EVENT_STATUS.INFO, {
|
|
25
|
+
messageCount: this.messageCount,
|
|
26
|
+
totalMessageSize: this.totalMessageSize
|
|
27
|
+
});
|
|
28
|
+
this.messageCount = 0;
|
|
29
|
+
this.totalMessageSize = 0;
|
|
30
|
+
}, WEBSOCKET_MESSAGE_VOLUME_METRIC_SEND_INTERVAL_MS);
|
|
31
|
+
});
|
|
32
|
+
_defineProperty(this, "closeSocketMessageMetrics", () => {
|
|
33
|
+
clearInterval(this.metricsIntervalID);
|
|
34
|
+
this.metricsIntervalID = undefined;
|
|
35
|
+
this.socket.offAnyOutgoing(this.socketMessageMetricsListener);
|
|
36
|
+
});
|
|
37
|
+
this.socket = socket;
|
|
38
|
+
this.analyticsHelper = analyticsHelper;
|
|
39
|
+
}
|
|
40
|
+
}
|
package/dist/es2019/version.json
CHANGED
package/dist/esm/channel.js
CHANGED
|
@@ -21,6 +21,8 @@ import { createDocInitExp } from './analytics/ufo';
|
|
|
21
21
|
import { socketIOReasons } from './disconnected-reason-mapper';
|
|
22
22
|
import Network from './connectivity/network';
|
|
23
23
|
import { NotConnectedError, NotInitializedError, INTERNAL_ERROR_CODE } from './errors/error-types';
|
|
24
|
+
import { SocketMessageMetrics } from './helpers/socket-message-metrics';
|
|
25
|
+
import { getCollabProviderFeatureFlag } from './feature-flags';
|
|
24
26
|
var logger = createLogger('Channel', 'green');
|
|
25
27
|
export var Channel = /*#__PURE__*/function (_Emitter) {
|
|
26
28
|
_inherits(Channel, _Emitter);
|
|
@@ -118,6 +120,9 @@ export var Channel = /*#__PURE__*/function (_Emitter) {
|
|
|
118
120
|
});
|
|
119
121
|
_defineProperty(_assertThisInitialized(_this), "onConnect", function () {
|
|
120
122
|
var _this$analyticsHelper5;
|
|
123
|
+
if (getCollabProviderFeatureFlag('socketMessageMetricsFF', _this.config.featureFlags) && _this.socketMessageMetrics) {
|
|
124
|
+
_this.socketMessageMetrics.setupSocketMessageMetrics();
|
|
125
|
+
}
|
|
121
126
|
_this.connected = true;
|
|
122
127
|
logger('Connected.', _this.socket.id);
|
|
123
128
|
var measure = stopMeasure(MEASURE_NAME.SOCKET_CONNECT, _this.analyticsHelper);
|
|
@@ -467,6 +472,9 @@ export var Channel = /*#__PURE__*/function (_Emitter) {
|
|
|
467
472
|
};
|
|
468
473
|
}
|
|
469
474
|
this.socket = createSocket("".concat(url, "/session/").concat(documentAri), auth, this.config.productInfo);
|
|
475
|
+
if (this.socket && this.analyticsHelper) {
|
|
476
|
+
this.socketMessageMetrics = new SocketMessageMetrics(this.socket, this.analyticsHelper);
|
|
477
|
+
}
|
|
470
478
|
|
|
471
479
|
// Due to https://github.com/socketio/socket.io-client/issues/1473,
|
|
472
480
|
// reconnect no longer fired on the socket.
|
|
@@ -518,6 +526,9 @@ export var Channel = /*#__PURE__*/function (_Emitter) {
|
|
|
518
526
|
return _regeneratorRuntime.wrap(function _callee3$(_context3) {
|
|
519
527
|
while (1) switch (_context3.prev = _context3.next) {
|
|
520
528
|
case 0:
|
|
529
|
+
if (getCollabProviderFeatureFlag('socketMessageMetricsFF', _this2.config.featureFlags) && _this2.socketMessageMetrics) {
|
|
530
|
+
_this2.socketMessageMetrics.closeSocketMessageMetrics();
|
|
531
|
+
}
|
|
521
532
|
_this2.connected = false;
|
|
522
533
|
logger("disconnect reason: ".concat(reason));
|
|
523
534
|
_this2.emit('disconnect', {
|
|
@@ -539,7 +550,7 @@ export var Channel = /*#__PURE__*/function (_Emitter) {
|
|
|
539
550
|
_this2.emit('error', reconnectionError);
|
|
540
551
|
}
|
|
541
552
|
}
|
|
542
|
-
case
|
|
553
|
+
case 5:
|
|
543
554
|
case "end":
|
|
544
555
|
return _context3.stop();
|
|
545
556
|
}
|
|
@@ -2,9 +2,10 @@ import { getProductSpecificFeatureFlags, getCollabProviderFeatureFlag } from '..
|
|
|
2
2
|
describe('Feature flags', function () {
|
|
3
3
|
it('getProductSpecificFeatureFlags', function () {
|
|
4
4
|
var result = getProductSpecificFeatureFlags({
|
|
5
|
-
testFF: true
|
|
5
|
+
testFF: true,
|
|
6
|
+
socketMessageMetricsFF: true
|
|
6
7
|
}, 'confluence');
|
|
7
|
-
expect(result).toEqual(['confluence.fe.collab.provider.testFF']);
|
|
8
|
+
expect(result).toEqual(['confluence.fe.collab.provider.testFF', 'confluence.fe.collab.provider.socketMessageMetricsFF']);
|
|
8
9
|
});
|
|
9
10
|
it('getCollabProviderFeatureFlag return true', function () {
|
|
10
11
|
var result = getCollabProviderFeatureFlag('testFF', {
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
|
|
2
2
|
var defaultNCSFeatureFlags = {
|
|
3
|
-
testFF: false
|
|
3
|
+
testFF: false,
|
|
4
|
+
socketMessageMetricsFF: false
|
|
4
5
|
};
|
|
5
6
|
|
|
6
7
|
/**
|
|
@@ -8,7 +9,8 @@ var defaultNCSFeatureFlags = {
|
|
|
8
9
|
*/
|
|
9
10
|
var productKeys = {
|
|
10
11
|
confluence: {
|
|
11
|
-
testFF: 'confluence.fe.collab.provider.testFF'
|
|
12
|
+
testFF: 'confluence.fe.collab.provider.testFF',
|
|
13
|
+
socketMessageMetricsFF: 'confluence.fe.collab.provider.socketMessageMetricsFF'
|
|
12
14
|
}
|
|
13
15
|
};
|
|
14
16
|
var filterFeatureFlagNames = function filterFeatureFlagNames(flags) {
|
|
@@ -13,8 +13,9 @@ export var EVENT_ACTION = /*#__PURE__*/function (EVENT_ACTION) {
|
|
|
13
13
|
EVENT_ACTION["SEND_STEPS_RETRY"] = "sendStepsRetry";
|
|
14
14
|
EVENT_ACTION["CATCHUP_AFTER_MAX_SEND_STEPS_RETRY"] = "catchupAfterMaxSendStepsRetry";
|
|
15
15
|
EVENT_ACTION["DROPPED_STEPS"] = "droppedStepInCatchup";
|
|
16
|
+
EVENT_ACTION["WEBSOCKET_MESSAGE_VOLUME_METRIC"] = "websocketMessageVolumeMetric";
|
|
16
17
|
return EVENT_ACTION;
|
|
17
|
-
}({}); // https://data-portal.internal.atlassian.com/analytics/registry/
|
|
18
|
+
}({}); // https://data-portal.internal.atlassian.com/analytics/registry/53596
|
|
18
19
|
export var EVENT_STATUS = /*#__PURE__*/function (EVENT_STATUS) {
|
|
19
20
|
EVENT_STATUS["SUCCESS"] = "SUCCESS";
|
|
20
21
|
EVENT_STATUS["FAILURE"] = "FAILURE";
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import _createClass from "@babel/runtime/helpers/createClass";
|
|
2
|
+
import _classCallCheck from "@babel/runtime/helpers/classCallCheck";
|
|
3
|
+
import _defineProperty from "@babel/runtime/helpers/defineProperty";
|
|
4
|
+
import { EVENT_ACTION, EVENT_STATUS } from './const';
|
|
5
|
+
import { createLogger } from './utils';
|
|
6
|
+
var logger = createLogger('SocketMessageMetrics', 'green');
|
|
7
|
+
export var WEBSOCKET_MESSAGE_VOLUME_METRIC_SEND_INTERVAL_MS = 60000;
|
|
8
|
+
export var SocketMessageMetrics = /*#__PURE__*/_createClass(function SocketMessageMetrics(socket, analyticsHelper) {
|
|
9
|
+
var _this = this;
|
|
10
|
+
_classCallCheck(this, SocketMessageMetrics);
|
|
11
|
+
_defineProperty(this, "messageCount", 0);
|
|
12
|
+
_defineProperty(this, "totalMessageSize", 0);
|
|
13
|
+
_defineProperty(this, "metricsIntervalID", undefined);
|
|
14
|
+
_defineProperty(this, "socketMessageMetricsListener", function (event) {
|
|
15
|
+
_this.messageCount++;
|
|
16
|
+
for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
|
|
17
|
+
args[_key - 1] = arguments[_key];
|
|
18
|
+
}
|
|
19
|
+
_this.totalMessageSize += Buffer.byteLength(JSON.stringify(args), 'utf8');
|
|
20
|
+
});
|
|
21
|
+
_defineProperty(this, "setupSocketMessageMetrics", function () {
|
|
22
|
+
if (_this.metricsIntervalID !== undefined) {
|
|
23
|
+
logger('calling setupSocketMessageMetrics function with metricsIntervalID that is not undefined');
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
_this.socket.onAnyOutgoing(_this.socketMessageMetricsListener);
|
|
27
|
+
|
|
28
|
+
// send metrics every 60 seconds
|
|
29
|
+
_this.metricsIntervalID = window.setInterval(function () {
|
|
30
|
+
_this.analyticsHelper.sendActionEvent(EVENT_ACTION.WEBSOCKET_MESSAGE_VOLUME_METRIC, EVENT_STATUS.INFO, {
|
|
31
|
+
messageCount: _this.messageCount,
|
|
32
|
+
totalMessageSize: _this.totalMessageSize
|
|
33
|
+
});
|
|
34
|
+
_this.messageCount = 0;
|
|
35
|
+
_this.totalMessageSize = 0;
|
|
36
|
+
}, WEBSOCKET_MESSAGE_VOLUME_METRIC_SEND_INTERVAL_MS);
|
|
37
|
+
});
|
|
38
|
+
_defineProperty(this, "closeSocketMessageMetrics", function () {
|
|
39
|
+
clearInterval(_this.metricsIntervalID);
|
|
40
|
+
_this.metricsIntervalID = undefined;
|
|
41
|
+
_this.socket.offAnyOutgoing(_this.socketMessageMetricsListener);
|
|
42
|
+
});
|
|
43
|
+
this.socket = socket;
|
|
44
|
+
this.analyticsHelper = analyticsHelper;
|
|
45
|
+
});
|
package/dist/esm/version.json
CHANGED
package/dist/types/channel.d.ts
CHANGED
|
@@ -13,6 +13,7 @@ export declare class Channel extends Emitter<ChannelEvent> {
|
|
|
13
13
|
private initExperience?;
|
|
14
14
|
private token?;
|
|
15
15
|
private network;
|
|
16
|
+
private socketMessageMetrics?;
|
|
16
17
|
constructor(config: Config, analyticsHelper: AnalyticsHelper);
|
|
17
18
|
getInitialized: () => boolean;
|
|
18
19
|
getConnected: () => boolean;
|
|
@@ -13,7 +13,8 @@ export declare enum EVENT_ACTION {
|
|
|
13
13
|
INVALIDATE_TOKEN = "invalidateToken",
|
|
14
14
|
SEND_STEPS_RETRY = "sendStepsRetry",
|
|
15
15
|
CATCHUP_AFTER_MAX_SEND_STEPS_RETRY = "catchupAfterMaxSendStepsRetry",
|
|
16
|
-
DROPPED_STEPS = "droppedStepInCatchup"
|
|
16
|
+
DROPPED_STEPS = "droppedStepInCatchup",
|
|
17
|
+
WEBSOCKET_MESSAGE_VOLUME_METRIC = "websocketMessageVolumeMetric"
|
|
17
18
|
}
|
|
18
19
|
export declare enum EVENT_STATUS {
|
|
19
20
|
SUCCESS = "SUCCESS",
|
|
@@ -215,7 +216,16 @@ type CatchupAfterMaxSendStepsRetryAnalyticsEvent = {
|
|
|
215
216
|
eventStatus: EVENT_STATUS.INFO;
|
|
216
217
|
};
|
|
217
218
|
};
|
|
218
|
-
|
|
219
|
+
type WebsocketMessageVolumeMetricEvent = {
|
|
220
|
+
eventAction: EVENT_ACTION.WEBSOCKET_MESSAGE_VOLUME_METRIC;
|
|
221
|
+
attributes: {
|
|
222
|
+
documentAri?: string;
|
|
223
|
+
eventStatus: EVENT_STATUS.INFO;
|
|
224
|
+
messageCount: number;
|
|
225
|
+
messageSize: number;
|
|
226
|
+
};
|
|
227
|
+
};
|
|
228
|
+
export type ActionAnalyticsEvent = AddStepsSuccessAnalyticsEvent | AddStepsFailureAnalyticsEvent | ReInitDocFailAnalyticsEvent | ReInitDocSuccessAnalyticsEvent | ConnectionSuccessAnalyticsEvent | ConnectionFailureAnalyticsEvent | CatchUpSuccessAnalyticsEvent | CatchUpFailureAnalyticsEvent | DocumentInitSuccessAnalyticsEvent | UpdateParticipantsSuccessAnalyticsEvent | CommitUnconfirmedStepsSuccessAnalyticsEvent | CommitUnconfirmedStepsFailureAnalyticsEvent | PublishPageSuccessAnalyticsEvent | PublishPageFailureAnalyticsEvent | GetCurrentStateSuccessAnalyticsEvent | GetCurrentStateFailureAnalyticsEvent | InvalidateTokenAnalyticsEvent | SendStepsRetryAnalyticsEvent | CatchupAfterMaxSendStepsRetryAnalyticsEvent | CatchUpDroppedStepsEvent | WebsocketMessageVolumeMetricEvent;
|
|
219
229
|
export declare const ACK_MAX_TRY = 60;
|
|
220
230
|
export declare const CONFLUENCE = "confluence";
|
|
221
231
|
export {};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import AnalyticsHelper from '../analytics/analytics-helper';
|
|
2
|
+
import type { Socket } from 'socket.io-client';
|
|
3
|
+
export declare const WEBSOCKET_MESSAGE_VOLUME_METRIC_SEND_INTERVAL_MS = 60000;
|
|
4
|
+
export declare class SocketMessageMetrics {
|
|
5
|
+
private messageCount;
|
|
6
|
+
private totalMessageSize;
|
|
7
|
+
private metricsIntervalID;
|
|
8
|
+
private socket;
|
|
9
|
+
private analyticsHelper;
|
|
10
|
+
constructor(socket: Socket, analyticsHelper: AnalyticsHelper);
|
|
11
|
+
socketMessageMetricsListener: (event: any, ...args: any[]) => void;
|
|
12
|
+
setupSocketMessageMetrics: () => void;
|
|
13
|
+
closeSocketMessageMetrics: () => void;
|
|
14
|
+
}
|
|
@@ -13,6 +13,7 @@ export declare class Channel extends Emitter<ChannelEvent> {
|
|
|
13
13
|
private initExperience?;
|
|
14
14
|
private token?;
|
|
15
15
|
private network;
|
|
16
|
+
private socketMessageMetrics?;
|
|
16
17
|
constructor(config: Config, analyticsHelper: AnalyticsHelper);
|
|
17
18
|
getInitialized: () => boolean;
|
|
18
19
|
getConnected: () => boolean;
|
|
@@ -13,7 +13,8 @@ export declare enum EVENT_ACTION {
|
|
|
13
13
|
INVALIDATE_TOKEN = "invalidateToken",
|
|
14
14
|
SEND_STEPS_RETRY = "sendStepsRetry",
|
|
15
15
|
CATCHUP_AFTER_MAX_SEND_STEPS_RETRY = "catchupAfterMaxSendStepsRetry",
|
|
16
|
-
DROPPED_STEPS = "droppedStepInCatchup"
|
|
16
|
+
DROPPED_STEPS = "droppedStepInCatchup",
|
|
17
|
+
WEBSOCKET_MESSAGE_VOLUME_METRIC = "websocketMessageVolumeMetric"
|
|
17
18
|
}
|
|
18
19
|
export declare enum EVENT_STATUS {
|
|
19
20
|
SUCCESS = "SUCCESS",
|
|
@@ -215,7 +216,16 @@ type CatchupAfterMaxSendStepsRetryAnalyticsEvent = {
|
|
|
215
216
|
eventStatus: EVENT_STATUS.INFO;
|
|
216
217
|
};
|
|
217
218
|
};
|
|
218
|
-
|
|
219
|
+
type WebsocketMessageVolumeMetricEvent = {
|
|
220
|
+
eventAction: EVENT_ACTION.WEBSOCKET_MESSAGE_VOLUME_METRIC;
|
|
221
|
+
attributes: {
|
|
222
|
+
documentAri?: string;
|
|
223
|
+
eventStatus: EVENT_STATUS.INFO;
|
|
224
|
+
messageCount: number;
|
|
225
|
+
messageSize: number;
|
|
226
|
+
};
|
|
227
|
+
};
|
|
228
|
+
export type ActionAnalyticsEvent = AddStepsSuccessAnalyticsEvent | AddStepsFailureAnalyticsEvent | ReInitDocFailAnalyticsEvent | ReInitDocSuccessAnalyticsEvent | ConnectionSuccessAnalyticsEvent | ConnectionFailureAnalyticsEvent | CatchUpSuccessAnalyticsEvent | CatchUpFailureAnalyticsEvent | DocumentInitSuccessAnalyticsEvent | UpdateParticipantsSuccessAnalyticsEvent | CommitUnconfirmedStepsSuccessAnalyticsEvent | CommitUnconfirmedStepsFailureAnalyticsEvent | PublishPageSuccessAnalyticsEvent | PublishPageFailureAnalyticsEvent | GetCurrentStateSuccessAnalyticsEvent | GetCurrentStateFailureAnalyticsEvent | InvalidateTokenAnalyticsEvent | SendStepsRetryAnalyticsEvent | CatchupAfterMaxSendStepsRetryAnalyticsEvent | CatchUpDroppedStepsEvent | WebsocketMessageVolumeMetricEvent;
|
|
219
229
|
export declare const ACK_MAX_TRY = 60;
|
|
220
230
|
export declare const CONFLUENCE = "confluence";
|
|
221
231
|
export {};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import AnalyticsHelper from '../analytics/analytics-helper';
|
|
2
|
+
import type { Socket } from 'socket.io-client';
|
|
3
|
+
export declare const WEBSOCKET_MESSAGE_VOLUME_METRIC_SEND_INTERVAL_MS = 60000;
|
|
4
|
+
export declare class SocketMessageMetrics {
|
|
5
|
+
private messageCount;
|
|
6
|
+
private totalMessageSize;
|
|
7
|
+
private metricsIntervalID;
|
|
8
|
+
private socket;
|
|
9
|
+
private analyticsHelper;
|
|
10
|
+
constructor(socket: Socket, analyticsHelper: AnalyticsHelper);
|
|
11
|
+
socketMessageMetricsListener: (event: any, ...args: any[]) => void;
|
|
12
|
+
setupSocketMessageMetrics: () => void;
|
|
13
|
+
closeSocketMessageMetrics: () => void;
|
|
14
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@atlaskit/collab-provider",
|
|
3
|
-
"version": "9.7.
|
|
3
|
+
"version": "9.7.2",
|
|
4
4
|
"description": "A provider for collaborative editing.",
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"registry": "https://registry.npmjs.org/"
|
|
@@ -36,7 +36,7 @@
|
|
|
36
36
|
"dependencies": {
|
|
37
37
|
"@atlaskit/analytics-gas-types": "^5.1.0",
|
|
38
38
|
"@atlaskit/analytics-listeners": "^8.7.0",
|
|
39
|
-
"@atlaskit/editor-common": "^74.
|
|
39
|
+
"@atlaskit/editor-common": "^74.22.0",
|
|
40
40
|
"@atlaskit/editor-json-transformer": "^8.10.0",
|
|
41
41
|
"@atlaskit/prosemirror-collab": "^0.2.0",
|
|
42
42
|
"@atlaskit/ufo": "^0.2.0",
|