@webex/plugin-meetings 2.59.8 → 2.60.0-next.2
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.js +7 -0
- package/dist/annotation/annotation.types.js.map +1 -0
- package/dist/annotation/constants.js +41 -0
- package/dist/annotation/constants.js.map +1 -0
- package/dist/annotation/index.js +357 -0
- package/dist/annotation/index.js.map +1 -0
- package/dist/breakouts/breakout.js +215 -0
- package/dist/breakouts/breakout.js.map +1 -0
- package/dist/breakouts/collection.js +22 -0
- package/dist/breakouts/collection.js.map +1 -0
- package/dist/breakouts/edit-lock-error.js +51 -0
- package/dist/breakouts/edit-lock-error.js.map +1 -0
- package/dist/breakouts/events.js +44 -0
- package/dist/breakouts/events.js.map +1 -0
- package/dist/breakouts/index.js +1047 -0
- package/dist/breakouts/index.js.map +1 -0
- package/dist/breakouts/request.js +77 -0
- package/dist/breakouts/request.js.map +1 -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.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-errors.js +154 -0
- 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.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.js +8 -5
- package/dist/common/logs/request.js.map +1 -1
- package/dist/common/queue.js +22 -9
- package/dist/common/queue.js.map +1 -1
- package/dist/config.js +8 -11
- package/dist/config.js.map +1 -1
- package/dist/constants.js +437 -435
- 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.js +15 -6
- package/dist/controls-options-manager/enums.js.map +1 -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.js +7 -0
- package/dist/controls-options-manager/types.js.map +1 -0
- package/dist/controls-options-manager/util.js +309 -19
- package/dist/controls-options-manager/util.js.map +1 -1
- package/dist/index.js +116 -4
- package/dist/index.js.map +1 -1
- package/dist/interpretation/collection.js +22 -0
- package/dist/interpretation/collection.js.map +1 -0
- package/dist/interpretation/index.js +365 -0
- package/dist/interpretation/index.js.map +1 -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.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.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.js +106 -319
- package/dist/media/index.js.map +1 -1
- 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.js +498 -493
- package/dist/mediaQualityMetrics/config.js.map +1 -1
- package/dist/meeting/in-meeting-actions.js +92 -3
- package/dist/meeting/in-meeting-actions.js.map +1 -1
- package/dist/meeting/index.js +4628 -2971
- package/dist/meeting/index.js.map +1 -1
- package/dist/meeting/locusMediaRequest.js +291 -0
- package/dist/meeting/locusMediaRequest.js.map +1 -0
- package/dist/meeting/muteState.js +224 -133
- package/dist/meeting/muteState.js.map +1 -1
- package/dist/meeting/request.js +297 -199
- package/dist/meeting/request.js.map +1 -1
- package/dist/meeting/request.type.js +7 -0
- package/dist/meeting/request.type.js.map +1 -0
- package/dist/meeting/state.js +1 -2
- package/dist/meeting/state.js.map +1 -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.js +74 -7
- package/dist/meeting-info/index.js.map +1 -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.js +42 -4
- package/dist/meetings/collection.js.map +1 -1
- package/dist/meetings/index.js +477 -123
- package/dist/meetings/index.js.map +1 -1
- package/dist/meetings/meetings.types.js +7 -0
- package/dist/meetings/meetings.types.js.map +1 -0
- package/dist/meetings/request.js +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.js +54 -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.js +23 -0
- package/dist/member/types.js.map +1 -0
- package/dist/member/util.js +131 -29
- package/dist/member/util.js.map +1 -1
- package/dist/members/collection.js +11 -2
- package/dist/members/collection.js.map +1 -1
- package/dist/members/index.js +174 -10
- package/dist/members/index.js.map +1 -1
- package/dist/members/request.js +108 -41
- package/dist/members/request.js.map +1 -1
- package/dist/members/types.js +14 -0
- package/dist/members/types.js.map +1 -0
- package/dist/members/util.js +327 -234
- package/dist/members/util.js.map +1 -1
- package/dist/metrics/constants.js +15 -9
- package/dist/metrics/constants.js.map +1 -1
- package/dist/metrics/index.js +4 -452
- package/dist/metrics/index.js.map +1 -1
- package/dist/multistream/mediaRequestManager.js +344 -0
- package/dist/multistream/mediaRequestManager.js.map +1 -0
- package/dist/multistream/receiveSlot.js +200 -0
- package/dist/multistream/receiveSlot.js.map +1 -0
- package/dist/multistream/receiveSlotManager.js +174 -0
- package/dist/multistream/receiveSlotManager.js.map +1 -0
- package/dist/multistream/remoteMedia.js +268 -0
- package/dist/multistream/remoteMedia.js.map +1 -0
- package/dist/multistream/remoteMediaGroup.js +267 -0
- package/dist/multistream/remoteMediaGroup.js.map +1 -0
- package/dist/multistream/remoteMediaManager.js +1211 -0
- package/dist/multistream/remoteMediaManager.js.map +1 -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/index.js +265 -72
- package/dist/reachability/index.js.map +1 -1
- package/dist/reachability/request.js +18 -10
- package/dist/reachability/request.js.map +1 -1
- package/dist/reactions/constants.js +12 -0
- package/dist/reactions/constants.js.map +1 -0
- package/dist/reactions/reactions.js +4 -6
- package/dist/reactions/reactions.js.map +1 -1
- package/dist/reactions/reactions.type.js +21 -23
- package/dist/reactions/reactions.type.js.map +1 -1
- package/dist/reconnection-manager/index.js +281 -229
- 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.js +57 -46
- package/dist/recording-controller/index.js.map +1 -1
- package/dist/recording-controller/util.js +10 -10
- package/dist/recording-controller/util.js.map +1 -1
- package/dist/roap/index.js +101 -235
- package/dist/roap/index.js.map +1 -1
- package/dist/roap/request.js +126 -180
- package/dist/roap/request.js.map +1 -1
- package/dist/roap/turnDiscovery.js +115 -105
- package/dist/roap/turnDiscovery.js.map +1 -1
- package/dist/rtcMetrics/constants.js +11 -0
- package/dist/rtcMetrics/constants.js.map +1 -0
- package/dist/rtcMetrics/index.js +140 -0
- package/dist/rtcMetrics/index.js.map +1 -0
- package/dist/statsAnalyzer/global.js +2 -85
- package/dist/statsAnalyzer/global.js.map +1 -1
- package/dist/statsAnalyzer/index.js +402 -424
- package/dist/statsAnalyzer/index.js.map +1 -1
- package/dist/statsAnalyzer/mqaUtil.js +117 -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.js +43 -0
- package/dist/webinar/collection.js.map +1 -0
- package/dist/webinar/index.js +68 -0
- package/dist/webinar/index.js.map +1 -0
- package/package.json +34 -25
- 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/reclaim-host-role-errors.ts +134 -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 +5 -7
- package/src/constants.ts +271 -93
- 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 +40 -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 +379 -377
- package/src/meeting/in-meeting-actions.ts +172 -0
- package/src/meeting/index.ts +3861 -2504
- 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 +477 -124
- 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 +52 -1
- package/src/member/types.ts +38 -0
- package/src/member/util.ts +139 -28
- package/src/members/collection.ts +8 -0
- package/src/members/index.ts +196 -7
- package/src/members/request.ts +97 -17
- package/src/members/types.ts +29 -0
- package/src/members/util.ts +333 -240
- package/src/metrics/constants.ts +13 -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/index.ts +238 -45
- package/src/reachability/request.ts +17 -8
- 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 +167 -154
- 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 +470 -522
- package/src/statsAnalyzer/mqaUtil.ts +117 -112
- 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/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 +274 -0
- package/test/unit/spec/media/properties.ts +75 -84
- package/test/unit/spec/meeting/in-meeting-actions.ts +84 -0
- package/test/unit/spec/meeting/index.js +8269 -3145
- 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 +1201 -210
- package/test/unit/spec/meetings/utils.js +202 -2
- package/test/unit/spec/member/index.js +38 -8
- package/test/unit/spec/member/util.js +499 -29
- package/test/unit/spec/members/index.js +597 -3
- package/test/unit/spec/members/request.js +206 -27
- package/test/unit/spec/members/utils.js +210 -0
- package/test/unit/spec/metrics/index.js +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/index.ts +598 -24
- package/test/unit/spec/reachability/request.js +68 -0
- package/test/unit/spec/reconnection-manager/index.js +145 -22
- 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 +232 -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 +188 -174
- 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/browser-detection.d.ts +0 -9
- package/dist/common/collection.d.ts +0 -48
- package/dist/common/config.d.ts +0 -2
- package/dist/common/errors/captcha-error.d.ts +0 -15
- package/dist/common/errors/intent-to-join.d.ts +0 -16
- package/dist/common/errors/join-meeting.d.ts +0 -17
- package/dist/common/errors/media.d.ts +0 -15
- package/dist/common/errors/parameter.d.ts +0 -15
- package/dist/common/errors/password-error.d.ts +0 -15
- package/dist/common/errors/permission.d.ts +0 -14
- package/dist/common/errors/reconnection-in-progress.d.ts +0 -9
- package/dist/common/errors/reconnection.d.ts +0 -15
- package/dist/common/errors/stats.d.ts +0 -15
- package/dist/common/errors/webex-errors.d.ts +0 -81
- package/dist/common/errors/webex-meetings-error.d.ts +0 -20
- package/dist/common/events/events-scope.d.ts +0 -17
- package/dist/common/events/events.d.ts +0 -12
- package/dist/common/events/trigger-proxy.d.ts +0 -2
- package/dist/common/events/util.d.ts +0 -2
- package/dist/common/logs/logger-config.d.ts +0 -2
- package/dist/common/logs/logger-proxy.d.ts +0 -2
- package/dist/common/logs/request.d.ts +0 -34
- package/dist/common/queue.d.ts +0 -32
- package/dist/config.d.ts +0 -73
- package/dist/constants.d.ts +0 -926
- package/dist/controls-options-manager/constants.d.ts +0 -4
- package/dist/controls-options-manager/enums.d.ts +0 -5
- package/dist/controls-options-manager/index.d.ts +0 -120
- package/dist/controls-options-manager/util.d.ts +0 -7
- package/dist/index.d.ts +0 -4
- package/dist/locus-info/controlsUtils.d.ts +0 -2
- package/dist/locus-info/embeddedAppsUtils.d.ts +0 -2
- package/dist/locus-info/fullState.d.ts +0 -2
- package/dist/locus-info/hostUtils.d.ts +0 -2
- package/dist/locus-info/index.d.ts +0 -269
- package/dist/locus-info/infoUtils.d.ts +0 -2
- package/dist/locus-info/mediaSharesUtils.d.ts +0 -2
- package/dist/locus-info/parser.d.ts +0 -212
- package/dist/locus-info/selfUtils.d.ts +0 -2
- package/dist/media/index.d.ts +0 -32
- package/dist/media/properties.d.ts +0 -108
- package/dist/media/util.d.ts +0 -2
- package/dist/mediaQualityMetrics/config.d.ts +0 -233
- 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/meeting/in-meeting-actions.d.ts +0 -79
- package/dist/meeting/index.d.ts +0 -1622
- package/dist/meeting/muteState.d.ts +0 -116
- package/dist/meeting/request.d.ts +0 -255
- package/dist/meeting/state.d.ts +0 -9
- package/dist/meeting/util.d.ts +0 -2
- package/dist/meeting-info/collection.d.ts +0 -20
- package/dist/meeting-info/index.d.ts +0 -57
- package/dist/meeting-info/meeting-info-v2.d.ts +0 -93
- package/dist/meeting-info/request.d.ts +0 -22
- package/dist/meeting-info/util.d.ts +0 -2
- package/dist/meeting-info/utilv2.d.ts +0 -2
- package/dist/meetings/collection.d.ts +0 -23
- package/dist/meetings/index.d.ts +0 -296
- package/dist/meetings/request.d.ts +0 -27
- package/dist/meetings/util.d.ts +0 -18
- package/dist/member/index.d.ts +0 -147
- package/dist/member/member.types.d.ts +0 -11
- package/dist/member/util.d.ts +0 -2
- package/dist/members/collection.d.ts +0 -24
- package/dist/members/index.d.ts +0 -298
- package/dist/members/request.d.ts +0 -50
- package/dist/members/util.d.ts +0 -2
- 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/metrics/constants.d.ts +0 -59
- package/dist/metrics/index.d.ts +0 -152
- package/dist/networkQualityMonitor/index.d.ts +0 -70
- 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/personal-meeting-room/index.d.ts +0 -47
- package/dist/personal-meeting-room/request.d.ts +0 -14
- package/dist/personal-meeting-room/util.d.ts +0 -2
- package/dist/reachability/index.d.ts +0 -139
- package/dist/reachability/request.d.ts +0 -35
- package/dist/reactions/reactions.d.ts +0 -4
- package/dist/reactions/reactions.type.d.ts +0 -32
- package/dist/reconnection-manager/index.d.ts +0 -112
- package/dist/recording-controller/enums.d.ts +0 -7
- package/dist/recording-controller/index.d.ts +0 -193
- package/dist/recording-controller/util.d.ts +0 -13
- 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/index.d.ts +0 -116
- package/dist/roap/request.d.ts +0 -35
- 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/turnDiscovery.d.ts +0 -81
- package/dist/roap/util.d.ts +0 -2
- package/dist/roap/util.js +0 -76
- package/dist/roap/util.js.map +0 -1
- package/dist/statsAnalyzer/global.d.ts +0 -118
- package/dist/statsAnalyzer/index.d.ts +0 -193
- package/dist/statsAnalyzer/mqaUtil.d.ts +0 -22
- package/dist/transcription/index.d.ts +0 -64
- 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
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
import {
|
|
2
|
+
SendSlot,
|
|
3
|
+
MediaType,
|
|
4
|
+
LocalStream,
|
|
5
|
+
MultistreamRoapMediaConnection,
|
|
6
|
+
} from '@webex/internal-media-core';
|
|
7
|
+
|
|
8
|
+
export default class SendSlotManager {
|
|
9
|
+
private readonly slots: Map<MediaType, SendSlot> = new Map();
|
|
10
|
+
private readonly LoggerProxy: any;
|
|
11
|
+
|
|
12
|
+
constructor(LoggerProxy: any) {
|
|
13
|
+
this.LoggerProxy = LoggerProxy;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* This method is used to create a sendSlot for the given mediaType and returns the created sendSlot
|
|
18
|
+
* @param {MultistreamRoapMediaConnection} mediaConnection MultistreamRoapMediaConnection for which a sendSlot needs to be created
|
|
19
|
+
* @param {MediaType} mediaType MediaType for which a sendSlot needs to be created (AUDIO_MAIN/VIDEO_MAIN/AUDIO_SLIDES/VIDEO_SLIDES)
|
|
20
|
+
* @param {boolean} active This is optional boolean to set the active state of the sendSlot. Default is true
|
|
21
|
+
* @returns {SendSlot} slot The created sendSlot
|
|
22
|
+
*/
|
|
23
|
+
public createSlot(
|
|
24
|
+
mediaConnection: MultistreamRoapMediaConnection,
|
|
25
|
+
mediaType: MediaType,
|
|
26
|
+
active = true
|
|
27
|
+
): SendSlot {
|
|
28
|
+
if (this.slots.has(mediaType)) {
|
|
29
|
+
throw new Error(`Slot for ${mediaType} already exists`);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
const slot: SendSlot = mediaConnection.createSendSlot(mediaType, active);
|
|
33
|
+
|
|
34
|
+
this.slots.set(mediaType, slot);
|
|
35
|
+
|
|
36
|
+
this.LoggerProxy.logger.info(
|
|
37
|
+
`SendSlotsManager->createSlot#Created slot for ${mediaType} with active ${active}`
|
|
38
|
+
);
|
|
39
|
+
|
|
40
|
+
return slot;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* This method is used to retrieve the sendSlot for the given mediaType
|
|
45
|
+
* @param {MediaType} mediaType of which the slot needs to be retrieved
|
|
46
|
+
* @returns {SendSlot}
|
|
47
|
+
*/
|
|
48
|
+
public getSlot(mediaType: MediaType): SendSlot {
|
|
49
|
+
const slot = this.slots.get(mediaType);
|
|
50
|
+
|
|
51
|
+
if (!slot) {
|
|
52
|
+
throw new Error(`Slot for ${mediaType} does not exist`);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
return slot;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* This method publishes the given stream to the sendSlot for the given mediaType
|
|
60
|
+
* @param {MediaType} mediaType MediaType of the sendSlot to which a stream needs to be published (AUDIO_MAIN/VIDEO_MAIN/AUDIO_SLIDES/VIDEO_SLIDES)
|
|
61
|
+
* @param {LocalStream} stream LocalStream to be published
|
|
62
|
+
* @returns {Promise<void>}
|
|
63
|
+
*/
|
|
64
|
+
public async publishStream(mediaType: MediaType, stream: LocalStream): Promise<void> {
|
|
65
|
+
const slot = this.slots.get(mediaType);
|
|
66
|
+
|
|
67
|
+
if (!slot) {
|
|
68
|
+
throw new Error(`Slot for ${mediaType} does not exist`);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
await slot.publishStream(stream);
|
|
72
|
+
|
|
73
|
+
this.LoggerProxy.logger.info(
|
|
74
|
+
`SendSlotsManager->publishStream#Published stream for ${mediaType} and stream with label ${stream.label} and muted ${stream.muted}`
|
|
75
|
+
);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* This method unpublishes the stream from the sendSlot of the given mediaType
|
|
80
|
+
* @param {MediaType} mediaType MediaType of the sendSlot from which a stream needs to be unpublished (AUDIO_MAIN/VIDEO_MAIN/AUDIO_SLIDES/VIDEO_SLIDES)
|
|
81
|
+
* @returns {Promise<void>}
|
|
82
|
+
*/
|
|
83
|
+
public async unpublishStream(mediaType: MediaType): Promise<void> {
|
|
84
|
+
const slot = this.slots.get(mediaType);
|
|
85
|
+
|
|
86
|
+
if (!slot) {
|
|
87
|
+
throw new Error(`Slot for ${mediaType} does not exist`);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
await slot.unpublishStream();
|
|
91
|
+
|
|
92
|
+
this.LoggerProxy.logger.info(
|
|
93
|
+
`SendSlotsManager->unpublishStream#Unpublished stream for ${mediaType}`
|
|
94
|
+
);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* This method is used to set the active state of the sendSlot for the given mediaType
|
|
99
|
+
* @param {MediaType} mediaType The MediaType of the sendSlot for which the active state needs to be set (AUDIO_MAIN/VIDEO_MAIN/AUDIO_SLIDES/VIDEO_SLIDES)
|
|
100
|
+
* @param {boolean} active The boolean to set the active state of the sendSlot. Default is true
|
|
101
|
+
* @returns {void}
|
|
102
|
+
*/
|
|
103
|
+
public setActive(mediaType: MediaType, active = true): void {
|
|
104
|
+
const slot = this.slots.get(mediaType);
|
|
105
|
+
|
|
106
|
+
if (!slot) {
|
|
107
|
+
throw new Error(`Slot for ${mediaType} does not exist`);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
slot.active = active;
|
|
111
|
+
|
|
112
|
+
this.LoggerProxy.logger.info(
|
|
113
|
+
`SendSlotsManager->setActive#Set active for ${mediaType} to ${active}`
|
|
114
|
+
);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* This method is used to set the codec parameters for the sendSlot of the given mediaType
|
|
119
|
+
* @param {MediaType} mediaType MediaType of the sendSlot for which the codec parameters needs to be set (AUDIO_MAIN/VIDEO_MAIN/AUDIO_SLIDES/VIDEO_SLIDES)
|
|
120
|
+
* @param {Object} codecParameters
|
|
121
|
+
* @returns {Promise<void>}
|
|
122
|
+
*/
|
|
123
|
+
public async setCodecParameters(
|
|
124
|
+
mediaType: MediaType,
|
|
125
|
+
codecParameters: {
|
|
126
|
+
[key: string]: string | undefined; // As per ts-sdp undefined is considered as a valid value to be used for codec parameters
|
|
127
|
+
}
|
|
128
|
+
): Promise<void> {
|
|
129
|
+
// These codec parameter changes underneath are SDP value changes that are taken care by WCME automatically. So no need for any change in streams from the web sdk side
|
|
130
|
+
const slot = this.slots.get(mediaType);
|
|
131
|
+
|
|
132
|
+
if (!slot) {
|
|
133
|
+
throw new Error(`Slot for ${mediaType} does not exist`);
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
await slot.setCodecParameters(codecParameters);
|
|
137
|
+
|
|
138
|
+
this.LoggerProxy.logger.info(
|
|
139
|
+
`SendSlotsManager->setCodecParameters#Set codec parameters for ${mediaType} to ${codecParameters}`
|
|
140
|
+
);
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* This method is used to delete the codec parameters for the sendSlot of the given mediaType
|
|
145
|
+
* @param {MediaType} mediaType MediaType of the sendSlot for which the codec parameters needs to be deleted (AUDIO_MAIN/VIDEO_MAIN/AUDIO_SLIDES/VIDEO_SLIDES)
|
|
146
|
+
* @param {Array<String>} parameters Array of keys of the codec parameters to be deleted
|
|
147
|
+
* @returns {Promise<void>}
|
|
148
|
+
*/
|
|
149
|
+
public async deleteCodecParameters(mediaType: MediaType, parameters: string[]): Promise<void> {
|
|
150
|
+
const slot = this.slots.get(mediaType);
|
|
151
|
+
|
|
152
|
+
if (!slot) {
|
|
153
|
+
throw new Error(`Slot for ${mediaType} does not exist`);
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
await slot.deleteCodecParameters(parameters);
|
|
157
|
+
|
|
158
|
+
this.LoggerProxy.logger.info(
|
|
159
|
+
`SendSlotsManager->deleteCodecParameters#Deleted the following codec parameters -> ${parameters} for ${mediaType}`
|
|
160
|
+
);
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
/**
|
|
164
|
+
* This method is used to reset the SendSlotsManager by deleting all the sendSlots
|
|
165
|
+
* @returns {undefined}
|
|
166
|
+
*/
|
|
167
|
+
public reset(): void {
|
|
168
|
+
this.slots.clear();
|
|
169
|
+
}
|
|
170
|
+
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import EventsScope from '../common/events/events-scope';
|
|
2
|
-
import {EVENT_TRIGGERS
|
|
2
|
+
import {EVENT_TRIGGERS} from '../constants';
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
5
|
* Meeting - network quality event
|
|
@@ -49,11 +49,7 @@ export default class NetworkQualityMonitor extends EventsScope {
|
|
|
49
49
|
});
|
|
50
50
|
this.networkQualityScore = 1;
|
|
51
51
|
this.networkQualityStatus = {
|
|
52
|
-
[this.frequencyTypes.UPLINK]: {
|
|
53
|
-
[STATS.VIDEO_CORRELATE]: {},
|
|
54
|
-
[STATS.AUDIO_CORRELATE]: {},
|
|
55
|
-
[STATS.SHARE_CORRELATE]: {},
|
|
56
|
-
},
|
|
52
|
+
[this.frequencyTypes.UPLINK]: {},
|
|
57
53
|
};
|
|
58
54
|
this.mediaType = null;
|
|
59
55
|
}
|
|
@@ -172,6 +168,10 @@ export default class NetworkQualityMonitor extends EventsScope {
|
|
|
172
168
|
const determineIfUndefined = (value: number | undefined) =>
|
|
173
169
|
typeof value === 'undefined' ? null : value;
|
|
174
170
|
|
|
171
|
+
if (!this.networkQualityStatus[UPLINK][mediaType]) {
|
|
172
|
+
this.networkQualityStatus[UPLINK][mediaType] = {};
|
|
173
|
+
}
|
|
174
|
+
|
|
175
175
|
/**
|
|
176
176
|
* Values for some browsers specifically Safari will be undefined we explicitly set to null
|
|
177
177
|
* https://bugs.webkit.org/show_bug.cgi?id=206645
|
|
@@ -4,9 +4,11 @@
|
|
|
4
4
|
|
|
5
5
|
/* eslint-disable class-methods-use-this */
|
|
6
6
|
/* globals window */
|
|
7
|
-
import
|
|
7
|
+
import {uniq, mapValues, pick} from 'lodash';
|
|
8
8
|
|
|
9
9
|
import LoggerProxy from '../common/logs/logger-proxy';
|
|
10
|
+
import MeetingUtil from '../meeting/util';
|
|
11
|
+
|
|
10
12
|
import {ICE_GATHERING_STATE, CONNECTION_STATE, REACHABILITY} from '../constants';
|
|
11
13
|
|
|
12
14
|
import ReachabilityRequest from './request';
|
|
@@ -14,11 +16,56 @@ import ReachabilityRequest from './request';
|
|
|
14
16
|
const DEFAULT_TIMEOUT = 3000;
|
|
15
17
|
const VIDEO_MESH_TIMEOUT = 1000;
|
|
16
18
|
|
|
19
|
+
export type ReachabilityMetrics = {
|
|
20
|
+
reachability_public_udp_success: number;
|
|
21
|
+
reachability_public_udp_failed: number;
|
|
22
|
+
reachability_public_tcp_success: number;
|
|
23
|
+
reachability_public_tcp_failed: number;
|
|
24
|
+
reachability_vmn_udp_success: number;
|
|
25
|
+
reachability_vmn_udp_failed: number;
|
|
26
|
+
reachability_vmn_tcp_success: number;
|
|
27
|
+
reachability_vmn_tcp_failed: number;
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
// result for a specific transport protocol (like udp or tcp)
|
|
31
|
+
export type TransportResult = {
|
|
32
|
+
reachable?: 'true' | 'false';
|
|
33
|
+
latencyInMilliseconds?: string;
|
|
34
|
+
clientMediaIPs?: string[];
|
|
35
|
+
untested?: 'true';
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
// reachability result for a specifc media cluster
|
|
39
|
+
type ReachabilityResult = {
|
|
40
|
+
udp: TransportResult;
|
|
41
|
+
tcp: TransportResult;
|
|
42
|
+
xtls: {
|
|
43
|
+
untested: 'true';
|
|
44
|
+
};
|
|
45
|
+
};
|
|
46
|
+
// this is the type that is required by the backend when we send them reachability results
|
|
47
|
+
export type ReachabilityResults = Record<string, ReachabilityResult>;
|
|
48
|
+
|
|
49
|
+
// this is the type used by Reachability class internally and stored in local storage
|
|
50
|
+
type InternalReachabilityResults = Record<
|
|
51
|
+
string,
|
|
52
|
+
ReachabilityResult & {
|
|
53
|
+
isVideoMesh?: boolean;
|
|
54
|
+
}
|
|
55
|
+
>;
|
|
56
|
+
|
|
57
|
+
export type ICECandidateResult = {
|
|
58
|
+
clusterId: string;
|
|
59
|
+
isVideoMesh: boolean;
|
|
60
|
+
elapsed?: string | null;
|
|
61
|
+
publicIPs?: string[];
|
|
62
|
+
};
|
|
17
63
|
/**
|
|
18
64
|
* @class Reachability
|
|
19
65
|
* @export
|
|
20
66
|
*/
|
|
21
67
|
export default class Reachability {
|
|
68
|
+
namespace = REACHABILITY.namespace;
|
|
22
69
|
webex: object;
|
|
23
70
|
reachabilityRequest: any;
|
|
24
71
|
clusterLatencyResults: any;
|
|
@@ -57,28 +104,36 @@ export default class Reachability {
|
|
|
57
104
|
* @async
|
|
58
105
|
* @memberof Reachability
|
|
59
106
|
*/
|
|
60
|
-
public async gatherReachability() {
|
|
107
|
+
public async gatherReachability(): Promise<InternalReachabilityResults> {
|
|
61
108
|
this.setup();
|
|
62
109
|
|
|
63
110
|
// Remove stored reachability results to ensure no stale data
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
'Reachability:index#gatherReachability --> Error in accessing LocalStorage.'
|
|
69
|
-
);
|
|
70
|
-
|
|
71
|
-
return {};
|
|
72
|
-
}
|
|
111
|
+
// @ts-ignore
|
|
112
|
+
await this.webex.boundedStorage.del(this.namespace, REACHABILITY.localStorageResult);
|
|
113
|
+
// @ts-ignore
|
|
114
|
+
await this.webex.boundedStorage.del(this.namespace, REACHABILITY.localStorageJoinCookie);
|
|
73
115
|
|
|
74
116
|
// Fetch clusters and measure latency
|
|
75
117
|
try {
|
|
76
|
-
const clusters = await this.reachabilityRequest.getClusters(
|
|
118
|
+
const {clusters, joinCookie} = await this.reachabilityRequest.getClusters(
|
|
119
|
+
MeetingUtil.getIpVersion(this.webex)
|
|
120
|
+
);
|
|
77
121
|
|
|
78
122
|
// Perform Reachability Check
|
|
79
123
|
const results = await this.performReachabilityCheck(clusters);
|
|
80
124
|
|
|
81
|
-
|
|
125
|
+
// @ts-ignore
|
|
126
|
+
await this.webex.boundedStorage.put(
|
|
127
|
+
this.namespace,
|
|
128
|
+
REACHABILITY.localStorageResult,
|
|
129
|
+
JSON.stringify(results)
|
|
130
|
+
);
|
|
131
|
+
// @ts-ignore
|
|
132
|
+
await this.webex.boundedStorage.put(
|
|
133
|
+
this.namespace,
|
|
134
|
+
REACHABILITY.localStorageJoinCookie,
|
|
135
|
+
JSON.stringify(joinCookie)
|
|
136
|
+
);
|
|
82
137
|
|
|
83
138
|
LoggerProxy.logger.log(
|
|
84
139
|
'Reachability:index#gatherReachability --> Reachability checks completed'
|
|
@@ -94,22 +149,111 @@ export default class Reachability {
|
|
|
94
149
|
}
|
|
95
150
|
}
|
|
96
151
|
|
|
152
|
+
/**
|
|
153
|
+
* Returns statistics about last reachability results. The returned value is an object
|
|
154
|
+
* with a flat list of properties so that it can be easily sent with metrics
|
|
155
|
+
*
|
|
156
|
+
* @returns {Promise} Promise with metrics values, it never rejects/throws.
|
|
157
|
+
*/
|
|
158
|
+
async getReachabilityMetrics(): Promise<ReachabilityMetrics> {
|
|
159
|
+
const stats: ReachabilityMetrics = {
|
|
160
|
+
reachability_public_udp_success: 0,
|
|
161
|
+
reachability_public_udp_failed: 0,
|
|
162
|
+
reachability_public_tcp_success: 0,
|
|
163
|
+
reachability_public_tcp_failed: 0,
|
|
164
|
+
reachability_vmn_udp_success: 0,
|
|
165
|
+
reachability_vmn_udp_failed: 0,
|
|
166
|
+
reachability_vmn_tcp_success: 0,
|
|
167
|
+
reachability_vmn_tcp_failed: 0,
|
|
168
|
+
};
|
|
169
|
+
|
|
170
|
+
const updateStats = (clusterType: 'public' | 'vmn', result: ReachabilityResult) => {
|
|
171
|
+
if (result.udp?.reachable) {
|
|
172
|
+
const outcome = result.udp.reachable === 'true' ? 'success' : 'failed';
|
|
173
|
+
stats[`reachability_${clusterType}_udp_${outcome}`] += 1;
|
|
174
|
+
}
|
|
175
|
+
if (result.tcp?.reachable) {
|
|
176
|
+
const outcome = result.tcp.reachable === 'true' ? 'success' : 'failed';
|
|
177
|
+
stats[`reachability_${clusterType}_tcp_${outcome}`] += 1;
|
|
178
|
+
}
|
|
179
|
+
};
|
|
180
|
+
|
|
181
|
+
try {
|
|
182
|
+
// @ts-ignore
|
|
183
|
+
const resultsJson = await this.webex.boundedStorage.get(
|
|
184
|
+
REACHABILITY.namespace,
|
|
185
|
+
REACHABILITY.localStorageResult
|
|
186
|
+
);
|
|
187
|
+
|
|
188
|
+
const internalResults: InternalReachabilityResults = JSON.parse(resultsJson);
|
|
189
|
+
|
|
190
|
+
Object.values(internalResults).forEach((result) => {
|
|
191
|
+
updateStats(result.isVideoMesh ? 'vmn' : 'public', result);
|
|
192
|
+
});
|
|
193
|
+
} catch (e) {
|
|
194
|
+
// empty storage, that's ok
|
|
195
|
+
LoggerProxy.logger.warn(
|
|
196
|
+
'Roap:request#getReachabilityMetrics --> Error parsing reachability data: ',
|
|
197
|
+
e
|
|
198
|
+
);
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
return stats;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
/**
|
|
205
|
+
* Reachability results as an object in the format that backend expects
|
|
206
|
+
*
|
|
207
|
+
* @returns {any} reachability results that need to be sent to the backend
|
|
208
|
+
*/
|
|
209
|
+
async getReachabilityResults(): Promise<ReachabilityResults | undefined> {
|
|
210
|
+
let results: ReachabilityResults;
|
|
211
|
+
|
|
212
|
+
// these are the only props that backend needs in the reachability results:
|
|
213
|
+
const reachabilityResultsProps: Array<keyof ReachabilityResult> = ['udp', 'tcp', 'xtls'];
|
|
214
|
+
|
|
215
|
+
try {
|
|
216
|
+
// @ts-ignore
|
|
217
|
+
const resultsJson = await this.webex.boundedStorage.get(
|
|
218
|
+
REACHABILITY.namespace,
|
|
219
|
+
REACHABILITY.localStorageResult
|
|
220
|
+
);
|
|
221
|
+
|
|
222
|
+
const internalResults: InternalReachabilityResults = JSON.parse(resultsJson);
|
|
223
|
+
|
|
224
|
+
results = mapValues(internalResults, (result) => pick(result, reachabilityResultsProps));
|
|
225
|
+
} catch (e) {
|
|
226
|
+
// empty storage, that's ok
|
|
227
|
+
LoggerProxy.logger.warn(
|
|
228
|
+
'Roap:request#attachReachabilityData --> Error parsing reachability data: ',
|
|
229
|
+
e
|
|
230
|
+
);
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
return results;
|
|
234
|
+
}
|
|
235
|
+
|
|
97
236
|
/**
|
|
98
237
|
* fetches reachability data and checks for cluster reachability
|
|
99
238
|
* @returns {boolean}
|
|
100
239
|
* @public
|
|
101
240
|
* @memberof Reachability
|
|
102
241
|
*/
|
|
103
|
-
|
|
242
|
+
async isAnyPublicClusterReachable() {
|
|
104
243
|
let reachable = false;
|
|
105
|
-
|
|
244
|
+
// @ts-ignore
|
|
245
|
+
const reachabilityData = await this.webex.boundedStorage
|
|
246
|
+
.get(this.namespace, REACHABILITY.localStorageResult)
|
|
247
|
+
.catch(() => {});
|
|
106
248
|
|
|
107
249
|
if (reachabilityData) {
|
|
108
250
|
try {
|
|
109
|
-
const reachabilityResults = JSON.parse(reachabilityData);
|
|
251
|
+
const reachabilityResults: InternalReachabilityResults = JSON.parse(reachabilityData);
|
|
110
252
|
|
|
111
253
|
reachable = Object.values(reachabilityResults).some(
|
|
112
|
-
(result
|
|
254
|
+
(result) =>
|
|
255
|
+
!result.isVideoMesh &&
|
|
256
|
+
(result.udp?.reachable === 'true' || result.tcp?.reachable === 'true')
|
|
113
257
|
);
|
|
114
258
|
} catch (e) {
|
|
115
259
|
LoggerProxy.logger.error(
|
|
@@ -129,7 +273,7 @@ export default class Reachability {
|
|
|
129
273
|
* @memberof Reachability
|
|
130
274
|
*/
|
|
131
275
|
private buildPeerConnectionConfig(cluster: any) {
|
|
132
|
-
const iceServers =
|
|
276
|
+
const iceServers = uniq(cluster.udp).map((url) => ({
|
|
133
277
|
username: '',
|
|
134
278
|
credential: '',
|
|
135
279
|
urls: [url],
|
|
@@ -190,7 +334,7 @@ export default class Reachability {
|
|
|
190
334
|
* @private
|
|
191
335
|
* @memberof Reachability
|
|
192
336
|
*/
|
|
193
|
-
private getLocalSDPForClusters(clusterList: object) {
|
|
337
|
+
private getLocalSDPForClusters(clusterList: object): Promise<InternalReachabilityResults> {
|
|
194
338
|
let clusters: any[] = [...Object.keys(clusterList)];
|
|
195
339
|
|
|
196
340
|
clusters = clusters.map(async (key) => {
|
|
@@ -203,18 +347,17 @@ export default class Reachability {
|
|
|
203
347
|
peerConnection.begin = Date.now();
|
|
204
348
|
peerConnection.setLocalDescription(description);
|
|
205
349
|
|
|
206
|
-
return this.iceGatheringState(
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
});
|
|
350
|
+
return this.iceGatheringState(peerConnection, cluster.isVideoMesh).catch(
|
|
351
|
+
(iceGatheringStateError) => {
|
|
352
|
+
LoggerProxy.logger.log(
|
|
353
|
+
`Reachability:index#getLocalSDPForClusters --> Error in getLocalSDP : ${iceGatheringStateError}`
|
|
354
|
+
);
|
|
355
|
+
}
|
|
356
|
+
);
|
|
214
357
|
});
|
|
215
358
|
|
|
216
359
|
return Promise.all(clusters)
|
|
217
|
-
.then(this.
|
|
360
|
+
.then(this.parseIceResultsToInternalReachabilityResults)
|
|
218
361
|
.then((reachabilityLatencyResults) => {
|
|
219
362
|
this.logUnreachableClusters();
|
|
220
363
|
|
|
@@ -290,6 +433,8 @@ export default class Reachability {
|
|
|
290
433
|
`Reachability:index#onIceCandidate --> Successfully pinged ${peerConnection.key}:`,
|
|
291
434
|
elapsed
|
|
292
435
|
);
|
|
436
|
+
// order is important
|
|
437
|
+
this.addPublicIP(peerConnection, e.candidate.address);
|
|
293
438
|
this.setLatencyAndClose(peerConnection, elapsed);
|
|
294
439
|
}
|
|
295
440
|
};
|
|
@@ -301,14 +446,17 @@ export default class Reachability {
|
|
|
301
446
|
* speed.
|
|
302
447
|
* @private
|
|
303
448
|
* @param {RTCPeerConnection} peerConnection
|
|
304
|
-
* @param {
|
|
449
|
+
* @param {boolean} isVideoMesh
|
|
305
450
|
* @returns {Promise}
|
|
306
451
|
*/
|
|
307
|
-
private iceGatheringState(peerConnection: RTCPeerConnection,
|
|
452
|
+
private iceGatheringState(peerConnection: RTCPeerConnection, isVideoMesh: boolean) {
|
|
308
453
|
const ELAPSED = 'elapsed';
|
|
309
454
|
|
|
310
|
-
|
|
455
|
+
const timeout = isVideoMesh ? VIDEO_MESH_TIMEOUT : DEFAULT_TIMEOUT;
|
|
456
|
+
|
|
457
|
+
return new Promise<ICECandidateResult>((resolve) => {
|
|
311
458
|
const peerConnectionProxy = new window.Proxy(peerConnection, {
|
|
459
|
+
// eslint-disable-next-line require-jsdoc
|
|
312
460
|
get(target, property) {
|
|
313
461
|
const targetMember = target[property];
|
|
314
462
|
|
|
@@ -321,8 +469,14 @@ export default class Reachability {
|
|
|
321
469
|
set: (target, property, value) => {
|
|
322
470
|
// only intercept elapsed property
|
|
323
471
|
if (property === ELAPSED) {
|
|
324
|
-
|
|
325
|
-
|
|
472
|
+
resolve({
|
|
473
|
+
// @ts-ignore
|
|
474
|
+
clusterId: peerConnection.key,
|
|
475
|
+
isVideoMesh,
|
|
476
|
+
// @ts-ignore
|
|
477
|
+
publicIPs: target.publicIPs,
|
|
478
|
+
elapsed: value,
|
|
479
|
+
});
|
|
326
480
|
|
|
327
481
|
return true;
|
|
328
482
|
}
|
|
@@ -343,6 +497,8 @@ export default class Reachability {
|
|
|
343
497
|
|
|
344
498
|
// Close any open peerConnections
|
|
345
499
|
if (peerConnectionProxy.connectionState !== CLOSED) {
|
|
500
|
+
// order is important
|
|
501
|
+
this.addPublicIP(peerConnectionProxy, null);
|
|
346
502
|
this.setLatencyAndClose(peerConnectionProxy, null);
|
|
347
503
|
}
|
|
348
504
|
}, timeout);
|
|
@@ -367,29 +523,39 @@ export default class Reachability {
|
|
|
367
523
|
|
|
368
524
|
/**
|
|
369
525
|
* Calculates time to establish connection
|
|
370
|
-
* @param {
|
|
526
|
+
* @param {Array<ICECandidateResult>} iceResults iceResults
|
|
371
527
|
* @returns {object} reachabilityMap
|
|
372
|
-
* @
|
|
528
|
+
* @protected
|
|
373
529
|
* @memberof Reachability
|
|
374
530
|
*/
|
|
375
|
-
|
|
531
|
+
protected parseIceResultsToInternalReachabilityResults(
|
|
532
|
+
iceResults: Array<ICECandidateResult>
|
|
533
|
+
): InternalReachabilityResults {
|
|
376
534
|
const reachabilityMap = {};
|
|
377
535
|
|
|
378
|
-
iceResults.forEach(({clusterId, elapsed}) => {
|
|
379
|
-
|
|
536
|
+
iceResults.forEach(({clusterId, isVideoMesh, elapsed, publicIPs}) => {
|
|
537
|
+
const latencyResult = {};
|
|
380
538
|
|
|
381
|
-
if (elapsed
|
|
382
|
-
latencyResult
|
|
539
|
+
if (!elapsed) {
|
|
540
|
+
Object.assign(latencyResult, {reachable: 'false'});
|
|
383
541
|
} else {
|
|
384
|
-
latencyResult
|
|
542
|
+
Object.assign(latencyResult, {
|
|
385
543
|
reachable: 'true',
|
|
386
544
|
latencyInMilliseconds: elapsed.toString(),
|
|
387
|
-
};
|
|
545
|
+
});
|
|
546
|
+
}
|
|
547
|
+
|
|
548
|
+
if (publicIPs) {
|
|
549
|
+
Object.assign(latencyResult, {
|
|
550
|
+
clientMediaIPs: publicIPs,
|
|
551
|
+
});
|
|
388
552
|
}
|
|
389
553
|
|
|
390
554
|
reachabilityMap[clusterId] = {
|
|
391
555
|
udp: latencyResult,
|
|
392
|
-
tcp:
|
|
556
|
+
tcp: {untested: 'true'},
|
|
557
|
+
xtls: {untested: 'true'},
|
|
558
|
+
isVideoMesh,
|
|
393
559
|
};
|
|
394
560
|
});
|
|
395
561
|
|
|
@@ -399,11 +565,11 @@ export default class Reachability {
|
|
|
399
565
|
/**
|
|
400
566
|
* fetches reachability data
|
|
401
567
|
* @param {object} clusterList
|
|
402
|
-
* @returns {Promise<
|
|
568
|
+
* @returns {Promise<InternalReachabilityResults>} reachability check results
|
|
403
569
|
* @private
|
|
404
570
|
* @memberof Reachability
|
|
405
571
|
*/
|
|
406
|
-
private performReachabilityCheck(clusterList: object) {
|
|
572
|
+
private performReachabilityCheck(clusterList: object): Promise<InternalReachabilityResults> {
|
|
407
573
|
if (!clusterList || !Object.keys(clusterList).length) {
|
|
408
574
|
return Promise.resolve({});
|
|
409
575
|
}
|
|
@@ -430,6 +596,33 @@ export default class Reachability {
|
|
|
430
596
|
});
|
|
431
597
|
}
|
|
432
598
|
|
|
599
|
+
/**
|
|
600
|
+
* Adds public IP (client media IPs)
|
|
601
|
+
* @param {RTCPeerConnection} peerConnection
|
|
602
|
+
* @param {string} publicIP
|
|
603
|
+
* @returns {void}
|
|
604
|
+
*/
|
|
605
|
+
protected addPublicIP(peerConnection: RTCPeerConnection, publicIP?: string | null) {
|
|
606
|
+
const modifiedPeerConnection: RTCPeerConnection & {publicIPs?: string[]} = peerConnection;
|
|
607
|
+
const {CLOSED} = CONNECTION_STATE;
|
|
608
|
+
|
|
609
|
+
if (modifiedPeerConnection.connectionState === CLOSED) {
|
|
610
|
+
LoggerProxy.logger.log(
|
|
611
|
+
`Reachability:index#addPublicIP --> Attempting to set publicIP of ${publicIP} on closed peerConnection.`
|
|
612
|
+
);
|
|
613
|
+
}
|
|
614
|
+
|
|
615
|
+
if (publicIP) {
|
|
616
|
+
if (modifiedPeerConnection.publicIPs) {
|
|
617
|
+
modifiedPeerConnection.publicIPs.push(publicIP);
|
|
618
|
+
} else {
|
|
619
|
+
modifiedPeerConnection.publicIPs = [publicIP];
|
|
620
|
+
}
|
|
621
|
+
} else {
|
|
622
|
+
modifiedPeerConnection.publicIPs = null;
|
|
623
|
+
}
|
|
624
|
+
}
|
|
625
|
+
|
|
433
626
|
/**
|
|
434
627
|
* Records latency and closes the peerConnection
|
|
435
628
|
* @param {RTCPeerConnection} peerConnection
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import LoggerProxy from '../common/logs/logger-proxy';
|
|
2
|
-
import {HTTP_VERBS, RESOURCE, API} from '../constants';
|
|
2
|
+
import {HTTP_VERBS, RESOURCE, API, IP_VERSION} from '../constants';
|
|
3
3
|
|
|
4
4
|
export interface ClusterNode {
|
|
5
5
|
isVideoMesh: boolean;
|
|
@@ -28,31 +28,40 @@ class ReachabilityRequest {
|
|
|
28
28
|
}
|
|
29
29
|
|
|
30
30
|
/**
|
|
31
|
-
*
|
|
31
|
+
* Gets the cluster information
|
|
32
32
|
*
|
|
33
|
-
* @param {
|
|
33
|
+
* @param {IP_VERSION} ipVersion information about current ip network we're on
|
|
34
34
|
* @returns {Promise}
|
|
35
35
|
*/
|
|
36
|
-
getClusters = (): Promise<ClusterList> =>
|
|
36
|
+
getClusters = (ipVersion?: IP_VERSION): Promise<{clusters: ClusterList; joinCookie: any}> =>
|
|
37
37
|
this.webex
|
|
38
38
|
.request({
|
|
39
39
|
method: HTTP_VERBS.GET,
|
|
40
40
|
shouldRefreshAccessToken: false,
|
|
41
41
|
api: API.CALLIOPEDISCOVERY,
|
|
42
42
|
resource: RESOURCE.CLUSTERS,
|
|
43
|
+
qs: {
|
|
44
|
+
JCSupport: 1,
|
|
45
|
+
ipver: ipVersion,
|
|
46
|
+
},
|
|
43
47
|
})
|
|
44
48
|
.then((res) => {
|
|
45
|
-
const {clusters} = res.body;
|
|
49
|
+
const {clusters, joinCookie} = res.body;
|
|
46
50
|
|
|
47
51
|
Object.keys(clusters).forEach((key) => {
|
|
48
|
-
clusters[key].isVideoMesh = res.body.clusterClasses?.hybridMedia?.includes(key);
|
|
52
|
+
clusters[key].isVideoMesh = !!res.body.clusterClasses?.hybridMedia?.includes(key);
|
|
49
53
|
});
|
|
50
54
|
|
|
51
55
|
LoggerProxy.logger.log(
|
|
52
|
-
`Reachability:request#getClusters --> get clusters successful:${JSON.stringify(
|
|
56
|
+
`Reachability:request#getClusters --> get clusters (ipver=${ipVersion}) successful:${JSON.stringify(
|
|
57
|
+
clusters
|
|
58
|
+
)}`
|
|
53
59
|
);
|
|
54
60
|
|
|
55
|
-
return
|
|
61
|
+
return {
|
|
62
|
+
clusters,
|
|
63
|
+
joinCookie,
|
|
64
|
+
};
|
|
56
65
|
});
|
|
57
66
|
|
|
58
67
|
/**
|