@webex/plugin-meetings 3.11.0-next.4 → 3.11.0-next.41

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 (146) hide show
  1. package/dist/aiEnableRequest/index.js +184 -0
  2. package/dist/aiEnableRequest/index.js.map +1 -0
  3. package/dist/aiEnableRequest/utils.js +36 -0
  4. package/dist/aiEnableRequest/utils.js.map +1 -0
  5. package/dist/annotation/index.js +3 -3
  6. package/dist/annotation/index.js.map +1 -1
  7. package/dist/breakouts/breakout.js +1 -1
  8. package/dist/breakouts/index.js +1 -1
  9. package/dist/config.js +5 -1
  10. package/dist/config.js.map +1 -1
  11. package/dist/constants.js +26 -6
  12. package/dist/constants.js.map +1 -1
  13. package/dist/hashTree/constants.js +3 -1
  14. package/dist/hashTree/constants.js.map +1 -1
  15. package/dist/hashTree/hashTree.js +18 -0
  16. package/dist/hashTree/hashTree.js.map +1 -1
  17. package/dist/hashTree/hashTreeParser.js +709 -380
  18. package/dist/hashTree/hashTreeParser.js.map +1 -1
  19. package/dist/hashTree/types.js +4 -2
  20. package/dist/hashTree/types.js.map +1 -1
  21. package/dist/hashTree/utils.js +10 -0
  22. package/dist/hashTree/utils.js.map +1 -1
  23. package/dist/index.js +11 -2
  24. package/dist/index.js.map +1 -1
  25. package/dist/interceptors/constant.js +12 -0
  26. package/dist/interceptors/constant.js.map +1 -0
  27. package/dist/interceptors/dataChannelAuthToken.js +233 -0
  28. package/dist/interceptors/dataChannelAuthToken.js.map +1 -0
  29. package/dist/interceptors/index.js +7 -0
  30. package/dist/interceptors/index.js.map +1 -1
  31. package/dist/interpretation/index.js +2 -2
  32. package/dist/interpretation/index.js.map +1 -1
  33. package/dist/interpretation/siLanguage.js +1 -1
  34. package/dist/locus-info/controlsUtils.js +5 -3
  35. package/dist/locus-info/controlsUtils.js.map +1 -1
  36. package/dist/locus-info/index.js +125 -68
  37. package/dist/locus-info/index.js.map +1 -1
  38. package/dist/locus-info/selfUtils.js +1 -0
  39. package/dist/locus-info/selfUtils.js.map +1 -1
  40. package/dist/locus-info/types.js.map +1 -1
  41. package/dist/media/MediaConnectionAwaiter.js +57 -1
  42. package/dist/media/MediaConnectionAwaiter.js.map +1 -1
  43. package/dist/media/properties.js +4 -2
  44. package/dist/media/properties.js.map +1 -1
  45. package/dist/meeting/in-meeting-actions.js +7 -1
  46. package/dist/meeting/in-meeting-actions.js.map +1 -1
  47. package/dist/meeting/index.js +209 -90
  48. package/dist/meeting/index.js.map +1 -1
  49. package/dist/meeting/request.js +50 -0
  50. package/dist/meeting/request.js.map +1 -1
  51. package/dist/meeting/request.type.js.map +1 -1
  52. package/dist/meeting/util.js +128 -2
  53. package/dist/meeting/util.js.map +1 -1
  54. package/dist/meetings/index.js +78 -36
  55. package/dist/meetings/index.js.map +1 -1
  56. package/dist/member/index.js +10 -0
  57. package/dist/member/index.js.map +1 -1
  58. package/dist/member/util.js +10 -0
  59. package/dist/member/util.js.map +1 -1
  60. package/dist/metrics/constants.js +2 -1
  61. package/dist/metrics/constants.js.map +1 -1
  62. package/dist/multistream/mediaRequestManager.js +1 -1
  63. package/dist/multistream/mediaRequestManager.js.map +1 -1
  64. package/dist/multistream/remoteMediaManager.js +11 -0
  65. package/dist/multistream/remoteMediaManager.js.map +1 -1
  66. package/dist/reactions/reactions.type.js.map +1 -1
  67. package/dist/types/aiEnableRequest/index.d.ts +5 -0
  68. package/dist/types/aiEnableRequest/utils.d.ts +2 -0
  69. package/dist/types/config.d.ts +3 -0
  70. package/dist/types/constants.d.ts +21 -1
  71. package/dist/types/hashTree/constants.d.ts +1 -0
  72. package/dist/types/hashTree/hashTree.d.ts +7 -0
  73. package/dist/types/hashTree/hashTreeParser.d.ts +99 -14
  74. package/dist/types/hashTree/types.d.ts +3 -0
  75. package/dist/types/hashTree/utils.d.ts +6 -0
  76. package/dist/types/index.d.ts +1 -0
  77. package/dist/types/interceptors/constant.d.ts +5 -0
  78. package/dist/types/interceptors/dataChannelAuthToken.d.ts +35 -0
  79. package/dist/types/interceptors/index.d.ts +2 -1
  80. package/dist/types/locus-info/index.d.ts +9 -2
  81. package/dist/types/locus-info/types.d.ts +1 -0
  82. package/dist/types/media/MediaConnectionAwaiter.d.ts +10 -1
  83. package/dist/types/media/properties.d.ts +2 -1
  84. package/dist/types/meeting/in-meeting-actions.d.ts +6 -0
  85. package/dist/types/meeting/index.d.ts +24 -2
  86. package/dist/types/meeting/request.d.ts +16 -1
  87. package/dist/types/meeting/request.type.d.ts +5 -0
  88. package/dist/types/meeting/util.d.ts +31 -0
  89. package/dist/types/meetings/index.d.ts +4 -2
  90. package/dist/types/member/index.d.ts +1 -0
  91. package/dist/types/member/util.d.ts +5 -0
  92. package/dist/types/metrics/constants.d.ts +1 -0
  93. package/dist/types/reactions/reactions.type.d.ts +1 -0
  94. package/dist/webinar/index.js +1 -1
  95. package/package.json +22 -22
  96. package/src/aiEnableRequest/README.md +84 -0
  97. package/src/aiEnableRequest/index.ts +170 -0
  98. package/src/aiEnableRequest/utils.ts +25 -0
  99. package/src/annotation/index.ts +7 -4
  100. package/src/config.ts +3 -0
  101. package/src/constants.ts +26 -1
  102. package/src/hashTree/constants.ts +1 -0
  103. package/src/hashTree/hashTree.ts +17 -0
  104. package/src/hashTree/hashTreeParser.ts +627 -249
  105. package/src/hashTree/types.ts +4 -0
  106. package/src/hashTree/utils.ts +9 -0
  107. package/src/index.ts +8 -1
  108. package/src/interceptors/constant.ts +6 -0
  109. package/src/interceptors/dataChannelAuthToken.ts +142 -0
  110. package/src/interceptors/index.ts +2 -1
  111. package/src/interpretation/index.ts +2 -2
  112. package/src/locus-info/controlsUtils.ts +11 -0
  113. package/src/locus-info/index.ts +146 -58
  114. package/src/locus-info/selfUtils.ts +1 -0
  115. package/src/locus-info/types.ts +1 -0
  116. package/src/media/MediaConnectionAwaiter.ts +41 -1
  117. package/src/media/properties.ts +3 -1
  118. package/src/meeting/in-meeting-actions.ts +12 -0
  119. package/src/meeting/index.ts +127 -17
  120. package/src/meeting/request.ts +42 -0
  121. package/src/meeting/request.type.ts +6 -0
  122. package/src/meeting/util.ts +156 -1
  123. package/src/meetings/index.ts +94 -9
  124. package/src/member/index.ts +10 -0
  125. package/src/member/util.ts +12 -0
  126. package/src/metrics/constants.ts +1 -0
  127. package/src/multistream/mediaRequestManager.ts +1 -1
  128. package/src/multistream/remoteMediaManager.ts +13 -0
  129. package/src/reactions/reactions.type.ts +1 -0
  130. package/test/unit/spec/aiEnableRequest/index.ts +981 -0
  131. package/test/unit/spec/aiEnableRequest/utils.ts +130 -0
  132. package/test/unit/spec/hashTree/hashTree.ts +66 -0
  133. package/test/unit/spec/hashTree/hashTreeParser.ts +1869 -189
  134. package/test/unit/spec/interceptors/dataChannelAuthToken.ts +141 -0
  135. package/test/unit/spec/locus-info/controlsUtils.js +29 -0
  136. package/test/unit/spec/locus-info/index.js +201 -45
  137. package/test/unit/spec/media/MediaConnectionAwaiter.ts +41 -1
  138. package/test/unit/spec/media/properties.ts +12 -3
  139. package/test/unit/spec/meeting/in-meeting-actions.ts +8 -2
  140. package/test/unit/spec/meeting/index.js +441 -75
  141. package/test/unit/spec/meeting/request.js +64 -0
  142. package/test/unit/spec/meeting/utils.js +433 -22
  143. package/test/unit/spec/meetings/index.js +550 -10
  144. package/test/unit/spec/member/index.js +28 -4
  145. package/test/unit/spec/member/util.js +65 -27
  146. package/test/unit/spec/multistream/remoteMediaManager.ts +30 -0
