@webex/plugin-meetings 3.11.0-next.43 → 3.11.0-next.44

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.
@@ -1 +1 @@
1
- {"version":3,"names":["_webexCore","require","_uuid","_interopRequireDefault","_lodash","_constants","_collection","_loggerProxy","_utils","Webinar","WebexPlugin","extend","namespace","MEETINGS","collections","webinar","WebinarCollection","props","locusUrl","webcastInstanceUrl","canManageWebcast","selfIsPanelist","selfIsAttendee","practiceSessionEnabled","meetingId","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","updateLLMConnection","isJoinPracticeSessionDataChannel","setPracticeSessionState","enabled","request","method","HTTP_VERBS","PATCH","uri","concat","body","practiceSession","catch","error","LoggerProxy","logger","updatePracticeSessionStatus","startWebcast","layout","_this","_asyncToGenerator2","default","_regenerator","mark","_callee","_t","_t2","_t3","_t4","_t5","_t6","_t7","_t8","wrap","_context","prev","next","Error","PUT","_defineProperty2","credentials","getUserToken","sent","config","trackingIdPrefix","uuid","v4","toString","authorization","trackingId","HEADERS","CONTENT_TYPE","CONTENT_TYPE_VALUE","APPLICATION_JSON","action","meetingInfo","locusId","correlationId","abrupt","call","headers","stop","stopWebcast","_this2","_callee2","_t9","_t0","_t1","_t10","_t11","_t12","_t13","_t14","_context2","queryWebcastLayout","_this3","_callee3","_t15","_t16","_t17","_t18","_t19","_t20","_context3","GET","updateWebcastLayout","_this4","_callee4","_t21","_t22","_t23","_t24","_t25","_t26","_t27","_t28","_context4","videoLayout","contentLayout","syncStageLayout","syncStageInMeeting","viewAllWebcastAttendees","_this5","_callee5","_t29","_t30","_t31","_t32","_t33","_t34","_context5","searchWebcastAttendees","_arguments","arguments","_this6","_callee6","queryString","_t35","_t36","_t37","_t38","_t39","_t40","_context6","length","undefined","encodeURIComponent","expelWebcastAttendee","participantId","_this7","_callee7","_t41","_t42","_t43","_t44","_t45","_t46","_context7","DELETE","searchLargeScaleWebinarAttendees","_this8","_callee8","_payload$limit","_meeting$locusInfo3","_meeting$locusInfo3$l","_meeting$locusInfo3$l2","_meeting$locusInfo3$l3","rawParams","attendeeSearchUrl","_t47","_t48","_t49","_t50","_t51","_t52","_context8","search_text","limit","DEFAULT_LARGE_SCALE_WEBINAR_ATTENDEE_SEARCH_LIMIT","links","resources","attendeeSearch","url","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 {\n _ID_,\n HEADERS,\n HTTP_VERBS,\n MEETINGS,\n SELF_ROLES,\n SHARE_STATUS,\n DEFAULT_LARGE_SCALE_WEBINAR_ATTENDEE_SEARCH_LIMIT,\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 * 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 if (this.practiceSessionEnabled) {\n // may need change data channel in practice session\n meeting?.updateLLMConnection();\n }\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 * 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 },\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 * @param {string} queryString\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","_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","internal","llm","disconnectLLM","code","reason","LLM_PRACTICE_SESSION","off","concat","processRelayEvent","stop","_this2","_callee2","isPracticeSession","_ref2","_ref2$url","url","_ref2$info","_ref2$info2","_ref2$info2$practiceS","practiceSessionDatachannelUrl","_ref2$self","_ref2$self2","_ref2$self2$practiceS","practiceSessionDatachannelToken","currentToken","finalToken","_context2","isJoined","abrupt","undefined","info","self","getDatachannelToken","DataChannelTokenType","PracticeSession","setDatachannelToken","isConnected","getLocusUrl","getDatachannelUrl","registerAndConnect","then","registerAndConnectResult","_this2$webex$internal","_this2$webex$internal2","on","voicea","announce","call","LoggerProxy","logger","_promise","resolve","setPracticeSessionState","enabled","request","method","HTTP_VERBS","PATCH","uri","body","practiceSession","catch","error","updatePracticeSessionStatus","startWebcast","layout","_this3","_callee3","_t","_t2","_t3","_t4","_t5","_t6","_t7","_t8","_context3","Error","PUT","_defineProperty2","credentials","getUserToken","sent","config","trackingIdPrefix","uuid","v4","toString","authorization","trackingId","HEADERS","CONTENT_TYPE","CONTENT_TYPE_VALUE","APPLICATION_JSON","action","meetingInfo","locusId","correlationId","headers","stopWebcast","_this4","_callee4","_t9","_t0","_t1","_t10","_t11","_t12","_t13","_t14","_context4","queryWebcastLayout","_this5","_callee5","_t15","_t16","_t17","_t18","_t19","_t20","_context5","GET","updateWebcastLayout","_this6","_callee6","_t21","_t22","_t23","_t24","_t25","_t26","_t27","_t28","_context6","videoLayout","contentLayout","syncStageLayout","syncStageInMeeting","viewAllWebcastAttendees","_this7","_callee7","_t29","_t30","_t31","_t32","_t33","_t34","_context7","searchWebcastAttendees","_arguments","arguments","_this8","_callee8","queryString","_t35","_t36","_t37","_t38","_t39","_t40","_context8","length","encodeURIComponent","expelWebcastAttendee","participantId","_this9","_callee9","_t41","_t42","_t43","_t44","_t45","_t46","_context9","DELETE","searchLargeScaleWebinarAttendees","_this0","_callee0","_payload$limit","_meeting$locusInfo3","_meeting$locusInfo3$l","_meeting$locusInfo3$l2","_meeting$locusInfo3$l3","rawParams","attendeeSearchUrl","_t47","_t48","_t49","_t50","_t51","_t52","_context0","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 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 * 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 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 {\n url = undefined,\n info: {practiceSessionDatachannelUrl = undefined} = {},\n self: {practiceSessionDatachannelToken = undefined} = {},\n } = meeting?.locusInfo || {};\n\n // @ts-ignore\n const currentToken = this.webex.internal.llm.getDatachannelToken(\n DataChannelTokenType.PracticeSession\n );\n\n const finalToken = currentToken ?? practiceSessionDatachannelToken;\n\n if (!currentToken && practiceSessionDatachannelToken) {\n // @ts-ignore\n this.webex.internal.llm.setDatachannelToken(\n practiceSessionDatachannelToken,\n DataChannelTokenType.PracticeSession\n );\n }\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 // @ts-ignore - Fix type\n return this.webex.internal.llm\n .registerAndConnect(url, practiceSessionDatachannelUrl, finalToken, LLM_PRACTICE_SESSION)\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 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 * @param {string} queryString\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":[]}
package/package.json CHANGED
@@ -70,7 +70,7 @@
70
70
  "@webex/internal-plugin-metrics": "3.11.0-next.7",
71
71
  "@webex/internal-plugin-support": "3.11.0-next.10",
72
72
  "@webex/internal-plugin-user": "3.11.0-next.7",
73
- "@webex/internal-plugin-voicea": "3.11.0-next.10",
73
+ "@webex/internal-plugin-voicea": "3.11.0-next.11",
74
74
  "@webex/media-helpers": "3.11.0-next.3",
75
75
  "@webex/plugin-people": "3.11.0-next.9",
76
76
  "@webex/plugin-rooms": "3.11.0-next.10",
@@ -93,5 +93,5 @@
93
93
  "//": [
94
94
  "TODO: upgrade jwt-decode when moving to node 18"
95
95
  ],
96
- "version": "3.11.0-next.43"
96
+ "version": "3.11.0-next.44"
97
97
  }
