@webex/plugin-meetings 3.0.0-beta.42 → 3.0.0-beta.421
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 +625 -123
- package/dist/breakouts/index.js.map +1 -1
- package/dist/breakouts/utils.js +27 -8
- 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 +6 -10
- package/dist/config.js.map +1 -1
- package/dist/constants.js +247 -34
- 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 +116 -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 +4525 -2997
- 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 +236 -136
- package/dist/meeting/muteState.js.map +1 -1
- package/dist/meeting/request.js +189 -155
- package/dist/meeting/request.js.map +1 -1
- package/dist/meeting/util.js +676 -417
- package/dist/meeting/util.js.map +1 -1
- package/dist/meeting/voicea-meeting.js +172 -0
- package/dist/meeting/voicea-meeting.js.map +1 -0
- 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 +201 -57
- package/dist/meeting-info/meeting-info-v2.js.map +1 -1
- package/dist/meeting-info/util.js +8 -7
- package/dist/meeting-info/util.js.map +1 -1
- package/dist/meeting-info/utilv2.js +44 -40
- 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 +57 -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 +100 -5
- 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 +20 -4
- 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 +16 -12
- 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 +66 -28
- package/dist/roap/index.js.map +1 -1
- package/dist/roap/request.js +50 -66
- package/dist/roap/request.js.map +1 -1
- package/dist/roap/turnDiscovery.js +407 -79
- 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 +389 -304
- 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 +9 -2
- 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 +204 -32
- 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 +631 -505
- package/dist/types/meeting/locusMediaRequest.d.ts +74 -0
- package/dist/types/meeting/muteState.d.ts +88 -26
- package/dist/types/meeting/request.d.ts +67 -43
- package/dist/types/meeting/util.d.ts +118 -1
- package/dist/types/meeting/voicea-meeting.d.ts +16 -0
- 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 +114 -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 +71 -3
- package/dist/types/multistream/receiveSlot.d.ts +7 -3
- package/dist/types/multistream/receiveSlotManager.d.ts +7 -0
- 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 +61 -2
- package/dist/types/multistream/sendSlotManager.d.ts +69 -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 +11 -2
- package/dist/types/roap/request.d.ts +9 -8
- package/dist/types/roap/turnDiscovery.d.ts +90 -9
- 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 +27 -6
- package/src/breakouts/breakout.ts +67 -9
- package/src/breakouts/events.ts +56 -0
- package/src/breakouts/index.ts +494 -73
- package/src/breakouts/utils.ts +26 -8
- 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 +6 -13
- package/src/constants.ts +234 -22
- 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 +45 -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 +3869 -2574
- package/src/meeting/locusMediaRequest.ts +313 -0
- package/src/meeting/muteState.ts +237 -136
- package/src/meeting/request.ts +173 -122
- package/src/meeting/util.ts +690 -395
- package/src/meeting/voicea-meeting.ts +122 -0
- package/src/meeting-info/index.ts +81 -8
- package/src/meeting-info/meeting-info-v2.ts +166 -16
- package/src/meeting-info/util.ts +13 -10
- package/src/meeting-info/utilv2.ts +47 -37
- 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 +57 -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 +133 -7
- 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 +16 -4
- package/src/multistream/remoteMedia.ts +5 -3
- package/src/multistream/remoteMediaGroup.ts +78 -0
- package/src/multistream/remoteMediaManager.ts +248 -45
- package/src/multistream/sendSlotManager.ts +198 -0
- package/src/reachability/clusterReachability.ts +320 -0
- package/src/reachability/index.ts +229 -346
- package/src/reachability/request.ts +22 -14
- 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 +76 -25
- package/src/roap/request.ts +50 -69
- package/src/roap/turnDiscovery.ts +331 -67
- package/src/rtcMetrics/constants.ts +3 -0
- package/src/rtcMetrics/index.ts +166 -0
- package/src/statsAnalyzer/index.ts +496 -419
- 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 +321 -262
- 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 +119 -28
- package/test/unit/spec/breakouts/events.ts +89 -0
- package/test/unit/spec/breakouts/index.ts +1204 -118
- package/test/unit/spec/breakouts/utils.js +27 -2
- 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 +1372 -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 +203 -17
- package/test/unit/spec/media/index.ts +178 -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 +7775 -2521
- package/test/unit/spec/meeting/locusMediaRequest.ts +442 -0
- package/test/unit/spec/meeting/muteState.js +549 -207
- package/test/unit/spec/meeting/request.js +494 -54
- package/test/unit/spec/meeting/utils.js +827 -74
- package/test/unit/spec/meeting/voicea-meeting.ts +266 -0
- package/test/unit/spec/meeting-info/index.js +300 -0
- package/test/unit/spec/meeting-info/meetinginfov2.js +535 -9
- 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 +1496 -219
- 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 +2 -52
- package/test/unit/spec/multistream/mediaRequestManager.ts +782 -114
- package/test/unit/spec/multistream/receiveSlot.ts +9 -1
- package/test/unit/spec/multistream/receiveSlotManager.ts +11 -3
- package/test/unit/spec/multistream/remoteMedia.ts +2 -0
- package/test/unit/spec/multistream/remoteMediaGroup.ts +344 -0
- package/test/unit/spec/multistream/remoteMediaManager.ts +524 -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 +18 -8
- 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 +293 -218
- package/test/unit/spec/recording-controller/util.js +223 -96
- package/test/unit/spec/roap/index.ts +233 -81
- package/test/unit/spec/roap/request.ts +100 -62
- package/test/unit/spec/roap/turnDiscovery.ts +682 -108
- package/test/unit/spec/rtcMetrics/index.ts +122 -0
- package/test/unit/spec/stats-analyzer/index.js +1431 -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, 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
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,20 +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
|
+
},
|
|
56
79
|
breakoutGroupId: {
|
|
57
|
-
|
|
80
|
+
cache: false,
|
|
81
|
+
deps: ['manageGroups'],
|
|
58
82
|
/**
|
|
59
|
-
* Returns the
|
|
83
|
+
* Returns the active group id
|
|
60
84
|
* @returns {boolean}
|
|
61
85
|
*/
|
|
62
86
|
fn() {
|
|
63
|
-
if (this.
|
|
64
|
-
return this.
|
|
87
|
+
if (this.manageGroups?.length) {
|
|
88
|
+
return this.manageGroups[0].status !== BREAKOUTS.STATUS.CLOSED
|
|
89
|
+
? this.manageGroups[0].id
|
|
90
|
+
: '';
|
|
65
91
|
}
|
|
66
92
|
|
|
67
93
|
return '';
|
|
68
94
|
},
|
|
69
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
|
+
},
|
|
70
122
|
},
|
|
71
123
|
|
|
72
124
|
/**
|
|
@@ -74,20 +126,31 @@ const Breakouts = WebexPlugin.extend({
|
|
|
74
126
|
* @returns {void}
|
|
75
127
|
*/
|
|
76
128
|
initialize() {
|
|
77
|
-
this.listenTo(this, 'change:
|
|
78
|
-
if (this.
|
|
129
|
+
this.listenTo(this, 'change:breakoutStatus', () => {
|
|
130
|
+
if (this.breakoutStatus === BREAKOUTS.STATUS.CLOSING) {
|
|
79
131
|
this.trigger(BREAKOUTS.EVENTS.BREAKOUTS_CLOSING);
|
|
80
132
|
}
|
|
81
133
|
});
|
|
134
|
+
this.listenTo(this, 'change:shouldQueryPreAssignments', () => {
|
|
135
|
+
if (this.shouldQueryPreAssignments && !this.preAssignments) {
|
|
136
|
+
this.queryPreAssignments();
|
|
137
|
+
}
|
|
138
|
+
});
|
|
82
139
|
this.debouncedQueryRosters = debounce(this.queryRosters, 10, {
|
|
83
140
|
leading: true,
|
|
84
141
|
trailing: false,
|
|
85
142
|
});
|
|
86
|
-
this.listenTo(this.breakouts, 'add', () => {
|
|
143
|
+
this.listenTo(this.breakouts, 'add', (breakout) => {
|
|
87
144
|
this.debouncedQueryRosters();
|
|
145
|
+
this.triggerReturnToMainEvent(breakout);
|
|
146
|
+
});
|
|
147
|
+
this.listenTo(this.breakouts, 'change:requestedLastModifiedTime', (breakout) => {
|
|
148
|
+
this.triggerReturnToMainEvent(breakout);
|
|
88
149
|
});
|
|
150
|
+
this.listenToCurrentSessionTypeChange();
|
|
89
151
|
this.listenToBroadcastMessages();
|
|
90
152
|
this.listenToBreakoutRosters();
|
|
153
|
+
this.listenToBreakoutHelp();
|
|
91
154
|
// @ts-ignore
|
|
92
155
|
this.breakoutRequest = new BreakoutRequest({webex: this.webex});
|
|
93
156
|
},
|
|
@@ -107,10 +170,23 @@ const Breakouts = WebexPlugin.extend({
|
|
|
107
170
|
*/
|
|
108
171
|
locusUrlUpdate(locusUrl) {
|
|
109
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);
|
|
110
186
|
},
|
|
111
187
|
|
|
112
188
|
/**
|
|
113
|
-
* Update the current breakout
|
|
189
|
+
* Update the current breakout resource url
|
|
114
190
|
* @param {string} breakoutServiceUrl
|
|
115
191
|
* @returns {void}
|
|
116
192
|
*/
|
|
@@ -131,7 +207,7 @@ const Breakouts = WebexPlugin.extend({
|
|
|
131
207
|
body: {rosters},
|
|
132
208
|
} = result;
|
|
133
209
|
|
|
134
|
-
rosters
|
|
210
|
+
rosters?.forEach(({locus}) => {
|
|
135
211
|
this.handleRosterUpdate(locus);
|
|
136
212
|
});
|
|
137
213
|
|
|
@@ -158,6 +234,21 @@ const Breakouts = WebexPlugin.extend({
|
|
|
158
234
|
|
|
159
235
|
session.parseRoster(locus);
|
|
160
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
|
+
},
|
|
161
252
|
|
|
162
253
|
/**
|
|
163
254
|
* Sets up listener for broadcast messages sent to the breakout session
|
|
@@ -192,6 +283,36 @@ const Breakouts = WebexPlugin.extend({
|
|
|
192
283
|
});
|
|
193
284
|
},
|
|
194
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
|
+
},
|
|
195
316
|
/**
|
|
196
317
|
* Updates the information about the current breakout
|
|
197
318
|
* @param {Object} params
|
|
@@ -199,6 +320,10 @@ const Breakouts = WebexPlugin.extend({
|
|
|
199
320
|
*/
|
|
200
321
|
updateBreakout(params) {
|
|
201
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);
|
|
202
327
|
|
|
203
328
|
this.set('currentBreakoutSession', {
|
|
204
329
|
sessionId: params.sessionId,
|
|
@@ -209,12 +334,31 @@ const Breakouts = WebexPlugin.extend({
|
|
|
209
334
|
url: params.url,
|
|
210
335
|
[BREAKOUTS.SESSION_STATES.ACTIVE]: false,
|
|
211
336
|
[BREAKOUTS.SESSION_STATES.ALLOWED]: false,
|
|
212
|
-
[BREAKOUTS.SESSION_STATES.
|
|
337
|
+
[BREAKOUTS.SESSION_STATES.ASSIGNED]: false,
|
|
213
338
|
[BREAKOUTS.SESSION_STATES.ASSIGNED_CURRENT]: false,
|
|
214
339
|
[BREAKOUTS.SESSION_STATES.REQUESTED]: false,
|
|
215
340
|
});
|
|
216
341
|
|
|
217
|
-
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
|
+
}
|
|
218
362
|
},
|
|
219
363
|
|
|
220
364
|
/**
|
|
@@ -224,7 +368,12 @@ const Breakouts = WebexPlugin.extend({
|
|
|
224
368
|
*/
|
|
225
369
|
updateBreakoutSessions(payload) {
|
|
226
370
|
const breakouts = {};
|
|
227
|
-
|
|
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
|
+
}
|
|
228
377
|
if (payload.breakoutSessions) {
|
|
229
378
|
forEach(BREAKOUTS.SESSION_STATES, (state) => {
|
|
230
379
|
forEach(payload.breakoutSessions[state], (breakout) => {
|
|
@@ -240,10 +389,13 @@ const Breakouts = WebexPlugin.extend({
|
|
|
240
389
|
}
|
|
241
390
|
|
|
242
391
|
breakouts[sessionId][state] = true;
|
|
392
|
+
|
|
393
|
+
if (state === BREAKOUTS.SESSION_STATES.REQUESTED) {
|
|
394
|
+
breakouts[sessionId].requestedLastModifiedTime = breakout.modifiedAt;
|
|
395
|
+
}
|
|
243
396
|
});
|
|
244
397
|
});
|
|
245
398
|
}
|
|
246
|
-
|
|
247
399
|
forEach(breakouts, (breakout: typeof Breakout) => {
|
|
248
400
|
// eslint-disable-next-line no-param-reassign
|
|
249
401
|
breakout.url = this.url;
|
|
@@ -251,6 +403,15 @@ const Breakouts = WebexPlugin.extend({
|
|
|
251
403
|
|
|
252
404
|
this.breakouts.set(Object.values(breakouts));
|
|
253
405
|
},
|
|
406
|
+
/**
|
|
407
|
+
* clear breakouts collection
|
|
408
|
+
* @returns {void}
|
|
409
|
+
*/
|
|
410
|
+
clearBreakouts() {
|
|
411
|
+
if (this.breakouts.length > 0) {
|
|
412
|
+
this.breakouts.reset();
|
|
413
|
+
}
|
|
414
|
+
},
|
|
254
415
|
/**
|
|
255
416
|
* get main session
|
|
256
417
|
* @returns {Breakout}
|
|
@@ -330,16 +491,16 @@ const Breakouts = WebexPlugin.extend({
|
|
|
330
491
|
},
|
|
331
492
|
|
|
332
493
|
/**
|
|
333
|
-
* Make the meeting
|
|
494
|
+
* Make the meeting enable or disable breakout session
|
|
334
495
|
* @param {boolean} enable
|
|
335
496
|
* @returns {Promise}
|
|
336
497
|
*/
|
|
337
498
|
async toggleBreakout(enable) {
|
|
338
499
|
if (this.enableBreakoutSession === undefined) {
|
|
339
500
|
const info = await this.enableBreakouts();
|
|
501
|
+
// first time enable, set the initial data
|
|
502
|
+
this.updateBreakout(info?.body);
|
|
340
503
|
if (!enable) {
|
|
341
|
-
// if enable is false, updateBreakout set the param then set enableBreakoutSession as false
|
|
342
|
-
this.updateBreakout(info.body);
|
|
343
504
|
await this.doToggleBreakout(enable);
|
|
344
505
|
}
|
|
345
506
|
} else {
|
|
@@ -353,46 +514,58 @@ const Breakouts = WebexPlugin.extend({
|
|
|
353
514
|
* @returns {Promise}
|
|
354
515
|
*/
|
|
355
516
|
doToggleBreakout(enable) {
|
|
517
|
+
const body = {
|
|
518
|
+
...(this.editLock && !!this.editLock.token ? {editlock: {token: this.editLock.token}} : {}),
|
|
519
|
+
...{enableBreakoutSession: enable},
|
|
520
|
+
};
|
|
521
|
+
|
|
356
522
|
// @ts-ignore
|
|
357
523
|
return this.webex.request({
|
|
358
524
|
method: HTTP_VERBS.PUT,
|
|
359
525
|
uri: this.url,
|
|
360
|
-
body
|
|
361
|
-
enableBreakoutSession: enable,
|
|
362
|
-
},
|
|
526
|
+
body,
|
|
363
527
|
});
|
|
364
528
|
},
|
|
365
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
|
+
|
|
366
541
|
/**
|
|
367
542
|
* Create new breakout sessions
|
|
368
|
-
* @param {object}
|
|
543
|
+
* @param {object} params -- breakout session group
|
|
369
544
|
* @returns {Promise}
|
|
370
545
|
*/
|
|
371
|
-
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
|
+
};
|
|
372
552
|
// @ts-ignore
|
|
373
|
-
const
|
|
553
|
+
const breakoutInfo = await this.webex
|
|
374
554
|
.request({
|
|
375
555
|
method: HTTP_VERBS.PUT,
|
|
376
556
|
uri: this.url,
|
|
377
|
-
body
|
|
378
|
-
groups: [
|
|
379
|
-
{
|
|
380
|
-
sessions,
|
|
381
|
-
},
|
|
382
|
-
],
|
|
383
|
-
},
|
|
557
|
+
body,
|
|
384
558
|
})
|
|
385
559
|
.catch((error) => {
|
|
386
|
-
return Promise.reject(
|
|
387
|
-
boServiceErrorHandler(error, 'Breakouts#create --> Edit lock token mismatch')
|
|
388
|
-
);
|
|
560
|
+
return Promise.reject(boServiceErrorHandler(error, 'Breakouts#create'));
|
|
389
561
|
});
|
|
390
562
|
|
|
391
|
-
|
|
392
|
-
this.set('groups', breakInfo.body.groups);
|
|
393
|
-
}
|
|
563
|
+
this._setManageGroups(breakoutInfo);
|
|
394
564
|
|
|
395
|
-
|
|
565
|
+
// clear edit lock info after save breakout session info
|
|
566
|
+
this._clearEditLockInfo();
|
|
567
|
+
|
|
568
|
+
return breakoutInfo;
|
|
396
569
|
},
|
|
397
570
|
|
|
398
571
|
/**
|
|
@@ -400,30 +573,24 @@ const Breakouts = WebexPlugin.extend({
|
|
|
400
573
|
* @returns {Promise}
|
|
401
574
|
*/
|
|
402
575
|
async clearSessions() {
|
|
576
|
+
const body = {
|
|
577
|
+
...(this.editLock && !!this.editLock.token ? {editlock: {token: this.editLock.token}} : {}),
|
|
578
|
+
...{groups: [{action: BREAKOUTS.ACTION.DELETE}]},
|
|
579
|
+
};
|
|
403
580
|
// @ts-ignore
|
|
404
|
-
const
|
|
581
|
+
const breakoutInfo = await this.webex
|
|
405
582
|
.request({
|
|
406
583
|
method: HTTP_VERBS.PUT,
|
|
407
584
|
uri: this.url,
|
|
408
|
-
body
|
|
409
|
-
groups: [
|
|
410
|
-
{
|
|
411
|
-
action: BREAKOUTS.ACTION.DELETE,
|
|
412
|
-
},
|
|
413
|
-
],
|
|
414
|
-
},
|
|
585
|
+
body,
|
|
415
586
|
})
|
|
416
587
|
.catch((error) => {
|
|
417
|
-
return Promise.reject(
|
|
418
|
-
boServiceErrorHandler(error, 'Breakouts#clearSessions --> Edit lock token mismatch')
|
|
419
|
-
);
|
|
588
|
+
return Promise.reject(boServiceErrorHandler(error, 'Breakouts#clearSessions'));
|
|
420
589
|
});
|
|
421
590
|
|
|
422
|
-
|
|
423
|
-
this.set('groups', breakInfo.body.groups);
|
|
424
|
-
}
|
|
591
|
+
this._setManageGroups(breakoutInfo);
|
|
425
592
|
|
|
426
|
-
return
|
|
593
|
+
return breakoutInfo;
|
|
427
594
|
},
|
|
428
595
|
|
|
429
596
|
/**
|
|
@@ -431,7 +598,7 @@ const Breakouts = WebexPlugin.extend({
|
|
|
431
598
|
* @param {object} params
|
|
432
599
|
* @returns {Promise}
|
|
433
600
|
*/
|
|
434
|
-
start(params = {}) {
|
|
601
|
+
async start(params = {}) {
|
|
435
602
|
const action = BREAKOUTS.ACTION.START;
|
|
436
603
|
const payload = {
|
|
437
604
|
id: this.breakoutGroupId,
|
|
@@ -441,17 +608,24 @@ const Breakouts = WebexPlugin.extend({
|
|
|
441
608
|
...params,
|
|
442
609
|
};
|
|
443
610
|
|
|
444
|
-
|
|
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({
|
|
445
619
|
method: HTTP_VERBS.PUT,
|
|
446
620
|
uri: this.url,
|
|
447
|
-
body
|
|
448
|
-
groups: [payload],
|
|
449
|
-
},
|
|
621
|
+
body,
|
|
450
622
|
}).catch((error) => {
|
|
451
|
-
return Promise.reject(
|
|
452
|
-
boServiceErrorHandler(error, 'Breakouts#start --> Edit lock token mismatch')
|
|
453
|
-
);
|
|
623
|
+
return Promise.reject(boServiceErrorHandler(error, 'Breakouts#start'));
|
|
454
624
|
});
|
|
625
|
+
|
|
626
|
+
this._setManageGroups(breakoutInfo);
|
|
627
|
+
|
|
628
|
+
return breakoutInfo;
|
|
455
629
|
},
|
|
456
630
|
|
|
457
631
|
/**
|
|
@@ -459,7 +633,7 @@ const Breakouts = WebexPlugin.extend({
|
|
|
459
633
|
* @param {object} params
|
|
460
634
|
* @returns {Promise}
|
|
461
635
|
*/
|
|
462
|
-
end(params = {}) {
|
|
636
|
+
async end(params = {}) {
|
|
463
637
|
const {delayCloseTime, breakoutGroupId: id} = this;
|
|
464
638
|
const action = BREAKOUTS.ACTION.CLOSE;
|
|
465
639
|
const payload = {
|
|
@@ -469,17 +643,61 @@ const Breakouts = WebexPlugin.extend({
|
|
|
469
643
|
...params,
|
|
470
644
|
};
|
|
471
645
|
|
|
472
|
-
|
|
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({
|
|
473
654
|
method: HTTP_VERBS.PUT,
|
|
474
655
|
uri: this.url,
|
|
475
|
-
body
|
|
476
|
-
groups: [payload],
|
|
477
|
-
},
|
|
656
|
+
body,
|
|
478
657
|
}).catch((error) => {
|
|
479
|
-
return Promise.reject(
|
|
480
|
-
boServiceErrorHandler(error, 'Breakouts#end --> Edit lock token mismatch')
|
|
481
|
-
);
|
|
658
|
+
return Promise.reject(boServiceErrorHandler(error, 'Breakouts#end'));
|
|
482
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;
|
|
483
701
|
},
|
|
484
702
|
|
|
485
703
|
/**
|
|
@@ -493,12 +711,215 @@ const Breakouts = WebexPlugin.extend({
|
|
|
493
711
|
uri: this.url + (editlock ? `?editlock=${editlock}` : ''),
|
|
494
712
|
});
|
|
495
713
|
|
|
496
|
-
|
|
497
|
-
|
|
714
|
+
this._setManageGroups(breakout);
|
|
715
|
+
if (editlock && breakout.body?.editlock?.token) {
|
|
716
|
+
this.set('editLock', breakout.body.editlock);
|
|
717
|
+
this.keepEditLockAlive();
|
|
498
718
|
}
|
|
499
719
|
|
|
500
720
|
return breakout;
|
|
501
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);
|
|
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,
|
|
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
|
+
}
|
|
922
|
+
},
|
|
502
923
|
});
|
|
503
924
|
|
|
504
925
|
export default Breakouts;
|