@webex/plugin-meetings 3.12.0-next.7 → 3.12.0-next.70

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 (178) hide show
  1. package/AGENTS.md +9 -0
  2. package/dist/aiEnableRequest/index.js +15 -2
  3. package/dist/aiEnableRequest/index.js.map +1 -1
  4. package/dist/breakouts/breakout.js +8 -3
  5. package/dist/breakouts/breakout.js.map +1 -1
  6. package/dist/breakouts/index.js +26 -2
  7. package/dist/breakouts/index.js.map +1 -1
  8. package/dist/config.js +2 -0
  9. package/dist/config.js.map +1 -1
  10. package/dist/constants.js +30 -7
  11. package/dist/constants.js.map +1 -1
  12. package/dist/controls-options-manager/constants.js +11 -1
  13. package/dist/controls-options-manager/constants.js.map +1 -1
  14. package/dist/controls-options-manager/index.js +38 -24
  15. package/dist/controls-options-manager/index.js.map +1 -1
  16. package/dist/controls-options-manager/util.js +91 -0
  17. package/dist/controls-options-manager/util.js.map +1 -1
  18. package/dist/hashTree/constants.js +13 -1
  19. package/dist/hashTree/constants.js.map +1 -1
  20. package/dist/hashTree/hashTreeParser.js +880 -382
  21. package/dist/hashTree/hashTreeParser.js.map +1 -1
  22. package/dist/hashTree/utils.js +42 -0
  23. package/dist/hashTree/utils.js.map +1 -1
  24. package/dist/index.js +7 -0
  25. package/dist/index.js.map +1 -1
  26. package/dist/interceptors/dataChannelAuthToken.js +75 -15
  27. package/dist/interceptors/dataChannelAuthToken.js.map +1 -1
  28. package/dist/interceptors/locusRetry.js +23 -8
  29. package/dist/interceptors/locusRetry.js.map +1 -1
  30. package/dist/interpretation/index.js +10 -1
  31. package/dist/interpretation/index.js.map +1 -1
  32. package/dist/interpretation/interpretation.types.js +7 -0
  33. package/dist/interpretation/interpretation.types.js.map +1 -0
  34. package/dist/interpretation/siLanguage.js +1 -1
  35. package/dist/locus-info/controlsUtils.js +4 -1
  36. package/dist/locus-info/controlsUtils.js.map +1 -1
  37. package/dist/locus-info/index.js +298 -87
  38. package/dist/locus-info/index.js.map +1 -1
  39. package/dist/locus-info/types.js +19 -0
  40. package/dist/locus-info/types.js.map +1 -1
  41. package/dist/media/index.js +3 -1
  42. package/dist/media/index.js.map +1 -1
  43. package/dist/media/properties.js +1 -0
  44. package/dist/media/properties.js.map +1 -1
  45. package/dist/meeting/in-meeting-actions.js +3 -1
  46. package/dist/meeting/in-meeting-actions.js.map +1 -1
  47. package/dist/meeting/index.js +1046 -689
  48. package/dist/meeting/index.js.map +1 -1
  49. package/dist/meeting/muteState.js +10 -1
  50. package/dist/meeting/muteState.js.map +1 -1
  51. package/dist/meeting/request.js +5 -2
  52. package/dist/meeting/request.js.map +1 -1
  53. package/dist/meeting/util.js +20 -2
  54. package/dist/meeting/util.js.map +1 -1
  55. package/dist/meeting-info/meeting-info-v2.js +2 -2
  56. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  57. package/dist/meetings/index.js +231 -78
  58. package/dist/meetings/index.js.map +1 -1
  59. package/dist/meetings/meetings.types.js +6 -1
  60. package/dist/meetings/meetings.types.js.map +1 -1
  61. package/dist/meetings/request.js +39 -0
  62. package/dist/meetings/request.js.map +1 -1
  63. package/dist/meetings/util.js +79 -5
  64. package/dist/meetings/util.js.map +1 -1
  65. package/dist/member/index.js +10 -0
  66. package/dist/member/index.js.map +1 -1
  67. package/dist/member/types.js.map +1 -1
  68. package/dist/member/util.js +3 -0
  69. package/dist/member/util.js.map +1 -1
  70. package/dist/metrics/constants.js +4 -1
  71. package/dist/metrics/constants.js.map +1 -1
  72. package/dist/multistream/codec/constants.js +63 -0
  73. package/dist/multistream/codec/constants.js.map +1 -0
  74. package/dist/multistream/mediaRequestManager.js +62 -15
  75. package/dist/multistream/mediaRequestManager.js.map +1 -1
  76. package/dist/multistream/receiveSlot.js +9 -0
  77. package/dist/multistream/receiveSlot.js.map +1 -1
  78. package/dist/reactions/reactions.type.js.map +1 -1
  79. package/dist/recording-controller/index.js +1 -3
  80. package/dist/recording-controller/index.js.map +1 -1
  81. package/dist/types/config.d.ts +2 -0
  82. package/dist/types/constants.d.ts +9 -1
  83. package/dist/types/controls-options-manager/constants.d.ts +6 -1
  84. package/dist/types/controls-options-manager/index.d.ts +10 -0
  85. package/dist/types/hashTree/constants.d.ts +2 -0
  86. package/dist/types/hashTree/hashTreeParser.d.ts +146 -17
  87. package/dist/types/hashTree/utils.d.ts +18 -0
  88. package/dist/types/index.d.ts +3 -0
  89. package/dist/types/interceptors/locusRetry.d.ts +4 -4
  90. package/dist/types/interpretation/interpretation.types.d.ts +10 -0
  91. package/dist/types/locus-info/index.d.ts +50 -6
  92. package/dist/types/locus-info/types.d.ts +21 -1
  93. package/dist/types/media/properties.d.ts +1 -0
  94. package/dist/types/meeting/in-meeting-actions.d.ts +2 -0
  95. package/dist/types/meeting/index.d.ts +78 -5
  96. package/dist/types/meeting/request.d.ts +1 -0
  97. package/dist/types/meeting/util.d.ts +8 -0
  98. package/dist/types/meetings/index.d.ts +30 -2
  99. package/dist/types/meetings/meetings.types.d.ts +15 -0
  100. package/dist/types/meetings/request.d.ts +14 -0
  101. package/dist/types/member/index.d.ts +1 -0
  102. package/dist/types/member/types.d.ts +1 -0
  103. package/dist/types/member/util.d.ts +1 -0
  104. package/dist/types/metrics/constants.d.ts +3 -0
  105. package/dist/types/multistream/codec/constants.d.ts +7 -0
  106. package/dist/types/multistream/mediaRequestManager.d.ts +22 -5
  107. package/dist/types/reactions/reactions.type.d.ts +3 -0
  108. package/dist/webinar/index.js +305 -159
  109. package/dist/webinar/index.js.map +1 -1
  110. package/package.json +22 -22
  111. package/src/aiEnableRequest/index.ts +16 -0
  112. package/src/breakouts/breakout.ts +3 -1
  113. package/src/breakouts/index.ts +31 -0
  114. package/src/config.ts +2 -0
  115. package/src/constants.ts +13 -2
  116. package/src/controls-options-manager/constants.ts +14 -1
  117. package/src/controls-options-manager/index.ts +47 -24
  118. package/src/controls-options-manager/util.ts +81 -1
  119. package/src/hashTree/constants.ts +16 -0
  120. package/src/hashTree/hashTreeParser.ts +580 -196
  121. package/src/hashTree/utils.ts +36 -0
  122. package/src/index.ts +6 -0
  123. package/src/interceptors/dataChannelAuthToken.ts +88 -12
  124. package/src/interceptors/locusRetry.ts +25 -4
  125. package/src/interpretation/index.ts +27 -9
  126. package/src/interpretation/interpretation.types.ts +11 -0
  127. package/src/locus-info/controlsUtils.ts +3 -1
  128. package/src/locus-info/index.ts +293 -97
  129. package/src/locus-info/types.ts +25 -1
  130. package/src/media/index.ts +3 -0
  131. package/src/media/properties.ts +1 -0
  132. package/src/meeting/in-meeting-actions.ts +4 -0
  133. package/src/meeting/index.ts +386 -48
  134. package/src/meeting/muteState.ts +10 -1
  135. package/src/meeting/request.ts +11 -0
  136. package/src/meeting/util.ts +21 -2
  137. package/src/meeting-info/meeting-info-v2.ts +4 -2
  138. package/src/meetings/index.ts +134 -44
  139. package/src/meetings/meetings.types.ts +19 -0
  140. package/src/meetings/request.ts +43 -0
  141. package/src/meetings/util.ts +97 -1
  142. package/src/member/index.ts +10 -0
  143. package/src/member/types.ts +1 -0
  144. package/src/member/util.ts +3 -0
  145. package/src/metrics/constants.ts +3 -0
  146. package/src/multistream/codec/constants.ts +58 -0
  147. package/src/multistream/mediaRequestManager.ts +119 -28
  148. package/src/multistream/receiveSlot.ts +18 -0
  149. package/src/reactions/reactions.type.ts +3 -0
  150. package/src/recording-controller/index.ts +1 -2
  151. package/src/webinar/index.ts +214 -36
  152. package/test/unit/spec/aiEnableRequest/index.ts +86 -0
  153. package/test/unit/spec/breakouts/breakout.ts +9 -3
  154. package/test/unit/spec/breakouts/index.ts +49 -0
  155. package/test/unit/spec/controls-options-manager/index.js +140 -29
  156. package/test/unit/spec/controls-options-manager/util.js +165 -0
  157. package/test/unit/spec/hashTree/hashTreeParser.ts +1838 -180
  158. package/test/unit/spec/hashTree/utils.ts +125 -1
  159. package/test/unit/spec/interceptors/dataChannelAuthToken.ts +196 -0
  160. package/test/unit/spec/interceptors/locusRetry.ts +205 -4
  161. package/test/unit/spec/interpretation/index.ts +26 -4
  162. package/test/unit/spec/locus-info/controlsUtils.js +172 -57
  163. package/test/unit/spec/locus-info/index.js +487 -81
  164. package/test/unit/spec/media/index.ts +31 -0
  165. package/test/unit/spec/meeting/in-meeting-actions.ts +2 -0
  166. package/test/unit/spec/meeting/index.js +1240 -37
  167. package/test/unit/spec/meeting/muteState.js +81 -0
  168. package/test/unit/spec/meeting/request.js +12 -0
  169. package/test/unit/spec/meeting/utils.js +33 -0
  170. package/test/unit/spec/meeting-info/meetinginfov2.js +19 -10
  171. package/test/unit/spec/meetings/index.js +360 -10
  172. package/test/unit/spec/meetings/request.js +141 -0
  173. package/test/unit/spec/meetings/utils.js +189 -0
  174. package/test/unit/spec/member/index.js +7 -0
  175. package/test/unit/spec/member/util.js +24 -0
  176. package/test/unit/spec/multistream/mediaRequestManager.ts +501 -37
  177. package/test/unit/spec/recording-controller/index.js +9 -8
  178. package/test/unit/spec/webinar/index.ts +329 -28
