@atlaskit/collab-provider 7.0.1 → 7.1.3

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,43 @@
1
1
  # @atlaskit/collab-provider
2
2
 
3
+ ## 7.1.3
4
+
5
+ ### Patch Changes
6
+
7
+ - [`c55c736ecea`](https://bitbucket.org/atlassian/atlassian-frontend/commits/c55c736ecea) - Patch VULN AFP-3486 AFP-3487 AFP-3488 AFP-3489
8
+
9
+ ## 7.1.2
10
+
11
+ ### Patch Changes
12
+
13
+ - Updated dependencies
14
+
15
+ ## 7.1.1
16
+
17
+ ### Patch Changes
18
+
19
+ - [`c6feed82071`](https://bitbucket.org/atlassian/atlassian-frontend/commits/c6feed82071) - ED-11632: Bump prosemirror packages;
20
+
21
+ - prosmirror-commands 1.1.4 -> 1.1.11,
22
+ - prosemirror-model 1.11.0 -> 1.14.3,
23
+ - prosemirror-state 1.3.3 -> 1.3.4,
24
+ - prosemirror-transform 1.2.8 -> 1.3.2,
25
+ - prosemirror-view 1.15.4 + 1.18.8 -> 1.20.2.
26
+
27
+ - [`b670f0469c4`](https://bitbucket.org/atlassian/atlassian-frontend/commits/b670f0469c4) - COLLAB-990: fixing duplciated avatar
28
+ - Updated dependencies
29
+
30
+ ## 7.1.0
31
+
32
+ ### Minor Changes
33
+
34
+ - [`cf853e39278`](https://bitbucket.org/atlassian/atlassian-frontend/commits/cf853e39278) - COLLAB-411-change-to-metadata: 'setTitle' and 'setEditorWidth' are deprecated, going to be removed in the next release, use 'setMetadata' instead.
35
+ - [`10d7bc384aa`](https://bitbucket.org/atlassian/atlassian-frontend/commits/10d7bc384aa) - COLLAB-933: add disconnected event
36
+
37
+ ### Patch Changes
38
+
39
+ - Updated dependencies
40
+
3
41
  ## 7.0.1
4
42
 
5
43
  ### Patch Changes
@@ -0,0 +1,7 @@
1
+ {
2
+ "name": "@atlaskit/collab-provider/disconnected-reason-mapper",
3
+ "main": "../dist/cjs/disconnected-reason-mapper.js",
4
+ "module": "../dist/esm/disconnected-reason-mapper.js",
5
+ "module:es2019": "../dist/es2019/disconnected-reason-mapper.js",
6
+ "types": "../dist/types/disconnected-reason-mapper.d.ts"
7
+ }
@@ -5,7 +5,7 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
5
5
  Object.defineProperty(exports, "__esModule", {
6
6
  value: true
7
7
  });
8
- exports.triggerAnalyticsForCatchupSuccessfulWithLatency = exports.triggerAnalyticsForCatchupFailed = exports.triggerAnalyticsForStepsRejected = exports.triggerAnalyticsForStepsAddedSuccessfully = exports.fireAnalyticsEvent = exports.buildAnalyticsPayload = void 0;
8
+ exports.triggerAnalyticsForStepsRejected = exports.triggerAnalyticsForStepsAddedSuccessfully = exports.triggerAnalyticsForCatchupSuccessfulWithLatency = exports.triggerAnalyticsForCatchupFailed = exports.fireAnalyticsEvent = exports.buildAnalyticsPayload = void 0;
9
9
 
10
10
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
11
11
 
@@ -3,9 +3,9 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
+ exports.clearMeasure = clearMeasure;
6
7
  exports.startMeasure = startMeasure;
7
8
  exports.stopMeasure = stopMeasure;
8
- exports.clearMeasure = clearMeasure;
9
9
 
10
10
  var isPerformanceAPIAvailable = function isPerformanceAPIAvailable() {
11
11
  return typeof window !== 'undefined' && 'performance' in window && ['measure', 'clearMeasures', 'clearMarks', 'getEntriesByName', 'getEntriesByType'].every(function (api) {
@@ -163,8 +163,11 @@ var Channel = /*#__PURE__*/function (_Emitter) {
163
163
  this.socket.on('participant:telepointer', function (payload) {
164
164
  _this2.emit('participant:telepointer', payload.data);
165
165
  });
166
- this.socket.on('participant:joined', function (data) {
167
- _this2.emit('participant:joined', data);
166
+ this.socket.on('presence:joined', function (data) {
167
+ _this2.emit('presence:joined', data);
168
+ });
169
+ this.socket.on('presence', function (data) {
170
+ _this2.emit('presence', data);
168
171
  });
169
172
  this.socket.on('participant:left', function (data) {
170
173
  _this2.emit('participant:left', data);
@@ -181,11 +184,8 @@ var Channel = /*#__PURE__*/function (_Emitter) {
181
184
  clientId: clientId
182
185
  }, data));
183
186
  });
184
- this.socket.on('title:changed', function (payload) {
185
- _this2.emit('title:changed', payload.data);
186
- });
187
- this.socket.on('width:changed', function (payload) {
188
- _this2.emit('width:changed', payload.data);
187
+ this.socket.on('metadata:changed', function (payload) {
188
+ _this2.emit('metadata:changed', payload);
189
189
  });
190
190
  this.socket.on('disconnect', /*#__PURE__*/function () {
191
191
  var _ref2 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(reason) {
@@ -358,6 +358,24 @@ var Channel = /*#__PURE__*/function (_Emitter) {
358
358
  type: type
359
359
  }, data));
360
360
  }
361
+ }, {
362
+ key: "sendMetadata",
363
+ value: function sendMetadata(metadata) {
364
+ if (!this.connected || !this.socket) {
365
+ return;
366
+ }
367
+
368
+ this.socket.emit('metadata', metadata);
369
+ }
370
+ }, {
371
+ key: "sendPresenceJoined",
372
+ value: function sendPresenceJoined() {
373
+ if (!this.connected || !this.socket) {
374
+ return;
375
+ }
376
+
377
+ this.socket.emit('presence:joined');
378
+ }
361
379
  }, {
362
380
  key: "disconnect",
363
381
  value: function disconnect() {
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.socketIOReasons = exports.DisconnectReason = void 0;
7
+ // See https://socket.io/docs/v3/client-socket-instance#disconnect for emitted reasons
8
+ var socketIOReasons = {
9
+ IO_CLIENT_DISCONNECT: 'io client disconnect',
10
+ // The socket was manually disconnected using socket.disconnect()
11
+ IO_SERVER_DISCONNECT: 'io server disconnect',
12
+ // The server has forcefully disconnected the socket with socket.disconnect()
13
+ TRANSPORT_CLOSED: 'transport close',
14
+ // The server did not send a PING within the pingInterval + pingTimeout range
15
+ TRANSPORT_ERROR: 'transport error',
16
+ // The connection was closed (example: the user has lost connection, or the network was changed from WiFi to 4G)
17
+ PING_TIMEOUT: 'ping timeout' // The connection has encountered an error (example: the server was killed during a HTTP long-polling cycle)
18
+
19
+ };
20
+ exports.socketIOReasons = socketIOReasons;
21
+ var DisconnectReason;
22
+ exports.DisconnectReason = DisconnectReason;
23
+
24
+ (function (DisconnectReason) {
25
+ DisconnectReason["CLIENT_DISCONNECT"] = "CLIENT_DISCONNECT";
26
+ DisconnectReason["SERVER_DISCONNECT"] = "SERVER_DISCONNECT";
27
+ DisconnectReason["SOCKET_CLOSED"] = "SOCKET_CLOSED";
28
+ DisconnectReason["SOCKET_ERROR"] = "SOCKET_ERROR";
29
+ DisconnectReason["SOCKET_TIMEOUT"] = "SOCKET_TIMEOUT";
30
+ DisconnectReason["UNKNOWN_DISCONNECT"] = "UNKNOWN_DISCONNECT";
31
+ })(DisconnectReason || (exports.DisconnectReason = DisconnectReason = {}));
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.ACK_MAX_TRY = exports.CATCHUP_FAILURE = exports.CATCHUP_SUCCESS = exports.ATTRIBUTES_PACKAGE = exports.STEPS_REJECTED = exports.STEPS_ADDED = void 0;
6
+ exports.STEPS_REJECTED = exports.STEPS_ADDED = exports.CATCHUP_SUCCESS = exports.CATCHUP_FAILURE = exports.ATTRIBUTES_PACKAGE = exports.ACK_MAX_TRY = void 0;
7
7
  var STEPS_ADDED = 'collabStepsAddedSuccess';
8
8
  exports.STEPS_ADDED = STEPS_ADDED;
9
9
  var STEPS_REJECTED = 'collabStepsAddedRejected';
@@ -3,8 +3,8 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.sleep = sleep;
7
6
  exports.getParticipant = exports.createLogger = void 0;
7
+ exports.sleep = sleep;
8
8
 
9
9
  var createLogger = function createLogger(prefix) {
10
10
  var color = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'blue';
@@ -13,27 +13,22 @@ var createLogger = function createLogger(prefix) {
13
13
 
14
14
  if (window.COLLAB_PROVIDER_LOGGER) {
15
15
  // eslint-disable-next-line no-console
16
- console.log("%cCollab-".concat(prefix, ": ").concat(msg), "color: ".concat(color, "; font-weight: bold"));
17
-
18
- if (data) {
19
- // eslint-disable-next-line no-console
20
- console.log(data);
21
- }
16
+ console.log("%cCollab-".concat(prefix, ": ").concat(msg), "color: ".concat(color, "; font-weight: bold"), data);
22
17
  }
23
18
  };
24
19
  };
25
20
 
26
21
  exports.createLogger = createLogger;
22
+ var logger = createLogger('Helper:util', 'black');
27
23
 
28
24
  var getParticipant = function getParticipant(userId) {
29
- // eslint-disable-next-line no-bitwise
30
- var name = 'Demo User';
31
- return Promise.resolve({
25
+ logger('getParticipant: ', userId);
26
+ return {
32
27
  userId: userId,
33
- name: name,
34
- avatar: "https://api.adorable.io/avatars/80/".concat(name.replace(/\s/g, ''), ".png"),
35
- email: "".concat(name.replace(/\s/g, '').toLocaleLowerCase(), "@atlassian.com")
36
- });
28
+ name: userId,
29
+ avatar: '',
30
+ email: "".concat(userId.replace(/\s/g, '').toLocaleLowerCase(), "@atlassian.com")
31
+ };
37
32
  };
38
33
 
39
34
  exports.getParticipant = getParticipant;
@@ -5,8 +5,8 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
5
5
  Object.defineProperty(exports, "__esModule", {
6
6
  value: true
7
7
  });
8
- exports.rebaseSteps = rebaseSteps;
9
8
  exports.catchup = void 0;
9
+ exports.rebaseSteps = rebaseSteps;
10
10
 
11
11
  var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
12
12
 
@@ -37,6 +37,8 @@ var _prosemirrorCollab = require("prosemirror-collab");
37
37
 
38
38
  var _throttle = _interopRequireDefault(require("lodash/throttle"));
39
39
 
40
+ var _isEqual = _interopRequireDefault(require("lodash/isEqual"));
41
+
40
42
  var _emitter = require("../emitter");
41
43
 
42
44
  var _channel = require("../channel");
@@ -51,6 +53,8 @@ var _catchup = require("./catchup");
51
53
 
52
54
  var _errorCodeMapper = require("../error-code-mapper");
53
55
 
56
+ var _disconnectedReasonMapper = require("../disconnected-reason-mapper");
57
+
54
58
  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); }; }
55
59
 
56
60
  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; } }
@@ -278,36 +282,28 @@ var Provider = /*#__PURE__*/function (_Emitter) {
278
282
  return _this.sendPresence();
279
283
  }, SEND_PRESENCE_INTERVAL);
280
284
  });
281
- (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "onParticipantJoined", function (_ref5) {
285
+ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "onPresenceJoined", function (_ref5) {
282
286
  var sessionId = _ref5.sessionId;
283
287
  logger('Participant joined with session: ', sessionId); // This expose existing users to the newly joined user
284
288
 
285
289
  _this.sendPresence();
286
290
  });
287
- (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "onTitleChanged", function (_ref6) {
288
- var title = _ref6.title;
291
+ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "onPresence", function (_ref6) {
292
+ var userId = _ref6.userId;
293
+ logger('onPresence userId: ', userId);
294
+ _this.userId = userId;
289
295
 
290
- if (title !== undefined && _this.metadata.title !== title) {
291
- _this.metadata.title = title;
296
+ _this.sendPresence();
292
297
 
293
- _this.emit('metadata:changed', {
294
- title: title
295
- });
296
- }
298
+ _this.channel.sendPresenceJoined();
297
299
  });
298
- (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "onWidthChanged", function (_ref7) {
299
- var editorWidth = _ref7.editorWidth;
300
-
301
- if (editorWidth !== undefined && _this.metadata.editorWidth !== editorWidth) {
302
- _this.metadata.editorWidth = editorWidth;
303
-
304
- _this.emit('metadata:changed', {
305
- editorWidth: editorWidth
306
- });
300
+ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "onMetadataChanged", function (metadata) {
301
+ if (metadata !== undefined && !(0, _isEqual.default)(_this.metadata, metadata)) {
302
+ _this.emit('metadata:changed', metadata);
307
303
  }
308
304
  });
309
- (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "onParticipantLeft", function (_ref8) {
310
- var sessionId = _ref8.sessionId;
305
+ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "onParticipantLeft", function (_ref7) {
306
+ var sessionId = _ref7.sessionId;
311
307
  logger("Participant left");
312
308
 
313
309
  _this.participants.delete(sessionId);
@@ -318,11 +314,11 @@ var Provider = /*#__PURE__*/function (_Emitter) {
318
314
  }]
319
315
  });
320
316
  });
321
- (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "onParticipantUpdated", function (_ref9) {
322
- var sessionId = _ref9.sessionId,
323
- timestamp = _ref9.timestamp,
324
- userId = _ref9.userId,
325
- clientId = _ref9.clientId;
317
+ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "onParticipantUpdated", function (_ref8) {
318
+ var sessionId = _ref8.sessionId,
319
+ timestamp = _ref8.timestamp,
320
+ userId = _ref8.userId,
321
+ clientId = _ref8.clientId;
326
322
 
327
323
  _this.updateParticipant({
328
324
  sessionId: sessionId,
@@ -331,12 +327,12 @@ var Provider = /*#__PURE__*/function (_Emitter) {
331
327
  clientId: clientId
332
328
  });
333
329
  });
334
- (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "onParticipantTelepointer", function (_ref10) {
335
- var sessionId = _ref10.sessionId,
336
- timestamp = _ref10.timestamp,
337
- selection = _ref10.selection,
338
- userId = _ref10.userId,
339
- clientId = _ref10.clientId;
330
+ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "onParticipantTelepointer", function (_ref9) {
331
+ var sessionId = _ref9.sessionId,
332
+ timestamp = _ref9.timestamp,
333
+ selection = _ref9.selection,
334
+ userId = _ref9.userId,
335
+ clientId = _ref9.clientId;
340
336
 
341
337
  if (sessionId === _this.sessionId) {
342
338
  return;
@@ -364,19 +360,28 @@ var Provider = /*#__PURE__*/function (_Emitter) {
364
360
  });
365
361
  });
366
362
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "updateParticipant", /*#__PURE__*/function () {
367
- var _ref12 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee2(_ref11) {
363
+ var _ref11 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee2(_ref10) {
368
364
  var sessionId, timestamp, userId, clientId, getUser, _yield, _yield$name, name, _yield$email, email, _yield$avatar, avatar, isNewParticipant;
369
365
 
370
366
  return _regenerator.default.wrap(function _callee2$(_context2) {
371
367
  while (1) {
372
368
  switch (_context2.prev = _context2.next) {
373
369
  case 0:
374
- sessionId = _ref11.sessionId, timestamp = _ref11.timestamp, userId = _ref11.userId, clientId = _ref11.clientId;
370
+ sessionId = _ref10.sessionId, timestamp = _ref10.timestamp, userId = _ref10.userId, clientId = _ref10.clientId;
371
+
372
+ if (userId) {
373
+ _context2.next = 3;
374
+ break;
375
+ }
376
+
377
+ return _context2.abrupt("return");
378
+
379
+ case 3:
375
380
  getUser = _this.config.getUser;
376
- _context2.next = 4;
381
+ _context2.next = 6;
377
382
  return getUser ? getUser(userId) : (0, _utils.getParticipant)(userId);
378
383
 
379
- case 4:
384
+ case 6:
380
385
  _yield = _context2.sent;
381
386
  _yield$name = _yield.name;
382
387
  name = _yield$name === void 0 ? '' : _yield$name;
@@ -406,7 +411,7 @@ var Provider = /*#__PURE__*/function (_Emitter) {
406
411
 
407
412
  _this.updateParticipants(isNewParticipant ? [_this.participants.get(sessionId)] : []);
408
413
 
409
- case 15:
414
+ case 17:
410
415
  case "end":
411
416
  return _context2.stop();
412
417
  }
@@ -415,7 +420,7 @@ var Provider = /*#__PURE__*/function (_Emitter) {
415
420
  }));
416
421
 
417
422
  return function (_x) {
418
- return _ref12.apply(this, arguments);
423
+ return _ref11.apply(this, arguments);
419
424
  };
420
425
  }());
421
426
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "updateParticipants", function () {
@@ -454,13 +459,39 @@ var Provider = /*#__PURE__*/function (_Emitter) {
454
459
  return _this.updateParticipants();
455
460
  }, PARTICIPANT_UPDATE_INTERVAL);
456
461
  });
457
- (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "onDisconnected", function (_ref13) {
458
- var reason = _ref13.reason;
462
+ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "disconnectedReasonMapper", function (reason) {
463
+ switch (reason) {
464
+ case _disconnectedReasonMapper.socketIOReasons.IO_CLIENT_DISCONNECT:
465
+ return _disconnectedReasonMapper.DisconnectReason.CLIENT_DISCONNECT;
466
+
467
+ case _disconnectedReasonMapper.socketIOReasons.IO_SERVER_DISCONNECT:
468
+ return _disconnectedReasonMapper.DisconnectReason.SERVER_DISCONNECT;
469
+
470
+ case _disconnectedReasonMapper.socketIOReasons.TRANSPORT_CLOSED:
471
+ return _disconnectedReasonMapper.DisconnectReason.SOCKET_CLOSED;
472
+
473
+ case _disconnectedReasonMapper.socketIOReasons.TRANSPORT_ERROR:
474
+ return _disconnectedReasonMapper.DisconnectReason.SOCKET_ERROR;
475
+
476
+ case _disconnectedReasonMapper.socketIOReasons.PING_TIMEOUT:
477
+ return _disconnectedReasonMapper.DisconnectReason.SOCKET_TIMEOUT;
478
+
479
+ default:
480
+ return _disconnectedReasonMapper.DisconnectReason.UNKNOWN_DISCONNECT;
481
+ }
482
+ });
483
+ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "onDisconnected", function (_ref12) {
484
+ var reason = _ref12.reason;
459
485
  _this.disconnectedAt = Date.now();
460
486
  var left = Array.from(_this.participants.values());
461
487
 
462
488
  _this.participants.clear();
463
489
 
490
+ _this.emit('disconnected', {
491
+ reason: _this.disconnectedReasonMapper(reason),
492
+ sid: _this.sessionId
493
+ });
494
+
464
495
  if (left.length) {
465
496
  _this.emit('presence', {
466
497
  left: left
@@ -492,16 +523,14 @@ var Provider = /*#__PURE__*/function (_Emitter) {
492
523
  this.getState().plugins.find(function (p) {
493
524
  return p.key === 'collab$';
494
525
  }).spec.config.clientID : optionsOrGetState.clientId;
495
- this.channel.on('connected', function (_ref14) {
496
- var sid = _ref14.sid,
497
- initialized = _ref14.initialized;
526
+ this.channel.on('connected', function (_ref13) {
527
+ var sid = _ref13.sid,
528
+ initialized = _ref13.initialized;
498
529
  _this2.sessionId = sid;
499
530
 
500
531
  _this2.emit('connected', {
501
532
  sid: sid
502
- });
503
-
504
- _this2.sendPresence(); // If already initialized, `connected` means reconnected
533
+ }); // If already initialized, `connected` means reconnected
505
534
 
506
535
 
507
536
  if (initialized && _this2.disconnectedAt && // Offline longer than `OUT_OF_SYNC_PERIOD`
@@ -510,22 +539,18 @@ var Provider = /*#__PURE__*/function (_Emitter) {
510
539
  }
511
540
 
512
541
  _this2.disconnectedAt = undefined;
513
- }).on('init', function (_ref15) {
514
- var doc = _ref15.doc,
515
- version = _ref15.version,
516
- userId = _ref15.userId,
517
- metadata = _ref15.metadata;
518
- _this2.userId = userId;
519
-
520
- _this2.sendPresence(); // Initial document and version
521
-
542
+ }).on('init', function (_ref14) {
543
+ var doc = _ref14.doc,
544
+ version = _ref14.version,
545
+ metadata = _ref14.metadata;
522
546
 
547
+ // Initial document and version
523
548
  _this2.updateDocumentWithMetadata({
524
549
  doc: doc,
525
550
  version: version,
526
551
  metadata: metadata
527
552
  });
528
- }).on('steps:added', this.onStepsAdded).on('participant:telepointer', this.onParticipantTelepointer).on('participant:joined', this.onParticipantJoined).on('participant:left', this.onParticipantLeft).on('participant:updated', this.onParticipantUpdated).on('title:changed', this.onTitleChanged).on('width:changed', this.onWidthChanged).on('disconnect', this.onDisconnected).on('error', this.onErrorHandled).connect();
553
+ }).on('steps:added', this.onStepsAdded).on('participant:telepointer', this.onParticipantTelepointer).on('presence:joined', this.onPresenceJoined).on('presence', this.onPresence).on('participant:left', this.onParticipantLeft).on('participant:updated', this.onParticipantUpdated).on('metadata:changed', this.onMetadataChanged).on('disconnect', this.onDisconnected).on('error', this.onErrorHandled).connect();
529
554
  return this;
530
555
  }
531
556
  /**
@@ -624,8 +649,8 @@ var Provider = /*#__PURE__*/function (_Emitter) {
624
649
  logger("Processing data. Version \"".concat(version, "\"."));
625
650
 
626
651
  if (steps && steps.length) {
627
- var clientIds = steps.map(function (_ref16) {
628
- var clientId = _ref16.clientId;
652
+ var clientIds = steps.map(function (_ref15) {
653
+ var clientId = _ref15.clientId;
629
654
  return clientId;
630
655
  });
631
656
  this.emit('data', {
@@ -687,14 +712,14 @@ var Provider = /*#__PURE__*/function (_Emitter) {
687
712
  participant = _Array$from$filter2[0];
688
713
 
689
714
  if (participant) {
690
- var _ref17 = step,
691
- stepType = _ref17.stepType,
692
- to = _ref17.to,
693
- from = _ref17.from,
694
- _ref17$slice = _ref17.slice,
695
- slice = _ref17$slice === void 0 ? {
715
+ var _ref16 = step,
716
+ stepType = _ref16.stepType,
717
+ to = _ref16.to,
718
+ from = _ref16.from,
719
+ _ref16$slice = _ref16.slice,
720
+ slice = _ref16$slice === void 0 ? {
696
721
  content: []
697
- } : _ref17$slice;
722
+ } : _ref16$slice;
698
723
 
699
724
  var _slice$content = (0, _slicedToArray2.default)(slice.content, 1),
700
725
  node = _slice$content[0];
@@ -726,24 +751,34 @@ var Provider = /*#__PURE__*/function (_Emitter) {
726
751
  }, {
727
752
  key: "setTitle",
728
753
  value: function setTitle(title, broadcast) {
729
- this.metadata.title = title;
730
-
731
754
  if (broadcast) {
732
- this.channel.broadcast('title:changed', {
755
+ this.channel.sendMetadata({
733
756
  title: title
734
757
  });
735
758
  }
759
+
760
+ Object.assign(this.metadata, {
761
+ title: title
762
+ });
736
763
  }
737
764
  }, {
738
765
  key: "setEditorWidth",
739
766
  value: function setEditorWidth(editorWidth, broadcast) {
740
- this.metadata.editorWidth = editorWidth;
741
-
742
767
  if (broadcast) {
743
- this.channel.broadcast('width:changed', {
768
+ this.channel.sendMetadata({
744
769
  editorWidth: editorWidth
745
770
  });
746
771
  }
772
+
773
+ Object.assign(this.metadata, {
774
+ editorWidth: editorWidth
775
+ });
776
+ }
777
+ }, {
778
+ key: "setMetadata",
779
+ value: function setMetadata(metadata) {
780
+ this.channel.sendMetadata(metadata);
781
+ Object.assign(this.metadata, metadata);
747
782
  }
748
783
  /**
749
784
  * Get latest state.
@@ -5,8 +5,8 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
5
5
  Object.defineProperty(exports, "__esModule", {
6
6
  value: true
7
7
  });
8
- exports.createSocketIOSocket = createSocketIOSocket;
9
8
  exports.createSocketIOCollabProvider = createSocketIOCollabProvider;
9
+ exports.createSocketIOSocket = createSocketIOSocket;
10
10
 
11
11
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
12
12
 
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "@atlaskit/collab-provider",
3
- "version": "7.0.1",
3
+ "version": "7.1.3",
4
4
  "sideEffects": false
5
5
  }
@@ -116,8 +116,11 @@ export class Channel extends Emitter {
116
116
  this.socket.on('participant:telepointer', payload => {
117
117
  this.emit('participant:telepointer', payload.data);
118
118
  });
119
- this.socket.on('participant:joined', data => {
120
- this.emit('participant:joined', data);
119
+ this.socket.on('presence:joined', data => {
120
+ this.emit('presence:joined', data);
121
+ });
122
+ this.socket.on('presence', data => {
123
+ this.emit('presence', data);
121
124
  });
122
125
  this.socket.on('participant:left', data => {
123
126
  this.emit('participant:left', data);
@@ -135,11 +138,8 @@ export class Channel extends Emitter {
135
138
  ...data
136
139
  });
137
140
  });
138
- this.socket.on('title:changed', payload => {
139
- this.emit('title:changed', payload.data);
140
- });
141
- this.socket.on('width:changed', payload => {
142
- this.emit('width:changed', payload.data);
141
+ this.socket.on('metadata:changed', payload => {
142
+ this.emit('metadata:changed', payload);
143
143
  });
144
144
  this.socket.on('disconnect', async reason => {
145
145
  this.connected = false;
@@ -237,6 +237,22 @@ export class Channel extends Emitter {
237
237
  });
238
238
  }
239
239
 
240
+ sendMetadata(metadata) {
241
+ if (!this.connected || !this.socket) {
242
+ return;
243
+ }
244
+
245
+ this.socket.emit('metadata', metadata);
246
+ }
247
+
248
+ sendPresenceJoined() {
249
+ if (!this.connected || !this.socket) {
250
+ return;
251
+ }
252
+
253
+ this.socket.emit('presence:joined');
254
+ }
255
+
240
256
  disconnect() {
241
257
  this.unsubscribeAll();
242
258
 
@@ -0,0 +1,23 @@
1
+ // See https://socket.io/docs/v3/client-socket-instance#disconnect for emitted reasons
2
+ export const socketIOReasons = {
3
+ IO_CLIENT_DISCONNECT: 'io client disconnect',
4
+ // The socket was manually disconnected using socket.disconnect()
5
+ IO_SERVER_DISCONNECT: 'io server disconnect',
6
+ // The server has forcefully disconnected the socket with socket.disconnect()
7
+ TRANSPORT_CLOSED: 'transport close',
8
+ // The server did not send a PING within the pingInterval + pingTimeout range
9
+ TRANSPORT_ERROR: 'transport error',
10
+ // The connection was closed (example: the user has lost connection, or the network was changed from WiFi to 4G)
11
+ PING_TIMEOUT: 'ping timeout' // The connection has encountered an error (example: the server was killed during a HTTP long-polling cycle)
12
+
13
+ };
14
+ export let DisconnectReason;
15
+
16
+ (function (DisconnectReason) {
17
+ DisconnectReason["CLIENT_DISCONNECT"] = "CLIENT_DISCONNECT";
18
+ DisconnectReason["SERVER_DISCONNECT"] = "SERVER_DISCONNECT";
19
+ DisconnectReason["SOCKET_CLOSED"] = "SOCKET_CLOSED";
20
+ DisconnectReason["SOCKET_ERROR"] = "SOCKET_ERROR";
21
+ DisconnectReason["SOCKET_TIMEOUT"] = "SOCKET_TIMEOUT";
22
+ DisconnectReason["UNKNOWN_DISCONNECT"] = "UNKNOWN_DISCONNECT";
23
+ })(DisconnectReason || (DisconnectReason = {}));