@webex/plugin-meetings 3.0.0-beta.13 → 3.0.0-beta.131
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 +45 -1
- package/UPGRADING.md +9 -9
- package/browsers.js +19 -24
- package/dist/annotation/annotation.types.js +7 -0
- package/dist/annotation/annotation.types.js.map +1 -0
- package/dist/annotation/constants.js +48 -0
- package/dist/annotation/constants.js.map +1 -0
- package/dist/annotation/index.js +355 -0
- package/dist/annotation/index.js.map +1 -0
- package/dist/breakouts/breakout.js +193 -0
- package/dist/breakouts/breakout.js.map +1 -0
- package/dist/breakouts/collection.js +23 -0
- package/dist/breakouts/collection.js.map +1 -0
- package/dist/breakouts/edit-lock-error.js +52 -0
- package/dist/breakouts/edit-lock-error.js.map +1 -0
- package/dist/breakouts/events.js +43 -0
- package/dist/breakouts/events.js.map +1 -0
- package/dist/breakouts/index.js +994 -0
- package/dist/breakouts/index.js.map +1 -0
- package/dist/breakouts/request.js +78 -0
- package/dist/breakouts/request.js.map +1 -0
- package/dist/breakouts/utils.js +67 -0
- package/dist/breakouts/utils.js.map +1 -0
- package/dist/common/browser-detection.js +1 -20
- package/dist/common/browser-detection.js.map +1 -1
- package/dist/common/collection.js +5 -20
- package/dist/common/collection.js.map +1 -1
- package/dist/common/config.js +0 -7
- package/dist/common/config.js.map +1 -1
- package/dist/common/errors/captcha-error.js +5 -26
- package/dist/common/errors/captcha-error.js.map +1 -1
- package/dist/common/errors/intent-to-join.js +5 -26
- package/dist/common/errors/intent-to-join.js.map +1 -1
- package/dist/common/errors/join-meeting.js +6 -27
- package/dist/common/errors/join-meeting.js.map +1 -1
- package/dist/common/errors/media.js +5 -26
- package/dist/common/errors/media.js.map +1 -1
- package/dist/common/errors/parameter.js +5 -33
- package/dist/common/errors/parameter.js.map +1 -1
- package/dist/common/errors/password-error.js +5 -26
- package/dist/common/errors/password-error.js.map +1 -1
- package/dist/common/errors/permission.js +4 -25
- package/dist/common/errors/permission.js.map +1 -1
- package/dist/common/errors/reconnection-in-progress.js +0 -17
- package/dist/common/errors/reconnection-in-progress.js.map +1 -1
- package/dist/common/errors/reconnection.js +5 -26
- package/dist/common/errors/reconnection.js.map +1 -1
- package/dist/common/errors/stats.js +5 -26
- package/dist/common/errors/stats.js.map +1 -1
- package/dist/common/errors/webex-errors.js +6 -41
- package/dist/common/errors/webex-errors.js.map +1 -1
- package/dist/common/errors/webex-meetings-error.js +1 -24
- package/dist/common/errors/webex-meetings-error.js.map +1 -1
- package/dist/common/events/events-scope.js +0 -22
- package/dist/common/events/events-scope.js.map +1 -1
- package/dist/common/events/events.js +0 -23
- package/dist/common/events/events.js.map +1 -1
- package/dist/common/events/trigger-proxy.js +0 -12
- package/dist/common/events/trigger-proxy.js.map +1 -1
- package/dist/common/events/util.js +0 -15
- package/dist/common/events/util.js.map +1 -1
- package/dist/common/logs/logger-config.js +0 -4
- package/dist/common/logs/logger-config.js.map +1 -1
- package/dist/common/logs/logger-proxy.js +1 -8
- package/dist/common/logs/logger-proxy.js.map +1 -1
- package/dist/common/logs/request.js +35 -61
- package/dist/common/logs/request.js.map +1 -1
- package/dist/common/queue.js +4 -14
- package/dist/common/queue.js.map +1 -1
- package/dist/config.js +6 -6
- package/dist/config.js.map +1 -1
- package/dist/constants.js +203 -53
- package/dist/constants.js.map +1 -1
- package/dist/controls-options-manager/constants.js +14 -0
- package/dist/controls-options-manager/constants.js.map +1 -0
- package/dist/controls-options-manager/enums.js +27 -0
- package/dist/controls-options-manager/enums.js.map +1 -0
- package/dist/controls-options-manager/index.js +297 -0
- package/dist/controls-options-manager/index.js.map +1 -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.js +294 -0
- package/dist/controls-options-manager/util.js.map +1 -0
- package/dist/index.js +72 -17
- package/dist/index.js.map +1 -1
- package/dist/locus-info/controlsUtils.js +100 -29
- package/dist/locus-info/controlsUtils.js.map +1 -1
- package/dist/locus-info/embeddedAppsUtils.js +3 -26
- package/dist/locus-info/embeddedAppsUtils.js.map +1 -1
- package/dist/locus-info/fullState.js +0 -15
- package/dist/locus-info/fullState.js.map +1 -1
- package/dist/locus-info/hostUtils.js +4 -12
- package/dist/locus-info/hostUtils.js.map +1 -1
- package/dist/locus-info/index.js +406 -216
- package/dist/locus-info/index.js.map +1 -1
- package/dist/locus-info/infoUtils.js +0 -38
- package/dist/locus-info/infoUtils.js.map +1 -1
- package/dist/locus-info/mediaSharesUtils.js +54 -38
- package/dist/locus-info/mediaSharesUtils.js.map +1 -1
- package/dist/locus-info/parser.js +88 -123
- package/dist/locus-info/parser.js.map +1 -1
- package/dist/locus-info/selfUtils.js +105 -91
- package/dist/locus-info/selfUtils.js.map +1 -1
- package/dist/media/index.js +55 -165
- package/dist/media/index.js.map +1 -1
- package/dist/media/properties.js +71 -117
- package/dist/media/properties.js.map +1 -1
- package/dist/media/util.js +2 -9
- package/dist/media/util.js.map +1 -1
- package/dist/mediaQualityMetrics/config.js +505 -495
- package/dist/mediaQualityMetrics/config.js.map +1 -1
- package/dist/meeting/in-meeting-actions.js +77 -14
- package/dist/meeting/in-meeting-actions.js.map +1 -1
- package/dist/meeting/index.js +2603 -2462
- package/dist/meeting/index.js.map +1 -1
- package/dist/meeting/locusMediaRequest.js +291 -0
- package/dist/meeting/locusMediaRequest.js.map +1 -0
- package/dist/meeting/muteState.js +292 -138
- package/dist/meeting/muteState.js.map +1 -1
- package/dist/meeting/request.js +315 -336
- package/dist/meeting/request.js.map +1 -1
- package/dist/meeting/request.type.js +7 -0
- package/dist/meeting/request.type.js.map +1 -0
- package/dist/meeting/state.js +21 -31
- package/dist/meeting/state.js.map +1 -1
- package/dist/meeting/util.js +463 -583
- package/dist/meeting/util.js.map +1 -1
- package/dist/meeting-info/collection.js +3 -25
- package/dist/meeting-info/collection.js.map +1 -1
- package/dist/meeting-info/index.js +10 -33
- package/dist/meeting-info/index.js.map +1 -1
- package/dist/meeting-info/meeting-info-v2.js +305 -286
- package/dist/meeting-info/meeting-info-v2.js.map +1 -1
- package/dist/meeting-info/request.js +1 -16
- package/dist/meeting-info/request.js.map +1 -1
- package/dist/meeting-info/util.js +98 -183
- package/dist/meeting-info/util.js.map +1 -1
- package/dist/meeting-info/utilv2.js +156 -232
- package/dist/meeting-info/utilv2.js.map +1 -1
- package/dist/meetings/collection.js +24 -20
- package/dist/meetings/collection.js.map +1 -1
- package/dist/meetings/index.js +692 -593
- package/dist/meetings/index.js.map +1 -1
- package/dist/meetings/request.js +23 -42
- package/dist/meetings/request.js.map +1 -1
- package/dist/meetings/util.js +186 -155
- package/dist/meetings/util.js.map +1 -1
- package/dist/member/index.js +89 -88
- package/dist/member/index.js.map +1 -1
- package/dist/member/types.js +15 -0
- package/dist/member/types.js.map +1 -0
- package/dist/member/util.js +101 -69
- package/dist/member/util.js.map +1 -1
- package/dist/members/collection.js +12 -12
- package/dist/members/collection.js.map +1 -1
- package/dist/members/index.js +166 -205
- package/dist/members/index.js.map +1 -1
- package/dist/members/request.js +120 -85
- 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 +314 -260
- package/dist/members/util.js.map +1 -1
- package/dist/metrics/config.js +50 -16
- package/dist/metrics/config.js.map +1 -1
- package/dist/metrics/constants.js +4 -7
- package/dist/metrics/constants.js.map +1 -1
- package/dist/metrics/index.js +93 -162
- package/dist/metrics/index.js.map +1 -1
- package/dist/multistream/mediaRequestManager.js +167 -50
- package/dist/multistream/mediaRequestManager.js.map +1 -1
- package/dist/multistream/receiveSlot.js +58 -65
- package/dist/multistream/receiveSlot.js.map +1 -1
- package/dist/multistream/receiveSlotManager.js +74 -93
- package/dist/multistream/receiveSlotManager.js.map +1 -1
- package/dist/multistream/remoteMedia.js +55 -74
- package/dist/multistream/remoteMedia.js.map +1 -1
- package/dist/multistream/remoteMediaGroup.js +6 -40
- package/dist/multistream/remoteMediaGroup.js.map +1 -1
- package/dist/multistream/remoteMediaManager.js +466 -442
- package/dist/multistream/remoteMediaManager.js.map +1 -1
- package/dist/networkQualityMonitor/index.js +32 -59
- package/dist/networkQualityMonitor/index.js.map +1 -1
- package/dist/personal-meeting-room/index.js +10 -45
- package/dist/personal-meeting-room/index.js.map +1 -1
- package/dist/personal-meeting-room/request.js +2 -33
- package/dist/personal-meeting-room/request.js.map +1 -1
- package/dist/personal-meeting-room/util.js +0 -13
- package/dist/personal-meeting-room/util.js.map +1 -1
- package/dist/reachability/index.js +190 -199
- package/dist/reachability/index.js.map +1 -1
- package/dist/reachability/request.js +14 -23
- package/dist/reachability/request.js.map +1 -1
- package/dist/reactions/constants.js +13 -0
- package/dist/reactions/constants.js.map +1 -0
- package/dist/reactions/reactions.js +2 -4
- package/dist/reactions/reactions.js.map +1 -1
- package/dist/reactions/reactions.type.js +19 -23
- package/dist/reactions/reactions.type.js.map +1 -1
- package/dist/reconnection-manager/index.js +326 -465
- package/dist/reconnection-manager/index.js.map +1 -1
- package/dist/recording-controller/enums.js +17 -0
- package/dist/recording-controller/enums.js.map +1 -0
- package/dist/recording-controller/index.js +343 -0
- package/dist/recording-controller/index.js.map +1 -0
- package/dist/recording-controller/util.js +63 -0
- package/dist/recording-controller/util.js.map +1 -0
- package/dist/roap/index.js +31 -75
- package/dist/roap/index.js.map +1 -1
- package/dist/roap/request.js +129 -136
- package/dist/roap/request.js.map +1 -1
- package/dist/roap/turnDiscovery.js +143 -103
- package/dist/roap/turnDiscovery.js.map +1 -1
- package/dist/statsAnalyzer/global.js +1 -95
- package/dist/statsAnalyzer/global.js.map +1 -1
- package/dist/statsAnalyzer/index.js +369 -461
- package/dist/statsAnalyzer/index.js.map +1 -1
- package/dist/statsAnalyzer/mqaUtil.js +144 -94
- package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
- package/dist/transcription/index.js +13 -45
- package/dist/transcription/index.js.map +1 -1
- package/dist/types/annotation/annotation.types.d.ts +35 -0
- package/dist/types/annotation/constants.d.ts +31 -0
- package/dist/types/annotation/index.d.ts +124 -0
- package/dist/types/breakouts/breakout.d.ts +8 -0
- package/dist/types/breakouts/collection.d.ts +5 -0
- package/dist/types/breakouts/edit-lock-error.d.ts +15 -0
- package/dist/types/breakouts/events.d.ts +2 -0
- package/dist/types/breakouts/index.d.ts +5 -0
- package/dist/types/breakouts/request.d.ts +22 -0
- package/dist/types/breakouts/utils.d.ts +15 -0
- package/dist/types/common/browser-detection.d.ts +9 -0
- package/dist/types/common/collection.d.ts +48 -0
- package/dist/types/common/config.d.ts +2 -0
- package/dist/types/common/errors/captcha-error.d.ts +15 -0
- package/dist/types/common/errors/intent-to-join.d.ts +16 -0
- package/dist/types/common/errors/join-meeting.d.ts +17 -0
- package/dist/types/common/errors/media.d.ts +15 -0
- package/dist/types/common/errors/parameter.d.ts +15 -0
- package/dist/types/common/errors/password-error.d.ts +15 -0
- package/dist/types/common/errors/permission.d.ts +14 -0
- package/dist/types/common/errors/reconnection-in-progress.d.ts +9 -0
- package/dist/types/common/errors/reconnection.d.ts +15 -0
- package/dist/types/common/errors/stats.d.ts +15 -0
- package/dist/types/common/errors/webex-errors.d.ts +69 -0
- package/dist/types/common/errors/webex-meetings-error.d.ts +20 -0
- package/dist/types/common/events/events-scope.d.ts +17 -0
- package/dist/types/common/events/events.d.ts +12 -0
- package/dist/types/common/events/trigger-proxy.d.ts +2 -0
- package/dist/types/common/events/util.d.ts +2 -0
- package/dist/types/common/logs/logger-config.d.ts +2 -0
- package/dist/types/common/logs/logger-proxy.d.ts +2 -0
- package/dist/types/common/logs/request.d.ts +34 -0
- package/dist/types/common/queue.d.ts +32 -0
- package/dist/types/config.d.ts +78 -0
- package/dist/types/constants.d.ts +993 -0
- package/dist/types/controls-options-manager/constants.d.ts +4 -0
- package/dist/types/controls-options-manager/enums.d.ts +15 -0
- package/dist/types/controls-options-manager/index.d.ts +136 -0
- package/dist/types/controls-options-manager/types.d.ts +43 -0
- package/dist/types/controls-options-manager/util.d.ts +1 -0
- package/dist/types/index.d.ts +7 -0
- package/dist/types/locus-info/controlsUtils.d.ts +2 -0
- package/dist/types/locus-info/embeddedAppsUtils.d.ts +2 -0
- package/dist/types/locus-info/fullState.d.ts +2 -0
- package/dist/types/locus-info/hostUtils.d.ts +2 -0
- package/dist/types/locus-info/index.d.ts +315 -0
- package/dist/types/locus-info/infoUtils.d.ts +2 -0
- package/dist/types/locus-info/mediaSharesUtils.d.ts +2 -0
- package/dist/types/locus-info/parser.d.ts +212 -0
- package/dist/types/locus-info/selfUtils.d.ts +2 -0
- package/dist/types/media/index.d.ts +34 -0
- package/dist/types/media/properties.d.ts +108 -0
- package/dist/types/media/util.d.ts +2 -0
- package/dist/types/mediaQualityMetrics/config.d.ts +365 -0
- package/dist/types/meeting/in-meeting-actions.d.ts +147 -0
- package/dist/types/meeting/index.d.ts +1762 -0
- package/dist/types/meeting/locusMediaRequest.d.ts +70 -0
- package/dist/types/meeting/muteState.d.ts +186 -0
- package/dist/types/meeting/request.d.ts +269 -0
- package/dist/types/meeting/request.type.d.ts +11 -0
- package/dist/types/meeting/state.d.ts +9 -0
- package/dist/types/meeting/util.d.ts +76 -0
- package/dist/types/meeting-info/collection.d.ts +20 -0
- package/dist/types/meeting-info/index.d.ts +57 -0
- package/dist/types/meeting-info/meeting-info-v2.d.ts +122 -0
- package/dist/types/meeting-info/request.d.ts +22 -0
- package/dist/types/meeting-info/util.d.ts +2 -0
- package/dist/types/meeting-info/utilv2.d.ts +2 -0
- package/dist/types/meetings/collection.d.ts +31 -0
- package/dist/types/meetings/index.d.ts +345 -0
- package/dist/types/meetings/request.d.ts +27 -0
- package/dist/types/meetings/util.d.ts +18 -0
- package/dist/types/member/index.d.ts +157 -0
- package/dist/types/member/types.d.ts +21 -0
- package/dist/types/member/util.d.ts +2 -0
- package/dist/types/members/collection.d.ts +29 -0
- package/dist/types/members/index.d.ts +353 -0
- package/dist/types/members/request.d.ts +114 -0
- package/dist/types/members/types.d.ts +24 -0
- package/dist/types/members/util.d.ts +210 -0
- package/dist/types/metrics/config.d.ts +195 -0
- package/dist/types/metrics/constants.d.ts +55 -0
- package/dist/types/metrics/index.d.ts +169 -0
- package/dist/types/multistream/mediaRequestManager.d.ts +101 -0
- package/dist/types/multistream/receiveSlot.d.ts +68 -0
- package/dist/types/multistream/receiveSlotManager.d.ts +56 -0
- package/dist/types/multistream/remoteMedia.d.ts +72 -0
- package/dist/types/multistream/remoteMediaGroup.d.ts +47 -0
- package/dist/types/multistream/remoteMediaManager.d.ts +263 -0
- package/dist/types/networkQualityMonitor/index.d.ts +70 -0
- package/dist/types/personal-meeting-room/index.d.ts +47 -0
- package/dist/types/personal-meeting-room/request.d.ts +14 -0
- package/dist/types/personal-meeting-room/util.d.ts +2 -0
- package/dist/types/reachability/index.d.ts +152 -0
- package/dist/types/reachability/request.d.ts +37 -0
- package/dist/types/reactions/constants.d.ts +3 -0
- package/dist/types/reactions/reactions.d.ts +4 -0
- package/dist/types/reactions/reactions.type.d.ts +52 -0
- package/dist/types/reconnection-manager/index.d.ts +126 -0
- package/dist/types/recording-controller/enums.d.ts +7 -0
- package/dist/types/recording-controller/index.d.ts +193 -0
- package/dist/types/recording-controller/util.d.ts +13 -0
- package/dist/types/roap/index.d.ts +77 -0
- package/dist/types/roap/request.d.ts +36 -0
- package/dist/types/roap/turnDiscovery.d.ts +91 -0
- package/dist/types/statsAnalyzer/global.d.ts +36 -0
- package/dist/types/statsAnalyzer/index.d.ts +200 -0
- package/dist/types/statsAnalyzer/mqaUtil.d.ts +24 -0
- package/dist/types/transcription/index.d.ts +64 -0
- package/internal-README.md +7 -6
- package/package.json +28 -21
- package/src/annotation/annotation.types.ts +42 -0
- package/src/annotation/constants.ts +36 -0
- package/src/annotation/index.ts +339 -0
- package/src/breakouts/README.md +220 -0
- package/src/breakouts/breakout.ts +163 -0
- package/src/breakouts/collection.ts +19 -0
- package/src/breakouts/edit-lock-error.ts +25 -0
- package/src/breakouts/events.ts +37 -0
- package/src/breakouts/index.ts +860 -0
- package/src/breakouts/request.ts +55 -0
- package/src/breakouts/utils.ts +57 -0
- package/src/common/browser-detection.ts +9 -6
- package/src/common/collection.ts +3 -1
- package/src/common/errors/captcha-error.ts +6 -6
- package/src/common/errors/intent-to-join.ts +6 -6
- package/src/common/errors/join-meeting.ts +12 -8
- package/src/common/errors/media.ts +6 -6
- package/src/common/errors/parameter.ts +9 -6
- package/src/common/errors/password-error.ts +6 -6
- package/src/common/errors/permission.ts +5 -5
- package/src/common/errors/reconnection.ts +6 -6
- package/src/common/errors/stats.ts +6 -6
- package/src/common/errors/webex-errors.ts +7 -5
- package/src/common/errors/webex-meetings-error.ts +1 -1
- package/src/common/events/events-scope.ts +5 -1
- package/src/common/events/events.ts +5 -1
- package/src/common/events/trigger-proxy.ts +8 -3
- package/src/common/events/util.ts +1 -2
- package/src/common/logs/logger-proxy.ts +21 -10
- package/src/common/logs/request.ts +11 -8
- package/src/config.ts +16 -12
- package/src/constants.ts +153 -7
- package/src/controls-options-manager/constants.ts +5 -0
- package/src/controls-options-manager/enums.ts +18 -0
- package/src/controls-options-manager/index.ts +278 -0
- package/src/controls-options-manager/types.ts +59 -0
- package/src/controls-options-manager/util.ts +281 -0
- package/src/index.ts +33 -0
- package/src/locus-info/controlsUtils.ts +142 -24
- package/src/locus-info/fullState.ts +15 -11
- package/src/locus-info/hostUtils.ts +4 -3
- package/src/locus-info/index.ts +346 -55
- package/src/locus-info/infoUtils.ts +12 -4
- package/src/locus-info/mediaSharesUtils.ts +52 -4
- package/src/locus-info/parser.ts +46 -68
- package/src/locus-info/selfUtils.ts +195 -56
- package/src/media/index.ts +139 -196
- package/src/media/properties.ts +43 -36
- package/src/media/util.ts +1 -1
- package/src/mediaQualityMetrics/config.ts +380 -378
- package/src/meeting/in-meeting-actions.ts +159 -3
- package/src/meeting/index.ts +2803 -1584
- package/src/meeting/locusMediaRequest.ts +309 -0
- package/src/meeting/muteState.ts +290 -72
- package/src/meeting/request.ts +247 -178
- package/src/meeting/request.type.ts +13 -0
- package/src/meeting/state.ts +45 -30
- package/src/meeting/util.ts +445 -395
- package/src/meeting-info/collection.ts +2 -1
- package/src/meeting-info/index.ts +32 -30
- package/src/meeting-info/meeting-info-v2.ts +235 -116
- package/src/meeting-info/request.ts +9 -3
- package/src/meeting-info/util.ts +54 -46
- package/src/meeting-info/utilv2.ts +71 -55
- package/src/meetings/collection.ts +21 -1
- package/src/meetings/index.ts +772 -437
- package/src/meetings/request.ts +29 -25
- package/src/meetings/util.ts +132 -33
- package/src/member/index.ts +95 -49
- package/src/member/types.ts +24 -0
- package/src/member/util.ts +106 -13
- package/src/members/collection.ts +8 -1
- package/src/members/index.ts +288 -130
- package/src/members/request.ts +144 -31
- package/src/members/types.ts +28 -0
- package/src/members/util.ts +316 -235
- package/src/metrics/config.ts +302 -90
- package/src/metrics/constants.ts +2 -6
- package/src/metrics/index.ts +124 -95
- package/src/multistream/mediaRequestManager.ts +203 -45
- package/src/multistream/receiveSlot.ts +69 -26
- package/src/multistream/receiveSlotManager.ts +62 -38
- package/src/multistream/remoteMedia.ts +30 -4
- package/src/multistream/remoteMediaGroup.ts +4 -3
- package/src/multistream/remoteMediaManager.ts +230 -66
- package/src/networkQualityMonitor/index.ts +24 -27
- package/src/personal-meeting-room/index.ts +12 -16
- package/src/personal-meeting-room/request.ts +10 -3
- package/src/personal-meeting-room/util.ts +3 -3
- package/src/reachability/index.ts +131 -79
- package/src/reachability/request.ts +43 -34
- package/src/reactions/constants.ts +4 -0
- package/src/reactions/reactions.ts +8 -8
- package/src/reactions/reactions.type.ts +31 -5
- package/src/reconnection-manager/index.ts +193 -111
- package/src/recording-controller/enums.ts +8 -0
- package/src/recording-controller/index.ts +315 -0
- package/src/recording-controller/util.ts +58 -0
- package/src/roap/index.ts +53 -53
- package/src/roap/request.ts +77 -64
- package/src/roap/turnDiscovery.ts +101 -48
- package/src/statsAnalyzer/global.ts +8 -104
- package/src/statsAnalyzer/index.ts +624 -376
- package/src/statsAnalyzer/mqaUtil.ts +203 -90
- package/src/transcription/index.ts +34 -32
- package/test/integration/spec/converged-space-meetings.js +177 -0
- package/test/integration/spec/journey.js +670 -466
- package/test/integration/spec/space-meeting.js +320 -204
- package/test/integration/spec/transcription.js +7 -8
- package/test/unit/spec/annotation/index.ts +433 -0
- package/test/unit/spec/breakouts/breakout.ts +203 -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 +77 -0
- package/test/unit/spec/breakouts/index.ts +1609 -0
- package/test/unit/spec/breakouts/request.ts +104 -0
- package/test/unit/spec/breakouts/utils.js +72 -0
- package/test/unit/spec/common/browser-detection.js +9 -28
- package/test/unit/spec/controls-options-manager/index.js +287 -0
- package/test/unit/spec/controls-options-manager/util.js +504 -0
- package/test/unit/spec/fixture/locus.js +93 -90
- package/test/unit/spec/locus-info/controlsUtils.js +305 -32
- package/test/unit/spec/locus-info/embeddedAppsUtils.js +8 -6
- package/test/unit/spec/locus-info/index.js +636 -5
- package/test/unit/spec/locus-info/infoUtils.js +26 -33
- package/test/unit/spec/locus-info/lib/BasicSeqCmp.json +88 -430
- package/test/unit/spec/locus-info/lib/SeqCmp.json +513 -685
- package/test/unit/spec/locus-info/mediaSharesUtils.ts +22 -0
- package/test/unit/spec/locus-info/parser.js +3 -9
- package/test/unit/spec/locus-info/selfConstant.js +110 -103
- package/test/unit/spec/locus-info/selfUtils.js +252 -12
- package/test/unit/spec/media/index.ts +104 -8
- package/test/unit/spec/media/properties.ts +9 -9
- package/test/unit/spec/meeting/in-meeting-actions.ts +76 -3
- package/test/unit/spec/meeting/index.js +3112 -921
- package/test/unit/spec/meeting/locusMediaRequest.ts +436 -0
- package/test/unit/spec/meeting/muteState.js +421 -94
- package/test/unit/spec/meeting/request.js +421 -79
- package/test/unit/spec/meeting/utils.js +326 -189
- package/test/unit/spec/meeting-info/meetinginfov2.js +481 -76
- package/test/unit/spec/meeting-info/request.js +7 -9
- package/test/unit/spec/meeting-info/util.js +11 -12
- package/test/unit/spec/meeting-info/utilv2.js +131 -74
- package/test/unit/spec/meetings/collection.js +15 -1
- package/test/unit/spec/meetings/index.js +1126 -328
- package/test/unit/spec/meetings/utils.js +220 -14
- package/test/unit/spec/member/index.js +24 -1
- package/test/unit/spec/member/util.js +383 -32
- package/test/unit/spec/members/index.js +424 -55
- package/test/unit/spec/members/request.js +228 -40
- package/test/unit/spec/members/utils.js +191 -4
- package/test/unit/spec/metrics/index.js +113 -20
- package/test/unit/spec/multistream/mediaRequestManager.ts +650 -105
- package/test/unit/spec/multistream/receiveSlot.ts +76 -17
- package/test/unit/spec/multistream/receiveSlotManager.ts +69 -39
- package/test/unit/spec/multistream/remoteMedia.ts +32 -2
- package/test/unit/spec/multistream/remoteMediaGroup.ts +5 -5
- package/test/unit/spec/multistream/remoteMediaManager.ts +549 -65
- package/test/unit/spec/networkQualityMonitor/index.js +24 -18
- package/test/unit/spec/personal-meeting-room/personal-meeting-room.js +2 -7
- package/test/unit/spec/reachability/index.ts +176 -27
- package/test/unit/spec/reachability/request.js +66 -0
- package/test/unit/spec/reconnection-manager/index.js +62 -31
- package/test/unit/spec/recording-controller/index.js +231 -0
- package/test/unit/spec/recording-controller/util.js +102 -0
- package/test/unit/spec/roap/index.ts +19 -49
- package/test/unit/spec/roap/request.ts +187 -0
- package/test/unit/spec/roap/turnDiscovery.ts +92 -50
- package/test/unit/spec/stats-analyzer/index.js +116 -60
- package/test/utils/cmr.js +44 -42
- package/test/utils/constants.js +9 -0
- package/test/utils/integrationTestUtils.js +64 -0
- package/test/utils/testUtils.js +63 -99
- package/test/utils/webex-config.js +22 -18
- package/test/utils/webex-test-users.js +57 -50
- package/tsconfig.json +6 -0
- package/dist/media/internal-media-core-wrapper.js +0 -22
- package/dist/media/internal-media-core-wrapper.js.map +0 -1
- package/dist/meeting/effectsState.js +0 -334
- package/dist/meeting/effectsState.js.map +0 -1
- package/dist/multistream/multistreamMedia.js +0 -116
- package/dist/multistream/multistreamMedia.js.map +0 -1
- package/src/index.js +0 -15
- package/src/media/internal-media-core-wrapper.ts +0 -9
- package/src/meeting/effectsState.ts +0 -211
- package/src/multistream/multistreamMedia.ts +0 -92
- package/test/unit/spec/meeting/effectsState.js +0 -291
package/src/meetings/index.ts
CHANGED
|
@@ -1,8 +1,12 @@
|
|
|
1
|
+
/* eslint no-shadow: ["error", { "allow": ["eventType"] }] */
|
|
2
|
+
|
|
1
3
|
import '@webex/internal-plugin-mercury';
|
|
2
4
|
import '@webex/internal-plugin-conversation';
|
|
3
5
|
// @ts-ignore
|
|
4
6
|
import {WebexPlugin} from '@webex/webex-core';
|
|
5
|
-
import {
|
|
7
|
+
import {setLogger} from '@webex/internal-media-core';
|
|
8
|
+
|
|
9
|
+
import * as mediaHelpersModule from '@webex/media-helpers';
|
|
6
10
|
|
|
7
11
|
import 'webrtc-adapter';
|
|
8
12
|
|
|
@@ -37,7 +41,11 @@ import {
|
|
|
37
41
|
_ID_,
|
|
38
42
|
MEETING_REMOVED_REASON,
|
|
39
43
|
_CONVERSATION_URL_,
|
|
40
|
-
CONVERSATION_URL
|
|
44
|
+
CONVERSATION_URL,
|
|
45
|
+
MEETINGNUMBER,
|
|
46
|
+
BREAKOUTS,
|
|
47
|
+
_JOINED_,
|
|
48
|
+
_MOVED_,
|
|
41
49
|
} from '../constants';
|
|
42
50
|
import BEHAVIORAL_METRICS from '../metrics/constants';
|
|
43
51
|
import MeetingInfo from '../meeting-info';
|
|
@@ -45,12 +53,13 @@ import MeetingInfoV2 from '../meeting-info/meeting-info-v2';
|
|
|
45
53
|
import Meeting from '../meeting';
|
|
46
54
|
import PersonalMeetingRoom from '../personal-meeting-room';
|
|
47
55
|
import Reachability from '../reachability';
|
|
48
|
-
import Request from '
|
|
56
|
+
import Request from './request';
|
|
49
57
|
import PasswordError from '../common/errors/password-error';
|
|
50
58
|
import CaptchaError from '../common/errors/captcha-error';
|
|
51
59
|
|
|
52
60
|
import MeetingCollection from './collection';
|
|
53
61
|
import MeetingsUtil from './util';
|
|
62
|
+
import PermissionError from '../common/errors/permission';
|
|
54
63
|
|
|
55
64
|
let mediaLogger;
|
|
56
65
|
|
|
@@ -80,21 +89,21 @@ class MediaLogger {
|
|
|
80
89
|
}
|
|
81
90
|
}
|
|
82
91
|
/**
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
92
|
+
* Meetings Ready Event
|
|
93
|
+
* Emitted when the meetings instance on webex is ready
|
|
94
|
+
* @event meetings:ready
|
|
95
|
+
* @instance
|
|
96
|
+
* @memberof Meetings
|
|
97
|
+
*/
|
|
89
98
|
|
|
90
99
|
/**
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
100
|
+
* Meetings Network Disconnected Event
|
|
101
|
+
* Emitted when the meetings instance is disconnected from
|
|
102
|
+
* the internal mercury server
|
|
103
|
+
* @event network:disconnected
|
|
104
|
+
* @instance
|
|
105
|
+
* @memberof Meetings
|
|
106
|
+
*/
|
|
98
107
|
|
|
99
108
|
/**
|
|
100
109
|
* Meetings Registered Event
|
|
@@ -105,32 +114,32 @@ class MediaLogger {
|
|
|
105
114
|
*/
|
|
106
115
|
|
|
107
116
|
/**
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
117
|
+
* Meeting Removed Event
|
|
118
|
+
* Emitted when a meeting was removed from the cache of meetings
|
|
119
|
+
* @event meeting:removed
|
|
120
|
+
* @instance
|
|
121
|
+
* @type {Object}
|
|
122
|
+
* @property {String} meetingId the removed meeting
|
|
123
|
+
* @property {Object} response the server response
|
|
124
|
+
* @property {String} type what type of meeting it was
|
|
125
|
+
* @memberof Meetings
|
|
126
|
+
*/
|
|
118
127
|
|
|
119
128
|
/**
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
+
* Meeting Added Event
|
|
130
|
+
* Emitted when a meeting was added to the cache of meetings
|
|
131
|
+
* @event meeting:added
|
|
132
|
+
* @instance
|
|
133
|
+
* @type {Object}
|
|
134
|
+
* @property {String} meetingId the added meeting
|
|
135
|
+
* @property {String} type what type of meeting it was
|
|
136
|
+
* @memberof Meetings
|
|
137
|
+
*/
|
|
129
138
|
|
|
130
139
|
/**
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
140
|
+
* Maintain a cache of meetings and sync with services.
|
|
141
|
+
* @class
|
|
142
|
+
*/
|
|
134
143
|
export default class Meetings extends WebexPlugin {
|
|
135
144
|
loggerRequest: any;
|
|
136
145
|
media: any;
|
|
@@ -142,120 +151,272 @@ export default class Meetings extends WebexPlugin {
|
|
|
142
151
|
request: any;
|
|
143
152
|
geoHintInfo: any;
|
|
144
153
|
meetingInfo: any;
|
|
145
|
-
|
|
154
|
+
mediaHelpers: any;
|
|
155
|
+
breakoutLocusForHandleLater: any;
|
|
146
156
|
namespace = MEETINGS;
|
|
147
157
|
|
|
148
158
|
/**
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
159
|
+
* Initializes the Meetings Plugin
|
|
160
|
+
* @constructor
|
|
161
|
+
* @public
|
|
162
|
+
* @memberof Meetings
|
|
163
|
+
*/
|
|
154
164
|
constructor(...args) {
|
|
155
165
|
super(...args);
|
|
156
166
|
|
|
157
167
|
/**
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
168
|
+
* The webrtc-core media helpers. This is a temporary solution required for the SDK sample app
|
|
169
|
+
* to be able to call media helper functions.
|
|
170
|
+
*
|
|
171
|
+
* @instance
|
|
172
|
+
* @type {Object}
|
|
173
|
+
* @private
|
|
174
|
+
* @memberof Meetings
|
|
175
|
+
*/
|
|
176
|
+
this.mediaHelpers = mediaHelpersModule;
|
|
177
|
+
|
|
178
|
+
/**
|
|
179
|
+
* The Meetings request to interact with server
|
|
180
|
+
* @instance
|
|
181
|
+
* @type {Object}
|
|
182
|
+
* @private
|
|
183
|
+
* @memberof Meetings
|
|
184
|
+
*/
|
|
164
185
|
// @ts-ignore
|
|
165
186
|
this.request = new Request({}, {parent: this.webex});
|
|
166
187
|
/**
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
188
|
+
* Log upload request helper
|
|
189
|
+
* @instance
|
|
190
|
+
* @type {Object}
|
|
191
|
+
* @private
|
|
192
|
+
* @memberof Meetings
|
|
193
|
+
*/
|
|
173
194
|
// @ts-ignore
|
|
174
195
|
this.loggerRequest = new LoggerRequest({webex: this.webex});
|
|
175
196
|
this.meetingCollection = new MeetingCollection();
|
|
176
197
|
/**
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
198
|
+
* The PersonalMeetingRoom object to interact with server
|
|
199
|
+
* @instance
|
|
200
|
+
* @type {Object}
|
|
201
|
+
* @public
|
|
202
|
+
* @memberof Meetings
|
|
203
|
+
*/
|
|
183
204
|
this.personalMeetingRoom = null;
|
|
184
205
|
/**
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
206
|
+
* The Reachability object to interact with server, starts as null until {@link Meeting#setReachability} is called
|
|
207
|
+
* starts as null
|
|
208
|
+
* @instance
|
|
209
|
+
* @type {Object}
|
|
210
|
+
* @private
|
|
211
|
+
* @memberof Meetings
|
|
212
|
+
*/
|
|
192
213
|
this.reachability = null;
|
|
193
214
|
|
|
194
215
|
/**
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
216
|
+
* If the meetings plugin has been registered and listening via {@link Meetings#register}
|
|
217
|
+
* @instance
|
|
218
|
+
* @type {Boolean}
|
|
219
|
+
* @public
|
|
220
|
+
* @memberof Meetings
|
|
221
|
+
*/
|
|
201
222
|
this.registered = false;
|
|
202
223
|
|
|
203
224
|
/**
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
225
|
+
* This values indicates the preferred webex site the user will start there meeting, getsits value from {@link Meetings#register}
|
|
226
|
+
* @instance
|
|
227
|
+
* @type {String}
|
|
228
|
+
* @private
|
|
229
|
+
* @memberof Meetings
|
|
230
|
+
*/
|
|
210
231
|
this.preferredWebexSite = '';
|
|
211
232
|
|
|
212
233
|
/**
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
234
|
+
* The public interface for the internal Media util files. These are helpful to expose outside the context
|
|
235
|
+
* of a meeting so that a user can access media without creating a meeting instance.
|
|
236
|
+
* @instance
|
|
237
|
+
* @type {Object}
|
|
238
|
+
* @private
|
|
239
|
+
* @memberof Meetings
|
|
240
|
+
*/
|
|
220
241
|
this.media = {
|
|
221
242
|
getUserMedia: Media.getUserMedia,
|
|
222
|
-
getSupportedDevice: Media.getSupportedDevice
|
|
243
|
+
getSupportedDevice: Media.getSupportedDevice,
|
|
223
244
|
};
|
|
224
245
|
|
|
225
246
|
this.onReady();
|
|
226
247
|
}
|
|
227
248
|
|
|
228
249
|
/**
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
250
|
+
* check whether you need to handle this main session's locus data or not
|
|
251
|
+
* @param {Object} meeting current meeting data
|
|
252
|
+
* @param {Object} newLocus new locus data
|
|
253
|
+
* @returns {boolean}
|
|
254
|
+
* @private
|
|
255
|
+
* @memberof Meetings
|
|
256
|
+
*/
|
|
257
|
+
private isNeedHandleMainLocus(meeting: any, newLocus: any) {
|
|
258
|
+
const breakoutUrl = newLocus.controls?.breakout?.url;
|
|
259
|
+
const breakoutLocus = this.meetingCollection.getActiveBreakoutLocus(breakoutUrl);
|
|
260
|
+
|
|
261
|
+
const isSelfJoined = newLocus?.self?.state === _JOINED_;
|
|
262
|
+
const isSelfMoved = newLocus?.self?.state === _LEFT_ && newLocus?.self?.reason === _MOVED_;
|
|
263
|
+
// @ts-ignore
|
|
264
|
+
const deviceFromNewLocus = MeetingsUtil.getThisDevice(newLocus, this.webex.internal.device.url);
|
|
265
|
+
const isNewLocusJoinThisDevice = MeetingsUtil.joinedOnThisDevice(
|
|
266
|
+
meeting,
|
|
267
|
+
newLocus,
|
|
268
|
+
// @ts-ignore
|
|
269
|
+
this.webex.internal.device.url
|
|
270
|
+
);
|
|
271
|
+
const isBreakoutLocusJoinThisDevice =
|
|
272
|
+
breakoutLocus?.joinedWith?.correlationId &&
|
|
273
|
+
breakoutLocus.joinedWith.correlationId === meeting?.correlationId;
|
|
241
274
|
|
|
275
|
+
if (isSelfJoined && isNewLocusJoinThisDevice) {
|
|
276
|
+
LoggerProxy.logger.log(
|
|
277
|
+
'Meetings:index#isNeedHandleMainLocus --> self this device shown as JOINED in the main session'
|
|
278
|
+
);
|
|
279
|
+
if (breakoutLocus?.joinedWith && deviceFromNewLocus) {
|
|
280
|
+
const breakoutReplaceAt =
|
|
281
|
+
breakoutLocus.joinedWith.replaces?.length > 0
|
|
282
|
+
? breakoutLocus.joinedWith.replaces[0].replaceAt
|
|
283
|
+
: '';
|
|
284
|
+
const newLocusReplaceAt =
|
|
285
|
+
deviceFromNewLocus.replaces?.length > 0 ? deviceFromNewLocus.replaces[0].replaceAt : '';
|
|
286
|
+
if (breakoutReplaceAt && newLocusReplaceAt && breakoutReplaceAt > newLocusReplaceAt) {
|
|
287
|
+
LoggerProxy.logger.log(
|
|
288
|
+
`Meetings:index#isNeedHandleMainLocus --> this is expired main joined status locus_dto replacedAt ${newLocusReplaceAt} bo replacedAt ${breakoutReplaceAt}`
|
|
289
|
+
);
|
|
290
|
+
|
|
291
|
+
return false;
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
return true;
|
|
296
|
+
}
|
|
297
|
+
if (isBreakoutLocusJoinThisDevice) {
|
|
298
|
+
LoggerProxy.logger.log(
|
|
299
|
+
`Meetings:index#isNeedHandleMainLocus --> there is active breakout session and joined on this device, and don't need to handle main session: ${breakoutUrl}`
|
|
300
|
+
);
|
|
301
|
+
|
|
302
|
+
return false;
|
|
303
|
+
}
|
|
304
|
+
if (isSelfMoved && newLocus?.self?.removed) {
|
|
305
|
+
LoggerProxy.logger.log(
|
|
306
|
+
'Meetings:index#isNeedHandleMainLocus --> self moved main locus with self removed status, not need to handle'
|
|
307
|
+
);
|
|
308
|
+
|
|
309
|
+
return false;
|
|
310
|
+
}
|
|
311
|
+
LoggerProxy.logger.log(
|
|
312
|
+
'Meetings:index#isNeedHandleMainLocus --> this is a normal main session locusDTO update case'
|
|
313
|
+
);
|
|
314
|
+
|
|
315
|
+
return true;
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
/**
|
|
319
|
+
* check whether you need to handle this locus data or not
|
|
320
|
+
* @param {Object} meeting old locus data
|
|
321
|
+
* @param {Object} newLocus new locus data
|
|
322
|
+
* @returns {boolean}
|
|
323
|
+
* @private
|
|
324
|
+
* @memberof Meetings
|
|
325
|
+
*/
|
|
326
|
+
private isNeedHandleLocusDTO(meeting: any, newLocus: any) {
|
|
327
|
+
if (newLocus) {
|
|
328
|
+
const isNewLocusAsBreakout = MeetingsUtil.isBreakoutLocusDTO(newLocus);
|
|
329
|
+
const isSelfMoved = newLocus?.self?.state === _LEFT_ && newLocus?.self?.reason === _MOVED_;
|
|
330
|
+
if (!meeting) {
|
|
331
|
+
if (isNewLocusAsBreakout) {
|
|
332
|
+
LoggerProxy.logger.log(
|
|
333
|
+
`Meetings:index#isNeedHandleLocusDTO --> the first breakout session locusDTO active status: ${newLocus.fullState?.active}`
|
|
334
|
+
);
|
|
335
|
+
|
|
336
|
+
return newLocus.self?.state === _JOINED_;
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
return this.isNeedHandleMainLocus(meeting, newLocus);
|
|
340
|
+
}
|
|
341
|
+
if (!isNewLocusAsBreakout) {
|
|
342
|
+
return this.isNeedHandleMainLocus(meeting, newLocus);
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
return !isSelfMoved;
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
return true;
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
/**
|
|
352
|
+
* get corresponding meeting object by locus data
|
|
353
|
+
* @param {Object} data a locus event
|
|
354
|
+
* @param {String} data.locusUrl
|
|
355
|
+
* @param {Object} data.locus
|
|
356
|
+
* @returns {Object}
|
|
357
|
+
* @private
|
|
358
|
+
* @memberof Meetings
|
|
359
|
+
*/
|
|
360
|
+
getCorrespondingMeetingByLocus(data) {
|
|
242
361
|
// getting meeting by correlationId. This will happen for the new event
|
|
243
362
|
// Either the locus
|
|
244
363
|
// TODO : Add check for the callBack Address
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
this.meetingCollection.getByKey(
|
|
249
|
-
|
|
364
|
+
return (
|
|
365
|
+
this.meetingCollection.getByKey(LOCUS_URL, data.locusUrl) ||
|
|
366
|
+
// @ts-ignore
|
|
367
|
+
this.meetingCollection.getByKey(
|
|
368
|
+
CORRELATION_ID,
|
|
369
|
+
// @ts-ignore
|
|
370
|
+
MeetingsUtil.checkForCorrelationId(this.webex.internal.device.url, data.locus)
|
|
371
|
+
) ||
|
|
372
|
+
this.meetingCollection.getByKey(
|
|
373
|
+
SIP_URI,
|
|
374
|
+
data.locus.self &&
|
|
375
|
+
data.locus.self.callbackInfo &&
|
|
376
|
+
data.locus.self.callbackInfo.callbackAddress
|
|
377
|
+
) ||
|
|
378
|
+
(data.locus.info?.isUnifiedSpaceMeeting
|
|
379
|
+
? undefined
|
|
380
|
+
: this.meetingCollection.getByKey(CONVERSATION_URL, data.locus.conversationUrl)) ||
|
|
381
|
+
this.meetingCollection.getByKey(MEETINGNUMBER, data.locus?.info?.webExMeetingId)
|
|
382
|
+
);
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
/**
|
|
386
|
+
* handle locus events and takes meeting actions with them as they come in
|
|
387
|
+
* @param {Object} data a locus event
|
|
388
|
+
* @param {String} data.locusUrl
|
|
389
|
+
* @param {Object} data.locus
|
|
390
|
+
* @param {Boolean} useRandomDelayForInfo whether a random delay should be added to fetching meeting info
|
|
391
|
+
* @param {String} data.eventType
|
|
392
|
+
* @returns {undefined}
|
|
393
|
+
* @private
|
|
394
|
+
* @memberof Meetings
|
|
395
|
+
*/
|
|
396
|
+
private handleLocusEvent(data: {locusUrl: string; locus: any}, useRandomDelayForInfo = false) {
|
|
397
|
+
let meeting = this.getCorrespondingMeetingByLocus(data);
|
|
250
398
|
|
|
251
399
|
// Special case when locus has got replaced, This only happend once if a replace locus exists
|
|
252
400
|
// https://sqbu-github.cisco.com/WebExSquared/locus/wiki/Locus-changing-mid-call
|
|
253
401
|
|
|
254
402
|
if (!meeting && data.locus?.replaces?.length > 0) {
|
|
255
403
|
// Always the last element in the replace is the active one
|
|
256
|
-
meeting = this.meetingCollection.getByKey(
|
|
404
|
+
meeting = this.meetingCollection.getByKey(
|
|
405
|
+
LOCUS_URL,
|
|
406
|
+
data.locus.replaces[data.locus.replaces.length - 1].locusUrl
|
|
407
|
+
);
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
if (meeting && !MeetingsUtil.isBreakoutLocusDTO(data.locus)) {
|
|
411
|
+
meeting.locusInfo.updateMainSessionLocusCache(data.locus);
|
|
257
412
|
}
|
|
413
|
+
if (!this.isNeedHandleLocusDTO(meeting, data.locus)) {
|
|
414
|
+
LoggerProxy.logger.log(
|
|
415
|
+
`Meetings:index#handleLocusEvent --> doesn't need to process locus event`
|
|
416
|
+
);
|
|
258
417
|
|
|
418
|
+
return;
|
|
419
|
+
}
|
|
259
420
|
if (!meeting) {
|
|
260
421
|
// TODO: create meeting when we get a meeting object
|
|
261
422
|
// const checkForEnded = (locus) => {
|
|
@@ -276,73 +437,93 @@ export default class Meetings extends WebexPlugin {
|
|
|
276
437
|
// };
|
|
277
438
|
// rather then locus object change to locus url
|
|
278
439
|
|
|
279
|
-
if (
|
|
440
|
+
if (
|
|
441
|
+
data.locus &&
|
|
442
|
+
data.locus.fullState &&
|
|
443
|
+
data.locus.fullState.state === LOCUS.STATE.INACTIVE
|
|
444
|
+
) {
|
|
280
445
|
// just ignore the event as its already ended and not active
|
|
281
|
-
LoggerProxy.logger.warn(
|
|
446
|
+
LoggerProxy.logger.warn(
|
|
447
|
+
'Meetings:index#handleLocusEvent --> Locus event received for meeting, after it was ended.'
|
|
448
|
+
);
|
|
282
449
|
|
|
283
450
|
return;
|
|
284
451
|
}
|
|
285
452
|
|
|
286
|
-
|
|
287
453
|
// When its wireless share or guest and user leaves the meeting we dont have to keep the meeting object
|
|
288
454
|
// Any future events will be neglected
|
|
289
455
|
|
|
290
|
-
if (
|
|
456
|
+
if (
|
|
457
|
+
data.locus &&
|
|
458
|
+
data.locus.self &&
|
|
459
|
+
data.locus.self.state === _LEFT_ &&
|
|
460
|
+
data.locus.self.removed === true
|
|
461
|
+
) {
|
|
291
462
|
// just ignore the event as its already ended and not active
|
|
292
|
-
LoggerProxy.logger.warn(
|
|
463
|
+
LoggerProxy.logger.warn(
|
|
464
|
+
'Meetings:index#handleLocusEvent --> Locus event received for meeting, after it was ended.'
|
|
465
|
+
);
|
|
293
466
|
|
|
294
467
|
return;
|
|
295
468
|
}
|
|
296
469
|
|
|
297
|
-
this.create(data.locus, _LOCUS_ID_, useRandomDelayForInfo)
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
470
|
+
this.create(data.locus, _LOCUS_ID_, useRandomDelayForInfo)
|
|
471
|
+
.then((newMeeting) => {
|
|
472
|
+
meeting = newMeeting;
|
|
473
|
+
|
|
474
|
+
// It's a new meeting so initialize the locus data
|
|
475
|
+
meeting.locusInfo.initialSetup(data.locus);
|
|
476
|
+
this.checkHandleBreakoutLocus(data.locus);
|
|
477
|
+
})
|
|
478
|
+
.catch((e) => {
|
|
479
|
+
LoggerProxy.logger.error(e);
|
|
480
|
+
})
|
|
305
481
|
.finally(() => {
|
|
306
482
|
// There will be cases where locus event comes in gets created and deleted because its a 1:1 and meeting gets deleted
|
|
307
483
|
// because the other user left so before sending 'added' event make sure it exists in the collection
|
|
308
484
|
|
|
309
485
|
if (this.getMeetingByType(_ID_, meeting.id)) {
|
|
310
|
-
Metrics.postEvent({
|
|
486
|
+
Metrics.postEvent({
|
|
487
|
+
event: eventType.REMOTE_STARTED,
|
|
488
|
+
meeting,
|
|
489
|
+
data: {trigger: trigger.MERCURY_EVENT},
|
|
490
|
+
});
|
|
311
491
|
Trigger.trigger(
|
|
312
492
|
this,
|
|
313
493
|
{
|
|
314
494
|
file: 'meetings',
|
|
315
|
-
function: 'handleLocusEvent'
|
|
495
|
+
function: 'handleLocusEvent',
|
|
316
496
|
},
|
|
317
497
|
EVENT_TRIGGERS.MEETING_ADDED,
|
|
318
498
|
{
|
|
319
499
|
meeting,
|
|
320
|
-
type: meeting.type === _MEETING_ ? _JOIN_ : _INCOMING_
|
|
500
|
+
type: meeting.type === _MEETING_ ? _JOIN_ : _INCOMING_,
|
|
321
501
|
}
|
|
322
502
|
);
|
|
323
|
-
}
|
|
324
|
-
else {
|
|
503
|
+
} else {
|
|
325
504
|
// Meeting got added but was not found in the collection. It might have got destroyed
|
|
326
|
-
LoggerProxy.logger.warn(
|
|
505
|
+
LoggerProxy.logger.warn(
|
|
506
|
+
'Meetings:index#handleLocusEvent --> Created and destroyed meeting object before sending an event'
|
|
507
|
+
);
|
|
327
508
|
}
|
|
328
509
|
});
|
|
329
|
-
}
|
|
330
|
-
else {
|
|
510
|
+
} else {
|
|
331
511
|
meeting.locusInfo.parse(meeting, data);
|
|
332
512
|
}
|
|
333
513
|
}
|
|
334
514
|
|
|
335
515
|
/**
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
private handleLocusMercury(envelope: {
|
|
516
|
+
* handles locus events through mercury that are not roap
|
|
517
|
+
* @param {Object} envelope
|
|
518
|
+
* @param {Object} envelope.data
|
|
519
|
+
* @param {String} envelope.data.eventType
|
|
520
|
+
* @returns {undefined}
|
|
521
|
+
* @private
|
|
522
|
+
* @memberof Meetings
|
|
523
|
+
*/
|
|
524
|
+
private handleLocusMercury(envelope: {data: any}) {
|
|
345
525
|
const {data} = envelope;
|
|
526
|
+
// eslint-disable-next-line @typescript-eslint/no-shadow
|
|
346
527
|
const {eventType} = data;
|
|
347
528
|
|
|
348
529
|
if (eventType && eventType !== LOCUSEVENT.MESSAGE_ROAP) {
|
|
@@ -350,31 +531,29 @@ export default class Meetings extends WebexPlugin {
|
|
|
350
531
|
}
|
|
351
532
|
}
|
|
352
533
|
|
|
353
|
-
|
|
354
534
|
/**
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
535
|
+
* handles mecury offline event
|
|
536
|
+
* @returns {undefined}
|
|
537
|
+
* @private
|
|
538
|
+
* @memberof Meetings
|
|
539
|
+
*/
|
|
360
540
|
private handleMercuryOffline() {
|
|
361
541
|
Trigger.trigger(
|
|
362
542
|
this,
|
|
363
543
|
{
|
|
364
544
|
file: 'meetings/index',
|
|
365
|
-
function: 'handleMercuryOffline'
|
|
545
|
+
function: 'handleMercuryOffline',
|
|
366
546
|
},
|
|
367
|
-
EVENT_TRIGGERS.MEETINGS_NETWORK_DISCONNECTED
|
|
547
|
+
EVENT_TRIGGERS.MEETINGS_NETWORK_DISCONNECTED
|
|
368
548
|
);
|
|
369
549
|
}
|
|
370
550
|
|
|
371
|
-
|
|
372
551
|
/**
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
552
|
+
* registers for locus and roap mercury events
|
|
553
|
+
* @returns {undefined}
|
|
554
|
+
* @private
|
|
555
|
+
* @memberof Meetings
|
|
556
|
+
*/
|
|
378
557
|
private listenForEvents() {
|
|
379
558
|
// @ts-ignore
|
|
380
559
|
this.webex.internal.mercury.on(LOCUSEVENT.LOCUS_MERCURY, (envelope) => {
|
|
@@ -397,11 +576,11 @@ export default class Meetings extends WebexPlugin {
|
|
|
397
576
|
}
|
|
398
577
|
|
|
399
578
|
/**
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
579
|
+
* stops listening for locus and roap mercury events
|
|
580
|
+
* @returns {undefined}
|
|
581
|
+
* @private
|
|
582
|
+
* @memberof Meetings
|
|
583
|
+
*/
|
|
405
584
|
private stopListeningForEvents() {
|
|
406
585
|
// @ts-ignore
|
|
407
586
|
this.webex.internal.mercury.off(LOCUSEVENT.LOCUS_MERCURY);
|
|
@@ -412,10 +591,10 @@ export default class Meetings extends WebexPlugin {
|
|
|
412
591
|
}
|
|
413
592
|
|
|
414
593
|
/**
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
594
|
+
* @returns {undefined}
|
|
595
|
+
* @private
|
|
596
|
+
* @memberof Meetings
|
|
597
|
+
*/
|
|
419
598
|
private onReady() {
|
|
420
599
|
// @ts-ignore
|
|
421
600
|
this.webex.once(READY, () => {
|
|
@@ -427,7 +606,7 @@ export default class Meetings extends WebexPlugin {
|
|
|
427
606
|
LoggerProxy.set(this.webex.logger);
|
|
428
607
|
|
|
429
608
|
mediaLogger = new MediaLogger();
|
|
430
|
-
|
|
609
|
+
setLogger(mediaLogger);
|
|
431
610
|
|
|
432
611
|
/**
|
|
433
612
|
* The MeetingInfo object to interact with server
|
|
@@ -437,15 +616,23 @@ export default class Meetings extends WebexPlugin {
|
|
|
437
616
|
* @memberof Meetings
|
|
438
617
|
*/
|
|
439
618
|
// @ts-ignore
|
|
440
|
-
this.meetingInfo = this.config.experimental.enableUnifiedMeetings
|
|
619
|
+
this.meetingInfo = this.config.experimental.enableUnifiedMeetings
|
|
620
|
+
? // @ts-ignore
|
|
621
|
+
new MeetingInfoV2(this.webex)
|
|
622
|
+
: // @ts-ignore
|
|
623
|
+
new MeetingInfo(this.webex);
|
|
441
624
|
// @ts-ignore
|
|
442
|
-
this.personalMeetingRoom = new PersonalMeetingRoom(
|
|
625
|
+
this.personalMeetingRoom = new PersonalMeetingRoom(
|
|
626
|
+
{meetingInfo: this.meetingInfo},
|
|
627
|
+
// @ts-ignore
|
|
628
|
+
{parent: this.webex}
|
|
629
|
+
);
|
|
443
630
|
|
|
444
631
|
Trigger.trigger(
|
|
445
632
|
this,
|
|
446
633
|
{
|
|
447
634
|
file: 'meetings',
|
|
448
|
-
function: 'onReady'
|
|
635
|
+
function: 'onReady',
|
|
449
636
|
},
|
|
450
637
|
EVENT_TRIGGERS.MEETINGS_READY
|
|
451
638
|
);
|
|
@@ -457,12 +644,12 @@ export default class Meetings extends WebexPlugin {
|
|
|
457
644
|
}
|
|
458
645
|
|
|
459
646
|
/**
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
647
|
+
* API to toggle unified meetings
|
|
648
|
+
* @param {Boolean} changeState
|
|
649
|
+
* @private
|
|
650
|
+
* @memberof Meetings
|
|
651
|
+
* @returns {undefined}
|
|
652
|
+
*/
|
|
466
653
|
private _toggleUnifiedMeetings(changeState: boolean) {
|
|
467
654
|
if (typeof changeState !== 'boolean') {
|
|
468
655
|
return;
|
|
@@ -477,12 +664,12 @@ export default class Meetings extends WebexPlugin {
|
|
|
477
664
|
}
|
|
478
665
|
|
|
479
666
|
/**
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
667
|
+
* API to enable or disable TURN discovery
|
|
668
|
+
* @param {Boolean} enable
|
|
669
|
+
* @private
|
|
670
|
+
* @memberof Meetings
|
|
671
|
+
* @returns {undefined}
|
|
672
|
+
*/
|
|
486
673
|
private _toggleTurnDiscovery(enable: boolean) {
|
|
487
674
|
if (typeof enable !== 'boolean') {
|
|
488
675
|
return;
|
|
@@ -492,12 +679,12 @@ export default class Meetings extends WebexPlugin {
|
|
|
492
679
|
}
|
|
493
680
|
|
|
494
681
|
/**
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
682
|
+
* API to toggle starting adhoc meeting
|
|
683
|
+
* @param {Boolean} changeState
|
|
684
|
+
* @private
|
|
685
|
+
* @memberof Meetings
|
|
686
|
+
* @returns {undefined}
|
|
687
|
+
*/
|
|
501
688
|
private _toggleAdhocMeetings(changeState: boolean) {
|
|
502
689
|
if (typeof changeState !== 'boolean') {
|
|
503
690
|
return;
|
|
@@ -510,24 +697,27 @@ export default class Meetings extends WebexPlugin {
|
|
|
510
697
|
}
|
|
511
698
|
|
|
512
699
|
/**
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
700
|
+
* Explicitly sets up the meetings plugin by registering
|
|
701
|
+
* the device, connecting to mercury, and listening for locus events.
|
|
702
|
+
*
|
|
703
|
+
* @returns {Promise}
|
|
704
|
+
* @public
|
|
705
|
+
* @memberof Meetings
|
|
706
|
+
*/
|
|
520
707
|
public register() {
|
|
521
708
|
// @ts-ignore
|
|
522
709
|
if (!this.webex.canAuthorize) {
|
|
523
|
-
LoggerProxy.logger.error(
|
|
710
|
+
LoggerProxy.logger.error(
|
|
711
|
+
'Meetings:index#register --> ERROR, Unable to register, SDK cannot authorize'
|
|
712
|
+
);
|
|
524
713
|
|
|
525
714
|
return Promise.reject(new Error('SDK cannot authorize'));
|
|
526
715
|
}
|
|
527
716
|
|
|
528
|
-
|
|
529
717
|
if (this.registered) {
|
|
530
|
-
LoggerProxy.logger.info(
|
|
718
|
+
LoggerProxy.logger.info(
|
|
719
|
+
'Meetings:index#register --> INFO, Meetings plugin already registered'
|
|
720
|
+
);
|
|
531
721
|
|
|
532
722
|
return Promise.resolve();
|
|
533
723
|
}
|
|
@@ -539,88 +729,97 @@ export default class Meetings extends WebexPlugin {
|
|
|
539
729
|
LoggerProxy.logger.error(`Meetings:index#register --> GDM error, ${error.message}`);
|
|
540
730
|
}),
|
|
541
731
|
// @ts-ignore
|
|
542
|
-
this.webex.internal.device
|
|
543
|
-
|
|
544
|
-
|
|
732
|
+
this.webex.internal.device
|
|
733
|
+
.register()
|
|
734
|
+
// @ts-ignore
|
|
735
|
+
.then(() =>
|
|
736
|
+
LoggerProxy.logger.info(
|
|
737
|
+
// @ts-ignore
|
|
738
|
+
`Meetings:index#register --> INFO, Device registered ${this.webex.internal.device.url}`
|
|
739
|
+
)
|
|
740
|
+
)
|
|
545
741
|
// @ts-ignore
|
|
546
742
|
.then(() => this.webex.internal.mercury.connect()),
|
|
547
|
-
MeetingsUtil.checkH264Support.call(this)
|
|
548
|
-
])
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
file: 'meetings',
|
|
554
|
-
function: 'register'
|
|
555
|
-
},
|
|
556
|
-
EVENT_TRIGGERS.MEETINGS_REGISTERED
|
|
557
|
-
);
|
|
558
|
-
this.registered = true;
|
|
559
|
-
Metrics.sendBehavioralMetric(
|
|
560
|
-
BEHAVIORAL_METRICS.MEETINGS_REGISTRATION_SUCCESS,
|
|
561
|
-
);
|
|
562
|
-
})
|
|
563
|
-
.catch((error) => {
|
|
564
|
-
LoggerProxy.logger.error(`Meetings:index#register --> ERROR, Unable to register, ${error.message}`);
|
|
565
|
-
|
|
566
|
-
Metrics.sendBehavioralMetric(
|
|
567
|
-
BEHAVIORAL_METRICS.MEETINGS_REGISTRATION_FAILED,
|
|
743
|
+
MeetingsUtil.checkH264Support.call(this),
|
|
744
|
+
])
|
|
745
|
+
.then(() => {
|
|
746
|
+
this.listenForEvents();
|
|
747
|
+
Trigger.trigger(
|
|
748
|
+
this,
|
|
568
749
|
{
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
}
|
|
750
|
+
file: 'meetings',
|
|
751
|
+
function: 'register',
|
|
752
|
+
},
|
|
753
|
+
EVENT_TRIGGERS.MEETINGS_REGISTERED
|
|
754
|
+
);
|
|
755
|
+
this.registered = true;
|
|
756
|
+
Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.MEETINGS_REGISTRATION_SUCCESS);
|
|
757
|
+
})
|
|
758
|
+
.catch((error) => {
|
|
759
|
+
LoggerProxy.logger.error(
|
|
760
|
+
`Meetings:index#register --> ERROR, Unable to register, ${error.message}`
|
|
572
761
|
);
|
|
573
762
|
|
|
763
|
+
Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.MEETINGS_REGISTRATION_FAILED, {
|
|
764
|
+
reason: error.message,
|
|
765
|
+
stack: error.stack,
|
|
766
|
+
});
|
|
767
|
+
|
|
574
768
|
return Promise.reject(error);
|
|
575
769
|
});
|
|
576
770
|
}
|
|
577
771
|
|
|
578
772
|
/**
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
773
|
+
* Explicitly tears down the meetings plugin by deregistering
|
|
774
|
+
* the device, disconnecting from mercury, and stops listening to locus events
|
|
775
|
+
*
|
|
776
|
+
* @returns {Promise}
|
|
777
|
+
* @public
|
|
778
|
+
* @memberof Meetings
|
|
779
|
+
*/
|
|
586
780
|
unregister() {
|
|
587
781
|
if (!this.registered) {
|
|
588
|
-
LoggerProxy.logger.info(
|
|
782
|
+
LoggerProxy.logger.info(
|
|
783
|
+
'Meetings:index#unregister --> INFO, Meetings plugin already unregistered'
|
|
784
|
+
);
|
|
589
785
|
|
|
590
786
|
return Promise.resolve();
|
|
591
787
|
}
|
|
592
788
|
|
|
593
789
|
this.stopListeningForEvents();
|
|
594
790
|
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
791
|
+
return (
|
|
792
|
+
// @ts-ignore
|
|
793
|
+
this.webex.internal.mercury
|
|
794
|
+
.disconnect()
|
|
795
|
+
// @ts-ignore
|
|
796
|
+
.then(() => this.webex.internal.device.unregister())
|
|
797
|
+
.then(() => {
|
|
798
|
+
Trigger.trigger(
|
|
799
|
+
this,
|
|
800
|
+
{
|
|
801
|
+
file: 'meetings',
|
|
802
|
+
function: 'unregister',
|
|
803
|
+
},
|
|
804
|
+
EVENT_TRIGGERS.MEETINGS_UNREGISTERED
|
|
805
|
+
);
|
|
806
|
+
this.registered = false;
|
|
807
|
+
})
|
|
808
|
+
);
|
|
610
809
|
}
|
|
611
810
|
|
|
612
811
|
/**
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
812
|
+
* Uploads logs to the webex services for tracking
|
|
813
|
+
* @param {Object} [options={}]
|
|
814
|
+
* @param {String} [options.callStart] Call Start Time
|
|
815
|
+
* @param {String} [options.feedbackId] ID used for tracking
|
|
816
|
+
* @param {String} [options.locusId]
|
|
817
|
+
* @param {String} [options.correlationId]
|
|
818
|
+
* @param {String} [options.meetingId] webex meeting ID
|
|
819
|
+
* @param {String} [options.userId] userId
|
|
820
|
+
* @param {String} [options.orgId] org id
|
|
821
|
+
* @returns {String} feedback ID logs were submitted under
|
|
822
|
+
*/
|
|
624
823
|
uploadLogs(
|
|
625
824
|
options: {
|
|
626
825
|
callStart?: string;
|
|
@@ -634,79 +833,83 @@ export default class Meetings extends WebexPlugin {
|
|
|
634
833
|
) {
|
|
635
834
|
LoggerProxy.logger.info('Meetings:index#uploadLogs --> uploading logs');
|
|
636
835
|
|
|
637
|
-
return this.loggerRequest
|
|
836
|
+
return this.loggerRequest
|
|
837
|
+
.uploadLogs(options)
|
|
638
838
|
.then((uploadResult) => {
|
|
639
|
-
LoggerProxy.logger.info(
|
|
839
|
+
LoggerProxy.logger.info(
|
|
840
|
+
'Meetings:index#uploadLogs --> Upload logs for meeting completed.',
|
|
841
|
+
uploadResult
|
|
842
|
+
);
|
|
640
843
|
Trigger.trigger(
|
|
641
844
|
this,
|
|
642
845
|
{
|
|
643
846
|
file: 'meetings',
|
|
644
|
-
function: 'uploadLogs'
|
|
847
|
+
function: 'uploadLogs',
|
|
645
848
|
},
|
|
646
849
|
EVENT_TRIGGERS.MEETING_LOG_UPLOAD_SUCCESS,
|
|
647
850
|
{
|
|
648
851
|
meetingId: options.meetingId,
|
|
649
|
-
details: uploadResult
|
|
852
|
+
details: uploadResult,
|
|
650
853
|
}
|
|
651
854
|
);
|
|
652
855
|
|
|
653
856
|
return uploadResult;
|
|
654
857
|
})
|
|
655
858
|
.catch((uploadError) => {
|
|
656
|
-
LoggerProxy.logger.error(
|
|
859
|
+
LoggerProxy.logger.error(
|
|
860
|
+
'Meetings:index#uploadLogs --> Unable to upload logs for meeting',
|
|
861
|
+
uploadError
|
|
862
|
+
);
|
|
657
863
|
Trigger.trigger(
|
|
658
864
|
this,
|
|
659
865
|
{
|
|
660
866
|
file: 'meetings',
|
|
661
|
-
function: 'uploadLogs'
|
|
867
|
+
function: 'uploadLogs',
|
|
662
868
|
},
|
|
663
869
|
EVENT_TRIGGERS.MEETING_LOG_UPLOAD_FAILURE,
|
|
664
870
|
{
|
|
665
871
|
meetingId: options.meetingId,
|
|
666
|
-
reason: uploadError
|
|
872
|
+
reason: uploadError,
|
|
667
873
|
}
|
|
668
874
|
);
|
|
669
875
|
|
|
670
|
-
Metrics.sendBehavioralMetric(
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
code: uploadError.code
|
|
678
|
-
}
|
|
679
|
-
);
|
|
876
|
+
Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.UPLOAD_LOGS_FAILURE, {
|
|
877
|
+
// @ts-ignore - seems like typo
|
|
878
|
+
meetingId: options.meetingsId,
|
|
879
|
+
reason: uploadError.message,
|
|
880
|
+
stack: uploadError.stack,
|
|
881
|
+
code: uploadError.code,
|
|
882
|
+
});
|
|
680
883
|
});
|
|
681
884
|
}
|
|
682
885
|
|
|
683
886
|
/**
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
887
|
+
* initializes the reachability instance for Meetings
|
|
888
|
+
* @returns {undefined}
|
|
889
|
+
* @public
|
|
890
|
+
* @memberof Meetings
|
|
891
|
+
*/
|
|
689
892
|
setReachability() {
|
|
690
893
|
// @ts-ignore
|
|
691
894
|
this.reachability = new Reachability(this.webex);
|
|
692
895
|
}
|
|
693
896
|
|
|
694
897
|
/**
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
898
|
+
* gets the reachability instance for Meetings
|
|
899
|
+
* @returns {Reachability}
|
|
900
|
+
* @public
|
|
901
|
+
* @memberof Meetings
|
|
902
|
+
*/
|
|
700
903
|
getReachability() {
|
|
701
904
|
return this.reachability;
|
|
702
905
|
}
|
|
703
906
|
|
|
704
907
|
/**
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
908
|
+
* initializes and starts gathering reachability for Meetings
|
|
909
|
+
* @returns {Promise}
|
|
910
|
+
* @public
|
|
911
|
+
* @memberof Meetings
|
|
912
|
+
*/
|
|
710
913
|
startReachability() {
|
|
711
914
|
if (!this.reachability) {
|
|
712
915
|
this.setReachability();
|
|
@@ -716,11 +919,11 @@ export default class Meetings extends WebexPlugin {
|
|
|
716
919
|
}
|
|
717
920
|
|
|
718
921
|
/**
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
922
|
+
* Get geoHint for info for meetings
|
|
923
|
+
* @returns {Promise}
|
|
924
|
+
* @private
|
|
925
|
+
* @memberof Meetings
|
|
926
|
+
*/
|
|
724
927
|
getGeoHint() {
|
|
725
928
|
return this.request.fetchGeoHint().then((res) => {
|
|
726
929
|
this.geoHintInfo = res;
|
|
@@ -728,39 +931,62 @@ export default class Meetings extends WebexPlugin {
|
|
|
728
931
|
}
|
|
729
932
|
|
|
730
933
|
/**
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
934
|
+
* Fetch user preferred webex site information
|
|
935
|
+
* This also has other infomation about the user
|
|
936
|
+
* @returns {Promise}
|
|
937
|
+
* @private
|
|
938
|
+
* @memberof Meetings
|
|
939
|
+
*/
|
|
737
940
|
fetchUserPreferredWebexSite() {
|
|
738
941
|
return this.request.getMeetingPreferences().then((res) => {
|
|
739
942
|
if (res) {
|
|
740
943
|
this.preferredWebexSite = MeetingsUtil.parseDefaultSiteFromMeetingPreferences(res);
|
|
741
944
|
}
|
|
945
|
+
|
|
946
|
+
// fall back to getting the preferred site from the user information
|
|
947
|
+
if (!this.preferredWebexSite) {
|
|
948
|
+
// @ts-ignore
|
|
949
|
+
return this.webex.internal.user
|
|
950
|
+
.get()
|
|
951
|
+
.then((user) => {
|
|
952
|
+
const preferredWebexSite =
|
|
953
|
+
user?.userPreferences?.userPreferencesItems?.preferredWebExSite;
|
|
954
|
+
if (preferredWebexSite) {
|
|
955
|
+
this.preferredWebexSite = preferredWebexSite;
|
|
956
|
+
} else {
|
|
957
|
+
throw new Error('site not found');
|
|
958
|
+
}
|
|
959
|
+
})
|
|
960
|
+
.catch(() => {
|
|
961
|
+
LoggerProxy.logger.error(
|
|
962
|
+
'Failed to fetch preferred site from user - no site will be set'
|
|
963
|
+
);
|
|
964
|
+
});
|
|
965
|
+
}
|
|
966
|
+
|
|
967
|
+
return Promise.resolve();
|
|
742
968
|
});
|
|
743
969
|
}
|
|
744
970
|
|
|
745
971
|
/**
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
|
|
972
|
+
* gets the personal meeting room instance, for saved PMR values for this user
|
|
973
|
+
* @returns {PersonalMeetingRoom}
|
|
974
|
+
* @public
|
|
975
|
+
* @memberof Meetings
|
|
976
|
+
*/
|
|
751
977
|
|
|
752
978
|
getPersonalMeetingRoom() {
|
|
753
979
|
return this.personalMeetingRoom;
|
|
754
980
|
}
|
|
755
981
|
|
|
756
982
|
/**
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
983
|
+
* @param {Meeting} meeting
|
|
984
|
+
* @param {Object} reason
|
|
985
|
+
* @param {String} type
|
|
986
|
+
* @returns {Undefined}
|
|
987
|
+
* @private
|
|
988
|
+
* @memberof Meetings
|
|
989
|
+
*/
|
|
764
990
|
private destroy(meeting: Meeting, reason: object) {
|
|
765
991
|
MeetingUtil.cleanUp(meeting);
|
|
766
992
|
this.meetingCollection.delete(meeting.id);
|
|
@@ -768,68 +994,82 @@ export default class Meetings extends WebexPlugin {
|
|
|
768
994
|
this,
|
|
769
995
|
{
|
|
770
996
|
file: 'meetings',
|
|
771
|
-
function: 'destroy'
|
|
997
|
+
function: 'destroy',
|
|
772
998
|
},
|
|
773
999
|
EVENT_TRIGGERS.MEETING_REMOVED,
|
|
774
1000
|
{
|
|
775
1001
|
meetingId: meeting.id,
|
|
776
|
-
reason
|
|
1002
|
+
reason,
|
|
777
1003
|
}
|
|
778
1004
|
);
|
|
779
1005
|
}
|
|
780
1006
|
|
|
781
1007
|
/**
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
|
|
1008
|
+
* Create a meeting.
|
|
1009
|
+
* @param {string} destination - sipURL, spaceId, phonenumber, or locus object}
|
|
1010
|
+
* @param {string} [type] - the optional specified type, such as locusId
|
|
1011
|
+
* @param {Boolean} useRandomDelayForInfo - whether a random delay should be added to fetching meeting info
|
|
1012
|
+
* @param {Object} infoExtraParams extra parameters to be provided when fetching meeting info
|
|
1013
|
+
* @returns {Promise<Meeting>} A new Meeting.
|
|
1014
|
+
* @public
|
|
1015
|
+
* @memberof Meetings
|
|
1016
|
+
*/
|
|
1017
|
+
public create(
|
|
1018
|
+
destination: string,
|
|
1019
|
+
type: string = null,
|
|
1020
|
+
useRandomDelayForInfo = false,
|
|
1021
|
+
infoExtraParams = {}
|
|
1022
|
+
) {
|
|
791
1023
|
// TODO: type should be from a dictionary
|
|
792
1024
|
|
|
793
1025
|
// Validate meeting information based on the provided destination and
|
|
794
1026
|
// type. This must be performed prior to determining if the meeting is
|
|
795
1027
|
// found in the collection, as we mutate the destination for hydra person
|
|
796
1028
|
// id values.
|
|
797
|
-
return
|
|
798
|
-
|
|
799
|
-
|
|
800
|
-
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
|
|
808
|
-
|
|
809
|
-
|
|
810
|
-
|
|
811
|
-
|
|
812
|
-
|
|
813
|
-
|
|
814
|
-
|
|
815
|
-
|
|
816
|
-
|
|
817
|
-
|
|
818
|
-
|
|
1029
|
+
return (
|
|
1030
|
+
this.meetingInfo
|
|
1031
|
+
.fetchInfoOptions(destination, type)
|
|
1032
|
+
// Catch a failure to fetch info options.
|
|
1033
|
+
.catch((error) => {
|
|
1034
|
+
LoggerProxy.logger.info(
|
|
1035
|
+
`Meetings:index#create --> INFO, unable to determine info options: ${error.message}`
|
|
1036
|
+
);
|
|
1037
|
+
})
|
|
1038
|
+
.then((options: any = {}) => {
|
|
1039
|
+
// Normalize the destination.
|
|
1040
|
+
const targetDest = options.destination || destination;
|
|
1041
|
+
|
|
1042
|
+
// check for the conversation URL then sip Url
|
|
1043
|
+
let meeting = null;
|
|
1044
|
+
|
|
1045
|
+
if (type === _CONVERSATION_URL_ || options.type === _CONVERSATION_URL_) {
|
|
1046
|
+
const foundMeeting = this.meetingCollection.getByKey(CONVERSATION_URL, targetDest);
|
|
1047
|
+
|
|
1048
|
+
if (foundMeeting) {
|
|
1049
|
+
const foundMeetingIsNotCalendarMeeting = !foundMeeting.locusInfo.scheduledMeeting;
|
|
1050
|
+
|
|
1051
|
+
// If the found meeting is not a calendar meeting, return that meeting.
|
|
1052
|
+
// This allows for the creation of instant-meetings when calendar meetings are present.
|
|
1053
|
+
if (foundMeetingIsNotCalendarMeeting) {
|
|
1054
|
+
meeting = foundMeeting;
|
|
1055
|
+
}
|
|
819
1056
|
}
|
|
820
1057
|
}
|
|
821
|
-
}
|
|
822
1058
|
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
1059
|
+
// Attempt to collect the meeting if it exists.
|
|
1060
|
+
if (!meeting) {
|
|
1061
|
+
meeting = this.meetingCollection.getByKey(SIP_URI, targetDest);
|
|
1062
|
+
}
|
|
827
1063
|
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
|
|
1064
|
+
// Validate if a meeting was found.
|
|
1065
|
+
if (!meeting) {
|
|
1066
|
+
// Create a meeting based on the normalized destination and type.
|
|
1067
|
+
return this.createMeeting(
|
|
1068
|
+
targetDest,
|
|
1069
|
+
type,
|
|
1070
|
+
useRandomDelayForInfo,
|
|
1071
|
+
infoExtraParams
|
|
1072
|
+
).then((createdMeeting: any) => {
|
|
833
1073
|
// If the meeting was successfully created.
|
|
834
1074
|
if (createdMeeting && createdMeeting.on) {
|
|
835
1075
|
// Create a destruction event for the meeting.
|
|
@@ -841,10 +1081,9 @@ export default class Meetings extends WebexPlugin {
|
|
|
841
1081
|
correlationId: createdMeeting.correlationId,
|
|
842
1082
|
feedbackId: createdMeeting.correlationId,
|
|
843
1083
|
locusId: createdMeeting.locusId,
|
|
844
|
-
meetingId: createdMeeting.locusInfo?.info?.webExMeetingId
|
|
1084
|
+
meetingId: createdMeeting.locusInfo?.info?.webExMeetingId,
|
|
845
1085
|
}).then(() => this.destroy(createdMeeting, payload.reason));
|
|
846
|
-
}
|
|
847
|
-
else {
|
|
1086
|
+
} else {
|
|
848
1087
|
this.destroy(createdMeeting, payload.reason);
|
|
849
1088
|
}
|
|
850
1089
|
});
|
|
@@ -857,34 +1096,42 @@ export default class Meetings extends WebexPlugin {
|
|
|
857
1096
|
correlationId: meetingInstance.correlationId,
|
|
858
1097
|
feedbackId: meetingInstance.correlationId,
|
|
859
1098
|
locusId: meetingInstance.locusId,
|
|
860
|
-
meetingId: meetingInstance.locusInfo?.info?.webExMeetingId
|
|
1099
|
+
meetingId: meetingInstance.locusInfo?.info?.webExMeetingId,
|
|
861
1100
|
});
|
|
862
1101
|
}
|
|
863
1102
|
});
|
|
864
|
-
}
|
|
865
|
-
|
|
866
|
-
|
|
1103
|
+
} else {
|
|
1104
|
+
LoggerProxy.logger.error(
|
|
1105
|
+
`Meetings:index#create --> ERROR, meeting does not have on method, will not be destroyed, meeting cleanup impossible for meeting: ${meeting}`
|
|
1106
|
+
);
|
|
867
1107
|
}
|
|
868
1108
|
|
|
869
1109
|
// Return the newly created meeting.
|
|
870
1110
|
return Promise.resolve(createdMeeting);
|
|
871
1111
|
});
|
|
872
|
-
|
|
1112
|
+
}
|
|
873
1113
|
|
|
874
|
-
|
|
875
|
-
|
|
876
|
-
|
|
1114
|
+
// Return the existing meeting.
|
|
1115
|
+
return Promise.resolve(meeting);
|
|
1116
|
+
})
|
|
1117
|
+
);
|
|
877
1118
|
}
|
|
878
1119
|
|
|
879
1120
|
/**
|
|
880
|
-
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
|
|
1121
|
+
* @param {String} destination see create()
|
|
1122
|
+
* @param {String} type see create()
|
|
1123
|
+
* @param {Boolean} useRandomDelayForInfo whether a random delay should be added to fetching meeting info
|
|
1124
|
+
* @param {Object} infoExtraParams extra parameters to be provided when fetching meeting info
|
|
1125
|
+
* @returns {Promise} a new meeting instance complete with meeting info and destination
|
|
1126
|
+
* @private
|
|
1127
|
+
* @memberof Meetings
|
|
1128
|
+
*/
|
|
1129
|
+
private async createMeeting(
|
|
1130
|
+
destination: any,
|
|
1131
|
+
type: string = null,
|
|
1132
|
+
useRandomDelayForInfo = false,
|
|
1133
|
+
infoExtraParams = {}
|
|
1134
|
+
) {
|
|
888
1135
|
const meeting = new Meeting(
|
|
889
1136
|
{
|
|
890
1137
|
// @ts-ignore
|
|
@@ -900,7 +1147,7 @@ export default class Meetings extends WebexPlugin {
|
|
|
900
1147
|
},
|
|
901
1148
|
{
|
|
902
1149
|
// @ts-ignore
|
|
903
|
-
parent: this.webex
|
|
1150
|
+
parent: this.webex,
|
|
904
1151
|
}
|
|
905
1152
|
);
|
|
906
1153
|
|
|
@@ -918,7 +1165,10 @@ export default class Meetings extends WebexPlugin {
|
|
|
918
1165
|
const startTimeDate = new Date(startTime);
|
|
919
1166
|
const startTimeDatestamp = startTimeDate.getTime();
|
|
920
1167
|
const timeToStart = startTimeDatestamp - Date.now();
|
|
921
|
-
const maxWaitingTime = Math.max(
|
|
1168
|
+
const maxWaitingTime = Math.max(
|
|
1169
|
+
Math.min(timeToStart, MAX_RANDOM_DELAY_FOR_MEETING_INFO),
|
|
1170
|
+
0
|
|
1171
|
+
);
|
|
922
1172
|
|
|
923
1173
|
waitingTime = Math.round(Math.random() * maxWaitingTime);
|
|
924
1174
|
}
|
|
@@ -927,22 +1177,32 @@ export default class Meetings extends WebexPlugin {
|
|
|
927
1177
|
const {enableUnifiedMeetings} = this.config.experimental;
|
|
928
1178
|
|
|
929
1179
|
if (enableUnifiedMeetings && !isMeetingActive && useRandomDelayForInfo && waitingTime > 0) {
|
|
930
|
-
meeting.fetchMeetingInfoTimeoutId = setTimeout(
|
|
1180
|
+
meeting.fetchMeetingInfoTimeoutId = setTimeout(
|
|
1181
|
+
() => meeting.fetchMeetingInfo({extraParams: infoExtraParams}),
|
|
1182
|
+
waitingTime
|
|
1183
|
+
);
|
|
931
1184
|
meeting.parseMeetingInfo(undefined, destination);
|
|
1185
|
+
} else {
|
|
1186
|
+
await meeting.fetchMeetingInfo({extraParams: infoExtraParams});
|
|
932
1187
|
}
|
|
933
|
-
|
|
934
|
-
|
|
935
|
-
|
|
936
|
-
|
|
937
|
-
|
|
938
|
-
|
|
1188
|
+
} catch (err) {
|
|
1189
|
+
if (
|
|
1190
|
+
!(err instanceof CaptchaError) &&
|
|
1191
|
+
!(err instanceof PasswordError) &&
|
|
1192
|
+
!(err instanceof PermissionError)
|
|
1193
|
+
) {
|
|
939
1194
|
// if there is no meeting info we assume its a 1:1 call or wireless share
|
|
940
|
-
LoggerProxy.logger.info(
|
|
941
|
-
|
|
1195
|
+
LoggerProxy.logger.info(
|
|
1196
|
+
`Meetings:index#createMeeting --> Info Unable to fetch meeting info for ${destination}.`
|
|
1197
|
+
);
|
|
1198
|
+
LoggerProxy.logger.info(
|
|
1199
|
+
'Meetings:index#createMeeting --> Info assuming this destination is a 1:1 or wireless share'
|
|
1200
|
+
);
|
|
942
1201
|
}
|
|
943
|
-
LoggerProxy.logger.debug(
|
|
944
|
-
|
|
945
|
-
|
|
1202
|
+
LoggerProxy.logger.debug(
|
|
1203
|
+
`Meetings:index#createMeeting --> Debug ${err} fetching /meetingInfo for creation.`
|
|
1204
|
+
);
|
|
1205
|
+
} finally {
|
|
946
1206
|
// For type LOCUS_ID we need to parse the locus object to get the information
|
|
947
1207
|
// about the caller and callee
|
|
948
1208
|
// Meeting Added event will be created in `handleLocusEvent`
|
|
@@ -960,12 +1220,12 @@ export default class Meetings extends WebexPlugin {
|
|
|
960
1220
|
this,
|
|
961
1221
|
{
|
|
962
1222
|
file: 'meetings',
|
|
963
|
-
function: 'createMeeting'
|
|
1223
|
+
function: 'createMeeting',
|
|
964
1224
|
},
|
|
965
1225
|
EVENT_TRIGGERS.MEETING_ADDED,
|
|
966
1226
|
{
|
|
967
1227
|
meeting,
|
|
968
|
-
type: meetingAddedType
|
|
1228
|
+
type: meetingAddedType,
|
|
969
1229
|
}
|
|
970
1230
|
);
|
|
971
1231
|
}
|
|
@@ -993,26 +1253,26 @@ export default class Meetings extends WebexPlugin {
|
|
|
993
1253
|
}
|
|
994
1254
|
|
|
995
1255
|
/**
|
|
996
|
-
|
|
997
|
-
|
|
998
|
-
|
|
999
|
-
|
|
1000
|
-
|
|
1001
|
-
|
|
1002
|
-
|
|
1256
|
+
* get a specifc meeting given it's type matched to the value, i.e., locus url
|
|
1257
|
+
* @param {String} type
|
|
1258
|
+
* @param {Object} value
|
|
1259
|
+
* @returns {Meeting}
|
|
1260
|
+
* @public
|
|
1261
|
+
* @memberof Meetings
|
|
1262
|
+
*/
|
|
1003
1263
|
public getMeetingByType(type: string, value: object) {
|
|
1004
1264
|
return this.meetingCollection.getByKey(type, value);
|
|
1005
1265
|
}
|
|
1006
1266
|
|
|
1007
1267
|
/**
|
|
1008
|
-
|
|
1009
|
-
|
|
1010
|
-
|
|
1011
|
-
|
|
1012
|
-
|
|
1013
|
-
|
|
1014
|
-
|
|
1015
|
-
|
|
1268
|
+
* Get all meetings.
|
|
1269
|
+
* @param {object} options
|
|
1270
|
+
* @param {object} options.startDate - get meetings after this start date
|
|
1271
|
+
* @param {object} options.endDate - get meetings before this end date
|
|
1272
|
+
* @returns {Object} All currently active meetings.
|
|
1273
|
+
* @public
|
|
1274
|
+
* @memberof Meetings
|
|
1275
|
+
*/
|
|
1016
1276
|
public getAllMeetings(
|
|
1017
1277
|
options: {
|
|
1018
1278
|
startDate: object;
|
|
@@ -1025,57 +1285,132 @@ export default class Meetings extends WebexPlugin {
|
|
|
1025
1285
|
}
|
|
1026
1286
|
|
|
1027
1287
|
/**
|
|
1028
|
-
|
|
1029
|
-
|
|
1030
|
-
|
|
1031
|
-
|
|
1032
|
-
|
|
1288
|
+
* syncs all the meeting from server
|
|
1289
|
+
* @returns {undefined}
|
|
1290
|
+
* @public
|
|
1291
|
+
* @memberof Meetings
|
|
1292
|
+
*/
|
|
1033
1293
|
public syncMeetings() {
|
|
1034
|
-
return this.request
|
|
1035
|
-
|
|
1036
|
-
|
|
1037
|
-
|
|
1038
|
-
|
|
1039
|
-
|
|
1040
|
-
this.
|
|
1041
|
-
|
|
1042
|
-
|
|
1294
|
+
return this.request
|
|
1295
|
+
.getActiveMeetings()
|
|
1296
|
+
.then((locusArray) => {
|
|
1297
|
+
const activeLocusUrl = [];
|
|
1298
|
+
|
|
1299
|
+
if (locusArray?.loci && locusArray.loci.length > 0) {
|
|
1300
|
+
const lociToUpdate = this.sortLocusArrayToUpdate(locusArray.loci);
|
|
1301
|
+
lociToUpdate.forEach((locus) => {
|
|
1302
|
+
activeLocusUrl.push(locus.url);
|
|
1303
|
+
this.handleLocusEvent({
|
|
1304
|
+
locus,
|
|
1305
|
+
locusUrl: locus.url,
|
|
1306
|
+
});
|
|
1043
1307
|
});
|
|
1044
|
-
}
|
|
1045
|
-
|
|
1046
|
-
|
|
1047
|
-
|
|
1048
|
-
|
|
1049
|
-
|
|
1050
|
-
|
|
1051
|
-
for (const meeting of Object.values(meetingsCollection)) {
|
|
1052
|
-
// @ts-ignore
|
|
1053
|
-
if (!activeLocusUrl.includes(meeting.locusUrl)) {
|
|
1054
|
-
// destroy function also uploads logs
|
|
1308
|
+
}
|
|
1309
|
+
const meetingsCollection = this.meetingCollection.getAll();
|
|
1310
|
+
|
|
1311
|
+
if (Object.keys(meetingsCollection).length > 0) {
|
|
1312
|
+
// Some time the mercury event is missed after mercury reconnect
|
|
1313
|
+
// if sync returns no locus then clear all the meetings
|
|
1314
|
+
for (const meeting of Object.values(meetingsCollection)) {
|
|
1055
1315
|
// @ts-ignore
|
|
1056
|
-
|
|
1316
|
+
if (!activeLocusUrl.includes(meeting.locusUrl)) {
|
|
1317
|
+
// destroy function also uploads logs
|
|
1318
|
+
// @ts-ignore
|
|
1319
|
+
this.destroy(meeting, MEETING_REMOVED_REASON.NO_MEETINGS_TO_SYNC);
|
|
1320
|
+
}
|
|
1057
1321
|
}
|
|
1058
1322
|
}
|
|
1323
|
+
})
|
|
1324
|
+
.catch((error) => {
|
|
1325
|
+
LoggerProxy.logger.error(
|
|
1326
|
+
`Meetings:index#syncMeetings --> failed to sync meetings, ${error}`
|
|
1327
|
+
);
|
|
1328
|
+
throw new Error(error);
|
|
1329
|
+
});
|
|
1330
|
+
}
|
|
1331
|
+
|
|
1332
|
+
/**
|
|
1333
|
+
* sort out locus array for initial creating
|
|
1334
|
+
* @param {Array} loci original locus array
|
|
1335
|
+
* @returns {undefined}
|
|
1336
|
+
* @public
|
|
1337
|
+
* @memberof Meetings
|
|
1338
|
+
*/
|
|
1339
|
+
sortLocusArrayToUpdate(loci: any[]) {
|
|
1340
|
+
const mainLoci = loci.filter((locus) => !MeetingsUtil.isBreakoutLocusDTO(locus));
|
|
1341
|
+
const breakoutLoci = loci.filter((locus) => MeetingsUtil.isValidBreakoutLocus(locus));
|
|
1342
|
+
this.breakoutLocusForHandleLater = [];
|
|
1343
|
+
const lociToUpdate = [...mainLoci];
|
|
1344
|
+
breakoutLoci.forEach((breakoutLocus) => {
|
|
1345
|
+
const associateMainLocus = mainLoci.find(
|
|
1346
|
+
(mainLocus) => mainLocus.controls?.breakout?.url === breakoutLocus.controls?.breakout?.url
|
|
1347
|
+
);
|
|
1348
|
+
const existCorrespondingMeeting = this.getCorrespondingMeetingByLocus({
|
|
1349
|
+
locus: breakoutLocus,
|
|
1350
|
+
locusUrl: breakoutLocus.url,
|
|
1351
|
+
});
|
|
1352
|
+
|
|
1353
|
+
if (associateMainLocus && !existCorrespondingMeeting) {
|
|
1354
|
+
// if exists both main session and breakout session locus of the same non-exist meeting, handle main locus first,
|
|
1355
|
+
// after meeting create with main locus, then handle the associate breakout locus.
|
|
1356
|
+
// if only handle breakout locus, will miss some date
|
|
1357
|
+
this.breakoutLocusForHandleLater.push(breakoutLocus);
|
|
1358
|
+
} else {
|
|
1359
|
+
lociToUpdate.push(breakoutLocus);
|
|
1059
1360
|
}
|
|
1060
1361
|
});
|
|
1362
|
+
|
|
1363
|
+
return lociToUpdate;
|
|
1061
1364
|
}
|
|
1062
1365
|
|
|
1063
1366
|
/**
|
|
1064
|
-
|
|
1065
|
-
|
|
1066
|
-
|
|
1067
|
-
|
|
1068
|
-
|
|
1069
|
-
|
|
1070
|
-
|
|
1367
|
+
* check breakout locus which waiting for main locus's meeting to be created, then handle the breakout locus
|
|
1368
|
+
* @param {Object} newCreatedLocus the locus which just create meeting object of it
|
|
1369
|
+
* @returns {undefined}
|
|
1370
|
+
* @public
|
|
1371
|
+
* @memberof Meetings
|
|
1372
|
+
*/
|
|
1373
|
+
checkHandleBreakoutLocus(newCreatedLocus) {
|
|
1374
|
+
if (
|
|
1375
|
+
!newCreatedLocus ||
|
|
1376
|
+
!this.breakoutLocusForHandleLater ||
|
|
1377
|
+
!this.breakoutLocusForHandleLater.length
|
|
1378
|
+
) {
|
|
1379
|
+
return;
|
|
1380
|
+
}
|
|
1381
|
+
if (MeetingsUtil.isBreakoutLocusDTO(newCreatedLocus)) {
|
|
1382
|
+
return;
|
|
1383
|
+
}
|
|
1384
|
+
const existIndex = this.breakoutLocusForHandleLater.findIndex(
|
|
1385
|
+
(breakoutLocus) =>
|
|
1386
|
+
breakoutLocus.controls?.breakout?.url === newCreatedLocus.controls?.breakout?.url
|
|
1387
|
+
);
|
|
1388
|
+
|
|
1389
|
+
if (existIndex < 0) {
|
|
1390
|
+
return;
|
|
1391
|
+
}
|
|
1392
|
+
|
|
1393
|
+
const associateBreakoutLocus = this.breakoutLocusForHandleLater[existIndex];
|
|
1394
|
+
this.handleLocusEvent({locus: associateBreakoutLocus, locusUrl: associateBreakoutLocus.url});
|
|
1395
|
+
this.breakoutLocusForHandleLater.splice(existIndex, 1);
|
|
1396
|
+
}
|
|
1397
|
+
|
|
1398
|
+
/**
|
|
1399
|
+
* Get all scheduled meetings.
|
|
1400
|
+
* @param {object} options
|
|
1401
|
+
* @param {object} options.startDate - get meetings after this start date
|
|
1402
|
+
* @param {object} options.endDate - get meetings before this end date
|
|
1403
|
+
* @returns {Object} All scheduled meetings.
|
|
1404
|
+
* @memberof Meetings
|
|
1405
|
+
*/
|
|
1071
1406
|
getScheduledMeetings() {
|
|
1072
1407
|
return this.meetingCollection.getAll({scheduled: true});
|
|
1073
1408
|
}
|
|
1074
1409
|
|
|
1075
1410
|
/**
|
|
1076
|
-
|
|
1077
|
-
|
|
1078
|
-
|
|
1411
|
+
* Get the logger instance for plugin-meetings
|
|
1412
|
+
* @returns {Logger}
|
|
1413
|
+
*/
|
|
1079
1414
|
getLogger() {
|
|
1080
1415
|
return LoggerProxy.get();
|
|
1081
1416
|
}
|