@@ -1,6 +1,6 @@
1
1
  import HashTree from './hashTree';
2
2
  import { Enum } from '../constants';
3
- import { HashTreeObject } from './types';
3
+ import { HtMeta, HashTreeObject } from './types';
4
4
  import { LocusDTO } from '../locus-info/types';
5
5
  export interface DataSet {
6
6
  url: string;
@@ -23,10 +23,21 @@ export interface HashTreeMessage {
23
23
  locusStateElements?: Array<HashTreeObject>;
24
24
  locusSessionId?: string;
25
25
  locusUrl: string;
26
+ heartbeatIntervalMs?: number;
27
+ }
28
+ export interface VisibleDataSetInfo {
29
+ name: string;
30
+ url: string;
31
+ dataChannelUrl?: string;
32
+ }
33
+ export interface Metadata {
34
+ htMeta: HtMeta;
35
+ visibleDataSets: VisibleDataSetInfo[];
26
36
  }
27
37
  interface InternalDataSet extends DataSet {
28
38
  hashTree?: HashTree;
29
39
  timer?: ReturnType<typeof setTimeout>;
40
+ heartbeatWatchdogTimer?: ReturnType<typeof setTimeout>;
30
41
  }
31
42
  type WebexRequestMethod = (options: Record<string, any>) => Promise<any>;
32
43
  export declare const LocusInfoUpdateType: {
@@ -37,6 +48,12 @@ export type LocusInfoUpdateType = Enum<typeof LocusInfoUpdateType>;
37
48
  export type LocusInfoUpdateCallback = (updateType: LocusInfoUpdateType, data?: {
38
49
  updatedObjects: HashTreeObject[];
39
50
  }) => void;
51
+ /**
52
+ * This error is thrown if we receive information that the meeting has ended while we're processing some hash messages.
53
+ * It's handled internally by HashTreeParser and results in MEETING_ENDED being sent up.
54
+ */
55
+ export declare class MeetingEndedError extends Error {
56
+ }
40
57
  /**
41
58
  * Parses hash tree eventing locus data
42
59
  */
@@ -45,8 +62,10 @@ declare class HashTreeParser {
45
62
  visibleDataSetsUrl: string;
46
63
  webexRequest: WebexRequestMethod;
47
64
  locusInfoUpdateCallback: LocusInfoUpdateCallback;
48
- visibleDataSets: string[];
65
+ visibleDataSets: VisibleDataSetInfo[];
49
66
  debugId: string;
67
+ heartbeatIntervalMs?: number;
68
+ private excludedDataSets;
50
69
  /**
51
70
  * Constructor for HashTreeParser
52
71
  * @param {Object} options
@@ -57,16 +76,37 @@ declare class HashTreeParser {
57
76
  dataSets: Array<DataSet>;
58
77
  locus: any;
59
78
  };
79
+ metadata: Metadata | null;
60
80
  webexRequest: WebexRequestMethod;
61
81
  locusInfoUpdateCallback: LocusInfoUpdateCallback;
62
82
  debugId: string;
83
+ excludedDataSets?: string[];
63
84
  });
85
+ /**
86
+ * Checks if the given data set name is in the list of visible data sets
87
+ * @param {string} dataSetName data set name to check
88
+ * @returns {Boolean} True if the data set is visible, false otherwise
89
+ */
90
+ private isVisibleDataSet;
91
+ /**
92
+ * Checks if the given data set name is in the excluded list
93
+ * @param {string} dataSetName data set name to check
94
+ * @returns {boolean} True if the data set is excluded, false otherwise
95
+ */
96
+ private isExcludedDataSet;
97
+ /**
98
+ * Adds a data set to the visible data sets list, unless it is in the excluded list.
99
+ * @param {VisibleDataSetInfo} dataSetInfo data set info to add
100
+ * @returns {boolean} True if the data set was added, false if it was excluded
101
+ */
102
+ private addToVisibleDataSetsList;
64
103
  /**
65
104
  * Initializes a new visible data set by creating a hash tree for it, adding it to all the internal structures,
66
105
  * and sending an initial sync request to Locus with empty leaf data - that will trigger Locus to gives us all the data
67
106
  * from that dataset (in the response or via messages).
68
107
  *
69
- * @param {DataSet} dataSet The new data set to be added
108
+ * @param {VisibleDataSetInfo} visibleDataSetInfo Information about the new visible data set
109
+ * @param {DataSet} dataSetInfo The new data set to be added
70
110
  * @returns {Promise}
71
111
  */
72
112
  private initializeNewVisibleDataSet;
@@ -79,12 +119,11 @@ declare class HashTreeParser {
79
119
  */
80
120
  private sendInitializationSyncRequestToLocus;
81
121
  /**
82
- * Queries Locus for information about all the data sets
122
+ * Queries Locus for all up-to-date information about all visible data sets
83
123
  *
84
- * @param {string} url - url from which we can get info about all data sets
85
124
  * @returns {Promise}
86
125
  */
87
- private getAllDataSetsMetadata;
126
+ private getAllVisibleDataSetsFromLocus;
88
127
  /**
89
128
  * Initializes the hash tree parser from a message received from Locus.
90
129
  *
@@ -105,7 +144,7 @@ declare class HashTreeParser {
105
144
  /**
106
145
  * Initializes data sets by doing an initialization sync on each visible data set that doesn't have a hash tree yet.
107
146
  *
108
- * @param {DataSet[]} dataSets Array of DataSet objects to initialize
147
+ * @param {DataSet[]} visibleDataSets Array of visible DataSet objects to initialize
109
148
  * @param {string} debugText Text to include in logs for debugging purposes
110
149
  * @returns {Promise}
111
150
  */
@@ -121,6 +160,15 @@ declare class HashTreeParser {
121
160
  * @returns {any} - An object mapping dataset names to arrays of leaf data
122
161
  */
123
162
  private analyzeLocusHtMeta;
163
+ /**
164
+ * Analyzes the Metadata object that is sent outside of Locus object, and appends its data to passed in leafInfo
165
+ * structure.
166
+ *
167
+ * @param {Record<string, LeafInfo[]>} leafInfo the structure to which the Metadata info will be appended
168
+ * @param {Metadata} metadata Metadata object
169
+ * @returns {void}
170
+ */
171
+ private analyzeMetadata;
124
172
  /**
125
173
  * Checks if the provided hash tree message indicates the end of the meeting and that there won't be any more updates.
126
174
  *
@@ -135,6 +183,22 @@ declare class HashTreeParser {
135
183
  * @returns {void}
136
184
  */
137
185
  private handleRootHashHeartBeatMessage;
186
+ /**
187
+ * Asynchronously initializes new visible data sets
188
+ *
189
+ * @param {VisibleDataSetInfo[]} dataSetsRequiringInitialization list of datasets to initialize
190
+ * @returns {void}
191
+ */
192
+ private queueInitForNewVisibleDataSets;
193
+ /**
194
+ * Handles updates to Metadata object that we receive from Locus via other means than messages. Right now
195
+ * that means only in the API response alongside locus object.
196
+ *
197
+ * @param {Metadata} metadata received in Locus update other than a message (for example in an API response)
198
+ * @param {HashTreeObject[]} updatedObjects a list of updated hash tree objects to which any updates resulting from new Metadata will be added
199
+ * @returns {void}
200
+ */
201
+ handleMetadataUpdate(metadata: Metadata, updatedObjects: HashTreeObject[]): void;
138
202
  /**
139
203
  * This method should be called when we receive a partial locus DTO that contains dataSets and htMeta information
140
204
  * It updates the hash trees with the new leaf data based on the received Locus
@@ -145,6 +209,7 @@ declare class HashTreeParser {
145
209
  handleLocusUpdate(update: {
146
210
  dataSets?: Array<DataSet>;
147
211
  locus: any;
212
+ metadata?: Metadata;
148
213
  }): void;
149
214
  /**
150
215
  * Updates the internal data set information based on the received data set from Locus.
@@ -175,18 +240,17 @@ declare class HashTreeParser {
175
240
  * visible data sets and they require async initialization, the names of these data sets
176
241
  * are returned in an array.
177
242
  *
178
- * @param {string[]} removedDataSets - The list of removed data sets.
179
- * @param {string[]} addedDataSets - The list of added data sets.
243
+ * @param {VisibleDataSetInfo[]} removedDataSets - The list of removed data sets.
244
+ * @param {VisibleDataSetInfo[]} addedDataSets - The list of added data sets.
180
245
  * @param {HashTreeObject[]} updatedObjects - The list of updated hash tree objects to which changes will be added.
181
- * @returns {string[]} names of data sets that couldn't be initialized synchronously
246
+ * @returns {VisibleDataSetInfo[]} list of data sets that couldn't be initialized synchronously
182
247
  */
183
248
  private processVisibleDataSetChanges;
184
249
  /**
185
250
  * Adds entries to the passed in updateObjects array
186
251
  * for the changes that result from adding and removing visible data sets.
187
252
  *
188
- * @param {HashTreeMessage} message - The hash tree message that triggered the visible data set changes.
189
- * @param {string[]} addedDataSets - The list of added data sets.
253
+ * @param {VisibleDataSetInfo[]} addedDataSets - The list of added data sets.
190
254
  * @returns {Promise<void>}
191
255
  */
192
256
  private initializeNewVisibleDataSets;
@@ -195,7 +259,7 @@ declare class HashTreeParser {
195
259
  *
196
260
  * @param {HashTreeMessage} message - The hash tree message containing data sets and objects to be processed
197
261
  * @param {string} [debugText] - Optional debug text to include in logs
198
- * @returns {Promise}
262
+ * @returns {HashTreeObject[]} list of hash tree objects that were updated as a result of processing the message
199
263
  */
200
264
  private parseMessage;
201
265
  /**
@@ -205,7 +269,7 @@ declare class HashTreeParser {
205
269
  * @param {string} [debugText] - Optional debug text to include in logs
206
270
  * @returns {void}
207
271
  */
208
- handleMessage(message: HashTreeMessage, debugText?: string): Promise<void>;
272
+ handleMessage(message: HashTreeMessage, debugText?: string): void;
209
273
  /**
210
274
  * Calls the updateInfo callback if there are any updates to report
211
275
  *
@@ -220,6 +284,15 @@ declare class HashTreeParser {
220
284
  * @returns {number} - A weighted backoff time based on the provided configuration, using algorithm supplied by Locus team
221
285
  */
222
286
  private getWeightedBackoffTime;
287
+ /**
288
+ * Performs a sync for the given data set.
289
+ *
290
+ * @param {InternalDataSet} dataSet - The data set to sync
291
+ * @param {string} rootHash - Our current root hash for this data set
292
+ * @param {string} reason - The reason for the sync (used for logging)
293
+ * @returns {Promise<void>}
294
+ */
295
+ private performSync;
223
296
  /**
224
297
  * Runs the sync algorithm for the given data set.
225
298
  *
@@ -227,14 +300,26 @@ declare class HashTreeParser {
227
300
  * @returns {void}
228
301
  */
229
302
  private runSyncAlgorithm;
303
+ /**
304
+ * Resets the heartbeat watchdog timers for the specified data sets. Each data set has its own
305
+ * watchdog timer that monitors whether heartbeats are being received within the expected interval.
306
+ * If a heartbeat is not received for a specific data set within heartbeatIntervalMs plus
307
+ * a backoff-calculated time, the sync algorithm is initiated for that data set
308
+ *
309
+ * @param {Array<DataSet>} receivedDataSets - The data sets from the received message for which watchdog timers should be reset
310
+ * @returns {void}
311
+ */
312
+ private resetHeartbeatWatchdogs;
230
313
  /**
231
314
  * Stops all timers for the data sets to prevent any further sync attempts.
232
315
  * @returns {void}
233
316
  */
234
317
  private stopAllTimers;
318
+ private checkForSentinelHttpResponse;
235
319
  /**
236
320
  * Gets the current hashes from the locus for a specific data set.
237
321
  * @param {string} dataSetName
322
+ * @param {string} currentRootHash
238
323
  * @returns {string[]}
239
324
  */
240
325
  private getHashesFromLocus;
@@ -8,6 +8,8 @@ export declare const ObjectType: {
8
8
  readonly fullState: "fullstate";
9
9
  readonly links: "links";
10
10
  readonly control: "controlentry";
11
+ readonly metadata: "metadata";
12
+ readonly embeddedApp: "embeddedapp";
11
13
  };
12
14
  export type ObjectType = Enum<typeof ObjectType>;
13
15
  export declare const ObjectTypeToLocusKeyMap: {
@@ -18,6 +20,7 @@ export declare const ObjectTypeToLocusKeyMap: {
18
20
  participant: string;
19
21
  mediashare: string;
20
22
  controlentry: string;
23
+ embeddedapp: string;
21
24
  };
22
25
  export interface HtMeta {
23
26
  elementId: {
@@ -5,6 +5,12 @@ import { HashTreeObject } from './types';
5
5
  * @returns {boolean} True if the object is of type "self", false otherwise
6
6
  */
7
7
  export declare function isSelf(object: HashTreeObject): boolean;
8
+ /**
9
+ * Checks if the given hash tree object is of type "Metadata"
10
+ * @param {HashTreeObject} object object to check
11
+ * @returns {boolean} True if the object is of type "Metadata", false otherwise
12
+ */
13
+ export declare function isMetadata(object: HashTreeObject): boolean;
8
14
  /**
9
15
  * Analyzes given part of Locus DTO recursively and delete any nested objects that have their own htMeta
10
16
  *
@@ -19,3 +19,4 @@ export { type Reaction } from './reactions/reactions.type';
19
19
  export { CaptchaError, IntentToJoinError, JoinMeetingError, PasswordError, PermissionError, ReclaimHostIsHostAlreadyError, ReclaimHostNotAllowedError, ReclaimHostNotSupportedError, ReclaimHostEmptyWrongKeyError, Meeting, MeetingInfoUtil, JoinWebinarError, SdpResponseTimeoutError, };
20
20
  export { RemoteMedia } from './multistream/remoteMedia';
21
21
  export { default as TriggerProxy } from './common/events/trigger-proxy';
22
+ export { getAIEnablementApprover } from './aiEnableRequest/utils';
@@ -0,0 +1,5 @@
1
+ declare const DATA_CHANNEL_AUTH_HEADER = "Data-Channel-Auth-Token";
2
+ declare const MAX_RETRY = 1;
3
+ declare const RETRY_INTERVAL = 2000;
4
+ declare const RETRY_KEY = "_dcRetryKey";
5
+ export { DATA_CHANNEL_AUTH_HEADER, MAX_RETRY, RETRY_INTERVAL, RETRY_KEY };
@@ -0,0 +1,35 @@
1
+ /*!
2
+ * Copyright (c) 2015-2026 Cisco Systems, Inc. See LICENSE file.
3
+ */
4
+ import { Interceptor } from '@webex/http-core';
5
+ /**
6
+ * @class
7
+ */
8
+ export default class DataChannelAuthTokenInterceptor extends Interceptor {
9
+ private _refreshDataChannelToken;
10
+ private _isDataChannelTokenEnabled;
11
+ constructor(options: any);
12
+ /**
13
+ * @returns {DataChannelAuthTokenInterceptor}
14
+ */
15
+ static create(): DataChannelAuthTokenInterceptor;
16
+ private getRetryKey;
17
+ private getHeader;
18
+ /**
19
+ * Intercept responses and, on 401/403 with `Data-Channel-Auth-Token` header,
20
+ * attempt to refresh the data channel token and retry the original request once.
21
+ *
22
+ * @param {Object} options
23
+ * @param {Object} reason
24
+ * @returns {Promise<HttpResponse>}
25
+ */
26
+ onResponseError(options: any, reason: any): Promise<unknown>;
27
+ /**
28
+ * Retry the failed data channel request after a delay.
29
+ * Refreshes the Data-Channel-Auth-Token and re-sends the original request.
30
+ *
31
+ * @param {Object} options - Original request options.
32
+ * @returns {Promise<HttpResponse>} - Resolves on successful retry.
33
+ */
34
+ refreshTokenAndRetryWithDelay(options: any): Promise<unknown>;
35
+ }
@@ -1,3 +1,4 @@
1
1
  import LocusRetryStatusInterceptor from './locusRetry';
2
2
  import LocusRouteTokenInterceptor from './locusRouteToken';
3
- export { LocusRetryStatusInterceptor, LocusRouteTokenInterceptor };
3
+ import DataChannelAuthTokenInterceptor from './dataChannelAuthToken';
4
+ export { LocusRetryStatusInterceptor, LocusRouteTokenInterceptor, DataChannelAuthTokenInterceptor };
@@ -1,6 +1,6 @@
1
1
  import EventsScope from '../common/events/events-scope';
2
2
  import { LOCUSEVENT } from '../constants';
3
- import HashTreeParser, { DataSet, HashTreeMessage } from '../hashTree/hashTreeParser';
3
+ import HashTreeParser, { DataSet, HashTreeMessage, Metadata } from '../hashTree/hashTreeParser';
4
4
  import { HashTreeObject } from '../hashTree/types';
5
5
  import { Links, LocusDTO } from './types';
6
6
  export type LocusLLMEvent = {
@@ -12,6 +12,7 @@ export type LocusLLMEvent = {
12
12
  export type LocusApiResponseBody = {
13
13
  dataSets?: DataSet[];
14
14
  locus: LocusDTO;
15
+ metadata?: Metadata;
15
16
  };
16
17
  /**
17
18
  * @description LocusInfo extends ChildEmitter to convert locusInfo info a private emitter to parent object
@@ -105,6 +106,7 @@ export default class LocusInfo extends EventsScope {
105
106
  trigger: 'join-response';
106
107
  locus: LocusDTO;
107
108
  dataSets?: DataSet[];
109
+ metadata?: Metadata;
108
110
  } | {
109
111
  trigger: 'locus-message';
110
112
  locus?: LocusDTO;
@@ -171,7 +173,9 @@ export default class LocusInfo extends EventsScope {
171
173
  /**
172
174
  * Function for handling full locus when it's using hash trees (so not the "classic" one).
173
175
  *
176
+ * @param {string} debugText string explaining the trigger for this call, added to logs for debugging purposes
174
177
  * @param {object} locus locus object
178
+ * @param {object} metadata locus hash trees metadata
175
179
  * @param {string} eventType locus event
176
180
  * @param {DataSet[]} dataSets
177
181
  * @returns {void}
@@ -180,6 +184,7 @@ export default class LocusInfo extends EventsScope {
180
184
  /**
181
185
  * Function for handling full locus when it's the "classic" one (not hash trees)
182
186
  *
187
+ * @param {string} debugText string explaining the trigger for this call, added to logs for debugging purposes
183
188
  * @param {object} locus locus object
184
189
  * @param {string} eventType locus event
185
190
  * @returns {void}
@@ -187,13 +192,15 @@ export default class LocusInfo extends EventsScope {
187
192
  private onFullLocusClassic;
188
193
  /**
189
194
  * updates the locus with full locus object
195
+ * @param {string} debugText string explaining the trigger for this call, added to logs for debugging purposes
190
196
  * @param {object} locus locus object
191
197
  * @param {string} eventType locus event
192
198
  * @param {DataSet[]} dataSets
199
+ * @param {object} metadata locus hash trees metadata
193
200
  * @returns {object} null
194
201
  * @memberof LocusInfo
195
202
  */
196
- onFullLocus(locus: any, eventType?: string, dataSets?: Array<DataSet>): void;
203
+ onFullLocus(debugText: string, locus: any, eventType?: string, dataSets?: Array<DataSet>, metadata?: Metadata): void;
197
204
  /**
198
205
  * Common part of handling full locus, used by both classic and hash tree based locus handling
199
206
  * @param {object} locus locus object
@@ -20,6 +20,7 @@ export type Links = {
20
20
  };
21
21
  export type LocusDTO = {
22
22
  controls?: any;
23
+ embeddedApps?: any[];
23
24
  fullState?: LocusFullState;
24
25
  host?: {
25
26
  id: string;
@@ -1,5 +1,6 @@
1
1
  export interface MediaConnectionAwaiterProps {
2
2
  webrtcMediaConnection: any;
3
+ correlationId: string;
3
4
  }
4
5
  /**
5
6
  * @class MediaConnectionAwaiter
@@ -10,6 +11,7 @@ export default class MediaConnectionAwaiter {
10
11
  private defer;
11
12
  private retried;
12
13
  private iceConnected;
14
+ private correlationId;
13
15
  private onTimeoutCallback;
14
16
  private peerConnectionStateCallback;
15
17
  private iceConnectionStateCallback;
@@ -17,7 +19,7 @@ export default class MediaConnectionAwaiter {
17
19
  /**
18
20
  * @param {MediaConnectionAwaiterProps} mediaConnectionAwaiterProps
19
21
  */
20
- constructor({ webrtcMediaConnection }: MediaConnectionAwaiterProps);
22
+ constructor({ webrtcMediaConnection, correlationId }: MediaConnectionAwaiterProps);
21
23
  /**
22
24
  * Returns true if the connection is connected, false otherwise.
23
25
  *
@@ -66,6 +68,13 @@ export default class MediaConnectionAwaiter {
66
68
  * @returns {void}
67
69
  */
68
70
  iceGatheringStateHandler(): void;
71
+ /**
72
+ * sends a metric with some additional info that might help debugging
73
+ * issues where browser doesn't update the RTCPeerConnection's iceConnectionState or connectionState
74
+ *
75
+ * @returns {void}
76
+ */
77
+ sendMetric(): Promise<void>;
69
78
  /**
70
79
  * Function called when the timeout is reached.
71
80
  *
@@ -93,9 +93,10 @@ export default class MediaProperties {
93
93
  /**
94
94
  * Waits for the webrtc media connection to be connected.
95
95
  *
96
+ * @param {string} correlationId
96
97
  * @returns {Promise<void>}
97
98
  */
98
- waitForMediaConnectionConnected(): Promise<void>;
99
+ waitForMediaConnectionConnected(correlationId: string): Promise<void>;
99
100
  /**
100
101
  * Returns ICE transport information:
101
102
  * - selectedCandidatePairChanges - number of times the selected candidate pair was changed, it should be at least 1 for successful connections
@@ -28,6 +28,7 @@ interface IInMeetingActions {
28
28
  canLowerAllHands?: boolean;
29
29
  canLowerSomeoneElsesHand?: boolean;
30
30
  bothLeaveAndEndMeetingAvailable?: boolean;
31
+ requireHostEndMeetingBeforeLeave?: boolean;
31
32
  canEnableClosedCaption?: boolean;
32
33
  canStartTranscribing?: boolean;
33
34
  canStopTranscribing?: boolean;
@@ -112,6 +113,8 @@ interface IInMeetingActions {
112
113
  canMoveToLobby?: boolean;
113
114
  canEnablePollingQA?: boolean;
114
115
  canDisablePollingQA?: boolean;
116
+ canAttendeeRequestAiAssistantEnabled?: boolean;
117
+ isAttendeeRequestAiAssistantDeclinedAll?: boolean;
115
118
  }
116
119
  /**
117
120
  * @class InMeetingActions
@@ -140,6 +143,7 @@ export default class InMeetingActions implements IInMeetingActions {
140
143
  canLowerAllHands: any;
141
144
  canLowerSomeoneElsesHand: any;
142
145
  bothLeaveAndEndMeetingAvailable: any;
146
+ requireHostEndMeetingBeforeLeave: any;
143
147
  canEnableClosedCaption: any;
144
148
  canStartTranscribing: any;
145
149
  canStopTranscribing: any;
@@ -224,6 +228,8 @@ export default class InMeetingActions implements IInMeetingActions {
224
228
  canMoveToLobby: any;
225
229
  canEnablePollingQA: any;
226
230
  canDisablePollingQA: any;
231
+ canAttendeeRequestAiAssistantEnabled: any;
232
+ isAttendeeRequestAiAssistantDeclinedAll: any;
227
233
  /**
228
234
  * Returns all meeting action options
229
235
  * @returns {Object}
@@ -1,8 +1,9 @@
1
1
  /// <reference types="node" />
2
2
  import { StatelessWebexPlugin } from '@webex/webex-core';
3
3
  import { ClientEvent, ClientEventLeaveReason } from '@webex/internal-plugin-metrics';
4
- import { ClientEvent as RawClientEvent } from '@webex/event-dictionary-ts';
4
+ import type { ClientEvent as RawClientEvent } from '@webex/event-dictionary-ts';
5
5
  import { MediaType, StatsAnalyzer, NetworkQualityMonitor, StatsMonitor } from '@webex/internal-media-core';
6
+ import { DataChannelTokenType } from '@webex/internal-plugin-llm';
6
7
  import { LocalStream, LocalCameraStream, LocalDisplayStream, LocalSystemAudioStream, LocalMicrophoneStream } from '@webex/media-helpers';
7
8
  import Roap, { type TurnDiscoverySkipReason } from '../roap/index';
8
9
  import { type TurnServerInfo } from '../roap/types';
@@ -23,7 +24,7 @@ import { LocusMediaRequest } from './locusMediaRequest';
23
24
  import { BrbState } from './brbState';
24
25
  import { SetStageOptions } from './request.type';
25
26
  import { Invitee } from './type';
26
- import { DataSet } from '../hashTree/hashTreeParser';
27
+ import { DataSet, Metadata } from '../hashTree/hashTreeParser';
27
28
  import { LocusDTO } from '../locus-info/types';
28
29
  export type CaptionData = {
29
30
  id: string;
@@ -359,6 +360,7 @@ export default class Meeting extends StatelessWebexPlugin {
359
360
  breakouts: any;
360
361
  simultaneousInterpretation: any;
361
362
  annotation: any;
363
+ aiEnableRequest: any;
362
364
  webinar: any;
363
365
  conversationUrl: string;
364
366
  callStateForMetrics: CallStateForMetrics;
@@ -461,6 +463,7 @@ export default class Meeting extends StatelessWebexPlugin {
461
463
  localAudioStreamMuteStateHandler: () => void;
462
464
  localVideoStreamMuteStateHandler: () => void;
463
465
  localOutputTrackChangeHandler: () => void;
466
+ localConstraintsChangeHandler: () => void;
464
467
  environment: string;
465
468
  namespace: string;
466
469
  allowMediaInLobby: boolean;
@@ -1062,6 +1065,7 @@ export default class Meeting extends StatelessWebexPlugin {
1062
1065
  host: object;
1063
1066
  selfId: string;
1064
1067
  dataSets: DataSet[];
1068
+ metadata: Metadata;
1065
1069
  }): void;
1066
1070
  /**
1067
1071
  * Upload logs for the current meeting
@@ -2089,5 +2093,23 @@ export default class Meeting extends StatelessWebexPlugin {
2089
2093
  * @memberof Meetings
2090
2094
  */
2091
2095
  cancelSipCallOut(participantId: string): Promise<any>;
2096
+ /**
2097
+ * Method to get new data
2098
+ * @returns {Promise}
2099
+ */
2100
+ refreshDataChannelToken(): Promise<{
2101
+ body: {
2102
+ datachannelToken: any;
2103
+ dataChannelTokenType: DataChannelTokenType;
2104
+ };
2105
+ }>;
2106
+ /**
2107
+ * Determines the current data channel token type based on the meeting state.
2108
+ *
2109
+ * variant should be used when connecting to the LLM data channel.
2110
+ *
2111
+ * @returns {DataChannelTokenType} The token type representing the current session mode.
2112
+ */
2113
+ getDataChannelTokenType(): DataChannelTokenType;
2092
2114
  }
2093
2115
  export {};
@@ -1,5 +1,5 @@
1
1
  import { StatelessWebexPlugin } from '@webex/webex-core';
2
- import { SendReactionOptions, BrbOptions, ToggleReactionsOptions, PostMeetingDataConsentOptions, SynchronizeVideoLayout } from './request.type';
2
+ import { SendReactionOptions, BrbOptions, ToggleReactionsOptions, PostMeetingDataConsentOptions, SynchronizeVideoLayout, fetchDataChannelTokenOptions } from './request.type';
3
3
  import { AnnotationInfo } from '../annotation/annotation.types';
4
4
  import { ClientMediaPreferences } from '../reachability/reachability.types';
5
5
  /**
@@ -364,4 +364,19 @@ export default class MeetingRequest extends StatelessWebexPlugin {
364
364
  * @returns {Promise} The API response
365
365
  */
366
366
  cancelSipCallOut(participantId: any): Promise<any>;
367
+ /**
368
+ * Sends a request to retrieve the datachannel authorization token for a participant.
369
+ *
370
+ * For regular meeting data channel:
371
+ * GET /locus/api/v1/loci/{uuid:lid}/participant/{uuid:pid}/datachannel/token
372
+ *
373
+ * For practice session data channel:
374
+ * GET /locus/api/v1/loci/{uuid:lid}/participant/{uuid:pid}/practiceSession/datachannel/token
375
+ *
376
+ * @param {string} locusUrl - The locus url.
377
+ * @param {string} requestingParticipantId - The participant UUID.
378
+ * @param {boolean} [isPracticeSession=false] - Whether to get the practice session token.
379
+ * @returns {Promise<{datachannelToken: string}>}
380
+ */
381
+ fetchDatachannelToken({ locusUrl, requestingParticipantId, isPracticeSession, }: fetchDataChannelTokenOptions): Promise<any>;
367
382
  }
@@ -94,4 +94,9 @@ export type SetStageVideoLayout = {
94
94
  export type UnsetStageVideoLayout = {
95
95
  overrideDefault: false;
96
96
  };
97
+ export type fetchDataChannelTokenOptions = {
98
+ locusUrl: string;
99
+ requestingParticipantId: string;
100
+ isPracticeSession: boolean;
101
+ };
97
102
  export type SynchronizeVideoLayout = SetStageVideoLayout | UnsetStageVideoLayout;
@@ -2,6 +2,34 @@ import { LocalCameraStream, LocalMicrophoneStream } from '@webex/media-helpers';
2
2
  import { SELF_POLICY, IP_VERSION } from '../constants';
3
3
  declare const MeetingUtil: {
4
4
  parseLocusJoin: (response: any) => any;
5
+ /**
6
+ * Sanitizes a WebSocket URL by extracting only protocol, host, and pathname
7
+ * Returns concatenated protocol + host + pathname for safe logging
8
+ * Note: This is used for logging only; URL matching uses partial matching via _urlsPartiallyMatch
9
+ * @param {string} urlString - The URL to sanitize
10
+ * @returns {string} Sanitized URL or empty string if parsing fails
11
+ */
12
+ sanitizeWebSocketUrl: (urlString: string) => string;
13
+ /**
14
+ * Checks if two URLs partially match using an endsWith approach
15
+ * Combines host and pathname, then checks if one ends with the other
16
+ * This handles cases where one URL goes through a proxy (e.g., /webproxy/) while the other is direct
17
+ * @param {string} url1 - First URL to compare
18
+ * @param {string} url2 - Second URL to compare
19
+ * @returns {boolean} True if one URL path ends with the other (partial match), false otherwise
20
+ */
21
+ _urlsPartiallyMatch: (url1: string, url2: string) => boolean;
22
+ /**
23
+ * Gets socket URL information for metrics, including whether the socket URLs match
24
+ * Uses partial matching to handle proxy URLs (e.g., URLs with /webproxy/ prefix)
25
+ * @param {Object} webex - The webex instance
26
+ * @returns {Object} Object with hasMismatchedSocket, mercurySocketUrl, and deviceSocketUrl properties
27
+ */
28
+ getSocketUrlInfo: (webex: any) => {
29
+ hasMismatchedSocket: boolean;
30
+ mercurySocketUrl: string;
31
+ deviceSocketUrl: string;
32
+ };
5
33
  remoteUpdateAudioVideo: (meeting: any, audioMuted?: boolean, videoMuted?: boolean) => any;
6
34
  hasOwner: (info: any) => any;
7
35
  isOwnerSelf: (owner: any, selfId: any) => boolean;
@@ -59,6 +87,7 @@ declare const MeetingUtil: {
59
87
  canUserLowerAllHands: (displayHints: any) => any;
60
88
  canUserLowerSomeoneElsesHand: (displayHints: any) => any;
61
89
  bothLeaveAndEndMeetingAvailable: (displayHints: any) => any;
90
+ requireHostEndMeetingBeforeLeave: (displayHints: any) => any;
62
91
  canManageBreakout: (displayHints: any) => any;
63
92
  canStartBreakout: (displayHints: any) => boolean;
64
93
  canBroadcastMessageToBreakout: (displayHints: any, policies?: {}) => boolean;
@@ -115,6 +144,8 @@ declare const MeetingUtil: {
115
144
  updateLocusFromApiResponse: (meeting: any, response: any) => any;
116
145
  generateBuildLocusDeltaRequestOptions: (originalMeeting: any) => (originalOptions: any) => any;
117
146
  generateLocusDeltaRequest: (originalMeeting: any) => (originalOptions: any) => any;
147
+ canAttendeeRequestAiAssistantEnabled: (displayHints?: any[], roles?: any[]) => boolean;
148
+ attendeeRequestAiAssistantDeclinedAll: (displayHints?: any[]) => boolean;
118
149
  selfSupportsFeature: (feature: SELF_POLICY, userPolicies: Record<SELF_POLICY, boolean>) => boolean;
119
150
  parseInterpretationInfo: (meeting: any, meetingInfo: any) => void;
120
151
  /**
@@ -95,6 +95,8 @@ export default class Meetings extends WebexPlugin {
95
95
  preferredWebexSite: any;
96
96
  reachability: Reachability;
97
97
  registered: any;
98
+ registrationPromise: Promise<void>;
99
+ unregistrationPromise: Promise<void>;
98
100
  request: any;
99
101
  geoHintInfo: any;
100
102
  meetingInfo: any;
@@ -150,7 +152,7 @@ export default class Meetings extends WebexPlugin {
150
152
  */
151
153
  private handleLocusEvent;
152
154
  /**
153
- * handles locus events through mercury that are not roap
155
+ * handles locus events through mercury that are not roap or approval request events
154
156
  * @param {Object} envelope
155
157
  * @param {Object} envelope.data
156
158
  * @param {String} envelope.data.eventType
@@ -287,7 +289,7 @@ export default class Meetings extends WebexPlugin {
287
289
  * @public
288
290
  * @memberof Meetings
289
291
  */
290
- unregister(): any;
292
+ unregister(): Promise<void>;
291
293
  /**
292
294
  * Creates a noise reduction effect
293
295
  *