@webex/plugin-meetings 2.60.0 → 2.60.1-next.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +58 -8
- package/dist/annotation/annotation.types.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 +234 -100
- package/dist/constants.js +433 -444
- 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 +705 -520
- package/dist/meeting/index.js +5047 -3089
- 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 +304 -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 +118 -1
- package/dist/meeting/util.js +676 -435
- package/dist/meeting/util.js.map +1 -1
- package/dist/meeting/voicea-meeting.d.ts +20 -0
- package/dist/meeting/voicea-meeting.js +201 -0
- package/dist/meeting/voicea-meeting.js.map +1 -0
- 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 +114 -20
- package/dist/meetings/index.js +540 -126
- 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 +304 -392
- 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 +285 -232
- 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 +100 -238
- 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 +436 -511
- package/dist/statsAnalyzer/index.js.map +1 -1
- package/dist/statsAnalyzer/mqaUtil.d.ts +8 -6
- package/dist/statsAnalyzer/mqaUtil.js +130 -90
- 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 +39 -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 +265 -100
- 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 +450 -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 +4306 -2581
- package/src/meeting/locusMediaRequest.ts +313 -0
- package/src/meeting/muteState.ts +224 -138
- package/src/meeting/request.ts +214 -127
- package/src/meeting/request.type.ts +13 -0
- package/src/meeting/util.ts +687 -423
- package/src/meeting/voicea-meeting.ts +161 -0
- 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 +529 -127
- 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 +246 -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 +96 -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 +479 -645
- package/src/statsAnalyzer/mqaUtil.ts +128 -126
- 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 +1438 -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 +8886 -2815
- 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 +523 -43
- package/test/unit/spec/meeting/utils.js +834 -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 +1446 -217
- 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 +532 -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 +163 -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 +187 -77
- 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 +644 -165
- 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/meetings/index.ts
CHANGED
|
@@ -1,13 +1,17 @@
|
|
|
1
1
|
/* eslint no-shadow: ["error", { "allow": ["eventType"] }] */
|
|
2
2
|
|
|
3
3
|
import '@webex/internal-plugin-mercury';
|
|
4
|
+
import '@webex/internal-plugin-conversation';
|
|
5
|
+
import '@webex/internal-plugin-metrics';
|
|
4
6
|
// @ts-ignore
|
|
5
7
|
import {WebexPlugin} from '@webex/webex-core';
|
|
8
|
+
import {setLogger} from '@webex/internal-media-core';
|
|
9
|
+
|
|
10
|
+
import * as mediaHelpersModule from '@webex/media-helpers';
|
|
6
11
|
|
|
7
12
|
import 'webrtc-adapter';
|
|
8
13
|
|
|
9
14
|
import Metrics from '../metrics';
|
|
10
|
-
import {trigger, eventType} from '../metrics/config';
|
|
11
15
|
import LoggerConfig from '../common/logs/logger-config';
|
|
12
16
|
import StaticConfig from '../common/config';
|
|
13
17
|
import LoggerProxy from '../common/logs/logger-proxy';
|
|
@@ -38,11 +42,14 @@ import {
|
|
|
38
42
|
MEETING_REMOVED_REASON,
|
|
39
43
|
_CONVERSATION_URL_,
|
|
40
44
|
CONVERSATION_URL,
|
|
45
|
+
MEETINGNUMBER,
|
|
46
|
+
_JOINED_,
|
|
47
|
+
_MOVED_,
|
|
41
48
|
} from '../constants';
|
|
42
49
|
import BEHAVIORAL_METRICS from '../metrics/constants';
|
|
43
50
|
import MeetingInfo from '../meeting-info';
|
|
44
51
|
import MeetingInfoV2 from '../meeting-info/meeting-info-v2';
|
|
45
|
-
import Meeting from '../meeting';
|
|
52
|
+
import Meeting, {CallStateForMetrics} from '../meeting';
|
|
46
53
|
import PersonalMeetingRoom from '../personal-meeting-room';
|
|
47
54
|
import Reachability from '../reachability';
|
|
48
55
|
import Request from './request';
|
|
@@ -51,7 +58,38 @@ import CaptchaError from '../common/errors/captcha-error';
|
|
|
51
58
|
|
|
52
59
|
import MeetingCollection from './collection';
|
|
53
60
|
import MeetingsUtil from './util';
|
|
61
|
+
import PermissionError from '../common/errors/permission';
|
|
62
|
+
import {INoiseReductionEffect, IVirtualBackgroundEffect} from './meetings.types';
|
|
63
|
+
import {SpaceIDDeprecatedError} from '../common/errors/webex-errors';
|
|
64
|
+
import NoMeetingInfoError from '../common/errors/no-meeting-info';
|
|
65
|
+
|
|
66
|
+
let mediaLogger;
|
|
67
|
+
|
|
68
|
+
class MediaLogger {
|
|
69
|
+
info(...args) {
|
|
70
|
+
LoggerProxy.logger.info(...args);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
log(...args) {
|
|
74
|
+
LoggerProxy.logger.log(...args);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
error(...args) {
|
|
78
|
+
LoggerProxy.logger.error(...args);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
warn(...args) {
|
|
82
|
+
LoggerProxy.logger.warn(...args);
|
|
83
|
+
}
|
|
54
84
|
|
|
85
|
+
trace(...args) {
|
|
86
|
+
LoggerProxy.logger.trace(...args);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
debug(...args) {
|
|
90
|
+
LoggerProxy.logger.debug(...args);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
55
93
|
/**
|
|
56
94
|
* Meetings Ready Event
|
|
57
95
|
* Emitted when the meetings instance on webex is ready
|
|
@@ -110,12 +148,13 @@ export default class Meetings extends WebexPlugin {
|
|
|
110
148
|
meetingCollection: any;
|
|
111
149
|
personalMeetingRoom: any;
|
|
112
150
|
preferredWebexSite: any;
|
|
113
|
-
reachability:
|
|
151
|
+
reachability: Reachability;
|
|
114
152
|
registered: any;
|
|
115
153
|
request: any;
|
|
116
154
|
geoHintInfo: any;
|
|
117
155
|
meetingInfo: any;
|
|
118
|
-
|
|
156
|
+
mediaHelpers: any;
|
|
157
|
+
breakoutLocusForHandleLater: any;
|
|
119
158
|
namespace = MEETINGS;
|
|
120
159
|
|
|
121
160
|
/**
|
|
@@ -127,6 +166,17 @@ export default class Meetings extends WebexPlugin {
|
|
|
127
166
|
constructor(...args) {
|
|
128
167
|
super(...args);
|
|
129
168
|
|
|
169
|
+
/**
|
|
170
|
+
* The webrtc-core media helpers. This is a temporary solution required for the SDK sample app
|
|
171
|
+
* to be able to call media helper functions.
|
|
172
|
+
*
|
|
173
|
+
* @instance
|
|
174
|
+
* @type {Object}
|
|
175
|
+
* @private
|
|
176
|
+
* @memberof Meetings
|
|
177
|
+
*/
|
|
178
|
+
this.mediaHelpers = mediaHelpersModule;
|
|
179
|
+
|
|
130
180
|
/**
|
|
131
181
|
* The Meetings request to interact with server
|
|
132
182
|
* @instance
|
|
@@ -154,15 +204,17 @@ export default class Meetings extends WebexPlugin {
|
|
|
154
204
|
* @memberof Meetings
|
|
155
205
|
*/
|
|
156
206
|
this.personalMeetingRoom = null;
|
|
207
|
+
|
|
157
208
|
/**
|
|
158
|
-
* The Reachability object to interact with server
|
|
209
|
+
* The Reachability object to interact with server
|
|
159
210
|
* starts as null
|
|
160
211
|
* @instance
|
|
161
212
|
* @type {Object}
|
|
162
213
|
* @private
|
|
163
214
|
* @memberof Meetings
|
|
164
215
|
*/
|
|
165
|
-
|
|
216
|
+
// @ts-ignore
|
|
217
|
+
this.reachability = new Reachability(this.webex);
|
|
166
218
|
|
|
167
219
|
/**
|
|
168
220
|
* If the meetings plugin has been registered and listening via {@link Meetings#register}
|
|
@@ -192,30 +244,137 @@ export default class Meetings extends WebexPlugin {
|
|
|
192
244
|
*/
|
|
193
245
|
this.media = {
|
|
194
246
|
getUserMedia: Media.getUserMedia,
|
|
195
|
-
getSupportedDevice: Media.getSupportedDevice,
|
|
196
247
|
};
|
|
197
248
|
|
|
198
249
|
this.onReady();
|
|
199
250
|
}
|
|
200
251
|
|
|
201
252
|
/**
|
|
202
|
-
*
|
|
253
|
+
* check whether you need to handle this main session's locus data or not
|
|
254
|
+
* @param {Object} meeting current meeting data
|
|
255
|
+
* @param {Object} newLocus new locus data
|
|
256
|
+
* @returns {boolean}
|
|
257
|
+
* @private
|
|
258
|
+
* @memberof Meetings
|
|
259
|
+
*/
|
|
260
|
+
private isNeedHandleMainLocus(meeting: any, newLocus: any) {
|
|
261
|
+
const breakoutUrl = newLocus.controls?.breakout?.url;
|
|
262
|
+
const breakoutLocus = this.meetingCollection.getActiveBreakoutLocus(breakoutUrl);
|
|
263
|
+
|
|
264
|
+
const isSelfJoined = newLocus?.self?.state === _JOINED_;
|
|
265
|
+
const isSelfMoved = newLocus?.self?.state === _LEFT_ && newLocus?.self?.reason === _MOVED_;
|
|
266
|
+
// @ts-ignore
|
|
267
|
+
const deviceFromNewLocus = MeetingsUtil.getThisDevice(newLocus, this.webex.internal.device.url);
|
|
268
|
+
const isResourceMovedOnThisDevice =
|
|
269
|
+
deviceFromNewLocus?.state === _LEFT_ && deviceFromNewLocus?.reason === _MOVED_;
|
|
270
|
+
|
|
271
|
+
const isNewLocusJoinThisDevice = MeetingsUtil.joinedOnThisDevice(
|
|
272
|
+
meeting,
|
|
273
|
+
newLocus,
|
|
274
|
+
// @ts-ignore
|
|
275
|
+
this.webex.internal.device.url
|
|
276
|
+
);
|
|
277
|
+
const isBreakoutLocusJoinThisDevice =
|
|
278
|
+
breakoutLocus?.joinedWith?.correlationId &&
|
|
279
|
+
breakoutLocus.joinedWith.correlationId === meeting?.correlationId;
|
|
280
|
+
|
|
281
|
+
if (isSelfJoined && isNewLocusJoinThisDevice) {
|
|
282
|
+
LoggerProxy.logger.log(
|
|
283
|
+
'Meetings:index#isNeedHandleMainLocus --> self this device shown as JOINED in the main session'
|
|
284
|
+
);
|
|
285
|
+
if (breakoutLocus?.joinedWith && deviceFromNewLocus) {
|
|
286
|
+
const breakoutReplaceAt =
|
|
287
|
+
breakoutLocus.joinedWith.replaces?.length > 0
|
|
288
|
+
? breakoutLocus.joinedWith.replaces[0].replaceAt
|
|
289
|
+
: '';
|
|
290
|
+
const newLocusReplaceAt =
|
|
291
|
+
deviceFromNewLocus.replaces?.length > 0 ? deviceFromNewLocus.replaces[0].replaceAt : '';
|
|
292
|
+
if (breakoutReplaceAt && newLocusReplaceAt && breakoutReplaceAt > newLocusReplaceAt) {
|
|
293
|
+
LoggerProxy.logger.log(
|
|
294
|
+
`Meetings:index#isNeedHandleMainLocus --> this is expired main joined status locus_dto replacedAt ${newLocusReplaceAt} bo replacedAt ${breakoutReplaceAt}`
|
|
295
|
+
);
|
|
296
|
+
|
|
297
|
+
return false;
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
return true;
|
|
302
|
+
}
|
|
303
|
+
if (isBreakoutLocusJoinThisDevice) {
|
|
304
|
+
LoggerProxy.logger.log(
|
|
305
|
+
`Meetings:index#isNeedHandleMainLocus --> there is active breakout session and joined on this device, and don't need to handle main session: ${breakoutUrl}`
|
|
306
|
+
);
|
|
307
|
+
|
|
308
|
+
return false;
|
|
309
|
+
}
|
|
310
|
+
if (isSelfMoved && (newLocus?.self?.removed || isResourceMovedOnThisDevice)) {
|
|
311
|
+
LoggerProxy.logger.log(
|
|
312
|
+
'Meetings:index#isNeedHandleMainLocus --> self moved main locus with self removed status or with device resource moved, not need to handle'
|
|
313
|
+
);
|
|
314
|
+
|
|
315
|
+
return false;
|
|
316
|
+
}
|
|
317
|
+
if (isSelfJoined && isResourceMovedOnThisDevice) {
|
|
318
|
+
LoggerProxy.logger.log(
|
|
319
|
+
'Meetings:index#isNeedHandleMainLocus --> self device left&moved in main locus with self joined status, not need to handle'
|
|
320
|
+
);
|
|
321
|
+
|
|
322
|
+
return false;
|
|
323
|
+
}
|
|
324
|
+
LoggerProxy.logger.log(
|
|
325
|
+
'Meetings:index#isNeedHandleMainLocus --> this is a normal main session locusDTO update case'
|
|
326
|
+
);
|
|
327
|
+
|
|
328
|
+
return true;
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
/**
|
|
332
|
+
* check whether you need to handle this locus data or not
|
|
333
|
+
* @param {Object} meeting old locus data
|
|
334
|
+
* @param {Object} newLocus new locus data
|
|
335
|
+
* @returns {boolean}
|
|
336
|
+
* @private
|
|
337
|
+
* @memberof Meetings
|
|
338
|
+
*/
|
|
339
|
+
private isNeedHandleLocusDTO(meeting: any, newLocus: any) {
|
|
340
|
+
if (newLocus) {
|
|
341
|
+
const isNewLocusAsBreakout = MeetingsUtil.isBreakoutLocusDTO(newLocus);
|
|
342
|
+
const isSelfMoved = newLocus?.self?.state === _LEFT_ && newLocus?.self?.reason === _MOVED_;
|
|
343
|
+
if (!meeting) {
|
|
344
|
+
if (isNewLocusAsBreakout) {
|
|
345
|
+
LoggerProxy.logger.log(
|
|
346
|
+
`Meetings:index#isNeedHandleLocusDTO --> the first breakout session locusDTO active status: ${newLocus.fullState?.active}`
|
|
347
|
+
);
|
|
348
|
+
|
|
349
|
+
return newLocus.self?.state === _JOINED_;
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
return this.isNeedHandleMainLocus(meeting, newLocus);
|
|
353
|
+
}
|
|
354
|
+
if (!isNewLocusAsBreakout) {
|
|
355
|
+
return this.isNeedHandleMainLocus(meeting, newLocus);
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
return !isSelfMoved;
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
return true;
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
/**
|
|
365
|
+
* get corresponding meeting object by locus data
|
|
203
366
|
* @param {Object} data a locus event
|
|
204
367
|
* @param {String} data.locusUrl
|
|
205
368
|
* @param {Object} data.locus
|
|
206
|
-
* @
|
|
207
|
-
* @param {String} data.eventType
|
|
208
|
-
* @returns {undefined}
|
|
369
|
+
* @returns {Object}
|
|
209
370
|
* @private
|
|
210
371
|
* @memberof Meetings
|
|
211
372
|
*/
|
|
212
|
-
|
|
213
|
-
let meeting = null;
|
|
214
|
-
|
|
373
|
+
getCorrespondingMeetingByLocus(data) {
|
|
215
374
|
// getting meeting by correlationId. This will happen for the new event
|
|
216
375
|
// Either the locus
|
|
217
376
|
// TODO : Add check for the callBack Address
|
|
218
|
-
|
|
377
|
+
return (
|
|
219
378
|
this.meetingCollection.getByKey(LOCUS_URL, data.locusUrl) ||
|
|
220
379
|
// @ts-ignore
|
|
221
380
|
this.meetingCollection.getByKey(
|
|
@@ -231,7 +390,24 @@ export default class Meetings extends WebexPlugin {
|
|
|
231
390
|
) ||
|
|
232
391
|
(data.locus.info?.isUnifiedSpaceMeeting
|
|
233
392
|
? undefined
|
|
234
|
-
: this.meetingCollection.getByKey(CONVERSATION_URL, data.locus.conversationUrl))
|
|
393
|
+
: this.meetingCollection.getByKey(CONVERSATION_URL, data.locus.conversationUrl)) ||
|
|
394
|
+
this.meetingCollection.getByKey(MEETINGNUMBER, data.locus?.info?.webExMeetingId)
|
|
395
|
+
);
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
/**
|
|
399
|
+
* handle locus events and takes meeting actions with them as they come in
|
|
400
|
+
* @param {Object} data a locus event
|
|
401
|
+
* @param {String} data.locusUrl
|
|
402
|
+
* @param {Object} data.locus
|
|
403
|
+
* @param {Boolean} useRandomDelayForInfo whether a random delay should be added to fetching meeting info
|
|
404
|
+
* @param {String} data.eventType
|
|
405
|
+
* @returns {undefined}
|
|
406
|
+
* @private
|
|
407
|
+
* @memberof Meetings
|
|
408
|
+
*/
|
|
409
|
+
private handleLocusEvent(data: {locusUrl: string; locus: any}, useRandomDelayForInfo = false) {
|
|
410
|
+
let meeting = this.getCorrespondingMeetingByLocus(data);
|
|
235
411
|
|
|
236
412
|
// Special case when locus has got replaced, This only happend once if a replace locus exists
|
|
237
413
|
// https://sqbu-github.cisco.com/WebExSquared/locus/wiki/Locus-changing-mid-call
|
|
@@ -244,6 +420,16 @@ export default class Meetings extends WebexPlugin {
|
|
|
244
420
|
);
|
|
245
421
|
}
|
|
246
422
|
|
|
423
|
+
if (meeting && !MeetingsUtil.isBreakoutLocusDTO(data.locus)) {
|
|
424
|
+
meeting.locusInfo.updateMainSessionLocusCache(data.locus);
|
|
425
|
+
}
|
|
426
|
+
if (!this.isNeedHandleLocusDTO(meeting, data.locus)) {
|
|
427
|
+
LoggerProxy.logger.log(
|
|
428
|
+
`Meetings:index#handleLocusEvent --> doesn't need to process locus event`
|
|
429
|
+
);
|
|
430
|
+
|
|
431
|
+
return;
|
|
432
|
+
}
|
|
247
433
|
if (!meeting) {
|
|
248
434
|
// TODO: create meeting when we get a meeting object
|
|
249
435
|
// const checkForEnded = (locus) => {
|
|
@@ -300,6 +486,7 @@ export default class Meetings extends WebexPlugin {
|
|
|
300
486
|
|
|
301
487
|
// It's a new meeting so initialize the locus data
|
|
302
488
|
meeting.locusInfo.initialSetup(data.locus);
|
|
489
|
+
this.checkHandleBreakoutLocus(data.locus);
|
|
303
490
|
})
|
|
304
491
|
.catch((e) => {
|
|
305
492
|
LoggerProxy.logger.error(e);
|
|
@@ -309,10 +496,15 @@ export default class Meetings extends WebexPlugin {
|
|
|
309
496
|
// because the other user left so before sending 'added' event make sure it exists in the collection
|
|
310
497
|
|
|
311
498
|
if (this.getMeetingByType(_ID_, meeting.id)) {
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
499
|
+
// @ts-ignore
|
|
500
|
+
this.webex.internal.newMetrics.submitClientEvent({
|
|
501
|
+
name: 'client.call.remote-started',
|
|
502
|
+
payload: {
|
|
503
|
+
trigger: 'mercury-event',
|
|
504
|
+
},
|
|
505
|
+
options: {
|
|
506
|
+
meetingId: meeting.id,
|
|
507
|
+
},
|
|
316
508
|
});
|
|
317
509
|
Trigger.trigger(
|
|
318
510
|
this,
|
|
@@ -392,7 +584,7 @@ export default class Meetings extends WebexPlugin {
|
|
|
392
584
|
|
|
393
585
|
// @ts-ignore
|
|
394
586
|
this.webex.internal.mercury.on(ONLINE, () => {
|
|
395
|
-
this.syncMeetings();
|
|
587
|
+
this.syncMeetings({keepOnlyLocusMeetings: false});
|
|
396
588
|
});
|
|
397
589
|
|
|
398
590
|
// @ts-ignore
|
|
@@ -431,6 +623,9 @@ export default class Meetings extends WebexPlugin {
|
|
|
431
623
|
// @ts-ignore
|
|
432
624
|
LoggerProxy.set(this.webex.logger);
|
|
433
625
|
|
|
626
|
+
mediaLogger = new MediaLogger();
|
|
627
|
+
setLogger(mediaLogger);
|
|
628
|
+
|
|
434
629
|
/**
|
|
435
630
|
* The MeetingInfo object to interact with server
|
|
436
631
|
* @instance
|
|
@@ -462,7 +657,7 @@ export default class Meetings extends WebexPlugin {
|
|
|
462
657
|
|
|
463
658
|
MeetingsUtil.checkH264Support({disableNotifications: true});
|
|
464
659
|
// @ts-ignore
|
|
465
|
-
Metrics.initialSetup(this.
|
|
660
|
+
Metrics.initialSetup(this.webex);
|
|
466
661
|
});
|
|
467
662
|
}
|
|
468
663
|
|
|
@@ -487,35 +682,38 @@ export default class Meetings extends WebexPlugin {
|
|
|
487
682
|
}
|
|
488
683
|
|
|
489
684
|
/**
|
|
490
|
-
* API to
|
|
491
|
-
* @param {Boolean}
|
|
685
|
+
* API to toggle starting adhoc meeting
|
|
686
|
+
* @param {Boolean} changeState
|
|
492
687
|
* @private
|
|
493
688
|
* @memberof Meetings
|
|
494
689
|
* @returns {undefined}
|
|
495
690
|
*/
|
|
496
|
-
private
|
|
497
|
-
if (typeof
|
|
691
|
+
private _toggleAdhocMeetings(changeState: boolean) {
|
|
692
|
+
if (typeof changeState !== 'boolean') {
|
|
498
693
|
return;
|
|
499
694
|
}
|
|
500
695
|
// @ts-ignore
|
|
501
|
-
this.config
|
|
696
|
+
if (this.config?.experimental?.enableAdhocMeetings !== changeState) {
|
|
697
|
+
// @ts-ignore
|
|
698
|
+
this.config.experimental.enableAdhocMeetings = changeState;
|
|
699
|
+
}
|
|
502
700
|
}
|
|
503
701
|
|
|
504
702
|
/**
|
|
505
|
-
* API to toggle
|
|
506
|
-
* @param {Boolean}
|
|
703
|
+
* API to toggle TCP reachability, needs to be called before webex.meetings.register()
|
|
704
|
+
* @param {Boolean} newValue
|
|
507
705
|
* @private
|
|
508
706
|
* @memberof Meetings
|
|
509
707
|
* @returns {undefined}
|
|
510
708
|
*/
|
|
511
|
-
private
|
|
512
|
-
if (typeof
|
|
709
|
+
private _toggleTcpReachability(newValue: boolean) {
|
|
710
|
+
if (typeof newValue !== 'boolean') {
|
|
513
711
|
return;
|
|
514
712
|
}
|
|
515
713
|
// @ts-ignore
|
|
516
|
-
if (this.config
|
|
714
|
+
if (this.config.experimental.enableTcpReachability !== newValue) {
|
|
517
715
|
// @ts-ignore
|
|
518
|
-
this.config.experimental.
|
|
716
|
+
this.config.experimental.enableTcpReachability = newValue;
|
|
519
717
|
}
|
|
520
718
|
}
|
|
521
719
|
|
|
@@ -631,6 +829,36 @@ export default class Meetings extends WebexPlugin {
|
|
|
631
829
|
);
|
|
632
830
|
}
|
|
633
831
|
|
|
832
|
+
/**
|
|
833
|
+
* Creates a noise reduction effect
|
|
834
|
+
*
|
|
835
|
+
* @param {INoiseReductionEffect} options optional custom effect options
|
|
836
|
+
* @returns {Promise<effect>} noise reduction effect.
|
|
837
|
+
* @public
|
|
838
|
+
* @memberof Meetings
|
|
839
|
+
*/
|
|
840
|
+
createNoiseReductionEffect = async (options?: INoiseReductionEffect) => {
|
|
841
|
+
// @ts-ignore
|
|
842
|
+
const authToken = this.webex.credentials.supertoken.access_token;
|
|
843
|
+
|
|
844
|
+
return new mediaHelpersModule.NoiseReductionEffect({authToken, ...options});
|
|
845
|
+
};
|
|
846
|
+
|
|
847
|
+
/**
|
|
848
|
+
* Creates a virtual background effect
|
|
849
|
+
*
|
|
850
|
+
* @param {IVirtualBackgroundEffect} options optional custom effect options
|
|
851
|
+
* @returns {Promise<effect>} virtual background effect.
|
|
852
|
+
* @public
|
|
853
|
+
* @memberof Meetings
|
|
854
|
+
*/
|
|
855
|
+
createVirtualBackgroundEffect = async (options?: IVirtualBackgroundEffect) => {
|
|
856
|
+
// @ts-ignore
|
|
857
|
+
const authToken = this.webex.credentials.supertoken.access_token;
|
|
858
|
+
|
|
859
|
+
return new mediaHelpersModule.VirtualBackgroundEffect({authToken, ...options});
|
|
860
|
+
};
|
|
861
|
+
|
|
634
862
|
/**
|
|
635
863
|
* Uploads logs to the webex services for tracking
|
|
636
864
|
* @param {Object} [options={}]
|
|
@@ -645,8 +873,10 @@ export default class Meetings extends WebexPlugin {
|
|
|
645
873
|
*/
|
|
646
874
|
uploadLogs(
|
|
647
875
|
options: {
|
|
876
|
+
autoupload?: boolean;
|
|
648
877
|
callStart?: string;
|
|
649
878
|
feedbackId?: string;
|
|
879
|
+
locussessionid?: string;
|
|
650
880
|
locusId?: string;
|
|
651
881
|
correlationId?: string;
|
|
652
882
|
meetingId?: string;
|
|
@@ -663,6 +893,7 @@ export default class Meetings extends WebexPlugin {
|
|
|
663
893
|
'Meetings:index#uploadLogs --> Upload logs for meeting completed.',
|
|
664
894
|
uploadResult
|
|
665
895
|
);
|
|
896
|
+
Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.UPLOAD_LOGS_SUCCESS, options);
|
|
666
897
|
Trigger.trigger(
|
|
667
898
|
this,
|
|
668
899
|
{
|
|
@@ -697,8 +928,7 @@ export default class Meetings extends WebexPlugin {
|
|
|
697
928
|
);
|
|
698
929
|
|
|
699
930
|
Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.UPLOAD_LOGS_FAILURE, {
|
|
700
|
-
|
|
701
|
-
meetingId: options.meetingsId,
|
|
931
|
+
...options,
|
|
702
932
|
reason: uploadError.message,
|
|
703
933
|
stack: uploadError.stack,
|
|
704
934
|
code: uploadError.code,
|
|
@@ -706,17 +936,6 @@ export default class Meetings extends WebexPlugin {
|
|
|
706
936
|
});
|
|
707
937
|
}
|
|
708
938
|
|
|
709
|
-
/**
|
|
710
|
-
* initializes the reachability instance for Meetings
|
|
711
|
-
* @returns {undefined}
|
|
712
|
-
* @public
|
|
713
|
-
* @memberof Meetings
|
|
714
|
-
*/
|
|
715
|
-
setReachability() {
|
|
716
|
-
// @ts-ignore
|
|
717
|
-
this.reachability = new Reachability(this.webex);
|
|
718
|
-
}
|
|
719
|
-
|
|
720
939
|
/**
|
|
721
940
|
* gets the reachability instance for Meetings
|
|
722
941
|
* @returns {Reachability}
|
|
@@ -734,10 +953,6 @@ export default class Meetings extends WebexPlugin {
|
|
|
734
953
|
* @memberof Meetings
|
|
735
954
|
*/
|
|
736
955
|
startReachability() {
|
|
737
|
-
if (!this.reachability) {
|
|
738
|
-
this.setReachability();
|
|
739
|
-
}
|
|
740
|
-
|
|
741
956
|
return this.getReachability().gatherReachability();
|
|
742
957
|
}
|
|
743
958
|
|
|
@@ -765,6 +980,29 @@ export default class Meetings extends WebexPlugin {
|
|
|
765
980
|
if (res) {
|
|
766
981
|
this.preferredWebexSite = MeetingsUtil.parseDefaultSiteFromMeetingPreferences(res);
|
|
767
982
|
}
|
|
983
|
+
|
|
984
|
+
// fall back to getting the preferred site from the user information
|
|
985
|
+
if (!this.preferredWebexSite) {
|
|
986
|
+
// @ts-ignore
|
|
987
|
+
return this.webex.internal.user
|
|
988
|
+
.get()
|
|
989
|
+
.then((user) => {
|
|
990
|
+
const preferredWebexSite =
|
|
991
|
+
user?.userPreferences?.userPreferencesItems?.preferredWebExSite;
|
|
992
|
+
if (preferredWebexSite) {
|
|
993
|
+
this.preferredWebexSite = preferredWebexSite;
|
|
994
|
+
} else {
|
|
995
|
+
throw new Error('site not found');
|
|
996
|
+
}
|
|
997
|
+
})
|
|
998
|
+
.catch(() => {
|
|
999
|
+
LoggerProxy.logger.error(
|
|
1000
|
+
'Failed to fetch preferred site from user - no site will be set'
|
|
1001
|
+
);
|
|
1002
|
+
});
|
|
1003
|
+
}
|
|
1004
|
+
|
|
1005
|
+
return Promise.resolve();
|
|
768
1006
|
});
|
|
769
1007
|
}
|
|
770
1008
|
|
|
@@ -805,29 +1043,55 @@ export default class Meetings extends WebexPlugin {
|
|
|
805
1043
|
}
|
|
806
1044
|
|
|
807
1045
|
/**
|
|
808
|
-
* Create a meeting.
|
|
809
|
-
*
|
|
1046
|
+
* Create a meeting or return an existing meeting.
|
|
1047
|
+
*
|
|
1048
|
+
* When meeting info passed it should be complete, e.g.: fetched after password or captcha provided
|
|
1049
|
+
*
|
|
1050
|
+
* @param {string} destination - sipURL, phonenumber, or locus object}
|
|
810
1051
|
* @param {string} [type] - the optional specified type, such as locusId
|
|
811
1052
|
* @param {Boolean} useRandomDelayForInfo - whether a random delay should be added to fetching meeting info
|
|
1053
|
+
* @param {Object} infoExtraParams extra parameters to be provided when fetching meeting info
|
|
1054
|
+
* @param {string} correlationId - the optional specified correlationId (callStateForMetrics.correlationId can be provided instead)
|
|
1055
|
+
* @param {Boolean} failOnMissingMeetingInfo - whether to throw an error if meeting info fails to fetch (for calls that are not 1:1 or content share)
|
|
1056
|
+
* @param {CallStateForMetrics} callStateForMetrics - information about call state for metrics
|
|
1057
|
+
* @param {Object} [meetingInfo] - Pre-fetched complete meeting info
|
|
1058
|
+
* @param {String} [meetingLookupUrl] - meeting info prefetch url
|
|
812
1059
|
* @returns {Promise<Meeting>} A new Meeting.
|
|
813
1060
|
* @public
|
|
814
1061
|
* @memberof Meetings
|
|
815
1062
|
*/
|
|
816
|
-
public create(
|
|
1063
|
+
public create(
|
|
1064
|
+
destination: string,
|
|
1065
|
+
type: string = null,
|
|
1066
|
+
useRandomDelayForInfo = false,
|
|
1067
|
+
infoExtraParams = {},
|
|
1068
|
+
correlationId: string = undefined,
|
|
1069
|
+
failOnMissingMeetingInfo = false,
|
|
1070
|
+
callStateForMetrics: CallStateForMetrics = undefined,
|
|
1071
|
+
meetingInfo = undefined,
|
|
1072
|
+
meetingLookupUrl = undefined
|
|
1073
|
+
) {
|
|
817
1074
|
// TODO: type should be from a dictionary
|
|
818
1075
|
|
|
819
1076
|
// Validate meeting information based on the provided destination and
|
|
820
1077
|
// type. This must be performed prior to determining if the meeting is
|
|
821
1078
|
// found in the collection, as we mutate the destination for hydra person
|
|
822
1079
|
// id values.
|
|
1080
|
+
if (correlationId) {
|
|
1081
|
+
callStateForMetrics = {...(callStateForMetrics || {}), correlationId};
|
|
1082
|
+
}
|
|
1083
|
+
|
|
823
1084
|
return (
|
|
824
1085
|
this.meetingInfo
|
|
825
1086
|
.fetchInfoOptions(destination, type)
|
|
826
1087
|
// Catch a failure to fetch info options.
|
|
827
1088
|
.catch((error) => {
|
|
828
|
-
LoggerProxy.logger.
|
|
829
|
-
`Meetings:index#create -->
|
|
1089
|
+
LoggerProxy.logger.error(
|
|
1090
|
+
`Meetings:index#create --> ERROR, unable to determine info options: ${error.message}`
|
|
830
1091
|
);
|
|
1092
|
+
if (error instanceof SpaceIDDeprecatedError) {
|
|
1093
|
+
throw new SpaceIDDeprecatedError();
|
|
1094
|
+
}
|
|
831
1095
|
})
|
|
832
1096
|
.then((options: any = {}) => {
|
|
833
1097
|
// Normalize the destination.
|
|
@@ -858,49 +1122,61 @@ export default class Meetings extends WebexPlugin {
|
|
|
858
1122
|
// Validate if a meeting was found.
|
|
859
1123
|
if (!meeting) {
|
|
860
1124
|
// Create a meeting based on the normalized destination and type.
|
|
861
|
-
return this.createMeeting(
|
|
862
|
-
|
|
863
|
-
|
|
864
|
-
|
|
865
|
-
|
|
866
|
-
|
|
867
|
-
|
|
868
|
-
|
|
869
|
-
|
|
870
|
-
|
|
871
|
-
|
|
872
|
-
|
|
873
|
-
|
|
874
|
-
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
891
|
-
|
|
892
|
-
|
|
893
|
-
|
|
894
|
-
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
|
|
898
|
-
|
|
899
|
-
|
|
900
|
-
|
|
1125
|
+
return this.createMeeting(
|
|
1126
|
+
targetDest,
|
|
1127
|
+
type,
|
|
1128
|
+
useRandomDelayForInfo,
|
|
1129
|
+
infoExtraParams,
|
|
1130
|
+
callStateForMetrics,
|
|
1131
|
+
failOnMissingMeetingInfo,
|
|
1132
|
+
meetingInfo,
|
|
1133
|
+
meetingLookupUrl
|
|
1134
|
+
).then((createdMeeting: any) => {
|
|
1135
|
+
// If the meeting was successfully created.
|
|
1136
|
+
if (createdMeeting && createdMeeting.on) {
|
|
1137
|
+
// Create a destruction event for the meeting.
|
|
1138
|
+
createdMeeting.on(EVENTS.DESTROY_MEETING, (payload) => {
|
|
1139
|
+
// @ts-ignore
|
|
1140
|
+
if (this.config.autoUploadLogs) {
|
|
1141
|
+
this.uploadLogs({
|
|
1142
|
+
callStart: createdMeeting.locusInfo?.fullState?.lastActive,
|
|
1143
|
+
locussessionid: createdMeeting.locusInfo?.fullState?.sessionId,
|
|
1144
|
+
correlationId: createdMeeting.correlationId,
|
|
1145
|
+
feedbackId: createdMeeting.correlationId,
|
|
1146
|
+
locusId: createdMeeting.locusId,
|
|
1147
|
+
meetingId: createdMeeting.locusInfo?.info?.webExMeetingId,
|
|
1148
|
+
autoupload: true,
|
|
1149
|
+
}).then(() => this.destroy(createdMeeting, payload.reason));
|
|
1150
|
+
} else {
|
|
1151
|
+
this.destroy(createdMeeting, payload.reason);
|
|
1152
|
+
}
|
|
1153
|
+
});
|
|
1154
|
+
|
|
1155
|
+
createdMeeting.on(EVENTS.REQUEST_UPLOAD_LOGS, (meetingInstance) => {
|
|
1156
|
+
// @ts-ignore
|
|
1157
|
+
if (this.config.autoUploadLogs) {
|
|
1158
|
+
this.uploadLogs({
|
|
1159
|
+
callStart: meetingInstance?.locusInfo?.fullState?.lastActive,
|
|
1160
|
+
locussessionid: meetingInstance?.locusInfo?.fullState?.sessionId,
|
|
1161
|
+
correlationId: meetingInstance.correlationId,
|
|
1162
|
+
feedbackId: meetingInstance.correlationId,
|
|
1163
|
+
locusId: meetingInstance.locusId,
|
|
1164
|
+
meetingId: meetingInstance.locusInfo?.info?.webExMeetingId,
|
|
1165
|
+
autoupload: true,
|
|
1166
|
+
});
|
|
1167
|
+
}
|
|
1168
|
+
});
|
|
1169
|
+
} else {
|
|
1170
|
+
LoggerProxy.logger.error(
|
|
1171
|
+
`Meetings:index#create --> ERROR, meeting does not have on method, will not be destroyed, meeting cleanup impossible for meeting: ${meeting}`
|
|
1172
|
+
);
|
|
901
1173
|
}
|
|
902
|
-
|
|
1174
|
+
|
|
1175
|
+
// Return the newly created meeting.
|
|
1176
|
+
return Promise.resolve(createdMeeting);
|
|
1177
|
+
});
|
|
903
1178
|
}
|
|
1179
|
+
meeting.setCallStateForMetrics(callStateForMetrics);
|
|
904
1180
|
|
|
905
1181
|
// Return the existing meeting.
|
|
906
1182
|
return Promise.resolve(meeting);
|
|
@@ -909,9 +1185,18 @@ export default class Meetings extends WebexPlugin {
|
|
|
909
1185
|
}
|
|
910
1186
|
|
|
911
1187
|
/**
|
|
1188
|
+
* Create meeting
|
|
1189
|
+
*
|
|
1190
|
+
* When meeting info passed it should be complete, e.g.: fetched after password or captcha provided
|
|
1191
|
+
*
|
|
912
1192
|
* @param {String} destination see create()
|
|
913
1193
|
* @param {String} type see create()
|
|
914
1194
|
* @param {Boolean} useRandomDelayForInfo whether a random delay should be added to fetching meeting info
|
|
1195
|
+
* @param {Object} infoExtraParams extra parameters to be provided when fetching meeting info
|
|
1196
|
+
* @param {CallStateForMetrics} callStateForMetrics - information about call state for metrics
|
|
1197
|
+
* @param {Boolean} failOnMissingMeetingInfo - whether to throw an error if meeting info fails to fetch (for calls that are not 1:1 or content share)
|
|
1198
|
+
* @param {Object} [meetingInfo] - Pre-fetched complete meeting info
|
|
1199
|
+
* @param {String} [meetingLookupUrl] - meeting info prefetch url
|
|
915
1200
|
* @returns {Promise} a new meeting instance complete with meeting info and destination
|
|
916
1201
|
* @private
|
|
917
1202
|
* @memberof Meetings
|
|
@@ -919,7 +1204,12 @@ export default class Meetings extends WebexPlugin {
|
|
|
919
1204
|
private async createMeeting(
|
|
920
1205
|
destination: any,
|
|
921
1206
|
type: string = null,
|
|
922
|
-
useRandomDelayForInfo = false
|
|
1207
|
+
useRandomDelayForInfo = false,
|
|
1208
|
+
infoExtraParams = {},
|
|
1209
|
+
callStateForMetrics: CallStateForMetrics = undefined,
|
|
1210
|
+
failOnMissingMeetingInfo = false,
|
|
1211
|
+
meetingInfo = undefined,
|
|
1212
|
+
meetingLookupUrl = undefined
|
|
923
1213
|
) {
|
|
924
1214
|
const meeting = new Meeting(
|
|
925
1215
|
{
|
|
@@ -929,11 +1219,11 @@ export default class Meetings extends WebexPlugin {
|
|
|
929
1219
|
deviceUrl: this.webex.internal.device.url,
|
|
930
1220
|
// @ts-ignore
|
|
931
1221
|
orgId: this.webex.internal.device.orgId,
|
|
932
|
-
roapSeq: 0,
|
|
933
1222
|
locus: type === _LOCUS_ID_ ? destination : null, // pass the locus object if present
|
|
934
1223
|
meetingInfoProvider: this.meetingInfo,
|
|
935
1224
|
destination,
|
|
936
1225
|
destinationType: type,
|
|
1226
|
+
callStateForMetrics,
|
|
937
1227
|
},
|
|
938
1228
|
{
|
|
939
1229
|
// @ts-ignore
|
|
@@ -965,22 +1255,45 @@ export default class Meetings extends WebexPlugin {
|
|
|
965
1255
|
const isMeetingActive = !!destination.fullState?.active;
|
|
966
1256
|
// @ts-ignore
|
|
967
1257
|
const {enableUnifiedMeetings} = this.config.experimental;
|
|
968
|
-
|
|
969
|
-
|
|
1258
|
+
const meetingInfoOptions = {
|
|
1259
|
+
extraParams: infoExtraParams,
|
|
1260
|
+
sendCAevents: !!callStateForMetrics?.correlationId, // if client sends correlation id as argument of public create(), then it means that this meeting creation is part of a pre-join intent from user
|
|
1261
|
+
};
|
|
1262
|
+
|
|
1263
|
+
if (meetingInfo) {
|
|
1264
|
+
meeting.injectMeetingInfo(meetingInfo, meetingInfoOptions, meetingLookupUrl);
|
|
1265
|
+
} else if (
|
|
1266
|
+
enableUnifiedMeetings &&
|
|
1267
|
+
!isMeetingActive &&
|
|
1268
|
+
useRandomDelayForInfo &&
|
|
1269
|
+
waitingTime > 0
|
|
1270
|
+
) {
|
|
970
1271
|
meeting.fetchMeetingInfoTimeoutId = setTimeout(
|
|
971
|
-
() => meeting.fetchMeetingInfo(
|
|
1272
|
+
() => meeting.fetchMeetingInfo(meetingInfoOptions),
|
|
972
1273
|
waitingTime
|
|
973
1274
|
);
|
|
974
1275
|
meeting.parseMeetingInfo(undefined, destination);
|
|
975
1276
|
} else {
|
|
976
|
-
await meeting.fetchMeetingInfo(
|
|
1277
|
+
await meeting.fetchMeetingInfo(meetingInfoOptions);
|
|
977
1278
|
}
|
|
978
1279
|
} catch (err) {
|
|
979
|
-
if (
|
|
980
|
-
|
|
1280
|
+
if (
|
|
1281
|
+
!(err instanceof CaptchaError) &&
|
|
1282
|
+
!(err instanceof PasswordError) &&
|
|
1283
|
+
!(err instanceof PermissionError)
|
|
1284
|
+
) {
|
|
981
1285
|
LoggerProxy.logger.info(
|
|
982
1286
|
`Meetings:index#createMeeting --> Info Unable to fetch meeting info for ${destination}.`
|
|
983
1287
|
);
|
|
1288
|
+
if (failOnMissingMeetingInfo) {
|
|
1289
|
+
LoggerProxy.logger.info(
|
|
1290
|
+
`Meetings:index#createMeeting --> Destroying meeting due to missing meeting info.`
|
|
1291
|
+
);
|
|
1292
|
+
// @ts-ignore
|
|
1293
|
+
this.destroy(meeting, MEETING_REMOVED_REASON.MISSING_MEETING_INFO);
|
|
1294
|
+
throw new NoMeetingInfoError();
|
|
1295
|
+
}
|
|
1296
|
+
// if there is no meeting info and no error should be thrown then we assume its a 1:1 call or wireless share
|
|
984
1297
|
LoggerProxy.logger.info(
|
|
985
1298
|
'Meetings:index#createMeeting --> Info assuming this destination is a 1:1 or wireless share'
|
|
986
1299
|
);
|
|
@@ -1033,7 +1346,7 @@ export default class Meetings extends WebexPlugin {
|
|
|
1033
1346
|
//
|
|
1034
1347
|
// Our job is to determine the appropriate one
|
|
1035
1348
|
// and its corresponding service so that developers
|
|
1036
|
-
// need only sipURL
|
|
1349
|
+
// need only sipURL to get a meeting
|
|
1037
1350
|
// and its ID, but have the option to use createWithType()
|
|
1038
1351
|
// and specify those types to get meetingInfo
|
|
1039
1352
|
}
|
|
@@ -1072,38 +1385,116 @@ export default class Meetings extends WebexPlugin {
|
|
|
1072
1385
|
|
|
1073
1386
|
/**
|
|
1074
1387
|
* syncs all the meeting from server
|
|
1075
|
-
* @
|
|
1388
|
+
* @param {boolean} keepOnlyLocusMeetings - whether the sync should keep only locus meetings or any other meeting in meetingCollection
|
|
1389
|
+
* @returns {Promise<void>}
|
|
1076
1390
|
* @public
|
|
1077
1391
|
* @memberof Meetings
|
|
1078
1392
|
*/
|
|
1079
|
-
public syncMeetings() {
|
|
1080
|
-
return this.request
|
|
1081
|
-
|
|
1082
|
-
|
|
1083
|
-
|
|
1084
|
-
|
|
1085
|
-
|
|
1086
|
-
this.
|
|
1087
|
-
|
|
1088
|
-
|
|
1393
|
+
public syncMeetings({keepOnlyLocusMeetings = true} = {}): Promise<void> {
|
|
1394
|
+
return this.request
|
|
1395
|
+
.getActiveMeetings()
|
|
1396
|
+
.then((locusArray) => {
|
|
1397
|
+
const activeLocusUrl = [];
|
|
1398
|
+
|
|
1399
|
+
if (locusArray?.loci && locusArray.loci.length > 0) {
|
|
1400
|
+
const lociToUpdate = this.sortLocusArrayToUpdate(locusArray.loci);
|
|
1401
|
+
lociToUpdate.forEach((locus) => {
|
|
1402
|
+
activeLocusUrl.push(locus.url);
|
|
1403
|
+
this.handleLocusEvent({
|
|
1404
|
+
locus,
|
|
1405
|
+
locusUrl: locus.url,
|
|
1406
|
+
});
|
|
1089
1407
|
});
|
|
1090
|
-
}
|
|
1091
|
-
|
|
1092
|
-
const meetingsCollection = this.meetingCollection.getAll();
|
|
1408
|
+
}
|
|
1409
|
+
const meetingsCollection = this.meetingCollection.getAll();
|
|
1093
1410
|
|
|
1094
|
-
|
|
1095
|
-
|
|
1096
|
-
|
|
1097
|
-
|
|
1098
|
-
|
|
1099
|
-
if (!activeLocusUrl.includes(meeting.locusUrl)) {
|
|
1100
|
-
// destroy function also uploads logs
|
|
1411
|
+
if (Object.keys(meetingsCollection).length > 0) {
|
|
1412
|
+
// Sometimes the mercury events are lost after mercury reconnect
|
|
1413
|
+
// Remove any Locus meetings that are not returned by Locus
|
|
1414
|
+
// (they had a locusUrl previously but are no longer active) in the sync
|
|
1415
|
+
for (const meeting of Object.values(meetingsCollection)) {
|
|
1101
1416
|
// @ts-ignore
|
|
1102
|
-
|
|
1417
|
+
const {locusUrl} = meeting;
|
|
1418
|
+
if ((keepOnlyLocusMeetings || locusUrl) && !activeLocusUrl.includes(locusUrl)) {
|
|
1419
|
+
// destroy function also uploads logs
|
|
1420
|
+
// @ts-ignore
|
|
1421
|
+
this.destroy(meeting, MEETING_REMOVED_REASON.NO_MEETINGS_TO_SYNC);
|
|
1422
|
+
}
|
|
1103
1423
|
}
|
|
1104
1424
|
}
|
|
1425
|
+
})
|
|
1426
|
+
.catch((error) => {
|
|
1427
|
+
LoggerProxy.logger.error(
|
|
1428
|
+
`Meetings:index#syncMeetings --> failed to sync meetings, ${error}`
|
|
1429
|
+
);
|
|
1430
|
+
throw new Error(error);
|
|
1431
|
+
});
|
|
1432
|
+
}
|
|
1433
|
+
|
|
1434
|
+
/**
|
|
1435
|
+
* sort out locus array for initial creating
|
|
1436
|
+
* @param {Array} loci original locus array
|
|
1437
|
+
* @returns {undefined}
|
|
1438
|
+
* @public
|
|
1439
|
+
* @memberof Meetings
|
|
1440
|
+
*/
|
|
1441
|
+
sortLocusArrayToUpdate(loci: any[]) {
|
|
1442
|
+
const mainLoci = loci.filter((locus) => !MeetingsUtil.isBreakoutLocusDTO(locus));
|
|
1443
|
+
const breakoutLoci = loci.filter((locus) => MeetingsUtil.isValidBreakoutLocus(locus));
|
|
1444
|
+
this.breakoutLocusForHandleLater = [];
|
|
1445
|
+
const lociToUpdate = [...mainLoci];
|
|
1446
|
+
breakoutLoci.forEach((breakoutLocus) => {
|
|
1447
|
+
const associateMainLocus = mainLoci.find(
|
|
1448
|
+
(mainLocus) => mainLocus.controls?.breakout?.url === breakoutLocus.controls?.breakout?.url
|
|
1449
|
+
);
|
|
1450
|
+
const existCorrespondingMeeting = this.getCorrespondingMeetingByLocus({
|
|
1451
|
+
locus: breakoutLocus,
|
|
1452
|
+
locusUrl: breakoutLocus.url,
|
|
1453
|
+
});
|
|
1454
|
+
|
|
1455
|
+
if (associateMainLocus && !existCorrespondingMeeting) {
|
|
1456
|
+
// if exists both main session and breakout session locus of the same non-exist meeting, handle main locus first,
|
|
1457
|
+
// after meeting create with main locus, then handle the associate breakout locus.
|
|
1458
|
+
// if only handle breakout locus, will miss some date
|
|
1459
|
+
this.breakoutLocusForHandleLater.push(breakoutLocus);
|
|
1460
|
+
} else {
|
|
1461
|
+
lociToUpdate.push(breakoutLocus);
|
|
1105
1462
|
}
|
|
1106
1463
|
});
|
|
1464
|
+
|
|
1465
|
+
return lociToUpdate;
|
|
1466
|
+
}
|
|
1467
|
+
|
|
1468
|
+
/**
|
|
1469
|
+
* check breakout locus which waiting for main locus's meeting to be created, then handle the breakout locus
|
|
1470
|
+
* @param {Object} newCreatedLocus the locus which just create meeting object of it
|
|
1471
|
+
* @returns {undefined}
|
|
1472
|
+
* @public
|
|
1473
|
+
* @memberof Meetings
|
|
1474
|
+
*/
|
|
1475
|
+
checkHandleBreakoutLocus(newCreatedLocus) {
|
|
1476
|
+
if (
|
|
1477
|
+
!newCreatedLocus ||
|
|
1478
|
+
!this.breakoutLocusForHandleLater ||
|
|
1479
|
+
!this.breakoutLocusForHandleLater.length
|
|
1480
|
+
) {
|
|
1481
|
+
return;
|
|
1482
|
+
}
|
|
1483
|
+
if (MeetingsUtil.isBreakoutLocusDTO(newCreatedLocus)) {
|
|
1484
|
+
return;
|
|
1485
|
+
}
|
|
1486
|
+
const existIndex = this.breakoutLocusForHandleLater.findIndex(
|
|
1487
|
+
(breakoutLocus) =>
|
|
1488
|
+
breakoutLocus.controls?.breakout?.url === newCreatedLocus.controls?.breakout?.url
|
|
1489
|
+
);
|
|
1490
|
+
|
|
1491
|
+
if (existIndex < 0) {
|
|
1492
|
+
return;
|
|
1493
|
+
}
|
|
1494
|
+
|
|
1495
|
+
const associateBreakoutLocus = this.breakoutLocusForHandleLater[existIndex];
|
|
1496
|
+
this.handleLocusEvent({locus: associateBreakoutLocus, locusUrl: associateBreakoutLocus.url});
|
|
1497
|
+
this.breakoutLocusForHandleLater.splice(existIndex, 1);
|
|
1107
1498
|
}
|
|
1108
1499
|
|
|
1109
1500
|
/**
|
|
@@ -1125,4 +1516,15 @@ export default class Meetings extends WebexPlugin {
|
|
|
1125
1516
|
getLogger() {
|
|
1126
1517
|
return LoggerProxy.get();
|
|
1127
1518
|
}
|
|
1519
|
+
|
|
1520
|
+
/**
|
|
1521
|
+
* Returns the first meeting it finds that has the webrtc media connection created.
|
|
1522
|
+
* Useful for debugging in the console.
|
|
1523
|
+
*
|
|
1524
|
+
* @private
|
|
1525
|
+
* @returns {Meeting} Meeting object that has a webrtc media connection, else undefined
|
|
1526
|
+
*/
|
|
1527
|
+
getActiveWebrtcMeeting() {
|
|
1528
|
+
return this.meetingCollection.getActiveWebrtcMeeting();
|
|
1529
|
+
}
|
|
1128
1530
|
}
|