@webex/plugin-meetings 3.0.0-beta.28 → 3.0.0-beta.280
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/README.md +46 -8
- package/dist/annotation/annotation.types.js +7 -0
- package/dist/annotation/annotation.types.js.map +1 -0
- package/dist/annotation/constants.js +49 -0
- package/dist/annotation/constants.js.map +1 -0
- package/dist/annotation/index.js +342 -0
- package/dist/annotation/index.js.map +1 -0
- package/dist/breakouts/breakout.js +114 -14
- package/dist/breakouts/breakout.js.map +1 -1
- package/dist/breakouts/edit-lock-error.js +52 -0
- package/dist/breakouts/edit-lock-error.js.map +1 -0
- package/dist/breakouts/events.js +45 -0
- package/dist/breakouts/events.js.map +1 -0
- package/dist/breakouts/index.js +763 -31
- package/dist/breakouts/index.js.map +1 -1
- package/dist/breakouts/request.js +78 -0
- package/dist/breakouts/request.js.map +1 -0
- package/dist/breakouts/utils.js +67 -0
- package/dist/breakouts/utils.js.map +1 -0
- package/dist/common/errors/no-meeting-info.js +51 -0
- package/dist/common/errors/no-meeting-info.js.map +1 -0
- package/dist/common/errors/webex-errors.js +28 -7
- package/dist/common/errors/webex-errors.js.map +1 -1
- package/dist/common/logs/logger-proxy.js +1 -1
- package/dist/common/logs/logger-proxy.js.map +1 -1
- package/dist/common/queue.js +24 -9
- package/dist/common/queue.js.map +1 -1
- package/dist/config.js +5 -10
- package/dist/config.js.map +1 -1
- package/dist/constants.js +203 -28
- package/dist/constants.js.map +1 -1
- package/dist/controls-options-manager/enums.js +14 -2
- package/dist/controls-options-manager/enums.js.map +1 -1
- package/dist/controls-options-manager/index.js +109 -15
- package/dist/controls-options-manager/index.js.map +1 -1
- package/dist/controls-options-manager/types.js +7 -0
- package/dist/controls-options-manager/types.js.map +1 -0
- package/dist/controls-options-manager/util.js +309 -18
- package/dist/controls-options-manager/util.js.map +1 -1
- package/dist/index.js +112 -1
- package/dist/index.js.map +1 -1
- package/dist/interpretation/collection.js +23 -0
- package/dist/interpretation/collection.js.map +1 -0
- package/dist/interpretation/index.js +366 -0
- package/dist/interpretation/index.js.map +1 -0
- package/dist/interpretation/siLanguage.js +25 -0
- package/dist/interpretation/siLanguage.js.map +1 -0
- package/dist/locus-info/controlsUtils.js +91 -2
- package/dist/locus-info/controlsUtils.js.map +1 -1
- package/dist/locus-info/index.js +383 -62
- package/dist/locus-info/index.js.map +1 -1
- package/dist/locus-info/infoUtils.js +7 -1
- package/dist/locus-info/infoUtils.js.map +1 -1
- package/dist/locus-info/mediaSharesUtils.js +57 -1
- package/dist/locus-info/mediaSharesUtils.js.map +1 -1
- package/dist/locus-info/parser.js +249 -72
- package/dist/locus-info/parser.js.map +1 -1
- package/dist/locus-info/selfUtils.js +89 -14
- package/dist/locus-info/selfUtils.js.map +1 -1
- package/dist/media/index.js +58 -116
- package/dist/media/index.js.map +1 -1
- package/dist/media/properties.js +72 -123
- package/dist/media/properties.js.map +1 -1
- package/dist/meeting/in-meeting-actions.js +82 -2
- package/dist/meeting/in-meeting-actions.js.map +1 -1
- package/dist/meeting/index.js +3123 -2814
- package/dist/meeting/index.js.map +1 -1
- package/dist/meeting/locusMediaRequest.js +292 -0
- package/dist/meeting/locusMediaRequest.js.map +1 -0
- package/dist/meeting/muteState.js +230 -124
- package/dist/meeting/muteState.js.map +1 -1
- package/dist/meeting/request.js +256 -196
- package/dist/meeting/request.js.map +1 -1
- package/dist/meeting/util.js +601 -417
- package/dist/meeting/util.js.map +1 -1
- package/dist/meeting-info/index.js +73 -7
- package/dist/meeting-info/index.js.map +1 -1
- package/dist/meeting-info/meeting-info-v2.js +192 -51
- package/dist/meeting-info/meeting-info-v2.js.map +1 -1
- package/dist/meeting-info/util.js +1 -1
- package/dist/meeting-info/util.js.map +1 -1
- package/dist/meeting-info/utilv2.js +36 -36
- package/dist/meeting-info/utilv2.js.map +1 -1
- package/dist/meetings/collection.js +22 -0
- package/dist/meetings/collection.js.map +1 -1
- package/dist/meetings/index.js +394 -94
- package/dist/meetings/index.js.map +1 -1
- package/dist/meetings/meetings.types.js +7 -0
- package/dist/meetings/meetings.types.js.map +1 -0
- package/dist/meetings/request.js +2 -0
- package/dist/meetings/request.js.map +1 -1
- package/dist/meetings/util.js +71 -1
- package/dist/meetings/util.js.map +1 -1
- package/dist/member/index.js +49 -0
- package/dist/member/index.js.map +1 -1
- package/dist/member/types.js +25 -0
- package/dist/member/types.js.map +1 -0
- package/dist/member/util.js +121 -25
- package/dist/member/util.js.map +1 -1
- package/dist/members/collection.js +10 -0
- package/dist/members/collection.js.map +1 -1
- package/dist/members/index.js +86 -6
- package/dist/members/index.js.map +1 -1
- package/dist/members/request.js +106 -38
- package/dist/members/request.js.map +1 -1
- package/dist/members/types.js +15 -0
- package/dist/members/types.js.map +1 -0
- package/dist/members/util.js +316 -233
- package/dist/members/util.js.map +1 -1
- package/dist/metrics/constants.js +12 -5
- package/dist/metrics/constants.js.map +1 -1
- package/dist/metrics/index.js +1 -468
- package/dist/metrics/index.js.map +1 -1
- package/dist/multistream/mediaRequestManager.js +238 -49
- package/dist/multistream/mediaRequestManager.js.map +1 -1
- package/dist/multistream/receiveSlot.js +40 -16
- package/dist/multistream/receiveSlot.js.map +1 -1
- package/dist/multistream/receiveSlotManager.js +39 -36
- package/dist/multistream/receiveSlotManager.js.map +1 -1
- package/dist/multistream/remoteMedia.js +44 -18
- package/dist/multistream/remoteMedia.js.map +1 -1
- package/dist/multistream/remoteMediaGroup.js +60 -3
- package/dist/multistream/remoteMediaGroup.js.map +1 -1
- package/dist/multistream/remoteMediaManager.js +209 -59
- package/dist/multistream/remoteMediaManager.js.map +1 -1
- package/dist/multistream/sendSlotManager.js +233 -0
- package/dist/multistream/sendSlotManager.js.map +1 -0
- package/dist/reachability/index.js +225 -59
- package/dist/reachability/index.js.map +1 -1
- package/dist/reachability/request.js +17 -8
- package/dist/reachability/request.js.map +1 -1
- package/dist/reconnection-manager/index.js +199 -154
- package/dist/reconnection-manager/index.js.map +1 -1
- package/dist/recording-controller/index.js +21 -2
- package/dist/recording-controller/index.js.map +1 -1
- package/dist/recording-controller/util.js +9 -8
- package/dist/recording-controller/util.js.map +1 -1
- package/dist/roap/index.js +23 -29
- package/dist/roap/index.js.map +1 -1
- package/dist/roap/request.js +112 -97
- package/dist/roap/request.js.map +1 -1
- package/dist/roap/turnDiscovery.js +96 -36
- package/dist/roap/turnDiscovery.js.map +1 -1
- package/dist/rtcMetrics/constants.js +12 -0
- package/dist/rtcMetrics/constants.js.map +1 -0
- package/dist/rtcMetrics/index.js +117 -0
- package/dist/rtcMetrics/index.js.map +1 -0
- package/dist/statsAnalyzer/index.js +67 -73
- package/dist/statsAnalyzer/index.js.map +1 -1
- package/dist/statsAnalyzer/mqaUtil.js +11 -10
- package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
- package/dist/types/annotation/annotation.types.d.ts +42 -0
- package/dist/types/annotation/constants.d.ts +31 -0
- package/dist/types/annotation/index.d.ts +117 -0
- package/dist/types/breakouts/edit-lock-error.d.ts +15 -0
- package/dist/types/breakouts/events.d.ts +8 -0
- package/dist/types/breakouts/request.d.ts +22 -0
- package/dist/types/breakouts/utils.d.ts +15 -0
- package/dist/types/common/errors/no-meeting-info.d.ts +14 -0
- package/dist/types/common/errors/webex-errors.d.ts +13 -1
- package/dist/types/common/queue.d.ts +9 -7
- package/dist/types/config.d.ts +1 -6
- package/dist/types/constants.d.ts +161 -21
- package/dist/types/controls-options-manager/enums.d.ts +11 -1
- package/dist/types/controls-options-manager/index.d.ts +17 -1
- package/dist/types/controls-options-manager/types.d.ts +43 -0
- package/dist/types/controls-options-manager/util.d.ts +1 -7
- package/dist/types/index.d.ts +6 -4
- package/dist/types/interpretation/collection.d.ts +5 -0
- package/dist/types/interpretation/index.d.ts +5 -0
- package/dist/types/interpretation/siLanguage.d.ts +5 -0
- package/dist/types/locus-info/index.d.ts +57 -4
- package/dist/types/locus-info/parser.d.ts +67 -6
- package/dist/types/media/index.d.ts +2 -0
- package/dist/types/media/properties.d.ts +34 -48
- package/dist/types/meeting/in-meeting-actions.d.ts +82 -2
- package/dist/types/meeting/index.d.ts +345 -507
- package/dist/types/meeting/locusMediaRequest.d.ts +74 -0
- package/dist/types/meeting/muteState.d.ts +99 -23
- package/dist/types/meeting/request.d.ts +72 -43
- package/dist/types/meeting/util.d.ts +101 -1
- package/dist/types/meeting-info/index.d.ts +13 -1
- package/dist/types/meeting-info/meeting-info-v2.d.ts +31 -1
- package/dist/types/meetings/collection.d.ts +8 -0
- package/dist/types/meetings/index.d.ts +88 -12
- package/dist/types/meetings/meetings.types.d.ts +4 -0
- package/dist/types/member/index.d.ts +13 -0
- package/dist/types/member/types.d.ts +32 -0
- package/dist/types/members/collection.d.ts +5 -0
- package/dist/types/members/index.d.ts +35 -2
- package/dist/types/members/request.d.ts +73 -9
- package/dist/types/members/types.d.ts +24 -0
- package/dist/types/members/util.d.ts +209 -1
- package/dist/types/metrics/constants.d.ts +11 -4
- package/dist/types/metrics/index.d.ts +4 -119
- package/dist/types/multistream/mediaRequestManager.d.ts +73 -5
- package/dist/types/multistream/receiveSlot.d.ts +13 -11
- package/dist/types/multistream/receiveSlotManager.d.ts +14 -4
- package/dist/types/multistream/remoteMedia.d.ts +8 -29
- package/dist/types/multistream/remoteMediaGroup.d.ts +0 -9
- package/dist/types/multistream/remoteMediaManager.d.ts +46 -2
- package/dist/types/multistream/sendSlotManager.d.ts +61 -0
- package/dist/types/reachability/index.d.ts +61 -7
- package/dist/types/reachability/request.d.ts +7 -3
- package/dist/types/reconnection-manager/index.d.ts +9 -0
- package/dist/types/recording-controller/index.d.ts +15 -1
- package/dist/types/recording-controller/util.d.ts +5 -4
- package/dist/types/roap/request.d.ts +15 -11
- package/dist/types/roap/turnDiscovery.d.ts +18 -1
- package/dist/types/rtcMetrics/constants.d.ts +4 -0
- package/dist/types/rtcMetrics/index.d.ts +47 -0
- package/dist/types/statsAnalyzer/index.d.ts +6 -1
- package/package.json +23 -20
- package/src/annotation/annotation.types.ts +50 -0
- package/src/annotation/constants.ts +36 -0
- package/src/annotation/index.ts +328 -0
- package/src/breakouts/README.md +44 -14
- package/src/breakouts/breakout.ts +87 -9
- package/src/breakouts/edit-lock-error.ts +25 -0
- package/src/breakouts/events.ts +56 -0
- package/src/breakouts/index.ts +646 -18
- package/src/breakouts/request.ts +55 -0
- package/src/breakouts/utils.ts +57 -0
- package/src/common/errors/no-meeting-info.ts +24 -0
- package/src/common/errors/webex-errors.ts +27 -2
- package/src/common/logs/logger-proxy.ts +1 -1
- package/src/common/queue.ts +22 -8
- package/src/config.ts +4 -9
- package/src/constants.ts +184 -18
- package/src/controls-options-manager/enums.ts +12 -0
- package/src/controls-options-manager/index.ts +116 -21
- package/src/controls-options-manager/types.ts +59 -0
- package/src/controls-options-manager/util.ts +294 -14
- package/src/index.ts +40 -0
- package/src/interpretation/README.md +60 -0
- package/src/interpretation/collection.ts +19 -0
- package/src/interpretation/index.ts +332 -0
- package/src/interpretation/siLanguage.ts +18 -0
- package/src/locus-info/controlsUtils.ts +108 -0
- package/src/locus-info/index.ts +413 -59
- package/src/locus-info/infoUtils.ts +10 -2
- package/src/locus-info/mediaSharesUtils.ts +64 -0
- package/src/locus-info/parser.ts +258 -47
- package/src/locus-info/selfUtils.ts +81 -5
- package/src/media/index.ts +100 -122
- package/src/media/properties.ts +85 -108
- package/src/meeting/in-meeting-actions.ts +163 -3
- package/src/meeting/index.ts +2541 -2309
- package/src/meeting/locusMediaRequest.ts +313 -0
- package/src/meeting/muteState.ts +229 -131
- package/src/meeting/request.ts +172 -121
- package/src/meeting/util.ts +588 -394
- package/src/meeting-info/index.ts +81 -8
- package/src/meeting-info/meeting-info-v2.ts +170 -14
- package/src/meeting-info/util.ts +1 -1
- package/src/meeting-info/utilv2.ts +23 -23
- package/src/meetings/collection.ts +20 -0
- package/src/meetings/index.ts +428 -108
- package/src/meetings/meetings.types.ts +12 -0
- package/src/meetings/request.ts +2 -0
- package/src/meetings/util.ts +79 -4
- package/src/member/index.ts +49 -0
- package/src/member/types.ts +38 -0
- package/src/member/util.ts +127 -25
- package/src/members/collection.ts +8 -0
- package/src/members/index.ts +106 -7
- package/src/members/request.ts +97 -17
- package/src/members/types.ts +28 -0
- package/src/members/util.ts +319 -240
- package/src/metrics/constants.ts +11 -4
- package/src/metrics/index.ts +1 -490
- package/src/multistream/mediaRequestManager.ts +289 -79
- package/src/multistream/receiveSlot.ts +47 -17
- package/src/multistream/receiveSlotManager.ts +34 -24
- package/src/multistream/remoteMedia.ts +27 -2
- package/src/multistream/remoteMediaGroup.ts +59 -0
- package/src/multistream/remoteMediaManager.ts +148 -30
- package/src/multistream/sendSlotManager.ts +170 -0
- package/src/reachability/index.ts +228 -37
- package/src/reachability/request.ts +17 -8
- package/src/reconnection-manager/index.ts +81 -54
- package/src/recording-controller/index.ts +20 -3
- package/src/recording-controller/util.ts +26 -9
- package/src/roap/index.ts +23 -30
- package/src/roap/request.ts +100 -104
- package/src/roap/turnDiscovery.ts +51 -25
- package/src/rtcMetrics/constants.ts +3 -0
- package/src/rtcMetrics/index.ts +100 -0
- package/src/statsAnalyzer/index.ts +88 -88
- package/src/statsAnalyzer/mqaUtil.ts +13 -14
- package/test/integration/spec/converged-space-meetings.js +60 -3
- package/test/integration/spec/journey.js +320 -261
- package/test/integration/spec/space-meeting.js +76 -3
- package/test/unit/spec/annotation/index.ts +418 -0
- package/test/unit/spec/breakouts/breakout.ts +142 -24
- package/test/unit/spec/breakouts/edit-lock-error.ts +30 -0
- package/test/unit/spec/breakouts/events.ts +89 -0
- package/test/unit/spec/breakouts/index.ts +1488 -67
- package/test/unit/spec/breakouts/request.ts +104 -0
- package/test/unit/spec/breakouts/utils.js +72 -0
- package/test/unit/spec/common/queue.js +31 -2
- package/test/unit/spec/controls-options-manager/index.js +163 -0
- package/test/unit/spec/controls-options-manager/util.js +576 -60
- package/test/unit/spec/fixture/locus.js +1 -0
- package/test/unit/spec/interpretation/collection.ts +15 -0
- package/test/unit/spec/interpretation/index.ts +589 -0
- package/test/unit/spec/interpretation/siLanguage.ts +28 -0
- package/test/unit/spec/locus-info/controlsUtils.js +316 -43
- package/test/unit/spec/locus-info/index.js +1304 -33
- package/test/unit/spec/locus-info/infoUtils.js +37 -15
- package/test/unit/spec/locus-info/lib/SeqCmp.json +16 -0
- package/test/unit/spec/locus-info/mediaSharesUtils.ts +32 -0
- package/test/unit/spec/locus-info/parser.js +116 -35
- package/test/unit/spec/locus-info/selfConstant.js +27 -4
- package/test/unit/spec/locus-info/selfUtils.js +208 -17
- package/test/unit/spec/media/index.ts +104 -37
- package/test/unit/spec/meeting/in-meeting-actions.ts +81 -3
- package/test/unit/spec/meeting/index.js +4515 -1932
- package/test/unit/spec/meeting/locusMediaRequest.ts +442 -0
- package/test/unit/spec/meeting/muteState.js +408 -208
- package/test/unit/spec/meeting/request.js +440 -45
- package/test/unit/spec/meeting/utils.js +679 -64
- package/test/unit/spec/meeting-info/index.js +295 -0
- package/test/unit/spec/meeting-info/meetinginfov2.js +521 -5
- package/test/unit/spec/meeting-info/utilv2.js +21 -0
- package/test/unit/spec/meetings/collection.js +14 -0
- package/test/unit/spec/meetings/index.js +1007 -177
- package/test/unit/spec/meetings/utils.js +206 -2
- package/test/unit/spec/member/index.js +58 -4
- package/test/unit/spec/member/util.js +479 -35
- package/test/unit/spec/members/index.js +319 -1
- package/test/unit/spec/members/request.js +206 -27
- package/test/unit/spec/members/utils.js +184 -0
- package/test/unit/spec/metrics/index.js +1 -50
- package/test/unit/spec/multistream/mediaRequestManager.ts +803 -162
- package/test/unit/spec/multistream/receiveSlot.ts +43 -20
- package/test/unit/spec/multistream/receiveSlotManager.ts +32 -30
- package/test/unit/spec/multistream/remoteMedia.ts +30 -0
- package/test/unit/spec/multistream/remoteMediaGroup.ts +266 -0
- package/test/unit/spec/multistream/remoteMediaManager.ts +326 -0
- package/test/unit/spec/multistream/sendSlotManager.ts +242 -0
- package/test/unit/spec/reachability/index.ts +549 -9
- package/test/unit/spec/reachability/request.js +68 -0
- package/test/unit/spec/reconnection-manager/index.js +84 -9
- package/test/unit/spec/recording-controller/index.js +294 -218
- package/test/unit/spec/recording-controller/util.js +223 -96
- package/test/unit/spec/roap/index.ts +31 -51
- package/test/unit/spec/roap/request.ts +203 -85
- package/test/unit/spec/roap/turnDiscovery.ts +48 -13
- package/test/unit/spec/rtcMetrics/index.ts +68 -0
- package/test/unit/spec/stats-analyzer/index.js +64 -2
- package/test/utils/integrationTestUtils.js +46 -0
- package/test/utils/testUtils.js +0 -52
- package/dist/meeting/effectsState.js +0 -262
- package/dist/meeting/effectsState.js.map +0 -1
- package/dist/metrics/config.js +0 -299
- package/dist/metrics/config.js.map +0 -1
- package/dist/types/meeting/effectsState.d.ts +0 -42
- package/dist/types/metrics/config.d.ts +0 -178
- package/src/index.js +0 -16
- package/src/meeting/effectsState.ts +0 -211
- package/src/metrics/config.ts +0 -495
- package/test/unit/spec/meeting/effectsState.js +0 -285
package/src/breakouts/index.ts
CHANGED
|
@@ -5,17 +5,20 @@ import {WebexPlugin} from '@webex/webex-core';
|
|
|
5
5
|
import {debounce, forEach} from 'lodash';
|
|
6
6
|
import LoggerProxy from '../common/logs/logger-proxy';
|
|
7
7
|
|
|
8
|
-
import {BREAKOUTS, MEETINGS, HTTP_VERBS} from '../constants';
|
|
8
|
+
import {BREAKOUTS, MEETINGS, HTTP_VERBS, _ID_} from '../constants';
|
|
9
9
|
|
|
10
10
|
import Breakout from './breakout';
|
|
11
11
|
import BreakoutCollection from './collection';
|
|
12
|
+
import BreakoutRequest from './request';
|
|
13
|
+
import breakoutEvent from './events';
|
|
14
|
+
import {boServiceErrorHandler, isSessionTypeChangedFromSessionToMain} from './utils';
|
|
12
15
|
|
|
13
16
|
/**
|
|
14
17
|
* @class Breakouts
|
|
15
18
|
*/
|
|
16
19
|
const Breakouts = WebexPlugin.extend({
|
|
17
20
|
namespace: MEETINGS,
|
|
18
|
-
|
|
21
|
+
breakoutRequest: BreakoutRequest,
|
|
19
22
|
collections: {
|
|
20
23
|
breakouts: BreakoutCollection,
|
|
21
24
|
},
|
|
@@ -24,6 +27,7 @@ const Breakouts = WebexPlugin.extend({
|
|
|
24
27
|
allowBackToMain: 'boolean', // only present when in a breakout session
|
|
25
28
|
delayCloseTime: 'number', // appears once breakouts start
|
|
26
29
|
enableBreakoutSession: 'boolean', // appears from the moment you enable breakouts
|
|
30
|
+
hasBreakoutPreAssignments: 'boolean', // appears from the moment you enable breakouts
|
|
27
31
|
groupId: 'string', // appears from the moment you enable breakouts
|
|
28
32
|
name: 'string', // only present when in a breakout session
|
|
29
33
|
sessionId: 'string', // appears from the moment you enable breakouts
|
|
@@ -32,15 +36,23 @@ const Breakouts = WebexPlugin.extend({
|
|
|
32
36
|
status: 'string', // only present when in a breakout session
|
|
33
37
|
url: 'string', // appears from the moment you enable breakouts
|
|
34
38
|
locusUrl: 'string', // the current locus url
|
|
35
|
-
breakoutServiceUrl: 'string', // the current breakout
|
|
39
|
+
breakoutServiceUrl: 'string', // the current breakout resource url
|
|
40
|
+
mainLocusUrl: 'string', // the locus url of the main session
|
|
41
|
+
groups: 'array', // appears when create breakouts
|
|
42
|
+
manageGroups: 'array', // appears when manage breakouts
|
|
43
|
+
preAssignments: 'array', // appears when getPreAssignments info hasBreakoutPreAssignments = true
|
|
44
|
+
editLock: 'object', // appears when getBreakout info editlock = true
|
|
45
|
+
intervalID: 'number',
|
|
46
|
+
meetingId: 'string',
|
|
47
|
+
canManageBreakouts: 'boolean', // appear the ability to manage breakouts
|
|
36
48
|
},
|
|
37
|
-
|
|
38
49
|
children: {
|
|
39
50
|
currentBreakoutSession: Breakout,
|
|
40
51
|
},
|
|
41
52
|
|
|
42
53
|
derived: {
|
|
43
54
|
isInMainSession: {
|
|
55
|
+
cache: false,
|
|
44
56
|
deps: ['sessionType'],
|
|
45
57
|
/**
|
|
46
58
|
* Returns true if the user is in the main session
|
|
@@ -50,6 +62,63 @@ const Breakouts = WebexPlugin.extend({
|
|
|
50
62
|
return this.sessionType === BREAKOUTS.SESSION_TYPES.MAIN;
|
|
51
63
|
},
|
|
52
64
|
},
|
|
65
|
+
isActiveBreakout: {
|
|
66
|
+
cache: false, // fix issue: sometimes the derived will not change even if the deps changed
|
|
67
|
+
deps: ['sessionType', 'status'],
|
|
68
|
+
/**
|
|
69
|
+
* Returns true if the breakout status is active
|
|
70
|
+
* @returns {boolean}
|
|
71
|
+
*/
|
|
72
|
+
fn() {
|
|
73
|
+
return (
|
|
74
|
+
this.sessionType === BREAKOUTS.SESSION_TYPES.BREAKOUT &&
|
|
75
|
+
(this.status === BREAKOUTS.STATUS.OPEN || this.status === BREAKOUTS.STATUS.CLOSING)
|
|
76
|
+
);
|
|
77
|
+
},
|
|
78
|
+
},
|
|
79
|
+
breakoutGroupId: {
|
|
80
|
+
cache: false,
|
|
81
|
+
deps: ['manageGroups'],
|
|
82
|
+
/**
|
|
83
|
+
* Returns the active group id
|
|
84
|
+
* @returns {boolean}
|
|
85
|
+
*/
|
|
86
|
+
fn() {
|
|
87
|
+
if (this.manageGroups?.length) {
|
|
88
|
+
return this.manageGroups[0].status !== BREAKOUTS.STATUS.CLOSED
|
|
89
|
+
? this.manageGroups[0].id
|
|
90
|
+
: '';
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
return '';
|
|
94
|
+
},
|
|
95
|
+
},
|
|
96
|
+
breakoutStatus: {
|
|
97
|
+
cache: true,
|
|
98
|
+
deps: ['isInMainSession', 'status', 'groups'],
|
|
99
|
+
/**
|
|
100
|
+
* Returns the breakout status
|
|
101
|
+
* @returns {boolean}
|
|
102
|
+
*/
|
|
103
|
+
fn() {
|
|
104
|
+
return this.isInMainSession ? this.groups?.[0]?.status : this.status;
|
|
105
|
+
},
|
|
106
|
+
},
|
|
107
|
+
shouldQueryPreAssignments: {
|
|
108
|
+
cache: false,
|
|
109
|
+
deps: ['canManageBreakouts', 'enableBreakoutSession', 'hasBreakoutPreAssignments'],
|
|
110
|
+
/**
|
|
111
|
+
* Returns should query preAssignments or not
|
|
112
|
+
* @returns {boolean}
|
|
113
|
+
*/
|
|
114
|
+
fn() {
|
|
115
|
+
return !!(
|
|
116
|
+
this.canManageBreakouts &&
|
|
117
|
+
this.enableBreakoutSession &&
|
|
118
|
+
this.hasBreakoutPreAssignments
|
|
119
|
+
);
|
|
120
|
+
},
|
|
121
|
+
},
|
|
53
122
|
},
|
|
54
123
|
|
|
55
124
|
/**
|
|
@@ -57,20 +126,33 @@ const Breakouts = WebexPlugin.extend({
|
|
|
57
126
|
* @returns {void}
|
|
58
127
|
*/
|
|
59
128
|
initialize() {
|
|
60
|
-
this.listenTo(this, 'change:
|
|
61
|
-
if (this.
|
|
129
|
+
this.listenTo(this, 'change:breakoutStatus', () => {
|
|
130
|
+
if (this.breakoutStatus === BREAKOUTS.STATUS.CLOSING) {
|
|
62
131
|
this.trigger(BREAKOUTS.EVENTS.BREAKOUTS_CLOSING);
|
|
63
132
|
}
|
|
64
133
|
});
|
|
134
|
+
this.listenTo(this, 'change:shouldQueryPreAssignments', () => {
|
|
135
|
+
if (this.shouldQueryPreAssignments && !this.preAssignments) {
|
|
136
|
+
this.queryPreAssignments();
|
|
137
|
+
}
|
|
138
|
+
});
|
|
65
139
|
this.debouncedQueryRosters = debounce(this.queryRosters, 10, {
|
|
66
140
|
leading: true,
|
|
67
141
|
trailing: false,
|
|
68
142
|
});
|
|
69
|
-
this.listenTo(this.breakouts, 'add', () => {
|
|
143
|
+
this.listenTo(this.breakouts, 'add', (breakout) => {
|
|
70
144
|
this.debouncedQueryRosters();
|
|
145
|
+
this.triggerReturnToMainEvent(breakout);
|
|
71
146
|
});
|
|
147
|
+
this.listenTo(this.breakouts, 'change:requestedLastModifiedTime', (breakout) => {
|
|
148
|
+
this.triggerReturnToMainEvent(breakout);
|
|
149
|
+
});
|
|
150
|
+
this.listenToCurrentSessionTypeChange();
|
|
72
151
|
this.listenToBroadcastMessages();
|
|
73
152
|
this.listenToBreakoutRosters();
|
|
153
|
+
this.listenToBreakoutHelp();
|
|
154
|
+
// @ts-ignore
|
|
155
|
+
this.breakoutRequest = new BreakoutRequest({webex: this.webex});
|
|
74
156
|
},
|
|
75
157
|
|
|
76
158
|
/**
|
|
@@ -88,10 +170,23 @@ const Breakouts = WebexPlugin.extend({
|
|
|
88
170
|
*/
|
|
89
171
|
locusUrlUpdate(locusUrl) {
|
|
90
172
|
this.set('locusUrl', locusUrl);
|
|
173
|
+
const {isInMainSession, mainLocusUrl} = this;
|
|
174
|
+
if (isInMainSession || !mainLocusUrl) {
|
|
175
|
+
this.set('mainLocusUrl', locusUrl);
|
|
176
|
+
}
|
|
91
177
|
},
|
|
92
178
|
|
|
93
179
|
/**
|
|
94
|
-
* Update
|
|
180
|
+
* Update whether self is moderator/cohost or not
|
|
181
|
+
* @param {boolean} canManageBreakouts
|
|
182
|
+
* @returns {void}
|
|
183
|
+
*/
|
|
184
|
+
updateCanManageBreakouts(canManageBreakouts) {
|
|
185
|
+
this.set('canManageBreakouts', canManageBreakouts);
|
|
186
|
+
},
|
|
187
|
+
|
|
188
|
+
/**
|
|
189
|
+
* Update the current breakout resource url
|
|
95
190
|
* @param {string} breakoutServiceUrl
|
|
96
191
|
* @returns {void}
|
|
97
192
|
*/
|
|
@@ -112,7 +207,7 @@ const Breakouts = WebexPlugin.extend({
|
|
|
112
207
|
body: {rosters},
|
|
113
208
|
} = result;
|
|
114
209
|
|
|
115
|
-
rosters
|
|
210
|
+
rosters?.forEach(({locus}) => {
|
|
116
211
|
this.handleRosterUpdate(locus);
|
|
117
212
|
});
|
|
118
213
|
|
|
@@ -139,6 +234,21 @@ const Breakouts = WebexPlugin.extend({
|
|
|
139
234
|
|
|
140
235
|
session.parseRoster(locus);
|
|
141
236
|
},
|
|
237
|
+
/**
|
|
238
|
+
*Sets up listener for currentBreakoutSession sessionType changed
|
|
239
|
+
* @returns {void}
|
|
240
|
+
*/
|
|
241
|
+
listenToCurrentSessionTypeChange(): void {
|
|
242
|
+
this.listenTo(
|
|
243
|
+
this.currentBreakoutSession,
|
|
244
|
+
'change:sessionType',
|
|
245
|
+
(currentBreakoutSession, sessionType) => {
|
|
246
|
+
if (isSessionTypeChangedFromSessionToMain(currentBreakoutSession, sessionType)) {
|
|
247
|
+
this.trigger(BREAKOUTS.EVENTS.LEAVE_BREAKOUT);
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
);
|
|
251
|
+
},
|
|
142
252
|
|
|
143
253
|
/**
|
|
144
254
|
* Sets up listener for broadcast messages sent to the breakout session
|
|
@@ -173,6 +283,36 @@ const Breakouts = WebexPlugin.extend({
|
|
|
173
283
|
});
|
|
174
284
|
},
|
|
175
285
|
|
|
286
|
+
/**
|
|
287
|
+
* Sets up a listener for ask help notify from mecury
|
|
288
|
+
* @returns {void}
|
|
289
|
+
*/
|
|
290
|
+
listenToBreakoutHelp() {
|
|
291
|
+
this.listenTo(this.webex.internal.mercury, 'event:breakout.help', (event) => {
|
|
292
|
+
const {
|
|
293
|
+
data: {participant, sessionId},
|
|
294
|
+
} = event;
|
|
295
|
+
this.trigger(BREAKOUTS.EVENTS.ASK_FOR_HELP, {participant, sessionId});
|
|
296
|
+
});
|
|
297
|
+
},
|
|
298
|
+
|
|
299
|
+
/**
|
|
300
|
+
* get current breakout is in progress or not
|
|
301
|
+
* @returns {boolean}
|
|
302
|
+
*/
|
|
303
|
+
isBreakoutInProgress() {
|
|
304
|
+
const currentStatus = this.groups?.[0]?.status || this.status;
|
|
305
|
+
|
|
306
|
+
return currentStatus === BREAKOUTS.STATUS.OPEN || currentStatus === BREAKOUTS.STATUS.CLOSING;
|
|
307
|
+
},
|
|
308
|
+
|
|
309
|
+
/**
|
|
310
|
+
* get current breakout is in closing or not
|
|
311
|
+
* @returns {boolean}
|
|
312
|
+
*/
|
|
313
|
+
isBreakoutIClosing() {
|
|
314
|
+
return (this.groups?.[0]?.status || this.status) === BREAKOUTS.STATUS.CLOSING;
|
|
315
|
+
},
|
|
176
316
|
/**
|
|
177
317
|
* Updates the information about the current breakout
|
|
178
318
|
* @param {Object} params
|
|
@@ -180,6 +320,10 @@ const Breakouts = WebexPlugin.extend({
|
|
|
180
320
|
*/
|
|
181
321
|
updateBreakout(params) {
|
|
182
322
|
this.set(params);
|
|
323
|
+
// These values are set manually so they are unset when they are not included in params
|
|
324
|
+
this.set('groups', params.groups);
|
|
325
|
+
this.set('startTime', params.startTime);
|
|
326
|
+
this.set('status', params.status);
|
|
183
327
|
|
|
184
328
|
this.set('currentBreakoutSession', {
|
|
185
329
|
sessionId: params.sessionId,
|
|
@@ -190,12 +334,31 @@ const Breakouts = WebexPlugin.extend({
|
|
|
190
334
|
url: params.url,
|
|
191
335
|
[BREAKOUTS.SESSION_STATES.ACTIVE]: false,
|
|
192
336
|
[BREAKOUTS.SESSION_STATES.ALLOWED]: false,
|
|
193
|
-
[BREAKOUTS.SESSION_STATES.
|
|
337
|
+
[BREAKOUTS.SESSION_STATES.ASSIGNED]: false,
|
|
194
338
|
[BREAKOUTS.SESSION_STATES.ASSIGNED_CURRENT]: false,
|
|
195
339
|
[BREAKOUTS.SESSION_STATES.REQUESTED]: false,
|
|
196
340
|
});
|
|
197
341
|
|
|
198
|
-
this.
|
|
342
|
+
if (!this.isBreakoutInProgress()) {
|
|
343
|
+
this.clearBreakouts();
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
if (
|
|
347
|
+
this.currentBreakoutSession.previous('sessionId') !== this.currentBreakoutSession.sessionId ||
|
|
348
|
+
this.currentBreakoutSession.previous('groupId') !== this.currentBreakoutSession.groupId
|
|
349
|
+
) {
|
|
350
|
+
// should report joined session changed
|
|
351
|
+
const meeting = this.webex.meetings.getMeetingByType(_ID_, this.meetingId);
|
|
352
|
+
breakoutEvent.onBreakoutJoinResponse(
|
|
353
|
+
{
|
|
354
|
+
currentSession: this.currentBreakoutSession,
|
|
355
|
+
meeting,
|
|
356
|
+
breakoutMoveId: params.breakoutMoveId,
|
|
357
|
+
},
|
|
358
|
+
// @ts-ignore
|
|
359
|
+
this.webex.internal.newMetrics.submitClientEvent.bind(this.webex.internal.newMetrics)
|
|
360
|
+
);
|
|
361
|
+
}
|
|
199
362
|
},
|
|
200
363
|
|
|
201
364
|
/**
|
|
@@ -205,7 +368,12 @@ const Breakouts = WebexPlugin.extend({
|
|
|
205
368
|
*/
|
|
206
369
|
updateBreakoutSessions(payload) {
|
|
207
370
|
const breakouts = {};
|
|
208
|
-
|
|
371
|
+
if (this.isBreakoutIClosing()) {
|
|
372
|
+
// fix issue: don't clear/update breakouts collection when in closing since locus DTO will send undefined or
|
|
373
|
+
// only the MAIN session info here, if just update it, will miss the breakout roster info during
|
|
374
|
+
// count down to end breakouts
|
|
375
|
+
return;
|
|
376
|
+
}
|
|
209
377
|
if (payload.breakoutSessions) {
|
|
210
378
|
forEach(BREAKOUTS.SESSION_STATES, (state) => {
|
|
211
379
|
forEach(payload.breakoutSessions[state], (breakout) => {
|
|
@@ -221,10 +389,13 @@ const Breakouts = WebexPlugin.extend({
|
|
|
221
389
|
}
|
|
222
390
|
|
|
223
391
|
breakouts[sessionId][state] = true;
|
|
392
|
+
|
|
393
|
+
if (state === BREAKOUTS.SESSION_STATES.REQUESTED) {
|
|
394
|
+
breakouts[sessionId].requestedLastModifiedTime = breakout.modifiedAt;
|
|
395
|
+
}
|
|
224
396
|
});
|
|
225
397
|
});
|
|
226
398
|
}
|
|
227
|
-
|
|
228
399
|
forEach(breakouts, (breakout: typeof Breakout) => {
|
|
229
400
|
// eslint-disable-next-line no-param-reassign
|
|
230
401
|
breakout.url = this.url;
|
|
@@ -232,7 +403,67 @@ const Breakouts = WebexPlugin.extend({
|
|
|
232
403
|
|
|
233
404
|
this.breakouts.set(Object.values(breakouts));
|
|
234
405
|
},
|
|
406
|
+
/**
|
|
407
|
+
* clear breakouts collection
|
|
408
|
+
* @returns {void}
|
|
409
|
+
*/
|
|
410
|
+
clearBreakouts() {
|
|
411
|
+
if (this.breakouts.length > 0) {
|
|
412
|
+
this.breakouts.reset();
|
|
413
|
+
}
|
|
414
|
+
},
|
|
415
|
+
/**
|
|
416
|
+
* get main session
|
|
417
|
+
* @returns {Breakout}
|
|
418
|
+
*/
|
|
419
|
+
getMainSession() {
|
|
420
|
+
if (this.isInMainSession) {
|
|
421
|
+
return this.currentBreakoutSession;
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
const mainSession = this.breakouts.filter((breakout) => breakout.isMain)[0];
|
|
425
|
+
if (!mainSession) {
|
|
426
|
+
throw new Error('no main session found');
|
|
427
|
+
}
|
|
428
|
+
|
|
429
|
+
return mainSession;
|
|
430
|
+
},
|
|
431
|
+
/**
|
|
432
|
+
* Host/CoHost ask all participants return to main session
|
|
433
|
+
* @returns {Promise}
|
|
434
|
+
*/
|
|
435
|
+
askAllToReturn() {
|
|
436
|
+
const mainSession = this.getMainSession();
|
|
437
|
+
|
|
438
|
+
return this.webex.request({
|
|
439
|
+
method: HTTP_VERBS.POST,
|
|
440
|
+
uri: `${this.url}/requestMove`,
|
|
441
|
+
body: {
|
|
442
|
+
groupId: mainSession.groupId,
|
|
443
|
+
sessionId: mainSession.sessionId,
|
|
444
|
+
},
|
|
445
|
+
});
|
|
446
|
+
},
|
|
235
447
|
|
|
448
|
+
/**
|
|
449
|
+
* Broadcast message to all breakout session's participants
|
|
450
|
+
* @param {String} message
|
|
451
|
+
* @param {Object} options
|
|
452
|
+
* @returns {Promise}
|
|
453
|
+
*/
|
|
454
|
+
broadcast(message, options) {
|
|
455
|
+
const {breakoutGroupId} = this;
|
|
456
|
+
if (!breakoutGroupId) {
|
|
457
|
+
throw new Error('Cannot broadcast, no breakout session found');
|
|
458
|
+
}
|
|
459
|
+
|
|
460
|
+
return this.breakoutRequest.broadcast({
|
|
461
|
+
url: this.url,
|
|
462
|
+
message,
|
|
463
|
+
options,
|
|
464
|
+
groupId: breakoutGroupId,
|
|
465
|
+
});
|
|
466
|
+
},
|
|
236
467
|
/**
|
|
237
468
|
* Make enable breakout resource
|
|
238
469
|
* @returns {Promise}
|
|
@@ -260,16 +491,16 @@ const Breakouts = WebexPlugin.extend({
|
|
|
260
491
|
},
|
|
261
492
|
|
|
262
493
|
/**
|
|
263
|
-
* Make the meeting
|
|
494
|
+
* Make the meeting enable or disable breakout session
|
|
264
495
|
* @param {boolean} enable
|
|
265
496
|
* @returns {Promise}
|
|
266
497
|
*/
|
|
267
498
|
async toggleBreakout(enable) {
|
|
268
499
|
if (this.enableBreakoutSession === undefined) {
|
|
269
500
|
const info = await this.enableBreakouts();
|
|
501
|
+
// first time enable, set the initial data
|
|
502
|
+
this.updateBreakout(info?.body);
|
|
270
503
|
if (!enable) {
|
|
271
|
-
// if enable is false, updateBreakout set the param then set enableBreakoutSession as false
|
|
272
|
-
this.updateBreakout(info.body);
|
|
273
504
|
await this.doToggleBreakout(enable);
|
|
274
505
|
}
|
|
275
506
|
} else {
|
|
@@ -283,15 +514,412 @@ const Breakouts = WebexPlugin.extend({
|
|
|
283
514
|
* @returns {Promise}
|
|
284
515
|
*/
|
|
285
516
|
doToggleBreakout(enable) {
|
|
517
|
+
const body = {
|
|
518
|
+
...(this.editLock && !!this.editLock.token ? {editlock: {token: this.editLock.token}} : {}),
|
|
519
|
+
...{enableBreakoutSession: enable},
|
|
520
|
+
};
|
|
521
|
+
|
|
286
522
|
// @ts-ignore
|
|
287
523
|
return this.webex.request({
|
|
288
524
|
method: HTTP_VERBS.PUT,
|
|
289
525
|
uri: this.url,
|
|
290
|
-
body
|
|
291
|
-
|
|
526
|
+
body,
|
|
527
|
+
});
|
|
528
|
+
},
|
|
529
|
+
|
|
530
|
+
/**
|
|
531
|
+
* set groups to manageGroups prop
|
|
532
|
+
* @param {Object} breakoutInfo -- breakout groups
|
|
533
|
+
* @returns {void}
|
|
534
|
+
*/
|
|
535
|
+
_setManageGroups(breakoutInfo) {
|
|
536
|
+
if (breakoutInfo?.body?.groups) {
|
|
537
|
+
this.set('manageGroups', breakoutInfo.body.groups);
|
|
538
|
+
}
|
|
539
|
+
},
|
|
540
|
+
|
|
541
|
+
/**
|
|
542
|
+
* Create new breakout sessions
|
|
543
|
+
* @param {object} params -- breakout session group
|
|
544
|
+
* @returns {Promise}
|
|
545
|
+
*/
|
|
546
|
+
async create(params) {
|
|
547
|
+
const payload = {...params};
|
|
548
|
+
const body = {
|
|
549
|
+
...(this.editLock && !!this.editLock.token ? {editlock: {token: this.editLock.token}} : {}),
|
|
550
|
+
...{groups: [payload]},
|
|
551
|
+
};
|
|
552
|
+
// @ts-ignore
|
|
553
|
+
const breakoutInfo = await this.webex
|
|
554
|
+
.request({
|
|
555
|
+
method: HTTP_VERBS.PUT,
|
|
556
|
+
uri: this.url,
|
|
557
|
+
body,
|
|
558
|
+
})
|
|
559
|
+
.catch((error) => {
|
|
560
|
+
return Promise.reject(boServiceErrorHandler(error, 'Breakouts#create'));
|
|
561
|
+
});
|
|
562
|
+
|
|
563
|
+
this._setManageGroups(breakoutInfo);
|
|
564
|
+
|
|
565
|
+
// clear edit lock info after save breakout session info
|
|
566
|
+
this._clearEditLockInfo();
|
|
567
|
+
|
|
568
|
+
return breakoutInfo;
|
|
569
|
+
},
|
|
570
|
+
|
|
571
|
+
/**
|
|
572
|
+
* Delete all breakout sessions
|
|
573
|
+
* @returns {Promise}
|
|
574
|
+
*/
|
|
575
|
+
async clearSessions() {
|
|
576
|
+
const body = {
|
|
577
|
+
...(this.editLock && !!this.editLock.token ? {editlock: {token: this.editLock.token}} : {}),
|
|
578
|
+
...{groups: [{action: BREAKOUTS.ACTION.DELETE}]},
|
|
579
|
+
};
|
|
580
|
+
// @ts-ignore
|
|
581
|
+
const breakoutInfo = await this.webex
|
|
582
|
+
.request({
|
|
583
|
+
method: HTTP_VERBS.PUT,
|
|
584
|
+
uri: this.url,
|
|
585
|
+
body,
|
|
586
|
+
})
|
|
587
|
+
.catch((error) => {
|
|
588
|
+
return Promise.reject(boServiceErrorHandler(error, 'Breakouts#clearSessions'));
|
|
589
|
+
});
|
|
590
|
+
|
|
591
|
+
this._setManageGroups(breakoutInfo);
|
|
592
|
+
|
|
593
|
+
return breakoutInfo;
|
|
594
|
+
},
|
|
595
|
+
|
|
596
|
+
/**
|
|
597
|
+
* Host or cohost starts breakout sessions
|
|
598
|
+
* @param {object} params
|
|
599
|
+
* @returns {Promise}
|
|
600
|
+
*/
|
|
601
|
+
async start(params = {}) {
|
|
602
|
+
const action = BREAKOUTS.ACTION.START;
|
|
603
|
+
const payload = {
|
|
604
|
+
id: this.breakoutGroupId,
|
|
605
|
+
action,
|
|
606
|
+
allowBackToMain: false,
|
|
607
|
+
allowToJoinLater: false,
|
|
608
|
+
...params,
|
|
609
|
+
};
|
|
610
|
+
|
|
611
|
+
const body = {
|
|
612
|
+
...(this.editLock && !!this.editLock.token
|
|
613
|
+
? {editlock: {token: this.editLock.token, refresh: true}}
|
|
614
|
+
: {}),
|
|
615
|
+
...{groups: [payload]},
|
|
616
|
+
};
|
|
617
|
+
|
|
618
|
+
const breakoutInfo = await this.request({
|
|
619
|
+
method: HTTP_VERBS.PUT,
|
|
620
|
+
uri: this.url,
|
|
621
|
+
body,
|
|
622
|
+
}).catch((error) => {
|
|
623
|
+
return Promise.reject(boServiceErrorHandler(error, 'Breakouts#start'));
|
|
624
|
+
});
|
|
625
|
+
|
|
626
|
+
this._setManageGroups(breakoutInfo);
|
|
627
|
+
|
|
628
|
+
return breakoutInfo;
|
|
629
|
+
},
|
|
630
|
+
|
|
631
|
+
/**
|
|
632
|
+
* Host or cohost ends breakout sessions
|
|
633
|
+
* @param {object} params
|
|
634
|
+
* @returns {Promise}
|
|
635
|
+
*/
|
|
636
|
+
async end(params = {}) {
|
|
637
|
+
const {delayCloseTime, breakoutGroupId: id} = this;
|
|
638
|
+
const action = BREAKOUTS.ACTION.CLOSE;
|
|
639
|
+
const payload = {
|
|
640
|
+
id,
|
|
641
|
+
action,
|
|
642
|
+
delayCloseTime,
|
|
643
|
+
...params,
|
|
644
|
+
};
|
|
645
|
+
|
|
646
|
+
const body = {
|
|
647
|
+
...(this.editLock && !!this.editLock.token
|
|
648
|
+
? {editlock: {token: this.editLock.token, refresh: true}}
|
|
649
|
+
: {}),
|
|
650
|
+
...{groups: [payload]},
|
|
651
|
+
};
|
|
652
|
+
|
|
653
|
+
const breakoutInfo = await this.request({
|
|
654
|
+
method: HTTP_VERBS.PUT,
|
|
655
|
+
uri: this.url,
|
|
656
|
+
body,
|
|
657
|
+
}).catch((error) => {
|
|
658
|
+
return Promise.reject(boServiceErrorHandler(error, 'Breakouts#end'));
|
|
659
|
+
});
|
|
660
|
+
|
|
661
|
+
this._setManageGroups(breakoutInfo);
|
|
662
|
+
|
|
663
|
+
return breakoutInfo;
|
|
664
|
+
},
|
|
665
|
+
|
|
666
|
+
/**
|
|
667
|
+
* Host or cohost update breakout sessions
|
|
668
|
+
* @param {Object} params
|
|
669
|
+
* @param {String} params.id
|
|
670
|
+
* @param {Boolean} unlockEdit
|
|
671
|
+
* @returns {Promise}
|
|
672
|
+
*/
|
|
673
|
+
async update(params: {id: string}, unlockEdit?: boolean) {
|
|
674
|
+
if (!params.id) {
|
|
675
|
+
return Promise.reject(new Error('Missing breakout group id'));
|
|
676
|
+
}
|
|
677
|
+
const payload = {...params};
|
|
678
|
+
|
|
679
|
+
const body = {
|
|
680
|
+
...(this.editLock?.token
|
|
681
|
+
? {editlock: {token: this.editLock.token, refresh: !unlockEdit}}
|
|
682
|
+
: {}),
|
|
683
|
+
...{groups: [payload]},
|
|
684
|
+
};
|
|
685
|
+
|
|
686
|
+
const breakoutInfo = await this.request({
|
|
687
|
+
method: HTTP_VERBS.PUT,
|
|
688
|
+
uri: this.url,
|
|
689
|
+
body,
|
|
690
|
+
}).catch((error) => {
|
|
691
|
+
return Promise.reject(boServiceErrorHandler(error, 'Breakouts#update'));
|
|
692
|
+
});
|
|
693
|
+
|
|
694
|
+
if (unlockEdit) {
|
|
695
|
+
this._clearEditLockInfo();
|
|
696
|
+
}
|
|
697
|
+
|
|
698
|
+
this._setManageGroups(breakoutInfo);
|
|
699
|
+
|
|
700
|
+
return breakoutInfo;
|
|
701
|
+
},
|
|
702
|
+
|
|
703
|
+
/**
|
|
704
|
+
* get existed breakout sessions
|
|
705
|
+
* @param {boolean} editlock -- lock operations of the breakout sessions
|
|
706
|
+
* @returns {Promise}
|
|
707
|
+
*/
|
|
708
|
+
async getBreakout(editlock) {
|
|
709
|
+
const breakout = await this.request({
|
|
710
|
+
method: HTTP_VERBS.GET,
|
|
711
|
+
uri: this.url + (editlock ? `?editlock=${editlock}` : ''),
|
|
712
|
+
});
|
|
713
|
+
|
|
714
|
+
this._setManageGroups(breakout);
|
|
715
|
+
if (editlock && breakout.body?.editlock?.token) {
|
|
716
|
+
this.set('editLock', breakout.body.editlock);
|
|
717
|
+
this.keepEditLockAlive();
|
|
718
|
+
}
|
|
719
|
+
|
|
720
|
+
return breakout;
|
|
721
|
+
},
|
|
722
|
+
|
|
723
|
+
/**
|
|
724
|
+
* enable and edit lock breakout
|
|
725
|
+
* @returns {void}
|
|
726
|
+
*/
|
|
727
|
+
async enableAndLockBreakout() {
|
|
728
|
+
if (this.enableBreakoutSession) {
|
|
729
|
+
this.lockBreakout();
|
|
730
|
+
} else {
|
|
731
|
+
const info = await this.enableBreakouts();
|
|
732
|
+
|
|
733
|
+
if (info.body) {
|
|
734
|
+
this.lockBreakout();
|
|
735
|
+
}
|
|
736
|
+
}
|
|
737
|
+
},
|
|
738
|
+
|
|
739
|
+
/**
|
|
740
|
+
* breakout edit locked by yourself or not
|
|
741
|
+
* @returns {boolean}
|
|
742
|
+
*/
|
|
743
|
+
hasBreakoutLocked() {
|
|
744
|
+
return (
|
|
745
|
+
this.editLock &&
|
|
746
|
+
this.editLock.token &&
|
|
747
|
+
this.editLock.state === BREAKOUTS.EDIT_LOCK_STATUS.LOCKED
|
|
748
|
+
);
|
|
749
|
+
},
|
|
750
|
+
|
|
751
|
+
/**
|
|
752
|
+
* send breakout edit lock
|
|
753
|
+
* @returns {void}
|
|
754
|
+
*/
|
|
755
|
+
async lockBreakout() {
|
|
756
|
+
if (this.editLock && !!this.editLock.token) {
|
|
757
|
+
if (this.editLock.state === BREAKOUTS.EDIT_LOCK_STATUS.LOCKED) {
|
|
758
|
+
throw new Error('Breakout already locked');
|
|
759
|
+
} else {
|
|
760
|
+
this.keepEditLockAlive();
|
|
761
|
+
}
|
|
762
|
+
} else {
|
|
763
|
+
const breakout = await this.getBreakout(true);
|
|
764
|
+
if (breakout.body?.editlock) {
|
|
765
|
+
this.keepEditLockAlive();
|
|
766
|
+
}
|
|
767
|
+
}
|
|
768
|
+
},
|
|
769
|
+
|
|
770
|
+
/**
|
|
771
|
+
* keep edit lock alive
|
|
772
|
+
* @returns {void}
|
|
773
|
+
*/
|
|
774
|
+
keepEditLockAlive() {
|
|
775
|
+
if (this.editLock && !!this.editLock.token) {
|
|
776
|
+
const ttl = this.editLock.ttl < 30 ? BREAKOUTS.DEFAULT_TTL : this.editLock.ttl;
|
|
777
|
+
if (this.intervalID) {
|
|
778
|
+
window.clearInterval(this.intervalID);
|
|
779
|
+
}
|
|
780
|
+
|
|
781
|
+
this.intervalID = window.setInterval(() => {
|
|
782
|
+
this.request({
|
|
783
|
+
method: HTTP_VERBS.PUT,
|
|
784
|
+
uri: `${this.url}/editlock/${this.editLock.token}`,
|
|
785
|
+
}).catch((error) => {
|
|
786
|
+
this._clearEditLockInfo();
|
|
787
|
+
|
|
788
|
+
return Promise.reject(boServiceErrorHandler(error, 'Breakouts#keepEditLockAlive'));
|
|
789
|
+
});
|
|
790
|
+
}, (ttl / 2) * 1000);
|
|
791
|
+
}
|
|
792
|
+
},
|
|
793
|
+
|
|
794
|
+
/**
|
|
795
|
+
* unlock edit breakout
|
|
796
|
+
* @returns {void}
|
|
797
|
+
*/
|
|
798
|
+
unLockEditBreakout() {
|
|
799
|
+
if (this.editLock && !!this.editLock.token) {
|
|
800
|
+
this.request({
|
|
801
|
+
method: HTTP_VERBS.DELETE,
|
|
802
|
+
uri: `${this.url}/editlock/${this.editLock.token}`,
|
|
803
|
+
})
|
|
804
|
+
.then(() => {
|
|
805
|
+
this._clearEditLockInfo();
|
|
806
|
+
})
|
|
807
|
+
.catch((error) => {
|
|
808
|
+
return Promise.reject(boServiceErrorHandler(error, 'Breakouts#unLockEditBreakout'));
|
|
809
|
+
});
|
|
810
|
+
}
|
|
811
|
+
},
|
|
812
|
+
|
|
813
|
+
/**
|
|
814
|
+
* clear interval and edit lock info
|
|
815
|
+
* @private
|
|
816
|
+
* @returns {void}
|
|
817
|
+
*/
|
|
818
|
+
_clearEditLockInfo() {
|
|
819
|
+
if (this.intervalID) {
|
|
820
|
+
clearInterval(this.intervalID);
|
|
821
|
+
}
|
|
822
|
+
this.set('editLock', {});
|
|
823
|
+
},
|
|
824
|
+
|
|
825
|
+
/**
|
|
826
|
+
* assign participants to breakout session
|
|
827
|
+
* @param {Array} sessions
|
|
828
|
+
* @returns {void}
|
|
829
|
+
*/
|
|
830
|
+
assign(sessions: any[]) {
|
|
831
|
+
const internalSessions = sessions.map((item) => {
|
|
832
|
+
return {
|
|
833
|
+
id: item.id,
|
|
834
|
+
assigned: item.memberIds,
|
|
835
|
+
assignedEmails: item.emails,
|
|
836
|
+
anyoneCanJoin: !!item.anyone,
|
|
837
|
+
};
|
|
838
|
+
});
|
|
839
|
+
|
|
840
|
+
const body = {
|
|
841
|
+
...(this.editLock && !!this.editLock.token
|
|
842
|
+
? {editlock: {token: this.editLock.token, refresh: true}}
|
|
843
|
+
: {}),
|
|
844
|
+
...{
|
|
845
|
+
groups: [
|
|
846
|
+
{
|
|
847
|
+
id: this.breakoutGroupId,
|
|
848
|
+
sessions: internalSessions,
|
|
849
|
+
},
|
|
850
|
+
],
|
|
292
851
|
},
|
|
852
|
+
};
|
|
853
|
+
|
|
854
|
+
return this.request({
|
|
855
|
+
method: HTTP_VERBS.PUT,
|
|
856
|
+
uri: this.url,
|
|
857
|
+
body,
|
|
858
|
+
});
|
|
859
|
+
},
|
|
860
|
+
|
|
861
|
+
/**
|
|
862
|
+
* query preAssignments
|
|
863
|
+
* @returns {void}
|
|
864
|
+
*/
|
|
865
|
+
queryPreAssignments() {
|
|
866
|
+
this.webex
|
|
867
|
+
.request({uri: `${this.url}/preassignments`, qs: {locusUrl: btoa(this.locusUrl)}})
|
|
868
|
+
.then((result) => {
|
|
869
|
+
if (result.body?.groups) {
|
|
870
|
+
this.set('preAssignments', result.body.groups);
|
|
871
|
+
this.trigger(BREAKOUTS.EVENTS.PRE_ASSIGNMENTS_UPDATE);
|
|
872
|
+
}
|
|
873
|
+
})
|
|
874
|
+
.catch((error) => {
|
|
875
|
+
LoggerProxy.logger.error('Meeting:breakouts#queryPreAssignments failed', error);
|
|
876
|
+
});
|
|
877
|
+
},
|
|
878
|
+
/**
|
|
879
|
+
* assign participants dynamically after breakout sessions started,
|
|
880
|
+
* but currently it only used for admitting participants from lobby into breakout directly
|
|
881
|
+
* @param {Array} sessions
|
|
882
|
+
* @returns {void}
|
|
883
|
+
*/
|
|
884
|
+
dynamicAssign(sessions: any[]) {
|
|
885
|
+
const updatedSessions = sessions.map((item) => {
|
|
886
|
+
return {
|
|
887
|
+
id: item.id,
|
|
888
|
+
participants: item.participants,
|
|
889
|
+
targetState: item.targetState,
|
|
890
|
+
};
|
|
891
|
+
});
|
|
892
|
+
|
|
893
|
+
const body = {
|
|
894
|
+
groups: [
|
|
895
|
+
{
|
|
896
|
+
id: this.breakoutGroupId,
|
|
897
|
+
sessions: updatedSessions,
|
|
898
|
+
},
|
|
899
|
+
],
|
|
900
|
+
editlock: null,
|
|
901
|
+
};
|
|
902
|
+
|
|
903
|
+
if (this.editLock && this.editLock.token) {
|
|
904
|
+
body.editlock = this.editLock;
|
|
905
|
+
}
|
|
906
|
+
|
|
907
|
+
return this.request({
|
|
908
|
+
method: HTTP_VERBS.PUT,
|
|
909
|
+
uri: `${this.url}/dynamicAssign`,
|
|
910
|
+
body,
|
|
293
911
|
});
|
|
294
912
|
},
|
|
913
|
+
/**
|
|
914
|
+
* trigger ASK_RETURN_TO_MAIN event when main session requested
|
|
915
|
+
* @param {Object} breakout
|
|
916
|
+
* @returns {void}
|
|
917
|
+
*/
|
|
918
|
+
triggerReturnToMainEvent(breakout) {
|
|
919
|
+
if (breakout.isMain && breakout.requested) {
|
|
920
|
+
this.trigger(BREAKOUTS.EVENTS.ASK_RETURN_TO_MAIN);
|
|
921
|
+
}
|
|
922
|
+
},
|
|
295
923
|
});
|
|
296
924
|
|
|
297
925
|
export default Breakouts;
|