@webex/plugin-meetings 2.60.1-next.9 → 2.60.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 +8 -58
- package/dist/common/browser-detection.js +3 -2
- package/dist/common/browser-detection.js.map +1 -1
- package/dist/common/collection.js +4 -3
- package/dist/common/collection.js.map +1 -1
- package/dist/common/config.js +2 -1
- package/dist/common/config.js.map +1 -1
- package/dist/common/errors/captcha-error.js +2 -1
- package/dist/common/errors/captcha-error.js.map +1 -1
- package/dist/common/errors/intent-to-join.js +2 -1
- package/dist/common/errors/intent-to-join.js.map +1 -1
- package/dist/common/errors/join-meeting.js +2 -1
- package/dist/common/errors/join-meeting.js.map +1 -1
- package/dist/common/errors/media.js +2 -1
- package/dist/common/errors/media.js.map +1 -1
- package/dist/common/errors/parameter.js +4 -3
- package/dist/common/errors/parameter.js.map +1 -1
- package/dist/common/errors/password-error.js +2 -1
- package/dist/common/errors/password-error.js.map +1 -1
- package/dist/common/errors/permission.js +2 -1
- package/dist/common/errors/permission.js.map +1 -1
- package/dist/common/errors/{reclaim-host-role-errors.js → reclaim-host-role-error.js} +11 -7
- package/dist/common/errors/reclaim-host-role-error.js.map +1 -0
- package/dist/common/errors/reconnection-in-progress.js +2 -1
- package/dist/common/errors/reconnection-in-progress.js.map +1 -1
- package/dist/common/errors/reconnection.js +2 -1
- package/dist/common/errors/reconnection.js.map +1 -1
- package/dist/common/errors/stats.js +2 -1
- package/dist/common/errors/stats.js.map +1 -1
- package/dist/common/errors/webex-errors.d.ts +8 -20
- package/dist/common/errors/webex-errors.js +28 -48
- package/dist/common/errors/webex-errors.js.map +1 -1
- package/dist/common/errors/webex-meetings-error.js +2 -1
- package/dist/common/errors/webex-meetings-error.js.map +1 -1
- package/dist/common/events/events-scope.js +2 -1
- package/dist/common/events/events-scope.js.map +1 -1
- package/dist/common/events/events.js +2 -1
- package/dist/common/events/events.js.map +1 -1
- package/dist/common/events/trigger-proxy.js +2 -1
- package/dist/common/events/trigger-proxy.js.map +1 -1
- package/dist/common/events/util.js +2 -1
- package/dist/common/events/util.js.map +1 -1
- package/dist/common/logs/logger-config.js +2 -1
- package/dist/common/logs/logger-config.js.map +1 -1
- package/dist/common/logs/logger-proxy.js +3 -2
- package/dist/common/logs/logger-proxy.js.map +1 -1
- package/dist/common/logs/request.d.ts +1 -3
- package/dist/common/logs/request.js +5 -8
- package/dist/common/logs/request.js.map +1 -1
- package/dist/common/queue.d.ts +7 -9
- package/dist/common/queue.js +9 -22
- package/dist/common/queue.js.map +1 -1
- package/dist/config.d.ts +7 -6
- package/dist/config.js +10 -8
- package/dist/config.js.map +1 -1
- package/dist/constants.d.ts +100 -234
- package/dist/constants.js +444 -433
- package/dist/constants.js.map +1 -1
- package/dist/controls-options-manager/constants.js +6 -3
- package/dist/controls-options-manager/constants.js.map +1 -1
- package/dist/controls-options-manager/enums.d.ts +1 -11
- package/dist/controls-options-manager/enums.js +6 -15
- package/dist/controls-options-manager/enums.js.map +1 -1
- package/dist/controls-options-manager/index.d.ts +1 -17
- package/dist/controls-options-manager/index.js +38 -127
- package/dist/controls-options-manager/index.js.map +1 -1
- package/dist/controls-options-manager/util.d.ts +7 -1
- package/dist/controls-options-manager/util.js +19 -309
- package/dist/controls-options-manager/util.js.map +1 -1
- package/dist/index.d.ts +3 -6
- package/dist/index.js +5 -121
- package/dist/index.js.map +1 -1
- package/dist/locus-info/controlsUtils.js +11 -100
- package/dist/locus-info/controlsUtils.js.map +1 -1
- package/dist/locus-info/embeddedAppsUtils.js +4 -3
- package/dist/locus-info/embeddedAppsUtils.js.map +1 -1
- package/dist/locus-info/fullState.js +2 -1
- package/dist/locus-info/fullState.js.map +1 -1
- package/dist/locus-info/hostUtils.js +2 -1
- package/dist/locus-info/hostUtils.js.map +1 -1
- package/dist/locus-info/index.d.ts +4 -57
- package/dist/locus-info/index.js +84 -425
- package/dist/locus-info/index.js.map +1 -1
- package/dist/locus-info/infoUtils.js +5 -13
- package/dist/locus-info/infoUtils.js.map +1 -1
- package/dist/locus-info/mediaSharesUtils.js +3 -58
- package/dist/locus-info/mediaSharesUtils.js.map +1 -1
- package/dist/locus-info/parser.d.ts +6 -66
- package/dist/locus-info/parser.js +80 -253
- package/dist/locus-info/parser.js.map +1 -1
- package/dist/locus-info/selfUtils.js +13 -97
- package/dist/locus-info/selfUtils.js.map +1 -1
- package/dist/media/index.d.ts +0 -2
- package/dist/media/index.js +319 -107
- package/dist/media/index.js.map +1 -1
- package/dist/media/properties.d.ts +53 -38
- package/dist/media/properties.js +153 -96
- package/dist/media/properties.js.map +1 -1
- package/dist/media/util.js +22 -1
- package/dist/media/util.js.map +1 -1
- package/dist/mediaQualityMetrics/config.d.ts +230 -234
- package/dist/mediaQualityMetrics/config.js +498 -302
- package/dist/mediaQualityMetrics/config.js.map +1 -1
- package/dist/meeting/effectsState.d.ts +42 -0
- package/dist/meeting/effectsState.js +260 -0
- package/dist/meeting/effectsState.js.map +1 -0
- package/dist/meeting/in-meeting-actions.d.ts +0 -88
- package/dist/meeting/in-meeting-actions.js +3 -94
- package/dist/meeting/in-meeting-actions.js.map +1 -1
- package/dist/meeting/index.d.ts +520 -705
- package/dist/meeting/index.js +3083 -5041
- package/dist/meeting/index.js.map +1 -1
- package/dist/meeting/muteState.d.ts +25 -93
- package/dist/meeting/muteState.js +133 -224
- package/dist/meeting/muteState.js.map +1 -1
- package/dist/meeting/request.d.ts +47 -82
- package/dist/meeting/request.js +199 -304
- package/dist/meeting/request.js.map +1 -1
- package/dist/meeting/state.js +2 -1
- package/dist/meeting/state.js.map +1 -1
- package/dist/meeting/util.d.ts +1 -118
- package/dist/meeting/util.js +435 -676
- package/dist/meeting/util.js.map +1 -1
- package/dist/meeting-info/collection.js +4 -3
- package/dist/meeting-info/collection.js.map +1 -1
- package/dist/meeting-info/index.d.ts +1 -13
- package/dist/meeting-info/index.js +7 -74
- package/dist/meeting-info/index.js.map +1 -1
- package/dist/meeting-info/meeting-info-v2.d.ts +1 -31
- package/dist/meeting-info/meeting-info-v2.js +63 -200
- package/dist/meeting-info/meeting-info-v2.js.map +1 -1
- package/dist/meeting-info/request.js +2 -1
- package/dist/meeting-info/request.js.map +1 -1
- package/dist/meeting-info/util.js +3 -2
- package/dist/meeting-info/util.js.map +1 -1
- package/dist/meeting-info/utilv2.js +41 -39
- package/dist/meeting-info/utilv2.js.map +1 -1
- package/dist/meetings/collection.d.ts +0 -17
- package/dist/meetings/collection.js +4 -42
- package/dist/meetings/collection.js.map +1 -1
- package/dist/meetings/index.d.ts +20 -114
- package/dist/meetings/index.js +133 -540
- package/dist/meetings/index.js.map +1 -1
- package/dist/meetings/request.js +3 -4
- package/dist/meetings/request.js.map +1 -1
- package/dist/meetings/util.js +6 -107
- package/dist/meetings/util.js.map +1 -1
- package/dist/member/index.d.ts +1 -13
- package/dist/member/index.js +2 -45
- package/dist/member/index.js.map +1 -1
- package/dist/member/member.types.js +4 -3
- package/dist/member/member.types.js.map +1 -1
- package/dist/member/util.js +29 -120
- package/dist/member/util.js.map +1 -1
- package/dist/members/collection.d.ts +0 -5
- package/dist/members/collection.js +2 -11
- package/dist/members/collection.js.map +1 -1
- package/dist/members/index.d.ts +11 -56
- package/dist/members/index.js +47 -174
- package/dist/members/index.js.map +1 -1
- package/dist/members/request.d.ts +11 -67
- package/dist/members/request.js +54 -102
- package/dist/members/request.js.map +1 -1
- package/dist/members/types.js +4 -3
- package/dist/members/types.js.map +1 -1
- package/dist/members/util.d.ts +1 -214
- package/dist/members/util.js +284 -327
- package/dist/members/util.js.map +1 -1
- package/dist/metrics/config.d.ts +169 -0
- package/dist/metrics/config.js +289 -0
- package/dist/metrics/config.js.map +1 -0
- package/dist/metrics/constants.d.ts +6 -15
- package/dist/metrics/constants.js +9 -17
- package/dist/metrics/constants.js.map +1 -1
- package/dist/metrics/index.d.ts +111 -4
- package/dist/metrics/index.js +452 -4
- package/dist/metrics/index.js.map +1 -1
- package/dist/networkQualityMonitor/index.js +4 -5
- package/dist/networkQualityMonitor/index.js.map +1 -1
- package/dist/peer-connection-manager/index.d.ts +6 -0
- package/dist/peer-connection-manager/index.js +671 -0
- package/dist/peer-connection-manager/index.js.map +1 -0
- package/dist/peer-connection-manager/util.d.ts +6 -0
- package/dist/peer-connection-manager/util.js +110 -0
- package/dist/peer-connection-manager/util.js.map +1 -0
- package/dist/personal-meeting-room/index.js +3 -2
- package/dist/personal-meeting-room/index.js.map +1 -1
- package/dist/personal-meeting-room/request.js +3 -2
- package/dist/personal-meeting-room/request.js.map +1 -1
- package/dist/personal-meeting-room/util.js +2 -1
- package/dist/personal-meeting-room/util.js.map +1 -1
- package/dist/reachability/index.d.ts +95 -61
- package/dist/reachability/index.js +392 -304
- package/dist/reachability/index.js.map +1 -1
- package/dist/reachability/request.d.ts +3 -7
- package/dist/reachability/request.js +10 -18
- package/dist/reachability/request.js.map +1 -1
- package/dist/reactions/reactions.d.ts +2 -2
- package/dist/reactions/reactions.js +6 -4
- package/dist/reactions/reactions.js.map +1 -1
- package/dist/reactions/reactions.type.d.ts +3 -23
- package/dist/reactions/reactions.type.js +23 -21
- package/dist/reactions/reactions.type.js.map +1 -1
- package/dist/reconnection-manager/index.d.ts +8 -32
- package/dist/reconnection-manager/index.js +232 -285
- package/dist/reconnection-manager/index.js.map +1 -1
- package/dist/recording-controller/enums.js +5 -4
- package/dist/recording-controller/enums.js.map +1 -1
- package/dist/recording-controller/index.d.ts +1 -15
- package/dist/recording-controller/index.js +46 -57
- package/dist/recording-controller/index.js.map +1 -1
- package/dist/recording-controller/util.d.ts +4 -5
- package/dist/recording-controller/util.js +10 -10
- package/dist/recording-controller/util.js.map +1 -1
- package/dist/roap/collection.d.ts +10 -0
- package/dist/roap/collection.js +63 -0
- package/dist/roap/collection.js.map +1 -0
- package/dist/roap/handler.d.ts +47 -0
- package/dist/roap/handler.js +279 -0
- package/dist/roap/handler.js.map +1 -0
- package/dist/roap/index.d.ts +47 -9
- package/dist/roap/index.js +238 -100
- package/dist/roap/index.js.map +1 -1
- package/dist/roap/request.d.ts +12 -18
- package/dist/roap/request.js +180 -126
- package/dist/roap/request.js.map +1 -1
- package/dist/roap/state.d.ts +9 -0
- package/dist/roap/state.js +127 -0
- package/dist/roap/state.js.map +1 -0
- package/dist/roap/turnDiscovery.d.ts +16 -27
- package/dist/roap/turnDiscovery.js +105 -115
- package/dist/roap/turnDiscovery.js.map +1 -1
- package/dist/roap/util.d.ts +2 -0
- package/dist/roap/util.js +76 -0
- package/dist/roap/util.js.map +1 -0
- package/dist/statsAnalyzer/global.d.ts +83 -1
- package/dist/statsAnalyzer/global.js +85 -2
- package/dist/statsAnalyzer/global.js.map +1 -1
- package/dist/statsAnalyzer/index.d.ts +30 -50
- package/dist/statsAnalyzer/index.js +511 -436
- package/dist/statsAnalyzer/index.js.map +1 -1
- package/dist/statsAnalyzer/mqaUtil.d.ts +6 -8
- package/dist/statsAnalyzer/mqaUtil.js +90 -130
- package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
- package/dist/transcription/index.js +2 -1
- package/dist/transcription/index.js.map +1 -1
- package/package.json +26 -39
- package/src/common/errors/webex-errors.ts +12 -36
- package/src/common/logs/logger-proxy.ts +1 -1
- package/src/common/logs/request.ts +1 -5
- package/src/common/queue.ts +8 -22
- package/src/config.ts +7 -6
- package/src/constants.ts +100 -265
- package/src/controls-options-manager/enums.ts +0 -12
- package/src/controls-options-manager/index.ts +21 -116
- package/src/controls-options-manager/util.ts +14 -294
- package/src/index.js +15 -0
- package/src/locus-info/controlsUtils.ts +0 -110
- package/src/locus-info/index.ts +61 -450
- package/src/locus-info/infoUtils.ts +2 -14
- package/src/locus-info/mediaSharesUtils.ts +0 -64
- package/src/locus-info/parser.ts +47 -258
- package/src/locus-info/selfUtils.ts +2 -85
- package/src/media/index.ts +370 -153
- package/src/media/properties.ts +136 -106
- package/src/media/util.ts +21 -0
- package/src/mediaQualityMetrics/config.ts +377 -244
- package/src/meeting/effectsState.ts +209 -0
- package/src/meeting/in-meeting-actions.ts +0 -176
- package/src/meeting/index.ts +2581 -4306
- package/src/meeting/muteState.ts +138 -224
- package/src/meeting/request.ts +127 -214
- package/src/meeting/util.ts +423 -687
- package/src/meeting-info/index.ts +8 -81
- package/src/meeting-info/meeting-info-v2.ts +13 -163
- package/src/meeting-info/util.ts +1 -1
- package/src/meeting-info/utilv2.ts +28 -28
- package/src/meetings/collection.ts +0 -33
- package/src/meetings/index.ts +136 -531
- package/src/meetings/request.ts +0 -2
- package/src/meetings/util.ts +5 -116
- package/src/member/index.ts +1 -43
- package/src/member/util.ts +28 -125
- package/src/members/collection.ts +0 -8
- package/src/members/index.ts +52 -187
- package/src/members/request.ts +27 -87
- package/src/members/util.ts +291 -332
- package/src/metrics/config.ts +485 -0
- package/src/metrics/constants.ts +6 -15
- package/src/metrics/index.ts +471 -1
- package/src/networkQualityMonitor/index.ts +6 -6
- package/src/peer-connection-manager/index.ts +847 -0
- package/src/peer-connection-manager/util.ts +119 -0
- package/src/reachability/index.ts +347 -246
- package/src/reachability/request.ts +8 -17
- package/src/reactions/reactions.ts +4 -4
- package/src/reactions/reactions.type.ts +4 -30
- package/src/reconnection-manager/index.ts +156 -168
- package/src/recording-controller/index.ts +3 -20
- package/src/recording-controller/util.ts +9 -26
- package/src/roap/collection.ts +62 -0
- package/src/roap/handler.ts +294 -0
- package/src/roap/index.ts +241 -96
- package/src/roap/request.ts +148 -74
- package/src/roap/state.ts +156 -0
- package/src/roap/turnDiscovery.ts +56 -62
- package/src/roap/util.ts +100 -0
- package/src/statsAnalyzer/global.ts +84 -1
- package/src/statsAnalyzer/index.ts +645 -479
- package/src/statsAnalyzer/mqaUtil.ts +126 -128
- package/test/integration/spec/journey.js +264 -320
- package/test/integration/spec/space-meeting.js +4 -77
- package/test/unit/spec/common/queue.js +2 -31
- package/test/unit/spec/controls-options-manager/index.js +0 -163
- package/test/unit/spec/controls-options-manager/util.js +60 -576
- package/test/unit/spec/fixture/locus.js +0 -1
- package/test/unit/spec/locus-info/controlsUtils.js +30 -323
- package/test/unit/spec/locus-info/index.js +15 -1437
- package/test/unit/spec/locus-info/infoUtils.js +16 -54
- package/test/unit/spec/locus-info/lib/SeqCmp.json +0 -16
- package/test/unit/spec/locus-info/lib/selfConstant.js +0 -48
- package/test/unit/spec/locus-info/parser.js +35 -116
- package/test/unit/spec/locus-info/selfUtils.js +0 -275
- package/test/unit/spec/media/properties.ts +84 -75
- package/test/unit/spec/meeting/effectsState.js +281 -0
- package/test/unit/spec/meeting/in-meeting-actions.ts +0 -86
- package/test/unit/spec/meeting/index.js +2313 -8384
- package/test/unit/spec/meeting/muteState.js +213 -409
- package/test/unit/spec/meeting/request.js +43 -523
- package/test/unit/spec/meeting/utils.js +24 -834
- package/test/unit/spec/meeting-info/meetinginfov2.js +5 -527
- package/test/unit/spec/meeting-info/utilv2.js +0 -21
- package/test/unit/spec/meetings/collection.js +0 -26
- package/test/unit/spec/meetings/index.js +232 -1445
- package/test/unit/spec/meetings/utils.js +2 -202
- package/test/unit/spec/member/index.js +9 -32
- package/test/unit/spec/member/util.js +61 -499
- package/test/unit/spec/members/index.js +5 -394
- package/test/unit/spec/members/request.js +27 -206
- package/test/unit/spec/members/utils.js +38 -173
- package/test/unit/spec/metrics/index.js +50 -1
- package/test/unit/spec/networkQualityMonitor/index.js +4 -4
- package/test/unit/spec/peerconnection-manager/index.js +218 -0
- package/test/unit/spec/peerconnection-manager/utils.js +49 -0
- package/test/unit/spec/peerconnection-manager/utils.test-fixtures.ts +388 -0
- package/test/unit/spec/reachability/index.ts +24 -532
- package/test/unit/spec/reconnection-manager/index.js +24 -163
- package/test/unit/spec/recording-controller/index.js +218 -293
- package/test/unit/spec/recording-controller/util.js +96 -223
- package/test/unit/spec/roap/index.ts +77 -187
- package/test/unit/spec/roap/turnDiscovery.ts +48 -86
- package/test/unit/spec/roap/util.js +30 -0
- package/test/unit/spec/stats-analyzer/index.js +165 -644
- package/test/utils/testUtils.js +45 -0
- package/test/utils/webex-config.js +0 -4
- package/test/utils/webex-test-users.js +3 -7
- package/dist/annotation/annotation.types.d.ts +0 -42
- package/dist/annotation/annotation.types.js +0 -7
- package/dist/annotation/annotation.types.js.map +0 -1
- package/dist/annotation/constants.d.ts +0 -31
- package/dist/annotation/constants.js +0 -41
- package/dist/annotation/constants.js.map +0 -1
- package/dist/annotation/index.d.ts +0 -117
- package/dist/annotation/index.js +0 -357
- package/dist/annotation/index.js.map +0 -1
- package/dist/breakouts/breakout.d.ts +0 -8
- package/dist/breakouts/breakout.js +0 -215
- package/dist/breakouts/breakout.js.map +0 -1
- package/dist/breakouts/collection.d.ts +0 -5
- package/dist/breakouts/collection.js +0 -22
- package/dist/breakouts/collection.js.map +0 -1
- package/dist/breakouts/edit-lock-error.d.ts +0 -15
- package/dist/breakouts/edit-lock-error.js +0 -51
- package/dist/breakouts/edit-lock-error.js.map +0 -1
- package/dist/breakouts/events.d.ts +0 -8
- package/dist/breakouts/events.js +0 -44
- package/dist/breakouts/events.js.map +0 -1
- package/dist/breakouts/index.d.ts +0 -5
- package/dist/breakouts/index.js +0 -1047
- package/dist/breakouts/index.js.map +0 -1
- package/dist/breakouts/request.d.ts +0 -22
- package/dist/breakouts/request.js +0 -77
- package/dist/breakouts/request.js.map +0 -1
- package/dist/breakouts/utils.d.ts +0 -15
- package/dist/breakouts/utils.js +0 -64
- package/dist/breakouts/utils.js.map +0 -1
- package/dist/common/errors/no-meeting-info.d.ts +0 -14
- package/dist/common/errors/no-meeting-info.js +0 -50
- package/dist/common/errors/no-meeting-info.js.map +0 -1
- package/dist/common/errors/reclaim-host-role-errors.js.map +0 -1
- package/dist/controls-options-manager/types.d.ts +0 -43
- package/dist/controls-options-manager/types.js +0 -7
- package/dist/controls-options-manager/types.js.map +0 -1
- package/dist/interceptors/index.d.ts +0 -2
- package/dist/interceptors/index.js +0 -15
- package/dist/interceptors/index.js.map +0 -1
- package/dist/interceptors/locusRetry.d.ts +0 -27
- package/dist/interceptors/locusRetry.js +0 -94
- package/dist/interceptors/locusRetry.js.map +0 -1
- package/dist/interpretation/collection.d.ts +0 -5
- package/dist/interpretation/collection.js +0 -22
- package/dist/interpretation/collection.js.map +0 -1
- package/dist/interpretation/index.d.ts +0 -5
- package/dist/interpretation/index.js +0 -365
- package/dist/interpretation/index.js.map +0 -1
- package/dist/interpretation/siLanguage.d.ts +0 -5
- package/dist/interpretation/siLanguage.js +0 -24
- package/dist/interpretation/siLanguage.js.map +0 -1
- package/dist/meeting/locusMediaRequest.d.ts +0 -74
- package/dist/meeting/locusMediaRequest.js +0 -291
- package/dist/meeting/locusMediaRequest.js.map +0 -1
- package/dist/meeting/request.type.d.ts +0 -11
- package/dist/meeting/request.type.js +0 -7
- package/dist/meeting/request.type.js.map +0 -1
- package/dist/meeting/voicea-meeting.d.ts +0 -20
- package/dist/meeting/voicea-meeting.js +0 -201
- package/dist/meeting/voicea-meeting.js.map +0 -1
- package/dist/meetings/meetings.types.d.ts +0 -4
- package/dist/meetings/meetings.types.js +0 -7
- package/dist/meetings/meetings.types.js.map +0 -1
- package/dist/member/types.d.ts +0 -32
- package/dist/member/types.js +0 -23
- package/dist/member/types.js.map +0 -1
- package/dist/multistream/mediaRequestManager.d.ts +0 -118
- package/dist/multistream/mediaRequestManager.js +0 -344
- package/dist/multistream/mediaRequestManager.js.map +0 -1
- package/dist/multistream/receiveSlot.d.ts +0 -68
- package/dist/multistream/receiveSlot.js +0 -200
- package/dist/multistream/receiveSlot.js.map +0 -1
- package/dist/multistream/receiveSlotManager.d.ts +0 -56
- package/dist/multistream/receiveSlotManager.js +0 -174
- package/dist/multistream/receiveSlotManager.js.map +0 -1
- package/dist/multistream/remoteMedia.d.ts +0 -72
- package/dist/multistream/remoteMedia.js +0 -268
- package/dist/multistream/remoteMedia.js.map +0 -1
- package/dist/multistream/remoteMediaGroup.d.ts +0 -47
- package/dist/multistream/remoteMediaGroup.js +0 -267
- package/dist/multistream/remoteMediaGroup.js.map +0 -1
- package/dist/multistream/remoteMediaManager.d.ts +0 -285
- package/dist/multistream/remoteMediaManager.js +0 -1211
- package/dist/multistream/remoteMediaManager.js.map +0 -1
- package/dist/multistream/sendSlotManager.d.ts +0 -61
- package/dist/multistream/sendSlotManager.js +0 -236
- package/dist/multistream/sendSlotManager.js.map +0 -1
- package/dist/reachability/clusterReachability.d.ts +0 -109
- package/dist/reachability/clusterReachability.js +0 -357
- package/dist/reachability/clusterReachability.js.map +0 -1
- package/dist/reachability/util.d.ts +0 -8
- package/dist/reachability/util.js +0 -29
- package/dist/reachability/util.js.map +0 -1
- package/dist/reactions/constants.d.ts +0 -3
- package/dist/reactions/constants.js +0 -12
- package/dist/reactions/constants.js.map +0 -1
- package/dist/rtcMetrics/constants.d.ts +0 -4
- package/dist/rtcMetrics/constants.js +0 -11
- package/dist/rtcMetrics/constants.js.map +0 -1
- package/dist/rtcMetrics/index.d.ts +0 -54
- package/dist/rtcMetrics/index.js +0 -140
- package/dist/rtcMetrics/index.js.map +0 -1
- package/dist/webinar/collection.d.ts +0 -16
- package/dist/webinar/collection.js +0 -43
- package/dist/webinar/collection.js.map +0 -1
- package/dist/webinar/index.d.ts +0 -5
- package/dist/webinar/index.js +0 -68
- package/dist/webinar/index.js.map +0 -1
- package/src/annotation/annotation.types.ts +0 -50
- package/src/annotation/constants.ts +0 -36
- package/src/annotation/index.ts +0 -328
- package/src/breakouts/README.md +0 -220
- package/src/breakouts/breakout.ts +0 -188
- package/src/breakouts/collection.ts +0 -19
- package/src/breakouts/edit-lock-error.ts +0 -25
- package/src/breakouts/events.ts +0 -56
- package/src/breakouts/index.ts +0 -925
- package/src/breakouts/request.ts +0 -55
- package/src/breakouts/utils.ts +0 -57
- package/src/common/errors/no-meeting-info.ts +0 -24
- package/src/controls-options-manager/types.ts +0 -59
- package/src/index.ts +0 -44
- package/src/interceptors/index.ts +0 -3
- package/src/interceptors/locusRetry.ts +0 -67
- package/src/interpretation/README.md +0 -60
- package/src/interpretation/collection.ts +0 -19
- package/src/interpretation/index.ts +0 -332
- package/src/interpretation/siLanguage.ts +0 -18
- package/src/meeting/locusMediaRequest.ts +0 -313
- package/src/meeting/request.type.ts +0 -13
- package/src/meeting/voicea-meeting.ts +0 -161
- package/src/meetings/meetings.types.ts +0 -12
- package/src/member/types.ts +0 -38
- package/src/multistream/mediaRequestManager.ts +0 -440
- package/src/multistream/receiveSlot.ts +0 -184
- package/src/multistream/receiveSlotManager.ts +0 -166
- package/src/multistream/remoteMedia.ts +0 -254
- package/src/multistream/remoteMediaGroup.ts +0 -284
- package/src/multistream/remoteMediaManager.ts +0 -1145
- package/src/multistream/sendSlotManager.ts +0 -170
- package/src/reachability/clusterReachability.ts +0 -320
- package/src/reachability/util.ts +0 -24
- package/src/reactions/constants.ts +0 -4
- package/src/rtcMetrics/constants.ts +0 -3
- package/src/rtcMetrics/index.ts +0 -124
- package/src/webinar/collection.ts +0 -31
- package/src/webinar/index.ts +0 -62
- package/test/integration/spec/converged-space-meetings.js +0 -233
- package/test/unit/spec/annotation/index.ts +0 -418
- package/test/unit/spec/breakouts/breakout.ts +0 -237
- package/test/unit/spec/breakouts/collection.ts +0 -15
- package/test/unit/spec/breakouts/edit-lock-error.ts +0 -30
- package/test/unit/spec/breakouts/events.ts +0 -89
- package/test/unit/spec/breakouts/index.ts +0 -1790
- package/test/unit/spec/breakouts/request.ts +0 -104
- package/test/unit/spec/breakouts/utils.js +0 -72
- package/test/unit/spec/interceptors/locusRetry.ts +0 -131
- package/test/unit/spec/interpretation/collection.ts +0 -15
- package/test/unit/spec/interpretation/index.ts +0 -589
- package/test/unit/spec/interpretation/siLanguage.ts +0 -28
- package/test/unit/spec/locus-info/mediaSharesUtils.ts +0 -32
- package/test/unit/spec/media/index.ts +0 -290
- package/test/unit/spec/meeting/locusMediaRequest.ts +0 -442
- package/test/unit/spec/meeting-info/index.js +0 -300
- package/test/unit/spec/multistream/mediaRequestManager.ts +0 -1418
- package/test/unit/spec/multistream/receiveSlot.ts +0 -163
- package/test/unit/spec/multistream/receiveSlotManager.ts +0 -203
- package/test/unit/spec/multistream/remoteMedia.ts +0 -255
- package/test/unit/spec/multistream/remoteMediaGroup.ts +0 -662
- package/test/unit/spec/multistream/remoteMediaManager.ts +0 -1924
- package/test/unit/spec/multistream/sendSlotManager.ts +0 -242
- package/test/unit/spec/reachability/clusterReachability.ts +0 -279
- package/test/unit/spec/reachability/request.js +0 -68
- package/test/unit/spec/reachability/util.ts +0 -40
- package/test/unit/spec/roap/request.ts +0 -255
- package/test/unit/spec/rtcMetrics/index.ts +0 -93
- package/test/unit/spec/webinar/collection.ts +0 -13
- package/test/unit/spec/webinar/index.ts +0 -60
- package/test/utils/constants.js +0 -9
- package/test/utils/integrationTestUtils.js +0 -46
- /package/dist/common/errors/{reclaim-host-role-errors.d.ts → reclaim-host-role-error.d.ts} +0 -0
- /package/src/common/errors/{reclaim-host-role-errors.ts → reclaim-host-role-error.ts} +0 -0
|
@@ -3,70 +3,25 @@
|
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
5
|
/* eslint-disable class-methods-use-this */
|
|
6
|
-
|
|
6
|
+
/* globals window */
|
|
7
|
+
import _ from 'lodash';
|
|
7
8
|
|
|
8
9
|
import LoggerProxy from '../common/logs/logger-proxy';
|
|
9
|
-
import
|
|
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
|
-
};
|
|
10
|
+
import {ICE_GATHERING_STATE, CONNECTION_STATE, REACHABILITY} from '../constants';
|
|
30
11
|
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
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
|
-
>;
|
|
12
|
+
import ReachabilityRequest from './request';
|
|
13
|
+
|
|
14
|
+
const DEFAULT_TIMEOUT = 3000;
|
|
15
|
+
const VIDEO_MESH_TIMEOUT = 1000;
|
|
58
16
|
|
|
59
17
|
/**
|
|
60
18
|
* @class Reachability
|
|
61
19
|
* @export
|
|
62
20
|
*/
|
|
63
21
|
export default class Reachability {
|
|
64
|
-
namespace = REACHABILITY.namespace;
|
|
65
22
|
webex: object;
|
|
66
|
-
reachabilityRequest:
|
|
67
|
-
|
|
68
|
-
[key: string]: ClusterReachability;
|
|
69
|
-
};
|
|
23
|
+
reachabilityRequest: any;
|
|
24
|
+
clusterLatencyResults: any;
|
|
70
25
|
|
|
71
26
|
/**
|
|
72
27
|
* Creates an instance of Reachability.
|
|
@@ -85,209 +40,187 @@ export default class Reachability {
|
|
|
85
40
|
*/
|
|
86
41
|
this.reachabilityRequest = new ReachabilityRequest(this.webex);
|
|
87
42
|
|
|
88
|
-
|
|
43
|
+
/**
|
|
44
|
+
* internal object of clusters latency results
|
|
45
|
+
* @instance
|
|
46
|
+
* @type {object}
|
|
47
|
+
* @private
|
|
48
|
+
* @memberof Reachability
|
|
49
|
+
*/
|
|
50
|
+
this.clusterLatencyResults = {};
|
|
89
51
|
}
|
|
90
52
|
|
|
91
53
|
/**
|
|
92
|
-
*
|
|
93
|
-
* @returns {
|
|
54
|
+
* fetches reachability data
|
|
55
|
+
* @returns {Object} reachability data
|
|
94
56
|
* @public
|
|
57
|
+
* @async
|
|
95
58
|
* @memberof Reachability
|
|
96
59
|
*/
|
|
97
|
-
public async gatherReachability()
|
|
60
|
+
public async gatherReachability() {
|
|
61
|
+
this.setup();
|
|
62
|
+
|
|
98
63
|
// Remove stored reachability results to ensure no stale data
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
64
|
+
if (window?.localStorage?.removeItem) {
|
|
65
|
+
window.localStorage.removeItem(REACHABILITY.localStorage);
|
|
66
|
+
} else {
|
|
67
|
+
LoggerProxy.logger.error(
|
|
68
|
+
'Reachability:index#gatherReachability --> Error in accessing LocalStorage.'
|
|
69
|
+
);
|
|
70
|
+
|
|
71
|
+
return {};
|
|
72
|
+
}
|
|
103
73
|
|
|
104
74
|
// Fetch clusters and measure latency
|
|
105
75
|
try {
|
|
106
|
-
const
|
|
107
|
-
MeetingUtil.getIpVersion(this.webex)
|
|
108
|
-
);
|
|
76
|
+
const clusters = await this.reachabilityRequest.getClusters();
|
|
109
77
|
|
|
110
78
|
// Perform Reachability Check
|
|
111
|
-
const results = await this.
|
|
79
|
+
const results = await this.performReachabilityCheck(clusters);
|
|
112
80
|
|
|
113
|
-
|
|
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
|
-
);
|
|
81
|
+
window.localStorage.setItem(REACHABILITY.localStorage, JSON.stringify(results));
|
|
125
82
|
|
|
126
83
|
LoggerProxy.logger.log(
|
|
127
84
|
'Reachability:index#gatherReachability --> Reachability checks completed'
|
|
128
85
|
);
|
|
129
86
|
|
|
130
87
|
return results;
|
|
131
|
-
} catch (
|
|
132
|
-
LoggerProxy.logger.error(
|
|
88
|
+
} catch (getClusterError) {
|
|
89
|
+
LoggerProxy.logger.error(
|
|
90
|
+
`Reachability:index#gatherReachability --> Error in calling getClusters(): ${getClusterError}`
|
|
91
|
+
);
|
|
133
92
|
|
|
134
93
|
return {};
|
|
135
94
|
}
|
|
136
95
|
}
|
|
137
96
|
|
|
138
97
|
/**
|
|
139
|
-
*
|
|
140
|
-
*
|
|
141
|
-
*
|
|
142
|
-
* @
|
|
98
|
+
* fetches reachability data and checks for cluster reachability
|
|
99
|
+
* @returns {boolean}
|
|
100
|
+
* @public
|
|
101
|
+
* @memberof Reachability
|
|
143
102
|
*/
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
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
|
-
};
|
|
155
|
-
|
|
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;
|
|
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
|
-
);
|
|
103
|
+
isAnyClusterReachable() {
|
|
104
|
+
let reachable = false;
|
|
105
|
+
const reachabilityData = window.localStorage.getItem(REACHABILITY.localStorage);
|
|
173
106
|
|
|
174
|
-
|
|
107
|
+
if (reachabilityData) {
|
|
108
|
+
try {
|
|
109
|
+
const reachabilityResults = JSON.parse(reachabilityData);
|
|
175
110
|
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
);
|
|
111
|
+
reachable = Object.values(reachabilityResults).some(
|
|
112
|
+
(result: any) => result.udp?.reachable === 'true' || result.tcp?.reachable === 'true'
|
|
113
|
+
);
|
|
114
|
+
} catch (e) {
|
|
115
|
+
LoggerProxy.logger.error(
|
|
116
|
+
`Roap:request#attachReachabilityData --> Error in parsing reachability data: ${e}`
|
|
117
|
+
);
|
|
118
|
+
}
|
|
185
119
|
}
|
|
186
120
|
|
|
187
|
-
return
|
|
121
|
+
return reachable;
|
|
188
122
|
}
|
|
189
123
|
|
|
190
124
|
/**
|
|
191
|
-
*
|
|
192
|
-
* @param {
|
|
193
|
-
* @returns {
|
|
125
|
+
* Generate peerConnection config settings
|
|
126
|
+
* @param {object} cluster
|
|
127
|
+
* @returns {object} peerConnectionConfig
|
|
128
|
+
* @private
|
|
129
|
+
* @memberof Reachability
|
|
194
130
|
*/
|
|
195
|
-
private
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
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;
|
|
131
|
+
private buildPeerConnectionConfig(cluster: any) {
|
|
132
|
+
const iceServers = _.uniq([...cluster.udp, ...cluster.tcp]).map((url) => ({
|
|
133
|
+
username: '',
|
|
134
|
+
credential: '',
|
|
135
|
+
urls: [url],
|
|
136
|
+
}));
|
|
137
|
+
|
|
138
|
+
return {
|
|
139
|
+
iceServers: [...iceServers],
|
|
140
|
+
iceCandidatePoolSize: '0',
|
|
141
|
+
iceTransportPolicy: 'all',
|
|
142
|
+
};
|
|
224
143
|
}
|
|
225
144
|
|
|
226
145
|
/**
|
|
227
|
-
*
|
|
228
|
-
*
|
|
229
|
-
* @returns {
|
|
146
|
+
* Creates an RTCPeerConnection
|
|
147
|
+
* @param {object} cluster
|
|
148
|
+
* @returns {RTCPeerConnection} peerConnection
|
|
149
|
+
* @private
|
|
150
|
+
* @memberof Reachability
|
|
230
151
|
*/
|
|
231
|
-
|
|
232
|
-
|
|
152
|
+
private createPeerConnection(cluster: any) {
|
|
153
|
+
const {key, config} = cluster;
|
|
233
154
|
|
|
234
155
|
try {
|
|
156
|
+
const peerConnection = new window.RTCPeerConnection(config);
|
|
157
|
+
|
|
235
158
|
// @ts-ignore
|
|
236
|
-
|
|
237
|
-
REACHABILITY.namespace,
|
|
238
|
-
REACHABILITY.localStorageResult
|
|
239
|
-
);
|
|
159
|
+
peerConnection.key = key;
|
|
240
160
|
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
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
|
|
161
|
+
return peerConnection;
|
|
162
|
+
} catch (peerConnectionError) {
|
|
163
|
+
LoggerProxy.logger.log(
|
|
164
|
+
`Reachability:index#createPeerConnection --> Error creating peerConnection: ${peerConnectionError}`
|
|
255
165
|
);
|
|
166
|
+
|
|
167
|
+
return null;
|
|
256
168
|
}
|
|
169
|
+
}
|
|
257
170
|
|
|
258
|
-
|
|
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
|
+
|
|
183
|
+
return Date.now() - startTime;
|
|
259
184
|
}
|
|
260
185
|
|
|
261
186
|
/**
|
|
262
|
-
*
|
|
263
|
-
* @
|
|
264
|
-
* @
|
|
187
|
+
* creates offer and generates localSDP
|
|
188
|
+
* @param {object} clusterList cluster List
|
|
189
|
+
* @returns {Promise} Reachability latency results
|
|
190
|
+
* @private
|
|
265
191
|
* @memberof Reachability
|
|
266
192
|
*/
|
|
267
|
-
|
|
268
|
-
let
|
|
269
|
-
// @ts-ignore
|
|
270
|
-
const reachabilityData = await this.webex.boundedStorage
|
|
271
|
-
.get(this.namespace, REACHABILITY.localStorageResult)
|
|
272
|
-
.catch(() => {});
|
|
193
|
+
private getLocalSDPForClusters(clusterList: object) {
|
|
194
|
+
let clusters: any[] = [...Object.keys(clusterList)];
|
|
273
195
|
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
196
|
+
clusters = clusters.map(async (key) => {
|
|
197
|
+
const cluster = clusterList[key];
|
|
198
|
+
const config = this.buildPeerConnectionConfig(cluster);
|
|
199
|
+
const peerConnection = this.createPeerConnection({key, config});
|
|
200
|
+
const description = await peerConnection.createOffer({offerToReceiveAudio: true});
|
|
277
201
|
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
202
|
+
// @ts-ignore
|
|
203
|
+
peerConnection.begin = Date.now();
|
|
204
|
+
peerConnection.setLocalDescription(description);
|
|
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}`
|
|
286
212
|
);
|
|
287
|
-
}
|
|
288
|
-
}
|
|
213
|
+
});
|
|
214
|
+
});
|
|
289
215
|
|
|
290
|
-
return
|
|
216
|
+
return Promise.all(clusters)
|
|
217
|
+
.then(this.parseIceResultsToReachabilityResults)
|
|
218
|
+
.then((reachabilityLatencyResults) => {
|
|
219
|
+
this.logUnreachableClusters();
|
|
220
|
+
|
|
221
|
+
// return results
|
|
222
|
+
return reachabilityLatencyResults;
|
|
223
|
+
});
|
|
291
224
|
}
|
|
292
225
|
|
|
293
226
|
/**
|
|
@@ -296,23 +229,126 @@ export default class Reachability {
|
|
|
296
229
|
* @private
|
|
297
230
|
* @memberof Reachability
|
|
298
231
|
*/
|
|
299
|
-
private
|
|
232
|
+
private getUnreachablClusters() {
|
|
300
233
|
const unreachableList = [];
|
|
234
|
+
const clusters = this.clusterLatencyResults;
|
|
301
235
|
|
|
302
|
-
Object.
|
|
303
|
-
const
|
|
236
|
+
Object.keys(clusters).forEach((key) => {
|
|
237
|
+
const cluster = clusters[key];
|
|
304
238
|
|
|
305
|
-
if (
|
|
306
|
-
unreachableList.push(
|
|
307
|
-
}
|
|
308
|
-
if (result.tcp.result === 'unreachable') {
|
|
309
|
-
unreachableList.push({name: key, protocol: 'tcp'});
|
|
239
|
+
if (cluster.unreachable && !cluster.reachable) {
|
|
240
|
+
unreachableList.push(key);
|
|
310
241
|
}
|
|
311
242
|
});
|
|
312
243
|
|
|
313
244
|
return unreachableList;
|
|
314
245
|
}
|
|
315
246
|
|
|
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
|
+
|
|
316
352
|
/**
|
|
317
353
|
* Make a log of unreachable clusters.
|
|
318
354
|
* @returns {undefined}
|
|
@@ -320,58 +356,123 @@ export default class Reachability {
|
|
|
320
356
|
* @memberof Reachability
|
|
321
357
|
*/
|
|
322
358
|
private logUnreachableClusters() {
|
|
323
|
-
const list = this.
|
|
359
|
+
const list = this.getUnreachablClusters();
|
|
324
360
|
|
|
325
|
-
list.forEach((
|
|
361
|
+
list.forEach((cluster) => {
|
|
326
362
|
LoggerProxy.logger.log(
|
|
327
|
-
`Reachability:index#logUnreachableClusters -->
|
|
363
|
+
`Reachability:index#logUnreachableClusters --> No ice candidate for ${cluster}.`
|
|
328
364
|
);
|
|
329
365
|
});
|
|
330
366
|
}
|
|
331
367
|
|
|
332
368
|
/**
|
|
333
|
-
*
|
|
334
|
-
* @param {
|
|
335
|
-
* @returns {
|
|
369
|
+
* Calculates time to establish connection
|
|
370
|
+
* @param {array} iceResults iceResults
|
|
371
|
+
* @returns {object} reachabilityMap
|
|
372
|
+
* @private
|
|
373
|
+
* @memberof Reachability
|
|
336
374
|
*/
|
|
337
|
-
private
|
|
338
|
-
const
|
|
375
|
+
private parseIceResultsToReachabilityResults(iceResults: Array<any>) {
|
|
376
|
+
const reachabilityMap = {};
|
|
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
|
+
}
|
|
339
389
|
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
390
|
+
reachabilityMap[clusterId] = {
|
|
391
|
+
udp: latencyResult,
|
|
392
|
+
tcp: latencyResult,
|
|
393
|
+
};
|
|
394
|
+
});
|
|
343
395
|
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
// @ts-ignore
|
|
347
|
-
this.webex.config.meetings.experimental.enableTcpReachability ? ' and TCP' : ''
|
|
348
|
-
} reachability checks`
|
|
349
|
-
);
|
|
396
|
+
return reachabilityMap;
|
|
397
|
+
}
|
|
350
398
|
|
|
351
|
-
|
|
352
|
-
|
|
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
|
+
if (!clusterList || !Object.keys(clusterList).length) {
|
|
408
|
+
return Promise.resolve({});
|
|
409
|
+
}
|
|
353
410
|
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
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
|
+
}
|
|
358
432
|
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
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
|
+
// @ts-ignore
|
|
446
|
+
const {key} = peerConnection;
|
|
447
|
+
const resultKey = elapsed === null ? UNREACHABLE : REACHABLE;
|
|
448
|
+
const intialState = {[REACHABLE]: 0, [UNREACHABLE]: 0};
|
|
362
449
|
|
|
363
|
-
|
|
450
|
+
if (peerConnection.connectionState === CLOSED) {
|
|
451
|
+
LoggerProxy.logger.log(
|
|
452
|
+
`Reachability:index#setLatencyAndClose --> Attempting to set latency of ${elapsed} on closed peerConnection.`
|
|
453
|
+
);
|
|
364
454
|
|
|
365
|
-
return
|
|
366
|
-
|
|
367
|
-
results[key].isVideoMesh = cluster.isVideoMesh;
|
|
368
|
-
});
|
|
369
|
-
});
|
|
455
|
+
return;
|
|
456
|
+
}
|
|
370
457
|
|
|
371
|
-
|
|
458
|
+
this.clusterLatencyResults[key] = this.clusterLatencyResults[key] || intialState;
|
|
459
|
+
this.clusterLatencyResults[key][resultKey] += 1;
|
|
372
460
|
|
|
373
|
-
this
|
|
461
|
+
// Set to null in case this fired from
|
|
462
|
+
// an event other than onIceCandidate
|
|
463
|
+
peerConnection.onicecandidate = null;
|
|
464
|
+
peerConnection.close();
|
|
465
|
+
// @ts-ignore
|
|
466
|
+
peerConnection.elapsed = elapsed;
|
|
467
|
+
}
|
|
374
468
|
|
|
375
|
-
|
|
469
|
+
/**
|
|
470
|
+
* utility function
|
|
471
|
+
* @returns {undefined}
|
|
472
|
+
* @private
|
|
473
|
+
* @memberof Reachability
|
|
474
|
+
*/
|
|
475
|
+
private setup() {
|
|
476
|
+
this.clusterLatencyResults = {};
|
|
376
477
|
}
|
|
377
478
|
}
|