@@ -13,7 +13,7 @@ import {
13
13
  } from './constants';
14
14
 
15
15
  import {StrokeData, RequestData, IAnnotationChannel, CommandRequestBody} from './annotation.types';
16
- import {HTTP_VERBS, LOCUSEVENT} from '../constants';
16
+ import {HTTP_VERBS, LOCUSEVENT, LLM_PRACTICE_SESSION} from '../constants';
17
17
 
18
18
  /**
19
19
  * @description Annotation to handle LLM and Mercury message and locus API
@@ -116,6 +116,12 @@ class AnnotationChannel extends WebexPlugin implements IAnnotationChannel {
116
116
  );
117
117
  // @ts-ignore
118
118
  this.webex.internal.llm.on('event:relay.event', this.eventDataProcessor, this);
119
+ // @ts-ignore
120
+ this.webex.internal.llm.on(
121
+ `event:relay.event:${LLM_PRACTICE_SESSION}`,
122
+ this.eventDataProcessor,
123
+ this
124
+ );
119
125
  this.hasSubscribedToEvents = true;
120
126
  }
121
127
  }
@@ -134,7 +140,11 @@ class AnnotationChannel extends WebexPlugin implements IAnnotationChannel {
134
140
 
135
141
  // @ts-ignore
136
142
  this.webex.internal.llm.off('event:relay.event', this.eventDataProcessor);
137
-
143
+ // @ts-ignore
144
+ this.webex.internal.llm.off(
145
+ `event:relay.event:${LLM_PRACTICE_SESSION}`,
146
+ this.eventDataProcessor
147
+ );
138
148
  this.hasSubscribedToEvents = false;
139
149
  }
140
150
  }
@@ -306,12 +316,19 @@ class AnnotationChannel extends WebexPlugin implements IAnnotationChannel {
306
316
  * @returns {void}
307
317
  */
