@webex/plugin-meetings 3.12.0-next.8 → 3.12.0-next.80

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (183) hide show
  1. package/AGENTS.md +9 -0
  2. package/dist/aiEnableRequest/index.js +15 -2
  3. package/dist/aiEnableRequest/index.js.map +1 -1
  4. package/dist/breakouts/breakout.js +8 -3
  5. package/dist/breakouts/breakout.js.map +1 -1
  6. package/dist/breakouts/index.js +26 -2
  7. package/dist/breakouts/index.js.map +1 -1
  8. package/dist/config.js +2 -0
  9. package/dist/config.js.map +1 -1
  10. package/dist/constants.js +34 -8
  11. package/dist/constants.js.map +1 -1
  12. package/dist/controls-options-manager/constants.js +11 -1
  13. package/dist/controls-options-manager/constants.js.map +1 -1
  14. package/dist/controls-options-manager/index.js +67 -29
  15. package/dist/controls-options-manager/index.js.map +1 -1
  16. package/dist/controls-options-manager/util.js +91 -0
  17. package/dist/controls-options-manager/util.js.map +1 -1
  18. package/dist/hashTree/constants.js +13 -1
  19. package/dist/hashTree/constants.js.map +1 -1
  20. package/dist/hashTree/hashTreeParser.js +880 -382
  21. package/dist/hashTree/hashTreeParser.js.map +1 -1
  22. package/dist/hashTree/utils.js +42 -0
  23. package/dist/hashTree/utils.js.map +1 -1
  24. package/dist/index.js +7 -0
  25. package/dist/index.js.map +1 -1
  26. package/dist/interceptors/dataChannelAuthToken.js +75 -15
  27. package/dist/interceptors/dataChannelAuthToken.js.map +1 -1
  28. package/dist/interceptors/locusRetry.js +23 -8
  29. package/dist/interceptors/locusRetry.js.map +1 -1
  30. package/dist/interpretation/index.js +10 -1
  31. package/dist/interpretation/index.js.map +1 -1
  32. package/dist/interpretation/interpretation.types.js +7 -0
  33. package/dist/interpretation/interpretation.types.js.map +1 -0
  34. package/dist/interpretation/siLanguage.js +1 -1
  35. package/dist/locus-info/controlsUtils.js +4 -1
  36. package/dist/locus-info/controlsUtils.js.map +1 -1
  37. package/dist/locus-info/index.js +303 -88
  38. package/dist/locus-info/index.js.map +1 -1
  39. package/dist/locus-info/infoUtils.js +36 -5
  40. package/dist/locus-info/infoUtils.js.map +1 -1
  41. package/dist/locus-info/types.js +19 -0
  42. package/dist/locus-info/types.js.map +1 -1
  43. package/dist/media/index.js +3 -1
  44. package/dist/media/index.js.map +1 -1
  45. package/dist/media/properties.js +1 -0
  46. package/dist/media/properties.js.map +1 -1
  47. package/dist/meeting/in-meeting-actions.js +5 -1
  48. package/dist/meeting/in-meeting-actions.js.map +1 -1
  49. package/dist/meeting/index.js +1111 -724
  50. package/dist/meeting/index.js.map +1 -1
  51. package/dist/meeting/muteState.js +10 -1
  52. package/dist/meeting/muteState.js.map +1 -1
  53. package/dist/meeting/request.js +5 -2
  54. package/dist/meeting/request.js.map +1 -1
  55. package/dist/meeting/util.js +29 -2
  56. package/dist/meeting/util.js.map +1 -1
  57. package/dist/meeting-info/meeting-info-v2.js +2 -2
  58. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  59. package/dist/meetings/index.js +231 -78
  60. package/dist/meetings/index.js.map +1 -1
  61. package/dist/meetings/meetings.types.js +6 -1
  62. package/dist/meetings/meetings.types.js.map +1 -1
  63. package/dist/meetings/request.js +39 -0
  64. package/dist/meetings/request.js.map +1 -1
  65. package/dist/meetings/util.js +79 -5
  66. package/dist/meetings/util.js.map +1 -1
  67. package/dist/member/index.js +10 -0
  68. package/dist/member/index.js.map +1 -1
  69. package/dist/member/types.js.map +1 -1
  70. package/dist/member/util.js +3 -0
  71. package/dist/member/util.js.map +1 -1
  72. package/dist/metrics/constants.js +4 -1
  73. package/dist/metrics/constants.js.map +1 -1
  74. package/dist/multistream/codec/constants.js +63 -0
  75. package/dist/multistream/codec/constants.js.map +1 -0
  76. package/dist/multistream/mediaRequestManager.js +62 -15
  77. package/dist/multistream/mediaRequestManager.js.map +1 -1
  78. package/dist/multistream/receiveSlot.js +9 -0
  79. package/dist/multistream/receiveSlot.js.map +1 -1
  80. package/dist/reactions/reactions.type.js.map +1 -1
  81. package/dist/recording-controller/index.js +1 -3
  82. package/dist/recording-controller/index.js.map +1 -1
  83. package/dist/types/config.d.ts +2 -0
  84. package/dist/types/constants.d.ts +12 -1
  85. package/dist/types/controls-options-manager/constants.d.ts +6 -1
  86. package/dist/types/controls-options-manager/index.d.ts +16 -0
  87. package/dist/types/hashTree/constants.d.ts +2 -0
  88. package/dist/types/hashTree/hashTreeParser.d.ts +146 -17
  89. package/dist/types/hashTree/utils.d.ts +18 -0
  90. package/dist/types/index.d.ts +3 -0
  91. package/dist/types/interceptors/locusRetry.d.ts +4 -4
  92. package/dist/types/interpretation/interpretation.types.d.ts +10 -0
  93. package/dist/types/locus-info/index.d.ts +50 -6
  94. package/dist/types/locus-info/infoUtils.d.ts +8 -0
  95. package/dist/types/locus-info/types.d.ts +21 -1
  96. package/dist/types/media/properties.d.ts +1 -0
  97. package/dist/types/meeting/in-meeting-actions.d.ts +4 -0
  98. package/dist/types/meeting/index.d.ts +80 -6
  99. package/dist/types/meeting/request.d.ts +1 -0
  100. package/dist/types/meeting/util.d.ts +9 -0
  101. package/dist/types/meetings/index.d.ts +30 -2
  102. package/dist/types/meetings/meetings.types.d.ts +15 -0
  103. package/dist/types/meetings/request.d.ts +14 -0
  104. package/dist/types/member/index.d.ts +1 -0
  105. package/dist/types/member/types.d.ts +1 -0
  106. package/dist/types/member/util.d.ts +1 -0
  107. package/dist/types/metrics/constants.d.ts +3 -0
  108. package/dist/types/multistream/codec/constants.d.ts +7 -0
  109. package/dist/types/multistream/mediaRequestManager.d.ts +22 -5
  110. package/dist/types/reactions/reactions.type.d.ts +3 -0
  111. package/dist/webinar/index.js +305 -159
  112. package/dist/webinar/index.js.map +1 -1
  113. package/package.json +22 -22
  114. package/src/aiEnableRequest/index.ts +16 -0
  115. package/src/breakouts/breakout.ts +3 -1
  116. package/src/breakouts/index.ts +31 -0
  117. package/src/config.ts +2 -0
  118. package/src/constants.ts +16 -2
  119. package/src/controls-options-manager/constants.ts +14 -1
  120. package/src/controls-options-manager/index.ts +87 -28
  121. package/src/controls-options-manager/util.ts +81 -1
  122. package/src/hashTree/constants.ts +16 -0
  123. package/src/hashTree/hashTreeParser.ts +580 -196
  124. package/src/hashTree/utils.ts +36 -0
  125. package/src/index.ts +6 -0
  126. package/src/interceptors/dataChannelAuthToken.ts +88 -12
  127. package/src/interceptors/locusRetry.ts +25 -4
  128. package/src/interpretation/index.ts +27 -9
  129. package/src/interpretation/interpretation.types.ts +11 -0
  130. package/src/locus-info/controlsUtils.ts +3 -1
  131. package/src/locus-info/index.ts +304 -100
  132. package/src/locus-info/infoUtils.ts +41 -6
  133. package/src/locus-info/types.ts +25 -1
  134. package/src/media/index.ts +3 -0
  135. package/src/media/properties.ts +1 -0
  136. package/src/meeting/in-meeting-actions.ts +8 -0
  137. package/src/meeting/index.ts +441 -65
  138. package/src/meeting/muteState.ts +10 -1
  139. package/src/meeting/request.ts +11 -0
  140. package/src/meeting/util.ts +33 -2
  141. package/src/meeting-info/meeting-info-v2.ts +4 -2
  142. package/src/meetings/index.ts +134 -44
  143. package/src/meetings/meetings.types.ts +19 -0
  144. package/src/meetings/request.ts +43 -0
  145. package/src/meetings/util.ts +97 -1
  146. package/src/member/index.ts +10 -0
  147. package/src/member/types.ts +1 -0
  148. package/src/member/util.ts +3 -0
  149. package/src/metrics/constants.ts +3 -0
  150. package/src/multistream/codec/constants.ts +58 -0
  151. package/src/multistream/mediaRequestManager.ts +119 -28
  152. package/src/multistream/receiveSlot.ts +18 -0
  153. package/src/reactions/reactions.type.ts +3 -0
  154. package/src/recording-controller/index.ts +1 -2
  155. package/src/webinar/index.ts +214 -36
  156. package/test/unit/spec/aiEnableRequest/index.ts +86 -0
  157. package/test/unit/spec/breakouts/breakout.ts +9 -3
  158. package/test/unit/spec/breakouts/index.ts +49 -0
  159. package/test/unit/spec/controls-options-manager/index.js +244 -29
  160. package/test/unit/spec/controls-options-manager/util.js +165 -0
  161. package/test/unit/spec/hashTree/hashTreeParser.ts +1838 -180
  162. package/test/unit/spec/hashTree/utils.ts +125 -1
  163. package/test/unit/spec/interceptors/dataChannelAuthToken.ts +196 -0
  164. package/test/unit/spec/interceptors/locusRetry.ts +205 -4
  165. package/test/unit/spec/interpretation/index.ts +26 -4
  166. package/test/unit/spec/locus-info/controlsUtils.js +172 -57
  167. package/test/unit/spec/locus-info/index.js +499 -81
  168. package/test/unit/spec/locus-info/infoUtils.js +87 -0
  169. package/test/unit/spec/media/index.ts +31 -0
  170. package/test/unit/spec/meeting/in-meeting-actions.ts +4 -0
  171. package/test/unit/spec/meeting/index.js +1552 -42
  172. package/test/unit/spec/meeting/muteState.js +81 -0
  173. package/test/unit/spec/meeting/request.js +12 -0
  174. package/test/unit/spec/meeting/utils.js +82 -0
  175. package/test/unit/spec/meeting-info/meetinginfov2.js +19 -10
  176. package/test/unit/spec/meetings/index.js +363 -10
  177. package/test/unit/spec/meetings/request.js +141 -0
  178. package/test/unit/spec/meetings/utils.js +189 -0
  179. package/test/unit/spec/member/index.js +7 -0
  180. package/test/unit/spec/member/util.js +24 -0
  181. package/test/unit/spec/multistream/mediaRequestManager.ts +501 -37
  182. package/test/unit/spec/recording-controller/index.js +9 -8
  183. package/test/unit/spec/webinar/index.ts +329 -28