@@ -13,15 +13,25 @@ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime-corejs2/
13
13
  var _webexCore = require("@webex/webex-core");
14
14
  var _uuid = _interopRequireDefault(require("uuid"));
15
15
  var _lodash = require("lodash");
16
- var _internalPluginLlm = require("@webex/internal-plugin-llm");
17
16
  var _constants = require("../constants");
18
17
  var _collection = _interopRequireDefault(require("./collection"));
19
18
  var _loggerProxy = _interopRequireDefault(require("../common/logs/logger-proxy"));
19
+ var _util = _interopRequireDefault(require("../meeting/util"));
20
20
  var _utils = require("./utils");
21
21
  /*!
22
22
  * Copyright (c) 2015-2023 Cisco Systems, Inc. See LICENSE file.
23
23
  */
24
24
 
25
+ var PS_LLM_EVENTS = [{
26
+ event: "event:relay.event:".concat(_constants.LLM_PRACTICE_SESSION),
27
+ listenerKey: 'relay',
28
+ handlerKey: 'processRelayEvent'
29
+ }, {
30
+ event: "".concat(_constants.LOCUS_LLM_EVENT, ":").concat(_constants.LLM_PRACTICE_SESSION),
31
+ listenerKey: 'locusLLM',
32
+ handlerKey: 'processLocusLLMEvent'
33
+ }];
34
+
25
35
  /**
26
36
  * @class Webinar
27
37
  */
@@ -100,6 +110,31 @@ var Webinar = _webexCore.WebexPlugin.extend({
100
110
  isDemoted: isDemoted
101
111
  };
102
112
  },
113
+ /**
114
+ * Resolves the meeting associated with this webinar instance, guarded against the
115
+ * meetingId pointer drifting onto an unrelated transient meeting (e.g. an inbound
116
+ * 1:1 call) that may exist in the meeting collection. Returns the meeting only when
117
+ * its locusUrl matches this webinar's tracked locusUrl. Returns undefined (with a
118
+ * warning) when the meeting cannot be resolved or when the webinar's locusUrl has
119
+ * not been initialized yet — callers must treat this as "no owned meeting" rather
120
+ * than fall through to an unvalidated lookup.
121
+ * @returns {object|undefined}
122
+ */
123
+ getValidatedWebinarMeeting: function getValidatedWebinarMeeting() {
124
+ var meeting = this.webex.meetings.getMeetingByType(_constants._ID_, this.meetingId);
125
+ if (!meeting) {
126
+ return undefined;
127
+ }
128
+ if (!this.locusUrl) {
129
+ _loggerProxy.default.logger.warn("Webinar:index#getValidatedWebinarMeeting --> skipping; webinar locusUrl is not yet initialized for meetingId ".concat(this.meetingId));
130
+ return undefined;
131
+ }
132
+ if (meeting.locusUrl !== this.locusUrl) {
133
+ _loggerProxy.default.logger.warn("Webinar:index#getValidatedWebinarMeeting --> skipping; meeting ".concat(this.meetingId, " locusUrl ").concat(meeting.locusUrl, " does not match webinar locusUrl ").concat(this.locusUrl));
134
+ return undefined;
135
+ }
136
+ return meeting;
137
+ },
103
138
  /**
104
139
  * should join practice session data channel or not
105
140
  * @param {Object} {isPromoted: boolean, isDemoted: boolean}} Role transition states
@@ -108,7 +143,7 @@ var Webinar = _webexCore.WebexPlugin.extend({
108
143
  updateStatusByRole: function updateStatusByRole(_ref) {
109
144
  var isPromoted = _ref.isPromoted,
110
145
  isDemoted = _ref.isDemoted;
111
- var meeting = this.webex.meetings.getMeetingByType(_constants._ID_, this.meetingId);
146
+ var meeting = this.getValidatedWebinarMeeting();
112
147
  if (isDemoted && (meeting === null || meeting === void 0 ? void 0 : meeting.shareStatus) === _constants.SHARE_STATUS.WHITEBOARD_SHARE_ACTIVE || isPromoted) {
113
148
  var _meeting$locusInfo, _meeting$locusInfo2;
114
149
  // attendees in webinar should subscribe streaming for whiteboard sharing
@@ -126,45 +161,82 @@ var Webinar = _webexCore.WebexPlugin.extend({
126
161
  },
127
162
  /**
128
163
  * Disconnects the practice session data channel and removes its relay listener.
164
+ * The listener reference removed here is the exact callback captured at subscribe
165
+ * time (see updatePSDataChannel) so that cleanup is correct even if the underlying
166
+ * meeting can no longer be resolved (e.g. locusUrl mismatch).
129
167
  * @returns {Promise<void>}
130
168
  */
