@webex/plugin-meetings 3.11.0 → 3.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (170) hide show
  1. package/dist/aiEnableRequest/index.js +184 -0
  2. package/dist/aiEnableRequest/index.js.map +1 -0
  3. package/dist/aiEnableRequest/utils.js +36 -0
  4. package/dist/aiEnableRequest/utils.js.map +1 -0
  5. package/dist/annotation/index.js +14 -5
  6. package/dist/annotation/index.js.map +1 -1
  7. package/dist/breakouts/breakout.js +1 -1
  8. package/dist/breakouts/index.js +1 -1
  9. package/dist/config.js +5 -1
  10. package/dist/config.js.map +1 -1
  11. package/dist/constants.js +28 -6
  12. package/dist/constants.js.map +1 -1
  13. package/dist/hashTree/constants.js +3 -1
  14. package/dist/hashTree/constants.js.map +1 -1
  15. package/dist/hashTree/hashTree.js +18 -0
  16. package/dist/hashTree/hashTree.js.map +1 -1
  17. package/dist/hashTree/hashTreeParser.js +709 -380
  18. package/dist/hashTree/hashTreeParser.js.map +1 -1
  19. package/dist/hashTree/types.js +4 -2
  20. package/dist/hashTree/types.js.map +1 -1
  21. package/dist/hashTree/utils.js +10 -0
  22. package/dist/hashTree/utils.js.map +1 -1
  23. package/dist/index.js +11 -2
  24. package/dist/index.js.map +1 -1
  25. package/dist/interceptors/constant.js +12 -0
  26. package/dist/interceptors/constant.js.map +1 -0
  27. package/dist/interceptors/dataChannelAuthToken.js +290 -0
  28. package/dist/interceptors/dataChannelAuthToken.js.map +1 -0
  29. package/dist/interceptors/index.js +7 -0
  30. package/dist/interceptors/index.js.map +1 -1
  31. package/dist/interceptors/utils.js +27 -0
  32. package/dist/interceptors/utils.js.map +1 -0
  33. package/dist/interpretation/index.js +2 -2
  34. package/dist/interpretation/index.js.map +1 -1
  35. package/dist/interpretation/siLanguage.js +1 -1
  36. package/dist/locus-info/controlsUtils.js +5 -3
  37. package/dist/locus-info/controlsUtils.js.map +1 -1
  38. package/dist/locus-info/index.js +217 -79
  39. package/dist/locus-info/index.js.map +1 -1
  40. package/dist/locus-info/selfUtils.js +1 -0
  41. package/dist/locus-info/selfUtils.js.map +1 -1
  42. package/dist/locus-info/types.js.map +1 -1
  43. package/dist/media/MediaConnectionAwaiter.js +57 -1
  44. package/dist/media/MediaConnectionAwaiter.js.map +1 -1
  45. package/dist/media/properties.js +4 -2
  46. package/dist/media/properties.js.map +1 -1
  47. package/dist/meeting/in-meeting-actions.js +7 -1
  48. package/dist/meeting/in-meeting-actions.js.map +1 -1
  49. package/dist/meeting/index.js +1082 -861
  50. package/dist/meeting/index.js.map +1 -1
  51. package/dist/meeting/request.js +50 -0
  52. package/dist/meeting/request.js.map +1 -1
  53. package/dist/meeting/request.type.js.map +1 -1
  54. package/dist/meeting/util.js +133 -3
  55. package/dist/meeting/util.js.map +1 -1
  56. package/dist/meetings/index.js +100 -45
  57. package/dist/meetings/index.js.map +1 -1
  58. package/dist/member/index.js +10 -0
  59. package/dist/member/index.js.map +1 -1
  60. package/dist/member/util.js +10 -0
  61. package/dist/member/util.js.map +1 -1
  62. package/dist/metrics/constants.js +2 -1
  63. package/dist/metrics/constants.js.map +1 -1
  64. package/dist/multistream/mediaRequestManager.js +9 -60
  65. package/dist/multistream/mediaRequestManager.js.map +1 -1
  66. package/dist/multistream/remoteMediaManager.js +11 -0
  67. package/dist/multistream/remoteMediaManager.js.map +1 -1
  68. package/dist/reachability/index.js +18 -10
  69. package/dist/reachability/index.js.map +1 -1
  70. package/dist/reactions/reactions.type.js.map +1 -1
  71. package/dist/reconnection-manager/index.js +0 -1
  72. package/dist/reconnection-manager/index.js.map +1 -1
  73. package/dist/types/aiEnableRequest/index.d.ts +5 -0
  74. package/dist/types/aiEnableRequest/utils.d.ts +2 -0
  75. package/dist/types/config.d.ts +3 -0
  76. package/dist/types/constants.d.ts +23 -1
  77. package/dist/types/hashTree/constants.d.ts +1 -0
  78. package/dist/types/hashTree/hashTree.d.ts +7 -0
  79. package/dist/types/hashTree/hashTreeParser.d.ts +99 -14
  80. package/dist/types/hashTree/types.d.ts +3 -0
  81. package/dist/types/hashTree/utils.d.ts +6 -0
  82. package/dist/types/index.d.ts +1 -0
  83. package/dist/types/interceptors/constant.d.ts +5 -0
  84. package/dist/types/interceptors/dataChannelAuthToken.d.ts +43 -0
  85. package/dist/types/interceptors/index.d.ts +2 -1
  86. package/dist/types/interceptors/utils.d.ts +1 -0
  87. package/dist/types/locus-info/index.d.ts +21 -2
  88. package/dist/types/locus-info/types.d.ts +1 -0
  89. package/dist/types/media/MediaConnectionAwaiter.d.ts +10 -1
  90. package/dist/types/media/properties.d.ts +2 -1
  91. package/dist/types/meeting/in-meeting-actions.d.ts +6 -0
  92. package/dist/types/meeting/index.d.ts +38 -6
  93. package/dist/types/meeting/request.d.ts +16 -1
  94. package/dist/types/meeting/request.type.d.ts +5 -0
  95. package/dist/types/meeting/util.d.ts +31 -0
  96. package/dist/types/meetings/index.d.ts +4 -2
  97. package/dist/types/member/index.d.ts +1 -0
  98. package/dist/types/member/util.d.ts +5 -0
  99. package/dist/types/metrics/constants.d.ts +1 -0
  100. package/dist/types/multistream/mediaRequestManager.d.ts +0 -23
  101. package/dist/types/reactions/reactions.type.d.ts +1 -0
  102. package/dist/types/webinar/utils.d.ts +6 -0
  103. package/dist/webinar/index.js +260 -90
  104. package/dist/webinar/index.js.map +1 -1
  105. package/dist/webinar/utils.js +25 -0
  106. package/dist/webinar/utils.js.map +1 -0
  107. package/package.json +24 -23
  108. package/src/aiEnableRequest/README.md +84 -0
  109. package/src/aiEnableRequest/index.ts +170 -0
  110. package/src/aiEnableRequest/utils.ts +25 -0
  111. package/src/annotation/index.ts +27 -7
  112. package/src/config.ts +3 -0
  113. package/src/constants.ts +29 -1
  114. package/src/hashTree/constants.ts +1 -0
  115. package/src/hashTree/hashTree.ts +17 -0
  116. package/src/hashTree/hashTreeParser.ts +627 -249
  117. package/src/hashTree/types.ts +4 -0
  118. package/src/hashTree/utils.ts +9 -0
  119. package/src/index.ts +8 -1
  120. package/src/interceptors/constant.ts +6 -0
  121. package/src/interceptors/dataChannelAuthToken.ts +170 -0
  122. package/src/interceptors/index.ts +2 -1
  123. package/src/interceptors/utils.ts +16 -0
  124. package/src/interpretation/index.ts +2 -2
  125. package/src/locus-info/controlsUtils.ts +11 -0
  126. package/src/locus-info/index.ts +231 -61
  127. package/src/locus-info/selfUtils.ts +1 -0
  128. package/src/locus-info/types.ts +1 -0
  129. package/src/media/MediaConnectionAwaiter.ts +41 -1
  130. package/src/media/properties.ts +3 -1
  131. package/src/meeting/in-meeting-actions.ts +12 -0
  132. package/src/meeting/index.ts +205 -44
  133. package/src/meeting/request.ts +42 -0
  134. package/src/meeting/request.type.ts +6 -0
  135. package/src/meeting/util.ts +160 -2
  136. package/src/meetings/index.ts +135 -41
  137. package/src/member/index.ts +10 -0
  138. package/src/member/util.ts +12 -0
  139. package/src/metrics/constants.ts +1 -0
  140. package/src/multistream/mediaRequestManager.ts +4 -54
  141. package/src/multistream/remoteMediaManager.ts +13 -0
  142. package/src/reachability/index.ts +9 -0
  143. package/src/reactions/reactions.type.ts +1 -0
  144. package/src/reconnection-manager/index.ts +0 -1
  145. package/src/webinar/index.ts +162 -5
  146. package/src/webinar/utils.ts +16 -0
  147. package/test/unit/spec/aiEnableRequest/index.ts +981 -0
  148. package/test/unit/spec/aiEnableRequest/utils.ts +130 -0
  149. package/test/unit/spec/annotation/index.ts +69 -7
  150. package/test/unit/spec/hashTree/hashTree.ts +66 -0
  151. package/test/unit/spec/hashTree/hashTreeParser.ts +1869 -189
  152. package/test/unit/spec/interceptors/dataChannelAuthToken.ts +210 -0
  153. package/test/unit/spec/interceptors/utils.ts +75 -0
  154. package/test/unit/spec/locus-info/controlsUtils.js +29 -0
  155. package/test/unit/spec/locus-info/index.js +383 -46
  156. package/test/unit/spec/media/MediaConnectionAwaiter.ts +41 -1
  157. package/test/unit/spec/media/properties.ts +12 -3
  158. package/test/unit/spec/meeting/in-meeting-actions.ts +8 -2
  159. package/test/unit/spec/meeting/index.js +716 -115
  160. package/test/unit/spec/meeting/request.js +70 -0
  161. package/test/unit/spec/meeting/utils.js +438 -26
  162. package/test/unit/spec/meetings/index.js +652 -31
  163. package/test/unit/spec/member/index.js +28 -4
  164. package/test/unit/spec/member/util.js +65 -27
  165. package/test/unit/spec/multistream/mediaRequestManager.ts +2 -85
  166. package/test/unit/spec/multistream/remoteMediaManager.ts +30 -0
  167. package/test/unit/spec/reachability/index.ts +23 -0
  168. package/test/unit/spec/reconnection-manager/index.js +4 -8
  169. package/test/unit/spec/webinar/index.ts +348 -36
  170. package/test/unit/spec/webinar/utils.ts +39 -0
