@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 CHANGED
@@ -1,5 +1,11 @@
1
1
  # @atlaskit/collab-provider
2
2
 
3
+ ## 9.7.2
4
+
5
+ ### Patch Changes
6
+
7
+ - [`f9735e0690e`](https://bitbucket.org/atlassian/atlassian-frontend/commits/f9735e0690e) - Using socket.onAnyOutgoing to measure and send message metrics
8
+
3
9
  ## 9.7.1
4
10
 
5
11
  ### Patch Changes
@@ -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 4:
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/53724
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.1";
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('.');
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "@atlaskit/collab-provider",
3
- "version": "9.7.1",
3
+ "version": "9.7.2",
4
4
  "sideEffects": false
5
5
  }
@@ -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/53724
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
+ }
@@ -1,5 +1,5 @@
1
1
  export const name = "@atlaskit/collab-provider";
2
- export const version = "9.7.1";
2
+ export const version = "9.7.2";
3
3
  export const nextMajorVersion = () => {
4
4
  return [Number(version.split('.')[0]) + 1, 0, 0].join('.');
5
5
  };
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "@atlaskit/collab-provider",
3
- "version": "9.7.1",
3
+ "version": "9.7.2",
4
4
  "sideEffects": false
5
5
  }
@@ -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 4:
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/53724
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
+ });
@@ -1,5 +1,5 @@
1
1
  export var name = "@atlaskit/collab-provider";
2
- export var version = "9.7.1";
2
+ export var version = "9.7.2";
3
3
  export var nextMajorVersion = function nextMajorVersion() {
4
4
  return [Number(version.split('.')[0]) + 1, 0, 0].join('.');
5
5
  };
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "@atlaskit/collab-provider",
3
- "version": "9.7.1",
3
+ "version": "9.7.2",
4
4
  "sideEffects": false
5
5
  }
@@ -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;
@@ -1,5 +1,6 @@
1
1
  export interface NCSFeatureFlags {
2
2
  testFF?: boolean;
3
+ socketMessageMetricsFF?: boolean;
3
4
  }
4
5
  export interface WithNCSFeatureFlags {
5
6
  featureFlags?: NCSFeatureFlags;
@@ -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
- export type ActionAnalyticsEvent = AddStepsSuccessAnalyticsEvent | AddStepsFailureAnalyticsEvent | ReInitDocFailAnalyticsEvent | ReInitDocSuccessAnalyticsEvent | ConnectionSuccessAnalyticsEvent | ConnectionFailureAnalyticsEvent | CatchUpSuccessAnalyticsEvent | CatchUpFailureAnalyticsEvent | DocumentInitSuccessAnalyticsEvent | UpdateParticipantsSuccessAnalyticsEvent | CommitUnconfirmedStepsSuccessAnalyticsEvent | CommitUnconfirmedStepsFailureAnalyticsEvent | PublishPageSuccessAnalyticsEvent | PublishPageFailureAnalyticsEvent | GetCurrentStateSuccessAnalyticsEvent | GetCurrentStateFailureAnalyticsEvent | InvalidateTokenAnalyticsEvent | SendStepsRetryAnalyticsEvent | CatchupAfterMaxSendStepsRetryAnalyticsEvent | CatchUpDroppedStepsEvent;
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;
@@ -1,5 +1,6 @@
1
1
  export interface NCSFeatureFlags {
2
2
  testFF?: boolean;
3
+ socketMessageMetricsFF?: boolean;
3
4
  }
4
5
  export interface WithNCSFeatureFlags {
5
6
  featureFlags?: NCSFeatureFlags;
@@ -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
- export type ActionAnalyticsEvent = AddStepsSuccessAnalyticsEvent | AddStepsFailureAnalyticsEvent | ReInitDocFailAnalyticsEvent | ReInitDocSuccessAnalyticsEvent | ConnectionSuccessAnalyticsEvent | ConnectionFailureAnalyticsEvent | CatchUpSuccessAnalyticsEvent | CatchUpFailureAnalyticsEvent | DocumentInitSuccessAnalyticsEvent | UpdateParticipantsSuccessAnalyticsEvent | CommitUnconfirmedStepsSuccessAnalyticsEvent | CommitUnconfirmedStepsFailureAnalyticsEvent | PublishPageSuccessAnalyticsEvent | PublishPageFailureAnalyticsEvent | GetCurrentStateSuccessAnalyticsEvent | GetCurrentStateFailureAnalyticsEvent | InvalidateTokenAnalyticsEvent | SendStepsRetryAnalyticsEvent | CatchupAfterMaxSendStepsRetryAnalyticsEvent | CatchUpDroppedStepsEvent;
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.1",
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.19.0",
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",