308
318
  private publishEncrypted(encryptedContent: string, strokeData: StrokeData) {
319
+ // @ts-ignore
320
+ const {llm} = this.webex.internal;
321
+ const isPracticeSessionConnected = llm.isConnected(LLM_PRACTICE_SESSION);
322
+ const socket =
323
+ (isPracticeSessionConnected && llm.getSocket(LLM_PRACTICE_SESSION)) || llm.socket;
324
+ const binding =
325
+ (isPracticeSessionConnected && llm.getBinding(LLM_PRACTICE_SESSION)) || llm.getBinding();
309
326
  const data = {
310
327
  id: `${this.seqNum}`,
311
328
  type: 'publishRequest',
312
329
  recipients: {
313
330
  // @ts-ignore
314
- route: this.webex.internal.llm.getBinding(),
331
+ route: binding,
315
332
  },
316
333
  headers: {
317
334
  to: strokeData.toUserId,
@@ -339,7 +356,7 @@ class AnnotationChannel extends WebexPlugin implements IAnnotationChannel {
339
356
  };
340
357
 
341
358
  // @ts-ignore
342
- this.webex.internal.llm.socket.send(data);
359
+ socket.send(data);
343
360
  this.seqNum += 1;
344
361
  }
345
362
  }
package/src/constants.ts CHANGED
@@ -44,6 +44,7 @@ export const LOCAL = 'local';
44
44
  export const LOCI = 'loci';
45
45
  export const LOCUS_URL = 'locusUrl';
46
46
  export const END = 'end';
47
+ export const LLM_PRACTICE_SESSION = 'llm-practice-session';
47
48
 
48
49
  export const MAX_RANDOM_DELAY_FOR_MEETING_INFO = 3 * 60 * 1000;
49
50
  export const MEETINGINFO = 'meetingInfo';
@@ -3565,6 +3565,9 @@ export default class Meeting extends StatelessWebexPlugin {
3565
3565
  // @ts-ignore - config coming from registerPlugin
3566
3566
  if (datachannelUrl && this.config.enableAutomaticLLM) {
3567
3567
  this.updateLLMConnection();
3568
+ if (this.webinar.isJoinPracticeSessionDataChannel()) {
3569
+ this.webinar.updatePSDataChannel();
3570
+ }
3568
3571
  }
3569
3572
  }
3570
3573
 
@@ -6230,6 +6233,49 @@ export default class Meeting extends StatelessWebexPlugin {
6230
6233
  }
6231
6234
  }