@@ -1,27 +1,28 @@
1
1
  "use strict";
2
2
 
3
3
  var _typeof = require("@babel/runtime-corejs2/helpers/typeof");
4
- var _Reflect$construct = require("@babel/runtime-corejs2/core-js/reflect/construct");
4
+ var _Array$from = require("@babel/runtime-corejs2/core-js/array/from");
5
+ var _Symbol = require("@babel/runtime-corejs2/core-js/symbol");
6
+ var _Symbol$iterator = require("@babel/runtime-corejs2/core-js/symbol/iterator");
7
+ var _Array$isArray2 = require("@babel/runtime-corejs2/core-js/array/is-array");
5
8
  var _Object$keys2 = require("@babel/runtime-corejs2/core-js/object/keys");
6
9
  var _Object$getOwnPropertySymbols = require("@babel/runtime-corejs2/core-js/object/get-own-property-symbols");
7
10
  var _Object$getOwnPropertyDescriptor = require("@babel/runtime-corejs2/core-js/object/get-own-property-descriptor");
8
11
  var _Object$getOwnPropertyDescriptors = require("@babel/runtime-corejs2/core-js/object/get-own-property-descriptors");
9
12
  var _Object$defineProperties = require("@babel/runtime-corejs2/core-js/object/define-properties");
