@webex/plugin-meetings 3.12.0-next.64 → 3.12.0-next.65

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.
@@ -191,7 +191,7 @@ var AIEnableRequest = _webexCore.WebexPlugin.extend({
191
191
  method: _constants.HTTP_VERBS.PUT
192
192
  });
193
193
  },
194
- version: "3.12.0-next.64"
194
+ version: "3.12.0-next.65"
195
195
  });
196
196
  var _default = exports.default = AIEnableRequest;
197
197
  //# sourceMappingURL=index.js.map
@@ -214,7 +214,7 @@ var Breakout = _webexCore.WebexPlugin.extend({
214
214
  sessionId: this.sessionId
215
215
  });
216
216
  },
217
- version: "3.12.0-next.64"
217
+ version: "3.12.0-next.65"
218
218
  });
219
219
  var _default = exports.default = Breakout;
220
220
  //# sourceMappingURL=breakout.js.map
@@ -1133,7 +1133,7 @@ var Breakouts = _webexCore.WebexPlugin.extend({
1133
1133
  this.trigger(_constants.BREAKOUTS.EVENTS.ASK_RETURN_TO_MAIN);
1134
1134
  }
1135
1135
  },
1136
- version: "3.12.0-next.64"
1136
+ version: "3.12.0-next.65"
1137
1137
  });
1138
1138
  var _default = exports.default = Breakouts;
1139
1139
  //# sourceMappingURL=index.js.map
@@ -381,7 +381,7 @@ var SimultaneousInterpretation = _webexCore.WebexPlugin.extend({
381
381
  throw error;
382
382
  });
383
383
  },
384
- version: "3.12.0-next.64"
384
+ version: "3.12.0-next.65"
385
385
  });
386
386
  var _default = exports.default = SimultaneousInterpretation;
387
387
  //# sourceMappingURL=index.js.map
@@ -18,7 +18,7 @@ var SILanguage = _webexCore.WebexPlugin.extend({
18
18
  languageCode: 'number',
19
19
  languageName: 'string'
20
20
  },
21
- version: "3.12.0-next.64"
21
+ version: "3.12.0-next.65"
22
22
  });
23
23
  var _default = exports.default = SILanguage;
24
24
  //# sourceMappingURL=siLanguage.js.map
@@ -23,6 +23,16 @@ var _utils = require("./utils");
23
23
  * Copyright (c) 2015-2023 Cisco Systems, Inc. See LICENSE file.
24
24
  */
25
25
 
26
+ var PS_LLM_EVENTS = [{
27
+ event: "event:relay.event:".concat(_constants.LLM_PRACTICE_SESSION),
28
+ listenerKey: 'relay',
29
+ handlerKey: 'processRelayEvent'
30
+ }, {
31
+ event: "".concat(_constants.LOCUS_LLM_EVENT, ":").concat(_constants.LLM_PRACTICE_SESSION),
32
+ listenerKey: 'locusLLM',
33
+ handlerKey: 'processLocusLLMEvent'
34
+ }];
35
+
26
36
  /**
27
37
  * @class Webinar
28
38
  */
