@webex/plugin-meetings 2.60.0 → 2.60.1-next.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +46 -8
- package/dist/annotation/annotation.types.d.ts +42 -0
- package/dist/annotation/annotation.types.js +7 -0
- package/dist/annotation/annotation.types.js.map +1 -0
- package/dist/annotation/constants.d.ts +31 -0
- package/dist/annotation/constants.js +41 -0
- package/dist/annotation/constants.js.map +1 -0
- package/dist/annotation/index.d.ts +117 -0
- package/dist/annotation/index.js +357 -0
- package/dist/annotation/index.js.map +1 -0
- package/dist/breakouts/breakout.d.ts +8 -0
- package/dist/breakouts/breakout.js +215 -0
- package/dist/breakouts/breakout.js.map +1 -0
- package/dist/breakouts/collection.d.ts +5 -0
- package/dist/breakouts/collection.js +22 -0
- package/dist/breakouts/collection.js.map +1 -0
- package/dist/breakouts/edit-lock-error.d.ts +15 -0
- package/dist/breakouts/edit-lock-error.js +51 -0
- package/dist/breakouts/edit-lock-error.js.map +1 -0
- package/dist/breakouts/events.d.ts +8 -0
- package/dist/breakouts/events.js +44 -0
- package/dist/breakouts/events.js.map +1 -0
- package/dist/breakouts/index.d.ts +5 -0
- package/dist/breakouts/index.js +1047 -0
- package/dist/breakouts/index.js.map +1 -0
- package/dist/breakouts/request.d.ts +22 -0
- package/dist/breakouts/request.js +77 -0
- package/dist/breakouts/request.js.map +1 -0
- package/dist/breakouts/utils.d.ts +15 -0
- package/dist/breakouts/utils.js +64 -0
- package/dist/breakouts/utils.js.map +1 -0
- package/dist/common/browser-detection.js +2 -3
- package/dist/common/browser-detection.js.map +1 -1
- package/dist/common/collection.js +3 -4
- package/dist/common/collection.js.map +1 -1
- package/dist/common/config.js +1 -2
- package/dist/common/config.js.map +1 -1
- package/dist/common/errors/captcha-error.js +1 -2
- package/dist/common/errors/captcha-error.js.map +1 -1
- package/dist/common/errors/intent-to-join.js +1 -2
- package/dist/common/errors/intent-to-join.js.map +1 -1
- package/dist/common/errors/join-meeting.js +1 -2
- package/dist/common/errors/join-meeting.js.map +1 -1
- package/dist/common/errors/media.js +1 -2
- package/dist/common/errors/media.js.map +1 -1
- package/dist/common/errors/no-meeting-info.d.ts +14 -0
- package/dist/common/errors/no-meeting-info.js +50 -0
- package/dist/common/errors/no-meeting-info.js.map +1 -0
- package/dist/common/errors/parameter.js +3 -4
- package/dist/common/errors/parameter.js.map +1 -1
- package/dist/common/errors/password-error.js +1 -2
- package/dist/common/errors/password-error.js.map +1 -1
- package/dist/common/errors/permission.js +1 -2
- package/dist/common/errors/permission.js.map +1 -1
- package/dist/common/errors/{reclaim-host-role-error.js → reclaim-host-role-errors.js} +7 -11
- package/dist/common/errors/reclaim-host-role-errors.js.map +1 -0
- package/dist/common/errors/reconnection-in-progress.js +1 -2
- package/dist/common/errors/reconnection-in-progress.js.map +1 -1
- package/dist/common/errors/reconnection.js +1 -2
- package/dist/common/errors/reconnection.js.map +1 -1
- package/dist/common/errors/stats.js +1 -2
- package/dist/common/errors/stats.js.map +1 -1
- package/dist/common/errors/webex-errors.d.ts +20 -8
- package/dist/common/errors/webex-errors.js +48 -28
- package/dist/common/errors/webex-errors.js.map +1 -1
- package/dist/common/errors/webex-meetings-error.js +1 -2
- package/dist/common/errors/webex-meetings-error.js.map +1 -1
- package/dist/common/events/events-scope.js +1 -2
- package/dist/common/events/events-scope.js.map +1 -1
- package/dist/common/events/events.js +1 -2
- package/dist/common/events/events.js.map +1 -1
- package/dist/common/events/trigger-proxy.js +1 -2
- package/dist/common/events/trigger-proxy.js.map +1 -1
- package/dist/common/events/util.js +1 -2
- package/dist/common/events/util.js.map +1 -1
- package/dist/common/logs/logger-config.js +1 -2
- package/dist/common/logs/logger-config.js.map +1 -1
- package/dist/common/logs/logger-proxy.js +2 -3
- package/dist/common/logs/logger-proxy.js.map +1 -1
- package/dist/common/logs/request.d.ts +3 -1
- package/dist/common/logs/request.js +8 -5
- package/dist/common/logs/request.js.map +1 -1
- package/dist/common/queue.d.ts +9 -7
- package/dist/common/queue.js +22 -9
- package/dist/common/queue.js.map +1 -1
- package/dist/config.d.ts +6 -7
- package/dist/config.js +8 -10
- package/dist/config.js.map +1 -1
- package/dist/constants.d.ts +217 -97
- package/dist/constants.js +416 -441
- package/dist/constants.js.map +1 -1
- package/dist/controls-options-manager/constants.js +3 -6
- package/dist/controls-options-manager/constants.js.map +1 -1
- package/dist/controls-options-manager/enums.d.ts +11 -1
- package/dist/controls-options-manager/enums.js +15 -6
- package/dist/controls-options-manager/enums.js.map +1 -1
- package/dist/controls-options-manager/index.d.ts +17 -1
- package/dist/controls-options-manager/index.js +127 -38
- package/dist/controls-options-manager/index.js.map +1 -1
- package/dist/controls-options-manager/types.d.ts +43 -0
- package/dist/controls-options-manager/types.js +7 -0
- package/dist/controls-options-manager/types.js.map +1 -0
- package/dist/controls-options-manager/util.d.ts +1 -7
- package/dist/controls-options-manager/util.js +309 -19
- package/dist/controls-options-manager/util.js.map +1 -1
- package/dist/index.d.ts +6 -3
- package/dist/index.js +121 -5
- package/dist/index.js.map +1 -1
- package/dist/interceptors/index.d.ts +2 -0
- package/dist/interceptors/index.js +15 -0
- package/dist/interceptors/index.js.map +1 -0
- package/dist/interceptors/locusRetry.d.ts +27 -0
- package/dist/interceptors/locusRetry.js +94 -0
- package/dist/interceptors/locusRetry.js.map +1 -0
- package/dist/interpretation/collection.d.ts +5 -0
- package/dist/interpretation/collection.js +22 -0
- package/dist/interpretation/collection.js.map +1 -0
- package/dist/interpretation/index.d.ts +5 -0
- package/dist/interpretation/index.js +365 -0
- package/dist/interpretation/index.js.map +1 -0
- package/dist/interpretation/siLanguage.d.ts +5 -0
- package/dist/interpretation/siLanguage.js +24 -0
- package/dist/interpretation/siLanguage.js.map +1 -0
- package/dist/locus-info/controlsUtils.js +100 -11
- package/dist/locus-info/controlsUtils.js.map +1 -1
- package/dist/locus-info/embeddedAppsUtils.js +3 -4
- package/dist/locus-info/embeddedAppsUtils.js.map +1 -1
- package/dist/locus-info/fullState.js +1 -2
- package/dist/locus-info/fullState.js.map +1 -1
- package/dist/locus-info/hostUtils.js +1 -2
- package/dist/locus-info/hostUtils.js.map +1 -1
- package/dist/locus-info/index.d.ts +57 -4
- package/dist/locus-info/index.js +425 -84
- package/dist/locus-info/index.js.map +1 -1
- package/dist/locus-info/infoUtils.js +13 -5
- package/dist/locus-info/infoUtils.js.map +1 -1
- package/dist/locus-info/mediaSharesUtils.js +58 -3
- package/dist/locus-info/mediaSharesUtils.js.map +1 -1
- package/dist/locus-info/parser.d.ts +66 -6
- package/dist/locus-info/parser.js +253 -80
- package/dist/locus-info/parser.js.map +1 -1
- package/dist/locus-info/selfUtils.js +97 -13
- package/dist/locus-info/selfUtils.js.map +1 -1
- package/dist/media/index.d.ts +2 -0
- package/dist/media/index.js +107 -319
- package/dist/media/index.js.map +1 -1
- package/dist/media/properties.d.ts +38 -53
- package/dist/media/properties.js +96 -153
- package/dist/media/properties.js.map +1 -1
- package/dist/media/util.js +1 -22
- package/dist/media/util.js.map +1 -1
- package/dist/mediaQualityMetrics/config.d.ts +234 -230
- package/dist/mediaQualityMetrics/config.js +302 -498
- package/dist/mediaQualityMetrics/config.js.map +1 -1
- package/dist/meeting/in-meeting-actions.d.ts +88 -0
- package/dist/meeting/in-meeting-actions.js +94 -3
- package/dist/meeting/in-meeting-actions.js.map +1 -1
- package/dist/meeting/index.d.ts +591 -494
- package/dist/meeting/index.js +4732 -2990
- package/dist/meeting/index.js.map +1 -1
- package/dist/meeting/locusMediaRequest.d.ts +74 -0
- package/dist/meeting/locusMediaRequest.js +291 -0
- package/dist/meeting/locusMediaRequest.js.map +1 -0
- package/dist/meeting/muteState.d.ts +93 -25
- package/dist/meeting/muteState.js +224 -133
- package/dist/meeting/muteState.js.map +1 -1
- package/dist/meeting/request.d.ts +82 -47
- package/dist/meeting/request.js +297 -199
- package/dist/meeting/request.js.map +1 -1
- package/dist/meeting/request.type.d.ts +11 -0
- package/dist/meeting/request.type.js +7 -0
- package/dist/meeting/request.type.js.map +1 -0
- package/dist/meeting/state.js +1 -2
- package/dist/meeting/state.js.map +1 -1
- package/dist/meeting/util.d.ts +102 -1
- package/dist/meeting/util.js +605 -435
- package/dist/meeting/util.js.map +1 -1
- package/dist/meeting-info/collection.js +3 -4
- package/dist/meeting-info/collection.js.map +1 -1
- package/dist/meeting-info/index.d.ts +13 -1
- package/dist/meeting-info/index.js +74 -7
- package/dist/meeting-info/index.js.map +1 -1
- package/dist/meeting-info/meeting-info-v2.d.ts +31 -1
- package/dist/meeting-info/meeting-info-v2.js +200 -63
- package/dist/meeting-info/meeting-info-v2.js.map +1 -1
- package/dist/meeting-info/request.js +1 -2
- package/dist/meeting-info/request.js.map +1 -1
- package/dist/meeting-info/util.js +2 -3
- package/dist/meeting-info/util.js.map +1 -1
- package/dist/meeting-info/utilv2.js +39 -41
- package/dist/meeting-info/utilv2.js.map +1 -1
- package/dist/meetings/collection.d.ts +17 -0
- package/dist/meetings/collection.js +42 -4
- package/dist/meetings/collection.js.map +1 -1
- package/dist/meetings/index.d.ts +93 -21
- package/dist/meetings/index.js +490 -127
- package/dist/meetings/index.js.map +1 -1
- package/dist/meetings/meetings.types.d.ts +4 -0
- package/dist/meetings/meetings.types.js +7 -0
- package/dist/meetings/meetings.types.js.map +1 -0
- package/dist/meetings/request.js +4 -3
- package/dist/meetings/request.js.map +1 -1
- package/dist/meetings/util.js +107 -6
- package/dist/meetings/util.js.map +1 -1
- package/dist/member/index.d.ts +13 -1
- package/dist/member/index.js +45 -2
- package/dist/member/index.js.map +1 -1
- package/dist/member/member.types.js +3 -4
- package/dist/member/member.types.js.map +1 -1
- package/dist/member/types.d.ts +32 -0
- package/dist/member/types.js +23 -0
- package/dist/member/types.js.map +1 -0
- package/dist/member/util.js +120 -29
- package/dist/member/util.js.map +1 -1
- package/dist/members/collection.d.ts +5 -0
- package/dist/members/collection.js +11 -2
- package/dist/members/collection.js.map +1 -1
- package/dist/members/index.d.ts +56 -11
- package/dist/members/index.js +174 -47
- package/dist/members/index.js.map +1 -1
- package/dist/members/request.d.ts +67 -11
- package/dist/members/request.js +102 -54
- package/dist/members/request.js.map +1 -1
- package/dist/members/types.js +3 -4
- package/dist/members/types.js.map +1 -1
- package/dist/members/util.d.ts +214 -1
- package/dist/members/util.js +327 -284
- package/dist/members/util.js.map +1 -1
- package/dist/metrics/constants.d.ts +15 -6
- package/dist/metrics/constants.js +17 -9
- package/dist/metrics/constants.js.map +1 -1
- package/dist/metrics/index.d.ts +4 -111
- package/dist/metrics/index.js +4 -452
- package/dist/metrics/index.js.map +1 -1
- package/dist/multistream/mediaRequestManager.d.ts +118 -0
- package/dist/multistream/mediaRequestManager.js +344 -0
- package/dist/multistream/mediaRequestManager.js.map +1 -0
- package/dist/multistream/receiveSlot.d.ts +68 -0
- package/dist/multistream/receiveSlot.js +200 -0
- package/dist/multistream/receiveSlot.js.map +1 -0
- package/dist/multistream/receiveSlotManager.d.ts +56 -0
- package/dist/multistream/receiveSlotManager.js +174 -0
- package/dist/multistream/receiveSlotManager.js.map +1 -0
- package/dist/multistream/remoteMedia.d.ts +72 -0
- package/dist/multistream/remoteMedia.js +268 -0
- package/dist/multistream/remoteMedia.js.map +1 -0
- package/dist/multistream/remoteMediaGroup.d.ts +47 -0
- package/dist/multistream/remoteMediaGroup.js +267 -0
- package/dist/multistream/remoteMediaGroup.js.map +1 -0
- package/dist/multistream/remoteMediaManager.d.ts +285 -0
- package/dist/multistream/remoteMediaManager.js +1211 -0
- package/dist/multistream/remoteMediaManager.js.map +1 -0
- package/dist/multistream/sendSlotManager.d.ts +61 -0
- package/dist/multistream/sendSlotManager.js +236 -0
- package/dist/multistream/sendSlotManager.js.map +1 -0
- package/dist/networkQualityMonitor/index.js +5 -4
- package/dist/networkQualityMonitor/index.js.map +1 -1
- package/dist/personal-meeting-room/index.js +2 -3
- package/dist/personal-meeting-room/index.js.map +1 -1
- package/dist/personal-meeting-room/request.js +2 -3
- package/dist/personal-meeting-room/request.js.map +1 -1
- package/dist/personal-meeting-room/util.js +1 -2
- package/dist/personal-meeting-room/util.js.map +1 -1
- package/dist/reachability/clusterReachability.d.ts +109 -0
- package/dist/reachability/clusterReachability.js +357 -0
- package/dist/reachability/clusterReachability.js.map +1 -0
- package/dist/reachability/index.d.ts +61 -95
- package/dist/reachability/index.js +300 -393
- package/dist/reachability/index.js.map +1 -1
- package/dist/reachability/request.d.ts +7 -3
- package/dist/reachability/request.js +18 -10
- package/dist/reachability/request.js.map +1 -1
- package/dist/reachability/util.d.ts +8 -0
- package/dist/reachability/util.js +29 -0
- package/dist/reachability/util.js.map +1 -0
- package/dist/reactions/constants.d.ts +3 -0
- package/dist/reactions/constants.js +12 -0
- package/dist/reactions/constants.js.map +1 -0
- package/dist/reactions/reactions.d.ts +2 -2
- package/dist/reactions/reactions.js +4 -6
- package/dist/reactions/reactions.js.map +1 -1
- package/dist/reactions/reactions.type.d.ts +23 -3
- package/dist/reactions/reactions.type.js +21 -23
- package/dist/reactions/reactions.type.js.map +1 -1
- package/dist/reconnection-manager/index.d.ts +32 -8
- package/dist/reconnection-manager/index.js +282 -231
- package/dist/reconnection-manager/index.js.map +1 -1
- package/dist/recording-controller/enums.js +4 -5
- package/dist/recording-controller/enums.js.map +1 -1
- package/dist/recording-controller/index.d.ts +15 -1
- package/dist/recording-controller/index.js +57 -46
- package/dist/recording-controller/index.js.map +1 -1
- package/dist/recording-controller/util.d.ts +5 -4
- package/dist/recording-controller/util.js +10 -10
- package/dist/recording-controller/util.js.map +1 -1
- package/dist/roap/index.d.ts +9 -47
- package/dist/roap/index.js +101 -235
- package/dist/roap/index.js.map +1 -1
- package/dist/roap/request.d.ts +18 -12
- package/dist/roap/request.js +126 -180
- package/dist/roap/request.js.map +1 -1
- package/dist/roap/turnDiscovery.d.ts +27 -16
- package/dist/roap/turnDiscovery.js +115 -105
- package/dist/roap/turnDiscovery.js.map +1 -1
- package/dist/rtcMetrics/constants.d.ts +4 -0
- package/dist/rtcMetrics/constants.js +11 -0
- package/dist/rtcMetrics/constants.js.map +1 -0
- package/dist/rtcMetrics/index.d.ts +54 -0
- package/dist/rtcMetrics/index.js +140 -0
- package/dist/rtcMetrics/index.js.map +1 -0
- package/dist/statsAnalyzer/global.d.ts +1 -83
- package/dist/statsAnalyzer/global.js +2 -85
- package/dist/statsAnalyzer/global.js.map +1 -1
- package/dist/statsAnalyzer/index.d.ts +50 -30
- package/dist/statsAnalyzer/index.js +435 -510
- package/dist/statsAnalyzer/index.js.map +1 -1
- package/dist/statsAnalyzer/mqaUtil.d.ts +8 -6
- package/dist/statsAnalyzer/mqaUtil.js +120 -83
- package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
- package/dist/transcription/index.js +1 -2
- package/dist/transcription/index.js.map +1 -1
- package/dist/webinar/collection.d.ts +16 -0
- package/dist/webinar/collection.js +43 -0
- package/dist/webinar/collection.js.map +1 -0
- package/dist/webinar/index.d.ts +5 -0
- package/dist/webinar/index.js +68 -0
- package/dist/webinar/index.js.map +1 -0
- package/package.json +38 -26
- package/src/annotation/annotation.types.ts +50 -0
- package/src/annotation/constants.ts +36 -0
- package/src/annotation/index.ts +328 -0
- package/src/breakouts/README.md +220 -0
- package/src/breakouts/breakout.ts +188 -0
- package/src/breakouts/collection.ts +19 -0
- package/src/breakouts/edit-lock-error.ts +25 -0
- package/src/breakouts/events.ts +56 -0
- package/src/breakouts/index.ts +925 -0
- package/src/breakouts/request.ts +55 -0
- package/src/breakouts/utils.ts +57 -0
- package/src/common/errors/no-meeting-info.ts +24 -0
- package/src/common/errors/webex-errors.ts +36 -12
- package/src/common/logs/logger-proxy.ts +1 -1
- package/src/common/logs/request.ts +5 -1
- package/src/common/queue.ts +22 -8
- package/src/config.ts +6 -7
- package/src/constants.ts +244 -97
- package/src/controls-options-manager/enums.ts +12 -0
- package/src/controls-options-manager/index.ts +116 -21
- package/src/controls-options-manager/types.ts +59 -0
- package/src/controls-options-manager/util.ts +294 -14
- package/src/index.ts +44 -0
- package/src/interceptors/index.ts +3 -0
- package/src/interceptors/locusRetry.ts +67 -0
- package/src/interpretation/README.md +60 -0
- package/src/interpretation/collection.ts +19 -0
- package/src/interpretation/index.ts +332 -0
- package/src/interpretation/siLanguage.ts +18 -0
- package/src/locus-info/controlsUtils.ts +110 -0
- package/src/locus-info/index.ts +449 -61
- package/src/locus-info/infoUtils.ts +14 -2
- package/src/locus-info/mediaSharesUtils.ts +64 -0
- package/src/locus-info/parser.ts +258 -47
- package/src/locus-info/selfUtils.ts +85 -2
- package/src/media/index.ts +153 -370
- package/src/media/properties.ts +106 -136
- package/src/media/util.ts +0 -21
- package/src/mediaQualityMetrics/config.ts +244 -377
- package/src/meeting/in-meeting-actions.ts +176 -0
- package/src/meeting/index.ts +3944 -2489
- package/src/meeting/locusMediaRequest.ts +313 -0
- package/src/meeting/muteState.ts +224 -138
- package/src/meeting/request.ts +207 -127
- package/src/meeting/request.type.ts +13 -0
- package/src/meeting/util.ts +590 -423
- package/src/meeting-info/index.ts +81 -8
- package/src/meeting-info/meeting-info-v2.ts +163 -13
- package/src/meeting-info/util.ts +1 -1
- package/src/meeting-info/utilv2.ts +28 -28
- package/src/meetings/collection.ts +33 -0
- package/src/meetings/index.ts +487 -126
- package/src/meetings/meetings.types.ts +12 -0
- package/src/meetings/request.ts +2 -0
- package/src/meetings/util.ts +116 -5
- package/src/member/index.ts +43 -1
- package/src/member/types.ts +38 -0
- package/src/member/util.ts +125 -28
- package/src/members/collection.ts +8 -0
- package/src/members/index.ts +187 -52
- package/src/members/request.ts +87 -27
- package/src/members/util.ts +332 -291
- package/src/metrics/constants.ts +15 -6
- package/src/metrics/index.ts +1 -471
- package/src/multistream/mediaRequestManager.ts +440 -0
- package/src/multistream/receiveSlot.ts +184 -0
- package/src/multistream/receiveSlotManager.ts +166 -0
- package/src/multistream/remoteMedia.ts +254 -0
- package/src/multistream/remoteMediaGroup.ts +284 -0
- package/src/multistream/remoteMediaManager.ts +1145 -0
- package/src/multistream/sendSlotManager.ts +170 -0
- package/src/networkQualityMonitor/index.ts +6 -6
- package/src/reachability/clusterReachability.ts +320 -0
- package/src/reachability/index.ts +243 -347
- package/src/reachability/request.ts +17 -8
- package/src/reachability/util.ts +24 -0
- package/src/reactions/constants.ts +4 -0
- package/src/reactions/reactions.ts +4 -4
- package/src/reactions/reactions.type.ts +30 -4
- package/src/reconnection-manager/index.ts +168 -156
- package/src/recording-controller/index.ts +20 -3
- package/src/recording-controller/util.ts +26 -9
- package/src/roap/index.ts +98 -241
- package/src/roap/request.ts +74 -148
- package/src/roap/turnDiscovery.ts +62 -56
- package/src/rtcMetrics/constants.ts +3 -0
- package/src/rtcMetrics/index.ts +124 -0
- package/src/statsAnalyzer/global.ts +1 -84
- package/src/statsAnalyzer/index.ts +477 -643
- package/src/statsAnalyzer/mqaUtil.ts +115 -114
- package/src/webinar/collection.ts +31 -0
- package/src/webinar/index.ts +62 -0
- package/test/integration/spec/converged-space-meetings.js +233 -0
- package/test/integration/spec/journey.js +320 -264
- package/test/integration/spec/space-meeting.js +77 -4
- package/test/unit/spec/annotation/index.ts +418 -0
- package/test/unit/spec/breakouts/breakout.ts +237 -0
- package/test/unit/spec/breakouts/collection.ts +15 -0
- package/test/unit/spec/breakouts/edit-lock-error.ts +30 -0
- package/test/unit/spec/breakouts/events.ts +89 -0
- package/test/unit/spec/breakouts/index.ts +1790 -0
- package/test/unit/spec/breakouts/request.ts +104 -0
- package/test/unit/spec/breakouts/utils.js +72 -0
- package/test/unit/spec/common/queue.js +31 -2
- package/test/unit/spec/controls-options-manager/index.js +163 -0
- package/test/unit/spec/controls-options-manager/util.js +576 -60
- package/test/unit/spec/fixture/locus.js +1 -0
- package/test/unit/spec/interceptors/locusRetry.ts +131 -0
- package/test/unit/spec/interpretation/collection.ts +15 -0
- package/test/unit/spec/interpretation/index.ts +589 -0
- package/test/unit/spec/interpretation/siLanguage.ts +28 -0
- package/test/unit/spec/locus-info/controlsUtils.js +323 -30
- package/test/unit/spec/locus-info/index.js +1390 -16
- package/test/unit/spec/locus-info/infoUtils.js +54 -16
- package/test/unit/spec/locus-info/lib/SeqCmp.json +16 -0
- package/test/unit/spec/locus-info/lib/selfConstant.js +48 -0
- package/test/unit/spec/locus-info/mediaSharesUtils.ts +32 -0
- package/test/unit/spec/locus-info/parser.js +116 -35
- package/test/unit/spec/locus-info/selfUtils.js +275 -0
- package/test/unit/spec/media/index.ts +290 -0
- package/test/unit/spec/media/properties.ts +75 -84
- package/test/unit/spec/meeting/in-meeting-actions.ts +86 -0
- package/test/unit/spec/meeting/index.js +8187 -2769
- package/test/unit/spec/meeting/locusMediaRequest.ts +442 -0
- package/test/unit/spec/meeting/muteState.js +409 -213
- package/test/unit/spec/meeting/request.js +512 -42
- package/test/unit/spec/meeting/utils.js +741 -24
- package/test/unit/spec/meeting-info/index.js +300 -0
- package/test/unit/spec/meeting-info/meetinginfov2.js +527 -5
- package/test/unit/spec/meeting-info/utilv2.js +21 -0
- package/test/unit/spec/meetings/collection.js +26 -0
- package/test/unit/spec/meetings/index.js +1313 -243
- package/test/unit/spec/meetings/utils.js +202 -2
- package/test/unit/spec/member/index.js +32 -9
- package/test/unit/spec/member/util.js +499 -61
- package/test/unit/spec/members/index.js +394 -5
- package/test/unit/spec/members/request.js +206 -27
- package/test/unit/spec/members/utils.js +173 -38
- package/test/unit/spec/metrics/index.js +1 -50
- package/test/unit/spec/multistream/mediaRequestManager.ts +1418 -0
- package/test/unit/spec/multistream/receiveSlot.ts +163 -0
- package/test/unit/spec/multistream/receiveSlotManager.ts +203 -0
- package/test/unit/spec/multistream/remoteMedia.ts +255 -0
- package/test/unit/spec/multistream/remoteMediaGroup.ts +662 -0
- package/test/unit/spec/multistream/remoteMediaManager.ts +1924 -0
- package/test/unit/spec/multistream/sendSlotManager.ts +242 -0
- package/test/unit/spec/networkQualityMonitor/index.js +4 -4
- package/test/unit/spec/reachability/clusterReachability.ts +279 -0
- package/test/unit/spec/reachability/index.ts +531 -24
- package/test/unit/spec/reachability/request.js +68 -0
- package/test/unit/spec/reachability/util.ts +40 -0
- package/test/unit/spec/reconnection-manager/index.js +162 -24
- package/test/unit/spec/recording-controller/index.js +293 -218
- package/test/unit/spec/recording-controller/util.js +223 -96
- package/test/unit/spec/roap/index.ts +200 -76
- package/test/unit/spec/roap/request.ts +255 -0
- package/test/unit/spec/roap/turnDiscovery.ts +86 -48
- package/test/unit/spec/rtcMetrics/index.ts +93 -0
- package/test/unit/spec/stats-analyzer/index.js +261 -167
- package/test/unit/spec/webinar/collection.ts +13 -0
- package/test/unit/spec/webinar/index.ts +60 -0
- package/test/utils/constants.js +9 -0
- package/test/utils/integrationTestUtils.js +46 -0
- package/test/utils/testUtils.js +0 -45
- package/test/utils/webex-config.js +4 -0
- package/test/utils/webex-test-users.js +7 -3
- package/dist/common/errors/reclaim-host-role-error.js.map +0 -1
- package/dist/meeting/effectsState.d.ts +0 -42
- package/dist/meeting/effectsState.js +0 -260
- package/dist/meeting/effectsState.js.map +0 -1
- package/dist/metrics/config.d.ts +0 -169
- package/dist/metrics/config.js +0 -289
- package/dist/metrics/config.js.map +0 -1
- package/dist/peer-connection-manager/index.d.ts +0 -6
- package/dist/peer-connection-manager/index.js +0 -671
- package/dist/peer-connection-manager/index.js.map +0 -1
- package/dist/peer-connection-manager/util.d.ts +0 -6
- package/dist/peer-connection-manager/util.js +0 -110
- package/dist/peer-connection-manager/util.js.map +0 -1
- package/dist/roap/collection.d.ts +0 -10
- package/dist/roap/collection.js +0 -63
- package/dist/roap/collection.js.map +0 -1
- package/dist/roap/handler.d.ts +0 -47
- package/dist/roap/handler.js +0 -279
- package/dist/roap/handler.js.map +0 -1
- package/dist/roap/state.d.ts +0 -9
- package/dist/roap/state.js +0 -127
- package/dist/roap/state.js.map +0 -1
- package/dist/roap/util.d.ts +0 -2
- package/dist/roap/util.js +0 -76
- package/dist/roap/util.js.map +0 -1
- package/src/index.js +0 -15
- package/src/meeting/effectsState.ts +0 -209
- package/src/metrics/config.ts +0 -485
- package/src/peer-connection-manager/index.ts +0 -847
- package/src/peer-connection-manager/util.ts +0 -119
- package/src/roap/collection.ts +0 -62
- package/src/roap/handler.ts +0 -294
- package/src/roap/state.ts +0 -156
- package/src/roap/util.ts +0 -100
- package/test/unit/spec/meeting/effectsState.js +0 -281
- package/test/unit/spec/peerconnection-manager/index.js +0 -218
- package/test/unit/spec/peerconnection-manager/utils.js +0 -49
- package/test/unit/spec/peerconnection-manager/utils.test-fixtures.ts +0 -388
- package/test/unit/spec/roap/util.js +0 -30
- /package/dist/common/errors/{reclaim-host-role-error.d.ts → reclaim-host-role-errors.d.ts} +0 -0
- /package/src/common/errors/{reclaim-host-role-error.ts → reclaim-host-role-errors.ts} +0 -0
package/src/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
|
+
}
|
|
54
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
|
+
}
|
|
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,
|
|
@@ -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
|
|
|
@@ -486,21 +681,6 @@ export default class Meetings extends WebexPlugin {
|
|
|
486
681
|
}
|
|
487
682
|
}
|
|
488
683
|
|
|
489
|
-
/**
|
|
490
|
-
* API to enable or disable TURN discovery
|
|
491
|
-
* @param {Boolean} enable
|
|
492
|
-
* @private
|
|
493
|
-
* @memberof Meetings
|
|
494
|
-
* @returns {undefined}
|
|
495
|
-
*/
|
|
496
|
-
private _toggleTurnDiscovery(enable: boolean) {
|
|
497
|
-
if (typeof enable !== 'boolean') {
|
|
498
|
-
return;
|
|
499
|
-
}
|
|
500
|
-
// @ts-ignore
|
|
501
|
-
this.config.experimental.enableTurnDiscovery = enable;
|
|
502
|
-
}
|
|
503
|
-
|
|
504
684
|
/**
|
|
505
685
|
* API to toggle starting adhoc meeting
|
|
506
686
|
* @param {Boolean} changeState
|
|
@@ -631,6 +811,36 @@ export default class Meetings extends WebexPlugin {
|
|
|
631
811
|
);
|
|
632
812
|
}
|
|
633
813
|
|
|
814
|
+
/**
|
|
815
|
+
* Creates a noise reduction effect
|
|
816
|
+
*
|
|
817
|
+
* @param {INoiseReductionEffect} options optional custom effect options
|
|
818
|
+
* @returns {Promise<effect>} noise reduction effect.
|
|
819
|
+
* @public
|
|
820
|
+
* @memberof Meetings
|
|
821
|
+
*/
|
|
822
|
+
createNoiseReductionEffect = async (options?: INoiseReductionEffect) => {
|
|
823
|
+
// @ts-ignore
|
|
824
|
+
const authToken = this.webex.credentials.supertoken.access_token;
|
|
825
|
+
|
|
826
|
+
return new mediaHelpersModule.NoiseReductionEffect({authToken, ...options});
|
|
827
|
+
};
|
|
828
|
+
|
|
829
|
+
/**
|
|
830
|
+
* Creates a virtual background effect
|
|
831
|
+
*
|
|
832
|
+
* @param {IVirtualBackgroundEffect} options optional custom effect options
|
|
833
|
+
* @returns {Promise<effect>} virtual background effect.
|
|
834
|
+
* @public
|
|
835
|
+
* @memberof Meetings
|
|
836
|
+
*/
|
|
837
|
+
createVirtualBackgroundEffect = async (options?: IVirtualBackgroundEffect) => {
|
|
838
|
+
// @ts-ignore
|
|
839
|
+
const authToken = this.webex.credentials.supertoken.access_token;
|
|
840
|
+
|
|
841
|
+
return new mediaHelpersModule.VirtualBackgroundEffect({authToken, ...options});
|
|
842
|
+
};
|
|
843
|
+
|
|
634
844
|
/**
|
|
635
845
|
* Uploads logs to the webex services for tracking
|
|
636
846
|
* @param {Object} [options={}]
|
|
@@ -645,8 +855,10 @@ export default class Meetings extends WebexPlugin {
|
|
|
645
855
|
*/
|
|
646
856
|
uploadLogs(
|
|
647
857
|
options: {
|
|
858
|
+
autoupload?: boolean;
|
|
648
859
|
callStart?: string;
|
|
649
860
|
feedbackId?: string;
|
|
861
|
+
locussessionid?: string;
|
|
650
862
|
locusId?: string;
|
|
651
863
|
correlationId?: string;
|
|
652
864
|
meetingId?: string;
|
|
@@ -663,6 +875,7 @@ export default class Meetings extends WebexPlugin {
|
|
|
663
875
|
'Meetings:index#uploadLogs --> Upload logs for meeting completed.',
|
|
664
876
|
uploadResult
|
|
665
877
|
);
|
|
878
|
+
Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.UPLOAD_LOGS_SUCCESS, options);
|
|
666
879
|
Trigger.trigger(
|
|
667
880
|
this,
|
|
668
881
|
{
|
|
@@ -697,8 +910,7 @@ export default class Meetings extends WebexPlugin {
|
|
|
697
910
|
);
|
|
698
911
|
|
|
699
912
|
Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.UPLOAD_LOGS_FAILURE, {
|
|
700
|
-
|
|
701
|
-
meetingId: options.meetingsId,
|
|
913
|
+
...options,
|
|
702
914
|
reason: uploadError.message,
|
|
703
915
|
stack: uploadError.stack,
|
|
704
916
|
code: uploadError.code,
|
|
@@ -706,17 +918,6 @@ export default class Meetings extends WebexPlugin {
|
|
|
706
918
|
});
|
|
707
919
|
}
|
|
708
920
|
|
|
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
921
|
/**
|
|
721
922
|
* gets the reachability instance for Meetings
|
|
722
923
|
* @returns {Reachability}
|
|
@@ -734,10 +935,6 @@ export default class Meetings extends WebexPlugin {
|
|
|
734
935
|
* @memberof Meetings
|
|
735
936
|
*/
|
|
736
937
|
startReachability() {
|
|
737
|
-
if (!this.reachability) {
|
|
738
|
-
this.setReachability();
|
|
739
|
-
}
|
|
740
|
-
|
|
741
938
|
return this.getReachability().gatherReachability();
|
|
742
939
|
}
|
|
743
940
|
|
|
@@ -765,6 +962,29 @@ export default class Meetings extends WebexPlugin {
|
|
|
765
962
|
if (res) {
|
|
766
963
|
this.preferredWebexSite = MeetingsUtil.parseDefaultSiteFromMeetingPreferences(res);
|
|
767
964
|
}
|
|
965
|
+
|
|
966
|
+
// fall back to getting the preferred site from the user information
|
|
967
|
+
if (!this.preferredWebexSite) {
|
|
968
|
+
// @ts-ignore
|
|
969
|
+
return this.webex.internal.user
|
|
970
|
+
.get()
|
|
971
|
+
.then((user) => {
|
|
972
|
+
const preferredWebexSite =
|
|
973
|
+
user?.userPreferences?.userPreferencesItems?.preferredWebExSite;
|
|
974
|
+
if (preferredWebexSite) {
|
|
975
|
+
this.preferredWebexSite = preferredWebexSite;
|
|
976
|
+
} else {
|
|
977
|
+
throw new Error('site not found');
|
|
978
|
+
}
|
|
979
|
+
})
|
|
980
|
+
.catch(() => {
|
|
981
|
+
LoggerProxy.logger.error(
|
|
982
|
+
'Failed to fetch preferred site from user - no site will be set'
|
|
983
|
+
);
|
|
984
|
+
});
|
|
985
|
+
}
|
|
986
|
+
|
|
987
|
+
return Promise.resolve();
|
|
768
988
|
});
|
|
769
989
|
}
|
|
770
990
|
|
|
@@ -805,29 +1025,48 @@ export default class Meetings extends WebexPlugin {
|
|
|
805
1025
|
}
|
|
806
1026
|
|
|
807
1027
|
/**
|
|
808
|
-
* Create a meeting.
|
|
809
|
-
* @param {string} destination - sipURL,
|
|
1028
|
+
* Create a meeting or return an existing meeting.
|
|
1029
|
+
* @param {string} destination - sipURL, phonenumber, or locus object}
|
|
810
1030
|
* @param {string} [type] - the optional specified type, such as locusId
|
|
811
1031
|
* @param {Boolean} useRandomDelayForInfo - whether a random delay should be added to fetching meeting info
|
|
1032
|
+
* @param {Object} infoExtraParams extra parameters to be provided when fetching meeting info
|
|
1033
|
+
* @param {string} correlationId - the optional specified correlationId (callStateForMetrics.correlationId can be provided instead)
|
|
1034
|
+
* @param {Boolean} failOnMissingMeetingInfo - whether to throw an error if meeting info fails to fetch (for calls that are not 1:1 or content share)
|
|
1035
|
+
* @param {CallStateForMetrics} callStateForMetrics - information about call state for metrics
|
|
812
1036
|
* @returns {Promise<Meeting>} A new Meeting.
|
|
813
1037
|
* @public
|
|
814
1038
|
* @memberof Meetings
|
|
815
1039
|
*/
|
|
816
|
-
public create(
|
|
1040
|
+
public create(
|
|
1041
|
+
destination: string,
|
|
1042
|
+
type: string = null,
|
|
1043
|
+
useRandomDelayForInfo = false,
|
|
1044
|
+
infoExtraParams = {},
|
|
1045
|
+
correlationId: string = undefined,
|
|
1046
|
+
failOnMissingMeetingInfo = false,
|
|
1047
|
+
callStateForMetrics: CallStateForMetrics = undefined
|
|
1048
|
+
) {
|
|
817
1049
|
// TODO: type should be from a dictionary
|
|
818
1050
|
|
|
819
1051
|
// Validate meeting information based on the provided destination and
|
|
820
1052
|
// type. This must be performed prior to determining if the meeting is
|
|
821
1053
|
// found in the collection, as we mutate the destination for hydra person
|
|
822
1054
|
// id values.
|
|
1055
|
+
if (correlationId) {
|
|
1056
|
+
callStateForMetrics = {...(callStateForMetrics || {}), correlationId};
|
|
1057
|
+
}
|
|
1058
|
+
|
|
823
1059
|
return (
|
|
824
1060
|
this.meetingInfo
|
|
825
1061
|
.fetchInfoOptions(destination, type)
|
|
826
1062
|
// Catch a failure to fetch info options.
|
|
827
1063
|
.catch((error) => {
|
|
828
|
-
LoggerProxy.logger.
|
|
829
|
-
`Meetings:index#create -->
|
|
1064
|
+
LoggerProxy.logger.error(
|
|
1065
|
+
`Meetings:index#create --> ERROR, unable to determine info options: ${error.message}`
|
|
830
1066
|
);
|
|
1067
|
+
if (error instanceof SpaceIDDeprecatedError) {
|
|
1068
|
+
throw new SpaceIDDeprecatedError();
|
|
1069
|
+
}
|
|
831
1070
|
})
|
|
832
1071
|
.then((options: any = {}) => {
|
|
833
1072
|
// Normalize the destination.
|
|
@@ -858,49 +1097,59 @@ export default class Meetings extends WebexPlugin {
|
|
|
858
1097
|
// Validate if a meeting was found.
|
|
859
1098
|
if (!meeting) {
|
|
860
1099
|
// 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
|
-
|
|
1100
|
+
return this.createMeeting(
|
|
1101
|
+
targetDest,
|
|
1102
|
+
type,
|
|
1103
|
+
useRandomDelayForInfo,
|
|
1104
|
+
infoExtraParams,
|
|
1105
|
+
callStateForMetrics,
|
|
1106
|
+
failOnMissingMeetingInfo
|
|
1107
|
+
).then((createdMeeting: any) => {
|
|
1108
|
+
// If the meeting was successfully created.
|
|
1109
|
+
if (createdMeeting && createdMeeting.on) {
|
|
1110
|
+
// Create a destruction event for the meeting.
|
|
1111
|
+
createdMeeting.on(EVENTS.DESTROY_MEETING, (payload) => {
|
|
1112
|
+
// @ts-ignore
|
|
1113
|
+
if (this.config.autoUploadLogs) {
|
|
1114
|
+
this.uploadLogs({
|
|
1115
|
+
callStart: createdMeeting.locusInfo?.fullState?.lastActive,
|
|
1116
|
+
locussessionid: createdMeeting.locusInfo?.fullState?.sessionId,
|
|
1117
|
+
correlationId: createdMeeting.correlationId,
|
|
1118
|
+
feedbackId: createdMeeting.correlationId,
|
|
1119
|
+
locusId: createdMeeting.locusId,
|
|
1120
|
+
meetingId: createdMeeting.locusInfo?.info?.webExMeetingId,
|
|
1121
|
+
autoupload: true,
|
|
1122
|
+
}).then(() => this.destroy(createdMeeting, payload.reason));
|
|
1123
|
+
} else {
|
|
1124
|
+
this.destroy(createdMeeting, payload.reason);
|
|
1125
|
+
}
|
|
1126
|
+
});
|
|
1127
|
+
|
|
1128
|
+
createdMeeting.on(EVENTS.REQUEST_UPLOAD_LOGS, (meetingInstance) => {
|
|
1129
|
+
// @ts-ignore
|
|
1130
|
+
if (this.config.autoUploadLogs) {
|
|
1131
|
+
this.uploadLogs({
|
|
1132
|
+
callStart: meetingInstance?.locusInfo?.fullState?.lastActive,
|
|
1133
|
+
locussessionid: meetingInstance?.locusInfo?.fullState?.sessionId,
|
|
1134
|
+
correlationId: meetingInstance.correlationId,
|
|
1135
|
+
feedbackId: meetingInstance.correlationId,
|
|
1136
|
+
locusId: meetingInstance.locusId,
|
|
1137
|
+
meetingId: meetingInstance.locusInfo?.info?.webExMeetingId,
|
|
1138
|
+
autoupload: true,
|
|
1139
|
+
});
|
|
1140
|
+
}
|
|
1141
|
+
});
|
|
1142
|
+
} else {
|
|
1143
|
+
LoggerProxy.logger.error(
|
|
1144
|
+
`Meetings:index#create --> ERROR, meeting does not have on method, will not be destroyed, meeting cleanup impossible for meeting: ${meeting}`
|
|
1145
|
+
);
|
|
901
1146
|
}
|
|
902
|
-
|
|
1147
|
+
|
|
1148
|
+
// Return the newly created meeting.
|
|
1149
|
+
return Promise.resolve(createdMeeting);
|
|
1150
|
+
});
|
|
903
1151
|
}
|
|
1152
|
+
meeting.setCallStateForMetrics(callStateForMetrics);
|
|
904
1153
|
|
|
905
1154
|
// Return the existing meeting.
|
|
906
1155
|
return Promise.resolve(meeting);
|
|
@@ -912,6 +1161,9 @@ export default class Meetings extends WebexPlugin {
|
|
|
912
1161
|
* @param {String} destination see create()
|
|
913
1162
|
* @param {String} type see create()
|
|
914
1163
|
* @param {Boolean} useRandomDelayForInfo whether a random delay should be added to fetching meeting info
|
|
1164
|
+
* @param {Object} infoExtraParams extra parameters to be provided when fetching meeting info
|
|
1165
|
+
* @param {CallStateForMetrics} callStateForMetrics - information about call state for metrics
|
|
1166
|
+
* @param {Boolean} failOnMissingMeetingInfo - whether to throw an error if meeting info fails to fetch (for calls that are not 1:1 or content share)
|
|
915
1167
|
* @returns {Promise} a new meeting instance complete with meeting info and destination
|
|
916
1168
|
* @private
|
|
917
1169
|
* @memberof Meetings
|
|
@@ -919,7 +1171,10 @@ export default class Meetings extends WebexPlugin {
|
|
|
919
1171
|
private async createMeeting(
|
|
920
1172
|
destination: any,
|
|
921
1173
|
type: string = null,
|
|
922
|
-
useRandomDelayForInfo = false
|
|
1174
|
+
useRandomDelayForInfo = false,
|
|
1175
|
+
infoExtraParams = {},
|
|
1176
|
+
callStateForMetrics: CallStateForMetrics = undefined,
|
|
1177
|
+
failOnMissingMeetingInfo = false
|
|
923
1178
|
) {
|
|
924
1179
|
const meeting = new Meeting(
|
|
925
1180
|
{
|
|
@@ -929,11 +1184,11 @@ export default class Meetings extends WebexPlugin {
|
|
|
929
1184
|
deviceUrl: this.webex.internal.device.url,
|
|
930
1185
|
// @ts-ignore
|
|
931
1186
|
orgId: this.webex.internal.device.orgId,
|
|
932
|
-
roapSeq: 0,
|
|
933
1187
|
locus: type === _LOCUS_ID_ ? destination : null, // pass the locus object if present
|
|
934
1188
|
meetingInfoProvider: this.meetingInfo,
|
|
935
1189
|
destination,
|
|
936
1190
|
destinationType: type,
|
|
1191
|
+
callStateForMetrics,
|
|
937
1192
|
},
|
|
938
1193
|
{
|
|
939
1194
|
// @ts-ignore
|
|
@@ -968,19 +1223,38 @@ export default class Meetings extends WebexPlugin {
|
|
|
968
1223
|
|
|
969
1224
|
if (enableUnifiedMeetings && !isMeetingActive && useRandomDelayForInfo && waitingTime > 0) {
|
|
970
1225
|
meeting.fetchMeetingInfoTimeoutId = setTimeout(
|
|
971
|
-
() =>
|
|
1226
|
+
() =>
|
|
1227
|
+
meeting.fetchMeetingInfo({
|
|
1228
|
+
extraParams: infoExtraParams,
|
|
1229
|
+
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
|
|
1230
|
+
}),
|
|
972
1231
|
waitingTime
|
|
973
1232
|
);
|
|
974
1233
|
meeting.parseMeetingInfo(undefined, destination);
|
|
975
1234
|
} else {
|
|
976
|
-
await meeting.fetchMeetingInfo({
|
|
1235
|
+
await meeting.fetchMeetingInfo({
|
|
1236
|
+
extraParams: infoExtraParams,
|
|
1237
|
+
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
|
|
1238
|
+
});
|
|
977
1239
|
}
|
|
978
1240
|
} catch (err) {
|
|
979
|
-
if (
|
|
980
|
-
|
|
1241
|
+
if (
|
|
1242
|
+
!(err instanceof CaptchaError) &&
|
|
1243
|
+
!(err instanceof PasswordError) &&
|
|
1244
|
+
!(err instanceof PermissionError)
|
|
1245
|
+
) {
|
|
981
1246
|
LoggerProxy.logger.info(
|
|
982
1247
|
`Meetings:index#createMeeting --> Info Unable to fetch meeting info for ${destination}.`
|
|
983
1248
|
);
|
|
1249
|
+
if (failOnMissingMeetingInfo) {
|
|
1250
|
+
LoggerProxy.logger.info(
|
|
1251
|
+
`Meetings:index#createMeeting --> Destroying meeting due to missing meeting info.`
|
|
1252
|
+
);
|
|
1253
|
+
// @ts-ignore
|
|
1254
|
+
this.destroy(meeting, MEETING_REMOVED_REASON.MISSING_MEETING_INFO);
|
|
1255
|
+
throw new NoMeetingInfoError();
|
|
1256
|
+
}
|
|
1257
|
+
// if there is no meeting info and no error should be thrown then we assume its a 1:1 call or wireless share
|
|
984
1258
|
LoggerProxy.logger.info(
|
|
985
1259
|
'Meetings:index#createMeeting --> Info assuming this destination is a 1:1 or wireless share'
|
|
986
1260
|
);
|
|
@@ -1033,7 +1307,7 @@ export default class Meetings extends WebexPlugin {
|
|
|
1033
1307
|
//
|
|
1034
1308
|
// Our job is to determine the appropriate one
|
|
1035
1309
|
// and its corresponding service so that developers
|
|
1036
|
-
// need only sipURL
|
|
1310
|
+
// need only sipURL to get a meeting
|
|
1037
1311
|
// and its ID, but have the option to use createWithType()
|
|
1038
1312
|
// and specify those types to get meetingInfo
|
|
1039
1313
|
}
|
|
@@ -1077,33 +1351,109 @@ export default class Meetings extends WebexPlugin {
|
|
|
1077
1351
|
* @memberof Meetings
|
|
1078
1352
|
*/
|
|
1079
1353
|
public syncMeetings() {
|
|
1080
|
-
return this.request
|
|
1081
|
-
|
|
1082
|
-
|
|
1083
|
-
|
|
1084
|
-
|
|
1085
|
-
|
|
1086
|
-
this.
|
|
1087
|
-
|
|
1088
|
-
|
|
1354
|
+
return this.request
|
|
1355
|
+
.getActiveMeetings()
|
|
1356
|
+
.then((locusArray) => {
|
|
1357
|
+
const activeLocusUrl = [];
|
|
1358
|
+
|
|
1359
|
+
if (locusArray?.loci && locusArray.loci.length > 0) {
|
|
1360
|
+
const lociToUpdate = this.sortLocusArrayToUpdate(locusArray.loci);
|
|
1361
|
+
lociToUpdate.forEach((locus) => {
|
|
1362
|
+
activeLocusUrl.push(locus.url);
|
|
1363
|
+
this.handleLocusEvent({
|
|
1364
|
+
locus,
|
|
1365
|
+
locusUrl: locus.url,
|
|
1366
|
+
});
|
|
1089
1367
|
});
|
|
1090
|
-
}
|
|
1091
|
-
|
|
1092
|
-
const meetingsCollection = this.meetingCollection.getAll();
|
|
1368
|
+
}
|
|
1369
|
+
const meetingsCollection = this.meetingCollection.getAll();
|
|
1093
1370
|
|
|
1094
|
-
|
|
1095
|
-
|
|
1096
|
-
|
|
1097
|
-
|
|
1098
|
-
|
|
1099
|
-
if (!activeLocusUrl.includes(meeting.locusUrl)) {
|
|
1100
|
-
// destroy function also uploads logs
|
|
1371
|
+
if (Object.keys(meetingsCollection).length > 0) {
|
|
1372
|
+
// Sometimes the mercury events are lost after mercury reconnect
|
|
1373
|
+
// Remove any Locus meetings that are not returned by Locus
|
|
1374
|
+
// (they had a locusUrl previously but are no longer active) in the sync
|
|
1375
|
+
for (const meeting of Object.values(meetingsCollection)) {
|
|
1101
1376
|
// @ts-ignore
|
|
1102
|
-
|
|
1377
|
+
if (meeting.locusUrl && !activeLocusUrl.includes(meeting.locusUrl)) {
|
|
1378
|
+
// destroy function also uploads logs
|
|
1379
|
+
// @ts-ignore
|
|
1380
|
+
this.destroy(meeting, MEETING_REMOVED_REASON.NO_MEETINGS_TO_SYNC);
|
|
1381
|
+
}
|
|
1103
1382
|
}
|
|
1104
1383
|
}
|
|
1384
|
+
})
|
|
1385
|
+
.catch((error) => {
|
|
1386
|
+
LoggerProxy.logger.error(
|
|
1387
|
+
`Meetings:index#syncMeetings --> failed to sync meetings, ${error}`
|
|
1388
|
+
);
|
|
1389
|
+
throw new Error(error);
|
|
1390
|
+
});
|
|
1391
|
+
}
|
|
1392
|
+
|
|
1393
|
+
/**
|
|
1394
|
+
* sort out locus array for initial creating
|
|
1395
|
+
* @param {Array} loci original locus array
|
|
1396
|
+
* @returns {undefined}
|
|
1397
|
+
* @public
|
|
1398
|
+
* @memberof Meetings
|
|
1399
|
+
*/
|
|
1400
|
+
sortLocusArrayToUpdate(loci: any[]) {
|
|
1401
|
+
const mainLoci = loci.filter((locus) => !MeetingsUtil.isBreakoutLocusDTO(locus));
|
|
1402
|
+
const breakoutLoci = loci.filter((locus) => MeetingsUtil.isValidBreakoutLocus(locus));
|
|
1403
|
+
this.breakoutLocusForHandleLater = [];
|
|
1404
|
+
const lociToUpdate = [...mainLoci];
|
|
1405
|
+
breakoutLoci.forEach((breakoutLocus) => {
|
|
1406
|
+
const associateMainLocus = mainLoci.find(
|
|
1407
|
+
(mainLocus) => mainLocus.controls?.breakout?.url === breakoutLocus.controls?.breakout?.url
|
|
1408
|
+
);
|
|
1409
|
+
const existCorrespondingMeeting = this.getCorrespondingMeetingByLocus({
|
|
1410
|
+
locus: breakoutLocus,
|
|
1411
|
+
locusUrl: breakoutLocus.url,
|
|
1412
|
+
});
|
|
1413
|
+
|
|
1414
|
+
if (associateMainLocus && !existCorrespondingMeeting) {
|
|
1415
|
+
// if exists both main session and breakout session locus of the same non-exist meeting, handle main locus first,
|
|
1416
|
+
// after meeting create with main locus, then handle the associate breakout locus.
|
|
1417
|
+
// if only handle breakout locus, will miss some date
|
|
1418
|
+
this.breakoutLocusForHandleLater.push(breakoutLocus);
|
|
1419
|
+
} else {
|
|
1420
|
+
lociToUpdate.push(breakoutLocus);
|
|
1105
1421
|
}
|
|
1106
1422
|
});
|
|
1423
|
+
|
|
1424
|
+
return lociToUpdate;
|
|
1425
|
+
}
|
|
1426
|
+
|
|
1427
|
+
/**
|
|
1428
|
+
* check breakout locus which waiting for main locus's meeting to be created, then handle the breakout locus
|
|
1429
|
+
* @param {Object} newCreatedLocus the locus which just create meeting object of it
|
|
1430
|
+
* @returns {undefined}
|
|
1431
|
+
* @public
|
|
1432
|
+
* @memberof Meetings
|
|
1433
|
+
*/
|
|
1434
|
+
checkHandleBreakoutLocus(newCreatedLocus) {
|
|
1435
|
+
if (
|
|
1436
|
+
!newCreatedLocus ||
|
|
1437
|
+
!this.breakoutLocusForHandleLater ||
|
|
1438
|
+
!this.breakoutLocusForHandleLater.length
|
|
1439
|
+
) {
|
|
1440
|
+
return;
|
|
1441
|
+
}
|
|
1442
|
+
if (MeetingsUtil.isBreakoutLocusDTO(newCreatedLocus)) {
|
|
1443
|
+
return;
|
|
1444
|
+
}
|
|
1445
|
+
const existIndex = this.breakoutLocusForHandleLater.findIndex(
|
|
1446
|
+
(breakoutLocus) =>
|
|
1447
|
+
breakoutLocus.controls?.breakout?.url === newCreatedLocus.controls?.breakout?.url
|
|
1448
|
+
);
|
|
1449
|
+
|
|
1450
|
+
if (existIndex < 0) {
|
|
1451
|
+
return;
|
|
1452
|
+
}
|
|
1453
|
+
|
|
1454
|
+
const associateBreakoutLocus = this.breakoutLocusForHandleLater[existIndex];
|
|
1455
|
+
this.handleLocusEvent({locus: associateBreakoutLocus, locusUrl: associateBreakoutLocus.url});
|
|
1456
|
+
this.breakoutLocusForHandleLater.splice(existIndex, 1);
|
|
1107
1457
|
}
|
|
1108
1458
|
|
|
1109
1459
|
/**
|
|
@@ -1125,4 +1475,15 @@ export default class Meetings extends WebexPlugin {
|
|
|
1125
1475
|
getLogger() {
|
|
1126
1476
|
return LoggerProxy.get();
|
|
1127
1477
|
}
|
|
1478
|
+
|
|
1479
|
+
/**
|
|
1480
|
+
* Returns the first meeting it finds that has the webrtc media connection created.
|
|
1481
|
+
* Useful for debugging in the console.
|
|
1482
|
+
*
|
|
1483
|
+
* @private
|
|
1484
|
+
* @returns {Meeting} Meeting object that has a webrtc media connection, else undefined
|
|
1485
|
+
*/
|
|
1486
|
+
getActiveWebrtcMeeting() {
|
|
1487
|
+
return this.meetingCollection.getActiveWebrtcMeeting();
|
|
1488
|
+
}
|
|
1128
1489
|
}
|