10
13
  var _Object$defineProperty = require("@babel/runtime-corejs2/core-js/object/define-property");
11
- var _Array$from = require("@babel/runtime-corejs2/core-js/array/from");
12
- var _Symbol = require("@babel/runtime-corejs2/core-js/symbol");
13
- var _Symbol$iterator = require("@babel/runtime-corejs2/core-js/symbol/iterator");
14
- var _Array$isArray2 = require("@babel/runtime-corejs2/core-js/array/is-array");
14
+ var _Reflect$construct = require("@babel/runtime-corejs2/core-js/reflect/construct");
15
15
  var _WeakMap = require("@babel/runtime-corejs2/core-js/weak-map");
16
16
  var _interopRequireDefault = require("@babel/runtime-corejs2/helpers/interopRequireDefault");
17
17
  _Object$defineProperty(exports, "__esModule", {
18
18
  value: true
19
19
  });
20
+ exports.createLocusFromHashTreeMessage = createLocusFromHashTreeMessage;
20
21
  exports.default = void 0;
21
22
  var _regenerator = _interopRequireDefault(require("@babel/runtime-corejs2/regenerator"));
22
- var _map = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/map"));
23
23
  var _values = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/object/values"));
24
24
  var _assign = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/object/assign"));
25
+ var _map = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/map"));
25
26
  var _keys = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/object/keys"));
26
27
  var _stringify = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/json/stringify"));
27
28
  var _isArray = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/array/is-array"));
@@ -50,22 +51,117 @@ var _hashTreeParser = _interopRequireWildcard(require("../hashTree/hashTreeParse
50
51
  var _types = require("../hashTree/types");
51
52
  var _utils = require("../hashTree/utils");
52
53
  function _interopRequireWildcard(e, t) { if ("function" == typeof _WeakMap) var r = new _WeakMap(), n = new _WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t2 in e) "default" !== _t2 && {}.hasOwnProperty.call(e, _t2) && ((i = (o = _Object$defineProperty) && _Object$getOwnPropertyDescriptor(e, _t2)) && (i.get || i.set) ? o(f, _t2, i) : f[_t2] = e[_t2]); return f; })(e, t); }
54
+ function _callSuper(t, o, e) { return o = (0, _getPrototypeOf2.default)(o), (0, _possibleConstructorReturn2.default)(t, _isNativeReflectConstruct() ? _Reflect$construct(o, e || [], (0, _getPrototypeOf2.default)(t).constructor) : o.apply(t, e)); }
55
+ function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(_Reflect$construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }
56
+ function ownKeys(e, r) { var t = _Object$keys2(e); if (_Object$getOwnPropertySymbols) { var o = _Object$getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return _Object$getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
57
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2.default)(e, r, t[r]); }) : _Object$getOwnPropertyDescriptors ? _Object$defineProperties(e, _Object$getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { _Object$defineProperty(e, r, _Object$getOwnPropertyDescriptor(t, r)); }); } return e; }
53
58
  function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof _Symbol && r[_Symbol$iterator] || r["@@iterator"]; if (!t) { if (_Array$isArray2(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t.return || t.return(); } finally { if (u) throw o; } } }; }
54
59
  function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? _Array$from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
55
60
  function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
56
- function ownKeys(e, r) { var t = _Object$keys2(e); if (_Object$getOwnPropertySymbols) { var o = _Object$getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return _Object$getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
57
- function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2.default)(e, r, t[r]); }) : _Object$getOwnPropertyDescriptors ? _Object$defineProperties(e, _Object$getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { _Object$defineProperty(e, r, _Object$getOwnPropertyDescriptor(t, r)); }); } return e; }
58
- function _callSuper(t, o, e) { return o = (0, _getPrototypeOf2.default)(o), (0, _possibleConstructorReturn2.default)(t, _isNativeReflectConstruct() ? _Reflect$construct(o, e || [], (0, _getPrototypeOf2.default)(t).constructor) : o.apply(t, e)); }
59
- function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(_Reflect$construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }
60
61
  // list of top level keys in Locus DTO relevant for Hash Tree DTOs processing
61
62
  // it does not contain fields specific to classic Locus DTOs like sequence or baseSequence
