@webex/plugin-meetings 3.0.0-beta.4 → 3.0.0-beta.400
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 +58 -8
- package/UPGRADING.md +9 -9
- package/browsers.js +19 -24
- 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 +216 -0
- package/dist/breakouts/breakout.js.map +1 -0
- package/dist/breakouts/collection.js +23 -0
- package/dist/breakouts/collection.js.map +1 -0
- 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 +1048 -0
- package/dist/breakouts/index.js.map +1 -0
- 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/browser-detection.js +1 -20
- package/dist/common/browser-detection.js.map +1 -1
- package/dist/common/collection.js +5 -20
- package/dist/common/collection.js.map +1 -1
- package/dist/common/config.js +0 -7
- package/dist/common/config.js.map +1 -1
- package/dist/common/errors/captcha-error.js +10 -24
- package/dist/common/errors/captcha-error.js.map +1 -1
- package/dist/common/errors/intent-to-join.js +11 -24
- package/dist/common/errors/intent-to-join.js.map +1 -1
- package/dist/common/errors/join-meeting.js +12 -25
- package/dist/common/errors/join-meeting.js.map +1 -1
- package/dist/common/errors/media.js +10 -24
- package/dist/common/errors/media.js.map +1 -1
- package/dist/common/errors/no-meeting-info.js +51 -0
- package/dist/common/errors/no-meeting-info.js.map +1 -0
- package/dist/common/errors/parameter.js +5 -33
- package/dist/common/errors/parameter.js.map +1 -1
- package/dist/common/errors/password-error.js +10 -24
- package/dist/common/errors/password-error.js.map +1 -1
- package/dist/common/errors/permission.js +9 -23
- package/dist/common/errors/permission.js.map +1 -1
- package/dist/common/errors/reclaim-host-role-errors.js +158 -0
- package/dist/common/errors/reclaim-host-role-errors.js.map +1 -0
- package/dist/common/errors/reconnection-in-progress.js +0 -17
- package/dist/common/errors/reconnection-in-progress.js.map +1 -1
- package/dist/common/errors/reconnection.js +10 -24
- package/dist/common/errors/reconnection.js.map +1 -1
- package/dist/common/errors/stats.js +10 -24
- package/dist/common/errors/stats.js.map +1 -1
- package/dist/common/errors/webex-errors.js +54 -48
- package/dist/common/errors/webex-errors.js.map +1 -1
- package/dist/common/errors/webex-meetings-error.js +5 -25
- package/dist/common/errors/webex-meetings-error.js.map +1 -1
- package/dist/common/events/events-scope.js +0 -22
- package/dist/common/events/events-scope.js.map +1 -1
- package/dist/common/events/events.js +0 -23
- package/dist/common/events/events.js.map +1 -1
- package/dist/common/events/trigger-proxy.js +0 -12
- package/dist/common/events/trigger-proxy.js.map +1 -1
- package/dist/common/events/util.js +0 -15
- package/dist/common/events/util.js.map +1 -1
- package/dist/common/logs/logger-config.js +0 -4
- package/dist/common/logs/logger-config.js.map +1 -1
- package/dist/common/logs/logger-proxy.js +1 -8
- package/dist/common/logs/logger-proxy.js.map +1 -1
- package/dist/common/logs/request.js +41 -60
- package/dist/common/logs/request.js.map +1 -1
- package/dist/common/queue.js +28 -23
- package/dist/common/queue.js.map +1 -1
- package/dist/config.js +11 -15
- package/dist/config.js.map +1 -1
- package/dist/constants.js +347 -74
- 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 +125 -18
- package/dist/index.js.map +1 -1
- package/dist/interceptors/index.js +15 -0
- package/dist/interceptors/index.js.map +1 -0
- package/dist/interceptors/locusRetry.js +93 -0
- package/dist/interceptors/locusRetry.js.map +1 -0
- package/dist/interpretation/collection.js +23 -0
- package/dist/interpretation/collection.js.map +1 -0
- package/dist/interpretation/index.js +380 -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 +101 -29
- package/dist/locus-info/controlsUtils.js.map +1 -1
- package/dist/locus-info/embeddedAppsUtils.js +3 -26
- package/dist/locus-info/embeddedAppsUtils.js.map +1 -1
- package/dist/locus-info/fullState.js +0 -15
- package/dist/locus-info/fullState.js.map +1 -1
- package/dist/locus-info/hostUtils.js +4 -12
- package/dist/locus-info/hostUtils.js.map +1 -1
- package/dist/locus-info/index.js +564 -246
- package/dist/locus-info/index.js.map +1 -1
- package/dist/locus-info/infoUtils.js +10 -38
- package/dist/locus-info/infoUtils.js.map +1 -1
- package/dist/locus-info/mediaSharesUtils.js +82 -38
- package/dist/locus-info/mediaSharesUtils.js.map +1 -1
- package/dist/locus-info/parser.js +314 -163
- package/dist/locus-info/parser.js.map +1 -1
- package/dist/locus-info/selfUtils.js +110 -92
- package/dist/locus-info/selfUtils.js.map +1 -1
- package/dist/media/index.js +107 -231
- package/dist/media/index.js.map +1 -1
- package/dist/media/properties.js +137 -222
- package/dist/media/properties.js.map +1 -1
- package/dist/media/util.js +2 -9
- package/dist/media/util.js.map +1 -1
- package/dist/mediaQualityMetrics/config.js +316 -501
- package/dist/mediaQualityMetrics/config.js.map +1 -1
- package/dist/meeting/in-meeting-actions.js +97 -14
- package/dist/meeting/in-meeting-actions.js.map +1 -1
- package/dist/meeting/index.js +5311 -3871
- 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 +260 -183
- package/dist/meeting/muteState.js.map +1 -1
- package/dist/meeting/request.js +421 -347
- package/dist/meeting/request.js.map +1 -1
- package/dist/meeting/request.type.js +7 -0
- package/dist/meeting/request.type.js.map +1 -0
- package/dist/meeting/state.js +21 -31
- package/dist/meeting/state.js.map +1 -1
- package/dist/meeting/util.js +672 -585
- package/dist/meeting/util.js.map +1 -1
- package/dist/meeting/voicea-meeting.js +172 -0
- package/dist/meeting/voicea-meeting.js.map +1 -0
- package/dist/meeting-info/collection.js +6 -25
- package/dist/meeting-info/collection.js.map +1 -1
- package/dist/meeting-info/index.js +87 -39
- package/dist/meeting-info/index.js.map +1 -1
- package/dist/meeting-info/meeting-info-v2.js +352 -283
- package/dist/meeting-info/meeting-info-v2.js.map +1 -1
- package/dist/meeting-info/request.js +3 -15
- package/dist/meeting-info/request.js.map +1 -1
- package/dist/meeting-info/util.js +99 -183
- package/dist/meeting-info/util.js.map +1 -1
- package/dist/meeting-info/utilv2.js +147 -234
- package/dist/meeting-info/utilv2.js.map +1 -1
- package/dist/meetings/collection.js +43 -19
- package/dist/meetings/collection.js.map +1 -1
- package/dist/meetings/index.js +895 -600
- 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 +26 -41
- package/dist/meetings/request.js.map +1 -1
- package/dist/meetings/util.js +184 -157
- package/dist/meetings/util.js.map +1 -1
- package/dist/member/index.js +134 -85
- 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 +158 -88
- package/dist/member/util.js.map +1 -1
- package/dist/members/collection.js +13 -12
- package/dist/members/collection.js.map +1 -1
- package/dist/members/index.js +194 -204
- package/dist/members/index.js.map +1 -1
- package/dist/members/request.js +113 -68
- 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 +324 -259
- package/dist/members/util.js.map +1 -1
- package/dist/metrics/constants.js +19 -7
- package/dist/metrics/constants.js.map +1 -1
- package/dist/metrics/index.js +11 -558
- package/dist/metrics/index.js.map +1 -1
- package/dist/multistream/mediaRequestManager.js +263 -50
- package/dist/multistream/mediaRequestManager.js.map +1 -1
- package/dist/multistream/receiveSlot.js +58 -65
- package/dist/multistream/receiveSlot.js.map +1 -1
- package/dist/multistream/receiveSlotManager.js +76 -95
- package/dist/multistream/receiveSlotManager.js.map +1 -1
- package/dist/multistream/remoteMedia.js +62 -76
- package/dist/multistream/remoteMedia.js.map +1 -1
- package/dist/multistream/remoteMediaGroup.js +82 -45
- package/dist/multistream/remoteMediaGroup.js.map +1 -1
- package/dist/multistream/remoteMediaManager.js +657 -448
- package/dist/multistream/remoteMediaManager.js.map +1 -1
- package/dist/multistream/sendSlotManager.js +255 -0
- package/dist/multistream/sendSlotManager.js.map +1 -0
- package/dist/networkQualityMonitor/index.js +40 -59
- package/dist/networkQualityMonitor/index.js.map +1 -1
- package/dist/personal-meeting-room/index.js +21 -45
- package/dist/personal-meeting-room/index.js.map +1 -1
- package/dist/personal-meeting-room/request.js +1 -31
- package/dist/personal-meeting-room/request.js.map +1 -1
- package/dist/personal-meeting-room/util.js +0 -13
- package/dist/personal-meeting-room/util.js.map +1 -1
- package/dist/reachability/clusterReachability.js +356 -0
- package/dist/reachability/clusterReachability.js.map +1 -0
- package/dist/reachability/index.js +297 -460
- package/dist/reachability/index.js.map +1 -1
- package/dist/reachability/request.js +20 -26
- package/dist/reachability/request.js.map +1 -1
- package/dist/reachability/util.js +29 -0
- package/dist/reachability/util.js.map +1 -0
- package/dist/reactions/constants.js +13 -0
- package/dist/reactions/constants.js.map +1 -0
- package/dist/reactions/reactions.js +109 -0
- package/dist/reactions/reactions.js.map +1 -0
- package/dist/reactions/reactions.type.js +36 -0
- package/dist/reactions/reactions.type.js.map +1 -0
- package/dist/reconnection-manager/index.js +413 -483
- package/dist/reconnection-manager/index.js.map +1 -1
- package/dist/recording-controller/enums.js +17 -0
- package/dist/recording-controller/enums.js.map +1 -0
- package/dist/recording-controller/index.js +362 -0
- package/dist/recording-controller/index.js.map +1 -0
- package/dist/recording-controller/util.js +64 -0
- package/dist/recording-controller/util.js.map +1 -0
- package/dist/roap/index.js +102 -86
- package/dist/roap/index.js.map +1 -1
- package/dist/roap/request.js +131 -135
- package/dist/roap/request.js.map +1 -1
- package/dist/roap/turnDiscovery.js +437 -116
- 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 +179 -0
- package/dist/rtcMetrics/index.js.map +1 -0
- package/dist/statsAnalyzer/global.js +1 -95
- package/dist/statsAnalyzer/global.js.map +1 -1
- package/dist/statsAnalyzer/index.js +557 -583
- package/dist/statsAnalyzer/index.js.map +1 -1
- package/dist/statsAnalyzer/mqaUtil.js +326 -130
- package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
- package/dist/transcription/index.js +22 -47
- package/dist/transcription/index.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/no-meeting-info.d.ts +14 -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/reclaim-host-role-errors.d.ts +60 -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 +93 -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 +36 -0
- package/dist/types/common/queue.d.ts +34 -0
- package/dist/types/config.d.ts +72 -0
- package/dist/types/constants.d.ts +1088 -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/interceptors/index.d.ts +2 -0
- package/dist/types/interceptors/locusRetry.d.ts +27 -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 +272 -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 +241 -0
- package/dist/types/meeting/in-meeting-actions.d.ts +167 -0
- package/dist/types/meeting/index.d.ts +1824 -0
- package/dist/types/meeting/locusMediaRequest.d.ts +74 -0
- package/dist/types/meeting/muteState.d.ts +178 -0
- package/dist/types/meeting/request.d.ts +293 -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 +118 -0
- package/dist/types/meeting/voicea-meeting.d.ts +16 -0
- package/dist/types/meeting-info/collection.d.ts +20 -0
- package/dist/types/meeting-info/index.d.ts +69 -0
- package/dist/types/meeting-info/meeting-info-v2.d.ts +123 -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 +40 -0
- package/dist/types/meetings/index.d.ts +389 -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 +160 -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 +25 -0
- package/dist/types/members/util.d.ts +215 -0
- package/dist/types/metrics/constants.d.ts +70 -0
- package/dist/types/metrics/index.d.ts +45 -0
- package/dist/types/multistream/mediaRequestManager.d.ts +120 -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 +49 -0
- package/dist/types/multistream/remoteMediaManager.d.ts +301 -0
- package/dist/types/multistream/sendSlotManager.d.ts +70 -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/clusterReachability.d.ts +109 -0
- package/dist/types/reachability/index.d.ts +105 -0
- package/dist/types/reachability/request.d.ts +39 -0
- package/dist/types/reachability/util.d.ts +8 -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 +136 -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 +86 -0
- package/dist/types/roap/request.d.ts +39 -0
- package/dist/types/roap/turnDiscovery.d.ts +155 -0
- package/dist/types/rtcMetrics/constants.d.ts +4 -0
- package/dist/types/rtcMetrics/index.d.ts +61 -0
- package/dist/types/statsAnalyzer/global.d.ts +36 -0
- package/dist/types/statsAnalyzer/index.d.ts +217 -0
- package/dist/types/statsAnalyzer/mqaUtil.d.ts +48 -0
- package/dist/types/transcription/index.d.ts +64 -0
- package/dist/types/webinar/collection.d.ts +16 -0
- package/dist/types/webinar/index.d.ts +5 -0
- package/dist/webinar/collection.js +44 -0
- package/dist/webinar/collection.js.map +1 -0
- package/dist/webinar/index.js +69 -0
- package/dist/webinar/index.js.map +1 -0
- package/internal-README.md +7 -6
- package/package.json +30 -21
- package/src/annotation/annotation.types.ts +50 -0
- package/src/annotation/constants.ts +36 -0
- package/src/annotation/index.ts +328 -0
- package/src/breakouts/README.md +220 -0
- package/src/breakouts/breakout.ts +188 -0
- package/src/breakouts/collection.ts +19 -0
- package/src/breakouts/edit-lock-error.ts +25 -0
- package/src/breakouts/events.ts +56 -0
- package/src/breakouts/index.ts +925 -0
- package/src/breakouts/request.ts +55 -0
- package/src/breakouts/utils.ts +57 -0
- package/src/common/{browser-detection.js → browser-detection.ts} +9 -6
- package/src/common/collection.ts +9 -7
- package/src/common/{config.js → config.ts} +1 -1
- package/src/common/errors/{captcha-error.js → captcha-error.ts} +11 -7
- package/src/common/errors/{intent-to-join.js → intent-to-join.ts} +12 -7
- package/src/common/errors/{join-meeting.js → join-meeting.ts} +17 -8
- package/src/common/errors/{media.js → media.ts} +11 -7
- package/src/common/errors/no-meeting-info.ts +24 -0
- package/src/common/errors/parameter.ts +11 -7
- package/src/common/errors/{password-error.js → password-error.ts} +11 -7
- package/src/common/errors/{permission.js → permission.ts} +10 -6
- package/src/common/errors/reclaim-host-role-errors.ts +134 -0
- package/src/common/errors/{reconnection.js → reconnection.ts} +11 -7
- package/src/common/errors/{stats.js → stats.ts} +11 -7
- package/src/common/errors/{webex-errors.js → webex-errors.ts} +51 -8
- package/src/common/errors/{webex-meetings-error.js → webex-meetings-error.ts} +4 -2
- package/src/common/events/{events-scope.js → events-scope.ts} +6 -2
- package/src/common/events/{events.js → events.ts} +5 -1
- package/src/common/events/{trigger-proxy.js → trigger-proxy.ts} +9 -5
- package/src/common/events/{util.js → util.ts} +2 -3
- package/src/common/logs/{logger-config.js → logger-config.ts} +1 -2
- package/src/common/logs/logger-proxy.ts +44 -0
- package/src/common/logs/{request.js → request.ts} +26 -9
- package/src/common/queue.ts +22 -9
- package/src/{config.js → config.ts} +19 -21
- package/src/constants.ts +296 -27
- 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 +45 -0
- package/src/interceptors/index.ts +3 -0
- package/src/interceptors/locusRetry.ts +67 -0
- package/src/interpretation/README.md +60 -0
- package/src/interpretation/collection.ts +19 -0
- package/src/interpretation/index.ts +349 -0
- package/src/interpretation/siLanguage.ts +18 -0
- package/src/locus-info/controlsUtils.ts +222 -0
- package/src/locus-info/{embeddedAppsUtils.js → embeddedAppsUtils.ts} +5 -6
- package/src/locus-info/{fullState.js → fullState.ts} +16 -12
- package/src/locus-info/{hostUtils.js → hostUtils.ts} +9 -8
- package/src/locus-info/{index.js → index.ts} +561 -119
- package/src/locus-info/{infoUtils.js → infoUtils.ts} +29 -10
- package/src/locus-info/{mediaSharesUtils.js → mediaSharesUtils.ts} +97 -17
- package/src/locus-info/{parser.js → parser.ts} +303 -104
- package/src/locus-info/{selfUtils.js → selfUtils.ts} +199 -68
- package/src/media/index.ts +460 -0
- package/src/media/properties.ts +283 -0
- package/src/media/{util.js → util.ts} +2 -2
- package/src/mediaQualityMetrics/config.ts +249 -0
- package/src/meeting/in-meeting-actions.ts +199 -3
- package/src/meeting/index.ts +8494 -0
- package/src/meeting/locusMediaRequest.ts +313 -0
- package/src/meeting/muteState.ts +465 -0
- package/src/meeting/request.ts +912 -0
- package/src/meeting/request.type.ts +13 -0
- package/src/meeting/{state.js → state.ts} +50 -35
- package/src/meeting/util.ts +799 -0
- package/src/meeting/voicea-meeting.ts +122 -0
- package/src/meeting-info/{collection.js → collection.ts} +6 -2
- package/src/meeting-info/index.ts +210 -0
- package/src/meeting-info/meeting-info-v2.ts +423 -0
- package/src/meeting-info/{request.js → request.ts} +14 -4
- package/src/meeting-info/{util.js → util.ts} +70 -58
- package/src/meeting-info/{utilv2.js → utilv2.ts} +99 -82
- package/src/meetings/collection.ts +76 -0
- package/src/meetings/index.ts +1539 -0
- package/src/meetings/meetings.types.ts +12 -0
- package/src/meetings/{request.js → request.ts} +34 -25
- package/src/meetings/{util.js → util.ts} +133 -38
- package/src/member/{index.js → index.ts} +159 -56
- package/src/member/types.ts +38 -0
- package/src/member/util.ts +397 -0
- package/src/members/{collection.js → collection.ts} +10 -2
- package/src/members/{index.js → index.ts} +351 -146
- package/src/members/request.ts +255 -0
- package/src/members/types.ts +29 -0
- package/src/members/util.ts +353 -0
- package/src/metrics/{constants.js → constants.ts} +17 -6
- package/src/metrics/index.ts +73 -0
- package/src/multistream/mediaRequestManager.ts +341 -64
- package/src/multistream/receiveSlot.ts +69 -26
- package/src/multistream/receiveSlotManager.ts +66 -42
- package/src/multistream/remoteMedia.ts +40 -5
- package/src/multistream/remoteMediaGroup.ts +82 -3
- package/src/multistream/remoteMediaManager.ts +401 -81
- package/src/multistream/sendSlotManager.ts +199 -0
- package/src/networkQualityMonitor/{index.js → index.ts} +41 -29
- package/src/personal-meeting-room/{index.js → index.ts} +28 -19
- package/src/personal-meeting-room/{request.js → request.ts} +13 -4
- package/src/personal-meeting-room/{util.js → util.ts} +4 -4
- package/src/reachability/clusterReachability.ts +320 -0
- package/src/reachability/index.ts +371 -0
- package/src/reachability/request.ts +50 -35
- package/src/reachability/util.ts +24 -0
- package/src/reactions/constants.ts +4 -0
- package/src/reactions/reactions.ts +104 -0
- package/src/reactions/reactions.type.ts +62 -0
- package/src/reconnection-manager/index.ts +643 -0
- package/src/recording-controller/enums.ts +8 -0
- package/src/recording-controller/index.ts +332 -0
- package/src/recording-controller/util.ts +75 -0
- package/src/roap/index.ts +288 -0
- package/src/roap/request.ts +153 -0
- package/src/roap/turnDiscovery.ts +374 -70
- package/src/rtcMetrics/constants.ts +3 -0
- package/src/rtcMetrics/index.ts +166 -0
- package/src/statsAnalyzer/global.ts +37 -0
- package/src/statsAnalyzer/index.ts +1275 -0
- package/src/statsAnalyzer/mqaUtil.ts +440 -0
- package/src/transcription/{index.js → index.ts} +46 -39
- package/src/webinar/collection.ts +31 -0
- package/src/webinar/index.ts +62 -0
- package/test/integration/spec/converged-space-meetings.js +233 -0
- package/test/integration/spec/journey.js +791 -531
- package/test/integration/spec/space-meeting.js +391 -204
- package/test/integration/spec/transcription.js +7 -8
- package/test/unit/spec/annotation/index.ts +418 -0
- package/test/unit/spec/breakouts/breakout.ts +238 -0
- package/test/unit/spec/breakouts/collection.ts +15 -0
- package/test/unit/spec/breakouts/edit-lock-error.ts +30 -0
- package/test/unit/spec/breakouts/events.ts +89 -0
- package/test/unit/spec/breakouts/index.ts +1793 -0
- package/test/unit/spec/breakouts/request.ts +104 -0
- package/test/unit/spec/breakouts/utils.js +72 -0
- package/test/unit/spec/common/browser-detection.js +9 -28
- 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 +93 -90
- package/test/unit/spec/interceptors/locusRetry.ts +131 -0
- package/test/unit/spec/interpretation/collection.ts +15 -0
- package/test/unit/spec/interpretation/index.ts +625 -0
- package/test/unit/spec/interpretation/siLanguage.ts +28 -0
- package/test/unit/spec/locus-info/controlsUtils.js +325 -32
- package/test/unit/spec/locus-info/embeddedAppsUtils.js +8 -6
- package/test/unit/spec/locus-info/index.js +1458 -21
- package/test/unit/spec/locus-info/infoUtils.js +71 -40
- package/test/unit/spec/locus-info/lib/BasicSeqCmp.json +88 -430
- package/test/unit/spec/locus-info/lib/SeqCmp.json +529 -685
- package/test/unit/spec/locus-info/mediaSharesUtils.ts +41 -0
- package/test/unit/spec/locus-info/parser.js +119 -44
- package/test/unit/spec/locus-info/selfConstant.js +120 -103
- package/test/unit/spec/locus-info/selfUtils.js +291 -12
- package/test/unit/spec/media/index.ts +194 -111
- package/test/unit/spec/media/properties.ts +11 -11
- package/test/unit/spec/meeting/in-meeting-actions.ts +96 -3
- package/test/unit/spec/meeting/index.js +8616 -1921
- package/test/unit/spec/meeting/locusMediaRequest.ts +442 -0
- package/test/unit/spec/meeting/muteState.js +568 -207
- package/test/unit/spec/meeting/request.js +602 -82
- package/test/unit/spec/meeting/utils.js +867 -179
- package/test/unit/spec/meeting/voicea-meeting.ts +266 -0
- package/test/unit/spec/meeting-info/index.js +300 -0
- package/test/unit/spec/meeting-info/meetinginfov2.js +631 -78
- package/test/unit/spec/meeting-info/request.js +7 -9
- package/test/unit/spec/meeting-info/util.js +11 -12
- package/test/unit/spec/meeting-info/utilv2.js +131 -74
- package/test/unit/spec/meetings/collection.js +27 -1
- package/test/unit/spec/meetings/index.js +1826 -374
- package/test/unit/spec/meetings/utils.js +243 -14
- package/test/unit/spec/member/index.js +61 -7
- package/test/unit/spec/member/util.js +526 -26
- package/test/unit/spec/members/index.js +536 -55
- package/test/unit/spec/members/request.js +228 -40
- package/test/unit/spec/members/utils.js +217 -4
- package/test/unit/spec/metrics/index.js +13 -68
- package/test/unit/spec/multistream/mediaRequestManager.ts +1032 -110
- package/test/unit/spec/multistream/receiveSlot.ts +77 -18
- package/test/unit/spec/multistream/receiveSlotManager.ts +69 -39
- package/test/unit/spec/multistream/remoteMedia.ts +40 -2
- package/test/unit/spec/multistream/remoteMediaGroup.ts +350 -5
- package/test/unit/spec/multistream/remoteMediaManager.ts +937 -65
- package/test/unit/spec/multistream/sendSlotManager.ts +274 -0
- package/test/unit/spec/networkQualityMonitor/index.js +24 -18
- package/test/unit/spec/personal-meeting-room/personal-meeting-room.js +2 -7
- package/test/unit/spec/reachability/clusterReachability.ts +279 -0
- package/test/unit/spec/reachability/index.ts +606 -26
- package/test/unit/spec/reachability/request.js +68 -0
- package/test/unit/spec/reachability/util.ts +40 -0
- package/test/unit/spec/reconnection-manager/index.js +222 -34
- package/test/unit/spec/recording-controller/index.js +306 -0
- package/test/unit/spec/recording-controller/util.js +229 -0
- package/test/unit/spec/roap/index.ts +238 -82
- package/test/unit/spec/roap/request.ts +255 -0
- package/test/unit/spec/roap/turnDiscovery.ts +707 -110
- package/test/unit/spec/rtcMetrics/index.ts +122 -0
- package/test/unit/spec/stats-analyzer/index.js +1331 -62
- package/test/unit/spec/webinar/collection.ts +13 -0
- package/test/unit/spec/webinar/index.ts +60 -0
- package/test/utils/cmr.js +44 -42
- package/test/utils/constants.js +9 -0
- package/test/utils/integrationTestUtils.js +46 -0
- package/test/utils/testUtils.js +63 -99
- package/test/utils/webex-config.js +22 -18
- package/test/utils/webex-test-users.js +65 -50
- package/tsconfig.json +6 -0
- package/dist/media/internal-media-core-wrapper.js +0 -22
- package/dist/media/internal-media-core-wrapper.js.map +0 -1
- package/dist/meeting/effectsState.js +0 -327
- package/dist/meeting/effectsState.js.map +0 -1
- package/dist/metrics/config.js +0 -301
- package/dist/metrics/config.js.map +0 -1
- package/dist/multistream/multistreamMedia.js +0 -116
- package/dist/multistream/multistreamMedia.js.map +0 -1
- package/dist/peer-connection-manager/util.js +0 -124
- package/dist/peer-connection-manager/util.js.map +0 -1
- package/src/common/logs/logger-proxy.js +0 -33
- package/src/index.js +0 -15
- package/src/locus-info/controlsUtils.js +0 -102
- package/src/media/index.js +0 -459
- package/src/media/internal-media-core-wrapper.ts +0 -9
- package/src/media/properties.js +0 -289
- package/src/mediaQualityMetrics/config.js +0 -382
- package/src/meeting/effectsState.js +0 -205
- package/src/meeting/index.js +0 -6284
- package/src/meeting/muteState.js +0 -318
- package/src/meeting/request.js +0 -684
- package/src/meeting/util.js +0 -506
- package/src/meeting-info/index.js +0 -131
- package/src/meeting-info/meeting-info-v2.js +0 -255
- package/src/meetings/collection.js +0 -40
- package/src/meetings/index.js +0 -1015
- package/src/member/util.js +0 -254
- package/src/members/request.js +0 -131
- package/src/members/util.js +0 -258
- package/src/metrics/config.js +0 -324
- package/src/metrics/index.js +0 -530
- package/src/multistream/multistreamMedia.ts +0 -92
- package/src/peer-connection-manager/util.ts +0 -117
- package/src/reachability/index.js +0 -464
- package/src/reconnection-manager/index.js +0 -519
- package/src/roap/index.js +0 -220
- package/src/roap/request.js +0 -127
- package/src/statsAnalyzer/global.js +0 -133
- package/src/statsAnalyzer/index.js +0 -1006
- package/src/statsAnalyzer/mqaUtil.js +0 -173
- package/test/unit/spec/meeting/effectsState.js +0 -291
- package/test/unit/spec/peerconnection-manager/utils.test-fixtures.ts +0 -389
- /package/src/common/errors/{reconnection-in-progress.js → reconnection-in-progress.ts} +0 -0
|
@@ -1,11 +1,14 @@
|
|
|
1
|
+
// @ts-ignore - Types not available for @webex/common
|
|
1
2
|
import {Defer} from '@webex/common';
|
|
2
3
|
|
|
3
4
|
import Metrics from '../metrics';
|
|
4
5
|
import BEHAVIORAL_METRICS from '../metrics/constants';
|
|
5
6
|
import LoggerProxy from '../common/logs/logger-proxy';
|
|
6
|
-
import {ROAP} from '../constants';
|
|
7
|
+
import {ROAP, Enum} from '../constants';
|
|
7
8
|
|
|
8
9
|
import RoapRequest from './request';
|
|
10
|
+
import Meeting from '../meeting';
|
|
11
|
+
import MeetingUtil from '../meeting/util';
|
|
9
12
|
|
|
10
13
|
const TURN_DISCOVERY_TIMEOUT = 10; // in seconds
|
|
11
14
|
|
|
@@ -15,6 +18,28 @@ const TURN_DISCOVERY_TIMEOUT = 10; // in seconds
|
|
|
15
18
|
// and do the SDP offer with seq=1
|
|
16
19
|
const TURN_DISCOVERY_SEQ = 0;
|
|
17
20
|
|
|
21
|
+
const TurnDiscoverySkipReason = {
|
|
22
|
+
missingHttpResponse: 'missing http response', // when we asked for the TURN discovery response to be in the http response, but it wasn't there
|
|
23
|
+
reachability: 'reachability', // when udp reachability to public clusters is ok, so we don't need TURN (this doens't apply when joinWithMedia() is used)
|
|
24
|
+
alreadyInProgress: 'already in progress', // when we try to start TURN discovery while it's already in progress
|
|
25
|
+
} as const;
|
|
26
|
+
|
|
27
|
+
export type TurnDiscoverySkipReason =
|
|
28
|
+
| Enum<typeof TurnDiscoverySkipReason> // this is a kind of FYI, because in practice typescript will infer the type of TurnDiscoverySkipReason as a string
|
|
29
|
+
| string // used in case of errors, contains the error message
|
|
30
|
+
| undefined; // used when TURN discovery is not skipped
|
|
31
|
+
|
|
32
|
+
export type TurnServerInfo = {
|
|
33
|
+
url: string;
|
|
34
|
+
username: string;
|
|
35
|
+
password: string;
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
export type TurnDiscoveryResult = {
|
|
39
|
+
turnServerInfo?: TurnServerInfo;
|
|
40
|
+
turnDiscoverySkippedReason: TurnDiscoverySkipReason;
|
|
41
|
+
};
|
|
42
|
+
|
|
18
43
|
/**
|
|
19
44
|
* Handles the process of finding out TURN server information from Linus.
|
|
20
45
|
* This is achieved by sending a TURN_DISCOVERY_REQUEST.
|
|
@@ -24,11 +49,7 @@ export default class TurnDiscovery {
|
|
|
24
49
|
|
|
25
50
|
private defer?: Defer; // used for waiting for the response
|
|
26
51
|
|
|
27
|
-
private turnInfo:
|
|
28
|
-
url: string;
|
|
29
|
-
username: string;
|
|
30
|
-
password: string;
|
|
31
|
-
};
|
|
52
|
+
private turnInfo: TurnServerInfo;
|
|
32
53
|
|
|
33
54
|
private responseTimer?: ReturnType<typeof setTimeout>;
|
|
34
55
|
|
|
@@ -46,7 +67,6 @@ export default class TurnDiscovery {
|
|
|
46
67
|
};
|
|
47
68
|
}
|
|
48
69
|
|
|
49
|
-
|
|
50
70
|
/**
|
|
51
71
|
* waits for TURN_DISCOVERY_RESPONSE message to arrive
|
|
52
72
|
*
|
|
@@ -54,43 +74,65 @@ export default class TurnDiscovery {
|
|
|
54
74
|
* @private
|
|
55
75
|
* @memberof Roap
|
|
56
76
|
*/
|
|
57
|
-
waitForTurnDiscoveryResponse() {
|
|
77
|
+
private waitForTurnDiscoveryResponse(): Promise<{isOkRequired: boolean}> {
|
|
58
78
|
if (!this.defer) {
|
|
59
|
-
LoggerProxy.logger.warn(
|
|
79
|
+
LoggerProxy.logger.warn(
|
|
80
|
+
'Roap:turnDiscovery#waitForTurnDiscoveryResponse --> TURN discovery is not in progress'
|
|
81
|
+
);
|
|
60
82
|
|
|
61
|
-
return Promise.reject(
|
|
83
|
+
return Promise.reject(
|
|
84
|
+
new Error('waitForTurnDiscoveryResponse() called before sendRoapTurnDiscoveryRequest()')
|
|
85
|
+
);
|
|
62
86
|
}
|
|
63
87
|
|
|
64
88
|
const {defer} = this;
|
|
65
89
|
|
|
66
90
|
this.responseTimer = setTimeout(() => {
|
|
67
|
-
LoggerProxy.logger.warn(
|
|
91
|
+
LoggerProxy.logger.warn(
|
|
92
|
+
`Roap:turnDiscovery#waitForTurnDiscoveryResponse --> timeout! no response arrived within ${TURN_DISCOVERY_TIMEOUT} seconds`
|
|
93
|
+
);
|
|
68
94
|
|
|
69
95
|
defer.reject(new Error('Timed out waiting for TURN_DISCOVERY_RESPONSE'));
|
|
70
96
|
}, TURN_DISCOVERY_TIMEOUT * 1000);
|
|
71
97
|
|
|
72
|
-
LoggerProxy.logger.info(
|
|
98
|
+
LoggerProxy.logger.info(
|
|
99
|
+
'Roap:turnDiscovery#waitForTurnDiscoveryResponse --> waiting for TURN_DISCOVERY_RESPONSE...'
|
|
100
|
+
);
|
|
73
101
|
|
|
74
102
|
return defer.promise;
|
|
75
103
|
}
|
|
76
104
|
|
|
77
105
|
/**
|
|
78
|
-
*
|
|
106
|
+
* Handles TURN_DISCOVERY_RESPONSE roap message. Use it if the roap message comes over the websocket,
|
|
107
|
+
* otherwise use handleTurnDiscoveryHttpResponse() if it comes in the http response.
|
|
79
108
|
*
|
|
80
109
|
* @param {Object} roapMessage
|
|
110
|
+
* @param {string} from string to indicate how we got the response (used just for logging)
|
|
81
111
|
* @returns {void}
|
|
82
112
|
* @public
|
|
83
113
|
* @memberof Roap
|
|
84
114
|
*/
|
|
85
|
-
handleTurnDiscoveryResponse(roapMessage) {
|
|
115
|
+
public handleTurnDiscoveryResponse(roapMessage: any, from: string) {
|
|
86
116
|
const {headers} = roapMessage;
|
|
87
117
|
|
|
88
118
|
if (!this.defer) {
|
|
89
|
-
LoggerProxy.logger.warn(
|
|
119
|
+
LoggerProxy.logger.warn(
|
|
120
|
+
`Roap:turnDiscovery#handleTurnDiscoveryResponse --> unexpected TURN discovery response ${from}`
|
|
121
|
+
);
|
|
90
122
|
|
|
91
123
|
return;
|
|
92
124
|
}
|
|
93
125
|
|
|
126
|
+
if (roapMessage.messageType !== ROAP.ROAP_TYPES.TURN_DISCOVERY_RESPONSE) {
|
|
127
|
+
this.defer.reject(
|
|
128
|
+
new Error(
|
|
129
|
+
`TURN_DISCOVERY_RESPONSE ${from} has unexpected messageType: ${JSON.stringify(
|
|
130
|
+
roapMessage
|
|
131
|
+
)}`
|
|
132
|
+
)
|
|
133
|
+
);
|
|
134
|
+
}
|
|
135
|
+
|
|
94
136
|
const expectedHeaders = [
|
|
95
137
|
{headerName: 'x-cisco-turn-url', field: 'url'},
|
|
96
138
|
{headerName: 'x-cisco-turn-username', field: 'username'},
|
|
@@ -103,7 +145,9 @@ export default class TurnDiscovery {
|
|
|
103
145
|
// check if it matches any of our expected headers
|
|
104
146
|
expectedHeaders.forEach((expectedHeader) => {
|
|
105
147
|
if (receivedHeader.startsWith(`${expectedHeader.headerName}=`)) {
|
|
106
|
-
this.turnInfo[expectedHeader.field] = receivedHeader.substring(
|
|
148
|
+
this.turnInfo[expectedHeader.field] = receivedHeader.substring(
|
|
149
|
+
expectedHeader.headerName.length + 1
|
|
150
|
+
);
|
|
107
151
|
foundHeaders += 1;
|
|
108
152
|
}
|
|
109
153
|
});
|
|
@@ -113,13 +157,211 @@ export default class TurnDiscovery {
|
|
|
113
157
|
this.responseTimer = undefined;
|
|
114
158
|
|
|
115
159
|
if (foundHeaders !== expectedHeaders.length) {
|
|
116
|
-
LoggerProxy.logger.warn(
|
|
117
|
-
|
|
160
|
+
LoggerProxy.logger.warn(
|
|
161
|
+
`Roap:turnDiscovery#handleTurnDiscoveryResponse --> missing some headers, received ${from}: ${JSON.stringify(
|
|
162
|
+
headers
|
|
163
|
+
)}`
|
|
164
|
+
);
|
|
165
|
+
this.defer.reject(
|
|
166
|
+
new Error(
|
|
167
|
+
`TURN_DISCOVERY_RESPONSE ${from} missing some headers: ${JSON.stringify(headers)}`
|
|
168
|
+
)
|
|
169
|
+
);
|
|
170
|
+
} else {
|
|
171
|
+
LoggerProxy.logger.info(
|
|
172
|
+
`Roap:turnDiscovery#handleTurnDiscoveryResponse --> received a valid response ${from}, url=${this.turnInfo.url}`
|
|
173
|
+
);
|
|
174
|
+
|
|
175
|
+
this.defer.resolve({isOkRequired: !headers?.includes('noOkInTransaction')});
|
|
118
176
|
}
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
/**
|
|
180
|
+
* Generates TURN_DISCOVERY_REQUEST roap message. When this method returns a roapMessage, it means that a TURN discovery process has started.
|
|
181
|
+
* It needs be ended by calling handleTurnDiscoveryHttpResponse() once you get a response from the backend. If you don't get any response
|
|
182
|
+
* or want to abort, you need to call abort().
|
|
183
|
+
*
|
|
184
|
+
* @param {Meeting} meeting
|
|
185
|
+
* @param {boolean} isForced
|
|
186
|
+
* @returns {Object}
|
|
187
|
+
*/
|
|
188
|
+
public async generateTurnDiscoveryRequestMessage(
|
|
189
|
+
meeting: Meeting,
|
|
190
|
+
isForced: boolean
|
|
191
|
+
): Promise<{roapMessage?: object; turnDiscoverySkippedReason: TurnDiscoverySkipReason}> {
|
|
192
|
+
if (this.defer) {
|
|
193
|
+
LoggerProxy.logger.warn(
|
|
194
|
+
'Roap:turnDiscovery#generateTurnDiscoveryRequestMessage --> TURN discovery already in progress'
|
|
195
|
+
);
|
|
196
|
+
|
|
197
|
+
return {
|
|
198
|
+
roapMessage: undefined,
|
|
199
|
+
turnDiscoverySkippedReason: TurnDiscoverySkipReason.alreadyInProgress,
|
|
200
|
+
};
|
|
122
201
|
}
|
|
202
|
+
|
|
203
|
+
let turnDiscoverySkippedReason: TurnDiscoverySkipReason;
|
|
204
|
+
|
|
205
|
+
if (!isForced) {
|
|
206
|
+
turnDiscoverySkippedReason = await this.getSkipReason(meeting);
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
if (turnDiscoverySkippedReason) {
|
|
210
|
+
return {roapMessage: undefined, turnDiscoverySkippedReason};
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
this.defer = new Defer();
|
|
214
|
+
|
|
215
|
+
const roapMessage = {
|
|
216
|
+
messageType: ROAP.ROAP_TYPES.TURN_DISCOVERY_REQUEST,
|
|
217
|
+
version: ROAP.ROAP_VERSION,
|
|
218
|
+
seq: TURN_DISCOVERY_SEQ,
|
|
219
|
+
headers: ['includeAnswerInHttpResponse', 'noOkInTransaction'],
|
|
220
|
+
};
|
|
221
|
+
|
|
222
|
+
LoggerProxy.logger.info(
|
|
223
|
+
'Roap:turnDiscovery#generateTurnDiscoveryRequestMessage --> generated TURN_DISCOVERY_REQUEST message'
|
|
224
|
+
);
|
|
225
|
+
|
|
226
|
+
return {roapMessage, turnDiscoverySkippedReason: undefined};
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
/**
|
|
230
|
+
* Handles any errors that occur during TURN discovery without re-throwing them.
|
|
231
|
+
*
|
|
232
|
+
* @param {Meeting} meeting
|
|
233
|
+
* @param {Error} error
|
|
234
|
+
* @returns {TurnDiscoveryResult}
|
|
235
|
+
*/
|
|
236
|
+
private handleTurnDiscoveryFailure(meeting: Meeting, error: Error): TurnDiscoveryResult {
|
|
237
|
+
// we catch any errors and resolve with no turn information so that the normal call join flow can continue without TURN
|
|
238
|
+
LoggerProxy.logger.info(
|
|
239
|
+
`Roap:turnDiscovery#doTurnDiscovery --> TURN discovery failed, continuing without TURN: ${error}`
|
|
240
|
+
);
|
|
241
|
+
|
|
242
|
+
Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.TURN_DISCOVERY_FAILURE, {
|
|
243
|
+
correlation_id: meeting.correlationId,
|
|
244
|
+
locus_id: meeting.locusUrl.split('/').pop(),
|
|
245
|
+
reason: error.message,
|
|
246
|
+
stack: error.stack,
|
|
247
|
+
});
|
|
248
|
+
|
|
249
|
+
return {turnServerInfo: undefined, turnDiscoverySkippedReason: `failure: ${error.message}`};
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
/**
|
|
253
|
+
* Handles TURN_DISCOVERY_RESPONSE roap message that came in http response. If the response is not valid,
|
|
254
|
+
* it returns an object with turnServerInfo set to undefined. In that case you need to call abort()
|
|
255
|
+
* to end the TURN discovery process.
|
|
256
|
+
*
|
|
257
|
+
* @param {Meeting} meeting
|
|
258
|
+
* @param {Object|undefined} httpResponse can be undefined to indicate that we didn't get the response
|
|
259
|
+
* @returns {Promise<TurnDiscoveryResult>}
|
|
260
|
+
* @memberof Roap
|
|
261
|
+
*/
|
|
262
|
+
public async handleTurnDiscoveryHttpResponse(
|
|
263
|
+
meeting: Meeting,
|
|
264
|
+
httpResponse?: object
|
|
265
|
+
): Promise<TurnDiscoveryResult> {
|
|
266
|
+
if (!this.defer) {
|
|
267
|
+
LoggerProxy.logger.warn(
|
|
268
|
+
'Roap:turnDiscovery#handleTurnDiscoveryHttpResponse --> unexpected http response, TURN discovery is not in progress'
|
|
269
|
+
);
|
|
270
|
+
|
|
271
|
+
throw new Error(
|
|
272
|
+
'handleTurnDiscoveryHttpResponse() called before generateTurnDiscoveryRequestMessage()'
|
|
273
|
+
);
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
if (httpResponse === undefined) {
|
|
277
|
+
return {
|
|
278
|
+
turnServerInfo: undefined,
|
|
279
|
+
turnDiscoverySkippedReason: TurnDiscoverySkipReason.missingHttpResponse,
|
|
280
|
+
};
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
try {
|
|
284
|
+
const roapMessage = this.parseHttpTurnDiscoveryResponse(meeting, httpResponse);
|
|
285
|
+
|
|
286
|
+
if (!roapMessage) {
|
|
287
|
+
return {
|
|
288
|
+
turnServerInfo: undefined,
|
|
289
|
+
turnDiscoverySkippedReason: TurnDiscoverySkipReason.missingHttpResponse,
|
|
290
|
+
};
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
this.handleTurnDiscoveryResponse(roapMessage, 'in http response');
|
|
294
|
+
|
|
295
|
+
const {isOkRequired} = await this.defer.promise;
|
|
296
|
+
|
|
297
|
+
if (isOkRequired) {
|
|
298
|
+
await this.sendRoapOK(meeting);
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
this.defer = undefined;
|
|
302
|
+
|
|
303
|
+
LoggerProxy.logger.info('Roap:turnDiscovery#doTurnDiscovery --> TURN discovery completed');
|
|
304
|
+
|
|
305
|
+
return {turnServerInfo: this.turnInfo, turnDiscoverySkippedReason: undefined};
|
|
306
|
+
} catch (error) {
|
|
307
|
+
this.abort();
|
|
308
|
+
|
|
309
|
+
return this.handleTurnDiscoveryFailure(meeting, error);
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
/**
|
|
314
|
+
* Aborts current TURN discovery. This method needs to be called if you called generateTurnDiscoveryRequestMessage(),
|
|
315
|
+
* but then never got any response from the server.
|
|
316
|
+
* @returns {void}
|
|
317
|
+
*/
|
|
318
|
+
public abort() {
|
|
319
|
+
if (this.defer) {
|
|
320
|
+
this.defer.reject(new Error('TURN discovery aborted'));
|
|
321
|
+
this.defer = undefined;
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
/**
|
|
326
|
+
* Parses the TURN_DISCOVERY_RESPONSE roap message out of the http response
|
|
327
|
+
* and returns it.
|
|
328
|
+
*
|
|
329
|
+
* @param {Meeting} meeting
|
|
330
|
+
* @param {any} httpResponse
|
|
331
|
+
* @returns {any}
|
|
332
|
+
*/
|
|
333
|
+
private parseHttpTurnDiscoveryResponse(
|
|
334
|
+
meeting: Meeting,
|
|
335
|
+
httpResponse: {mediaConnections?: Array<{remoteSdp?: string}>}
|
|
336
|
+
) {
|
|
337
|
+
let turnDiscoveryResponse;
|
|
338
|
+
|
|
339
|
+
if (httpResponse.mediaConnections?.[0]?.remoteSdp) {
|
|
340
|
+
const remoteSdp = JSON.parse(httpResponse.mediaConnections[0].remoteSdp);
|
|
341
|
+
|
|
342
|
+
if (remoteSdp.roapMessage) {
|
|
343
|
+
// yes, it's misleading that remoteSdp actually contains a TURN discovery response, but that's how the backend works...
|
|
344
|
+
const {seq, messageType, errorType, errorCause, headers} = remoteSdp.roapMessage;
|
|
345
|
+
|
|
346
|
+
turnDiscoveryResponse = {
|
|
347
|
+
seq,
|
|
348
|
+
messageType,
|
|
349
|
+
errorType,
|
|
350
|
+
errorCause,
|
|
351
|
+
headers,
|
|
352
|
+
};
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
if (!turnDiscoveryResponse) {
|
|
357
|
+
Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.ROAP_HTTP_RESPONSE_MISSING, {
|
|
358
|
+
correlationId: meeting.correlationId,
|
|
359
|
+
messageType: 'TURN_DISCOVERY_RESPONSE',
|
|
360
|
+
isMultistream: meeting.isMultistream,
|
|
361
|
+
});
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
return turnDiscoveryResponse;
|
|
123
365
|
}
|
|
124
366
|
|
|
125
367
|
/**
|
|
@@ -131,11 +373,19 @@ export default class TurnDiscovery {
|
|
|
131
373
|
* @private
|
|
132
374
|
* @memberof Roap
|
|
133
375
|
*/
|
|
134
|
-
sendRoapTurnDiscoveryRequest(
|
|
376
|
+
private sendRoapTurnDiscoveryRequest(
|
|
377
|
+
meeting: Meeting,
|
|
378
|
+
isReconnecting: boolean
|
|
379
|
+
): Promise<TurnDiscoveryResult> {
|
|
135
380
|
if (this.defer) {
|
|
136
|
-
LoggerProxy.logger.warn(
|
|
381
|
+
LoggerProxy.logger.warn(
|
|
382
|
+
'Roap:turnDiscovery#sendRoapTurnDiscoveryRequest --> already in progress'
|
|
383
|
+
);
|
|
137
384
|
|
|
138
|
-
return Promise.resolve(
|
|
385
|
+
return Promise.resolve({
|
|
386
|
+
turnServerInfo: undefined,
|
|
387
|
+
turnDiscoverySkippedReason: TurnDiscoverySkipReason.alreadyInProgress,
|
|
388
|
+
});
|
|
139
389
|
}
|
|
140
390
|
|
|
141
391
|
this.defer = new Defer();
|
|
@@ -144,24 +394,33 @@ export default class TurnDiscovery {
|
|
|
144
394
|
messageType: ROAP.ROAP_TYPES.TURN_DISCOVERY_REQUEST,
|
|
145
395
|
version: ROAP.ROAP_VERSION,
|
|
146
396
|
seq: TURN_DISCOVERY_SEQ,
|
|
397
|
+
headers: ['includeAnswerInHttpResponse', 'noOkInTransaction'],
|
|
147
398
|
};
|
|
148
399
|
|
|
149
|
-
LoggerProxy.logger.info(
|
|
400
|
+
LoggerProxy.logger.info(
|
|
401
|
+
'Roap:turnDiscovery#sendRoapTurnDiscoveryRequest --> sending TURN_DISCOVERY_REQUEST'
|
|
402
|
+
);
|
|
150
403
|
|
|
151
404
|
return this.roapRequest
|
|
152
405
|
.sendRoap({
|
|
153
406
|
roapMessage,
|
|
154
|
-
|
|
407
|
+
// @ts-ignore - Fix missing type
|
|
155
408
|
locusSelfUrl: meeting.selfUrl,
|
|
409
|
+
// @ts-ignore - Fix missing type
|
|
156
410
|
mediaId: isReconnecting ? '' : meeting.mediaId,
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
411
|
+
meetingId: meeting.id,
|
|
412
|
+
locusMediaRequest: meeting.locusMediaRequest,
|
|
413
|
+
// @ts-ignore - because of meeting.webex
|
|
414
|
+
ipVersion: MeetingUtil.getIpVersion(meeting.webex),
|
|
160
415
|
})
|
|
161
|
-
.then((
|
|
416
|
+
.then(async (response) => {
|
|
417
|
+
const {mediaConnections} = response;
|
|
418
|
+
|
|
162
419
|
if (mediaConnections) {
|
|
163
420
|
meeting.updateMediaConnections(mediaConnections);
|
|
164
421
|
}
|
|
422
|
+
|
|
423
|
+
return this.handleTurnDiscoveryHttpResponse(meeting, response);
|
|
165
424
|
});
|
|
166
425
|
}
|
|
167
426
|
|
|
@@ -172,8 +431,15 @@ export default class TurnDiscovery {
|
|
|
172
431
|
* @param {Meeting} meeting
|
|
173
432
|
* @returns {Promise}
|
|
174
433
|
*/
|
|
175
|
-
sendRoapOK(meeting) {
|
|
176
|
-
LoggerProxy.logger.info(
|
|
434
|
+
sendRoapOK(meeting: Meeting) {
|
|
435
|
+
LoggerProxy.logger.info(
|
|
436
|
+
'Roap:turnDiscovery#sendRoapOK --> TURN discovery response requires OK, sending it...'
|
|
437
|
+
);
|
|
438
|
+
|
|
439
|
+
Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.TURN_DISCOVERY_REQUIRES_OK, {
|
|
440
|
+
correlation_id: meeting.correlationId,
|
|
441
|
+
locus_id: meeting.locusUrl.split('/').pop(),
|
|
442
|
+
});
|
|
177
443
|
|
|
178
444
|
return this.roapRequest.sendRoap({
|
|
179
445
|
roapMessage: {
|
|
@@ -181,15 +447,49 @@ export default class TurnDiscovery {
|
|
|
181
447
|
version: ROAP.ROAP_VERSION,
|
|
182
448
|
seq: TURN_DISCOVERY_SEQ,
|
|
183
449
|
},
|
|
450
|
+
// @ts-ignore - fix type
|
|
184
451
|
locusSelfUrl: meeting.selfUrl,
|
|
452
|
+
// @ts-ignore - fix type
|
|
185
453
|
mediaId: meeting.mediaId,
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
videoMuted: meeting.isVideoMuted(),
|
|
189
|
-
meetingId: meeting.id
|
|
454
|
+
meetingId: meeting.id,
|
|
455
|
+
locusMediaRequest: meeting.locusMediaRequest,
|
|
190
456
|
});
|
|
191
457
|
}
|
|
192
458
|
|
|
459
|
+
/**
|
|
460
|
+
* Gets the reason why reachability is skipped.
|
|
461
|
+
*
|
|
462
|
+
* @param {Meeting} meeting
|
|
463
|
+
* @returns {Promise<string>} Promise with empty string if reachability is not skipped or a reason if it is skipped
|
|
464
|
+
*/
|
|
465
|
+
private async getSkipReason(meeting: Meeting): Promise<TurnDiscoverySkipReason> {
|
|
466
|
+
const isAnyPublicClusterReachable =
|
|
467
|
+
// @ts-ignore - fix type
|
|
468
|
+
await meeting.webex.meetings.reachability.isAnyPublicClusterReachable();
|
|
469
|
+
|
|
470
|
+
if (isAnyPublicClusterReachable) {
|
|
471
|
+
LoggerProxy.logger.info(
|
|
472
|
+
'Roap:turnDiscovery#getSkipReason --> reachability has not failed, skipping TURN discovery'
|
|
473
|
+
);
|
|
474
|
+
|
|
475
|
+
return TurnDiscoverySkipReason.reachability;
|
|
476
|
+
}
|
|
477
|
+
|
|
478
|
+
return undefined;
|
|
479
|
+
}
|
|
480
|
+
|
|
481
|
+
/**
|
|
482
|
+
* Checks if TURN discovery is skipped.
|
|
483
|
+
*
|
|
484
|
+
* @param {Meeting} meeting
|
|
485
|
+
* @returns {Boolean} true if TURN discovery is being skipped, false if it is being done
|
|
486
|
+
*/
|
|
487
|
+
async isSkipped(meeting) {
|
|
488
|
+
const skipReason = await this.getSkipReason(meeting);
|
|
489
|
+
|
|
490
|
+
return !!skipReason;
|
|
491
|
+
}
|
|
492
|
+
|
|
193
493
|
/**
|
|
194
494
|
* Retrieves TURN server information from the backend by doing
|
|
195
495
|
* a roap message exchange:
|
|
@@ -203,49 +503,53 @@ export default class TurnDiscovery {
|
|
|
203
503
|
* so it works fine no matter if TURN discovery is done or not.
|
|
204
504
|
*
|
|
205
505
|
* @param {Meeting} meeting
|
|
206
|
-
* @param {Boolean} isReconnecting should be set to true if this is a new
|
|
506
|
+
* @param {Boolean} [isReconnecting] should be set to true if this is a new
|
|
207
507
|
* media connection just after a reconnection
|
|
508
|
+
* @param {Boolean} [isForced]
|
|
208
509
|
* @returns {Promise}
|
|
209
510
|
*/
|
|
210
|
-
doTurnDiscovery(
|
|
211
|
-
|
|
511
|
+
async doTurnDiscovery(
|
|
512
|
+
meeting: Meeting,
|
|
513
|
+
isReconnecting?: boolean,
|
|
514
|
+
isForced?: boolean
|
|
515
|
+
): Promise<TurnDiscoveryResult> {
|
|
516
|
+
let turnDiscoverySkippedReason: TurnDiscoverySkipReason;
|
|
517
|
+
|
|
518
|
+
if (!isForced) {
|
|
519
|
+
turnDiscoverySkippedReason = await this.getSkipReason(meeting);
|
|
520
|
+
}
|
|
212
521
|
|
|
213
|
-
if (
|
|
214
|
-
|
|
215
|
-
|
|
522
|
+
if (turnDiscoverySkippedReason) {
|
|
523
|
+
return {
|
|
524
|
+
turnServerInfo: undefined,
|
|
525
|
+
turnDiscoverySkippedReason,
|
|
526
|
+
};
|
|
216
527
|
}
|
|
217
528
|
|
|
218
|
-
|
|
219
|
-
|
|
529
|
+
try {
|
|
530
|
+
const turnDiscoveryResult = await this.sendRoapTurnDiscoveryRequest(meeting, isReconnecting);
|
|
220
531
|
|
|
221
|
-
|
|
222
|
-
|
|
532
|
+
if (
|
|
533
|
+
turnDiscoveryResult.turnDiscoverySkippedReason !==
|
|
534
|
+
TurnDiscoverySkipReason.missingHttpResponse
|
|
535
|
+
) {
|
|
536
|
+
return turnDiscoveryResult;
|
|
537
|
+
}
|
|
223
538
|
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
.then(() => this.sendRoapOK(meeting))
|
|
227
|
-
.then(() => {
|
|
228
|
-
this.defer = undefined;
|
|
539
|
+
// if we haven't got the response over http, we need to wait for it to come over the websocket via Mercury
|
|
540
|
+
const {isOkRequired} = await this.waitForTurnDiscoveryResponse();
|
|
229
541
|
|
|
230
|
-
|
|
542
|
+
if (isOkRequired) {
|
|
543
|
+
await this.sendRoapOK(meeting);
|
|
544
|
+
}
|
|
231
545
|
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
.
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
{
|
|
241
|
-
correlation_id: meeting.correlationId,
|
|
242
|
-
locus_id: meeting.locusUrl.split('/').pop(),
|
|
243
|
-
reason: e.message,
|
|
244
|
-
stack: e.stack
|
|
245
|
-
}
|
|
246
|
-
);
|
|
247
|
-
|
|
248
|
-
return Promise.resolve({turnServerInfo: undefined, turnDiscoverySkippedReason: undefined});
|
|
249
|
-
});
|
|
546
|
+
this.defer = undefined;
|
|
547
|
+
|
|
548
|
+
LoggerProxy.logger.info('Roap:turnDiscovery#doTurnDiscovery --> TURN discovery completed');
|
|
549
|
+
|
|
550
|
+
return {turnServerInfo: this.turnInfo, turnDiscoverySkippedReason: undefined};
|
|
551
|
+
} catch (e) {
|
|
552
|
+
return this.handleTurnDiscoveryFailure(meeting, e);
|
|
553
|
+
}
|
|
250
554
|
}
|
|
251
555
|
}
|