@webex/plugin-meetings 3.0.0-beta.39 → 3.0.0-beta.391
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 +58 -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 +94 -15
- package/dist/breakouts/breakout.js.map +1 -1
- package/dist/breakouts/events.js +45 -0
- package/dist/breakouts/events.js.map +1 -0
- package/dist/breakouts/index.js +671 -81
- package/dist/breakouts/index.js.map +1 -1
- package/dist/breakouts/utils.js +45 -1
- package/dist/breakouts/utils.js.map +1 -1
- 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/reclaim-host-role-errors.js +158 -0
- package/dist/common/errors/reclaim-host-role-errors.js.map +1 -0
- package/dist/common/errors/webex-errors.js +48 -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/logs/request.js +5 -1
- package/dist/common/logs/request.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 +242 -33
- 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 +110 -2
- package/dist/index.js.map +1 -1
- package/dist/interceptors/index.js +15 -0
- package/dist/interceptors/index.js.map +1 -0
- package/dist/interceptors/locusRetry.js +93 -0
- package/dist/interceptors/locusRetry.js.map +1 -0
- package/dist/interpretation/collection.js +23 -0
- package/dist/interpretation/collection.js.map +1 -0
- package/dist/interpretation/index.js +380 -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 +386 -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 +71 -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 +65 -102
- package/dist/media/index.js.map +1 -1
- package/dist/media/properties.js +73 -124
- package/dist/media/properties.js.map +1 -1
- package/dist/mediaQualityMetrics/config.js +135 -330
- package/dist/mediaQualityMetrics/config.js.map +1 -1
- package/dist/meeting/in-meeting-actions.js +86 -2
- package/dist/meeting/in-meeting-actions.js.map +1 -1
- package/dist/meeting/index.js +4075 -2827
- 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 +224 -136
- package/dist/meeting/muteState.js.map +1 -1
- package/dist/meeting/request.js +177 -152
- package/dist/meeting/request.js.map +1 -1
- package/dist/meeting/util.js +672 -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 +39 -0
- package/dist/meetings/collection.js.map +1 -1
- package/dist/meetings/index.js +484 -119
- 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 +73 -7
- package/dist/meetings/util.js.map +1 -1
- package/dist/member/index.js +58 -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 +132 -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 +102 -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 +326 -232
- package/dist/members/util.js.map +1 -1
- package/dist/metrics/constants.js +18 -1
- package/dist/metrics/constants.js.map +1 -1
- package/dist/metrics/index.js +1 -446
- package/dist/metrics/index.js.map +1 -1
- package/dist/multistream/mediaRequestManager.js +223 -32
- package/dist/multistream/mediaRequestManager.js.map +1 -1
- package/dist/multistream/receiveSlot.js +10 -0
- 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 +3 -1
- package/dist/multistream/remoteMedia.js.map +1 -1
- package/dist/multistream/remoteMediaGroup.js +76 -5
- package/dist/multistream/remoteMediaGroup.js.map +1 -1
- package/dist/multistream/remoteMediaManager.js +366 -104
- package/dist/multistream/remoteMediaManager.js.map +1 -1
- package/dist/multistream/sendSlotManager.js +255 -0
- package/dist/multistream/sendSlotManager.js.map +1 -0
- package/dist/reachability/clusterReachability.js +356 -0
- package/dist/reachability/clusterReachability.js.map +1 -0
- package/dist/reachability/index.js +263 -390
- package/dist/reachability/index.js.map +1 -1
- package/dist/reachability/request.js +6 -4
- package/dist/reachability/request.js.map +1 -1
- package/dist/reachability/util.js +29 -0
- package/dist/reachability/util.js.map +1 -0
- package/dist/reconnection-manager/index.js +266 -202
- 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 +51 -28
- package/dist/roap/index.js.map +1 -1
- package/dist/roap/request.js +48 -64
- package/dist/roap/request.js.map +1 -1
- package/dist/roap/turnDiscovery.js +220 -70
- 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 +179 -0
- package/dist/rtcMetrics/index.js.map +1 -0
- package/dist/statsAnalyzer/index.js +357 -295
- package/dist/statsAnalyzer/index.js.map +1 -1
- package/dist/statsAnalyzer/mqaUtil.js +296 -156
- 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/events.d.ts +8 -0
- package/dist/types/breakouts/utils.d.ts +14 -0
- package/dist/types/common/errors/no-meeting-info.d.ts +14 -0
- package/dist/types/common/errors/reclaim-host-role-errors.d.ts +60 -0
- package/dist/types/common/errors/webex-errors.d.ts +25 -1
- package/dist/types/common/logs/request.d.ts +2 -0
- package/dist/types/common/queue.d.ts +9 -7
- package/dist/types/config.d.ts +2 -7
- package/dist/types/constants.d.ts +203 -31
- 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 -5
- package/dist/types/interceptors/index.d.ts +2 -0
- package/dist/types/interceptors/locusRetry.d.ts +27 -0
- 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 +66 -6
- package/dist/types/media/index.d.ts +2 -0
- package/dist/types/media/properties.d.ts +34 -49
- package/dist/types/mediaQualityMetrics/config.d.ts +99 -223
- package/dist/types/meeting/in-meeting-actions.d.ts +86 -2
- package/dist/types/meeting/index.d.ts +567 -496
- package/dist/types/meeting/locusMediaRequest.d.ts +74 -0
- package/dist/types/meeting/muteState.d.ts +93 -25
- package/dist/types/meeting/request.d.ts +64 -43
- package/dist/types/meeting/util.d.ts +117 -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 +17 -0
- package/dist/types/meetings/index.d.ts +113 -21
- package/dist/types/meetings/meetings.types.d.ts +4 -0
- package/dist/types/member/index.d.ts +14 -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 +25 -0
- package/dist/types/members/util.d.ts +214 -1
- package/dist/types/metrics/constants.d.ts +17 -0
- package/dist/types/metrics/index.d.ts +4 -111
- package/dist/types/multistream/mediaRequestManager.d.ts +72 -3
- package/dist/types/multistream/receiveSlot.d.ts +7 -3
- package/dist/types/multistream/receiveSlotManager.d.ts +14 -4
- package/dist/types/multistream/remoteMedia.d.ts +3 -31
- package/dist/types/multistream/remoteMediaGroup.d.ts +2 -9
- package/dist/types/multistream/remoteMediaManager.d.ts +62 -2
- package/dist/types/multistream/sendSlotManager.d.ts +70 -0
- package/dist/types/reachability/clusterReachability.d.ts +109 -0
- package/dist/types/reachability/index.d.ts +60 -95
- package/dist/types/reachability/request.d.ts +3 -1
- package/dist/types/reachability/util.d.ts +8 -0
- package/dist/types/reconnection-manager/index.d.ts +19 -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/index.d.ts +2 -1
- package/dist/types/roap/request.d.ts +9 -8
- package/dist/types/roap/turnDiscovery.d.ts +39 -5
- package/dist/types/rtcMetrics/constants.d.ts +4 -0
- package/dist/types/rtcMetrics/index.d.ts +61 -0
- package/dist/types/statsAnalyzer/index.d.ts +34 -12
- package/dist/types/statsAnalyzer/mqaUtil.d.ts +28 -4
- package/dist/types/webinar/collection.d.ts +16 -0
- package/dist/types/webinar/index.d.ts +5 -0
- package/dist/webinar/collection.js +44 -0
- package/dist/webinar/collection.js.map +1 -0
- package/dist/webinar/index.js +69 -0
- package/dist/webinar/index.js.map +1 -0
- package/package.json +22 -19
- 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 +35 -11
- package/src/breakouts/breakout.ts +67 -9
- package/src/breakouts/events.ts +56 -0
- package/src/breakouts/index.ts +558 -59
- package/src/breakouts/utils.ts +42 -0
- package/src/common/errors/no-meeting-info.ts +24 -0
- package/src/common/errors/reclaim-host-role-errors.ts +134 -0
- package/src/common/errors/webex-errors.ts +44 -2
- package/src/common/logs/logger-proxy.ts +1 -1
- package/src/common/logs/request.ts +5 -1
- package/src/common/queue.ts +22 -8
- package/src/config.ts +4 -9
- package/src/constants.ts +229 -21
- 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 +44 -0
- package/src/interceptors/index.ts +3 -0
- package/src/interceptors/locusRetry.ts +67 -0
- package/src/interpretation/README.md +60 -0
- package/src/interpretation/collection.ts +19 -0
- package/src/interpretation/index.ts +349 -0
- package/src/interpretation/siLanguage.ts +18 -0
- package/src/locus-info/controlsUtils.ts +108 -0
- package/src/locus-info/index.ts +417 -59
- package/src/locus-info/infoUtils.ts +10 -2
- package/src/locus-info/mediaSharesUtils.ts +80 -0
- package/src/locus-info/parser.ts +258 -47
- package/src/locus-info/selfUtils.ts +81 -5
- package/src/media/index.ts +100 -108
- package/src/media/properties.ts +88 -117
- package/src/mediaQualityMetrics/config.ts +103 -238
- package/src/meeting/in-meeting-actions.ts +171 -3
- package/src/meeting/index.ts +3411 -2435
- package/src/meeting/locusMediaRequest.ts +313 -0
- package/src/meeting/muteState.ts +223 -136
- package/src/meeting/request.ts +155 -120
- package/src/meeting/util.ts +685 -395
- 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 +33 -0
- package/src/meetings/index.ts +507 -127
- package/src/meetings/meetings.types.ts +12 -0
- package/src/meetings/request.ts +2 -0
- package/src/meetings/util.ts +81 -12
- package/src/member/index.ts +58 -0
- package/src/member/types.ts +38 -0
- package/src/member/util.ts +141 -25
- package/src/members/collection.ts +8 -0
- package/src/members/index.ts +134 -8
- package/src/members/request.ts +97 -17
- package/src/members/types.ts +29 -0
- package/src/members/util.ts +333 -240
- package/src/metrics/constants.ts +17 -0
- package/src/metrics/index.ts +1 -469
- package/src/multistream/mediaRequestManager.ts +271 -56
- package/src/multistream/receiveSlot.ts +11 -4
- package/src/multistream/receiveSlotManager.ts +34 -24
- package/src/multistream/remoteMedia.ts +5 -3
- package/src/multistream/remoteMediaGroup.ts +78 -0
- package/src/multistream/remoteMediaManager.ts +248 -44
- package/src/multistream/sendSlotManager.ts +199 -0
- package/src/reachability/clusterReachability.ts +320 -0
- package/src/reachability/index.ts +229 -346
- package/src/reachability/request.ts +8 -4
- package/src/reachability/util.ts +24 -0
- package/src/reconnection-manager/index.ts +128 -97
- package/src/recording-controller/index.ts +20 -3
- package/src/recording-controller/util.ts +26 -9
- package/src/roap/index.ts +52 -23
- package/src/roap/request.ts +48 -67
- package/src/roap/turnDiscovery.ts +147 -49
- package/src/rtcMetrics/constants.ts +3 -0
- package/src/rtcMetrics/index.ts +166 -0
- package/src/statsAnalyzer/index.ts +457 -416
- package/src/statsAnalyzer/mqaUtil.ts +317 -170
- package/src/webinar/collection.ts +31 -0
- package/src/webinar/index.ts +62 -0
- 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 +118 -28
- package/test/unit/spec/breakouts/events.ts +89 -0
- package/test/unit/spec/breakouts/index.ts +1349 -114
- package/test/unit/spec/breakouts/utils.js +52 -1
- 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/interceptors/locusRetry.ts +131 -0
- package/test/unit/spec/interpretation/collection.ts +15 -0
- package/test/unit/spec/interpretation/index.ts +625 -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 +1363 -37
- 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 +41 -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 +173 -81
- package/test/unit/spec/media/properties.ts +2 -2
- package/test/unit/spec/meeting/in-meeting-actions.ts +85 -3
- package/test/unit/spec/meeting/index.js +6821 -2172
- package/test/unit/spec/meeting/locusMediaRequest.ts +442 -0
- package/test/unit/spec/meeting/muteState.js +402 -212
- package/test/unit/spec/meeting/request.js +473 -54
- package/test/unit/spec/meeting/utils.js +773 -67
- package/test/unit/spec/meeting-info/index.js +300 -0
- package/test/unit/spec/meeting-info/meetinginfov2.js +526 -5
- package/test/unit/spec/meeting-info/utilv2.js +21 -0
- package/test/unit/spec/meetings/collection.js +26 -0
- package/test/unit/spec/meetings/index.js +1415 -213
- package/test/unit/spec/meetings/utils.js +229 -2
- package/test/unit/spec/member/index.js +61 -6
- package/test/unit/spec/member/util.js +510 -34
- package/test/unit/spec/members/index.js +432 -1
- package/test/unit/spec/members/request.js +206 -27
- package/test/unit/spec/members/utils.js +210 -0
- package/test/unit/spec/metrics/index.js +1 -50
- package/test/unit/spec/multistream/mediaRequestManager.ts +781 -114
- package/test/unit/spec/multistream/receiveSlot.ts +9 -1
- package/test/unit/spec/multistream/receiveSlotManager.ts +32 -30
- package/test/unit/spec/multistream/remoteMedia.ts +2 -0
- package/test/unit/spec/multistream/remoteMediaGroup.ts +345 -0
- package/test/unit/spec/multistream/remoteMediaManager.ts +525 -0
- package/test/unit/spec/multistream/sendSlotManager.ts +274 -0
- package/test/unit/spec/reachability/clusterReachability.ts +279 -0
- package/test/unit/spec/reachability/index.ts +551 -14
- package/test/unit/spec/reachability/request.js +3 -1
- package/test/unit/spec/reachability/util.ts +40 -0
- package/test/unit/spec/reconnection-manager/index.js +171 -11
- 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 +180 -83
- package/test/unit/spec/roap/request.ts +100 -62
- package/test/unit/spec/roap/turnDiscovery.ts +388 -96
- package/test/unit/spec/rtcMetrics/index.ts +122 -0
- package/test/unit/spec/stats-analyzer/index.js +1252 -12
- package/test/unit/spec/webinar/collection.ts +13 -0
- package/test/unit/spec/webinar/index.ts +60 -0
- package/test/utils/integrationTestUtils.js +46 -0
- package/test/utils/testUtils.js +0 -57
- package/test/utils/webex-test-users.js +12 -4
- package/dist/metrics/config.js +0 -289
- package/dist/metrics/config.js.map +0 -1
- package/dist/types/metrics/config.d.ts +0 -169
- package/src/index.js +0 -18
- package/src/metrics/config.ts +0 -485
package/src/breakouts/index.ts
CHANGED
|
@@ -5,12 +5,13 @@ 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, HTTP_VERBS,
|
|
8
|
+
import {BREAKOUTS, MEETINGS, HTTP_VERBS, _ID_} from '../constants';
|
|
9
9
|
|
|
10
10
|
import Breakout from './breakout';
|
|
11
11
|
import BreakoutCollection from './collection';
|
|
12
12
|
import BreakoutRequest from './request';
|
|
13
|
-
import
|
|
13
|
+
import breakoutEvent from './events';
|
|
14
|
+
import {boServiceErrorHandler, isSessionTypeChangedFromSessionToMain} from './utils';
|
|
14
15
|
|
|
15
16
|
/**
|
|
16
17
|
* @class Breakouts
|
|
@@ -26,6 +27,7 @@ const Breakouts = WebexPlugin.extend({
|
|
|
26
27
|
allowBackToMain: 'boolean', // only present when in a breakout session
|
|
27
28
|
delayCloseTime: 'number', // appears once breakouts start
|
|
28
29
|
enableBreakoutSession: 'boolean', // appears from the moment you enable breakouts
|
|
30
|
+
hasBreakoutPreAssignments: 'boolean', // appears from the moment you enable breakouts
|
|
29
31
|
groupId: 'string', // appears from the moment you enable breakouts
|
|
30
32
|
name: 'string', // only present when in a breakout session
|
|
31
33
|
sessionId: 'string', // appears from the moment you enable breakouts
|
|
@@ -34,16 +36,23 @@ const Breakouts = WebexPlugin.extend({
|
|
|
34
36
|
status: 'string', // only present when in a breakout session
|
|
35
37
|
url: 'string', // appears from the moment you enable breakouts
|
|
36
38
|
locusUrl: 'string', // the current locus url
|
|
37
|
-
breakoutServiceUrl: 'string', // the current breakout
|
|
39
|
+
breakoutServiceUrl: 'string', // the current breakout resource url
|
|
40
|
+
mainLocusUrl: 'string', // the locus url of the main session
|
|
38
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
|
|
39
48
|
},
|
|
40
|
-
|
|
41
49
|
children: {
|
|
42
50
|
currentBreakoutSession: Breakout,
|
|
43
51
|
},
|
|
44
52
|
|
|
45
53
|
derived: {
|
|
46
54
|
isInMainSession: {
|
|
55
|
+
cache: false,
|
|
47
56
|
deps: ['sessionType'],
|
|
48
57
|
/**
|
|
49
58
|
* Returns true if the user is in the main session
|
|
@@ -53,6 +62,63 @@ const Breakouts = WebexPlugin.extend({
|
|
|
53
62
|
return this.sessionType === BREAKOUTS.SESSION_TYPES.MAIN;
|
|
54
63
|
},
|
|
55
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
|
+
},
|
|
56
122
|
},
|
|
57
123
|
|
|
58
124
|
/**
|
|
@@ -60,20 +126,31 @@ const Breakouts = WebexPlugin.extend({
|
|
|
60
126
|
* @returns {void}
|
|
61
127
|
*/
|
|
62
128
|
initialize() {
|
|
63
|
-
this.listenTo(this, 'change:
|
|
64
|
-
if (this.
|
|
129
|
+
this.listenTo(this, 'change:breakoutStatus', () => {
|
|
130
|
+
if (this.breakoutStatus === BREAKOUTS.STATUS.CLOSING) {
|
|
65
131
|
this.trigger(BREAKOUTS.EVENTS.BREAKOUTS_CLOSING);
|
|
66
132
|
}
|
|
67
133
|
});
|
|
134
|
+
this.listenTo(this, 'change:shouldQueryPreAssignments', () => {
|
|
135
|
+
if (this.shouldQueryPreAssignments && !this.preAssignments) {
|
|
136
|
+
this.queryPreAssignments();
|
|
137
|
+
}
|
|
138
|
+
});
|
|
68
139
|
this.debouncedQueryRosters = debounce(this.queryRosters, 10, {
|
|
69
140
|
leading: true,
|
|
70
141
|
trailing: false,
|
|
71
142
|
});
|
|
72
|
-
this.listenTo(this.breakouts, 'add', () => {
|
|
143
|
+
this.listenTo(this.breakouts, 'add', (breakout) => {
|
|
73
144
|
this.debouncedQueryRosters();
|
|
145
|
+
this.triggerReturnToMainEvent(breakout);
|
|
146
|
+
});
|
|
147
|
+
this.listenTo(this.breakouts, 'change:requestedLastModifiedTime', (breakout) => {
|
|
148
|
+
this.triggerReturnToMainEvent(breakout);
|
|
74
149
|
});
|
|
150
|
+
this.listenToCurrentSessionTypeChange();
|
|
75
151
|
this.listenToBroadcastMessages();
|
|
76
152
|
this.listenToBreakoutRosters();
|
|
153
|
+
this.listenToBreakoutHelp();
|
|
77
154
|
// @ts-ignore
|
|
78
155
|
this.breakoutRequest = new BreakoutRequest({webex: this.webex});
|
|
79
156
|
},
|
|
@@ -93,10 +170,23 @@ const Breakouts = WebexPlugin.extend({
|
|
|
93
170
|
*/
|
|
94
171
|
locusUrlUpdate(locusUrl) {
|
|
95
172
|
this.set('locusUrl', locusUrl);
|
|
173
|
+
const {isInMainSession, mainLocusUrl} = this;
|
|
174
|
+
if (isInMainSession || !mainLocusUrl) {
|
|
175
|
+
this.set('mainLocusUrl', locusUrl);
|
|
176
|
+
}
|
|
177
|
+
},
|
|
178
|
+
|
|
179
|
+
/**
|
|
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);
|
|
96
186
|
},
|
|
97
187
|
|
|
98
188
|
/**
|
|
99
|
-
* Update the current breakout
|
|
189
|
+
* Update the current breakout resource url
|
|
100
190
|
* @param {string} breakoutServiceUrl
|
|
101
191
|
* @returns {void}
|
|
102
192
|
*/
|
|
@@ -117,7 +207,7 @@ const Breakouts = WebexPlugin.extend({
|
|
|
117
207
|
body: {rosters},
|
|
118
208
|
} = result;
|
|
119
209
|
|
|
120
|
-
rosters
|
|
210
|
+
rosters?.forEach(({locus}) => {
|
|
121
211
|
this.handleRosterUpdate(locus);
|
|
122
212
|
});
|
|
123
213
|
|
|
@@ -144,6 +234,21 @@ const Breakouts = WebexPlugin.extend({
|
|
|
144
234
|
|
|
145
235
|
session.parseRoster(locus);
|
|
146
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
|
+
},
|
|
147
252
|
|
|
148
253
|
/**
|
|
149
254
|
* Sets up listener for broadcast messages sent to the breakout session
|
|
@@ -178,6 +283,36 @@ const Breakouts = WebexPlugin.extend({
|
|
|
178
283
|
});
|
|
179
284
|
},
|
|
180
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
|
+
},
|
|
181
316
|
/**
|
|
182
317
|
* Updates the information about the current breakout
|
|
183
318
|
* @param {Object} params
|
|
@@ -185,6 +320,10 @@ const Breakouts = WebexPlugin.extend({
|
|
|
185
320
|
*/
|
|
186
321
|
updateBreakout(params) {
|
|
187
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);
|
|
188
327
|
|
|
189
328
|
this.set('currentBreakoutSession', {
|
|
190
329
|
sessionId: params.sessionId,
|
|
@@ -195,12 +334,31 @@ const Breakouts = WebexPlugin.extend({
|
|
|
195
334
|
url: params.url,
|
|
196
335
|
[BREAKOUTS.SESSION_STATES.ACTIVE]: false,
|
|
197
336
|
[BREAKOUTS.SESSION_STATES.ALLOWED]: false,
|
|
198
|
-
[BREAKOUTS.SESSION_STATES.
|
|
337
|
+
[BREAKOUTS.SESSION_STATES.ASSIGNED]: false,
|
|
199
338
|
[BREAKOUTS.SESSION_STATES.ASSIGNED_CURRENT]: false,
|
|
200
339
|
[BREAKOUTS.SESSION_STATES.REQUESTED]: false,
|
|
201
340
|
});
|
|
202
341
|
|
|
203
|
-
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
|
+
}
|
|
204
362
|
},
|
|
205
363
|
|
|
206
364
|
/**
|
|
@@ -210,7 +368,12 @@ const Breakouts = WebexPlugin.extend({
|
|
|
210
368
|
*/
|
|
211
369
|
updateBreakoutSessions(payload) {
|
|
212
370
|
const breakouts = {};
|
|
213
|
-
|
|
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
|
+
}
|
|
214
377
|
if (payload.breakoutSessions) {
|
|
215
378
|
forEach(BREAKOUTS.SESSION_STATES, (state) => {
|
|
216
379
|
forEach(payload.breakoutSessions[state], (breakout) => {
|
|
@@ -226,10 +389,13 @@ const Breakouts = WebexPlugin.extend({
|
|
|
226
389
|
}
|
|
227
390
|
|
|
228
391
|
breakouts[sessionId][state] = true;
|
|
392
|
+
|
|
393
|
+
if (state === BREAKOUTS.SESSION_STATES.REQUESTED) {
|
|
394
|
+
breakouts[sessionId].requestedLastModifiedTime = breakout.modifiedAt;
|
|
395
|
+
}
|
|
229
396
|
});
|
|
230
397
|
});
|
|
231
398
|
}
|
|
232
|
-
|
|
233
399
|
forEach(breakouts, (breakout: typeof Breakout) => {
|
|
234
400
|
// eslint-disable-next-line no-param-reassign
|
|
235
401
|
breakout.url = this.url;
|
|
@@ -237,6 +403,15 @@ const Breakouts = WebexPlugin.extend({
|
|
|
237
403
|
|
|
238
404
|
this.breakouts.set(Object.values(breakouts));
|
|
239
405
|
},
|
|
406
|
+
/**
|
|
407
|
+
* clear breakouts collection
|
|
408
|
+
* @returns {void}
|
|
409
|
+
*/
|
|
410
|
+
clearBreakouts() {
|
|
411
|
+
if (this.breakouts.length > 0) {
|
|
412
|
+
this.breakouts.reset();
|
|
413
|
+
}
|
|
414
|
+
},
|
|
240
415
|
/**
|
|
241
416
|
* get main session
|
|
242
417
|
* @returns {Breakout}
|
|
@@ -277,9 +452,7 @@ const Breakouts = WebexPlugin.extend({
|
|
|
277
452
|
* @returns {Promise}
|
|
278
453
|
*/
|
|
279
454
|
broadcast(message, options) {
|
|
280
|
-
const breakoutGroupId = this
|
|
281
|
-
? this.breakouts.filter((breakout) => !breakout.isMain)[0]?.groupId
|
|
282
|
-
: this.groupId;
|
|
455
|
+
const {breakoutGroupId} = this;
|
|
283
456
|
if (!breakoutGroupId) {
|
|
284
457
|
throw new Error('Cannot broadcast, no breakout session found');
|
|
285
458
|
}
|
|
@@ -318,16 +491,16 @@ const Breakouts = WebexPlugin.extend({
|
|
|
318
491
|
},
|
|
319
492
|
|
|
320
493
|
/**
|
|
321
|
-
* Make the meeting
|
|
494
|
+
* Make the meeting enable or disable breakout session
|
|
322
495
|
* @param {boolean} enable
|
|
323
496
|
* @returns {Promise}
|
|
324
497
|
*/
|
|
325
498
|
async toggleBreakout(enable) {
|
|
326
499
|
if (this.enableBreakoutSession === undefined) {
|
|
327
500
|
const info = await this.enableBreakouts();
|
|
501
|
+
// first time enable, set the initial data
|
|
502
|
+
this.updateBreakout(info?.body);
|
|
328
503
|
if (!enable) {
|
|
329
|
-
// if enable is false, updateBreakout set the param then set enableBreakoutSession as false
|
|
330
|
-
this.updateBreakout(info.body);
|
|
331
504
|
await this.doToggleBreakout(enable);
|
|
332
505
|
}
|
|
333
506
|
} else {
|
|
@@ -341,50 +514,58 @@ const Breakouts = WebexPlugin.extend({
|
|
|
341
514
|
* @returns {Promise}
|
|
342
515
|
*/
|
|
343
516
|
doToggleBreakout(enable) {
|
|
517
|
+
const body = {
|
|
518
|
+
...(this.editLock && !!this.editLock.token ? {editlock: {token: this.editLock.token}} : {}),
|
|
519
|
+
...{enableBreakoutSession: enable},
|
|
520
|
+
};
|
|
521
|
+
|
|
344
522
|
// @ts-ignore
|
|
345
523
|
return this.webex.request({
|
|
346
524
|
method: HTTP_VERBS.PUT,
|
|
347
525
|
uri: this.url,
|
|
348
|
-
body
|
|
349
|
-
enableBreakoutSession: enable,
|
|
350
|
-
},
|
|
526
|
+
body,
|
|
351
527
|
});
|
|
352
528
|
},
|
|
353
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
|
+
|
|
354
541
|
/**
|
|
355
542
|
* Create new breakout sessions
|
|
356
|
-
* @param {object}
|
|
543
|
+
* @param {object} params -- breakout session group
|
|
357
544
|
* @returns {Promise}
|
|
358
545
|
*/
|
|
359
|
-
async create(
|
|
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
|
+
};
|
|
360
552
|
// @ts-ignore
|
|
361
|
-
const
|
|
553
|
+
const breakoutInfo = await this.webex
|
|
362
554
|
.request({
|
|
363
555
|
method: HTTP_VERBS.PUT,
|
|
364
556
|
uri: this.url,
|
|
365
|
-
body
|
|
366
|
-
groups: [
|
|
367
|
-
{
|
|
368
|
-
sessions,
|
|
369
|
-
},
|
|
370
|
-
],
|
|
371
|
-
},
|
|
557
|
+
body,
|
|
372
558
|
})
|
|
373
559
|
.catch((error) => {
|
|
374
|
-
|
|
375
|
-
LoggerProxy.logger.info(`Breakouts#create --> Edit lock token mismatch`);
|
|
376
|
-
|
|
377
|
-
return Promise.reject(new BreakoutEditLockedError('Edit lock token mismatch', error));
|
|
378
|
-
}
|
|
379
|
-
|
|
380
|
-
return Promise.reject(error);
|
|
560
|
+
return Promise.reject(boServiceErrorHandler(error, 'Breakouts#create'));
|
|
381
561
|
});
|
|
382
562
|
|
|
383
|
-
|
|
384
|
-
this.set('groups', breakInfo.body.groups);
|
|
385
|
-
}
|
|
563
|
+
this._setManageGroups(breakoutInfo);
|
|
386
564
|
|
|
387
|
-
|
|
565
|
+
// clear edit lock info after save breakout session info
|
|
566
|
+
this._clearEditLockInfo();
|
|
567
|
+
|
|
568
|
+
return breakoutInfo;
|
|
388
569
|
},
|
|
389
570
|
|
|
390
571
|
/**
|
|
@@ -392,34 +573,352 @@ const Breakouts = WebexPlugin.extend({
|
|
|
392
573
|
* @returns {Promise}
|
|
393
574
|
*/
|
|
394
575
|
async clearSessions() {
|
|
576
|
+
const body = {
|
|
577
|
+
...(this.editLock && !!this.editLock.token ? {editlock: {token: this.editLock.token}} : {}),
|
|
578
|
+
...{groups: [{action: BREAKOUTS.ACTION.DELETE}]},
|
|
579
|
+
};
|
|
395
580
|
// @ts-ignore
|
|
396
|
-
const
|
|
581
|
+
const breakoutInfo = await this.webex
|
|
397
582
|
.request({
|
|
398
583
|
method: HTTP_VERBS.PUT,
|
|
399
584
|
uri: this.url,
|
|
400
|
-
body
|
|
401
|
-
groups: [
|
|
402
|
-
{
|
|
403
|
-
action: BREAKOUTS.ACTION_TYPES.DELETE,
|
|
404
|
-
},
|
|
405
|
-
],
|
|
406
|
-
},
|
|
585
|
+
body,
|
|
407
586
|
})
|
|
408
587
|
.catch((error) => {
|
|
409
|
-
|
|
410
|
-
|
|
588
|
+
return Promise.reject(boServiceErrorHandler(error, 'Breakouts#clearSessions'));
|
|
589
|
+
});
|
|
411
590
|
|
|
412
|
-
|
|
413
|
-
|
|
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
|
+
});
|
|
414
660
|
|
|
415
|
-
|
|
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
|
+
],
|
|
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);
|
|
416
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
|
+
});
|
|
417
892
|
|
|
418
|
-
|
|
419
|
-
|
|
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;
|
|
420
905
|
}
|
|
421
906
|
|
|
422
|
-
return
|
|
907
|
+
return this.request({
|
|
908
|
+
method: HTTP_VERBS.PUT,
|
|
909
|
+
uri: `${this.url}/dynamicAssign`,
|
|
910
|
+
body,
|
|
911
|
+
});
|
|
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
|
+
}
|
|
423
922
|
},
|
|
424
923
|
});
|
|
425
924
|
|