62
- var LocusDtoTopLevelKeys = ['controls', 'fullState', 'host', 'info', 'links', 'mediaShares', 'meetings', 'participants', 'replaces', 'self', 'sequence', 'syncUrl', 'url', 'htMeta' // only exists when hash trees are used
63
+ var LocusDtoTopLevelKeys = ['controls', 'fullState', 'embeddedApps', 'host', 'info', 'links', 'mediaShares', 'meetings', 'participants', 'replaces', 'self', 'sequence', 'syncUrl', 'url', 'htMeta' // only exists when hash trees are used
63
64
  ];
64
65
  var LocusObjectStateAfterUpdates = {
65
66
  unchanged: 'unchanged',
66
67
  removed: 'removed',
67
68
  updated: 'updated'
68
69
  };
70
+ /**
71
+ * Creates a locus object from the objects received in a hash tree message. It usually will be
72
+ * incomplete, because hash tree messages only contain the parts of locus that have changed,
73
+ * and some updates come separately over Mercury or LLM in separate messages.
74
+ *
75
+ * @param {HashTreeMessage} message hash tree message to created the locus from
76
+ * @returns {Object} the created locus object and metadata if present
77
+ */
78
+ function createLocusFromHashTreeMessage(message) {
79
+ var locus = {
80
+ participants: [],
81
+ url: message.locusUrl
82
+ };
83
+ var metadata;
84
+ if (!message.locusStateElements) {
85
+ return {
86
+ locus: locus,
87
+ metadata: metadata
88
+ };
89
+ }
90
+ var _iterator = _createForOfIteratorHelper(message.locusStateElements),
91
+ _step;
92
+ try {
93
+ var _loop = function _loop() {
94
+ var element = _step.value;
95
+ if (!element.data) {
96
+ // eslint-disable-next-line no-continue
97
+ return 1; // continue
98
+ }
99
+ var type = element.htMeta.elementId.type.toLowerCase();
100
+ switch (type) {
101
+ case _types.ObjectType.locus:
102
+ {
103
+ // spread locus object data onto the top level, but remove keys managed by other ObjectTypes
104
+ var locusObjectData = _objectSpread({}, element.data);
105
+ (0, _values.default)(_types.ObjectTypeToLocusKeyMap).forEach(function (locusDtoKey) {
106
+ delete locusObjectData[locusDtoKey];
107
+ });
108
+ (0, _assign.default)(locus, locusObjectData);
109
+ break;
110
+ }
111
+ case _types.ObjectType.participant:
112
+ locus.participants.push(element.data);
113
+ break;
114
+ case _types.ObjectType.mediaShare:
115
+ if (!locus.mediaShares) {
116
+ locus.mediaShares = [];
117
+ }
118
+ locus.mediaShares.push(element.data);
119
+ break;
120
+ case _types.ObjectType.embeddedApp:
121
+ if (!locus.embeddedApps) {
122
+ locus.embeddedApps = [];
123
+ }
124
+ locus.embeddedApps.push(element.data);
125
+ break;
126
+ case _types.ObjectType.control:
127
+ if (!locus.controls) {
128
+ locus.controls = {};
129
+ }
130
+ (0, _assign.default)(locus.controls, element.data);
131
+ break;
132
+ case _types.ObjectType.links:
133
+ case _types.ObjectType.info:
134
+ case _types.ObjectType.fullState:
135
+ case _types.ObjectType.self:
136
+ {
137
+ var locusDtoKey = _types.ObjectTypeToLocusKeyMap[type];
138
+ locus[locusDtoKey] = element.data;
139
+ break;
140
+ }
141
+ case _types.ObjectType.metadata:
142
+ // metadata is not part of Locus DTO
143
+ metadata = _objectSpread(_objectSpread({}, element.data), {}, {
144
+ htMeta: element.htMeta
145
+ });
146
+ break;
147
+ default:
148
+ break;
149
+ }
150
+ };
151
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
152
+ if (_loop()) continue;
153
+ }
154
+ } catch (err) {
155
+ _iterator.e(err);
156
+ } finally {
157
+ _iterator.f();
158
+ }
159
+ return {
160
+ locus: locus,
161
+ metadata: metadata
162
+ };
163
+ }
164
+
69
165
  /**
70
166
  * @description LocusInfo extends ChildEmitter to convert locusInfo info a private emitter to parent object
71
167
  * @export
@@ -210,7 +306,7 @@ var LocusInfo = exports.default = /*#__PURE__*/function (_EventsScope) {
210
306
  // in some cases Locus might return us full DTO even when we asked for a delta
211
307
  _loggerProxy.default.logger.info('Locus-info:index#doLocusSync --> got full DTO when we asked for delta');
212
308
  }
