@webex/plugin-meetings 3.11.0 → 3.12.0-next.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/aiEnableRequest/index.js +184 -0
- package/dist/aiEnableRequest/index.js.map +1 -0
- package/dist/aiEnableRequest/utils.js +36 -0
- package/dist/aiEnableRequest/utils.js.map +1 -0
- package/dist/annotation/index.js +14 -5
- package/dist/annotation/index.js.map +1 -1
- package/dist/breakouts/breakout.js +1 -1
- package/dist/breakouts/index.js +1 -1
- package/dist/config.js +7 -2
- package/dist/config.js.map +1 -1
- package/dist/constants.js +28 -6
- package/dist/constants.js.map +1 -1
- package/dist/hashTree/constants.js +3 -1
- package/dist/hashTree/constants.js.map +1 -1
- package/dist/hashTree/hashTree.js +18 -0
- package/dist/hashTree/hashTree.js.map +1 -1
- package/dist/hashTree/hashTreeParser.js +850 -410
- package/dist/hashTree/hashTreeParser.js.map +1 -1
- package/dist/hashTree/types.js +4 -2
- package/dist/hashTree/types.js.map +1 -1
- package/dist/hashTree/utils.js +10 -0
- package/dist/hashTree/utils.js.map +1 -1
- package/dist/index.js +11 -2
- package/dist/index.js.map +1 -1
- package/dist/interceptors/constant.js +12 -0
- package/dist/interceptors/constant.js.map +1 -0
- package/dist/interceptors/dataChannelAuthToken.js +290 -0
- package/dist/interceptors/dataChannelAuthToken.js.map +1 -0
- package/dist/interceptors/index.js +7 -0
- package/dist/interceptors/index.js.map +1 -1
- package/dist/interceptors/utils.js +27 -0
- package/dist/interceptors/utils.js.map +1 -0
- package/dist/interpretation/index.js +2 -2
- package/dist/interpretation/index.js.map +1 -1
- package/dist/interpretation/siLanguage.js +1 -1
- package/dist/locus-info/controlsUtils.js +5 -3
- package/dist/locus-info/controlsUtils.js.map +1 -1
- package/dist/locus-info/index.js +522 -131
- package/dist/locus-info/index.js.map +1 -1
- package/dist/locus-info/selfUtils.js +1 -0
- package/dist/locus-info/selfUtils.js.map +1 -1
- package/dist/locus-info/types.js.map +1 -1
- package/dist/media/MediaConnectionAwaiter.js +57 -1
- package/dist/media/MediaConnectionAwaiter.js.map +1 -1
- package/dist/media/properties.js +4 -2
- package/dist/media/properties.js.map +1 -1
- package/dist/meeting/in-meeting-actions.js +7 -1
- package/dist/meeting/in-meeting-actions.js.map +1 -1
- package/dist/meeting/index.js +1173 -877
- package/dist/meeting/index.js.map +1 -1
- package/dist/meeting/request.js +50 -0
- package/dist/meeting/request.js.map +1 -1
- package/dist/meeting/request.type.js.map +1 -1
- package/dist/meeting/util.js +133 -3
- package/dist/meeting/util.js.map +1 -1
- package/dist/meetings/index.js +117 -48
- package/dist/meetings/index.js.map +1 -1
- package/dist/member/index.js +10 -0
- package/dist/member/index.js.map +1 -1
- package/dist/member/util.js +10 -0
- package/dist/member/util.js.map +1 -1
- package/dist/metrics/constants.js +2 -1
- package/dist/metrics/constants.js.map +1 -1
- package/dist/multistream/mediaRequestManager.js +9 -60
- package/dist/multistream/mediaRequestManager.js.map +1 -1
- package/dist/multistream/remoteMediaManager.js +11 -0
- package/dist/multistream/remoteMediaManager.js.map +1 -1
- package/dist/reachability/index.js +18 -10
- package/dist/reachability/index.js.map +1 -1
- package/dist/reactions/reactions.type.js.map +1 -1
- package/dist/reconnection-manager/index.js +0 -1
- package/dist/reconnection-manager/index.js.map +1 -1
- package/dist/types/aiEnableRequest/index.d.ts +5 -0
- package/dist/types/aiEnableRequest/utils.d.ts +2 -0
- package/dist/types/config.d.ts +4 -0
- package/dist/types/constants.d.ts +23 -1
- package/dist/types/hashTree/constants.d.ts +1 -0
- package/dist/types/hashTree/hashTree.d.ts +7 -0
- package/dist/types/hashTree/hashTreeParser.d.ts +122 -14
- package/dist/types/hashTree/types.d.ts +3 -0
- package/dist/types/hashTree/utils.d.ts +6 -0
- package/dist/types/index.d.ts +1 -0
- package/dist/types/interceptors/constant.d.ts +5 -0
- package/dist/types/interceptors/dataChannelAuthToken.d.ts +43 -0
- package/dist/types/interceptors/index.d.ts +2 -1
- package/dist/types/interceptors/utils.d.ts +1 -0
- package/dist/types/locus-info/index.d.ts +60 -8
- package/dist/types/locus-info/types.d.ts +7 -0
- package/dist/types/media/MediaConnectionAwaiter.d.ts +10 -1
- package/dist/types/media/properties.d.ts +2 -1
- package/dist/types/meeting/in-meeting-actions.d.ts +6 -0
- package/dist/types/meeting/index.d.ts +61 -7
- package/dist/types/meeting/request.d.ts +16 -1
- package/dist/types/meeting/request.type.d.ts +5 -0
- package/dist/types/meeting/util.d.ts +31 -0
- package/dist/types/meetings/index.d.ts +4 -2
- package/dist/types/member/index.d.ts +1 -0
- package/dist/types/member/util.d.ts +5 -0
- package/dist/types/metrics/constants.d.ts +1 -0
- package/dist/types/multistream/mediaRequestManager.d.ts +0 -23
- package/dist/types/reactions/reactions.type.d.ts +1 -0
- package/dist/types/webinar/utils.d.ts +6 -0
- package/dist/webinar/index.js +291 -91
- package/dist/webinar/index.js.map +1 -1
- package/dist/webinar/utils.js +25 -0
- package/dist/webinar/utils.js.map +1 -0
- package/package.json +24 -23
- package/src/aiEnableRequest/README.md +84 -0
- package/src/aiEnableRequest/index.ts +170 -0
- package/src/aiEnableRequest/utils.ts +25 -0
- package/src/annotation/index.ts +27 -7
- package/src/config.ts +4 -0
- package/src/constants.ts +29 -1
- package/src/hashTree/constants.ts +1 -0
- package/src/hashTree/hashTree.ts +17 -0
- package/src/hashTree/hashTreeParser.ts +745 -252
- package/src/hashTree/types.ts +4 -0
- package/src/hashTree/utils.ts +9 -0
- package/src/index.ts +8 -1
- package/src/interceptors/constant.ts +6 -0
- package/src/interceptors/dataChannelAuthToken.ts +170 -0
- package/src/interceptors/index.ts +2 -1
- package/src/interceptors/utils.ts +16 -0
- package/src/interpretation/index.ts +2 -2
- package/src/locus-info/controlsUtils.ts +11 -0
- package/src/locus-info/index.ts +579 -113
- package/src/locus-info/selfUtils.ts +1 -0
- package/src/locus-info/types.ts +8 -0
- package/src/media/MediaConnectionAwaiter.ts +41 -1
- package/src/media/properties.ts +3 -1
- package/src/meeting/in-meeting-actions.ts +12 -0
- package/src/meeting/index.ts +291 -76
- package/src/meeting/request.ts +42 -0
- package/src/meeting/request.type.ts +6 -0
- package/src/meeting/util.ts +160 -2
- package/src/meetings/index.ts +157 -44
- package/src/member/index.ts +10 -0
- package/src/member/util.ts +12 -0
- package/src/metrics/constants.ts +1 -0
- package/src/multistream/mediaRequestManager.ts +4 -54
- package/src/multistream/remoteMediaManager.ts +13 -0
- package/src/reachability/index.ts +9 -0
- package/src/reactions/reactions.type.ts +1 -0
- package/src/reconnection-manager/index.ts +0 -1
- package/src/webinar/index.ts +191 -6
- package/src/webinar/utils.ts +16 -0
- package/test/unit/spec/aiEnableRequest/index.ts +981 -0
- package/test/unit/spec/aiEnableRequest/utils.ts +130 -0
- package/test/unit/spec/annotation/index.ts +69 -7
- package/test/unit/spec/hashTree/hashTree.ts +66 -0
- package/test/unit/spec/hashTree/hashTreeParser.ts +2225 -189
- package/test/unit/spec/interceptors/dataChannelAuthToken.ts +210 -0
- package/test/unit/spec/interceptors/utils.ts +75 -0
- package/test/unit/spec/locus-info/controlsUtils.js +29 -0
- package/test/unit/spec/locus-info/index.js +1134 -55
- package/test/unit/spec/media/MediaConnectionAwaiter.ts +41 -1
- package/test/unit/spec/media/properties.ts +12 -3
- package/test/unit/spec/meeting/in-meeting-actions.ts +8 -2
- package/test/unit/spec/meeting/index.js +829 -115
- package/test/unit/spec/meeting/request.js +70 -0
- package/test/unit/spec/meeting/utils.js +438 -26
- package/test/unit/spec/meetings/index.js +653 -32
- package/test/unit/spec/member/index.js +28 -4
- package/test/unit/spec/member/util.js +65 -27
- package/test/unit/spec/multistream/mediaRequestManager.ts +2 -85
- package/test/unit/spec/multistream/remoteMediaManager.ts +30 -0
- package/test/unit/spec/reachability/index.ts +23 -0
- package/test/unit/spec/reconnection-manager/index.js +4 -8
- package/test/unit/spec/webinar/index.ts +474 -37
- package/test/unit/spec/webinar/utils.ts +39 -0
package/dist/types/index.d.ts
CHANGED
|
@@ -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,43 @@
|
|
|
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
|
+
* Intercepts outgoing requests and refreshes the Data-Channel-Auth-Token
|
|
20
|
+
* if the current JWT token is expired before the request is sent.
|
|
21
|
+
*
|
|
22
|
+
* @param {Object} options - The original request options.
|
|
23
|
+
* @returns {Promise<Object>} Updated request options with refreshed token if needed.
|
|
24
|
+
*/
|
|
25
|
+
onRequest(options: any): Promise<any>;
|
|
26
|
+
/**
|
|
27
|
+
* Intercept responses and, on 401/403 with `Data-Channel-Auth-Token` header,
|
|
28
|
+
* attempt to refresh the data channel token and retry the original request once.
|
|
29
|
+
*
|
|
30
|
+
* @param {Object} options
|
|
31
|
+
* @param {Object} reason
|
|
32
|
+
* @returns {Promise<HttpResponse>}
|
|
33
|
+
*/
|
|
34
|
+
onResponseError(options: any, reason: any): Promise<unknown>;
|
|
35
|
+
/**
|
|
36
|
+
* Retry the failed data channel request after a delay.
|
|
37
|
+
* Refreshes the Data-Channel-Auth-Token and re-sends the original request.
|
|
38
|
+
*
|
|
39
|
+
* @param {Object} options - Original request options.
|
|
40
|
+
* @returns {Promise<HttpResponse>} - Resolves on successful retry.
|
|
41
|
+
*/
|
|
42
|
+
refreshTokenAndRetryWithDelay(options: any): Promise<unknown>;
|
|
43
|
+
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
1
|
import LocusRetryStatusInterceptor from './locusRetry';
|
|
2
2
|
import LocusRouteTokenInterceptor from './locusRouteToken';
|
|
3
|
-
|
|
3
|
+
import DataChannelAuthTokenInterceptor from './dataChannelAuthToken';
|
|
4
|
+
export { LocusRetryStatusInterceptor, LocusRouteTokenInterceptor, DataChannelAuthTokenInterceptor };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const isJwtTokenExpired: (token: string) => boolean;
|
|
@@ -1,8 +1,9 @@
|
|
|
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
|
+
import MeetingCollection from '../meetings/collection';
|
|
6
7
|
export type LocusLLMEvent = {
|
|
7
8
|
data: {
|
|
8
9
|
eventType: typeof LOCUSEVENT.HASH_TREE_DATA_UPDATED;
|
|
@@ -12,6 +13,33 @@ export type LocusLLMEvent = {
|
|
|
12
13
|
export type LocusApiResponseBody = {
|
|
13
14
|
dataSets?: DataSet[];
|
|
14
15
|
locus: LocusDTO;
|
|
16
|
+
metadata?: Metadata;
|
|
17
|
+
} | LocusDTO;
|
|
18
|
+
export type HashTreeParserEntry = {
|
|
19
|
+
parser: HashTreeParser;
|
|
20
|
+
replacedAt?: string;
|
|
21
|
+
initializedFromHashTree: boolean;
|
|
22
|
+
};
|
|
23
|
+
/**
|
|
24
|
+
* Finds a meeting for a given hash tree message.
|
|
25
|
+
*
|
|
26
|
+
* @param {HashTreeMessage} message - The hash tree message to find the meeting for
|
|
27
|
+
* @param {MeetingCollection} meetingCollection - The collection of meetings to search
|
|
28
|
+
* @param {string} deviceUrl - The URL of the user's device
|
|
29
|
+
* @returns {any} The meeting if found, otherwise undefined
|
|
30
|
+
*/
|
|
31
|
+
export declare function findMeetingForHashTreeMessage(message: HashTreeMessage, meetingCollection: MeetingCollection, deviceUrl: string): any;
|
|
32
|
+
/**
|
|
33
|
+
* Creates a locus object from the objects received in a hash tree message. It usually will be
|
|
34
|
+
* incomplete, because hash tree messages only contain the parts of locus that have changed,
|
|
35
|
+
* and some updates come separately over Mercury or LLM in separate messages.
|
|
36
|
+
*
|
|
37
|
+
* @param {HashTreeMessage} message hash tree message to created the locus from
|
|
38
|
+
* @returns {Object} the created locus object and metadata if present
|
|
39
|
+
*/
|
|
40
|
+
export declare function createLocusFromHashTreeMessage(message: HashTreeMessage): {
|
|
41
|
+
locus: LocusDTO;
|
|
42
|
+
metadata?: Metadata;
|
|
15
43
|
};
|
|
16
44
|
/**
|
|
17
45
|
* @description LocusInfo extends ChildEmitter to convert locusInfo info a private emitter to parent object
|
|
@@ -46,7 +74,7 @@ export default class LocusInfo extends EventsScope {
|
|
|
46
74
|
links?: Links;
|
|
47
75
|
mainSessionLocusCache: any;
|
|
48
76
|
self: any;
|
|
49
|
-
|
|
77
|
+
hashTreeParsers: Map<string, HashTreeParserEntry>;
|
|
50
78
|
hashTreeObjectId2ParticipantId: Map<number, string>;
|
|
51
79
|
classicVsHashTreeMismatchMetricCounter: number;
|
|
52
80
|
/**
|
|
@@ -91,9 +119,13 @@ export default class LocusInfo extends EventsScope {
|
|
|
91
119
|
*/
|
|
92
120
|
init(locus?: any): void;
|
|
93
121
|
/**
|
|
94
|
-
* Creates
|
|
95
|
-
* @param {Object}
|
|
96
|
-
* @
|
|
122
|
+
* Creates a HashTreeParser instance for a given locusUrl and stores it in the map.
|
|
123
|
+
* @param {Object} params
|
|
124
|
+
* @param {string} params.locusUrl - the locus URL used as the map key
|
|
125
|
+
* @param {Object} params.initialLocus - initial locus data
|
|
126
|
+
* @param {Object} params.metadata - hash tree metadata
|
|
127
|
+
* @param {string} params.replacedAt - timestamp from Locus indicating when the replacement happened
|
|
128
|
+
* @returns {HashTreeParser} the newly created parser
|
|
97
129
|
*/
|
|
98
130
|
private createHashTreeParser;
|
|
99
131
|
/**
|
|
@@ -105,6 +137,7 @@ export default class LocusInfo extends EventsScope {
|
|
|
105
137
|
trigger: 'join-response';
|
|
106
138
|
locus: LocusDTO;
|
|
107
139
|
dataSets?: DataSet[];
|
|
140
|
+
metadata?: Metadata;
|
|
108
141
|
} | {
|
|
109
142
|
trigger: 'locus-message';
|
|
110
143
|
locus?: LocusDTO;
|
|
@@ -121,7 +154,6 @@ export default class LocusInfo extends EventsScope {
|
|
|
121
154
|
*/
|
|
122
155
|
handleLocusAPIResponse(meeting: any, responseBody: LocusApiResponseBody): void;
|
|
123
156
|
/**
|
|
124
|
-
*
|
|
125
157
|
* @param {HashTreeObject} object data set object
|
|
126
158
|
* @param {any} locus
|
|
127
159
|
* @returns {void}
|
|
@@ -135,6 +167,13 @@ export default class LocusInfo extends EventsScope {
|
|
|
135
167
|
* @returns {void}
|
|
136
168
|
*/
|
|
137
169
|
sendClassicVsHashTreeMismatchMetric(meeting: any, message: string): void;
|
|
170
|
+
/**
|
|
171
|
+
* Checks if the hash tree message should trigger a switch to a different HashTreeParser
|
|
172
|
+
*
|
|
173
|
+
* @param {HashTreeMessage} message incoming hash tree message
|
|
174
|
+
* @returns {boolean} true if the message was handled as a parser switch, false otherwise
|
|
175
|
+
*/
|
|
176
|
+
private handleHashTreeParserSwitch;
|
|
138
177
|
/**
|
|
139
178
|
* Handles a hash tree message received from Locus.
|
|
140
179
|
*
|
|
@@ -148,6 +187,7 @@ export default class LocusInfo extends EventsScope {
|
|
|
148
187
|
* Callback registered with HashTreeParser to receive locus info updates.
|
|
149
188
|
* Updates our locus info based on the data parsed by the hash tree parser.
|
|
150
189
|
*
|
|
190
|
+
* @param {string} locusUrl - the locus URL for which the update is received
|
|
151
191
|
* @param {LocusInfoUpdateType} updateType - The type of update received.
|
|
152
192
|
* @param {Object} [data] - Additional data for the update, if applicable.
|
|
153
193
|
* @returns {void}
|
|
@@ -171,7 +211,9 @@ export default class LocusInfo extends EventsScope {
|
|
|
171
211
|
/**
|
|
172
212
|
* Function for handling full locus when it's using hash trees (so not the "classic" one).
|
|
173
213
|
*
|
|
214
|
+
* @param {string} debugText string explaining the trigger for this call, added to logs for debugging purposes
|
|
174
215
|
* @param {object} locus locus object
|
|
216
|
+
* @param {object} metadata locus hash trees metadata
|
|
175
217
|
* @param {string} eventType locus event
|
|
176
218
|
* @param {DataSet[]} dataSets
|
|
177
219
|
* @returns {void}
|
|
@@ -180,6 +222,7 @@ export default class LocusInfo extends EventsScope {
|
|
|
180
222
|
/**
|
|
181
223
|
* Function for handling full locus when it's the "classic" one (not hash trees)
|
|
182
224
|
*
|
|
225
|
+
* @param {string} debugText string explaining the trigger for this call, added to logs for debugging purposes
|
|
183
226
|
* @param {object} locus locus object
|
|
184
227
|
* @param {string} eventType locus event
|
|
185
228
|
* @returns {void}
|
|
@@ -187,13 +230,15 @@ export default class LocusInfo extends EventsScope {
|
|
|
187
230
|
private onFullLocusClassic;
|
|
188
231
|
/**
|
|
189
232
|
* updates the locus with full locus object
|
|
233
|
+
* @param {string} debugText string explaining the trigger for this call, added to logs for debugging purposes
|
|
190
234
|
* @param {object} locus locus object
|
|
191
235
|
* @param {string} eventType locus event
|
|
192
236
|
* @param {DataSet[]} dataSets
|
|
237
|
+
* @param {object} metadata locus hash trees metadata
|
|
193
238
|
* @returns {object} null
|
|
194
239
|
* @memberof LocusInfo
|
|
195
240
|
*/
|
|
196
|
-
onFullLocus(locus: any, eventType?: string, dataSets?: Array<DataSet
|
|
241
|
+
onFullLocus(debugText: string, locus: any, eventType?: string, dataSets?: Array<DataSet>, metadata?: Metadata): void;
|
|
197
242
|
/**
|
|
198
243
|
* Common part of handling full locus, used by both classic and hash tree based locus handling
|
|
199
244
|
* @param {object} locus locus object
|
|
@@ -207,6 +252,13 @@ export default class LocusInfo extends EventsScope {
|
|
|
207
252
|
* @memberof LocusInfo
|
|
208
253
|
*/
|
|
209
254
|
handleOneOnOneEvent(eventType: string): void;
|
|
255
|
+
/**
|
|
256
|
+
* Makes sure that passed in locus object has a participant object for self.
|
|
257
|
+
*
|
|
258
|
+
* @param {LocusDTO} locus The locus object to check and modify if needed
|
|
259
|
+
* @returns {void}
|
|
260
|
+
*/
|
|
261
|
+
ensureSelfParticipantExists(locus: any): void;
|
|
210
262
|
/**
|
|
211
263
|
* @param {Object} locus
|
|
212
264
|
* @returns {undefined}
|
|
@@ -218,7 +270,7 @@ export default class LocusInfo extends EventsScope {
|
|
|
218
270
|
* @returns {undefined}
|
|
219
271
|
* @memberof LocusInfo
|
|
220
272
|
*/
|
|
221
|
-
updateLocusInfo(locus: any):
|
|
273
|
+
updateLocusInfo(locus: any): boolean;
|
|
222
274
|
/**
|
|
223
275
|
* @param {Array} participants
|
|
224
276
|
* @param {Object} self
|
|
@@ -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;
|
|
@@ -32,6 +33,7 @@ export type LocusDTO = {
|
|
|
32
33
|
info?: any;
|
|
33
34
|
jsSdkMeta?: {
|
|
34
35
|
removedParticipantIds: string[];
|
|
36
|
+
forceReplaceMembers?: boolean;
|
|
35
37
|
};
|
|
36
38
|
links?: Links;
|
|
37
39
|
mediaShares?: any[];
|
|
@@ -52,3 +54,8 @@ export type LocusDTO = {
|
|
|
52
54
|
syncUrl?: string;
|
|
53
55
|
url?: string;
|
|
54
56
|
};
|
|
57
|
+
export type ReplacesInfo = {
|
|
58
|
+
locusUrl: string;
|
|
59
|
+
replacedAt: string;
|
|
60
|
+
sessionId: string;
|
|
61
|
+
};
|
|
@@ -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, HashTreeMessage, Metadata } from '../hashTree/hashTreeParser';
|
|
27
28
|
import { LocusDTO } from '../locus-info/types';
|
|
28
29
|
export type CaptionData = {
|
|
29
30
|
id: string;
|
|
@@ -70,6 +71,7 @@ export type AddMediaOptions = {
|
|
|
70
71
|
remoteMediaManagerConfig?: RemoteMediaManagerConfiguration;
|
|
71
72
|
bundlePolicy?: BundlePolicy;
|
|
72
73
|
allowMediaInLobby?: boolean;
|
|
74
|
+
allowPublishMediaInLobby?: boolean;
|
|
73
75
|
additionalMediaOptions?: AdditionalMediaOptions;
|
|
74
76
|
};
|
|
75
77
|
export type AdditionalMediaOptions = {
|
|
@@ -346,6 +348,16 @@ type FetchMeetingInfoParams = {
|
|
|
346
348
|
* @property {number} networkQualityScore - {1|0} 1 indicates acceptable uplink 0 indicates unacceptable uplink based on threshold
|
|
347
349
|
* @memberof Meeting
|
|
348
350
|
*/
|
|
351
|
+
/**
|
|
352
|
+
* Stores an event so all events can be later retrieved via a console command for debugging.
|
|
353
|
+
* @param {string} type
|
|
354
|
+
* @param {Object} data
|
|
355
|
+
* @returns {void}
|
|
356
|
+
*/
|
|
357
|
+
export declare function storeEventForDebugging(type: string, data: {
|
|
358
|
+
eventType: any;
|
|
359
|
+
stateElementsMessage?: HashTreeMessage;
|
|
360
|
+
}): void;
|
|
349
361
|
/**
|
|
350
362
|
* @description Meeting is the crux of the plugin
|
|
351
363
|
* @export
|
|
@@ -358,6 +370,7 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
358
370
|
breakouts: any;
|
|
359
371
|
simultaneousInterpretation: any;
|
|
360
372
|
annotation: any;
|
|
373
|
+
aiEnableRequest: any;
|
|
361
374
|
webinar: any;
|
|
362
375
|
conversationUrl: string;
|
|
363
376
|
callStateForMetrics: CallStateForMetrics;
|
|
@@ -405,6 +418,10 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
405
418
|
keepAliveTimerId: NodeJS.Timeout;
|
|
406
419
|
lastVideoLayoutInfo: any;
|
|
407
420
|
locusInfo: any;
|
|
421
|
+
isUserUnadmitted?: boolean;
|
|
422
|
+
joinedWith?: any;
|
|
423
|
+
selfId?: string;
|
|
424
|
+
roles: any[];
|
|
408
425
|
locusMediaRequest?: LocusMediaRequest;
|
|
409
426
|
mediaProperties: MediaProperties;
|
|
410
427
|
mediaRequestManagers: {
|
|
@@ -438,7 +455,6 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
438
455
|
endCallInitJoinReq: any;
|
|
439
456
|
endJoinReqResp: any;
|
|
440
457
|
endLocalSDPGenRemoteSDPRecvDelay: any;
|
|
441
|
-
joinedWith: any;
|
|
442
458
|
locusId: any;
|
|
443
459
|
startCallInitJoinReq: any;
|
|
444
460
|
startJoinReqResp: any;
|
|
@@ -453,12 +469,11 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
453
469
|
permissionTokenReceivedLocalTime: number;
|
|
454
470
|
resourceId: any;
|
|
455
471
|
resourceUrl: string;
|
|
456
|
-
selfId: string;
|
|
457
472
|
state: any;
|
|
458
473
|
localAudioStreamMuteStateHandler: () => void;
|
|
459
474
|
localVideoStreamMuteStateHandler: () => void;
|
|
460
475
|
localOutputTrackChangeHandler: () => void;
|
|
461
|
-
|
|
476
|
+
localConstraintsChangeHandler: () => void;
|
|
462
477
|
environment: string;
|
|
463
478
|
namespace: string;
|
|
464
479
|
allowMediaInLobby: boolean;
|
|
@@ -1060,6 +1075,7 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
1060
1075
|
host: object;
|
|
1061
1076
|
selfId: string;
|
|
1062
1077
|
dataSets: DataSet[];
|
|
1078
|
+
metadata: Metadata;
|
|
1063
1079
|
}): void;
|
|
1064
1080
|
/**
|
|
1065
1081
|
* Upload logs for the current meeting
|
|
@@ -1335,10 +1351,30 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
1335
1351
|
* @returns {void}
|
|
1336
1352
|
*/
|
|
1337
1353
|
private clearLLMHealthCheckTimer;
|
|
1354
|
+
/**
|
|
1355
|
+
* Disconnects and cleans up the default LLM session listeners/timers.
|
|
1356
|
+
* @param {Object} options
|
|
1357
|
+
* @param {boolean} [options.removeOnlineListener=true] removes the one-time online listener
|
|
1358
|
+
* @param {boolean} [options.throwOnError=true] rethrows disconnect errors when true
|
|
1359
|
+
* @returns {Promise<void>}
|
|
1360
|
+
*/
|
|
1361
|
+
private cleanupLLMConneciton;
|
|
1362
|
+
/**
|
|
1363
|
+
* Clears all data channel tokens stored in LLM.
|
|
1364
|
+
* Called during meeting cleanup to ensure stale tokens are not reused.
|
|
1365
|
+
* @returns {void}
|
|
1366
|
+
*/
|
|
1367
|
+
clearDataChannelToken(): void;
|
|
1368
|
+
/**
|
|
1369
|
+
* Saves the data channel tokens from the join response into LLM so that
|
|
1370
|
+
* updateLLMConnection / updatePSDataChannel don't need to fetch them from locusInfo.
|
|
1371
|
+
* @param {Object} join - The parsed join response (from MeetingUtil.parseLocusJoin)
|
|
1372
|
+
* @returns {void}
|
|
1373
|
+
*/
|
|
1374
|
+
saveDataChannelToken(join: any): void;
|
|
1338
1375
|
/**
|
|
1339
1376
|
* Connects to low latency mercury and reconnects if the address has changed
|
|
1340
1377
|
* It will also disconnect if called when the meeting has ended
|
|
1341
|
-
* @param {String} datachannelUrl
|
|
1342
1378
|
* @returns {Promise}
|
|
1343
1379
|
*/
|
|
1344
1380
|
updateLLMConnection(): Promise<any>;
|
|
@@ -1909,7 +1945,7 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
1909
1945
|
* @public
|
|
1910
1946
|
* @memberof Meeting
|
|
1911
1947
|
*/
|
|
1912
|
-
clearMeetingData: () => void
|
|
1948
|
+
clearMeetingData: () => Promise<void>;
|
|
1913
1949
|
/**
|
|
1914
1950
|
* starts keepAlives being sent
|
|
1915
1951
|
* @returns {void}
|
|
@@ -2087,5 +2123,23 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
2087
2123
|
* @memberof Meetings
|
|
2088
2124
|
*/
|
|
2089
2125
|
cancelSipCallOut(participantId: string): Promise<any>;
|
|
2126
|
+
/**
|
|
2127
|
+
* Method to get new data
|
|
2128
|
+
* @returns {Promise}
|
|
2129
|
+
*/
|
|
2130
|
+
refreshDataChannelToken(): Promise<{
|
|
2131
|
+
body: {
|
|
2132
|
+
datachannelToken: any;
|
|
2133
|
+
dataChannelTokenType: DataChannelTokenType;
|
|
2134
|
+
};
|
|
2135
|
+
}>;
|
|
2136
|
+
/**
|
|
2137
|
+
* Determines the current data channel token type based on the meeting state.
|
|
2138
|
+
*
|
|
2139
|
+
* variant should be used when connecting to the LLM data channel.
|
|
2140
|
+
*
|
|
2141
|
+
* @returns {DataChannelTokenType} The token type representing the current session mode.
|
|
2142
|
+
*/
|
|
2143
|
+
getDataChannelTokenType(): DataChannelTokenType;
|
|
2090
2144
|
}
|
|
2091
2145
|
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():
|
|
292
|
+
unregister(): Promise<void>;
|
|
291
293
|
/**
|
|
292
294
|
* Creates a noise reduction effect
|
|
293
295
|
*
|
|
@@ -5,6 +5,11 @@ declare const MemberUtil: {
|
|
|
5
5
|
* @returns {Boolean}
|
|
6
6
|
*/
|
|
7
7
|
canReclaimHost: (participant: any) => any;
|
|
8
|
+
/**
|
|
9
|
+
* @param {Object} participant - The locus participant object.
|
|
10
|
+
* @returns {Boolean}
|
|
11
|
+
*/
|
|
12
|
+
canApproveAIEnablement: (participant: any) => boolean;
|
|
8
13
|
/**
|
|
9
14
|
* @param {Object} participant - The locus participant object.
|
|
10
15
|
* @returns {[ServerRoleShape]}
|