@webex/plugin-meetings 2.60.0 → 2.60.1-next.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +46 -8
- package/dist/annotation/annotation.types.d.ts +42 -0
- package/dist/annotation/annotation.types.js +7 -0
- package/dist/annotation/annotation.types.js.map +1 -0
- package/dist/annotation/constants.d.ts +31 -0
- package/dist/annotation/constants.js +41 -0
- package/dist/annotation/constants.js.map +1 -0
- package/dist/annotation/index.d.ts +117 -0
- package/dist/annotation/index.js +357 -0
- package/dist/annotation/index.js.map +1 -0
- package/dist/breakouts/breakout.d.ts +8 -0
- package/dist/breakouts/breakout.js +215 -0
- package/dist/breakouts/breakout.js.map +1 -0
- package/dist/breakouts/collection.d.ts +5 -0
- package/dist/breakouts/collection.js +22 -0
- package/dist/breakouts/collection.js.map +1 -0
- package/dist/breakouts/edit-lock-error.d.ts +15 -0
- package/dist/breakouts/edit-lock-error.js +51 -0
- package/dist/breakouts/edit-lock-error.js.map +1 -0
- package/dist/breakouts/events.d.ts +8 -0
- package/dist/breakouts/events.js +44 -0
- package/dist/breakouts/events.js.map +1 -0
- package/dist/breakouts/index.d.ts +5 -0
- package/dist/breakouts/index.js +1047 -0
- package/dist/breakouts/index.js.map +1 -0
- package/dist/breakouts/request.d.ts +22 -0
- package/dist/breakouts/request.js +77 -0
- package/dist/breakouts/request.js.map +1 -0
- package/dist/breakouts/utils.d.ts +15 -0
- package/dist/breakouts/utils.js +64 -0
- package/dist/breakouts/utils.js.map +1 -0
- package/dist/common/browser-detection.js +2 -3
- package/dist/common/browser-detection.js.map +1 -1
- package/dist/common/collection.js +3 -4
- package/dist/common/collection.js.map +1 -1
- package/dist/common/config.js +1 -2
- package/dist/common/config.js.map +1 -1
- package/dist/common/errors/captcha-error.js +1 -2
- package/dist/common/errors/captcha-error.js.map +1 -1
- package/dist/common/errors/intent-to-join.js +1 -2
- package/dist/common/errors/intent-to-join.js.map +1 -1
- package/dist/common/errors/join-meeting.js +1 -2
- package/dist/common/errors/join-meeting.js.map +1 -1
- package/dist/common/errors/media.js +1 -2
- package/dist/common/errors/media.js.map +1 -1
- package/dist/common/errors/no-meeting-info.d.ts +14 -0
- package/dist/common/errors/no-meeting-info.js +50 -0
- package/dist/common/errors/no-meeting-info.js.map +1 -0
- package/dist/common/errors/parameter.js +3 -4
- package/dist/common/errors/parameter.js.map +1 -1
- package/dist/common/errors/password-error.js +1 -2
- package/dist/common/errors/password-error.js.map +1 -1
- package/dist/common/errors/permission.js +1 -2
- package/dist/common/errors/permission.js.map +1 -1
- package/dist/common/errors/{reclaim-host-role-error.js → reclaim-host-role-errors.js} +7 -11
- package/dist/common/errors/reclaim-host-role-errors.js.map +1 -0
- package/dist/common/errors/reconnection-in-progress.js +1 -2
- package/dist/common/errors/reconnection-in-progress.js.map +1 -1
- package/dist/common/errors/reconnection.js +1 -2
- package/dist/common/errors/reconnection.js.map +1 -1
- package/dist/common/errors/stats.js +1 -2
- package/dist/common/errors/stats.js.map +1 -1
- package/dist/common/errors/webex-errors.d.ts +20 -8
- package/dist/common/errors/webex-errors.js +48 -28
- package/dist/common/errors/webex-errors.js.map +1 -1
- package/dist/common/errors/webex-meetings-error.js +1 -2
- package/dist/common/errors/webex-meetings-error.js.map +1 -1
- package/dist/common/events/events-scope.js +1 -2
- package/dist/common/events/events-scope.js.map +1 -1
- package/dist/common/events/events.js +1 -2
- package/dist/common/events/events.js.map +1 -1
- package/dist/common/events/trigger-proxy.js +1 -2
- package/dist/common/events/trigger-proxy.js.map +1 -1
- package/dist/common/events/util.js +1 -2
- package/dist/common/events/util.js.map +1 -1
- package/dist/common/logs/logger-config.js +1 -2
- package/dist/common/logs/logger-config.js.map +1 -1
- package/dist/common/logs/logger-proxy.js +2 -3
- package/dist/common/logs/logger-proxy.js.map +1 -1
- package/dist/common/logs/request.d.ts +3 -1
- package/dist/common/logs/request.js +8 -5
- package/dist/common/logs/request.js.map +1 -1
- package/dist/common/queue.d.ts +9 -7
- package/dist/common/queue.js +22 -9
- package/dist/common/queue.js.map +1 -1
- package/dist/config.d.ts +6 -7
- package/dist/config.js +8 -10
- package/dist/config.js.map +1 -1
- package/dist/constants.d.ts +217 -97
- package/dist/constants.js +416 -441
- package/dist/constants.js.map +1 -1
- package/dist/controls-options-manager/constants.js +3 -6
- package/dist/controls-options-manager/constants.js.map +1 -1
- package/dist/controls-options-manager/enums.d.ts +11 -1
- package/dist/controls-options-manager/enums.js +15 -6
- package/dist/controls-options-manager/enums.js.map +1 -1
- package/dist/controls-options-manager/index.d.ts +17 -1
- package/dist/controls-options-manager/index.js +127 -38
- package/dist/controls-options-manager/index.js.map +1 -1
- package/dist/controls-options-manager/types.d.ts +43 -0
- package/dist/controls-options-manager/types.js +7 -0
- package/dist/controls-options-manager/types.js.map +1 -0
- package/dist/controls-options-manager/util.d.ts +1 -7
- package/dist/controls-options-manager/util.js +309 -19
- package/dist/controls-options-manager/util.js.map +1 -1
- package/dist/index.d.ts +6 -3
- package/dist/index.js +121 -5
- package/dist/index.js.map +1 -1
- package/dist/interceptors/index.d.ts +2 -0
- package/dist/interceptors/index.js +15 -0
- package/dist/interceptors/index.js.map +1 -0
- package/dist/interceptors/locusRetry.d.ts +27 -0
- package/dist/interceptors/locusRetry.js +94 -0
- package/dist/interceptors/locusRetry.js.map +1 -0
- package/dist/interpretation/collection.d.ts +5 -0
- package/dist/interpretation/collection.js +22 -0
- package/dist/interpretation/collection.js.map +1 -0
- package/dist/interpretation/index.d.ts +5 -0
- package/dist/interpretation/index.js +365 -0
- package/dist/interpretation/index.js.map +1 -0
- package/dist/interpretation/siLanguage.d.ts +5 -0
- package/dist/interpretation/siLanguage.js +24 -0
- package/dist/interpretation/siLanguage.js.map +1 -0
- package/dist/locus-info/controlsUtils.js +100 -11
- package/dist/locus-info/controlsUtils.js.map +1 -1
- package/dist/locus-info/embeddedAppsUtils.js +3 -4
- package/dist/locus-info/embeddedAppsUtils.js.map +1 -1
- package/dist/locus-info/fullState.js +1 -2
- package/dist/locus-info/fullState.js.map +1 -1
- package/dist/locus-info/hostUtils.js +1 -2
- package/dist/locus-info/hostUtils.js.map +1 -1
- package/dist/locus-info/index.d.ts +57 -4
- package/dist/locus-info/index.js +425 -84
- package/dist/locus-info/index.js.map +1 -1
- package/dist/locus-info/infoUtils.js +13 -5
- package/dist/locus-info/infoUtils.js.map +1 -1
- package/dist/locus-info/mediaSharesUtils.js +58 -3
- package/dist/locus-info/mediaSharesUtils.js.map +1 -1
- package/dist/locus-info/parser.d.ts +66 -6
- package/dist/locus-info/parser.js +253 -80
- package/dist/locus-info/parser.js.map +1 -1
- package/dist/locus-info/selfUtils.js +97 -13
- package/dist/locus-info/selfUtils.js.map +1 -1
- package/dist/media/index.d.ts +2 -0
- package/dist/media/index.js +107 -319
- package/dist/media/index.js.map +1 -1
- package/dist/media/properties.d.ts +38 -53
- package/dist/media/properties.js +96 -153
- package/dist/media/properties.js.map +1 -1
- package/dist/media/util.js +1 -22
- package/dist/media/util.js.map +1 -1
- package/dist/mediaQualityMetrics/config.d.ts +234 -230
- package/dist/mediaQualityMetrics/config.js +302 -498
- package/dist/mediaQualityMetrics/config.js.map +1 -1
- package/dist/meeting/in-meeting-actions.d.ts +88 -0
- package/dist/meeting/in-meeting-actions.js +94 -3
- package/dist/meeting/in-meeting-actions.js.map +1 -1
- package/dist/meeting/index.d.ts +591 -494
- package/dist/meeting/index.js +4732 -2990
- package/dist/meeting/index.js.map +1 -1
- package/dist/meeting/locusMediaRequest.d.ts +74 -0
- package/dist/meeting/locusMediaRequest.js +291 -0
- package/dist/meeting/locusMediaRequest.js.map +1 -0
- package/dist/meeting/muteState.d.ts +93 -25
- package/dist/meeting/muteState.js +224 -133
- package/dist/meeting/muteState.js.map +1 -1
- package/dist/meeting/request.d.ts +82 -47
- package/dist/meeting/request.js +297 -199
- package/dist/meeting/request.js.map +1 -1
- package/dist/meeting/request.type.d.ts +11 -0
- package/dist/meeting/request.type.js +7 -0
- package/dist/meeting/request.type.js.map +1 -0
- package/dist/meeting/state.js +1 -2
- package/dist/meeting/state.js.map +1 -1
- package/dist/meeting/util.d.ts +102 -1
- package/dist/meeting/util.js +605 -435
- package/dist/meeting/util.js.map +1 -1
- package/dist/meeting-info/collection.js +3 -4
- package/dist/meeting-info/collection.js.map +1 -1
- package/dist/meeting-info/index.d.ts +13 -1
- package/dist/meeting-info/index.js +74 -7
- package/dist/meeting-info/index.js.map +1 -1
- package/dist/meeting-info/meeting-info-v2.d.ts +31 -1
- package/dist/meeting-info/meeting-info-v2.js +200 -63
- package/dist/meeting-info/meeting-info-v2.js.map +1 -1
- package/dist/meeting-info/request.js +1 -2
- package/dist/meeting-info/request.js.map +1 -1
- package/dist/meeting-info/util.js +2 -3
- package/dist/meeting-info/util.js.map +1 -1
- package/dist/meeting-info/utilv2.js +39 -41
- package/dist/meeting-info/utilv2.js.map +1 -1
- package/dist/meetings/collection.d.ts +17 -0
- package/dist/meetings/collection.js +42 -4
- package/dist/meetings/collection.js.map +1 -1
- package/dist/meetings/index.d.ts +93 -21
- package/dist/meetings/index.js +490 -127
- package/dist/meetings/index.js.map +1 -1
- package/dist/meetings/meetings.types.d.ts +4 -0
- package/dist/meetings/meetings.types.js +7 -0
- package/dist/meetings/meetings.types.js.map +1 -0
- package/dist/meetings/request.js +4 -3
- package/dist/meetings/request.js.map +1 -1
- package/dist/meetings/util.js +107 -6
- package/dist/meetings/util.js.map +1 -1
- package/dist/member/index.d.ts +13 -1
- package/dist/member/index.js +45 -2
- package/dist/member/index.js.map +1 -1
- package/dist/member/member.types.js +3 -4
- package/dist/member/member.types.js.map +1 -1
- package/dist/member/types.d.ts +32 -0
- package/dist/member/types.js +23 -0
- package/dist/member/types.js.map +1 -0
- package/dist/member/util.js +120 -29
- package/dist/member/util.js.map +1 -1
- package/dist/members/collection.d.ts +5 -0
- package/dist/members/collection.js +11 -2
- package/dist/members/collection.js.map +1 -1
- package/dist/members/index.d.ts +56 -11
- package/dist/members/index.js +174 -47
- package/dist/members/index.js.map +1 -1
- package/dist/members/request.d.ts +67 -11
- package/dist/members/request.js +102 -54
- package/dist/members/request.js.map +1 -1
- package/dist/members/types.js +3 -4
- package/dist/members/types.js.map +1 -1
- package/dist/members/util.d.ts +214 -1
- package/dist/members/util.js +327 -284
- package/dist/members/util.js.map +1 -1
- package/dist/metrics/constants.d.ts +15 -6
- package/dist/metrics/constants.js +17 -9
- package/dist/metrics/constants.js.map +1 -1
- package/dist/metrics/index.d.ts +4 -111
- package/dist/metrics/index.js +4 -452
- package/dist/metrics/index.js.map +1 -1
- package/dist/multistream/mediaRequestManager.d.ts +118 -0
- package/dist/multistream/mediaRequestManager.js +344 -0
- package/dist/multistream/mediaRequestManager.js.map +1 -0
- package/dist/multistream/receiveSlot.d.ts +68 -0
- package/dist/multistream/receiveSlot.js +200 -0
- package/dist/multistream/receiveSlot.js.map +1 -0
- package/dist/multistream/receiveSlotManager.d.ts +56 -0
- package/dist/multistream/receiveSlotManager.js +174 -0
- package/dist/multistream/receiveSlotManager.js.map +1 -0
- package/dist/multistream/remoteMedia.d.ts +72 -0
- package/dist/multistream/remoteMedia.js +268 -0
- package/dist/multistream/remoteMedia.js.map +1 -0
- package/dist/multistream/remoteMediaGroup.d.ts +47 -0
- package/dist/multistream/remoteMediaGroup.js +267 -0
- package/dist/multistream/remoteMediaGroup.js.map +1 -0
- package/dist/multistream/remoteMediaManager.d.ts +285 -0
- package/dist/multistream/remoteMediaManager.js +1211 -0
- package/dist/multistream/remoteMediaManager.js.map +1 -0
- package/dist/multistream/sendSlotManager.d.ts +61 -0
- package/dist/multistream/sendSlotManager.js +236 -0
- package/dist/multistream/sendSlotManager.js.map +1 -0
- package/dist/networkQualityMonitor/index.js +5 -4
- package/dist/networkQualityMonitor/index.js.map +1 -1
- package/dist/personal-meeting-room/index.js +2 -3
- package/dist/personal-meeting-room/index.js.map +1 -1
- package/dist/personal-meeting-room/request.js +2 -3
- package/dist/personal-meeting-room/request.js.map +1 -1
- package/dist/personal-meeting-room/util.js +1 -2
- package/dist/personal-meeting-room/util.js.map +1 -1
- package/dist/reachability/clusterReachability.d.ts +109 -0
- package/dist/reachability/clusterReachability.js +357 -0
- package/dist/reachability/clusterReachability.js.map +1 -0
- package/dist/reachability/index.d.ts +61 -95
- package/dist/reachability/index.js +300 -393
- package/dist/reachability/index.js.map +1 -1
- package/dist/reachability/request.d.ts +7 -3
- package/dist/reachability/request.js +18 -10
- package/dist/reachability/request.js.map +1 -1
- package/dist/reachability/util.d.ts +8 -0
- package/dist/reachability/util.js +29 -0
- package/dist/reachability/util.js.map +1 -0
- package/dist/reactions/constants.d.ts +3 -0
- package/dist/reactions/constants.js +12 -0
- package/dist/reactions/constants.js.map +1 -0
- package/dist/reactions/reactions.d.ts +2 -2
- package/dist/reactions/reactions.js +4 -6
- package/dist/reactions/reactions.js.map +1 -1
- package/dist/reactions/reactions.type.d.ts +23 -3
- package/dist/reactions/reactions.type.js +21 -23
- package/dist/reactions/reactions.type.js.map +1 -1
- package/dist/reconnection-manager/index.d.ts +32 -8
- package/dist/reconnection-manager/index.js +282 -231
- package/dist/reconnection-manager/index.js.map +1 -1
- package/dist/recording-controller/enums.js +4 -5
- package/dist/recording-controller/enums.js.map +1 -1
- package/dist/recording-controller/index.d.ts +15 -1
- package/dist/recording-controller/index.js +57 -46
- package/dist/recording-controller/index.js.map +1 -1
- package/dist/recording-controller/util.d.ts +5 -4
- package/dist/recording-controller/util.js +10 -10
- package/dist/recording-controller/util.js.map +1 -1
- package/dist/roap/index.d.ts +9 -47
- package/dist/roap/index.js +101 -235
- package/dist/roap/index.js.map +1 -1
- package/dist/roap/request.d.ts +18 -12
- package/dist/roap/request.js +126 -180
- package/dist/roap/request.js.map +1 -1
- package/dist/roap/turnDiscovery.d.ts +27 -16
- package/dist/roap/turnDiscovery.js +115 -105
- package/dist/roap/turnDiscovery.js.map +1 -1
- package/dist/rtcMetrics/constants.d.ts +4 -0
- package/dist/rtcMetrics/constants.js +11 -0
- package/dist/rtcMetrics/constants.js.map +1 -0
- package/dist/rtcMetrics/index.d.ts +54 -0
- package/dist/rtcMetrics/index.js +140 -0
- package/dist/rtcMetrics/index.js.map +1 -0
- package/dist/statsAnalyzer/global.d.ts +1 -83
- package/dist/statsAnalyzer/global.js +2 -85
- package/dist/statsAnalyzer/global.js.map +1 -1
- package/dist/statsAnalyzer/index.d.ts +50 -30
- package/dist/statsAnalyzer/index.js +435 -510
- package/dist/statsAnalyzer/index.js.map +1 -1
- package/dist/statsAnalyzer/mqaUtil.d.ts +8 -6
- package/dist/statsAnalyzer/mqaUtil.js +120 -83
- package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
- package/dist/transcription/index.js +1 -2
- package/dist/transcription/index.js.map +1 -1
- package/dist/webinar/collection.d.ts +16 -0
- package/dist/webinar/collection.js +43 -0
- package/dist/webinar/collection.js.map +1 -0
- package/dist/webinar/index.d.ts +5 -0
- package/dist/webinar/index.js +68 -0
- package/dist/webinar/index.js.map +1 -0
- package/package.json +38 -26
- package/src/annotation/annotation.types.ts +50 -0
- package/src/annotation/constants.ts +36 -0
- package/src/annotation/index.ts +328 -0
- package/src/breakouts/README.md +220 -0
- package/src/breakouts/breakout.ts +188 -0
- package/src/breakouts/collection.ts +19 -0
- package/src/breakouts/edit-lock-error.ts +25 -0
- package/src/breakouts/events.ts +56 -0
- package/src/breakouts/index.ts +925 -0
- package/src/breakouts/request.ts +55 -0
- package/src/breakouts/utils.ts +57 -0
- package/src/common/errors/no-meeting-info.ts +24 -0
- package/src/common/errors/webex-errors.ts +36 -12
- package/src/common/logs/logger-proxy.ts +1 -1
- package/src/common/logs/request.ts +5 -1
- package/src/common/queue.ts +22 -8
- package/src/config.ts +6 -7
- package/src/constants.ts +244 -97
- package/src/controls-options-manager/enums.ts +12 -0
- package/src/controls-options-manager/index.ts +116 -21
- package/src/controls-options-manager/types.ts +59 -0
- package/src/controls-options-manager/util.ts +294 -14
- package/src/index.ts +44 -0
- package/src/interceptors/index.ts +3 -0
- package/src/interceptors/locusRetry.ts +67 -0
- package/src/interpretation/README.md +60 -0
- package/src/interpretation/collection.ts +19 -0
- package/src/interpretation/index.ts +332 -0
- package/src/interpretation/siLanguage.ts +18 -0
- package/src/locus-info/controlsUtils.ts +110 -0
- package/src/locus-info/index.ts +449 -61
- package/src/locus-info/infoUtils.ts +14 -2
- package/src/locus-info/mediaSharesUtils.ts +64 -0
- package/src/locus-info/parser.ts +258 -47
- package/src/locus-info/selfUtils.ts +85 -2
- package/src/media/index.ts +153 -370
- package/src/media/properties.ts +106 -136
- package/src/media/util.ts +0 -21
- package/src/mediaQualityMetrics/config.ts +244 -377
- package/src/meeting/in-meeting-actions.ts +176 -0
- package/src/meeting/index.ts +3944 -2489
- package/src/meeting/locusMediaRequest.ts +313 -0
- package/src/meeting/muteState.ts +224 -138
- package/src/meeting/request.ts +207 -127
- package/src/meeting/request.type.ts +13 -0
- package/src/meeting/util.ts +590 -423
- package/src/meeting-info/index.ts +81 -8
- package/src/meeting-info/meeting-info-v2.ts +163 -13
- package/src/meeting-info/util.ts +1 -1
- package/src/meeting-info/utilv2.ts +28 -28
- package/src/meetings/collection.ts +33 -0
- package/src/meetings/index.ts +487 -126
- package/src/meetings/meetings.types.ts +12 -0
- package/src/meetings/request.ts +2 -0
- package/src/meetings/util.ts +116 -5
- package/src/member/index.ts +43 -1
- package/src/member/types.ts +38 -0
- package/src/member/util.ts +125 -28
- package/src/members/collection.ts +8 -0
- package/src/members/index.ts +187 -52
- package/src/members/request.ts +87 -27
- package/src/members/util.ts +332 -291
- package/src/metrics/constants.ts +15 -6
- package/src/metrics/index.ts +1 -471
- package/src/multistream/mediaRequestManager.ts +440 -0
- package/src/multistream/receiveSlot.ts +184 -0
- package/src/multistream/receiveSlotManager.ts +166 -0
- package/src/multistream/remoteMedia.ts +254 -0
- package/src/multistream/remoteMediaGroup.ts +284 -0
- package/src/multistream/remoteMediaManager.ts +1145 -0
- package/src/multistream/sendSlotManager.ts +170 -0
- package/src/networkQualityMonitor/index.ts +6 -6
- package/src/reachability/clusterReachability.ts +320 -0
- package/src/reachability/index.ts +243 -347
- package/src/reachability/request.ts +17 -8
- package/src/reachability/util.ts +24 -0
- package/src/reactions/constants.ts +4 -0
- package/src/reactions/reactions.ts +4 -4
- package/src/reactions/reactions.type.ts +30 -4
- package/src/reconnection-manager/index.ts +168 -156
- package/src/recording-controller/index.ts +20 -3
- package/src/recording-controller/util.ts +26 -9
- package/src/roap/index.ts +98 -241
- package/src/roap/request.ts +74 -148
- package/src/roap/turnDiscovery.ts +62 -56
- package/src/rtcMetrics/constants.ts +3 -0
- package/src/rtcMetrics/index.ts +124 -0
- package/src/statsAnalyzer/global.ts +1 -84
- package/src/statsAnalyzer/index.ts +477 -643
- package/src/statsAnalyzer/mqaUtil.ts +115 -114
- package/src/webinar/collection.ts +31 -0
- package/src/webinar/index.ts +62 -0
- package/test/integration/spec/converged-space-meetings.js +233 -0
- package/test/integration/spec/journey.js +320 -264
- package/test/integration/spec/space-meeting.js +77 -4
- package/test/unit/spec/annotation/index.ts +418 -0
- package/test/unit/spec/breakouts/breakout.ts +237 -0
- package/test/unit/spec/breakouts/collection.ts +15 -0
- package/test/unit/spec/breakouts/edit-lock-error.ts +30 -0
- package/test/unit/spec/breakouts/events.ts +89 -0
- package/test/unit/spec/breakouts/index.ts +1790 -0
- package/test/unit/spec/breakouts/request.ts +104 -0
- package/test/unit/spec/breakouts/utils.js +72 -0
- package/test/unit/spec/common/queue.js +31 -2
- package/test/unit/spec/controls-options-manager/index.js +163 -0
- package/test/unit/spec/controls-options-manager/util.js +576 -60
- package/test/unit/spec/fixture/locus.js +1 -0
- package/test/unit/spec/interceptors/locusRetry.ts +131 -0
- package/test/unit/spec/interpretation/collection.ts +15 -0
- package/test/unit/spec/interpretation/index.ts +589 -0
- package/test/unit/spec/interpretation/siLanguage.ts +28 -0
- package/test/unit/spec/locus-info/controlsUtils.js +323 -30
- package/test/unit/spec/locus-info/index.js +1390 -16
- package/test/unit/spec/locus-info/infoUtils.js +54 -16
- package/test/unit/spec/locus-info/lib/SeqCmp.json +16 -0
- package/test/unit/spec/locus-info/lib/selfConstant.js +48 -0
- package/test/unit/spec/locus-info/mediaSharesUtils.ts +32 -0
- package/test/unit/spec/locus-info/parser.js +116 -35
- package/test/unit/spec/locus-info/selfUtils.js +275 -0
- package/test/unit/spec/media/index.ts +290 -0
- package/test/unit/spec/media/properties.ts +75 -84
- package/test/unit/spec/meeting/in-meeting-actions.ts +86 -0
- package/test/unit/spec/meeting/index.js +8187 -2769
- package/test/unit/spec/meeting/locusMediaRequest.ts +442 -0
- package/test/unit/spec/meeting/muteState.js +409 -213
- package/test/unit/spec/meeting/request.js +512 -42
- package/test/unit/spec/meeting/utils.js +741 -24
- package/test/unit/spec/meeting-info/index.js +300 -0
- package/test/unit/spec/meeting-info/meetinginfov2.js +527 -5
- package/test/unit/spec/meeting-info/utilv2.js +21 -0
- package/test/unit/spec/meetings/collection.js +26 -0
- package/test/unit/spec/meetings/index.js +1313 -243
- package/test/unit/spec/meetings/utils.js +202 -2
- package/test/unit/spec/member/index.js +32 -9
- package/test/unit/spec/member/util.js +499 -61
- package/test/unit/spec/members/index.js +394 -5
- package/test/unit/spec/members/request.js +206 -27
- package/test/unit/spec/members/utils.js +173 -38
- package/test/unit/spec/metrics/index.js +1 -50
- package/test/unit/spec/multistream/mediaRequestManager.ts +1418 -0
- package/test/unit/spec/multistream/receiveSlot.ts +163 -0
- package/test/unit/spec/multistream/receiveSlotManager.ts +203 -0
- package/test/unit/spec/multistream/remoteMedia.ts +255 -0
- package/test/unit/spec/multistream/remoteMediaGroup.ts +662 -0
- package/test/unit/spec/multistream/remoteMediaManager.ts +1924 -0
- package/test/unit/spec/multistream/sendSlotManager.ts +242 -0
- package/test/unit/spec/networkQualityMonitor/index.js +4 -4
- package/test/unit/spec/reachability/clusterReachability.ts +279 -0
- package/test/unit/spec/reachability/index.ts +531 -24
- package/test/unit/spec/reachability/request.js +68 -0
- package/test/unit/spec/reachability/util.ts +40 -0
- package/test/unit/spec/reconnection-manager/index.js +162 -24
- package/test/unit/spec/recording-controller/index.js +293 -218
- package/test/unit/spec/recording-controller/util.js +223 -96
- package/test/unit/spec/roap/index.ts +200 -76
- package/test/unit/spec/roap/request.ts +255 -0
- package/test/unit/spec/roap/turnDiscovery.ts +86 -48
- package/test/unit/spec/rtcMetrics/index.ts +93 -0
- package/test/unit/spec/stats-analyzer/index.js +261 -167
- package/test/unit/spec/webinar/collection.ts +13 -0
- package/test/unit/spec/webinar/index.ts +60 -0
- package/test/utils/constants.js +9 -0
- package/test/utils/integrationTestUtils.js +46 -0
- package/test/utils/testUtils.js +0 -45
- package/test/utils/webex-config.js +4 -0
- package/test/utils/webex-test-users.js +7 -3
- package/dist/common/errors/reclaim-host-role-error.js.map +0 -1
- package/dist/meeting/effectsState.d.ts +0 -42
- package/dist/meeting/effectsState.js +0 -260
- package/dist/meeting/effectsState.js.map +0 -1
- package/dist/metrics/config.d.ts +0 -169
- package/dist/metrics/config.js +0 -289
- package/dist/metrics/config.js.map +0 -1
- package/dist/peer-connection-manager/index.d.ts +0 -6
- package/dist/peer-connection-manager/index.js +0 -671
- package/dist/peer-connection-manager/index.js.map +0 -1
- package/dist/peer-connection-manager/util.d.ts +0 -6
- package/dist/peer-connection-manager/util.js +0 -110
- package/dist/peer-connection-manager/util.js.map +0 -1
- package/dist/roap/collection.d.ts +0 -10
- package/dist/roap/collection.js +0 -63
- package/dist/roap/collection.js.map +0 -1
- package/dist/roap/handler.d.ts +0 -47
- package/dist/roap/handler.js +0 -279
- package/dist/roap/handler.js.map +0 -1
- package/dist/roap/state.d.ts +0 -9
- package/dist/roap/state.js +0 -127
- package/dist/roap/state.js.map +0 -1
- package/dist/roap/util.d.ts +0 -2
- package/dist/roap/util.js +0 -76
- package/dist/roap/util.js.map +0 -1
- package/src/index.js +0 -15
- package/src/meeting/effectsState.ts +0 -209
- package/src/metrics/config.ts +0 -485
- package/src/peer-connection-manager/index.ts +0 -847
- package/src/peer-connection-manager/util.ts +0 -119
- package/src/roap/collection.ts +0 -62
- package/src/roap/handler.ts +0 -294
- package/src/roap/state.ts +0 -156
- package/src/roap/util.ts +0 -100
- package/test/unit/spec/meeting/effectsState.js +0 -281
- package/test/unit/spec/peerconnection-manager/index.js +0 -218
- package/test/unit/spec/peerconnection-manager/utils.js +0 -49
- package/test/unit/spec/peerconnection-manager/utils.test-fixtures.ts +0 -388
- package/test/unit/spec/roap/util.js +0 -30
- /package/dist/common/errors/{reclaim-host-role-error.d.ts → reclaim-host-role-errors.d.ts} +0 -0
- /package/src/common/errors/{reclaim-host-role-error.ts → reclaim-host-role-errors.ts} +0 -0
package/src/roap/request.ts
CHANGED
|
@@ -1,118 +1,45 @@
|
|
|
1
|
-
/* global window */
|
|
2
1
|
// @ts-ignore
|
|
3
2
|
import {StatelessWebexPlugin} from '@webex/webex-core';
|
|
4
3
|
|
|
5
4
|
import LoggerProxy from '../common/logs/logger-proxy';
|
|
6
|
-
import {
|
|
7
|
-
import
|
|
8
|
-
|
|
9
|
-
import ParameterError from '../common/errors/parameter';
|
|
5
|
+
import {IP_VERSION, REACHABILITY} from '../constants';
|
|
6
|
+
import {LocusMediaRequest} from '../meeting/locusMediaRequest';
|
|
7
|
+
|
|
10
8
|
/**
|
|
11
9
|
* @class RoapRequest
|
|
12
10
|
*/
|
|
13
11
|
export default class RoapRequest extends StatelessWebexPlugin {
|
|
14
12
|
/**
|
|
15
|
-
*
|
|
16
|
-
* @param {Object}
|
|
17
|
-
* @returns {
|
|
13
|
+
* Returns reachability data.
|
|
14
|
+
* @param {Object} localSdp
|
|
15
|
+
* @returns {Object}
|
|
18
16
|
*/
|
|
17
|
+
async attachReachabilityData(localSdp) {
|
|
18
|
+
let joinCookie;
|
|
19
19
|
|
|
20
|
-
|
|
21
|
-
const
|
|
20
|
+
// @ts-ignore
|
|
21
|
+
const reachabilityResult = await this.webex.meetings.reachability.getReachabilityResults();
|
|
22
22
|
|
|
23
|
-
if (
|
|
24
|
-
|
|
25
|
-
|
|
23
|
+
if (reachabilityResult && Object.keys(reachabilityResult).length) {
|
|
24
|
+
localSdp.reachability = reachabilityResult;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
// @ts-ignore
|
|
28
|
+
const joinCookieRaw = await this.webex.boundedStorage
|
|
29
|
+
.get(REACHABILITY.namespace, REACHABILITY.localStorageJoinCookie)
|
|
30
|
+
.catch(() => {});
|
|
26
31
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
}
|
|
32
|
+
if (joinCookieRaw) {
|
|
33
|
+
try {
|
|
34
|
+
joinCookie = JSON.parse(joinCookieRaw);
|
|
31
35
|
} catch (e) {
|
|
32
36
|
LoggerProxy.logger.error(
|
|
33
|
-
`
|
|
37
|
+
`MeetingRequest#constructor --> Error in parsing join cookie data: ${e}`
|
|
34
38
|
);
|
|
35
39
|
}
|
|
36
40
|
}
|
|
37
41
|
|
|
38
|
-
return localSdp;
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
joinMeetingWithRoap(options) {
|
|
42
|
-
LoggerProxy.logger.info('Roap:request#joinMeetingWithRoap --> Join locus with roap');
|
|
43
|
-
LoggerProxy.logger.info(
|
|
44
|
-
`Roap:request#joinMeetingWithRoap --> Local SDP: ${options.roapMessage}`
|
|
45
|
-
);
|
|
46
|
-
|
|
47
|
-
return Promise.resolve().then(async () => {
|
|
48
|
-
// @ts-ignore
|
|
49
|
-
const deviceUrl = this.webex.internal.device.url;
|
|
50
|
-
let url = '';
|
|
51
|
-
|
|
52
|
-
const body: any = {
|
|
53
|
-
deviceUrl,
|
|
54
|
-
usingResource: options.resourceId || null,
|
|
55
|
-
correlationId: options.correlationId,
|
|
56
|
-
localMedias: [
|
|
57
|
-
{
|
|
58
|
-
localSdp: JSON.stringify(
|
|
59
|
-
this.attachRechabilityData({
|
|
60
|
-
roapMessage: options.roapMessage,
|
|
61
|
-
audioMuted: false,
|
|
62
|
-
videoMuted: false,
|
|
63
|
-
})
|
|
64
|
-
),
|
|
65
|
-
},
|
|
66
|
-
],
|
|
67
|
-
clientMediaPreferences: {
|
|
68
|
-
preferTranscoding: options.preferTranscoding ?? true,
|
|
69
|
-
},
|
|
70
|
-
};
|
|
71
|
-
|
|
72
|
-
if (options.locusUrl) {
|
|
73
|
-
url = `${options.locusUrl}/${PARTICIPANT}`;
|
|
74
|
-
} else if (options.sipUrl) {
|
|
75
|
-
try {
|
|
76
|
-
// @ts-ignore
|
|
77
|
-
await this.webex.internal.services.waitForCatalog('postauth');
|
|
78
|
-
// @ts-ignore
|
|
79
|
-
url = `${this.webex.internal.services.get('locus')}/${LOCI}/${CALL}`;
|
|
80
|
-
body.invitee = {
|
|
81
|
-
address: options.sipTarget,
|
|
82
|
-
};
|
|
83
|
-
} catch (e) {
|
|
84
|
-
LoggerProxy.logger.error(`Roap:request#joinMeetingWithRoap --> ${e}`);
|
|
85
|
-
throw e;
|
|
86
|
-
}
|
|
87
|
-
} else {
|
|
88
|
-
throw new ParameterError('Must provide a locusUrl or sipTarget');
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
// @ts-ignore
|
|
92
|
-
return this.webex
|
|
93
|
-
.request({
|
|
94
|
-
method: HTTP_VERBS.POST,
|
|
95
|
-
uri: url,
|
|
96
|
-
body,
|
|
97
|
-
})
|
|
98
|
-
.then((res) => {
|
|
99
|
-
const {locus} = res.body;
|
|
100
|
-
|
|
101
|
-
locus.roapSeq = options.roapMessage.seq;
|
|
102
|
-
locus.id = locus.url.split('/').pop();
|
|
103
|
-
LoggerProxy.logger.info(
|
|
104
|
-
`Roap:request#joinMeetingWithRoap --> Joined locus [${locus.id}][${locus.fullState.lastActive}]`
|
|
105
|
-
);
|
|
106
|
-
|
|
107
|
-
return locus;
|
|
108
|
-
})
|
|
109
|
-
.catch((err) => {
|
|
110
|
-
LoggerProxy.logger.error(
|
|
111
|
-
`Roap:request#joinMeetingWithRoap --> failed with error: ${err}`
|
|
112
|
-
);
|
|
113
|
-
throw err;
|
|
114
|
-
});
|
|
115
|
-
});
|
|
42
|
+
return {localSdp, joinCookie};
|
|
116
43
|
}
|
|
117
44
|
|
|
118
45
|
/**
|
|
@@ -122,78 +49,74 @@ export default class RoapRequest extends StatelessWebexPlugin {
|
|
|
122
49
|
* @param {String} options.locusSelfUrl
|
|
123
50
|
* @param {String} options.mediaId
|
|
124
51
|
* @param {String} options.correlationId
|
|
125
|
-
* @param {Boolean} options.audioMuted
|
|
126
|
-
* @param {Boolean} options.videoMuted
|
|
127
52
|
* @param {String} options.meetingId
|
|
53
|
+
* @param {IP_VERSION} options.ipVersion only required for offers
|
|
128
54
|
* @returns {Promise} returns the response/failure of the request
|
|
129
55
|
*/
|
|
130
|
-
sendRoap(options: {
|
|
56
|
+
async sendRoap(options: {
|
|
131
57
|
roapMessage: any;
|
|
132
58
|
locusSelfUrl: string;
|
|
133
59
|
mediaId: string;
|
|
134
|
-
correlationId: string;
|
|
135
|
-
audioMuted: boolean;
|
|
136
|
-
videoMuted: boolean;
|
|
137
60
|
meetingId: string;
|
|
138
|
-
|
|
61
|
+
ipVersion?: IP_VERSION;
|
|
62
|
+
locusMediaRequest?: LocusMediaRequest;
|
|
63
|
+
audioMuted?: boolean;
|
|
64
|
+
videoMuted?: boolean;
|
|
139
65
|
}) {
|
|
140
|
-
const {roapMessage, locusSelfUrl, mediaId,
|
|
66
|
+
const {roapMessage, locusSelfUrl, mediaId, meetingId, locusMediaRequest, ipVersion} = options;
|
|
141
67
|
|
|
142
68
|
if (!mediaId) {
|
|
143
|
-
LoggerProxy.logger.info('Roap:request#sendRoap -->
|
|
69
|
+
LoggerProxy.logger.info('Roap:request#sendRoap --> sending empty mediaID');
|
|
144
70
|
}
|
|
145
71
|
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
72
|
+
if (!locusMediaRequest) {
|
|
73
|
+
LoggerProxy.logger.warn(
|
|
74
|
+
'Roap:request#sendRoap --> locusMediaRequest unavailable, not sending roap'
|
|
75
|
+
);
|
|
76
|
+
|
|
77
|
+
return Promise.reject(new Error('sendRoap called when locusMediaRequest is undefined'));
|
|
78
|
+
}
|
|
79
|
+
const {localSdp: localSdpWithReachabilityData, joinCookie} = await this.attachReachabilityData({
|
|
80
|
+
roapMessage,
|
|
81
|
+
});
|
|
149
82
|
|
|
150
83
|
LoggerProxy.logger.info(
|
|
151
|
-
`Roap:request#sendRoap --> ${
|
|
84
|
+
`Roap:request#sendRoap --> ${locusSelfUrl} \n ${roapMessage.messageType} \n seq:${roapMessage.seq}`
|
|
152
85
|
);
|
|
153
86
|
|
|
154
|
-
Metrics.postEvent({event: eventType.MEDIA_REQUEST, meetingId});
|
|
155
|
-
|
|
156
87
|
// @ts-ignore
|
|
157
|
-
|
|
158
|
-
.request
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
// eslint-disable-next-line no-warning-comments
|
|
174
|
-
// TODO: check whats the need for video and audiomute
|
|
175
|
-
audioMuted: !!options.audioMuted,
|
|
176
|
-
videoMuted: !!options.videoMuted,
|
|
177
|
-
})
|
|
178
|
-
),
|
|
179
|
-
mediaId: options.mediaId,
|
|
180
|
-
},
|
|
181
|
-
],
|
|
182
|
-
clientMediaPreferences: {
|
|
183
|
-
preferTranscoding: options.preferTranscoding ?? true,
|
|
184
|
-
},
|
|
185
|
-
},
|
|
88
|
+
this.webex.internal.newMetrics.submitClientEvent({
|
|
89
|
+
name: 'client.locus.media.request',
|
|
90
|
+
options: {
|
|
91
|
+
meetingId,
|
|
92
|
+
},
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
return locusMediaRequest
|
|
96
|
+
.send({
|
|
97
|
+
type: 'RoapMessage',
|
|
98
|
+
selfUrl: locusSelfUrl,
|
|
99
|
+
joinCookie,
|
|
100
|
+
mediaId,
|
|
101
|
+
roapMessage,
|
|
102
|
+
reachability: localSdpWithReachabilityData.reachability,
|
|
103
|
+
ipVersion,
|
|
186
104
|
})
|
|
187
105
|
.then((res) => {
|
|
188
|
-
|
|
189
|
-
|
|
106
|
+
// @ts-ignore
|
|
107
|
+
this.webex.internal.newMetrics.submitClientEvent({
|
|
108
|
+
name: 'client.locus.media.response',
|
|
109
|
+
options: {
|
|
110
|
+
meetingId,
|
|
111
|
+
},
|
|
112
|
+
});
|
|
190
113
|
// always it will be the first mediaConnection Object
|
|
191
114
|
const mediaConnections =
|
|
192
115
|
res.body.mediaConnections &&
|
|
193
116
|
res.body.mediaConnections.length > 0 &&
|
|
194
117
|
res.body.mediaConnections[0];
|
|
195
118
|
|
|
196
|
-
LoggerProxy.logger.
|
|
119
|
+
LoggerProxy.logger.debug(
|
|
197
120
|
`Roap:request#sendRoap --> response:${JSON.stringify(
|
|
198
121
|
mediaConnections,
|
|
199
122
|
null,
|
|
@@ -202,7 +125,7 @@ export default class RoapRequest extends StatelessWebexPlugin {
|
|
|
202
125
|
);
|
|
203
126
|
const {locus} = res.body;
|
|
204
127
|
|
|
205
|
-
locus.roapSeq =
|
|
128
|
+
locus.roapSeq = roapMessage.seq;
|
|
206
129
|
|
|
207
130
|
return {
|
|
208
131
|
locus,
|
|
@@ -210,10 +133,13 @@ export default class RoapRequest extends StatelessWebexPlugin {
|
|
|
210
133
|
};
|
|
211
134
|
})
|
|
212
135
|
.catch((err) => {
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
136
|
+
// @ts-ignore
|
|
137
|
+
this.webex.internal.newMetrics.submitClientEvent({
|
|
138
|
+
name: 'client.locus.media.response',
|
|
139
|
+
options: {
|
|
140
|
+
meetingId,
|
|
141
|
+
rawError: err,
|
|
142
|
+
},
|
|
217
143
|
});
|
|
218
144
|
LoggerProxy.logger.error(`Roap:request#sendRoap --> Error:${JSON.stringify(err, null, 2)}`);
|
|
219
145
|
LoggerProxy.logger.error(
|
|
@@ -8,9 +8,16 @@ import {ROAP} from '../constants';
|
|
|
8
8
|
|
|
9
9
|
import RoapRequest from './request';
|
|
10
10
|
import Meeting from '../meeting';
|
|
11
|
+
import MeetingUtil from '../meeting/util';
|
|
11
12
|
|
|
12
13
|
const TURN_DISCOVERY_TIMEOUT = 10; // in seconds
|
|
13
14
|
|
|
15
|
+
// Roap spec says that seq should start from 1, but TURN discovery works fine with seq=0
|
|
16
|
+
// and this is handy for us, because TURN discovery is always done before the first SDP exchange,
|
|
17
|
+
// so we can do it with seq=0 or not do it at all and then we create the RoapMediaConnection
|
|
18
|
+
// and do the SDP offer with seq=1
|
|
19
|
+
const TURN_DISCOVERY_SEQ = 0;
|
|
20
|
+
|
|
14
21
|
/**
|
|
15
22
|
* Handles the process of finding out TURN server information from Linus.
|
|
16
23
|
* This is achieved by sending a TURN_DISCOVERY_REQUEST.
|
|
@@ -146,9 +153,7 @@ export default class TurnDiscovery {
|
|
|
146
153
|
* @private
|
|
147
154
|
* @memberof Roap
|
|
148
155
|
*/
|
|
149
|
-
|
|
150
|
-
const seq = meeting.roapSeq + 1;
|
|
151
|
-
|
|
156
|
+
sendRoapTurnDiscoveryRequest(meeting: Meeting, isReconnecting: boolean) {
|
|
152
157
|
if (this.defer) {
|
|
153
158
|
LoggerProxy.logger.warn(
|
|
154
159
|
'Roap:turnDiscovery#sendRoapTurnDiscoveryRequest --> already in progress'
|
|
@@ -162,7 +167,7 @@ export default class TurnDiscovery {
|
|
|
162
167
|
const roapMessage = {
|
|
163
168
|
messageType: ROAP.ROAP_TYPES.TURN_DISCOVERY_REQUEST,
|
|
164
169
|
version: ROAP.ROAP_VERSION,
|
|
165
|
-
seq,
|
|
170
|
+
seq: TURN_DISCOVERY_SEQ,
|
|
166
171
|
};
|
|
167
172
|
|
|
168
173
|
LoggerProxy.logger.info(
|
|
@@ -172,7 +177,6 @@ export default class TurnDiscovery {
|
|
|
172
177
|
return this.roapRequest
|
|
173
178
|
.sendRoap({
|
|
174
179
|
roapMessage,
|
|
175
|
-
correlationId: meeting.correlationId,
|
|
176
180
|
// @ts-ignore - Fix missing type
|
|
177
181
|
locusSelfUrl: meeting.selfUrl,
|
|
178
182
|
// @ts-ignore - Fix missing type
|
|
@@ -180,10 +184,11 @@ export default class TurnDiscovery {
|
|
|
180
184
|
audioMuted: meeting.audio?.isLocallyMuted(),
|
|
181
185
|
videoMuted: meeting.video?.isLocallyMuted(),
|
|
182
186
|
meetingId: meeting.id,
|
|
187
|
+
locusMediaRequest: meeting.locusMediaRequest,
|
|
188
|
+
// @ts-ignore - because of meeting.webex
|
|
189
|
+
ipVersion: MeetingUtil.getIpVersion(meeting.webex),
|
|
183
190
|
})
|
|
184
191
|
.then(({mediaConnections}) => {
|
|
185
|
-
meeting.setRoapSeq(seq);
|
|
186
|
-
|
|
187
192
|
if (mediaConnections) {
|
|
188
193
|
meeting.updateMediaConnections(mediaConnections);
|
|
189
194
|
}
|
|
@@ -204,19 +209,53 @@ export default class TurnDiscovery {
|
|
|
204
209
|
roapMessage: {
|
|
205
210
|
messageType: ROAP.ROAP_TYPES.OK,
|
|
206
211
|
version: ROAP.ROAP_VERSION,
|
|
207
|
-
seq:
|
|
212
|
+
seq: TURN_DISCOVERY_SEQ,
|
|
208
213
|
},
|
|
209
214
|
// @ts-ignore - fix type
|
|
210
215
|
locusSelfUrl: meeting.selfUrl,
|
|
211
216
|
// @ts-ignore - fix type
|
|
212
217
|
mediaId: meeting.mediaId,
|
|
213
|
-
|
|
218
|
+
meetingId: meeting.id,
|
|
214
219
|
audioMuted: meeting.audio?.isLocallyMuted(),
|
|
215
220
|
videoMuted: meeting.video?.isLocallyMuted(),
|
|
216
|
-
|
|
221
|
+
locusMediaRequest: meeting.locusMediaRequest,
|
|
217
222
|
});
|
|
218
223
|
}
|
|
219
224
|
|
|
225
|
+
/**
|
|
226
|
+
* Gets the reason why reachability is skipped.
|
|
227
|
+
*
|
|
228
|
+
* @param {Meeting} meeting
|
|
229
|
+
* @returns {Promise<string>} Promise with empty string if reachability is not skipped or a reason if it is skipped
|
|
230
|
+
*/
|
|
231
|
+
private async getSkipReason(meeting: Meeting): Promise<string> {
|
|
232
|
+
const isAnyPublicClusterReachable =
|
|
233
|
+
// @ts-ignore - fix type
|
|
234
|
+
await meeting.webex.meetings.reachability.isAnyPublicClusterReachable();
|
|
235
|
+
|
|
236
|
+
if (isAnyPublicClusterReachable) {
|
|
237
|
+
LoggerProxy.logger.info(
|
|
238
|
+
'Roap:turnDiscovery#getSkipReason --> reachability has not failed, skipping TURN discovery'
|
|
239
|
+
);
|
|
240
|
+
|
|
241
|
+
return 'reachability';
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
return '';
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
/**
|
|
248
|
+
* Checks if TURN discovery is skipped.
|
|
249
|
+
*
|
|
250
|
+
* @param {Meeting} meeting
|
|
251
|
+
* @returns {Boolean} true if TURN discovery is being skipped, false if it is being done
|
|
252
|
+
*/
|
|
253
|
+
async isSkipped(meeting) {
|
|
254
|
+
const skipReason = await this.getSkipReason(meeting);
|
|
255
|
+
|
|
256
|
+
return !!skipReason;
|
|
257
|
+
}
|
|
258
|
+
|
|
220
259
|
/**
|
|
221
260
|
* Retrieves TURN server information from the backend by doing
|
|
222
261
|
* a roap message exchange:
|
|
@@ -225,13 +264,22 @@ export default class TurnDiscovery {
|
|
|
225
264
|
* | <----TURN_DISCOVERY_RESPONSE----- |
|
|
226
265
|
* | --------------OK----------------> |
|
|
227
266
|
*
|
|
267
|
+
* This TURN discovery roap exchange is always done with seq=0.
|
|
268
|
+
* The RoapMediaConnection SDP exchange always starts with seq=1,
|
|
269
|
+
* so it works fine no matter if TURN discovery is done or not.
|
|
270
|
+
*
|
|
228
271
|
* @param {Meeting} meeting
|
|
229
|
-
* @param {Boolean} isReconnecting should be set to true if this is a new
|
|
272
|
+
* @param {Boolean} [isReconnecting] should be set to true if this is a new
|
|
230
273
|
* media connection just after a reconnection
|
|
274
|
+
* @param {Boolean} [isForced]
|
|
231
275
|
* @returns {Promise}
|
|
232
276
|
*/
|
|
233
|
-
async doTurnDiscovery(meeting: Meeting, isReconnecting?: boolean) {
|
|
234
|
-
|
|
277
|
+
async doTurnDiscovery(meeting: Meeting, isReconnecting?: boolean, isForced?: boolean) {
|
|
278
|
+
let turnDiscoverySkippedReason: string;
|
|
279
|
+
|
|
280
|
+
if (!isForced) {
|
|
281
|
+
turnDiscoverySkippedReason = await this.getSkipReason(meeting);
|
|
282
|
+
}
|
|
235
283
|
|
|
236
284
|
if (turnDiscoverySkippedReason) {
|
|
237
285
|
return {
|
|
@@ -263,49 +311,7 @@ export default class TurnDiscovery {
|
|
|
263
311
|
stack: e.stack,
|
|
264
312
|
});
|
|
265
313
|
|
|
266
|
-
return
|
|
314
|
+
return {turnServerInfo: undefined, turnDiscoverySkippedReason: undefined};
|
|
267
315
|
});
|
|
268
316
|
}
|
|
269
|
-
|
|
270
|
-
/**
|
|
271
|
-
* Gets the reason why reachability is skipped.
|
|
272
|
-
*
|
|
273
|
-
* @param {Meeting} meeting
|
|
274
|
-
* @returns {Promise<string>} Promise with empty string if reachability is not skipped or a reason if it is skipped
|
|
275
|
-
*/
|
|
276
|
-
private async getSkipReason(meeting: Meeting): Promise<string> {
|
|
277
|
-
// @ts-ignore - fix type
|
|
278
|
-
const isAnyClusterReachable = await meeting.webex.meetings.reachability.isAnyClusterReachable();
|
|
279
|
-
|
|
280
|
-
if (isAnyClusterReachable) {
|
|
281
|
-
LoggerProxy.logger.info(
|
|
282
|
-
'Roap:turnDiscovery#getSkipReason --> reachability has not failed, skipping TURN discovery'
|
|
283
|
-
);
|
|
284
|
-
|
|
285
|
-
return 'reachability';
|
|
286
|
-
}
|
|
287
|
-
|
|
288
|
-
// @ts-ignore - fix type
|
|
289
|
-
if (!meeting.config.experimental.enableTurnDiscovery) {
|
|
290
|
-
LoggerProxy.logger.info(
|
|
291
|
-
'Roap:turnDiscovery#getSkipReason --> TURN discovery disabled in config, skipping it'
|
|
292
|
-
);
|
|
293
|
-
|
|
294
|
-
return 'config';
|
|
295
|
-
}
|
|
296
|
-
|
|
297
|
-
return '';
|
|
298
|
-
}
|
|
299
|
-
|
|
300
|
-
/**
|
|
301
|
-
* Checks if TURN discovery is skipped.
|
|
302
|
-
*
|
|
303
|
-
* @param {Meeting} meeting
|
|
304
|
-
* @returns {Boolean} true if TURN discovery is being skipped, false if it is being done
|
|
305
|
-
*/
|
|
306
|
-
async isSkipped(meeting) {
|
|
307
|
-
const skipReason = await this.getSkipReason(meeting);
|
|
308
|
-
|
|
309
|
-
return !!skipReason;
|
|
310
|
-
}
|
|
311
317
|
}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
/* eslint-disable class-methods-use-this */
|
|
2
|
+
import {CallDiagnosticUtils} from '@webex/internal-plugin-metrics';
|
|
3
|
+
import RTC_METRICS from './constants';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Rtc Metrics
|
|
7
|
+
*/
|
|
8
|
+
export default class RtcMetrics {
|
|
9
|
+
/**
|
|
10
|
+
* Array of MetricData items to be sent to the metrics service.
|
|
11
|
+
*/
|
|
12
|
+
metricsQueue = [];
|
|
13
|
+
|
|
14
|
+
intervalId: number;
|
|
15
|
+
|
|
16
|
+
webex: any;
|
|
17
|
+
|
|
18
|
+
meetingId: string;
|
|
19
|
+
|
|
20
|
+
correlationId: string;
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Initialize the interval.
|
|
24
|
+
*
|
|
25
|
+
* @param {object} webex - The main `webex` object.
|
|
26
|
+
* @param {string} meetingId - The meeting id.
|
|
27
|
+
* @param {string} correlationId - The correlation id.
|
|
28
|
+
*/
|
|
29
|
+
constructor(webex, meetingId, correlationId) {
|
|
30
|
+
// `window` is used to prevent typescript from returning a NodeJS.Timer.
|
|
31
|
+
this.intervalId = window.setInterval(this.sendMetricsInQueue.bind(this), 30 * 1000);
|
|
32
|
+
this.meetingId = meetingId;
|
|
33
|
+
this.webex = webex;
|
|
34
|
+
this.correlationId = correlationId;
|
|
35
|
+
// Send the first set of metrics at 5 seconds in the case of a user leaving the call shortly after joining.
|
|
36
|
+
setTimeout(this.sendMetricsInQueue.bind(this), 5 * 1000);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Check to see if the metrics queue has any items.
|
|
41
|
+
*
|
|
42
|
+
* @returns {void}
|
|
43
|
+
*/
|
|
44
|
+
public sendMetricsInQueue() {
|
|
45
|
+
if (this.metricsQueue.length) {
|
|
46
|
+
this.sendMetrics();
|
|
47
|
+
this.metricsQueue = [];
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Add metrics items to the metrics queue.
|
|
53
|
+
*
|
|
54
|
+
* @param {object} data - An object with a payload array of metrics items.
|
|
55
|
+
*
|
|
56
|
+
* @returns {void}
|
|
57
|
+
*/
|
|
58
|
+
addMetrics(data) {
|
|
59
|
+
if (data.payload.length) {
|
|
60
|
+
if (data.name === 'stats-report') {
|
|
61
|
+
data.payload = data.payload.map(this.anonymizeIp);
|
|
62
|
+
}
|
|
63
|
+
this.metricsQueue.push(data);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Clear the metrics interval.
|
|
69
|
+
*
|
|
70
|
+
* @returns {void}
|
|
71
|
+
*/
|
|
72
|
+
closeMetrics() {
|
|
73
|
+
this.sendMetricsInQueue();
|
|
74
|
+
clearInterval(this.intervalId);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Anonymize IP addresses.
|
|
79
|
+
*
|
|
80
|
+
* @param {array} stats - An RTCStatsReport organized into an array of strings.
|
|
81
|
+
* @returns {string}
|
|
82
|
+
*/
|
|
83
|
+
anonymizeIp(stats: string): string {
|
|
84
|
+
const data = JSON.parse(stats);
|
|
85
|
+
// on local and remote candidates, anonymize the last 4 bits.
|
|
86
|
+
if (data.type === 'local-candidate' || data.type === 'remote-candidate') {
|
|
87
|
+
data.ip = CallDiagnosticUtils.anonymizeIPAddress(data.ip) || undefined;
|
|
88
|
+
data.address = CallDiagnosticUtils.anonymizeIPAddress(data.address) || undefined;
|
|
89
|
+
data.relatedAddress =
|
|
90
|
+
CallDiagnosticUtils.anonymizeIPAddress(data.relatedAddress) || undefined;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
return JSON.stringify(data);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* Send metrics to the metrics service.
|
|
98
|
+
*
|
|
99
|
+
* @returns {void}
|
|
100
|
+
*/
|
|
101
|
+
private sendMetrics() {
|
|
102
|
+
this.webex.request({
|
|
103
|
+
method: 'POST',
|
|
104
|
+
service: 'unifiedTelemetry',
|
|
105
|
+
resource: 'metric/v2',
|
|
106
|
+
headers: {
|
|
107
|
+
type: 'webrtcMedia',
|
|
108
|
+
appId: RTC_METRICS.APP_ID,
|
|
109
|
+
},
|
|
110
|
+
body: {
|
|
111
|
+
metrics: [
|
|
112
|
+
{
|
|
113
|
+
type: 'webrtc',
|
|
114
|
+
version: '1.0.1',
|
|
115
|
+
userId: this.webex.internal.device.userId,
|
|
116
|
+
meetingId: this.meetingId,
|
|
117
|
+
correlationId: this.correlationId,
|
|
118
|
+
data: this.metricsQueue,
|
|
119
|
+
},
|
|
120
|
+
],
|
|
121
|
+
},
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
}
|