131
169
  cleanupPSDataChannel: function cleanupPSDataChannel() {
132
170
  var _this = this;
133
171
  return (0, _asyncToGenerator2.default)(/*#__PURE__*/_regenerator.default.mark(function _callee() {
134
- var meeting;
172
+ var _this$webex$internal$, isOwner, disconnected, _this$webex$internal$2, _this$webex$internal$3, _i, _PS_LLM_EVENTS, _PS_LLM_EVENTS$_i, event, listenerKey, _t;
135
173
  return _regenerator.default.wrap(function (_context) {
136
174
  while (1) switch (_context.prev = _context.next) {
137
175
  case 0:
176
+ _this$webex$internal$ = _this.webex.internal.llm.resolveSessionOwnership(_this.meetingId, _constants.LLM_PRACTICE_SESSION), isOwner = _this$webex$internal$.isOwner;
177
+ _this.llmListeners = _this.llmListeners || {};
138
178
  if (_this._pendingOnlineListener) {
139
179
  // @ts-ignore - Fix type
140
180
  _this.webex.internal.llm.off('online', _this._pendingOnlineListener);
141
181
  _this._pendingOnlineListener = null;
142
182
  }
143
- meeting = _this.webex.meetings.getMeetingByType(_constants._ID_, _this.meetingId); // @ts-ignore - Fix type
144
- _context.next = 1;
183
+ _context.prev = 1;
184
+ _context.next = 2;
145
185
  return _this.webex.internal.llm.disconnectLLM({
146
186
  code: 3050,
147
187
  reason: 'done (permanent)'
148
- }, _constants.LLM_PRACTICE_SESSION);
149
- case 1:
150
- // @ts-ignore - Fix type
151
- _this.webex.internal.llm.off("event:relay.event:".concat(_constants.LLM_PRACTICE_SESSION), meeting === null || meeting === void 0 ? void 0 : meeting.processRelayEvent);
188
+ }, _constants.LLM_PRACTICE_SESSION, _this.meetingId);
152
189
  case 2:
190
+ disconnected = _context.sent;
191
+ if (!disconnected) {
192
+ _loggerProxy.default.logger.info("Webinar:index#cleanupPSDataChannel --> skipping disconnect; practice-session LLM is not owned by meeting ".concat(_this.meetingId));
193
+ }
194
+ _context.next = 4;
195
+ break;
196
+ case 3:
197
+ _context.prev = 3;
198
+ _t = _context["catch"](1);
199
+ // disconnectLLM clears ownership only on success; release a stale owner
200
+ // tag here so other meeting instances can reclaim practice-session LLM.
201
+ if (isOwner) {
202
+ // @ts-ignore - Fix type
203
+ (_this$webex$internal$2 = (_this$webex$internal$3 = _this.webex.internal.llm).setOwnerMeetingId) === null || _this$webex$internal$2 === void 0 ? void 0 : _this$webex$internal$2.call(_this$webex$internal$3, undefined, _constants.LLM_PRACTICE_SESSION);
204
+ }
205
+ throw _t;
206
+ case 4:
207
+ _context.prev = 4;
208
+ if (_this._practiceSessionRelayListener) {
209
+ // @ts-ignore - Fix type
210
+ _this.webex.internal.llm.off("event:relay.event:".concat(_constants.LLM_PRACTICE_SESSION), _this._practiceSessionRelayListener);
211
+ }
212
+ _this._practiceSessionRelayListener = null;
213
+ for (_i = 0, _PS_LLM_EVENTS = PS_LLM_EVENTS; _i < _PS_LLM_EVENTS.length; _i++) {
214
+ _PS_LLM_EVENTS$_i = _PS_LLM_EVENTS[_i], event = _PS_LLM_EVENTS$_i.event, listenerKey = _PS_LLM_EVENTS$_i.listenerKey;
215
+ if (_this.llmListeners[listenerKey]) {
216
+ // @ts-ignore - Fix type
217
+ _this.webex.internal.llm.off(event, _this.llmListeners[listenerKey]);
218
+ _this.llmListeners[listenerKey] = null;
219
+ }
220
+ }
221
+ return _context.finish(4);
222
+ case 5:
153
223
  case "end":
154
224
  return _context.stop();
155
225
  }
156
- }, _callee);
226
+ }, _callee, null, [[1, 3, 4, 5]]);
157
227
  }))();
158
228
  },
159
229
  /**
160
230
  * Ensures practice-session token exists before registering the practice LLM channel.
231
+ * Caller is responsible for passing a meeting that has already been resolved via
232
+ * getValidatedWebinarMeeting() — this method does not re-validate ownership.
161
233
  * @param {object} meeting
162
234
  * @returns {Promise<string|undefined>}
163
235
  */