@@ -25,10 +25,9 @@ export type HashTreeParserEntry = {
25
25
  *
26
26
  * @param {HashTreeMessage} message - The hash tree message to find the meeting for
27
27
  * @param {MeetingCollection} meetingCollection - The collection of meetings to search
28
- * @param {string} deviceUrl - The URL of the user's device
29
28
  * @returns {any} The meeting if found, otherwise undefined
30
29
  */
31
- export declare function findMeetingForHashTreeMessage(message: HashTreeMessage, meetingCollection: MeetingCollection, deviceUrl: string): any;
30
+ export declare function findMeetingForHashTreeMessage(message: HashTreeMessage | undefined, meetingCollection: MeetingCollection): any;
32
31
  /**
33
32
  * Creates a locus object from the objects received in a hash tree message. It usually will be
34
33
  * incomplete, because hash tree messages only contain the parts of locus that have changed,
@@ -130,6 +129,7 @@ export default class LocusInfo extends EventsScope {
130
129
  private createHashTreeParser;
131
130
  /**
132
131
  * @param {Object} data - data to initialize locus info with. It may be from a join or GET /loci response or from a Mercury event that triggers a creation of meeting object
132
+ * @param {Function} [onLocusSynced] - optional callback that will be called at the end of initial setup, when locus info is fully synced. It will be called with the full locus snapshot as an argument (which may be null if we haven't received any full locus DTOs during the initial setup, for example in case we receive only hash tree messages without full locus DTOs)
133
133
  * @returns {undefined}
134
134
  * @memberof LocusInfo
135
135
  */
@@ -145,7 +145,13 @@ export default class LocusInfo extends EventsScope {
145
145
  } | {
146
146
  trigger: 'get-loci-response';
147
147
  locus?: LocusDTO;
148
- }): Promise<void>;
148
+ }, onLocusSynced?: (locus: LocusDTO) => void): Promise<void>;
149
+ /**
150
+ * Builds a full locus DTO snapshot from current internal locus state.
151
+ *
152
+ * @returns {LocusDTO}
153
+ */
154
+ private getCurrentLocusSnapshot;
149
155
  /**
150
156
  * Handles HTTP response from Locus API call.
151
157
  * @param {Meeting} meeting meeting object
@@ -167,6 +173,28 @@ export default class LocusInfo extends EventsScope {
167
173
  * @returns {void}
168
174
  */
