@webex/plugin-meetings 3.0.0-beta.7 → 3.0.0-beta.71
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/UPGRADING.md +9 -9
- package/browsers.js +19 -24
- package/dist/breakouts/breakout.js +178 -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/index.js +843 -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 +56 -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/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/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 +6 -41
- 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 +37 -60
- package/dist/common/logs/request.js.map +1 -1
- package/dist/common/queue.js +4 -14
- package/dist/common/queue.js.map +1 -1
- package/dist/config.js +6 -6
- package/dist/config.js.map +1 -1
- package/dist/constants.js +143 -52
- 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 +16 -0
- package/dist/controls-options-manager/enums.js.map +1 -0
- package/dist/controls-options-manager/index.js +261 -0
- package/dist/controls-options-manager/index.js.map +1 -0
- package/dist/controls-options-manager/util.js +39 -0
- package/dist/controls-options-manager/util.js.map +1 -0
- package/dist/index.js +11 -18
- package/dist/index.js.map +1 -1
- package/dist/locus-info/controlsUtils.js +31 -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 +237 -198
- package/dist/locus-info/index.js.map +1 -1
- package/dist/locus-info/infoUtils.js +3 -37
- package/dist/locus-info/infoUtils.js.map +1 -1
- package/dist/locus-info/mediaSharesUtils.js +12 -38
- package/dist/locus-info/mediaSharesUtils.js.map +1 -1
- package/dist/locus-info/parser.js +92 -118
- package/dist/locus-info/parser.js.map +1 -1
- package/dist/locus-info/selfUtils.js +80 -89
- package/dist/locus-info/selfUtils.js.map +1 -1
- package/dist/media/index.js +56 -146
- package/dist/media/index.js.map +1 -1
- package/dist/media/properties.js +83 -117
- 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 +505 -495
- package/dist/mediaQualityMetrics/config.js.map +1 -1
- package/dist/meeting/in-meeting-actions.js +31 -14
- package/dist/meeting/in-meeting-actions.js.map +1 -1
- package/dist/meeting/index.js +2225 -2244
- package/dist/meeting/index.js.map +1 -1
- package/dist/meeting/muteState.js +102 -100
- package/dist/meeting/muteState.js.map +1 -1
- package/dist/meeting/request.js +308 -264
- 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 +63 -217
- package/dist/meeting/util.js.map +1 -1
- package/dist/meeting-info/collection.js +6 -25
- package/dist/meeting-info/collection.js.map +1 -1
- package/dist/meeting-info/index.js +14 -32
- package/dist/meeting-info/index.js.map +1 -1
- package/dist/meeting-info/meeting-info-v2.js +193 -268
- 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 +98 -183
- package/dist/meeting-info/util.js.map +1 -1
- package/dist/meeting-info/utilv2.js +137 -228
- package/dist/meeting-info/utilv2.js.map +1 -1
- package/dist/meetings/collection.js +26 -19
- package/dist/meetings/collection.js.map +1 -1
- package/dist/meetings/index.js +565 -552
- package/dist/meetings/index.js.map +1 -1
- package/dist/meetings/request.js +26 -41
- package/dist/meetings/request.js.map +1 -1
- package/dist/meetings/util.js +151 -155
- package/dist/meetings/util.js.map +1 -1
- package/dist/member/index.js +100 -85
- package/dist/member/index.js.map +1 -1
- package/dist/member/types.js +15 -0
- package/dist/member/types.js.map +1 -0
- package/dist/member/util.js +90 -68
- 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 +152 -204
- package/dist/members/index.js.map +1 -1
- package/dist/members/request.js +35 -39
- 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 +76 -46
- package/dist/members/util.js.map +1 -1
- package/dist/metrics/config.js +4 -14
- package/dist/metrics/config.js.map +1 -1
- package/dist/metrics/constants.js +1 -6
- package/dist/metrics/constants.js.map +1 -1
- package/dist/metrics/index.js +59 -156
- package/dist/metrics/index.js.map +1 -1
- package/dist/multistream/mediaRequestManager.js +116 -52
- 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 +58 -93
- package/dist/multistream/receiveSlotManager.js.map +1 -1
- package/dist/multistream/remoteMedia.js +55 -74
- package/dist/multistream/remoteMedia.js.map +1 -1
- package/dist/multistream/remoteMediaGroup.js +6 -40
- package/dist/multistream/remoteMediaGroup.js.map +1 -1
- package/dist/multistream/remoteMediaManager.js +466 -442
- package/dist/multistream/remoteMediaManager.js.map +1 -1
- 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/index.js +192 -191
- package/dist/reachability/index.js.map +1 -1
- package/dist/reachability/request.js +15 -23
- package/dist/reachability/request.js.map +1 -1
- 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 +342 -460
- 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 +343 -0
- package/dist/recording-controller/index.js.map +1 -0
- package/dist/recording-controller/util.js +63 -0
- package/dist/recording-controller/util.js.map +1 -0
- package/dist/roap/index.js +48 -70
- package/dist/roap/index.js.map +1 -1
- package/dist/roap/request.js +143 -131
- package/dist/roap/request.js.map +1 -1
- package/dist/roap/turnDiscovery.js +91 -98
- package/dist/roap/turnDiscovery.js.map +1 -1
- package/dist/statsAnalyzer/global.js +1 -95
- package/dist/statsAnalyzer/global.js.map +1 -1
- package/dist/statsAnalyzer/index.js +372 -455
- package/dist/statsAnalyzer/index.js.map +1 -1
- package/dist/statsAnalyzer/mqaUtil.js +143 -87
- 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/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/index.d.ts +5 -0
- package/dist/types/breakouts/request.d.ts +22 -0
- package/dist/types/breakouts/utils.d.ts +8 -0
- package/dist/types/common/browser-detection.d.ts +9 -0
- package/dist/types/common/collection.d.ts +48 -0
- package/dist/types/common/config.d.ts +2 -0
- package/dist/types/common/errors/captcha-error.d.ts +15 -0
- package/dist/types/common/errors/intent-to-join.d.ts +16 -0
- package/dist/types/common/errors/join-meeting.d.ts +17 -0
- package/dist/types/common/errors/media.d.ts +15 -0
- package/dist/types/common/errors/parameter.d.ts +15 -0
- package/dist/types/common/errors/password-error.d.ts +15 -0
- package/dist/types/common/errors/permission.d.ts +14 -0
- package/dist/types/common/errors/reconnection-in-progress.d.ts +9 -0
- package/dist/types/common/errors/reconnection.d.ts +15 -0
- package/dist/types/common/errors/stats.d.ts +15 -0
- package/dist/types/common/errors/webex-errors.d.ts +69 -0
- package/dist/types/common/errors/webex-meetings-error.d.ts +20 -0
- package/dist/types/common/events/events-scope.d.ts +17 -0
- package/dist/types/common/events/events.d.ts +12 -0
- package/dist/types/common/events/trigger-proxy.d.ts +2 -0
- package/dist/types/common/events/util.d.ts +2 -0
- package/dist/types/common/logs/logger-config.d.ts +2 -0
- package/dist/types/common/logs/logger-proxy.d.ts +2 -0
- package/dist/types/common/logs/request.d.ts +34 -0
- package/dist/types/common/queue.d.ts +32 -0
- package/dist/types/config.d.ts +77 -0
- package/dist/types/constants.d.ts +944 -0
- package/dist/types/controls-options-manager/constants.d.ts +4 -0
- package/dist/types/controls-options-manager/enums.d.ts +6 -0
- package/dist/types/controls-options-manager/index.d.ts +128 -0
- package/dist/types/controls-options-manager/util.d.ts +9 -0
- package/dist/types/index.d.ts +6 -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 +276 -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 +212 -0
- package/dist/types/locus-info/selfUtils.d.ts +2 -0
- package/dist/types/media/index.d.ts +32 -0
- package/dist/types/media/properties.d.ts +108 -0
- package/dist/types/media/util.d.ts +2 -0
- package/dist/types/mediaQualityMetrics/config.d.ts +365 -0
- package/dist/types/meeting/in-meeting-actions.d.ts +101 -0
- package/dist/types/meeting/index.d.ts +1720 -0
- package/dist/types/meeting/muteState.d.ts +132 -0
- package/dist/types/meeting/request.d.ts +271 -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 +2 -0
- package/dist/types/meeting-info/collection.d.ts +20 -0
- package/dist/types/meeting-info/index.d.ts +57 -0
- package/dist/types/meeting-info/meeting-info-v2.d.ts +93 -0
- package/dist/types/meeting-info/request.d.ts +22 -0
- package/dist/types/meeting-info/util.d.ts +2 -0
- package/dist/types/meeting-info/utilv2.d.ts +2 -0
- package/dist/types/meetings/collection.d.ts +31 -0
- package/dist/types/meetings/index.d.ts +315 -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 +156 -0
- package/dist/types/member/types.d.ts +21 -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 +343 -0
- package/dist/types/members/request.d.ts +58 -0
- package/dist/types/members/types.d.ts +24 -0
- package/dist/types/members/util.d.ts +2 -0
- package/dist/types/metrics/config.d.ts +171 -0
- package/dist/types/metrics/constants.d.ts +53 -0
- package/dist/types/metrics/index.d.ts +152 -0
- package/dist/types/multistream/mediaRequestManager.d.ts +68 -0
- package/dist/types/multistream/receiveSlot.d.ts +68 -0
- package/dist/types/multistream/receiveSlotManager.d.ts +49 -0
- package/dist/types/multistream/remoteMedia.d.ts +100 -0
- package/dist/types/multistream/remoteMediaGroup.d.ts +56 -0
- package/dist/types/multistream/remoteMediaManager.d.ts +263 -0
- package/dist/types/networkQualityMonitor/index.d.ts +70 -0
- package/dist/types/personal-meeting-room/index.d.ts +47 -0
- package/dist/types/personal-meeting-room/request.d.ts +14 -0
- package/dist/types/personal-meeting-room/util.d.ts +2 -0
- package/dist/types/reachability/index.d.ts +152 -0
- package/dist/types/reachability/request.d.ts +37 -0
- package/dist/types/reactions/constants.d.ts +3 -0
- package/dist/types/reactions/reactions.d.ts +4 -0
- package/dist/types/reactions/reactions.type.d.ts +52 -0
- package/dist/types/reconnection-manager/index.d.ts +126 -0
- package/dist/types/recording-controller/enums.d.ts +7 -0
- package/dist/types/recording-controller/index.d.ts +193 -0
- package/dist/types/recording-controller/util.d.ts +13 -0
- package/dist/types/roap/index.d.ts +77 -0
- package/dist/types/roap/request.d.ts +38 -0
- package/dist/types/roap/turnDiscovery.d.ts +74 -0
- package/dist/types/statsAnalyzer/global.d.ts +36 -0
- package/dist/types/statsAnalyzer/index.d.ts +195 -0
- package/dist/types/statsAnalyzer/mqaUtil.d.ts +24 -0
- package/dist/types/transcription/index.d.ts +64 -0
- package/internal-README.md +7 -6
- package/package.json +27 -21
- package/src/breakouts/README.md +219 -0
- package/src/breakouts/breakout.ts +153 -0
- package/src/breakouts/collection.ts +19 -0
- package/src/breakouts/edit-lock-error.ts +25 -0
- package/src/breakouts/index.ts +745 -0
- package/src/breakouts/request.ts +55 -0
- package/src/breakouts/utils.ts +44 -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/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/{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} +8 -7
- 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} +22 -9
- package/src/common/queue.ts +1 -2
- package/src/{config.js → config.ts} +17 -12
- package/src/constants.ts +92 -5
- package/src/controls-options-manager/constants.ts +5 -0
- package/src/controls-options-manager/enums.ts +7 -0
- package/src/controls-options-manager/index.ts +240 -0
- package/src/controls-options-manager/util.ts +30 -0
- package/src/index.js +4 -1
- package/src/locus-info/controlsUtils.ts +141 -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} +211 -71
- package/src/locus-info/{infoUtils.js → infoUtils.ts} +19 -8
- package/src/locus-info/{mediaSharesUtils.js → mediaSharesUtils.ts} +17 -17
- package/src/locus-info/{parser.js → parser.ts} +67 -79
- package/src/locus-info/{selfUtils.js → selfUtils.ts} +183 -67
- package/src/media/{index.js → index.ts} +179 -176
- package/src/media/{properties.js → properties.ts} +60 -37
- package/src/media/{util.js → util.ts} +2 -2
- package/src/mediaQualityMetrics/config.ts +384 -0
- package/src/meeting/in-meeting-actions.ts +67 -3
- package/src/meeting/{index.js → index.ts} +2605 -1605
- package/src/meeting/{muteState.js → muteState.ts} +138 -73
- package/src/meeting/{request.js → request.ts} +326 -142
- package/src/meeting/request.type.ts +13 -0
- package/src/meeting/{state.js → state.ts} +50 -35
- package/src/meeting/{util.js → util.ts} +131 -115
- package/src/meeting-info/{collection.js → collection.ts} +6 -2
- package/src/meeting-info/{index.js → index.ts} +42 -36
- package/src/meeting-info/meeting-info-v2.ts +273 -0
- package/src/meeting-info/{request.js → request.ts} +14 -4
- package/src/meeting-info/{util.js → util.ts} +60 -51
- package/src/meeting-info/{utilv2.js → utilv2.ts} +65 -58
- package/src/meetings/{collection.js → collection.ts} +26 -3
- package/src/meetings/index.ts +1275 -0
- package/src/meetings/{request.js → request.ts} +34 -25
- package/src/meetings/{util.js → util.ts} +99 -33
- package/src/member/{index.js → index.ts} +124 -56
- package/src/member/types.ts +24 -0
- package/src/member/{util.js → util.ts} +105 -25
- package/src/members/{collection.js → collection.ts} +10 -2
- package/src/members/{index.js → index.ts} +281 -144
- package/src/members/{request.js → request.ts} +80 -16
- package/src/members/types.ts +28 -0
- package/src/members/{util.js → util.ts} +108 -55
- package/src/metrics/{config.js → config.ts} +255 -92
- package/src/metrics/{constants.js → constants.ts} +0 -6
- package/src/metrics/{index.js → index.ts} +110 -94
- package/src/multistream/mediaRequestManager.ts +144 -40
- package/src/multistream/receiveSlot.ts +69 -26
- package/src/multistream/receiveSlotManager.ts +50 -38
- package/src/multistream/remoteMedia.ts +30 -4
- package/src/multistream/remoteMediaGroup.ts +4 -3
- package/src/multistream/remoteMediaManager.ts +230 -66
- 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/{index.js → index.ts} +157 -94
- package/src/reachability/request.ts +46 -35
- 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.js → index.ts} +228 -120
- package/src/recording-controller/enums.ts +8 -0
- package/src/recording-controller/index.ts +315 -0
- package/src/recording-controller/util.ts +58 -0
- package/src/roap/{index.js → index.ts} +77 -60
- package/src/roap/request.ts +172 -0
- package/src/roap/turnDiscovery.ts +81 -41
- package/src/statsAnalyzer/global.ts +37 -0
- package/src/statsAnalyzer/index.ts +1242 -0
- package/src/statsAnalyzer/mqaUtil.ts +291 -0
- package/src/transcription/{index.js → index.ts} +46 -39
- package/test/integration/spec/converged-space-meetings.js +176 -0
- package/test/integration/spec/journey.js +665 -464
- package/test/integration/spec/space-meeting.js +320 -206
- package/test/integration/spec/transcription.js +7 -8
- package/test/unit/spec/breakouts/breakout.ts +178 -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/index.ts +1252 -0
- package/test/unit/spec/breakouts/request.ts +104 -0
- package/test/unit/spec/breakouts/utils.js +54 -0
- package/test/unit/spec/common/browser-detection.js +9 -28
- package/test/unit/spec/controls-options-manager/index.js +204 -0
- package/test/unit/spec/controls-options-manager/util.js +86 -0
- package/test/unit/spec/fixture/locus.js +92 -90
- package/test/unit/spec/locus-info/controlsUtils.js +133 -34
- package/test/unit/spec/locus-info/embeddedAppsUtils.js +8 -6
- package/test/unit/spec/locus-info/index.js +303 -2
- package/test/unit/spec/locus-info/infoUtils.js +41 -32
- package/test/unit/spec/locus-info/lib/BasicSeqCmp.json +88 -430
- package/test/unit/spec/locus-info/lib/SeqCmp.json +513 -685
- package/test/unit/spec/locus-info/parser.js +3 -9
- package/test/unit/spec/locus-info/selfConstant.js +101 -103
- package/test/unit/spec/locus-info/selfUtils.js +165 -12
- package/test/unit/spec/media/index.ts +72 -8
- package/test/unit/spec/media/properties.ts +9 -9
- package/test/unit/spec/meeting/in-meeting-actions.ts +29 -2
- package/test/unit/spec/meeting/index.js +2503 -802
- package/test/unit/spec/meeting/muteState.js +146 -61
- package/test/unit/spec/meeting/request.js +141 -43
- package/test/unit/spec/meeting/utils.js +135 -164
- package/test/unit/spec/meeting-info/meetinginfov2.js +100 -73
- 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 +110 -74
- package/test/unit/spec/meetings/collection.js +15 -1
- package/test/unit/spec/meetings/index.js +622 -263
- package/test/unit/spec/meetings/utils.js +65 -14
- package/test/unit/spec/member/index.js +24 -1
- package/test/unit/spec/member/util.js +359 -32
- package/test/unit/spec/members/index.js +294 -54
- package/test/unit/spec/members/request.js +50 -20
- package/test/unit/spec/members/utils.js +147 -4
- package/test/unit/spec/metrics/index.js +16 -21
- package/test/unit/spec/multistream/mediaRequestManager.ts +369 -68
- package/test/unit/spec/multistream/receiveSlot.ts +76 -17
- package/test/unit/spec/multistream/receiveSlotManager.ts +60 -38
- package/test/unit/spec/multistream/remoteMedia.ts +32 -2
- package/test/unit/spec/multistream/remoteMediaGroup.ts +5 -5
- package/test/unit/spec/multistream/remoteMediaManager.ts +549 -65
- 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/index.ts +176 -27
- package/test/unit/spec/reachability/request.js +66 -0
- package/test/unit/spec/reconnection-manager/index.js +58 -30
- package/test/unit/spec/recording-controller/index.js +231 -0
- package/test/unit/spec/recording-controller/util.js +102 -0
- package/test/unit/spec/roap/index.ts +12 -8
- package/test/unit/spec/roap/request.ts +217 -0
- package/test/unit/spec/roap/turnDiscovery.ts +72 -49
- package/test/unit/spec/stats-analyzer/index.js +108 -57
- package/test/utils/cmr.js +44 -42
- package/test/utils/constants.js +9 -0
- package/test/utils/testUtils.js +98 -77
- package/test/utils/webex-config.js +22 -18
- package/test/utils/webex-test-users.js +57 -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/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/locus-info/controlsUtils.js +0 -102
- package/src/media/internal-media-core-wrapper.ts +0 -9
- package/src/mediaQualityMetrics/config.js +0 -382
- package/src/meeting/effectsState.js +0 -205
- package/src/meeting-info/meeting-info-v2.js +0 -255
- package/src/meetings/index.js +0 -1015
- package/src/multistream/multistreamMedia.ts +0 -92
- package/src/peer-connection-manager/util.ts +0 -117
- 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
|
@@ -8,30 +8,21 @@ import uuid from 'uuid';
|
|
|
8
8
|
import window from 'global/window';
|
|
9
9
|
import anonymize from 'ip-anonymize';
|
|
10
10
|
|
|
11
|
+
import {getOSNameInternal} from '@webex/internal-plugin-metrics';
|
|
11
12
|
import LoggerProxy from '../common/logs/logger-proxy';
|
|
12
13
|
import {MEETING_ERRORS} from '../constants';
|
|
13
14
|
import BrowserDetection from '../common/browser-detection';
|
|
14
15
|
|
|
15
16
|
import {
|
|
16
|
-
error,
|
|
17
|
-
|
|
17
|
+
error,
|
|
18
|
+
eventType,
|
|
19
|
+
errorCodes as ERROR_CODE,
|
|
20
|
+
UNKNOWN,
|
|
21
|
+
CLIENT_NAME,
|
|
22
|
+
mediaType,
|
|
18
23
|
} from './config';
|
|
19
24
|
|
|
20
|
-
const
|
|
21
|
-
'Chrome OS': OS_NAME.chrome,
|
|
22
|
-
macOS: OS_NAME.MAC,
|
|
23
|
-
Windows: OS_NAME.WINDOWS,
|
|
24
|
-
iOS: OS_NAME.IOS,
|
|
25
|
-
Android: OS_NAME.ANDROID,
|
|
26
|
-
Linux: OS_NAME.LINUX
|
|
27
|
-
};
|
|
28
|
-
|
|
29
|
-
const {
|
|
30
|
-
getOSName,
|
|
31
|
-
getOSVersion,
|
|
32
|
-
getBrowserName,
|
|
33
|
-
getBrowserVersion
|
|
34
|
-
} = BrowserDetection();
|
|
25
|
+
const {getOSName, getOSVersion, getBrowserName, getBrowserVersion} = BrowserDetection();
|
|
35
26
|
|
|
36
27
|
// Apply a CIDR /28 format to the IPV4 and /96 to the IPV6 addresses
|
|
37
28
|
// For reference : https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing
|
|
@@ -76,34 +67,41 @@ const triggerTimers = ({event, meeting, data}) => {
|
|
|
76
67
|
* @class Metrics
|
|
77
68
|
*/
|
|
78
69
|
class Metrics {
|
|
70
|
+
static instance: Metrics;
|
|
71
|
+
|
|
72
|
+
_events: any;
|
|
73
|
+
keys: any;
|
|
74
|
+
meetingCollection: any;
|
|
75
|
+
webex: any;
|
|
76
|
+
|
|
79
77
|
/**
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
78
|
+
* Create Metrics Object
|
|
79
|
+
* @constructor
|
|
80
|
+
* @public
|
|
81
|
+
* @memberof Meetings
|
|
82
|
+
*/
|
|
85
83
|
constructor() {
|
|
86
84
|
if (!Metrics.instance) {
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
85
|
+
/**
|
|
86
|
+
* @instance
|
|
87
|
+
* @type {Array}
|
|
88
|
+
* @private
|
|
89
|
+
* @memberof Metrics
|
|
90
|
+
*/
|
|
93
91
|
this._events = [];
|
|
94
92
|
/**
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
93
|
+
* @instance
|
|
94
|
+
* @type {MeetingCollection}
|
|
95
|
+
* @private
|
|
96
|
+
* @memberof Metrics
|
|
97
|
+
*/
|
|
100
98
|
this.meetingCollection = null;
|
|
101
99
|
/**
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
100
|
+
* @instance
|
|
101
|
+
* @type {MeetingCollection}
|
|
102
|
+
* @private
|
|
103
|
+
* @memberof Metrics
|
|
104
|
+
*/
|
|
107
105
|
this.keys = Object.values(eventType);
|
|
108
106
|
/**
|
|
109
107
|
* @instance
|
|
@@ -114,6 +112,7 @@ class Metrics {
|
|
|
114
112
|
Metrics.instance = this;
|
|
115
113
|
}
|
|
116
114
|
|
|
115
|
+
// eslint-disable-next-line no-constructor-return
|
|
117
116
|
return Metrics.instance;
|
|
118
117
|
}
|
|
119
118
|
|
|
@@ -125,7 +124,7 @@ class Metrics {
|
|
|
125
124
|
*
|
|
126
125
|
* @returns {void}
|
|
127
126
|
*/
|
|
128
|
-
initialSetup(meetingCollection, webex) {
|
|
127
|
+
initialSetup(meetingCollection: object, webex: object) {
|
|
129
128
|
this.meetingCollection = meetingCollection;
|
|
130
129
|
this.webex = webex;
|
|
131
130
|
}
|
|
@@ -139,12 +138,14 @@ class Metrics {
|
|
|
139
138
|
* @param {object} options.event
|
|
140
139
|
* @returns {object} null
|
|
141
140
|
*/
|
|
142
|
-
postEvent(options) {
|
|
141
|
+
postEvent(options: {meeting?: any; meetingId?: string; data?: object; event?: any} | any) {
|
|
143
142
|
const {meetingId, data = {}, event} = options;
|
|
144
143
|
let {meeting} = options;
|
|
145
144
|
|
|
146
145
|
if (this.keys.indexOf(event) === -1) {
|
|
147
|
-
LoggerProxy.logger.error(
|
|
146
|
+
LoggerProxy.logger.error(
|
|
147
|
+
`Metrics:index#postEvent --> Event ${event} doesn't exist in dictionary`
|
|
148
|
+
);
|
|
148
149
|
}
|
|
149
150
|
|
|
150
151
|
if (!meeting && meetingId) {
|
|
@@ -161,27 +162,27 @@ class Metrics {
|
|
|
161
162
|
if (event === eventType.MEDIA_QUALITY) {
|
|
162
163
|
data.event = event;
|
|
163
164
|
meeting.sendMediaQualityAnalyzerMetrics(data);
|
|
164
|
-
}
|
|
165
|
-
else {
|
|
165
|
+
} else {
|
|
166
166
|
meeting.callEvents.push(event);
|
|
167
167
|
data.event = event;
|
|
168
168
|
meeting.sendCallAnalyzerMetrics(data);
|
|
169
169
|
}
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
170
|
+
} else {
|
|
171
|
+
LoggerProxy.logger.info(
|
|
172
|
+
`Metrics:index#postEvent --> Event received for meetingId:${meetingId}, but meeting not found in collection.`
|
|
173
|
+
);
|
|
174
174
|
}
|
|
175
175
|
}
|
|
176
176
|
|
|
177
177
|
/**
|
|
178
178
|
* Docs for Call analyzer metrics
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
179
|
+
* https://sqbu-github.cisco.com/WebExSquared/call-analyzer/wiki
|
|
180
|
+
* https://sqbu-github.cisco.com/WebExSquared/event-dictionary/blob/master/diagnostic-events.raml
|
|
181
|
+
*/
|
|
182
182
|
|
|
183
|
+
// eslint-disable-next-line @typescript-eslint/no-shadow
|
|
183
184
|
initPayload(eventType, identifiers, options) {
|
|
184
|
-
const payload = {
|
|
185
|
+
const payload: any = {
|
|
185
186
|
eventId: uuid.v4(),
|
|
186
187
|
version: 1,
|
|
187
188
|
origin: {
|
|
@@ -194,21 +195,21 @@ class Metrics {
|
|
|
194
195
|
localNetworkPrefix: anonymizeIPAddress(this.webex.meetings.geoHintInfo?.clientAddress),
|
|
195
196
|
osVersion: getOSVersion() || 'unknown',
|
|
196
197
|
subClientType: options.subClientType,
|
|
197
|
-
os:
|
|
198
|
+
os: getOSNameInternal(),
|
|
198
199
|
browser: getBrowserName(),
|
|
199
|
-
browserVersion: getBrowserVersion()
|
|
200
|
-
}
|
|
200
|
+
browserVersion: getBrowserVersion(),
|
|
201
|
+
},
|
|
201
202
|
},
|
|
202
203
|
originTime: {
|
|
203
|
-
triggered: new Date().toISOString()
|
|
204
|
+
triggered: new Date().toISOString(),
|
|
204
205
|
},
|
|
205
206
|
senderCountryCode: this.webex.meetings.geoHintInfo?.countryCode,
|
|
206
207
|
event: {
|
|
207
208
|
name: eventType,
|
|
208
209
|
canProceed: true,
|
|
209
210
|
identifiers,
|
|
210
|
-
eventData: {webClientDomain: window.location.hostname}
|
|
211
|
-
}
|
|
211
|
+
eventData: {webClientDomain: window.location.hostname},
|
|
212
|
+
},
|
|
212
213
|
};
|
|
213
214
|
|
|
214
215
|
// TODO: more options should be checked and some of them should be mandatory in certain conditions
|
|
@@ -240,22 +241,16 @@ class Metrics {
|
|
|
240
241
|
if (options.isRoapCallEnabled) {
|
|
241
242
|
payload.event.isRoapCallEnabled = options.isRoapCallEnabled;
|
|
242
243
|
}
|
|
244
|
+
['breakoutMoveId', 'breakoutSessionId', 'breakoutGroupId'].forEach((item) => {
|
|
245
|
+
if (options[item]) {
|
|
246
|
+
payload.event.identifiers[item] = options[item];
|
|
247
|
+
}
|
|
248
|
+
});
|
|
243
249
|
}
|
|
244
250
|
|
|
245
251
|
return payload;
|
|
246
252
|
}
|
|
247
253
|
|
|
248
|
-
/**
|
|
249
|
-
* returns metrics friendly OS versions
|
|
250
|
-
* @param {String} osName Os name
|
|
251
|
-
* @returns {String}
|
|
252
|
-
* @private
|
|
253
|
-
* @memberof Metrics
|
|
254
|
-
*/
|
|
255
|
-
getOsName() {
|
|
256
|
-
return OSMap[getOSName()] ?? OS_NAME.OTHERS;
|
|
257
|
-
}
|
|
258
|
-
|
|
259
254
|
/**
|
|
260
255
|
* get the payload specific for a media quality event through call analyzer
|
|
261
256
|
* @param {String} eventType the event name
|
|
@@ -270,7 +265,21 @@ class Metrics {
|
|
|
270
265
|
* @public
|
|
271
266
|
* @memberof Metrics
|
|
272
267
|
*/
|
|
273
|
-
initMediaPayload(
|
|
268
|
+
public initMediaPayload(
|
|
269
|
+
// eslint-disable-next-line @typescript-eslint/no-shadow
|
|
270
|
+
eventType: string,
|
|
271
|
+
identifiers: {
|
|
272
|
+
correlationId: string;
|
|
273
|
+
locusUrl: string;
|
|
274
|
+
locusId: string;
|
|
275
|
+
},
|
|
276
|
+
options:
|
|
277
|
+
| {
|
|
278
|
+
intervalData: object;
|
|
279
|
+
clientType: string;
|
|
280
|
+
}
|
|
281
|
+
| any = {}
|
|
282
|
+
) {
|
|
274
283
|
const {audioSetupDelay, videoSetupDelay, joinTimes} = options;
|
|
275
284
|
|
|
276
285
|
const payload = {
|
|
@@ -286,15 +295,15 @@ class Metrics {
|
|
|
286
295
|
clientType: options.clientType, // TODO: Only clientType: 'TEAMS_CLIENT' is whitelisted
|
|
287
296
|
clientVersion: `${CLIENT_NAME}/${this.webex.version}`,
|
|
288
297
|
localNetworkPrefix: anonymizeIPAddress(this.webex.meetings.geoHintInfo?.clientAddress),
|
|
289
|
-
os:
|
|
298
|
+
os: getOSNameInternal(),
|
|
290
299
|
osVersion: getOSVersion() || UNKNOWN,
|
|
291
300
|
subClientType: options.subClientType,
|
|
292
301
|
browser: getBrowserName(),
|
|
293
|
-
browserVersion: getBrowserVersion()
|
|
294
|
-
}
|
|
302
|
+
browserVersion: getBrowserVersion(),
|
|
303
|
+
},
|
|
295
304
|
},
|
|
296
305
|
originTime: {
|
|
297
|
-
triggered: new Date().toISOString()
|
|
306
|
+
triggered: new Date().toISOString(),
|
|
298
307
|
},
|
|
299
308
|
senderCountryCode: this.webex.meetings.geoHintInfo?.countryCode,
|
|
300
309
|
event: {
|
|
@@ -304,16 +313,16 @@ class Metrics {
|
|
|
304
313
|
intervals: [options.intervalData],
|
|
305
314
|
joinTimes,
|
|
306
315
|
eventData: {
|
|
307
|
-
webClientDomain: window.location.hostname
|
|
316
|
+
webClientDomain: window.location.hostname,
|
|
308
317
|
},
|
|
309
318
|
sourceMetadata: {
|
|
310
319
|
applicationSoftwareType: CLIENT_NAME,
|
|
311
320
|
applicationSoftwareVersion: this.webex.version,
|
|
312
321
|
mediaEngineSoftwareType: getBrowserName() || 'browser',
|
|
313
322
|
mediaEngineSoftwareVersion: getOSVersion() || UNKNOWN,
|
|
314
|
-
startTime: new Date().toISOString()
|
|
315
|
-
}
|
|
316
|
-
}
|
|
323
|
+
startTime: new Date().toISOString(),
|
|
324
|
+
},
|
|
325
|
+
},
|
|
317
326
|
};
|
|
318
327
|
|
|
319
328
|
return payload;
|
|
@@ -329,13 +338,12 @@ class Metrics {
|
|
|
329
338
|
* @returns {{showToUser: boolean, category: string, errorDescription: string,
|
|
330
339
|
* errorCode: number, errorData: *, fatal: boolean, name: string}}
|
|
331
340
|
*/
|
|
332
|
-
parseLocusError(err, showToUser) {
|
|
341
|
+
parseLocusError(err: any, showToUser: boolean) {
|
|
333
342
|
let errorCode;
|
|
334
343
|
|
|
335
344
|
if (err && err.statusCode && err.statusCode >= 500) {
|
|
336
345
|
errorCode = 1003;
|
|
337
|
-
}
|
|
338
|
-
else if (err && err.body && err.body.errorCode) {
|
|
346
|
+
} else if (err && err.body && err.body.errorCode) {
|
|
339
347
|
// locus error codes: https://sqbu-github.cisco.com/WebExSquared/locus/blob/master/server/src/main/resources/locus-error-codes.properties
|
|
340
348
|
switch (ERROR_CODE[err.body.errorCode]) {
|
|
341
349
|
case MEETING_ERRORS.FREE_USER_MAX_PARTICIPANTS_EXCEEDED:
|
|
@@ -434,26 +442,22 @@ class Metrics {
|
|
|
434
442
|
default:
|
|
435
443
|
errorCode = 4008;
|
|
436
444
|
}
|
|
437
|
-
}
|
|
438
|
-
else {
|
|
445
|
+
} else {
|
|
439
446
|
errorCode = 4008;
|
|
440
447
|
}
|
|
441
448
|
|
|
442
|
-
return this.generateErrorPayload(
|
|
443
|
-
errorCode, showToUser, error.name.LOCUS_RESPONSE, err
|
|
444
|
-
);
|
|
449
|
+
return this.generateErrorPayload(errorCode, showToUser, error.name.LOCUS_RESPONSE, err);
|
|
445
450
|
}
|
|
446
451
|
|
|
447
|
-
|
|
448
452
|
generateErrorPayload(errorCode, shownToUser, name, err) {
|
|
449
453
|
if (error.errors[errorCode]) {
|
|
450
|
-
const errorPayload = {
|
|
454
|
+
const errorPayload: any = {
|
|
451
455
|
shownToUser: shownToUser || false,
|
|
452
456
|
category: error.errors[errorCode][2],
|
|
453
457
|
errorDescription: error.errors[errorCode][0],
|
|
454
458
|
errorCode,
|
|
455
459
|
fatal: !includes(error.notFatalErrorList, errorCode),
|
|
456
|
-
name: name || error.name.OTHER
|
|
460
|
+
name: name || error.name.OTHER,
|
|
457
461
|
};
|
|
458
462
|
|
|
459
463
|
if (err && err.body) {
|
|
@@ -480,8 +484,14 @@ class Metrics {
|
|
|
480
484
|
let browserInfo;
|
|
481
485
|
const clientInfo = util.format('client=%s', `${this.webex.meetings?.metrics?.clientName}`);
|
|
482
486
|
|
|
483
|
-
if (
|
|
484
|
-
|
|
487
|
+
if (
|
|
488
|
+
['chrome', 'firefox', 'msie', 'msedge', 'safari'].indexOf(getBrowserName().toLowerCase()) !==
|
|
489
|
+
-1
|
|
490
|
+
) {
|
|
491
|
+
browserInfo = util.format(
|
|
492
|
+
'browser=%s',
|
|
493
|
+
`${getBrowserName().toLowerCase()}/${getBrowserVersion().split('.')[0]}`
|
|
494
|
+
);
|
|
485
495
|
}
|
|
486
496
|
const osInfo = util.format('os=%s', `${getOSName()}/${getOSVersion().split('.')[0]}`);
|
|
487
497
|
|
|
@@ -489,12 +499,18 @@ class Metrics {
|
|
|
489
499
|
userAgentOption = `(${browserInfo}`;
|
|
490
500
|
}
|
|
491
501
|
if (osInfo) {
|
|
492
|
-
userAgentOption = userAgentOption
|
|
502
|
+
userAgentOption = userAgentOption
|
|
503
|
+
? `${userAgentOption}; ${clientInfo}; ${osInfo}`
|
|
504
|
+
: `${clientInfo}; (${osInfo}`;
|
|
493
505
|
}
|
|
494
506
|
if (userAgentOption) {
|
|
495
507
|
userAgentOption += ')';
|
|
496
508
|
|
|
497
|
-
return util.format(
|
|
509
|
+
return util.format(
|
|
510
|
+
'webex-js-sdk/%s %s',
|
|
511
|
+
`${process.env.NODE_ENV}-${this.webex.version}`,
|
|
512
|
+
userAgentOption
|
|
513
|
+
);
|
|
498
514
|
}
|
|
499
515
|
|
|
500
516
|
return util.format('webex-js-sdk/%s', `${process.env.NODE_ENV}-${this.webex.version}`);
|
|
@@ -515,11 +531,11 @@ class Metrics {
|
|
|
515
531
|
*
|
|
516
532
|
* @returns {void}
|
|
517
533
|
*/
|
|
518
|
-
sendBehavioralMetric(metricName, metricFields = {}, metricTags = {}) {
|
|
534
|
+
sendBehavioralMetric(metricName: string, metricFields: object = {}, metricTags: object = {}) {
|
|
519
535
|
this.webex.internal.metrics.submitClientMetrics(metricName, {
|
|
520
536
|
type: this.webex.config.metrics.type,
|
|
521
537
|
fields: metricFields,
|
|
522
|
-
tags: metricTags
|
|
538
|
+
tags: metricTags,
|
|
523
539
|
});
|
|
524
540
|
}
|
|
525
541
|
}
|
|
@@ -1,9 +1,18 @@
|
|
|
1
1
|
/* eslint-disable require-jsdoc */
|
|
2
|
-
import {
|
|
2
|
+
import {
|
|
3
|
+
MediaRequest as WcmeMediaRequest,
|
|
4
|
+
Policy,
|
|
5
|
+
ActiveSpeakerInfo,
|
|
6
|
+
ReceiverSelectedInfo,
|
|
7
|
+
CodecInfo as WcmeCodecInfo,
|
|
8
|
+
H264Codec,
|
|
9
|
+
} from '@webex/internal-media-core';
|
|
10
|
+
import {cloneDeep, debounce, isEmpty} from 'lodash';
|
|
3
11
|
|
|
4
12
|
import LoggerProxy from '../common/logs/logger-proxy';
|
|
5
13
|
|
|
6
|
-
import {ReceiveSlot,
|
|
14
|
+
import {ReceiveSlot, ReceiveSlotEvents} from './receiveSlot';
|
|
15
|
+
import {getMaxFs} from './remoteMedia';
|
|
7
16
|
|
|
8
17
|
export interface ActiveSpeakerPolicyInfo {
|
|
9
18
|
policy: 'active-speaker';
|
|
@@ -35,6 +44,7 @@ export interface MediaRequest {
|
|
|
35
44
|
policyInfo: PolicyInfo;
|
|
36
45
|
receiveSlots: Array<ReceiveSlot>;
|
|
37
46
|
codecInfo?: CodecInfo;
|
|
47
|
+
preferredMaxFs?: number;
|
|
38
48
|
}
|
|
39
49
|
|
|
40
50
|
export type MediaRequestId = string;
|
|
@@ -47,77 +57,152 @@ const CODEC_DEFAULTS = {
|
|
|
47
57
|
},
|
|
48
58
|
};
|
|
49
59
|
|
|
50
|
-
|
|
60
|
+
const DEBOUNCED_SOURCE_UPDATE_TIME = 1000;
|
|
61
|
+
|
|
62
|
+
type DegradationPreferences = {
|
|
63
|
+
maxMacroblocksLimit: number;
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
type SendMediaRequestsCallback = (mediaRequests: WcmeMediaRequest[]) => void;
|
|
51
67
|
|
|
52
68
|
export class MediaRequestManager {
|
|
53
69
|
private sendMediaRequestsCallback: SendMediaRequestsCallback;
|
|
54
70
|
|
|
55
|
-
private counter;
|
|
71
|
+
private counter: number;
|
|
56
72
|
|
|
57
73
|
private clientRequests: {[key: MediaRequestId]: MediaRequest};
|
|
58
74
|
|
|
59
|
-
private
|
|
75
|
+
private degradationPreferences: DegradationPreferences;
|
|
76
|
+
|
|
77
|
+
private sourceUpdateListener: () => void;
|
|
78
|
+
|
|
79
|
+
private debouncedSourceUpdateListener: () => void;
|
|
80
|
+
|
|
81
|
+
private previousWCMEMediaRequests: Array<WcmeMediaRequest> = [];
|
|
60
82
|
|
|
61
|
-
constructor(
|
|
83
|
+
constructor(
|
|
84
|
+
degradationPreferences: DegradationPreferences,
|
|
85
|
+
sendMediaRequestsCallback: SendMediaRequestsCallback
|
|
86
|
+
) {
|
|
62
87
|
this.sendMediaRequestsCallback = sendMediaRequestsCallback;
|
|
63
88
|
this.counter = 0;
|
|
64
89
|
this.clientRequests = {};
|
|
65
|
-
this.
|
|
90
|
+
this.degradationPreferences = degradationPreferences;
|
|
91
|
+
this.sourceUpdateListener = this.commit.bind(this);
|
|
92
|
+
this.debouncedSourceUpdateListener = debounce(
|
|
93
|
+
this.sourceUpdateListener,
|
|
94
|
+
DEBOUNCED_SOURCE_UPDATE_TIME
|
|
95
|
+
);
|
|
66
96
|
}
|
|
67
97
|
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
Object.values(this.clientRequests).forEach((request) =>
|
|
73
|
-
request.receiveSlots.forEach((slot) => {
|
|
74
|
-
activeSlots[slot.id] = slot;
|
|
75
|
-
})
|
|
76
|
-
);
|
|
98
|
+
public setDegradationPreferences(degradationPreferences: DegradationPreferences) {
|
|
99
|
+
this.degradationPreferences = degradationPreferences;
|
|
100
|
+
this.sendRequests(); // re-send requests after preferences are set
|
|
101
|
+
}
|
|
77
102
|
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
103
|
+
private getDegradedClientRequests() {
|
|
104
|
+
const clientRequests = cloneDeep(this.clientRequests);
|
|
105
|
+
const maxFsLimits = [
|
|
106
|
+
getMaxFs('best'),
|
|
107
|
+
getMaxFs('large'),
|
|
108
|
+
getMaxFs('medium'),
|
|
109
|
+
getMaxFs('small'),
|
|
110
|
+
getMaxFs('very small'),
|
|
111
|
+
getMaxFs('thumbnail'),
|
|
112
|
+
];
|
|
113
|
+
|
|
114
|
+
// reduce max-fs until total macroblocks is below limit
|
|
115
|
+
for (let i = 0; i < maxFsLimits.length; i += 1) {
|
|
116
|
+
let totalMacroblocksRequested = 0;
|
|
117
|
+
Object.entries(clientRequests).forEach(([id, mr]) => {
|
|
118
|
+
if (mr.codecInfo) {
|
|
119
|
+
mr.codecInfo.maxFs = Math.min(
|
|
120
|
+
mr.preferredMaxFs || CODEC_DEFAULTS.h264.maxFs,
|
|
121
|
+
mr.codecInfo.maxFs || CODEC_DEFAULTS.h264.maxFs,
|
|
122
|
+
maxFsLimits[i]
|
|
123
|
+
);
|
|
124
|
+
// we only consider sources with "live" state
|
|
125
|
+
const slotsWithLiveSource = this.clientRequests[id].receiveSlots.filter(
|
|
126
|
+
(rs) => rs.sourceState === 'live'
|
|
127
|
+
);
|
|
128
|
+
totalMacroblocksRequested += mr.codecInfo.maxFs * slotsWithLiveSource.length;
|
|
129
|
+
}
|
|
130
|
+
});
|
|
131
|
+
if (totalMacroblocksRequested <= this.degradationPreferences.maxMacroblocksLimit) {
|
|
132
|
+
if (i !== 0) {
|
|
133
|
+
LoggerProxy.logger.warn(
|
|
134
|
+
`multistream:mediaRequestManager --> too many streams with high max-fs, frame size will be limited to ${maxFsLimits[i]}`
|
|
135
|
+
);
|
|
136
|
+
}
|
|
137
|
+
break;
|
|
138
|
+
} else if (i === maxFsLimits.length - 1) {
|
|
139
|
+
LoggerProxy.logger.warn(
|
|
140
|
+
`multistream:mediaRequestManager --> even with frame size limited to ${maxFsLimits[i]} you are still requesting too many streams, consider reducing the number of requests`
|
|
85
141
|
);
|
|
86
|
-
slot.resetSourceState();
|
|
87
142
|
}
|
|
88
143
|
}
|
|
89
144
|
|
|
90
|
-
|
|
145
|
+
return clientRequests;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
/**
|
|
149
|
+
* Returns true if two media requests are the same, false otherwise.
|
|
150
|
+
*
|
|
151
|
+
* @param {WcmeMediaRequest} mediaRequestA - Media request A for comparison.
|
|
152
|
+
* @param {WcmeMediaRequest} mediaRequestB - Media request B for comparison.
|
|
153
|
+
* @returns {boolean} - Whether they are equal.
|
|
154
|
+
*/
|
|
155
|
+
// eslint-disable-next-line class-methods-use-this
|
|
156
|
+
public isEqual(mediaRequestA: WcmeMediaRequest, mediaRequestB: WcmeMediaRequest) {
|
|
157
|
+
return (
|
|
158
|
+
JSON.stringify(mediaRequestA._toJmpScrRequest()) ===
|
|
159
|
+
JSON.stringify(mediaRequestB._toJmpScrRequest())
|
|
160
|
+
);
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
/**
|
|
164
|
+
* Compares new media requests to previous ones and determines
|
|
165
|
+
* if they are the same.
|
|
166
|
+
*
|
|
167
|
+
* @param {WcmeMediaRequest[]} newRequests - Array with new requests.
|
|
168
|
+
* @returns {boolean} - True if they are equal, false otherwise.
|
|
169
|
+
*/
|
|
170
|
+
private checkIsNewRequestsEqualToPrev(newRequests: WcmeMediaRequest[]) {
|
|
171
|
+
return (
|
|
172
|
+
!isEmpty(this.previousWCMEMediaRequests) &&
|
|
173
|
+
this.previousWCMEMediaRequests.length === newRequests.length &&
|
|
174
|
+
this.previousWCMEMediaRequests.every((req, idx) => this.isEqual(req, newRequests[idx]))
|
|
175
|
+
);
|
|
91
176
|
}
|
|
92
177
|
|
|
93
178
|
private sendRequests() {
|
|
94
|
-
const wcmeMediaRequests:
|
|
179
|
+
const wcmeMediaRequests: WcmeMediaRequest[] = [];
|
|
95
180
|
|
|
96
|
-
|
|
181
|
+
const clientRequests = this.getDegradedClientRequests();
|
|
97
182
|
const maxPayloadBitsPerSecond = 10 * 1000 * 1000;
|
|
98
183
|
|
|
99
184
|
// map all the client media requests to wcme media requests
|
|
100
|
-
Object.values(
|
|
185
|
+
Object.values(clientRequests).forEach((mr) => {
|
|
101
186
|
wcmeMediaRequests.push(
|
|
102
|
-
new
|
|
187
|
+
new WcmeMediaRequest(
|
|
103
188
|
mr.policyInfo.policy === 'active-speaker'
|
|
104
|
-
?
|
|
105
|
-
:
|
|
189
|
+
? Policy.ActiveSpeaker
|
|
190
|
+
: Policy.ReceiverSelected,
|
|
106
191
|
mr.policyInfo.policy === 'active-speaker'
|
|
107
|
-
? new
|
|
192
|
+
? new ActiveSpeakerInfo(
|
|
108
193
|
mr.policyInfo.priority,
|
|
109
194
|
mr.policyInfo.crossPriorityDuplication,
|
|
110
195
|
mr.policyInfo.crossPolicyDuplication,
|
|
111
196
|
mr.policyInfo.preferLiveVideo
|
|
112
197
|
)
|
|
113
|
-
: new
|
|
198
|
+
: new ReceiverSelectedInfo(mr.policyInfo.csi),
|
|
114
199
|
mr.receiveSlots.map((receiveSlot) => receiveSlot.wcmeReceiveSlot),
|
|
115
200
|
maxPayloadBitsPerSecond,
|
|
116
201
|
mr.codecInfo && [
|
|
117
|
-
new
|
|
202
|
+
new WcmeCodecInfo(
|
|
118
203
|
0x80,
|
|
119
|
-
new
|
|
120
|
-
mr.codecInfo.maxFs
|
|
204
|
+
new H264Codec(
|
|
205
|
+
mr.codecInfo.maxFs,
|
|
121
206
|
mr.codecInfo.maxFps || CODEC_DEFAULTS.h264.maxFps,
|
|
122
207
|
mr.codecInfo.maxMbps || CODEC_DEFAULTS.h264.maxMbps,
|
|
123
208
|
mr.codecInfo.maxWidth,
|
|
@@ -129,9 +214,17 @@ export class MediaRequestManager {
|
|
|
129
214
|
);
|
|
130
215
|
});
|
|
131
216
|
|
|
132
|
-
this.
|
|
133
|
-
|
|
134
|
-
this.
|
|
217
|
+
//! IMPORTANT: this is only a temporary fix. This will soon be done in the jmp layer (@webex/jmp-multistream)
|
|
218
|
+
// https://jira-eng-gpk2.cisco.com/jira/browse/WEBEX-326713
|
|
219
|
+
if (!this.checkIsNewRequestsEqualToPrev(wcmeMediaRequests)) {
|
|
220
|
+
this.sendMediaRequestsCallback(wcmeMediaRequests);
|
|
221
|
+
this.previousWCMEMediaRequests = wcmeMediaRequests;
|
|
222
|
+
LoggerProxy.logger.info(`multistream:sendRequests --> media requests sent. `);
|
|
223
|
+
} else {
|
|
224
|
+
LoggerProxy.logger.info(
|
|
225
|
+
`multistream:sendRequests --> detected duplicate WCME requests, skipping them... `
|
|
226
|
+
);
|
|
227
|
+
}
|
|
135
228
|
}
|
|
136
229
|
|
|
137
230
|
public addRequest(mediaRequest: MediaRequest, commit = true): MediaRequestId {
|
|
@@ -140,6 +233,14 @@ export class MediaRequestManager {
|
|
|
140
233
|
|
|
141
234
|
this.clientRequests[newId] = mediaRequest;
|
|
142
235
|
|
|
236
|
+
mediaRequest.receiveSlots.forEach((rs) => {
|
|
237
|
+
rs.on(ReceiveSlotEvents.SourceUpdate, this.sourceUpdateListener);
|
|
238
|
+
rs.on(ReceiveSlotEvents.MaxFsUpdate, ({maxFs}) => {
|
|
239
|
+
mediaRequest.preferredMaxFs = maxFs;
|
|
240
|
+
this.debouncedSourceUpdateListener();
|
|
241
|
+
});
|
|
242
|
+
});
|
|
243
|
+
|
|
143
244
|
if (commit) {
|
|
144
245
|
this.commit();
|
|
145
246
|
}
|
|
@@ -148,6 +249,10 @@ export class MediaRequestManager {
|
|
|
148
249
|
}
|
|
149
250
|
|
|
150
251
|
public cancelRequest(requestId: MediaRequestId, commit = true) {
|
|
252
|
+
this.clientRequests[requestId]?.receiveSlots.forEach((rs) => {
|
|
253
|
+
rs.off(ReceiveSlotEvents.SourceUpdate, this.sourceUpdateListener);
|
|
254
|
+
});
|
|
255
|
+
|
|
151
256
|
delete this.clientRequests[requestId];
|
|
152
257
|
|
|
153
258
|
if (commit) {
|
|
@@ -161,6 +266,5 @@ export class MediaRequestManager {
|
|
|
161
266
|
|
|
162
267
|
public reset() {
|
|
163
268
|
this.clientRequests = {};
|
|
164
|
-
this.slotsActiveInLastMediaRequest = {};
|
|
165
269
|
}
|
|
166
270
|
}
|