@@ -160,9 +170,11 @@ var Webinar = _webexCore.WebexPlugin.extend({
160
170
  cleanupPSDataChannel: function cleanupPSDataChannel() {
161
171
  var _this = this;
162
172
  return (0, _asyncToGenerator2.default)(/*#__PURE__*/_regenerator.default.mark(function _callee() {
173
+ var _i, _PS_LLM_EVENTS, _PS_LLM_EVENTS$_i, event, listenerKey;
163
174
  return _regenerator.default.wrap(function (_context) {
164
175
  while (1) switch (_context.prev = _context.next) {
165
176
  case 0:
177
+ _this.llmListeners = _this.llmListeners || {};
166
178
  if (_this._pendingOnlineListener) {
167
179
  // @ts-ignore - Fix type
168
180
  _this.webex.internal.llm.off('online', _this._pendingOnlineListener);
@@ -176,10 +188,13 @@ var Webinar = _webexCore.WebexPlugin.extend({
176
188
  reason: 'done (permanent)'
177
189
  }, _constants.LLM_PRACTICE_SESSION);
178
190
  case 1:
179
- if (_this._practiceSessionRelayListener) {
180
- // @ts-ignore - Fix type
181
- _this.webex.internal.llm.off("event:relay.event:".concat(_constants.LLM_PRACTICE_SESSION), _this._practiceSessionRelayListener);
182
- _this._practiceSessionRelayListener = null;
191
+ for (_i = 0, _PS_LLM_EVENTS = PS_LLM_EVENTS; _i < _PS_LLM_EVENTS.length; _i++) {
192
+ _PS_LLM_EVENTS$_i = _PS_LLM_EVENTS[_i], event = _PS_LLM_EVENTS$_i.event, listenerKey = _PS_LLM_EVENTS$_i.listenerKey;
193
+ if (_this.llmListeners[listenerKey]) {
194
+ // @ts-ignore - Fix type
195
+ _this.webex.internal.llm.off(event, _this.llmListeners[listenerKey]);
196
+ _this.llmListeners[listenerKey] = null;
197
+ }
183
198
  }
184
199
  case 2:
185
200
  case "end":
@@ -259,6 +274,7 @@ var Webinar = _webexCore.WebexPlugin.extend({
259
274
  return _regenerator.default.wrap(function (_context3) {
260
275
  while (1) switch (_context3.prev = _context3.next) {
261
276
  case 0:
277
+ _this3.llmListeners = _this3.llmListeners || {};
262
278
  _this3._updatePSDataChannelSequence = (_this3._updatePSDataChannelSequence || 0) + 1;
263
279
  invocationSequence = _this3._updatePSDataChannelSequence;
264
280
  meeting = _this3.getValidatedWebinarMeeting();
@@ -348,16 +364,22 @@ var Webinar = _webexCore.WebexPlugin.extend({
348
364
  // @ts-ignore - Fix type
349
365
  return _context3.abrupt("return", _this3.webex.internal.llm.registerAndConnect(url, practiceSessionDatachannelUrl, practiceSessionDatachannelToken, _constants.LLM_PRACTICE_SESSION).then(function (registerAndConnectResult) {
350
366
  var _this3$webex$internal, _this3$webex$internal2;
351
- // Track the exact listener reference so cleanupPSDataChannel can
367
+ // Track the exact listener references so cleanupPSDataChannel can
352
368
  // unsubscribe deterministically, even if the meeting can no longer
353
369
  // be resolved at cleanup time.
354
- if (_this3._practiceSessionRelayListener) {
370
+ for (var _i2 = 0, _PS_LLM_EVENTS2 = PS_LLM_EVENTS; _i2 < _PS_LLM_EVENTS2.length; _i2++) {
371
+ var _PS_LLM_EVENTS2$_i = _PS_LLM_EVENTS2[_i2],
372
+ event = _PS_LLM_EVENTS2$_i.event,
373
+ listenerKey = _PS_LLM_EVENTS2$_i.listenerKey,
374
+ handlerKey = _PS_LLM_EVENTS2$_i.handlerKey;
375
+ if (_this3.llmListeners[listenerKey]) {
376
+ // @ts-ignore - Fix type
377
+ _this3.webex.internal.llm.off(event, _this3.llmListeners[listenerKey]);
378
+ }
379
+ _this3.llmListeners[listenerKey] = meeting === null || meeting === void 0 ? void 0 : meeting[handlerKey];
355
380
  // @ts-ignore - Fix type
356
- _this3.webex.internal.llm.off("event:relay.event:".concat(_constants.LLM_PRACTICE_SESSION), _this3._practiceSessionRelayListener);
381
+ _this3.webex.internal.llm.on(event, _this3.llmListeners[listenerKey]);
357
382
  }
358
- _this3._practiceSessionRelayListener = meeting === null || meeting === void 0 ? void 0 : meeting.processRelayEvent;
359
- // @ts-ignore - Fix type
360
- _this3.webex.internal.llm.on("event:relay.event:".concat(_constants.LLM_PRACTICE_SESSION), _this3._practiceSessionRelayListener);
361
383
  // @ts-ignore - Fix type
362
384
  (_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);
363
385
  if (isCaptionBoxOn) {
@@ -774,7 +796,7 @@ var Webinar = _webexCore.WebexPlugin.extend({
774
796
  }, _callee1);
775
797
  }))();
776
798
  },
777
- version: "3.12.0-next.64"
799
+ version: "3.12.0-next.65"
778
800
  });
779
801
  var _default = exports.default = Webinar;
780
802
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["_webexCore","require","_uuid","_interopRequireDefault","_lodash","_internalPluginLlm","_constants","_collection","_loggerProxy","_util","_utils","Webinar","WebexPlugin","extend","namespace","MEETINGS","collections","webinar","WebinarCollection","props","locusUrl","webcastInstanceUrl","canManageWebcast","selfIsPanelist","selfIsAttendee","practiceSessionEnabled","meetingId","cleanUp","cleanupPSDataChannel","locusUrlUpdate","set","updateWebcastUrl","payload","get","updateCanManageWebcast","updateRoleChanged","oldRoles","newRoles","isPromoted","includes","SELF_ROLES","ATTENDEE","PANELIST","isDemoted","MODERATOR","updateStatusByRole","getValidatedWebinarMeeting","meeting","webex","meetings","getMeetingByType","_ID_","undefined","LoggerProxy","logger","warn","concat","_ref","shareStatus","SHARE_STATUS","WHITEBOARD_SHARE_ACTIVE","_meeting$locusInfo","_meeting$locusInfo2","locusInfo","updateMediaShares","mediaShares","updatePSDataChannel","isJoinPracticeSessionDataChannel","_this","_asyncToGenerator2","default","_regenerator","mark","_callee","wrap","_context","prev","next","_pendingOnlineListener","internal","llm","off","disconnectLLM","code","reason","LLM_PRACTICE_SESSION","_practiceSessionRelayListener","stop","ensurePracticeSessionDatachannelToken","_this2","_callee2","isDataChannelTokenEnabled","cachedToken","_refreshResponse$body","refreshResponse","_ref2","datachannelToken","dataChannelTokenType","_t","_context2","sent","abrupt","getDatachannelToken","DataChannelTokenType","PracticeSession","refreshDataChannelToken","body","setDatachannelToken","message","String","_this3","_callee3","invocationSequence","isPracticeSession","_ref3","_ref3$url","url","_ref3$info","_ref3$info2","_ref3$info2$practiceS","practiceSessionDatachannelUrl","practiceSessionDatachannelToken","isCaptionBoxOn","_onDefaultSessionConnected","refreshedPracticeSessionToken","latestPracticeSessionDatachannelUrl","isStillPracticeSession","_context3","_updatePSDataChannelSequence","isJoined","info","voicea","getIsCaptionBoxOn","isConnected","getLocusUrl","getDatachannelUrl","onDefaultSessionConnected","on","registerAndConnect","then","registerAndConnectResult","_this3$webex$internal","_this3$webex$internal2","processRelayEvent","announce","call","updateSubchannelSubscriptions","subscribe","_promise","resolve","setPracticeSessionState","enabled","request","method","HTTP_VERBS","PATCH","uri","practiceSession","response","MeetingUtil","updateLocusFromApiResponse","catch","error","updatePracticeSessionStatus","startWebcast","layout","_this4","_callee4","_t2","_t3","_t4","_t5","_t6","_t7","_t8","_t9","_context4","Error","PUT","_defineProperty2","credentials","getUserToken","config","trackingIdPrefix","uuid","v4","toString","authorization","trackingId","HEADERS","CONTENT_TYPE","CONTENT_TYPE_VALUE","APPLICATION_JSON","action","meetingInfo","locusId","correlationId","headers","stopWebcast","_this5","_callee5","_t0","_t1","_t10","_t11","_t12","_t13","_t14","_t15","_context5","queryWebcastLayout","_this6","_callee6","_t16","_t17","_t18","_t19","_t20","_t21","_context6","GET","updateWebcastLayout","_this7","_callee7","_t22","_t23","_t24","_t25","_t26","_t27","_t28","_t29","_context7","videoLayout","contentLayout","syncStageLayout","syncStageInMeeting","viewAllWebcastAttendees","_this8","_callee8","_t30","_t31","_t32","_t33","_t34","_t35","_context8","searchWebcastAttendees","_arguments","arguments","_this9","_callee9","queryString","_t36","_t37","_t38","_t39","_t40","_t41","_context9","length","encodeURIComponent","expelWebcastAttendee","participantId","_this0","_callee0","_t42","_t43","_t44","_t45","_t46","_t47","_context0","DELETE","searchLargeScaleWebinarAttendees","_this1","_callee1","_payload$limit","_meeting$locusInfo3","_meeting$locusInfo3$l","_meeting$locusInfo3$l2","_meeting$locusInfo3$l3","rawParams","attendeeSearchUrl","_t48","_t49","_t50","_t51","_t52","_t53","_context1","search_text","limit","DEFAULT_LARGE_SCALE_WEBINAR_ATTENDEE_SEARCH_LIMIT","links","resources","attendeeSearch","URLSearchParams","sanitizeParams","version","_default","exports"],"sources":["index.ts"],"sourcesContent":["/*!\n * Copyright (c) 2015-2023 Cisco Systems, Inc. See LICENSE file.\n */\nimport {WebexPlugin, config} from '@webex/webex-core';\nimport uuid from 'uuid';\nimport {get} from 'lodash';\nimport {DataChannelTokenType} from '@webex/internal-plugin-llm';\nimport {\n _ID_,\n HEADERS,\n HTTP_VERBS,\n MEETINGS,\n SELF_ROLES,\n SHARE_STATUS,\n DEFAULT_LARGE_SCALE_WEBINAR_ATTENDEE_SEARCH_LIMIT,\n LLM_PRACTICE_SESSION,\n} from '../constants';\n\nimport WebinarCollection from './collection';\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport MeetingUtil from '../meeting/util';\nimport {sanitizeParams} from './utils';\n\n/**\n * @class Webinar\n */\nconst Webinar = WebexPlugin.extend({\n namespace: MEETINGS,\n collections: {\n webinar: WebinarCollection,\n },\n\n props: {\n locusUrl: 'string', // appears current webinar's locus url\n webcastInstanceUrl: 'string', // current webinar's webcast instance url\n canManageWebcast: 'boolean', // appears the ability to manage webcast\n selfIsPanelist: 'boolean', // self is panelist\n selfIsAttendee: 'boolean', // self is attendee\n practiceSessionEnabled: 'boolean', // practice session enabled\n meetingId: 'string',\n },\n\n /**\n * Calls this to clean up listeners\n * @returns {void}\n */\n cleanUp() {\n this.cleanupPSDataChannel();\n },\n\n /**\n * Update the current locus url of the webinar\n * @param {string} locusUrl\n * @returns {void}\n */\n locusUrlUpdate(locusUrl) {\n this.set('locusUrl', locusUrl);\n },\n\n /**\n * Update the current webcast instance url of the meeting\n * @param {object} payload\n * @returns {void}\n */\n updateWebcastUrl(payload) {\n this.set('webcastInstanceUrl', get(payload, 'resources.webcastInstance.url'));\n },\n\n /**\n * Update whether self has capability to manage start/stop webcast (only host can manage it)\n * @param {boolean} canManageWebcast\n * @returns {void}\n */\n updateCanManageWebcast(canManageWebcast) {\n this.set('canManageWebcast', canManageWebcast);\n },\n\n /**\n * Updates user roles and manages associated state transitions\n * @param {object} payload\n * @param {string[]} payload.oldRoles - Previous roles of the user\n * @param {string[]} payload.newRoles - New roles of the user\n * @returns {{isPromoted: boolean, isDemoted: boolean}} Role transition states\n */\n updateRoleChanged(payload) {\n const oldRoles = get(payload, 'oldRoles', []);\n const newRoles = get(payload, 'newRoles', []);\n\n const isPromoted =\n oldRoles.includes(SELF_ROLES.ATTENDEE) && newRoles.includes(SELF_ROLES.PANELIST);\n const isDemoted =\n (oldRoles.includes(SELF_ROLES.PANELIST) && newRoles.includes(SELF_ROLES.ATTENDEE)) ||\n (!oldRoles.includes(SELF_ROLES.ATTENDEE) && newRoles.includes(SELF_ROLES.ATTENDEE)); // for attendee just join meeting case\n this.set('selfIsPanelist', newRoles.includes(SELF_ROLES.PANELIST));\n this.set('selfIsAttendee', newRoles.includes(SELF_ROLES.ATTENDEE));\n this.updateCanManageWebcast(newRoles.includes(SELF_ROLES.MODERATOR));\n this.updateStatusByRole({isPromoted, isDemoted});\n\n return {isPromoted, isDemoted};\n },\n\n /**\n * Resolves the meeting associated with this webinar instance, guarded against the\n * meetingId pointer drifting onto an unrelated transient meeting (e.g. an inbound\n * 1:1 call) that may exist in the meeting collection. Returns the meeting only when\n * its locusUrl matches this webinar's tracked locusUrl. Returns undefined (with a\n * warning) when the meeting cannot be resolved or when the webinar's locusUrl has\n * not been initialized yet — callers must treat this as \"no owned meeting\" rather\n * than fall through to an unvalidated lookup.\n * @returns {object|undefined}\n */\n getValidatedWebinarMeeting() {\n const meeting = this.webex.meetings.getMeetingByType(_ID_, this.meetingId);\n\n if (!meeting) {\n return undefined;\n }\n\n if (!this.locusUrl) {\n LoggerProxy.logger.warn(\n `Webinar:index#getValidatedWebinarMeeting --> skipping; webinar locusUrl is not yet initialized for meetingId ${this.meetingId}`\n );\n\n return undefined;\n }\n\n if (meeting.locusUrl !== this.locusUrl) {\n LoggerProxy.logger.warn(\n `Webinar:index#getValidatedWebinarMeeting --> skipping; meeting ${this.meetingId} locusUrl ${meeting.locusUrl} does not match webinar locusUrl ${this.locusUrl}`\n );\n\n return undefined;\n }\n\n return meeting;\n },\n\n /**\n * should join practice session data channel or not\n * @param {Object} {isPromoted: boolean, isDemoted: boolean}} Role transition states\n * @returns {void}\n */\n updateStatusByRole({isPromoted, isDemoted}) {\n const meeting = this.getValidatedWebinarMeeting();\n\n if (\n (isDemoted && meeting?.shareStatus === SHARE_STATUS.WHITEBOARD_SHARE_ACTIVE) ||\n isPromoted\n ) {\n // attendees in webinar should subscribe streaming for whiteboard sharing\n // while panelist still need subscribe native mode so trigger force update here\n meeting?.locusInfo?.updateMediaShares(meeting?.locusInfo?.mediaShares, true);\n }\n\n this.updatePSDataChannel();\n },\n\n /**\n * should join practice session data channel or not\n * @returns {boolean}\n */\n isJoinPracticeSessionDataChannel() {\n return this.selfIsPanelist && this.practiceSessionEnabled;\n },\n\n /**\n * Disconnects the practice session data channel and removes its relay listener.\n * The listener reference removed here is the exact callback captured at subscribe\n * time (see updatePSDataChannel) so that cleanup is correct even if the underlying\n * meeting can no longer be resolved (e.g. locusUrl mismatch).\n * @returns {Promise<void>}\n */\n async cleanupPSDataChannel() {\n if (this._pendingOnlineListener) {\n // @ts-ignore - Fix type\n this.webex.internal.llm.off('online', this._pendingOnlineListener);\n this._pendingOnlineListener = null;\n }\n\n // @ts-ignore - Fix type\n await this.webex.internal.llm.disconnectLLM(\n {\n code: 3050,\n reason: 'done (permanent)',\n },\n LLM_PRACTICE_SESSION\n );\n\n if (this._practiceSessionRelayListener) {\n // @ts-ignore - Fix type\n this.webex.internal.llm.off(\n `event:relay.event:${LLM_PRACTICE_SESSION}`,\n this._practiceSessionRelayListener\n );\n this._practiceSessionRelayListener = null;\n }\n },\n\n /**\n * Ensures practice-session token exists before registering the practice LLM channel.\n * Caller is responsible for passing a meeting that has already been resolved via\n * getValidatedWebinarMeeting() — this method does not re-validate ownership.\n * @param {object} meeting\n * @returns {Promise<string|undefined>}\n */\n async ensurePracticeSessionDatachannelToken(meeting) {\n // @ts-ignore\n const isDataChannelTokenEnabled = await this.webex.internal.llm.isDataChannelTokenEnabled();\n\n if (!isDataChannelTokenEnabled) {\n return undefined;\n }\n\n // @ts-ignore\n const cachedToken = this.webex.internal.llm.getDatachannelToken(\n DataChannelTokenType.PracticeSession\n );\n\n if (cachedToken) {\n return cachedToken;\n }\n\n try {\n const refreshResponse = await meeting.refreshDataChannelToken();\n const {datachannelToken, dataChannelTokenType} = refreshResponse?.body ?? {};\n\n if (!datachannelToken) {\n return undefined;\n }\n\n // @ts-ignore\n this.webex.internal.llm.setDatachannelToken(\n datachannelToken,\n dataChannelTokenType || DataChannelTokenType.PracticeSession\n );\n\n return datachannelToken;\n } catch (error) {\n LoggerProxy.logger.warn(\n `Webinar:index#ensurePracticeSessionDatachannelToken --> failed to proactively refresh practice-session token: ${\n error?.message || String(error)\n }`\n );\n\n return undefined;\n }\n },\n\n /**\n * Connects to low latency mercury and reconnects if the address has changed\n * It will also disconnect if called when the meeting has ended\n * @returns {Promise}\n */\n async updatePSDataChannel() {\n this._updatePSDataChannelSequence = (this._updatePSDataChannelSequence || 0) + 1;\n const invocationSequence = this._updatePSDataChannelSequence;\n\n const meeting = this.getValidatedWebinarMeeting();\n const isPracticeSession = meeting?.isJoined() && this.isJoinPracticeSessionDataChannel();\n\n if (!isPracticeSession) {\n await this.cleanupPSDataChannel();\n\n return undefined;\n }\n\n // @ts-ignore - Fix type\n const {url = undefined, info: {practiceSessionDatachannelUrl = undefined} = {}} =\n meeting?.locusInfo || {};\n\n // @ts-ignore\n let practiceSessionDatachannelToken = this.webex.internal.llm.getDatachannelToken(\n DataChannelTokenType.PracticeSession\n );\n\n const isCaptionBoxOn = this.webex.internal.voicea.getIsCaptionBoxOn();\n\n if (!practiceSessionDatachannelUrl) {\n return undefined;\n }\n // @ts-ignore - Fix type\n if (this.webex.internal.llm.isConnected(LLM_PRACTICE_SESSION)) {\n if (\n // @ts-ignore - Fix type\n url === this.webex.internal.llm.getLocusUrl(LLM_PRACTICE_SESSION) &&\n // @ts-ignore - Fix type\n practiceSessionDatachannelUrl ===\n this.webex.internal.llm.getDatachannelUrl(LLM_PRACTICE_SESSION)\n ) {\n return undefined;\n }\n\n await this.cleanupPSDataChannel();\n }\n\n // Ensure the default session data channel is connected before connecting the practice session.\n // Subscribe before checking isConnected() to avoid a race where the 'online' event fires\n // between the check and the subscription — Mercury does not replay missed events.\n if (!this._pendingOnlineListener) {\n const onDefaultSessionConnected = () => {\n this._pendingOnlineListener = null;\n // @ts-ignore - Fix type\n this.webex.internal.llm.off('online', onDefaultSessionConnected);\n this.updatePSDataChannel();\n };\n this._pendingOnlineListener = onDefaultSessionConnected;\n // @ts-ignore - Fix type\n this.webex.internal.llm.on('online', onDefaultSessionConnected);\n }\n\n // @ts-ignore - Fix type\n if (!this.webex.internal.llm.isConnected()) {\n LoggerProxy.logger.info(\n 'Webinar:index#updatePSDataChannel --> default session not yet connected, deferring practice session connect.'\n );\n\n return undefined;\n }\n\n // Default session is already connected — cancel the pending listener and proceed\n if (this._pendingOnlineListener) {\n // @ts-ignore - Fix type\n this.webex.internal.llm.off('online', this._pendingOnlineListener);\n this._pendingOnlineListener = null;\n }\n\n const refreshedPracticeSessionToken = await this.ensurePracticeSessionDatachannelToken(meeting);\n\n const latestPracticeSessionDatachannelUrl = get(\n meeting,\n 'locusInfo.info.practiceSessionDatachannelUrl'\n );\n const isStillPracticeSession = meeting?.isJoined() && this.isJoinPracticeSessionDataChannel();\n\n // Skip stale invocations after async refresh to avoid reconnecting a session\n // that was already updated/cleaned by a newer state transition.\n if (\n invocationSequence !== this._updatePSDataChannelSequence ||\n !isStillPracticeSession ||\n !latestPracticeSessionDatachannelUrl ||\n latestPracticeSessionDatachannelUrl !== practiceSessionDatachannelUrl\n ) {\n return undefined;\n }\n\n if (refreshedPracticeSessionToken) {\n practiceSessionDatachannelToken = refreshedPracticeSessionToken;\n }\n\n // @ts-ignore - Fix type\n return this.webex.internal.llm\n .registerAndConnect(\n url,\n practiceSessionDatachannelUrl,\n practiceSessionDatachannelToken,\n LLM_PRACTICE_SESSION\n )\n .then((registerAndConnectResult) => {\n // Track the exact listener reference so cleanupPSDataChannel can\n // unsubscribe deterministically, even if the meeting can no longer\n // be resolved at cleanup time.\n if (this._practiceSessionRelayListener) {\n // @ts-ignore - Fix type\n this.webex.internal.llm.off(\n `event:relay.event:${LLM_PRACTICE_SESSION}`,\n this._practiceSessionRelayListener\n );\n }\n this._practiceSessionRelayListener = meeting?.processRelayEvent;\n // @ts-ignore - Fix type\n this.webex.internal.llm.on(\n `event:relay.event:${LLM_PRACTICE_SESSION}`,\n this._practiceSessionRelayListener\n );\n // @ts-ignore - Fix type\n this.webex.internal.voicea?.announce?.();\n if (isCaptionBoxOn) {\n this.webex.internal.voicea.updateSubchannelSubscriptions({subscribe: ['transcription']});\n }\n LoggerProxy.logger.info(\n `Webinar:index#updatePSDataChannel --> enabled to receive relay events for default session for ${LLM_PRACTICE_SESSION}!`\n );\n\n return Promise.resolve(registerAndConnectResult);\n });\n },\n\n /**\n * start or stop practice session for webinar\n * @param {boolean} enabled\n * @returns {Promise}\n */\n setPracticeSessionState(enabled) {\n const meeting = this.getValidatedWebinarMeeting();\n\n return this.request({\n method: HTTP_VERBS.PATCH,\n uri: `${this.locusUrl}/controls`,\n body: {\n practiceSession: {\n enabled,\n },\n },\n })\n .then((response) => {\n MeetingUtil.updateLocusFromApiResponse(meeting, response);\n\n return response;\n })\n .catch((error) => {\n LoggerProxy.logger.error('Meeting:webinar#setPracticeSessionState failed', error);\n throw error;\n });\n },\n\n /**\n * update practice session status\n * @param {object} payload\n * @returns {void}\n */\n updatePracticeSessionStatus(payload) {\n this.set('practiceSessionEnabled', !!payload?.enabled);\n this.updatePSDataChannel().then(() => {});\n },\n\n /**\n * start webcast mode for webinar\n * @param {object} meeting\n * @param {object} layout\n * @returns {Promise}\n */\n async startWebcast(meeting, layout) {\n if (!meeting) {\n LoggerProxy.logger.error(\n `Meeting:webinar#startWebcast failed --> meeting parameter : ${meeting}`\n );\n throw new Error('Meeting parameter does not meet expectations');\n }\n\n return this.request({\n method: HTTP_VERBS.PUT,\n uri: `${this.webcastInstanceUrl}/streaming`,\n headers: {\n authorization: await this.webex.credentials.getUserToken(),\n trackingId: `${config.trackingIdPrefix}_${uuid.v4().toString()}`,\n [HEADERS.CONTENT_TYPE]: HEADERS.CONTENT_TYPE_VALUE.APPLICATION_JSON,\n },\n body: {\n action: 'start',\n meetingInfo: {\n locusId: meeting.locusId,\n correlationId: meeting.correlationId,\n },\n layout,\n },\n }).catch((error) => {\n LoggerProxy.logger.error('Meeting:webinar#startWebcast failed', error);\n throw error;\n });\n },\n\n /**\n * stop webcast mode for webinar\n * @returns {Promise}\n */\n async stopWebcast() {\n return this.request({\n method: HTTP_VERBS.PUT,\n uri: `${this.webcastInstanceUrl}/streaming`,\n headers: {\n authorization: await this.webex.credentials.getUserToken(),\n trackingId: `${config.trackingIdPrefix}_${uuid.v4().toString()}`,\n [HEADERS.CONTENT_TYPE]: HEADERS.CONTENT_TYPE_VALUE.APPLICATION_JSON,\n },\n body: {\n action: 'stop',\n },\n }).catch((error) => {\n LoggerProxy.logger.error('Meeting:webinar#stopWebcast failed', error);\n throw error;\n });\n },\n\n /**\n * query webcast layout for webinar\n * @returns {Promise}\n */\n async queryWebcastLayout() {\n return this.request({\n method: HTTP_VERBS.GET,\n uri: `${this.webcastInstanceUrl}/layout`,\n headers: {\n authorization: await this.webex.credentials.getUserToken(),\n trackingId: `${config.trackingIdPrefix}_${uuid.v4().toString()}`,\n },\n }).catch((error) => {\n LoggerProxy.logger.error('Meeting:webinar#queryWebcastLayout failed', error);\n throw error;\n });\n },\n\n /**\n * update webcast layout for webinar\n * @param {object} layout\n * @returns {Promise}\n */\n async updateWebcastLayout(layout) {\n return this.request({\n method: HTTP_VERBS.PUT,\n uri: `${this.webcastInstanceUrl}/layout`,\n headers: {\n authorization: await this.webex.credentials.getUserToken(),\n trackingId: `${config.trackingIdPrefix}_${uuid.v4().toString()}`,\n [HEADERS.CONTENT_TYPE]: HEADERS.CONTENT_TYPE_VALUE.APPLICATION_JSON,\n },\n body: {\n videoLayout: layout.videoLayout,\n contentLayout: layout.contentLayout,\n syncStageLayout: layout.syncStageLayout,\n syncStageInMeeting: layout.syncStageInMeeting,\n },\n }).catch((error) => {\n LoggerProxy.logger.error('Meeting:webinar#updateWebcastLayout failed', error);\n throw error;\n });\n },\n\n /**\n * view all webcast attendees\n * @returns {Promise}\n */\n async viewAllWebcastAttendees() {\n return this.request({\n method: HTTP_VERBS.GET,\n uri: `${this.webcastInstanceUrl}/attendees`,\n headers: {\n authorization: await this.webex.credentials.getUserToken(),\n trackingId: `${config.trackingIdPrefix}_${uuid.v4().toString()}`,\n },\n }).catch((error) => {\n LoggerProxy.logger.error('Meeting:webinar#viewAllWebcastAttendees failed', error);\n throw error;\n });\n },\n\n /**\n * search webcast attendees by query string\n * @param {string} queryString\n * @returns {Promise}\n */\n async searchWebcastAttendees(queryString = '') {\n return this.request({\n method: HTTP_VERBS.GET,\n uri: `${this.webcastInstanceUrl}/attendees?keyword=${encodeURIComponent(queryString)}`,\n headers: {\n authorization: await this.webex.credentials.getUserToken(),\n trackingId: `${config.trackingIdPrefix}_${uuid.v4().toString()}`,\n },\n }).catch((error) => {\n LoggerProxy.logger.error('Meeting:webinar#searchWebcastAttendees failed', error);\n throw error;\n });\n },\n\n /**\n * expel webcast attendee by participantId\n * @param {string} participantId\n * @returns {Promise}\n */\n async expelWebcastAttendee(participantId) {\n return this.request({\n method: HTTP_VERBS.DELETE,\n uri: `${this.webcastInstanceUrl}/attendees/${participantId}`,\n headers: {\n authorization: await this.webex.credentials.getUserToken(),\n trackingId: `${config.trackingIdPrefix}_${uuid.v4().toString()}`,\n },\n }).catch((error) => {\n LoggerProxy.logger.error('Meeting:webinar#expelWebcastAttendee failed', error);\n throw error;\n });\n },\n\n /**\n * search large scale webinar attendees\n * @param {object} payload\n * @param {string} payload.queryString\n * @param {number} payload.limit\n * @param {string} payload.next\n * @returns {Promise}\n */\n async searchLargeScaleWebinarAttendees(payload) {\n const meeting = this.getValidatedWebinarMeeting();\n if (!meeting) {\n LoggerProxy.logger.error(\n 'Meeting:webinar5k#searchLargeScaleWebinarAttendees failed --> webinar meeting could not be validated'\n );\n throw new Error('Meeting:webinar5k#Webinar meeting is not resolvable for the current locus');\n }\n\n const rawParams = {\n search_text: payload?.queryString,\n limit: payload?.limit ?? DEFAULT_LARGE_SCALE_WEBINAR_ATTENDEE_SEARCH_LIMIT,\n next: payload?.next,\n };\n const attendeeSearchUrl = meeting?.locusInfo?.links?.resources?.attendeeSearch?.url;\n if (!attendeeSearchUrl) {\n LoggerProxy.logger.error(\n 'Meeting:webinar5k#searchLargeScaleWebinarAttendees failed --> attendee search url unavailable'\n );\n throw new Error('Meeting:webinar5k#Attendee search url is not available');\n }\n\n return this.request({\n method: HTTP_VERBS.GET,\n uri: `${attendeeSearchUrl}?${new URLSearchParams(sanitizeParams(rawParams)).toString()}`,\n headers: {\n authorization: await this.webex.credentials.getUserToken(),\n trackingId: `${config.trackingIdPrefix}_${uuid.v4().toString()}`,\n },\n }).catch((error) => {\n LoggerProxy.logger.error('Meeting:webinar5k#searchLargeScaleWebinarAttendees failed', error);\n throw error;\n });\n },\n});\n\nexport default Webinar;\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_webexCore","require","_uuid","_interopRequireDefault","_lodash","_internalPluginLlm","_constants","_collection","_loggerProxy","_util","_utils","PS_LLM_EVENTS","event","concat","LLM_PRACTICE_SESSION","listenerKey","handlerKey","LOCUS_LLM_EVENT","Webinar","WebexPlugin","extend","namespace","MEETINGS","collections","webinar","WebinarCollection","props","locusUrl","webcastInstanceUrl","canManageWebcast","selfIsPanelist","selfIsAttendee","practiceSessionEnabled","meetingId","cleanUp","cleanupPSDataChannel","locusUrlUpdate","set","updateWebcastUrl","payload","get","updateCanManageWebcast","updateRoleChanged","oldRoles","newRoles","isPromoted","includes","SELF_ROLES","ATTENDEE","PANELIST","isDemoted","MODERATOR","updateStatusByRole","getValidatedWebinarMeeting","meeting","webex","meetings","getMeetingByType","_ID_","undefined","LoggerProxy","logger","warn","_ref","shareStatus","SHARE_STATUS","WHITEBOARD_SHARE_ACTIVE","_meeting$locusInfo","_meeting$locusInfo2","locusInfo","updateMediaShares","mediaShares","updatePSDataChannel","isJoinPracticeSessionDataChannel","_this","_asyncToGenerator2","default","_regenerator","mark","_callee","_i","_PS_LLM_EVENTS","_PS_LLM_EVENTS$_i","wrap","_context","prev","next","llmListeners","_pendingOnlineListener","internal","llm","off","disconnectLLM","code","reason","length","stop","ensurePracticeSessionDatachannelToken","_this2","_callee2","isDataChannelTokenEnabled","cachedToken","_refreshResponse$body","refreshResponse","_ref2","datachannelToken","dataChannelTokenType","_t","_context2","sent","abrupt","getDatachannelToken","DataChannelTokenType","PracticeSession","refreshDataChannelToken","body","setDatachannelToken","message","String","_this3","_callee3","invocationSequence","isPracticeSession","_ref3","_ref3$url","url","_ref3$info","_ref3$info2","_ref3$info2$practiceS","practiceSessionDatachannelUrl","practiceSessionDatachannelToken","isCaptionBoxOn","_onDefaultSessionConnected","refreshedPracticeSessionToken","latestPracticeSessionDatachannelUrl","isStillPracticeSession","_context3","_updatePSDataChannelSequence","isJoined","info","voicea","getIsCaptionBoxOn","isConnected","getLocusUrl","getDatachannelUrl","onDefaultSessionConnected","on","registerAndConnect","then","registerAndConnectResult","_this3$webex$internal","_this3$webex$internal2","_i2","_PS_LLM_EVENTS2","_PS_LLM_EVENTS2$_i","announce","call","updateSubchannelSubscriptions","subscribe","_promise","resolve","setPracticeSessionState","enabled","request","method","HTTP_VERBS","PATCH","uri","practiceSession","response","MeetingUtil","updateLocusFromApiResponse","catch","error","updatePracticeSessionStatus","startWebcast","layout","_this4","_callee4","_t2","_t3","_t4","_t5","_t6","_t7","_t8","_t9","_context4","Error","PUT","_defineProperty2","credentials","getUserToken","config","trackingIdPrefix","uuid","v4","toString","authorization","trackingId","HEADERS","CONTENT_TYPE","CONTENT_TYPE_VALUE","APPLICATION_JSON","action","meetingInfo","locusId","correlationId","headers","stopWebcast","_this5","_callee5","_t0","_t1","_t10","_t11","_t12","_t13","_t14","_t15","_context5","queryWebcastLayout","_this6","_callee6","_t16","_t17","_t18","_t19","_t20","_t21","_context6","GET","updateWebcastLayout","_this7","_callee7","_t22","_t23","_t24","_t25","_t26","_t27","_t28","_t29","_context7","videoLayout","contentLayout","syncStageLayout","syncStageInMeeting","viewAllWebcastAttendees","_this8","_callee8","_t30","_t31","_t32","_t33","_t34","_t35","_context8","searchWebcastAttendees","_arguments","arguments","_this9","_callee9","queryString","_t36","_t37","_t38","_t39","_t40","_t41","_context9","encodeURIComponent","expelWebcastAttendee","participantId","_this0","_callee0","_t42","_t43","_t44","_t45","_t46","_t47","_context0","DELETE","searchLargeScaleWebinarAttendees","_this1","_callee1","_payload$limit","_meeting$locusInfo3","_meeting$locusInfo3$l","_meeting$locusInfo3$l2","_meeting$locusInfo3$l3","rawParams","attendeeSearchUrl","_t48","_t49","_t50","_t51","_t52","_t53","_context1","search_text","limit","DEFAULT_LARGE_SCALE_WEBINAR_ATTENDEE_SEARCH_LIMIT","links","resources","attendeeSearch","URLSearchParams","sanitizeParams","version","_default","exports"],"sources":["index.ts"],"sourcesContent":["/*!\n * Copyright (c) 2015-2023 Cisco Systems, Inc. See LICENSE file.\n */\nimport {WebexPlugin, config} from '@webex/webex-core';\nimport uuid from 'uuid';\nimport {get} from 'lodash';\nimport {DataChannelTokenType} from '@webex/internal-plugin-llm';\nimport {\n _ID_,\n HEADERS,\n HTTP_VERBS,\n MEETINGS,\n SELF_ROLES,\n SHARE_STATUS,\n DEFAULT_LARGE_SCALE_WEBINAR_ATTENDEE_SEARCH_LIMIT,\n LLM_PRACTICE_SESSION,\n LOCUS_LLM_EVENT,\n} from '../constants';\n\nimport WebinarCollection from './collection';\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport MeetingUtil from '../meeting/util';\nimport {sanitizeParams} from './utils';\n\nconst PS_LLM_EVENTS = [\n {\n event: `event:relay.event:${LLM_PRACTICE_SESSION}`,\n listenerKey: 'relay',\n handlerKey: 'processRelayEvent',\n },\n {\n event: `${LOCUS_LLM_EVENT}:${LLM_PRACTICE_SESSION}`,\n listenerKey: 'locusLLM',\n handlerKey: 'processLocusLLMEvent',\n },\n];\n\n/**\n * @class Webinar\n */\nconst Webinar = WebexPlugin.extend({\n namespace: MEETINGS,\n collections: {\n webinar: WebinarCollection,\n },\n\n props: {\n locusUrl: 'string', // appears current webinar's locus url\n webcastInstanceUrl: 'string', // current webinar's webcast instance url\n canManageWebcast: 'boolean', // appears the ability to manage webcast\n selfIsPanelist: 'boolean', // self is panelist\n selfIsAttendee: 'boolean', // self is attendee\n practiceSessionEnabled: 'boolean', // practice session enabled\n meetingId: 'string',\n },\n\n /**\n * Calls this to clean up listeners\n * @returns {void}\n */\n cleanUp() {\n this.cleanupPSDataChannel();\n },\n\n /**\n * Update the current locus url of the webinar\n * @param {string} locusUrl\n * @returns {void}\n */\n locusUrlUpdate(locusUrl) {\n this.set('locusUrl', locusUrl);\n },\n\n /**\n * Update the current webcast instance url of the meeting\n * @param {object} payload\n * @returns {void}\n */\n updateWebcastUrl(payload) {\n this.set('webcastInstanceUrl', get(payload, 'resources.webcastInstance.url'));\n },\n\n /**\n * Update whether self has capability to manage start/stop webcast (only host can manage it)\n * @param {boolean} canManageWebcast\n * @returns {void}\n */\n updateCanManageWebcast(canManageWebcast) {\n this.set('canManageWebcast', canManageWebcast);\n },\n\n /**\n * Updates user roles and manages associated state transitions\n * @param {object} payload\n * @param {string[]} payload.oldRoles - Previous roles of the user\n * @param {string[]} payload.newRoles - New roles of the user\n * @returns {{isPromoted: boolean, isDemoted: boolean}} Role transition states\n */\n updateRoleChanged(payload) {\n const oldRoles = get(payload, 'oldRoles', []);\n const newRoles = get(payload, 'newRoles', []);\n\n const isPromoted =\n oldRoles.includes(SELF_ROLES.ATTENDEE) && newRoles.includes(SELF_ROLES.PANELIST);\n const isDemoted =\n (oldRoles.includes(SELF_ROLES.PANELIST) && newRoles.includes(SELF_ROLES.ATTENDEE)) ||\n (!oldRoles.includes(SELF_ROLES.ATTENDEE) && newRoles.includes(SELF_ROLES.ATTENDEE)); // for attendee just join meeting case\n this.set('selfIsPanelist', newRoles.includes(SELF_ROLES.PANELIST));\n this.set('selfIsAttendee', newRoles.includes(SELF_ROLES.ATTENDEE));\n this.updateCanManageWebcast(newRoles.includes(SELF_ROLES.MODERATOR));\n this.updateStatusByRole({isPromoted, isDemoted});\n\n return {isPromoted, isDemoted};\n },\n\n /**\n * Resolves the meeting associated with this webinar instance, guarded against the\n * meetingId pointer drifting onto an unrelated transient meeting (e.g. an inbound\n * 1:1 call) that may exist in the meeting collection. Returns the meeting only when\n * its locusUrl matches this webinar's tracked locusUrl. Returns undefined (with a\n * warning) when the meeting cannot be resolved or when the webinar's locusUrl has\n * not been initialized yet — callers must treat this as \"no owned meeting\" rather\n * than fall through to an unvalidated lookup.\n * @returns {object|undefined}\n */\n getValidatedWebinarMeeting() {\n const meeting = this.webex.meetings.getMeetingByType(_ID_, this.meetingId);\n\n if (!meeting) {\n return undefined;\n }\n\n if (!this.locusUrl) {\n LoggerProxy.logger.warn(\n `Webinar:index#getValidatedWebinarMeeting --> skipping; webinar locusUrl is not yet initialized for meetingId ${this.meetingId}`\n );\n\n return undefined;\n }\n\n if (meeting.locusUrl !== this.locusUrl) {\n LoggerProxy.logger.warn(\n `Webinar:index#getValidatedWebinarMeeting --> skipping; meeting ${this.meetingId} locusUrl ${meeting.locusUrl} does not match webinar locusUrl ${this.locusUrl}`\n );\n\n return undefined;\n }\n\n return meeting;\n },\n\n /**\n * should join practice session data channel or not\n * @param {Object} {isPromoted: boolean, isDemoted: boolean}} Role transition states\n * @returns {void}\n */\n updateStatusByRole({isPromoted, isDemoted}) {\n const meeting = this.getValidatedWebinarMeeting();\n\n if (\n (isDemoted && meeting?.shareStatus === SHARE_STATUS.WHITEBOARD_SHARE_ACTIVE) ||\n isPromoted\n ) {\n // attendees in webinar should subscribe streaming for whiteboard sharing\n // while panelist still need subscribe native mode so trigger force update here\n meeting?.locusInfo?.updateMediaShares(meeting?.locusInfo?.mediaShares, true);\n }\n\n this.updatePSDataChannel();\n },\n\n /**\n * should join practice session data channel or not\n * @returns {boolean}\n */\n isJoinPracticeSessionDataChannel() {\n return this.selfIsPanelist && this.practiceSessionEnabled;\n },\n\n /**\n * Disconnects the practice session data channel and removes its relay listener.\n * The listener reference removed here is the exact callback captured at subscribe\n * time (see updatePSDataChannel) so that cleanup is correct even if the underlying\n * meeting can no longer be resolved (e.g. locusUrl mismatch).\n * @returns {Promise<void>}\n */\n async cleanupPSDataChannel() {\n this.llmListeners = this.llmListeners || {};\n\n if (this._pendingOnlineListener) {\n // @ts-ignore - Fix type\n this.webex.internal.llm.off('online', this._pendingOnlineListener);\n this._pendingOnlineListener = null;\n }\n\n // @ts-ignore - Fix type\n await this.webex.internal.llm.disconnectLLM(\n {\n code: 3050,\n reason: 'done (permanent)',\n },\n LLM_PRACTICE_SESSION\n );\n\n for (const {event, listenerKey} of PS_LLM_EVENTS) {\n if (this.llmListeners[listenerKey]) {\n // @ts-ignore - Fix type\n this.webex.internal.llm.off(event, this.llmListeners[listenerKey]);\n this.llmListeners[listenerKey] = null;\n }\n }\n },\n\n /**\n * Ensures practice-session token exists before registering the practice LLM channel.\n * Caller is responsible for passing a meeting that has already been resolved via\n * getValidatedWebinarMeeting() — this method does not re-validate ownership.\n * @param {object} meeting\n * @returns {Promise<string|undefined>}\n */\n async ensurePracticeSessionDatachannelToken(meeting) {\n // @ts-ignore\n const isDataChannelTokenEnabled = await this.webex.internal.llm.isDataChannelTokenEnabled();\n\n if (!isDataChannelTokenEnabled) {\n return undefined;\n }\n\n // @ts-ignore\n const cachedToken = this.webex.internal.llm.getDatachannelToken(\n DataChannelTokenType.PracticeSession\n );\n\n if (cachedToken) {\n return cachedToken;\n }\n\n try {\n const refreshResponse = await meeting.refreshDataChannelToken();\n const {datachannelToken, dataChannelTokenType} = refreshResponse?.body ?? {};\n\n if (!datachannelToken) {\n return undefined;\n }\n\n // @ts-ignore\n this.webex.internal.llm.setDatachannelToken(\n datachannelToken,\n dataChannelTokenType || DataChannelTokenType.PracticeSession\n );\n\n return datachannelToken;\n } catch (error) {\n LoggerProxy.logger.warn(\n `Webinar:index#ensurePracticeSessionDatachannelToken --> failed to proactively refresh practice-session token: ${\n error?.message || String(error)\n }`\n );\n\n return undefined;\n }\n },\n\n /**\n * Connects to low latency mercury and reconnects if the address has changed\n * It will also disconnect if called when the meeting has ended\n * @returns {Promise}\n */\n async updatePSDataChannel() {\n this.llmListeners = this.llmListeners || {};\n\n this._updatePSDataChannelSequence = (this._updatePSDataChannelSequence || 0) + 1;\n const invocationSequence = this._updatePSDataChannelSequence;\n\n const meeting = this.getValidatedWebinarMeeting();\n const isPracticeSession = meeting?.isJoined() && this.isJoinPracticeSessionDataChannel();\n\n if (!isPracticeSession) {\n await this.cleanupPSDataChannel();\n\n return undefined;\n }\n\n // @ts-ignore - Fix type\n const {url = undefined, info: {practiceSessionDatachannelUrl = undefined} = {}} =\n meeting?.locusInfo || {};\n\n // @ts-ignore\n let practiceSessionDatachannelToken = this.webex.internal.llm.getDatachannelToken(\n DataChannelTokenType.PracticeSession\n );\n\n const isCaptionBoxOn = this.webex.internal.voicea.getIsCaptionBoxOn();\n\n if (!practiceSessionDatachannelUrl) {\n return undefined;\n }\n // @ts-ignore - Fix type\n if (this.webex.internal.llm.isConnected(LLM_PRACTICE_SESSION)) {\n if (\n // @ts-ignore - Fix type\n url === this.webex.internal.llm.getLocusUrl(LLM_PRACTICE_SESSION) &&\n // @ts-ignore - Fix type\n practiceSessionDatachannelUrl ===\n this.webex.internal.llm.getDatachannelUrl(LLM_PRACTICE_SESSION)\n ) {\n return undefined;\n }\n\n await this.cleanupPSDataChannel();\n }\n\n // Ensure the default session data channel is connected before connecting the practice session.\n // Subscribe before checking isConnected() to avoid a race where the 'online' event fires\n // between the check and the subscription — Mercury does not replay missed events.\n if (!this._pendingOnlineListener) {\n const onDefaultSessionConnected = () => {\n this._pendingOnlineListener = null;\n // @ts-ignore - Fix type\n this.webex.internal.llm.off('online', onDefaultSessionConnected);\n this.updatePSDataChannel();\n };\n this._pendingOnlineListener = onDefaultSessionConnected;\n // @ts-ignore - Fix type\n this.webex.internal.llm.on('online', onDefaultSessionConnected);\n }\n\n // @ts-ignore - Fix type\n if (!this.webex.internal.llm.isConnected()) {\n LoggerProxy.logger.info(\n 'Webinar:index#updatePSDataChannel --> default session not yet connected, deferring practice session connect.'\n );\n\n return undefined;\n }\n\n // Default session is already connected — cancel the pending listener and proceed\n if (this._pendingOnlineListener) {\n // @ts-ignore - Fix type\n this.webex.internal.llm.off('online', this._pendingOnlineListener);\n this._pendingOnlineListener = null;\n }\n\n const refreshedPracticeSessionToken = await this.ensurePracticeSessionDatachannelToken(meeting);\n\n const latestPracticeSessionDatachannelUrl = get(\n meeting,\n 'locusInfo.info.practiceSessionDatachannelUrl'\n );\n const isStillPracticeSession = meeting?.isJoined() && this.isJoinPracticeSessionDataChannel();\n\n // Skip stale invocations after async refresh to avoid reconnecting a session\n // that was already updated/cleaned by a newer state transition.\n if (\n invocationSequence !== this._updatePSDataChannelSequence ||\n !isStillPracticeSession ||\n !latestPracticeSessionDatachannelUrl ||\n latestPracticeSessionDatachannelUrl !== practiceSessionDatachannelUrl\n ) {\n return undefined;\n }\n\n if (refreshedPracticeSessionToken) {\n practiceSessionDatachannelToken = refreshedPracticeSessionToken;\n }\n\n // @ts-ignore - Fix type\n return this.webex.internal.llm\n .registerAndConnect(\n url,\n practiceSessionDatachannelUrl,\n practiceSessionDatachannelToken,\n LLM_PRACTICE_SESSION\n )\n .then((registerAndConnectResult) => {\n // Track the exact listener references so cleanupPSDataChannel can\n // unsubscribe deterministically, even if the meeting can no longer\n // be resolved at cleanup time.\n for (const {event, listenerKey, handlerKey} of PS_LLM_EVENTS) {\n if (this.llmListeners[listenerKey]) {\n // @ts-ignore - Fix type\n this.webex.internal.llm.off(event, this.llmListeners[listenerKey]);\n }\n this.llmListeners[listenerKey] = meeting?.[handlerKey];\n // @ts-ignore - Fix type\n this.webex.internal.llm.on(event, this.llmListeners[listenerKey]);\n }\n // @ts-ignore - Fix type\n this.webex.internal.voicea?.announce?.();\n if (isCaptionBoxOn) {\n this.webex.internal.voicea.updateSubchannelSubscriptions({subscribe: ['transcription']});\n }\n LoggerProxy.logger.info(\n `Webinar:index#updatePSDataChannel --> enabled to receive relay events for default session for ${LLM_PRACTICE_SESSION}!`\n );\n\n return Promise.resolve(registerAndConnectResult);\n });\n },\n\n /**\n * start or stop practice session for webinar\n * @param {boolean} enabled\n * @returns {Promise}\n */\n setPracticeSessionState(enabled) {\n const meeting = this.getValidatedWebinarMeeting();\n\n return this.request({\n method: HTTP_VERBS.PATCH,\n uri: `${this.locusUrl}/controls`,\n body: {\n practiceSession: {\n enabled,\n },\n },\n })\n .then((response) => {\n MeetingUtil.updateLocusFromApiResponse(meeting, response);\n\n return response;\n })\n .catch((error) => {\n LoggerProxy.logger.error('Meeting:webinar#setPracticeSessionState failed', error);\n throw error;\n });\n },\n\n /**\n * update practice session status\n * @param {object} payload\n * @returns {void}\n */\n updatePracticeSessionStatus(payload) {\n this.set('practiceSessionEnabled', !!payload?.enabled);\n this.updatePSDataChannel().then(() => {});\n },\n\n /**\n * start webcast mode for webinar\n * @param {object} meeting\n * @param {object} layout\n * @returns {Promise}\n */\n async startWebcast(meeting, layout) {\n if (!meeting) {\n LoggerProxy.logger.error(\n `Meeting:webinar#startWebcast failed --> meeting parameter : ${meeting}`\n );\n throw new Error('Meeting parameter does not meet expectations');\n }\n\n return this.request({\n method: HTTP_VERBS.PUT,\n uri: `${this.webcastInstanceUrl}/streaming`,\n headers: {\n authorization: await this.webex.credentials.getUserToken(),\n trackingId: `${config.trackingIdPrefix}_${uuid.v4().toString()}`,\n [HEADERS.CONTENT_TYPE]: HEADERS.CONTENT_TYPE_VALUE.APPLICATION_JSON,\n },\n body: {\n action: 'start',\n meetingInfo: {\n locusId: meeting.locusId,\n correlationId: meeting.correlationId,\n },\n layout,\n },\n }).catch((error) => {\n LoggerProxy.logger.error('Meeting:webinar#startWebcast failed', error);\n throw error;\n });\n },\n\n /**\n * stop webcast mode for webinar\n * @returns {Promise}\n */\n async stopWebcast() {\n return this.request({\n method: HTTP_VERBS.PUT,\n uri: `${this.webcastInstanceUrl}/streaming`,\n headers: {\n authorization: await this.webex.credentials.getUserToken(),\n trackingId: `${config.trackingIdPrefix}_${uuid.v4().toString()}`,\n [HEADERS.CONTENT_TYPE]: HEADERS.CONTENT_TYPE_VALUE.APPLICATION_JSON,\n },\n body: {\n action: 'stop',\n },\n }).catch((error) => {\n LoggerProxy.logger.error('Meeting:webinar#stopWebcast failed', error);\n throw error;\n });\n },\n\n /**\n * query webcast layout for webinar\n * @returns {Promise}\n */\n async queryWebcastLayout() {\n return this.request({\n method: HTTP_VERBS.GET,\n uri: `${this.webcastInstanceUrl}/layout`,\n headers: {\n authorization: await this.webex.credentials.getUserToken(),\n trackingId: `${config.trackingIdPrefix}_${uuid.v4().toString()}`,\n },\n }).catch((error) => {\n LoggerProxy.logger.error('Meeting:webinar#queryWebcastLayout failed', error);\n throw error;\n });\n },\n\n /**\n * update webcast layout for webinar\n * @param {object} layout\n * @returns {Promise}\n */\n async updateWebcastLayout(layout) {\n return this.request({\n method: HTTP_VERBS.PUT,\n uri: `${this.webcastInstanceUrl}/layout`,\n headers: {\n authorization: await this.webex.credentials.getUserToken(),\n trackingId: `${config.trackingIdPrefix}_${uuid.v4().toString()}`,\n [HEADERS.CONTENT_TYPE]: HEADERS.CONTENT_TYPE_VALUE.APPLICATION_JSON,\n },\n body: {\n videoLayout: layout.videoLayout,\n contentLayout: layout.contentLayout,\n syncStageLayout: layout.syncStageLayout,\n syncStageInMeeting: layout.syncStageInMeeting,\n },\n }).catch((error) => {\n LoggerProxy.logger.error('Meeting:webinar#updateWebcastLayout failed', error);\n throw error;\n });\n },\n\n /**\n * view all webcast attendees\n * @returns {Promise}\n */\n async viewAllWebcastAttendees() {\n return this.request({\n method: HTTP_VERBS.GET,\n uri: `${this.webcastInstanceUrl}/attendees`,\n headers: {\n authorization: await this.webex.credentials.getUserToken(),\n trackingId: `${config.trackingIdPrefix}_${uuid.v4().toString()}`,\n },\n }).catch((error) => {\n LoggerProxy.logger.error('Meeting:webinar#viewAllWebcastAttendees failed', error);\n throw error;\n });\n },\n\n /**\n * search webcast attendees by query string\n * @param {string} queryString\n * @returns {Promise}\n */\n async searchWebcastAttendees(queryString = '') {\n return this.request({\n method: HTTP_VERBS.GET,\n uri: `${this.webcastInstanceUrl}/attendees?keyword=${encodeURIComponent(queryString)}`,\n headers: {\n authorization: await this.webex.credentials.getUserToken(),\n trackingId: `${config.trackingIdPrefix}_${uuid.v4().toString()}`,\n },\n }).catch((error) => {\n LoggerProxy.logger.error('Meeting:webinar#searchWebcastAttendees failed', error);\n throw error;\n });\n },\n\n /**\n * expel webcast attendee by participantId\n * @param {string} participantId\n * @returns {Promise}\n */\n async expelWebcastAttendee(participantId) {\n return this.request({\n method: HTTP_VERBS.DELETE,\n uri: `${this.webcastInstanceUrl}/attendees/${participantId}`,\n headers: {\n authorization: await this.webex.credentials.getUserToken(),\n trackingId: `${config.trackingIdPrefix}_${uuid.v4().toString()}`,\n },\n }).catch((error) => {\n LoggerProxy.logger.error('Meeting:webinar#expelWebcastAttendee failed', error);\n throw error;\n });\n },\n\n /**\n * search large scale webinar attendees\n * @param {object} payload\n * @param {string} payload.queryString\n * @param {number} payload.limit\n * @param {string} payload.next\n * @returns {Promise}\n */\n async searchLargeScaleWebinarAttendees(payload) {\n const meeting = this.getValidatedWebinarMeeting();\n if (!meeting) {\n LoggerProxy.logger.error(\n 'Meeting:webinar5k#searchLargeScaleWebinarAttendees failed --> webinar meeting could not be validated'\n );\n throw new Error('Meeting:webinar5k#Webinar meeting is not resolvable for the current locus');\n }\n\n const rawParams = {\n search_text: payload?.queryString,\n limit: payload?.limit ?? DEFAULT_LARGE_SCALE_WEBINAR_ATTENDEE_SEARCH_LIMIT,\n next: payload?.next,\n };\n const attendeeSearchUrl = meeting?.locusInfo?.links?.resources?.attendeeSearch?.url;\n if (!attendeeSearchUrl) {\n LoggerProxy.logger.error(\n 'Meeting:webinar5k#searchLargeScaleWebinarAttendees failed --> attendee search url unavailable'\n );\n throw new Error('Meeting:webinar5k#Attendee search url is not available');\n }\n\n return this.request({\n method: HTTP_VERBS.GET,\n uri: `${attendeeSearchUrl}?${new URLSearchParams(sanitizeParams(rawParams)).toString()}`,\n headers: {\n authorization: await this.webex.credentials.getUserToken(),\n trackingId: `${config.trackingIdPrefix}_${uuid.v4().toString()}`,\n },\n }).catch((error) => {\n LoggerProxy.logger.error('Meeting:webinar5k#searchLargeScaleWebinarAttendees failed', error);\n throw error;\n });\n },\n});\n\nexport default Webinar;\n"],"mappings":";;;;;;;;;;;;AAGA,IAAAA,UAAA,GAAAC,OAAA;AACA,IAAAC,KAAA,GAAAC,sBAAA,CAAAF,OAAA;AACA,IAAAG,OAAA,GAAAH,OAAA;AACA,IAAAI,kBAAA,GAAAJ,OAAA;AACA,IAAAK,UAAA,GAAAL,OAAA;AAYA,IAAAM,WAAA,GAAAJ,sBAAA,CAAAF,OAAA;AACA,IAAAO,YAAA,GAAAL,sBAAA,CAAAF,OAAA;AACA,IAAAQ,KAAA,GAAAN,sBAAA,CAAAF,OAAA;AACA,IAAAS,MAAA,GAAAT,OAAA;AAtBA;AACA;AACA;;AAsBA,IAAMU,aAAa,GAAG,CACpB;EACEC,KAAK,uBAAAC,MAAA,CAAuBC,+BAAoB,CAAE;EAClDC,WAAW,EAAE,OAAO;EACpBC,UAAU,EAAE;AACd,CAAC,EACD;EACEJ,KAAK,KAAAC,MAAA,CAAKI,0BAAe,OAAAJ,MAAA,CAAIC,+BAAoB,CAAE;EACnDC,WAAW,EAAE,UAAU;EACvBC,UAAU,EAAE;AACd,CAAC,CACF;;AAED;AACA;AACA;AACA,IAAME,OAAO,GAAGC,sBAAW,CAACC,MAAM,CAAC;EACjCC,SAAS,EAAEC,mBAAQ;EACnBC,WAAW,EAAE;IACXC,OAAO,EAAEC;EACX,CAAC;EAEDC,KAAK,EAAE;IACLC,QAAQ,EAAE,QAAQ;IAAE;IACpBC,kBAAkB,EAAE,QAAQ;IAAE;IAC9BC,gBAAgB,EAAE,SAAS;IAAE;IAC7BC,cAAc,EAAE,SAAS;IAAE;IAC3BC,cAAc,EAAE,SAAS;IAAE;IAC3BC,sBAAsB,EAAE,SAAS;IAAE;IACnCC,SAAS,EAAE;EACb,CAAC;EAED;AACF;AACA;AACA;EACEC,OAAO,WAAPA,OAAOA,CAAA,EAAG;IACR,IAAI,CAACC,oBAAoB,CAAC,CAAC;EAC7B,CAAC;EAED;AACF;AACA;AACA;AACA;EACEC,cAAc,WAAdA,cAAcA,CAACT,QAAQ,EAAE;IACvB,IAAI,CAACU,GAAG,CAAC,UAAU,EAAEV,QAAQ,CAAC;EAChC,CAAC;EAED;AACF;AACA;AACA;AACA;EACEW,gBAAgB,WAAhBA,gBAAgBA,CAACC,OAAO,EAAE;IACxB,IAAI,CAACF,GAAG,CAAC,oBAAoB,EAAE,IAAAG,WAAG,EAACD,OAAO,EAAE,+BAA+B,CAAC,CAAC;EAC/E,CAAC;EAED;AACF;AACA;AACA;AACA;EACEE,sBAAsB,WAAtBA,sBAAsBA,CAACZ,gBAAgB,EAAE;IACvC,IAAI,CAACQ,GAAG,CAAC,kBAAkB,EAAER,gBAAgB,CAAC;EAChD,CAAC;EAED;AACF;AACA;AACA;AACA;AACA;AACA;EACEa,iBAAiB,WAAjBA,iBAAiBA,CAACH,OAAO,EAAE;IACzB,IAAMI,QAAQ,GAAG,IAAAH,WAAG,EAACD,OAAO,EAAE,UAAU,EAAE,EAAE,CAAC;IAC7C,IAAMK,QAAQ,GAAG,IAAAJ,WAAG,EAACD,OAAO,EAAE,UAAU,EAAE,EAAE,CAAC;IAE7C,IAAMM,UAAU,GACdF,QAAQ,CAACG,QAAQ,CAACC,qBAAU,CAACC,QAAQ,CAAC,IAAIJ,QAAQ,CAACE,QAAQ,CAACC,qBAAU,CAACE,QAAQ,CAAC;IAClF,IAAMC,SAAS,GACZP,QAAQ,CAACG,QAAQ,CAACC,qBAAU,CAACE,QAAQ,CAAC,IAAIL,QAAQ,CAACE,QAAQ,CAACC,qBAAU,CAACC,QAAQ,CAAC,IAChF,CAACL,QAAQ,CAACG,QAAQ,CAACC,qBAAU,CAACC,QAAQ,CAAC,IAAIJ,QAAQ,CAACE,QAAQ,CAACC,qBAAU,CAACC,QAAQ,CAAE,CAAC,CAAC;IACvF,IAAI,CAACX,GAAG,CAAC,gBAAgB,EAAEO,QAAQ,CAACE,QAAQ,CAACC,qBAAU,CAACE,QAAQ,CAAC,CAAC;IAClE,IAAI,CAACZ,GAAG,CAAC,gBAAgB,EAAEO,QAAQ,CAACE,QAAQ,CAACC,qBAAU,CAACC,QAAQ,CAAC,CAAC;IAClE,IAAI,CAACP,sBAAsB,CAACG,QAAQ,CAACE,QAAQ,CAACC,qBAAU,CAACI,SAAS,CAAC,CAAC;IACpE,IAAI,CAACC,kBAAkB,CAAC;MAACP,UAAU,EAAVA,UAAU;MAAEK,SAAS,EAATA;IAAS,CAAC,CAAC;IAEhD,OAAO;MAACL,UAAU,EAAVA,UAAU;MAAEK,SAAS,EAATA;IAAS,CAAC;EAChC,CAAC;EAED;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACEG,0BAA0B,WAA1BA,0BAA0BA,CAAA,EAAG;IAC3B,IAAMC,OAAO,GAAG,IAAI,CAACC,KAAK,CAACC,QAAQ,CAACC,gBAAgB,CAACC,eAAI,EAAE,IAAI,CAACzB,SAAS,CAAC;IAE1E,IAAI,CAACqB,OAAO,EAAE;MACZ,OAAOK,SAAS;IAClB;IAEA,IAAI,CAAC,IAAI,CAAChC,QAAQ,EAAE;MAClBiC,oBAAW,CAACC,MAAM,CAACC,IAAI,iHAAAjD,MAAA,CAC2F,IAAI,CAACoB,SAAS,CAChI,CAAC;MAED,OAAO0B,SAAS;IAClB;IAEA,IAAIL,OAAO,CAAC3B,QAAQ,KAAK,IAAI,CAACA,QAAQ,EAAE;MACtCiC,oBAAW,CAACC,MAAM,CAACC,IAAI,mEAAAjD,MAAA,CAC6C,IAAI,CAACoB,SAAS,gBAAApB,MAAA,CAAayC,OAAO,CAAC3B,QAAQ,uCAAAd,MAAA,CAAoC,IAAI,CAACc,QAAQ,CAChK,CAAC;MAED,OAAOgC,SAAS;IAClB;IAEA,OAAOL,OAAO;EAChB,CAAC;EAED;AACF;AACA;AACA;AACA;EACEF,kBAAkB,WAAlBA,kBAAkBA,CAAAW,IAAA,EAA0B;IAAA,IAAxBlB,UAAU,GAAAkB,IAAA,CAAVlB,UAAU;MAAEK,SAAS,GAAAa,IAAA,CAATb,SAAS;IACvC,IAAMI,OAAO,GAAG,IAAI,CAACD,0BAA0B,CAAC,CAAC;IAEjD,IACGH,SAAS,IAAI,CAAAI,OAAO,aAAPA,OAAO,uBAAPA,OAAO,CAAEU,WAAW,MAAKC,uBAAY,CAACC,uBAAuB,IAC3ErB,UAAU,EACV;MAAA,IAAAsB,kBAAA,EAAAC,mBAAA;MACA;MACA;MACAd,OAAO,aAAPA,OAAO,wBAAAa,kBAAA,GAAPb,OAAO,CAAEe,SAAS,cAAAF,kBAAA,uBAAlBA,kBAAA,CAAoBG,iBAAiB,CAAChB,OAAO,aAAPA,OAAO,wBAAAc,mBAAA,GAAPd,OAAO,CAAEe,SAAS,cAAAD,mBAAA,uBAAlBA,mBAAA,CAAoBG,WAAW,EAAE,IAAI,CAAC;IAC9E;IAEA,IAAI,CAACC,mBAAmB,CAAC,CAAC;EAC5B,CAAC;EAED;AACF;AACA;AACA;EACEC,gCAAgC,WAAhCA,gCAAgCA,CAAA,EAAG;IACjC,OAAO,IAAI,CAAC3C,cAAc,IAAI,IAAI,CAACE,sBAAsB;EAC3D,CAAC;EAED;AACF;AACA;AACA;AACA;AACA;AACA;EACQG,oBAAoB,WAApBA,oBAAoBA,CAAA,EAAG;IAAA,IAAAuC,KAAA;IAAA,WAAAC,kBAAA,CAAAC,OAAA,eAAAC,YAAA,CAAAD,OAAA,CAAAE,IAAA,UAAAC,QAAA;MAAA,IAAAC,EAAA,EAAAC,cAAA,EAAAC,iBAAA,EAAAtE,KAAA,EAAAG,WAAA;MAAA,OAAA8D,YAAA,CAAAD,OAAA,CAAAO,IAAA,WAAAC,QAAA;QAAA,kBAAAA,QAAA,CAAAC,IAAA,GAAAD,QAAA,CAAAE,IAAA;UAAA;YAC3BZ,KAAI,CAACa,YAAY,GAAGb,KAAI,CAACa,YAAY,IAAI,CAAC,CAAC;YAE3C,IAAIb,KAAI,CAACc,sBAAsB,EAAE;cAC/B;cACAd,KAAI,CAACnB,KAAK,CAACkC,QAAQ,CAACC,GAAG,CAACC,GAAG,CAAC,QAAQ,EAAEjB,KAAI,CAACc,sBAAsB,CAAC;cAClEd,KAAI,CAACc,sBAAsB,GAAG,IAAI;YACpC;;YAEA;YAAAJ,QAAA,CAAAE,IAAA;YAAA,OACMZ,KAAI,CAACnB,KAAK,CAACkC,QAAQ,CAACC,GAAG,CAACE,aAAa,CACzC;cACEC,IAAI,EAAE,IAAI;cACVC,MAAM,EAAE;YACV,CAAC,EACDhF,+BACF,CAAC;UAAA;YAED,KAAAkE,EAAA,MAAAC,cAAA,GAAmCtE,aAAa,EAAAqE,EAAA,GAAAC,cAAA,CAAAc,MAAA,EAAAf,EAAA,IAAE;cAAAE,iBAAA,GAAAD,cAAA,CAAAD,EAAA,GAAtCpE,KAAK,GAAAsE,iBAAA,CAALtE,KAAK,EAAEG,WAAW,GAAAmE,iBAAA,CAAXnE,WAAW;cAC5B,IAAI2D,KAAI,CAACa,YAAY,CAACxE,WAAW,CAAC,EAAE;gBAClC;gBACA2D,KAAI,CAACnB,KAAK,CAACkC,QAAQ,CAACC,GAAG,CAACC,GAAG,CAAC/E,KAAK,EAAE8D,KAAI,CAACa,YAAY,CAACxE,WAAW,CAAC,CAAC;gBAClE2D,KAAI,CAACa,YAAY,CAACxE,WAAW,CAAC,GAAG,IAAI;cACvC;YACF;UAAC;UAAA;YAAA,OAAAqE,QAAA,CAAAY,IAAA;QAAA;MAAA,GAAAjB,OAAA;IAAA;EACH,CAAC;EAED;AACF;AACA;AACA;AACA;AACA;AACA;EACQkB,qCAAqC,WAArCA,qCAAqCA,CAAC3C,OAAO,EAAE;IAAA,IAAA4C,MAAA;IAAA,WAAAvB,kBAAA,CAAAC,OAAA,eAAAC,YAAA,CAAAD,OAAA,CAAAE,IAAA,UAAAqB,SAAA;MAAA,IAAAC,yBAAA,EAAAC,WAAA,EAAAC,qBAAA,EAAAC,eAAA,EAAAC,KAAA,EAAAC,gBAAA,EAAAC,oBAAA,EAAAC,EAAA;MAAA,OAAA9B,YAAA,CAAAD,OAAA,CAAAO,IAAA,WAAAyB,SAAA;QAAA,kBAAAA,SAAA,CAAAvB,IAAA,GAAAuB,SAAA,CAAAtB,IAAA;UAAA;YAAAsB,SAAA,CAAAtB,IAAA;YAAA,OAEXY,MAAI,CAAC3C,KAAK,CAACkC,QAAQ,CAACC,GAAG,CAACU,yBAAyB,CAAC,CAAC;UAAA;YAArFA,yBAAyB,GAAAQ,SAAA,CAAAC,IAAA;YAAA,IAE1BT,yBAAyB;cAAAQ,SAAA,CAAAtB,IAAA;cAAA;YAAA;YAAA,OAAAsB,SAAA,CAAAE,MAAA,WACrBnD,SAAS;UAAA;YAGlB;YACM0C,WAAW,GAAGH,MAAI,CAAC3C,KAAK,CAACkC,QAAQ,CAACC,GAAG,CAACqB,mBAAmB,CAC7DC,uCAAoB,CAACC,eACvB,CAAC;YAAA,KAEGZ,WAAW;cAAAO,SAAA,CAAAtB,IAAA;cAAA;YAAA;YAAA,OAAAsB,SAAA,CAAAE,MAAA,WACNT,WAAW;UAAA;YAAAO,SAAA,CAAAvB,IAAA;YAAAuB,SAAA,CAAAtB,IAAA;YAAA,OAIYhC,OAAO,CAAC4D,uBAAuB,CAAC,CAAC;UAAA;YAAzDX,eAAe,GAAAK,SAAA,CAAAC,IAAA;YAAAL,KAAA,IAAAF,qBAAA,GAC4BC,eAAe,aAAfA,eAAe,uBAAfA,eAAe,CAAEY,IAAI,cAAAb,qBAAA,cAAAA,qBAAA,GAAI,CAAC,CAAC,EAArEG,gBAAgB,GAAAD,KAAA,CAAhBC,gBAAgB,EAAEC,oBAAoB,GAAAF,KAAA,CAApBE,oBAAoB;YAAA,IAExCD,gBAAgB;cAAAG,SAAA,CAAAtB,IAAA;cAAA;YAAA;YAAA,OAAAsB,SAAA,CAAAE,MAAA,WACZnD,SAAS;UAAA;YAGlB;YACAuC,MAAI,CAAC3C,KAAK,CAACkC,QAAQ,CAACC,GAAG,CAAC0B,mBAAmB,CACzCX,gBAAgB,EAChBC,oBAAoB,IAAIM,uCAAoB,CAACC,eAC/C,CAAC;YAAC,OAAAL,SAAA,CAAAE,MAAA,WAEKL,gBAAgB;UAAA;YAAAG,SAAA,CAAAvB,IAAA;YAAAsB,EAAA,GAAAC,SAAA;YAEvBhD,oBAAW,CAACC,MAAM,CAACC,IAAI,kHAAAjD,MAAA,CAEnB,CAAA8F,EAAA,aAAAA,EAAA,uBAAAA,EAAA,CAAOU,OAAO,KAAIC,MAAM,CAAAX,EAAM,CAAC,CAEnC,CAAC;YAAC,OAAAC,SAAA,CAAAE,MAAA,WAEKnD,SAAS;UAAA;UAAA;YAAA,OAAAiD,SAAA,CAAAZ,IAAA;QAAA;MAAA,GAAAG,QAAA;IAAA;EAEpB,CAAC;EAED;AACF;AACA;AACA;AACA;EACQ3B,mBAAmB,WAAnBA,mBAAmBA,CAAA,EAAG;IAAA,IAAA+C,MAAA;IAAA,WAAA5C,kBAAA,CAAAC,OAAA,eAAAC,YAAA,CAAAD,OAAA,CAAAE,IAAA,UAAA0C,SAAA;MAAA,IAAAC,kBAAA,EAAAnE,OAAA,EAAAoE,iBAAA,EAAAC,KAAA,EAAAC,SAAA,EAAAC,GAAA,EAAAC,UAAA,EAAAC,WAAA,EAAAC,qBAAA,EAAAC,6BAAA,EAAAC,+BAAA,EAAAC,cAAA,EAAAC,0BAAA,EAAAC,6BAAA,EAAAC,mCAAA,EAAAC,sBAAA;MAAA,OAAA1D,YAAA,CAAAD,OAAA,CAAAO,IAAA,WAAAqD,SAAA;QAAA,kBAAAA,SAAA,CAAAnD,IAAA,GAAAmD,SAAA,CAAAlD,IAAA;UAAA;YAC1BiC,MAAI,CAAChC,YAAY,GAAGgC,MAAI,CAAChC,YAAY,IAAI,CAAC,CAAC;YAE3CgC,MAAI,CAACkB,4BAA4B,GAAG,CAAClB,MAAI,CAACkB,4BAA4B,IAAI,CAAC,IAAI,CAAC;YAC1EhB,kBAAkB,GAAGF,MAAI,CAACkB,4BAA4B;YAEtDnF,OAAO,GAAGiE,MAAI,CAAClE,0BAA0B,CAAC,CAAC;YAC3CqE,iBAAiB,GAAG,CAAApE,OAAO,aAAPA,OAAO,uBAAPA,OAAO,CAAEoF,QAAQ,CAAC,CAAC,KAAInB,MAAI,CAAC9C,gCAAgC,CAAC,CAAC;YAAA,IAEnFiD,iBAAiB;cAAAc,SAAA,CAAAlD,IAAA;cAAA;YAAA;YAAAkD,SAAA,CAAAlD,IAAA;YAAA,OACdiC,MAAI,CAACpF,oBAAoB,CAAC,CAAC;UAAA;YAAA,OAAAqG,SAAA,CAAA1B,MAAA,WAE1BnD,SAAS;UAAA;YAGlB;YAAAgE,KAAA,GAEE,CAAArE,OAAO,aAAPA,OAAO,uBAAPA,OAAO,CAAEe,SAAS,KAAI,CAAC,CAAC,EAAAuD,SAAA,GAAAD,KAAA,CADnBE,GAAG,EAAHA,GAAG,GAAAD,SAAA,cAAGjE,SAAS,GAAAiE,SAAA,EAAAE,UAAA,GAAAH,KAAA,CAAEgB,IAAI,EAAAZ,WAAA,GAAAD,UAAA,cAAgD,CAAC,CAAC,GAAAA,UAAA,EAAAE,qBAAA,GAAAD,WAAA,CAA/CE,6BAA6B,EAA7BA,6BAA6B,GAAAD,qBAAA,cAAGrE,SAAS,GAAAqE,qBAAA,EAGxE;YACIE,+BAA+B,GAAGX,MAAI,CAAChE,KAAK,CAACkC,QAAQ,CAACC,GAAG,CAACqB,mBAAmB,CAC/EC,uCAAoB,CAACC,eACvB,CAAC;YAEKkB,cAAc,GAAGZ,MAAI,CAAChE,KAAK,CAACkC,QAAQ,CAACmD,MAAM,CAACC,iBAAiB,CAAC,CAAC;YAAA,IAEhEZ,6BAA6B;cAAAO,SAAA,CAAAlD,IAAA;cAAA;YAAA;YAAA,OAAAkD,SAAA,CAAA1B,MAAA,WACzBnD,SAAS;UAAA;YAAA,KAGd4D,MAAI,CAAChE,KAAK,CAACkC,QAAQ,CAACC,GAAG,CAACoD,WAAW,CAAChI,+BAAoB,CAAC;cAAA0H,SAAA,CAAAlD,IAAA;cAAA;YAAA;YAAA;YAEzD;YACAuC,GAAG,KAAKN,MAAI,CAAChE,KAAK,CAACkC,QAAQ,CAACC,GAAG,CAACqD,WAAW,CAACjI,+BAAoB,CAAC;YACjE;YACAmH,6BAA6B,KAC3BV,MAAI,CAAChE,KAAK,CAACkC,QAAQ,CAACC,GAAG,CAACsD,iBAAiB,CAAClI,+BAAoB,CAAC;cAAA0H,SAAA,CAAAlD,IAAA;cAAA;YAAA;YAAA,OAAAkD,SAAA,CAAA1B,MAAA,WAE1DnD,SAAS;UAAA;YAAA6E,SAAA,CAAAlD,IAAA;YAAA,OAGZiC,MAAI,CAACpF,oBAAoB,CAAC,CAAC;UAAA;YAGnC;YACA;YACA;YACA,IAAI,CAACoF,MAAI,CAAC/B,sBAAsB,EAAE;cAC1ByD,0BAAyB,GAAG,SAA5BA,yBAAyBA,CAAA,EAAS;gBACtC1B,MAAI,CAAC/B,sBAAsB,GAAG,IAAI;gBAClC;gBACA+B,MAAI,CAAChE,KAAK,CAACkC,QAAQ,CAACC,GAAG,CAACC,GAAG,CAAC,QAAQ,EAAEsD,0BAAyB,CAAC;gBAChE1B,MAAI,CAAC/C,mBAAmB,CAAC,CAAC;cAC5B,CAAC;cACD+C,MAAI,CAAC/B,sBAAsB,GAAGyD,0BAAyB;cACvD;cACA1B,MAAI,CAAChE,KAAK,CAACkC,QAAQ,CAACC,GAAG,CAACwD,EAAE,CAAC,QAAQ,EAAED,0BAAyB,CAAC;YACjE;;YAEA;YAAA,IACK1B,MAAI,CAAChE,KAAK,CAACkC,QAAQ,CAACC,GAAG,CAACoD,WAAW,CAAC,CAAC;cAAAN,SAAA,CAAAlD,IAAA;cAAA;YAAA;YACxC1B,oBAAW,CAACC,MAAM,CAAC8E,IAAI,CACrB,8GACF,CAAC;YAAC,OAAAH,SAAA,CAAA1B,MAAA,WAEKnD,SAAS;UAAA;YAGlB;YACA,IAAI4D,MAAI,CAAC/B,sBAAsB,EAAE;cAC/B;cACA+B,MAAI,CAAChE,KAAK,CAACkC,QAAQ,CAACC,GAAG,CAACC,GAAG,CAAC,QAAQ,EAAE4B,MAAI,CAAC/B,sBAAsB,CAAC;cAClE+B,MAAI,CAAC/B,sBAAsB,GAAG,IAAI;YACpC;YAACgD,SAAA,CAAAlD,IAAA;YAAA,OAE2CiC,MAAI,CAACtB,qCAAqC,CAAC3C,OAAO,CAAC;UAAA;YAAzF+E,6BAA6B,GAAAG,SAAA,CAAA3B,IAAA;YAE7ByB,mCAAmC,GAAG,IAAA9F,WAAG,EAC7Cc,OAAO,EACP,8CACF,CAAC;YACKiF,sBAAsB,GAAG,CAAAjF,OAAO,aAAPA,OAAO,uBAAPA,OAAO,CAAEoF,QAAQ,CAAC,CAAC,KAAInB,MAAI,CAAC9C,gCAAgC,CAAC,CAAC,EAE7F;YACA;YAAA,MAEEgD,kBAAkB,KAAKF,MAAI,CAACkB,4BAA4B,IACxD,CAACF,sBAAsB,IACvB,CAACD,mCAAmC,IACpCA,mCAAmC,KAAKL,6BAA6B;cAAAO,SAAA,CAAAlD,IAAA;cAAA;YAAA;YAAA,OAAAkD,SAAA,CAAA1B,MAAA,WAE9DnD,SAAS;UAAA;YAGlB,IAAI0E,6BAA6B,EAAE;cACjCH,+BAA+B,GAAGG,6BAA6B;YACjE;;YAEA;YAAA,OAAAG,SAAA,CAAA1B,MAAA,WACOS,MAAI,CAAChE,KAAK,CAACkC,QAAQ,CAACC,GAAG,CAC3ByD,kBAAkB,CACjBtB,GAAG,EACHI,6BAA6B,EAC7BC,+BAA+B,EAC/BpH,+BACF,CAAC,CACAsI,IAAI,CAAC,UAACC,wBAAwB,EAAK;cAAA,IAAAC,qBAAA,EAAAC,sBAAA;cAClC;cACA;cACA;cACA,SAAAC,GAAA,MAAAC,eAAA,GAA+C9I,aAAa,EAAA6I,GAAA,GAAAC,eAAA,CAAA1D,MAAA,EAAAyD,GAAA,IAAE;gBAAzD,IAAAE,kBAAA,GAAAD,eAAA,CAAAD,GAAA;kBAAO5I,KAAK,GAAA8I,kBAAA,CAAL9I,KAAK;kBAAEG,WAAW,GAAA2I,kBAAA,CAAX3I,WAAW;kBAAEC,UAAU,GAAA0I,kBAAA,CAAV1I,UAAU;gBACxC,IAAIuG,MAAI,CAAChC,YAAY,CAACxE,WAAW,CAAC,EAAE;kBAClC;kBACAwG,MAAI,CAAChE,KAAK,CAACkC,QAAQ,CAACC,GAAG,CAACC,GAAG,CAAC/E,KAAK,EAAE2G,MAAI,CAAChC,YAAY,CAACxE,WAAW,CAAC,CAAC;gBACpE;gBACAwG,MAAI,CAAChC,YAAY,CAACxE,WAAW,CAAC,GAAGuC,OAAO,aAAPA,OAAO,uBAAPA,OAAO,CAAGtC,UAAU,CAAC;gBACtD;gBACAuG,MAAI,CAAChE,KAAK,CAACkC,QAAQ,CAACC,GAAG,CAACwD,EAAE,CAACtI,KAAK,EAAE2G,MAAI,CAAChC,YAAY,CAACxE,WAAW,CAAC,CAAC;cACnE;cACA;cACA,CAAAuI,qBAAA,GAAA/B,MAAI,CAAChE,KAAK,CAACkC,QAAQ,CAACmD,MAAM,cAAAU,qBAAA,wBAAAC,sBAAA,GAA1BD,qBAAA,CAA4BK,QAAQ,cAAAJ,sBAAA,uBAApCA,sBAAA,CAAAK,IAAA,CAAAN,qBAAuC,CAAC;cACxC,IAAInB,cAAc,EAAE;gBAClBZ,MAAI,CAAChE,KAAK,CAACkC,QAAQ,CAACmD,MAAM,CAACiB,6BAA6B,CAAC;kBAACC,SAAS,EAAE,CAAC,eAAe;gBAAC,CAAC,CAAC;cAC1F;cACAlG,oBAAW,CAACC,MAAM,CAAC8E,IAAI,kGAAA9H,MAAA,CAC4EC,+BAAoB,MACvH,CAAC;cAED,OAAOiJ,QAAA,CAAAnF,OAAA,CAAQoF,OAAO,CAACX,wBAAwB,CAAC;YAClD,CAAC,CAAC;UAAA;UAAA;YAAA,OAAAb,SAAA,CAAAxC,IAAA;QAAA;MAAA,GAAAwB,QAAA;IAAA;EACN,CAAC;EAED;AACF;AACA;AACA;AACA;EACEyC,uBAAuB,WAAvBA,uBAAuBA,CAACC,OAAO,EAAE;IAC/B,IAAM5G,OAAO,GAAG,IAAI,CAACD,0BAA0B,CAAC,CAAC;IAEjD,OAAO,IAAI,CAAC8G,OAAO,CAAC;MAClBC,MAAM,EAAEC,qBAAU,CAACC,KAAK;MACxBC,GAAG,KAAA1J,MAAA,CAAK,IAAI,CAACc,QAAQ,cAAW;MAChCwF,IAAI,EAAE;QACJqD,eAAe,EAAE;UACfN,OAAO,EAAPA;QACF;MACF;IACF,CAAC,CAAC,CACCd,IAAI,CAAC,UAACqB,QAAQ,EAAK;MAClBC,aAAW,CAACC,0BAA0B,CAACrH,OAAO,EAAEmH,QAAQ,CAAC;MAEzD,OAAOA,QAAQ;IACjB,CAAC,CAAC,CACDG,KAAK,CAAC,UAACC,KAAK,EAAK;MAChBjH,oBAAW,CAACC,MAAM,CAACgH,KAAK,CAAC,gDAAgD,EAAEA,KAAK,CAAC;MACjF,MAAMA,KAAK;IACb,CAAC,CAAC;EACN,CAAC;EAED;AACF;AACA;AACA;AACA;EACEC,2BAA2B,WAA3BA,2BAA2BA,CAACvI,OAAO,EAAE;IACnC,IAAI,CAACF,GAAG,CAAC,wBAAwB,EAAE,CAAC,EAACE,OAAO,aAAPA,OAAO,eAAPA,OAAO,CAAE2H,OAAO,EAAC;IACtD,IAAI,CAAC1F,mBAAmB,CAAC,CAAC,CAAC4E,IAAI,CAAC,YAAM,CAAC,CAAC,CAAC;EAC3C,CAAC;EAED;AACF;AACA;AACA;AACA;AACA;EACQ2B,YAAY,WAAZA,YAAYA,CAACzH,OAAO,EAAE0H,MAAM,EAAE;IAAA,IAAAC,MAAA;IAAA,WAAAtG,kBAAA,CAAAC,OAAA,eAAAC,YAAA,CAAAD,OAAA,CAAAE,IAAA,UAAAoG,SAAA;MAAA,IAAAC,GAAA,EAAAC,GAAA,EAAAC,GAAA,EAAAC,GAAA,EAAAC,GAAA,EAAAC,GAAA,EAAAC,GAAA,EAAAC,GAAA;MAAA,OAAA7G,YAAA,CAAAD,OAAA,CAAAO,IAAA,WAAAwG,SAAA;QAAA,kBAAAA,SAAA,CAAAtG,IAAA,GAAAsG,SAAA,CAAArG,IAAA;UAAA;YAAA,IAC7BhC,OAAO;cAAAqI,SAAA,CAAArG,IAAA;cAAA;YAAA;YACV1B,oBAAW,CAACC,MAAM,CAACgH,KAAK,gEAAAhK,MAAA,CACyCyC,OAAO,CACxE,CAAC;YAAC,MACI,IAAIsI,KAAK,CAAC,8CAA8C,CAAC;UAAA;YAAAT,GAAA,GAG1DF,MAAI;YAAAG,GAAA,GACDf,qBAAU,CAACwB,GAAG;YAAAR,GAAA,MAAAxK,MAAA,CACdoK,MAAI,CAACrJ,kBAAkB;YAAA0J,GAAA,GAAAQ,gBAAA,CAAAlH,OAAA;YAAA+G,SAAA,CAAArG,IAAA;YAAA,OAER2F,MAAI,CAAC1H,KAAK,CAACwI,WAAW,CAACC,YAAY,CAAC,CAAC;UAAA;YAAAT,GAAA,GAAAI,SAAA,CAAA9E,IAAA;YAAA2E,GAAA,MAAA3K,MAAA,CAC3CoL,iBAAM,CAACC,gBAAgB,OAAArL,MAAA,CAAIsL,aAAI,CAACC,EAAE,CAAC,CAAC,CAACC,QAAQ,CAAC,CAAC;YAAAZ,GAAA,GAAAH,GAAA;cAD9DgB,aAAa,EAAAf,GAAA;cACbgB,UAAU,EAAAf;YAAA,GACTgB,kBAAO,CAACC,YAAY,EAAGD,kBAAO,CAACE,kBAAkB,CAACC,gBAAgB;YAAAjB,GAAA,GAE/D;cACJkB,MAAM,EAAE,OAAO;cACfC,WAAW,EAAE;gBACXC,OAAO,EAAExJ,OAAO,CAACwJ,OAAO;gBACxBC,aAAa,EAAEzJ,OAAO,CAACyJ;cACzB,CAAC;cACD/B,MAAM,EAANA;YACF,CAAC;YAAA,OAAAW,SAAA,CAAA7E,MAAA,WAAAqE,GAAA,CAfShB,OAAO,CAAAP,IAAA,CAAAuB,GAAA;cACjBf,MAAM,EAAAgB,GAAA;cACNb,GAAG,EAAAc,GAAA;cACH2B,OAAO,EAAAvB,GAAA;cAKPtE,IAAI,EAAAuE;YAAA,GAQHd,KAAK,CAAC,UAACC,KAAK,EAAK;cAClBjH,oBAAW,CAACC,MAAM,CAACgH,KAAK,CAAC,qCAAqC,EAAEA,KAAK,CAAC;cACtE,MAAMA,KAAK;YACb,CAAC;UAAA;UAAA;YAAA,OAAAc,SAAA,CAAA3F,IAAA;QAAA;MAAA,GAAAkF,QAAA;IAAA;EACH,CAAC;EAED;AACF;AACA;AACA;EACQ+B,WAAW,WAAXA,WAAWA,CAAA,EAAG;IAAA,IAAAC,MAAA;IAAA,WAAAvI,kBAAA,CAAAC,OAAA,eAAAC,YAAA,CAAAD,OAAA,CAAAE,IAAA,UAAAqI,SAAA;MAAA,IAAAC,GAAA,EAAAC,GAAA,EAAAC,IAAA,EAAAC,IAAA,EAAAC,IAAA,EAAAC,IAAA,EAAAC,IAAA,EAAAC,IAAA;MAAA,OAAA9I,YAAA,CAAAD,OAAA,CAAAO,IAAA,WAAAyI,SAAA;QAAA,kBAAAA,SAAA,CAAAvI,IAAA,GAAAuI,SAAA,CAAAtI,IAAA;UAAA;YAAA8H,GAAA,GACXF,MAAI;YAAAG,GAAA,GACDhD,qBAAU,CAACwB,GAAG;YAAAyB,IAAA,MAAAzM,MAAA,CACdqM,MAAI,CAACtL,kBAAkB;YAAA2L,IAAA,GAAAzB,gBAAA,CAAAlH,OAAA;YAAAgJ,SAAA,CAAAtI,IAAA;YAAA,OAER4H,MAAI,CAAC3J,KAAK,CAACwI,WAAW,CAACC,YAAY,CAAC,CAAC;UAAA;YAAAwB,IAAA,GAAAI,SAAA,CAAA/G,IAAA;YAAA4G,IAAA,MAAA5M,MAAA,CAC3CoL,iBAAM,CAACC,gBAAgB,OAAArL,MAAA,CAAIsL,aAAI,CAACC,EAAE,CAAC,CAAC,CAACC,QAAQ,CAAC,CAAC;YAAAqB,IAAA,GAAAH,IAAA;cAD9DjB,aAAa,EAAAkB,IAAA;cACbjB,UAAU,EAAAkB;YAAA,GACTjB,kBAAO,CAACC,YAAY,EAAGD,kBAAO,CAACE,kBAAkB,CAACC,gBAAgB;YAAAgB,IAAA,GAE/D;cACJf,MAAM,EAAE;YACV,CAAC;YAAA,OAAAgB,SAAA,CAAA9G,MAAA,WAAAsG,GAAA,CAVSjD,OAAO,CAAAP,IAAA,CAAAwD,GAAA;cACjBhD,MAAM,EAAAiD,GAAA;cACN9C,GAAG,EAAA+C,IAAA;cACHN,OAAO,EAAAU,IAAA;cAKPvG,IAAI,EAAAwG;YAAA,GAGH/C,KAAK,CAAC,UAACC,KAAK,EAAK;cAClBjH,oBAAW,CAACC,MAAM,CAACgH,KAAK,CAAC,oCAAoC,EAAEA,KAAK,CAAC;cACrE,MAAMA,KAAK;YACb,CAAC;UAAA;UAAA;YAAA,OAAA+C,SAAA,CAAA5H,IAAA;QAAA;MAAA,GAAAmH,QAAA;IAAA;EACH,CAAC;EAED;AACF;AACA;AACA;EACQU,kBAAkB,WAAlBA,kBAAkBA,CAAA,EAAG;IAAA,IAAAC,MAAA;IAAA,WAAAnJ,kBAAA,CAAAC,OAAA,eAAAC,YAAA,CAAAD,OAAA,CAAAE,IAAA,UAAAiJ,SAAA;MAAA,IAAAC,IAAA,EAAAC,IAAA,EAAAC,IAAA,EAAAC,IAAA,EAAAC,IAAA,EAAAC,IAAA;MAAA,OAAAxJ,YAAA,CAAAD,OAAA,CAAAO,IAAA,WAAAmJ,SAAA;QAAA,kBAAAA,SAAA,CAAAjJ,IAAA,GAAAiJ,SAAA,CAAAhJ,IAAA;UAAA;YAAA0I,IAAA,GAClBF,MAAI;YAAAG,IAAA,GACD5D,qBAAU,CAACkE,GAAG;YAAAL,IAAA,MAAArN,MAAA,CACdiN,MAAI,CAAClM,kBAAkB;YAAA0M,SAAA,CAAAhJ,IAAA;YAAA,OAERwI,MAAI,CAACvK,KAAK,CAACwI,WAAW,CAACC,YAAY,CAAC,CAAC;UAAA;YAAAmC,IAAA,GAAAG,SAAA,CAAAzH,IAAA;YAAAuH,IAAA,MAAAvN,MAAA,CAC3CoL,iBAAM,CAACC,gBAAgB,OAAArL,MAAA,CAAIsL,aAAI,CAACC,EAAE,CAAC,CAAC,CAACC,QAAQ,CAAC,CAAC;YAAAgC,IAAA;cAD9D/B,aAAa,EAAA6B,IAAA;cACb5B,UAAU,EAAA6B;YAAA;YAAA,OAAAE,SAAA,CAAAxH,MAAA,WAAAkH,IAAA,CALF7D,OAAO,CAAAP,IAAA,CAAAoE,IAAA;cACjB5D,MAAM,EAAA6D,IAAA;cACN1D,GAAG,EAAA2D,IAAA;cACHlB,OAAO,EAAAqB;YAAA,GAINzD,KAAK,CAAC,UAACC,KAAK,EAAK;cAClBjH,oBAAW,CAACC,MAAM,CAACgH,KAAK,CAAC,2CAA2C,EAAEA,KAAK,CAAC;cAC5E,MAAMA,KAAK;YACb,CAAC;UAAA;UAAA;YAAA,OAAAyD,SAAA,CAAAtI,IAAA;QAAA;MAAA,GAAA+H,QAAA;IAAA;EACH,CAAC;EAED;AACF;AACA;AACA;AACA;EACQS,mBAAmB,WAAnBA,mBAAmBA,CAACxD,MAAM,EAAE;IAAA,IAAAyD,MAAA;IAAA,WAAA9J,kBAAA,CAAAC,OAAA,eAAAC,YAAA,CAAAD,OAAA,CAAAE,IAAA,UAAA4J,SAAA;MAAA,IAAAC,IAAA,EAAAC,IAAA,EAAAC,IAAA,EAAAC,IAAA,EAAAC,IAAA,EAAAC,IAAA,EAAAC,IAAA,EAAAC,IAAA;MAAA,OAAArK,YAAA,CAAAD,OAAA,CAAAO,IAAA,WAAAgK,SAAA;QAAA,kBAAAA,SAAA,CAAA9J,IAAA,GAAA8J,SAAA,CAAA7J,IAAA;UAAA;YAAAqJ,IAAA,GACzBF,MAAI;YAAAG,IAAA,GACDvE,qBAAU,CAACwB,GAAG;YAAAgD,IAAA,MAAAhO,MAAA,CACd4N,MAAI,CAAC7M,kBAAkB;YAAAkN,IAAA,GAAAhD,gBAAA,CAAAlH,OAAA;YAAAuK,SAAA,CAAA7J,IAAA;YAAA,OAERmJ,MAAI,CAAClL,KAAK,CAACwI,WAAW,CAACC,YAAY,CAAC,CAAC;UAAA;YAAA+C,IAAA,GAAAI,SAAA,CAAAtI,IAAA;YAAAmI,IAAA,MAAAnO,MAAA,CAC3CoL,iBAAM,CAACC,gBAAgB,OAAArL,MAAA,CAAIsL,aAAI,CAACC,EAAE,CAAC,CAAC,CAACC,QAAQ,CAAC,CAAC;YAAA4C,IAAA,GAAAH,IAAA;cAD9DxC,aAAa,EAAAyC,IAAA;cACbxC,UAAU,EAAAyC;YAAA,GACTxC,kBAAO,CAACC,YAAY,EAAGD,kBAAO,CAACE,kBAAkB,CAACC,gBAAgB;YAAAuC,IAAA,GAE/D;cACJE,WAAW,EAAEpE,MAAM,CAACoE,WAAW;cAC/BC,aAAa,EAAErE,MAAM,CAACqE,aAAa;cACnCC,eAAe,EAAEtE,MAAM,CAACsE,eAAe;cACvCC,kBAAkB,EAAEvE,MAAM,CAACuE;YAC7B,CAAC;YAAA,OAAAJ,SAAA,CAAArI,MAAA,WAAA6H,IAAA,CAbSxE,OAAO,CAAAP,IAAA,CAAA+E,IAAA;cACjBvE,MAAM,EAAAwE,IAAA;cACNrE,GAAG,EAAAsE,IAAA;cACH7B,OAAO,EAAAiC,IAAA;cAKP9H,IAAI,EAAA+H;YAAA,GAMHtE,KAAK,CAAC,UAACC,KAAK,EAAK;cAClBjH,oBAAW,CAACC,MAAM,CAACgH,KAAK,CAAC,4CAA4C,EAAEA,KAAK,CAAC;cAC7E,MAAMA,KAAK;YACb,CAAC;UAAA;UAAA;YAAA,OAAAsE,SAAA,CAAAnJ,IAAA;QAAA;MAAA,GAAA0I,QAAA;IAAA;EACH,CAAC;EAED;AACF;AACA;AACA;EACQc,uBAAuB,WAAvBA,uBAAuBA,CAAA,EAAG;IAAA,IAAAC,MAAA;IAAA,WAAA9K,kBAAA,CAAAC,OAAA,eAAAC,YAAA,CAAAD,OAAA,CAAAE,IAAA,UAAA4K,SAAA;MAAA,IAAAC,IAAA,EAAAC,IAAA,EAAAC,IAAA,EAAAC,IAAA,EAAAC,IAAA,EAAAC,IAAA;MAAA,OAAAnL,YAAA,CAAAD,OAAA,CAAAO,IAAA,WAAA8K,SAAA;QAAA,kBAAAA,SAAA,CAAA5K,IAAA,GAAA4K,SAAA,CAAA3K,IAAA;UAAA;YAAAqK,IAAA,GACvBF,MAAI;YAAAG,IAAA,GACDvF,qBAAU,CAACkE,GAAG;YAAAsB,IAAA,MAAAhP,MAAA,CACd4O,MAAI,CAAC7N,kBAAkB;YAAAqO,SAAA,CAAA3K,IAAA;YAAA,OAERmK,MAAI,CAAClM,KAAK,CAACwI,WAAW,CAACC,YAAY,CAAC,CAAC;UAAA;YAAA8D,IAAA,GAAAG,SAAA,CAAApJ,IAAA;YAAAkJ,IAAA,MAAAlP,MAAA,CAC3CoL,iBAAM,CAACC,gBAAgB,OAAArL,MAAA,CAAIsL,aAAI,CAACC,EAAE,CAAC,CAAC,CAACC,QAAQ,CAAC,CAAC;YAAA2D,IAAA;cAD9D1D,aAAa,EAAAwD,IAAA;cACbvD,UAAU,EAAAwD;YAAA;YAAA,OAAAE,SAAA,CAAAnJ,MAAA,WAAA6I,IAAA,CALFxF,OAAO,CAAAP,IAAA,CAAA+F,IAAA;cACjBvF,MAAM,EAAAwF,IAAA;cACNrF,GAAG,EAAAsF,IAAA;cACH7C,OAAO,EAAAgD;YAAA,GAINpF,KAAK,CAAC,UAACC,KAAK,EAAK;cAClBjH,oBAAW,CAACC,MAAM,CAACgH,KAAK,CAAC,gDAAgD,EAAEA,KAAK,CAAC;cACjF,MAAMA,KAAK;YACb,CAAC;UAAA;UAAA;YAAA,OAAAoF,SAAA,CAAAjK,IAAA;QAAA;MAAA,GAAA0J,QAAA;IAAA;EACH,CAAC;EAED;AACF;AACA;AACA;AACA;EACQQ,sBAAsB,WAAtBA,sBAAsBA,CAAA,EAAmB;IAAA,IAAAC,UAAA,GAAAC,SAAA;MAAAC,MAAA;IAAA,WAAA1L,kBAAA,CAAAC,OAAA,eAAAC,YAAA,CAAAD,OAAA,CAAAE,IAAA,UAAAwL,SAAA;MAAA,IAAAC,WAAA,EAAAC,IAAA,EAAAC,IAAA,EAAAC,IAAA,EAAAC,IAAA,EAAAC,IAAA,EAAAC,IAAA;MAAA,OAAAhM,YAAA,CAAAD,OAAA,CAAAO,IAAA,WAAA2L,SAAA;QAAA,kBAAAA,SAAA,CAAAzL,IAAA,GAAAyL,SAAA,CAAAxL,IAAA;UAAA;YAAlBiL,WAAW,GAAAJ,UAAA,CAAApK,MAAA,QAAAoK,UAAA,QAAAxM,SAAA,GAAAwM,UAAA,MAAG,EAAE;YAAAK,IAAA,GACpCH,MAAI;YAAAI,IAAA,GACDpG,qBAAU,CAACkE,GAAG;YAAAmC,IAAA,MAAA7P,MAAA,CACdwP,MAAI,CAACzO,kBAAkB,yBAAAf,MAAA,CAAsBkQ,kBAAkB,CAACR,WAAW,CAAC;YAAAO,SAAA,CAAAxL,IAAA;YAAA,OAE7D+K,MAAI,CAAC9M,KAAK,CAACwI,WAAW,CAACC,YAAY,CAAC,CAAC;UAAA;YAAA2E,IAAA,GAAAG,SAAA,CAAAjK,IAAA;YAAA+J,IAAA,MAAA/P,MAAA,CAC3CoL,iBAAM,CAACC,gBAAgB,OAAArL,MAAA,CAAIsL,aAAI,CAACC,EAAE,CAAC,CAAC,CAACC,QAAQ,CAAC,CAAC;YAAAwE,IAAA;cAD9DvE,aAAa,EAAAqE,IAAA;cACbpE,UAAU,EAAAqE;YAAA;YAAA,OAAAE,SAAA,CAAAhK,MAAA,WAAA0J,IAAA,CALFrG,OAAO,CAAAP,IAAA,CAAA4G,IAAA;cACjBpG,MAAM,EAAAqG,IAAA;cACNlG,GAAG,EAAAmG,IAAA;cACH1D,OAAO,EAAA6D;YAAA,GAINjG,KAAK,CAAC,UAACC,KAAK,EAAK;cAClBjH,oBAAW,CAACC,MAAM,CAACgH,KAAK,CAAC,+CAA+C,EAAEA,KAAK,CAAC;cAChF,MAAMA,KAAK;YACb,CAAC;UAAA;UAAA;YAAA,OAAAiG,SAAA,CAAA9K,IAAA;QAAA;MAAA,GAAAsK,QAAA;IAAA;EACH,CAAC;EAED;AACF;AACA;AACA;AACA;EACQU,oBAAoB,WAApBA,oBAAoBA,CAACC,aAAa,EAAE;IAAA,IAAAC,MAAA;IAAA,WAAAvM,kBAAA,CAAAC,OAAA,eAAAC,YAAA,CAAAD,OAAA,CAAAE,IAAA,UAAAqM,SAAA;MAAA,IAAAC,IAAA,EAAAC,IAAA,EAAAC,IAAA,EAAAC,IAAA,EAAAC,IAAA,EAAAC,IAAA;MAAA,OAAA5M,YAAA,CAAAD,OAAA,CAAAO,IAAA,WAAAuM,SAAA;QAAA,kBAAAA,SAAA,CAAArM,IAAA,GAAAqM,SAAA,CAAApM,IAAA;UAAA;YAAA8L,IAAA,GACjCF,MAAI;YAAAG,IAAA,GACDhH,qBAAU,CAACsH,MAAM;YAAAL,IAAA,MAAAzQ,MAAA,CACjBqQ,MAAI,CAACtP,kBAAkB,iBAAAf,MAAA,CAAcoQ,aAAa;YAAAS,SAAA,CAAApM,IAAA;YAAA,OAEnC4L,MAAI,CAAC3N,KAAK,CAACwI,WAAW,CAACC,YAAY,CAAC,CAAC;UAAA;YAAAuF,IAAA,GAAAG,SAAA,CAAA7K,IAAA;YAAA2K,IAAA,MAAA3Q,MAAA,CAC3CoL,iBAAM,CAACC,gBAAgB,OAAArL,MAAA,CAAIsL,aAAI,CAACC,EAAE,CAAC,CAAC,CAACC,QAAQ,CAAC,CAAC;YAAAoF,IAAA;cAD9DnF,aAAa,EAAAiF,IAAA;cACbhF,UAAU,EAAAiF;YAAA;YAAA,OAAAE,SAAA,CAAA5K,MAAA,WAAAsK,IAAA,CALFjH,OAAO,CAAAP,IAAA,CAAAwH,IAAA;cACjBhH,MAAM,EAAAiH,IAAA;cACN9G,GAAG,EAAA+G,IAAA;cACHtE,OAAO,EAAAyE;YAAA,GAIN7G,KAAK,CAAC,UAACC,KAAK,EAAK;cAClBjH,oBAAW,CAACC,MAAM,CAACgH,KAAK,CAAC,6CAA6C,EAAEA,KAAK,CAAC;cAC9E,MAAMA,KAAK;YACb,CAAC;UAAA;UAAA;YAAA,OAAA6G,SAAA,CAAA1L,IAAA;QAAA;MAAA,GAAAmL,QAAA;IAAA;EACH,CAAC;EAED;AACF;AACA;AACA;AACA;AACA;AACA;AACA;EACQS,gCAAgC,WAAhCA,gCAAgCA,CAACrP,OAAO,EAAE;IAAA,IAAAsP,MAAA;IAAA,WAAAlN,kBAAA,CAAAC,OAAA,eAAAC,YAAA,CAAAD,OAAA,CAAAE,IAAA,UAAAgN,SAAA;MAAA,IAAAC,cAAA,EAAAC,mBAAA,EAAAC,qBAAA,EAAAC,sBAAA,EAAAC,sBAAA;MAAA,IAAA7O,OAAA,EAAA8O,SAAA,EAAAC,iBAAA,EAAAC,IAAA,EAAAC,IAAA,EAAAC,IAAA,EAAAC,IAAA,EAAAC,IAAA,EAAAC,IAAA;MAAA,OAAA9N,YAAA,CAAAD,OAAA,CAAAO,IAAA,WAAAyN,SAAA;QAAA,kBAAAA,SAAA,CAAAvN,IAAA,GAAAuN,SAAA,CAAAtN,IAAA;UAAA;YACxChC,OAAO,GAAGuO,MAAI,CAACxO,0BAA0B,CAAC,CAAC;YAAA,IAC5CC,OAAO;cAAAsP,SAAA,CAAAtN,IAAA;cAAA;YAAA;YACV1B,oBAAW,CAACC,MAAM,CAACgH,KAAK,CACtB,sGACF,CAAC;YAAC,MACI,IAAIe,KAAK,CAAC,2EAA2E,CAAC;UAAA;YAGxFwG,SAAS,GAAG;cAChBS,WAAW,EAAEtQ,OAAO,aAAPA,OAAO,uBAAPA,OAAO,CAAEgO,WAAW;cACjCuC,KAAK,GAAAf,cAAA,GAAExP,OAAO,aAAPA,OAAO,uBAAPA,OAAO,CAAEuQ,KAAK,cAAAf,cAAA,cAAAA,cAAA,GAAIgB,4DAAiD;cAC1EzN,IAAI,EAAE/C,OAAO,aAAPA,OAAO,uBAAPA,OAAO,CAAE+C;YACjB,CAAC;YACK+M,iBAAiB,GAAG/O,OAAO,aAAPA,OAAO,wBAAA0O,mBAAA,GAAP1O,OAAO,CAAEe,SAAS,cAAA2N,mBAAA,wBAAAC,qBAAA,GAAlBD,mBAAA,CAAoBgB,KAAK,cAAAf,qBAAA,wBAAAC,sBAAA,GAAzBD,qBAAA,CAA2BgB,SAAS,cAAAf,sBAAA,wBAAAC,sBAAA,GAApCD,sBAAA,CAAsCgB,cAAc,cAAAf,sBAAA,uBAApDA,sBAAA,CAAsDtK,GAAG;YAAA,IAC9EwK,iBAAiB;cAAAO,SAAA,CAAAtN,IAAA;cAAA;YAAA;YACpB1B,oBAAW,CAACC,MAAM,CAACgH,KAAK,CACtB,+FACF,CAAC;YAAC,MACI,IAAIe,KAAK,CAAC,wDAAwD,CAAC;UAAA;YAAA0G,IAAA,GAGpET,MAAI;YAAAU,IAAA,GACDlI,qBAAU,CAACkE,GAAG;YAAAiE,IAAA,MAAA3R,MAAA,CACdwR,iBAAiB,OAAAxR,MAAA,CAAI,IAAIsS,eAAe,CAAC,IAAAC,qBAAc,EAAChB,SAAS,CAAC,CAAC,CAAC/F,QAAQ,CAAC,CAAC;YAAAuG,SAAA,CAAAtN,IAAA;YAAA,OAE/DuM,MAAI,CAACtO,KAAK,CAACwI,WAAW,CAACC,YAAY,CAAC,CAAC;UAAA;YAAAyG,IAAA,GAAAG,SAAA,CAAA/L,IAAA;YAAA6L,IAAA,MAAA7R,MAAA,CAC3CoL,iBAAM,CAACC,gBAAgB,OAAArL,MAAA,CAAIsL,aAAI,CAACC,EAAE,CAAC,CAAC,CAACC,QAAQ,CAAC,CAAC;YAAAsG,IAAA;cAD9DrG,aAAa,EAAAmG,IAAA;cACblG,UAAU,EAAAmG;YAAA;YAAA,OAAAE,SAAA,CAAA9L,MAAA,WAAAwL,IAAA,CALFnI,OAAO,CAAAP,IAAA,CAAA0I,IAAA;cACjBlI,MAAM,EAAAmI,IAAA;cACNhI,GAAG,EAAAiI,IAAA;cACHxF,OAAO,EAAA2F;YAAA,GAIN/H,KAAK,CAAC,UAACC,KAAK,EAAK;cAClBjH,oBAAW,CAACC,MAAM,CAACgH,KAAK,CAAC,2DAA2D,EAAEA,KAAK,CAAC;cAC5F,MAAMA,KAAK;YACb,CAAC;UAAA;UAAA;YAAA,OAAA+H,SAAA,CAAA5M,IAAA;QAAA;MAAA,GAAA8L,QAAA;IAAA;EACH,CAAC;EAAAuB,OAAA;AACH,CAAC,CAAC;AAAC,IAAAC,QAAA,GAAAC,OAAA,CAAA3O,OAAA,GAEY1D,OAAO","ignoreList":[]}
package/package.json CHANGED
@@ -94,5 +94,5 @@
94
94
  "//": [
95
95
  "TODO: upgrade jwt-decode when moving to node 18"
96
96
  ],
97
- "version": "3.12.0-next.64"
97
+ "version": "3.12.0-next.65"
98
98
  }
@@ -14,6 +14,7 @@ import {
14
14
  SHARE_STATUS,
15
15
  DEFAULT_LARGE_SCALE_WEBINAR_ATTENDEE_SEARCH_LIMIT,
16
16
  LLM_PRACTICE_SESSION,
17
+ LOCUS_LLM_EVENT,
17
18
  } from '../constants';
18
19
 
19
20
  import WebinarCollection from './collection';
@@ -21,6 +22,19 @@ import LoggerProxy from '../common/logs/logger-proxy';
21
22
  import MeetingUtil from '../meeting/util';
22
23
  import {sanitizeParams} from './utils';
23
24
 
25
+ const PS_LLM_EVENTS = [
26
+ {
27
+ event: `event:relay.event:${LLM_PRACTICE_SESSION}`,
28
+ listenerKey: 'relay',
29
+ handlerKey: 'processRelayEvent',
30
+ },
31
+ {
32
+ event: `${LOCUS_LLM_EVENT}:${LLM_PRACTICE_SESSION}`,
33
+ listenerKey: 'locusLLM',
34
+ handlerKey: 'processLocusLLMEvent',
35
+ },
36
+ ];
37
+
24
38
  /**
25
39
  * @class Webinar
26
40
  */
@@ -171,6 +185,8 @@ const Webinar = WebexPlugin.extend({
171
185
  * @returns {Promise<void>}
172
186
  */
173
187
  async cleanupPSDataChannel() {
188
+ this.llmListeners = this.llmListeners || {};
189
+
174
190
  if (this._pendingOnlineListener) {
175
191
  // @ts-ignore - Fix type
176
192
  this.webex.internal.llm.off('online', this._pendingOnlineListener);
@@ -186,13 +202,12 @@ const Webinar = WebexPlugin.extend({
186
202
  LLM_PRACTICE_SESSION
187
203
  );
188
204
 
189
- if (this._practiceSessionRelayListener) {
190
- // @ts-ignore - Fix type
191
- this.webex.internal.llm.off(
192
- `event:relay.event:${LLM_PRACTICE_SESSION}`,
193
- this._practiceSessionRelayListener
194
- );
195
- this._practiceSessionRelayListener = null;
205
+ for (const {event, listenerKey} of PS_LLM_EVENTS) {
206
+ if (this.llmListeners[listenerKey]) {
207
+ // @ts-ignore - Fix type
208
+ this.webex.internal.llm.off(event, this.llmListeners[listenerKey]);
209
+ this.llmListeners[listenerKey] = null;
210
+ }
196
211
  }
197
212
  },
198
213
 
@@ -252,6 +267,8 @@ const Webinar = WebexPlugin.extend({
252
267
  * @returns {Promise}
253
268
  */
254
269
  async updatePSDataChannel() {
270
+ this.llmListeners = this.llmListeners || {};
271
+
255
272
  this._updatePSDataChannelSequence = (this._updatePSDataChannelSequence || 0) + 1;
256
273
  const invocationSequence = this._updatePSDataChannelSequence;
257
274
 
@@ -356,22 +373,18 @@ const Webinar = WebexPlugin.extend({
356
373
  LLM_PRACTICE_SESSION
357
374
  )
358
375
  .then((registerAndConnectResult) => {
359
- // Track the exact listener reference so cleanupPSDataChannel can
376
+ // Track the exact listener references so cleanupPSDataChannel can
360
377
  // unsubscribe deterministically, even if the meeting can no longer
361
378
  // be resolved at cleanup time.
362
- if (this._practiceSessionRelayListener) {
379
+ for (const {event, listenerKey, handlerKey} of PS_LLM_EVENTS) {
380
+ if (this.llmListeners[listenerKey]) {
381
+ // @ts-ignore - Fix type
382
+ this.webex.internal.llm.off(event, this.llmListeners[listenerKey]);
383
+ }
384
+ this.llmListeners[listenerKey] = meeting?.[handlerKey];
363
385
  // @ts-ignore - Fix type
364
- this.webex.internal.llm.off(
365
- `event:relay.event:${LLM_PRACTICE_SESSION}`,
366
- this._practiceSessionRelayListener
367
- );
386
+ this.webex.internal.llm.on(event, this.llmListeners[listenerKey]);
368
387
  }
369
- this._practiceSessionRelayListener = meeting?.processRelayEvent;
370
- // @ts-ignore - Fix type
371
- this.webex.internal.llm.on(
372
- `event:relay.event:${LLM_PRACTICE_SESSION}`,
373
- this._practiceSessionRelayListener
374
- );
375
388
  // @ts-ignore - Fix type
376
389
  this.webex.internal.voicea?.announce?.();
377
390
  if (isCaptionBoxOn) {
@@ -5,7 +5,7 @@ import MockWebex from '@webex/test-helper-mock-webex';
5
5
  import uuid from 'uuid';
6
6
  import sinon from 'sinon';
7
7
  import {DataChannelTokenType} from '@webex/internal-plugin-llm';
8
- import {LLM_PRACTICE_SESSION, SHARE_STATUS} from '@webex/plugin-meetings/src/constants';
8
+ import {LLM_PRACTICE_SESSION, LOCUS_LLM_EVENT, SHARE_STATUS} from '@webex/plugin-meetings/src/constants';
9
9
 
10
10
  describe('plugin-meetings', () => {
11
11
  describe('Webinar', () => {
@@ -227,7 +227,7 @@ describe('plugin-meetings', () => {
227
227
 
228
228
  beforeEach(() => {
229
229
  relayListener = sinon.stub();
230
- webinar._practiceSessionRelayListener = relayListener;
230
+ webinar.llmListeners = {relay: relayListener, locusLLM: null};
231
231
  });
232
232
 
233
233
  it('disconnects the practice session channel and removes the tracked relay listener', async () => {
@@ -238,16 +238,16 @@ describe('plugin-meetings', () => {
238
238
  {code: 3050, reason: 'done (permanent)'},
239
239
  LLM_PRACTICE_SESSION
240
240
  );
241
- assert.calledOnceWithExactly(
241
+ assert.calledWithExactly(
242
242
  webex.internal.llm.off,
243
243
  `event:relay.event:${LLM_PRACTICE_SESSION}`,
244
244
  relayListener
245
245
  );
246
- assert.isNull(webinar._practiceSessionRelayListener);
246
+ assert.isNull(webinar.llmListeners.relay);
247
247
  });
248
248
 
249
249
  it('skips relay listener removal when no listener has been tracked', async () => {
250
- webinar._practiceSessionRelayListener = null;
250
+ webinar.llmListeners.relay = null;
251
251
 
252
252
  await webinar.cleanupPSDataChannel();
253
253
 
@@ -257,6 +257,31 @@ describe('plugin-meetings', () => {
257
257
  assert.equal(relayOffCalls.length, 0);
258
258
  });
259
259
 
260
+ it('disconnects and removes the tracked locusLLM listener', async () => {
261
+ const locusLLMListener = sinon.stub();
262
+ webinar.llmListeners.locusLLM = locusLLMListener;
263
+
264
+ await webinar.cleanupPSDataChannel();
265
+
266
+ assert.calledWithExactly(
267
+ webex.internal.llm.off,
268
+ `${LOCUS_LLM_EVENT}:${LLM_PRACTICE_SESSION}`,
269
+ locusLLMListener
270
+ );
271
+ assert.isNull(webinar.llmListeners.locusLLM);
272
+ });
273
+
274
+ it('skips locusLLM listener removal when no listener has been tracked', async () => {
275
+ webinar.llmListeners.locusLLM = null;
276
+
277
+ await webinar.cleanupPSDataChannel();
278
+
279
+ const locusLLMOffCalls = webex.internal.llm.off.args.filter(
280
+ ([event]) => event === `${LOCUS_LLM_EVENT}:${LLM_PRACTICE_SESSION}`
281
+ );
282
+ assert.equal(locusLLMOffCalls.length, 0);
283
+ });
284
+
260
285
  it('does not consult the meeting collection during cleanup', async () => {
261
286
  webex.meetings.getMeetingByType = sinon.stub();
262
287
 
@@ -289,13 +314,16 @@ describe('plugin-meetings', () => {
289
314
  describe('#updatePSDataChannel', () => {
290
315
  let meeting;
291
316
  let processRelayEvent;
317
+ let processLocusLLMEvent;
292
318
 
293
319
  beforeEach(() => {
294
320
  processRelayEvent = sinon.stub();
321
+ processLocusLLMEvent = sinon.stub();
295
322
  meeting = {
296
323
  locusUrl: 'locusUrl',
297
324
  isJoined: sinon.stub().returns(true),
298
325
  processRelayEvent,
326
+ processLocusLLMEvent,
299
327
  locusInfo: {
300
328
  url: 'locus-url',
301
329
  info: {practiceSessionDatachannelUrl: 'dc-url'},
@@ -476,7 +504,7 @@ describe('plugin-meetings', () => {
476
504
  await webinar.updatePSDataChannel();
477
505
 
478
506
  // Stores the exact listener reference for deterministic cleanup
479
- assert.equal(webinar._practiceSessionRelayListener, processRelayEvent);
507
+ assert.equal(webinar.llmListeners.relay, processRelayEvent);
480
508
  assert.calledWith(
481
509
  webex.internal.llm.on,
482
510
  `event:relay.event:${LLM_PRACTICE_SESSION}`,
@@ -486,7 +514,7 @@ describe('plugin-meetings', () => {
486
514
 
487
515
  it('removes a previously tracked relay listener before re-binding on reconnect', async () => {
488
516
  const previousListener = sinon.stub();
489
- webinar._practiceSessionRelayListener = previousListener;
517
+ webinar.llmListeners = {relay: previousListener, locusLLM: null};
490
518
 
491
519
  await webinar.updatePSDataChannel();
492
520
 
@@ -495,7 +523,32 @@ describe('plugin-meetings', () => {
495
523
  `event:relay.event:${LLM_PRACTICE_SESSION}`,
496
524
  previousListener
497
525
  );
498
- assert.equal(webinar._practiceSessionRelayListener, processRelayEvent);
526
+ assert.equal(webinar.llmListeners.relay, processRelayEvent);
527
+ });
528
+
529
+ it('tracks and binds the locusLLM listener after successful connect', async () => {
530
+ await webinar.updatePSDataChannel();
531
+
532
+ assert.equal(webinar.llmListeners.locusLLM, processLocusLLMEvent);
533
+ assert.calledWith(
534
+ webex.internal.llm.on,
535
+ `${LOCUS_LLM_EVENT}:${LLM_PRACTICE_SESSION}`,
536
+ processLocusLLMEvent
537
+ );
538
+ });
539
+
540
+ it('removes a previously tracked locusLLM listener before re-binding on reconnect', async () => {
541
+ const previousListener = sinon.stub();
542
+ webinar.llmListeners = {relay: null, locusLLM: previousListener};
543
+
544
+ await webinar.updatePSDataChannel();
545
+
546
+ assert.calledWith(
547
+ webex.internal.llm.off,
548
+ `${LOCUS_LLM_EVENT}:${LLM_PRACTICE_SESSION}`,
549
+ previousListener
550
+ );
551
+ assert.equal(webinar.llmListeners.locusLLM, processLocusLLMEvent);
499
552
  });
500
553
 
501
554
  it('subscribes to transcription when caption intent is enabled', async () => {