164
236
  ensurePracticeSessionDatachannelToken: function ensurePracticeSessionDatachannelToken(meeting) {
165
237
  var _this2 = this;
166
238
  return (0, _asyncToGenerator2.default)(/*#__PURE__*/_regenerator.default.mark(function _callee2() {
167
- var isDataChannelTokenEnabled, cachedToken, _refreshResponse$body, refreshResponse, _ref2, datachannelToken, dataChannelTokenType, _t;
239
+ var isDataChannelTokenEnabled, cachedToken, _refreshResponse$body, refreshResponse, _ref2, datachannelToken, dataChannelTokenType, _t2;
168
240
  return _regenerator.default.wrap(function (_context2) {
169
241
  while (1) switch (_context2.prev = _context2.next) {
170
242
  case 0:
@@ -179,7 +251,7 @@ var Webinar = _webexCore.WebexPlugin.extend({
179
251
  return _context2.abrupt("return", undefined);
180
252
  case 2:
181
253
  // @ts-ignore
182
- cachedToken = _this2.webex.internal.llm.getDatachannelToken(_internalPluginLlm.DataChannelTokenType.PracticeSession);
254
+ cachedToken = _this2.webex.internal.llm.getDatachannelToken(_constants.LLM_PRACTICE_SESSION, _this2.meetingId);
183
255
  if (!cachedToken) {
184
256
  _context2.next = 3;
185
257
  break;
@@ -199,12 +271,12 @@ var Webinar = _webexCore.WebexPlugin.extend({
199
271
  return _context2.abrupt("return", undefined);
200
272
  case 5:
201
273
  // @ts-ignore
202
- _this2.webex.internal.llm.setDatachannelToken(datachannelToken, dataChannelTokenType || _internalPluginLlm.DataChannelTokenType.PracticeSession);
274
+ _this2.webex.internal.llm.setDatachannelToken(datachannelToken, dataChannelTokenType || _constants.LLM_PRACTICE_SESSION, _this2.meetingId);
203
275
  return _context2.abrupt("return", datachannelToken);
204
276
  case 6:
205
277
  _context2.prev = 6;
206
- _t = _context2["catch"](3);
207
- _loggerProxy.default.logger.warn("Webinar:index#ensurePracticeSessionDatachannelToken --> failed to proactively refresh practice-session token: ".concat((_t === null || _t === void 0 ? void 0 : _t.message) || String(_t)));
278
+ _t2 = _context2["catch"](3);
279
+ _loggerProxy.default.logger.warn("Webinar:index#ensurePracticeSessionDatachannelToken --> failed to proactively refresh practice-session token: ".concat((_t2 === null || _t2 === void 0 ? void 0 : _t2.message) || String(_t2)));
208
280
  return _context2.abrupt("return", undefined);
209
281
  case 7:
210
282
  case "end":
@@ -221,14 +293,17 @@ var Webinar = _webexCore.WebexPlugin.extend({
221
293
  updatePSDataChannel: function updatePSDataChannel() {
222
294
  var _this3 = this;
223
295
  return (0, _asyncToGenerator2.default)(/*#__PURE__*/_regenerator.default.mark(function _callee3() {
224
- var invocationSequence, meeting, isPracticeSession, _ref3, _ref3$url, url, _ref3$info, _ref3$info2, _ref3$info2$practiceS, practiceSessionDatachannelUrl, practiceSessionDatachannelToken, isCaptionBoxOn, _onDefaultSessionConnected, refreshedPracticeSessionToken, latestPracticeSessionDatachannelUrl, isStillPracticeSession;
296
+ var _this3$webex$internal3, _this3$webex$internal4;
297
+ var invocationSequence, meeting, isPracticeSession, _this3$webex$internal, currentOwner, isOwner, _ref3, _ref3$url, url, _ref3$info, _ref3$info2, _ref3$info2$practiceS, practiceSessionDatachannelUrl, practiceSessionDatachannelToken, isCaptionBoxOn, _onDefaultSessionConnected, refreshedPracticeSessionToken, latestPracticeSessionDatachannelUrl, isStillPracticeSession, _this3$webex$internal2, currentOwnerBeforeConnect, isOwnerBeforeConnect;
225
298
  return _regenerator.default.wrap(function (_context3) {
226
299
  while (1) switch (_context3.prev = _context3.next) {
227
300
  case 0:
301
+ _this3.llmListeners = _this3.llmListeners || {};
228
302
  _this3._updatePSDataChannelSequence = (_this3._updatePSDataChannelSequence || 0) + 1;
229
303
  invocationSequence = _this3._updatePSDataChannelSequence;
230
- meeting = _this3.webex.meetings.getMeetingByType(_constants._ID_, _this3.meetingId);
304
+ meeting = _this3.getValidatedWebinarMeeting();
231
305
  isPracticeSession = (meeting === null || meeting === void 0 ? void 0 : meeting.isJoined()) && _this3.isJoinPracticeSessionDataChannel();
306
+ _this3$webex$internal = _this3.webex.internal.llm.resolveSessionOwnership(_this3.meetingId, _constants.LLM_PRACTICE_SESSION), currentOwner = _this3$webex$internal.currentOwner, isOwner = _this3$webex$internal.isOwner;
232
307
  if (isPracticeSession) {
233
308
  _context3.next = 2;
234
309
  break;
@@ -238,18 +313,25 @@ var Webinar = _webexCore.WebexPlugin.extend({
238
313
  case 1:
239
314
  return _context3.abrupt("return", undefined);
240
315
  case 2:
316
+ if (isOwner) {
317
+ _context3.next = 3;
318
+ break;
319
+ }
320
+ _loggerProxy.default.logger.info("Webinar:index#updatePSDataChannel --> skipping; practice-session LLM owned by meeting ".concat(currentOwner, ", not ").concat(_this3.meetingId));
321
+ return _context3.abrupt("return", undefined);
322
+ case 3:
241
323
  // @ts-ignore - Fix type
242
324
  _ref3 = (meeting === null || meeting === void 0 ? void 0 : meeting.locusInfo) || {}, _ref3$url = _ref3.url, url = _ref3$url === void 0 ? undefined : _ref3$url, _ref3$info = _ref3.info, _ref3$info2 = _ref3$info === void 0 ? {} : _ref3$info, _ref3$info2$practiceS = _ref3$info2.practiceSessionDatachannelUrl, practiceSessionDatachannelUrl = _ref3$info2$practiceS === void 0 ? undefined : _ref3$info2$practiceS; // @ts-ignore
243
- practiceSessionDatachannelToken = _this3.webex.internal.llm.getDatachannelToken(_internalPluginLlm.DataChannelTokenType.PracticeSession);
325
+ practiceSessionDatachannelToken = _this3.webex.internal.llm.getDatachannelToken(_constants.LLM_PRACTICE_SESSION, _this3.meetingId);
244
326
  isCaptionBoxOn = _this3.webex.internal.voicea.getIsCaptionBoxOn();
245
327
  if (practiceSessionDatachannelUrl) {
246
- _context3.next = 3;
328
+ _context3.next = 4;
247
329
  break;
248
330
  }
249
331
  return _context3.abrupt("return", undefined);
250
- case 3:
332
+ case 4:
251
333
  if (!_this3.webex.internal.llm.isConnected(_constants.LLM_PRACTICE_SESSION)) {
252
- _context3.next = 5;
334
+ _context3.next = 6;
253
335
  break;
254
336
  }
255
337
  if (!(
@@ -257,14 +339,14 @@ var Webinar = _webexCore.WebexPlugin.extend({
257
339
  url === _this3.webex.internal.llm.getLocusUrl(_constants.LLM_PRACTICE_SESSION) &&
258
340
  // @ts-ignore - Fix type
259
341
  practiceSessionDatachannelUrl === _this3.webex.internal.llm.getDatachannelUrl(_constants.LLM_PRACTICE_SESSION))) {
260
- _context3.next = 4;
342
+ _context3.next = 5;
261
343
  break;
262
344
  }
263
345
  return _context3.abrupt("return", undefined);
264
- case 4:
265
- _context3.next = 5;
266
- return _this3.cleanupPSDataChannel();
267
346
  case 5:
347
+ _context3.next = 6;
348
+ return _this3.cleanupPSDataChannel();
349
+ case 6:
268
350
  // Ensure the default session data channel is connected before connecting the practice session.
269
351
  // Subscribe before checking isConnected() to avoid a race where the 'online' event fires
270
352
  // between the check and the subscription — Mercury does not replay missed events.
@@ -282,44 +364,85 @@ var Webinar = _webexCore.WebexPlugin.extend({
282
364
 
283
365
  // @ts-ignore - Fix type
284
366
  if (_this3.webex.internal.llm.isConnected()) {
285
- _context3.next = 6;
367
+ _context3.next = 7;
286
368
  break;
287
369
  }
288
370
  _loggerProxy.default.logger.info('Webinar:index#updatePSDataChannel --> default session not yet connected, deferring practice session connect.');
289
371
  return _context3.abrupt("return", undefined);
290
- case 6:
372
+ case 7:
291
373
  // Default session is already connected — cancel the pending listener and proceed
292
374
  if (_this3._pendingOnlineListener) {
293
375
  // @ts-ignore - Fix type
294
376
  _this3.webex.internal.llm.off('online', _this3._pendingOnlineListener);
295
377
  _this3._pendingOnlineListener = null;
296
378
  }
297
- _context3.next = 7;
379
+ _context3.next = 8;
298
380
  return _this3.ensurePracticeSessionDatachannelToken(meeting);
299
- case 7:
381
+ case 8:
300
382
  refreshedPracticeSessionToken = _context3.sent;
301
383
  latestPracticeSessionDatachannelUrl = (0, _lodash.get)(meeting, 'locusInfo.info.practiceSessionDatachannelUrl');
302
384
  isStillPracticeSession = (meeting === null || meeting === void 0 ? void 0 : meeting.isJoined()) && _this3.isJoinPracticeSessionDataChannel(); // Skip stale invocations after async refresh to avoid reconnecting a session
303
385
  // that was already updated/cleaned by a newer state transition.
304
386
  if (!(invocationSequence !== _this3._updatePSDataChannelSequence || !isStillPracticeSession || !latestPracticeSessionDatachannelUrl || latestPracticeSessionDatachannelUrl !== practiceSessionDatachannelUrl)) {
305
- _context3.next = 8;
387
+ _context3.next = 9;
306
388
  break;
307
389
  }
308
390
  return _context3.abrupt("return", undefined);
309
- case 8:
391
+ case 9:
310
392
  if (refreshedPracticeSessionToken) {
311
393
  practiceSessionDatachannelToken = refreshedPracticeSessionToken;
312
394
  }
395
+ _this3$webex$internal2 = _this3.webex.internal.llm.resolveSessionOwnership(_this3.meetingId, _constants.LLM_PRACTICE_SESSION), currentOwnerBeforeConnect = _this3$webex$internal2.currentOwner, isOwnerBeforeConnect = _this3$webex$internal2.isOwner;
396
+ if (isOwnerBeforeConnect) {
397
+ _context3.next = 10;
398
+ break;
399
+ }
400
+ _loggerProxy.default.logger.info("Webinar:index#updatePSDataChannel --> skipping pre-connect owner write; practice-session LLM owned by meeting ".concat(currentOwnerBeforeConnect, ", not ").concat(_this3.meetingId));
401
+ return _context3.abrupt("return", undefined);
402
+ case 10:
403
+ // Ensure refresh for practice datachannel requests is routed to this
404
+ // meeting only when we are actually about to connect the practice session.
405
+ // This avoids claiming ownership in flows that return early (e.g. missing
406
+ // practiceSessionDatachannelUrl or waiting for default session online).
407
+ // @ts-ignore - Fix type
408
+ _this3.webex.internal.llm.setRefreshHandler(function () {
409
+ return meeting.refreshDataChannelToken();
410
+ }, _constants.LLM_PRACTICE_SESSION, _this3.meetingId);
411
+ // @ts-ignore - Fix type
412
+ (_this3$webex$internal3 = (_this3$webex$internal4 = _this3.webex.internal.llm).setOwnerMeetingId) === null || _this3$webex$internal3 === void 0 ? void 0 : _this3$webex$internal3.call(_this3$webex$internal4, _this3.meetingId, _constants.LLM_PRACTICE_SESSION);
313
413
 
314
414
  // @ts-ignore - Fix type
315
415
  return _context3.abrupt("return", _this3.webex.internal.llm.registerAndConnect(url, practiceSessionDatachannelUrl, practiceSessionDatachannelToken, _constants.LLM_PRACTICE_SESSION).then(function (registerAndConnectResult) {
316
- var _this3$webex$internal, _this3$webex$internal2;
317
- // @ts-ignore - Fix type
318
- _this3.webex.internal.llm.off("event:relay.event:".concat(_constants.LLM_PRACTICE_SESSION), meeting === null || meeting === void 0 ? void 0 : meeting.processRelayEvent);
319
- // @ts-ignore - Fix type
320
- _this3.webex.internal.llm.on("event:relay.event:".concat(_constants.LLM_PRACTICE_SESSION), meeting === null || meeting === void 0 ? void 0 : meeting.processRelayEvent);
416
+ var _this3$webex$internal8, _this3$webex$internal9;
417
+ var _this3$webex$internal5 = _this3.webex.internal.llm.resolveSessionOwnership(_this3.meetingId, _constants.LLM_PRACTICE_SESSION),
418
+ currentOwnerAfterConnect = _this3$webex$internal5.currentOwner,
419
+ isOwnerAfterConnect = _this3$webex$internal5.isOwner;
420
+ if (_this3.meetingId && isOwnerAfterConnect) {
421
+ var _this3$webex$internal6, _this3$webex$internal7;
422
+ // @ts-ignore - Fix type
423
+ (_this3$webex$internal6 = (_this3$webex$internal7 = _this3.webex.internal.llm).setOwnerMeetingId) === null || _this3$webex$internal6 === void 0 ? void 0 : _this3$webex$internal6.call(_this3$webex$internal7, _this3.meetingId, _constants.LLM_PRACTICE_SESSION);
424
+ } else {
425
+ _loggerProxy.default.logger.info("Webinar:index#updatePSDataChannel --> skipping post-connect owner write; practice-session LLM owned by meeting ".concat(currentOwnerAfterConnect, ", not ").concat(_this3.meetingId));
426
+ }
427
+
428
+ // Track the exact listener references so cleanupPSDataChannel can
429
+ // unsubscribe deterministically, even if the meeting can no longer
430
+ // be resolved at cleanup time.
431
+ for (var _i2 = 0, _PS_LLM_EVENTS2 = PS_LLM_EVENTS; _i2 < _PS_LLM_EVENTS2.length; _i2++) {
432
+ var _PS_LLM_EVENTS2$_i = _PS_LLM_EVENTS2[_i2],
433
+ event = _PS_LLM_EVENTS2$_i.event,
434
+ listenerKey = _PS_LLM_EVENTS2$_i.listenerKey,
435
+ handlerKey = _PS_LLM_EVENTS2$_i.handlerKey;
436
+ if (_this3.llmListeners[listenerKey]) {
437
+ // @ts-ignore - Fix type
438
+ _this3.webex.internal.llm.off(event, _this3.llmListeners[listenerKey]);
439
+ }
440
+ _this3.llmListeners[listenerKey] = meeting === null || meeting === void 0 ? void 0 : meeting[handlerKey];
441
+ // @ts-ignore - Fix type
442
+ _this3.webex.internal.llm.on(event, _this3.llmListeners[listenerKey]);
443
+ }
321
444
  // @ts-ignore - Fix type
322
- (_this3$webex$internal = _this3.webex.internal.voicea) === null || _this3$webex$internal === void 0 ? void 0 : (_this3$webex$internal2 = _this3$webex$internal.announce) === null || _this3$webex$internal2 === void 0 ? void 0 : _this3$webex$internal2.call(_this3$webex$internal);
445
+ (_this3$webex$internal8 = _this3.webex.internal.voicea) === null || _this3$webex$internal8 === void 0 ? void 0 : (_this3$webex$internal9 = _this3$webex$internal8.announce) === null || _this3$webex$internal9 === void 0 ? void 0 : _this3$webex$internal9.call(_this3$webex$internal8);
323
446
  if (isCaptionBoxOn) {
324
447
  _this3.webex.internal.voicea.updateSubchannelSubscriptions({
325
448
  subscribe: ['transcription']
@@ -327,8 +450,20 @@ var Webinar = _webexCore.WebexPlugin.extend({
327
450
  }
328
451
  _loggerProxy.default.logger.info("Webinar:index#updatePSDataChannel --> enabled to receive relay events for default session for ".concat(_constants.LLM_PRACTICE_SESSION, "!"));
329
452
  return _promise.default.resolve(registerAndConnectResult);
453
+ }).catch(function (error) {
454
+ var _this3$webex$internal0 = _this3.webex.internal.llm.resolveSessionOwnership(_this3.meetingId, _constants.LLM_PRACTICE_SESSION),
455
+ currentOwnerAfterRegisterFailure = _this3$webex$internal0.currentOwner,
456
+ isOwnerAfterRegisterFailure = _this3$webex$internal0.isOwner;
457
+ if (isOwnerAfterRegisterFailure) {
458
+ var _this3$webex$internal1, _this3$webex$internal10;
459
+ // @ts-ignore - Fix type
460
+ (_this3$webex$internal1 = (_this3$webex$internal10 = _this3.webex.internal.llm).setOwnerMeetingId) === null || _this3$webex$internal1 === void 0 ? void 0 : _this3$webex$internal1.call(_this3$webex$internal10, undefined, _constants.LLM_PRACTICE_SESSION);
461
+ } else {
462
+ _loggerProxy.default.logger.info("Webinar:index#updatePSDataChannel --> skipping failure owner release; practice-session LLM owned by meeting ".concat(currentOwnerAfterRegisterFailure, ", not ").concat(_this3.meetingId));
463
+ }
464
+ throw error;
330
465
  }));
331
- case 9:
466
+ case 11:
332
467
  case "end":
333
468
  return _context3.stop();
334
469
  }
@@ -341,6 +476,7 @@ var Webinar = _webexCore.WebexPlugin.extend({
341
476
  * @returns {Promise}
342
477
  */
343
478
  setPracticeSessionState: function setPracticeSessionState(enabled) {
479
+ var meeting = this.getValidatedWebinarMeeting();
344
480
  return this.request({
345
481
  method: _constants.HTTP_VERBS.PATCH,
346
482
  uri: "".concat(this.locusUrl, "/controls"),
@@ -349,6 +485,9 @@ var Webinar = _webexCore.WebexPlugin.extend({
349
485
  enabled: enabled
350
486
  }
351
487
  }
488
+ }).then(function (response) {
489
+ _util.default.updateLocusFromApiResponse(meeting, response);
490
+ return response;
352
491
  }).catch(function (error) {
353
492
  _loggerProxy.default.logger.error('Meeting:webinar#setPracticeSessionState failed', error);
354
493
  throw error;
@@ -372,7 +511,7 @@ var Webinar = _webexCore.WebexPlugin.extend({
372
511
  startWebcast: function startWebcast(meeting, layout) {
373
512
  var _this4 = this;
374
513
  return (0, _asyncToGenerator2.default)(/*#__PURE__*/_regenerator.default.mark(function _callee4() {
375
- var _t2, _t3, _t4, _t5, _t6, _t7, _t8, _t9;
514
+ var _t3, _t4, _t5, _t6, _t7, _t8, _t9, _t0;
376
515
  return _regenerator.default.wrap(function (_context4) {
377
516
  while (1) switch (_context4.prev = _context4.next) {
378
517
  case 0:
@@ -383,20 +522,20 @@ var Webinar = _webexCore.WebexPlugin.extend({
383
522
  _loggerProxy.default.logger.error("Meeting:webinar#startWebcast failed --> meeting parameter : ".concat(meeting));
384
523
  throw new Error('Meeting parameter does not meet expectations');
385
524
  case 1:
386
- _t2 = _this4;
387
- _t3 = _constants.HTTP_VERBS.PUT;
388
- _t4 = "".concat(_this4.webcastInstanceUrl, "/streaming");
389
- _t5 = _defineProperty2.default;
525
+ _t3 = _this4;
526
+ _t4 = _constants.HTTP_VERBS.PUT;
527
+ _t5 = "".concat(_this4.webcastInstanceUrl, "/streaming");
528
+ _t6 = _defineProperty2.default;
390
529
  _context4.next = 2;
391
530
  return _this4.webex.credentials.getUserToken();
392
531
  case 2:
393
- _t6 = _context4.sent;
394
- _t7 = "".concat(_webexCore.config.trackingIdPrefix, "_").concat(_uuid.default.v4().toString());
395
- _t8 = _t5({
396
- authorization: _t6,
397
- trackingId: _t7
532
+ _t7 = _context4.sent;
533
+ _t8 = "".concat(_webexCore.config.trackingIdPrefix, "_").concat(_uuid.default.v4().toString());
534
+ _t9 = _t6({
535
+ authorization: _t7,
536
+ trackingId: _t8
398
537
  }, _constants.HEADERS.CONTENT_TYPE, _constants.HEADERS.CONTENT_TYPE_VALUE.APPLICATION_JSON);
399
- _t9 = {
538
+ _t0 = {
400
539
  action: 'start',
401
540
  meetingInfo: {
402
541
  locusId: meeting.locusId,
@@ -404,11 +543,11 @@ var Webinar = _webexCore.WebexPlugin.extend({
404
543
  },
405
544
  layout: layout
406
545
  };
407
- return _context4.abrupt("return", _t2.request.call(_t2, {
408
- method: _t3,
409
- uri: _t4,
410
- headers: _t8,
411
- body: _t9
546
+ return _context4.abrupt("return", _t3.request.call(_t3, {
547
+ method: _t4,
548
+ uri: _t5,
549
+ headers: _t9,
550
+ body: _t0
412
551
  }).catch(function (error) {
413
552
  _loggerProxy.default.logger.error('Meeting:webinar#startWebcast failed', error);
414
553
  throw error;
@@ -427,31 +566,31 @@ var Webinar = _webexCore.WebexPlugin.extend({
427
566
  stopWebcast: function stopWebcast() {
428
567
  var _this5 = this;
429
568
  return (0, _asyncToGenerator2.default)(/*#__PURE__*/_regenerator.default.mark(function _callee5() {
430
- var _t0, _t1, _t10, _t11, _t12, _t13, _t14, _t15;
569
+ var _t1, _t10, _t11, _t12, _t13, _t14, _t15, _t16;
431
570
  return _regenerator.default.wrap(function (_context5) {
432
571
  while (1) switch (_context5.prev = _context5.next) {
433
572
  case 0:
434
- _t0 = _this5;
435
- _t1 = _constants.HTTP_VERBS.PUT;
436
- _t10 = "".concat(_this5.webcastInstanceUrl, "/streaming");
437
- _t11 = _defineProperty2.default;
573
+ _t1 = _this5;
574
+ _t10 = _constants.HTTP_VERBS.PUT;
575
+ _t11 = "".concat(_this5.webcastInstanceUrl, "/streaming");
576
+ _t12 = _defineProperty2.default;
438
577
  _context5.next = 1;
439
578
  return _this5.webex.credentials.getUserToken();
440
579
  case 1:
441
- _t12 = _context5.sent;
442
- _t13 = "".concat(_webexCore.config.trackingIdPrefix, "_").concat(_uuid.default.v4().toString());
443
- _t14 = _t11({
444
- authorization: _t12,
445
- trackingId: _t13
580
+ _t13 = _context5.sent;
581
+ _t14 = "".concat(_webexCore.config.trackingIdPrefix, "_").concat(_uuid.default.v4().toString());
582
+ _t15 = _t12({
583
+ authorization: _t13,
584
+ trackingId: _t14
446
585
  }, _constants.HEADERS.CONTENT_TYPE, _constants.HEADERS.CONTENT_TYPE_VALUE.APPLICATION_JSON);
447
- _t15 = {
586
+ _t16 = {
448
587
  action: 'stop'
449
588
  };
450
- return _context5.abrupt("return", _t0.request.call(_t0, {
451
- method: _t1,
452
- uri: _t10,
453
- headers: _t14,
454
- body: _t15
589
+ return _context5.abrupt("return", _t1.request.call(_t1, {
590
+ method: _t10,
591
+ uri: _t11,
592
+ headers: _t15,
593
+ body: _t16
455
594
  }).catch(function (error) {
456
595
  _loggerProxy.default.logger.error('Meeting:webinar#stopWebcast failed', error);
457
596
  throw error;
@@ -470,26 +609,26 @@ var Webinar = _webexCore.WebexPlugin.extend({
470
609
  queryWebcastLayout: function queryWebcastLayout() {
471
610
  var _this6 = this;
472
611
  return (0, _asyncToGenerator2.default)(/*#__PURE__*/_regenerator.default.mark(function _callee6() {
473
- var _t16, _t17, _t18, _t19, _t20, _t21;
612
+ var _t17, _t18, _t19, _t20, _t21, _t22;
474
613
  return _regenerator.default.wrap(function (_context6) {
475
614
  while (1) switch (_context6.prev = _context6.next) {
476
615
  case 0:
477
- _t16 = _this6;
478
- _t17 = _constants.HTTP_VERBS.GET;
479
- _t18 = "".concat(_this6.webcastInstanceUrl, "/layout");
616
+ _t17 = _this6;
617
+ _t18 = _constants.HTTP_VERBS.GET;
618
+ _t19 = "".concat(_this6.webcastInstanceUrl, "/layout");
480
619
  _context6.next = 1;
481
620
  return _this6.webex.credentials.getUserToken();
482
621
  case 1:
483
- _t19 = _context6.sent;
484
- _t20 = "".concat(_webexCore.config.trackingIdPrefix, "_").concat(_uuid.default.v4().toString());
485
- _t21 = {
486
- authorization: _t19,
487
- trackingId: _t20
622
+ _t20 = _context6.sent;
623
+ _t21 = "".concat(_webexCore.config.trackingIdPrefix, "_").concat(_uuid.default.v4().toString());
624
+ _t22 = {
625
+ authorization: _t20,
626
+ trackingId: _t21
488
627
  };
489
- return _context6.abrupt("return", _t16.request.call(_t16, {
490
- method: _t17,
491
- uri: _t18,
492
- headers: _t21
628
+ return _context6.abrupt("return", _t17.request.call(_t17, {
629
+ method: _t18,
630
+ uri: _t19,
631
+ headers: _t22
493
632
  }).catch(function (error) {
494
633
  _loggerProxy.default.logger.error('Meeting:webinar#queryWebcastLayout failed', error);
495
634
  throw error;
@@ -509,34 +648,34 @@ var Webinar = _webexCore.WebexPlugin.extend({
509
648
  updateWebcastLayout: function updateWebcastLayout(layout) {
510
649
  var _this7 = this;
511
650
  return (0, _asyncToGenerator2.default)(/*#__PURE__*/_regenerator.default.mark(function _callee7() {
512
- var _t22, _t23, _t24, _t25, _t26, _t27, _t28, _t29;
651
+ var _t23, _t24, _t25, _t26, _t27, _t28, _t29, _t30;
513
652
  return _regenerator.default.wrap(function (_context7) {
514
653
  while (1) switch (_context7.prev = _context7.next) {
515
654
  case 0:
516
- _t22 = _this7;
517
- _t23 = _constants.HTTP_VERBS.PUT;
518
- _t24 = "".concat(_this7.webcastInstanceUrl, "/layout");
519
- _t25 = _defineProperty2.default;
655
+ _t23 = _this7;
656
+ _t24 = _constants.HTTP_VERBS.PUT;
657
+ _t25 = "".concat(_this7.webcastInstanceUrl, "/layout");
658
+ _t26 = _defineProperty2.default;
520
659
  _context7.next = 1;
521
660
  return _this7.webex.credentials.getUserToken();
522
661
  case 1:
523
- _t26 = _context7.sent;
524
- _t27 = "".concat(_webexCore.config.trackingIdPrefix, "_").concat(_uuid.default.v4().toString());
525
- _t28 = _t25({
526
- authorization: _t26,
527
- trackingId: _t27
662
+ _t27 = _context7.sent;
663
+ _t28 = "".concat(_webexCore.config.trackingIdPrefix, "_").concat(_uuid.default.v4().toString());
664
+ _t29 = _t26({
665
+ authorization: _t27,
666
+ trackingId: _t28
528
667
  }, _constants.HEADERS.CONTENT_TYPE, _constants.HEADERS.CONTENT_TYPE_VALUE.APPLICATION_JSON);
529
- _t29 = {
668
+ _t30 = {
530
669
  videoLayout: layout.videoLayout,
531
670
  contentLayout: layout.contentLayout,
532
671
  syncStageLayout: layout.syncStageLayout,
533
672
  syncStageInMeeting: layout.syncStageInMeeting
534
673
  };
535
- return _context7.abrupt("return", _t22.request.call(_t22, {
536
- method: _t23,
537
- uri: _t24,
538
- headers: _t28,
539
- body: _t29
674
+ return _context7.abrupt("return", _t23.request.call(_t23, {
675
+ method: _t24,
676
+ uri: _t25,
677
+ headers: _t29,
678
+ body: _t30
540
679
  }).catch(function (error) {
541
680
  _loggerProxy.default.logger.error('Meeting:webinar#updateWebcastLayout failed', error);
542
681
  throw error;
@@ -555,26 +694,26 @@ var Webinar = _webexCore.WebexPlugin.extend({
555
694
  viewAllWebcastAttendees: function viewAllWebcastAttendees() {
556
695
  var _this8 = this;
557
696
  return (0, _asyncToGenerator2.default)(/*#__PURE__*/_regenerator.default.mark(function _callee8() {
558
- var _t30, _t31, _t32, _t33, _t34, _t35;
697
+ var _t31, _t32, _t33, _t34, _t35, _t36;
559
698
  return _regenerator.default.wrap(function (_context8) {
560
699
  while (1) switch (_context8.prev = _context8.next) {
561
700
  case 0:
562
- _t30 = _this8;
563
- _t31 = _constants.HTTP_VERBS.GET;
564
- _t32 = "".concat(_this8.webcastInstanceUrl, "/attendees");
701
+ _t31 = _this8;
702
+ _t32 = _constants.HTTP_VERBS.GET;
703
+ _t33 = "".concat(_this8.webcastInstanceUrl, "/attendees");
565
704
  _context8.next = 1;
566
705
  return _this8.webex.credentials.getUserToken();
567
706
  case 1:
568
- _t33 = _context8.sent;
569
- _t34 = "".concat(_webexCore.config.trackingIdPrefix, "_").concat(_uuid.default.v4().toString());
570
- _t35 = {
571
- authorization: _t33,
572
- trackingId: _t34
707
+ _t34 = _context8.sent;
708
+ _t35 = "".concat(_webexCore.config.trackingIdPrefix, "_").concat(_uuid.default.v4().toString());
709
+ _t36 = {
710
+ authorization: _t34,
711
+ trackingId: _t35
573
712
  };
574
- return _context8.abrupt("return", _t30.request.call(_t30, {
575
- method: _t31,
576
- uri: _t32,
577
- headers: _t35
713
+ return _context8.abrupt("return", _t31.request.call(_t31, {
714
+ method: _t32,
715
+ uri: _t33,
716
+ headers: _t36
578
717
  }).catch(function (error) {
579
718
  _loggerProxy.default.logger.error('Meeting:webinar#viewAllWebcastAttendees failed', error);
580
719
  throw error;
@@ -595,27 +734,27 @@ var Webinar = _webexCore.WebexPlugin.extend({
595
734
  var _arguments = arguments,
596
735
  _this9 = this;
597
736
  return (0, _asyncToGenerator2.default)(/*#__PURE__*/_regenerator.default.mark(function _callee9() {
598
- var queryString, _t36, _t37, _t38, _t39, _t40, _t41;
737
+ var queryString, _t37, _t38, _t39, _t40, _t41, _t42;
599
738
  return _regenerator.default.wrap(function (_context9) {
600
739
  while (1) switch (_context9.prev = _context9.next) {
601
740
  case 0:
602
741
  queryString = _arguments.length > 0 && _arguments[0] !== undefined ? _arguments[0] : '';
603
- _t36 = _this9;
604
- _t37 = _constants.HTTP_VERBS.GET;
605
- _t38 = "".concat(_this9.webcastInstanceUrl, "/attendees?keyword=").concat(encodeURIComponent(queryString));
742
+ _t37 = _this9;
743
+ _t38 = _constants.HTTP_VERBS.GET;
744
+ _t39 = "".concat(_this9.webcastInstanceUrl, "/attendees?keyword=").concat(encodeURIComponent(queryString));
606
745
  _context9.next = 1;
607
746
  return _this9.webex.credentials.getUserToken();
608
747
  case 1:
609
- _t39 = _context9.sent;
610
- _t40 = "".concat(_webexCore.config.trackingIdPrefix, "_").concat(_uuid.default.v4().toString());
611
- _t41 = {
612
- authorization: _t39,
613
- trackingId: _t40
748
+ _t40 = _context9.sent;
749
+ _t41 = "".concat(_webexCore.config.trackingIdPrefix, "_").concat(_uuid.default.v4().toString());
750
+ _t42 = {
751
+ authorization: _t40,
752
+ trackingId: _t41
614
753
  };
615
- return _context9.abrupt("return", _t36.request.call(_t36, {
616
- method: _t37,
617
- uri: _t38,
618
- headers: _t41
754
+ return _context9.abrupt("return", _t37.request.call(_t37, {
755
+ method: _t38,
756
+ uri: _t39,
757
+ headers: _t42
619
758
  }).catch(function (error) {
620
759
  _loggerProxy.default.logger.error('Meeting:webinar#searchWebcastAttendees failed', error);
621
760
  throw error;
@@ -635,26 +774,26 @@ var Webinar = _webexCore.WebexPlugin.extend({
635
774
  expelWebcastAttendee: function expelWebcastAttendee(participantId) {
636
775
  var _this0 = this;
637
776
  return (0, _asyncToGenerator2.default)(/*#__PURE__*/_regenerator.default.mark(function _callee0() {
638
- var _t42, _t43, _t44, _t45, _t46, _t47;
777
+ var _t43, _t44, _t45, _t46, _t47, _t48;
639
778
  return _regenerator.default.wrap(function (_context0) {
640
779
  while (1) switch (_context0.prev = _context0.next) {
641
780
  case 0:
642
- _t42 = _this0;
643
- _t43 = _constants.HTTP_VERBS.DELETE;
644
- _t44 = "".concat(_this0.webcastInstanceUrl, "/attendees/").concat(participantId);
781
+ _t43 = _this0;
782
+ _t44 = _constants.HTTP_VERBS.DELETE;
783
+ _t45 = "".concat(_this0.webcastInstanceUrl, "/attendees/").concat(participantId);
645
784
  _context0.next = 1;
646
785
  return _this0.webex.credentials.getUserToken();
647
786
  case 1:
648
- _t45 = _context0.sent;
649
- _t46 = "".concat(_webexCore.config.trackingIdPrefix, "_").concat(_uuid.default.v4().toString());
650
- _t47 = {
651
- authorization: _t45,
652
- trackingId: _t46
787
+ _t46 = _context0.sent;
788
+ _t47 = "".concat(_webexCore.config.trackingIdPrefix, "_").concat(_uuid.default.v4().toString());
789
+ _t48 = {
790
+ authorization: _t46,
791
+ trackingId: _t47
653
792
  };
654
- return _context0.abrupt("return", _t42.request.call(_t42, {
655
- method: _t43,
656
- uri: _t44,
657
- headers: _t47
793
+ return _context0.abrupt("return", _t43.request.call(_t43, {
794
+ method: _t44,
795
+ uri: _t45,
796
+ headers: _t48
658
797
  }).catch(function (error) {
659
798
  _loggerProxy.default.logger.error('Meeting:webinar#expelWebcastAttendee failed', error);
660
799
  throw error;
@@ -678,11 +817,18 @@ var Webinar = _webexCore.WebexPlugin.extend({
678
817
  var _this1 = this;
679
818
  return (0, _asyncToGenerator2.default)(/*#__PURE__*/_regenerator.default.mark(function _callee1() {
680
819
  var _payload$limit, _meeting$locusInfo3, _meeting$locusInfo3$l, _meeting$locusInfo3$l2, _meeting$locusInfo3$l3;
681
- var meeting, rawParams, attendeeSearchUrl, _t48, _t49, _t50, _t51, _t52, _t53;
820
+ var meeting, rawParams, attendeeSearchUrl, _t49, _t50, _t51, _t52, _t53, _t54;
682
821
  return _regenerator.default.wrap(function (_context1) {
683
822
  while (1) switch (_context1.prev = _context1.next) {
684
823
  case 0:
685
- meeting = _this1.webex.meetings.getMeetingByType(_constants._ID_, _this1.meetingId);
824
+ meeting = _this1.getValidatedWebinarMeeting();
825
+ if (meeting) {
826
+ _context1.next = 1;
827
+ break;
828
+ }
829
+ _loggerProxy.default.logger.error('Meeting:webinar5k#searchLargeScaleWebinarAttendees failed --> webinar meeting could not be validated');
830
+ throw new Error('Meeting:webinar5k#Webinar meeting is not resolvable for the current locus');
831
+ case 1:
686
832
  rawParams = {
687
833
  search_text: payload === null || payload === void 0 ? void 0 : payload.queryString,
688
834
  limit: (_payload$limit = payload === null || payload === void 0 ? void 0 : payload.limit) !== null && _payload$limit !== void 0 ? _payload$limit : _constants.DEFAULT_LARGE_SCALE_WEBINAR_ATTENDEE_SEARCH_LIMIT,
@@ -690,40 +836,40 @@ var Webinar = _webexCore.WebexPlugin.extend({
690
836
  };
691
837
  attendeeSearchUrl = meeting === null || meeting === void 0 ? void 0 : (_meeting$locusInfo3 = meeting.locusInfo) === null || _meeting$locusInfo3 === void 0 ? void 0 : (_meeting$locusInfo3$l = _meeting$locusInfo3.links) === null || _meeting$locusInfo3$l === void 0 ? void 0 : (_meeting$locusInfo3$l2 = _meeting$locusInfo3$l.resources) === null || _meeting$locusInfo3$l2 === void 0 ? void 0 : (_meeting$locusInfo3$l3 = _meeting$locusInfo3$l2.attendeeSearch) === null || _meeting$locusInfo3$l3 === void 0 ? void 0 : _meeting$locusInfo3$l3.url;
692
838
  if (attendeeSearchUrl) {
693
- _context1.next = 1;
839
+ _context1.next = 2;
694
840
  break;
695
841
  }
696
- _loggerProxy.default.logger.error("Meeting:webinar5k#searchLargeScaleWebinarAttendees failed");
842
+ _loggerProxy.default.logger.error('Meeting:webinar5k#searchLargeScaleWebinarAttendees failed --> attendee search url unavailable');
697
843
  throw new Error('Meeting:webinar5k#Attendee search url is not available');
698
- case 1:
699
- _t48 = _this1;
700
- _t49 = _constants.HTTP_VERBS.GET;
701
- _t50 = "".concat(attendeeSearchUrl, "?").concat(new URLSearchParams((0, _utils.sanitizeParams)(rawParams)).toString());
702
- _context1.next = 2;
703
- return _this1.webex.credentials.getUserToken();
704
844
  case 2:
705
- _t51 = _context1.sent;
706
- _t52 = "".concat(_webexCore.config.trackingIdPrefix, "_").concat(_uuid.default.v4().toString());
707
- _t53 = {
708
- authorization: _t51,
709
- trackingId: _t52
845
+ _t49 = _this1;
846
+ _t50 = _constants.HTTP_VERBS.GET;
847
+ _t51 = "".concat(attendeeSearchUrl, "?").concat(new URLSearchParams((0, _utils.sanitizeParams)(rawParams)).toString());
848
+ _context1.next = 3;
849
+ return _this1.webex.credentials.getUserToken();
850
+ case 3:
851
+ _t52 = _context1.sent;
852
+ _t53 = "".concat(_webexCore.config.trackingIdPrefix, "_").concat(_uuid.default.v4().toString());
853
+ _t54 = {
854
+ authorization: _t52,
855
+ trackingId: _t53
710
856
  };
711
- return _context1.abrupt("return", _t48.request.call(_t48, {
712
- method: _t49,
713
- uri: _t50,
714
- headers: _t53
857
+ return _context1.abrupt("return", _t49.request.call(_t49, {
858
+ method: _t50,
859
+ uri: _t51,
860
+ headers: _t54
715
861
  }).catch(function (error) {
716
862
  _loggerProxy.default.logger.error('Meeting:webinar5k#searchLargeScaleWebinarAttendees failed', error);
717
863
  throw error;
718
864
  }));
719
- case 3:
865
+ case 4:
720
866
  case "end":
721
867
  return _context1.stop();
722
868
  }
723
869
  }, _callee1);
724
870
  }))();
725
871
  },
726
- version: "3.12.0-next.7"
872
+ version: "3.12.0-next.70"
727
873
  });
728
874
  var _default = exports.default = Webinar;
729
875
  //# sourceMappingURL=index.js.map