169
175
  sendClassicVsHashTreeMismatchMetric(meeting: any, message: string): void;
176
+ /**
177
+ * Helper that handles the common logic for reactivating a stopped HashTreeParser when
178
+ * a newer "replaces" is detected. Used by both the message and API response parser switch methods.
179
+ *
180
+ * @param {string} callerName - name of the calling method, used in log messages
181
+ * @param {string} locusUrl - the locus URL of the stopped parser
182
+ * @param {HashTreeParserEntry} stoppedEntry - the stopped parser entry
183
+ * @param {ReplacesInfo} replaces - replacement info extracted from self
184
+ * @param {Function} resumeCallback - callback to invoke after reactivation to resume the parser
185
+ * @returns {void}
186
+ */
187
+ private resumeStoppedParser;
188
+ /**
189
+ * Handles an API response whose locusUrl doesn't match any active HashTreeParser
190
+ * (either no entry exists, or the existing entry is stopped).
191
+ * Creates a new parser or reactivates a stopped one using initializeFromGetLociResponse.
192
+ *
193
+ * @param {string} locusUrl - the locus URL from the API response
194
+ * @param {LocusDTO} locus - the locus DTO from the API response
195
+ * @returns {void}
196
+ */
197
+ private handleHashTreeParserSwitchForAPIResponse;
170
198
  /**
171
199
  * Checks if the hash tree message should trigger a switch to a different HashTreeParser
172
200
  *
@@ -183,13 +211,23 @@ export default class LocusInfo extends EventsScope {
183
211
  * @returns {void}
184
212
  */
185
213
  private handleHashTreeMessage;
214
+ /**
215
+ * Triggers a sync of all hash tree datasets for all hash tree parsers associated with this meeting.
216
+ * The syncs are executed sequentially within each parser.
217
+ *
218
+ * @param {Object} [options={}] - Options for syncing
219
+ * @param {boolean} [options.onlyLLM=false] - Whether to sync only LLM based data sets
220
+ * @returns {Promise<void>}
221
+ */
222
+ syncAllHashTreeDatasets(options?: {
223
+ onlyLLM?: boolean;
224
+ }): Promise<void>;
186
225
  /**
187
226
  * Callback registered with HashTreeParser to receive locus info updates.
188
227
  * Updates our locus info based on the data parsed by the hash tree parser.
189
228
  *
190
229
  * @param {string} locusUrl - the locus URL for which the update is received
191
- * @param {LocusInfoUpdateType} updateType - The type of update received.
192
- * @param {Object} [data] - Additional data for the update, if applicable.
230
+ * @param {LocusInfoUpdate} update - Details about the update.
193
231
  * @returns {void}
194
232
  */
195
233
  private updateFromHashTree;
