@webex/plugin-meetings 2.60.0 → 2.60.1-next.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +46 -8
- package/dist/annotation/annotation.types.d.ts +42 -0
- package/dist/annotation/annotation.types.js +7 -0
- package/dist/annotation/annotation.types.js.map +1 -0
- package/dist/annotation/constants.d.ts +31 -0
- package/dist/annotation/constants.js +41 -0
- package/dist/annotation/constants.js.map +1 -0
- package/dist/annotation/index.d.ts +117 -0
- package/dist/annotation/index.js +357 -0
- package/dist/annotation/index.js.map +1 -0
- package/dist/breakouts/breakout.d.ts +8 -0
- package/dist/breakouts/breakout.js +215 -0
- package/dist/breakouts/breakout.js.map +1 -0
- package/dist/breakouts/collection.d.ts +5 -0
- package/dist/breakouts/collection.js +22 -0
- package/dist/breakouts/collection.js.map +1 -0
- package/dist/breakouts/edit-lock-error.d.ts +15 -0
- package/dist/breakouts/edit-lock-error.js +51 -0
- package/dist/breakouts/edit-lock-error.js.map +1 -0
- package/dist/breakouts/events.d.ts +8 -0
- package/dist/breakouts/events.js +44 -0
- package/dist/breakouts/events.js.map +1 -0
- package/dist/breakouts/index.d.ts +5 -0
- package/dist/breakouts/index.js +1047 -0
- package/dist/breakouts/index.js.map +1 -0
- package/dist/breakouts/request.d.ts +22 -0
- package/dist/breakouts/request.js +77 -0
- package/dist/breakouts/request.js.map +1 -0
- package/dist/breakouts/utils.d.ts +15 -0
- package/dist/breakouts/utils.js +64 -0
- package/dist/breakouts/utils.js.map +1 -0
- package/dist/common/browser-detection.js +2 -3
- package/dist/common/browser-detection.js.map +1 -1
- package/dist/common/collection.js +3 -4
- package/dist/common/collection.js.map +1 -1
- package/dist/common/config.js +1 -2
- package/dist/common/config.js.map +1 -1
- package/dist/common/errors/captcha-error.js +1 -2
- package/dist/common/errors/captcha-error.js.map +1 -1
- package/dist/common/errors/intent-to-join.js +1 -2
- package/dist/common/errors/intent-to-join.js.map +1 -1
- package/dist/common/errors/join-meeting.js +1 -2
- package/dist/common/errors/join-meeting.js.map +1 -1
- package/dist/common/errors/media.js +1 -2
- package/dist/common/errors/media.js.map +1 -1
- package/dist/common/errors/no-meeting-info.d.ts +14 -0
- package/dist/common/errors/no-meeting-info.js +50 -0
- package/dist/common/errors/no-meeting-info.js.map +1 -0
- package/dist/common/errors/parameter.js +3 -4
- package/dist/common/errors/parameter.js.map +1 -1
- package/dist/common/errors/password-error.js +1 -2
- package/dist/common/errors/password-error.js.map +1 -1
- package/dist/common/errors/permission.js +1 -2
- package/dist/common/errors/permission.js.map +1 -1
- package/dist/common/errors/{reclaim-host-role-error.js → reclaim-host-role-errors.js} +7 -11
- package/dist/common/errors/reclaim-host-role-errors.js.map +1 -0
- package/dist/common/errors/reconnection-in-progress.js +1 -2
- package/dist/common/errors/reconnection-in-progress.js.map +1 -1
- package/dist/common/errors/reconnection.js +1 -2
- package/dist/common/errors/reconnection.js.map +1 -1
- package/dist/common/errors/stats.js +1 -2
- package/dist/common/errors/stats.js.map +1 -1
- package/dist/common/errors/webex-errors.d.ts +20 -8
- package/dist/common/errors/webex-errors.js +48 -28
- package/dist/common/errors/webex-errors.js.map +1 -1
- package/dist/common/errors/webex-meetings-error.js +1 -2
- package/dist/common/errors/webex-meetings-error.js.map +1 -1
- package/dist/common/events/events-scope.js +1 -2
- package/dist/common/events/events-scope.js.map +1 -1
- package/dist/common/events/events.js +1 -2
- package/dist/common/events/events.js.map +1 -1
- package/dist/common/events/trigger-proxy.js +1 -2
- package/dist/common/events/trigger-proxy.js.map +1 -1
- package/dist/common/events/util.js +1 -2
- package/dist/common/events/util.js.map +1 -1
- package/dist/common/logs/logger-config.js +1 -2
- package/dist/common/logs/logger-config.js.map +1 -1
- package/dist/common/logs/logger-proxy.js +2 -3
- package/dist/common/logs/logger-proxy.js.map +1 -1
- package/dist/common/logs/request.d.ts +3 -1
- package/dist/common/logs/request.js +8 -5
- package/dist/common/logs/request.js.map +1 -1
- package/dist/common/queue.d.ts +9 -7
- package/dist/common/queue.js +22 -9
- package/dist/common/queue.js.map +1 -1
- package/dist/config.d.ts +6 -7
- package/dist/config.js +8 -10
- package/dist/config.js.map +1 -1
- package/dist/constants.d.ts +217 -97
- package/dist/constants.js +416 -441
- package/dist/constants.js.map +1 -1
- package/dist/controls-options-manager/constants.js +3 -6
- package/dist/controls-options-manager/constants.js.map +1 -1
- package/dist/controls-options-manager/enums.d.ts +11 -1
- package/dist/controls-options-manager/enums.js +15 -6
- package/dist/controls-options-manager/enums.js.map +1 -1
- package/dist/controls-options-manager/index.d.ts +17 -1
- package/dist/controls-options-manager/index.js +127 -38
- package/dist/controls-options-manager/index.js.map +1 -1
- package/dist/controls-options-manager/types.d.ts +43 -0
- 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.d.ts +1 -7
- package/dist/controls-options-manager/util.js +309 -19
- package/dist/controls-options-manager/util.js.map +1 -1
- package/dist/index.d.ts +6 -3
- package/dist/index.js +121 -5
- package/dist/index.js.map +1 -1
- package/dist/interceptors/index.d.ts +2 -0
- package/dist/interceptors/index.js +15 -0
- package/dist/interceptors/index.js.map +1 -0
- package/dist/interceptors/locusRetry.d.ts +27 -0
- package/dist/interceptors/locusRetry.js +94 -0
- package/dist/interceptors/locusRetry.js.map +1 -0
- package/dist/interpretation/collection.d.ts +5 -0
- package/dist/interpretation/collection.js +22 -0
- package/dist/interpretation/collection.js.map +1 -0
- package/dist/interpretation/index.d.ts +5 -0
- package/dist/interpretation/index.js +365 -0
- package/dist/interpretation/index.js.map +1 -0
- package/dist/interpretation/siLanguage.d.ts +5 -0
- package/dist/interpretation/siLanguage.js +24 -0
- package/dist/interpretation/siLanguage.js.map +1 -0
- package/dist/locus-info/controlsUtils.js +100 -11
- package/dist/locus-info/controlsUtils.js.map +1 -1
- package/dist/locus-info/embeddedAppsUtils.js +3 -4
- package/dist/locus-info/embeddedAppsUtils.js.map +1 -1
- package/dist/locus-info/fullState.js +1 -2
- package/dist/locus-info/fullState.js.map +1 -1
- package/dist/locus-info/hostUtils.js +1 -2
- package/dist/locus-info/hostUtils.js.map +1 -1
- package/dist/locus-info/index.d.ts +57 -4
- package/dist/locus-info/index.js +425 -84
- package/dist/locus-info/index.js.map +1 -1
- package/dist/locus-info/infoUtils.js +13 -5
- package/dist/locus-info/infoUtils.js.map +1 -1
- package/dist/locus-info/mediaSharesUtils.js +58 -3
- package/dist/locus-info/mediaSharesUtils.js.map +1 -1
- package/dist/locus-info/parser.d.ts +66 -6
- package/dist/locus-info/parser.js +253 -80
- package/dist/locus-info/parser.js.map +1 -1
- package/dist/locus-info/selfUtils.js +97 -13
- package/dist/locus-info/selfUtils.js.map +1 -1
- package/dist/media/index.d.ts +2 -0
- package/dist/media/index.js +107 -319
- package/dist/media/index.js.map +1 -1
- package/dist/media/properties.d.ts +38 -53
- package/dist/media/properties.js +96 -153
- package/dist/media/properties.js.map +1 -1
- package/dist/media/util.js +1 -22
- package/dist/media/util.js.map +1 -1
- package/dist/mediaQualityMetrics/config.d.ts +234 -230
- package/dist/mediaQualityMetrics/config.js +302 -498
- package/dist/mediaQualityMetrics/config.js.map +1 -1
- package/dist/meeting/in-meeting-actions.d.ts +88 -0
- package/dist/meeting/in-meeting-actions.js +94 -3
- package/dist/meeting/in-meeting-actions.js.map +1 -1
- package/dist/meeting/index.d.ts +591 -494
- package/dist/meeting/index.js +4732 -2990
- package/dist/meeting/index.js.map +1 -1
- package/dist/meeting/locusMediaRequest.d.ts +74 -0
- package/dist/meeting/locusMediaRequest.js +291 -0
- package/dist/meeting/locusMediaRequest.js.map +1 -0
- package/dist/meeting/muteState.d.ts +93 -25
- package/dist/meeting/muteState.js +224 -133
- package/dist/meeting/muteState.js.map +1 -1
- package/dist/meeting/request.d.ts +82 -47
- package/dist/meeting/request.js +297 -199
- package/dist/meeting/request.js.map +1 -1
- package/dist/meeting/request.type.d.ts +11 -0
- package/dist/meeting/request.type.js +7 -0
- package/dist/meeting/request.type.js.map +1 -0
- package/dist/meeting/state.js +1 -2
- package/dist/meeting/state.js.map +1 -1
- package/dist/meeting/util.d.ts +102 -1
- package/dist/meeting/util.js +605 -435
- package/dist/meeting/util.js.map +1 -1
- package/dist/meeting-info/collection.js +3 -4
- package/dist/meeting-info/collection.js.map +1 -1
- package/dist/meeting-info/index.d.ts +13 -1
- package/dist/meeting-info/index.js +74 -7
- package/dist/meeting-info/index.js.map +1 -1
- package/dist/meeting-info/meeting-info-v2.d.ts +31 -1
- package/dist/meeting-info/meeting-info-v2.js +200 -63
- package/dist/meeting-info/meeting-info-v2.js.map +1 -1
- package/dist/meeting-info/request.js +1 -2
- package/dist/meeting-info/request.js.map +1 -1
- package/dist/meeting-info/util.js +2 -3
- package/dist/meeting-info/util.js.map +1 -1
- package/dist/meeting-info/utilv2.js +39 -41
- package/dist/meeting-info/utilv2.js.map +1 -1
- package/dist/meetings/collection.d.ts +17 -0
- package/dist/meetings/collection.js +42 -4
- package/dist/meetings/collection.js.map +1 -1
- package/dist/meetings/index.d.ts +93 -21
- package/dist/meetings/index.js +490 -127
- package/dist/meetings/index.js.map +1 -1
- package/dist/meetings/meetings.types.d.ts +4 -0
- package/dist/meetings/meetings.types.js +7 -0
- package/dist/meetings/meetings.types.js.map +1 -0
- package/dist/meetings/request.js +4 -3
- package/dist/meetings/request.js.map +1 -1
- package/dist/meetings/util.js +107 -6
- package/dist/meetings/util.js.map +1 -1
- package/dist/member/index.d.ts +13 -1
- package/dist/member/index.js +45 -2
- package/dist/member/index.js.map +1 -1
- package/dist/member/member.types.js +3 -4
- package/dist/member/member.types.js.map +1 -1
- package/dist/member/types.d.ts +32 -0
- package/dist/member/types.js +23 -0
- package/dist/member/types.js.map +1 -0
- package/dist/member/util.js +120 -29
- package/dist/member/util.js.map +1 -1
- package/dist/members/collection.d.ts +5 -0
- package/dist/members/collection.js +11 -2
- package/dist/members/collection.js.map +1 -1
- package/dist/members/index.d.ts +56 -11
- package/dist/members/index.js +174 -47
- package/dist/members/index.js.map +1 -1
- package/dist/members/request.d.ts +67 -11
- package/dist/members/request.js +102 -54
- package/dist/members/request.js.map +1 -1
- package/dist/members/types.js +3 -4
- package/dist/members/types.js.map +1 -1
- package/dist/members/util.d.ts +214 -1
- package/dist/members/util.js +327 -284
- package/dist/members/util.js.map +1 -1
- package/dist/metrics/constants.d.ts +15 -6
- package/dist/metrics/constants.js +17 -9
- package/dist/metrics/constants.js.map +1 -1
- package/dist/metrics/index.d.ts +4 -111
- package/dist/metrics/index.js +4 -452
- package/dist/metrics/index.js.map +1 -1
- package/dist/multistream/mediaRequestManager.d.ts +118 -0
- package/dist/multistream/mediaRequestManager.js +344 -0
- package/dist/multistream/mediaRequestManager.js.map +1 -0
- package/dist/multistream/receiveSlot.d.ts +68 -0
- package/dist/multistream/receiveSlot.js +200 -0
- package/dist/multistream/receiveSlot.js.map +1 -0
- package/dist/multistream/receiveSlotManager.d.ts +56 -0
- package/dist/multistream/receiveSlotManager.js +174 -0
- package/dist/multistream/receiveSlotManager.js.map +1 -0
- package/dist/multistream/remoteMedia.d.ts +72 -0
- package/dist/multistream/remoteMedia.js +268 -0
- package/dist/multistream/remoteMedia.js.map +1 -0
- package/dist/multistream/remoteMediaGroup.d.ts +47 -0
- package/dist/multistream/remoteMediaGroup.js +267 -0
- package/dist/multistream/remoteMediaGroup.js.map +1 -0
- package/dist/multistream/remoteMediaManager.d.ts +285 -0
- package/dist/multistream/remoteMediaManager.js +1211 -0
- package/dist/multistream/remoteMediaManager.js.map +1 -0
- package/dist/multistream/sendSlotManager.d.ts +61 -0
- package/dist/multistream/sendSlotManager.js +236 -0
- package/dist/multistream/sendSlotManager.js.map +1 -0
- package/dist/networkQualityMonitor/index.js +5 -4
- package/dist/networkQualityMonitor/index.js.map +1 -1
- package/dist/personal-meeting-room/index.js +2 -3
- package/dist/personal-meeting-room/index.js.map +1 -1
- package/dist/personal-meeting-room/request.js +2 -3
- package/dist/personal-meeting-room/request.js.map +1 -1
- package/dist/personal-meeting-room/util.js +1 -2
- package/dist/personal-meeting-room/util.js.map +1 -1
- package/dist/reachability/clusterReachability.d.ts +109 -0
- package/dist/reachability/clusterReachability.js +357 -0
- package/dist/reachability/clusterReachability.js.map +1 -0
- package/dist/reachability/index.d.ts +61 -95
- package/dist/reachability/index.js +300 -393
- package/dist/reachability/index.js.map +1 -1
- package/dist/reachability/request.d.ts +7 -3
- package/dist/reachability/request.js +18 -10
- package/dist/reachability/request.js.map +1 -1
- package/dist/reachability/util.d.ts +8 -0
- package/dist/reachability/util.js +29 -0
- package/dist/reachability/util.js.map +1 -0
- package/dist/reactions/constants.d.ts +3 -0
- package/dist/reactions/constants.js +12 -0
- package/dist/reactions/constants.js.map +1 -0
- package/dist/reactions/reactions.d.ts +2 -2
- package/dist/reactions/reactions.js +4 -6
- package/dist/reactions/reactions.js.map +1 -1
- package/dist/reactions/reactions.type.d.ts +23 -3
- package/dist/reactions/reactions.type.js +21 -23
- package/dist/reactions/reactions.type.js.map +1 -1
- package/dist/reconnection-manager/index.d.ts +32 -8
- package/dist/reconnection-manager/index.js +282 -231
- package/dist/reconnection-manager/index.js.map +1 -1
- package/dist/recording-controller/enums.js +4 -5
- package/dist/recording-controller/enums.js.map +1 -1
- package/dist/recording-controller/index.d.ts +15 -1
- package/dist/recording-controller/index.js +57 -46
- package/dist/recording-controller/index.js.map +1 -1
- package/dist/recording-controller/util.d.ts +5 -4
- package/dist/recording-controller/util.js +10 -10
- package/dist/recording-controller/util.js.map +1 -1
- package/dist/roap/index.d.ts +9 -47
- package/dist/roap/index.js +101 -235
- package/dist/roap/index.js.map +1 -1
- package/dist/roap/request.d.ts +18 -12
- package/dist/roap/request.js +126 -180
- package/dist/roap/request.js.map +1 -1
- package/dist/roap/turnDiscovery.d.ts +27 -16
- package/dist/roap/turnDiscovery.js +115 -105
- package/dist/roap/turnDiscovery.js.map +1 -1
- package/dist/rtcMetrics/constants.d.ts +4 -0
- package/dist/rtcMetrics/constants.js +11 -0
- package/dist/rtcMetrics/constants.js.map +1 -0
- package/dist/rtcMetrics/index.d.ts +54 -0
- package/dist/rtcMetrics/index.js +140 -0
- package/dist/rtcMetrics/index.js.map +1 -0
- package/dist/statsAnalyzer/global.d.ts +1 -83
- package/dist/statsAnalyzer/global.js +2 -85
- package/dist/statsAnalyzer/global.js.map +1 -1
- package/dist/statsAnalyzer/index.d.ts +50 -30
- package/dist/statsAnalyzer/index.js +435 -510
- package/dist/statsAnalyzer/index.js.map +1 -1
- package/dist/statsAnalyzer/mqaUtil.d.ts +8 -6
- package/dist/statsAnalyzer/mqaUtil.js +120 -83
- package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
- package/dist/transcription/index.js +1 -2
- package/dist/transcription/index.js.map +1 -1
- package/dist/webinar/collection.d.ts +16 -0
- package/dist/webinar/collection.js +43 -0
- package/dist/webinar/collection.js.map +1 -0
- package/dist/webinar/index.d.ts +5 -0
- package/dist/webinar/index.js +68 -0
- package/dist/webinar/index.js.map +1 -0
- package/package.json +38 -26
- 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 +220 -0
- package/src/breakouts/breakout.ts +188 -0
- package/src/breakouts/collection.ts +19 -0
- package/src/breakouts/edit-lock-error.ts +25 -0
- package/src/breakouts/events.ts +56 -0
- package/src/breakouts/index.ts +925 -0
- package/src/breakouts/request.ts +55 -0
- package/src/breakouts/utils.ts +57 -0
- package/src/common/errors/no-meeting-info.ts +24 -0
- package/src/common/errors/webex-errors.ts +36 -12
- 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 -7
- package/src/constants.ts +244 -97
- 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 +332 -0
- package/src/interpretation/siLanguage.ts +18 -0
- package/src/locus-info/controlsUtils.ts +110 -0
- package/src/locus-info/index.ts +449 -61
- package/src/locus-info/infoUtils.ts +14 -2
- package/src/locus-info/mediaSharesUtils.ts +64 -0
- package/src/locus-info/parser.ts +258 -47
- package/src/locus-info/selfUtils.ts +85 -2
- package/src/media/index.ts +153 -370
- package/src/media/properties.ts +106 -136
- package/src/media/util.ts +0 -21
- package/src/mediaQualityMetrics/config.ts +244 -377
- package/src/meeting/in-meeting-actions.ts +176 -0
- package/src/meeting/index.ts +3944 -2489
- package/src/meeting/locusMediaRequest.ts +313 -0
- package/src/meeting/muteState.ts +224 -138
- package/src/meeting/request.ts +207 -127
- package/src/meeting/request.type.ts +13 -0
- package/src/meeting/util.ts +590 -423
- package/src/meeting-info/index.ts +81 -8
- package/src/meeting-info/meeting-info-v2.ts +163 -13
- package/src/meeting-info/util.ts +1 -1
- package/src/meeting-info/utilv2.ts +28 -28
- package/src/meetings/collection.ts +33 -0
- package/src/meetings/index.ts +487 -126
- package/src/meetings/meetings.types.ts +12 -0
- package/src/meetings/request.ts +2 -0
- package/src/meetings/util.ts +116 -5
- package/src/member/index.ts +43 -1
- package/src/member/types.ts +38 -0
- package/src/member/util.ts +125 -28
- package/src/members/collection.ts +8 -0
- package/src/members/index.ts +187 -52
- package/src/members/request.ts +87 -27
- package/src/members/util.ts +332 -291
- package/src/metrics/constants.ts +15 -6
- package/src/metrics/index.ts +1 -471
- package/src/multistream/mediaRequestManager.ts +440 -0
- package/src/multistream/receiveSlot.ts +184 -0
- package/src/multistream/receiveSlotManager.ts +166 -0
- package/src/multistream/remoteMedia.ts +254 -0
- package/src/multistream/remoteMediaGroup.ts +284 -0
- package/src/multistream/remoteMediaManager.ts +1145 -0
- package/src/multistream/sendSlotManager.ts +170 -0
- package/src/networkQualityMonitor/index.ts +6 -6
- package/src/reachability/clusterReachability.ts +320 -0
- package/src/reachability/index.ts +243 -347
- package/src/reachability/request.ts +17 -8
- package/src/reachability/util.ts +24 -0
- package/src/reactions/constants.ts +4 -0
- package/src/reactions/reactions.ts +4 -4
- package/src/reactions/reactions.type.ts +30 -4
- package/src/reconnection-manager/index.ts +168 -156
- package/src/recording-controller/index.ts +20 -3
- package/src/recording-controller/util.ts +26 -9
- package/src/roap/index.ts +98 -241
- package/src/roap/request.ts +74 -148
- package/src/roap/turnDiscovery.ts +62 -56
- package/src/rtcMetrics/constants.ts +3 -0
- package/src/rtcMetrics/index.ts +124 -0
- package/src/statsAnalyzer/global.ts +1 -84
- package/src/statsAnalyzer/index.ts +477 -643
- package/src/statsAnalyzer/mqaUtil.ts +115 -114
- package/src/webinar/collection.ts +31 -0
- package/src/webinar/index.ts +62 -0
- package/test/integration/spec/converged-space-meetings.js +233 -0
- package/test/integration/spec/journey.js +320 -264
- package/test/integration/spec/space-meeting.js +77 -4
- package/test/unit/spec/annotation/index.ts +418 -0
- package/test/unit/spec/breakouts/breakout.ts +237 -0
- package/test/unit/spec/breakouts/collection.ts +15 -0
- package/test/unit/spec/breakouts/edit-lock-error.ts +30 -0
- package/test/unit/spec/breakouts/events.ts +89 -0
- package/test/unit/spec/breakouts/index.ts +1790 -0
- package/test/unit/spec/breakouts/request.ts +104 -0
- package/test/unit/spec/breakouts/utils.js +72 -0
- package/test/unit/spec/common/queue.js +31 -2
- package/test/unit/spec/controls-options-manager/index.js +163 -0
- package/test/unit/spec/controls-options-manager/util.js +576 -60
- package/test/unit/spec/fixture/locus.js +1 -0
- package/test/unit/spec/interceptors/locusRetry.ts +131 -0
- package/test/unit/spec/interpretation/collection.ts +15 -0
- package/test/unit/spec/interpretation/index.ts +589 -0
- package/test/unit/spec/interpretation/siLanguage.ts +28 -0
- package/test/unit/spec/locus-info/controlsUtils.js +323 -30
- package/test/unit/spec/locus-info/index.js +1390 -16
- package/test/unit/spec/locus-info/infoUtils.js +54 -16
- package/test/unit/spec/locus-info/lib/SeqCmp.json +16 -0
- package/test/unit/spec/locus-info/lib/selfConstant.js +48 -0
- package/test/unit/spec/locus-info/mediaSharesUtils.ts +32 -0
- package/test/unit/spec/locus-info/parser.js +116 -35
- package/test/unit/spec/locus-info/selfUtils.js +275 -0
- package/test/unit/spec/media/index.ts +290 -0
- package/test/unit/spec/media/properties.ts +75 -84
- package/test/unit/spec/meeting/in-meeting-actions.ts +86 -0
- package/test/unit/spec/meeting/index.js +8187 -2769
- package/test/unit/spec/meeting/locusMediaRequest.ts +442 -0
- package/test/unit/spec/meeting/muteState.js +409 -213
- package/test/unit/spec/meeting/request.js +512 -42
- package/test/unit/spec/meeting/utils.js +741 -24
- package/test/unit/spec/meeting-info/index.js +300 -0
- package/test/unit/spec/meeting-info/meetinginfov2.js +527 -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 +1313 -243
- package/test/unit/spec/meetings/utils.js +202 -2
- package/test/unit/spec/member/index.js +32 -9
- package/test/unit/spec/member/util.js +499 -61
- package/test/unit/spec/members/index.js +394 -5
- package/test/unit/spec/members/request.js +206 -27
- package/test/unit/spec/members/utils.js +173 -38
- package/test/unit/spec/metrics/index.js +1 -50
- package/test/unit/spec/multistream/mediaRequestManager.ts +1418 -0
- package/test/unit/spec/multistream/receiveSlot.ts +163 -0
- package/test/unit/spec/multistream/receiveSlotManager.ts +203 -0
- package/test/unit/spec/multistream/remoteMedia.ts +255 -0
- package/test/unit/spec/multistream/remoteMediaGroup.ts +662 -0
- package/test/unit/spec/multistream/remoteMediaManager.ts +1924 -0
- package/test/unit/spec/multistream/sendSlotManager.ts +242 -0
- package/test/unit/spec/networkQualityMonitor/index.js +4 -4
- package/test/unit/spec/reachability/clusterReachability.ts +279 -0
- package/test/unit/spec/reachability/index.ts +531 -24
- package/test/unit/spec/reachability/request.js +68 -0
- package/test/unit/spec/reachability/util.ts +40 -0
- package/test/unit/spec/reconnection-manager/index.js +162 -24
- 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 +200 -76
- package/test/unit/spec/roap/request.ts +255 -0
- package/test/unit/spec/roap/turnDiscovery.ts +86 -48
- package/test/unit/spec/rtcMetrics/index.ts +93 -0
- package/test/unit/spec/stats-analyzer/index.js +261 -167
- package/test/unit/spec/webinar/collection.ts +13 -0
- package/test/unit/spec/webinar/index.ts +60 -0
- package/test/utils/constants.js +9 -0
- package/test/utils/integrationTestUtils.js +46 -0
- package/test/utils/testUtils.js +0 -45
- package/test/utils/webex-config.js +4 -0
- package/test/utils/webex-test-users.js +7 -3
- package/dist/common/errors/reclaim-host-role-error.js.map +0 -1
- package/dist/meeting/effectsState.d.ts +0 -42
- package/dist/meeting/effectsState.js +0 -260
- package/dist/meeting/effectsState.js.map +0 -1
- package/dist/metrics/config.d.ts +0 -169
- package/dist/metrics/config.js +0 -289
- package/dist/metrics/config.js.map +0 -1
- package/dist/peer-connection-manager/index.d.ts +0 -6
- package/dist/peer-connection-manager/index.js +0 -671
- package/dist/peer-connection-manager/index.js.map +0 -1
- package/dist/peer-connection-manager/util.d.ts +0 -6
- package/dist/peer-connection-manager/util.js +0 -110
- package/dist/peer-connection-manager/util.js.map +0 -1
- package/dist/roap/collection.d.ts +0 -10
- package/dist/roap/collection.js +0 -63
- package/dist/roap/collection.js.map +0 -1
- package/dist/roap/handler.d.ts +0 -47
- package/dist/roap/handler.js +0 -279
- package/dist/roap/handler.js.map +0 -1
- package/dist/roap/state.d.ts +0 -9
- package/dist/roap/state.js +0 -127
- package/dist/roap/state.js.map +0 -1
- package/dist/roap/util.d.ts +0 -2
- package/dist/roap/util.js +0 -76
- package/dist/roap/util.js.map +0 -1
- package/src/index.js +0 -15
- package/src/meeting/effectsState.ts +0 -209
- package/src/metrics/config.ts +0 -485
- package/src/peer-connection-manager/index.ts +0 -847
- package/src/peer-connection-manager/util.ts +0 -119
- package/src/roap/collection.ts +0 -62
- package/src/roap/handler.ts +0 -294
- package/src/roap/state.ts +0 -156
- package/src/roap/util.ts +0 -100
- package/test/unit/spec/meeting/effectsState.js +0 -281
- package/test/unit/spec/peerconnection-manager/index.js +0 -218
- package/test/unit/spec/peerconnection-manager/utils.js +0 -49
- package/test/unit/spec/peerconnection-manager/utils.test-fixtures.ts +0 -388
- package/test/unit/spec/roap/util.js +0 -30
- /package/dist/common/errors/{reclaim-host-role-error.d.ts → reclaim-host-role-errors.d.ts} +0 -0
- /package/src/common/errors/{reclaim-host-role-error.ts → reclaim-host-role-errors.ts} +0 -0
package/src/locus-info/index.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {isEqual} from 'lodash';
|
|
1
|
+
import {isEqual, assignWith, cloneDeep, isEmpty} from 'lodash';
|
|
2
2
|
|
|
3
3
|
import LoggerProxy from '../common/logs/logger-proxy';
|
|
4
4
|
import EventsScope from '../common/events/events-scope';
|
|
@@ -17,8 +17,6 @@ import {
|
|
|
17
17
|
CALL_REMOVED_REASON,
|
|
18
18
|
RECORDING_STATE,
|
|
19
19
|
} from '../constants';
|
|
20
|
-
import Metrics from '../metrics';
|
|
21
|
-
import {eventType} from '../metrics/config';
|
|
22
20
|
import InfoUtils from './infoUtils';
|
|
23
21
|
import FullState from './fullState';
|
|
24
22
|
import SelfUtils from './selfUtils';
|
|
@@ -27,6 +25,8 @@ import ControlsUtils from './controlsUtils';
|
|
|
27
25
|
import EmbeddedAppsUtils from './embeddedAppsUtils';
|
|
28
26
|
import MediaSharesUtils from './mediaSharesUtils';
|
|
29
27
|
import LocusDeltaParser from './parser';
|
|
28
|
+
import Metrics from '../metrics';
|
|
29
|
+
import BEHAVIORAL_METRICS from '../metrics/constants';
|
|
30
30
|
|
|
31
31
|
/**
|
|
32
32
|
* @description LocusInfo extends ChildEmitter to convert locusInfo info a private emitter to parent object
|
|
@@ -59,11 +59,19 @@ export default class LocusInfo extends EventsScope {
|
|
|
59
59
|
fullState: any;
|
|
60
60
|
host: any;
|
|
61
61
|
info: any;
|
|
62
|
+
roles: any;
|
|
62
63
|
mediaShares: any;
|
|
63
64
|
replace: any;
|
|
64
65
|
url: any;
|
|
65
66
|
services: any;
|
|
66
|
-
|
|
67
|
+
mainSessionLocusCache: any;
|
|
68
|
+
/**
|
|
69
|
+
* Constructor
|
|
70
|
+
* @param {function} updateMeeting callback to update the meeting object from an object
|
|
71
|
+
* @param {object} webex
|
|
72
|
+
* @param {string} meetingId
|
|
73
|
+
* @returns {undefined}
|
|
74
|
+
*/
|
|
67
75
|
constructor(updateMeeting, webex, meetingId) {
|
|
68
76
|
super();
|
|
69
77
|
this.parsedLocus = {
|
|
@@ -77,6 +85,82 @@ export default class LocusInfo extends EventsScope {
|
|
|
77
85
|
this.locusParser = new LocusDeltaParser();
|
|
78
86
|
}
|
|
79
87
|
|
|
88
|
+
/**
|
|
89
|
+
* Does a Locus sync. It tries to get the latest delta DTO or if it can't, it falls back to getting the full Locus DTO.
|
|
90
|
+
*
|
|
91
|
+
* @param {Meeting} meeting
|
|
92
|
+
* @returns {undefined}
|
|
93
|
+
*/
|
|
94
|
+
private doLocusSync(meeting: any) {
|
|
95
|
+
let isDelta;
|
|
96
|
+
let url;
|
|
97
|
+
|
|
98
|
+
if (this.locusParser.workingCopy.syncUrl) {
|
|
99
|
+
url = this.locusParser.workingCopy.syncUrl;
|
|
100
|
+
isDelta = true;
|
|
101
|
+
} else {
|
|
102
|
+
url = meeting.locusUrl;
|
|
103
|
+
isDelta = false;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
LoggerProxy.logger.info(
|
|
107
|
+
`Locus-info:index#doLocusSync --> doing Locus sync (getting ${
|
|
108
|
+
isDelta ? 'delta' : 'full'
|
|
109
|
+
} DTO)`
|
|
110
|
+
);
|
|
111
|
+
|
|
112
|
+
// return value ignored on purpose
|
|
113
|
+
meeting.meetingRequest
|
|
114
|
+
.getLocusDTO({url})
|
|
115
|
+
.catch((e) => {
|
|
116
|
+
if (isDelta) {
|
|
117
|
+
LoggerProxy.logger.info(
|
|
118
|
+
'Locus-info:index#doLocusSync --> delta sync failed, falling back to full sync'
|
|
119
|
+
);
|
|
120
|
+
|
|
121
|
+
Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.LOCUS_DELTA_SYNC_FAILED, {
|
|
122
|
+
correlationId: meeting.correlationId,
|
|
123
|
+
url,
|
|
124
|
+
reason: e.message,
|
|
125
|
+
errorName: e.name,
|
|
126
|
+
stack: e.stack,
|
|
127
|
+
code: e.code,
|
|
128
|
+
});
|
|
129
|
+
|
|
130
|
+
isDelta = false;
|
|
131
|
+
|
|
132
|
+
return meeting.meetingRequest.getLocusDTO({url: meeting.locusUrl}).catch((err) => {
|
|
133
|
+
LoggerProxy.logger.info(
|
|
134
|
+
'Locus-info:index#doLocusSync --> fallback full sync failed, destroying the meeting'
|
|
135
|
+
);
|
|
136
|
+
this.webex.meetings.destroy(meeting, MEETING_REMOVED_REASON.LOCUS_DTO_SYNC_FAILED);
|
|
137
|
+
throw err;
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
LoggerProxy.logger.info(
|
|
141
|
+
'Locus-info:index#doLocusSync --> fallback full sync failed, destroying the meeting'
|
|
142
|
+
);
|
|
143
|
+
this.webex.meetings.destroy(meeting, MEETING_REMOVED_REASON.LOCUS_DTO_SYNC_FAILED);
|
|
144
|
+
throw e;
|
|
145
|
+
})
|
|
146
|
+
.then((res) => {
|
|
147
|
+
if (isDelta) {
|
|
148
|
+
if (!isEmpty(res.body)) {
|
|
149
|
+
meeting.locusInfo.handleLocusDelta(res.body, meeting);
|
|
150
|
+
} else {
|
|
151
|
+
LoggerProxy.logger.info(
|
|
152
|
+
'Locus-info:index#doLocusSync --> received empty body from syncUrl, so we already have latest Locus DTO'
|
|
153
|
+
);
|
|
154
|
+
}
|
|
155
|
+
} else {
|
|
156
|
+
meeting.locusInfo.onFullLocus(res.body);
|
|
157
|
+
}
|
|
158
|
+
// Notify parser to resume processing delta events.
|
|
159
|
+
// Any deltas in the queue that have now been superseded by this sync will simply be ignored
|
|
160
|
+
this.locusParser.resume();
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
|
|
80
164
|
/**
|
|
81
165
|
* Apply locus delta data to meeting
|
|
82
166
|
* @param {string} action Locus delta action
|
|
@@ -85,28 +169,19 @@ export default class LocusInfo extends EventsScope {
|
|
|
85
169
|
* @returns {undefined}
|
|
86
170
|
*/
|
|
87
171
|
applyLocusDeltaData(action: string, locus: any, meeting: any) {
|
|
88
|
-
const {DESYNC, USE_CURRENT, USE_INCOMING} = LocusDeltaParser.loci;
|
|
172
|
+
const {DESYNC, USE_CURRENT, USE_INCOMING, WAIT, LOCUS_URL_CHANGED} = LocusDeltaParser.loci;
|
|
89
173
|
|
|
90
174
|
switch (action) {
|
|
91
175
|
case USE_INCOMING:
|
|
92
176
|
meeting.locusInfo.onDeltaLocus(locus);
|
|
93
177
|
break;
|
|
94
178
|
case USE_CURRENT:
|
|
95
|
-
|
|
96
|
-
|
|
179
|
+
case WAIT:
|
|
180
|
+
// do nothing
|
|
97
181
|
break;
|
|
98
182
|
case DESYNC:
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
desync: true,
|
|
102
|
-
locusUrl: meeting.locusUrl,
|
|
103
|
-
})
|
|
104
|
-
.then((res) => {
|
|
105
|
-
meeting.locusInfo.onFullLocus(res.body);
|
|
106
|
-
// Notify parser to resume processing delta events
|
|
107
|
-
// now that we have full locus from DESYNC.
|
|
108
|
-
this.locusParser.resume();
|
|
109
|
-
});
|
|
183
|
+
case LOCUS_URL_CHANGED:
|
|
184
|
+
this.doLocusSync(meeting);
|
|
110
185
|
break;
|
|
111
186
|
default:
|
|
112
187
|
LoggerProxy.logger.info(
|
|
@@ -172,12 +247,13 @@ export default class LocusInfo extends EventsScope {
|
|
|
172
247
|
*/
|
|
173
248
|
this.deltaParticipants = [];
|
|
174
249
|
|
|
250
|
+
this.updateLocusCache(locus);
|
|
175
251
|
// above section only updates the locusInfo object
|
|
176
252
|
// The below section makes sure it updates the locusInfo as well as updates the meeting object
|
|
177
253
|
this.updateParticipants(locus.participants);
|
|
178
254
|
// For 1:1 space meeting the conversation Url does not exist in locus.conversation
|
|
179
255
|
this.updateConversationUrl(locus.conversationUrl, locus.info);
|
|
180
|
-
this.updateControls(locus.controls);
|
|
256
|
+
this.updateControls(locus.controls, locus.self);
|
|
181
257
|
this.updateLocusUrl(locus.url);
|
|
182
258
|
this.updateFullState(locus.fullState);
|
|
183
259
|
this.updateMeetingInfo(locus.info);
|
|
@@ -195,6 +271,7 @@ export default class LocusInfo extends EventsScope {
|
|
|
195
271
|
* @memberof LocusInfo
|
|
196
272
|
*/
|
|
197
273
|
initialSetup(locus: object) {
|
|
274
|
+
this.updateLocusCache(locus);
|
|
198
275
|
this.onFullLocus(locus);
|
|
199
276
|
|
|
200
277
|
// Change it to true after it receives it first locus object
|
|
@@ -210,7 +287,7 @@ export default class LocusInfo extends EventsScope {
|
|
|
210
287
|
parse(meeting: any, data: any) {
|
|
211
288
|
// eslint-disable-next-line @typescript-eslint/no-shadow
|
|
212
289
|
const {eventType} = data;
|
|
213
|
-
|
|
290
|
+
const locus = this.getTheLocusToUpdate(data.locus);
|
|
214
291
|
LoggerProxy.logger.info(`Locus-info:index#parse --> received locus data: ${eventType}`);
|
|
215
292
|
|
|
216
293
|
switch (eventType) {
|
|
@@ -228,16 +305,16 @@ export default class LocusInfo extends EventsScope {
|
|
|
228
305
|
case LOCUSEVENT.PARTICIPANT_DECLINED:
|
|
229
306
|
case LOCUSEVENT.FLOOR_GRANTED:
|
|
230
307
|
case LOCUSEVENT.FLOOR_RELEASED:
|
|
231
|
-
this.onFullLocus(
|
|
308
|
+
this.onFullLocus(locus, eventType);
|
|
232
309
|
break;
|
|
233
310
|
case LOCUSEVENT.DIFFERENCE:
|
|
234
|
-
this.handleLocusDelta(
|
|
311
|
+
this.handleLocusDelta(locus, meeting);
|
|
235
312
|
break;
|
|
236
313
|
|
|
237
314
|
default:
|
|
238
315
|
// Why will there be a event with no eventType ????
|
|
239
316
|
// we may not need this, we can get full locus
|
|
240
|
-
this.handleLocusDelta(
|
|
317
|
+
this.handleLocusDelta(locus, meeting);
|
|
241
318
|
}
|
|
242
319
|
}
|
|
243
320
|
|
|
@@ -259,18 +336,27 @@ export default class LocusInfo extends EventsScope {
|
|
|
259
336
|
* @returns {object} null
|
|
260
337
|
* @memberof LocusInfo
|
|
261
338
|
*/
|
|
262
|
-
// eslint-disable-next-line @typescript-eslint/no-shadow
|
|
263
339
|
onFullLocus(locus: any, eventType?: string) {
|
|
264
340
|
if (!locus) {
|
|
265
341
|
LoggerProxy.logger.error(
|
|
266
342
|
'Locus-info:index#onFullLocus --> object passed as argument was invalid, continuing.'
|
|
267
343
|
);
|
|
268
344
|
}
|
|
345
|
+
|
|
346
|
+
if (!this.locusParser.isNewFullLocus(locus)) {
|
|
347
|
+
LoggerProxy.logger.info(
|
|
348
|
+
`Locus-info:index#onFullLocus --> ignoring old full locus DTO, eventType=${eventType}`
|
|
349
|
+
);
|
|
350
|
+
|
|
351
|
+
return;
|
|
352
|
+
}
|
|
353
|
+
|
|
269
354
|
this.updateParticipantDeltas(locus.participants);
|
|
270
355
|
this.scheduledMeeting = locus.meeting || null;
|
|
271
356
|
this.participants = locus.participants;
|
|
357
|
+
const isReplaceMembers = ControlsUtils.isNeedReplaceMembers(this.controls, locus.controls);
|
|
272
358
|
this.updateLocusInfo(locus);
|
|
273
|
-
this.updateParticipants(locus.participants);
|
|
359
|
+
this.updateParticipants(locus.participants, isReplaceMembers);
|
|
274
360
|
this.isMeetingActive();
|
|
275
361
|
this.handleOneOnOneEvent(eventType);
|
|
276
362
|
this.updateEmbeddedApps(locus.embeddedApps);
|
|
@@ -329,8 +415,9 @@ export default class LocusInfo extends EventsScope {
|
|
|
329
415
|
* @memberof LocusInfo
|
|
330
416
|
*/
|
|
331
417
|
onDeltaLocus(locus: any) {
|
|
418
|
+
const isReplaceMembers = ControlsUtils.isNeedReplaceMembers(this.controls, locus.controls);
|
|
332
419
|
this.updateLocusInfo(locus);
|
|
333
|
-
this.updateParticipants(locus.participants);
|
|
420
|
+
this.updateParticipants(locus.participants, isReplaceMembers);
|
|
334
421
|
this.isMeetingActive();
|
|
335
422
|
}
|
|
336
423
|
|
|
@@ -339,8 +426,15 @@ export default class LocusInfo extends EventsScope {
|
|
|
339
426
|
* @returns {undefined}
|
|
340
427
|
* @memberof LocusInfo
|
|
341
428
|
*/
|
|
342
|
-
updateLocusInfo(locus
|
|
343
|
-
|
|
429
|
+
updateLocusInfo(locus) {
|
|
430
|
+
if (locus.self?.reason === 'MOVED' && locus.self?.state === 'LEFT') {
|
|
431
|
+
// When moved to a breakout session locus sends a message for the previous locus
|
|
432
|
+
// indicating that we have been moved. It isn't helpful to continue parsing this
|
|
433
|
+
// as it gets interpreted as if we have left the call
|
|
434
|
+
return;
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
this.updateControls(locus.controls, locus.self);
|
|
344
438
|
this.updateConversationUrl(locus.conversationUrl, locus.info);
|
|
345
439
|
this.updateCreated(locus.created);
|
|
346
440
|
this.updateFullState(locus.fullState);
|
|
@@ -411,10 +505,15 @@ export default class LocusInfo extends EventsScope {
|
|
|
411
505
|
LoggerProxy.logger.warn(
|
|
412
506
|
'Locus-info:index#isMeetingActive --> Call Ended, locus state is inactive.'
|
|
413
507
|
);
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
508
|
+
|
|
509
|
+
// @ts-ignore
|
|
510
|
+
this.webex.internal.newMetrics.submitClientEvent({
|
|
511
|
+
name: 'client.call.remote-ended',
|
|
512
|
+
options: {
|
|
513
|
+
meetingId: this.meetingId,
|
|
514
|
+
},
|
|
417
515
|
});
|
|
516
|
+
|
|
418
517
|
this.emitScoped(
|
|
419
518
|
{
|
|
420
519
|
file: 'locus-info',
|
|
@@ -433,9 +532,12 @@ export default class LocusInfo extends EventsScope {
|
|
|
433
532
|
this.parsedLocus.self.state === MEETING_STATE.STATES.NOTIFIED ||
|
|
434
533
|
this.parsedLocus.self.state === MEETING_STATE.STATES.JOINED)
|
|
435
534
|
) {
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
535
|
+
// @ts-ignore
|
|
536
|
+
this.webex.internal.newMetrics.submitClientEvent({
|
|
537
|
+
name: 'client.call.remote-ended',
|
|
538
|
+
options: {
|
|
539
|
+
meetingId: this.meetingId,
|
|
540
|
+
},
|
|
439
541
|
});
|
|
440
542
|
this.emitScoped(
|
|
441
543
|
{
|
|
@@ -457,10 +559,14 @@ export default class LocusInfo extends EventsScope {
|
|
|
457
559
|
partner.state === MEETING_STATE.STATES.NOTIFIED ||
|
|
458
560
|
partner.state === MEETING_STATE.STATES.IDLE) // Happens when user just joins and adds no Media
|
|
459
561
|
) {
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
562
|
+
// @ts-ignore
|
|
563
|
+
this.webex.internal.newMetrics.submitClientEvent({
|
|
564
|
+
name: 'client.call.remote-ended',
|
|
565
|
+
options: {
|
|
566
|
+
meetingId: this.meetingId,
|
|
567
|
+
},
|
|
463
568
|
});
|
|
569
|
+
|
|
464
570
|
this.emitScoped(
|
|
465
571
|
{
|
|
466
572
|
file: 'locus-info',
|
|
@@ -483,9 +589,13 @@ export default class LocusInfo extends EventsScope {
|
|
|
483
589
|
LoggerProxy.logger.warn(
|
|
484
590
|
'Locus-info:index#isMeetingActive --> Meeting is ending due to inactive or terminating'
|
|
485
591
|
);
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
592
|
+
|
|
593
|
+
// @ts-ignore
|
|
594
|
+
this.webex.internal.newMetrics.submitClientEvent({
|
|
595
|
+
name: 'client.call.remote-ended',
|
|
596
|
+
options: {
|
|
597
|
+
meetingId: this.meetingId,
|
|
598
|
+
},
|
|
489
599
|
});
|
|
490
600
|
this.emitScoped(
|
|
491
601
|
{
|
|
@@ -500,9 +610,13 @@ export default class LocusInfo extends EventsScope {
|
|
|
500
610
|
);
|
|
501
611
|
} else if (this.fullState && this.fullState.removed) {
|
|
502
612
|
// user has been dropped from a meeting
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
613
|
+
|
|
614
|
+
// @ts-ignore
|
|
615
|
+
this.webex.internal.newMetrics.submitClientEvent({
|
|
616
|
+
name: 'client.call.remote-ended',
|
|
617
|
+
options: {
|
|
618
|
+
meetingId: this.meetingId,
|
|
619
|
+
},
|
|
506
620
|
});
|
|
507
621
|
this.emitScoped(
|
|
508
622
|
{
|
|
@@ -639,13 +753,13 @@ export default class LocusInfo extends EventsScope {
|
|
|
639
753
|
}
|
|
640
754
|
|
|
641
755
|
/**
|
|
642
|
-
*
|
|
756
|
+
* update meeting's members
|
|
643
757
|
* @param {Object} participants new participants object
|
|
644
|
-
* @param {
|
|
758
|
+
* @param {Boolean} isReplace is replace the whole members
|
|
645
759
|
* @returns {Array} updatedParticipants
|
|
646
760
|
* @memberof LocusInfo
|
|
647
761
|
*/
|
|
648
|
-
updateParticipants(participants: object) {
|
|
762
|
+
updateParticipants(participants: object, isReplace?: boolean) {
|
|
649
763
|
this.emitScoped(
|
|
650
764
|
{
|
|
651
765
|
file: 'locus-info',
|
|
@@ -658,16 +772,18 @@ export default class LocusInfo extends EventsScope {
|
|
|
658
772
|
selfIdentity: this.parsedLocus.self && this.parsedLocus.self.selfIdentity,
|
|
659
773
|
selfId: this.parsedLocus.self && this.parsedLocus.self.selfId,
|
|
660
774
|
hostId: this.parsedLocus.host && this.parsedLocus.host.hostId,
|
|
775
|
+
isReplace,
|
|
661
776
|
}
|
|
662
777
|
);
|
|
663
778
|
}
|
|
664
779
|
|
|
665
780
|
/**
|
|
666
781
|
* @param {Object} controls
|
|
782
|
+
* @param {Object} self
|
|
667
783
|
* @returns {undefined}
|
|
668
784
|
* @memberof LocusInfo
|
|
669
785
|
*/
|
|
670
|
-
updateControls(controls: object) {
|
|
786
|
+
updateControls(controls: object, self: object) {
|
|
671
787
|
if (controls && !isEqual(this.controls, controls)) {
|
|
672
788
|
this.parsedLocus.controls = ControlsUtils.parse(controls);
|
|
673
789
|
const {
|
|
@@ -677,10 +793,77 @@ export default class LocusInfo extends EventsScope {
|
|
|
677
793
|
hasMeetingContainerChanged,
|
|
678
794
|
hasTranscribeChanged,
|
|
679
795
|
hasEntryExitToneChanged,
|
|
796
|
+
hasBreakoutChanged,
|
|
797
|
+
hasVideoEnabledChanged,
|
|
798
|
+
hasMuteOnEntryChanged,
|
|
799
|
+
hasShareControlChanged,
|
|
800
|
+
hasDisallowUnmuteChanged,
|
|
801
|
+
hasReactionsChanged,
|
|
802
|
+
hasReactionDisplayNamesChanged,
|
|
803
|
+
hasViewTheParticipantListChanged,
|
|
804
|
+
hasRaiseHandChanged,
|
|
805
|
+
hasVideoChanged,
|
|
806
|
+
hasInterpretationChanged,
|
|
680
807
|
},
|
|
681
808
|
current,
|
|
682
809
|
} = ControlsUtils.getControls(this.controls, controls);
|
|
683
810
|
|
|
811
|
+
if (hasMuteOnEntryChanged) {
|
|
812
|
+
this.emitScoped(
|
|
813
|
+
{file: 'locus-info', function: 'updateControls'},
|
|
814
|
+
LOCUSINFO.EVENTS.CONTROLS_MUTE_ON_ENTRY_CHANGED,
|
|
815
|
+
{state: current.muteOnEntry}
|
|
816
|
+
);
|
|
817
|
+
}
|
|
818
|
+
|
|
819
|
+
if (hasShareControlChanged) {
|
|
820
|
+
this.emitScoped(
|
|
821
|
+
{file: 'locus-info', function: 'updateControls'},
|
|
822
|
+
LOCUSINFO.EVENTS.CONTROLS_SHARE_CONTROL_CHANGED,
|
|
823
|
+
{state: current.shareControl}
|
|
824
|
+
);
|
|
825
|
+
}
|
|
826
|
+
|
|
827
|
+
if (hasDisallowUnmuteChanged) {
|
|
828
|
+
this.emitScoped(
|
|
829
|
+
{file: 'locus-info', function: 'updateControls'},
|
|
830
|
+
LOCUSINFO.EVENTS.CONTROLS_DISALLOW_UNMUTE_CHANGED,
|
|
831
|
+
{state: current.disallowUnmute}
|
|
832
|
+
);
|
|
833
|
+
}
|
|
834
|
+
|
|
835
|
+
if (hasReactionsChanged || hasReactionDisplayNamesChanged) {
|
|
836
|
+
this.emitScoped(
|
|
837
|
+
{file: 'locus-info', function: 'updateControls'},
|
|
838
|
+
LOCUSINFO.EVENTS.CONTROLS_REACTIONS_CHANGED,
|
|
839
|
+
{state: current.reactions}
|
|
840
|
+
);
|
|
841
|
+
}
|
|
842
|
+
|
|
843
|
+
if (hasViewTheParticipantListChanged) {
|
|
844
|
+
this.emitScoped(
|
|
845
|
+
{file: 'locus-info', function: 'updateControls'},
|
|
846
|
+
LOCUSINFO.EVENTS.CONTROLS_VIEW_THE_PARTICIPANTS_LIST_CHANGED,
|
|
847
|
+
{state: current.viewTheParticipantList}
|
|
848
|
+
);
|
|
849
|
+
}
|
|
850
|
+
|
|
851
|
+
if (hasRaiseHandChanged) {
|
|
852
|
+
this.emitScoped(
|
|
853
|
+
{file: 'locus-info', function: 'updateControls'},
|
|
854
|
+
LOCUSINFO.EVENTS.CONTROLS_RAISE_HAND_CHANGED,
|
|
855
|
+
{state: current.raiseHand}
|
|
856
|
+
);
|
|
857
|
+
}
|
|
858
|
+
|
|
859
|
+
if (hasVideoChanged) {
|
|
860
|
+
this.emitScoped(
|
|
861
|
+
{file: 'locus-info', function: 'updateControls'},
|
|
862
|
+
LOCUSINFO.EVENTS.CONTROLS_VIDEO_CHANGED,
|
|
863
|
+
{state: current.video}
|
|
864
|
+
);
|
|
865
|
+
}
|
|
866
|
+
|
|
684
867
|
if (hasRecordingChanged || hasRecordingPausedChanged) {
|
|
685
868
|
let state = null;
|
|
686
869
|
|
|
@@ -740,9 +923,43 @@ export default class LocusInfo extends EventsScope {
|
|
|
740
923
|
);
|
|
741
924
|
}
|
|
742
925
|
|
|
926
|
+
if (hasBreakoutChanged) {
|
|
927
|
+
const {breakout} = current;
|
|
928
|
+
breakout.breakoutMoveId = SelfUtils.getReplacedBreakoutMoveId(
|
|
929
|
+
self,
|
|
930
|
+
this.webex.internal.device.url
|
|
931
|
+
);
|
|
932
|
+
this.emitScoped(
|
|
933
|
+
{
|
|
934
|
+
file: 'locus-info',
|
|
935
|
+
function: 'updateControls',
|
|
936
|
+
},
|
|
937
|
+
LOCUSINFO.EVENTS.CONTROLS_MEETING_BREAKOUT_UPDATED,
|
|
938
|
+
{
|
|
939
|
+
breakout,
|
|
940
|
+
}
|
|
941
|
+
);
|
|
942
|
+
}
|
|
943
|
+
|
|
944
|
+
if (hasInterpretationChanged) {
|
|
945
|
+
const {interpretation} = current;
|
|
946
|
+
this.emitScoped(
|
|
947
|
+
{
|
|
948
|
+
file: 'locus-info',
|
|
949
|
+
function: 'updateControls',
|
|
950
|
+
},
|
|
951
|
+
LOCUSINFO.EVENTS.CONTROLS_MEETING_INTERPRETATION_UPDATED,
|
|
952
|
+
{
|
|
953
|
+
interpretation,
|
|
954
|
+
}
|
|
955
|
+
);
|
|
956
|
+
}
|
|
957
|
+
|
|
743
958
|
if (hasEntryExitToneChanged) {
|
|
744
959
|
const {entryExitTone} = current;
|
|
745
960
|
|
|
961
|
+
this.updateMeeting({entryExitTone});
|
|
962
|
+
|
|
746
963
|
this.emitScoped(
|
|
747
964
|
{
|
|
748
965
|
file: 'locus-info',
|
|
@@ -753,8 +970,26 @@ export default class LocusInfo extends EventsScope {
|
|
|
753
970
|
entryExitTone,
|
|
754
971
|
}
|
|
755
972
|
);
|
|
973
|
+
}
|
|
756
974
|
|
|
757
|
-
|
|
975
|
+
// videoEnabled is handled differently than other controls,
|
|
976
|
+
// to fit with audio mute status logic
|
|
977
|
+
if (hasVideoEnabledChanged) {
|
|
978
|
+
const {videoEnabled} = current;
|
|
979
|
+
|
|
980
|
+
this.updateMeeting({unmuteVideoAllowed: videoEnabled});
|
|
981
|
+
|
|
982
|
+
this.emitScoped(
|
|
983
|
+
{
|
|
984
|
+
file: 'locus-info',
|
|
985
|
+
function: 'updateControls',
|
|
986
|
+
},
|
|
987
|
+
LOCUSINFO.EVENTS.SELF_REMOTE_VIDEO_MUTE_STATUS_UPDATED,
|
|
988
|
+
{
|
|
989
|
+
// muted: not part of locus.controls
|
|
990
|
+
unmuteAllowed: videoEnabled,
|
|
991
|
+
}
|
|
992
|
+
);
|
|
758
993
|
}
|
|
759
994
|
|
|
760
995
|
this.controls = controls;
|
|
@@ -895,20 +1130,14 @@ export default class LocusInfo extends EventsScope {
|
|
|
895
1130
|
* @memberof LocusInfo
|
|
896
1131
|
*/
|
|
897
1132
|
updateMeetingInfo(info: object, self?: object) {
|
|
898
|
-
|
|
899
|
-
|
|
1133
|
+
const roles = self ? SelfUtils.getRoles(self) : this.parsedLocus.self?.roles || [];
|
|
1134
|
+
if (
|
|
1135
|
+
(info && !isEqual(this.info, info)) ||
|
|
1136
|
+
(roles.length && !isEqual(this.roles, roles) && info)
|
|
1137
|
+
) {
|
|
900
1138
|
const isJoined = SelfUtils.isJoined(self || this.parsedLocus.self);
|
|
901
1139
|
const parsedInfo = InfoUtils.getInfos(this.parsedLocus.info, info, roles, isJoined);
|
|
902
1140
|
|
|
903
|
-
this.emitScoped(
|
|
904
|
-
{
|
|
905
|
-
file: 'locus-info',
|
|
906
|
-
function: 'updateMeetingInfo',
|
|
907
|
-
},
|
|
908
|
-
LOCUSINFO.EVENTS.MEETING_INFO_UPDATED,
|
|
909
|
-
{info: parsedInfo.current, self}
|
|
910
|
-
);
|
|
911
|
-
|
|
912
1141
|
if (parsedInfo.updates.isLocked) {
|
|
913
1142
|
this.emitScoped(
|
|
914
1143
|
{
|
|
@@ -934,7 +1163,16 @@ export default class LocusInfo extends EventsScope {
|
|
|
934
1163
|
this.parsedLocus.info = parsedInfo.current;
|
|
935
1164
|
// Parses the info and adds necessary values
|
|
936
1165
|
this.updateMeeting(parsedInfo.current);
|
|
1166
|
+
|
|
1167
|
+
this.emitScoped(
|
|
1168
|
+
{
|
|
1169
|
+
file: 'locus-info',
|
|
1170
|
+
function: 'updateMeetingInfo',
|
|
1171
|
+
},
|
|
1172
|
+
LOCUSINFO.EVENTS.MEETING_INFO_UPDATED
|
|
1173
|
+
);
|
|
937
1174
|
}
|
|
1175
|
+
this.roles = roles;
|
|
938
1176
|
}
|
|
939
1177
|
|
|
940
1178
|
/**
|
|
@@ -975,6 +1213,8 @@ export default class LocusInfo extends EventsScope {
|
|
|
975
1213
|
const parsedMediaShares = MediaSharesUtils.getMediaShares(this.mediaShares, mediaShares);
|
|
976
1214
|
|
|
977
1215
|
this.updateMeeting(parsedMediaShares.current);
|
|
1216
|
+
this.parsedLocus.mediaShares = parsedMediaShares.current;
|
|
1217
|
+
this.mediaShares = mediaShares;
|
|
978
1218
|
this.emitScoped(
|
|
979
1219
|
{
|
|
980
1220
|
file: 'locus-info',
|
|
@@ -986,8 +1226,6 @@ export default class LocusInfo extends EventsScope {
|
|
|
986
1226
|
previous: parsedMediaShares.previous,
|
|
987
1227
|
}
|
|
988
1228
|
);
|
|
989
|
-
this.parsedLocus.mediaShares = parsedMediaShares.current;
|
|
990
|
-
this.mediaShares = mediaShares;
|
|
991
1229
|
}
|
|
992
1230
|
}
|
|
993
1231
|
|
|
@@ -1065,6 +1303,31 @@ export default class LocusInfo extends EventsScope {
|
|
|
1065
1303
|
);
|
|
1066
1304
|
}
|
|
1067
1305
|
|
|
1306
|
+
if (parsedSelves.updates.breakoutsChanged) {
|
|
1307
|
+
this.emitScoped(
|
|
1308
|
+
{
|
|
1309
|
+
file: 'locus-info',
|
|
1310
|
+
function: 'updateSelf',
|
|
1311
|
+
},
|
|
1312
|
+
LOCUSINFO.EVENTS.SELF_MEETING_BREAKOUTS_CHANGED,
|
|
1313
|
+
{breakoutSessions: parsedSelves.current.breakoutSessions}
|
|
1314
|
+
);
|
|
1315
|
+
}
|
|
1316
|
+
|
|
1317
|
+
if (parsedSelves.updates.interpretationChanged) {
|
|
1318
|
+
this.emitScoped(
|
|
1319
|
+
{
|
|
1320
|
+
file: 'locus-info',
|
|
1321
|
+
function: 'updateSelf',
|
|
1322
|
+
},
|
|
1323
|
+
LOCUSINFO.EVENTS.SELF_MEETING_INTERPRETATION_CHANGED,
|
|
1324
|
+
{
|
|
1325
|
+
interpretation: parsedSelves.current.interpretation,
|
|
1326
|
+
selfParticipantId: parsedSelves.current.selfId,
|
|
1327
|
+
}
|
|
1328
|
+
);
|
|
1329
|
+
}
|
|
1330
|
+
|
|
1068
1331
|
if (parsedSelves.updates.isMediaInactiveOrReleased) {
|
|
1069
1332
|
this.emitScoped(
|
|
1070
1333
|
{
|
|
@@ -1086,6 +1349,31 @@ export default class LocusInfo extends EventsScope {
|
|
|
1086
1349
|
self
|
|
1087
1350
|
);
|
|
1088
1351
|
}
|
|
1352
|
+
|
|
1353
|
+
if (parsedSelves.updates.isRolesChanged) {
|
|
1354
|
+
this.emitScoped(
|
|
1355
|
+
{
|
|
1356
|
+
file: 'locus-info',
|
|
1357
|
+
function: 'updateSelf',
|
|
1358
|
+
},
|
|
1359
|
+
LOCUSINFO.EVENTS.SELF_ROLES_CHANGED,
|
|
1360
|
+
{oldRoles: parsedSelves.previous?.roles, newRoles: parsedSelves.current?.roles}
|
|
1361
|
+
);
|
|
1362
|
+
}
|
|
1363
|
+
|
|
1364
|
+
if (parsedSelves.updates.isVideoMutedByOthersChanged) {
|
|
1365
|
+
this.emitScoped(
|
|
1366
|
+
{
|
|
1367
|
+
file: 'locus-info',
|
|
1368
|
+
function: 'updateSelf',
|
|
1369
|
+
},
|
|
1370
|
+
LOCUSINFO.EVENTS.SELF_REMOTE_VIDEO_MUTE_STATUS_UPDATED,
|
|
1371
|
+
{
|
|
1372
|
+
muted: parsedSelves.current.remoteVideoMuted,
|
|
1373
|
+
// unmuteAllowed: not part of .self
|
|
1374
|
+
}
|
|
1375
|
+
);
|
|
1376
|
+
}
|
|
1089
1377
|
if (parsedSelves.updates.localAudioUnmuteRequiredByServer) {
|
|
1090
1378
|
this.emitScoped(
|
|
1091
1379
|
{
|
|
@@ -1300,4 +1588,104 @@ export default class LocusInfo extends EventsScope {
|
|
|
1300
1588
|
this.identities = identities;
|
|
1301
1589
|
}
|
|
1302
1590
|
}
|
|
1591
|
+
|
|
1592
|
+
/**
|
|
1593
|
+
* check the locus is main session's one or not, if is main session's, update main session cache
|
|
1594
|
+
* @param {Object} locus
|
|
1595
|
+
* @returns {undefined}
|
|
1596
|
+
* @memberof LocusInfo
|
|
1597
|
+
*/
|
|
1598
|
+
updateLocusCache(locus: any) {
|
|
1599
|
+
const isMainSessionDTO = ControlsUtils.isMainSessionDTO(locus);
|
|
1600
|
+
if (isMainSessionDTO) {
|
|
1601
|
+
this.updateMainSessionLocusCache(locus);
|
|
1602
|
+
}
|
|
1603
|
+
}
|
|
1604
|
+
|
|
1605
|
+
/**
|
|
1606
|
+
* if return from breakout to main session, need to use cached main session DTO since locus won't send the full locus (participants)
|
|
1607
|
+
* if join breakout from main session, need to query main locus url (if response with 403 means no privilege, need to clear the cache)
|
|
1608
|
+
* @param {Object} newLocus
|
|
1609
|
+
* @returns {Object}
|
|
1610
|
+
* @memberof LocusInfo
|
|
1611
|
+
*/
|
|
1612
|
+
getTheLocusToUpdate(newLocus: any) {
|
|
1613
|
+
const switchStatus = ControlsUtils.getSessionSwitchStatus(this.controls, newLocus?.controls);
|
|
1614
|
+
if (switchStatus.isReturnToMain && this.mainSessionLocusCache) {
|
|
1615
|
+
return cloneDeep(this.mainSessionLocusCache);
|
|
1616
|
+
}
|
|
1617
|
+
if (switchStatus.isJoinToBreakout) {
|
|
1618
|
+
this.emitScoped(
|
|
1619
|
+
{
|
|
1620
|
+
file: 'locus-info',
|
|
1621
|
+
function: 'updateControls',
|
|
1622
|
+
},
|
|
1623
|
+
LOCUSINFO.EVENTS.CONTROLS_JOIN_BREAKOUT_FROM_MAIN,
|
|
1624
|
+
{
|
|
1625
|
+
mainLocusUrl: this.url,
|
|
1626
|
+
}
|
|
1627
|
+
);
|
|
1628
|
+
}
|
|
1629
|
+
|
|
1630
|
+
return newLocus;
|
|
1631
|
+
}
|
|
1632
|
+
|
|
1633
|
+
/**
|
|
1634
|
+
* merge participants by participant id
|
|
1635
|
+
* @param {Array} participants
|
|
1636
|
+
* @param {Array} sourceParticipants
|
|
1637
|
+
* @returns {Array} merged participants
|
|
1638
|
+
* @memberof LocusInfo
|
|
1639
|
+
*/
|
|
1640
|
+
// eslint-disable-next-line class-methods-use-this
|
|
1641
|
+
mergeParticipants(participants, sourceParticipants) {
|
|
1642
|
+
if (!sourceParticipants || !sourceParticipants.length) return participants;
|
|
1643
|
+
if (!participants || !participants.length) {
|
|
1644
|
+
return sourceParticipants;
|
|
1645
|
+
}
|
|
1646
|
+
sourceParticipants.forEach((participant) => {
|
|
1647
|
+
const existIndex = participants.findIndex((p) => p.id === participant.id);
|
|
1648
|
+
if (existIndex > -1) {
|
|
1649
|
+
participants.splice(existIndex, 1, participant);
|
|
1650
|
+
} else {
|
|
1651
|
+
participants.push(participant);
|
|
1652
|
+
}
|
|
1653
|
+
});
|
|
1654
|
+
|
|
1655
|
+
return participants;
|
|
1656
|
+
}
|
|
1657
|
+
|
|
1658
|
+
/**
|
|
1659
|
+
* need cache main sessions' participants since locus will not send the full list when cohost/host leave breakout
|
|
1660
|
+
* @param {Object} mainLocus
|
|
1661
|
+
* @returns {undefined}
|
|
1662
|
+
* @memberof LocusInfo
|
|
1663
|
+
*/
|
|
1664
|
+
updateMainSessionLocusCache(mainLocus: any) {
|
|
1665
|
+
if (!mainLocus) {
|
|
1666
|
+
return;
|
|
1667
|
+
}
|
|
1668
|
+
const locusClone = cloneDeep(mainLocus);
|
|
1669
|
+
if (this.mainSessionLocusCache) {
|
|
1670
|
+
// shallow merge and do special merge for participants
|
|
1671
|
+
assignWith(this.mainSessionLocusCache, locusClone, (objValue, srcValue, key) => {
|
|
1672
|
+
if (key === 'participants') {
|
|
1673
|
+
return this.mergeParticipants(objValue, srcValue);
|
|
1674
|
+
}
|
|
1675
|
+
|
|
1676
|
+
return srcValue || objValue;
|
|
1677
|
+
});
|
|
1678
|
+
} else {
|
|
1679
|
+
this.mainSessionLocusCache = locusClone;
|
|
1680
|
+
}
|
|
1681
|
+
}
|
|
1682
|
+
|
|
1683
|
+
/**
|
|
1684
|
+
* clear main session cache
|
|
1685
|
+
* @returns {undefined}
|
|
1686
|
+
* @memberof LocusInfo
|
|
1687
|
+
*/
|
|
1688
|
+
clearMainSessionLocusCache() {
|
|
1689
|
+
this.mainSessionLocusCache = null;
|
|
1690
|
+
}
|
|
1303
1691
|
}
|