213
- meeting.locusInfo.onFullLocus(res.body);
309
+ meeting.locusInfo.onFullLocus('classic Locus sync', res.body);
214
310
  }).catch(function (e) {
215
311
  _loggerProxy.default.logger.info("Locus-info:index#doLocusSync --> getLocusDTO succeeded but failed to handle result, locus parser will resume but not all data may be synced (".concat(e.toString(), ")"));
216
312
  _metrics.default.sendBehavioralMetric(_constants2.default.LOCUS_SYNC_HANDLING_FAILED, {
@@ -339,12 +435,16 @@ var LocusInfo = exports.default = /*#__PURE__*/function (_EventsScope) {
339
435
  }, {
340
436
  key: "createHashTreeParser",
341
437
  value: function createHashTreeParser(_ref) {
342
- var initialLocus = _ref.initialLocus;
438
+ var _this$webex$config$me;
439
+ var initialLocus = _ref.initialLocus,
440
+ metadata = _ref.metadata;
343
441
  return new _hashTreeParser.default({
344
442
  initialLocus: initialLocus,
443
+ metadata: metadata,
345
444
  webexRequest: this.webex.request.bind(this.webex),
346
445
  locusInfoUpdateCallback: this.updateFromHashTree.bind(this),
347
- debugId: "HT-".concat(this.meetingId.substring(0, 4))
446
+ debugId: "HT-".concat(this.meetingId.substring(0, 4)),
447
+ excludedDataSets: (_this$webex$config$me = this.webex.config.meetings.locus) === null || _this$webex$config$me === void 0 ? void 0 : _this$webex$config$me.excludedDataSets
348
448
  });
349
449
  }
350
450
 
@@ -358,7 +458,7 @@ var LocusInfo = exports.default = /*#__PURE__*/function (_EventsScope) {
358
458
  value: (function () {
359
459
  var _initialSetup = (0, _asyncToGenerator2.default)(/*#__PURE__*/_regenerator.default.mark(function _callee(data) {
360
460
  var _data$locus, _data$locus$links, _data$locus$links$res, _data$locus$links$res2;
361
- var _data$hashTreeMessage, _selfObject$data, selfObject, _data$locus2, _data$locus2$self, _t;
461
+ var _data$hashTreeMessage, _metadataObject$data, metadataObject, _t;
362
462
  return _regenerator.default.wrap(function (_context) {
363
463
  while (1) switch (_context.prev = _context.next) {
364
464
  case 0:
@@ -370,29 +470,32 @@ var LocusInfo = exports.default = /*#__PURE__*/function (_EventsScope) {
370
470
  _context.next = 4;
371
471
  break;
372
472
  }
373
- // we need the SELF object to be in the received message, because it contains visibleDataSets
473
+ // we need the Metadata object to be in the received message, because it contains visibleDataSets
374
474
  // and these are needed to initialize all the hash trees
375
- selfObject = (_data$hashTreeMessage = data.hashTreeMessage.locusStateElements) === null || _data$hashTreeMessage === void 0 ? void 0 : _data$hashTreeMessage.find(function (el) {
376
- return (0, _utils.isSelf)(el);
475
+ metadataObject = (_data$hashTreeMessage = data.hashTreeMessage.locusStateElements) === null || _data$hashTreeMessage === void 0 ? void 0 : _data$hashTreeMessage.find(function (el) {
476
+ return (0, _utils.isMetadata)(el);
377
477
  });
378
- if (selfObject !== null && selfObject !== void 0 && (_selfObject$data = selfObject.data) !== null && _selfObject$data !== void 0 && _selfObject$data.visibleDataSets) {
478
+ if (metadataObject !== null && metadataObject !== void 0 && (_metadataObject$data = metadataObject.data) !== null && _metadataObject$data !== void 0 && _metadataObject$data.visibleDataSets) {
379
479
  _context.next = 2;
380
480
  break;
381
481
  }
382
- _loggerProxy.default.logger.warn("Locus-info:index#initialSetup --> cannot initialize HashTreeParser, SELF object with visibleDataSets is missing in the message");
383
- throw new Error('SELF object with visibleDataSets is missing in the message');
482
+ // this is a common case (not an error)
483
+ // it happens for example after we leave the meeting and still get some heartbeats or delayed messages
484
+ _loggerProxy.default.logger.info("Locus-info:index#initialSetup --> cannot initialize HashTreeParser, Metadata object with visibleDataSets is missing in the message");
485
+
486
+ // throw so that handleLocusEvent() catches it and destroys the partially created meeting object
487
+ throw new Error('Metadata object with visibleDataSets is missing in the message');
384
488
  case 2:
385
489
  _loggerProxy.default.logger.info('Locus-info:index#initialSetup --> creating HashTreeParser from message');
386
490
  // first create the HashTreeParser, but don't initialize it with any data yet
387
- // pass just a fake locus that contains only the visibleDataSets
388
491
  this.hashTreeParser = this.createHashTreeParser({
389
492
  initialLocus: {
390
- locus: {
391
- self: {
392
- visibleDataSets: selfObject.data.visibleDataSets
393
- }
394
- },
493
+ locus: null,
395
494
  dataSets: [] // empty, because they will be populated in initializeFromMessage() call // dataSets: data.hashTreeMessage.dataSets,
495
+ },
496
+ metadata: {
497
+ htMeta: metadataObject.htMeta,
498
+ visibleDataSets: metadataObject.data.visibleDataSets
396
499
  }
397
500
  });
398
501
 
@@ -405,12 +508,12 @@ var LocusInfo = exports.default = /*#__PURE__*/function (_EventsScope) {
405
508
  case 4:
406
509
  // "classic" Locus case, no hash trees involved
407
510
  this.updateLocusCache(data.locus);
408
- this.onFullLocus(data.locus, undefined);
511
+ this.onFullLocus('classic locus message', data.locus, undefined);
409
512
  case 5:
410
513
  return _context.abrupt("continue", 10);
411
514
  case 6:
412
515
  this.updateLocusCache(data.locus);
413
- this.onFullLocus(data.locus, undefined, data.dataSets);
516
+ this.onFullLocus('join response', data.locus, undefined, data.dataSets, data.metadata);
414
517
  return _context.abrupt("continue", 10);
415
518
  case 7:
416
519
  if (!((_data$locus = data.locus) !== null && _data$locus !== void 0 && (_data$locus$links = _data$locus.links) !== null && _data$locus$links !== void 0 && (_data$locus$links$res = _data$locus$links.resources) !== null && _data$locus$links$res !== void 0 && (_data$locus$links$res2 = _data$locus$links$res.visibleDataSets) !== null && _data$locus$links$res2 !== void 0 && _data$locus$links$res2.url)) {
@@ -419,16 +522,12 @@ var LocusInfo = exports.default = /*#__PURE__*/function (_EventsScope) {
419
522
  }
420
523
  _loggerProxy.default.logger.info('Locus-info:index#initialSetup --> creating HashTreeParser from get-loci-response');
421
524
  // first create the HashTreeParser, but don't initialize it with any data yet
422
- // pass just a fake locus that contains only the visibleDataSets
423
525
  this.hashTreeParser = this.createHashTreeParser({
424
526
  initialLocus: {
425
- locus: {
426
- self: {
427
- visibleDataSets: (_data$locus2 = data.locus) === null || _data$locus2 === void 0 ? void 0 : (_data$locus2$self = _data$locus2.self) === null || _data$locus2$self === void 0 ? void 0 : _data$locus2$self.visibleDataSets
428
- }
429
- },
527
+ locus: null,
430
528
  dataSets: [] // empty, because we don't have them yet
431
- }
529
+ },
530
+ metadata: null // get-loci-response doesn't contain Metadata object
432
531
  });
433
532
 
434
533
  // now initialize all the data
@@ -440,7 +539,7 @@ var LocusInfo = exports.default = /*#__PURE__*/function (_EventsScope) {
440
539
  case 9:
441
540
  // "classic" Locus case, no hash trees involved
442
541
  this.updateLocusCache(data.locus);
443
- this.onFullLocus(data.locus, undefined);
542
+ this.onFullLocus('classic get-loci-response', data.locus, undefined);
444
543
  case 10:
445
544
  // Change it to true after it receives it first locus object
446
545
  this.emitChange = true;
@@ -543,6 +642,27 @@ var LocusInfo = exports.default = /*#__PURE__*/function (_EventsScope) {
543
642
  });
544
643
  }
545
644
  break;
645
+ case _types.ObjectType.embeddedApp:
646
+ if (object.data) {
647
+ var _locus$embeddedApps;
648
+ _loggerProxy.default.logger.info("Locus-info:index#updateLocusFromHashTreeObject --> embeddedApp id=".concat(object.htMeta.elementId.id, " url='").concat(object.data.url, "' updated version=").concat(object.htMeta.elementId.version, ":"), object.data);
649
+ var existingEmbeddedApp = (_locus$embeddedApps = locus.embeddedApps) === null || _locus$embeddedApps === void 0 ? void 0 : _locus$embeddedApps.find(function (ms) {
650
+ return ms.htMeta.elementId.id === object.htMeta.elementId.id;
651
+ });
652
+ if (existingEmbeddedApp) {
653
+ (0, _assign.default)(existingEmbeddedApp, object.data);
654
+ } else {
655
+ locus.embeddedApps = locus.embeddedApps || [];
656
+ locus.embeddedApps.push(object.data);
657
+ }
658
+ } else {
659
+ var _locus$embeddedApps2;
660
+ _loggerProxy.default.logger.info("Locus-info:index#updateLocusFromHashTreeObject --> embeddedApp id=".concat(object.htMeta.elementId.id, " removed, version=").concat(object.htMeta.elementId.version));
661
+ locus.embeddedApps = (_locus$embeddedApps2 = locus.embeddedApps) === null || _locus$embeddedApps2 === void 0 ? void 0 : _locus$embeddedApps2.filter(function (ms) {
662
+ return ms.htMeta.elementId.id !== object.htMeta.elementId.id;
663
+ });
664
+ }
665
+ break;
546
666
  case _types.ObjectType.participant:
547
667
  _loggerProxy.default.logger.info("Locus-info:index#updateLocusFromHashTreeObject --> participant id=".concat(object.htMeta.elementId.id, " ").concat(object.data ? 'updated' : 'removed', " version=").concat(object.htMeta.elementId.version));
548
668
  if (object.data) {
@@ -598,6 +718,10 @@ var LocusInfo = exports.default = /*#__PURE__*/function (_EventsScope) {
598
718
  }
599
719
  }
600
720
  break;
721
+ case _types.ObjectType.metadata:
722
+ _loggerProxy.default.logger.info("Locus-info:index#updateLocusFromHashTreeObject --> metadata object updated to version ".concat(object.htMeta.elementId.version));
723
+ // we don't use hash tree metadata right now for anything, it's mainly used internally by HashTreeParser
724
+ break;
601
725
  default:
602
726
  _loggerProxy.default.logger.warn("Locus-info:index#updateLocusFromHashTreeObject --> received unsupported object type ".concat(type));
603
727
  break;
@@ -730,9 +854,11 @@ var LocusInfo = exports.default = /*#__PURE__*/function (_EventsScope) {
730
854
  }
731
855
  case _hashTreeParser.LocusInfoUpdateType.MEETING_ENDED:
732
856
  {
733
- _loggerProxy.default.logger.info("Locus-info:index#updateFromHashTree --> received signal that meeting ended, destroying meeting ".concat(this.meetingId));
734
857
  var meeting = this.webex.meetings.meetingCollection.get(this.meetingId);
735
- this.webex.meetings.destroy(meeting, _constants.MEETING_REMOVED_REASON.SELF_REMOVED);
858
+ if (meeting) {
859
+ _loggerProxy.default.logger.info("Locus-info:index#updateFromHashTree --> received signal that meeting ended, destroying meeting ".concat(this.meetingId));
860
+ this.webex.meetings.destroy(meeting, _constants.MEETING_REMOVED_REASON.SELF_REMOVED);
861
+ }
736
862
  }
737
863
  }
738
864
  }
@@ -749,8 +875,13 @@ var LocusInfo = exports.default = /*#__PURE__*/function (_EventsScope) {
749
875
  if (this.hashTreeParser) {
750
876
  this.handleHashTreeMessage(meeting, data.eventType, data.stateElementsMessage);
751
877
  } else {
752
- // eslint-disable-next-line @typescript-eslint/no-shadow
753
878
  var eventType = data.eventType;
879
+ if (eventType === _constants.LOCUSEVENT.HASH_TREE_DATA_UPDATED) {
880
+ // this can happen when we get an event before join http response
881
+ // it's OK to just ignore it
882
+ _loggerProxy.default.logger.info("Locus-info:index#parse --> received locus hash tree event before hashTreeParser is created");
883
+ return;
884
+ }
754
885
  var locus = this.getTheLocusToUpdate(data.locus);
755
886
  _loggerProxy.default.logger.info("Locus-info:index#parse --> received locus data: ".concat(eventType));
756
887
  locus.jsSdkMeta = {
@@ -771,14 +902,11 @@ var LocusInfo = exports.default = /*#__PURE__*/function (_EventsScope) {
771
902
  case _constants.LOCUSEVENT.PARTICIPANT_DECLINED:
772
903
  case _constants.LOCUSEVENT.FLOOR_GRANTED:
773
904
  case _constants.LOCUSEVENT.FLOOR_RELEASED:
774
- this.onFullLocus(locus, eventType);
905
+ this.onFullLocus("classic locus event ".concat(eventType), locus, eventType);
775
906
  break;
776
907
  case _constants.LOCUSEVENT.DIFFERENCE:
777
908
  this.handleLocusDelta(locus, meeting);
778
909
  break;
779
- case _constants.LOCUSEVENT.HASH_TREE_DATA_UPDATED:
780
- this.sendClassicVsHashTreeMismatchMetric(meeting, "got ".concat(eventType, ", expected classic events"));
781
- break;
782
910
  default:
783
911
  // Why will there be a event with no eventType ????
784
912
  // we may not need this, we can get full locus
@@ -803,32 +931,36 @@ var LocusInfo = exports.default = /*#__PURE__*/function (_EventsScope) {
803
931
  /**
804
932
  * Function for handling full locus when it's using hash trees (so not the "classic" one).
805
933
  *
934
+ * @param {string} debugText string explaining the trigger for this call, added to logs for debugging purposes
806
935
  * @param {object} locus locus object
936
+ * @param {object} metadata locus hash trees metadata
807
937
  * @param {string} eventType locus event
808
938
  * @param {DataSet[]} dataSets
809
939
  * @returns {void}
810
940
  */
811
941
  }, {
812
942
  key: "onFullLocusWithHashTrees",
813
- value: function onFullLocusWithHashTrees(locus, eventType, dataSets) {
943
+ value: function onFullLocusWithHashTrees(debugText, locus, metadata, eventType, dataSets) {
814
944
  if (!this.hashTreeParser) {
815
- _loggerProxy.default.logger.info("Locus-info:index#onFullLocus --> creating hash tree parser");
816
- _loggerProxy.default.logger.info('Locus-info:index#onFullLocus --> dataSets:', dataSets, ' and locus:', locus);
945
+ _loggerProxy.default.logger.info("Locus-info:index#onFullLocus (".concat(debugText, ") --> creating hash tree parser"));
946
+ _loggerProxy.default.logger.info("Locus-info:index#onFullLocus (".concat(debugText, ") --> dataSets:"), dataSets, ' and locus:', locus, ' and metadata:', metadata);
817
947
  this.hashTreeParser = this.createHashTreeParser({
818
948
  initialLocus: {
819
949
  locus: locus,
820
950
  dataSets: dataSets
821
- }
951
+ },
952
+ metadata: metadata
822
953
  });
823
954
  this.onFullLocusCommon(locus, eventType);
824
955
  } else {
825
956
  // in this case the Locus we're getting is not necessarily the full one
826
957
  // so treat it like if we just got it in any api response
827
958
 
828
- _loggerProxy.default.logger.info('Locus-info:index#onFullLocus --> hash tree parser already exists, handling it like a normal API response');
959
+ _loggerProxy.default.logger.info("Locus-info:index#onFullLocus (".concat(debugText, ") --> hash tree parser already exists, handling it like a normal API response"));
829
960
  this.handleLocusAPIResponse(undefined, {
830
961
  dataSets: dataSets,
831
- locus: locus
962
+ locus: locus,
963
+ metadata: metadata
832
964
  });
833
965
  }
834
966
  }
@@ -836,15 +968,16 @@ var LocusInfo = exports.default = /*#__PURE__*/function (_EventsScope) {
836
968
  /**
837
969
  * Function for handling full locus when it's the "classic" one (not hash trees)
838
970
  *
971
+ * @param {string} debugText string explaining the trigger for this call, added to logs for debugging purposes
839
972
  * @param {object} locus locus object
840
973
  * @param {string} eventType locus event
841
974
  * @returns {void}
842
975
  */
843
976
  }, {
844
977
  key: "onFullLocusClassic",
845
- value: function onFullLocusClassic(locus, eventType) {
978
+ value: function onFullLocusClassic(debugText, locus, eventType) {
846
979
  if (!this.locusParser.isNewFullLocus(locus)) {
847
- _loggerProxy.default.logger.info("Locus-info:index#onFullLocus --> ignoring old full locus DTO, eventType=".concat(eventType));
980
+ _loggerProxy.default.logger.info("Locus-info:index#onFullLocus (".concat(debugText, ") --> ignoring old full locus DTO, eventType=").concat(eventType));
848
981
  return;
849
982
  }
850
983
  this.onFullLocusCommon(locus, eventType);
@@ -852,23 +985,28 @@ var LocusInfo = exports.default = /*#__PURE__*/function (_EventsScope) {
852
985
 
853
986
  /**
854
987
  * updates the locus with full locus object
988
+ * @param {string} debugText string explaining the trigger for this call, added to logs for debugging purposes
855
989
  * @param {object} locus locus object
856
990
  * @param {string} eventType locus event
857
991
  * @param {DataSet[]} dataSets
992
+ * @param {object} metadata locus hash trees metadata
858
993
  * @returns {object} null
859
994
  * @memberof LocusInfo
860
995
  */
861
996
  }, {
862
997
  key: "onFullLocus",
863
- value: function onFullLocus(locus, eventType, dataSets) {
998
+ value: function onFullLocus(debugText, locus, eventType, dataSets, metadata) {
864
999
  if (!locus) {
865
- _loggerProxy.default.logger.error('Locus-info:index#onFullLocus --> object passed as argument was invalid, continuing.');
1000
+ _loggerProxy.default.logger.error("Locus-info:index#onFullLocus (".concat(debugText, ") --> object passed as argument was invalid, continuing."));
866
1001
  }
867
1002
  if (dataSets) {
1003
+ if (!metadata) {
1004
+ throw new Error("Locus-info:index#onFullLocus (".concat(debugText, ") --> hash tree metadata is missing with full Locus"));
1005
+ }
868
1006
  // this is the new hashmap Locus DTO format (only applicable to webinars for now)
869
- this.onFullLocusWithHashTrees(locus, eventType, dataSets);
1007
+ this.onFullLocusWithHashTrees(debugText, locus, metadata, eventType, dataSets);
870
1008
  } else {
871
- this.onFullLocusClassic(locus, eventType);
1009
+ this.onFullLocusClassic(debugText, locus, eventType);
872
1010
  }
873
1011
  }
874
1012
 
@@ -1102,23 +1240,6 @@ var LocusInfo = exports.default = /*#__PURE__*/function (_EventsScope) {
1102
1240
  reason: _constants.MEETING_REMOVED_REASON.MEETING_INACTIVE_TERMINATING,
1103
1241
  shouldLeave: false
1104
1242
  });
1105
- } else if (this.fullState && this.fullState.removed) {
1106
- // user has been dropped from a meeting
1107
-
1108
- // @ts-ignore
1109
- this.webex.internal.newMetrics.submitClientEvent({
1110
- name: 'client.call.remote-ended',
1111
- options: {
1112
- meetingId: this.meetingId
1113
- }
1114
- });
1115
- this.emitScoped({
1116
- file: 'locus-info',
1117
- function: 'isMeetingActive'
1118
- }, _constants.EVENTS.DESTROY_MEETING, {
1119
- reason: _constants.MEETING_REMOVED_REASON.FULLSTATE_REMOVED,
1120
- shouldLeave: false
1121
- });
1122
1243
  }
1123
1244
  // If you are guest and you are removed from the meeting
1124
1245
  // You wont get any further events
@@ -1205,11 +1326,11 @@ var LocusInfo = exports.default = /*#__PURE__*/function (_EventsScope) {
1205
1326
  isReplace: isReplace
1206
1327
  });
1207
1328
  if (participants && (0, _isArray.default)(participants) && participants.length > 0) {
1208
- var _iterator = _createForOfIteratorHelper(participants),
1209
- _step;
1329
+ var _iterator2 = _createForOfIteratorHelper(participants),
1330
+ _step2;
1210
1331
  try {
1211
- for (_iterator.s(); !(_step = _iterator.n()).done;) {
1212
- var participant = _step.value;
1332
+ for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
1333
+ var participant = _step2.value;
1213
1334
  if (participant && (participant === null || participant === void 0 ? void 0 : participant.reason) === 'FAILURE') {
1214
1335
  var _participant$person;
1215
1336
  this.emitScoped({
@@ -1221,9 +1342,9 @@ var LocusInfo = exports.default = /*#__PURE__*/function (_EventsScope) {
1221
1342
  }
1222
1343
  }
1223
1344
  } catch (err) {
1224
- _iterator.e(err);
1345
+ _iterator2.e(err);
1225
1346
  } finally {
1226
- _iterator.f();
1347
+ _iterator2.f();
1227
1348
  }
1228
1349
  }
1229
1350
  }
@@ -1246,6 +1367,7 @@ var LocusInfo = exports.default = /*#__PURE__*/function (_EventsScope) {
1246
1367
  hasMeetingContainerChanged = _ControlsUtils$getCon2.hasMeetingContainerChanged,
1247
1368
  hasTranscribeChanged = _ControlsUtils$getCon2.hasTranscribeChanged,
1248
1369
  hasHesiodLLMIdChanged = _ControlsUtils$getCon2.hasHesiodLLMIdChanged,
1370
+ hasAiSummaryNotificationChanged = _ControlsUtils$getCon2.hasAiSummaryNotificationChanged,
1249
1371
  hasTranscribeSpokenLanguageChanged = _ControlsUtils$getCon2.hasTranscribeSpokenLanguageChanged,
1250
1372
  hasManualCaptionChanged = _ControlsUtils$getCon2.hasManualCaptionChanged,
1251
1373
  hasEntryExitToneChanged = _ControlsUtils$getCon2.hasEntryExitToneChanged,
@@ -1376,6 +1498,14 @@ var LocusInfo = exports.default = /*#__PURE__*/function (_EventsScope) {
1376
1498
  hesiodLlmId: hesiodLlmId
1377
1499
  });
1378
1500
  }
1501
+ if (hasAiSummaryNotificationChanged) {
1502
+ this.emitScoped({
1503
+ file: 'locus-info',
1504
+ function: 'updateControls'
1505
+ }, _constants.LOCUSINFO.EVENTS.CONTROLS_AI_SUMMARY_NOTIFICATION_UPDATED, {
1506
+ aiSummaryNotification: current.transcribe.aiSummaryNotification
1507
+ });
1508
+ }
1379
1509
  if (hasTranscribeSpokenLanguageChanged) {
1380
1510
  var spokenLanguage = current.transcribe.spokenLanguage;
1381
1511
  this.emitScoped({
@@ -1800,6 +1930,14 @@ var LocusInfo = exports.default = /*#__PURE__*/function (_EventsScope) {
1800
1930
  brb: parsedSelves.current.brb
1801
1931
  });
1802
1932
  }
1933
+ if (parsedSelves.updates.selfIdChanged) {
1934
+ this.emitScoped({
1935
+ file: 'locus-info',
1936
+ function: 'updateSelf'
1937
+ }, _constants.LOCUSINFO.EVENTS.SELF_ID_CHANGED, {
1938
+ selfId: parsedSelves.current.selfId
1939
+ });
1940
+ }
1803
1941
  if (parsedSelves.updates.interpretationChanged) {
1804
1942
  this.emitScoped({
1805
1943
  file: 'locus-info',