@webex/plugin-meetings 2.59.3-next.1 → 2.59.4
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/.eslintrc.js +6 -6
- package/LICENSE +1 -1
- package/README.md +1204 -1204
- package/UPGRADING.md +287 -287
- package/babel.config.js +3 -3
- package/browsers.js +108 -108
- package/dist/common/browser-detection.d.ts +9 -9
- package/dist/common/browser-detection.js.map +1 -1
- package/dist/common/collection.d.ts +48 -48
- package/dist/common/collection.js +43 -43
- package/dist/common/collection.js.map +1 -1
- package/dist/common/config.d.ts +2 -2
- package/dist/common/config.js.map +1 -1
- package/dist/common/errors/captcha-error.d.ts +15 -15
- package/dist/common/errors/captcha-error.js +7 -7
- package/dist/common/errors/captcha-error.js.map +1 -1
- package/dist/common/errors/intent-to-join.d.ts +16 -16
- package/dist/common/errors/intent-to-join.js +7 -7
- package/dist/common/errors/intent-to-join.js.map +1 -1
- package/dist/common/errors/join-meeting.d.ts +17 -17
- package/dist/common/errors/join-meeting.js +8 -8
- package/dist/common/errors/join-meeting.js.map +1 -1
- package/dist/common/errors/media.d.ts +15 -15
- package/dist/common/errors/media.js +7 -7
- package/dist/common/errors/media.js.map +1 -1
- package/dist/common/errors/parameter.d.ts +15 -15
- package/dist/common/errors/parameter.js +7 -7
- package/dist/common/errors/parameter.js.map +1 -1
- package/dist/common/errors/password-error.d.ts +15 -15
- package/dist/common/errors/password-error.js +7 -7
- package/dist/common/errors/password-error.js.map +1 -1
- package/dist/common/errors/permission.d.ts +14 -14
- package/dist/common/errors/permission.js +6 -6
- package/dist/common/errors/permission.js.map +1 -1
- package/dist/common/errors/reconnection-in-progress.d.ts +9 -9
- package/dist/common/errors/reconnection-in-progress.js +6 -6
- package/dist/common/errors/reconnection-in-progress.js.map +1 -1
- package/dist/common/errors/reconnection.d.ts +15 -15
- package/dist/common/errors/reconnection.js +7 -7
- package/dist/common/errors/reconnection.js.map +1 -1
- package/dist/common/errors/stats.d.ts +15 -15
- package/dist/common/errors/stats.js +7 -7
- package/dist/common/errors/stats.js.map +1 -1
- package/dist/common/errors/webex-errors.d.ts +81 -81
- package/dist/common/errors/webex-errors.js +42 -42
- package/dist/common/errors/webex-errors.js.map +1 -1
- package/dist/common/errors/webex-meetings-error.d.ts +20 -20
- package/dist/common/errors/webex-meetings-error.js +12 -12
- package/dist/common/errors/webex-meetings-error.js.map +1 -1
- package/dist/common/events/events-scope.d.ts +17 -17
- package/dist/common/events/events-scope.js +10 -10
- package/dist/common/events/events-scope.js.map +1 -1
- package/dist/common/events/events.d.ts +12 -12
- package/dist/common/events/events.js +4 -4
- package/dist/common/events/events.js.map +1 -1
- package/dist/common/events/trigger-proxy.d.ts +2 -2
- package/dist/common/events/trigger-proxy.js.map +1 -1
- package/dist/common/events/util.d.ts +2 -2
- package/dist/common/events/util.js.map +1 -1
- package/dist/common/logs/logger-config.d.ts +2 -2
- package/dist/common/logs/logger-config.js.map +1 -1
- package/dist/common/logs/logger-proxy.d.ts +2 -2
- package/dist/common/logs/logger-proxy.js.map +1 -1
- package/dist/common/logs/request.d.ts +34 -34
- package/dist/common/logs/request.js +18 -18
- package/dist/common/logs/request.js.map +1 -1
- package/dist/common/queue.d.ts +32 -32
- package/dist/common/queue.js +18 -18
- package/dist/common/queue.js.map +1 -1
- package/dist/config.d.ts +73 -73
- package/dist/config.js +2 -2
- package/dist/config.js.map +1 -1
- package/dist/constants.d.ts +926 -924
- package/dist/constants.js +11 -9
- package/dist/constants.js.map +1 -1
- package/dist/controls-options-manager/constants.d.ts +4 -4
- package/dist/controls-options-manager/constants.js.map +1 -1
- package/dist/controls-options-manager/enums.d.ts +5 -5
- package/dist/controls-options-manager/enums.js.map +1 -1
- package/dist/controls-options-manager/index.d.ts +120 -120
- package/dist/controls-options-manager/index.js +81 -81
- package/dist/controls-options-manager/index.js.map +1 -1
- package/dist/controls-options-manager/util.d.ts +7 -7
- package/dist/controls-options-manager/util.js.map +1 -1
- package/dist/index.d.ts +4 -4
- package/dist/index.js.map +1 -1
- package/dist/locus-info/controlsUtils.d.ts +2 -2
- package/dist/locus-info/controlsUtils.js +21 -21
- package/dist/locus-info/controlsUtils.js.map +1 -1
- package/dist/locus-info/embeddedAppsUtils.d.ts +2 -2
- package/dist/locus-info/embeddedAppsUtils.js +14 -14
- package/dist/locus-info/embeddedAppsUtils.js.map +1 -1
- package/dist/locus-info/fullState.d.ts +2 -2
- package/dist/locus-info/fullState.js.map +1 -1
- package/dist/locus-info/hostUtils.d.ts +2 -2
- package/dist/locus-info/hostUtils.js +19 -19
- package/dist/locus-info/hostUtils.js.map +1 -1
- package/dist/locus-info/index.d.ts +269 -269
- package/dist/locus-info/index.js +180 -180
- package/dist/locus-info/index.js.map +1 -1
- package/dist/locus-info/infoUtils.d.ts +2 -2
- package/dist/locus-info/infoUtils.js.map +1 -1
- package/dist/locus-info/mediaSharesUtils.d.ts +2 -2
- package/dist/locus-info/mediaSharesUtils.js +50 -50
- package/dist/locus-info/mediaSharesUtils.js.map +1 -1
- package/dist/locus-info/parser.d.ts +212 -212
- package/dist/locus-info/parser.js +136 -136
- package/dist/locus-info/parser.js.map +1 -1
- package/dist/locus-info/selfUtils.d.ts +2 -2
- package/dist/locus-info/selfUtils.js +52 -52
- package/dist/locus-info/selfUtils.js.map +1 -1
- package/dist/media/index.d.ts +32 -32
- package/dist/media/index.js +145 -145
- package/dist/media/index.js.map +1 -1
- package/dist/media/properties.d.ts +108 -108
- package/dist/media/properties.js +49 -49
- package/dist/media/properties.js.map +1 -1
- package/dist/media/util.d.ts +2 -2
- package/dist/media/util.js.map +1 -1
- package/dist/mediaQualityMetrics/config.d.ts +233 -233
- package/dist/mediaQualityMetrics/config.js.map +1 -1
- package/dist/meeting/effectsState.d.ts +42 -42
- package/dist/meeting/effectsState.js +24 -24
- package/dist/meeting/effectsState.js.map +1 -1
- package/dist/meeting/in-meeting-actions.d.ts +79 -79
- package/dist/meeting/in-meeting-actions.js +11 -11
- package/dist/meeting/in-meeting-actions.js.map +1 -1
- package/dist/meeting/index.d.ts +1621 -1621
- package/dist/meeting/index.js +1538 -1518
- package/dist/meeting/index.js.map +1 -1
- package/dist/meeting/muteState.d.ts +116 -116
- package/dist/meeting/muteState.js +85 -85
- package/dist/meeting/muteState.js.map +1 -1
- package/dist/meeting/request.d.ts +255 -255
- package/dist/meeting/request.js +141 -141
- package/dist/meeting/request.js.map +1 -1
- package/dist/meeting/state.d.ts +9 -9
- package/dist/meeting/state.js +30 -30
- package/dist/meeting/state.js.map +1 -1
- package/dist/meeting/util.d.ts +2 -2
- package/dist/meeting/util.js.map +1 -1
- package/dist/meeting-info/collection.d.ts +20 -20
- package/dist/meeting-info/collection.js +11 -11
- package/dist/meeting-info/collection.js.map +1 -1
- package/dist/meeting-info/index.d.ts +57 -57
- package/dist/meeting-info/index.js +50 -50
- package/dist/meeting-info/index.js.map +1 -1
- package/dist/meeting-info/meeting-info-v2.d.ts +93 -93
- package/dist/meeting-info/meeting-info-v2.js +52 -52
- package/dist/meeting-info/meeting-info-v2.js.map +1 -1
- package/dist/meeting-info/request.d.ts +22 -22
- package/dist/meeting-info/request.js +14 -14
- package/dist/meeting-info/request.js.map +1 -1
- package/dist/meeting-info/util.d.ts +2 -2
- package/dist/meeting-info/util.js +9 -9
- package/dist/meeting-info/util.js.map +1 -1
- package/dist/meeting-info/utilv2.d.ts +2 -2
- package/dist/meeting-info/utilv2.js +20 -20
- package/dist/meeting-info/utilv2.js.map +1 -1
- package/dist/meetings/collection.d.ts +23 -23
- package/dist/meetings/collection.js +14 -14
- package/dist/meetings/collection.js.map +1 -1
- package/dist/meetings/index.d.ts +296 -296
- package/dist/meetings/index.js +259 -259
- package/dist/meetings/index.js.map +1 -1
- package/dist/meetings/request.d.ts +27 -27
- package/dist/meetings/request.js +15 -15
- package/dist/meetings/request.js.map +1 -1
- package/dist/meetings/util.d.ts +18 -18
- package/dist/meetings/util.js +29 -29
- package/dist/meetings/util.js.map +1 -1
- package/dist/member/index.d.ts +147 -147
- package/dist/member/index.js +214 -214
- package/dist/member/index.js.map +1 -1
- package/dist/member/member.types.d.ts +11 -11
- package/dist/member/member.types.js.map +1 -1
- package/dist/member/util.d.ts +2 -2
- package/dist/member/util.js +60 -60
- package/dist/member/util.js.map +1 -1
- package/dist/members/collection.d.ts +24 -24
- package/dist/members/collection.js +11 -11
- package/dist/members/collection.js.map +1 -1
- package/dist/members/index.d.ts +298 -298
- package/dist/members/index.js +275 -275
- package/dist/members/index.js.map +1 -1
- package/dist/members/request.d.ts +50 -50
- package/dist/members/request.js +27 -27
- package/dist/members/request.js.map +1 -1
- package/dist/members/util.d.ts +2 -2
- package/dist/members/util.js +21 -21
- package/dist/members/util.js.map +1 -1
- package/dist/metrics/config.d.ts +169 -169
- package/dist/metrics/config.js.map +1 -1
- package/dist/metrics/constants.d.ts +59 -57
- package/dist/metrics/constants.js +2 -0
- package/dist/metrics/constants.js.map +1 -1
- package/dist/metrics/index.d.ts +152 -152
- package/dist/metrics/index.js +90 -90
- package/dist/metrics/index.js.map +1 -1
- package/dist/networkQualityMonitor/index.d.ts +70 -70
- package/dist/networkQualityMonitor/index.js +65 -65
- package/dist/networkQualityMonitor/index.js.map +1 -1
- package/dist/peer-connection-manager/index.d.ts +6 -6
- package/dist/peer-connection-manager/index.js +87 -87
- package/dist/peer-connection-manager/index.js.map +1 -1
- package/dist/peer-connection-manager/util.d.ts +6 -6
- package/dist/peer-connection-manager/util.js +9 -9
- package/dist/peer-connection-manager/util.js.map +1 -1
- package/dist/personal-meeting-room/index.d.ts +47 -47
- package/dist/personal-meeting-room/index.js +67 -67
- package/dist/personal-meeting-room/index.js.map +1 -1
- package/dist/personal-meeting-room/request.d.ts +14 -14
- package/dist/personal-meeting-room/request.js +7 -7
- package/dist/personal-meeting-room/request.js.map +1 -1
- package/dist/personal-meeting-room/util.d.ts +2 -2
- package/dist/personal-meeting-room/util.js.map +1 -1
- package/dist/reachability/index.d.ts +139 -139
- package/dist/reachability/index.js +110 -110
- package/dist/reachability/index.js.map +1 -1
- package/dist/reachability/request.d.ts +35 -35
- package/dist/reachability/request.js +15 -15
- package/dist/reachability/request.js.map +1 -1
- package/dist/reactions/reactions.d.ts +4 -4
- package/dist/reactions/reactions.js.map +1 -1
- package/dist/reactions/reactions.type.d.ts +32 -32
- package/dist/reactions/reactions.type.js.map +1 -1
- package/dist/reconnection-manager/index.d.ts +112 -112
- package/dist/reconnection-manager/index.js +112 -112
- package/dist/reconnection-manager/index.js.map +1 -1
- package/dist/recording-controller/enums.d.ts +7 -7
- package/dist/recording-controller/enums.js.map +1 -1
- package/dist/recording-controller/index.d.ts +193 -193
- package/dist/recording-controller/index.js +127 -127
- package/dist/recording-controller/index.js.map +1 -1
- package/dist/recording-controller/util.d.ts +13 -13
- package/dist/recording-controller/util.js.map +1 -1
- package/dist/roap/collection.d.ts +10 -10
- package/dist/roap/collection.js.map +1 -1
- package/dist/roap/handler.d.ts +47 -47
- package/dist/roap/handler.js +27 -27
- package/dist/roap/handler.js.map +1 -1
- package/dist/roap/index.d.ts +116 -116
- package/dist/roap/index.js +111 -111
- package/dist/roap/index.js.map +1 -1
- package/dist/roap/request.d.ts +35 -35
- package/dist/roap/request.js +17 -17
- package/dist/roap/request.js.map +1 -1
- package/dist/roap/state.d.ts +9 -9
- package/dist/roap/state.js +14 -14
- package/dist/roap/state.js.map +1 -1
- package/dist/roap/turnDiscovery.d.ts +67 -67
- package/dist/roap/turnDiscovery.js +46 -46
- package/dist/roap/turnDiscovery.js.map +1 -1
- package/dist/roap/util.d.ts +2 -2
- package/dist/roap/util.js.map +1 -1
- package/dist/statsAnalyzer/global.d.ts +118 -126
- package/dist/statsAnalyzer/global.js +4 -12
- package/dist/statsAnalyzer/global.js.map +1 -1
- package/dist/statsAnalyzer/index.d.ts +193 -190
- package/dist/statsAnalyzer/index.js +182 -140
- package/dist/statsAnalyzer/index.js.map +1 -1
- package/dist/statsAnalyzer/mqaUtil.d.ts +22 -22
- package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
- package/dist/transcription/index.d.ts +64 -64
- package/dist/transcription/index.js +42 -42
- package/dist/transcription/index.js.map +1 -1
- package/internal-README.md +172 -172
- package/jest.config.js +3 -3
- package/package.json +21 -22
- package/process +1 -1
- package/src/common/browser-detection.ts +39 -39
- package/src/common/collection.ts +94 -94
- package/src/common/config.ts +9 -9
- package/src/common/errors/captcha-error.ts +25 -25
- package/src/common/errors/intent-to-join.ts +27 -27
- package/src/common/errors/join-meeting.ts +32 -32
- package/src/common/errors/media.ts +25 -25
- package/src/common/errors/parameter.ts +33 -33
- package/src/common/errors/password-error.ts +25 -25
- package/src/common/errors/permission.ts +24 -24
- package/src/common/errors/reconnection-in-progress.ts +8 -8
- package/src/common/errors/reconnection.ts +25 -25
- package/src/common/errors/stats.ts +25 -25
- package/src/common/errors/webex-errors.ts +140 -140
- package/src/common/errors/webex-meetings-error.ts +35 -35
- package/src/common/events/events-scope.ts +30 -30
- package/src/common/events/events.ts +25 -25
- package/src/common/events/trigger-proxy.ts +25 -25
- package/src/common/events/util.ts +39 -39
- package/src/common/logs/logger-config.ts +8 -8
- package/src/common/logs/logger-proxy.ts +44 -44
- package/src/common/logs/request.ts +65 -65
- package/src/common/queue.ts +50 -50
- package/src/config.ts +96 -96
- package/src/constants.ts +1123 -1121
- package/src/controls-options-manager/constants.ts +5 -5
- package/src/controls-options-manager/enums.ts +6 -6
- package/src/controls-options-manager/index.ts +183 -183
- package/src/controls-options-manager/util.ts +20 -20
- package/src/index.js +15 -15
- package/src/locus-info/controlsUtils.ts +112 -112
- package/src/locus-info/embeddedAppsUtils.ts +57 -57
- package/src/locus-info/fullState.ts +69 -69
- package/src/locus-info/hostUtils.ts +60 -60
- package/src/locus-info/index.ts +1303 -1303
- package/src/locus-info/infoUtils.ts +101 -101
- package/src/locus-info/mediaSharesUtils.ts +173 -173
- package/src/locus-info/parser.ts +680 -680
- package/src/locus-info/selfUtils.ts +428 -428
- package/src/media/index.ts +675 -675
- package/src/media/properties.ts +313 -313
- package/src/media/util.ts +37 -37
- package/src/mediaQualityMetrics/config.ts +382 -382
- package/src/meeting/effectsState.ts +209 -209
- package/src/meeting/in-meeting-actions.ts +153 -153
- package/src/meeting/index.ts +6572 -6537
- package/src/meeting/muteState.ts +365 -365
- package/src/meeting/request.ts +810 -810
- package/src/meeting/state.ts +194 -194
- package/src/meeting/util.ts +530 -530
- package/src/meeting-info/collection.ts +41 -41
- package/src/meeting-info/index.ts +137 -137
- package/src/meeting-info/meeting-info-v2.ts +273 -273
- package/src/meeting-info/request.ts +46 -46
- package/src/meeting-info/util.ts +314 -314
- package/src/meeting-info/utilv2.ts +324 -324
- package/src/meetings/collection.ts +43 -43
- package/src/meetings/index.ts +1128 -1128
- package/src/meetings/request.ts +81 -81
- package/src/meetings/util.ts +181 -181
- package/src/member/index.ts +446 -446
- package/src/member/member.types.ts +13 -13
- package/src/member/util.ts +286 -286
- package/src/members/collection.ts +40 -40
- package/src/members/index.ts +900 -900
- package/src/members/request.ts +175 -175
- package/src/members/util.ts +260 -260
- package/src/metrics/config.ts +485 -485
- package/src/metrics/constants.ts +63 -61
- package/src/metrics/index.ts +543 -543
- package/src/networkQualityMonitor/index.ts +211 -211
- package/src/peer-connection-manager/index.ts +847 -847
- package/src/peer-connection-manager/util.ts +119 -119
- package/src/personal-meeting-room/index.ts +157 -157
- package/src/personal-meeting-room/request.ts +48 -48
- package/src/personal-meeting-room/util.ts +49 -49
- package/src/reachability/index.ts +478 -478
- package/src/reachability/request.ts +81 -81
- package/src/reactions/reactions.ts +104 -104
- package/src/reactions/reactions.type.ts +36 -36
- package/src/reconnection-manager/index.ts +622 -622
- package/src/recording-controller/enums.ts +8 -8
- package/src/recording-controller/index.ts +315 -315
- package/src/recording-controller/util.ts +58 -58
- package/src/roap/collection.ts +62 -62
- package/src/roap/handler.ts +294 -294
- package/src/roap/index.ts +413 -413
- package/src/roap/request.ts +229 -229
- package/src/roap/state.ts +156 -156
- package/src/roap/turnDiscovery.ts +283 -283
- package/src/roap/util.ts +100 -100
- package/src/statsAnalyzer/global.ts +120 -128
- package/src/statsAnalyzer/index.ts +1329 -1266
- package/src/statsAnalyzer/mqaUtil.ts +290 -290
- package/src/transcription/index.ts +154 -154
- package/test/integration/spec/journey.js +941 -941
- package/test/integration/spec/space-meeting.js +457 -457
- package/test/integration/spec/transcription.js +55 -55
- package/test/unit/spec/common/browser-detection.js +119 -119
- package/test/unit/spec/common/queue.js +69 -69
- package/test/unit/spec/controls-options-manager/index.js +123 -123
- package/test/unit/spec/controls-options-manager/util.js +65 -65
- package/test/unit/spec/fixture/locus.js +406 -406
- package/test/unit/spec/locus-info/controlsUtils.js +82 -82
- package/test/unit/spec/locus-info/embeddedAppsUtils.js +104 -104
- package/test/unit/spec/locus-info/index.js +1272 -1272
- package/test/unit/spec/locus-info/infoUtils.js +138 -138
- package/test/unit/spec/locus-info/lib/BasicSeqCmp.json +975 -975
- package/test/unit/spec/locus-info/lib/SeqCmp.json +522 -522
- package/test/unit/spec/locus-info/lib/selfConstant.js +286 -286
- package/test/unit/spec/locus-info/parser.js +298 -298
- package/test/unit/spec/locus-info/selfUtils.js +185 -185
- package/test/unit/spec/media/properties.ts +305 -305
- package/test/unit/spec/meeting/effectsState.js +281 -281
- package/test/unit/spec/meeting/in-meeting-actions.ts +90 -90
- package/test/unit/spec/meeting/index.js +5298 -5227
- package/test/unit/spec/meeting/muteState.js +430 -430
- package/test/unit/spec/meeting/request.js +317 -317
- package/test/unit/spec/meeting/utils.js +319 -319
- package/test/unit/spec/meeting-info/meetinginfov2.js +376 -376
- package/test/unit/spec/meeting-info/request.js +64 -64
- package/test/unit/spec/meeting-info/util.js +37 -37
- package/test/unit/spec/meeting-info/utilv2.js +330 -330
- package/test/unit/spec/meetings/collection.js +52 -52
- package/test/unit/spec/meetings/index.js +1375 -1375
- package/test/unit/spec/meetings/utils.js +66 -66
- package/test/unit/spec/member/index.js +47 -47
- package/test/unit/spec/member/util.js +80 -80
- package/test/unit/spec/members/index.js +364 -364
- package/test/unit/spec/members/request.js +200 -200
- package/test/unit/spec/members/utils.js +42 -42
- package/test/unit/spec/metrics/index.js +111 -111
- package/test/unit/spec/networkQualityMonitor/index.js +99 -99
- package/test/unit/spec/peerconnection-manager/index.js +218 -218
- package/test/unit/spec/peerconnection-manager/utils.js +49 -49
- package/test/unit/spec/peerconnection-manager/utils.test-fixtures.ts +388 -388
- package/test/unit/spec/personal-meeting-room/personal-meeting-room.js +29 -29
- package/test/unit/spec/reachability/index.ts +50 -50
- package/test/unit/spec/reconnection-manager/index.js +206 -206
- package/test/unit/spec/recording-controller/index.js +230 -230
- package/test/unit/spec/recording-controller/util.js +101 -101
- package/test/unit/spec/roap/index.ts +128 -128
- package/test/unit/spec/roap/turnDiscovery.ts +372 -372
- package/test/unit/spec/roap/util.js +30 -30
- package/test/unit/spec/stats-analyzer/index.js +438 -287
- package/test/utils/cmr.js +104 -104
- package/test/utils/testUtils.js +287 -287
- package/test/utils/webex-config.js +77 -77
- package/test/utils/webex-test-users.js +82 -82
- package/tsconfig.json +5 -5
|
@@ -1,287 +1,438 @@
|
|
|
1
|
-
import 'jsdom-global/register';
|
|
2
|
-
import chai from 'chai';
|
|
3
|
-
import chaiAsPromised from 'chai-as-promised';
|
|
4
|
-
import sinon from 'sinon';
|
|
5
|
-
|
|
6
|
-
import {StatsAnalyzer, EVENTS} from '../../../../src/statsAnalyzer';
|
|
7
|
-
import NetworkQualityMonitor from '../../../../src/networkQualityMonitor';
|
|
8
|
-
import testUtils from '../../../utils/testUtils';
|
|
9
|
-
|
|
10
|
-
const {assert} = chai;
|
|
11
|
-
|
|
12
|
-
chai.use(chaiAsPromised);
|
|
13
|
-
sinon.assert.expose(chai.assert, {prefix: ''});
|
|
14
|
-
|
|
15
|
-
describe('plugin-meetings', () => {
|
|
16
|
-
describe('StatsAnalyzer', () => {
|
|
17
|
-
describe('compareSentAndReceived()', () => {
|
|
18
|
-
let statsAnalyzer;
|
|
19
|
-
let sandBoxSpy;
|
|
20
|
-
|
|
21
|
-
const initialConfig = {
|
|
22
|
-
videoPacketLossRatioThreshold: 9,
|
|
23
|
-
};
|
|
24
|
-
|
|
25
|
-
const defaultStats = {
|
|
26
|
-
internal: {
|
|
27
|
-
video: {
|
|
28
|
-
send: {
|
|
29
|
-
totalPacketsLostOnReceiver: 10,
|
|
30
|
-
},
|
|
31
|
-
},
|
|
32
|
-
},
|
|
33
|
-
video: {
|
|
34
|
-
send: {
|
|
35
|
-
packetsSent: 2,
|
|
36
|
-
meanRemoteJitter: [],
|
|
37
|
-
meanRoundTripTime: [],
|
|
38
|
-
},
|
|
39
|
-
},
|
|
40
|
-
};
|
|
41
|
-
|
|
42
|
-
const statusResult = {
|
|
43
|
-
type: 'remote-inbound-rtp',
|
|
44
|
-
packetsLost: 11,
|
|
45
|
-
rttThreshold: 501,
|
|
46
|
-
jitterThreshold: 501,
|
|
47
|
-
};
|
|
48
|
-
|
|
49
|
-
const sandbox = sinon.createSandbox();
|
|
50
|
-
|
|
51
|
-
beforeEach(() => {
|
|
52
|
-
const networkQualityMonitor = new NetworkQualityMonitor(initialConfig);
|
|
53
|
-
|
|
54
|
-
statsAnalyzer = new StatsAnalyzer(initialConfig, networkQualityMonitor, defaultStats);
|
|
55
|
-
|
|
56
|
-
sandBoxSpy = sandbox.spy(
|
|
57
|
-
statsAnalyzer.networkQualityMonitor,
|
|
58
|
-
'determineUplinkNetworkQuality'
|
|
59
|
-
);
|
|
60
|
-
});
|
|
61
|
-
|
|
62
|
-
afterEach(() => {
|
|
63
|
-
sandbox.restore();
|
|
64
|
-
});
|
|
65
|
-
|
|
66
|
-
it('should trigger determineUplinkNetworkQuality with specific arguments', async () => {
|
|
67
|
-
await statsAnalyzer.parseGetStatsResult(statusResult, 'video');
|
|
68
|
-
|
|
69
|
-
assert.calledOnce(statsAnalyzer.networkQualityMonitor.determineUplinkNetworkQuality);
|
|
70
|
-
assert(
|
|
71
|
-
sandBoxSpy.calledWith({
|
|
72
|
-
mediaType: 'video',
|
|
73
|
-
remoteRtpResults: statusResult,
|
|
74
|
-
statsAnalyzerCurrentStats: statsAnalyzer.statsResults,
|
|
75
|
-
})
|
|
76
|
-
);
|
|
77
|
-
});
|
|
78
|
-
});
|
|
79
|
-
|
|
80
|
-
describe('startAnalyzer', () => {
|
|
81
|
-
let clock;
|
|
82
|
-
let pc;
|
|
83
|
-
let networkQualityMonitor;
|
|
84
|
-
let statsAnalyzer;
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
},
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
},
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
sender: {
|
|
156
|
-
getStats: sinon.stub().resolves([]),
|
|
157
|
-
},
|
|
158
|
-
receiver: {
|
|
159
|
-
getStats: sinon.stub().resolves([]),
|
|
160
|
-
},
|
|
161
|
-
},
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
statsAnalyzer.
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
//
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
1
|
+
import 'jsdom-global/register';
|
|
2
|
+
import chai from 'chai';
|
|
3
|
+
import chaiAsPromised from 'chai-as-promised';
|
|
4
|
+
import sinon from 'sinon';
|
|
5
|
+
|
|
6
|
+
import {StatsAnalyzer, EVENTS} from '../../../../src/statsAnalyzer';
|
|
7
|
+
import NetworkQualityMonitor from '../../../../src/networkQualityMonitor';
|
|
8
|
+
import testUtils from '../../../utils/testUtils';
|
|
9
|
+
|
|
10
|
+
const {assert} = chai;
|
|
11
|
+
|
|
12
|
+
chai.use(chaiAsPromised);
|
|
13
|
+
sinon.assert.expose(chai.assert, {prefix: ''});
|
|
14
|
+
|
|
15
|
+
describe('plugin-meetings', () => {
|
|
16
|
+
describe('StatsAnalyzer', () => {
|
|
17
|
+
describe('compareSentAndReceived()', () => {
|
|
18
|
+
let statsAnalyzer;
|
|
19
|
+
let sandBoxSpy;
|
|
20
|
+
|
|
21
|
+
const initialConfig = {
|
|
22
|
+
videoPacketLossRatioThreshold: 9,
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
const defaultStats = {
|
|
26
|
+
internal: {
|
|
27
|
+
video: {
|
|
28
|
+
send: {
|
|
29
|
+
totalPacketsLostOnReceiver: 10,
|
|
30
|
+
},
|
|
31
|
+
},
|
|
32
|
+
},
|
|
33
|
+
video: {
|
|
34
|
+
send: {
|
|
35
|
+
packetsSent: 2,
|
|
36
|
+
meanRemoteJitter: [],
|
|
37
|
+
meanRoundTripTime: [],
|
|
38
|
+
},
|
|
39
|
+
},
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
const statusResult = {
|
|
43
|
+
type: 'remote-inbound-rtp',
|
|
44
|
+
packetsLost: 11,
|
|
45
|
+
rttThreshold: 501,
|
|
46
|
+
jitterThreshold: 501,
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
const sandbox = sinon.createSandbox();
|
|
50
|
+
|
|
51
|
+
beforeEach(() => {
|
|
52
|
+
const networkQualityMonitor = new NetworkQualityMonitor(initialConfig);
|
|
53
|
+
|
|
54
|
+
statsAnalyzer = new StatsAnalyzer(initialConfig, networkQualityMonitor, defaultStats);
|
|
55
|
+
|
|
56
|
+
sandBoxSpy = sandbox.spy(
|
|
57
|
+
statsAnalyzer.networkQualityMonitor,
|
|
58
|
+
'determineUplinkNetworkQuality'
|
|
59
|
+
);
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
afterEach(() => {
|
|
63
|
+
sandbox.restore();
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
it('should trigger determineUplinkNetworkQuality with specific arguments', async () => {
|
|
67
|
+
await statsAnalyzer.parseGetStatsResult(statusResult, 'video');
|
|
68
|
+
|
|
69
|
+
assert.calledOnce(statsAnalyzer.networkQualityMonitor.determineUplinkNetworkQuality);
|
|
70
|
+
assert(
|
|
71
|
+
sandBoxSpy.calledWith({
|
|
72
|
+
mediaType: 'video',
|
|
73
|
+
remoteRtpResults: statusResult,
|
|
74
|
+
statsAnalyzerCurrentStats: statsAnalyzer.statsResults,
|
|
75
|
+
})
|
|
76
|
+
);
|
|
77
|
+
});
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
describe('startAnalyzer', () => {
|
|
81
|
+
let clock;
|
|
82
|
+
let pc;
|
|
83
|
+
let networkQualityMonitor;
|
|
84
|
+
let statsAnalyzer;
|
|
85
|
+
const statusResultOutboundRTP = {
|
|
86
|
+
type: 'outbound-rtp',
|
|
87
|
+
frameHeight: 720,
|
|
88
|
+
frameWidth: 1280,
|
|
89
|
+
packetsLost: 11,
|
|
90
|
+
framesSent: 105,
|
|
91
|
+
hugeFramesSent: 1,
|
|
92
|
+
framesEncoded: 102,
|
|
93
|
+
rttThreshold: 501,
|
|
94
|
+
jitterThreshold: 501,
|
|
95
|
+
jitterBufferDelay: 288.131459,
|
|
96
|
+
jitterBufferEmittedCount: 4013,
|
|
97
|
+
trackIdentifier: '6bbf5506-6a7e-4397-951c-c05b72ab0ace',
|
|
98
|
+
bytesSent: 1233,
|
|
99
|
+
totalPacketsSent: 100,
|
|
100
|
+
};
|
|
101
|
+
|
|
102
|
+
let receivedEventsData = {
|
|
103
|
+
local: {},
|
|
104
|
+
remote: {},
|
|
105
|
+
};
|
|
106
|
+
|
|
107
|
+
const initialConfig = {
|
|
108
|
+
analyzerInterval: 1000,
|
|
109
|
+
};
|
|
110
|
+
|
|
111
|
+
let fakeStats;
|
|
112
|
+
|
|
113
|
+
const resetReceivedEvents = () => {
|
|
114
|
+
receivedEventsData = {
|
|
115
|
+
local: {},
|
|
116
|
+
remote: {},
|
|
117
|
+
};
|
|
118
|
+
};
|
|
119
|
+
|
|
120
|
+
beforeEach(() => {
|
|
121
|
+
clock = sinon.useFakeTimers();
|
|
122
|
+
|
|
123
|
+
resetReceivedEvents();
|
|
124
|
+
|
|
125
|
+
// bytesReceived and bytesSent need to be non-zero in order for StatsAnalyzer to parse any other values
|
|
126
|
+
fakeStats = {
|
|
127
|
+
audio: {
|
|
128
|
+
receiver: {
|
|
129
|
+
type: 'inbound-rtp',
|
|
130
|
+
packetsReceived: 0,
|
|
131
|
+
bytesReceived: 1,
|
|
132
|
+
},
|
|
133
|
+
sender: {
|
|
134
|
+
type: 'outbound-rtp',
|
|
135
|
+
packetsSent: 0,
|
|
136
|
+
bytesSent: 1,
|
|
137
|
+
},
|
|
138
|
+
},
|
|
139
|
+
video: {
|
|
140
|
+
receiver: {
|
|
141
|
+
type: 'inbound-rtp',
|
|
142
|
+
framesDecoded: 0,
|
|
143
|
+
bytesReceived: 1,
|
|
144
|
+
},
|
|
145
|
+
sender: {
|
|
146
|
+
type: 'outbound-rtp',
|
|
147
|
+
framesSent: 0,
|
|
148
|
+
bytesSent: 1,
|
|
149
|
+
},
|
|
150
|
+
},
|
|
151
|
+
};
|
|
152
|
+
|
|
153
|
+
pc = {
|
|
154
|
+
audioTransceiver: {
|
|
155
|
+
sender: {
|
|
156
|
+
getStats: sinon.stub().resolves([fakeStats.audio.sender]),
|
|
157
|
+
},
|
|
158
|
+
receiver: {
|
|
159
|
+
getStats: sinon.stub().resolves([fakeStats.audio.receiver]),
|
|
160
|
+
},
|
|
161
|
+
},
|
|
162
|
+
videoTransceiver: {
|
|
163
|
+
sender: {
|
|
164
|
+
getStats: sinon.stub().resolves([fakeStats.video.sender]),
|
|
165
|
+
},
|
|
166
|
+
receiver: {
|
|
167
|
+
getStats: sinon.stub().resolves([fakeStats.video.receiver]),
|
|
168
|
+
},
|
|
169
|
+
},
|
|
170
|
+
shareTransceiver: {
|
|
171
|
+
sender: {
|
|
172
|
+
getStats: sinon.stub().resolves([]),
|
|
173
|
+
},
|
|
174
|
+
receiver: {
|
|
175
|
+
getStats: sinon.stub().resolves([]),
|
|
176
|
+
},
|
|
177
|
+
},
|
|
178
|
+
};
|
|
179
|
+
|
|
180
|
+
networkQualityMonitor = new NetworkQualityMonitor(initialConfig);
|
|
181
|
+
|
|
182
|
+
statsAnalyzer = new StatsAnalyzer(initialConfig, networkQualityMonitor);
|
|
183
|
+
|
|
184
|
+
statsAnalyzer.on(EVENTS.LOCAL_MEDIA_STARTED, (data) => {
|
|
185
|
+
receivedEventsData.local.started = data;
|
|
186
|
+
});
|
|
187
|
+
statsAnalyzer.on(EVENTS.LOCAL_MEDIA_STOPPED, (data) => {
|
|
188
|
+
receivedEventsData.local.stopped = data;
|
|
189
|
+
});
|
|
190
|
+
statsAnalyzer.on(EVENTS.REMOTE_MEDIA_STARTED, (data) => {
|
|
191
|
+
receivedEventsData.remote.started = data;
|
|
192
|
+
});
|
|
193
|
+
statsAnalyzer.on(EVENTS.REMOTE_MEDIA_STOPPED, (data) => {
|
|
194
|
+
receivedEventsData.remote.stopped = data;
|
|
195
|
+
});
|
|
196
|
+
statsAnalyzer.on(EVENTS.NO_FRAMES_SENT, (data) => {
|
|
197
|
+
receivedEventsData.noFramesSent = data;
|
|
198
|
+
});
|
|
199
|
+
statsAnalyzer.on(EVENTS.NO_VIDEO_ENCODED, (data) => {
|
|
200
|
+
receivedEventsData.noVideoEncoded = data;
|
|
201
|
+
});
|
|
202
|
+
});
|
|
203
|
+
|
|
204
|
+
afterEach(() => {
|
|
205
|
+
clock.restore();
|
|
206
|
+
});
|
|
207
|
+
|
|
208
|
+
const startStatsAnalyzer = async (mediaStatus) => {
|
|
209
|
+
statsAnalyzer.updateMediaStatus(mediaStatus);
|
|
210
|
+
statsAnalyzer.startAnalyzer(pc);
|
|
211
|
+
|
|
212
|
+
await testUtils.flushPromises();
|
|
213
|
+
};
|
|
214
|
+
|
|
215
|
+
const progressTime = async () => {
|
|
216
|
+
await clock.tickAsync(initialConfig.analyzerInterval);
|
|
217
|
+
await testUtils.flushPromises();
|
|
218
|
+
};
|
|
219
|
+
|
|
220
|
+
const checkReceivedEvent = ({expected}) => {
|
|
221
|
+
// check that we got the REMOTE_MEDIA_STARTED event for audio
|
|
222
|
+
assert.deepEqual(receivedEventsData.local.started, expected.local?.started);
|
|
223
|
+
assert.deepEqual(receivedEventsData.local.stopped, expected.local?.stopped);
|
|
224
|
+
assert.deepEqual(receivedEventsData.remote.started, expected.remote?.started);
|
|
225
|
+
assert.deepEqual(receivedEventsData.remote.stopped, expected.remote?.stopped);
|
|
226
|
+
};
|
|
227
|
+
|
|
228
|
+
it('emits LOCAL_MEDIA_STARTED and LOCAL_MEDIA_STOPPED events for audio', async () => {
|
|
229
|
+
await startStatsAnalyzer({expected: {sendAudio: true}});
|
|
230
|
+
|
|
231
|
+
// check that we haven't received any events yet
|
|
232
|
+
checkReceivedEvent({expected: {}});
|
|
233
|
+
|
|
234
|
+
// setup a mock to return some values higher the previous ones
|
|
235
|
+
fakeStats.audio.sender.packetsSent += 10;
|
|
236
|
+
|
|
237
|
+
await progressTime();
|
|
238
|
+
|
|
239
|
+
// check that we got the LOCAL_MEDIA_STARTED event for audio
|
|
240
|
+
checkReceivedEvent({expected: {local: {started: {type: 'audio'}}}});
|
|
241
|
+
|
|
242
|
+
// now advance the clock and the mock still returns same values, so only "stopped" event should be triggered
|
|
243
|
+
resetReceivedEvents();
|
|
244
|
+
await progressTime();
|
|
245
|
+
checkReceivedEvent({expected: {local: {stopped: {type: 'audio'}}}});
|
|
246
|
+
});
|
|
247
|
+
|
|
248
|
+
it('emits LOCAL_MEDIA_STARTED and LOCAL_MEDIA_STOPPED events for video', async () => {
|
|
249
|
+
await startStatsAnalyzer({expected: {sendVideo: true}});
|
|
250
|
+
|
|
251
|
+
// check that we haven't received any events yet
|
|
252
|
+
checkReceivedEvent({expected: {}});
|
|
253
|
+
|
|
254
|
+
// setup a mock to return some values higher the previous ones
|
|
255
|
+
fakeStats.video.sender.framesSent += 1;
|
|
256
|
+
|
|
257
|
+
await progressTime();
|
|
258
|
+
|
|
259
|
+
// check that we got the LOCAL_MEDIA_STARTED event for audio
|
|
260
|
+
checkReceivedEvent({expected: {local: {started: {type: 'video'}}}});
|
|
261
|
+
|
|
262
|
+
// now advance the clock and the mock still returns same values, so only "stopped" event should be triggered
|
|
263
|
+
resetReceivedEvents();
|
|
264
|
+
await progressTime();
|
|
265
|
+
checkReceivedEvent({expected: {local: {stopped: {type: 'video'}}}});
|
|
266
|
+
});
|
|
267
|
+
|
|
268
|
+
it('emits REMOTE_MEDIA_STARTED and REMOTE_MEDIA_STOPPED events for audio', async () => {
|
|
269
|
+
await startStatsAnalyzer({expected: {receiveAudio: true}});
|
|
270
|
+
|
|
271
|
+
// check that we haven't received any events yet
|
|
272
|
+
checkReceivedEvent({expected: {}});
|
|
273
|
+
|
|
274
|
+
// setup a mock to return some values higher the previous ones
|
|
275
|
+
fakeStats.audio.receiver.packetsReceived += 5;
|
|
276
|
+
|
|
277
|
+
await progressTime();
|
|
278
|
+
// check that we got the REMOTE_MEDIA_STARTED event for audio
|
|
279
|
+
checkReceivedEvent({expected: {remote: {started: {type: 'audio'}}}});
|
|
280
|
+
|
|
281
|
+
// now advance the clock and the mock still returns same values, so only "stopped" event should be triggered
|
|
282
|
+
resetReceivedEvents();
|
|
283
|
+
await progressTime();
|
|
284
|
+
|
|
285
|
+
checkReceivedEvent({expected: {remote: {stopped: {type: 'audio'}}}});
|
|
286
|
+
});
|
|
287
|
+
|
|
288
|
+
it('emits REMOTE_MEDIA_STARTED and REMOTE_MEDIA_STOPPED events for video', async () => {
|
|
289
|
+
await startStatsAnalyzer({expected: {receiveVideo: true}});
|
|
290
|
+
|
|
291
|
+
// check that we haven't received any events yet
|
|
292
|
+
checkReceivedEvent({expected: {}});
|
|
293
|
+
|
|
294
|
+
// setup a mock to return some values higher the previous ones
|
|
295
|
+
fakeStats.video.receiver.framesDecoded += 1;
|
|
296
|
+
|
|
297
|
+
await progressTime();
|
|
298
|
+
// check that we got the REMOTE_MEDIA_STARTED event for video
|
|
299
|
+
checkReceivedEvent({expected: {remote: {started: {type: 'video'}}}});
|
|
300
|
+
|
|
301
|
+
// now advance the clock and the mock still returns same values, so only "stopped" event should be triggered
|
|
302
|
+
resetReceivedEvents();
|
|
303
|
+
await progressTime();
|
|
304
|
+
|
|
305
|
+
checkReceivedEvent({expected: {remote: {stopped: {type: 'video'}}}});
|
|
306
|
+
});
|
|
307
|
+
|
|
308
|
+
const checkStats = (type) => {
|
|
309
|
+
const statsResult = {
|
|
310
|
+
height: 720,
|
|
311
|
+
width: 1280,
|
|
312
|
+
jitterBufferDelay: 288.131459,
|
|
313
|
+
jitterBufferEmittedCount: 4013,
|
|
314
|
+
trackIdentifier: '6bbf5506-6a7e-4397-951c-c05b72ab0ace',
|
|
315
|
+
avgJitterDelay: 0.07179951632195365,
|
|
316
|
+
};
|
|
317
|
+
if (type === 'inbound-rtp') {
|
|
318
|
+
statsResult.framesDecoded = 4013;
|
|
319
|
+
statsResult.framesDropped = 0;
|
|
320
|
+
statsResult.framesReceived = 4016;
|
|
321
|
+
assert.deepEqual(statsAnalyzer.statsResults.resolutions.video.recv, statsResult);
|
|
322
|
+
} else if (type === 'outbound-rtp') {
|
|
323
|
+
statsResult.framesSent = 105;
|
|
324
|
+
statsResult.hugeFramesSent = 1;
|
|
325
|
+
assert.deepEqual(statsAnalyzer.statsResults.resolutions.video.send, statsResult);
|
|
326
|
+
}
|
|
327
|
+
};
|
|
328
|
+
|
|
329
|
+
it('processes track results and populate statsResults.resolutions object when type is inbound-rtp with video', async () => {
|
|
330
|
+
await startStatsAnalyzer({expected: {receiveVideo: true}});
|
|
331
|
+
const statusResultInboundRTP = {
|
|
332
|
+
type: 'inbound-rtp',
|
|
333
|
+
frameHeight: 720,
|
|
334
|
+
frameWidth: 1280,
|
|
335
|
+
packetsLost: 11,
|
|
336
|
+
rttThreshold: 501,
|
|
337
|
+
jitterThreshold: 501,
|
|
338
|
+
framesDecoded: 4013,
|
|
339
|
+
framesDropped: 0,
|
|
340
|
+
framesReceived: 4016,
|
|
341
|
+
jitterBufferDelay: 288.131459,
|
|
342
|
+
jitterBufferEmittedCount: 4013,
|
|
343
|
+
trackIdentifier: '6bbf5506-6a7e-4397-951c-c05b72ab0ace',
|
|
344
|
+
};
|
|
345
|
+
await statsAnalyzer.parseGetStatsResult(statusResultInboundRTP, 'video');
|
|
346
|
+
checkStats('inbound-rtp');
|
|
347
|
+
});
|
|
348
|
+
it('processes track results and populate statsResults.resolutions object when type is outbound-rtp with video', async () => {
|
|
349
|
+
await startStatsAnalyzer({expected: {receiveVideo: true}});
|
|
350
|
+
|
|
351
|
+
await statsAnalyzer.parseGetStatsResult(statusResultOutboundRTP, 'video');
|
|
352
|
+
checkStats('outbound-rtp');
|
|
353
|
+
});
|
|
354
|
+
|
|
355
|
+
it('doesnot processes track results with audio', async () => {
|
|
356
|
+
await startStatsAnalyzer({expected: {receiveAudio: true}});
|
|
357
|
+
await statsAnalyzer.parseGetStatsResult(statusResultOutboundRTP, 'audio');
|
|
358
|
+
assert.deepEqual(statsAnalyzer.statsResults.resolutions.audio, undefined);
|
|
359
|
+
});
|
|
360
|
+
|
|
361
|
+
it('emits NO_FRAMES_ENCODED when frames are not being encoded', async () => {
|
|
362
|
+
const expected = {mediaType: 'video'};
|
|
363
|
+
await startStatsAnalyzer({expected: {sendVideo: true}});
|
|
364
|
+
|
|
365
|
+
statsAnalyzer.lastStatsResults.video.send = {framesEncoded: 102, totalPacketsSent: 106};
|
|
366
|
+
|
|
367
|
+
await statsAnalyzer.parseGetStatsResult(statusResultOutboundRTP, 'video');
|
|
368
|
+
|
|
369
|
+
statsAnalyzer.compareLastStatsResult();
|
|
370
|
+
assert.deepEqual(receivedEventsData.noVideoEncoded, expected);
|
|
371
|
+
});
|
|
372
|
+
|
|
373
|
+
it('emits NO_FRAMES_SENT when frames are not being sent but frames are being encoded', async () => {
|
|
374
|
+
await startStatsAnalyzer({expected: {sendVideo: true}});
|
|
375
|
+
|
|
376
|
+
const expected = {mediaType: 'video'};
|
|
377
|
+
|
|
378
|
+
statsAnalyzer.lastStatsResults.video.send = {
|
|
379
|
+
framesEncoded: 10,
|
|
380
|
+
framesSent: 105,
|
|
381
|
+
totalPacketsSent: 106,
|
|
382
|
+
};
|
|
383
|
+
await statsAnalyzer.parseGetStatsResult(statusResultOutboundRTP, 'video');
|
|
384
|
+
|
|
385
|
+
statsAnalyzer.compareLastStatsResult();
|
|
386
|
+
assert.deepEqual(receivedEventsData.noFramesSent, expected);
|
|
387
|
+
});
|
|
388
|
+
|
|
389
|
+
it('doesnot emits NO_FRAMES_SENT when last emitted event is LOCAL_MEDIA_STOPPED', async () => {
|
|
390
|
+
statsAnalyzer.lastEmittedStartStopEvent.video.local = EVENTS.LOCAL_MEDIA_STOPPED;
|
|
391
|
+
|
|
392
|
+
await startStatsAnalyzer({expected: {sendVideo: true}});
|
|
393
|
+
await statsAnalyzer.parseGetStatsResult(statusResultOutboundRTP, 'video');
|
|
394
|
+
|
|
395
|
+
statsAnalyzer.compareLastStatsResult();
|
|
396
|
+
assert.deepEqual(receivedEventsData.noFramesSent, undefined);
|
|
397
|
+
});
|
|
398
|
+
|
|
399
|
+
it('emits NO_FRAMES_ENCODED when frames are not being encoded for share', async () => {
|
|
400
|
+
const expected = {mediaType: 'share'};
|
|
401
|
+
await startStatsAnalyzer({expected: {sendShare: true}});
|
|
402
|
+
|
|
403
|
+
statsAnalyzer.lastStatsResults.share.send = {framesEncoded: 102, totalPacketsSent: 106};
|
|
404
|
+
|
|
405
|
+
await statsAnalyzer.parseGetStatsResult(statusResultOutboundRTP, 'share');
|
|
406
|
+
|
|
407
|
+
statsAnalyzer.compareLastStatsResult();
|
|
408
|
+
assert.deepEqual(receivedEventsData.noVideoEncoded, expected);
|
|
409
|
+
});
|
|
410
|
+
|
|
411
|
+
it('emits NO_FRAMES_SENT when frames are not being sent but frames are being encoded for share', async () => {
|
|
412
|
+
const expected = {mediaType: 'share'};
|
|
413
|
+
await startStatsAnalyzer({expected: {sendShare: true}});
|
|
414
|
+
|
|
415
|
+
statsAnalyzer.lastStatsResults.share.send = {
|
|
416
|
+
framesEncoded: 10,
|
|
417
|
+
framesSent: 105,
|
|
418
|
+
totalPacketsSent: 106,
|
|
419
|
+
};
|
|
420
|
+
|
|
421
|
+
await statsAnalyzer.parseGetStatsResult(statusResultOutboundRTP, 'share');
|
|
422
|
+
|
|
423
|
+
statsAnalyzer.compareLastStatsResult();
|
|
424
|
+
assert.deepEqual(receivedEventsData.noFramesSent, expected);
|
|
425
|
+
});
|
|
426
|
+
|
|
427
|
+
it('doesnot emits NO_FRAMES_SENT when last emitted event is LOCAL_MEDIA_STOPPED for share', async () => {
|
|
428
|
+
statsAnalyzer.lastEmittedStartStopEvent.video.local = EVENTS.LOCAL_MEDIA_STOPPED;
|
|
429
|
+
|
|
430
|
+
await startStatsAnalyzer({expected: {sendShare: true}});
|
|
431
|
+
await statsAnalyzer.parseGetStatsResult(statusResultOutboundRTP, 'share');
|
|
432
|
+
|
|
433
|
+
statsAnalyzer.compareLastStatsResult();
|
|
434
|
+
assert.deepEqual(receivedEventsData.noFramesSent, undefined);
|
|
435
|
+
});
|
|
436
|
+
});
|
|
437
|
+
});
|
|
438
|
+
});
|