@webex/plugin-meetings 3.0.0-beta.22 → 3.0.0-beta.221
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +46 -8
- package/dist/annotation/annotation.types.js +7 -0
- package/dist/annotation/annotation.types.js.map +1 -0
- package/dist/annotation/constants.js +49 -0
- package/dist/annotation/constants.js.map +1 -0
- package/dist/annotation/index.js +342 -0
- package/dist/annotation/index.js.map +1 -0
- package/dist/breakouts/breakout.js +114 -14
- package/dist/breakouts/breakout.js.map +1 -1
- package/dist/breakouts/edit-lock-error.js +52 -0
- package/dist/breakouts/edit-lock-error.js.map +1 -0
- package/dist/breakouts/events.js +45 -0
- package/dist/breakouts/events.js.map +1 -0
- package/dist/breakouts/index.js +841 -19
- package/dist/breakouts/index.js.map +1 -1
- package/dist/breakouts/request.js +78 -0
- package/dist/breakouts/request.js.map +1 -0
- package/dist/breakouts/utils.js +67 -0
- package/dist/breakouts/utils.js.map +1 -0
- package/dist/common/errors/webex-errors.js +3 -2
- package/dist/common/errors/webex-errors.js.map +1 -1
- package/dist/common/logs/logger-proxy.js +1 -1
- package/dist/common/logs/logger-proxy.js.map +1 -1
- package/dist/common/queue.js +24 -9
- package/dist/common/queue.js.map +1 -1
- package/dist/config.js +3 -8
- package/dist/config.js.map +1 -1
- package/dist/constants.js +188 -30
- package/dist/constants.js.map +1 -1
- package/dist/controls-options-manager/constants.js +14 -0
- package/dist/controls-options-manager/constants.js.map +1 -0
- package/dist/controls-options-manager/enums.js +27 -0
- package/dist/controls-options-manager/enums.js.map +1 -0
- package/dist/controls-options-manager/index.js +297 -0
- package/dist/controls-options-manager/index.js.map +1 -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.js +319 -0
- package/dist/controls-options-manager/util.js.map +1 -0
- package/dist/index.js +106 -1
- package/dist/index.js.map +1 -1
- package/dist/interpretation/collection.js +23 -0
- package/dist/interpretation/collection.js.map +1 -0
- package/dist/interpretation/index.js +366 -0
- package/dist/interpretation/index.js.map +1 -0
- package/dist/interpretation/siLanguage.js +25 -0
- package/dist/interpretation/siLanguage.js.map +1 -0
- package/dist/locus-info/controlsUtils.js +91 -2
- package/dist/locus-info/controlsUtils.js.map +1 -1
- package/dist/locus-info/index.js +357 -62
- package/dist/locus-info/index.js.map +1 -1
- package/dist/locus-info/infoUtils.js +7 -1
- package/dist/locus-info/infoUtils.js.map +1 -1
- package/dist/locus-info/mediaSharesUtils.js +43 -1
- package/dist/locus-info/mediaSharesUtils.js.map +1 -1
- package/dist/locus-info/parser.js +219 -63
- package/dist/locus-info/parser.js.map +1 -1
- package/dist/locus-info/selfUtils.js +89 -14
- package/dist/locus-info/selfUtils.js.map +1 -1
- package/dist/media/index.js +49 -106
- package/dist/media/index.js.map +1 -1
- package/dist/media/properties.js +29 -90
- package/dist/media/properties.js.map +1 -1
- package/dist/mediaQualityMetrics/config.js +505 -493
- package/dist/mediaQualityMetrics/config.js.map +1 -1
- package/dist/meeting/in-meeting-actions.js +90 -2
- package/dist/meeting/in-meeting-actions.js.map +1 -1
- package/dist/meeting/index.js +2587 -2560
- package/dist/meeting/index.js.map +1 -1
- package/dist/meeting/locusMediaRequest.js +292 -0
- package/dist/meeting/locusMediaRequest.js.map +1 -0
- package/dist/meeting/muteState.js +228 -123
- package/dist/meeting/muteState.js.map +1 -1
- package/dist/meeting/request.js +244 -194
- package/dist/meeting/request.js.map +1 -1
- package/dist/meeting/util.js +568 -414
- package/dist/meeting/util.js.map +1 -1
- package/dist/meeting-info/index.js +48 -7
- package/dist/meeting-info/index.js.map +1 -1
- package/dist/meeting-info/meeting-info-v2.js +171 -51
- package/dist/meeting-info/meeting-info-v2.js.map +1 -1
- package/dist/meeting-info/utilv2.js +20 -5
- package/dist/meeting-info/utilv2.js.map +1 -1
- package/dist/meetings/collection.js +22 -0
- package/dist/meetings/collection.js.map +1 -1
- package/dist/meetings/index.js +361 -84
- package/dist/meetings/index.js.map +1 -1
- package/dist/meetings/meetings.types.js +7 -0
- package/dist/meetings/meetings.types.js.map +1 -0
- package/dist/meetings/request.js +2 -0
- package/dist/meetings/request.js.map +1 -1
- package/dist/meetings/util.js +88 -1
- package/dist/meetings/util.js.map +1 -1
- package/dist/member/index.js +49 -0
- package/dist/member/index.js.map +1 -1
- package/dist/member/types.js +25 -0
- package/dist/member/types.js.map +1 -0
- package/dist/member/util.js +121 -25
- package/dist/member/util.js.map +1 -1
- package/dist/members/collection.js +10 -0
- package/dist/members/collection.js.map +1 -1
- package/dist/members/index.js +86 -5
- package/dist/members/index.js.map +1 -1
- package/dist/members/request.js +106 -38
- package/dist/members/request.js.map +1 -1
- package/dist/members/types.js +15 -0
- package/dist/members/types.js.map +1 -0
- package/dist/members/util.js +316 -233
- package/dist/members/util.js.map +1 -1
- package/dist/metrics/constants.js +3 -5
- package/dist/metrics/constants.js.map +1 -1
- package/dist/metrics/index.js +1 -468
- package/dist/metrics/index.js.map +1 -1
- package/dist/multistream/mediaRequestManager.js +238 -49
- package/dist/multistream/mediaRequestManager.js.map +1 -1
- package/dist/multistream/receiveSlot.js +49 -16
- package/dist/multistream/receiveSlot.js.map +1 -1
- package/dist/multistream/receiveSlotManager.js +52 -34
- package/dist/multistream/receiveSlotManager.js.map +1 -1
- package/dist/multistream/remoteMedia.js +44 -18
- package/dist/multistream/remoteMedia.js.map +1 -1
- package/dist/multistream/remoteMediaGroup.js +60 -3
- package/dist/multistream/remoteMediaGroup.js.map +1 -1
- package/dist/multistream/remoteMediaManager.js +173 -59
- package/dist/multistream/remoteMediaManager.js.map +1 -1
- package/dist/networkQualityMonitor/index.js +4 -2
- package/dist/networkQualityMonitor/index.js.map +1 -1
- package/dist/reachability/index.js +90 -30
- package/dist/reachability/index.js.map +1 -1
- package/dist/reachability/request.js +16 -7
- package/dist/reachability/request.js.map +1 -1
- package/dist/reconnection-manager/index.js +196 -155
- package/dist/reconnection-manager/index.js.map +1 -1
- package/dist/recording-controller/index.js +21 -2
- package/dist/recording-controller/index.js.map +1 -1
- package/dist/recording-controller/util.js +9 -8
- package/dist/recording-controller/util.js.map +1 -1
- package/dist/roap/index.js +25 -29
- package/dist/roap/index.js.map +1 -1
- package/dist/roap/request.js +111 -89
- package/dist/roap/request.js.map +1 -1
- package/dist/roap/turnDiscovery.js +97 -36
- package/dist/roap/turnDiscovery.js.map +1 -1
- package/dist/rtcMetrics/constants.js +12 -0
- package/dist/rtcMetrics/constants.js.map +1 -0
- package/dist/rtcMetrics/index.js +117 -0
- package/dist/rtcMetrics/index.js.map +1 -0
- package/dist/statsAnalyzer/global.js +1 -93
- package/dist/statsAnalyzer/global.js.map +1 -1
- package/dist/statsAnalyzer/index.js +326 -311
- package/dist/statsAnalyzer/index.js.map +1 -1
- package/dist/statsAnalyzer/mqaUtil.js +90 -53
- package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
- package/dist/types/annotation/annotation.types.d.ts +42 -0
- package/dist/types/annotation/constants.d.ts +31 -0
- package/dist/types/annotation/index.d.ts +117 -0
- package/dist/types/breakouts/breakout.d.ts +8 -0
- package/dist/types/breakouts/collection.d.ts +5 -0
- package/dist/types/breakouts/edit-lock-error.d.ts +15 -0
- package/dist/types/breakouts/events.d.ts +8 -0
- package/dist/types/breakouts/index.d.ts +5 -0
- package/dist/types/breakouts/request.d.ts +22 -0
- package/dist/types/breakouts/utils.d.ts +15 -0
- package/dist/types/common/browser-detection.d.ts +9 -0
- package/dist/types/common/collection.d.ts +48 -0
- package/dist/types/common/config.d.ts +2 -0
- package/dist/types/common/errors/captcha-error.d.ts +15 -0
- package/dist/types/common/errors/intent-to-join.d.ts +16 -0
- package/dist/types/common/errors/join-meeting.d.ts +17 -0
- package/dist/types/common/errors/media.d.ts +15 -0
- package/dist/types/common/errors/parameter.d.ts +15 -0
- package/dist/types/common/errors/password-error.d.ts +15 -0
- package/dist/types/common/errors/permission.d.ts +14 -0
- package/dist/types/common/errors/reconnection-in-progress.d.ts +9 -0
- package/dist/types/common/errors/reconnection.d.ts +15 -0
- package/dist/types/common/errors/stats.d.ts +15 -0
- package/dist/types/common/errors/webex-errors.d.ts +69 -0
- package/dist/types/common/errors/webex-meetings-error.d.ts +20 -0
- package/dist/types/common/events/events-scope.d.ts +17 -0
- package/dist/types/common/events/events.d.ts +12 -0
- package/dist/types/common/events/trigger-proxy.d.ts +2 -0
- package/dist/types/common/events/util.d.ts +2 -0
- package/dist/types/common/logs/logger-config.d.ts +2 -0
- package/dist/types/common/logs/logger-proxy.d.ts +2 -0
- package/dist/types/common/logs/request.d.ts +34 -0
- package/dist/types/common/queue.d.ts +34 -0
- package/dist/types/config.d.ts +72 -0
- package/dist/types/constants.d.ts +1028 -0
- package/dist/types/controls-options-manager/constants.d.ts +4 -0
- package/dist/types/controls-options-manager/enums.d.ts +15 -0
- package/dist/types/controls-options-manager/index.d.ts +136 -0
- package/dist/types/controls-options-manager/types.d.ts +43 -0
- package/dist/types/controls-options-manager/util.d.ts +1 -0
- package/dist/types/index.d.ts +7 -0
- package/dist/types/interpretation/collection.d.ts +5 -0
- package/dist/types/interpretation/index.d.ts +5 -0
- package/dist/types/interpretation/siLanguage.d.ts +5 -0
- package/dist/types/locus-info/controlsUtils.d.ts +2 -0
- package/dist/types/locus-info/embeddedAppsUtils.d.ts +2 -0
- package/dist/types/locus-info/fullState.d.ts +2 -0
- package/dist/types/locus-info/hostUtils.d.ts +2 -0
- package/dist/types/locus-info/index.d.ts +322 -0
- package/dist/types/locus-info/infoUtils.d.ts +2 -0
- package/dist/types/locus-info/mediaSharesUtils.d.ts +2 -0
- package/dist/types/locus-info/parser.d.ts +271 -0
- package/dist/types/locus-info/selfUtils.d.ts +2 -0
- package/dist/types/media/index.d.ts +34 -0
- package/dist/types/media/properties.d.ts +93 -0
- package/dist/types/media/util.d.ts +2 -0
- package/dist/types/mediaQualityMetrics/config.d.ts +365 -0
- package/dist/types/meeting/in-meeting-actions.d.ts +163 -0
- package/dist/types/meeting/index.d.ts +1512 -0
- package/dist/types/meeting/locusMediaRequest.d.ts +75 -0
- package/dist/types/meeting/muteState.d.ts +184 -0
- package/dist/types/meeting/request.d.ts +289 -0
- package/dist/types/meeting/request.type.d.ts +11 -0
- package/dist/types/meeting/state.d.ts +9 -0
- package/dist/types/meeting/util.d.ts +94 -0
- package/dist/types/meeting-info/collection.d.ts +20 -0
- package/dist/types/meeting-info/index.d.ts +62 -0
- package/dist/types/meeting-info/meeting-info-v2.d.ts +122 -0
- package/dist/types/meeting-info/request.d.ts +22 -0
- package/dist/types/meeting-info/util.d.ts +2 -0
- package/dist/types/meeting-info/utilv2.d.ts +2 -0
- package/dist/types/meetings/collection.d.ts +31 -0
- package/dist/types/meetings/index.d.ts +361 -0
- package/dist/types/meetings/meetings.types.d.ts +4 -0
- package/dist/types/meetings/request.d.ts +27 -0
- package/dist/types/meetings/util.d.ts +18 -0
- package/dist/types/member/index.d.ts +159 -0
- package/dist/types/member/types.d.ts +32 -0
- package/dist/types/member/util.d.ts +2 -0
- package/dist/types/members/collection.d.ts +29 -0
- package/dist/types/members/index.d.ts +353 -0
- package/dist/types/members/request.d.ts +114 -0
- package/dist/types/members/types.d.ts +24 -0
- package/dist/types/members/util.d.ts +210 -0
- package/dist/types/metrics/constants.d.ts +55 -0
- package/dist/types/metrics/index.d.ts +45 -0
- package/dist/types/multistream/mediaRequestManager.d.ts +118 -0
- package/dist/types/multistream/receiveSlot.d.ts +68 -0
- package/dist/types/multistream/receiveSlotManager.d.ts +56 -0
- package/dist/types/multistream/remoteMedia.d.ts +72 -0
- package/dist/types/multistream/remoteMediaGroup.d.ts +47 -0
- package/dist/types/multistream/remoteMediaManager.d.ts +277 -0
- package/dist/types/networkQualityMonitor/index.d.ts +70 -0
- package/dist/types/personal-meeting-room/index.d.ts +47 -0
- package/dist/types/personal-meeting-room/request.d.ts +14 -0
- package/dist/types/personal-meeting-room/util.d.ts +2 -0
- package/dist/types/reachability/index.d.ts +158 -0
- package/dist/types/reachability/request.d.ts +39 -0
- package/dist/types/reactions/constants.d.ts +3 -0
- package/dist/types/reactions/reactions.d.ts +4 -0
- package/dist/types/reactions/reactions.type.d.ts +52 -0
- package/dist/types/reconnection-manager/index.d.ts +126 -0
- package/dist/types/recording-controller/enums.d.ts +7 -0
- package/dist/types/recording-controller/index.d.ts +207 -0
- package/dist/types/recording-controller/util.d.ts +14 -0
- package/dist/types/roap/index.d.ts +77 -0
- package/dist/types/roap/request.d.ts +38 -0
- package/dist/types/roap/turnDiscovery.d.ts +91 -0
- package/dist/types/rtcMetrics/constants.d.ts +4 -0
- package/dist/types/rtcMetrics/index.d.ts +47 -0
- package/dist/types/statsAnalyzer/global.d.ts +36 -0
- package/dist/types/statsAnalyzer/index.d.ts +200 -0
- package/dist/types/statsAnalyzer/mqaUtil.d.ts +24 -0
- package/dist/types/transcription/index.d.ts +64 -0
- package/package.json +23 -20
- 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 +44 -14
- package/src/breakouts/breakout.ts +87 -9
- package/src/breakouts/edit-lock-error.ts +25 -0
- package/src/breakouts/events.ts +56 -0
- package/src/breakouts/index.ts +710 -10
- package/src/breakouts/request.ts +55 -0
- package/src/breakouts/utils.ts +57 -0
- package/src/common/errors/webex-errors.ts +6 -2
- package/src/common/logs/logger-proxy.ts +1 -1
- package/src/common/queue.ts +22 -8
- package/src/config.ts +2 -7
- package/src/constants.ts +175 -21
- package/src/controls-options-manager/constants.ts +5 -0
- package/src/controls-options-manager/enums.ts +18 -0
- package/src/controls-options-manager/index.ts +278 -0
- package/src/controls-options-manager/types.ts +59 -0
- package/src/controls-options-manager/util.ts +300 -0
- package/src/index.ts +39 -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 +108 -0
- package/src/locus-info/index.ts +381 -59
- package/src/locus-info/infoUtils.ts +10 -2
- package/src/locus-info/mediaSharesUtils.ts +48 -0
- package/src/locus-info/parser.ts +224 -39
- package/src/locus-info/selfUtils.ts +81 -5
- package/src/media/index.ts +89 -109
- package/src/media/properties.ts +49 -90
- package/src/mediaQualityMetrics/config.ts +379 -377
- package/src/meeting/in-meeting-actions.ts +179 -3
- package/src/meeting/index.ts +2062 -2137
- package/src/meeting/locusMediaRequest.ts +314 -0
- package/src/meeting/muteState.ts +227 -130
- package/src/meeting/request.ts +157 -116
- package/src/meeting/util.ts +555 -396
- package/src/meeting-info/index.ts +54 -8
- package/src/meeting-info/meeting-info-v2.ts +148 -14
- package/src/meeting-info/utilv2.ts +13 -3
- package/src/meetings/collection.ts +20 -0
- package/src/meetings/index.ts +397 -102
- package/src/meetings/meetings.types.ts +12 -0
- package/src/meetings/request.ts +2 -0
- package/src/meetings/util.ts +103 -4
- package/src/member/index.ts +49 -0
- package/src/member/types.ts +38 -0
- package/src/member/util.ts +127 -25
- package/src/members/collection.ts +8 -0
- package/src/members/index.ts +107 -6
- package/src/members/request.ts +97 -17
- package/src/members/types.ts +28 -0
- package/src/members/util.ts +319 -240
- package/src/metrics/constants.ts +2 -4
- package/src/metrics/index.ts +1 -490
- package/src/multistream/mediaRequestManager.ts +289 -79
- package/src/multistream/receiveSlot.ts +55 -18
- package/src/multistream/receiveSlotManager.ts +46 -24
- package/src/multistream/remoteMedia.ts +27 -2
- package/src/multistream/remoteMediaGroup.ts +59 -0
- package/src/multistream/remoteMediaManager.ts +113 -32
- package/src/networkQualityMonitor/index.ts +6 -6
- package/src/reachability/index.ts +76 -18
- package/src/reachability/request.ts +16 -7
- package/src/reconnection-manager/index.ts +68 -43
- package/src/recording-controller/index.ts +20 -3
- package/src/recording-controller/util.ts +26 -9
- package/src/roap/index.ts +25 -30
- package/src/roap/request.ts +103 -95
- package/src/roap/turnDiscovery.ts +51 -25
- package/src/rtcMetrics/constants.ts +3 -0
- package/src/rtcMetrics/index.ts +100 -0
- package/src/statsAnalyzer/global.ts +1 -94
- package/src/statsAnalyzer/index.ts +376 -386
- package/src/statsAnalyzer/mqaUtil.ts +100 -99
- package/test/integration/spec/converged-space-meetings.js +233 -0
- package/test/integration/spec/journey.js +336 -259
- 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 +142 -24
- 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 +1545 -48
- 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 +287 -0
- package/test/unit/spec/controls-options-manager/util.js +582 -0
- package/test/unit/spec/fixture/locus.js +1 -0
- package/test/unit/spec/interpretation/collection.ts +15 -0
- package/test/unit/spec/interpretation/index.ts +589 -0
- package/test/unit/spec/interpretation/siLanguage.ts +28 -0
- package/test/unit/spec/locus-info/controlsUtils.js +316 -43
- package/test/unit/spec/locus-info/index.js +1169 -36
- package/test/unit/spec/locus-info/infoUtils.js +37 -15
- package/test/unit/spec/locus-info/mediaSharesUtils.ts +22 -0
- package/test/unit/spec/locus-info/parser.js +62 -22
- package/test/unit/spec/locus-info/selfConstant.js +27 -4
- package/test/unit/spec/locus-info/selfUtils.js +208 -17
- package/test/unit/spec/media/index.ts +138 -28
- package/test/unit/spec/meeting/in-meeting-actions.ts +89 -3
- package/test/unit/spec/meeting/index.js +3510 -1747
- package/test/unit/spec/meeting/locusMediaRequest.ts +443 -0
- package/test/unit/spec/meeting/muteState.js +370 -208
- package/test/unit/spec/meeting/request.js +417 -45
- package/test/unit/spec/meeting/utils.js +601 -53
- package/test/unit/spec/meeting-info/index.js +181 -0
- package/test/unit/spec/meeting-info/meetinginfov2.js +383 -5
- package/test/unit/spec/meeting-info/utilv2.js +21 -0
- package/test/unit/spec/meetings/collection.js +14 -0
- package/test/unit/spec/meetings/index.js +874 -150
- package/test/unit/spec/meetings/utils.js +206 -2
- package/test/unit/spec/member/index.js +58 -4
- package/test/unit/spec/member/util.js +479 -35
- package/test/unit/spec/members/index.js +319 -1
- package/test/unit/spec/members/request.js +206 -27
- package/test/unit/spec/members/utils.js +184 -0
- package/test/unit/spec/metrics/index.js +1 -50
- package/test/unit/spec/multistream/mediaRequestManager.ts +803 -162
- package/test/unit/spec/multistream/receiveSlot.ts +72 -13
- package/test/unit/spec/multistream/receiveSlotManager.ts +58 -28
- package/test/unit/spec/multistream/remoteMedia.ts +30 -0
- package/test/unit/spec/multistream/remoteMediaGroup.ts +266 -0
- package/test/unit/spec/multistream/remoteMediaManager.ts +318 -0
- package/test/unit/spec/networkQualityMonitor/index.js +4 -4
- package/test/unit/spec/reachability/index.ts +185 -7
- package/test/unit/spec/reachability/request.js +68 -0
- package/test/unit/spec/reconnection-manager/index.js +59 -6
- package/test/unit/spec/recording-controller/index.js +294 -218
- package/test/unit/spec/recording-controller/util.js +223 -96
- package/test/unit/spec/roap/index.ts +27 -51
- package/test/unit/spec/roap/request.ts +202 -85
- package/test/unit/spec/roap/turnDiscovery.ts +36 -8
- package/test/unit/spec/rtcMetrics/index.ts +68 -0
- package/test/unit/spec/stats-analyzer/index.js +92 -41
- 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 +6 -3
- package/dist/meeting/effectsState.js +0 -262
- package/dist/meeting/effectsState.js.map +0 -1
- package/dist/metrics/config.js +0 -299
- package/dist/metrics/config.js.map +0 -1
- package/src/index.js +0 -16
- package/src/meeting/effectsState.ts +0 -211
- package/src/metrics/config.ts +0 -495
- package/test/unit/spec/meeting/effectsState.js +0 -285
|
@@ -7,13 +7,14 @@
|
|
|
7
7
|
import _ from 'lodash';
|
|
8
8
|
|
|
9
9
|
import LoggerProxy from '../common/logs/logger-proxy';
|
|
10
|
-
import {ICE_GATHERING_STATE, CONNECTION_STATE, REACHABILITY} from '../constants';
|
|
10
|
+
import {ICE_GATHERING_STATE, CONNECTION_STATE, REACHABILITY, IP_VERSION} from '../constants';
|
|
11
11
|
|
|
12
12
|
import ReachabilityRequest from './request';
|
|
13
13
|
|
|
14
14
|
const DEFAULT_TIMEOUT = 3000;
|
|
15
15
|
const VIDEO_MESH_TIMEOUT = 1000;
|
|
16
16
|
|
|
17
|
+
export type ICECandidateResult = {clusterId: string; elapsed?: string | null; publicIPs?: string[]};
|
|
17
18
|
/**
|
|
18
19
|
* @class Reachability
|
|
19
20
|
* @export
|
|
@@ -63,11 +64,15 @@ export default class Reachability {
|
|
|
63
64
|
|
|
64
65
|
// Remove stored reachability results to ensure no stale data
|
|
65
66
|
// @ts-ignore
|
|
66
|
-
await this.webex.boundedStorage.del(this.namespace, REACHABILITY.
|
|
67
|
+
await this.webex.boundedStorage.del(this.namespace, REACHABILITY.localStorageResult);
|
|
68
|
+
// @ts-ignore
|
|
69
|
+
await this.webex.boundedStorage.del(this.namespace, REACHABILITY.localStorageJoinCookie);
|
|
67
70
|
|
|
68
71
|
// Fetch clusters and measure latency
|
|
69
72
|
try {
|
|
70
|
-
const clusters = await this.reachabilityRequest.getClusters(
|
|
73
|
+
const {clusters, joinCookie} = await this.reachabilityRequest.getClusters(
|
|
74
|
+
this.getIpVersion()
|
|
75
|
+
);
|
|
71
76
|
|
|
72
77
|
// Perform Reachability Check
|
|
73
78
|
const results = await this.performReachabilityCheck(clusters);
|
|
@@ -75,9 +80,15 @@ export default class Reachability {
|
|
|
75
80
|
// @ts-ignore
|
|
76
81
|
await this.webex.boundedStorage.put(
|
|
77
82
|
this.namespace,
|
|
78
|
-
REACHABILITY.
|
|
83
|
+
REACHABILITY.localStorageResult,
|
|
79
84
|
JSON.stringify(results)
|
|
80
85
|
);
|
|
86
|
+
// @ts-ignore
|
|
87
|
+
await this.webex.boundedStorage.put(
|
|
88
|
+
this.namespace,
|
|
89
|
+
REACHABILITY.localStorageJoinCookie,
|
|
90
|
+
JSON.stringify(joinCookie)
|
|
91
|
+
);
|
|
81
92
|
|
|
82
93
|
LoggerProxy.logger.log(
|
|
83
94
|
'Reachability:index#gatherReachability --> Reachability checks completed'
|
|
@@ -103,7 +114,7 @@ export default class Reachability {
|
|
|
103
114
|
let reachable = false;
|
|
104
115
|
// @ts-ignore
|
|
105
116
|
const reachabilityData = await this.webex.boundedStorage
|
|
106
|
-
.get(this.namespace, REACHABILITY.
|
|
117
|
+
.get(this.namespace, REACHABILITY.localStorageResult)
|
|
107
118
|
.catch(() => {});
|
|
108
119
|
|
|
109
120
|
if (reachabilityData) {
|
|
@@ -123,6 +134,14 @@ export default class Reachability {
|
|
|
123
134
|
return reachable;
|
|
124
135
|
}
|
|
125
136
|
|
|
137
|
+
/**
|
|
138
|
+
* Returns what we know about the IP version of the networks we're connected to.
|
|
139
|
+
* @returns {IP_VERSION}
|
|
140
|
+
*/
|
|
141
|
+
getIpVersion(): IP_VERSION {
|
|
142
|
+
return IP_VERSION.unknown;
|
|
143
|
+
}
|
|
144
|
+
|
|
126
145
|
/**
|
|
127
146
|
* Generate peerConnection config settings
|
|
128
147
|
* @param {object} cluster
|
|
@@ -131,7 +150,7 @@ export default class Reachability {
|
|
|
131
150
|
* @memberof Reachability
|
|
132
151
|
*/
|
|
133
152
|
private buildPeerConnectionConfig(cluster: any) {
|
|
134
|
-
const iceServers = _.uniq(
|
|
153
|
+
const iceServers = _.uniq(cluster.udp).map((url) => ({
|
|
135
154
|
username: '',
|
|
136
155
|
credential: '',
|
|
137
156
|
urls: [url],
|
|
@@ -292,6 +311,8 @@ export default class Reachability {
|
|
|
292
311
|
`Reachability:index#onIceCandidate --> Successfully pinged ${peerConnection.key}:`,
|
|
293
312
|
elapsed
|
|
294
313
|
);
|
|
314
|
+
// order is important
|
|
315
|
+
this.addPublicIP(peerConnection, e.candidate.address);
|
|
295
316
|
this.setLatencyAndClose(peerConnection, elapsed);
|
|
296
317
|
}
|
|
297
318
|
};
|
|
@@ -309,8 +330,9 @@ export default class Reachability {
|
|
|
309
330
|
private iceGatheringState(peerConnection: RTCPeerConnection, timeout: number) {
|
|
310
331
|
const ELAPSED = 'elapsed';
|
|
311
332
|
|
|
312
|
-
return new Promise((resolve) => {
|
|
333
|
+
return new Promise<ICECandidateResult>((resolve) => {
|
|
313
334
|
const peerConnectionProxy = new window.Proxy(peerConnection, {
|
|
335
|
+
// eslint-disable-next-line require-jsdoc
|
|
314
336
|
get(target, property) {
|
|
315
337
|
const targetMember = target[property];
|
|
316
338
|
|
|
@@ -324,7 +346,7 @@ export default class Reachability {
|
|
|
324
346
|
// only intercept elapsed property
|
|
325
347
|
if (property === ELAPSED) {
|
|
326
348
|
// @ts-ignore
|
|
327
|
-
resolve({clusterId: peerConnection.key, elapsed: value});
|
|
349
|
+
resolve({clusterId: peerConnection.key, publicIPs: target.publicIPs, elapsed: value});
|
|
328
350
|
|
|
329
351
|
return true;
|
|
330
352
|
}
|
|
@@ -345,6 +367,8 @@ export default class Reachability {
|
|
|
345
367
|
|
|
346
368
|
// Close any open peerConnections
|
|
347
369
|
if (peerConnectionProxy.connectionState !== CLOSED) {
|
|
370
|
+
// order is important
|
|
371
|
+
this.addPublicIP(peerConnectionProxy, null);
|
|
348
372
|
this.setLatencyAndClose(peerConnectionProxy, null);
|
|
349
373
|
}
|
|
350
374
|
}, timeout);
|
|
@@ -369,29 +393,36 @@ export default class Reachability {
|
|
|
369
393
|
|
|
370
394
|
/**
|
|
371
395
|
* Calculates time to establish connection
|
|
372
|
-
* @param {
|
|
396
|
+
* @param {Array<ICECandidateResult>} iceResults iceResults
|
|
373
397
|
* @returns {object} reachabilityMap
|
|
374
|
-
* @
|
|
398
|
+
* @protected
|
|
375
399
|
* @memberof Reachability
|
|
376
400
|
*/
|
|
377
|
-
|
|
401
|
+
protected parseIceResultsToReachabilityResults(iceResults: Array<ICECandidateResult>) {
|
|
378
402
|
const reachabilityMap = {};
|
|
379
403
|
|
|
380
|
-
iceResults.forEach(({clusterId, elapsed}) => {
|
|
381
|
-
|
|
404
|
+
iceResults.forEach(({clusterId, elapsed, publicIPs}) => {
|
|
405
|
+
const latencyResult = {};
|
|
382
406
|
|
|
383
|
-
if (elapsed
|
|
384
|
-
latencyResult
|
|
407
|
+
if (!elapsed) {
|
|
408
|
+
Object.assign(latencyResult, {reachable: 'false'});
|
|
385
409
|
} else {
|
|
386
|
-
latencyResult
|
|
410
|
+
Object.assign(latencyResult, {
|
|
387
411
|
reachable: 'true',
|
|
388
412
|
latencyInMilliseconds: elapsed.toString(),
|
|
389
|
-
};
|
|
413
|
+
});
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
if (publicIPs) {
|
|
417
|
+
Object.assign(latencyResult, {
|
|
418
|
+
clientMediaIPs: publicIPs,
|
|
419
|
+
});
|
|
390
420
|
}
|
|
391
421
|
|
|
392
422
|
reachabilityMap[clusterId] = {
|
|
393
423
|
udp: latencyResult,
|
|
394
|
-
tcp:
|
|
424
|
+
tcp: {untested: 'true'},
|
|
425
|
+
xtls: {untested: 'true'},
|
|
395
426
|
};
|
|
396
427
|
});
|
|
397
428
|
|
|
@@ -432,6 +463,33 @@ export default class Reachability {
|
|
|
432
463
|
});
|
|
433
464
|
}
|
|
434
465
|
|
|
466
|
+
/**
|
|
467
|
+
* Adds public IP (client media IPs)
|
|
468
|
+
* @param {RTCPeerConnection} peerConnection
|
|
469
|
+
* @param {string} publicIP
|
|
470
|
+
* @returns {void}
|
|
471
|
+
*/
|
|
472
|
+
protected addPublicIP(peerConnection: RTCPeerConnection, publicIP?: string | null) {
|
|
473
|
+
const modifiedPeerConnection: RTCPeerConnection & {publicIPs?: string[]} = peerConnection;
|
|
474
|
+
const {CLOSED} = CONNECTION_STATE;
|
|
475
|
+
|
|
476
|
+
if (modifiedPeerConnection.connectionState === CLOSED) {
|
|
477
|
+
LoggerProxy.logger.log(
|
|
478
|
+
`Reachability:index#addPublicIP --> Attempting to set publicIP of ${publicIP} on closed peerConnection.`
|
|
479
|
+
);
|
|
480
|
+
}
|
|
481
|
+
|
|
482
|
+
if (publicIP) {
|
|
483
|
+
if (modifiedPeerConnection.publicIPs) {
|
|
484
|
+
modifiedPeerConnection.publicIPs.push(publicIP);
|
|
485
|
+
} else {
|
|
486
|
+
modifiedPeerConnection.publicIPs = [publicIP];
|
|
487
|
+
}
|
|
488
|
+
} else {
|
|
489
|
+
modifiedPeerConnection.publicIPs = null;
|
|
490
|
+
}
|
|
491
|
+
}
|
|
492
|
+
|
|
435
493
|
/**
|
|
436
494
|
* Records latency and closes the peerConnection
|
|
437
495
|
* @param {RTCPeerConnection} peerConnection
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import LoggerProxy from '../common/logs/logger-proxy';
|
|
2
|
-
import {HTTP_VERBS, RESOURCE, API} from '../constants';
|
|
2
|
+
import {HTTP_VERBS, RESOURCE, API, IP_VERSION} from '../constants';
|
|
3
3
|
|
|
4
4
|
export interface ClusterNode {
|
|
5
5
|
isVideoMesh: boolean;
|
|
@@ -28,31 +28,40 @@ class ReachabilityRequest {
|
|
|
28
28
|
}
|
|
29
29
|
|
|
30
30
|
/**
|
|
31
|
-
*
|
|
31
|
+
* Gets the cluster information
|
|
32
32
|
*
|
|
33
|
-
* @param {
|
|
33
|
+
* @param {IP_VERSION} ipVersion information about current ip network we're on
|
|
34
34
|
* @returns {Promise}
|
|
35
35
|
*/
|
|
36
|
-
getClusters = (): Promise<ClusterList> =>
|
|
36
|
+
getClusters = (ipVersion: IP_VERSION): Promise<{clusters: ClusterList; joinCookie: any}> =>
|
|
37
37
|
this.webex
|
|
38
38
|
.request({
|
|
39
39
|
method: HTTP_VERBS.GET,
|
|
40
40
|
shouldRefreshAccessToken: false,
|
|
41
41
|
api: API.CALLIOPEDISCOVERY,
|
|
42
42
|
resource: RESOURCE.CLUSTERS,
|
|
43
|
+
qs: {
|
|
44
|
+
JCSupport: 1,
|
|
45
|
+
ipver: ipVersion,
|
|
46
|
+
},
|
|
43
47
|
})
|
|
44
48
|
.then((res) => {
|
|
45
|
-
const {clusters} = res.body;
|
|
49
|
+
const {clusters, joinCookie} = res.body;
|
|
46
50
|
|
|
47
51
|
Object.keys(clusters).forEach((key) => {
|
|
48
52
|
clusters[key].isVideoMesh = res.body.clusterClasses?.hybridMedia?.includes(key);
|
|
49
53
|
});
|
|
50
54
|
|
|
51
55
|
LoggerProxy.logger.log(
|
|
52
|
-
`Reachability:request#getClusters --> get clusters successful:${JSON.stringify(
|
|
56
|
+
`Reachability:request#getClusters --> get clusters (ipver=${ipVersion}) successful:${JSON.stringify(
|
|
57
|
+
clusters
|
|
58
|
+
)}`
|
|
53
59
|
);
|
|
54
60
|
|
|
55
|
-
return
|
|
61
|
+
return {
|
|
62
|
+
clusters,
|
|
63
|
+
joinCookie,
|
|
64
|
+
};
|
|
56
65
|
});
|
|
57
66
|
|
|
58
67
|
/**
|
|
@@ -18,10 +18,9 @@ import {
|
|
|
18
18
|
import BEHAVIORAL_METRICS from '../metrics/constants';
|
|
19
19
|
import ReconnectionError from '../common/errors/reconnection';
|
|
20
20
|
import ReconnectInProgress from '../common/errors/reconnection-in-progress';
|
|
21
|
-
import {eventType, reconnection, errorObjects} from '../metrics/config';
|
|
22
|
-
import Media from '../media';
|
|
23
21
|
import Metrics from '../metrics';
|
|
24
22
|
import Meeting from '../meeting';
|
|
23
|
+
import {MediaRequestManager} from '../multistream/mediaRequestManager';
|
|
25
24
|
|
|
26
25
|
/**
|
|
27
26
|
* Used to indicate that the reconnect logic needs to be retried.
|
|
@@ -231,6 +230,32 @@ export default class ReconnectionManager {
|
|
|
231
230
|
this.meeting = null;
|
|
232
231
|
}
|
|
233
232
|
|
|
233
|
+
/**
|
|
234
|
+
* Stop the local share track.
|
|
235
|
+
*
|
|
236
|
+
* @param {string} reason a {@link SHARE_STOPPED_REASON}
|
|
237
|
+
* @returns {undefined}
|
|
238
|
+
* @private
|
|
239
|
+
* @memberof ReconnectionManager
|
|
240
|
+
*/
|
|
241
|
+
private async stopLocalShareTrack(reason: string) {
|
|
242
|
+
await this.meeting.unpublishTracks([
|
|
243
|
+
this.meeting.mediaProperties.shareVideoTrack,
|
|
244
|
+
this.meeting.mediaProperties.shareAudioTrack,
|
|
245
|
+
]);
|
|
246
|
+
Trigger.trigger(
|
|
247
|
+
this.meeting,
|
|
248
|
+
{
|
|
249
|
+
file: 'reconnection-manager/index',
|
|
250
|
+
function: 'stopLocalShareTrack',
|
|
251
|
+
},
|
|
252
|
+
EVENT_TRIGGERS.MEETING_STOPPED_SHARING_LOCAL,
|
|
253
|
+
{
|
|
254
|
+
reason,
|
|
255
|
+
}
|
|
256
|
+
);
|
|
257
|
+
}
|
|
258
|
+
|
|
234
259
|
/**
|
|
235
260
|
* @public
|
|
236
261
|
* @memberof ReconnectionManager
|
|
@@ -302,9 +327,13 @@ export default class ReconnectionManager {
|
|
|
302
327
|
LoggerProxy.logger.info(
|
|
303
328
|
'ReconnectionManager:index#reconnect --> Sending reconnect start metric.'
|
|
304
329
|
);
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
330
|
+
|
|
331
|
+
// @ts-ignore
|
|
332
|
+
this.webex.internal.newMetrics.submitClientEvent({
|
|
333
|
+
name: 'client.media.reconnecting',
|
|
334
|
+
options: {
|
|
335
|
+
meetingId: this.meeting.id,
|
|
336
|
+
},
|
|
308
337
|
});
|
|
309
338
|
}
|
|
310
339
|
|
|
@@ -314,10 +343,16 @@ export default class ReconnectionManager {
|
|
|
314
343
|
LoggerProxy.logger.info(
|
|
315
344
|
'ReconnectionManager:index#reconnect --> Sending reconnect success metric.'
|
|
316
345
|
);
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
346
|
+
|
|
347
|
+
// @ts-ignore
|
|
348
|
+
this.webex.internal.newMetrics.submitClientEvent({
|
|
349
|
+
name: 'client.media.recovered',
|
|
350
|
+
payload: {
|
|
351
|
+
recoveredBy: 'new',
|
|
352
|
+
},
|
|
353
|
+
options: {
|
|
354
|
+
meetingId: this.meeting.id,
|
|
355
|
+
},
|
|
321
356
|
});
|
|
322
357
|
})
|
|
323
358
|
.catch((reconnectError) => {
|
|
@@ -341,23 +376,24 @@ export default class ReconnectionManager {
|
|
|
341
376
|
'ReconnectionManager:index#reconnect --> Sending reconnect abort metric.'
|
|
342
377
|
);
|
|
343
378
|
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
379
|
+
// @ts-ignore
|
|
380
|
+
this.webex.internal.newMetrics.submitClientEvent({
|
|
381
|
+
name: 'client.call.aborted',
|
|
382
|
+
payload: {
|
|
348
383
|
errors: [
|
|
349
384
|
{
|
|
350
|
-
category:
|
|
385
|
+
category: 'expected',
|
|
351
386
|
errorCode: 2008,
|
|
352
387
|
fatal: true,
|
|
353
|
-
name:
|
|
388
|
+
name: 'media-engine',
|
|
354
389
|
shownToUser: false,
|
|
355
390
|
},
|
|
356
391
|
],
|
|
357
392
|
},
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
393
|
+
options: {
|
|
394
|
+
meetingId: this.meeting.id,
|
|
395
|
+
},
|
|
396
|
+
});
|
|
361
397
|
if (reconnectError instanceof NeedsRejoinError) {
|
|
362
398
|
// send call aborded event with catogery as expected as we are trying to rejoin
|
|
363
399
|
|
|
@@ -385,6 +421,12 @@ export default class ReconnectionManager {
|
|
|
385
421
|
'ReconnectionManager:index#executeReconnection --> Attempting to reconnect to meeting.'
|
|
386
422
|
);
|
|
387
423
|
|
|
424
|
+
const wasSharing = this.meeting.shareStatus === SHARE_STATUS.LOCAL_SHARE_ACTIVE;
|
|
425
|
+
|
|
426
|
+
if (wasSharing) {
|
|
427
|
+
await this.stopLocalShareTrack(SHARE_STOPPED_REASON.MEDIA_RECONNECTION);
|
|
428
|
+
}
|
|
429
|
+
|
|
388
430
|
if (networkDisconnect) {
|
|
389
431
|
try {
|
|
390
432
|
await this.reconnectMercuryWebSocket();
|
|
@@ -401,8 +443,6 @@ export default class ReconnectionManager {
|
|
|
401
443
|
}
|
|
402
444
|
}
|
|
403
445
|
|
|
404
|
-
const wasSharing = this.meeting.shareStatus === SHARE_STATUS.LOCAL_SHARE_ACTIVE;
|
|
405
|
-
|
|
406
446
|
try {
|
|
407
447
|
LoggerProxy.logger.info(
|
|
408
448
|
'ReconnectionManager:index#executeReconnection --> Updating meeting data from server.'
|
|
@@ -420,10 +460,10 @@ export default class ReconnectionManager {
|
|
|
420
460
|
// So that on rejoin it known what parametrs it was using
|
|
421
461
|
if (!this.meeting || !this.webex.meetings.getMeetingByType(_ID_, this.meeting.id)) {
|
|
422
462
|
LoggerProxy.logger.info(
|
|
423
|
-
'ReconnectionManager:index#executeReconnection --> Meeting got deleted due to inactivity or ended remotely
|
|
463
|
+
'ReconnectionManager:index#executeReconnection --> Meeting got deleted due to inactivity or ended remotely.'
|
|
424
464
|
);
|
|
425
465
|
|
|
426
|
-
throw new Error('Unable to rejoin a meeting already ended or inactive
|
|
466
|
+
throw new Error('Unable to rejoin a meeting already ended or inactive.');
|
|
427
467
|
}
|
|
428
468
|
|
|
429
469
|
LoggerProxy.logger.info(
|
|
@@ -475,24 +515,7 @@ export default class ReconnectionManager {
|
|
|
475
515
|
LoggerProxy.logger.info('ReconnectionManager:index#rejoinMeeting --> meeting rejoined');
|
|
476
516
|
|
|
477
517
|
if (wasSharing) {
|
|
478
|
-
|
|
479
|
-
Media.stopTracks(this.meeting.mediaProperties.shareTrack);
|
|
480
|
-
this.meeting.isSharing = false;
|
|
481
|
-
if (this.shareStatus === SHARE_STATUS.LOCAL_SHARE_ACTIVE) {
|
|
482
|
-
this.meeting.shareStatus = SHARE_STATUS.NO_SHARE;
|
|
483
|
-
}
|
|
484
|
-
this.meeting.mediaProperties.mediaDirection.sendShare = false;
|
|
485
|
-
Trigger.trigger(
|
|
486
|
-
this.meeting,
|
|
487
|
-
{
|
|
488
|
-
file: 'reconnection-manager/index',
|
|
489
|
-
function: 'rejoinMeeting',
|
|
490
|
-
},
|
|
491
|
-
EVENT_TRIGGERS.MEETING_STOPPED_SHARING_LOCAL,
|
|
492
|
-
{
|
|
493
|
-
reason: SHARE_STOPPED_REASON.MEETING_REJOIN,
|
|
494
|
-
}
|
|
495
|
-
);
|
|
518
|
+
await this.stopLocalShareTrack(SHARE_STOPPED_REASON.MEETING_REJOIN);
|
|
496
519
|
}
|
|
497
520
|
} catch (joinError) {
|
|
498
521
|
this.rejoinAttempts += 1;
|
|
@@ -555,9 +578,11 @@ export default class ReconnectionManager {
|
|
|
555
578
|
|
|
556
579
|
// resend media requests
|
|
557
580
|
if (this.meeting.isMultistream) {
|
|
558
|
-
Object.values(this.meeting.mediaRequestManagers).forEach(
|
|
559
|
-
|
|
560
|
-
|
|
581
|
+
Object.values(this.meeting.mediaRequestManagers).forEach(
|
|
582
|
+
(mediaRequestManager: MediaRequestManager) => {
|
|
583
|
+
mediaRequestManager.clearPreviousRequests();
|
|
584
|
+
mediaRequestManager.commit();
|
|
585
|
+
}
|
|
561
586
|
);
|
|
562
587
|
}
|
|
563
588
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import PermissionError from '../common/errors/permission';
|
|
2
|
-
import {CONTROLS, HTTP_VERBS} from '../constants';
|
|
2
|
+
import {CONTROLS, HTTP_VERBS, SELF_POLICY} from '../constants';
|
|
3
3
|
import MeetingRequest from '../meeting/request';
|
|
4
4
|
import RecordingAction from './enums';
|
|
5
5
|
import Util from './util';
|
|
@@ -28,6 +28,14 @@ export default class RecordingController {
|
|
|
28
28
|
*/
|
|
29
29
|
private displayHints: Array<string> = [];
|
|
30
30
|
|
|
31
|
+
/**
|
|
32
|
+
* @instance
|
|
33
|
+
* @type {Object}
|
|
34
|
+
* @private
|
|
35
|
+
* @memberof RecordingInfo
|
|
36
|
+
*/
|
|
37
|
+
private selfUserPolicies: Record<SELF_POLICY, boolean>;
|
|
38
|
+
|
|
31
39
|
/**
|
|
32
40
|
* @instance
|
|
33
41
|
* @type {string}
|
|
@@ -81,7 +89,6 @@ export default class RecordingController {
|
|
|
81
89
|
|
|
82
90
|
/**
|
|
83
91
|
* @param {MeetingRequest} request
|
|
84
|
-
* @param {LocusInfo} info
|
|
85
92
|
* @returns {void}
|
|
86
93
|
* @private
|
|
87
94
|
* @memberof RecordingController
|
|
@@ -126,6 +133,16 @@ export default class RecordingController {
|
|
|
126
133
|
this.displayHints = hints;
|
|
127
134
|
}
|
|
128
135
|
|
|
136
|
+
/**
|
|
137
|
+
* @param {Object} selfUserPolicies
|
|
138
|
+
* @returns {void}
|
|
139
|
+
* @public
|
|
140
|
+
* @memberof RecordingController
|
|
141
|
+
*/
|
|
142
|
+
public setUserPolicy(selfUserPolicies: Record<SELF_POLICY, boolean>) {
|
|
143
|
+
this.selfUserPolicies = selfUserPolicies;
|
|
144
|
+
}
|
|
145
|
+
|
|
129
146
|
/**
|
|
130
147
|
* @param {string} id
|
|
131
148
|
* @returns {void}
|
|
@@ -264,7 +281,7 @@ export default class RecordingController {
|
|
|
264
281
|
);
|
|
265
282
|
|
|
266
283
|
// assumes action is proper cased (i.e., Example)
|
|
267
|
-
if (Util?.[`canUser${action}`](this.displayHints)) {
|
|
284
|
+
if (Util?.[`canUser${action}`](this.displayHints, this.selfUserPolicies)) {
|
|
268
285
|
if (this.serviceUrl) {
|
|
269
286
|
return this.recordingService(action);
|
|
270
287
|
}
|
|
@@ -1,17 +1,34 @@
|
|
|
1
|
-
import {DISPLAY_HINTS} from '../constants';
|
|
1
|
+
import {DISPLAY_HINTS, SELF_POLICY} from '../constants';
|
|
2
2
|
import RecordingAction from './enums';
|
|
3
|
+
import MeetingUtil from '../meeting/util';
|
|
3
4
|
|
|
4
|
-
const canUserStart = (
|
|
5
|
-
displayHints
|
|
5
|
+
const canUserStart = (
|
|
6
|
+
displayHints: Array<string>,
|
|
7
|
+
userPolicies: Record<SELF_POLICY, boolean>
|
|
8
|
+
): boolean =>
|
|
9
|
+
displayHints.includes(DISPLAY_HINTS.RECORDING_CONTROL_START) &&
|
|
10
|
+
MeetingUtil.selfSupportsFeature(SELF_POLICY.SUPPORT_NETWORK_BASED_RECORD, userPolicies);
|
|
6
11
|
|
|
7
|
-
const canUserPause = (
|
|
8
|
-
displayHints
|
|
12
|
+
const canUserPause = (
|
|
13
|
+
displayHints: Array<string>,
|
|
14
|
+
userPolicies: Record<SELF_POLICY, boolean>
|
|
15
|
+
): boolean =>
|
|
16
|
+
displayHints.includes(DISPLAY_HINTS.RECORDING_CONTROL_PAUSE) &&
|
|
17
|
+
MeetingUtil.selfSupportsFeature(SELF_POLICY.SUPPORT_NETWORK_BASED_RECORD, userPolicies);
|
|
9
18
|
|
|
10
|
-
const canUserResume = (
|
|
11
|
-
displayHints
|
|
19
|
+
const canUserResume = (
|
|
20
|
+
displayHints: Array<string>,
|
|
21
|
+
userPolicies: Record<SELF_POLICY, boolean>
|
|
22
|
+
): boolean =>
|
|
23
|
+
displayHints.includes(DISPLAY_HINTS.RECORDING_CONTROL_RESUME) &&
|
|
24
|
+
MeetingUtil.selfSupportsFeature(SELF_POLICY.SUPPORT_NETWORK_BASED_RECORD, userPolicies);
|
|
12
25
|
|
|
13
|
-
const canUserStop = (
|
|
14
|
-
displayHints
|
|
26
|
+
const canUserStop = (
|
|
27
|
+
displayHints: Array<string>,
|
|
28
|
+
userPolicies: Record<SELF_POLICY, boolean>
|
|
29
|
+
): boolean =>
|
|
30
|
+
displayHints.includes(DISPLAY_HINTS.RECORDING_CONTROL_STOP) &&
|
|
31
|
+
MeetingUtil.selfSupportsFeature(SELF_POLICY.SUPPORT_NETWORK_BASED_RECORD, userPolicies);
|
|
15
32
|
|
|
16
33
|
const extractLocusId = (url: string) => {
|
|
17
34
|
return url?.split('/').pop();
|
package/src/roap/index.ts
CHANGED
|
@@ -98,11 +98,9 @@ export default class Roap extends StatelessWebexPlugin {
|
|
|
98
98
|
roapMessage,
|
|
99
99
|
locusSelfUrl: meeting.selfUrl,
|
|
100
100
|
mediaId: options.mediaId,
|
|
101
|
-
correlationId: options.correlationId,
|
|
102
|
-
audioMuted: meeting.isAudioMuted(),
|
|
103
|
-
videoMuted: meeting.isVideoMuted(),
|
|
104
101
|
meetingId: meeting.id,
|
|
105
|
-
|
|
102
|
+
locusMediaRequest: meeting.locusMediaRequest,
|
|
103
|
+
ipVersion: meeting.webex.meetings.reachability.getIpVersion(),
|
|
106
104
|
})
|
|
107
105
|
.then(() => {
|
|
108
106
|
LoggerProxy.logger.log(`Roap:index#sendRoapOK --> ROAP OK sent with seq ${options.seq}`);
|
|
@@ -135,11 +133,9 @@ export default class Roap extends StatelessWebexPlugin {
|
|
|
135
133
|
roapMessage,
|
|
136
134
|
locusSelfUrl: meeting.selfUrl,
|
|
137
135
|
mediaId: options.mediaId,
|
|
138
|
-
correlationId: options.correlationId,
|
|
139
|
-
audioMuted: meeting.isAudioMuted(),
|
|
140
|
-
videoMuted: meeting.isVideoMuted(),
|
|
141
136
|
meetingId: meeting.id,
|
|
142
|
-
|
|
137
|
+
locusMediaRequest: meeting.locusMediaRequest,
|
|
138
|
+
ipVersion: meeting.webex.meetings.reachability.getIpVersion(),
|
|
143
139
|
});
|
|
144
140
|
}
|
|
145
141
|
|
|
@@ -167,11 +163,9 @@ export default class Roap extends StatelessWebexPlugin {
|
|
|
167
163
|
roapMessage,
|
|
168
164
|
locusSelfUrl: meeting.selfUrl,
|
|
169
165
|
mediaId: options.mediaId,
|
|
170
|
-
correlationId: options.correlationId,
|
|
171
|
-
audioMuted: meeting.isAudioMuted(),
|
|
172
|
-
videoMuted: meeting.isVideoMuted(),
|
|
173
166
|
meetingId: meeting.id,
|
|
174
|
-
|
|
167
|
+
locusMediaRequest: meeting.locusMediaRequest,
|
|
168
|
+
ipVersion: meeting.webex.meetings.reachability.getIpVersion(),
|
|
175
169
|
})
|
|
176
170
|
.then(() => {
|
|
177
171
|
LoggerProxy.logger.log(
|
|
@@ -199,26 +193,27 @@ export default class Roap extends StatelessWebexPlugin {
|
|
|
199
193
|
// When reconnecting, it's important that the first roap message being sent out has empty media id.
|
|
200
194
|
// Normally this is the roap offer, but when TURN discovery is enabled,
|
|
201
195
|
// then this is the TURN discovery request message
|
|
202
|
-
|
|
196
|
+
return this.turnDiscovery.isSkipped(meeting).then((isTurnDiscoverySkipped) => {
|
|
197
|
+
const sendEmptyMediaId = reconnect && isTurnDiscoverySkipped;
|
|
203
198
|
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
}
|
|
199
|
+
return this.roapRequest
|
|
200
|
+
.sendRoap({
|
|
201
|
+
roapMessage,
|
|
202
|
+
locusSelfUrl: meeting.selfUrl,
|
|
203
|
+
mediaId: sendEmptyMediaId ? '' : meeting.mediaId,
|
|
204
|
+
meetingId: meeting.id,
|
|
205
|
+
preferTranscoding: !meeting.isMultistream,
|
|
206
|
+
locusMediaRequest: meeting.locusMediaRequest,
|
|
207
|
+
ipVersion: meeting.webex.meetings.reachability.getIpVersion(),
|
|
208
|
+
})
|
|
209
|
+
.then(({locus, mediaConnections}) => {
|
|
210
|
+
if (mediaConnections) {
|
|
211
|
+
meeting.updateMediaConnections(mediaConnections);
|
|
212
|
+
}
|
|
219
213
|
|
|
220
|
-
|
|
221
|
-
|
|
214
|
+
return locus;
|
|
215
|
+
});
|
|
216
|
+
});
|
|
222
217
|
}
|
|
223
218
|
|
|
224
219
|
/**
|