@webex/plugin-meetings 3.12.0-next.44 → 3.12.0-next.45
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/aiEnableRequest/index.js +1 -1
- package/dist/breakouts/breakout.js +1 -1
- package/dist/breakouts/index.js +1 -1
- package/dist/interpretation/index.js +1 -1
- package/dist/interpretation/siLanguage.js +1 -1
- package/dist/meeting/index.js +94 -20
- package/dist/meeting/index.js.map +1 -1
- package/dist/types/meeting/index.d.ts +6 -0
- package/dist/webinar/index.js +63 -17
- package/dist/webinar/index.js.map +1 -1
- package/package.json +3 -3
- package/src/meeting/index.ts +79 -6
- package/src/webinar/index.ts +75 -17
- package/test/unit/spec/meeting/index.js +183 -0
- package/test/unit/spec/webinar/index.ts +81 -16
|
@@ -1410,6 +1410,12 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
1410
1410
|
private stopListeningForMeetingEvents;
|
|
1411
1411
|
/**
|
|
1412
1412
|
* Disconnects and cleans up the default LLM session listeners/timers.
|
|
1413
|
+
*
|
|
1414
|
+
* Ownership-aware: only calls `disconnectLLM` when this meeting is the
|
|
1415
|
+
* current owner of the default LLM session (or when no owner is recorded).
|
|
1416
|
+
* Event listeners belonging to this meeting instance are always detached
|
|
1417
|
+
* so they do not receive another meeting's relay events.
|
|
1418
|
+
*
|
|
1413
1419
|
* @param {Object} options
|
|
1414
1420
|
* @param {boolean} [options.removeOnlineListener=true] removes the one-time online listener
|
|
1415
1421
|
* @param {boolean} [options.throwOnError=true] rethrows disconnect errors when true
|
package/dist/webinar/index.js
CHANGED
|
@@ -100,6 +100,31 @@ var Webinar = _webexCore.WebexPlugin.extend({
|
|
|
100
100
|
isDemoted: isDemoted
|
|
101
101
|
};
|
|
102
102
|
},
|
|
103
|
+
/**
|
|
104
|
+
* Resolves the meeting associated with this webinar instance, guarded against the
|
|
105
|
+
* meetingId pointer drifting onto an unrelated transient meeting (e.g. an inbound
|
|
106
|
+
* 1:1 call) that may exist in the meeting collection. Returns the meeting only when
|
|
107
|
+
* its locusUrl matches this webinar's tracked locusUrl. Returns undefined (with a
|
|
108
|
+
* warning) when the meeting cannot be resolved or when the webinar's locusUrl has
|
|
109
|
+
* not been initialized yet — callers must treat this as "no owned meeting" rather
|
|
110
|
+
* than fall through to an unvalidated lookup.
|
|
111
|
+
* @returns {object|undefined}
|
|
112
|
+
*/
|
|
113
|
+
getValidatedWebinarMeeting: function getValidatedWebinarMeeting() {
|
|
114
|
+
var meeting = this.webex.meetings.getMeetingByType(_constants._ID_, this.meetingId);
|
|
115
|
+
if (!meeting) {
|
|
116
|
+
return undefined;
|
|
117
|
+
}
|
|
118
|
+
if (!this.locusUrl) {
|
|
119
|
+
_loggerProxy.default.logger.warn("Webinar:index#getValidatedWebinarMeeting --> skipping; webinar locusUrl is not yet initialized for meetingId ".concat(this.meetingId));
|
|
120
|
+
return undefined;
|
|
121
|
+
}
|
|
122
|
+
if (meeting.locusUrl !== this.locusUrl) {
|
|
123
|
+
_loggerProxy.default.logger.warn("Webinar:index#getValidatedWebinarMeeting --> skipping; meeting ".concat(this.meetingId, " locusUrl ").concat(meeting.locusUrl, " does not match webinar locusUrl ").concat(this.locusUrl));
|
|
124
|
+
return undefined;
|
|
125
|
+
}
|
|
126
|
+
return meeting;
|
|
127
|
+
},
|
|
103
128
|
/**
|
|
104
129
|
* should join practice session data channel or not
|
|
105
130
|
* @param {Object} {isPromoted: boolean, isDemoted: boolean}} Role transition states
|
|
@@ -108,7 +133,7 @@ var Webinar = _webexCore.WebexPlugin.extend({
|
|
|
108
133
|
updateStatusByRole: function updateStatusByRole(_ref) {
|
|
109
134
|
var isPromoted = _ref.isPromoted,
|
|
110
135
|
isDemoted = _ref.isDemoted;
|
|
111
|
-
var meeting = this.
|
|
136
|
+
var meeting = this.getValidatedWebinarMeeting();
|
|
112
137
|
if (isDemoted && (meeting === null || meeting === void 0 ? void 0 : meeting.shareStatus) === _constants.SHARE_STATUS.WHITEBOARD_SHARE_ACTIVE || isPromoted) {
|
|
113
138
|
var _meeting$locusInfo, _meeting$locusInfo2;
|
|
114
139
|
// attendees in webinar should subscribe streaming for whiteboard sharing
|
|
@@ -126,12 +151,14 @@ var Webinar = _webexCore.WebexPlugin.extend({
|
|
|
126
151
|
},
|
|
127
152
|
/**
|
|
128
153
|
* Disconnects the practice session data channel and removes its relay listener.
|
|
154
|
+
* The listener reference removed here is the exact callback captured at subscribe
|
|
155
|
+
* time (see updatePSDataChannel) so that cleanup is correct even if the underlying
|
|
156
|
+
* meeting can no longer be resolved (e.g. locusUrl mismatch).
|
|
129
157
|
* @returns {Promise<void>}
|
|
130
158
|
*/
|
|
131
159
|
cleanupPSDataChannel: function cleanupPSDataChannel() {
|
|
132
160
|
var _this = this;
|
|
133
161
|
return (0, _asyncToGenerator2.default)(/*#__PURE__*/_regenerator.default.mark(function _callee() {
|
|
134
|
-
var meeting;
|
|
135
162
|
return _regenerator.default.wrap(function (_context) {
|
|
136
163
|
while (1) switch (_context.prev = _context.next) {
|
|
137
164
|
case 0:
|
|
@@ -140,15 +167,19 @@ var Webinar = _webexCore.WebexPlugin.extend({
|
|
|
140
167
|
_this.webex.internal.llm.off('online', _this._pendingOnlineListener);
|
|
141
168
|
_this._pendingOnlineListener = null;
|
|
142
169
|
}
|
|
143
|
-
|
|
170
|
+
|
|
171
|
+
// @ts-ignore - Fix type
|
|
144
172
|
_context.next = 1;
|
|
145
173
|
return _this.webex.internal.llm.disconnectLLM({
|
|
146
174
|
code: 3050,
|
|
147
175
|
reason: 'done (permanent)'
|
|
148
176
|
}, _constants.LLM_PRACTICE_SESSION);
|
|
149
177
|
case 1:
|
|
150
|
-
|
|
151
|
-
|
|
178
|
+
if (_this._practiceSessionRelayListener) {
|
|
179
|
+
// @ts-ignore - Fix type
|
|
180
|
+
_this.webex.internal.llm.off("event:relay.event:".concat(_constants.LLM_PRACTICE_SESSION), _this._practiceSessionRelayListener);
|
|
181
|
+
_this._practiceSessionRelayListener = null;
|
|
182
|
+
}
|
|
152
183
|
case 2:
|
|
153
184
|
case "end":
|
|
154
185
|
return _context.stop();
|
|
@@ -158,6 +189,8 @@ var Webinar = _webexCore.WebexPlugin.extend({
|
|
|
158
189
|
},
|
|
159
190
|
/**
|
|
160
191
|
* Ensures practice-session token exists before registering the practice LLM channel.
|
|
192
|
+
* Caller is responsible for passing a meeting that has already been resolved via
|
|
193
|
+
* getValidatedWebinarMeeting() — this method does not re-validate ownership.
|
|
161
194
|
* @param {object} meeting
|
|
162
195
|
* @returns {Promise<string|undefined>}
|
|
163
196
|
*/
|
|
@@ -227,7 +260,7 @@ var Webinar = _webexCore.WebexPlugin.extend({
|
|
|
227
260
|
case 0:
|
|
228
261
|
_this3._updatePSDataChannelSequence = (_this3._updatePSDataChannelSequence || 0) + 1;
|
|
229
262
|
invocationSequence = _this3._updatePSDataChannelSequence;
|
|
230
|
-
meeting = _this3.
|
|
263
|
+
meeting = _this3.getValidatedWebinarMeeting();
|
|
231
264
|
isPracticeSession = (meeting === null || meeting === void 0 ? void 0 : meeting.isJoined()) && _this3.isJoinPracticeSessionDataChannel();
|
|
232
265
|
if (isPracticeSession) {
|
|
233
266
|
_context3.next = 2;
|
|
@@ -314,10 +347,16 @@ var Webinar = _webexCore.WebexPlugin.extend({
|
|
|
314
347
|
// @ts-ignore - Fix type
|
|
315
348
|
return _context3.abrupt("return", _this3.webex.internal.llm.registerAndConnect(url, practiceSessionDatachannelUrl, practiceSessionDatachannelToken, _constants.LLM_PRACTICE_SESSION).then(function (registerAndConnectResult) {
|
|
316
349
|
var _this3$webex$internal, _this3$webex$internal2;
|
|
350
|
+
// Track the exact listener reference so cleanupPSDataChannel can
|
|
351
|
+
// unsubscribe deterministically, even if the meeting can no longer
|
|
352
|
+
// be resolved at cleanup time.
|
|
353
|
+
if (_this3._practiceSessionRelayListener) {
|
|
354
|
+
// @ts-ignore - Fix type
|
|
355
|
+
_this3.webex.internal.llm.off("event:relay.event:".concat(_constants.LLM_PRACTICE_SESSION), _this3._practiceSessionRelayListener);
|
|
356
|
+
}
|
|
357
|
+
_this3._practiceSessionRelayListener = meeting === null || meeting === void 0 ? void 0 : meeting.processRelayEvent;
|
|
317
358
|
// @ts-ignore - Fix type
|
|
318
|
-
_this3.webex.internal.llm.
|
|
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);
|
|
359
|
+
_this3.webex.internal.llm.on("event:relay.event:".concat(_constants.LLM_PRACTICE_SESSION), _this3._practiceSessionRelayListener);
|
|
321
360
|
// @ts-ignore - Fix type
|
|
322
361
|
(_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);
|
|
323
362
|
if (isCaptionBoxOn) {
|
|
@@ -682,7 +721,14 @@ var Webinar = _webexCore.WebexPlugin.extend({
|
|
|
682
721
|
return _regenerator.default.wrap(function (_context1) {
|
|
683
722
|
while (1) switch (_context1.prev = _context1.next) {
|
|
684
723
|
case 0:
|
|
685
|
-
meeting = _this1.
|
|
724
|
+
meeting = _this1.getValidatedWebinarMeeting();
|
|
725
|
+
if (meeting) {
|
|
726
|
+
_context1.next = 1;
|
|
727
|
+
break;
|
|
728
|
+
}
|
|
729
|
+
_loggerProxy.default.logger.error('Meeting:webinar5k#searchLargeScaleWebinarAttendees failed --> webinar meeting could not be validated');
|
|
730
|
+
throw new Error('Meeting:webinar5k#Webinar meeting is not resolvable for the current locus');
|
|
731
|
+
case 1:
|
|
686
732
|
rawParams = {
|
|
687
733
|
search_text: payload === null || payload === void 0 ? void 0 : payload.queryString,
|
|
688
734
|
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,18 +736,18 @@ var Webinar = _webexCore.WebexPlugin.extend({
|
|
|
690
736
|
};
|
|
691
737
|
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
738
|
if (attendeeSearchUrl) {
|
|
693
|
-
_context1.next =
|
|
739
|
+
_context1.next = 2;
|
|
694
740
|
break;
|
|
695
741
|
}
|
|
696
|
-
_loggerProxy.default.logger.error(
|
|
742
|
+
_loggerProxy.default.logger.error('Meeting:webinar5k#searchLargeScaleWebinarAttendees failed --> attendee search url unavailable');
|
|
697
743
|
throw new Error('Meeting:webinar5k#Attendee search url is not available');
|
|
698
|
-
case
|
|
744
|
+
case 2:
|
|
699
745
|
_t48 = _this1;
|
|
700
746
|
_t49 = _constants.HTTP_VERBS.GET;
|
|
701
747
|
_t50 = "".concat(attendeeSearchUrl, "?").concat(new URLSearchParams((0, _utils.sanitizeParams)(rawParams)).toString());
|
|
702
|
-
_context1.next =
|
|
748
|
+
_context1.next = 3;
|
|
703
749
|
return _this1.webex.credentials.getUserToken();
|
|
704
|
-
case
|
|
750
|
+
case 3:
|
|
705
751
|
_t51 = _context1.sent;
|
|
706
752
|
_t52 = "".concat(_webexCore.config.trackingIdPrefix, "_").concat(_uuid.default.v4().toString());
|
|
707
753
|
_t53 = {
|
|
@@ -716,14 +762,14 @@ var Webinar = _webexCore.WebexPlugin.extend({
|
|
|
716
762
|
_loggerProxy.default.logger.error('Meeting:webinar5k#searchLargeScaleWebinarAttendees failed', error);
|
|
717
763
|
throw error;
|
|
718
764
|
}));
|
|
719
|
-
case
|
|
765
|
+
case 4:
|
|
720
766
|
case "end":
|
|
721
767
|
return _context1.stop();
|
|
722
768
|
}
|
|
723
769
|
}, _callee1);
|
|
724
770
|
}))();
|
|
725
771
|
},
|
|
726
|
-
version: "3.12.0-next.
|
|
772
|
+
version: "3.12.0-next.45"
|
|
727
773
|
});
|
|
728
774
|
var _default = exports.default = Webinar;
|
|
729
775
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_webexCore","require","_uuid","_interopRequireDefault","_lodash","_internalPluginLlm","_constants","_collection","_loggerProxy","_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","_ref","meeting","webex","meetings","getMeetingByType","_ID_","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","concat","processRelayEvent","stop","ensurePracticeSessionDatachannelToken","_this2","_callee2","isDataChannelTokenEnabled","cachedToken","_refreshResponse$body","refreshResponse","_ref2","datachannelToken","dataChannelTokenType","_t","_context2","sent","abrupt","undefined","getDatachannelToken","DataChannelTokenType","PracticeSession","refreshDataChannelToken","body","setDatachannelToken","LoggerProxy","logger","warn","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","announce","call","updateSubchannelSubscriptions","subscribe","_promise","resolve","setPracticeSessionState","enabled","request","method","HTTP_VERBS","PATCH","uri","practiceSession","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 {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 * 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.webex.meetings.getMeetingByType(_ID_, this.meetingId);\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 * @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 const meeting = this.webex.meetings.getMeetingByType(_ID_, this.meetingId);\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 // @ts-ignore - Fix type\n this.webex.internal.llm.off(\n `event:relay.event:${LLM_PRACTICE_SESSION}`,\n meeting?.processRelayEvent\n );\n },\n\n /**\n * Ensures practice-session token exists before registering the practice LLM channel.\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.webex.meetings.getMeetingByType(_ID_, this.meetingId);\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 // @ts-ignore - Fix type\n this.webex.internal.llm.off(\n `event:relay.event:${LLM_PRACTICE_SESSION}`,\n meeting?.processRelayEvent\n );\n // @ts-ignore - Fix type\n this.webex.internal.llm.on(\n `event:relay.event:${LLM_PRACTICE_SESSION}`,\n meeting?.processRelayEvent\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 return this.request({\n method: HTTP_VERBS.PATCH,\n uri: `${this.locusUrl}/controls`,\n body: {\n practiceSession: {\n enabled,\n },\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.webex.meetings.getMeetingByType(_ID_, this.meetingId);\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(`Meeting:webinar5k#searchLargeScaleWebinarAttendees failed`);\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","_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","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 {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 return this.request({\n method: HTTP_VERBS.PATCH,\n uri: `${this.locusUrl}/controls`,\n body: {\n practiceSession: {\n enabled,\n },\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":[]}
|
package/package.json
CHANGED
|
@@ -65,12 +65,12 @@
|
|
|
65
65
|
"@webex/internal-media-core": "2.24.1",
|
|
66
66
|
"@webex/internal-plugin-conversation": "3.12.0-next.17",
|
|
67
67
|
"@webex/internal-plugin-device": "3.12.0-next.15",
|
|
68
|
-
"@webex/internal-plugin-llm": "3.12.0-next.
|
|
68
|
+
"@webex/internal-plugin-llm": "3.12.0-next.18",
|
|
69
69
|
"@webex/internal-plugin-mercury": "3.12.0-next.16",
|
|
70
70
|
"@webex/internal-plugin-metrics": "3.12.0-next.15",
|
|
71
71
|
"@webex/internal-plugin-support": "3.12.0-next.17",
|
|
72
72
|
"@webex/internal-plugin-user": "3.12.0-next.16",
|
|
73
|
-
"@webex/internal-plugin-voicea": "3.12.0-next.
|
|
73
|
+
"@webex/internal-plugin-voicea": "3.12.0-next.18",
|
|
74
74
|
"@webex/media-helpers": "3.12.0-next.3",
|
|
75
75
|
"@webex/plugin-people": "3.12.0-next.16",
|
|
76
76
|
"@webex/plugin-rooms": "3.12.0-next.17",
|
|
@@ -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.
|
|
97
|
+
"version": "3.12.0-next.45"
|
|
98
98
|
}
|
package/src/meeting/index.ts
CHANGED
|
@@ -6407,6 +6407,12 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
6407
6407
|
|
|
6408
6408
|
/**
|
|
6409
6409
|
* Disconnects and cleans up the default LLM session listeners/timers.
|
|
6410
|
+
*
|
|
6411
|
+
* Ownership-aware: only calls `disconnectLLM` when this meeting is the
|
|
6412
|
+
* current owner of the default LLM session (or when no owner is recorded).
|
|
6413
|
+
* Event listeners belonging to this meeting instance are always detached
|
|
6414
|
+
* so they do not receive another meeting's relay events.
|
|
6415
|
+
*
|
|
6410
6416
|
* @param {Object} options
|
|
6411
6417
|
* @param {boolean} [options.removeOnlineListener=true] removes the one-time online listener
|
|
6412
6418
|
* @param {boolean} [options.throwOnError=true] rethrows disconnect errors when true
|
|
@@ -6419,12 +6425,22 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
6419
6425
|
removeOnlineListener?: boolean;
|
|
6420
6426
|
throwOnError?: boolean;
|
|
6421
6427
|
} = {}): Promise<void> => {
|
|
6428
|
+
// @ts-ignore - Fix type
|
|
6429
|
+
const currentOwner = this.webex.internal.llm.getOwnerMeetingId();
|
|
6430
|
+
const isOwner = !currentOwner || currentOwner === this.id;
|
|
6431
|
+
|
|
6422
6432
|
try {
|
|
6423
|
-
|
|
6424
|
-
|
|
6425
|
-
|
|
6426
|
-
|
|
6427
|
-
|
|
6433
|
+
if (isOwner) {
|
|
6434
|
+
// @ts-ignore - Fix type
|
|
6435
|
+
await this.webex.internal.llm.disconnectLLM({
|
|
6436
|
+
code: 3050,
|
|
6437
|
+
reason: 'done (permanent)',
|
|
6438
|
+
});
|
|
6439
|
+
} else {
|
|
6440
|
+
LoggerProxy.logger.info(
|
|
6441
|
+
`Meeting:index#cleanupLLMConneciton --> skipping disconnect; LLM owned by meeting ${currentOwner}, not ${this.id}`
|
|
6442
|
+
);
|
|
6443
|
+
}
|
|
6428
6444
|
} catch (error) {
|
|
6429
6445
|
LoggerProxy.logger.error(
|
|
6430
6446
|
'Meeting:index#cleanupLLMConneciton --> Failed to disconnect default LLM session',
|
|
@@ -6440,6 +6456,17 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
6440
6456
|
this.webex.internal.llm.off('online', this.handleLLMOnline);
|
|
6441
6457
|
}
|
|
6442
6458
|
this.stopListeningForLLMEvents();
|
|
6459
|
+
|
|
6460
|
+
// If this meeting owned (or could have owned) the default LLM session,
|
|
6461
|
+
// always release the owner tag here regardless of whether disconnectLLM
|
|
6462
|
+
// resolved. `disconnectLLM` only clears the owner on its success path,
|
|
6463
|
+
// so a failed disconnect would otherwise leave a stale owner pointing
|
|
6464
|
+
// at a torn-down meeting and permanently block other meetings'
|
|
6465
|
+
// `updateLLMConnection` calls via the ownership guard.
|
|
6466
|
+
if (isOwner) {
|
|
6467
|
+
// @ts-ignore - Fix type
|
|
6468
|
+
this.webex.internal.llm.setOwnerMeetingId?.(undefined);
|
|
6469
|
+
}
|
|
6443
6470
|
}
|
|
6444
6471
|
};
|
|
6445
6472
|
|
|
@@ -6541,8 +6568,33 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
6541
6568
|
|
|
6542
6569
|
const dataChannelUrl = datachannelUrl;
|
|
6543
6570
|
|
|
6571
|
+
// Ownership guard: when the default LLM session is already connected and
|
|
6572
|
+
// owned by a *different* Meeting instance, do not disconnect or reconfigure
|
|
6573
|
+
// it. Another meeting's `updateLLMConnection` must be ignored here to
|
|
6574
|
+
// avoid killing the socket it relies on. We only proceed to manage the
|
|
6575
|
+
// connection when this meeting is the current owner, or when no owner is
|
|
6576
|
+
// set yet (first claim).
|
|
6577
|
+
// @ts-ignore - Fix type
|
|
6578
|
+
const currentOwner = this.webex.internal.llm.getOwnerMeetingId();
|
|
6579
|
+
|
|
6544
6580
|
// @ts-ignore - Fix type
|
|
6545
6581
|
if (this.webex.internal.llm.isConnected()) {
|
|
6582
|
+
if (currentOwner && currentOwner !== this.id) {
|
|
6583
|
+
// Another meeting owns the live LLM socket. We must not disconnect
|
|
6584
|
+
// or reconfigure it -- doing so would tear down a session the
|
|
6585
|
+
// owning meeting still relies on. Locus/datachannel URL mismatch is
|
|
6586
|
+
// expected here (each meeting has its own locus URL) and is NOT a
|
|
6587
|
+
// valid signal of staleness, so we never reclaim from this path.
|
|
6588
|
+
// The only safe reclaim mechanism is the `finally`-block owner-tag
|
|
6589
|
+
// release in `cleanupLLMConneciton`, which fires when this meeting
|
|
6590
|
+
// itself is being torn down.
|
|
6591
|
+
LoggerProxy.logger.info(
|
|
6592
|
+
`Meeting:index#updateLLMConnection --> skipping; LLM owned by meeting ${currentOwner}, not ${this.id}`
|
|
6593
|
+
);
|
|
6594
|
+
|
|
6595
|
+
return undefined;
|
|
6596
|
+
}
|
|
6597
|
+
|
|
6546
6598
|
if (
|
|
6547
6599
|
// @ts-ignore - Fix type
|
|
6548
6600
|
url === this.webex.internal.llm.getLocusUrl() &&
|
|
@@ -6563,6 +6615,11 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
6563
6615
|
return this.webex.internal.llm
|
|
6564
6616
|
.registerAndConnect(url, dataChannelUrl, datachannelToken)
|
|
6565
6617
|
.then((registerAndConnectResult) => {
|
|
6618
|
+
// Record ownership of the default LLM session for this meeting so
|
|
6619
|
+
// subsequent cross-meeting `updateLLMConnection` / `cleanupLLMConneciton`
|
|
6620
|
+
// calls can detect and skip work that doesn't belong to them.
|
|
6621
|
+
// @ts-ignore - Fix type
|
|
6622
|
+
this.webex.internal.llm.setOwnerMeetingId?.(this.id);
|
|
6566
6623
|
// @ts-ignore - Fix type
|
|
6567
6624
|
this.webex.internal.llm.off('event:relay.event', this.processRelayEvent);
|
|
6568
6625
|
// @ts-ignore - Fix type
|
|
@@ -9857,7 +9914,23 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
9857
9914
|
// received mid-teardown do not trigger Locus syncs. Calling it here
|
|
9858
9915
|
// again would double-emit MEETING_STOPPED_RECEIVING_TRANSCRIPTION
|
|
9859
9916
|
// because stopTranscription() always fires its trigger.
|
|
9860
|
-
|
|
9917
|
+
//
|
|
9918
|
+
// Ownership-aware token clear: only clear the shared LLM data channel
|
|
9919
|
+
// tokens when this meeting owns (or no meeting owns) the default LLM
|
|
9920
|
+
// session. Otherwise we would wipe tokens still in use by another
|
|
9921
|
+
// meeting's active LLM connection.
|
|
9922
|
+
// @ts-ignore - Fix type
|
|
9923
|
+
const currentOwner = this.webex.internal.llm.getOwnerMeetingId();
|
|
9924
|
+
const isOwner = !currentOwner || currentOwner === this.id;
|
|
9925
|
+
|
|
9926
|
+
if (isOwner) {
|
|
9927
|
+
this.clearDataChannelToken();
|
|
9928
|
+
} else {
|
|
9929
|
+
LoggerProxy.logger.info(
|
|
9930
|
+
`Meeting:index#clearMeetingData --> skipping clearDataChannelToken; LLM owned by meeting ${currentOwner}, not ${this.id}`
|
|
9931
|
+
);
|
|
9932
|
+
}
|
|
9933
|
+
|
|
9861
9934
|
await this.cleanupLLMConneciton({throwOnError: false});
|
|
9862
9935
|
};
|
|
9863
9936
|
|