6232
6235
 
6236
+ /**
6237
+ * Disconnects and cleans up the default LLM session listeners/timers.
6238
+ * @param {Object} options
6239
+ * @param {boolean} [options.removeOnlineListener=true] removes the one-time online listener
6240
+ * @param {boolean} [options.throwOnError=true] rethrows disconnect errors when true
6241
+ * @returns {Promise<void>}
6242
+ */
6243
+ private cleanupLLMConneciton = async ({
6244
+ removeOnlineListener = true,
6245
+ throwOnError = true,
6246
+ }: {
6247
+ removeOnlineListener?: boolean;
6248
+ throwOnError?: boolean;
6249
+ } = {}): Promise<void> => {
6250
+ try {
6251
+ // @ts-ignore - Fix type
6252
+ await this.webex.internal.llm.disconnectLLM({
6253
+ code: 3050,
6254
+ reason: 'done (permanent)',
6255
+ });
6256
+ } catch (error) {
6257
+ LoggerProxy.logger.error(
6258
+ 'Meeting:index#cleanupLLMConneciton --> Failed to disconnect default LLM session',
6259
+ error
6260
+ );
6261
+
6262
+ if (throwOnError) {
6263
+ throw error;
6264
+ }
6265
+ } finally {
6266
+ if (removeOnlineListener) {
6267
+ // @ts-ignore - Fix type
6268
+ this.webex.internal.llm.off('online', this.handleLLMOnline);
6269
+ }
6270
+ // @ts-ignore - fix types
6271
+ this.webex.internal.llm.off('event:relay.event', this.processRelayEvent);
6272
+ // @ts-ignore - Fix type
6273
+ this.webex.internal.llm.off(LOCUS_LLM_EVENT, this.processLocusLLMEvent);
6274
+
6275
+ this.clearLLMHealthCheckTimer();
6276
+ }
6277
+ };
6278
+
6233
6279
  /**
6234
6280
  * Connects to low latency mercury and reconnects if the address has changed
6235
6281
  * It will also disconnect if called when the meeting has ended
@@ -6240,31 +6286,24 @@ export default class Meeting extends StatelessWebexPlugin {
6240
6286
  // @ts-ignore - Fix type
6241
6287
  const {
6242
6288
  url = undefined,
6243
- info: {datachannelUrl = undefined, practiceSessionDatachannelUrl = undefined} = {},
6244
- self: {datachannelToken = undefined, practiceSessionDatachannelToken = undefined} = {},
6289
+ info: {datachannelUrl = undefined} = {},
6290
+ self: {datachannelToken = undefined} = {},
6245
6291
  } = this.locusInfo || {};
6246
6292
 
6247
6293
  const isJoined = this.isJoined();
6248
6294
 
6249
- const dataChannelTokenType = this.getDataChannelTokenType();
6250
- const isPracticeSession = dataChannelTokenType === DataChannelTokenType.PracticeSession;
6251
6295
  // @ts-ignore
6252
- const currentToken = this.webex.internal.llm.getDatachannelToken(dataChannelTokenType);
6253
-
6254
- const locusToken = isPracticeSession ? practiceSessionDatachannelToken : datachannelToken;
6296
+ const currentToken = this.webex.internal.llm.getDatachannelToken(DataChannelTokenType.Default);
6255
6297
 
6256
- const finalToken = currentToken ?? locusToken;
6298
+ const finalToken = currentToken ?? datachannelToken;
6257
6299
 
6258
- if (!currentToken && locusToken) {
6300
+ if (!currentToken && datachannelToken) {
6259
6301
  // @ts-ignore
6260
- this.webex.internal.llm.setDatachannelToken(locusToken, dataChannelTokenType);
6302
+ this.webex.internal.llm.setDatachannelToken(datachannelToken, DataChannelTokenType.Default);
6261
6303
  }
6262
6304
 
6263
6305
  // webinar panelist should use new data channel in practice session
6264
- const dataChannelUrl =
6265
- isPracticeSession && practiceSessionDatachannelUrl
6266
- ? practiceSessionDatachannelUrl
6267
- : datachannelUrl;
6306
+ const dataChannelUrl = datachannelUrl;
6268
6307
 
6269
6308
  // @ts-ignore - Fix type
6270
6309
  if (this.webex.internal.llm.isConnected()) {
@@ -6277,17 +6316,7 @@ export default class Meeting extends StatelessWebexPlugin {
6277
6316
  ) {
6278
6317
  return undefined;
6279
6318
  }
6280
- // @ts-ignore - Fix type
6281
- await this.webex.internal.llm.disconnectLLM({
6282
- code: 3050,
6283
- reason: 'done (permanent)',
6284
- });
6285
- // @ts-ignore - Fix type
6286
- this.webex.internal.llm.off('event:relay.event', this.processRelayEvent);
6287
- // @ts-ignore - Fix type
6288
- this.webex.internal.llm.off(LOCUS_LLM_EVENT, this.processLocusLLMEvent);
6289
-
6290
- this.clearLLMHealthCheckTimer();
6319
+ await this.cleanupLLMConneciton({removeOnlineListener: false});
6291
6320
  }
6292
6321
 
6293
6322
  if (!isJoined) {
@@ -8632,12 +8661,12 @@ export default class Meeting extends StatelessWebexPlugin {
8632
8661
  LoggerProxy.logger.log('Meeting:index#leave --> Leaving a meeting');
8633
8662
 
8634
8663
  return MeetingUtil.leaveMeeting(this, options)
8635
- .then((leave) => {
8664
+ .then(async (leave) => {
8636
8665
  // CA team recommends submitting this *after* locus /leave
8637
8666
  submitLeaveMetric();
8638
8667
 
8639
8668
  this.meetingFiniteStateMachine.leave();
8640
- this.clearMeetingData();
8669
+ await this.clearMeetingData();
8641
8670
 
8642
8671
  // upload logs on leave irrespective of meeting delete
8643
8672
  Trigger.trigger(
@@ -9496,10 +9525,10 @@ export default class Meeting extends StatelessWebexPlugin {
9496
9525
  });
9497
9526
 
9498
9527
  return MeetingUtil.endMeetingForAll(this)
9499
- .then((end) => {
9528
+ .then(async (end) => {
9500
9529
  this.meetingFiniteStateMachine.end();
9501
9530
 
9502
- this.clearMeetingData();
9531
+ await this.clearMeetingData();
9503
9532
  // upload logs on leave irrespective of meeting delete
9504
9533
  Trigger.trigger(
9505
9534
  this,
@@ -9547,7 +9576,7 @@ export default class Meeting extends StatelessWebexPlugin {
9547
9576
  * @public
9548
9577
  * @memberof Meeting
9549
9578
  */
