@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
|
@@ -3,25 +3,70 @@
|
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
5
|
/* eslint-disable class-methods-use-this */
|
|
6
|
-
|
|
7
|
-
import _ from 'lodash';
|
|
6
|
+
import {mapValues} from 'lodash';
|
|
8
7
|
|
|
9
8
|
import LoggerProxy from '../common/logs/logger-proxy';
|
|
10
|
-
import
|
|
9
|
+
import MeetingUtil from '../meeting/util';
|
|
10
|
+
|
|
11
|
+
import {REACHABILITY} from '../constants';
|
|
12
|
+
|
|
13
|
+
import ReachabilityRequest, {ClusterList} from './request';
|
|
14
|
+
import {
|
|
15
|
+
ClusterReachability,
|
|
16
|
+
ClusterReachabilityResult,
|
|
17
|
+
TransportResult,
|
|
18
|
+
} from './clusterReachability';
|
|
19
|
+
|
|
20
|
+
export type ReachabilityMetrics = {
|
|
21
|
+
reachability_public_udp_success: number;
|
|
22
|
+
reachability_public_udp_failed: number;
|
|
23
|
+
reachability_public_tcp_success: number;
|
|
24
|
+
reachability_public_tcp_failed: number;
|
|
25
|
+
reachability_vmn_udp_success: number;
|
|
26
|
+
reachability_vmn_udp_failed: number;
|
|
27
|
+
reachability_vmn_tcp_success: number;
|
|
28
|
+
reachability_vmn_tcp_failed: number;
|
|
29
|
+
};
|
|
11
30
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
31
|
+
/**
|
|
32
|
+
* This is the type that matches what backend expects us to send to them. It is a bit weird, because
|
|
33
|
+
* it uses strings instead of booleans and numbers, but that's what they require.
|
|
34
|
+
*/
|
|
35
|
+
export type TransportResultForBackend = {
|
|
36
|
+
reachable?: 'true' | 'false';
|
|
37
|
+
latencyInMilliseconds?: string;
|
|
38
|
+
clientMediaIPs?: string[];
|
|
39
|
+
untested?: 'true';
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
export type ReachabilityResultForBackend = {
|
|
43
|
+
udp: TransportResultForBackend;
|
|
44
|
+
tcp: TransportResultForBackend;
|
|
45
|
+
xtls: TransportResultForBackend;
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
// this is the type that is required by the backend when we send them reachability results
|
|
49
|
+
export type ReachabilityResultsForBackend = Record<string, ReachabilityResultForBackend>;
|
|
50
|
+
|
|
51
|
+
// this is the type used by Reachability class internally and stored in local storage
|
|
52
|
+
export type ReachabilityResults = Record<
|
|
53
|
+
string,
|
|
54
|
+
ClusterReachabilityResult & {
|
|
55
|
+
isVideoMesh?: boolean;
|
|
56
|
+
}
|
|
57
|
+
>;
|
|
16
58
|
|
|
17
59
|
/**
|
|
18
60
|
* @class Reachability
|
|
19
61
|
* @export
|
|
20
62
|
*/
|
|
21
63
|
export default class Reachability {
|
|
64
|
+
namespace = REACHABILITY.namespace;
|
|
22
65
|
webex: object;
|
|
23
|
-
reachabilityRequest:
|
|
24
|
-
|
|
66
|
+
reachabilityRequest: ReachabilityRequest;
|
|
67
|
+
clusterReachability: {
|
|
68
|
+
[key: string]: ClusterReachability;
|
|
69
|
+
};
|
|
25
70
|
|
|
26
71
|
/**
|
|
27
72
|
* Creates an instance of Reachability.
|
|
@@ -40,187 +85,209 @@ export default class Reachability {
|
|
|
40
85
|
*/
|
|
41
86
|
this.reachabilityRequest = new ReachabilityRequest(this.webex);
|
|
42
87
|
|
|
43
|
-
|
|
44
|
-
* internal object of clusters latency results
|
|
45
|
-
* @instance
|
|
46
|
-
* @type {object}
|
|
47
|
-
* @private
|
|
48
|
-
* @memberof Reachability
|
|
49
|
-
*/
|
|
50
|
-
this.clusterLatencyResults = {};
|
|
88
|
+
this.clusterReachability = {};
|
|
51
89
|
}
|
|
52
90
|
|
|
53
91
|
/**
|
|
54
|
-
*
|
|
55
|
-
* @returns {
|
|
92
|
+
* Gets a list of media clusters from the backend and performs reachability checks on all the clusters
|
|
93
|
+
* @returns {Promise<ReachabilityResults>} reachability results
|
|
56
94
|
* @public
|
|
57
|
-
* @async
|
|
58
95
|
* @memberof Reachability
|
|
59
96
|
*/
|
|
60
|
-
public async gatherReachability() {
|
|
61
|
-
this.setup();
|
|
62
|
-
|
|
97
|
+
public async gatherReachability(): Promise<ReachabilityResults> {
|
|
63
98
|
// 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
|
-
}
|
|
99
|
+
// @ts-ignore
|
|
100
|
+
await this.webex.boundedStorage.del(this.namespace, REACHABILITY.localStorageResult);
|
|
101
|
+
// @ts-ignore
|
|
102
|
+
await this.webex.boundedStorage.del(this.namespace, REACHABILITY.localStorageJoinCookie);
|
|
73
103
|
|
|
74
104
|
// Fetch clusters and measure latency
|
|
75
105
|
try {
|
|
76
|
-
const clusters = await this.reachabilityRequest.getClusters(
|
|
106
|
+
const {clusters, joinCookie} = await this.reachabilityRequest.getClusters(
|
|
107
|
+
MeetingUtil.getIpVersion(this.webex)
|
|
108
|
+
);
|
|
77
109
|
|
|
78
110
|
// Perform Reachability Check
|
|
79
|
-
const results = await this.
|
|
111
|
+
const results = await this.performReachabilityChecks(clusters);
|
|
80
112
|
|
|
81
|
-
|
|
113
|
+
// @ts-ignore
|
|
114
|
+
await this.webex.boundedStorage.put(
|
|
115
|
+
this.namespace,
|
|
116
|
+
REACHABILITY.localStorageResult,
|
|
117
|
+
JSON.stringify(results)
|
|
118
|
+
);
|
|
119
|
+
// @ts-ignore
|
|
120
|
+
await this.webex.boundedStorage.put(
|
|
121
|
+
this.namespace,
|
|
122
|
+
REACHABILITY.localStorageJoinCookie,
|
|
123
|
+
JSON.stringify(joinCookie)
|
|
124
|
+
);
|
|
82
125
|
|
|
83
126
|
LoggerProxy.logger.log(
|
|
84
127
|
'Reachability:index#gatherReachability --> Reachability checks completed'
|
|
85
128
|
);
|
|
86
129
|
|
|
87
130
|
return results;
|
|
88
|
-
} catch (
|
|
89
|
-
LoggerProxy.logger.error(
|
|
90
|
-
`Reachability:index#gatherReachability --> Error in calling getClusters(): ${getClusterError}`
|
|
91
|
-
);
|
|
131
|
+
} catch (error) {
|
|
132
|
+
LoggerProxy.logger.error(`Reachability:index#gatherReachability --> Error:`, error);
|
|
92
133
|
|
|
93
134
|
return {};
|
|
94
135
|
}
|
|
95
136
|
}
|
|
96
137
|
|
|
97
138
|
/**
|
|
98
|
-
*
|
|
99
|
-
*
|
|
100
|
-
*
|
|
101
|
-
* @
|
|
139
|
+
* Returns statistics about last reachability results. The returned value is an object
|
|
140
|
+
* with a flat list of properties so that it can be easily sent with metrics
|
|
141
|
+
*
|
|
142
|
+
* @returns {Promise} Promise with metrics values, it never rejects/throws.
|
|
102
143
|
*/
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
144
|
+
async getReachabilityMetrics(): Promise<ReachabilityMetrics> {
|
|
145
|
+
const stats: ReachabilityMetrics = {
|
|
146
|
+
reachability_public_udp_success: 0,
|
|
147
|
+
reachability_public_udp_failed: 0,
|
|
148
|
+
reachability_public_tcp_success: 0,
|
|
149
|
+
reachability_public_tcp_failed: 0,
|
|
150
|
+
reachability_vmn_udp_success: 0,
|
|
151
|
+
reachability_vmn_udp_failed: 0,
|
|
152
|
+
reachability_vmn_tcp_success: 0,
|
|
153
|
+
reachability_vmn_tcp_failed: 0,
|
|
154
|
+
};
|
|
110
155
|
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
LoggerProxy.logger.error(
|
|
116
|
-
`Roap:request#attachReachabilityData --> Error in parsing reachability data: ${e}`
|
|
117
|
-
);
|
|
156
|
+
const updateStats = (clusterType: 'public' | 'vmn', result: ClusterReachabilityResult) => {
|
|
157
|
+
if (result.udp && result.udp.result !== 'untested') {
|
|
158
|
+
const outcome = result.udp.result === 'reachable' ? 'success' : 'failed';
|
|
159
|
+
stats[`reachability_${clusterType}_udp_${outcome}`] += 1;
|
|
118
160
|
}
|
|
161
|
+
if (result.tcp && result.tcp.result !== 'untested') {
|
|
162
|
+
const outcome = result.tcp.result === 'reachable' ? 'success' : 'failed';
|
|
163
|
+
stats[`reachability_${clusterType}_tcp_${outcome}`] += 1;
|
|
164
|
+
}
|
|
165
|
+
};
|
|
166
|
+
|
|
167
|
+
try {
|
|
168
|
+
// @ts-ignore
|
|
169
|
+
const resultsJson = await this.webex.boundedStorage.get(
|
|
170
|
+
REACHABILITY.namespace,
|
|
171
|
+
REACHABILITY.localStorageResult
|
|
172
|
+
);
|
|
173
|
+
|
|
174
|
+
const results: ReachabilityResults = JSON.parse(resultsJson);
|
|
175
|
+
|
|
176
|
+
Object.values(results).forEach((result) => {
|
|
177
|
+
updateStats(result.isVideoMesh ? 'vmn' : 'public', result);
|
|
178
|
+
});
|
|
179
|
+
} catch (e) {
|
|
180
|
+
// empty storage, that's ok
|
|
181
|
+
LoggerProxy.logger.warn(
|
|
182
|
+
'Roap:request#getReachabilityMetrics --> Error parsing reachability data: ',
|
|
183
|
+
e
|
|
184
|
+
);
|
|
119
185
|
}
|
|
120
186
|
|
|
121
|
-
return
|
|
187
|
+
return stats;
|
|
122
188
|
}
|
|
123
189
|
|
|
124
190
|
/**
|
|
125
|
-
*
|
|
126
|
-
* @param {
|
|
127
|
-
* @returns {
|
|
128
|
-
* @private
|
|
129
|
-
* @memberof Reachability
|
|
191
|
+
* Maps our internal transport result to the format that backend expects
|
|
192
|
+
* @param {TransportResult} transportResult
|
|
193
|
+
* @returns {TransportResultForBackend}
|
|
130
194
|
*/
|
|
131
|
-
private
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
195
|
+
private mapTransportResultToBackendDataFormat(
|
|
196
|
+
transportResult: TransportResult
|
|
197
|
+
): TransportResultForBackend {
|
|
198
|
+
const output: TransportResultForBackend = {};
|
|
199
|
+
|
|
200
|
+
for (const [key, value] of Object.entries(transportResult)) {
|
|
201
|
+
switch (key) {
|
|
202
|
+
case 'result':
|
|
203
|
+
switch (value) {
|
|
204
|
+
case 'reachable':
|
|
205
|
+
output.reachable = 'true';
|
|
206
|
+
break;
|
|
207
|
+
case 'unreachable':
|
|
208
|
+
output.reachable = 'false';
|
|
209
|
+
break;
|
|
210
|
+
case 'untested':
|
|
211
|
+
output.untested = 'true';
|
|
212
|
+
break;
|
|
213
|
+
}
|
|
214
|
+
break;
|
|
215
|
+
case 'latencyInMilliseconds':
|
|
216
|
+
output.latencyInMilliseconds = value.toString();
|
|
217
|
+
break;
|
|
218
|
+
default:
|
|
219
|
+
output[key] = value;
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
return output;
|
|
143
224
|
}
|
|
144
225
|
|
|
145
226
|
/**
|
|
146
|
-
*
|
|
147
|
-
*
|
|
148
|
-
* @returns {
|
|
149
|
-
* @private
|
|
150
|
-
* @memberof Reachability
|
|
227
|
+
* Reachability results as an object in the format that backend expects
|
|
228
|
+
*
|
|
229
|
+
* @returns {any} reachability results that need to be sent to the backend
|
|
151
230
|
*/
|
|
152
|
-
|
|
153
|
-
|
|
231
|
+
async getReachabilityResults(): Promise<ReachabilityResultsForBackend | undefined> {
|
|
232
|
+
let results: ReachabilityResultsForBackend;
|
|
154
233
|
|
|
155
234
|
try {
|
|
156
|
-
const peerConnection = new window.RTCPeerConnection(config);
|
|
157
|
-
|
|
158
235
|
// @ts-ignore
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
} catch (peerConnectionError) {
|
|
163
|
-
LoggerProxy.logger.log(
|
|
164
|
-
`Reachability:index#createPeerConnection --> Error creating peerConnection: ${peerConnectionError}`
|
|
236
|
+
const resultsJson = await this.webex.boundedStorage.get(
|
|
237
|
+
REACHABILITY.namespace,
|
|
238
|
+
REACHABILITY.localStorageResult
|
|
165
239
|
);
|
|
166
240
|
|
|
167
|
-
|
|
241
|
+
const allClusterResults: ReachabilityResults = JSON.parse(resultsJson);
|
|
242
|
+
|
|
243
|
+
results = mapValues(allClusterResults, (clusterResult) => ({
|
|
244
|
+
udp: this.mapTransportResultToBackendDataFormat(clusterResult.udp || {result: 'untested'}),
|
|
245
|
+
tcp: this.mapTransportResultToBackendDataFormat(clusterResult.tcp || {result: 'untested'}),
|
|
246
|
+
xtls: this.mapTransportResultToBackendDataFormat(
|
|
247
|
+
clusterResult.xtls || {result: 'untested'}
|
|
248
|
+
),
|
|
249
|
+
}));
|
|
250
|
+
} catch (e) {
|
|
251
|
+
// empty storage, that's ok
|
|
252
|
+
LoggerProxy.logger.warn(
|
|
253
|
+
'Roap:request#attachReachabilityData --> Error parsing reachability data: ',
|
|
254
|
+
e
|
|
255
|
+
);
|
|
168
256
|
}
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
/**
|
|
172
|
-
* Gets total elapsed time
|
|
173
|
-
* @param {RTCPeerConnection} peerConnection
|
|
174
|
-
* @returns {Number} Milliseconds
|
|
175
|
-
* @private
|
|
176
|
-
* @memberof Reachability
|
|
177
|
-
*/
|
|
178
|
-
private getElapsedTime(peerConnection: any) {
|
|
179
|
-
const startTime = peerConnection.begin;
|
|
180
|
-
|
|
181
|
-
delete peerConnection.begin;
|
|
182
257
|
|
|
183
|
-
return
|
|
258
|
+
return results;
|
|
184
259
|
}
|
|
185
260
|
|
|
186
261
|
/**
|
|
187
|
-
*
|
|
188
|
-
* @
|
|
189
|
-
* @
|
|
190
|
-
* @private
|
|
262
|
+
* fetches reachability data and checks for cluster reachability
|
|
263
|
+
* @returns {boolean}
|
|
264
|
+
* @public
|
|
191
265
|
* @memberof Reachability
|
|
192
266
|
*/
|
|
193
|
-
|
|
194
|
-
let
|
|
267
|
+
async isAnyPublicClusterReachable() {
|
|
268
|
+
let reachable = false;
|
|
269
|
+
// @ts-ignore
|
|
270
|
+
const reachabilityData = await this.webex.boundedStorage
|
|
271
|
+
.get(this.namespace, REACHABILITY.localStorageResult)
|
|
272
|
+
.catch(() => {});
|
|
195
273
|
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
const peerConnection = this.createPeerConnection({key, config});
|
|
200
|
-
const description = await peerConnection.createOffer({offerToReceiveAudio: true});
|
|
274
|
+
if (reachabilityData) {
|
|
275
|
+
try {
|
|
276
|
+
const reachabilityResults: ReachabilityResults = JSON.parse(reachabilityData);
|
|
201
277
|
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
return this.iceGatheringState(
|
|
207
|
-
peerConnection,
|
|
208
|
-
cluster.isVideoMesh ? VIDEO_MESH_TIMEOUT : DEFAULT_TIMEOUT
|
|
209
|
-
).catch((iceGatheringStateError) => {
|
|
210
|
-
LoggerProxy.logger.log(
|
|
211
|
-
`Reachability:index#getLocalSDPForClusters --> Error in getLocalSDP : ${iceGatheringStateError}`
|
|
278
|
+
reachable = Object.values(reachabilityResults).some(
|
|
279
|
+
(result) =>
|
|
280
|
+
!result.isVideoMesh &&
|
|
281
|
+
(result.udp?.result === 'reachable' || result.tcp?.result === 'reachable')
|
|
212
282
|
);
|
|
213
|
-
})
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
this.logUnreachableClusters();
|
|
283
|
+
} catch (e) {
|
|
284
|
+
LoggerProxy.logger.error(
|
|
285
|
+
`Roap:request#attachReachabilityData --> Error in parsing reachability data: ${e}`
|
|
286
|
+
);
|
|
287
|
+
}
|
|
288
|
+
}
|
|
220
289
|
|
|
221
|
-
|
|
222
|
-
return reachabilityLatencyResults;
|
|
223
|
-
});
|
|
290
|
+
return reachable;
|
|
224
291
|
}
|
|
225
292
|
|
|
226
293
|
/**
|
|
@@ -229,126 +296,23 @@ export default class Reachability {
|
|
|
229
296
|
* @private
|
|
230
297
|
* @memberof Reachability
|
|
231
298
|
*/
|
|
232
|
-
private
|
|
299
|
+
private getUnreachableClusters(): Array<{name: string; protocol: string}> {
|
|
233
300
|
const unreachableList = [];
|
|
234
|
-
const clusters = this.clusterLatencyResults;
|
|
235
301
|
|
|
236
|
-
Object.
|
|
237
|
-
const
|
|
302
|
+
Object.entries(this.clusterReachability).forEach(([key, clusterReachability]) => {
|
|
303
|
+
const result = clusterReachability.getResult();
|
|
238
304
|
|
|
239
|
-
if (
|
|
240
|
-
unreachableList.push(key);
|
|
305
|
+
if (result.udp.result === 'unreachable') {
|
|
306
|
+
unreachableList.push({name: key, protocol: 'udp'});
|
|
307
|
+
}
|
|
308
|
+
if (result.tcp.result === 'unreachable') {
|
|
309
|
+
unreachableList.push({name: key, protocol: 'tcp'});
|
|
241
310
|
}
|
|
242
311
|
});
|
|
243
312
|
|
|
244
313
|
return unreachableList;
|
|
245
314
|
}
|
|
246
315
|
|
|
247
|
-
/**
|
|
248
|
-
* Attach an event handler for the icegatheringstatechange
|
|
249
|
-
* event and measure latency.
|
|
250
|
-
* @param {RTCPeerConnection} peerConnection
|
|
251
|
-
* @returns {undefined}
|
|
252
|
-
* @private
|
|
253
|
-
* @memberof Reachability
|
|
254
|
-
*/
|
|
255
|
-
private handleIceGatheringStateChange(peerConnection: RTCPeerConnection) {
|
|
256
|
-
peerConnection.onicegatheringstatechange = () => {
|
|
257
|
-
const {COMPLETE} = ICE_GATHERING_STATE;
|
|
258
|
-
|
|
259
|
-
if (peerConnection.iceConnectionState === COMPLETE) {
|
|
260
|
-
const elapsed = this.getElapsedTime(peerConnection);
|
|
261
|
-
|
|
262
|
-
// @ts-ignore
|
|
263
|
-
LoggerProxy.logger.log(
|
|
264
|
-
// @ts-ignore
|
|
265
|
-
`Reachability:index#onIceGatheringStateChange --> Successfully pinged ${peerConnection.key}:`,
|
|
266
|
-
elapsed
|
|
267
|
-
);
|
|
268
|
-
this.setLatencyAndClose(peerConnection, elapsed);
|
|
269
|
-
}
|
|
270
|
-
};
|
|
271
|
-
}
|
|
272
|
-
|
|
273
|
-
/**
|
|
274
|
-
* Attach an event handler for the icecandidate
|
|
275
|
-
* event and measure latency.
|
|
276
|
-
* @param {RTCPeerConnection} peerConnection
|
|
277
|
-
* @returns {undefined}
|
|
278
|
-
* @private
|
|
279
|
-
* @memberof Reachability
|
|
280
|
-
*/
|
|
281
|
-
private handleOnIceCandidate(peerConnection: RTCPeerConnection) {
|
|
282
|
-
peerConnection.onicecandidate = (e) => {
|
|
283
|
-
const SERVER_REFLEXIVE = 'srflx';
|
|
284
|
-
|
|
285
|
-
if (e.candidate && String(e.candidate.type).toLowerCase() === SERVER_REFLEXIVE) {
|
|
286
|
-
const elapsed = this.getElapsedTime(peerConnection);
|
|
287
|
-
|
|
288
|
-
LoggerProxy.logger.log(
|
|
289
|
-
// @ts-ignore
|
|
290
|
-
`Reachability:index#onIceCandidate --> Successfully pinged ${peerConnection.key}:`,
|
|
291
|
-
elapsed
|
|
292
|
-
);
|
|
293
|
-
this.setLatencyAndClose(peerConnection, elapsed);
|
|
294
|
-
}
|
|
295
|
-
};
|
|
296
|
-
}
|
|
297
|
-
|
|
298
|
-
/**
|
|
299
|
-
* An event handler on an RTCPeerConnection when the state of the ICE
|
|
300
|
-
* candidate gathering process changes. Used to measure connection
|
|
301
|
-
* speed.
|
|
302
|
-
* @private
|
|
303
|
-
* @param {RTCPeerConnection} peerConnection
|
|
304
|
-
* @param {number} timeout
|
|
305
|
-
* @returns {Promise}
|
|
306
|
-
*/
|
|
307
|
-
private iceGatheringState(peerConnection: RTCPeerConnection, timeout: number) {
|
|
308
|
-
const ELAPSED = 'elapsed';
|
|
309
|
-
|
|
310
|
-
return new Promise((resolve) => {
|
|
311
|
-
const peerConnectionProxy = new window.Proxy(peerConnection, {
|
|
312
|
-
get(target, property) {
|
|
313
|
-
const targetMember = target[property];
|
|
314
|
-
|
|
315
|
-
if (typeof targetMember === 'function') {
|
|
316
|
-
return targetMember.bind(target);
|
|
317
|
-
}
|
|
318
|
-
|
|
319
|
-
return targetMember;
|
|
320
|
-
},
|
|
321
|
-
set: (target, property, value) => {
|
|
322
|
-
// only intercept elapsed property
|
|
323
|
-
if (property === ELAPSED) {
|
|
324
|
-
// @ts-ignore
|
|
325
|
-
resolve({clusterId: peerConnection.key, elapsed: value});
|
|
326
|
-
|
|
327
|
-
return true;
|
|
328
|
-
}
|
|
329
|
-
|
|
330
|
-
// pass thru
|
|
331
|
-
return window.Reflect.set(target, property, value);
|
|
332
|
-
},
|
|
333
|
-
});
|
|
334
|
-
|
|
335
|
-
// Using peerConnection proxy so handle functions below
|
|
336
|
-
// won't be coupled to our promise implementation
|
|
337
|
-
this.handleIceGatheringStateChange(peerConnectionProxy);
|
|
338
|
-
this.handleOnIceCandidate(peerConnectionProxy);
|
|
339
|
-
|
|
340
|
-
// Set maximum timeout
|
|
341
|
-
window.setTimeout(() => {
|
|
342
|
-
const {CLOSED} = CONNECTION_STATE;
|
|
343
|
-
|
|
344
|
-
// Close any open peerConnections
|
|
345
|
-
if (peerConnectionProxy.connectionState !== CLOSED) {
|
|
346
|
-
this.setLatencyAndClose(peerConnectionProxy, null);
|
|
347
|
-
}
|
|
348
|
-
}, timeout);
|
|
349
|
-
});
|
|
350
|
-
}
|
|
351
|
-
|
|
352
316
|
/**
|
|
353
317
|
* Make a log of unreachable clusters.
|
|
354
318
|
* @returns {undefined}
|
|
@@ -356,123 +320,55 @@ export default class Reachability {
|
|
|
356
320
|
* @memberof Reachability
|
|
357
321
|
*/
|
|
358
322
|
private logUnreachableClusters() {
|
|
359
|
-
const list = this.
|
|
323
|
+
const list = this.getUnreachableClusters();
|
|
360
324
|
|
|
361
|
-
list.forEach((
|
|
325
|
+
list.forEach(({name, protocol}) => {
|
|
362
326
|
LoggerProxy.logger.log(
|
|
363
|
-
`Reachability:index#logUnreachableClusters -->
|
|
327
|
+
`Reachability:index#logUnreachableClusters --> failed to reach ${name} over ${protocol}`
|
|
364
328
|
);
|
|
365
329
|
});
|
|
366
330
|
}
|
|
367
331
|
|
|
368
332
|
/**
|
|
369
|
-
*
|
|
370
|
-
* @param {
|
|
371
|
-
* @returns {
|
|
372
|
-
* @private
|
|
373
|
-
* @memberof Reachability
|
|
333
|
+
* Performs reachability checks for all clusters
|
|
334
|
+
* @param {ClusterList} clusterList
|
|
335
|
+
* @returns {Promise<ReachabilityResults>} reachability check results
|
|
374
336
|
*/
|
|
375
|
-
private
|
|
376
|
-
const
|
|
377
|
-
|
|
378
|
-
iceResults.forEach(({clusterId, elapsed}) => {
|
|
379
|
-
let latencyResult;
|
|
380
|
-
|
|
381
|
-
if (elapsed === null) {
|
|
382
|
-
latencyResult = {reachable: 'false'};
|
|
383
|
-
} else {
|
|
384
|
-
latencyResult = {
|
|
385
|
-
reachable: 'true',
|
|
386
|
-
latencyInMilliseconds: elapsed.toString(),
|
|
387
|
-
};
|
|
388
|
-
}
|
|
389
|
-
|
|
390
|
-
reachabilityMap[clusterId] = {
|
|
391
|
-
udp: latencyResult,
|
|
392
|
-
tcp: latencyResult,
|
|
393
|
-
};
|
|
394
|
-
});
|
|
395
|
-
|
|
396
|
-
return reachabilityMap;
|
|
397
|
-
}
|
|
337
|
+
private async performReachabilityChecks(clusterList: ClusterList): Promise<ReachabilityResults> {
|
|
338
|
+
const results: ReachabilityResults = {};
|
|
398
339
|
|
|
399
|
-
/**
|
|
400
|
-
* fetches reachability data
|
|
401
|
-
* @param {object} clusterList
|
|
402
|
-
* @returns {Promise<localSDPData>} reachability check results
|
|
403
|
-
* @private
|
|
404
|
-
* @memberof Reachability
|
|
405
|
-
*/
|
|
406
|
-
private performReachabilityCheck(clusterList: object) {
|
|
407
340
|
if (!clusterList || !Object.keys(clusterList).length) {
|
|
408
|
-
return Promise.resolve(
|
|
341
|
+
return Promise.resolve(results);
|
|
409
342
|
}
|
|
410
343
|
|
|
411
|
-
return new Promise((resolve) => {
|
|
412
|
-
this.getLocalSDPForClusters(clusterList)
|
|
413
|
-
.then((localSDPData) => {
|
|
414
|
-
if (!localSDPData || !Object.keys(localSDPData).length) {
|
|
415
|
-
// TODO: handle the error condition properly and try retry
|
|
416
|
-
LoggerProxy.logger.log(
|
|
417
|
-
'Reachability:index#performReachabilityCheck --> Local SDP is empty or has missing elements..returning'
|
|
418
|
-
);
|
|
419
|
-
resolve({});
|
|
420
|
-
} else {
|
|
421
|
-
resolve(localSDPData);
|
|
422
|
-
}
|
|
423
|
-
})
|
|
424
|
-
.catch((error) => {
|
|
425
|
-
LoggerProxy.logger.error(
|
|
426
|
-
`Reachability:index#performReachabilityCheck --> Error in getLocalSDPForClusters: ${error}`
|
|
427
|
-
);
|
|
428
|
-
resolve({});
|
|
429
|
-
});
|
|
430
|
-
});
|
|
431
|
-
}
|
|
432
|
-
|
|
433
|
-
/**
|
|
434
|
-
* Records latency and closes the peerConnection
|
|
435
|
-
* @param {RTCPeerConnection} peerConnection
|
|
436
|
-
* @param {number} elapsed Latency in milliseconds
|
|
437
|
-
* @returns {undefined}
|
|
438
|
-
* @private
|
|
439
|
-
* @memberof Reachability
|
|
440
|
-
*/
|
|
441
|
-
private setLatencyAndClose(peerConnection: RTCPeerConnection, elapsed: number) {
|
|
442
|
-
const REACHABLE = 'reachable';
|
|
443
|
-
const UNREACHABLE = 'unreachable';
|
|
444
|
-
const {CLOSED} = CONNECTION_STATE;
|
|
445
344
|
// @ts-ignore
|
|
446
|
-
const
|
|
447
|
-
const resultKey = elapsed === null ? UNREACHABLE : REACHABLE;
|
|
448
|
-
const intialState = {[REACHABLE]: 0, [UNREACHABLE]: 0};
|
|
345
|
+
const includeTcpReachability = this.webex.config.meetings.experimental.enableTcpReachability;
|
|
449
346
|
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
347
|
+
LoggerProxy.logger.log(
|
|
348
|
+
`Reachability:index#performReachabilityChecks --> doing UDP${
|
|
349
|
+
includeTcpReachability ? ' and TCP' : ''
|
|
350
|
+
} reachability checks`
|
|
351
|
+
);
|
|
454
352
|
|
|
455
|
-
|
|
456
|
-
|
|
353
|
+
const clusterReachabilityChecks = Object.keys(clusterList).map((key) => {
|
|
354
|
+
const cluster = clusterList[key];
|
|
457
355
|
|
|
458
|
-
|
|
459
|
-
|
|
356
|
+
if (!includeTcpReachability) {
|
|
357
|
+
cluster.tcp = [];
|
|
358
|
+
}
|
|
460
359
|
|
|
461
|
-
|
|
462
|
-
// an event other than onIceCandidate
|
|
463
|
-
peerConnection.onicecandidate = null;
|
|
464
|
-
peerConnection.close();
|
|
465
|
-
// @ts-ignore
|
|
466
|
-
peerConnection.elapsed = elapsed;
|
|
467
|
-
}
|
|
360
|
+
this.clusterReachability[key] = new ClusterReachability(key, cluster);
|
|
468
361
|
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
362
|
+
return this.clusterReachability[key].start().then((result) => {
|
|
363
|
+
results[key] = result;
|
|
364
|
+
results[key].isVideoMesh = cluster.isVideoMesh;
|
|
365
|
+
});
|
|
366
|
+
});
|
|
367
|
+
|
|
368
|
+
await Promise.all(clusterReachabilityChecks);
|
|
369
|
+
|
|
370
|
+
this.logUnreachableClusters();
|
|
371
|
+
|
|
372
|
+
return results;
|
|
477
373
|
}
|
|
478
374
|
}
|