@webex/plugin-meetings 3.12.0-next.6 → 3.12.0-next.60
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/AGENTS.md +9 -0
- package/dist/aiEnableRequest/index.js +15 -2
- package/dist/aiEnableRequest/index.js.map +1 -1
- package/dist/breakouts/breakout.js +8 -3
- package/dist/breakouts/breakout.js.map +1 -1
- package/dist/breakouts/index.js +26 -2
- package/dist/breakouts/index.js.map +1 -1
- package/dist/config.js +2 -0
- package/dist/config.js.map +1 -1
- package/dist/constants.js +6 -3
- package/dist/constants.js.map +1 -1
- package/dist/controls-options-manager/constants.js +11 -1
- package/dist/controls-options-manager/constants.js.map +1 -1
- package/dist/controls-options-manager/index.js +38 -24
- package/dist/controls-options-manager/index.js.map +1 -1
- package/dist/controls-options-manager/util.js +91 -0
- package/dist/controls-options-manager/util.js.map +1 -1
- package/dist/hashTree/constants.js +10 -1
- package/dist/hashTree/constants.js.map +1 -1
- package/dist/hashTree/hashTreeParser.js +716 -370
- package/dist/hashTree/hashTreeParser.js.map +1 -1
- package/dist/hashTree/utils.js +22 -0
- package/dist/hashTree/utils.js.map +1 -1
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -1
- package/dist/interceptors/locusRetry.js +23 -8
- package/dist/interceptors/locusRetry.js.map +1 -1
- package/dist/interpretation/index.js +10 -1
- package/dist/interpretation/index.js.map +1 -1
- package/dist/interpretation/siLanguage.js +1 -1
- package/dist/locus-info/controlsUtils.js +4 -1
- package/dist/locus-info/controlsUtils.js.map +1 -1
- package/dist/locus-info/index.js +289 -87
- package/dist/locus-info/index.js.map +1 -1
- package/dist/locus-info/types.js +19 -0
- package/dist/locus-info/types.js.map +1 -1
- package/dist/media/index.js +3 -1
- package/dist/media/index.js.map +1 -1
- package/dist/media/properties.js +1 -0
- package/dist/media/properties.js.map +1 -1
- package/dist/meeting/in-meeting-actions.js +3 -1
- package/dist/meeting/in-meeting-actions.js.map +1 -1
- package/dist/meeting/index.js +907 -535
- package/dist/meeting/index.js.map +1 -1
- package/dist/meeting/util.js +19 -2
- package/dist/meeting/util.js.map +1 -1
- package/dist/meetings/index.js +231 -78
- package/dist/meetings/index.js.map +1 -1
- package/dist/meetings/meetings.types.js +6 -1
- package/dist/meetings/meetings.types.js.map +1 -1
- package/dist/meetings/request.js +39 -0
- package/dist/meetings/request.js.map +1 -1
- package/dist/meetings/util.js +79 -5
- package/dist/meetings/util.js.map +1 -1
- package/dist/member/index.js +10 -0
- package/dist/member/index.js.map +1 -1
- package/dist/member/types.js.map +1 -1
- package/dist/member/util.js +3 -0
- package/dist/member/util.js.map +1 -1
- package/dist/metrics/constants.js +4 -1
- package/dist/metrics/constants.js.map +1 -1
- package/dist/multistream/codec/constants.js +63 -0
- package/dist/multistream/codec/constants.js.map +1 -0
- package/dist/multistream/mediaRequestManager.js +62 -15
- package/dist/multistream/mediaRequestManager.js.map +1 -1
- package/dist/multistream/receiveSlot.js +9 -0
- package/dist/multistream/receiveSlot.js.map +1 -1
- package/dist/reactions/reactions.type.js.map +1 -1
- package/dist/recording-controller/index.js +1 -3
- package/dist/recording-controller/index.js.map +1 -1
- package/dist/types/config.d.ts +2 -0
- package/dist/types/constants.d.ts +2 -0
- package/dist/types/controls-options-manager/constants.d.ts +6 -1
- package/dist/types/controls-options-manager/index.d.ts +10 -0
- package/dist/types/hashTree/constants.d.ts +1 -0
- package/dist/types/hashTree/hashTreeParser.d.ts +92 -16
- package/dist/types/hashTree/utils.d.ts +11 -0
- package/dist/types/index.d.ts +2 -0
- package/dist/types/interceptors/locusRetry.d.ts +4 -4
- package/dist/types/locus-info/index.d.ts +46 -6
- package/dist/types/locus-info/types.d.ts +21 -1
- package/dist/types/media/properties.d.ts +1 -0
- package/dist/types/meeting/in-meeting-actions.d.ts +2 -0
- package/dist/types/meeting/index.d.ts +87 -3
- package/dist/types/meeting/util.d.ts +8 -0
- package/dist/types/meetings/index.d.ts +30 -2
- package/dist/types/meetings/meetings.types.d.ts +15 -0
- package/dist/types/meetings/request.d.ts +14 -0
- package/dist/types/member/index.d.ts +1 -0
- package/dist/types/member/types.d.ts +1 -0
- package/dist/types/member/util.d.ts +1 -0
- package/dist/types/metrics/constants.d.ts +3 -0
- package/dist/types/multistream/codec/constants.d.ts +7 -0
- package/dist/types/multistream/mediaRequestManager.d.ts +22 -5
- package/dist/types/reactions/reactions.type.d.ts +3 -0
- package/dist/webinar/index.js +361 -235
- package/dist/webinar/index.js.map +1 -1
- package/package.json +22 -22
- package/src/aiEnableRequest/index.ts +16 -0
- package/src/breakouts/breakout.ts +3 -1
- package/src/breakouts/index.ts +31 -0
- package/src/config.ts +2 -0
- package/src/constants.ts +5 -1
- package/src/controls-options-manager/constants.ts +14 -1
- package/src/controls-options-manager/index.ts +47 -24
- package/src/controls-options-manager/util.ts +81 -1
- package/src/hashTree/constants.ts +9 -0
- package/src/hashTree/hashTreeParser.ts +429 -183
- package/src/hashTree/utils.ts +17 -0
- package/src/index.ts +5 -0
- package/src/interceptors/locusRetry.ts +25 -4
- package/src/interpretation/index.ts +25 -8
- package/src/locus-info/controlsUtils.ts +3 -1
- package/src/locus-info/index.ts +291 -97
- package/src/locus-info/types.ts +25 -1
- package/src/media/index.ts +3 -0
- package/src/media/properties.ts +1 -0
- package/src/meeting/in-meeting-actions.ts +4 -0
- package/src/meeting/index.ts +388 -33
- package/src/meeting/util.ts +20 -2
- package/src/meetings/index.ts +134 -44
- package/src/meetings/meetings.types.ts +19 -0
- package/src/meetings/request.ts +43 -0
- package/src/meetings/util.ts +97 -1
- package/src/member/index.ts +10 -0
- package/src/member/types.ts +1 -0
- package/src/member/util.ts +3 -0
- package/src/metrics/constants.ts +3 -0
- package/src/multistream/codec/constants.ts +58 -0
- package/src/multistream/mediaRequestManager.ts +119 -28
- package/src/multistream/receiveSlot.ts +18 -0
- package/src/reactions/reactions.type.ts +3 -0
- package/src/recording-controller/index.ts +1 -2
- package/src/webinar/index.ts +162 -21
- package/test/unit/spec/aiEnableRequest/index.ts +86 -0
- package/test/unit/spec/breakouts/breakout.ts +9 -3
- package/test/unit/spec/breakouts/index.ts +49 -0
- package/test/unit/spec/controls-options-manager/index.js +140 -29
- package/test/unit/spec/controls-options-manager/util.js +165 -0
- package/test/unit/spec/hashTree/hashTreeParser.ts +1508 -149
- package/test/unit/spec/hashTree/utils.ts +88 -1
- package/test/unit/spec/interceptors/locusRetry.ts +205 -4
- package/test/unit/spec/interpretation/index.ts +26 -4
- package/test/unit/spec/locus-info/controlsUtils.js +172 -57
- package/test/unit/spec/locus-info/index.js +475 -81
- package/test/unit/spec/media/index.ts +31 -0
- package/test/unit/spec/meeting/in-meeting-actions.ts +2 -0
- package/test/unit/spec/meeting/index.js +1131 -49
- package/test/unit/spec/meeting/muteState.js +3 -0
- package/test/unit/spec/meeting/utils.js +33 -0
- package/test/unit/spec/meetings/index.js +360 -10
- package/test/unit/spec/meetings/request.js +141 -0
- package/test/unit/spec/meetings/utils.js +189 -0
- package/test/unit/spec/member/index.js +7 -0
- package/test/unit/spec/member/util.js +24 -0
- package/test/unit/spec/multistream/mediaRequestManager.ts +501 -37
- package/test/unit/spec/recording-controller/index.js +9 -8
- package/test/unit/spec/webinar/index.ts +141 -16
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import {DISPLAY_HINTS} from '../constants';
|
|
1
|
+
import {CONTROLS, DISPLAY_HINTS, HTTP_VERBS} from '../constants';
|
|
2
2
|
import {Control} from './enums';
|
|
3
|
+
import {AUDIO_CONTROL_BODY_KEYS} from './constants';
|
|
3
4
|
import {
|
|
4
5
|
ControlConfig,
|
|
5
6
|
AudioProperties,
|
|
@@ -400,6 +401,85 @@ class Utils {
|
|
|
400
401
|
|
|
401
402
|
return determinant;
|
|
402
403
|
}
|
|
404
|
+
|
|
405
|
+
/**
|
|
406
|
+
* Check if all body keys represent audio controls.
|
|
407
|
+
*
|
|
408
|
+
* @param {Record<string, any>} body - The request body to inspect.
|
|
409
|
+
* @returns {boolean} - True if every key in the body is an audio control key.
|
|
410
|
+
*/
|
|
411
|
+
public static isAudioControl(body: Record<string, any>): boolean {
|
|
412
|
+
return Object.keys(body).every((key) => AUDIO_CONTROL_BODY_KEYS.has(key));
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
/**
|
|
416
|
+
* Check if the current locus URL differs from the main locus URL,
|
|
417
|
+
* indicating a breakout session.
|
|
418
|
+
*
|
|
419
|
+
* @param {string} locusUrl - The current locus URL.
|
|
420
|
+
* @param {string} [mainLocusUrl] - The main locus URL.
|
|
421
|
+
* @returns {boolean} - True if in a breakout session.
|
|
422
|
+
*/
|
|
423
|
+
public static isBreakoutLocusUrl(locusUrl: string, mainLocusUrl?: string): boolean {
|
|
424
|
+
return Boolean(mainLocusUrl) && mainLocusUrl !== locusUrl;
|
|
425
|
+
}
|
|
426
|
+
|
|
427
|
+
/**
|
|
428
|
+
* Resolve the target URL and extra body fields for a controls request,
|
|
429
|
+
* handling breakout session routing. Note: This is a pure computation function.
|
|
430
|
+
* It does not validate that locusUrl is
|
|
431
|
+
* defined. Callers must guard against falsy locusUrl before
|
|
432
|
+
* invoking this function.
|
|
433
|
+
* Mixed audio and non-audio keys in a single body (e.g., {audio: {...},
|
|
434
|
+
* raiseHand: {...}}) are treated as non-audio and routed to mainLocusUrl with
|
|
435
|
+
* authorizingLocusUrl. This means the audio portion would go through unsupported
|
|
436
|
+
* cross-locus authorization. Callers must not produce mixed payloads — update()
|
|
437
|
+
* sends each control scope as a separate request, and setControls() only handles
|
|
438
|
+
* audio-related settings.
|
|
439
|
+
*
|
|
440
|
+
* The authorizingLocusUrl mechanism on PATCH /loci/{lid}/controls is not supported
|
|
441
|
+
* for audio control updates (mute/unmute, muteOnEntry, disallowUnmute).
|
|
442
|
+
* Audio controls are not wired into the cross-locus GraphQL authorization path that
|
|
443
|
+
* other control types (raiseHand, viewParticipantList, admit, reactions, etc.) use.
|
|
444
|
+
* Specifically, the GraphQL authorization layer does not recognize audio as a control
|
|
445
|
+
* type eligible for remote locus authorization.
|
|
446
|
+
* This means authorizingLocusUrl is effectively ignored for audio controls and the
|
|
447
|
+
* server evaluates the request against the target locus only, where the host may not
|
|
448
|
+
* be currently joined.
|
|
449
|
+
* Audio control updates must be sent directly to the locus the user is currently in.
|
|
450
|
+
* If the host is in a breakout and wants to mute participants in that breakout, the
|
|
451
|
+
* request should target the breakout locus URL directly, not the main session locus
|
|
452
|
+
* with authorizingLocusUrl.
|
|
453
|
+
* Meeting-wide audio control actions (e.g., muting panelists across all breakouts
|
|
454
|
+
* from a single request) are not currently supported through this mechanism.
|
|
455
|
+
*
|
|
456
|
+
* @param {object} options
|
|
457
|
+
* @param {Record<string, any>} options.body - The request body.
|
|
458
|
+
* @param {string} options.locusUrl - The current locus URL. Must be defined (callers must validate).
|
|
459
|
+
* @param {string} [options.mainLocusUrl] - The main locus URL.
|
|
460
|
+
* @returns {{ uri: string, body: Record<string, any>, method: string }}
|
|
461
|
+
*/
|
|
462
|
+
public static getControlsRequestParams(options: {
|
|
463
|
+
body: Record<string, any>;
|
|
464
|
+
locusUrl: string;
|
|
465
|
+
mainLocusUrl?: string;
|
|
466
|
+
}): {
|
|
467
|
+
uri: string;
|
|
468
|
+
body: Record<string, any>;
|
|
469
|
+
method: string;
|
|
470
|
+
} {
|
|
471
|
+
const {body, locusUrl, mainLocusUrl} = options;
|
|
472
|
+
|
|
473
|
+
const isAudio = Utils.isAudioControl(body);
|
|
474
|
+
const inBreakout = Utils.isBreakoutLocusUrl(locusUrl, mainLocusUrl);
|
|
475
|
+
const targetUrl = inBreakout && !isAudio ? mainLocusUrl : locusUrl;
|
|
476
|
+
|
|
477
|
+
return {
|
|
478
|
+
uri: `${targetUrl}/${CONTROLS}`,
|
|
479
|
+
body: inBreakout && !isAudio ? {...body, authorizingLocusUrl: locusUrl} : body,
|
|
480
|
+
method: HTTP_VERBS.PATCH,
|
|
481
|
+
};
|
|
482
|
+
}
|
|
403
483
|
}
|
|
404
484
|
|
|
405
485
|
export default Utils;
|
|
@@ -8,3 +8,12 @@ export const DataSetNames = {
|
|
|
8
8
|
SELF: 'self', // sent to web client, over Mercury
|
|
9
9
|
UNJOINED: 'unjoined', // sent when you are not joined, but can still see some stuff from the meeting (mutually exclusive with "main")
|
|
10
10
|
};
|
|
11
|
+
|
|
12
|
+
// Priority order for initializing data sets — higher priority names come first.
|
|
13
|
+
// Data sets not listed here will be initialized after all prioritized ones.
|
|
14
|
+
// MAIN must come before SELF because LocusInfo.updateFromHashTree processes the
|
|
15
|
+
// batch of updatedObjects in order, and the SELF handler in updateLocusFromHashTreeObject
|
|
16
|
+
// checks locus.info?.isWebinar (which comes from MAIN) to decide whether to create a
|
|
17
|
+
// participant object for webinar attendees. If SELF were initialized first, locus.info
|
|
18
|
+
// would not yet be populated and the attendee participant would be skipped.
|
|
19
|
+
export const DATA_SET_INIT_PRIORITY: string[] = [DataSetNames.MAIN, DataSetNames.SELF];
|