9550
- clearMeetingData = () => {
9579
+ clearMeetingData = async () => {
9551
9580
  this.audio = null;
9552
9581
  this.video = null;
9553
9582
  this.screenShareFloorState = ScreenShareFloorStatus.RELEASED;
@@ -9563,12 +9592,7 @@ export default class Meeting extends StatelessWebexPlugin {
9563
9592
 
9564
9593
  this.annotation.deregisterEvents();
9565
9594
 
9566
- // @ts-ignore - fix types
9567
- this.webex.internal.llm.off('event:relay.event', this.processRelayEvent);
9568
- // @ts-ignore - Fix type
9569
- this.webex.internal.llm.off(LOCUS_LLM_EVENT, this.processLocusLLMEvent);
9570
-
9571
- this.clearLLMHealthCheckTimer();
9595
+ await this.cleanupLLMConneciton({throwOnError: false});
9572
9596
  };
9573
9597
 
9574
9598
  /**
@@ -369,6 +369,7 @@ const MeetingUtil = {
369
369
  meeting.stopPeriodicLogUpload();
370
370
 
371
371
  meeting.breakouts.cleanUp();
372
+ meeting.webinar.cleanUp();
372
373
  meeting.simultaneousInterpretation.cleanUp();
373
374
  meeting.locusMediaRequest = undefined;
374
375
 
@@ -393,8 +394,10 @@ const MeetingUtil = {
393
394
  .then(() => meeting.stopKeepAlive())
394
395
  .then(() => {
395
396
  if (meeting.config?.enableAutomaticLLM) {
396
- meeting.updateLLMConnection();
397
+ return meeting.cleanupLLMConneciton({throwOnError: false});
397
398
  }
399
+
400
+ return undefined;
398
401
  });
399
402
  },
400
403
 
@@ -4,6 +4,7 @@
4
4
  import {WebexPlugin, config} from '@webex/webex-core';
5
5
  import uuid from 'uuid';
6
6
  import {get} from 'lodash';
7
+ import {DataChannelTokenType} from '@webex/internal-plugin-llm';
7
8
  import {
8
9
  _ID_,
9
10
  HEADERS,
@@ -12,6 +13,7 @@ import {
12
13
  SELF_ROLES,
13
14
  SHARE_STATUS,
14
15
  DEFAULT_LARGE_SCALE_WEBINAR_ATTENDEE_SEARCH_LIMIT,
16
+ LLM_PRACTICE_SESSION,
15
17
  } from '../constants';
16
18
 
17
19
  import WebinarCollection from './collection';
@@ -37,6 +39,14 @@ const Webinar = WebexPlugin.extend({
37
39
  meetingId: 'string',
38
40
  },
39
41
 
42
+ /**
43
+ * Calls this to clean up listeners
44
+ * @returns {void}
45
+ */
46
+ cleanUp() {
47
+ this.cleanupPSDataChannel();
48
+ },
49
+
40
50
  /**
41
51
  * Update the current locus url of the webinar
42
52
  * @param {string} locusUrl
@@ -105,10 +115,7 @@ const Webinar = WebexPlugin.extend({
105
115
  meeting?.locusInfo?.updateMediaShares(meeting?.locusInfo?.mediaShares, true);
106
116
  }
107
117
 
108
- if (this.practiceSessionEnabled) {
109
- // may need change data channel in practice session
110
- meeting?.updateLLMConnection();
111
- }
118
+ this.updatePSDataChannel();
112
119
  },
113
120
 
114
121
  /**
@@ -119,6 +126,107 @@ const Webinar = WebexPlugin.extend({
119
126
  return this.selfIsPanelist && this.practiceSessionEnabled;
120
127
  },
121
128
 
129
+ /**
130
+ * Disconnects the practice session data channel and removes its relay listener.
131
+ * @returns {Promise<void>}
132
+ */
133
+ async cleanupPSDataChannel() {
134
+ const meeting = this.webex.meetings.getMeetingByType(_ID_, this.meetingId);
135
+
136
+ // @ts-ignore - Fix type
137
+ await this.webex.internal.llm.disconnectLLM(
138
+ {
139
+ code: 3050,
140
+ reason: 'done (permanent)',
141
+ },
142
+ LLM_PRACTICE_SESSION
143
+ );
144
+ // @ts-ignore - Fix type
145
+ this.webex.internal.llm.off(
146
+ `event:relay.event:${LLM_PRACTICE_SESSION}`,
147
+ meeting?.processRelayEvent
148
+ );
149
+ },
150
+
151
+ /**
152
+ * Connects to low latency mercury and reconnects if the address has changed
153
+ * It will also disconnect if called when the meeting has ended
154
+ * @returns {Promise}
155
+ */
156
+ async updatePSDataChannel() {
157
+ const meeting = this.webex.meetings.getMeetingByType(_ID_, this.meetingId);
158
+ const isPracticeSession = meeting?.isJoined() && this.isJoinPracticeSessionDataChannel();
159
+
160
+ if (!isPracticeSession) {
161
+ await this.cleanupPSDataChannel();
162
+
163
+ return undefined;
164
+ }
165
+
166
+ // @ts-ignore - Fix type
167
+ const {
168
+ url = undefined,
169
+ info: {practiceSessionDatachannelUrl = undefined} = {},
170
+ self: {practiceSessionDatachannelToken = undefined} = {},
171
+ } = meeting?.locusInfo || {};
172
+
173
+ // @ts-ignore
174
+ const currentToken = this.webex.internal.llm.getDatachannelToken(
175
+ DataChannelTokenType.PracticeSession
176
+ );
177
+
178
+ const finalToken = currentToken ?? practiceSessionDatachannelToken;
179
+
180
+ if (!currentToken && practiceSessionDatachannelToken) {
181
+ // @ts-ignore
182
+ this.webex.internal.llm.setDatachannelToken(
183
+ practiceSessionDatachannelToken,
184
+ DataChannelTokenType.PracticeSession
185
+ );
186
+ }
187
+
188
+ if (!practiceSessionDatachannelUrl) {
189
+ return undefined;
190
+ }
191
+ // @ts-ignore - Fix type
192
+ if (this.webex.internal.llm.isConnected(LLM_PRACTICE_SESSION)) {
193
+ if (
194
+ // @ts-ignore - Fix type
195
+ url === this.webex.internal.llm.getLocusUrl(LLM_PRACTICE_SESSION) &&
196
+ // @ts-ignore - Fix type
197
+ practiceSessionDatachannelUrl ===
198
+ this.webex.internal.llm.getDatachannelUrl(LLM_PRACTICE_SESSION)
199
+ ) {
200
+ return undefined;
201
+ }
202
+
203
+ await this.cleanupPSDataChannel();
204
+ }
205
+
206
+ // @ts-ignore - Fix type
207
+ return this.webex.internal.llm
208
+ .registerAndConnect(url, practiceSessionDatachannelUrl, finalToken, LLM_PRACTICE_SESSION)
209
+ .then((registerAndConnectResult) => {
210
+ // @ts-ignore - Fix type
211
+ this.webex.internal.llm.off(
212
+ `event:relay.event:${LLM_PRACTICE_SESSION}`,
213
+ meeting?.processRelayEvent
214
+ );
215
+ // @ts-ignore - Fix type
216
+ this.webex.internal.llm.on(
217
+ `event:relay.event:${LLM_PRACTICE_SESSION}`,
218
+ meeting?.processRelayEvent
219
+ );
220
+ // @ts-ignore - Fix type
221
+ this.webex.internal.voicea?.announce?.();
222
+ LoggerProxy.logger.info(
223
+ `Webinar:index#updatePSDataChannel --> enabled to receive relay events for default session for ${LLM_PRACTICE_SESSION}!`
224
+ );
225
+
226
+ return Promise.resolve(registerAndConnectResult);
227
+ });
228
+ },
229
+
122
230
  /**
123
231
  * start or stop practice session for webinar
124
232
  * @param {boolean} enabled
@@ -146,6 +254,7 @@ const Webinar = WebexPlugin.extend({
146
254
  */
147
255
  updatePracticeSessionStatus(payload) {
148
256
  this.set('practiceSessionEnabled', !!payload?.enabled);
257
+ this.updatePSDataChannel().then(() => {});
149
258
  },
150
259
 
151
260
  /**