@webex/plugin-meetings 2.60.0-next.9 → 2.60.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/README.md +8 -46
- package/dist/common/browser-detection.js +3 -2
- package/dist/common/browser-detection.js.map +1 -1
- package/dist/common/collection.js +4 -3
- package/dist/common/collection.js.map +1 -1
- package/dist/common/config.js +2 -1
- package/dist/common/config.js.map +1 -1
- package/dist/common/errors/captcha-error.js +2 -1
- package/dist/common/errors/captcha-error.js.map +1 -1
- package/dist/common/errors/intent-to-join.js +2 -1
- package/dist/common/errors/intent-to-join.js.map +1 -1
- package/dist/common/errors/join-meeting.js +2 -1
- package/dist/common/errors/join-meeting.js.map +1 -1
- package/dist/common/errors/media.js +2 -1
- package/dist/common/errors/media.js.map +1 -1
- package/dist/common/errors/parameter.js +4 -3
- package/dist/common/errors/parameter.js.map +1 -1
- package/dist/common/errors/password-error.js +2 -1
- package/dist/common/errors/password-error.js.map +1 -1
- package/dist/common/errors/permission.js +2 -1
- package/dist/common/errors/permission.js.map +1 -1
- package/dist/common/errors/{reclaim-host-role-errors.js → reclaim-host-role-error.js} +11 -7
- package/dist/common/errors/reclaim-host-role-error.js.map +1 -0
- package/dist/common/errors/reconnection-in-progress.js +2 -1
- package/dist/common/errors/reconnection-in-progress.js.map +1 -1
- package/dist/common/errors/reconnection.js +2 -1
- package/dist/common/errors/reconnection.js.map +1 -1
- package/dist/common/errors/stats.js +2 -1
- package/dist/common/errors/stats.js.map +1 -1
- package/dist/common/errors/webex-errors.d.ts +8 -20
- package/dist/common/errors/webex-errors.js +28 -48
- package/dist/common/errors/webex-errors.js.map +1 -1
- package/dist/common/errors/webex-meetings-error.js +2 -1
- package/dist/common/errors/webex-meetings-error.js.map +1 -1
- package/dist/common/events/events-scope.js +2 -1
- package/dist/common/events/events-scope.js.map +1 -1
- package/dist/common/events/events.js +2 -1
- package/dist/common/events/events.js.map +1 -1
- package/dist/common/events/trigger-proxy.js +2 -1
- package/dist/common/events/trigger-proxy.js.map +1 -1
- package/dist/common/events/util.js +2 -1
- package/dist/common/events/util.js.map +1 -1
- package/dist/common/logs/logger-config.js +2 -1
- package/dist/common/logs/logger-config.js.map +1 -1
- package/dist/common/logs/logger-proxy.js +3 -2
- package/dist/common/logs/logger-proxy.js.map +1 -1
- package/dist/common/logs/request.d.ts +1 -3
- package/dist/common/logs/request.js +5 -8
- package/dist/common/logs/request.js.map +1 -1
- package/dist/common/queue.d.ts +7 -9
- package/dist/common/queue.js +9 -22
- package/dist/common/queue.js.map +1 -1
- package/dist/config.d.ts +7 -5
- package/dist/config.js +11 -8
- package/dist/config.js.map +1 -1
- package/dist/constants.d.ts +97 -217
- package/dist/constants.js +441 -416
- package/dist/constants.js.map +1 -1
- package/dist/controls-options-manager/constants.js +6 -3
- package/dist/controls-options-manager/constants.js.map +1 -1
- package/dist/controls-options-manager/enums.d.ts +1 -11
- package/dist/controls-options-manager/enums.js +6 -15
- package/dist/controls-options-manager/enums.js.map +1 -1
- package/dist/controls-options-manager/index.d.ts +1 -17
- package/dist/controls-options-manager/index.js +38 -127
- package/dist/controls-options-manager/index.js.map +1 -1
- package/dist/controls-options-manager/util.d.ts +7 -1
- package/dist/controls-options-manager/util.js +19 -309
- package/dist/controls-options-manager/util.js.map +1 -1
- package/dist/index.d.ts +3 -6
- package/dist/index.js +4 -116
- package/dist/index.js.map +1 -1
- package/dist/locus-info/controlsUtils.js +11 -100
- package/dist/locus-info/controlsUtils.js.map +1 -1
- package/dist/locus-info/embeddedAppsUtils.js +4 -3
- package/dist/locus-info/embeddedAppsUtils.js.map +1 -1
- package/dist/locus-info/fullState.js +2 -1
- package/dist/locus-info/fullState.js.map +1 -1
- package/dist/locus-info/hostUtils.js +2 -1
- package/dist/locus-info/hostUtils.js.map +1 -1
- package/dist/locus-info/index.d.ts +4 -57
- package/dist/locus-info/index.js +84 -425
- package/dist/locus-info/index.js.map +1 -1
- package/dist/locus-info/infoUtils.js +5 -13
- package/dist/locus-info/infoUtils.js.map +1 -1
- package/dist/locus-info/mediaSharesUtils.js +3 -58
- package/dist/locus-info/mediaSharesUtils.js.map +1 -1
- package/dist/locus-info/parser.d.ts +6 -66
- package/dist/locus-info/parser.js +80 -253
- package/dist/locus-info/parser.js.map +1 -1
- package/dist/locus-info/selfUtils.js +13 -97
- package/dist/locus-info/selfUtils.js.map +1 -1
- package/dist/media/index.d.ts +0 -2
- package/dist/media/index.js +319 -107
- package/dist/media/index.js.map +1 -1
- package/dist/media/properties.d.ts +53 -38
- package/dist/media/properties.js +153 -96
- package/dist/media/properties.js.map +1 -1
- package/dist/media/util.js +22 -1
- package/dist/media/util.js.map +1 -1
- package/dist/mediaQualityMetrics/config.d.ts +230 -234
- package/dist/mediaQualityMetrics/config.js +498 -302
- package/dist/mediaQualityMetrics/config.js.map +1 -1
- package/dist/meeting/effectsState.d.ts +42 -0
- package/dist/meeting/effectsState.js +260 -0
- package/dist/meeting/effectsState.js.map +1 -0
- package/dist/meeting/in-meeting-actions.d.ts +0 -88
- package/dist/meeting/in-meeting-actions.js +3 -94
- package/dist/meeting/in-meeting-actions.js.map +1 -1
- package/dist/meeting/index.d.ts +494 -591
- package/dist/meeting/index.js +2969 -4707
- package/dist/meeting/index.js.map +1 -1
- package/dist/meeting/muteState.d.ts +25 -93
- package/dist/meeting/muteState.js +133 -224
- package/dist/meeting/muteState.js.map +1 -1
- package/dist/meeting/request.d.ts +47 -82
- package/dist/meeting/request.js +199 -297
- package/dist/meeting/request.js.map +1 -1
- package/dist/meeting/state.js +2 -1
- package/dist/meeting/state.js.map +1 -1
- package/dist/meeting/util.d.ts +1 -102
- package/dist/meeting/util.js +435 -605
- package/dist/meeting/util.js.map +1 -1
- package/dist/meeting-info/collection.js +4 -3
- package/dist/meeting-info/collection.js.map +1 -1
- package/dist/meeting-info/index.d.ts +1 -13
- package/dist/meeting-info/index.js +7 -74
- package/dist/meeting-info/index.js.map +1 -1
- package/dist/meeting-info/meeting-info-v2.d.ts +1 -31
- package/dist/meeting-info/meeting-info-v2.js +63 -200
- package/dist/meeting-info/meeting-info-v2.js.map +1 -1
- package/dist/meeting-info/request.js +2 -1
- package/dist/meeting-info/request.js.map +1 -1
- package/dist/meeting-info/util.js +3 -2
- package/dist/meeting-info/util.js.map +1 -1
- package/dist/meeting-info/utilv2.js +41 -39
- package/dist/meeting-info/utilv2.js.map +1 -1
- package/dist/meetings/collection.d.ts +0 -17
- package/dist/meetings/collection.js +4 -42
- package/dist/meetings/collection.js.map +1 -1
- package/dist/meetings/index.d.ts +21 -103
- package/dist/meetings/index.js +124 -486
- package/dist/meetings/index.js.map +1 -1
- package/dist/meetings/request.js +3 -4
- package/dist/meetings/request.js.map +1 -1
- package/dist/meetings/util.js +6 -107
- package/dist/meetings/util.js.map +1 -1
- package/dist/member/index.d.ts +1 -13
- package/dist/member/index.js +2 -45
- package/dist/member/index.js.map +1 -1
- package/dist/member/member.types.js +4 -3
- package/dist/member/member.types.js.map +1 -1
- package/dist/member/util.js +29 -120
- package/dist/member/util.js.map +1 -1
- package/dist/members/collection.d.ts +0 -5
- package/dist/members/collection.js +2 -11
- package/dist/members/collection.js.map +1 -1
- package/dist/members/index.d.ts +11 -56
- package/dist/members/index.js +47 -174
- package/dist/members/index.js.map +1 -1
- package/dist/members/request.d.ts +11 -67
- package/dist/members/request.js +54 -102
- package/dist/members/request.js.map +1 -1
- package/dist/members/types.js +4 -3
- package/dist/members/types.js.map +1 -1
- package/dist/members/util.d.ts +1 -214
- package/dist/members/util.js +284 -327
- package/dist/members/util.js.map +1 -1
- package/dist/metrics/config.d.ts +169 -0
- package/dist/metrics/config.js +289 -0
- package/dist/metrics/config.js.map +1 -0
- package/dist/metrics/constants.d.ts +6 -15
- package/dist/metrics/constants.js +9 -17
- package/dist/metrics/constants.js.map +1 -1
- package/dist/metrics/index.d.ts +111 -4
- package/dist/metrics/index.js +452 -4
- package/dist/metrics/index.js.map +1 -1
- package/dist/networkQualityMonitor/index.js +4 -5
- package/dist/networkQualityMonitor/index.js.map +1 -1
- package/dist/peer-connection-manager/index.d.ts +6 -0
- package/dist/peer-connection-manager/index.js +671 -0
- package/dist/peer-connection-manager/index.js.map +1 -0
- package/dist/peer-connection-manager/util.d.ts +6 -0
- package/dist/peer-connection-manager/util.js +110 -0
- package/dist/peer-connection-manager/util.js.map +1 -0
- package/dist/personal-meeting-room/index.js +3 -2
- package/dist/personal-meeting-room/index.js.map +1 -1
- package/dist/personal-meeting-room/request.js +3 -2
- package/dist/personal-meeting-room/request.js.map +1 -1
- package/dist/personal-meeting-room/util.js +2 -1
- package/dist/personal-meeting-room/util.js.map +1 -1
- package/dist/reachability/index.d.ts +7 -62
- package/dist/reachability/index.js +72 -265
- package/dist/reachability/index.js.map +1 -1
- package/dist/reachability/request.d.ts +3 -7
- package/dist/reachability/request.js +10 -18
- package/dist/reachability/request.js.map +1 -1
- package/dist/reactions/reactions.d.ts +2 -2
- package/dist/reactions/reactions.js +6 -4
- package/dist/reactions/reactions.js.map +1 -1
- package/dist/reactions/reactions.type.d.ts +3 -23
- package/dist/reactions/reactions.type.js +23 -21
- package/dist/reactions/reactions.type.js.map +1 -1
- package/dist/reconnection-manager/index.d.ts +8 -32
- package/dist/reconnection-manager/index.js +231 -282
- package/dist/reconnection-manager/index.js.map +1 -1
- package/dist/recording-controller/enums.js +5 -4
- package/dist/recording-controller/enums.js.map +1 -1
- package/dist/recording-controller/index.d.ts +1 -15
- package/dist/recording-controller/index.js +46 -57
- package/dist/recording-controller/index.js.map +1 -1
- package/dist/recording-controller/util.d.ts +4 -5
- package/dist/recording-controller/util.js +10 -10
- package/dist/recording-controller/util.js.map +1 -1
- package/dist/roap/collection.d.ts +10 -0
- package/dist/roap/collection.js +63 -0
- package/dist/roap/collection.js.map +1 -0
- package/dist/roap/handler.d.ts +47 -0
- package/dist/roap/handler.js +279 -0
- package/dist/roap/handler.js.map +1 -0
- package/dist/roap/index.d.ts +47 -9
- package/dist/roap/index.js +235 -101
- package/dist/roap/index.js.map +1 -1
- package/dist/roap/request.d.ts +12 -18
- package/dist/roap/request.js +180 -126
- package/dist/roap/request.js.map +1 -1
- package/dist/roap/state.d.ts +9 -0
- package/dist/roap/state.js +127 -0
- package/dist/roap/state.js.map +1 -0
- package/dist/roap/turnDiscovery.d.ts +16 -27
- package/dist/roap/turnDiscovery.js +105 -115
- package/dist/roap/turnDiscovery.js.map +1 -1
- package/dist/roap/util.d.ts +2 -0
- package/dist/roap/util.js +76 -0
- package/dist/roap/util.js.map +1 -0
- package/dist/statsAnalyzer/global.d.ts +83 -1
- package/dist/statsAnalyzer/global.js +85 -2
- package/dist/statsAnalyzer/global.js.map +1 -1
- package/dist/statsAnalyzer/index.d.ts +30 -28
- package/dist/statsAnalyzer/index.js +509 -374
- package/dist/statsAnalyzer/index.js.map +1 -1
- package/dist/statsAnalyzer/mqaUtil.d.ts +6 -8
- package/dist/statsAnalyzer/mqaUtil.js +83 -116
- package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
- package/dist/transcription/index.js +2 -1
- package/dist/transcription/index.js.map +1 -1
- package/package.json +26 -35
- package/src/common/errors/webex-errors.ts +12 -36
- package/src/common/logs/logger-proxy.ts +1 -1
- package/src/common/logs/request.ts +1 -5
- package/src/common/queue.ts +8 -22
- package/src/config.ts +7 -5
- package/src/constants.ts +97 -244
- package/src/controls-options-manager/enums.ts +0 -12
- package/src/controls-options-manager/index.ts +21 -116
- package/src/controls-options-manager/util.ts +14 -294
- package/src/index.js +15 -0
- package/src/locus-info/controlsUtils.ts +0 -110
- package/src/locus-info/index.ts +61 -449
- package/src/locus-info/infoUtils.ts +2 -14
- package/src/locus-info/mediaSharesUtils.ts +0 -64
- package/src/locus-info/parser.ts +47 -258
- package/src/locus-info/selfUtils.ts +2 -85
- package/src/media/index.ts +370 -153
- package/src/media/properties.ts +136 -106
- package/src/media/util.ts +21 -0
- package/src/mediaQualityMetrics/config.ts +377 -244
- package/src/meeting/effectsState.ts +209 -0
- package/src/meeting/in-meeting-actions.ts +0 -176
- package/src/meeting/index.ts +2482 -3929
- package/src/meeting/muteState.ts +138 -224
- package/src/meeting/request.ts +127 -207
- package/src/meeting/util.ts +423 -590
- package/src/meeting-info/index.ts +8 -81
- package/src/meeting-info/meeting-info-v2.ts +13 -163
- package/src/meeting-info/util.ts +1 -1
- package/src/meeting-info/utilv2.ts +28 -28
- package/src/meetings/collection.ts +0 -33
- package/src/meetings/index.ts +126 -486
- package/src/meetings/request.ts +0 -2
- package/src/meetings/util.ts +5 -116
- package/src/member/index.ts +1 -43
- package/src/member/util.ts +28 -125
- package/src/members/collection.ts +0 -8
- package/src/members/index.ts +52 -187
- package/src/members/request.ts +27 -87
- package/src/members/util.ts +291 -332
- package/src/metrics/config.ts +485 -0
- package/src/metrics/constants.ts +6 -15
- package/src/metrics/index.ts +471 -1
- package/src/networkQualityMonitor/index.ts +6 -6
- package/src/peer-connection-manager/index.ts +847 -0
- package/src/peer-connection-manager/util.ts +119 -0
- package/src/reachability/index.ts +45 -238
- package/src/reachability/request.ts +8 -17
- package/src/reactions/reactions.ts +4 -4
- package/src/reactions/reactions.type.ts +4 -30
- package/src/reconnection-manager/index.ts +156 -168
- package/src/recording-controller/index.ts +3 -20
- package/src/recording-controller/util.ts +9 -26
- package/src/roap/collection.ts +62 -0
- package/src/roap/handler.ts +294 -0
- package/src/roap/index.ts +241 -98
- package/src/roap/request.ts +148 -74
- package/src/roap/state.ts +156 -0
- package/src/roap/turnDiscovery.ts +56 -62
- package/src/roap/util.ts +100 -0
- package/src/statsAnalyzer/global.ts +84 -1
- package/src/statsAnalyzer/index.ts +642 -413
- package/src/statsAnalyzer/mqaUtil.ts +114 -111
- package/test/integration/spec/journey.js +264 -320
- package/test/integration/spec/space-meeting.js +4 -77
- package/test/unit/spec/common/queue.js +2 -31
- package/test/unit/spec/controls-options-manager/index.js +0 -163
- package/test/unit/spec/controls-options-manager/util.js +60 -576
- package/test/unit/spec/fixture/locus.js +0 -1
- package/test/unit/spec/locus-info/controlsUtils.js +30 -323
- package/test/unit/spec/locus-info/index.js +15 -1389
- package/test/unit/spec/locus-info/infoUtils.js +16 -54
- package/test/unit/spec/locus-info/lib/SeqCmp.json +0 -16
- package/test/unit/spec/locus-info/lib/selfConstant.js +0 -48
- package/test/unit/spec/locus-info/parser.js +35 -116
- package/test/unit/spec/locus-info/selfUtils.js +0 -275
- package/test/unit/spec/media/properties.ts +84 -75
- package/test/unit/spec/meeting/effectsState.js +281 -0
- package/test/unit/spec/meeting/in-meeting-actions.ts +0 -86
- package/test/unit/spec/meeting/index.js +3136 -8547
- package/test/unit/spec/meeting/muteState.js +213 -409
- package/test/unit/spec/meeting/request.js +42 -512
- package/test/unit/spec/meeting/utils.js +24 -741
- package/test/unit/spec/meeting-info/meetinginfov2.js +5 -527
- package/test/unit/spec/meeting-info/utilv2.js +0 -21
- package/test/unit/spec/meetings/collection.js +0 -26
- package/test/unit/spec/meetings/index.js +211 -1278
- package/test/unit/spec/meetings/utils.js +2 -202
- package/test/unit/spec/member/index.js +9 -32
- package/test/unit/spec/member/util.js +61 -499
- package/test/unit/spec/members/index.js +5 -394
- package/test/unit/spec/members/request.js +27 -206
- package/test/unit/spec/members/utils.js +38 -173
- package/test/unit/spec/metrics/index.js +50 -1
- package/test/unit/spec/networkQualityMonitor/index.js +4 -4
- package/test/unit/spec/peerconnection-manager/index.js +218 -0
- package/test/unit/spec/peerconnection-manager/utils.js +49 -0
- package/test/unit/spec/peerconnection-manager/utils.test-fixtures.ts +388 -0
- package/test/unit/spec/reachability/index.ts +24 -598
- package/test/unit/spec/reconnection-manager/index.js +24 -162
- package/test/unit/spec/recording-controller/index.js +218 -293
- package/test/unit/spec/recording-controller/util.js +96 -223
- package/test/unit/spec/roap/index.ts +76 -200
- package/test/unit/spec/roap/turnDiscovery.ts +48 -86
- package/test/unit/spec/roap/util.js +30 -0
- package/test/unit/spec/stats-analyzer/index.js +174 -188
- package/test/utils/testUtils.js +45 -0
- package/test/utils/webex-config.js +0 -4
- package/test/utils/webex-test-users.js +3 -7
- package/dist/annotation/annotation.types.d.ts +0 -42
- package/dist/annotation/annotation.types.js +0 -7
- package/dist/annotation/annotation.types.js.map +0 -1
- package/dist/annotation/constants.d.ts +0 -31
- package/dist/annotation/constants.js +0 -41
- package/dist/annotation/constants.js.map +0 -1
- package/dist/annotation/index.d.ts +0 -117
- package/dist/annotation/index.js +0 -357
- package/dist/annotation/index.js.map +0 -1
- package/dist/breakouts/breakout.d.ts +0 -8
- package/dist/breakouts/breakout.js +0 -215
- package/dist/breakouts/breakout.js.map +0 -1
- package/dist/breakouts/collection.d.ts +0 -5
- package/dist/breakouts/collection.js +0 -22
- package/dist/breakouts/collection.js.map +0 -1
- package/dist/breakouts/edit-lock-error.d.ts +0 -15
- package/dist/breakouts/edit-lock-error.js +0 -51
- package/dist/breakouts/edit-lock-error.js.map +0 -1
- package/dist/breakouts/events.d.ts +0 -8
- package/dist/breakouts/events.js +0 -44
- package/dist/breakouts/events.js.map +0 -1
- package/dist/breakouts/index.d.ts +0 -5
- package/dist/breakouts/index.js +0 -1047
- package/dist/breakouts/index.js.map +0 -1
- package/dist/breakouts/request.d.ts +0 -22
- package/dist/breakouts/request.js +0 -77
- package/dist/breakouts/request.js.map +0 -1
- package/dist/breakouts/utils.d.ts +0 -15
- package/dist/breakouts/utils.js +0 -64
- package/dist/breakouts/utils.js.map +0 -1
- package/dist/common/errors/no-meeting-info.d.ts +0 -14
- package/dist/common/errors/no-meeting-info.js +0 -50
- package/dist/common/errors/no-meeting-info.js.map +0 -1
- package/dist/common/errors/reclaim-host-role-errors.js.map +0 -1
- package/dist/controls-options-manager/types.d.ts +0 -43
- package/dist/controls-options-manager/types.js +0 -7
- package/dist/controls-options-manager/types.js.map +0 -1
- package/dist/interpretation/collection.d.ts +0 -5
- package/dist/interpretation/collection.js +0 -22
- package/dist/interpretation/collection.js.map +0 -1
- package/dist/interpretation/index.d.ts +0 -5
- package/dist/interpretation/index.js +0 -365
- package/dist/interpretation/index.js.map +0 -1
- package/dist/interpretation/siLanguage.d.ts +0 -5
- package/dist/interpretation/siLanguage.js +0 -24
- package/dist/interpretation/siLanguage.js.map +0 -1
- package/dist/meeting/locusMediaRequest.d.ts +0 -74
- package/dist/meeting/locusMediaRequest.js +0 -291
- package/dist/meeting/locusMediaRequest.js.map +0 -1
- package/dist/meeting/request.type.d.ts +0 -11
- package/dist/meeting/request.type.js +0 -7
- package/dist/meeting/request.type.js.map +0 -1
- package/dist/meetings/meetings.types.d.ts +0 -4
- package/dist/meetings/meetings.types.js +0 -7
- package/dist/meetings/meetings.types.js.map +0 -1
- package/dist/member/types.d.ts +0 -32
- package/dist/member/types.js +0 -23
- package/dist/member/types.js.map +0 -1
- package/dist/multistream/mediaRequestManager.d.ts +0 -118
- package/dist/multistream/mediaRequestManager.js +0 -344
- package/dist/multistream/mediaRequestManager.js.map +0 -1
- package/dist/multistream/receiveSlot.d.ts +0 -68
- package/dist/multistream/receiveSlot.js +0 -200
- package/dist/multistream/receiveSlot.js.map +0 -1
- package/dist/multistream/receiveSlotManager.d.ts +0 -56
- package/dist/multistream/receiveSlotManager.js +0 -174
- package/dist/multistream/receiveSlotManager.js.map +0 -1
- package/dist/multistream/remoteMedia.d.ts +0 -72
- package/dist/multistream/remoteMedia.js +0 -268
- package/dist/multistream/remoteMedia.js.map +0 -1
- package/dist/multistream/remoteMediaGroup.d.ts +0 -47
- package/dist/multistream/remoteMediaGroup.js +0 -267
- package/dist/multistream/remoteMediaGroup.js.map +0 -1
- package/dist/multistream/remoteMediaManager.d.ts +0 -285
- package/dist/multistream/remoteMediaManager.js +0 -1211
- package/dist/multistream/remoteMediaManager.js.map +0 -1
- package/dist/multistream/sendSlotManager.d.ts +0 -61
- package/dist/multistream/sendSlotManager.js +0 -236
- package/dist/multistream/sendSlotManager.js.map +0 -1
- package/dist/reactions/constants.d.ts +0 -3
- package/dist/reactions/constants.js +0 -12
- package/dist/reactions/constants.js.map +0 -1
- package/dist/rtcMetrics/constants.d.ts +0 -4
- package/dist/rtcMetrics/constants.js +0 -11
- package/dist/rtcMetrics/constants.js.map +0 -1
- package/dist/rtcMetrics/index.d.ts +0 -54
- package/dist/rtcMetrics/index.js +0 -140
- package/dist/rtcMetrics/index.js.map +0 -1
- package/dist/webinar/collection.d.ts +0 -16
- package/dist/webinar/collection.js +0 -43
- package/dist/webinar/collection.js.map +0 -1
- package/dist/webinar/index.d.ts +0 -5
- package/dist/webinar/index.js +0 -68
- package/dist/webinar/index.js.map +0 -1
- package/src/annotation/annotation.types.ts +0 -50
- package/src/annotation/constants.ts +0 -36
- package/src/annotation/index.ts +0 -328
- package/src/breakouts/README.md +0 -220
- package/src/breakouts/breakout.ts +0 -188
- package/src/breakouts/collection.ts +0 -19
- package/src/breakouts/edit-lock-error.ts +0 -25
- package/src/breakouts/events.ts +0 -56
- package/src/breakouts/index.ts +0 -925
- package/src/breakouts/request.ts +0 -55
- package/src/breakouts/utils.ts +0 -57
- package/src/common/errors/no-meeting-info.ts +0 -24
- package/src/controls-options-manager/types.ts +0 -59
- package/src/index.ts +0 -40
- package/src/interpretation/README.md +0 -60
- package/src/interpretation/collection.ts +0 -19
- package/src/interpretation/index.ts +0 -332
- package/src/interpretation/siLanguage.ts +0 -18
- package/src/meeting/locusMediaRequest.ts +0 -313
- package/src/meeting/request.type.ts +0 -13
- package/src/meetings/meetings.types.ts +0 -12
- package/src/member/types.ts +0 -38
- package/src/multistream/mediaRequestManager.ts +0 -440
- package/src/multistream/receiveSlot.ts +0 -184
- package/src/multistream/receiveSlotManager.ts +0 -166
- package/src/multistream/remoteMedia.ts +0 -254
- package/src/multistream/remoteMediaGroup.ts +0 -284
- package/src/multistream/remoteMediaManager.ts +0 -1145
- package/src/multistream/sendSlotManager.ts +0 -170
- package/src/reactions/constants.ts +0 -4
- package/src/rtcMetrics/constants.ts +0 -3
- package/src/rtcMetrics/index.ts +0 -124
- package/src/webinar/collection.ts +0 -31
- package/src/webinar/index.ts +0 -62
- package/test/integration/spec/converged-space-meetings.js +0 -233
- package/test/unit/spec/annotation/index.ts +0 -418
- package/test/unit/spec/breakouts/breakout.ts +0 -237
- package/test/unit/spec/breakouts/collection.ts +0 -15
- package/test/unit/spec/breakouts/edit-lock-error.ts +0 -30
- package/test/unit/spec/breakouts/events.ts +0 -89
- package/test/unit/spec/breakouts/index.ts +0 -1790
- package/test/unit/spec/breakouts/request.ts +0 -104
- package/test/unit/spec/breakouts/utils.js +0 -72
- package/test/unit/spec/interpretation/collection.ts +0 -15
- package/test/unit/spec/interpretation/index.ts +0 -589
- package/test/unit/spec/interpretation/siLanguage.ts +0 -28
- package/test/unit/spec/locus-info/mediaSharesUtils.ts +0 -32
- package/test/unit/spec/media/index.ts +0 -290
- package/test/unit/spec/meeting/locusMediaRequest.ts +0 -442
- package/test/unit/spec/meeting-info/index.js +0 -300
- package/test/unit/spec/multistream/mediaRequestManager.ts +0 -1418
- package/test/unit/spec/multistream/receiveSlot.ts +0 -163
- package/test/unit/spec/multistream/receiveSlotManager.ts +0 -203
- package/test/unit/spec/multistream/remoteMedia.ts +0 -255
- package/test/unit/spec/multistream/remoteMediaGroup.ts +0 -662
- package/test/unit/spec/multistream/remoteMediaManager.ts +0 -1924
- package/test/unit/spec/multistream/sendSlotManager.ts +0 -242
- package/test/unit/spec/reachability/request.js +0 -68
- package/test/unit/spec/roap/request.ts +0 -232
- package/test/unit/spec/rtcMetrics/index.ts +0 -93
- package/test/unit/spec/webinar/collection.ts +0 -13
- package/test/unit/spec/webinar/index.ts +0 -60
- package/test/utils/constants.js +0 -9
- package/test/utils/integrationTestUtils.js +0 -46
- /package/dist/common/errors/{reclaim-host-role-errors.d.ts → reclaim-host-role-error.d.ts} +0 -0
- /package/src/common/errors/{reclaim-host-role-errors.ts → reclaim-host-role-error.ts} +0 -0
|
@@ -3,10 +3,6 @@
|
|
|
3
3
|
*/
|
|
4
4
|
import 'jsdom-global/register';
|
|
5
5
|
|
|
6
|
-
// Polyfill for crypto: https://github.com/jsdom/jsdom/issues/1612#issuecomment-663210638
|
|
7
|
-
import {Crypto} from '@peculiar/webcrypto';
|
|
8
|
-
global.crypto = new Crypto();
|
|
9
|
-
|
|
10
6
|
import Device from '@webex/internal-plugin-device';
|
|
11
7
|
import Mercury from '@webex/internal-plugin-mercury';
|
|
12
8
|
import {assert} from '@webex/test-helper-chai';
|
|
@@ -15,8 +11,8 @@ import sinon from 'sinon';
|
|
|
15
11
|
import uuid from 'uuid';
|
|
16
12
|
import StaticConfig from '@webex/plugin-meetings/src/common/config';
|
|
17
13
|
import TriggerProxy from '@webex/plugin-meetings/src/common/events/trigger-proxy';
|
|
18
|
-
import LoggerProxy from '@webex/plugin-meetings/src/common/logs/logger-proxy';
|
|
19
14
|
import LoggerConfig from '@webex/plugin-meetings/src/common/logs/logger-config';
|
|
15
|
+
import MediaUtil from '@webex/plugin-meetings/src/media/util';
|
|
20
16
|
import Meeting from '@webex/plugin-meetings/src/meeting';
|
|
21
17
|
import MeetingUtil from '@webex/plugin-meetings/src/meeting/util';
|
|
22
18
|
import Meetings from '@webex/plugin-meetings/src/meetings';
|
|
@@ -24,7 +20,6 @@ import MeetingCollection from '@webex/plugin-meetings/src/meetings/collection';
|
|
|
24
20
|
import MeetingsUtil from '@webex/plugin-meetings/src/meetings/util';
|
|
25
21
|
import PersonalMeetingRoom from '@webex/plugin-meetings/src/personal-meeting-room';
|
|
26
22
|
import Reachability from '@webex/plugin-meetings/src/reachability';
|
|
27
|
-
import Metrics from '@webex/plugin-meetings/src/metrics';
|
|
28
23
|
|
|
29
24
|
import testUtils from '../../../utils/testUtils';
|
|
30
25
|
import {
|
|
@@ -35,12 +30,6 @@ import {
|
|
|
35
30
|
LOCUSINFO,
|
|
36
31
|
EVENT_TRIGGERS,
|
|
37
32
|
} from '../../../../src/constants';
|
|
38
|
-
import CaptchaError from '@webex/plugin-meetings/src/common/errors/captcha-error';
|
|
39
|
-
import {forEach} from 'lodash';
|
|
40
|
-
import PasswordError from '@webex/plugin-meetings/src/common/errors/password-error';
|
|
41
|
-
import PermissionError from '@webex/plugin-meetings/src/common/errors/permission';
|
|
42
|
-
import {NoiseReductionEffect, VirtualBackgroundEffect} from '@webex/media-helpers';
|
|
43
|
-
import NoMeetingInfoError from '../../../../src/common/errors/no-meeting-info';
|
|
44
33
|
|
|
45
34
|
describe('plugin-meetings', () => {
|
|
46
35
|
const logger = {
|
|
@@ -52,8 +41,6 @@ describe('plugin-meetings', () => {
|
|
|
52
41
|
debug: () => {},
|
|
53
42
|
};
|
|
54
43
|
|
|
55
|
-
let triggerProxyStub;
|
|
56
|
-
|
|
57
44
|
beforeEach(() => {
|
|
58
45
|
StaticConfig.set({
|
|
59
46
|
bandwidth: {
|
|
@@ -65,7 +52,7 @@ describe('plugin-meetings', () => {
|
|
|
65
52
|
verboseEvents: true,
|
|
66
53
|
enable: false,
|
|
67
54
|
});
|
|
68
|
-
|
|
55
|
+
TriggerProxy.trigger = sinon.stub().returns(true);
|
|
69
56
|
});
|
|
70
57
|
|
|
71
58
|
let webex;
|
|
@@ -74,20 +61,15 @@ describe('plugin-meetings', () => {
|
|
|
74
61
|
let url1;
|
|
75
62
|
let test1;
|
|
76
63
|
let test2;
|
|
77
|
-
let locusInfo;
|
|
78
64
|
|
|
79
65
|
describe('meetings index', () => {
|
|
80
66
|
beforeEach(() => {
|
|
81
67
|
MeetingsUtil.checkH264Support = sinon.stub();
|
|
82
|
-
|
|
68
|
+
uuid1 = uuid.v4();
|
|
83
69
|
url1 = `https://example.com/${uuid.v4()}`;
|
|
84
70
|
uri1 = `test-${uuid.v4()}@example.com`;
|
|
85
71
|
test1 = `test-${uuid.v4()}`;
|
|
86
72
|
test2 = `test2-${uuid.v4()}`;
|
|
87
|
-
locusInfo = {
|
|
88
|
-
parse: sinon.stub().returns(true),
|
|
89
|
-
updateMainSessionLocusCache: sinon.stub(),
|
|
90
|
-
};
|
|
91
73
|
webex = new MockWebex({
|
|
92
74
|
children: {
|
|
93
75
|
device: Device,
|
|
@@ -126,7 +108,6 @@ describe('plugin-meetings', () => {
|
|
|
126
108
|
});
|
|
127
109
|
|
|
128
110
|
Object.assign(webex.internal, {
|
|
129
|
-
llm: {on: sinon.stub()},
|
|
130
111
|
device: {
|
|
131
112
|
deviceType: 'FAKE_DEVICE',
|
|
132
113
|
register: sinon.stub().returns(Promise.resolve()),
|
|
@@ -170,10 +151,6 @@ describe('plugin-meetings', () => {
|
|
|
170
151
|
webex.emit('ready');
|
|
171
152
|
});
|
|
172
153
|
|
|
173
|
-
afterEach(() => {
|
|
174
|
-
sinon.restore();
|
|
175
|
-
});
|
|
176
|
-
|
|
177
154
|
it('has a webex instance with a meetings property', () => {
|
|
178
155
|
assert.exists(webex, 'webex was initialized with children');
|
|
179
156
|
assert.exists(webex.meetings, 'meetings child was set up on the webex instance');
|
|
@@ -240,6 +217,34 @@ describe('plugin-meetings', () => {
|
|
|
240
217
|
});
|
|
241
218
|
});
|
|
242
219
|
|
|
220
|
+
describe('#_toggleTurnDiscovery', () => {
|
|
221
|
+
it('should have toggleAdhocMeetings', () => {
|
|
222
|
+
assert.equal(typeof webex.meetings._toggleTurnDiscovery, 'function');
|
|
223
|
+
});
|
|
224
|
+
|
|
225
|
+
describe('success', () => {
|
|
226
|
+
it('should update meetings to do TURN discovery', () => {
|
|
227
|
+
webex.meetings._toggleTurnDiscovery(true);
|
|
228
|
+
assert.equal(webex.meetings.config.experimental.enableTurnDiscovery, true);
|
|
229
|
+
|
|
230
|
+
webex.meetings._toggleTurnDiscovery(false);
|
|
231
|
+
assert.equal(webex.meetings.config.experimental.enableTurnDiscovery, false);
|
|
232
|
+
});
|
|
233
|
+
});
|
|
234
|
+
|
|
235
|
+
describe('failure', () => {
|
|
236
|
+
it('should not accept non boolean input', () => {
|
|
237
|
+
const currentEnableTurnDiscovery = webex.meetings.config.experimental.enableTurnDiscovery;
|
|
238
|
+
|
|
239
|
+
webex.meetings._toggleTurnDiscovery('test');
|
|
240
|
+
assert.equal(
|
|
241
|
+
webex.meetings.config.experimental.enableAdhocMeetings,
|
|
242
|
+
currentEnableTurnDiscovery
|
|
243
|
+
);
|
|
244
|
+
});
|
|
245
|
+
});
|
|
246
|
+
});
|
|
247
|
+
|
|
243
248
|
describe('Public API Contracts', () => {
|
|
244
249
|
describe('#register', () => {
|
|
245
250
|
it('emits an event and resolves when register succeeds', async () => {
|
|
@@ -333,110 +338,37 @@ describe('plugin-meetings', () => {
|
|
|
333
338
|
});
|
|
334
339
|
});
|
|
335
340
|
|
|
336
|
-
describe('virtual background effect', () => {
|
|
337
|
-
beforeEach(() => {
|
|
338
|
-
webex.credentials = {
|
|
339
|
-
supertoken: {
|
|
340
|
-
access_token: 'fake_token',
|
|
341
|
-
},
|
|
342
|
-
};
|
|
343
|
-
});
|
|
344
|
-
|
|
345
|
-
it('creates background effect', async () => {
|
|
346
|
-
const result = await webex.meetings.createVirtualBackgroundEffect();
|
|
347
|
-
|
|
348
|
-
assert.exists(result);
|
|
349
|
-
assert.instanceOf(result, VirtualBackgroundEffect);
|
|
350
|
-
assert.containsAllKeys(result, ['loadModel', 'isEnabled', 'options']);
|
|
351
|
-
assert.deepEqual(result.options, {
|
|
352
|
-
mode: 'BLUR',
|
|
353
|
-
blurStrength: 'STRONG',
|
|
354
|
-
generator: 'worker',
|
|
355
|
-
quality: 'LOW',
|
|
356
|
-
authToken: 'fake_token',
|
|
357
|
-
mirror: false,
|
|
358
|
-
});
|
|
359
|
-
assert.exists(result.enable);
|
|
360
|
-
assert.exists(result.disable);
|
|
361
|
-
assert.exists(result.dispose);
|
|
362
|
-
});
|
|
363
|
-
|
|
364
|
-
it('creates background effect with custom options passed', async () => {
|
|
365
|
-
const effectOptions = {
|
|
366
|
-
generator: 'local',
|
|
367
|
-
frameRate: 45,
|
|
368
|
-
mode: 'IMAGE',
|
|
369
|
-
mirror: false,
|
|
370
|
-
quality: 'HIGH',
|
|
371
|
-
blurStrength: 'STRONG',
|
|
372
|
-
bgImageUrl: 'https://test.webex.com/landscape.5a535788.jpg',
|
|
373
|
-
};
|
|
374
|
-
|
|
375
|
-
const result = await webex.meetings.createVirtualBackgroundEffect(effectOptions);
|
|
376
|
-
|
|
377
|
-
assert.exists(result);
|
|
378
|
-
assert.instanceOf(result, VirtualBackgroundEffect);
|
|
379
|
-
assert.containsAllKeys(result, ['loadModel', 'isEnabled', 'options']);
|
|
380
|
-
assert.deepEqual(result.options, {...effectOptions, authToken: 'fake_token'});
|
|
381
|
-
assert.exists(result.enable);
|
|
382
|
-
assert.exists(result.disable);
|
|
383
|
-
assert.exists(result.dispose);
|
|
384
|
-
});
|
|
385
|
-
});
|
|
386
|
-
|
|
387
|
-
describe('noise reduction effect', () => {
|
|
388
|
-
beforeEach(() => {
|
|
389
|
-
webex.credentials = {
|
|
390
|
-
supertoken: {
|
|
391
|
-
access_token: 'fake_token',
|
|
392
|
-
},
|
|
393
|
-
};
|
|
394
|
-
});
|
|
395
|
-
|
|
396
|
-
it('creates noise reduction effect', async () => {
|
|
397
|
-
const result = await webex.meetings.createNoiseReductionEffect({audioContext: {}});
|
|
398
|
-
|
|
399
|
-
assert.exists(result);
|
|
400
|
-
assert.instanceOf(result, NoiseReductionEffect);
|
|
401
|
-
assert.containsAllKeys(result, ['audioContext', 'isEnabled', 'isReady', 'options']);
|
|
402
|
-
assert.deepEqual(result.options, {
|
|
403
|
-
authToken: 'fake_token',
|
|
404
|
-
audioContext: {},
|
|
405
|
-
});
|
|
406
|
-
assert.exists(result.enable);
|
|
407
|
-
assert.exists(result.disable);
|
|
408
|
-
assert.exists(result.dispose);
|
|
409
|
-
});
|
|
410
|
-
|
|
411
|
-
it('creates noise reduction effect with custom options passed', async () => {
|
|
412
|
-
const effectOptions = {
|
|
413
|
-
audioContext: {},
|
|
414
|
-
mode: 'WORKLET',
|
|
415
|
-
env: 'prod',
|
|
416
|
-
};
|
|
417
|
-
|
|
418
|
-
const result = await webex.meetings.createNoiseReductionEffect(effectOptions);
|
|
419
|
-
|
|
420
|
-
assert.exists(result);
|
|
421
|
-
assert.instanceOf(result, NoiseReductionEffect);
|
|
422
|
-
assert.containsAllKeys(result, ['audioContext', 'isEnabled', 'isReady', 'options']);
|
|
423
|
-
assert.deepEqual(result.options, {...effectOptions, authToken: 'fake_token'});
|
|
424
|
-
assert.exists(result.enable);
|
|
425
|
-
assert.exists(result.disable);
|
|
426
|
-
assert.exists(result.dispose);
|
|
427
|
-
});
|
|
428
|
-
});
|
|
429
|
-
|
|
430
341
|
describe('gets', () => {
|
|
431
342
|
describe('#getReachability', () => {
|
|
432
343
|
it('should have #getReachability', () => {
|
|
433
344
|
assert.exists(webex.meetings.getReachability);
|
|
434
345
|
});
|
|
435
|
-
|
|
436
|
-
|
|
346
|
+
describe('before #setReachability', () => {
|
|
347
|
+
it('does not get a reachability instance', () => {
|
|
348
|
+
const reachability = webex.meetings.getReachability();
|
|
349
|
+
|
|
350
|
+
assert.notExists(
|
|
351
|
+
reachability,
|
|
352
|
+
'reachability is undefined because #setReachability has not been called'
|
|
353
|
+
);
|
|
354
|
+
});
|
|
355
|
+
});
|
|
356
|
+
describe('after #setReachability', () => {
|
|
357
|
+
beforeEach(() => {
|
|
358
|
+
webex.meetings.setReachability();
|
|
359
|
+
const reachabilityMocker = webex.meetings.getReachability();
|
|
360
|
+
|
|
361
|
+
sinon.stub(reachabilityMocker, 'gatherReachability').returns(true);
|
|
362
|
+
});
|
|
363
|
+
it('gets the reachability data instance from webex.meetings', () => {
|
|
364
|
+
const reachability = webex.meetings.getReachability();
|
|
437
365
|
|
|
438
|
-
|
|
439
|
-
|
|
366
|
+
assert.exists(
|
|
367
|
+
reachability,
|
|
368
|
+
'reachability is defined because #setReachability has been called'
|
|
369
|
+
);
|
|
370
|
+
assert.instanceOf(reachability, Reachability, 'should be a reachability instance');
|
|
371
|
+
});
|
|
440
372
|
});
|
|
441
373
|
});
|
|
442
374
|
describe('#getPersonalMeetingRoom', () => {
|
|
@@ -511,16 +443,21 @@ describe('plugin-meetings', () => {
|
|
|
511
443
|
);
|
|
512
444
|
});
|
|
513
445
|
describe('when meeting is returned', () => {
|
|
446
|
+
let parse;
|
|
447
|
+
|
|
514
448
|
beforeEach(() => {
|
|
449
|
+
parse = sinon.stub().returns(true);
|
|
515
450
|
webex.meetings.meetingCollection.getByKey = sinon.stub().returns({
|
|
516
|
-
locusInfo
|
|
451
|
+
locusInfo: {
|
|
452
|
+
parse,
|
|
453
|
+
},
|
|
517
454
|
});
|
|
518
455
|
});
|
|
519
456
|
it('tests the sync meeting calls for existing meeting', async () => {
|
|
520
457
|
await webex.meetings.syncMeetings();
|
|
521
458
|
assert.calledOnce(webex.meetings.request.getActiveMeetings);
|
|
522
459
|
assert.calledOnce(webex.meetings.meetingCollection.getByKey);
|
|
523
|
-
assert.calledOnce(
|
|
460
|
+
assert.calledOnce(parse);
|
|
524
461
|
assert.calledWith(webex.meetings.meetingCollection.getByKey, 'locusUrl', url1);
|
|
525
462
|
});
|
|
526
463
|
});
|
|
@@ -533,7 +470,6 @@ describe('plugin-meetings', () => {
|
|
|
533
470
|
webex.meetings.create = sinon.stub().returns(
|
|
534
471
|
Promise.resolve({
|
|
535
472
|
locusInfo: {
|
|
536
|
-
...locusInfo,
|
|
537
473
|
initialSetup,
|
|
538
474
|
},
|
|
539
475
|
})
|
|
@@ -542,7 +478,7 @@ describe('plugin-meetings', () => {
|
|
|
542
478
|
it('tests the sync meeting calls for not existing meeting', async () => {
|
|
543
479
|
await webex.meetings.syncMeetings();
|
|
544
480
|
assert.calledOnce(webex.meetings.request.getActiveMeetings);
|
|
545
|
-
assert.callCount(webex.meetings.meetingCollection.getByKey,
|
|
481
|
+
assert.callCount(webex.meetings.meetingCollection.getByKey, 4);
|
|
546
482
|
assert.calledOnce(initialSetup);
|
|
547
483
|
assert.calledOnce(webex.meetings.create);
|
|
548
484
|
assert.calledWith(webex.meetings.request.getActiveMeetings);
|
|
@@ -566,9 +502,12 @@ describe('plugin-meetings', () => {
|
|
|
566
502
|
|
|
567
503
|
beforeEach(() => {
|
|
568
504
|
destroySpy = sinon.spy(webex.meetings, 'destroy');
|
|
505
|
+
parse = sinon.stub().returns(true);
|
|
569
506
|
initialSetup = sinon.stub().returns(true);
|
|
570
507
|
webex.meetings.meetingCollection.getByKey = sinon.stub().returns({
|
|
571
|
-
locusInfo
|
|
508
|
+
locusInfo: {
|
|
509
|
+
parse,
|
|
510
|
+
},
|
|
572
511
|
sendCallAnalyzerMetrics: sinon.stub(),
|
|
573
512
|
});
|
|
574
513
|
webex.meetings.meetingCollection.getAll = sinon.stub().returns({
|
|
@@ -635,104 +574,14 @@ describe('plugin-meetings', () => {
|
|
|
635
574
|
});
|
|
636
575
|
});
|
|
637
576
|
|
|
638
|
-
const FAKE_USE_RANDOM_DELAY = true;
|
|
639
|
-
const correlationId = 'my-correlationId';
|
|
640
|
-
const callStateForMetrics = {
|
|
641
|
-
correlationId: 'my-correlationId2',
|
|
642
|
-
joinTrigger: 'my-join-trigger',
|
|
643
|
-
loginType: 'my-login-type',
|
|
644
|
-
};
|
|
645
|
-
|
|
646
|
-
it('should call setCallStateForMetrics on any pre-existing meeting', async () => {
|
|
647
|
-
const fakeMeeting = {setCallStateForMetrics: sinon.mock()};
|
|
648
|
-
webex.meetings.meetingCollection.getByKey = sinon.stub().returns(fakeMeeting);
|
|
649
|
-
await webex.meetings.create(
|
|
650
|
-
test1,
|
|
651
|
-
test2,
|
|
652
|
-
FAKE_USE_RANDOM_DELAY,
|
|
653
|
-
{},
|
|
654
|
-
correlationId,
|
|
655
|
-
true,
|
|
656
|
-
callStateForMetrics
|
|
657
|
-
);
|
|
658
|
-
assert.calledOnceWithExactly(fakeMeeting.setCallStateForMetrics, {
|
|
659
|
-
...callStateForMetrics,
|
|
660
|
-
correlationId,
|
|
661
|
-
});
|
|
662
|
-
});
|
|
663
|
-
|
|
664
|
-
const checkCallCreateMeeting = async (createParameters, createMeetingParameters) => {
|
|
665
|
-
const create = webex.meetings.create(...createParameters);
|
|
666
|
-
|
|
667
|
-
assert.exists(create.then);
|
|
668
|
-
await create;
|
|
669
|
-
assert.calledOnce(webex.meetings.createMeeting);
|
|
670
|
-
assert.calledWith(webex.meetings.createMeeting, ...createMeetingParameters);
|
|
671
|
-
};
|
|
672
|
-
|
|
673
577
|
it('calls createMeeting and returns its promise', async () => {
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
[test1, test2, FAKE_USE_RANDOM_DELAY, {}, {correlationId}, true]
|
|
677
|
-
);
|
|
678
|
-
});
|
|
679
|
-
|
|
680
|
-
it('calls createMeeting when failOnMissingMeetinginfo is undefined and returns its promise', async () => {
|
|
681
|
-
await checkCallCreateMeeting(
|
|
682
|
-
[test1, test2, FAKE_USE_RANDOM_DELAY, {}, correlationId, undefined],
|
|
683
|
-
[test1, test2, FAKE_USE_RANDOM_DELAY, {}, {correlationId}, false]
|
|
684
|
-
);
|
|
685
|
-
});
|
|
686
|
-
|
|
687
|
-
it('calls createMeeting when failOnMissingMeetinginfo is false and returns its promise', async () => {
|
|
688
|
-
await checkCallCreateMeeting(
|
|
689
|
-
[test1, test2, FAKE_USE_RANDOM_DELAY, {}, correlationId, false],
|
|
690
|
-
[test1, test2, FAKE_USE_RANDOM_DELAY, {}, {correlationId}, false]
|
|
691
|
-
);
|
|
692
|
-
});
|
|
693
|
-
|
|
694
|
-
it('calls createMeeting with callStateForMetrics and returns its promise', async () => {
|
|
695
|
-
await checkCallCreateMeeting(
|
|
696
|
-
[test1, test2, FAKE_USE_RANDOM_DELAY, {}, undefined, true, callStateForMetrics],
|
|
697
|
-
[test1, test2, FAKE_USE_RANDOM_DELAY, {}, callStateForMetrics, true]
|
|
698
|
-
);
|
|
699
|
-
});
|
|
700
|
-
|
|
701
|
-
it('calls createMeeting with callStateForMetrics overwritten with correlationId and returns its promise', async () => {
|
|
702
|
-
await checkCallCreateMeeting(
|
|
703
|
-
[test1, test2, FAKE_USE_RANDOM_DELAY, {}, correlationId, true, callStateForMetrics],
|
|
704
|
-
[test1, test2, FAKE_USE_RANDOM_DELAY, {}, {...callStateForMetrics, correlationId}, true]
|
|
705
|
-
);
|
|
706
|
-
});
|
|
707
|
-
|
|
708
|
-
it('calls createMeeting with extra info params and returns its promise', async () => {
|
|
709
|
-
const FAKE_USE_RANDOM_DELAY = false;
|
|
710
|
-
const correlationId = 'my-correlationId';
|
|
711
|
-
|
|
712
|
-
const FAKE_INFO_EXTRA_PARAMS = {
|
|
713
|
-
mtid: 'm9fe0afd8c435e892afcce9ea25b97046',
|
|
714
|
-
joinTXId: 'TSmrX61wNF',
|
|
715
|
-
};
|
|
716
|
-
const create = webex.meetings.create(
|
|
717
|
-
test1,
|
|
718
|
-
test2,
|
|
719
|
-
FAKE_USE_RANDOM_DELAY,
|
|
720
|
-
FAKE_INFO_EXTRA_PARAMS,
|
|
721
|
-
correlationId
|
|
722
|
-
);
|
|
578
|
+
const FAKE_USE_RANDOM_DELAY = true;
|
|
579
|
+
const create = webex.meetings.create(test1, test2, FAKE_USE_RANDOM_DELAY);
|
|
723
580
|
|
|
724
581
|
assert.exists(create.then);
|
|
725
582
|
await create;
|
|
726
583
|
assert.calledOnce(webex.meetings.createMeeting);
|
|
727
|
-
assert.calledWith(
|
|
728
|
-
webex.meetings.createMeeting,
|
|
729
|
-
test1,
|
|
730
|
-
test2,
|
|
731
|
-
FAKE_USE_RANDOM_DELAY,
|
|
732
|
-
FAKE_INFO_EXTRA_PARAMS,
|
|
733
|
-
{correlationId},
|
|
734
|
-
false
|
|
735
|
-
);
|
|
584
|
+
assert.calledWith(webex.meetings.createMeeting, test1, test2, FAKE_USE_RANDOM_DELAY);
|
|
736
585
|
});
|
|
737
586
|
|
|
738
587
|
it('creates a new meeting when a scheduled meeting exists in the conversation', async () => {
|
|
@@ -828,51 +677,45 @@ describe('plugin-meetings', () => {
|
|
|
828
677
|
});
|
|
829
678
|
describe('#handleLocusEvent', () => {
|
|
830
679
|
describe('there was a meeting', () => {
|
|
680
|
+
let parse;
|
|
681
|
+
|
|
831
682
|
beforeEach(() => {
|
|
683
|
+
parse = sinon.stub().returns(true);
|
|
832
684
|
webex.meetings.meetingCollection.getByKey = sinon.stub().returns({
|
|
833
|
-
locusInfo
|
|
685
|
+
locusInfo: {
|
|
686
|
+
parse,
|
|
687
|
+
},
|
|
834
688
|
});
|
|
835
689
|
});
|
|
836
|
-
it('should parse the meeting info
|
|
837
|
-
sinon.stub(MeetingsUtil, 'isBreakoutLocusDTO').returns(false);
|
|
690
|
+
it('should parse the meeting info', () => {
|
|
838
691
|
webex.meetings.handleLocusEvent({
|
|
839
692
|
locusUrl: url1,
|
|
840
693
|
});
|
|
841
694
|
assert.calledOnce(webex.meetings.meetingCollection.getByKey);
|
|
842
695
|
assert.calledWith(webex.meetings.meetingCollection.getByKey, 'locusUrl', url1);
|
|
843
|
-
assert.calledOnce(
|
|
844
|
-
assert.calledOnce(locusInfo.updateMainSessionLocusCache);
|
|
696
|
+
assert.calledOnce(parse);
|
|
845
697
|
assert.calledWith(
|
|
846
|
-
|
|
698
|
+
parse,
|
|
847
699
|
{
|
|
848
|
-
locusInfo
|
|
700
|
+
locusInfo: {
|
|
701
|
+
parse,
|
|
702
|
+
},
|
|
849
703
|
},
|
|
850
704
|
{
|
|
851
705
|
locusUrl: url1,
|
|
852
706
|
}
|
|
853
707
|
);
|
|
854
708
|
});
|
|
855
|
-
|
|
856
|
-
it('should not update main session locus cache', () => {
|
|
857
|
-
sinon.stub(MeetingsUtil, 'isBreakoutLocusDTO').returns(true);
|
|
858
|
-
webex.meetings.handleLocusEvent({
|
|
859
|
-
locusUrl: url1,
|
|
860
|
-
});
|
|
861
|
-
assert.notCalled(locusInfo.updateMainSessionLocusCache);
|
|
862
|
-
});
|
|
863
709
|
});
|
|
864
710
|
describe('there was not a meeting', () => {
|
|
865
711
|
let initialSetup;
|
|
866
|
-
const webExMeetingId = '123456';
|
|
867
712
|
|
|
868
713
|
beforeEach(() => {
|
|
869
714
|
initialSetup = sinon.stub().returns(true);
|
|
870
715
|
webex.meetings.meetingCollection.getByKey = sinon.stub().returns(undefined);
|
|
871
716
|
webex.meetings.create = sinon.stub().returns(
|
|
872
717
|
Promise.resolve({
|
|
873
|
-
id: 'meeting-id',
|
|
874
718
|
locusInfo: {
|
|
875
|
-
...locusInfo,
|
|
876
719
|
initialSetup,
|
|
877
720
|
},
|
|
878
721
|
})
|
|
@@ -892,20 +735,12 @@ describe('plugin-meetings', () => {
|
|
|
892
735
|
callbackAddress: uri1,
|
|
893
736
|
},
|
|
894
737
|
},
|
|
895
|
-
info: {
|
|
896
|
-
webExMeetingId,
|
|
897
|
-
},
|
|
898
738
|
},
|
|
899
739
|
eventType: 'locus.difference',
|
|
900
740
|
locusUrl: url1,
|
|
901
741
|
});
|
|
902
|
-
assert.callCount(webex.meetings.meetingCollection.getByKey,
|
|
742
|
+
assert.callCount(webex.meetings.meetingCollection.getByKey, 5);
|
|
903
743
|
assert.calledWith(webex.meetings.meetingCollection.getByKey, 'locusUrl', url1);
|
|
904
|
-
assert.calledWith(
|
|
905
|
-
webex.meetings.meetingCollection.getByKey,
|
|
906
|
-
'meetingNumber',
|
|
907
|
-
webExMeetingId
|
|
908
|
-
);
|
|
909
744
|
assert.calledOnce(initialSetup);
|
|
910
745
|
assert.calledWith(initialSetup, {
|
|
911
746
|
id: uuid1,
|
|
@@ -919,9 +754,6 @@ describe('plugin-meetings', () => {
|
|
|
919
754
|
callbackAddress: uri1,
|
|
920
755
|
},
|
|
921
756
|
},
|
|
922
|
-
info: {
|
|
923
|
-
webExMeetingId,
|
|
924
|
-
},
|
|
925
757
|
});
|
|
926
758
|
});
|
|
927
759
|
it('should setup the meeting by difference event without replaces', async () => {
|
|
@@ -933,20 +765,12 @@ describe('plugin-meetings', () => {
|
|
|
933
765
|
callbackAddress: uri1,
|
|
934
766
|
},
|
|
935
767
|
},
|
|
936
|
-
info: {
|
|
937
|
-
webExMeetingId,
|
|
938
|
-
},
|
|
939
768
|
},
|
|
940
769
|
eventType: 'locus.difference',
|
|
941
770
|
locusUrl: url1,
|
|
942
771
|
});
|
|
943
|
-
assert.callCount(webex.meetings.meetingCollection.getByKey,
|
|
772
|
+
assert.callCount(webex.meetings.meetingCollection.getByKey, 4);
|
|
944
773
|
assert.calledWith(webex.meetings.meetingCollection.getByKey, 'locusUrl', url1);
|
|
945
|
-
assert.calledWith(
|
|
946
|
-
webex.meetings.meetingCollection.getByKey,
|
|
947
|
-
'meetingNumber',
|
|
948
|
-
webExMeetingId
|
|
949
|
-
);
|
|
950
774
|
assert.calledOnce(initialSetup);
|
|
951
775
|
assert.calledWith(initialSetup, {
|
|
952
776
|
id: uuid1,
|
|
@@ -955,44 +779,8 @@ describe('plugin-meetings', () => {
|
|
|
955
779
|
callbackAddress: uri1,
|
|
956
780
|
},
|
|
957
781
|
},
|
|
958
|
-
info: {
|
|
959
|
-
webExMeetingId,
|
|
960
|
-
},
|
|
961
|
-
});
|
|
962
|
-
});
|
|
963
|
-
|
|
964
|
-
it('sends client event correctly on finally', async () => {
|
|
965
|
-
webex.meetings.getMeetingByType = sinon.stub().returns(true);
|
|
966
|
-
|
|
967
|
-
await webex.meetings.handleLocusEvent({
|
|
968
|
-
locus: {
|
|
969
|
-
id: uuid1,
|
|
970
|
-
self: {
|
|
971
|
-
callBackInfo: {
|
|
972
|
-
callbackAddress: uri1,
|
|
973
|
-
},
|
|
974
|
-
},
|
|
975
|
-
info: {
|
|
976
|
-
webExMeetingId,
|
|
977
|
-
},
|
|
978
|
-
},
|
|
979
|
-
eventType: 'locus.difference',
|
|
980
|
-
locusUrl: url1,
|
|
981
|
-
});
|
|
982
|
-
|
|
983
|
-
await testUtils.flushPromises();
|
|
984
|
-
|
|
985
|
-
assert.calledWith(webex.internal.newMetrics.submitClientEvent, {
|
|
986
|
-
name: 'client.call.remote-started',
|
|
987
|
-
payload: {
|
|
988
|
-
trigger: 'mercury-event',
|
|
989
|
-
},
|
|
990
|
-
options: {
|
|
991
|
-
meetingId: 'meeting-id',
|
|
992
|
-
},
|
|
993
782
|
});
|
|
994
783
|
});
|
|
995
|
-
|
|
996
784
|
it('should setup the meeting by a not difference event', async () => {
|
|
997
785
|
await webex.meetings.handleLocusEvent({
|
|
998
786
|
locus: {
|
|
@@ -1002,20 +790,12 @@ describe('plugin-meetings', () => {
|
|
|
1002
790
|
callbackAddress: uri1,
|
|
1003
791
|
},
|
|
1004
792
|
},
|
|
1005
|
-
info: {
|
|
1006
|
-
webExMeetingId,
|
|
1007
|
-
},
|
|
1008
793
|
},
|
|
1009
794
|
eventType: test1,
|
|
1010
795
|
locusUrl: url1,
|
|
1011
796
|
});
|
|
1012
|
-
assert.callCount(webex.meetings.meetingCollection.getByKey,
|
|
797
|
+
assert.callCount(webex.meetings.meetingCollection.getByKey, 4);
|
|
1013
798
|
assert.calledWith(webex.meetings.meetingCollection.getByKey, 'locusUrl', url1);
|
|
1014
|
-
assert.calledWith(
|
|
1015
|
-
webex.meetings.meetingCollection.getByKey,
|
|
1016
|
-
'meetingNumber',
|
|
1017
|
-
webExMeetingId
|
|
1018
|
-
);
|
|
1019
799
|
assert.calledOnce(initialSetup);
|
|
1020
800
|
assert.calledWith(initialSetup, {
|
|
1021
801
|
id: uuid1,
|
|
@@ -1024,9 +804,6 @@ describe('plugin-meetings', () => {
|
|
|
1024
804
|
callbackAddress: uri1,
|
|
1025
805
|
},
|
|
1026
806
|
},
|
|
1027
|
-
info: {
|
|
1028
|
-
webExMeetingId,
|
|
1029
|
-
},
|
|
1030
807
|
});
|
|
1031
808
|
});
|
|
1032
809
|
|
|
@@ -1049,7 +826,7 @@ describe('plugin-meetings', () => {
|
|
|
1049
826
|
|
|
1050
827
|
it('should not try to match USM meetings by conversation url', async () => {
|
|
1051
828
|
await webex.meetings.handleLocusEvent(generateFakeLocusData(true));
|
|
1052
|
-
assert.callCount(webex.meetings.meetingCollection.getByKey,
|
|
829
|
+
assert.callCount(webex.meetings.meetingCollection.getByKey, 3);
|
|
1053
830
|
assert.deepEqual(webex.meetings.meetingCollection.getByKey.getCall(0).args, [
|
|
1054
831
|
'locusUrl',
|
|
1055
832
|
url1,
|
|
@@ -1066,7 +843,7 @@ describe('plugin-meetings', () => {
|
|
|
1066
843
|
});
|
|
1067
844
|
it('should try to match non-USM meetings by conversation url', async () => {
|
|
1068
845
|
await webex.meetings.handleLocusEvent(generateFakeLocusData(false));
|
|
1069
|
-
assert.callCount(webex.meetings.meetingCollection.getByKey,
|
|
846
|
+
assert.callCount(webex.meetings.meetingCollection.getByKey, 4);
|
|
1070
847
|
assert.deepEqual(webex.meetings.meetingCollection.getByKey.getCall(0).args, [
|
|
1071
848
|
'locusUrl',
|
|
1072
849
|
url1,
|
|
@@ -1089,6 +866,7 @@ describe('plugin-meetings', () => {
|
|
|
1089
866
|
});
|
|
1090
867
|
describe('#createMeeting', () => {
|
|
1091
868
|
beforeEach(() => {
|
|
869
|
+
MediaUtil.createPeerConnection = sinon.stub().returns(true);
|
|
1092
870
|
webex.internal.device.userId = uuid1;
|
|
1093
871
|
webex.internal.device.url = url1;
|
|
1094
872
|
MeetingCollection.set = sinon.stub().returns(true);
|
|
@@ -1097,10 +875,6 @@ describe('plugin-meetings', () => {
|
|
|
1097
875
|
});
|
|
1098
876
|
describe('successful MeetingInfo.#fetchMeetingInfo', () => {
|
|
1099
877
|
let clock, setTimeoutSpy, fakeMeetingStartTimeString, FAKE_TIME_TO_START;
|
|
1100
|
-
const FAKE_INFO_EXTRA_PARAMS = {
|
|
1101
|
-
mtid: 'm9fe0afd8c435e892afcce9ea25b97046',
|
|
1102
|
-
joinTXId: 'TSmrX61wNF',
|
|
1103
|
-
};
|
|
1104
878
|
|
|
1105
879
|
beforeEach(() => {
|
|
1106
880
|
clock = sinon.useFakeTimers();
|
|
@@ -1130,25 +904,13 @@ describe('plugin-meetings', () => {
|
|
|
1130
904
|
meeting,
|
|
1131
905
|
destination,
|
|
1132
906
|
type,
|
|
1133
|
-
|
|
1134
|
-
expectedMeetingData = {},
|
|
1135
|
-
sendCAevents = false
|
|
907
|
+
expectedMeetingData = {}
|
|
1136
908
|
) => {
|
|
1137
909
|
assert.calledOnce(webex.meetings.meetingInfo.fetchMeetingInfo);
|
|
1138
910
|
assert.calledOnce(MeetingsUtil.getMeetingAddedType);
|
|
1139
911
|
assert.notCalled(setTimeoutSpy);
|
|
1140
|
-
assert.
|
|
1141
|
-
assert.calledWith(
|
|
1142
|
-
webex.meetings.meetingInfo.fetchMeetingInfo,
|
|
1143
|
-
destination,
|
|
1144
|
-
type,
|
|
1145
|
-
null,
|
|
1146
|
-
null,
|
|
1147
|
-
undefined,
|
|
1148
|
-
undefined,
|
|
1149
|
-
extraParams,
|
|
1150
|
-
{meetingId: meeting.id, sendCAevents}
|
|
1151
|
-
);
|
|
912
|
+
assert.calledThrice(TriggerProxy.trigger);
|
|
913
|
+
assert.calledWith(webex.meetings.meetingInfo.fetchMeetingInfo, destination, type);
|
|
1152
914
|
assert.calledWith(MeetingsUtil.getMeetingAddedType, 'test type');
|
|
1153
915
|
|
|
1154
916
|
if (expectedMeetingData.permissionToken) {
|
|
@@ -1157,15 +919,6 @@ describe('plugin-meetings', () => {
|
|
|
1157
919
|
if (expectedMeetingData.meetingJoinUrl) {
|
|
1158
920
|
assert.equal(meeting.meetingJoinUrl, expectedMeetingData.meetingJoinUrl);
|
|
1159
921
|
}
|
|
1160
|
-
if (expectedMeetingData.correlationId) {
|
|
1161
|
-
assert.equal(meeting.correlationId, expectedMeetingData.correlationId);
|
|
1162
|
-
}
|
|
1163
|
-
if (expectedMeetingData.callStateForMetrics) {
|
|
1164
|
-
assert.deepEqual(
|
|
1165
|
-
meeting.callStateForMetrics,
|
|
1166
|
-
expectedMeetingData.callStateForMetrics
|
|
1167
|
-
);
|
|
1168
|
-
}
|
|
1169
922
|
assert.equal(meeting.destination, destination);
|
|
1170
923
|
assert.equal(meeting.destinationType, type);
|
|
1171
924
|
assert.calledWith(
|
|
@@ -1195,139 +948,107 @@ describe('plugin-meetings', () => {
|
|
|
1195
948
|
const expectedMeetingData = {
|
|
1196
949
|
permissionToken: 'PT',
|
|
1197
950
|
meetingJoinUrl: 'meetingJoinUrl',
|
|
1198
|
-
correlationId: meeting.id,
|
|
1199
951
|
};
|
|
1200
952
|
|
|
1201
|
-
checkCreateWithoutDelay(
|
|
953
|
+
checkCreateWithoutDelay(meeting, 'test destination', 'test type', expectedMeetingData);
|
|
954
|
+
});
|
|
955
|
+
|
|
956
|
+
it('creates the meeting from a successful meeting info fetch meeting resolve testing', async () => {
|
|
957
|
+
const meeting = await webex.meetings.createMeeting('test destination', 'test type');
|
|
958
|
+
const expectedMeetingData = {
|
|
959
|
+
permissionToken: 'PT',
|
|
960
|
+
meetingJoinUrl: 'meetingJoinUrl',
|
|
961
|
+
};
|
|
962
|
+
|
|
963
|
+
assert.instanceOf(
|
|
1202
964
|
meeting,
|
|
1203
|
-
|
|
1204
|
-
'
|
|
1205
|
-
{},
|
|
1206
|
-
expectedMeetingData
|
|
965
|
+
Meeting,
|
|
966
|
+
'createMeeting should eventually resolve to a Meeting Object'
|
|
1207
967
|
);
|
|
968
|
+
checkCreateWithoutDelay(meeting, 'test destination', 'test type', expectedMeetingData);
|
|
1208
969
|
});
|
|
1209
970
|
|
|
1210
|
-
|
|
1211
|
-
const
|
|
1212
|
-
|
|
1213
|
-
|
|
1214
|
-
|
|
1215
|
-
|
|
1216
|
-
|
|
1217
|
-
|
|
1218
|
-
|
|
1219
|
-
|
|
1220
|
-
|
|
1221
|
-
|
|
1222
|
-
|
|
1223
|
-
|
|
1224
|
-
|
|
1225
|
-
|
|
1226
|
-
|
|
1227
|
-
assert.instanceOf(
|
|
1228
|
-
meeting,
|
|
1229
|
-
Meeting,
|
|
1230
|
-
'createMeeting should eventually resolve to a Meeting Object'
|
|
1231
|
-
);
|
|
1232
|
-
checkCreateWithoutDelay(
|
|
1233
|
-
meeting,
|
|
1234
|
-
'test destination',
|
|
1235
|
-
'test type',
|
|
1236
|
-
infoExtraParamsProvided ? infoExtraParams : {},
|
|
1237
|
-
expectedMeetingData
|
|
1238
|
-
);
|
|
1239
|
-
});
|
|
1240
|
-
|
|
1241
|
-
it(`creates the meeting from a successful meeting info fetch with random delay${
|
|
1242
|
-
infoExtraParamsProvided ? ' with infoExtraParams' : ''
|
|
1243
|
-
}`, async () => {
|
|
1244
|
-
const FAKE_LOCUS_MEETING = {
|
|
1245
|
-
conversationUrl: 'locusConvURL',
|
|
1246
|
-
url: 'locusUrl',
|
|
1247
|
-
info: {
|
|
1248
|
-
webExMeetingId: 'locusMeetingId',
|
|
1249
|
-
sipUri: 'locusSipUri',
|
|
1250
|
-
owner: 'locusOwner',
|
|
1251
|
-
},
|
|
1252
|
-
meeting: {
|
|
1253
|
-
startTime: fakeMeetingStartTimeString,
|
|
1254
|
-
},
|
|
1255
|
-
fullState: {
|
|
1256
|
-
active: false,
|
|
1257
|
-
},
|
|
1258
|
-
};
|
|
971
|
+
it('creates the meeting from a successful meeting info fetch with random delay', async () => {
|
|
972
|
+
const FAKE_LOCUS_MEETING = {
|
|
973
|
+
conversationUrl: 'locusConvURL',
|
|
974
|
+
url: 'locusUrl',
|
|
975
|
+
info: {
|
|
976
|
+
webExMeetingId: 'locusMeetingId',
|
|
977
|
+
sipUri: 'locusSipUri',
|
|
978
|
+
owner: 'locusOwner',
|
|
979
|
+
},
|
|
980
|
+
meeting: {
|
|
981
|
+
startTime: fakeMeetingStartTimeString,
|
|
982
|
+
},
|
|
983
|
+
fullState: {
|
|
984
|
+
active: false,
|
|
985
|
+
},
|
|
986
|
+
};
|
|
1259
987
|
|
|
1260
|
-
|
|
1261
|
-
|
|
1262
|
-
|
|
1263
|
-
|
|
1264
|
-
|
|
1265
|
-
);
|
|
988
|
+
const meeting = await webex.meetings.createMeeting(
|
|
989
|
+
FAKE_LOCUS_MEETING,
|
|
990
|
+
'test type',
|
|
991
|
+
true
|
|
992
|
+
);
|
|
1266
993
|
|
|
1267
|
-
|
|
1268
|
-
|
|
1269
|
-
|
|
1270
|
-
|
|
1271
|
-
|
|
1272
|
-
|
|
1273
|
-
|
|
1274
|
-
|
|
1275
|
-
|
|
1276
|
-
|
|
1277
|
-
|
|
1278
|
-
|
|
1279
|
-
|
|
1280
|
-
|
|
1281
|
-
|
|
1282
|
-
|
|
1283
|
-
|
|
1284
|
-
|
|
1285
|
-
|
|
1286
|
-
|
|
1287
|
-
|
|
1288
|
-
|
|
1289
|
-
|
|
1290
|
-
|
|
1291
|
-
|
|
1292
|
-
|
|
1293
|
-
|
|
1294
|
-
|
|
1295
|
-
|
|
1296
|
-
|
|
1297
|
-
|
|
1298
|
-
|
|
1299
|
-
|
|
994
|
+
assert.instanceOf(
|
|
995
|
+
meeting,
|
|
996
|
+
Meeting,
|
|
997
|
+
'createMeeting should eventually resolve to a Meeting Object'
|
|
998
|
+
);
|
|
999
|
+
assert.notCalled(webex.meetings.meetingInfo.fetchMeetingInfo);
|
|
1000
|
+
assert.calledOnce(setTimeoutSpy);
|
|
1001
|
+
|
|
1002
|
+
// Parse meeting info with locus object
|
|
1003
|
+
assert.equal(meeting.conversationUrl, 'locusConvURL');
|
|
1004
|
+
assert.equal(meeting.locusUrl, 'locusUrl');
|
|
1005
|
+
assert.equal(meeting.sipUri, 'locusSipUri');
|
|
1006
|
+
assert.equal(meeting.meetingNumber, 'locusMeetingId');
|
|
1007
|
+
assert.isUndefined(meeting.meetingJoinUrl);
|
|
1008
|
+
assert.equal(meeting.owner, 'locusOwner');
|
|
1009
|
+
assert.isUndefined(meeting.permissionToken);
|
|
1010
|
+
|
|
1011
|
+
// Add meeting and send trigger
|
|
1012
|
+
assert.calledWith(MeetingsUtil.getMeetingAddedType, 'test type');
|
|
1013
|
+
assert.calledTwice(TriggerProxy.trigger);
|
|
1014
|
+
assert.calledWith(
|
|
1015
|
+
TriggerProxy.trigger,
|
|
1016
|
+
sinon.match.instanceOf(Meetings),
|
|
1017
|
+
{
|
|
1018
|
+
file: 'meetings',
|
|
1019
|
+
function: 'createMeeting',
|
|
1020
|
+
},
|
|
1021
|
+
'meeting:added',
|
|
1022
|
+
{
|
|
1023
|
+
meeting: sinon.match.instanceOf(Meeting),
|
|
1024
|
+
type: 'test meeting added type',
|
|
1025
|
+
}
|
|
1026
|
+
);
|
|
1300
1027
|
|
|
1301
|
-
|
|
1302
|
-
|
|
1303
|
-
|
|
1304
|
-
|
|
1305
|
-
|
|
1306
|
-
|
|
1307
|
-
|
|
1308
|
-
null,
|
|
1309
|
-
undefined,
|
|
1310
|
-
undefined,
|
|
1311
|
-
infoExtraParamsProvided ? infoExtraParams : {}
|
|
1312
|
-
);
|
|
1028
|
+
// When timer expires
|
|
1029
|
+
clock.tick(FAKE_TIME_TO_START);
|
|
1030
|
+
assert.calledWith(
|
|
1031
|
+
webex.meetings.meetingInfo.fetchMeetingInfo,
|
|
1032
|
+
FAKE_LOCUS_MEETING,
|
|
1033
|
+
'test type'
|
|
1034
|
+
);
|
|
1313
1035
|
|
|
1314
|
-
|
|
1315
|
-
|
|
1316
|
-
|
|
1317
|
-
|
|
1318
|
-
|
|
1319
|
-
|
|
1320
|
-
|
|
1321
|
-
|
|
1322
|
-
|
|
1036
|
+
// Parse meeting info is called again with new meeting info
|
|
1037
|
+
await testUtils.flushPromises();
|
|
1038
|
+
assert.equal(meeting.conversationUrl, 'locusConvURL');
|
|
1039
|
+
assert.equal(meeting.locusUrl, 'locusUrl');
|
|
1040
|
+
assert.equal(meeting.sipUri, 'locusSipUri');
|
|
1041
|
+
assert.equal(meeting.meetingNumber, 'locusMeetingId');
|
|
1042
|
+
assert.equal(meeting.meetingJoinUrl, 'meetingJoinUrl');
|
|
1043
|
+
assert.equal(meeting.owner, 'locusOwner');
|
|
1044
|
+
assert.equal(meeting.permissionToken, 'PT');
|
|
1323
1045
|
|
|
1324
|
-
|
|
1325
|
-
|
|
1326
|
-
|
|
1327
|
-
|
|
1328
|
-
|
|
1329
|
-
|
|
1330
|
-
});
|
|
1046
|
+
assert.calledWith(
|
|
1047
|
+
TriggerProxy.trigger,
|
|
1048
|
+
meeting,
|
|
1049
|
+
{file: 'meetings', function: 'fetchMeetingInfo'},
|
|
1050
|
+
'meeting:meetingInfoAvailable'
|
|
1051
|
+
);
|
|
1331
1052
|
});
|
|
1332
1053
|
|
|
1333
1054
|
it('creates the meeting from a successful meeting info fetch that has no random delay because it is active', async () => {
|
|
@@ -1427,62 +1148,7 @@ describe('plugin-meetings', () => {
|
|
|
1427
1148
|
);
|
|
1428
1149
|
checkCreateWithoutDelay(meeting, FAKE_LOCUS_MEETING, 'test type');
|
|
1429
1150
|
});
|
|
1430
|
-
|
|
1431
|
-
it('creates meeting with the correlationId provided', async () => {
|
|
1432
|
-
const meeting = await webex.meetings.createMeeting(
|
|
1433
|
-
'test destination',
|
|
1434
|
-
'test type',
|
|
1435
|
-
false,
|
|
1436
|
-
{},
|
|
1437
|
-
{correlationId: 'my-correlationId'}
|
|
1438
|
-
);
|
|
1439
|
-
|
|
1440
|
-
const expectedMeetingData = {
|
|
1441
|
-
correlationId: 'my-correlationId',
|
|
1442
|
-
};
|
|
1443
|
-
|
|
1444
|
-
checkCreateWithoutDelay(
|
|
1445
|
-
meeting,
|
|
1446
|
-
'test destination',
|
|
1447
|
-
'test type',
|
|
1448
|
-
{},
|
|
1449
|
-
expectedMeetingData,
|
|
1450
|
-
true
|
|
1451
|
-
);
|
|
1452
|
-
});
|
|
1453
|
-
|
|
1454
|
-
it('creates meeting with the callStateForMetrics provided', async () => {
|
|
1455
|
-
const meeting = await webex.meetings.createMeeting(
|
|
1456
|
-
'test destination',
|
|
1457
|
-
'test type',
|
|
1458
|
-
false,
|
|
1459
|
-
{},
|
|
1460
|
-
{
|
|
1461
|
-
correlationId: 'my-correlationId',
|
|
1462
|
-
joinTrigger: 'my-join-trigger',
|
|
1463
|
-
loginType: 'my-login-type',
|
|
1464
|
-
}
|
|
1465
|
-
);
|
|
1466
|
-
|
|
1467
|
-
const expectedMeetingData = {
|
|
1468
|
-
correlationId: 'my-correlationId',
|
|
1469
|
-
callStateForMetrics: {
|
|
1470
|
-
correlationId: 'my-correlationId',
|
|
1471
|
-
joinTrigger: 'my-join-trigger',
|
|
1472
|
-
loginType: 'my-login-type',
|
|
1473
|
-
},
|
|
1474
|
-
};
|
|
1475
|
-
|
|
1476
|
-
checkCreateWithoutDelay(
|
|
1477
|
-
meeting,
|
|
1478
|
-
'test destination',
|
|
1479
|
-
'test type',
|
|
1480
|
-
{},
|
|
1481
|
-
expectedMeetingData,
|
|
1482
|
-
true
|
|
1483
|
-
);
|
|
1484
|
-
});
|
|
1485
|
-
});
|
|
1151
|
+
});
|
|
1486
1152
|
|
|
1487
1153
|
describe('rejected MeetingInfo.#fetchMeetingInfo', () => {
|
|
1488
1154
|
beforeEach(() => {
|
|
@@ -1491,136 +1157,45 @@ describe('plugin-meetings', () => {
|
|
|
1491
1157
|
webex.meetings.meetingInfo.fetchMeetingInfo = sinon
|
|
1492
1158
|
.stub()
|
|
1493
1159
|
.returns(Promise.reject(new Error('test')));
|
|
1494
|
-
webex.meetings.destroy = sinon.stub().returns(Promise.resolve());
|
|
1495
|
-
webex.meetings.createMeeting = sinon.spy(webex.meetings.createMeeting);
|
|
1496
1160
|
});
|
|
1497
|
-
|
|
1498
|
-
const checkCreateMeetingWithNoMeetingInfo = async (failOnMissingMeetingInfo, destroy) => {
|
|
1499
|
-
try {
|
|
1500
|
-
const meeting = await webex.meetings.createMeeting(
|
|
1501
|
-
'test destination',
|
|
1502
|
-
'test type',
|
|
1503
|
-
undefined,
|
|
1504
|
-
undefined,
|
|
1505
|
-
undefined,
|
|
1506
|
-
failOnMissingMeetingInfo
|
|
1507
|
-
);
|
|
1508
|
-
|
|
1509
|
-
assert.instanceOf(
|
|
1510
|
-
meeting,
|
|
1511
|
-
Meeting,
|
|
1512
|
-
'createMeeting should eventually resolve to a Meeting Object'
|
|
1513
|
-
);
|
|
1514
|
-
assert.calledOnce(webex.meetings.meetingInfo.fetchMeetingInfo);
|
|
1515
|
-
assert.calledOnce(MeetingsUtil.getMeetingAddedType);
|
|
1516
|
-
assert.calledThrice(TriggerProxy.trigger);
|
|
1517
|
-
assert.calledWith(
|
|
1518
|
-
webex.meetings.meetingInfo.fetchMeetingInfo,
|
|
1519
|
-
'test destination',
|
|
1520
|
-
'test type'
|
|
1521
|
-
);
|
|
1522
|
-
|
|
1523
|
-
if (destroy) {
|
|
1524
|
-
assert.calledWith(
|
|
1525
|
-
webex.meetings.destroy,
|
|
1526
|
-
sinon.match.instanceOf(Meeting),
|
|
1527
|
-
'MISSING_MEETING_INFO'
|
|
1528
|
-
);
|
|
1529
|
-
assert.notCalled(MeetingsUtil.getMeetingAddedType);
|
|
1530
|
-
assert.notCalled(TriggerProxy.trigger);
|
|
1531
|
-
assert.throw(webex.meetings.createMeeting, 'meeting information not found');
|
|
1532
|
-
} else {
|
|
1533
|
-
assert.notCalled(webex.meetings.destroy);
|
|
1534
|
-
assert.calledWith(MeetingsUtil.getMeetingAddedType, 'test type');
|
|
1535
|
-
assert.calledWith(
|
|
1536
|
-
TriggerProxy.trigger,
|
|
1537
|
-
sinon.match.instanceOf(Meetings),
|
|
1538
|
-
{
|
|
1539
|
-
file: 'meetings',
|
|
1540
|
-
function: 'createMeeting',
|
|
1541
|
-
},
|
|
1542
|
-
'meeting:added',
|
|
1543
|
-
{
|
|
1544
|
-
meeting: sinon.match.instanceOf(Meeting),
|
|
1545
|
-
type: 'test meeting added type',
|
|
1546
|
-
}
|
|
1547
|
-
);
|
|
1548
|
-
}
|
|
1549
|
-
} catch (err) {
|
|
1550
|
-
assert.instanceOf(err, NoMeetingInfoError);
|
|
1551
|
-
}
|
|
1552
|
-
};
|
|
1553
|
-
|
|
1554
1161
|
it('creates the meeting from a rejected meeting info fetch', async () => {
|
|
1555
|
-
|
|
1556
|
-
});
|
|
1557
|
-
|
|
1558
|
-
it('creates the meeting from a rejected meeting info fetch and destroys it if failOnMissingMeetingInfo', async () => {
|
|
1559
|
-
checkCreateMeetingWithNoMeetingInfo(true, true);
|
|
1560
|
-
});
|
|
1561
|
-
});
|
|
1162
|
+
const meeting = await webex.meetings.createMeeting('test destination', 'test type');
|
|
1562
1163
|
|
|
1563
|
-
|
|
1564
|
-
|
|
1565
|
-
|
|
1566
|
-
|
|
1567
|
-
|
|
1568
|
-
|
|
1569
|
-
|
|
1570
|
-
|
|
1571
|
-
|
|
1572
|
-
|
|
1573
|
-
|
|
1574
|
-
|
|
1575
|
-
|
|
1164
|
+
assert.instanceOf(
|
|
1165
|
+
meeting,
|
|
1166
|
+
Meeting,
|
|
1167
|
+
'createMeeting should eventually resolve to a Meeting Object'
|
|
1168
|
+
);
|
|
1169
|
+
assert.calledOnce(webex.meetings.meetingInfo.fetchMeetingInfo);
|
|
1170
|
+
assert.calledOnce(MeetingsUtil.getMeetingAddedType);
|
|
1171
|
+
assert.calledTwice(TriggerProxy.trigger);
|
|
1172
|
+
assert.calledWith(
|
|
1173
|
+
webex.meetings.meetingInfo.fetchMeetingInfo,
|
|
1174
|
+
'test destination',
|
|
1175
|
+
'test type'
|
|
1176
|
+
);
|
|
1177
|
+
assert.calledWith(MeetingsUtil.getMeetingAddedType, 'test type');
|
|
1178
|
+
assert.calledWith(
|
|
1179
|
+
TriggerProxy.trigger,
|
|
1180
|
+
sinon.match.instanceOf(Meetings),
|
|
1576
1181
|
{
|
|
1577
|
-
|
|
1578
|
-
|
|
1579
|
-
'Meetings:index#createMeeting --> Debug PermissionError: Not allowed to execute the function, some properties on server, or local client state do not allow you to complete this action. fetching /meetingInfo for creation.',
|
|
1182
|
+
file: 'meetings',
|
|
1183
|
+
function: 'createMeeting',
|
|
1580
1184
|
},
|
|
1185
|
+
'meeting:added',
|
|
1581
1186
|
{
|
|
1582
|
-
|
|
1583
|
-
|
|
1584
|
-
|
|
1585
|
-
|
|
1586
|
-
|
|
1587
|
-
],
|
|
1588
|
-
({error, debugLogMessage, infoLogMessage}) => {
|
|
1589
|
-
it('creates the meeting from a rejected meeting info fetch', async () => {
|
|
1590
|
-
webex.meetings.meetingInfo.fetchMeetingInfo = sinon
|
|
1591
|
-
.stub()
|
|
1592
|
-
.returns(Promise.reject(error));
|
|
1593
|
-
|
|
1594
|
-
LoggerProxy.logger.debug = sinon.stub();
|
|
1595
|
-
LoggerProxy.logger.info = sinon.stub();
|
|
1596
|
-
|
|
1597
|
-
const meeting = await webex.meetings.createMeeting('test destination', 'test type');
|
|
1598
|
-
|
|
1599
|
-
assert.instanceOf(
|
|
1600
|
-
meeting,
|
|
1601
|
-
Meeting,
|
|
1602
|
-
'createMeeting should eventually resolve to a Meeting Object'
|
|
1603
|
-
);
|
|
1604
|
-
|
|
1605
|
-
assert.calledWith(LoggerProxy.logger.debug, debugLogMessage);
|
|
1606
|
-
|
|
1607
|
-
if (infoLogMessage) {
|
|
1608
|
-
assert.calledWith(
|
|
1609
|
-
LoggerProxy.logger.info,
|
|
1610
|
-
'Meetings:index#createMeeting --> Info Unable to fetch meeting info for test destination.'
|
|
1611
|
-
);
|
|
1612
|
-
} else {
|
|
1613
|
-
assert.notCalled(LoggerProxy.logger.info);
|
|
1614
|
-
}
|
|
1615
|
-
});
|
|
1616
|
-
}
|
|
1617
|
-
);
|
|
1187
|
+
meeting: sinon.match.instanceOf(Meeting),
|
|
1188
|
+
type: 'test meeting added type',
|
|
1189
|
+
}
|
|
1190
|
+
);
|
|
1191
|
+
});
|
|
1618
1192
|
});
|
|
1619
1193
|
});
|
|
1620
1194
|
});
|
|
1621
1195
|
describe('Public Event Triggers', () => {
|
|
1622
1196
|
describe('#destroy', () => {
|
|
1623
1197
|
beforeEach(() => {
|
|
1198
|
+
MediaUtil.createPeerConnection = sinon.stub().returns(true);
|
|
1624
1199
|
MeetingUtil.cleanUp = sinon.stub();
|
|
1625
1200
|
});
|
|
1626
1201
|
it('should have #destroy', () => {
|
|
@@ -1694,8 +1269,6 @@ describe('plugin-meetings', () => {
|
|
|
1694
1269
|
});
|
|
1695
1270
|
|
|
1696
1271
|
describe('#fetchUserPreferredWebexSite', () => {
|
|
1697
|
-
let loggerProxySpy;
|
|
1698
|
-
|
|
1699
1272
|
it('should call request.getMeetingPreferences to get the preferred webex site ', async () => {
|
|
1700
1273
|
assert.isDefined(webex.meetings.preferredWebexSite);
|
|
1701
1274
|
await webex.meetings.fetchUserPreferredWebexSite();
|
|
@@ -1703,22 +1276,7 @@ describe('plugin-meetings', () => {
|
|
|
1703
1276
|
assert.equal(webex.meetings.preferredWebexSite, 'go.webex.com');
|
|
1704
1277
|
});
|
|
1705
1278
|
|
|
1706
|
-
const setup = ({user} = {}) => {
|
|
1707
|
-
loggerProxySpy = sinon.spy(LoggerProxy.logger, 'error');
|
|
1708
|
-
|
|
1709
|
-
Object.assign(webex.internal, {
|
|
1710
|
-
services: {
|
|
1711
|
-
getMeetingPreferences: sinon.stub().returns(Promise.resolve({})),
|
|
1712
|
-
},
|
|
1713
|
-
user: {
|
|
1714
|
-
get: sinon.stub().returns(Promise.resolve(user)),
|
|
1715
|
-
},
|
|
1716
|
-
});
|
|
1717
|
-
};
|
|
1718
|
-
|
|
1719
1279
|
it('should not fail if UserPreferred info is not fetched ', async () => {
|
|
1720
|
-
setup();
|
|
1721
|
-
|
|
1722
1280
|
Object.assign(webex.internal, {
|
|
1723
1281
|
services: {
|
|
1724
1282
|
getMeetingPreferences: sinon.stub().returns(Promise.resolve({})),
|
|
@@ -1728,115 +1286,7 @@ describe('plugin-meetings', () => {
|
|
|
1728
1286
|
await webex.meetings.fetchUserPreferredWebexSite().then(() => {
|
|
1729
1287
|
assert.equal(webex.meetings.preferredWebexSite, '');
|
|
1730
1288
|
});
|
|
1731
|
-
assert.calledOnceWithExactly(
|
|
1732
|
-
loggerProxySpy,
|
|
1733
|
-
'Failed to fetch preferred site from user - no site will be set'
|
|
1734
|
-
);
|
|
1735
|
-
});
|
|
1736
|
-
|
|
1737
|
-
it('should fall back to fetching the site from the user', async () => {
|
|
1738
|
-
setup({
|
|
1739
|
-
user: {
|
|
1740
|
-
userPreferences: {
|
|
1741
|
-
userPreferencesItems: {
|
|
1742
|
-
preferredWebExSite: 'site.webex.com',
|
|
1743
|
-
},
|
|
1744
|
-
},
|
|
1745
|
-
},
|
|
1746
|
-
});
|
|
1747
|
-
|
|
1748
|
-
await webex.meetings.fetchUserPreferredWebexSite();
|
|
1749
|
-
|
|
1750
|
-
assert.equal(webex.meetings.preferredWebexSite, 'site.webex.com');
|
|
1751
|
-
assert.notCalled(loggerProxySpy);
|
|
1752
|
-
});
|
|
1753
|
-
|
|
1754
|
-
forEach(
|
|
1755
|
-
[
|
|
1756
|
-
{user: undefined},
|
|
1757
|
-
{user: {userPreferences: {}}},
|
|
1758
|
-
{user: {userPreferences: {userPreferencesItems: {}}}},
|
|
1759
|
-
{user: {userPreferences: {userPreferencesItems: {preferredWebExSite: undefined}}}},
|
|
1760
|
-
],
|
|
1761
|
-
({user}) => {
|
|
1762
|
-
it(`should handle invalid user data ${user}`, async () => {
|
|
1763
|
-
setup({user});
|
|
1764
|
-
|
|
1765
|
-
await webex.meetings.fetchUserPreferredWebexSite();
|
|
1766
|
-
|
|
1767
|
-
assert.equal(webex.meetings.preferredWebexSite, '');
|
|
1768
|
-
assert.calledOnceWithExactly(
|
|
1769
|
-
loggerProxySpy,
|
|
1770
|
-
'Failed to fetch preferred site from user - no site will be set'
|
|
1771
|
-
);
|
|
1772
|
-
});
|
|
1773
|
-
}
|
|
1774
|
-
);
|
|
1775
|
-
|
|
1776
|
-
it('should handle a get user failure', async () => {
|
|
1777
|
-
setup();
|
|
1778
|
-
|
|
1779
|
-
webex.internal.user.get.rejects(new Error());
|
|
1780
|
-
|
|
1781
|
-
await webex.meetings.fetchUserPreferredWebexSite();
|
|
1782
|
-
|
|
1783
|
-
assert.equal(webex.meetings.preferredWebexSite, '');
|
|
1784
|
-
assert.calledOnceWithExactly(
|
|
1785
|
-
loggerProxySpy,
|
|
1786
|
-
'Failed to fetch preferred site from user - no site will be set'
|
|
1787
|
-
);
|
|
1788
1289
|
});
|
|
1789
|
-
|
|
1790
|
-
it('should fall back to fetching the site from the user', async () => {
|
|
1791
|
-
setup({
|
|
1792
|
-
user: {
|
|
1793
|
-
userPreferences: {
|
|
1794
|
-
userPreferencesItems: {
|
|
1795
|
-
preferredWebExSite: 'site.webex.com',
|
|
1796
|
-
},
|
|
1797
|
-
},
|
|
1798
|
-
},
|
|
1799
|
-
});
|
|
1800
|
-
|
|
1801
|
-
await webex.meetings.fetchUserPreferredWebexSite();
|
|
1802
|
-
|
|
1803
|
-
assert.equal(webex.meetings.preferredWebexSite, 'site.webex.com');
|
|
1804
|
-
assert.notCalled(loggerProxySpy);
|
|
1805
|
-
});
|
|
1806
|
-
|
|
1807
|
-
forEach([
|
|
1808
|
-
{user: undefined},
|
|
1809
|
-
{user: {userPreferences: {}}},
|
|
1810
|
-
{user: {userPreferences: {userPreferencesItems: {}}}},
|
|
1811
|
-
{user: {userPreferences: {userPreferencesItems: {preferredWebExSite: undefined}}}},
|
|
1812
|
-
], ({user}) => {
|
|
1813
|
-
it(`should handle invalid user data ${user}`, async () => {
|
|
1814
|
-
setup({user});
|
|
1815
|
-
|
|
1816
|
-
await webex.meetings.fetchUserPreferredWebexSite();
|
|
1817
|
-
|
|
1818
|
-
assert.equal(webex.meetings.preferredWebexSite, '');
|
|
1819
|
-
assert.calledOnceWithExactly(
|
|
1820
|
-
loggerProxySpy,
|
|
1821
|
-
'Failed to fetch preferred site from user - no site will be set'
|
|
1822
|
-
);
|
|
1823
|
-
});
|
|
1824
|
-
});
|
|
1825
|
-
|
|
1826
|
-
it('should handle a get user failure', async () => {
|
|
1827
|
-
setup();
|
|
1828
|
-
|
|
1829
|
-
webex.internal.user.get.rejects(new Error());
|
|
1830
|
-
|
|
1831
|
-
await webex.meetings.fetchUserPreferredWebexSite();
|
|
1832
|
-
|
|
1833
|
-
assert.equal(webex.meetings.preferredWebexSite, '');
|
|
1834
|
-
assert.calledOnceWithExactly(
|
|
1835
|
-
loggerProxySpy,
|
|
1836
|
-
'Failed to fetch preferred site from user - no site will be set'
|
|
1837
|
-
);
|
|
1838
|
-
});
|
|
1839
|
-
|
|
1840
1290
|
});
|
|
1841
1291
|
});
|
|
1842
1292
|
|
|
@@ -1844,6 +1294,7 @@ describe('plugin-meetings', () => {
|
|
|
1844
1294
|
let meeting;
|
|
1845
1295
|
|
|
1846
1296
|
beforeEach(async () => {
|
|
1297
|
+
MediaUtil.createPeerConnection = sinon.stub().returns(true);
|
|
1847
1298
|
webex.internal.device.userId = uuid1;
|
|
1848
1299
|
webex.internal.device.url = url1;
|
|
1849
1300
|
MeetingCollection.set = sinon.stub().returns(true);
|
|
@@ -1920,523 +1371,5 @@ describe('plugin-meetings', () => {
|
|
|
1920
1371
|
);
|
|
1921
1372
|
});
|
|
1922
1373
|
});
|
|
1923
|
-
|
|
1924
|
-
describe('#isNeedHandleMainLocus', () => {
|
|
1925
|
-
let meeting;
|
|
1926
|
-
let newLocus;
|
|
1927
|
-
beforeEach(() => {
|
|
1928
|
-
meeting = {
|
|
1929
|
-
controls: {},
|
|
1930
|
-
self: {},
|
|
1931
|
-
};
|
|
1932
|
-
newLocus = {
|
|
1933
|
-
controls: {},
|
|
1934
|
-
self: {},
|
|
1935
|
-
};
|
|
1936
|
-
});
|
|
1937
|
-
afterEach(() => {
|
|
1938
|
-
sinon.restore();
|
|
1939
|
-
});
|
|
1940
|
-
it('check normal case will return true', () => {
|
|
1941
|
-
sinon.stub(webex.meetings.meetingCollection, 'getActiveBreakoutLocus').returns(null);
|
|
1942
|
-
LoggerProxy.logger.log = sinon.stub();
|
|
1943
|
-
const result = webex.meetings.isNeedHandleMainLocus(meeting, newLocus);
|
|
1944
|
-
assert.equal(result, true);
|
|
1945
|
-
assert.calledWith(
|
|
1946
|
-
LoggerProxy.logger.log,
|
|
1947
|
-
'Meetings:index#isNeedHandleMainLocus --> this is a normal main session locusDTO update case'
|
|
1948
|
-
);
|
|
1949
|
-
});
|
|
1950
|
-
|
|
1951
|
-
it('check self joined and joined on this device, return true', () => {
|
|
1952
|
-
sinon.stub(webex.meetings.meetingCollection, 'getActiveBreakoutLocus').returns(null);
|
|
1953
|
-
newLocus.self.state = 'JOINED';
|
|
1954
|
-
sinon.stub(MeetingsUtil, 'joinedOnThisDevice').returns(true);
|
|
1955
|
-
|
|
1956
|
-
LoggerProxy.logger.log = sinon.stub();
|
|
1957
|
-
const result = webex.meetings.isNeedHandleMainLocus(meeting, newLocus);
|
|
1958
|
-
assert.equal(result, true);
|
|
1959
|
-
assert.calledWith(
|
|
1960
|
-
LoggerProxy.logger.log,
|
|
1961
|
-
'Meetings:index#isNeedHandleMainLocus --> self this device shown as JOINED in the main session'
|
|
1962
|
-
);
|
|
1963
|
-
});
|
|
1964
|
-
|
|
1965
|
-
it('if newLocus replaceAt time is expired, then return false', () => {
|
|
1966
|
-
sinon.stub(webex.meetings.meetingCollection, 'getActiveBreakoutLocus').returns({
|
|
1967
|
-
joinedWith: {
|
|
1968
|
-
replaces: [
|
|
1969
|
-
{
|
|
1970
|
-
replaceAt: '2023-03-27T02:17:02.506Z',
|
|
1971
|
-
},
|
|
1972
|
-
],
|
|
1973
|
-
},
|
|
1974
|
-
});
|
|
1975
|
-
newLocus.self.state = 'JOINED';
|
|
1976
|
-
sinon.stub(MeetingsUtil, 'joinedOnThisDevice').returns(true);
|
|
1977
|
-
sinon.stub(MeetingsUtil, 'getThisDevice').returns({
|
|
1978
|
-
replaces: [
|
|
1979
|
-
{
|
|
1980
|
-
replaceAt: '2023-03-27T02:17:01.506Z',
|
|
1981
|
-
},
|
|
1982
|
-
],
|
|
1983
|
-
});
|
|
1984
|
-
|
|
1985
|
-
LoggerProxy.logger.log = sinon.stub();
|
|
1986
|
-
const result = webex.meetings.isNeedHandleMainLocus(meeting, newLocus);
|
|
1987
|
-
assert.equal(result, false);
|
|
1988
|
-
assert.calledWith(
|
|
1989
|
-
LoggerProxy.logger.log,
|
|
1990
|
-
`Meetings:index#isNeedHandleMainLocus --> this is expired main joined status locus_dto replacedAt 2023-03-27T02:17:01.506Z bo replacedAt 2023-03-27T02:17:02.506Z`
|
|
1991
|
-
);
|
|
1992
|
-
});
|
|
1993
|
-
|
|
1994
|
-
it('check current is in breakout join with this device, return false', () => {
|
|
1995
|
-
sinon.stub(webex.meetings.meetingCollection, 'getActiveBreakoutLocus').returns({
|
|
1996
|
-
joinedWith: {
|
|
1997
|
-
correlationId: '111',
|
|
1998
|
-
},
|
|
1999
|
-
});
|
|
2000
|
-
newLocus.controls.breakout = {url: 'url'};
|
|
2001
|
-
meeting.correlationId = '111';
|
|
2002
|
-
|
|
2003
|
-
LoggerProxy.logger.log = sinon.stub();
|
|
2004
|
-
const result = webex.meetings.isNeedHandleMainLocus(meeting, newLocus);
|
|
2005
|
-
assert.equal(result, false);
|
|
2006
|
-
assert.calledWith(
|
|
2007
|
-
LoggerProxy.logger.log,
|
|
2008
|
-
`Meetings:index#isNeedHandleMainLocus --> there is active breakout session and joined on this device, and don't need to handle main session: url`
|
|
2009
|
-
);
|
|
2010
|
-
});
|
|
2011
|
-
|
|
2012
|
-
it('check self is moved and removed, return false', () => {
|
|
2013
|
-
webex.meetings.meetingCollection.getActiveBreakoutLocus = sinon.stub().returns(null);
|
|
2014
|
-
newLocus.self.state = 'LEFT';
|
|
2015
|
-
newLocus.self.reason = 'MOVED';
|
|
2016
|
-
newLocus.self.removed = true;
|
|
2017
|
-
LoggerProxy.logger.log = sinon.stub();
|
|
2018
|
-
const result = webex.meetings.isNeedHandleMainLocus(meeting, newLocus);
|
|
2019
|
-
assert.equal(result, false);
|
|
2020
|
-
assert.calledWith(
|
|
2021
|
-
LoggerProxy.logger.log,
|
|
2022
|
-
'Meetings:index#isNeedHandleMainLocus --> self moved main locus with self removed status or with device resource moved, not need to handle'
|
|
2023
|
-
);
|
|
2024
|
-
});
|
|
2025
|
-
|
|
2026
|
-
it('check self is moved and device resource removed, return false', () => {
|
|
2027
|
-
webex.meetings.meetingCollection.getActiveBreakoutLocus = sinon.stub().returns(null);
|
|
2028
|
-
newLocus.self.state = 'LEFT';
|
|
2029
|
-
newLocus.self.reason = 'MOVED';
|
|
2030
|
-
sinon.stub(MeetingsUtil, 'getThisDevice').returns({
|
|
2031
|
-
state: 'LEFT',
|
|
2032
|
-
reason: 'MOVED',
|
|
2033
|
-
});
|
|
2034
|
-
LoggerProxy.logger.log = sinon.stub();
|
|
2035
|
-
const result = webex.meetings.isNeedHandleMainLocus(meeting, newLocus);
|
|
2036
|
-
assert.equal(result, false);
|
|
2037
|
-
assert.calledWith(
|
|
2038
|
-
LoggerProxy.logger.log,
|
|
2039
|
-
'Meetings:index#isNeedHandleMainLocus --> self moved main locus with self removed status or with device resource moved, not need to handle'
|
|
2040
|
-
);
|
|
2041
|
-
});
|
|
2042
|
-
|
|
2043
|
-
it('check self is joined but device resource removed, return false', () => {
|
|
2044
|
-
webex.meetings.meetingCollection.getActiveBreakoutLocus = sinon.stub().returns(null);
|
|
2045
|
-
sinon.stub(MeetingsUtil, 'joinedOnThisDevice').returns(false);
|
|
2046
|
-
newLocus.self.state = 'JOINED';
|
|
2047
|
-
sinon.stub(MeetingsUtil, 'getThisDevice').returns({
|
|
2048
|
-
state: 'LEFT',
|
|
2049
|
-
reason: 'MOVED',
|
|
2050
|
-
});
|
|
2051
|
-
LoggerProxy.logger.log = sinon.stub();
|
|
2052
|
-
const result = webex.meetings.isNeedHandleMainLocus(meeting, newLocus);
|
|
2053
|
-
assert.equal(result, false);
|
|
2054
|
-
assert.calledWith(
|
|
2055
|
-
LoggerProxy.logger.log,
|
|
2056
|
-
'Meetings:index#isNeedHandleMainLocus --> self device left&moved in main locus with self joined status, not need to handle'
|
|
2057
|
-
);
|
|
2058
|
-
});
|
|
2059
|
-
});
|
|
2060
|
-
|
|
2061
|
-
describe('#isNeedHandleLocusDTO', () => {
|
|
2062
|
-
let meeting;
|
|
2063
|
-
let newLocus;
|
|
2064
|
-
beforeEach(() => {
|
|
2065
|
-
meeting = {
|
|
2066
|
-
controls: {},
|
|
2067
|
-
self: {},
|
|
2068
|
-
};
|
|
2069
|
-
newLocus = {
|
|
2070
|
-
controls: {},
|
|
2071
|
-
self: {},
|
|
2072
|
-
};
|
|
2073
|
-
});
|
|
2074
|
-
afterEach(() => {
|
|
2075
|
-
sinon.restore();
|
|
2076
|
-
});
|
|
2077
|
-
it('initial DTO , joined breakout session, return true', () => {
|
|
2078
|
-
newLocus.controls.breakout = {
|
|
2079
|
-
sessionType: 'BREAKOUT',
|
|
2080
|
-
};
|
|
2081
|
-
newLocus.self.state = 'JOINED';
|
|
2082
|
-
newLocus.fullState = {
|
|
2083
|
-
active: true,
|
|
2084
|
-
};
|
|
2085
|
-
LoggerProxy.logger.log = sinon.stub();
|
|
2086
|
-
const result = webex.meetings.isNeedHandleLocusDTO(null, newLocus);
|
|
2087
|
-
assert.equal(result, true);
|
|
2088
|
-
assert.calledWith(
|
|
2089
|
-
LoggerProxy.logger.log,
|
|
2090
|
-
`Meetings:index#isNeedHandleLocusDTO --> the first breakout session locusDTO active status: true`
|
|
2091
|
-
);
|
|
2092
|
-
});
|
|
2093
|
-
it('others go to check isNeedHandleMainLocus', () => {
|
|
2094
|
-
newLocus.controls.breakout = {
|
|
2095
|
-
sessionType: 'MAIN',
|
|
2096
|
-
};
|
|
2097
|
-
newLocus.self.state = 'JOINED';
|
|
2098
|
-
|
|
2099
|
-
LoggerProxy.logger.log = sinon.stub();
|
|
2100
|
-
const result = webex.meetings.isNeedHandleLocusDTO(meeting, newLocus);
|
|
2101
|
-
assert.equal(result, true);
|
|
2102
|
-
assert.calledWith(
|
|
2103
|
-
LoggerProxy.logger.log,
|
|
2104
|
-
'Meetings:index#isNeedHandleMainLocus --> this is a normal main session locusDTO update case'
|
|
2105
|
-
);
|
|
2106
|
-
});
|
|
2107
|
-
it('joined breakout session, self status is moved, return false', () => {
|
|
2108
|
-
newLocus.controls.breakout = {
|
|
2109
|
-
sessionType: 'BREAKOUT',
|
|
2110
|
-
};
|
|
2111
|
-
newLocus.self.state = 'LEFT';
|
|
2112
|
-
newLocus.self.reason = 'MOVED';
|
|
2113
|
-
|
|
2114
|
-
LoggerProxy.logger.log = sinon.stub();
|
|
2115
|
-
const result = webex.meetings.isNeedHandleLocusDTO(meeting, newLocus);
|
|
2116
|
-
assert.equal(result, false);
|
|
2117
|
-
});
|
|
2118
|
-
});
|
|
2119
|
-
|
|
2120
|
-
describe('#getCorrespondingMeetingByLocus', () => {
|
|
2121
|
-
let locus;
|
|
2122
|
-
let mockReturnMeeting = {meeting: 'meeting1'};
|
|
2123
|
-
const mockGetByKey = (keyWillReturnMeeting) => {
|
|
2124
|
-
webex.meetings.meetingCollection.getByKey = sinon.stub().callsFake((key) => {
|
|
2125
|
-
if (key === keyWillReturnMeeting) {
|
|
2126
|
-
return mockReturnMeeting;
|
|
2127
|
-
}
|
|
2128
|
-
return null;
|
|
2129
|
-
});
|
|
2130
|
-
};
|
|
2131
|
-
|
|
2132
|
-
beforeEach(() => {
|
|
2133
|
-
locus = {
|
|
2134
|
-
controls: {},
|
|
2135
|
-
self: {
|
|
2136
|
-
callbackInfo: {
|
|
2137
|
-
callbackAddress: 'address1',
|
|
2138
|
-
},
|
|
2139
|
-
},
|
|
2140
|
-
info: {
|
|
2141
|
-
webExMeetingId: '123456',
|
|
2142
|
-
isUnifiedSpaceMeeting: false,
|
|
2143
|
-
},
|
|
2144
|
-
conversationUrl: 'conversationUrl1',
|
|
2145
|
-
};
|
|
2146
|
-
|
|
2147
|
-
sinon.stub(MeetingsUtil, 'checkForCorrelationId').returns('correlationId1');
|
|
2148
|
-
});
|
|
2149
|
-
afterEach(() => {
|
|
2150
|
-
sinon.restore();
|
|
2151
|
-
});
|
|
2152
|
-
it('check the calls when no meeting found in meetingCollection', () => {
|
|
2153
|
-
mockGetByKey();
|
|
2154
|
-
const result = webex.meetings.getCorrespondingMeetingByLocus({locus, locusUrl: url1});
|
|
2155
|
-
assert.isNull(result);
|
|
2156
|
-
assert.callCount(webex.meetings.meetingCollection.getByKey, 5);
|
|
2157
|
-
assert.calledWith(webex.meetings.meetingCollection.getByKey, 'locusUrl', url1);
|
|
2158
|
-
assert.calledWith(
|
|
2159
|
-
webex.meetings.meetingCollection.getByKey,
|
|
2160
|
-
'correlationId',
|
|
2161
|
-
'correlationId1'
|
|
2162
|
-
);
|
|
2163
|
-
assert.calledWith(webex.meetings.meetingCollection.getByKey, 'sipUri', 'address1');
|
|
2164
|
-
assert.calledWith(
|
|
2165
|
-
webex.meetings.meetingCollection.getByKey,
|
|
2166
|
-
'conversationUrl',
|
|
2167
|
-
'conversationUrl1'
|
|
2168
|
-
);
|
|
2169
|
-
assert.calledWith(webex.meetings.meetingCollection.getByKey, 'meetingNumber', '123456');
|
|
2170
|
-
});
|
|
2171
|
-
|
|
2172
|
-
it('not try getByKey "conversationUrl" when isUnifiedSpaceMeeting is true', () => {
|
|
2173
|
-
mockGetByKey();
|
|
2174
|
-
locus.info.isUnifiedSpaceMeeting = true;
|
|
2175
|
-
const result = webex.meetings.getCorrespondingMeetingByLocus({locus, locusUrl: url1});
|
|
2176
|
-
assert.isNull(result);
|
|
2177
|
-
assert.callCount(webex.meetings.meetingCollection.getByKey, 4);
|
|
2178
|
-
});
|
|
2179
|
-
|
|
2180
|
-
it('check the calls when meeting found by key: locusUrl', () => {
|
|
2181
|
-
mockGetByKey('locusUrl');
|
|
2182
|
-
const result = webex.meetings.getCorrespondingMeetingByLocus({locus, locusUrl: url1});
|
|
2183
|
-
assert.deepEqual(result, mockReturnMeeting);
|
|
2184
|
-
assert.callCount(webex.meetings.meetingCollection.getByKey, 1);
|
|
2185
|
-
assert.calledWith(webex.meetings.meetingCollection.getByKey, 'locusUrl', url1);
|
|
2186
|
-
});
|
|
2187
|
-
|
|
2188
|
-
it('check the calls when meeting found by key: correlationId', () => {
|
|
2189
|
-
mockGetByKey('correlationId');
|
|
2190
|
-
const result = webex.meetings.getCorrespondingMeetingByLocus({locus, locusUrl: url1});
|
|
2191
|
-
assert.deepEqual(result, mockReturnMeeting);
|
|
2192
|
-
assert.callCount(webex.meetings.meetingCollection.getByKey, 2);
|
|
2193
|
-
assert.calledWith(webex.meetings.meetingCollection.getByKey, 'locusUrl', url1);
|
|
2194
|
-
assert.calledWith(
|
|
2195
|
-
webex.meetings.meetingCollection.getByKey,
|
|
2196
|
-
'correlationId',
|
|
2197
|
-
'correlationId1'
|
|
2198
|
-
);
|
|
2199
|
-
});
|
|
2200
|
-
|
|
2201
|
-
it('check the calls when meeting found by key: sipUri', () => {
|
|
2202
|
-
mockGetByKey('sipUri');
|
|
2203
|
-
const result = webex.meetings.getCorrespondingMeetingByLocus({locus, locusUrl: url1});
|
|
2204
|
-
assert.deepEqual(result, mockReturnMeeting);
|
|
2205
|
-
assert.callCount(webex.meetings.meetingCollection.getByKey, 3);
|
|
2206
|
-
assert.calledWith(webex.meetings.meetingCollection.getByKey, 'locusUrl', url1);
|
|
2207
|
-
assert.calledWith(
|
|
2208
|
-
webex.meetings.meetingCollection.getByKey,
|
|
2209
|
-
'correlationId',
|
|
2210
|
-
'correlationId1'
|
|
2211
|
-
);
|
|
2212
|
-
assert.calledWith(webex.meetings.meetingCollection.getByKey, 'sipUri', 'address1');
|
|
2213
|
-
});
|
|
2214
|
-
|
|
2215
|
-
it('check the calls when meeting found by key: conversationUrl', () => {
|
|
2216
|
-
mockGetByKey('conversationUrl');
|
|
2217
|
-
const result = webex.meetings.getCorrespondingMeetingByLocus({locus, locusUrl: url1});
|
|
2218
|
-
assert.deepEqual(result, mockReturnMeeting);
|
|
2219
|
-
assert.callCount(webex.meetings.meetingCollection.getByKey, 4);
|
|
2220
|
-
assert.calledWith(webex.meetings.meetingCollection.getByKey, 'locusUrl', url1);
|
|
2221
|
-
assert.calledWith(
|
|
2222
|
-
webex.meetings.meetingCollection.getByKey,
|
|
2223
|
-
'correlationId',
|
|
2224
|
-
'correlationId1'
|
|
2225
|
-
);
|
|
2226
|
-
assert.calledWith(webex.meetings.meetingCollection.getByKey, 'sipUri', 'address1');
|
|
2227
|
-
assert.calledWith(
|
|
2228
|
-
webex.meetings.meetingCollection.getByKey,
|
|
2229
|
-
'conversationUrl',
|
|
2230
|
-
'conversationUrl1'
|
|
2231
|
-
);
|
|
2232
|
-
});
|
|
2233
|
-
|
|
2234
|
-
it('check the calls when meeting found by key: meetingNumber', () => {
|
|
2235
|
-
mockGetByKey('meetingNumber');
|
|
2236
|
-
const result = webex.meetings.getCorrespondingMeetingByLocus({locus, locusUrl: url1});
|
|
2237
|
-
assert.deepEqual(result, mockReturnMeeting);
|
|
2238
|
-
assert.callCount(webex.meetings.meetingCollection.getByKey, 5);
|
|
2239
|
-
assert.calledWith(webex.meetings.meetingCollection.getByKey, 'locusUrl', url1);
|
|
2240
|
-
assert.calledWith(
|
|
2241
|
-
webex.meetings.meetingCollection.getByKey,
|
|
2242
|
-
'correlationId',
|
|
2243
|
-
'correlationId1'
|
|
2244
|
-
);
|
|
2245
|
-
assert.calledWith(webex.meetings.meetingCollection.getByKey, 'sipUri', 'address1');
|
|
2246
|
-
assert.calledWith(
|
|
2247
|
-
webex.meetings.meetingCollection.getByKey,
|
|
2248
|
-
'conversationUrl',
|
|
2249
|
-
'conversationUrl1'
|
|
2250
|
-
);
|
|
2251
|
-
assert.calledWith(webex.meetings.meetingCollection.getByKey, 'meetingNumber', '123456');
|
|
2252
|
-
});
|
|
2253
|
-
});
|
|
2254
|
-
|
|
2255
|
-
describe('#sortLocusArrayToUpdate', () => {
|
|
2256
|
-
let lociArray;
|
|
2257
|
-
let mainLocus;
|
|
2258
|
-
let breakoutLocus;
|
|
2259
|
-
beforeEach(() => {
|
|
2260
|
-
mainLocus = {
|
|
2261
|
-
url: 'mainUrl1',
|
|
2262
|
-
controls: {
|
|
2263
|
-
breakout: {
|
|
2264
|
-
sessionType: 'MAIN',
|
|
2265
|
-
url: 'breakoutUnifiedUrl1',
|
|
2266
|
-
},
|
|
2267
|
-
},
|
|
2268
|
-
};
|
|
2269
|
-
breakoutLocus = {
|
|
2270
|
-
url: 'breakoutUrl1',
|
|
2271
|
-
controls: {
|
|
2272
|
-
breakout: {
|
|
2273
|
-
sessionType: 'BREAKOUT',
|
|
2274
|
-
url: 'breakoutUnifiedUrl1',
|
|
2275
|
-
},
|
|
2276
|
-
},
|
|
2277
|
-
};
|
|
2278
|
-
lociArray = [mainLocus, breakoutLocus];
|
|
2279
|
-
|
|
2280
|
-
sinon.stub(MeetingsUtil, 'isValidBreakoutLocus').callsFake((locus) => {
|
|
2281
|
-
return locus.url === 'breakoutUrl1';
|
|
2282
|
-
});
|
|
2283
|
-
});
|
|
2284
|
-
afterEach(() => {
|
|
2285
|
-
sinon.restore();
|
|
2286
|
-
});
|
|
2287
|
-
|
|
2288
|
-
it('if both main and breakout locus is in array for non-exist meeting, return main locus to create first', () => {
|
|
2289
|
-
webex.meetings.meetingCollection.getByKey = sinon.stub().returns(undefined);
|
|
2290
|
-
const result = webex.meetings.sortLocusArrayToUpdate(lociArray);
|
|
2291
|
-
assert.deepEqual(result, [mainLocus]);
|
|
2292
|
-
assert.deepEqual(webex.meetings.breakoutLocusForHandleLater, [breakoutLocus]);
|
|
2293
|
-
});
|
|
2294
|
-
|
|
2295
|
-
it('if both main and breakout locus is in array for an exist meeting, return all locus', () => {
|
|
2296
|
-
webex.meetings.meetingCollection.getByKey = sinon.stub().returns({});
|
|
2297
|
-
const result = webex.meetings.sortLocusArrayToUpdate(lociArray);
|
|
2298
|
-
assert.deepEqual(result, [mainLocus, breakoutLocus]);
|
|
2299
|
-
assert.deepEqual(webex.meetings.breakoutLocusForHandleLater, []);
|
|
2300
|
-
});
|
|
2301
|
-
|
|
2302
|
-
it('if the breakout locus has no associated main locus, return all', () => {
|
|
2303
|
-
webex.meetings.meetingCollection.getByKey = sinon.stub().returns({});
|
|
2304
|
-
breakoutLocus.controls.breakout.url = 'testUrl';
|
|
2305
|
-
const result = webex.meetings.sortLocusArrayToUpdate(lociArray);
|
|
2306
|
-
assert.deepEqual(result, [mainLocus, breakoutLocus]);
|
|
2307
|
-
});
|
|
2308
|
-
});
|
|
2309
|
-
|
|
2310
|
-
describe('#checkHandleBreakoutLocus', () => {
|
|
2311
|
-
let breakoutLocus;
|
|
2312
|
-
beforeEach(() => {
|
|
2313
|
-
breakoutLocus = {
|
|
2314
|
-
url: 'breakoutUrl1',
|
|
2315
|
-
controls: {
|
|
2316
|
-
breakout: {
|
|
2317
|
-
sessionType: 'BREAKOUT',
|
|
2318
|
-
url: 'breakoutUnifiedUrl1',
|
|
2319
|
-
},
|
|
2320
|
-
},
|
|
2321
|
-
};
|
|
2322
|
-
|
|
2323
|
-
webex.meetings.handleLocusEvent = sinon.stub();
|
|
2324
|
-
});
|
|
2325
|
-
afterEach(() => {
|
|
2326
|
-
sinon.restore();
|
|
2327
|
-
});
|
|
2328
|
-
it('do nothing if new created locus is null/no cached breakouts for updating', () => {
|
|
2329
|
-
webex.meetings.checkHandleBreakoutLocus(null);
|
|
2330
|
-
webex.meetings.breakoutLocusForHandleLater = null;
|
|
2331
|
-
webex.meetings.checkHandleBreakoutLocus({});
|
|
2332
|
-
webex.meetings.breakoutLocusForHandleLater = [];
|
|
2333
|
-
webex.meetings.checkHandleBreakoutLocus({});
|
|
2334
|
-
assert.notCalled(webex.meetings.handleLocusEvent);
|
|
2335
|
-
});
|
|
2336
|
-
|
|
2337
|
-
it('do nothing if new created locus is breakout locus', () => {
|
|
2338
|
-
webex.meetings.breakoutLocusForHandleLater = [breakoutLocus];
|
|
2339
|
-
webex.meetings.checkHandleBreakoutLocus(breakoutLocus);
|
|
2340
|
-
assert.notCalled(webex.meetings.handleLocusEvent);
|
|
2341
|
-
});
|
|
2342
|
-
|
|
2343
|
-
it('do nothing if no cached locus is associated with the new created locus', () => {
|
|
2344
|
-
webex.meetings.breakoutLocusForHandleLater = [breakoutLocus];
|
|
2345
|
-
webex.meetings.checkHandleBreakoutLocus({
|
|
2346
|
-
controls: {
|
|
2347
|
-
breakout: {
|
|
2348
|
-
sessionType: 'MAIN',
|
|
2349
|
-
url: 'breakoutUnifiedUrl2',
|
|
2350
|
-
},
|
|
2351
|
-
},
|
|
2352
|
-
});
|
|
2353
|
-
assert.notCalled(webex.meetings.handleLocusEvent);
|
|
2354
|
-
});
|
|
2355
|
-
|
|
2356
|
-
it('update the cached breakout locus which associate the new created locus', () => {
|
|
2357
|
-
webex.meetings.breakoutLocusForHandleLater = [breakoutLocus];
|
|
2358
|
-
webex.meetings.checkHandleBreakoutLocus({
|
|
2359
|
-
controls: {
|
|
2360
|
-
breakout: {
|
|
2361
|
-
sessionType: 'MAIN',
|
|
2362
|
-
url: 'breakoutUnifiedUrl1',
|
|
2363
|
-
},
|
|
2364
|
-
},
|
|
2365
|
-
});
|
|
2366
|
-
assert.calledWith(webex.meetings.handleLocusEvent, {
|
|
2367
|
-
locus: breakoutLocus,
|
|
2368
|
-
locusUrl: breakoutLocus.url,
|
|
2369
|
-
});
|
|
2370
|
-
});
|
|
2371
|
-
});
|
|
2372
|
-
|
|
2373
|
-
describe('uploading of logs', () => {
|
|
2374
|
-
let metricsSpy;
|
|
2375
|
-
let meeting;
|
|
2376
|
-
|
|
2377
|
-
beforeEach(async () => {
|
|
2378
|
-
webex.meetings.config.autoUploadLogs = true;
|
|
2379
|
-
webex.meetings.loggerRequest.uploadLogs = sinon.stub().resolves();
|
|
2380
|
-
|
|
2381
|
-
sinon.stub(webex.meetings.meetingInfo, 'fetchInfoOptions').resolves({});
|
|
2382
|
-
sinon.stub(webex.meetings.meetingInfo, 'fetchMeetingInfo').resolves({});
|
|
2383
|
-
|
|
2384
|
-
triggerProxyStub.restore();
|
|
2385
|
-
|
|
2386
|
-
metricsSpy = sinon.stub(Metrics, 'sendBehavioralMetric');
|
|
2387
|
-
|
|
2388
|
-
meeting = await webex.meetings.create('test');
|
|
2389
|
-
|
|
2390
|
-
meeting.locusId = 'locus id';
|
|
2391
|
-
meeting.correlationId = 'correlation id';
|
|
2392
|
-
meeting.locusInfo = {
|
|
2393
|
-
fullState: {lastActive: 'last active', sessionId: 'locus session id'},
|
|
2394
|
-
info: {webExMeetingId: 'meeting id'},
|
|
2395
|
-
};
|
|
2396
|
-
});
|
|
2397
|
-
|
|
2398
|
-
afterEach(() => {
|
|
2399
|
-
sinon.restore();
|
|
2400
|
-
});
|
|
2401
|
-
|
|
2402
|
-
it('sends metrics on success', async () => {
|
|
2403
|
-
await meeting.uploadLogs();
|
|
2404
|
-
|
|
2405
|
-
await testUtils.flushPromises();
|
|
2406
|
-
|
|
2407
|
-
assert.calledOnceWithExactly(metricsSpy, 'js_sdk_upload_logs_success', {
|
|
2408
|
-
callStart: 'last active',
|
|
2409
|
-
correlationId: 'correlation id',
|
|
2410
|
-
feedbackId: 'correlation id',
|
|
2411
|
-
locusId: 'locus id',
|
|
2412
|
-
meetingId: 'meeting id',
|
|
2413
|
-
autoupload: true,
|
|
2414
|
-
locussessionid: 'locus session id',
|
|
2415
|
-
});
|
|
2416
|
-
});
|
|
2417
|
-
|
|
2418
|
-
it('sends metrics on failure', async () => {
|
|
2419
|
-
webex.meetings.loggerRequest.uploadLogs.rejects(new Error('fake error'));
|
|
2420
|
-
|
|
2421
|
-
await meeting.uploadLogs();
|
|
2422
|
-
|
|
2423
|
-
await testUtils.flushPromises();
|
|
2424
|
-
|
|
2425
|
-
assert.calledOnceWithExactly(
|
|
2426
|
-
metricsSpy,
|
|
2427
|
-
'js_sdk_upload_logs_failure',
|
|
2428
|
-
sinon.match({
|
|
2429
|
-
callStart: 'last active',
|
|
2430
|
-
correlationId: 'correlation id',
|
|
2431
|
-
feedbackId: 'correlation id',
|
|
2432
|
-
locusId: 'locus id',
|
|
2433
|
-
meetingId: 'meeting id',
|
|
2434
|
-
reason: 'fake error',
|
|
2435
|
-
autoupload: true,
|
|
2436
|
-
locussessionid: 'locus session id',
|
|
2437
|
-
})
|
|
2438
|
-
);
|
|
2439
|
-
});
|
|
2440
|
-
});
|
|
2441
1374
|
});
|
|
2442
1375
|
});
|