@webex/plugin-meetings 3.0.0-beta.15 → 3.0.0-beta.151
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 +45 -1
- package/dist/annotation/annotation.types.js +7 -0
- package/dist/annotation/annotation.types.js.map +1 -0
- package/dist/annotation/constants.js +49 -0
- package/dist/annotation/constants.js.map +1 -0
- package/dist/annotation/index.js +359 -0
- package/dist/annotation/index.js.map +1 -0
- package/dist/breakouts/breakout.js +193 -0
- package/dist/breakouts/breakout.js.map +1 -0
- package/dist/breakouts/collection.js +23 -0
- package/dist/breakouts/collection.js.map +1 -0
- package/dist/breakouts/edit-lock-error.js +52 -0
- package/dist/breakouts/edit-lock-error.js.map +1 -0
- package/dist/breakouts/events.js +43 -0
- package/dist/breakouts/events.js.map +1 -0
- package/dist/breakouts/index.js +1046 -0
- package/dist/breakouts/index.js.map +1 -0
- package/dist/breakouts/request.js +78 -0
- package/dist/breakouts/request.js.map +1 -0
- package/dist/breakouts/utils.js +67 -0
- package/dist/breakouts/utils.js.map +1 -0
- package/dist/common/browser-detection.js +1 -21
- 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 +0 -21
- package/dist/common/errors/captcha-error.js.map +1 -1
- package/dist/common/errors/intent-to-join.js +0 -21
- package/dist/common/errors/intent-to-join.js.map +1 -1
- package/dist/common/errors/join-meeting.js +0 -21
- package/dist/common/errors/join-meeting.js.map +1 -1
- package/dist/common/errors/media.js +0 -21
- package/dist/common/errors/media.js.map +1 -1
- package/dist/common/errors/parameter.js +0 -28
- package/dist/common/errors/parameter.js.map +1 -1
- package/dist/common/errors/password-error.js +0 -21
- package/dist/common/errors/password-error.js.map +1 -1
- package/dist/common/errors/permission.js +0 -21
- 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 +0 -21
- package/dist/common/errors/reconnection.js.map +1 -1
- package/dist/common/errors/stats.js +0 -21
- package/dist/common/errors/stats.js.map +1 -1
- package/dist/common/errors/webex-errors.js +9 -43
- package/dist/common/errors/webex-errors.js.map +1 -1
- package/dist/common/errors/webex-meetings-error.js +1 -24
- 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 +35 -61
- 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 +7 -13
- package/dist/config.js.map +1 -1
- package/dist/constants.js +208 -64
- package/dist/constants.js.map +1 -1
- package/dist/controls-options-manager/constants.js +14 -0
- package/dist/controls-options-manager/constants.js.map +1 -0
- package/dist/controls-options-manager/enums.js +27 -0
- package/dist/controls-options-manager/enums.js.map +1 -0
- package/dist/controls-options-manager/index.js +297 -0
- package/dist/controls-options-manager/index.js.map +1 -0
- package/dist/controls-options-manager/types.js +7 -0
- package/dist/controls-options-manager/types.js.map +1 -0
- package/dist/controls-options-manager/util.js +300 -0
- package/dist/controls-options-manager/util.js.map +1 -0
- package/dist/index.js +78 -17
- package/dist/index.js.map +1 -1
- package/dist/locus-info/controlsUtils.js +100 -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 +387 -208
- package/dist/locus-info/index.js.map +1 -1
- package/dist/locus-info/infoUtils.js +0 -38
- package/dist/locus-info/infoUtils.js.map +1 -1
- package/dist/locus-info/mediaSharesUtils.js +54 -38
- package/dist/locus-info/mediaSharesUtils.js.map +1 -1
- package/dist/locus-info/parser.js +90 -126
- package/dist/locus-info/parser.js.map +1 -1
- package/dist/locus-info/selfUtils.js +93 -92
- package/dist/locus-info/selfUtils.js.map +1 -1
- package/dist/media/index.js +70 -219
- package/dist/media/index.js.map +1 -1
- package/dist/media/properties.js +74 -198
- package/dist/media/properties.js.map +1 -1
- package/dist/media/util.js +1 -8
- 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 +79 -14
- package/dist/meeting/in-meeting-actions.js.map +1 -1
- package/dist/meeting/index.js +2685 -3324
- package/dist/meeting/index.js.map +1 -1
- package/dist/meeting/locusMediaRequest.js +291 -0
- package/dist/meeting/locusMediaRequest.js.map +1 -0
- package/dist/meeting/muteState.js +243 -185
- package/dist/meeting/muteState.js.map +1 -1
- package/dist/meeting/request.js +296 -342
- package/dist/meeting/request.js.map +1 -1
- package/dist/meeting/request.type.js +0 -1
- package/dist/meeting/request.type.js.map +1 -1
- package/dist/meeting/state.js +16 -26
- package/dist/meeting/state.js.map +1 -1
- package/dist/meeting/util.js +446 -585
- package/dist/meeting/util.js.map +1 -1
- package/dist/meeting-info/collection.js +3 -25
- package/dist/meeting-info/collection.js.map +1 -1
- package/dist/meeting-info/index.js +8 -31
- package/dist/meeting-info/index.js.map +1 -1
- package/dist/meeting-info/meeting-info-v2.js +261 -242
- package/dist/meeting-info/meeting-info-v2.js.map +1 -1
- package/dist/meeting-info/request.js +1 -16
- 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 +156 -232
- package/dist/meeting-info/utilv2.js.map +1 -1
- package/dist/meetings/collection.js +24 -20
- package/dist/meetings/collection.js.map +1 -1
- package/dist/meetings/index.js +526 -372
- package/dist/meetings/index.js.map +1 -1
- package/dist/meetings/meetings.types.js +7 -0
- package/dist/meetings/meetings.types.js.map +1 -0
- package/dist/meetings/request.js +21 -40
- package/dist/meetings/request.js.map +1 -1
- package/dist/meetings/util.js +172 -141
- package/dist/meetings/util.js.map +1 -1
- package/dist/member/index.js +58 -57
- 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 +101 -69
- package/dist/member/util.js.map +1 -1
- package/dist/members/collection.js +12 -12
- package/dist/members/collection.js.map +1 -1
- package/dist/members/index.js +123 -162
- package/dist/members/index.js.map +1 -1
- package/dist/members/request.js +120 -85
- 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 +314 -260
- package/dist/members/util.js.map +1 -1
- package/dist/metrics/config.js +50 -16
- package/dist/metrics/config.js.map +1 -1
- package/dist/metrics/constants.js +4 -7
- package/dist/metrics/constants.js.map +1 -1
- package/dist/metrics/index.js +75 -147
- package/dist/metrics/index.js.map +1 -1
- package/dist/multistream/mediaRequestManager.js +170 -50
- package/dist/multistream/mediaRequestManager.js.map +1 -1
- package/dist/multistream/receiveSlot.js +58 -65
- package/dist/multistream/receiveSlot.js.map +1 -1
- package/dist/multistream/receiveSlotManager.js +73 -94
- 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 +66 -43
- package/dist/multistream/remoteMediaGroup.js.map +1 -1
- package/dist/multistream/remoteMediaManager.js +502 -442
- package/dist/multistream/remoteMediaManager.js.map +1 -1
- package/dist/networkQualityMonitor/index.js +24 -51
- package/dist/networkQualityMonitor/index.js.map +1 -1
- package/dist/personal-meeting-room/index.js +3 -38
- package/dist/personal-meeting-room/index.js.map +1 -1
- package/dist/personal-meeting-room/request.js +2 -33
- 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 +190 -199
- package/dist/reachability/index.js.map +1 -1
- package/dist/reachability/request.js +14 -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 +2 -4
- package/dist/reactions/reactions.js.map +1 -1
- package/dist/reactions/reactions.type.js +18 -24
- package/dist/reactions/reactions.type.js.map +1 -1
- package/dist/reconnection-manager/index.js +356 -476
- 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 +32 -75
- package/dist/roap/index.js.map +1 -1
- package/dist/roap/request.js +129 -136
- package/dist/roap/request.js.map +1 -1
- package/dist/roap/turnDiscovery.js +143 -103
- 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 +369 -462
- package/dist/statsAnalyzer/index.js.map +1 -1
- package/dist/statsAnalyzer/mqaUtil.js +144 -94
- package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
- package/dist/transcription/index.js +9 -44
- package/dist/transcription/index.js.map +1 -1
- package/dist/types/annotation/annotation.types.d.ts +43 -0
- package/dist/types/annotation/constants.d.ts +31 -0
- package/dist/types/annotation/index.d.ts +124 -0
- package/dist/types/breakouts/breakout.d.ts +8 -0
- package/dist/types/breakouts/collection.d.ts +5 -0
- package/dist/types/breakouts/edit-lock-error.d.ts +15 -0
- package/dist/types/breakouts/events.d.ts +2 -0
- package/dist/types/breakouts/index.d.ts +5 -0
- package/dist/types/breakouts/request.d.ts +22 -0
- package/dist/types/breakouts/utils.d.ts +15 -0
- package/dist/types/common/browser-detection.d.ts +9 -0
- package/dist/types/common/collection.d.ts +48 -0
- package/dist/types/common/config.d.ts +2 -0
- package/dist/types/common/errors/captcha-error.d.ts +15 -0
- package/dist/types/common/errors/intent-to-join.d.ts +16 -0
- package/dist/types/common/errors/join-meeting.d.ts +17 -0
- package/dist/types/common/errors/media.d.ts +15 -0
- package/dist/types/common/errors/parameter.d.ts +15 -0
- package/dist/types/common/errors/password-error.d.ts +15 -0
- package/dist/types/common/errors/permission.d.ts +14 -0
- package/dist/types/common/errors/reconnection-in-progress.d.ts +9 -0
- package/dist/types/common/errors/reconnection.d.ts +15 -0
- package/dist/types/common/errors/stats.d.ts +15 -0
- package/dist/types/common/errors/webex-errors.d.ts +69 -0
- package/dist/types/common/errors/webex-meetings-error.d.ts +20 -0
- package/dist/types/common/events/events-scope.d.ts +17 -0
- package/dist/types/common/events/events.d.ts +12 -0
- package/dist/types/common/events/trigger-proxy.d.ts +2 -0
- package/dist/types/common/events/util.d.ts +2 -0
- package/dist/types/common/logs/logger-config.d.ts +2 -0
- package/dist/types/common/logs/logger-proxy.d.ts +2 -0
- package/dist/types/common/logs/request.d.ts +34 -0
- package/dist/types/common/queue.d.ts +32 -0
- package/dist/types/config.d.ts +72 -0
- package/dist/types/constants.d.ts +978 -0
- package/dist/types/controls-options-manager/constants.d.ts +4 -0
- package/dist/types/controls-options-manager/enums.d.ts +15 -0
- package/dist/types/controls-options-manager/index.d.ts +136 -0
- package/dist/types/controls-options-manager/types.d.ts +43 -0
- package/dist/types/controls-options-manager/util.d.ts +1 -0
- package/dist/types/index.d.ts +7 -0
- package/dist/types/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 +315 -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 +34 -0
- package/dist/types/media/properties.d.ts +86 -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 +149 -0
- package/dist/types/meeting/index.d.ts +1509 -0
- package/dist/types/meeting/locusMediaRequest.d.ts +70 -0
- package/dist/types/meeting/muteState.d.ts +184 -0
- package/dist/types/meeting/request.d.ts +270 -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 +75 -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 +122 -0
- package/dist/types/meeting-info/request.d.ts +22 -0
- package/dist/types/meeting-info/util.d.ts +2 -0
- package/dist/types/meeting-info/utilv2.d.ts +2 -0
- package/dist/types/meetings/collection.d.ts +31 -0
- package/dist/types/meetings/index.d.ts +364 -0
- package/dist/types/meetings/meetings.types.d.ts +4 -0
- package/dist/types/meetings/request.d.ts +27 -0
- package/dist/types/meetings/util.d.ts +18 -0
- package/dist/types/member/index.d.ts +157 -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 +353 -0
- package/dist/types/members/request.d.ts +114 -0
- package/dist/types/members/types.d.ts +24 -0
- package/dist/types/members/util.d.ts +210 -0
- package/dist/types/metrics/config.d.ts +195 -0
- package/dist/types/metrics/constants.d.ts +55 -0
- package/dist/types/metrics/index.d.ts +169 -0
- package/dist/types/multistream/mediaRequestManager.d.ts +104 -0
- package/dist/types/multistream/receiveSlot.d.ts +68 -0
- package/dist/types/multistream/receiveSlotManager.d.ts +56 -0
- package/dist/types/multistream/remoteMedia.d.ts +72 -0
- package/dist/types/multistream/remoteMediaGroup.d.ts +47 -0
- package/dist/types/multistream/remoteMediaManager.d.ts +277 -0
- package/dist/types/networkQualityMonitor/index.d.ts +70 -0
- package/dist/types/personal-meeting-room/index.d.ts +47 -0
- package/dist/types/personal-meeting-room/request.d.ts +14 -0
- package/dist/types/personal-meeting-room/util.d.ts +2 -0
- package/dist/types/reachability/index.d.ts +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 +36 -0
- package/dist/types/roap/turnDiscovery.d.ts +91 -0
- package/dist/types/statsAnalyzer/global.d.ts +36 -0
- package/dist/types/statsAnalyzer/index.d.ts +200 -0
- package/dist/types/statsAnalyzer/mqaUtil.d.ts +24 -0
- package/dist/types/transcription/index.d.ts +64 -0
- package/package.json +28 -21
- package/src/annotation/annotation.types.ts +52 -0
- package/src/annotation/constants.ts +36 -0
- package/src/annotation/index.ts +343 -0
- package/src/breakouts/README.md +220 -0
- package/src/breakouts/breakout.ts +163 -0
- package/src/breakouts/collection.ts +19 -0
- package/src/breakouts/edit-lock-error.ts +25 -0
- package/src/breakouts/events.ts +37 -0
- package/src/breakouts/index.ts +921 -0
- package/src/breakouts/request.ts +55 -0
- package/src/breakouts/utils.ts +57 -0
- package/src/common/errors/webex-errors.ts +6 -2
- package/src/common/logs/logger-proxy.ts +1 -1
- package/src/config.ts +5 -7
- package/src/constants.ts +155 -20
- package/src/controls-options-manager/constants.ts +5 -0
- package/src/controls-options-manager/enums.ts +18 -0
- package/src/controls-options-manager/index.ts +278 -0
- package/src/controls-options-manager/types.ts +59 -0
- package/src/controls-options-manager/util.ts +286 -0
- package/src/index.ts +34 -0
- package/src/locus-info/controlsUtils.ts +108 -0
- package/src/locus-info/index.ts +310 -21
- package/src/locus-info/mediaSharesUtils.ts +48 -0
- package/src/locus-info/parser.ts +2 -1
- package/src/locus-info/selfUtils.ts +71 -1
- package/src/media/index.ts +70 -142
- package/src/media/properties.ts +41 -104
- package/src/mediaQualityMetrics/config.ts +379 -377
- package/src/meeting/in-meeting-actions.ts +156 -0
- package/src/meeting/index.ts +1730 -1768
- package/src/meeting/locusMediaRequest.ts +309 -0
- package/src/meeting/muteState.ts +228 -132
- package/src/meeting/request.ts +100 -91
- package/src/meeting/request.type.ts +2 -0
- package/src/meeting/util.ts +421 -421
- package/src/meeting-info/meeting-info-v2.ts +134 -13
- package/src/meeting-info/utilv2.ts +13 -3
- package/src/meetings/collection.ts +20 -0
- package/src/meetings/index.ts +375 -83
- package/src/meetings/meetings.types.ts +9 -0
- package/src/meetings/request.ts +3 -1
- package/src/meetings/util.ts +103 -4
- package/src/member/index.ts +40 -0
- package/src/member/types.ts +24 -0
- package/src/member/util.ts +81 -1
- package/src/members/collection.ts +8 -0
- package/src/members/index.ts +108 -6
- package/src/members/request.ts +98 -17
- package/src/members/types.ts +28 -0
- package/src/members/util.ts +319 -240
- package/src/metrics/config.ts +49 -10
- package/src/metrics/constants.ts +2 -4
- package/src/metrics/index.ts +43 -27
- package/src/multistream/mediaRequestManager.ts +210 -45
- package/src/multistream/receiveSlot.ts +68 -26
- package/src/multistream/receiveSlotManager.ts +61 -38
- package/src/multistream/remoteMedia.ts +29 -3
- package/src/multistream/remoteMediaGroup.ts +61 -2
- package/src/multistream/remoteMediaManager.ts +260 -66
- package/src/networkQualityMonitor/index.ts +6 -6
- package/src/reachability/index.ts +75 -25
- package/src/reachability/request.ts +10 -5
- package/src/reactions/constants.ts +4 -0
- package/src/reactions/reactions.ts +4 -4
- package/src/reactions/reactions.type.ts +28 -3
- package/src/reconnection-manager/index.ts +53 -32
- 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.ts +21 -30
- package/src/roap/request.ts +51 -52
- package/src/roap/turnDiscovery.ts +51 -27
- package/src/statsAnalyzer/global.ts +1 -94
- package/src/statsAnalyzer/index.ts +380 -390
- package/src/statsAnalyzer/mqaUtil.ts +106 -99
- package/test/integration/spec/converged-space-meetings.js +233 -0
- package/test/integration/spec/journey.js +332 -255
- package/test/integration/spec/space-meeting.js +78 -5
- package/test/integration/spec/transcription.js +1 -1
- package/test/unit/spec/annotation/index.ts +436 -0
- package/test/unit/spec/breakouts/breakout.ts +203 -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 +77 -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/controls-options-manager/index.js +287 -0
- package/test/unit/spec/controls-options-manager/util.js +518 -0
- package/test/unit/spec/fixture/locus.js +1 -0
- package/test/unit/spec/locus-info/controlsUtils.js +303 -30
- package/test/unit/spec/locus-info/index.js +615 -4
- package/test/unit/spec/locus-info/mediaSharesUtils.ts +22 -0
- package/test/unit/spec/locus-info/selfConstant.js +38 -0
- package/test/unit/spec/locus-info/selfUtils.js +200 -0
- package/test/unit/spec/media/index.ts +118 -22
- package/test/unit/spec/media/properties.ts +9 -9
- package/test/unit/spec/meeting/in-meeting-actions.ts +76 -0
- package/test/unit/spec/meeting/index.js +2394 -1381
- package/test/unit/spec/meeting/locusMediaRequest.ts +436 -0
- package/test/unit/spec/meeting/muteState.js +370 -208
- package/test/unit/spec/meeting/request.js +354 -42
- package/test/unit/spec/meeting/utils.js +268 -156
- package/test/unit/spec/meeting-info/meetinginfov2.js +383 -5
- package/test/unit/spec/meeting-info/utilv2.js +21 -0
- package/test/unit/spec/meetings/collection.js +14 -0
- package/test/unit/spec/meetings/index.js +842 -128
- package/test/unit/spec/meetings/utils.js +206 -2
- package/test/unit/spec/member/index.js +24 -0
- package/test/unit/spec/member/util.js +384 -32
- package/test/unit/spec/members/index.js +320 -1
- package/test/unit/spec/members/request.js +206 -27
- package/test/unit/spec/members/utils.js +184 -0
- package/test/unit/spec/metrics/index.js +98 -0
- package/test/unit/spec/multistream/mediaRequestManager.ts +676 -105
- package/test/unit/spec/multistream/receiveSlot.ts +77 -18
- package/test/unit/spec/multistream/receiveSlotManager.ts +69 -39
- package/test/unit/spec/multistream/remoteMedia.ts +32 -2
- package/test/unit/spec/multistream/remoteMediaGroup.ts +271 -5
- package/test/unit/spec/multistream/remoteMediaManager.ts +672 -65
- package/test/unit/spec/networkQualityMonitor/index.js +4 -4
- package/test/unit/spec/reachability/index.ts +176 -25
- package/test/unit/spec/reachability/request.js +66 -0
- package/test/unit/spec/reconnection-manager/index.js +46 -13
- 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 +21 -51
- package/test/unit/spec/roap/request.ts +187 -0
- package/test/unit/spec/roap/turnDiscovery.ts +73 -34
- package/test/unit/spec/stats-analyzer/index.js +94 -43
- 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/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 -334
- package/dist/meeting/effectsState.js.map +0 -1
- package/dist/multistream/multistreamMedia.js +0 -117
- package/dist/multistream/multistreamMedia.js.map +0 -1
- package/src/index.js +0 -15
- package/src/media/internal-media-core-wrapper.ts +0 -9
- package/src/meeting/effectsState.ts +0 -211
- package/src/multistream/multistreamMedia.ts +0 -93
- package/test/unit/spec/meeting/effectsState.js +0 -281
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["OSMap","OS_NAME","chrome","macOS","MAC","Windows","WINDOWS","iOS","IOS","Android","ANDROID","Linux","LINUX","BrowserDetection","getOSName","getOSVersion","getBrowserName","getBrowserVersion","anonymizeIPAddress","localIp","anonymize","triggerTimers","event","meeting","data","eventType","CALL_INITIATED","setStartCallInitiateJoinReq","LOCUS_JOIN_REQUEST","setEndCallInitiateJoinReq","setStartJoinReqResp","LOCUS_JOIN_RESPONSE","setEndJoinReqResp","setStartSetupDelay","mediaType","AUDIO","VIDEO","setStartSendingMediaDelay","RECEIVING_MEDIA_START","setEndSetupDelay","SENDING_MEDIA_START","setEndSendingMediaDelay","LOCAL_SDP_GENERATED","setStartLocalSDPGenRemoteSDPRecvDelay","REMOTE_SDP_RECEIVED","setEndLocalSDPGenRemoteSDPRecvDelay","Metrics","instance","_events","meetingCollection","keys","webex","options","meetingId","indexOf","LoggerProxy","logger","error","get","callEvents","MEDIA_QUALITY","sendMediaQualityAnalyzerMetrics","push","sendCallAnalyzerMetrics","info","identifiers","payload","eventId","uuid","v4","version","origin","name","networkType","userAgent","userAgentToString","clientInfo","clientType","clientVersion","CLIENT_NAME","localNetworkPrefix","meetings","geoHintInfo","clientAddress","osVersion","subClientType","os","getOsName","browser","browserVersion","originTime","triggered","Date","toISOString","senderCountryCode","countryCode","canProceed","eventData","webClientDomain","window","location","hostname","Object","prototype","hasOwnProperty","call","errors","trigger","pstnAudioType","mediaCapabilities","recoveredBy","joinTimes","isRoapCallEnabled","OTHERS","audioSetupDelay","videoSetupDelay","UNKNOWN","intervals","intervalData","sourceMetadata","applicationSoftwareType","applicationSoftwareVersion","mediaEngineSoftwareType","mediaEngineSoftwareVersion","startTime","err","showToUser","errorCode","statusCode","body","ERROR_CODE","MEETING_ERRORS","FREE_USER_MAX_PARTICIPANTS_EXCEEDED","PAID_USER_MAX_PARTICIPANTS_EXCEEDED","SERVICE_MAX_PARTICIPANTS_EXCEEDED","INACTIVE","EXCEEDED_MAX_JOINED_PARTICIPANTS","EXCEEDED_SERVICE_MAX_PARTICIPANTS","MEETING_IS_LOCKED","MEETING_IS_TERMINATING","MEETING_REQUIRE_MODERATOR_PIN_INTENT","MEETING_REQUIRE_MODERATOR_PIN","MEETING_REQUIRE_MODERATOR_ROLE","JOIN_RESTRICTED_USER","GET_RESTRICTED_USER","CREATE_MEDIA_RESTRICTED_USER","JOIN_RESTRICTED_USER_NOT_IN_ROOM","MEETING_NOT_FOUND","NOT_WEBEX_SITE","INVALID_JOIN_TIME","PHONE_NUMBER_NOT_A_NUMBER","PHONE_NUMBER_TOO_LONG","INVALID_DIALABLE_KEY","ONE_ON_ONE_TO_SELF_NOT_ALLOWED","REMOVED_PARTICIPANT","MEETING_LINK_NOT_FOUND","PHONE_NUMBER_TOO_SHORT_AFTER_IDD","INVALID_INVITEE_ADDRESS","PMR_ACCOUNT_LOCKED","RESOURCE_GUEST_FORBIDDEN","PMR_ACCOUNT_SUSPENDED","EMPTY_PHONE_NUMBER_OR_COUNTRY_CODE","INVALID_SINCE_OR_SEQUENCE_HASH_IN_REQUEST","CONVERSATION_NOT_FOUND","RECORDING_CONTROL_NOT_SUPPORTED","RECORDING_NOT_STARTED","RECORDING_NOT_ENABLED","generateErrorPayload","LOCUS_RESPONSE","shownToUser","errorPayload","category","errorDescription","fatal","notFatalErrorList","OTHER","errorData","httpCode","userAgentOption","browserInfo","util","format","metrics","clientName","toLowerCase","split","osInfo","process","env","NODE_ENV","metricName","metricFields","metricTags","internal","submitClientMetrics","type","config","fields","tags"],"sources":["index.ts"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\nimport util from 'util';\n\nimport {includes} from 'lodash';\nimport uuid from 'uuid';\nimport window from 'global/window';\nimport anonymize from 'ip-anonymize';\n\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport {MEETING_ERRORS} from '../constants';\nimport BrowserDetection from '../common/browser-detection';\n\nimport {\n error,\n eventType,\n errorCodes as ERROR_CODE,\n OS_NAME,\n UNKNOWN,\n CLIENT_NAME,\n mediaType,\n} from './config';\n\nconst OSMap = {\n // @ts-ignore\n 'Chrome OS': OS_NAME.chrome,\n macOS: OS_NAME.MAC,\n Windows: OS_NAME.WINDOWS,\n iOS: OS_NAME.IOS,\n Android: OS_NAME.ANDROID,\n Linux: OS_NAME.LINUX,\n};\n\nconst {getOSName, getOSVersion, getBrowserName, getBrowserVersion} = BrowserDetection();\n\n// Apply a CIDR /28 format to the IPV4 and /96 to the IPV6 addresses\n// For reference : https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing\nconst anonymizeIPAddress = (localIp) => anonymize(localIp, 28, 96);\n\nconst triggerTimers = ({event, meeting, data}) => {\n switch (event) {\n case eventType.CALL_INITIATED:\n meeting.setStartCallInitiateJoinReq();\n break;\n case eventType.LOCUS_JOIN_REQUEST:\n meeting.setEndCallInitiateJoinReq();\n meeting.setStartJoinReqResp();\n break;\n case eventType.LOCUS_JOIN_RESPONSE:\n meeting.setEndJoinReqResp();\n meeting.setStartSetupDelay(mediaType.AUDIO);\n meeting.setStartSetupDelay(mediaType.VIDEO);\n meeting.setStartSendingMediaDelay(mediaType.AUDIO);\n meeting.setStartSendingMediaDelay(mediaType.VIDEO);\n break;\n case eventType.RECEIVING_MEDIA_START:\n meeting.setEndSetupDelay(data.mediaType);\n break;\n case eventType.SENDING_MEDIA_START:\n meeting.setEndSendingMediaDelay(data.mediaType);\n break;\n case eventType.LOCAL_SDP_GENERATED:\n meeting.setStartLocalSDPGenRemoteSDPRecvDelay();\n break;\n case eventType.REMOTE_SDP_RECEIVED:\n meeting.setEndLocalSDPGenRemoteSDPRecvDelay();\n break;\n default:\n break;\n }\n};\n\n/**\n * @description Metrics handles all the call metrics events\n * @export\n * @class Metrics\n */\nclass Metrics {\n static instance: Metrics;\n\n _events: any;\n keys: any;\n meetingCollection: any;\n webex: any;\n\n /**\n * Create Metrics Object\n * @constructor\n * @public\n * @memberof Meetings\n */\n constructor() {\n if (!Metrics.instance) {\n /**\n * @instance\n * @type {Array}\n * @private\n * @memberof Metrics\n */\n this._events = [];\n /**\n * @instance\n * @type {MeetingCollection}\n * @private\n * @memberof Metrics\n */\n this.meetingCollection = null;\n /**\n * @instance\n * @type {MeetingCollection}\n * @private\n * @memberof Metrics\n */\n this.keys = Object.values(eventType);\n /**\n * @instance\n * @type {Metrics}\n * @private\n * @memberof Metrics\n */\n Metrics.instance = this;\n }\n\n // eslint-disable-next-line no-constructor-return\n return Metrics.instance;\n }\n\n /**\n * Initializes the Metrics singleton with a meeting Collection.\n *\n * @param {Object} meetingCollection meetings object\n * @param {Object} webex webex SDK object\n *\n * @returns {void}\n */\n initialSetup(meetingCollection: object, webex: object) {\n this.meetingCollection = meetingCollection;\n this.webex = webex;\n }\n\n /**\n * poste Meeting event metrics\n * @param {object} options {meetingId/meeting} as a json object\n * @param {Meeting} options.meeting Meeting object\n * @param {String} options.meetingId\n * @param {object} options.data\n * @param {object} options.event\n * @returns {object} null\n */\n postEvent(options: {meeting?: any; meetingId?: string; data?: object; event?: any} | any) {\n const {meetingId, data = {}, event} = options;\n let {meeting} = options;\n\n if (this.keys.indexOf(event) === -1) {\n LoggerProxy.logger.error(\n `Metrics:index#postEvent --> Event ${event} doesn't exist in dictionary`\n );\n }\n\n if (!meeting && meetingId) {\n meeting = this.meetingCollection.get(meetingId);\n options.meeting = meeting;\n }\n\n if (meeting) {\n triggerTimers(options);\n\n if (!meeting.callEvents) {\n meeting.callEvents = [];\n }\n if (event === eventType.MEDIA_QUALITY) {\n data.event = event;\n meeting.sendMediaQualityAnalyzerMetrics(data);\n } else {\n meeting.callEvents.push(event);\n data.event = event;\n meeting.sendCallAnalyzerMetrics(data);\n }\n } else {\n LoggerProxy.logger.info(\n `Metrics:index#postEvent --> Event received for meetingId:${meetingId}, but meeting not found in collection.`\n );\n }\n }\n\n /**\n * Docs for Call analyzer metrics\n * https://sqbu-github.cisco.com/WebExSquared/call-analyzer/wiki\n * https://sqbu-github.cisco.com/WebExSquared/event-dictionary/blob/master/diagnostic-events.raml\n */\n\n // eslint-disable-next-line @typescript-eslint/no-shadow\n initPayload(eventType, identifiers, options) {\n const payload: any = {\n eventId: uuid.v4(),\n version: 1,\n origin: {\n name: 'endpoint',\n networkType: 'unknown',\n userAgent: this.userAgentToString(),\n clientInfo: {\n clientType: options.clientType,\n clientVersion: `${CLIENT_NAME}/${this.webex.version}`,\n localNetworkPrefix: anonymizeIPAddress(this.webex.meetings.geoHintInfo?.clientAddress),\n osVersion: getOSVersion() || 'unknown',\n subClientType: options.subClientType,\n os: this.getOsName(),\n browser: getBrowserName(),\n browserVersion: getBrowserVersion(),\n },\n },\n originTime: {\n triggered: new Date().toISOString(),\n },\n senderCountryCode: this.webex.meetings.geoHintInfo?.countryCode,\n event: {\n name: eventType,\n canProceed: true,\n identifiers,\n eventData: {webClientDomain: window.location.hostname},\n },\n };\n\n // TODO: more options should be checked and some of them should be mandatory in certain conditions\n if (options) {\n if (Object.prototype.hasOwnProperty.call(options, 'canProceed')) {\n payload.event.canProceed = options.canProceed;\n }\n if (options.errors) {\n payload.event.errors = options.errors;\n }\n if (options.mediaType) {\n payload.event.mediaType = options.mediaType;\n }\n if (options.trigger) {\n payload.event.trigger = options.trigger;\n }\n if (options.pstnAudioType) {\n payload.event.pstnAudioType = options.pstnAudioType;\n }\n if (options.mediaCapabilities) {\n payload.event.mediaCapabilities = options.mediaCapabilities;\n }\n if (options.recoveredBy) {\n payload.event.recoveredBy = options.recoveredBy;\n }\n if (options.joinTimes) {\n payload.event.joinTimes = options.joinTimes;\n }\n if (options.isRoapCallEnabled) {\n payload.event.isRoapCallEnabled = options.isRoapCallEnabled;\n }\n }\n\n return payload;\n }\n\n /**\n * returns metrics friendly OS versions\n * @param {String} osName Os name\n * @returns {String}\n * @private\n * @memberof Metrics\n */\n private getOsName() {\n return OSMap[getOSName()] ?? OS_NAME.OTHERS;\n }\n\n /**\n * get the payload specific for a media quality event through call analyzer\n * @param {String} eventType the event name\n * @param {Object} identifiers contains the identifiers needed for CA\n * @param {String} identifiers.correlationId\n * @param {String} identifiers.locusUrl\n * @param {String} identifiers.locusId\n * @param {Object} options\n * @param {Object} options.intervalData\n * @param {String} options.clientType\n * @returns {Object}\n * @public\n * @memberof Metrics\n */\n public initMediaPayload(\n // eslint-disable-next-line @typescript-eslint/no-shadow\n eventType: string,\n identifiers: {\n correlationId: string;\n locusUrl: string;\n locusId: string;\n },\n options:\n | {\n intervalData: object;\n clientType: string;\n }\n | any = {}\n ) {\n const {audioSetupDelay, videoSetupDelay, joinTimes} = options;\n\n const payload = {\n eventId: uuid.v4(),\n version: 1,\n origin: {\n audioSetupDelay,\n videoSetupDelay,\n name: 'endpoint',\n networkType: options.networkType || UNKNOWN,\n userAgent: this.userAgentToString(),\n clientInfo: {\n clientType: options.clientType, // TODO: Only clientType: 'TEAMS_CLIENT' is whitelisted\n clientVersion: `${CLIENT_NAME}/${this.webex.version}`,\n localNetworkPrefix: anonymizeIPAddress(this.webex.meetings.geoHintInfo?.clientAddress),\n os: this.getOsName(),\n osVersion: getOSVersion() || UNKNOWN,\n subClientType: options.subClientType,\n browser: getBrowserName(),\n browserVersion: getBrowserVersion(),\n },\n },\n originTime: {\n triggered: new Date().toISOString(),\n },\n senderCountryCode: this.webex.meetings.geoHintInfo?.countryCode,\n event: {\n name: eventType,\n canProceed: true,\n identifiers,\n intervals: [options.intervalData],\n joinTimes,\n eventData: {\n webClientDomain: window.location.hostname,\n },\n sourceMetadata: {\n applicationSoftwareType: CLIENT_NAME,\n applicationSoftwareVersion: this.webex.version,\n mediaEngineSoftwareType: getBrowserName() || 'browser',\n mediaEngineSoftwareVersion: getOSVersion() || UNKNOWN,\n startTime: new Date().toISOString(),\n },\n },\n };\n\n return payload;\n }\n\n /**\n * This function Parses a Locus error and returns a diagnostic event payload.\n * It should keep updating from:\n * https://sqbu-github.cisco.com/WebExSquared/spark-client-framework/blob/master/spark-client-framework/Adapters/TelephonyAdapter/TelephonyAdapter.cpp#L920\n *\n * @param {Object} err the error Object from Locus response\n * @param {boolean} showToUser true if a toast is shown to user\n * @returns {{showToUser: boolean, category: string, errorDescription: string,\n * errorCode: number, errorData: *, fatal: boolean, name: string}}\n */\n parseLocusError(err: any, showToUser: boolean) {\n let errorCode;\n\n if (err && err.statusCode && err.statusCode >= 500) {\n errorCode = 1003;\n } else if (err && err.body && err.body.errorCode) {\n // locus error codes: https://sqbu-github.cisco.com/WebExSquared/locus/blob/master/server/src/main/resources/locus-error-codes.properties\n switch (ERROR_CODE[err.body.errorCode]) {\n case MEETING_ERRORS.FREE_USER_MAX_PARTICIPANTS_EXCEEDED:\n errorCode = 3007;\n break;\n case MEETING_ERRORS.PAID_USER_MAX_PARTICIPANTS_EXCEEDED:\n case MEETING_ERRORS.SERVICE_MAX_PARTICIPANTS_EXCEEDED:\n errorCode = 3002;\n break;\n case MEETING_ERRORS.INACTIVE:\n errorCode = 4001;\n break;\n case MEETING_ERRORS.EXCEEDED_MAX_JOINED_PARTICIPANTS:\n case MEETING_ERRORS.EXCEEDED_SERVICE_MAX_PARTICIPANTS:\n errorCode = 3001;\n break;\n case MEETING_ERRORS.MEETING_IS_LOCKED:\n errorCode = 4002;\n break;\n case MEETING_ERRORS.MEETING_IS_TERMINATING:\n errorCode = 4003;\n break;\n case MEETING_ERRORS.MEETING_REQUIRE_MODERATOR_PIN_INTENT:\n errorCode = 4004;\n break;\n case MEETING_ERRORS.MEETING_REQUIRE_MODERATOR_PIN:\n errorCode = 4005;\n break;\n case MEETING_ERRORS.MEETING_REQUIRE_MODERATOR_ROLE:\n errorCode = 4006;\n break;\n case MEETING_ERRORS.JOIN_RESTRICTED_USER:\n case MEETING_ERRORS.GET_RESTRICTED_USER:\n case MEETING_ERRORS.CREATE_MEDIA_RESTRICTED_USER:\n errorCode = 3005;\n break;\n case MEETING_ERRORS.JOIN_RESTRICTED_USER_NOT_IN_ROOM:\n errorCode = 4007;\n break;\n case MEETING_ERRORS.MEETING_NOT_FOUND:\n errorCode = 4011;\n break;\n case MEETING_ERRORS.NOT_WEBEX_SITE:\n errorCode = 4012;\n break;\n case MEETING_ERRORS.INVALID_JOIN_TIME:\n errorCode = 4013;\n break;\n case MEETING_ERRORS.PHONE_NUMBER_NOT_A_NUMBER:\n errorCode = 4016;\n break;\n case MEETING_ERRORS.PHONE_NUMBER_TOO_LONG:\n errorCode = 4017;\n break;\n case MEETING_ERRORS.INVALID_DIALABLE_KEY:\n errorCode = 4018;\n break;\n case MEETING_ERRORS.ONE_ON_ONE_TO_SELF_NOT_ALLOWED:\n errorCode = 4019;\n break;\n case MEETING_ERRORS.REMOVED_PARTICIPANT:\n errorCode = 4020;\n break;\n case MEETING_ERRORS.MEETING_LINK_NOT_FOUND:\n errorCode = 4021;\n break;\n case MEETING_ERRORS.PHONE_NUMBER_TOO_SHORT_AFTER_IDD:\n errorCode = 4022;\n break;\n case MEETING_ERRORS.INVALID_INVITEE_ADDRESS:\n errorCode = 4023;\n break;\n case MEETING_ERRORS.PMR_ACCOUNT_LOCKED:\n errorCode = 4024;\n break;\n case MEETING_ERRORS.RESOURCE_GUEST_FORBIDDEN:\n errorCode = 4025;\n break;\n case MEETING_ERRORS.PMR_ACCOUNT_SUSPENDED:\n errorCode = 4026;\n break;\n case MEETING_ERRORS.EMPTY_PHONE_NUMBER_OR_COUNTRY_CODE:\n errorCode = 4027;\n break;\n case MEETING_ERRORS.INVALID_SINCE_OR_SEQUENCE_HASH_IN_REQUEST:\n errorCode = 1006;\n break;\n case MEETING_ERRORS.CONVERSATION_NOT_FOUND:\n errorCode = 4028;\n break;\n case MEETING_ERRORS.RECORDING_CONTROL_NOT_SUPPORTED:\n case MEETING_ERRORS.RECORDING_NOT_STARTED:\n case MEETING_ERRORS.RECORDING_NOT_ENABLED:\n errorCode = 4029;\n break;\n default:\n errorCode = 4008;\n }\n } else {\n errorCode = 4008;\n }\n\n return this.generateErrorPayload(errorCode, showToUser, error.name.LOCUS_RESPONSE, err);\n }\n\n generateErrorPayload(errorCode, shownToUser, name, err) {\n if (error.errors[errorCode]) {\n const errorPayload: any = {\n shownToUser: shownToUser || false,\n category: error.errors[errorCode][2],\n errorDescription: error.errors[errorCode][0],\n errorCode,\n fatal: !includes(error.notFatalErrorList, errorCode),\n name: name || error.name.OTHER,\n };\n\n if (err && err.body) {\n errorPayload.errorData = err.body;\n }\n\n if (err && err.statusCode) {\n errorPayload.httpCode = err.statusCode;\n }\n\n return errorPayload;\n }\n\n return null;\n }\n\n /**\n * Returns a formated string of the user agent.\n *\n * @returns {string} formatted user agent information\n */\n userAgentToString() {\n let userAgentOption;\n let browserInfo;\n const clientInfo = util.format('client=%s', `${this.webex.meetings?.metrics?.clientName}`);\n\n if (\n ['chrome', 'firefox', 'msie', 'msedge', 'safari'].indexOf(getBrowserName().toLowerCase()) !==\n -1\n ) {\n browserInfo = util.format(\n 'browser=%s',\n `${getBrowserName().toLowerCase()}/${getBrowserVersion().split('.')[0]}`\n );\n }\n const osInfo = util.format('os=%s', `${getOSName()}/${getOSVersion().split('.')[0]}`);\n\n if (browserInfo) {\n userAgentOption = `(${browserInfo}`;\n }\n if (osInfo) {\n userAgentOption = userAgentOption\n ? `${userAgentOption}; ${clientInfo}; ${osInfo}`\n : `${clientInfo}; (${osInfo}`;\n }\n if (userAgentOption) {\n userAgentOption += ')';\n\n return util.format(\n 'webex-js-sdk/%s %s',\n `${process.env.NODE_ENV}-${this.webex.version}`,\n userAgentOption\n );\n }\n\n return util.format('webex-js-sdk/%s', `${process.env.NODE_ENV}-${this.webex.version}`);\n }\n\n /**\n * Uploads given metric to the Metrics service as an Behavioral metric.\n * Metadata about the environment such as browser, OS, SDK and their versions\n * are automatically added when the metric is sent.\n *\n * The Metrics service will send an Behavioral metric to InfluxDB for\n * aggregation.\n * See https://confluence-eng-gpk2.cisco.com/conf/display/WBXT/Getting+started+with+Metrics+Service.\n *\n * @param {string} metricName Name of the metric (measurement) to send\n * @param {Object} metricFields Key-valye pairs of data or values about this metric\n * @param {Object} metricTags Key-value pairs of metric metadata\n *\n * @returns {void}\n */\n sendBehavioralMetric(metricName: string, metricFields: object = {}, metricTags: object = {}) {\n this.webex.internal.metrics.submitClientMetrics(metricName, {\n type: this.webex.config.metrics.type,\n fields: metricFields,\n tags: metricTags,\n });\n }\n}\n\n// Export Metrics singleton ---------------------------------------------------\nconst instance = new Metrics();\n\nexport default instance;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"names":["BrowserDetection","getOSName","getOSVersion","getBrowserName","getBrowserVersion","anonymizeIPAddress","localIp","anonymize","triggerTimers","event","meeting","data","eventType","CALL_INITIATED","setStartCallInitJoinReq","LOCUS_JOIN_REQUEST","setEndCallInitJoinReq","setStartJoinReqResp","LOCUS_JOIN_RESPONSE","setEndJoinReqResp","setStartSetupDelay","mediaType","AUDIO","VIDEO","setStartSendingMediaDelay","RECEIVING_MEDIA_START","setEndSetupDelay","SENDING_MEDIA_START","setEndSendingMediaDelay","LOCAL_SDP_GENERATED","setStartLocalSDPGenRemoteSDPRecvDelay","REMOTE_SDP_RECEIVED","setEndLocalSDPGenRemoteSDPRecvDelay","Metrics","instance","_events","meetingCollection","keys","webex","options","meetingId","indexOf","LoggerProxy","logger","error","get","callEvents","MEDIA_QUALITY","sendMediaQualityAnalyzerMetrics","push","sendCallAnalyzerMetrics","info","identifiers","payload","eventId","uuid","v4","version","origin","name","networkType","userAgent","userAgentToString","userType","loginType","channel","clientInfo","clientType","clientVersion","CLIENT_NAME","localNetworkPrefix","meetings","geoHintInfo","clientAddress","osVersion","subClientType","os","getOSNameInternal","browser","browserVersion","originTime","triggered","Date","toISOString","senderCountryCode","countryCode","canProceed","eventData","webClientDomain","window","location","hostname","Object","prototype","hasOwnProperty","call","errors","trigger","pstnAudioType","mediaCapabilities","recoveredBy","joinTimes","isRoapCallEnabled","forEach","item","audioSetupDelay","videoSetupDelay","UNKNOWN","intervals","intervalData","sourceMetadata","applicationSoftwareType","applicationSoftwareVersion","mediaEngineSoftwareType","mediaEngineSoftwareVersion","startTime","err","showToUser","errorCode","statusCode","body","ERROR_CODE","MEETING_ERRORS","FREE_USER_MAX_PARTICIPANTS_EXCEEDED","PAID_USER_MAX_PARTICIPANTS_EXCEEDED","SERVICE_MAX_PARTICIPANTS_EXCEEDED","INACTIVE","EXCEEDED_MAX_JOINED_PARTICIPANTS","EXCEEDED_SERVICE_MAX_PARTICIPANTS","MEETING_IS_LOCKED","MEETING_IS_TERMINATING","MEETING_REQUIRE_MODERATOR_PIN_INTENT","MEETING_REQUIRE_MODERATOR_PIN","MEETING_REQUIRE_MODERATOR_ROLE","JOIN_RESTRICTED_USER","GET_RESTRICTED_USER","CREATE_MEDIA_RESTRICTED_USER","JOIN_RESTRICTED_USER_NOT_IN_ROOM","MEETING_NOT_FOUND","NOT_WEBEX_SITE","INVALID_JOIN_TIME","PHONE_NUMBER_NOT_A_NUMBER","PHONE_NUMBER_TOO_LONG","INVALID_DIALABLE_KEY","ONE_ON_ONE_TO_SELF_NOT_ALLOWED","REMOVED_PARTICIPANT","MEETING_LINK_NOT_FOUND","PHONE_NUMBER_TOO_SHORT_AFTER_IDD","INVALID_INVITEE_ADDRESS","PMR_ACCOUNT_LOCKED","RESOURCE_GUEST_FORBIDDEN","PMR_ACCOUNT_SUSPENDED","EMPTY_PHONE_NUMBER_OR_COUNTRY_CODE","INVALID_SINCE_OR_SEQUENCE_HASH_IN_REQUEST","CONVERSATION_NOT_FOUND","RECORDING_CONTROL_NOT_SUPPORTED","RECORDING_NOT_STARTED","RECORDING_NOT_ENABLED","generateErrorPayload","LOCUS_RESPONSE","serviceErrorCode","code","clientCodeError","WebexAPIServiceErrorCodes","OTHER","shownToUser","errorPayload","category","errorDescription","fatal","notFatalErrorList","errorData","httpCode","userAgentOption","browserInfo","util","format","metrics","clientName","toLowerCase","split","osInfo","process","env","NODE_ENV","metricName","metricFields","metricTags","internal","submitClientMetrics","type","config","fields","tags"],"sources":["index.ts"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\nimport util from 'util';\n\nimport {includes} from 'lodash';\nimport uuid from 'uuid';\nimport window from 'global/window';\nimport anonymize from 'ip-anonymize';\n\nimport {getOSNameInternal} from '@webex/internal-plugin-metrics';\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport {MEETING_ERRORS} from '../constants';\nimport BrowserDetection from '../common/browser-detection';\n\nimport {\n error,\n eventType,\n errorCodes as ERROR_CODE,\n UNKNOWN,\n CLIENT_NAME,\n mediaType,\n WebexAPIServiceErrorCodes,\n} from './config';\n\nconst {getOSName, getOSVersion, getBrowserName, getBrowserVersion} = BrowserDetection();\n\n// Apply a CIDR /28 format to the IPV4 and /96 to the IPV6 addresses\n// For reference : https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing\nconst anonymizeIPAddress = (localIp) => anonymize(localIp, 28, 96);\n\nconst triggerTimers = ({event, meeting, data}) => {\n switch (event) {\n case eventType.CALL_INITIATED:\n meeting.setStartCallInitJoinReq();\n break;\n case eventType.LOCUS_JOIN_REQUEST:\n meeting.setEndCallInitJoinReq();\n meeting.setStartJoinReqResp();\n break;\n case eventType.LOCUS_JOIN_RESPONSE:\n meeting.setEndJoinReqResp();\n meeting.setStartSetupDelay(mediaType.AUDIO);\n meeting.setStartSetupDelay(mediaType.VIDEO);\n meeting.setStartSendingMediaDelay(mediaType.AUDIO);\n meeting.setStartSendingMediaDelay(mediaType.VIDEO);\n break;\n case eventType.RECEIVING_MEDIA_START:\n meeting.setEndSetupDelay(data.mediaType);\n break;\n case eventType.SENDING_MEDIA_START:\n meeting.setEndSendingMediaDelay(data.mediaType);\n break;\n case eventType.LOCAL_SDP_GENERATED:\n meeting.setStartLocalSDPGenRemoteSDPRecvDelay();\n break;\n case eventType.REMOTE_SDP_RECEIVED:\n meeting.setEndLocalSDPGenRemoteSDPRecvDelay();\n break;\n default:\n break;\n }\n};\n\n/**\n * @description Metrics handles all the call metrics events\n * @export\n * @class Metrics\n */\nclass Metrics {\n static instance: Metrics;\n\n _events: any;\n keys: any;\n meetingCollection: any;\n webex: any;\n\n /**\n * Create Metrics Object\n * @constructor\n * @public\n * @memberof Meetings\n */\n constructor() {\n if (!Metrics.instance) {\n /**\n * @instance\n * @type {Array}\n * @private\n * @memberof Metrics\n */\n this._events = [];\n /**\n * @instance\n * @type {MeetingCollection}\n * @private\n * @memberof Metrics\n */\n this.meetingCollection = null;\n /**\n * @instance\n * @type {MeetingCollection}\n * @private\n * @memberof Metrics\n */\n this.keys = Object.values(eventType);\n /**\n * @instance\n * @type {Metrics}\n * @private\n * @memberof Metrics\n */\n Metrics.instance = this;\n }\n\n // eslint-disable-next-line no-constructor-return\n return Metrics.instance;\n }\n\n /**\n * Initializes the Metrics singleton with a meeting Collection.\n *\n * @param {Object} meetingCollection meetings object\n * @param {Object} webex webex SDK object\n *\n * @returns {void}\n */\n initialSetup(meetingCollection: object, webex: object) {\n this.meetingCollection = meetingCollection;\n this.webex = webex;\n }\n\n /**\n * poste Meeting event metrics\n * @param {object} options {meetingId/meeting} as a json object\n * @param {Meeting} options.meeting Meeting object\n * @param {String} options.meetingId\n * @param {object} options.data\n * @param {object} options.event\n * @returns {object} null\n */\n postEvent(options: {meeting?: any; meetingId?: string; data?: object; event?: any} | any) {\n const {meetingId, data = {}, event} = options;\n let {meeting} = options;\n\n if (this.keys.indexOf(event) === -1) {\n LoggerProxy.logger.error(\n `Metrics:index#postEvent --> Event ${event} doesn't exist in dictionary`\n );\n }\n\n if (!meeting && meetingId) {\n meeting = this.meetingCollection.get(meetingId);\n options.meeting = meeting;\n }\n\n if (meeting) {\n triggerTimers(options);\n\n if (!meeting.callEvents) {\n meeting.callEvents = [];\n }\n if (event === eventType.MEDIA_QUALITY) {\n data.event = event;\n meeting.sendMediaQualityAnalyzerMetrics(data);\n } else {\n meeting.callEvents.push(event);\n data.event = event;\n meeting.sendCallAnalyzerMetrics(data);\n }\n } else {\n LoggerProxy.logger.info(\n `Metrics:index#postEvent --> Event received for meetingId:${meetingId}, but meeting not found in collection.`\n );\n }\n }\n\n /**\n * Docs for Call analyzer metrics\n * https://sqbu-github.cisco.com/WebExSquared/call-analyzer/wiki\n * https://sqbu-github.cisco.com/WebExSquared/event-dictionary/blob/master/diagnostic-events.raml\n */\n\n // eslint-disable-next-line @typescript-eslint/no-shadow\n initPayload(eventType, identifiers, options) {\n const payload: any = {\n eventId: uuid.v4(),\n version: 1,\n origin: {\n name: 'endpoint',\n networkType: 'unknown',\n userAgent: this.userAgentToString(),\n userType: options.userType,\n loginType: options.loginType,\n channel: options.channel,\n clientInfo: {\n clientType: options.clientType,\n clientVersion: `${CLIENT_NAME}/${this.webex.version}`,\n localNetworkPrefix: anonymizeIPAddress(this.webex.meetings.geoHintInfo?.clientAddress),\n osVersion: getOSVersion() || 'unknown',\n subClientType: options.subClientType,\n os: getOSNameInternal(),\n browser: getBrowserName(),\n browserVersion: getBrowserVersion(),\n },\n },\n originTime: {\n triggered: new Date().toISOString(),\n },\n senderCountryCode: this.webex.meetings.geoHintInfo?.countryCode,\n event: {\n name: eventType,\n canProceed: true,\n identifiers,\n eventData: {webClientDomain: window.location.hostname},\n },\n };\n\n // TODO: more options should be checked and some of them should be mandatory in certain conditions\n if (options) {\n if (Object.prototype.hasOwnProperty.call(options, 'canProceed')) {\n payload.event.canProceed = options.canProceed;\n }\n if (options.errors) {\n payload.event.errors = options.errors;\n }\n if (options.mediaType) {\n payload.event.mediaType = options.mediaType;\n }\n if (options.trigger) {\n payload.event.trigger = options.trigger;\n }\n if (options.pstnAudioType) {\n payload.event.pstnAudioType = options.pstnAudioType;\n }\n if (options.mediaCapabilities) {\n payload.event.mediaCapabilities = options.mediaCapabilities;\n }\n if (options.recoveredBy) {\n payload.event.recoveredBy = options.recoveredBy;\n }\n if (options.joinTimes) {\n payload.event.joinTimes = options.joinTimes;\n }\n if (options.isRoapCallEnabled) {\n payload.event.isRoapCallEnabled = options.isRoapCallEnabled;\n }\n ['breakoutMoveId', 'breakoutSessionId', 'breakoutGroupId'].forEach((item) => {\n if (options[item]) {\n payload.event.identifiers[item] = options[item];\n }\n });\n }\n\n return payload;\n }\n\n /**\n * get the payload specific for a media quality event through call analyzer\n * @param {String} eventType the event name\n * @param {Object} identifiers contains the identifiers needed for CA\n * @param {String} identifiers.correlationId\n * @param {String} identifiers.locusUrl\n * @param {String} identifiers.locusId\n * @param {Object} options\n * @param {Object} options.intervalData\n * @param {String} options.clientType\n * @returns {Object}\n * @public\n * @memberof Metrics\n */\n public initMediaPayload(\n // eslint-disable-next-line @typescript-eslint/no-shadow\n eventType: string,\n identifiers: {\n correlationId: string;\n locusUrl: string;\n locusId: string;\n },\n options:\n | {\n intervalData: object;\n clientType: string;\n }\n | any = {}\n ) {\n const {audioSetupDelay, videoSetupDelay, joinTimes} = options;\n\n const payload = {\n eventId: uuid.v4(),\n version: 1,\n origin: {\n audioSetupDelay,\n videoSetupDelay,\n name: 'endpoint',\n networkType: options.networkType || UNKNOWN,\n userAgent: this.userAgentToString(),\n clientInfo: {\n clientType: options.clientType, // TODO: Only clientType: 'TEAMS_CLIENT' is whitelisted\n clientVersion: `${CLIENT_NAME}/${this.webex.version}`,\n localNetworkPrefix: anonymizeIPAddress(this.webex.meetings.geoHintInfo?.clientAddress),\n os: getOSNameInternal(),\n osVersion: getOSVersion() || UNKNOWN,\n subClientType: options.subClientType,\n browser: getBrowserName(),\n browserVersion: getBrowserVersion(),\n },\n },\n originTime: {\n triggered: new Date().toISOString(),\n },\n senderCountryCode: this.webex.meetings.geoHintInfo?.countryCode,\n event: {\n name: eventType,\n canProceed: true,\n identifiers,\n intervals: [options.intervalData],\n joinTimes,\n eventData: {\n webClientDomain: window.location.hostname,\n },\n sourceMetadata: {\n applicationSoftwareType: CLIENT_NAME,\n applicationSoftwareVersion: this.webex.version,\n mediaEngineSoftwareType: getBrowserName() || 'browser',\n mediaEngineSoftwareVersion: getOSVersion() || UNKNOWN,\n startTime: new Date().toISOString(),\n },\n },\n };\n\n return payload;\n }\n\n /**\n * This function Parses a Locus error and returns a diagnostic event payload.\n * It should keep updating from:\n * https://sqbu-github.cisco.com/WebExSquared/spark-client-framework/blob/master/spark-client-framework/Adapters/TelephonyAdapter/TelephonyAdapter.cpp#L920\n *\n * @param {Object} err the error Object from Locus response\n * @param {boolean} showToUser true if a toast is shown to user\n * @returns {{showToUser: boolean, category: string, errorDescription: string,\n * errorCode: number, errorData: *, fatal: boolean, name: string}}\n */\n parseLocusError(err: any, showToUser: boolean) {\n let errorCode;\n\n if (err && err.statusCode && err.statusCode >= 500) {\n errorCode = 1003;\n } else if (err && err.body && err.body.errorCode) {\n // locus error codes: https://sqbu-github.cisco.com/WebExSquared/locus/blob/master/server/src/main/resources/locus-error-codes.properties\n switch (ERROR_CODE[err.body.errorCode]) {\n case MEETING_ERRORS.FREE_USER_MAX_PARTICIPANTS_EXCEEDED:\n errorCode = 3007;\n break;\n case MEETING_ERRORS.PAID_USER_MAX_PARTICIPANTS_EXCEEDED:\n case MEETING_ERRORS.SERVICE_MAX_PARTICIPANTS_EXCEEDED:\n errorCode = 3002;\n break;\n case MEETING_ERRORS.INACTIVE:\n errorCode = 4001;\n break;\n case MEETING_ERRORS.EXCEEDED_MAX_JOINED_PARTICIPANTS:\n case MEETING_ERRORS.EXCEEDED_SERVICE_MAX_PARTICIPANTS:\n errorCode = 3001;\n break;\n case MEETING_ERRORS.MEETING_IS_LOCKED:\n errorCode = 4002;\n break;\n case MEETING_ERRORS.MEETING_IS_TERMINATING:\n errorCode = 4003;\n break;\n case MEETING_ERRORS.MEETING_REQUIRE_MODERATOR_PIN_INTENT:\n errorCode = 4004;\n break;\n case MEETING_ERRORS.MEETING_REQUIRE_MODERATOR_PIN:\n errorCode = 4005;\n break;\n case MEETING_ERRORS.MEETING_REQUIRE_MODERATOR_ROLE:\n errorCode = 4006;\n break;\n case MEETING_ERRORS.JOIN_RESTRICTED_USER:\n case MEETING_ERRORS.GET_RESTRICTED_USER:\n case MEETING_ERRORS.CREATE_MEDIA_RESTRICTED_USER:\n errorCode = 3005;\n break;\n case MEETING_ERRORS.JOIN_RESTRICTED_USER_NOT_IN_ROOM:\n errorCode = 4007;\n break;\n case MEETING_ERRORS.MEETING_NOT_FOUND:\n errorCode = 4011;\n break;\n case MEETING_ERRORS.NOT_WEBEX_SITE:\n errorCode = 4012;\n break;\n case MEETING_ERRORS.INVALID_JOIN_TIME:\n errorCode = 4013;\n break;\n case MEETING_ERRORS.PHONE_NUMBER_NOT_A_NUMBER:\n errorCode = 4016;\n break;\n case MEETING_ERRORS.PHONE_NUMBER_TOO_LONG:\n errorCode = 4017;\n break;\n case MEETING_ERRORS.INVALID_DIALABLE_KEY:\n errorCode = 4018;\n break;\n case MEETING_ERRORS.ONE_ON_ONE_TO_SELF_NOT_ALLOWED:\n errorCode = 4019;\n break;\n case MEETING_ERRORS.REMOVED_PARTICIPANT:\n errorCode = 4020;\n break;\n case MEETING_ERRORS.MEETING_LINK_NOT_FOUND:\n errorCode = 4021;\n break;\n case MEETING_ERRORS.PHONE_NUMBER_TOO_SHORT_AFTER_IDD:\n errorCode = 4022;\n break;\n case MEETING_ERRORS.INVALID_INVITEE_ADDRESS:\n errorCode = 4023;\n break;\n case MEETING_ERRORS.PMR_ACCOUNT_LOCKED:\n errorCode = 4024;\n break;\n case MEETING_ERRORS.RESOURCE_GUEST_FORBIDDEN:\n errorCode = 4025;\n break;\n case MEETING_ERRORS.PMR_ACCOUNT_SUSPENDED:\n errorCode = 4026;\n break;\n case MEETING_ERRORS.EMPTY_PHONE_NUMBER_OR_COUNTRY_CODE:\n errorCode = 4027;\n break;\n case MEETING_ERRORS.INVALID_SINCE_OR_SEQUENCE_HASH_IN_REQUEST:\n errorCode = 1006;\n break;\n case MEETING_ERRORS.CONVERSATION_NOT_FOUND:\n errorCode = 4028;\n break;\n case MEETING_ERRORS.RECORDING_CONTROL_NOT_SUPPORTED:\n case MEETING_ERRORS.RECORDING_NOT_STARTED:\n case MEETING_ERRORS.RECORDING_NOT_ENABLED:\n errorCode = 4029;\n break;\n default:\n errorCode = 4008;\n }\n } else {\n errorCode = 4008;\n }\n\n return this.generateErrorPayload(errorCode, showToUser, error.name.LOCUS_RESPONSE, err);\n }\n\n /**\n * Pareses webex api error.\n *\n * @param {object} err\n * @param {boolean} showToUser\n * @returns {object | null}\n */\n parseWebexApiError(err: any, showToUser: boolean) {\n const serviceErrorCode = err?.body?.code;\n const clientCodeError = WebexAPIServiceErrorCodes[serviceErrorCode];\n\n if (clientCodeError) {\n return this.generateErrorPayload(clientCodeError, showToUser, error.name.OTHER, err);\n }\n\n return this.generateErrorPayload(4100, showToUser, error.name.OTHER, err);\n }\n\n /**\n * Generates Error for the CA event\n *\n * @param {integer} errorCode\n * @param {boolean} shownToUser\n * @param {string} name\n * @param {any} err\n * @returns {any}\n */\n generateErrorPayload(errorCode, shownToUser, name, err) {\n if (error.errors[errorCode]) {\n const errorPayload: any = {\n shownToUser: shownToUser || false,\n category: error.errors[errorCode][2],\n errorDescription: error.errors[errorCode][0],\n errorCode,\n fatal: !includes(error.notFatalErrorList, errorCode),\n name: name || error.name.OTHER,\n serviceErrorCode: err?.body?.code,\n };\n\n if (err && err.body) {\n errorPayload.errorData = {error: err.body};\n }\n\n if (err && err.statusCode) {\n errorPayload.httpCode = err.statusCode;\n }\n\n return errorPayload;\n }\n\n return null;\n }\n\n /**\n * Returns a formated string of the user agent.\n *\n * @returns {string} formatted user agent information\n */\n userAgentToString() {\n let userAgentOption;\n let browserInfo;\n const clientInfo = util.format('client=%s', `${this.webex.meetings?.metrics?.clientName}`);\n\n if (\n ['chrome', 'firefox', 'msie', 'msedge', 'safari'].indexOf(getBrowserName().toLowerCase()) !==\n -1\n ) {\n browserInfo = util.format(\n 'browser=%s',\n `${getBrowserName().toLowerCase()}/${getBrowserVersion().split('.')[0]}`\n );\n }\n const osInfo = util.format('os=%s', `${getOSName()}/${getOSVersion().split('.')[0]}`);\n\n if (browserInfo) {\n userAgentOption = `(${browserInfo}`;\n }\n if (osInfo) {\n userAgentOption = userAgentOption\n ? `${userAgentOption}; ${clientInfo}; ${osInfo}`\n : `${clientInfo}; (${osInfo}`;\n }\n if (userAgentOption) {\n userAgentOption += ')';\n\n return util.format(\n 'webex-js-sdk/%s %s',\n `${process.env.NODE_ENV}-${this.webex.version}`,\n userAgentOption\n );\n }\n\n return util.format('webex-js-sdk/%s', `${process.env.NODE_ENV}-${this.webex.version}`);\n }\n\n /**\n * Uploads given metric to the Metrics service as an Behavioral metric.\n * Metadata about the environment such as browser, OS, SDK and their versions\n * are automatically added when the metric is sent.\n *\n * The Metrics service will send an Behavioral metric to InfluxDB for\n * aggregation.\n * See https://confluence-eng-gpk2.cisco.com/conf/display/WBXT/Getting+started+with+Metrics+Service.\n *\n * @param {string} metricName Name of the metric (measurement) to send\n * @param {Object} metricFields Key-valye pairs of data or values about this metric\n * @param {Object} metricTags Key-value pairs of metric metadata\n *\n * @returns {void}\n */\n sendBehavioralMetric(metricName: string, metricFields: object = {}, metricTags: object = {}) {\n this.webex.internal.metrics.submitClientMetrics(metricName, {\n type: this.webex.config.metrics.type,\n fields: metricFields,\n tags: metricTags,\n });\n }\n}\n\n// Export Metrics singleton ---------------------------------------------------\nconst instance = new Metrics();\n\nexport default instance;\n"],"mappings":"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"}
|
|
@@ -1,32 +1,27 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
var _Object$defineProperty = require("@babel/runtime-corejs2/core-js/object/define-property");
|
|
4
|
-
|
|
5
4
|
var _interopRequireDefault = require("@babel/runtime-corejs2/helpers/interopRequireDefault");
|
|
6
|
-
|
|
7
5
|
_Object$defineProperty(exports, "__esModule", {
|
|
8
6
|
value: true
|
|
9
7
|
});
|
|
10
|
-
|
|
11
8
|
exports.MediaRequestManager = void 0;
|
|
12
|
-
|
|
13
|
-
var _values = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/object/values"));
|
|
14
|
-
|
|
15
9
|
var _entries = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/object/entries"));
|
|
16
|
-
|
|
10
|
+
var _stringify = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/json/stringify"));
|
|
11
|
+
var _values = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/object/values"));
|
|
17
12
|
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/slicedToArray"));
|
|
18
|
-
|
|
19
13
|
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/classCallCheck"));
|
|
20
|
-
|
|
21
14
|
var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/createClass"));
|
|
22
|
-
|
|
23
15
|
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/defineProperty"));
|
|
24
|
-
|
|
16
|
+
var _isEmpty2 = _interopRequireDefault(require("lodash/isEmpty"));
|
|
17
|
+
var _debounce2 = _interopRequireDefault(require("lodash/debounce"));
|
|
18
|
+
var _cloneDeep2 = _interopRequireDefault(require("lodash/cloneDeep"));
|
|
25
19
|
var _internalMediaCore = require("@webex/internal-media-core");
|
|
26
|
-
|
|
27
20
|
var _loggerProxy = _interopRequireDefault(require("../common/logs/logger-proxy"));
|
|
28
|
-
|
|
21
|
+
var _receiveSlot = require("./receiveSlot");
|
|
22
|
+
var _remoteMedia = require("./remoteMedia");
|
|
29
23
|
/* eslint-disable require-jsdoc */
|
|
24
|
+
|
|
30
25
|
var CODEC_DEFAULTS = {
|
|
31
26
|
h264: {
|
|
32
27
|
maxFs: 8192,
|
|
@@ -34,82 +29,209 @@ var CODEC_DEFAULTS = {
|
|
|
34
29
|
maxMbps: 245760
|
|
35
30
|
}
|
|
36
31
|
};
|
|
37
|
-
|
|
32
|
+
var DEBOUNCED_SOURCE_UPDATE_TIME = 1000;
|
|
38
33
|
var MediaRequestManager = /*#__PURE__*/function () {
|
|
39
|
-
function MediaRequestManager(sendMediaRequestsCallback) {
|
|
34
|
+
function MediaRequestManager(sendMediaRequestsCallback, options) {
|
|
40
35
|
(0, _classCallCheck2.default)(this, MediaRequestManager);
|
|
41
36
|
(0, _defineProperty2.default)(this, "sendMediaRequestsCallback", void 0);
|
|
37
|
+
(0, _defineProperty2.default)(this, "kind", void 0);
|
|
42
38
|
(0, _defineProperty2.default)(this, "counter", void 0);
|
|
43
39
|
(0, _defineProperty2.default)(this, "clientRequests", void 0);
|
|
44
|
-
(0, _defineProperty2.default)(this, "
|
|
40
|
+
(0, _defineProperty2.default)(this, "degradationPreferences", void 0);
|
|
41
|
+
(0, _defineProperty2.default)(this, "sourceUpdateListener", void 0);
|
|
42
|
+
(0, _defineProperty2.default)(this, "debouncedSourceUpdateListener", void 0);
|
|
43
|
+
(0, _defineProperty2.default)(this, "previousStreamRequests", []);
|
|
45
44
|
this.sendMediaRequestsCallback = sendMediaRequestsCallback;
|
|
46
45
|
this.counter = 0;
|
|
47
46
|
this.clientRequests = {};
|
|
48
|
-
this.
|
|
47
|
+
this.degradationPreferences = options.degradationPreferences;
|
|
48
|
+
this.kind = options.kind;
|
|
49
|
+
this.sourceUpdateListener = this.commit.bind(this);
|
|
50
|
+
this.debouncedSourceUpdateListener = (0, _debounce2.default)(this.sourceUpdateListener, DEBOUNCED_SOURCE_UPDATE_TIME);
|
|
49
51
|
}
|
|
50
|
-
|
|
51
52
|
(0, _createClass2.default)(MediaRequestManager, [{
|
|
52
|
-
key: "
|
|
53
|
-
value: function
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
53
|
+
key: "setDegradationPreferences",
|
|
54
|
+
value: function setDegradationPreferences(degradationPreferences) {
|
|
55
|
+
this.degradationPreferences = degradationPreferences;
|
|
56
|
+
this.sendRequests(); // re-send requests after preferences are set
|
|
57
|
+
}
|
|
58
|
+
}, {
|
|
59
|
+
key: "getDegradedClientRequests",
|
|
60
|
+
value: function getDegradedClientRequests() {
|
|
61
|
+
var _this = this;
|
|
62
|
+
var clientRequests = (0, _cloneDeep2.default)(this.clientRequests);
|
|
63
|
+
var maxFsLimits = [(0, _remoteMedia.getMaxFs)('best'), (0, _remoteMedia.getMaxFs)('large'), (0, _remoteMedia.getMaxFs)('medium'), (0, _remoteMedia.getMaxFs)('small'), (0, _remoteMedia.getMaxFs)('very small'), (0, _remoteMedia.getMaxFs)('thumbnail')];
|
|
64
|
+
|
|
65
|
+
// reduce max-fs until total macroblocks is below limit
|
|
66
|
+
var _loop = function _loop(i) {
|
|
67
|
+
var totalMacroblocksRequested = 0;
|
|
68
|
+
(0, _entries.default)(clientRequests).forEach(function (_ref) {
|
|
69
|
+
var _ref2 = (0, _slicedToArray2.default)(_ref, 2),
|
|
70
|
+
id = _ref2[0],
|
|
71
|
+
mr = _ref2[1];
|
|
72
|
+
if (mr.codecInfo) {
|
|
73
|
+
mr.codecInfo.maxFs = Math.min(mr.preferredMaxFs || CODEC_DEFAULTS.h264.maxFs, mr.codecInfo.maxFs || CODEC_DEFAULTS.h264.maxFs, maxFsLimits[i]);
|
|
74
|
+
// we only consider sources with "live" state
|
|
75
|
+
var slotsWithLiveSource = _this.clientRequests[id].receiveSlots.filter(function (rs) {
|
|
76
|
+
return rs.sourceState === 'live';
|
|
77
|
+
});
|
|
78
|
+
totalMacroblocksRequested += mr.codecInfo.maxFs * slotsWithLiveSource.length;
|
|
79
|
+
}
|
|
59
80
|
});
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
81
|
+
if (totalMacroblocksRequested <= _this.degradationPreferences.maxMacroblocksLimit) {
|
|
82
|
+
if (i !== 0) {
|
|
83
|
+
_loggerProxy.default.logger.warn("multistream:mediaRequestManager --> too many streams with high max-fs, frame size will be limited to ".concat(maxFsLimits[i]));
|
|
84
|
+
}
|
|
85
|
+
return "break";
|
|
86
|
+
} else if (i === maxFsLimits.length - 1) {
|
|
87
|
+
_loggerProxy.default.logger.warn("multistream:mediaRequestManager --> even with frame size limited to ".concat(maxFsLimits[i], " you are still requesting too many streams, consider reducing the number of requests"));
|
|
88
|
+
}
|
|
89
|
+
};
|
|
90
|
+
for (var i = 0; i < maxFsLimits.length; i += 1) {
|
|
91
|
+
var _ret = _loop(i);
|
|
92
|
+
if (_ret === "break") break;
|
|
93
|
+
}
|
|
94
|
+
return clientRequests;
|
|
95
|
+
}
|
|
63
96
|
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
97
|
+
/**
|
|
98
|
+
* Returns true if two stream requests are the same, false otherwise.
|
|
99
|
+
*
|
|
100
|
+
* @param {StreamRequest} streamRequestA - Stream request A for comparison.
|
|
101
|
+
* @param {StreamRequest} streamRequestB - Stream request B for comparison.
|
|
102
|
+
* @returns {boolean} - Whether they are equal.
|
|
103
|
+
*/
|
|
104
|
+
// eslint-disable-next-line class-methods-use-this
|
|
105
|
+
}, {
|
|
106
|
+
key: "isEqual",
|
|
107
|
+
value: function isEqual(streamRequestA, streamRequestB) {
|
|
108
|
+
return (0, _stringify.default)(streamRequestA._toJmpStreamRequest()) === (0, _stringify.default)(streamRequestB._toJmpStreamRequest());
|
|
109
|
+
}
|
|
68
110
|
|
|
69
|
-
|
|
70
|
-
|
|
111
|
+
/**
|
|
112
|
+
* Compares new stream requests to previous ones and determines
|
|
113
|
+
* if they are the same.
|
|
114
|
+
*
|
|
115
|
+
* @param {StreamRequest[]} newRequests - Array with new requests.
|
|
116
|
+
* @returns {boolean} - True if they are equal, false otherwise.
|
|
117
|
+
*/
|
|
118
|
+
}, {
|
|
119
|
+
key: "checkIsNewRequestsEqualToPrev",
|
|
120
|
+
value: function checkIsNewRequestsEqualToPrev(newRequests) {
|
|
121
|
+
var _this2 = this;
|
|
122
|
+
return !(0, _isEmpty2.default)(this.previousStreamRequests) && this.previousStreamRequests.length === newRequests.length && this.previousStreamRequests.every(function (req, idx) {
|
|
123
|
+
return _this2.isEqual(req, newRequests[idx]);
|
|
124
|
+
});
|
|
125
|
+
}
|
|
71
126
|
|
|
72
|
-
|
|
73
|
-
|
|
127
|
+
/**
|
|
128
|
+
* Returns the maxPayloadBitsPerSecond per Stream
|
|
129
|
+
*
|
|
130
|
+
* If MediaRequestManager kind is "audio", a constant bitrate will be returned.
|
|
131
|
+
* If MediaRequestManager kind is "video", the bitrate will be calculated based
|
|
132
|
+
* on maxFs (default h264 maxFs as fallback if maxFs is not defined)
|
|
133
|
+
*
|
|
134
|
+
* @param {MediaRequest} mediaRequest - mediaRequest to take data from
|
|
135
|
+
* @returns {number} maxPayloadBitsPerSecond
|
|
136
|
+
*/
|
|
137
|
+
}, {
|
|
138
|
+
key: "getMaxPayloadBitsPerSecond",
|
|
139
|
+
value: function getMaxPayloadBitsPerSecond(mediaRequest) {
|
|
140
|
+
if (this.kind === 'audio') {
|
|
141
|
+
// return mono_music bitrate default if the kind of mediarequest manager is audio:
|
|
142
|
+
return _internalMediaCore.RecommendedOpusBitrates.FB_MONO_MUSIC;
|
|
74
143
|
}
|
|
144
|
+
return (0, _internalMediaCore.getRecommendedMaxBitrateForFrameSize)(mediaRequest.codecInfo.maxFs || CODEC_DEFAULTS.h264.maxFs);
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* Returns the max Macro Blocks per second (maxMbps) per H264 Stream
|
|
149
|
+
*
|
|
150
|
+
* The maxMbps will be calculated based on maxFs and maxFps
|
|
151
|
+
* (default h264 maxFps as fallback if maxFps is not defined)
|
|
152
|
+
*
|
|
153
|
+
* @param {MediaRequest} mediaRequest - mediaRequest to take data from
|
|
154
|
+
* @returns {number} maxMbps
|
|
155
|
+
*/
|
|
156
|
+
// eslint-disable-next-line class-methods-use-this
|
|
157
|
+
}, {
|
|
158
|
+
key: "getH264MaxMbps",
|
|
159
|
+
value: function getH264MaxMbps(mediaRequest) {
|
|
160
|
+
// fallback for maxFps (not needed for maxFs, since there is a fallback already in getDegradedClientRequests)
|
|
161
|
+
var maxFps = mediaRequest.codecInfo.maxFps || CODEC_DEFAULTS.h264.maxFps;
|
|
162
|
+
|
|
163
|
+
// divided by 100 since maxFps is 3000 (for 30 frames per seconds)
|
|
164
|
+
return mediaRequest.codecInfo.maxFs * maxFps / 100;
|
|
165
|
+
}
|
|
75
166
|
|
|
76
|
-
|
|
167
|
+
/**
|
|
168
|
+
* Clears the previous stream requests.
|
|
169
|
+
*
|
|
170
|
+
* @returns {void}
|
|
171
|
+
*/
|
|
172
|
+
}, {
|
|
173
|
+
key: "clearPreviousRequests",
|
|
174
|
+
value: function clearPreviousRequests() {
|
|
175
|
+
this.previousStreamRequests = [];
|
|
77
176
|
}
|
|
78
177
|
}, {
|
|
79
178
|
key: "sendRequests",
|
|
80
179
|
value: function sendRequests() {
|
|
81
|
-
var
|
|
82
|
-
|
|
83
|
-
var
|
|
180
|
+
var _this3 = this;
|
|
181
|
+
var streamRequests = [];
|
|
182
|
+
var clientRequests = this.getDegradedClientRequests();
|
|
84
183
|
|
|
85
|
-
|
|
86
|
-
|
|
184
|
+
// map all the client media requests to wcme stream requests
|
|
185
|
+
(0, _values.default)(clientRequests).forEach(function (mr) {
|
|
186
|
+
streamRequests.push(new _internalMediaCore.StreamRequest(mr.policyInfo.policy === 'active-speaker' ? _internalMediaCore.Policy.ActiveSpeaker : _internalMediaCore.Policy.ReceiverSelected, mr.policyInfo.policy === 'active-speaker' ? new _internalMediaCore.ActiveSpeakerInfo(mr.policyInfo.priority, mr.policyInfo.crossPriorityDuplication, mr.policyInfo.crossPolicyDuplication, mr.policyInfo.preferLiveVideo) : new _internalMediaCore.ReceiverSelectedInfo(mr.policyInfo.csi), mr.receiveSlots.map(function (receiveSlot) {
|
|
87
187
|
return receiveSlot.wcmeReceiveSlot;
|
|
88
|
-
}),
|
|
188
|
+
}), _this3.getMaxPayloadBitsPerSecond(mr), mr.codecInfo && [new _internalMediaCore.CodecInfo(0x80, new _internalMediaCore.H264Codec(mr.codecInfo.maxFs, mr.codecInfo.maxFps || CODEC_DEFAULTS.h264.maxFps, _this3.getH264MaxMbps(mr), mr.codecInfo.maxWidth, mr.codecInfo.maxHeight))]));
|
|
89
189
|
});
|
|
90
|
-
|
|
91
|
-
this.
|
|
190
|
+
|
|
191
|
+
//! IMPORTANT: this is only a temporary fix. This will soon be done in the jmp layer (@webex/json-multistream)
|
|
192
|
+
// https://jira-eng-gpk2.cisco.com/jira/browse/WEBEX-326713
|
|
193
|
+
if (!this.checkIsNewRequestsEqualToPrev(streamRequests)) {
|
|
194
|
+
this.sendMediaRequestsCallback(streamRequests);
|
|
195
|
+
this.previousStreamRequests = streamRequests;
|
|
196
|
+
_loggerProxy.default.logger.info("multistream:sendRequests --> media requests sent. ");
|
|
197
|
+
} else {
|
|
198
|
+
_loggerProxy.default.logger.info("multistream:sendRequests --> detected duplicate WCME requests, skipping them... ");
|
|
199
|
+
}
|
|
92
200
|
}
|
|
93
201
|
}, {
|
|
94
202
|
key: "addRequest",
|
|
95
203
|
value: function addRequest(mediaRequest) {
|
|
204
|
+
var _this4 = this;
|
|
96
205
|
var commit = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
|
|
97
206
|
// eslint-disable-next-line no-plusplus
|
|
98
207
|
var newId = "".concat(this.counter++);
|
|
99
208
|
this.clientRequests[newId] = mediaRequest;
|
|
100
|
-
|
|
209
|
+
var eventHandler = function eventHandler(_ref3) {
|
|
210
|
+
var maxFs = _ref3.maxFs;
|
|
211
|
+
mediaRequest.preferredMaxFs = maxFs;
|
|
212
|
+
_this4.debouncedSourceUpdateListener();
|
|
213
|
+
};
|
|
214
|
+
mediaRequest.handleMaxFs = eventHandler;
|
|
215
|
+
mediaRequest.receiveSlots.forEach(function (rs) {
|
|
216
|
+
rs.on(_receiveSlot.ReceiveSlotEvents.SourceUpdate, _this4.sourceUpdateListener);
|
|
217
|
+
rs.on(_receiveSlot.ReceiveSlotEvents.MaxFsUpdate, mediaRequest.handleMaxFs);
|
|
218
|
+
});
|
|
101
219
|
if (commit) {
|
|
102
220
|
this.commit();
|
|
103
221
|
}
|
|
104
|
-
|
|
105
222
|
return newId;
|
|
106
223
|
}
|
|
107
224
|
}, {
|
|
108
225
|
key: "cancelRequest",
|
|
109
226
|
value: function cancelRequest(requestId) {
|
|
227
|
+
var _this5 = this;
|
|
110
228
|
var commit = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
|
|
229
|
+
var mediaRequest = this.clientRequests[requestId];
|
|
230
|
+
mediaRequest === null || mediaRequest === void 0 ? void 0 : mediaRequest.receiveSlots.forEach(function (rs) {
|
|
231
|
+
rs.off(_receiveSlot.ReceiveSlotEvents.SourceUpdate, _this5.sourceUpdateListener);
|
|
232
|
+
rs.off(_receiveSlot.ReceiveSlotEvents.MaxFsUpdate, mediaRequest.handleMaxFs);
|
|
233
|
+
});
|
|
111
234
|
delete this.clientRequests[requestId];
|
|
112
|
-
|
|
113
235
|
if (commit) {
|
|
114
236
|
this.commit();
|
|
115
237
|
}
|
|
@@ -123,11 +245,9 @@ var MediaRequestManager = /*#__PURE__*/function () {
|
|
|
123
245
|
key: "reset",
|
|
124
246
|
value: function reset() {
|
|
125
247
|
this.clientRequests = {};
|
|
126
|
-
this.slotsActiveInLastMediaRequest = {};
|
|
127
248
|
}
|
|
128
249
|
}]);
|
|
129
250
|
return MediaRequestManager;
|
|
130
251
|
}();
|
|
131
|
-
|
|
132
252
|
exports.MediaRequestManager = MediaRequestManager;
|
|
133
253
|
//# sourceMappingURL=mediaRequestManager.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["CODEC_DEFAULTS","h264","maxFs","maxFps","maxMbps","MediaRequestManager","sendMediaRequestsCallback","counter","clientRequests","slotsActiveInLastMediaRequest","activeSlots","forEach","request","receiveSlots","slot","id","slotId","LoggerProxy","logger","info","resetSourceState","wcmeMediaRequests","maxPayloadBitsPerSecond","mr","push","MC","MediaRequest","policyInfo","policy","Policy","ActiveSpeaker","ReceiverSelected","ActiveSpeakerInfo","priority","crossPriorityDuplication","crossPolicyDuplication","preferLiveVideo","ReceiverSelectedInfo","csi","map","receiveSlot","wcmeReceiveSlot","codecInfo","CodecInfo","H264Codec","maxWidth","maxHeight","resetInactiveReceiveSlots","mediaRequest","commit","newId","requestId","sendRequests"],"sources":["mediaRequestManager.ts"],"sourcesContent":["/* eslint-disable require-jsdoc */\nimport {MediaConnection as MC} from '@webex/internal-media-core';\n\nimport LoggerProxy from '../common/logs/logger-proxy';\n\nimport {ReceiveSlot, ReceiveSlotId} from './receiveSlot';\n\nexport interface ActiveSpeakerPolicyInfo {\n policy: 'active-speaker';\n priority: number;\n crossPriorityDuplication: boolean;\n crossPolicyDuplication: boolean;\n preferLiveVideo: boolean;\n}\n\nexport interface ReceiverSelectedPolicyInfo {\n policy: 'receiver-selected';\n csi: number;\n}\n\nexport type PolicyInfo = ActiveSpeakerPolicyInfo | ReceiverSelectedPolicyInfo;\n\nexport interface H264CodecInfo {\n codec: 'h264';\n maxFs?: number;\n maxFps?: number;\n maxMbps?: number;\n maxWidth?: number;\n maxHeight?: number;\n}\n\nexport type CodecInfo = H264CodecInfo; // we'll add AV1 here in the future when it's available\n\nexport interface MediaRequest {\n policyInfo: PolicyInfo;\n receiveSlots: Array<ReceiveSlot>;\n codecInfo?: CodecInfo;\n}\n\nexport type MediaRequestId = string;\n\nconst CODEC_DEFAULTS = {\n h264: {\n maxFs: 8192,\n maxFps: 3000,\n maxMbps: 245760,\n },\n};\n\ntype SendMediaRequestsCallback = (mediaRequests: MC.MediaRequest[]) => void;\n\nexport class MediaRequestManager {\n private sendMediaRequestsCallback: SendMediaRequestsCallback;\n\n private counter;\n\n private clientRequests: {[key: MediaRequestId]: MediaRequest};\n\n private slotsActiveInLastMediaRequest: {[key: ReceiveSlotId]: ReceiveSlot};\n\n constructor(sendMediaRequestsCallback: SendMediaRequestsCallback) {\n this.sendMediaRequestsCallback = sendMediaRequestsCallback;\n this.counter = 0;\n this.clientRequests = {};\n this.slotsActiveInLastMediaRequest = {};\n }\n\n private resetInactiveReceiveSlots() {\n const activeSlots: {[key: ReceiveSlotId]: ReceiveSlot} = {};\n\n // create a map of all currently used slot ids\n Object.values(this.clientRequests).forEach((request) =>\n request.receiveSlots.forEach((slot) => {\n activeSlots[slot.id] = slot;\n })\n );\n\n // when we stop using some receive slots and they are not included in the new media request,\n // we will never get a 'no source' notification for them, so we reset their state,\n // so that the client doesn't try to display their video anymore\n for (const [slotId, slot] of Object.entries(this.slotsActiveInLastMediaRequest)) {\n if (!(slotId in activeSlots)) {\n LoggerProxy.logger.info(\n `multistream:mediaRequestManager --> resetting sourceState to \"no source\" for slot ${slot.id}`\n );\n slot.resetSourceState();\n }\n }\n\n this.slotsActiveInLastMediaRequest = activeSlots;\n }\n\n private sendRequests() {\n const wcmeMediaRequests: MC.MediaRequest[] = [];\n\n // todo: check how many streams we're asking for and what resolution and introduce some limits (spark-377701)\n const maxPayloadBitsPerSecond = 10 * 1000 * 1000;\n\n // map all the client media requests to wcme media requests\n Object.values(this.clientRequests).forEach((mr) => {\n wcmeMediaRequests.push(\n new MC.MediaRequest(\n mr.policyInfo.policy === 'active-speaker'\n ? MC.Policy.ActiveSpeaker\n : MC.Policy.ReceiverSelected,\n mr.policyInfo.policy === 'active-speaker'\n ? new MC.ActiveSpeakerInfo(\n mr.policyInfo.priority,\n mr.policyInfo.crossPriorityDuplication,\n mr.policyInfo.crossPolicyDuplication,\n mr.policyInfo.preferLiveVideo\n )\n : new MC.ReceiverSelectedInfo(mr.policyInfo.csi),\n mr.receiveSlots.map((receiveSlot) => receiveSlot.wcmeReceiveSlot),\n maxPayloadBitsPerSecond,\n mr.codecInfo && [\n new MC.CodecInfo(\n 0x80,\n new MC.H264Codec(\n mr.codecInfo.maxFs || CODEC_DEFAULTS.h264.maxFs,\n mr.codecInfo.maxFps || CODEC_DEFAULTS.h264.maxFps,\n mr.codecInfo.maxMbps || CODEC_DEFAULTS.h264.maxMbps,\n mr.codecInfo.maxWidth,\n mr.codecInfo.maxHeight\n )\n ),\n ]\n )\n );\n });\n\n this.sendMediaRequestsCallback(wcmeMediaRequests);\n\n this.resetInactiveReceiveSlots();\n }\n\n public addRequest(mediaRequest: MediaRequest, commit = true): MediaRequestId {\n // eslint-disable-next-line no-plusplus\n const newId = `${this.counter++}`;\n\n this.clientRequests[newId] = mediaRequest;\n\n if (commit) {\n this.commit();\n }\n\n return newId;\n }\n\n public cancelRequest(requestId: MediaRequestId, commit = true) {\n delete this.clientRequests[requestId];\n\n if (commit) {\n this.commit();\n }\n }\n\n public commit() {\n return this.sendRequests();\n }\n\n public reset() {\n this.clientRequests = {};\n this.slotsActiveInLastMediaRequest = {};\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"names":["CODEC_DEFAULTS","h264","maxFs","maxFps","maxMbps","DEBOUNCED_SOURCE_UPDATE_TIME","MediaRequestManager","sendMediaRequestsCallback","options","counter","clientRequests","degradationPreferences","kind","sourceUpdateListener","commit","bind","debouncedSourceUpdateListener","sendRequests","maxFsLimits","getMaxFs","totalMacroblocksRequested","forEach","id","mr","codecInfo","Math","min","preferredMaxFs","i","slotsWithLiveSource","receiveSlots","filter","rs","sourceState","length","maxMacroblocksLimit","LoggerProxy","logger","warn","streamRequestA","streamRequestB","_toJmpStreamRequest","newRequests","previousStreamRequests","every","req","idx","isEqual","mediaRequest","RecommendedOpusBitrates","FB_MONO_MUSIC","getRecommendedMaxBitrateForFrameSize","streamRequests","getDegradedClientRequests","push","StreamRequest","policyInfo","policy","Policy","ActiveSpeaker","ReceiverSelected","ActiveSpeakerInfo","priority","crossPriorityDuplication","crossPolicyDuplication","preferLiveVideo","ReceiverSelectedInfo","csi","map","receiveSlot","wcmeReceiveSlot","getMaxPayloadBitsPerSecond","WcmeCodecInfo","H264Codec","getH264MaxMbps","maxWidth","maxHeight","checkIsNewRequestsEqualToPrev","info","newId","eventHandler","handleMaxFs","on","ReceiveSlotEvents","SourceUpdate","MaxFsUpdate","requestId","off"],"sources":["mediaRequestManager.ts"],"sourcesContent":["/* eslint-disable require-jsdoc */\nimport {\n StreamRequest,\n Policy,\n ActiveSpeakerInfo,\n ReceiverSelectedInfo,\n CodecInfo as WcmeCodecInfo,\n H264Codec,\n getRecommendedMaxBitrateForFrameSize,\n RecommendedOpusBitrates,\n} from '@webex/internal-media-core';\nimport {cloneDeep, debounce, isEmpty} from 'lodash';\n\nimport LoggerProxy from '../common/logs/logger-proxy';\n\nimport {ReceiveSlot, ReceiveSlotEvents} from './receiveSlot';\nimport {getMaxFs} from './remoteMedia';\n\nexport interface ActiveSpeakerPolicyInfo {\n policy: 'active-speaker';\n priority: number;\n crossPriorityDuplication: boolean;\n crossPolicyDuplication: boolean;\n preferLiveVideo: boolean;\n}\n\nexport interface ReceiverSelectedPolicyInfo {\n policy: 'receiver-selected';\n csi: number;\n}\n\nexport type PolicyInfo = ActiveSpeakerPolicyInfo | ReceiverSelectedPolicyInfo;\n\nexport interface H264CodecInfo {\n codec: 'h264';\n maxFs?: number;\n maxFps?: number;\n maxMbps?: number;\n maxWidth?: number;\n maxHeight?: number;\n}\n\nexport type CodecInfo = H264CodecInfo; // we'll add AV1 here in the future when it's available\n\nexport interface MediaRequest {\n policyInfo: PolicyInfo;\n receiveSlots: Array<ReceiveSlot>;\n codecInfo?: CodecInfo;\n preferredMaxFs?: number;\n handleMaxFs?: ({maxFs}: {maxFs: number}) => void;\n}\n\nexport type MediaRequestId = string;\n\nconst CODEC_DEFAULTS = {\n h264: {\n maxFs: 8192,\n maxFps: 3000,\n maxMbps: 245760,\n },\n};\n\nconst DEBOUNCED_SOURCE_UPDATE_TIME = 1000;\n\ntype DegradationPreferences = {\n maxMacroblocksLimit: number;\n};\n\ntype SendMediaRequestsCallback = (streamRequests: StreamRequest[]) => void;\ntype Kind = 'audio' | 'video';\n\ntype Options = {\n degradationPreferences: DegradationPreferences;\n kind: Kind;\n};\nexport class MediaRequestManager {\n private sendMediaRequestsCallback: SendMediaRequestsCallback;\n\n private kind: Kind;\n\n private counter: number;\n\n private clientRequests: {[key: MediaRequestId]: MediaRequest};\n\n private degradationPreferences: DegradationPreferences;\n\n private sourceUpdateListener: () => void;\n\n private debouncedSourceUpdateListener: () => void;\n\n private previousStreamRequests: Array<StreamRequest> = [];\n\n constructor(sendMediaRequestsCallback: SendMediaRequestsCallback, options: Options) {\n this.sendMediaRequestsCallback = sendMediaRequestsCallback;\n this.counter = 0;\n this.clientRequests = {};\n this.degradationPreferences = options.degradationPreferences;\n this.kind = options.kind;\n this.sourceUpdateListener = this.commit.bind(this);\n this.debouncedSourceUpdateListener = debounce(\n this.sourceUpdateListener,\n DEBOUNCED_SOURCE_UPDATE_TIME\n );\n }\n\n public setDegradationPreferences(degradationPreferences: DegradationPreferences) {\n this.degradationPreferences = degradationPreferences;\n this.sendRequests(); // re-send requests after preferences are set\n }\n\n private getDegradedClientRequests() {\n const clientRequests = cloneDeep(this.clientRequests);\n const maxFsLimits = [\n getMaxFs('best'),\n getMaxFs('large'),\n getMaxFs('medium'),\n getMaxFs('small'),\n getMaxFs('very small'),\n getMaxFs('thumbnail'),\n ];\n\n // reduce max-fs until total macroblocks is below limit\n for (let i = 0; i < maxFsLimits.length; i += 1) {\n let totalMacroblocksRequested = 0;\n Object.entries(clientRequests).forEach(([id, mr]) => {\n if (mr.codecInfo) {\n mr.codecInfo.maxFs = Math.min(\n mr.preferredMaxFs || CODEC_DEFAULTS.h264.maxFs,\n mr.codecInfo.maxFs || CODEC_DEFAULTS.h264.maxFs,\n maxFsLimits[i]\n );\n // we only consider sources with \"live\" state\n const slotsWithLiveSource = this.clientRequests[id].receiveSlots.filter(\n (rs) => rs.sourceState === 'live'\n );\n totalMacroblocksRequested += mr.codecInfo.maxFs * slotsWithLiveSource.length;\n }\n });\n if (totalMacroblocksRequested <= this.degradationPreferences.maxMacroblocksLimit) {\n if (i !== 0) {\n LoggerProxy.logger.warn(\n `multistream:mediaRequestManager --> too many streams with high max-fs, frame size will be limited to ${maxFsLimits[i]}`\n );\n }\n break;\n } else if (i === maxFsLimits.length - 1) {\n LoggerProxy.logger.warn(\n `multistream:mediaRequestManager --> even with frame size limited to ${maxFsLimits[i]} you are still requesting too many streams, consider reducing the number of requests`\n );\n }\n }\n\n return clientRequests;\n }\n\n /**\n * Returns true if two stream requests are the same, false otherwise.\n *\n * @param {StreamRequest} streamRequestA - Stream request A for comparison.\n * @param {StreamRequest} streamRequestB - Stream request B for comparison.\n * @returns {boolean} - Whether they are equal.\n */\n // eslint-disable-next-line class-methods-use-this\n public isEqual(streamRequestA: StreamRequest, streamRequestB: StreamRequest) {\n return (\n JSON.stringify(streamRequestA._toJmpStreamRequest()) ===\n JSON.stringify(streamRequestB._toJmpStreamRequest())\n );\n }\n\n /**\n * Compares new stream requests to previous ones and determines\n * if they are the same.\n *\n * @param {StreamRequest[]} newRequests - Array with new requests.\n * @returns {boolean} - True if they are equal, false otherwise.\n */\n private checkIsNewRequestsEqualToPrev(newRequests: StreamRequest[]) {\n return (\n !isEmpty(this.previousStreamRequests) &&\n this.previousStreamRequests.length === newRequests.length &&\n this.previousStreamRequests.every((req, idx) => this.isEqual(req, newRequests[idx]))\n );\n }\n\n /**\n * Returns the maxPayloadBitsPerSecond per Stream\n *\n * If MediaRequestManager kind is \"audio\", a constant bitrate will be returned.\n * If MediaRequestManager kind is \"video\", the bitrate will be calculated based\n * on maxFs (default h264 maxFs as fallback if maxFs is not defined)\n *\n * @param {MediaRequest} mediaRequest - mediaRequest to take data from\n * @returns {number} maxPayloadBitsPerSecond\n */\n private getMaxPayloadBitsPerSecond(mediaRequest: MediaRequest): number {\n if (this.kind === 'audio') {\n // return mono_music bitrate default if the kind of mediarequest manager is audio:\n return RecommendedOpusBitrates.FB_MONO_MUSIC;\n }\n\n return getRecommendedMaxBitrateForFrameSize(\n mediaRequest.codecInfo.maxFs || CODEC_DEFAULTS.h264.maxFs\n );\n }\n\n /**\n * Returns the max Macro Blocks per second (maxMbps) per H264 Stream\n *\n * The maxMbps will be calculated based on maxFs and maxFps\n * (default h264 maxFps as fallback if maxFps is not defined)\n *\n * @param {MediaRequest} mediaRequest - mediaRequest to take data from\n * @returns {number} maxMbps\n */\n // eslint-disable-next-line class-methods-use-this\n private getH264MaxMbps(mediaRequest: MediaRequest): number {\n // fallback for maxFps (not needed for maxFs, since there is a fallback already in getDegradedClientRequests)\n const maxFps = mediaRequest.codecInfo.maxFps || CODEC_DEFAULTS.h264.maxFps;\n\n // divided by 100 since maxFps is 3000 (for 30 frames per seconds)\n return (mediaRequest.codecInfo.maxFs * maxFps) / 100;\n }\n\n /**\n * Clears the previous stream requests.\n *\n * @returns {void}\n */\n public clearPreviousRequests(): void {\n this.previousStreamRequests = [];\n }\n\n private sendRequests() {\n const streamRequests: StreamRequest[] = [];\n\n const clientRequests = this.getDegradedClientRequests();\n\n // map all the client media requests to wcme stream requests\n Object.values(clientRequests).forEach((mr) => {\n streamRequests.push(\n new StreamRequest(\n mr.policyInfo.policy === 'active-speaker'\n ? Policy.ActiveSpeaker\n : Policy.ReceiverSelected,\n mr.policyInfo.policy === 'active-speaker'\n ? new ActiveSpeakerInfo(\n mr.policyInfo.priority,\n mr.policyInfo.crossPriorityDuplication,\n mr.policyInfo.crossPolicyDuplication,\n mr.policyInfo.preferLiveVideo\n )\n : new ReceiverSelectedInfo(mr.policyInfo.csi),\n mr.receiveSlots.map((receiveSlot) => receiveSlot.wcmeReceiveSlot),\n this.getMaxPayloadBitsPerSecond(mr),\n mr.codecInfo && [\n new WcmeCodecInfo(\n 0x80,\n new H264Codec(\n mr.codecInfo.maxFs,\n mr.codecInfo.maxFps || CODEC_DEFAULTS.h264.maxFps,\n this.getH264MaxMbps(mr),\n mr.codecInfo.maxWidth,\n mr.codecInfo.maxHeight\n )\n ),\n ]\n )\n );\n });\n\n //! IMPORTANT: this is only a temporary fix. This will soon be done in the jmp layer (@webex/json-multistream)\n // https://jira-eng-gpk2.cisco.com/jira/browse/WEBEX-326713\n if (!this.checkIsNewRequestsEqualToPrev(streamRequests)) {\n this.sendMediaRequestsCallback(streamRequests);\n this.previousStreamRequests = streamRequests;\n LoggerProxy.logger.info(`multistream:sendRequests --> media requests sent. `);\n } else {\n LoggerProxy.logger.info(\n `multistream:sendRequests --> detected duplicate WCME requests, skipping them... `\n );\n }\n }\n\n public addRequest(mediaRequest: MediaRequest, commit = true): MediaRequestId {\n // eslint-disable-next-line no-plusplus\n const newId = `${this.counter++}`;\n\n this.clientRequests[newId] = mediaRequest;\n\n const eventHandler = ({maxFs}) => {\n mediaRequest.preferredMaxFs = maxFs;\n this.debouncedSourceUpdateListener();\n };\n mediaRequest.handleMaxFs = eventHandler;\n\n mediaRequest.receiveSlots.forEach((rs) => {\n rs.on(ReceiveSlotEvents.SourceUpdate, this.sourceUpdateListener);\n rs.on(ReceiveSlotEvents.MaxFsUpdate, mediaRequest.handleMaxFs);\n });\n\n if (commit) {\n this.commit();\n }\n\n return newId;\n }\n\n public cancelRequest(requestId: MediaRequestId, commit = true) {\n const mediaRequest = this.clientRequests[requestId];\n\n mediaRequest?.receiveSlots.forEach((rs) => {\n rs.off(ReceiveSlotEvents.SourceUpdate, this.sourceUpdateListener);\n rs.off(ReceiveSlotEvents.MaxFsUpdate, mediaRequest.handleMaxFs);\n });\n\n delete this.clientRequests[requestId];\n\n if (commit) {\n this.commit();\n }\n }\n\n public commit() {\n return this.sendRequests();\n }\n\n public reset() {\n this.clientRequests = {};\n }\n}\n"],"mappings":"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"}
|