@@ -214,8 +252,8 @@ export default class LocusInfo extends EventsScope {
214
252
  * @param {string} debugText string explaining the trigger for this call, added to logs for debugging purposes
215
253
  * @param {object} locus locus object
216
254
  * @param {object} metadata locus hash trees metadata
217
- * @param {string} eventType locus event
218
255
  * @param {DataSet[]} dataSets
256
+ * @param {string} eventType locus event
219
257
  * @returns {void}
220
258
  */
221
259
  private onFullLocusWithHashTrees;
@@ -444,4 +482,10 @@ export default class LocusInfo extends EventsScope {
444
482
  * @memberof LocusInfo
445
483
  */
446
484
  clearMainSessionLocusCache(): void;
485
+ /**
486
+ * Cleans up all hash tree parsers and clears internal maps.
487
+ * @returns {void}
488
+ * @memberof LocusInfo
489
+ */
490
+ cleanUp(): void;
447
491
  }
@@ -1,2 +1,10 @@
1
+ export declare enum DisplayHintSection {
2
+ JOINED = "joined",
3
+ MODERATOR = "moderator",
4
+ COHOST = "coHost",
5
+ PRESENTER = "presenter",
6
+ PANELIST = "panelist",
7
+ ATTENDEE = "attendee"
8
+ }
1
9
  declare const InfoUtils: any;
2
10
  export default InfoUtils;
@@ -1,14 +1,30 @@
1
+ import { Enum } from '../constants';
1
2
  import { HtMeta } from '../hashTree/types';
3
+ export declare const EndMeetingReason: {
4
+ readonly maxMeetingDuration: "MAX_MEETING_DURATION";
5
+ readonly allParticipantsLeft: "ALL_PARTICIPANTS_LEFT";
6
+ readonly sipHostLeft: "SIP_HOST_LEFT";
7
+ readonly noHost: "NO_HOST";
8
+ readonly waitingForMpsEndMeetingTimeout: "WAITING_FOR_MPS_END_MEETING_TIMEOUT";
9
+ readonly fraudDetection: "FRAUD_DETECTION";
10
+ readonly meetingEndedByHost: "MEETING_ENDED_BY_HOST";
11
+ readonly meetingUpdated: "MEETING_UPDATED";
12
+ readonly meetingCancelled: "MEETING_CANCELLED";
13
+ readonly autoEndWithSingleParticipant: "AUTO_END_WITH_SINGLE_PARTICIPANT";
14
+ readonly breakoutEnded: "BREAKOUT_ENDED";
15
+ };
16
+ export type EndMeetingReason = Enum<typeof EndMeetingReason>;
2
17
  export type LocusFullState = {
3
18
  active: boolean;
4
19
  count: number;
5
20
  lastActive: string;
6
21
  locked: boolean;
7
22
  sessionId: string;
8
- seessionIds: string[];
23
+ sessionIds: string[];
9
24
  startTime: number;
10
25
  state: string;
11
26
  type: string;
27
+ endMeetingReason?: EndMeetingReason;
12
28
  };
13
29
  export type Links = {
14
30
  services: Record<'breakout' | 'record', {
@@ -59,3 +75,7 @@ export type ReplacesInfo = {
59
75
  replacedAt: string;
60
76
  sessionId: string;
61
77
  };
78
+ export declare const LocusErrorCodes: {
79
+ readonly LOCUS_INACTIVE: 2403004;
80
+ };
81
+ export type LocusErrorCodes = Enum<typeof LocusErrorCodes>;
@@ -26,6 +26,7 @@ export default class MediaProperties {
26
26
  shareAudioStream?: LocalSystemAudioStream;
27
27
  videoDeviceId: any;
28
28
  videoStream?: LocalCameraStream;
29
+ srtpCipher: string | undefined;
29
30
  namespace: string;
30
31
  mediaIssueCounters: {
31
32
  [key: string]: number;
@@ -115,6 +115,8 @@ interface IInMeetingActions {
115
115
  canDisablePollingQA?: boolean;
116
116
  canAttendeeRequestAiAssistantEnabled?: boolean;
117
117
  isAttendeeRequestAiAssistantDeclinedAll?: boolean;
118
+ isAnonymizeDisplayNamesEnabled?: boolean;
119
+ canViewTheParticipantList?: boolean;
118
120
  }
119
121
  /**
120
122
  * @class InMeetingActions
@@ -230,6 +232,8 @@ export default class InMeetingActions implements IInMeetingActions {
230
232
  canDisablePollingQA: any;
231
233
  canAttendeeRequestAiAssistantEnabled: any;
232
234
  isAttendeeRequestAiAssistantDeclinedAll: any;
235
+ isAnonymizeDisplayNamesEnabled: any;
236
+ canViewTheParticipantList: any;
233
237
  /**
234
238
  * Returns all meeting action options
235
239
  * @returns {Object}
@@ -16,7 +16,7 @@ import { DESTINATION_TYPE, NETWORK_STATUS } from '../constants';
16
16
  import { ReceiveSlotManager } from '../multistream/receiveSlotManager';
17
17
  import { MediaRequestManager } from '../multistream/mediaRequestManager';
18
18
  import { Configuration as RemoteMediaManagerConfiguration, RemoteMediaManager } from '../multistream/remoteMediaManager';
19
- import { ReactionServerType, SkinToneType } from '../reactions/reactions.type';
19
+ import { SkinToneType } from '../reactions/reactions.type';
20
20
  import InMeetingActions from './in-meeting-actions';
21
21
  import RecordingController from '../recording-controller';
22
22
  import ControlsOptionsManager from '../controls-options-manager';
@@ -374,7 +374,7 @@ export default class Meeting extends StatelessWebexPlugin {
374
374
  webinar: any;
375
375
  conversationUrl: string;
376
376
  callStateForMetrics: CallStateForMetrics;
377
- destination: string;
377
+ destination: string | LocusDTO;
378
378
  destinationType: DESTINATION_TYPE;
379
379
  deviceUrl: string;
380
380
  hostId: string;
@@ -412,6 +412,8 @@ export default class Meeting extends StatelessWebexPlugin {
412
412
  floorGrantPending: boolean;
413
413
  hasJoinedOnce: boolean;
414
414
  hasWebsocketConnected: boolean;
415
+ private mercuryOnlineHandler?;
416
+ private mercuryOfflineHandler?;
415
417
  inMeetingActions: InMeetingActions;
416
418
  isLocalShareLive: boolean;
417
419
  isRoapInProgress: boolean;
@@ -422,6 +424,7 @@ export default class Meeting extends StatelessWebexPlugin {
422
424
  joinedWith?: any;
423
425
  selfId?: string;
424
426
  roles: any[];
427
+ canNotViewTheParticipantList?: boolean;
425
428
  locusMediaRequest?: LocusMediaRequest;
426
429
  mediaProperties: MediaProperties;
427
430
  mediaRequestManagers: {
@@ -497,7 +500,7 @@ export default class Meeting extends StatelessWebexPlugin {
497
500
  private deferSDPAnswer?;
498
501
  private sdpResponseTimer?;
499
502
  private hasMediaConnectionConnectedAtLeastOnce;
500
- private joinWithMediaRetryInfo?;
503
+ private joinWithMediaRetryInfo;
501
504
  private connectionStateHandler?;
502
505
  private iceCandidateErrors;
503
506
  private iceCandidatesCount;
@@ -514,6 +517,15 @@ export default class Meeting extends StatelessWebexPlugin {
514
517
  * @memberof Meeting
515
518
  */
516
519
  constructor(attrs: any, options: object, callback: (meeting: Meeting) => void);
520
+ /**
521
+ * Get the ingress payload type for a given media type and codec mime type
522
+ * @param {MediaType} mediaType - The media type
523
+ * @param {MediaCodecMimeType} codecMimeType - The codec mime type
524
+ * @returns {number | undefined} - The ingress payload type
525
+ * @private
526
+ * @memberof Meeting
527
+ */
528
+ private getIngressPayloadTypeCallback;
517
529
  /**
518
530
  * returns meeting is joined
519
531
  * @private
@@ -1051,6 +1063,13 @@ export default class Meeting extends StatelessWebexPlugin {
1051
1063
  * @memberof Meeting
1052
1064
  */
1053
1065
  setSipUri(sipUri: string): void;
1066
+ /**
1067
+ * After initial locus setup, refreshes destination with synced locus data and optionally
1068
+ * performs deferred meeting info fetch when initial locus was incomplete.
1069
+ * @param {LocusDTO} locus
1070
+ * @returns {void}
1071
+ */
1072
+ finalizeMeetingAfterInitialLocusSetup(locus: LocusDTO): Promise<void>;
1054
1073
  /**
1055
1074
  * Set the locus info the class instance. Should be called with the parsed locus
1056
1075
  * we got in the join response.
@@ -1163,6 +1182,22 @@ export default class Meeting extends StatelessWebexPlugin {
1163
1182
  * @memberof Meeting
1164
1183
  */
1165
1184
  setMercuryListener(): void;
1185
+ /**
1186
+ * Removes this meeting's Mercury ONLINE/OFFLINE event listeners registered
1187
+ * by setMercuryListener(). Must be called before Locus /leave to avoid
1188
+ * unnecessary syncs/metrics triggered by events received while leaving
1189
+ * (per Locus team recommendation).
1190
+ *
1191
+ * Mercury is a process-wide singleton shared with other plugins, so we
1192
+ * pass the bound handler refs to .off() to avoid clearing every listener
1193
+ * for ONLINE/OFFLINE on the shared emitter.
1194
+ *
1195
+ * Idempotent: subsequent calls are no-ops because the handler refs are
1196
+ * cleared after detaching.
1197
+ * @private
1198
+ * @returns {void}
1199
+ */
1200
+ private stopListeningForMercuryEvents;
1166
1201
  /**
1167
1202
  * Close the peer connections and remove them from the class.
1168
1203
  * Cleanup any media connection related things.
@@ -1299,6 +1334,12 @@ export default class Meeting extends StatelessWebexPlugin {
1299
1334
  * @returns {void}
1300
1335
  */
1301
1336
  private processLocusLLMEvent;
1337
+ /**
1338
+ * Verifies the relay event was delivered for the active LLM session binding.
1339
+ * @param {RelayEvent} event Event object coming from LLM Connection
1340
+ * @returns {boolean}
1341
+ */
1342
+ private isRelayEventRouteValid;
1302
1343
  /**
1303
1344
  * Callback called when a relay event is received from meeting LLM Connection
1304
1345
  * @param {RelayEvent} e Event object coming from LLM Connection
@@ -1356,8 +1397,41 @@ export default class Meeting extends StatelessWebexPlugin {
1356
1397
  * @returns {void}
1357
1398
  */
1358
1399
  private clearLLMHealthCheckTimer;
1400
+ /**
1401
+ * Removes LLM event listeners and clears the health check timer.
1402
+ * Must be called before Locus /leave to avoid unnecessary syncs triggered
1403
+ * by events received while leaving (per Locus team recommendation).
1404
+ * Idempotent: safe to call multiple times; .off() is a no-op when no
1405
+ * matching listener is registered.
1406
+ * @private
1407
+ * @returns {void}
1408
+ */
1409
+ private stopListeningForLLMEvents;
1410
+ /**
1411
+ * Stops listening on every event bus (LLM, Mercury, voicea/transcription,
1412
+ * annotation) that could otherwise deliver events to this meeting while
1413
+ * Locus is processing /leave or /end. Per the Locus team recommendation,
1414
+ * this must run before the Locus request is dispatched to avoid
1415
+ * unnecessary syncs triggered by in-flight events.
1416
+ *
1417
+ * Voicea (transcription) subscribes to llm 'event:relay.event' internally,
1418
+ * and the annotation plugin subscribes to both mercury and llm, so both
1419
+ * must be torn down alongside the direct LLM/Mercury listeners.
1420
+ *
1421
+ * Idempotent: safe to call multiple times; .off() is a no-op when no
1422
+ * matching listener is registered, and stopTranscription is guarded.
1423
+ * @private
1424
+ * @returns {void}
1425
+ */
1426
+ private stopListeningForMeetingEvents;
1359
1427
  /**
1360
1428
  * Disconnects and cleans up the default LLM session listeners/timers.
1429
+ *
1430
+ * Ownership-aware: only calls `disconnectLLM` when this meeting is the
1431
+ * current owner of the default LLM session (or when no owner is recorded).
1432
+ * Event listeners belonging to this meeting instance are always detached
1433
+ * so they do not receive another meeting's relay events.
1434
+ *
1361
1435
  * @param {Object} options
1362
1436
  * @param {boolean} [options.removeOnlineListener=true] removes the one-time online listener
1363
1437
  * @param {boolean} [options.throwOnError=true] rethrows disconnect errors when true
@@ -1365,8 +1439,8 @@ export default class Meeting extends StatelessWebexPlugin {
1365
1439
  */
1366
1440
  private cleanupLLMConneciton;
1367
1441
  /**
1368
- * Clears all data channel tokens stored in LLM.
1369
- * Called during meeting cleanup to ensure stale tokens are not reused.
1442
+ * Clears data channel tokens associated with this meeting ownership.
1443
+ * Ownership checks are enforced in internal-plugin-llm.
1370
1444
  * @returns {void}
1371
1445
  */
1372
1446
  clearDataChannelToken(): void;
@@ -1980,7 +2054,7 @@ export default class Meeting extends StatelessWebexPlugin {
1980
2054
  * @public
1981
2055
  * @memberof Meeting
1982
2056
  */
1983
- sendReaction(reactionType: ReactionServerType, skinToneType?: SkinToneType): any;
2057
+ sendReaction(reactionType: string, skinToneType?: SkinToneType): any;
1984
2058
  /**
1985
2059
  * Extend the current meeting duration.
1986
2060
  *
@@ -63,6 +63,7 @@ export default class MeetingRequest extends StatelessWebexPlugin {
63
63
  locale?: string;
64
64
  deviceCapabilities?: Array<string>;
65
65
  liveAnnotationSupported: boolean;
66
+ enableSimultaneousInterpretation: boolean;
66
67
  alias?: string;
67
68
  clientMediaPreferences: ClientMediaPreferences;
68
69
  }): Promise<any>;
@@ -133,6 +133,13 @@ declare const MeetingUtil: {
133
133
  * @returns {void}
134
134
  */
135
135
  addSequence: (meeting: any, requestBody: any) => void;
136
+ /**
137
+ * Checks if Locus API response contains a Locus DTO
138
+ *
139
+ * @param {any} response http response from Locus API call
140
+ * @returns {boolean} true if response contains a Locus DTO
141
+ */
142
+ isLocusDtoInAPIResponse(response: any): any;
136
143
  /**
137
144
  * Updates the locus info for the meeting with the locus
138
145
  * information returned from API requests made to Locus
@@ -146,6 +153,8 @@ declare const MeetingUtil: {
146
153
  generateLocusDeltaRequest: (originalMeeting: any) => (originalOptions: any) => any;
147
154
  canAttendeeRequestAiAssistantEnabled: (displayHints?: any[], roles?: any[]) => boolean;
148
155
  attendeeRequestAiAssistantDeclinedAll: (displayHints?: any[]) => boolean;
156
+ isAnonymizeDisplayNamesEnabled: (displayHints: any) => any;
157
+ canViewTheParticipantList: (displayHints: any, canNotViewTheParticipantList: boolean) => any;
149
158
  selfSupportsFeature: (feature: SELF_POLICY, userPolicies: Record<SELF_POLICY, boolean>) => boolean;
150
159
  parseInterpretationInfo: (meeting: any, meetingInfo: any) => void;
151
160
  /**
@@ -8,7 +8,7 @@ import 'webrtc-adapter';
8
8
  import { LOCUSEVENT, DESTINATION_TYPE } from '../constants';
9
9
  import { CallStateForMetrics } from '../meeting';
10
10
  import Reachability from '../reachability';
11
- import { INoiseReductionEffect, IVirtualBackgroundEffect, MeetingRegistrationStatus } from './meetings.types';
11
+ import { FetchSitePreferencesMeViaSiteOptions, INoiseReductionEffect, IVirtualBackgroundEffect, MeetingRegistrationStatus, SitePreferencesResponse } from './meetings.types';
12
12
  import { HashTreeMessage } from '../hashTree/hashTreeParser';
13
13
  export type LocusEvent = {
14
14
  eventType: LOCUSEVENT;
@@ -254,6 +254,16 @@ export default class Meetings extends WebexPlugin {
254
254
  * @returns {undefined}
255
255
  */
256
256
  private _toggleEnableAudioTwccForMultistream;
257
+ /**
258
+ * API to toggle AV1 codec support for video slides in multistream,
259
+ * needs to be called before webex.meetings.joinWithMedia()
260
+ *
261
+ * @param {Boolean} newValue
262
+ * @private
263
+ * @memberof Meetings
264
+ * @returns {undefined}
265
+ */
266
+ private _toggleEnableAv1SlidesSupport;
257
267
  /**
258
268
  * API to toggle stopping ICE Candidates Gathering after first relay candidate,
259
269
  * needs to be called before webex.meetings.joinWithMedia()
@@ -368,6 +378,23 @@ export default class Meetings extends WebexPlugin {
368
378
  * @memberof Meetings
369
379
  */
370
380
  getPersonalMeetingRoom(): any;
381
+ /**
382
+ * Fetches site preferences for the provided Webex site, or the preferred Webex site.
383
+ * This is used to determine capabilities of the site, such as whether scheduling a webinar is supported.
384
+ *
385
+ * @param {object} [options]
386
+ * @param {string} [options.siteUrl] - Webex site URL. Defaults to preferredWebexSite, for example "cisco.webex.com".
387
+ * @param {string} [options.siteName] - Site name query override. Defaults to the site name derived from siteUrl, for example "cisco" for "cisco.webex.com".
388
+ * @param {SitePreferenceSelectOption[]} [options.selectOptions] - Preference sections to fetch. Defaults to 'scheduling'.
389
+ * @returns {Promise<SitePreferencesResponse>} site preferences response body
390
+ * @throws {ParameterError}
391
+ * @public
392
+ * @memberof Meetings
393
+ * @example
394
+ * const preferences = await webex.meetings.fetchSitePreferencesMeViaSite();
395
+ * const supportScheduleWebinar = preferences?.scheduling?.supportScheduleWebinar;
396
+ */
397
+ fetchSitePreferencesMeViaSite(options?: FetchSitePreferencesMeViaSiteOptions): Promise<SitePreferencesResponse>;
371
398
  /**
372
399
  * Returns basic information about a meeting that exists or
373
400
  * used to exist in the MeetingCollection
@@ -477,8 +504,9 @@ export default class Meetings extends WebexPlugin {
477
504
  * @public
478
505
  * @memberof Meetings
479
506
  */
480
- syncMeetings({ keepOnlyLocusMeetings }?: {
507
+ syncMeetings({ keepOnlyLocusMeetings, skipHashTreeSync, }?: {
481
508
  keepOnlyLocusMeetings?: boolean;
509
+ skipHashTreeSync?: boolean;
482
510
  }): Promise<void>;
483
511
  /**
484
512
  * sort out locus array for initial creating
@@ -19,3 +19,18 @@ export type MeetingRegistrationStatus = {
19
19
  mercuryConnect: boolean;
20
20
  checkH264Support: boolean;
21
21
  };
22
+ export declare enum SitePreferenceSelectOption {
23
+ SCHEDULING = "scheduling"
24
+ }
25
+ export type FetchSitePreferencesMeViaSiteOptions = {
26
+ siteUrl?: string;
27
+ siteName?: string;
28
+ selectOptions?: SitePreferenceSelectOption[];
29
+ };
30
+ export declare const DEFAULT_SITE_PREFERENCE_SELECT_OPTIONS: SitePreferenceSelectOption[];
31
+ export type SitePreferencesResponse = {
32
+ scheduling?: {
33
+ supportScheduleWebinar?: boolean;
34
+ webinarWebLink?: string;
35
+ };
36
+ };
@@ -1,4 +1,5 @@
1
1
  import { StatelessWebexPlugin } from '@webex/webex-core';
2
+ import { type FetchSitePreferencesMeViaSiteOptions, type SitePreferencesResponse } from './meetings.types';
2
3
  /**
3
4
  * @class MeetingRequest
4
5
  */
@@ -18,6 +19,19 @@ export default class MeetingRequest extends StatelessWebexPlugin {
18
19
  * @returns {Promise<object>} getMeetingPreferences
19
20
  */
20
21
  getMeetingPreferences(): any;
22
+ /**
23
+ * Fetches site preferences from a given site given a select option and a siteUrl with an optional siteName. If siteName is not provided, it will be derived from the siteUrl. If siteUrl is not provided, it will throw an error. If selectOptions is not provided, it will default to scheduling.
24
+ *
25
+ * @param {object} [options]
26
+ * @param {string} [options.siteUrl] - Webex site URL, for example "cisco.webex.com".
27
+ * @param {string} [options.siteName] - Site name query override. Defaults to the site name derived from options.siteUrl, e.g., "cisco".
28
+ * @param {SitePreferenceSelectOption[]} [options.selectOptions] - Preference sections to fetch. Defaults to 'scheduling'.
29
+ * @returns {Promise<SitePreferencesResponse>} site preferences response body
30
+ * @throws {ParameterError}
31
+ * @public
32
+ * @memberof MeetingRequest
33
+ */
34
+ fetchSitePreferencesMeViaSite(options?: FetchSitePreferencesMeViaSiteOptions): Promise<SitePreferencesResponse>;
21
35
  /**
22
36
  * Fetches indivdual locus rather then getting all at once
23
37
  * @param {object} responseBody determine the locus and fetch them if a remoteUrl is given
@@ -20,6 +20,7 @@ export default class Member {
20
20
  isModerator: any;
21
21
  isModeratorAssignmentProhibited: any;
22
22
  isPresenterAssignmentProhibited: any;
23
+ isAttendeeAssignmentProhibited: any;
23
24
  isMutable: any;
24
25
  isNotAdmitted: any;
25
26
  isRecording: any;
@@ -89,6 +89,7 @@ export interface Participant {
89
89
  moderator: boolean;
90
90
  moderatorAssignmentNotAllowed: boolean;
91
91
  presenterAssignmentNotAllowed: boolean;
92
+ attendeeAssignmentNotAllowed?: boolean;
92
93
  person: ParticipantPerson;
93
94
  resourceGuest: boolean;
94
95
  state: string;
@@ -66,6 +66,7 @@ declare const MemberUtil: {
66
66
  isDevice: (participant: Participant) => boolean;
67
67
  isModeratorAssignmentProhibited: (participant: Participant) => boolean;
68
68
  isPresenterAssignmentProhibited: (participant: Participant) => boolean;
69
+ isAttendeeAssignmentProhibited: (participant: Participant) => boolean;
69
70
  /**
70
71
  * checks to see if the participant id is the same as the passed id
71
72
  * there are multiple ids that can be used
@@ -92,5 +92,8 @@ declare const BEHAVIORAL_METRICS: {
92
92
  DEPRECATED_DELETE_CODEC_PARAMETERS_USED: string;
93
93
  SET_CUSTOM_CODEC_PARAMETERS_USED: string;
94
94
  MARK_CUSTOM_CODEC_PARAMETERS_FOR_DELETION_USED: string;
95
+ HASH_TREE_SYNC_FAILURE: string;
96
+ HASH_TREE_HEARTBEAT_WATCHDOG_EXPIRED: string;
97
+ HASH_TREE_EMPTY_LOCUS_STATE_ELEMENTS: string;
95
98
  };
96
99
  export { BEHAVIORAL_METRICS as default };
@@ -0,0 +1,7 @@
1
+ import { AV1EncodingParams, SupportedResolution } from '@webex/internal-media-core';
2
+ export declare const AV1_CODEC_PARAMETERS: Record<SupportedResolution, AV1EncodingParams>;
3
+ export declare const H264_CODEC_PARAMETERS: {
4
+ maxFs: number;
5
+ maxFps: number;
6
+ maxMbps: number;
7
+ };
@@ -1,4 +1,4 @@
1
- import { StreamRequest, NamedMediaGroup } from '@webex/internal-media-core';
1
+ import { StreamRequest, NamedMediaGroup, MediaType, MediaCodecMimeType } from '@webex/internal-media-core';
2
2
  import { ReceiveSlot } from './receiveSlot';
3
3
  export interface ActiveSpeakerPolicyInfo {
4
4
  policy: 'active-speaker';
@@ -36,14 +36,22 @@ type DegradationPreferences = {
36
36
  maxMacroblocksLimit: number;
37
37
  };
38
38
  type SendMediaRequestsCallback = (streamRequests: StreamRequest[]) => void;
39
- type Kind = 'audio' | 'video';
40
- type Options = {
39
+ type GetIngressPayloadTypeCallback = (mediaType: MediaType, codecMimeType: MediaCodecMimeType) => number | undefined;
40
+ type AudioMediaRequestManagerOptions = {
41
41
  degradationPreferences: DegradationPreferences;
42
- kind: Kind;
42
+ kind: 'audio';
43
43
  trimRequestsToNumOfSources: boolean;
44
44
  };
45
+ type VideoMediaRequestManagerOptions = {
46
+ degradationPreferences: DegradationPreferences;
47
+ kind: 'video';
48
+ trimRequestsToNumOfSources: boolean;
49
+ enableAv1?: boolean;
50
+ };
51
+ type Options = AudioMediaRequestManagerOptions | VideoMediaRequestManagerOptions;
45
52
  export declare class MediaRequestManager {
46
53
  private sendMediaRequestsCallback;
54
+ private getIngressPayloadTypeCallback;
47
55
  private kind;
48
56
  private counter;
49
57
  private clientRequests;
@@ -51,9 +59,10 @@ export declare class MediaRequestManager {
51
59
  private sourceUpdateListener;
52
60
  private debouncedSourceUpdateListener;
53
61
  private trimRequestsToNumOfSources;
62
+ private enableAv1;
54
63
  private numTotalSources;
55
64
  private numLiveSources;
56
- constructor(sendMediaRequestsCallback: SendMediaRequestsCallback, options: Options);
65
+ constructor(sendMediaRequestsCallback: SendMediaRequestsCallback, getIngressPayloadTypeCallback: GetIngressPayloadTypeCallback, options: Options);
57
66
  setDegradationPreferences(degradationPreferences: DegradationPreferences): void;
58
67
  private getDegradedClientRequests;
59
68
  /**
@@ -77,6 +86,14 @@ export declare class MediaRequestManager {
77
86
  * @returns {number} maxMbps
78
87
  */
79
88
  private getH264MaxMbps;
89
+ /**
90
+ * Returns the AV1 encoding parameters for a media request
91
+ * @param mediaRequest - The media request to get the AV1 encoding parameters for
92
+ * @returns {AV1EncodingParams} The AV1 encoding parameters
93
+ */
94
+ private getAv1EncodingParams;
95
+ private buildH264CodecInfo;
96
+ private buildAv1CodecInfo;
80
97
  /** Modifies the passed in clientRequests and makes sure that in total they don't ask
81
98
  * for more streams than there are available.
82
99
  *
@@ -49,5 +49,8 @@ type RelayEventData = {
49
49
  };
50
50
  export type RelayEvent = {
51
51
  data: RelayEventData;
52
+ headers?: {
53
+ route?: string;
54
+ };
52
55
  };
53
56
  export {};