@webex/plugin-meetings 2.59.1 → 2.59.3-next.1
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.map +1 -1
- package/dist/constants.d.ts +924 -924
- package/dist/constants.js +9 -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 +1502 -1505
- 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 +57 -57
- 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 +126 -126
- package/dist/statsAnalyzer/global.js.map +1 -1
- package/dist/statsAnalyzer/index.d.ts +190 -190
- package/dist/statsAnalyzer/index.js +128 -128
- 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 +22 -21
- 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 +1121 -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 +6537 -6543
- 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 +61 -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 +128 -128
- package/src/statsAnalyzer/index.ts +1266 -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 +5227 -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 +287 -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,30 +1,30 @@
|
|
|
1
|
-
import 'jsdom-global/register';
|
|
2
|
-
import {assert} from '@webex/test-helper-chai';
|
|
3
|
-
import RoapUtil from '@webex/plugin-meetings/src/roap/util';
|
|
4
|
-
import PeerConnectionManager from '@webex/plugin-meetings/src/peer-connection-manager/index';
|
|
5
|
-
import sinon from 'sinon';
|
|
6
|
-
|
|
7
|
-
describe('RoapUtil', () => {
|
|
8
|
-
describe('updatePeerConnection', () => {
|
|
9
|
-
let meeting, session;
|
|
10
|
-
|
|
11
|
-
beforeEach('stub PeerConnectionManager', () => {
|
|
12
|
-
meeting = {
|
|
13
|
-
mediaProperties: {
|
|
14
|
-
peerConnection: {name: 'peer-connection'},
|
|
15
|
-
},
|
|
16
|
-
roap: {
|
|
17
|
-
lastRoapOffer: 'lastRoapOffer',
|
|
18
|
-
},
|
|
19
|
-
};
|
|
20
|
-
session = {OFFER: {sdps: ['sdp1', 'sdp2']}};
|
|
21
|
-
|
|
22
|
-
PeerConnectionManager.updatePeerConnection = sinon.stub().returns(Promise.resolve());
|
|
23
|
-
});
|
|
24
|
-
|
|
25
|
-
it('should just call PeerConnection.updatePeerConnection', async () => {
|
|
26
|
-
await RoapUtil.updatePeerConnection(meeting, session);
|
|
27
|
-
assert.calledOnce(PeerConnectionManager.updatePeerConnection);
|
|
28
|
-
});
|
|
29
|
-
});
|
|
30
|
-
});
|
|
1
|
+
import 'jsdom-global/register';
|
|
2
|
+
import {assert} from '@webex/test-helper-chai';
|
|
3
|
+
import RoapUtil from '@webex/plugin-meetings/src/roap/util';
|
|
4
|
+
import PeerConnectionManager from '@webex/plugin-meetings/src/peer-connection-manager/index';
|
|
5
|
+
import sinon from 'sinon';
|
|
6
|
+
|
|
7
|
+
describe('RoapUtil', () => {
|
|
8
|
+
describe('updatePeerConnection', () => {
|
|
9
|
+
let meeting, session;
|
|
10
|
+
|
|
11
|
+
beforeEach('stub PeerConnectionManager', () => {
|
|
12
|
+
meeting = {
|
|
13
|
+
mediaProperties: {
|
|
14
|
+
peerConnection: {name: 'peer-connection'},
|
|
15
|
+
},
|
|
16
|
+
roap: {
|
|
17
|
+
lastRoapOffer: 'lastRoapOffer',
|
|
18
|
+
},
|
|
19
|
+
};
|
|
20
|
+
session = {OFFER: {sdps: ['sdp1', 'sdp2']}};
|
|
21
|
+
|
|
22
|
+
PeerConnectionManager.updatePeerConnection = sinon.stub().returns(Promise.resolve());
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
it('should just call PeerConnection.updatePeerConnection', async () => {
|
|
26
|
+
await RoapUtil.updatePeerConnection(meeting, session);
|
|
27
|
+
assert.calledOnce(PeerConnectionManager.updatePeerConnection);
|
|
28
|
+
});
|
|
29
|
+
});
|
|
30
|
+
});
|
|
@@ -1,287 +1,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
|
-
|
|
86
|
-
let receivedEventsData = {
|
|
87
|
-
local: {},
|
|
88
|
-
remote: {},
|
|
89
|
-
};
|
|
90
|
-
|
|
91
|
-
const initialConfig = {
|
|
92
|
-
analyzerInterval: 1000,
|
|
93
|
-
};
|
|
94
|
-
|
|
95
|
-
let fakeStats;
|
|
96
|
-
|
|
97
|
-
const resetReceivedEvents = () => {
|
|
98
|
-
receivedEventsData = {
|
|
99
|
-
local: {},
|
|
100
|
-
remote: {},
|
|
101
|
-
};
|
|
102
|
-
};
|
|
103
|
-
|
|
104
|
-
beforeEach(() => {
|
|
105
|
-
clock = sinon.useFakeTimers();
|
|
106
|
-
|
|
107
|
-
resetReceivedEvents();
|
|
108
|
-
|
|
109
|
-
// bytesReceived and bytesSent need to be non-zero in order for StatsAnalyzer to parse any other values
|
|
110
|
-
fakeStats = {
|
|
111
|
-
audio: {
|
|
112
|
-
receiver: {
|
|
113
|
-
type: 'inbound-rtp',
|
|
114
|
-
packetsReceived: 0,
|
|
115
|
-
bytesReceived: 1,
|
|
116
|
-
},
|
|
117
|
-
sender: {
|
|
118
|
-
type: 'outbound-rtp',
|
|
119
|
-
packetsSent: 0,
|
|
120
|
-
bytesSent: 1,
|
|
121
|
-
},
|
|
122
|
-
},
|
|
123
|
-
video: {
|
|
124
|
-
receiver: {
|
|
125
|
-
type: 'inbound-rtp',
|
|
126
|
-
framesDecoded: 0,
|
|
127
|
-
bytesReceived: 1,
|
|
128
|
-
},
|
|
129
|
-
sender: {
|
|
130
|
-
type: 'outbound-rtp',
|
|
131
|
-
framesSent: 0,
|
|
132
|
-
bytesSent: 1,
|
|
133
|
-
},
|
|
134
|
-
},
|
|
135
|
-
};
|
|
136
|
-
|
|
137
|
-
pc = {
|
|
138
|
-
audioTransceiver: {
|
|
139
|
-
sender: {
|
|
140
|
-
getStats: sinon.stub().resolves([fakeStats.audio.sender]),
|
|
141
|
-
},
|
|
142
|
-
receiver: {
|
|
143
|
-
getStats: sinon.stub().resolves([fakeStats.audio.receiver]),
|
|
144
|
-
},
|
|
145
|
-
},
|
|
146
|
-
videoTransceiver: {
|
|
147
|
-
sender: {
|
|
148
|
-
getStats: sinon.stub().resolves([fakeStats.video.sender]),
|
|
149
|
-
},
|
|
150
|
-
receiver: {
|
|
151
|
-
getStats: sinon.stub().resolves([fakeStats.video.receiver]),
|
|
152
|
-
},
|
|
153
|
-
},
|
|
154
|
-
shareTransceiver: {
|
|
155
|
-
sender: {
|
|
156
|
-
getStats: sinon.stub().resolves([]),
|
|
157
|
-
},
|
|
158
|
-
receiver: {
|
|
159
|
-
getStats: sinon.stub().resolves([]),
|
|
160
|
-
},
|
|
161
|
-
},
|
|
162
|
-
};
|
|
163
|
-
|
|
164
|
-
networkQualityMonitor = new NetworkQualityMonitor(initialConfig);
|
|
165
|
-
|
|
166
|
-
statsAnalyzer = new StatsAnalyzer(initialConfig, networkQualityMonitor);
|
|
167
|
-
|
|
168
|
-
statsAnalyzer.on(EVENTS.LOCAL_MEDIA_STARTED, (data) => {
|
|
169
|
-
receivedEventsData.local.started = data;
|
|
170
|
-
});
|
|
171
|
-
statsAnalyzer.on(EVENTS.LOCAL_MEDIA_STOPPED, (data) => {
|
|
172
|
-
receivedEventsData.local.stopped = data;
|
|
173
|
-
});
|
|
174
|
-
statsAnalyzer.on(EVENTS.REMOTE_MEDIA_STARTED, (data) => {
|
|
175
|
-
receivedEventsData.remote.started = data;
|
|
176
|
-
});
|
|
177
|
-
statsAnalyzer.on(EVENTS.REMOTE_MEDIA_STOPPED, (data) => {
|
|
178
|
-
receivedEventsData.remote.stopped = data;
|
|
179
|
-
});
|
|
180
|
-
});
|
|
181
|
-
|
|
182
|
-
afterEach(() => {
|
|
183
|
-
clock.restore();
|
|
184
|
-
});
|
|
185
|
-
|
|
186
|
-
const startStatsAnalyzer = async (mediaStatus) => {
|
|
187
|
-
statsAnalyzer.updateMediaStatus(mediaStatus);
|
|
188
|
-
statsAnalyzer.startAnalyzer(pc);
|
|
189
|
-
|
|
190
|
-
await testUtils.flushPromises();
|
|
191
|
-
};
|
|
192
|
-
|
|
193
|
-
const progressTime = async () => {
|
|
194
|
-
await clock.tickAsync(initialConfig.analyzerInterval);
|
|
195
|
-
await testUtils.flushPromises();
|
|
196
|
-
};
|
|
197
|
-
|
|
198
|
-
const checkReceivedEvent = ({expected}) => {
|
|
199
|
-
// check that we got the REMOTE_MEDIA_STARTED event for audio
|
|
200
|
-
assert.deepEqual(receivedEventsData.local.started, expected.local?.started);
|
|
201
|
-
assert.deepEqual(receivedEventsData.local.stopped, expected.local?.stopped);
|
|
202
|
-
assert.deepEqual(receivedEventsData.remote.started, expected.remote?.started);
|
|
203
|
-
assert.deepEqual(receivedEventsData.remote.stopped, expected.remote?.stopped);
|
|
204
|
-
};
|
|
205
|
-
|
|
206
|
-
it('emits LOCAL_MEDIA_STARTED and LOCAL_MEDIA_STOPPED events for audio', async () => {
|
|
207
|
-
await startStatsAnalyzer({expected: {sendAudio: true}});
|
|
208
|
-
|
|
209
|
-
// check that we haven't received any events yet
|
|
210
|
-
checkReceivedEvent({expected: {}});
|
|
211
|
-
|
|
212
|
-
// setup a mock to return some values higher the previous ones
|
|
213
|
-
fakeStats.audio.sender.packetsSent += 10;
|
|
214
|
-
|
|
215
|
-
await progressTime();
|
|
216
|
-
|
|
217
|
-
// check that we got the LOCAL_MEDIA_STARTED event for audio
|
|
218
|
-
checkReceivedEvent({expected: {local: {started: {type: 'audio'}}}});
|
|
219
|
-
|
|
220
|
-
// now advance the clock and the mock still returns same values, so only "stopped" event should be triggered
|
|
221
|
-
resetReceivedEvents();
|
|
222
|
-
await progressTime();
|
|
223
|
-
checkReceivedEvent({expected: {local: {stopped: {type: 'audio'}}}});
|
|
224
|
-
});
|
|
225
|
-
|
|
226
|
-
it('emits LOCAL_MEDIA_STARTED and LOCAL_MEDIA_STOPPED events for video', async () => {
|
|
227
|
-
await startStatsAnalyzer({expected: {sendVideo: true}});
|
|
228
|
-
|
|
229
|
-
// check that we haven't received any events yet
|
|
230
|
-
checkReceivedEvent({expected: {}});
|
|
231
|
-
|
|
232
|
-
// setup a mock to return some values higher the previous ones
|
|
233
|
-
fakeStats.video.sender.framesSent += 1;
|
|
234
|
-
|
|
235
|
-
await progressTime();
|
|
236
|
-
|
|
237
|
-
// check that we got the LOCAL_MEDIA_STARTED event for audio
|
|
238
|
-
checkReceivedEvent({expected: {local: {started: {type: 'video'}}}});
|
|
239
|
-
|
|
240
|
-
// now advance the clock and the mock still returns same values, so only "stopped" event should be triggered
|
|
241
|
-
resetReceivedEvents();
|
|
242
|
-
await progressTime();
|
|
243
|
-
checkReceivedEvent({expected: {local: {stopped: {type: 'video'}}}});
|
|
244
|
-
});
|
|
245
|
-
|
|
246
|
-
it('emits REMOTE_MEDIA_STARTED and REMOTE_MEDIA_STOPPED events for audio', async () => {
|
|
247
|
-
await startStatsAnalyzer({expected: {receiveAudio: true}});
|
|
248
|
-
|
|
249
|
-
// check that we haven't received any events yet
|
|
250
|
-
checkReceivedEvent({expected: {}});
|
|
251
|
-
|
|
252
|
-
// setup a mock to return some values higher the previous ones
|
|
253
|
-
fakeStats.audio.receiver.packetsReceived += 5;
|
|
254
|
-
|
|
255
|
-
await progressTime();
|
|
256
|
-
// check that we got the REMOTE_MEDIA_STARTED event for audio
|
|
257
|
-
checkReceivedEvent({expected: {remote: {started: {type: 'audio'}}}});
|
|
258
|
-
|
|
259
|
-
// now advance the clock and the mock still returns same values, so only "stopped" event should be triggered
|
|
260
|
-
resetReceivedEvents();
|
|
261
|
-
await progressTime();
|
|
262
|
-
|
|
263
|
-
checkReceivedEvent({expected: {remote: {stopped: {type: 'audio'}}}});
|
|
264
|
-
});
|
|
265
|
-
|
|
266
|
-
it('emits REMOTE_MEDIA_STARTED and REMOTE_MEDIA_STOPPED events for video', async () => {
|
|
267
|
-
await startStatsAnalyzer({expected: {receiveVideo: true}});
|
|
268
|
-
|
|
269
|
-
// check that we haven't received any events yet
|
|
270
|
-
checkReceivedEvent({expected: {}});
|
|
271
|
-
|
|
272
|
-
// setup a mock to return some values higher the previous ones
|
|
273
|
-
fakeStats.video.receiver.framesDecoded += 1;
|
|
274
|
-
|
|
275
|
-
await progressTime();
|
|
276
|
-
// check that we got the REMOTE_MEDIA_STARTED event for video
|
|
277
|
-
checkReceivedEvent({expected: {remote: {started: {type: 'video'}}}});
|
|
278
|
-
|
|
279
|
-
// now advance the clock and the mock still returns same values, so only "stopped" event should be triggered
|
|
280
|
-
resetReceivedEvents();
|
|
281
|
-
await progressTime();
|
|
282
|
-
|
|
283
|
-
checkReceivedEvent({expected: {remote: {stopped: {type: 'video'}}}});
|
|
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
|
+
|
|
86
|
+
let receivedEventsData = {
|
|
87
|
+
local: {},
|
|
88
|
+
remote: {},
|
|
89
|
+
};
|
|
90
|
+
|
|
91
|
+
const initialConfig = {
|
|
92
|
+
analyzerInterval: 1000,
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
let fakeStats;
|
|
96
|
+
|
|
97
|
+
const resetReceivedEvents = () => {
|
|
98
|
+
receivedEventsData = {
|
|
99
|
+
local: {},
|
|
100
|
+
remote: {},
|
|
101
|
+
};
|
|
102
|
+
};
|
|
103
|
+
|
|
104
|
+
beforeEach(() => {
|
|
105
|
+
clock = sinon.useFakeTimers();
|
|
106
|
+
|
|
107
|
+
resetReceivedEvents();
|
|
108
|
+
|
|
109
|
+
// bytesReceived and bytesSent need to be non-zero in order for StatsAnalyzer to parse any other values
|
|
110
|
+
fakeStats = {
|
|
111
|
+
audio: {
|
|
112
|
+
receiver: {
|
|
113
|
+
type: 'inbound-rtp',
|
|
114
|
+
packetsReceived: 0,
|
|
115
|
+
bytesReceived: 1,
|
|
116
|
+
},
|
|
117
|
+
sender: {
|
|
118
|
+
type: 'outbound-rtp',
|
|
119
|
+
packetsSent: 0,
|
|
120
|
+
bytesSent: 1,
|
|
121
|
+
},
|
|
122
|
+
},
|
|
123
|
+
video: {
|
|
124
|
+
receiver: {
|
|
125
|
+
type: 'inbound-rtp',
|
|
126
|
+
framesDecoded: 0,
|
|
127
|
+
bytesReceived: 1,
|
|
128
|
+
},
|
|
129
|
+
sender: {
|
|
130
|
+
type: 'outbound-rtp',
|
|
131
|
+
framesSent: 0,
|
|
132
|
+
bytesSent: 1,
|
|
133
|
+
},
|
|
134
|
+
},
|
|
135
|
+
};
|
|
136
|
+
|
|
137
|
+
pc = {
|
|
138
|
+
audioTransceiver: {
|
|
139
|
+
sender: {
|
|
140
|
+
getStats: sinon.stub().resolves([fakeStats.audio.sender]),
|
|
141
|
+
},
|
|
142
|
+
receiver: {
|
|
143
|
+
getStats: sinon.stub().resolves([fakeStats.audio.receiver]),
|
|
144
|
+
},
|
|
145
|
+
},
|
|
146
|
+
videoTransceiver: {
|
|
147
|
+
sender: {
|
|
148
|
+
getStats: sinon.stub().resolves([fakeStats.video.sender]),
|
|
149
|
+
},
|
|
150
|
+
receiver: {
|
|
151
|
+
getStats: sinon.stub().resolves([fakeStats.video.receiver]),
|
|
152
|
+
},
|
|
153
|
+
},
|
|
154
|
+
shareTransceiver: {
|
|
155
|
+
sender: {
|
|
156
|
+
getStats: sinon.stub().resolves([]),
|
|
157
|
+
},
|
|
158
|
+
receiver: {
|
|
159
|
+
getStats: sinon.stub().resolves([]),
|
|
160
|
+
},
|
|
161
|
+
},
|
|
162
|
+
};
|
|
163
|
+
|
|
164
|
+
networkQualityMonitor = new NetworkQualityMonitor(initialConfig);
|
|
165
|
+
|
|
166
|
+
statsAnalyzer = new StatsAnalyzer(initialConfig, networkQualityMonitor);
|
|
167
|
+
|
|
168
|
+
statsAnalyzer.on(EVENTS.LOCAL_MEDIA_STARTED, (data) => {
|
|
169
|
+
receivedEventsData.local.started = data;
|
|
170
|
+
});
|
|
171
|
+
statsAnalyzer.on(EVENTS.LOCAL_MEDIA_STOPPED, (data) => {
|
|
172
|
+
receivedEventsData.local.stopped = data;
|
|
173
|
+
});
|
|
174
|
+
statsAnalyzer.on(EVENTS.REMOTE_MEDIA_STARTED, (data) => {
|
|
175
|
+
receivedEventsData.remote.started = data;
|
|
176
|
+
});
|
|
177
|
+
statsAnalyzer.on(EVENTS.REMOTE_MEDIA_STOPPED, (data) => {
|
|
178
|
+
receivedEventsData.remote.stopped = data;
|
|
179
|
+
});
|
|
180
|
+
});
|
|
181
|
+
|
|
182
|
+
afterEach(() => {
|
|
183
|
+
clock.restore();
|
|
184
|
+
});
|
|
185
|
+
|
|
186
|
+
const startStatsAnalyzer = async (mediaStatus) => {
|
|
187
|
+
statsAnalyzer.updateMediaStatus(mediaStatus);
|
|
188
|
+
statsAnalyzer.startAnalyzer(pc);
|
|
189
|
+
|
|
190
|
+
await testUtils.flushPromises();
|
|
191
|
+
};
|
|
192
|
+
|
|
193
|
+
const progressTime = async () => {
|
|
194
|
+
await clock.tickAsync(initialConfig.analyzerInterval);
|
|
195
|
+
await testUtils.flushPromises();
|
|
196
|
+
};
|
|
197
|
+
|
|
198
|
+
const checkReceivedEvent = ({expected}) => {
|
|
199
|
+
// check that we got the REMOTE_MEDIA_STARTED event for audio
|
|
200
|
+
assert.deepEqual(receivedEventsData.local.started, expected.local?.started);
|
|
201
|
+
assert.deepEqual(receivedEventsData.local.stopped, expected.local?.stopped);
|
|
202
|
+
assert.deepEqual(receivedEventsData.remote.started, expected.remote?.started);
|
|
203
|
+
assert.deepEqual(receivedEventsData.remote.stopped, expected.remote?.stopped);
|
|
204
|
+
};
|
|
205
|
+
|
|
206
|
+
it('emits LOCAL_MEDIA_STARTED and LOCAL_MEDIA_STOPPED events for audio', async () => {
|
|
207
|
+
await startStatsAnalyzer({expected: {sendAudio: true}});
|
|
208
|
+
|
|
209
|
+
// check that we haven't received any events yet
|
|
210
|
+
checkReceivedEvent({expected: {}});
|
|
211
|
+
|
|
212
|
+
// setup a mock to return some values higher the previous ones
|
|
213
|
+
fakeStats.audio.sender.packetsSent += 10;
|
|
214
|
+
|
|
215
|
+
await progressTime();
|
|
216
|
+
|
|
217
|
+
// check that we got the LOCAL_MEDIA_STARTED event for audio
|
|
218
|
+
checkReceivedEvent({expected: {local: {started: {type: 'audio'}}}});
|
|
219
|
+
|
|
220
|
+
// now advance the clock and the mock still returns same values, so only "stopped" event should be triggered
|
|
221
|
+
resetReceivedEvents();
|
|
222
|
+
await progressTime();
|
|
223
|
+
checkReceivedEvent({expected: {local: {stopped: {type: 'audio'}}}});
|
|
224
|
+
});
|
|
225
|
+
|
|
226
|
+
it('emits LOCAL_MEDIA_STARTED and LOCAL_MEDIA_STOPPED events for video', async () => {
|
|
227
|
+
await startStatsAnalyzer({expected: {sendVideo: true}});
|
|
228
|
+
|
|
229
|
+
// check that we haven't received any events yet
|
|
230
|
+
checkReceivedEvent({expected: {}});
|
|
231
|
+
|
|
232
|
+
// setup a mock to return some values higher the previous ones
|
|
233
|
+
fakeStats.video.sender.framesSent += 1;
|
|
234
|
+
|
|
235
|
+
await progressTime();
|
|
236
|
+
|
|
237
|
+
// check that we got the LOCAL_MEDIA_STARTED event for audio
|
|
238
|
+
checkReceivedEvent({expected: {local: {started: {type: 'video'}}}});
|
|
239
|
+
|
|
240
|
+
// now advance the clock and the mock still returns same values, so only "stopped" event should be triggered
|
|
241
|
+
resetReceivedEvents();
|
|
242
|
+
await progressTime();
|
|
243
|
+
checkReceivedEvent({expected: {local: {stopped: {type: 'video'}}}});
|
|
244
|
+
});
|
|
245
|
+
|
|
246
|
+
it('emits REMOTE_MEDIA_STARTED and REMOTE_MEDIA_STOPPED events for audio', async () => {
|
|
247
|
+
await startStatsAnalyzer({expected: {receiveAudio: true}});
|
|
248
|
+
|
|
249
|
+
// check that we haven't received any events yet
|
|
250
|
+
checkReceivedEvent({expected: {}});
|
|
251
|
+
|
|
252
|
+
// setup a mock to return some values higher the previous ones
|
|
253
|
+
fakeStats.audio.receiver.packetsReceived += 5;
|
|
254
|
+
|
|
255
|
+
await progressTime();
|
|
256
|
+
// check that we got the REMOTE_MEDIA_STARTED event for audio
|
|
257
|
+
checkReceivedEvent({expected: {remote: {started: {type: 'audio'}}}});
|
|
258
|
+
|
|
259
|
+
// now advance the clock and the mock still returns same values, so only "stopped" event should be triggered
|
|
260
|
+
resetReceivedEvents();
|
|
261
|
+
await progressTime();
|
|
262
|
+
|
|
263
|
+
checkReceivedEvent({expected: {remote: {stopped: {type: 'audio'}}}});
|
|
264
|
+
});
|
|
265
|
+
|
|
266
|
+
it('emits REMOTE_MEDIA_STARTED and REMOTE_MEDIA_STOPPED events for video', async () => {
|
|
267
|
+
await startStatsAnalyzer({expected: {receiveVideo: true}});
|
|
268
|
+
|
|
269
|
+
// check that we haven't received any events yet
|
|
270
|
+
checkReceivedEvent({expected: {}});
|
|
271
|
+
|
|
272
|
+
// setup a mock to return some values higher the previous ones
|
|
273
|
+
fakeStats.video.receiver.framesDecoded += 1;
|
|
274
|
+
|
|
275
|
+
await progressTime();
|
|
276
|
+
// check that we got the REMOTE_MEDIA_STARTED event for video
|
|
277
|
+
checkReceivedEvent({expected: {remote: {started: {type: 'video'}}}});
|
|
278
|
+
|
|
279
|
+
// now advance the clock and the mock still returns same values, so only "stopped" event should be triggered
|
|
280
|
+
resetReceivedEvents();
|
|
281
|
+
await progressTime();
|
|
282
|
+
|
|
283
|
+
checkReceivedEvent({expected: {remote: {stopped: {type: 'video'}}}});
|
|
284
|
+
});
|
|
285
|
+
});
|
|
286
|
+
});
|
|
287
|
+
});
|