@webex/plugin-meetings 2.60.1-next.9 → 2.60.2
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 -58
- 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 -6
- package/dist/config.js +10 -8
- package/dist/config.js.map +1 -1
- package/dist/constants.d.ts +100 -234
- package/dist/constants.js +444 -433
- 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 +5 -121
- 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 +520 -705
- package/dist/meeting/index.js +3083 -5041
- 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 -304
- 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 -118
- package/dist/meeting/util.js +435 -676
- 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 +20 -114
- package/dist/meetings/index.js +133 -540
- 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 +95 -61
- package/dist/reachability/index.js +392 -304
- 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 +232 -285
- 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 +238 -100
- 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 -50
- package/dist/statsAnalyzer/index.js +511 -436
- package/dist/statsAnalyzer/index.js.map +1 -1
- package/dist/statsAnalyzer/mqaUtil.d.ts +6 -8
- package/dist/statsAnalyzer/mqaUtil.js +90 -130
- 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 -39
- 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 -6
- package/src/constants.ts +100 -265
- 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 -450
- 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 +2581 -4306
- package/src/meeting/muteState.ts +138 -224
- package/src/meeting/request.ts +127 -214
- package/src/meeting/util.ts +423 -687
- 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 +136 -531
- 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 +347 -246
- 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 -96
- 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 +645 -479
- package/src/statsAnalyzer/mqaUtil.ts +126 -128
- 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 -1437
- 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 +2313 -8384
- package/test/unit/spec/meeting/muteState.js +213 -409
- package/test/unit/spec/meeting/request.js +43 -523
- package/test/unit/spec/meeting/utils.js +24 -834
- 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 +232 -1445
- 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 -532
- package/test/unit/spec/reconnection-manager/index.js +24 -163
- 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 +77 -187
- 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 +165 -644
- 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/interceptors/index.d.ts +0 -2
- package/dist/interceptors/index.js +0 -15
- package/dist/interceptors/index.js.map +0 -1
- package/dist/interceptors/locusRetry.d.ts +0 -27
- package/dist/interceptors/locusRetry.js +0 -94
- package/dist/interceptors/locusRetry.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/meeting/voicea-meeting.d.ts +0 -20
- package/dist/meeting/voicea-meeting.js +0 -201
- package/dist/meeting/voicea-meeting.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/reachability/clusterReachability.d.ts +0 -109
- package/dist/reachability/clusterReachability.js +0 -357
- package/dist/reachability/clusterReachability.js.map +0 -1
- package/dist/reachability/util.d.ts +0 -8
- package/dist/reachability/util.js +0 -29
- package/dist/reachability/util.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 -44
- package/src/interceptors/index.ts +0 -3
- package/src/interceptors/locusRetry.ts +0 -67
- 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/meeting/voicea-meeting.ts +0 -161
- 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/reachability/clusterReachability.ts +0 -320
- package/src/reachability/util.ts +0 -24
- 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/interceptors/locusRetry.ts +0 -131
- 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/clusterReachability.ts +0 -279
- package/test/unit/spec/reachability/request.js +0 -68
- package/test/unit/spec/reachability/util.ts +0 -40
- package/test/unit/spec/roap/request.ts +0 -255
- 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,16 +11,15 @@ 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';
|
|
20
|
-
import
|
|
15
|
+
import MediaUtil from '@webex/plugin-meetings/src/media/util';
|
|
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';
|
|
23
19
|
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,
|
|
@@ -119,6 +101,11 @@ describe('plugin-meetings', () => {
|
|
|
119
101
|
|
|
120
102
|
Object.assign(webex, {
|
|
121
103
|
logger,
|
|
104
|
+
people: {
|
|
105
|
+
_getMe: sinon.stub().resolves({
|
|
106
|
+
type: 'validuser',
|
|
107
|
+
}),
|
|
108
|
+
}
|
|
122
109
|
});
|
|
123
110
|
|
|
124
111
|
Object.assign(webex.meetings, {
|
|
@@ -126,7 +113,6 @@ describe('plugin-meetings', () => {
|
|
|
126
113
|
});
|
|
127
114
|
|
|
128
115
|
Object.assign(webex.internal, {
|
|
129
|
-
llm: {on: sinon.stub()},
|
|
130
116
|
device: {
|
|
131
117
|
deviceType: 'FAKE_DEVICE',
|
|
132
118
|
register: sinon.stub().returns(Promise.resolve()),
|
|
@@ -170,10 +156,6 @@ describe('plugin-meetings', () => {
|
|
|
170
156
|
webex.emit('ready');
|
|
171
157
|
});
|
|
172
158
|
|
|
173
|
-
afterEach(() => {
|
|
174
|
-
sinon.restore();
|
|
175
|
-
});
|
|
176
|
-
|
|
177
159
|
it('has a webex instance with a meetings property', () => {
|
|
178
160
|
assert.exists(webex, 'webex was initialized with children');
|
|
179
161
|
assert.exists(webex.meetings, 'meetings child was set up on the webex instance');
|
|
@@ -240,15 +222,30 @@ describe('plugin-meetings', () => {
|
|
|
240
222
|
});
|
|
241
223
|
});
|
|
242
224
|
|
|
243
|
-
describe('#
|
|
244
|
-
it('should have
|
|
245
|
-
assert.equal(typeof webex.meetings.
|
|
225
|
+
describe('#_toggleTurnDiscovery', () => {
|
|
226
|
+
it('should have toggleAdhocMeetings', () => {
|
|
227
|
+
assert.equal(typeof webex.meetings._toggleTurnDiscovery, 'function');
|
|
246
228
|
});
|
|
247
229
|
|
|
248
230
|
describe('success', () => {
|
|
249
|
-
it('should update meetings to do
|
|
250
|
-
webex.meetings.
|
|
251
|
-
assert.equal(webex.meetings.config.experimental.
|
|
231
|
+
it('should update meetings to do TURN discovery', () => {
|
|
232
|
+
webex.meetings._toggleTurnDiscovery(true);
|
|
233
|
+
assert.equal(webex.meetings.config.experimental.enableTurnDiscovery, true);
|
|
234
|
+
|
|
235
|
+
webex.meetings._toggleTurnDiscovery(false);
|
|
236
|
+
assert.equal(webex.meetings.config.experimental.enableTurnDiscovery, false);
|
|
237
|
+
});
|
|
238
|
+
});
|
|
239
|
+
|
|
240
|
+
describe('failure', () => {
|
|
241
|
+
it('should not accept non boolean input', () => {
|
|
242
|
+
const currentEnableTurnDiscovery = webex.meetings.config.experimental.enableTurnDiscovery;
|
|
243
|
+
|
|
244
|
+
webex.meetings._toggleTurnDiscovery('test');
|
|
245
|
+
assert.equal(
|
|
246
|
+
webex.meetings.config.experimental.enableAdhocMeetings,
|
|
247
|
+
currentEnableTurnDiscovery
|
|
248
|
+
);
|
|
252
249
|
});
|
|
253
250
|
});
|
|
254
251
|
});
|
|
@@ -346,110 +343,37 @@ describe('plugin-meetings', () => {
|
|
|
346
343
|
});
|
|
347
344
|
});
|
|
348
345
|
|
|
349
|
-
describe('virtual background effect', () => {
|
|
350
|
-
beforeEach(() => {
|
|
351
|
-
webex.credentials = {
|
|
352
|
-
supertoken: {
|
|
353
|
-
access_token: 'fake_token',
|
|
354
|
-
},
|
|
355
|
-
};
|
|
356
|
-
});
|
|
357
|
-
|
|
358
|
-
it('creates background effect', async () => {
|
|
359
|
-
const result = await webex.meetings.createVirtualBackgroundEffect();
|
|
360
|
-
|
|
361
|
-
assert.exists(result);
|
|
362
|
-
assert.instanceOf(result, VirtualBackgroundEffect);
|
|
363
|
-
assert.containsAllKeys(result, ['loadModel', 'isEnabled', 'options']);
|
|
364
|
-
assert.deepEqual(result.options, {
|
|
365
|
-
mode: 'BLUR',
|
|
366
|
-
blurStrength: 'STRONG',
|
|
367
|
-
generator: 'worker',
|
|
368
|
-
quality: 'LOW',
|
|
369
|
-
authToken: 'fake_token',
|
|
370
|
-
mirror: false,
|
|
371
|
-
});
|
|
372
|
-
assert.exists(result.enable);
|
|
373
|
-
assert.exists(result.disable);
|
|
374
|
-
assert.exists(result.dispose);
|
|
375
|
-
});
|
|
376
|
-
|
|
377
|
-
it('creates background effect with custom options passed', async () => {
|
|
378
|
-
const effectOptions = {
|
|
379
|
-
generator: 'local',
|
|
380
|
-
frameRate: 45,
|
|
381
|
-
mode: 'IMAGE',
|
|
382
|
-
mirror: false,
|
|
383
|
-
quality: 'HIGH',
|
|
384
|
-
blurStrength: 'STRONG',
|
|
385
|
-
bgImageUrl: 'https://test.webex.com/landscape.5a535788.jpg',
|
|
386
|
-
};
|
|
387
|
-
|
|
388
|
-
const result = await webex.meetings.createVirtualBackgroundEffect(effectOptions);
|
|
389
|
-
|
|
390
|
-
assert.exists(result);
|
|
391
|
-
assert.instanceOf(result, VirtualBackgroundEffect);
|
|
392
|
-
assert.containsAllKeys(result, ['loadModel', 'isEnabled', 'options']);
|
|
393
|
-
assert.deepEqual(result.options, {...effectOptions, authToken: 'fake_token'});
|
|
394
|
-
assert.exists(result.enable);
|
|
395
|
-
assert.exists(result.disable);
|
|
396
|
-
assert.exists(result.dispose);
|
|
397
|
-
});
|
|
398
|
-
});
|
|
399
|
-
|
|
400
|
-
describe('noise reduction effect', () => {
|
|
401
|
-
beforeEach(() => {
|
|
402
|
-
webex.credentials = {
|
|
403
|
-
supertoken: {
|
|
404
|
-
access_token: 'fake_token',
|
|
405
|
-
},
|
|
406
|
-
};
|
|
407
|
-
});
|
|
408
|
-
|
|
409
|
-
it('creates noise reduction effect', async () => {
|
|
410
|
-
const result = await webex.meetings.createNoiseReductionEffect({audioContext: {}});
|
|
411
|
-
|
|
412
|
-
assert.exists(result);
|
|
413
|
-
assert.instanceOf(result, NoiseReductionEffect);
|
|
414
|
-
assert.containsAllKeys(result, ['audioContext', 'isEnabled', 'isReady', 'options']);
|
|
415
|
-
assert.deepEqual(result.options, {
|
|
416
|
-
authToken: 'fake_token',
|
|
417
|
-
audioContext: {},
|
|
418
|
-
});
|
|
419
|
-
assert.exists(result.enable);
|
|
420
|
-
assert.exists(result.disable);
|
|
421
|
-
assert.exists(result.dispose);
|
|
422
|
-
});
|
|
423
|
-
|
|
424
|
-
it('creates noise reduction effect with custom options passed', async () => {
|
|
425
|
-
const effectOptions = {
|
|
426
|
-
audioContext: {},
|
|
427
|
-
mode: 'WORKLET',
|
|
428
|
-
env: 'prod',
|
|
429
|
-
};
|
|
430
|
-
|
|
431
|
-
const result = await webex.meetings.createNoiseReductionEffect(effectOptions);
|
|
432
|
-
|
|
433
|
-
assert.exists(result);
|
|
434
|
-
assert.instanceOf(result, NoiseReductionEffect);
|
|
435
|
-
assert.containsAllKeys(result, ['audioContext', 'isEnabled', 'isReady', 'options']);
|
|
436
|
-
assert.deepEqual(result.options, {...effectOptions, authToken: 'fake_token'});
|
|
437
|
-
assert.exists(result.enable);
|
|
438
|
-
assert.exists(result.disable);
|
|
439
|
-
assert.exists(result.dispose);
|
|
440
|
-
});
|
|
441
|
-
});
|
|
442
|
-
|
|
443
346
|
describe('gets', () => {
|
|
444
347
|
describe('#getReachability', () => {
|
|
445
348
|
it('should have #getReachability', () => {
|
|
446
349
|
assert.exists(webex.meetings.getReachability);
|
|
447
350
|
});
|
|
448
|
-
|
|
449
|
-
|
|
351
|
+
describe('before #setReachability', () => {
|
|
352
|
+
it('does not get a reachability instance', () => {
|
|
353
|
+
const reachability = webex.meetings.getReachability();
|
|
354
|
+
|
|
355
|
+
assert.notExists(
|
|
356
|
+
reachability,
|
|
357
|
+
'reachability is undefined because #setReachability has not been called'
|
|
358
|
+
);
|
|
359
|
+
});
|
|
360
|
+
});
|
|
361
|
+
describe('after #setReachability', () => {
|
|
362
|
+
beforeEach(() => {
|
|
363
|
+
webex.meetings.setReachability();
|
|
364
|
+
const reachabilityMocker = webex.meetings.getReachability();
|
|
365
|
+
|
|
366
|
+
sinon.stub(reachabilityMocker, 'gatherReachability').returns(true);
|
|
367
|
+
});
|
|
368
|
+
it('gets the reachability data instance from webex.meetings', () => {
|
|
369
|
+
const reachability = webex.meetings.getReachability();
|
|
450
370
|
|
|
451
|
-
|
|
452
|
-
|
|
371
|
+
assert.exists(
|
|
372
|
+
reachability,
|
|
373
|
+
'reachability is defined because #setReachability has been called'
|
|
374
|
+
);
|
|
375
|
+
assert.instanceOf(reachability, Reachability, 'should be a reachability instance');
|
|
376
|
+
});
|
|
453
377
|
});
|
|
454
378
|
});
|
|
455
379
|
describe('#getPersonalMeetingRoom', () => {
|
|
@@ -524,16 +448,21 @@ describe('plugin-meetings', () => {
|
|
|
524
448
|
);
|
|
525
449
|
});
|
|
526
450
|
describe('when meeting is returned', () => {
|
|
451
|
+
let parse;
|
|
452
|
+
|
|
527
453
|
beforeEach(() => {
|
|
454
|
+
parse = sinon.stub().returns(true);
|
|
528
455
|
webex.meetings.meetingCollection.getByKey = sinon.stub().returns({
|
|
529
|
-
locusInfo
|
|
456
|
+
locusInfo: {
|
|
457
|
+
parse,
|
|
458
|
+
},
|
|
530
459
|
});
|
|
531
460
|
});
|
|
532
461
|
it('tests the sync meeting calls for existing meeting', async () => {
|
|
533
462
|
await webex.meetings.syncMeetings();
|
|
534
463
|
assert.calledOnce(webex.meetings.request.getActiveMeetings);
|
|
535
464
|
assert.calledOnce(webex.meetings.meetingCollection.getByKey);
|
|
536
|
-
assert.calledOnce(
|
|
465
|
+
assert.calledOnce(parse);
|
|
537
466
|
assert.calledWith(webex.meetings.meetingCollection.getByKey, 'locusUrl', url1);
|
|
538
467
|
});
|
|
539
468
|
});
|
|
@@ -546,7 +475,6 @@ describe('plugin-meetings', () => {
|
|
|
546
475
|
webex.meetings.create = sinon.stub().returns(
|
|
547
476
|
Promise.resolve({
|
|
548
477
|
locusInfo: {
|
|
549
|
-
...locusInfo,
|
|
550
478
|
initialSetup,
|
|
551
479
|
},
|
|
552
480
|
})
|
|
@@ -555,7 +483,7 @@ describe('plugin-meetings', () => {
|
|
|
555
483
|
it('tests the sync meeting calls for not existing meeting', async () => {
|
|
556
484
|
await webex.meetings.syncMeetings();
|
|
557
485
|
assert.calledOnce(webex.meetings.request.getActiveMeetings);
|
|
558
|
-
assert.callCount(webex.meetings.meetingCollection.getByKey,
|
|
486
|
+
assert.callCount(webex.meetings.meetingCollection.getByKey, 4);
|
|
559
487
|
assert.calledOnce(initialSetup);
|
|
560
488
|
assert.calledOnce(webex.meetings.create);
|
|
561
489
|
assert.calledWith(webex.meetings.request.getActiveMeetings);
|
|
@@ -572,71 +500,46 @@ describe('plugin-meetings', () => {
|
|
|
572
500
|
});
|
|
573
501
|
});
|
|
574
502
|
});
|
|
575
|
-
describe('
|
|
503
|
+
describe('destory non active meeting', () => {
|
|
504
|
+
let initialSetup;
|
|
505
|
+
let parse;
|
|
576
506
|
let destroySpy;
|
|
577
507
|
|
|
578
|
-
const meetingCollectionMeetings = {
|
|
579
|
-
stillValidLocusMeeting: {
|
|
580
|
-
locusUrl: 'still-valid-locus-url',
|
|
581
|
-
sendCallAnalyzerMetrics: sinon.stub(),
|
|
582
|
-
},
|
|
583
|
-
noLongerValidLocusMeeting: {
|
|
584
|
-
locusUrl: 'no-longer-valid-locus-url',
|
|
585
|
-
sendCallAnalyzerMetrics: sinon.stub(),
|
|
586
|
-
},
|
|
587
|
-
otherNonLocusMeeting1: {
|
|
588
|
-
locusUrl: null,
|
|
589
|
-
sendCallAnalyzerMetrics: sinon.stub(),
|
|
590
|
-
},
|
|
591
|
-
otherNonLocusMeeting2: {
|
|
592
|
-
locusUrl: undefined,
|
|
593
|
-
sendCallAnalyzerMetrics: sinon.stub(),
|
|
594
|
-
},
|
|
595
|
-
};
|
|
596
|
-
|
|
597
508
|
beforeEach(() => {
|
|
598
509
|
destroySpy = sinon.spy(webex.meetings, 'destroy');
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
510
|
+
parse = sinon.stub().returns(true);
|
|
511
|
+
initialSetup = sinon.stub().returns(true);
|
|
512
|
+
webex.meetings.meetingCollection.getByKey = sinon.stub().returns({
|
|
513
|
+
locusInfo: {
|
|
514
|
+
parse,
|
|
515
|
+
},
|
|
516
|
+
sendCallAnalyzerMetrics: sinon.stub(),
|
|
517
|
+
});
|
|
518
|
+
webex.meetings.meetingCollection.getAll = sinon.stub().returns({
|
|
519
|
+
meetingutk: {
|
|
520
|
+
locusUrl: 'fdfdjfdhj',
|
|
521
|
+
sendCallAnalyzerMetrics: sinon.stub(),
|
|
522
|
+
},
|
|
523
|
+
});
|
|
524
|
+
webex.meetings.create = sinon.stub().returns(
|
|
525
|
+
Promise.resolve({
|
|
526
|
+
locusInfo: {
|
|
527
|
+
initialSetup,
|
|
528
|
+
},
|
|
529
|
+
sendCallAnalyzerMetrics: sinon.stub(),
|
|
530
|
+
})
|
|
531
|
+
);
|
|
602
532
|
webex.meetings.request.getActiveMeetings = sinon.stub().returns(
|
|
603
533
|
Promise.resolve({
|
|
604
|
-
loci: [
|
|
534
|
+
loci: [],
|
|
605
535
|
})
|
|
606
536
|
);
|
|
607
537
|
MeetingUtil.cleanUp = sinon.stub().returns(Promise.resolve());
|
|
608
538
|
});
|
|
609
|
-
|
|
610
|
-
it('destroy any meeting that has no active locus url if keepOnlyLocusMeetings is not defined', async () => {
|
|
539
|
+
it('destroy non active meetings', async () => {
|
|
611
540
|
await webex.meetings.syncMeetings();
|
|
612
541
|
assert.calledOnce(webex.meetings.request.getActiveMeetings);
|
|
613
|
-
assert.calledOnce(
|
|
614
|
-
assert.calledWith(destroySpy, meetingCollectionMeetings.noLongerValidLocusMeeting);
|
|
615
|
-
assert.calledWith(destroySpy, meetingCollectionMeetings.otherNonLocusMeeting1);
|
|
616
|
-
assert.calledWith(destroySpy, meetingCollectionMeetings.otherNonLocusMeeting2);
|
|
617
|
-
assert.callCount(destroySpy, 3);
|
|
618
|
-
|
|
619
|
-
assert.callCount(MeetingUtil.cleanUp, 3);
|
|
620
|
-
});
|
|
621
|
-
|
|
622
|
-
it('destroy any meeting that has no active locus url if keepOnlyLocusMeetings === true', async () => {
|
|
623
|
-
await webex.meetings.syncMeetings({keepOnlyLocusMeetings: true});
|
|
624
|
-
assert.calledOnce(webex.meetings.request.getActiveMeetings);
|
|
625
|
-
assert.calledOnce(webex.meetings.meetingCollection.getAll);
|
|
626
|
-
assert.calledWith(destroySpy, meetingCollectionMeetings.noLongerValidLocusMeeting);
|
|
627
|
-
assert.calledWith(destroySpy, meetingCollectionMeetings.otherNonLocusMeeting1);
|
|
628
|
-
assert.calledWith(destroySpy, meetingCollectionMeetings.otherNonLocusMeeting2);
|
|
629
|
-
assert.callCount(destroySpy, 3);
|
|
630
|
-
|
|
631
|
-
assert.callCount(MeetingUtil.cleanUp, 3);
|
|
632
|
-
});
|
|
633
|
-
|
|
634
|
-
it('destroy any LOCUS meetings that have no active locus url if keepOnlyLocusMeetings === false', async () => {
|
|
635
|
-
await webex.meetings.syncMeetings({keepOnlyLocusMeetings: false});
|
|
636
|
-
assert.calledOnce(webex.meetings.request.getActiveMeetings);
|
|
637
|
-
assert.calledOnce(webex.meetings.meetingCollection.getAll);
|
|
638
|
-
assert.calledWith(destroySpy, meetingCollectionMeetings.noLongerValidLocusMeeting);
|
|
639
|
-
assert.callCount(destroySpy, 1);
|
|
542
|
+
assert.calledOnce(destroySpy);
|
|
640
543
|
|
|
641
544
|
assert.calledOnce(MeetingUtil.cleanUp);
|
|
642
545
|
});
|
|
@@ -676,139 +579,14 @@ describe('plugin-meetings', () => {
|
|
|
676
579
|
});
|
|
677
580
|
});
|
|
678
581
|
|
|
679
|
-
const FAKE_USE_RANDOM_DELAY = true;
|
|
680
|
-
const correlationId = 'my-correlationId';
|
|
681
|
-
const callStateForMetrics = {
|
|
682
|
-
correlationId: 'my-correlationId2',
|
|
683
|
-
joinTrigger: 'my-join-trigger',
|
|
684
|
-
loginType: 'my-login-type',
|
|
685
|
-
};
|
|
686
|
-
|
|
687
|
-
it('should call setCallStateForMetrics on any pre-existing meeting', async () => {
|
|
688
|
-
const fakeMeeting = {setCallStateForMetrics: sinon.mock()};
|
|
689
|
-
webex.meetings.meetingCollection.getByKey = sinon.stub().returns(fakeMeeting);
|
|
690
|
-
await webex.meetings.create(
|
|
691
|
-
test1,
|
|
692
|
-
test2,
|
|
693
|
-
FAKE_USE_RANDOM_DELAY,
|
|
694
|
-
{},
|
|
695
|
-
correlationId,
|
|
696
|
-
true,
|
|
697
|
-
callStateForMetrics
|
|
698
|
-
);
|
|
699
|
-
assert.calledOnceWithExactly(fakeMeeting.setCallStateForMetrics, {
|
|
700
|
-
...callStateForMetrics,
|
|
701
|
-
correlationId,
|
|
702
|
-
});
|
|
703
|
-
});
|
|
704
|
-
|
|
705
|
-
const checkCallCreateMeeting = async (createParameters, createMeetingParameters) => {
|
|
706
|
-
const create = webex.meetings.create(...createParameters);
|
|
707
|
-
|
|
708
|
-
assert.exists(create.then);
|
|
709
|
-
await create;
|
|
710
|
-
assert.calledOnce(webex.meetings.createMeeting);
|
|
711
|
-
assert.calledWith(webex.meetings.createMeeting, ...createMeetingParameters);
|
|
712
|
-
};
|
|
713
|
-
|
|
714
582
|
it('calls createMeeting and returns its promise', async () => {
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
[test1, test2, FAKE_USE_RANDOM_DELAY, {}, {correlationId}, true]
|
|
718
|
-
);
|
|
719
|
-
});
|
|
720
|
-
|
|
721
|
-
it('calls createMeeting, pass the meeting info param and returns its promise', async () => {
|
|
722
|
-
const meetingInfo = {};
|
|
723
|
-
await checkCallCreateMeeting(
|
|
724
|
-
[test1, test2, FAKE_USE_RANDOM_DELAY, {}, correlationId, true, undefined, meetingInfo],
|
|
725
|
-
[test1, test2, FAKE_USE_RANDOM_DELAY, {}, {correlationId}, true, meetingInfo]
|
|
726
|
-
);
|
|
727
|
-
});
|
|
728
|
-
|
|
729
|
-
it('calls createMeeting, pass the meeting info and meetingLookupURL param and returns its promise', async () => {
|
|
730
|
-
const meetingInfo = {};
|
|
731
|
-
await checkCallCreateMeeting(
|
|
732
|
-
[
|
|
733
|
-
test1,
|
|
734
|
-
test2,
|
|
735
|
-
FAKE_USE_RANDOM_DELAY,
|
|
736
|
-
{},
|
|
737
|
-
correlationId,
|
|
738
|
-
true,
|
|
739
|
-
undefined,
|
|
740
|
-
meetingInfo,
|
|
741
|
-
'meetingLookupURL',
|
|
742
|
-
],
|
|
743
|
-
[
|
|
744
|
-
test1,
|
|
745
|
-
test2,
|
|
746
|
-
FAKE_USE_RANDOM_DELAY,
|
|
747
|
-
{},
|
|
748
|
-
{correlationId},
|
|
749
|
-
true,
|
|
750
|
-
meetingInfo,
|
|
751
|
-
'meetingLookupURL',
|
|
752
|
-
]
|
|
753
|
-
);
|
|
754
|
-
});
|
|
755
|
-
|
|
756
|
-
it('calls createMeeting when failOnMissingMeetinginfo is undefined and returns its promise', async () => {
|
|
757
|
-
await checkCallCreateMeeting(
|
|
758
|
-
[test1, test2, FAKE_USE_RANDOM_DELAY, {}, correlationId, undefined],
|
|
759
|
-
[test1, test2, FAKE_USE_RANDOM_DELAY, {}, {correlationId}, false]
|
|
760
|
-
);
|
|
761
|
-
});
|
|
762
|
-
|
|
763
|
-
it('calls createMeeting when failOnMissingMeetinginfo is false and returns its promise', async () => {
|
|
764
|
-
await checkCallCreateMeeting(
|
|
765
|
-
[test1, test2, FAKE_USE_RANDOM_DELAY, {}, correlationId, false],
|
|
766
|
-
[test1, test2, FAKE_USE_RANDOM_DELAY, {}, {correlationId}, false]
|
|
767
|
-
);
|
|
768
|
-
});
|
|
769
|
-
|
|
770
|
-
it('calls createMeeting with callStateForMetrics and returns its promise', async () => {
|
|
771
|
-
await checkCallCreateMeeting(
|
|
772
|
-
[test1, test2, FAKE_USE_RANDOM_DELAY, {}, undefined, true, callStateForMetrics],
|
|
773
|
-
[test1, test2, FAKE_USE_RANDOM_DELAY, {}, callStateForMetrics, true]
|
|
774
|
-
);
|
|
775
|
-
});
|
|
776
|
-
|
|
777
|
-
it('calls createMeeting with callStateForMetrics overwritten with correlationId and returns its promise', async () => {
|
|
778
|
-
await checkCallCreateMeeting(
|
|
779
|
-
[test1, test2, FAKE_USE_RANDOM_DELAY, {}, correlationId, true, callStateForMetrics],
|
|
780
|
-
[test1, test2, FAKE_USE_RANDOM_DELAY, {}, {...callStateForMetrics, correlationId}, true]
|
|
781
|
-
);
|
|
782
|
-
});
|
|
783
|
-
|
|
784
|
-
it('calls createMeeting with extra info params and returns its promise', async () => {
|
|
785
|
-
const FAKE_USE_RANDOM_DELAY = false;
|
|
786
|
-
const correlationId = 'my-correlationId';
|
|
787
|
-
|
|
788
|
-
const FAKE_INFO_EXTRA_PARAMS = {
|
|
789
|
-
mtid: 'm9fe0afd8c435e892afcce9ea25b97046',
|
|
790
|
-
joinTXId: 'TSmrX61wNF',
|
|
791
|
-
};
|
|
792
|
-
const create = webex.meetings.create(
|
|
793
|
-
test1,
|
|
794
|
-
test2,
|
|
795
|
-
FAKE_USE_RANDOM_DELAY,
|
|
796
|
-
FAKE_INFO_EXTRA_PARAMS,
|
|
797
|
-
correlationId
|
|
798
|
-
);
|
|
583
|
+
const FAKE_USE_RANDOM_DELAY = true;
|
|
584
|
+
const create = webex.meetings.create(test1, test2, FAKE_USE_RANDOM_DELAY);
|
|
799
585
|
|
|
800
586
|
assert.exists(create.then);
|
|
801
587
|
await create;
|
|
802
588
|
assert.calledOnce(webex.meetings.createMeeting);
|
|
803
|
-
assert.calledWith(
|
|
804
|
-
webex.meetings.createMeeting,
|
|
805
|
-
test1,
|
|
806
|
-
test2,
|
|
807
|
-
FAKE_USE_RANDOM_DELAY,
|
|
808
|
-
FAKE_INFO_EXTRA_PARAMS,
|
|
809
|
-
{correlationId},
|
|
810
|
-
false
|
|
811
|
-
);
|
|
589
|
+
assert.calledWith(webex.meetings.createMeeting, test1, test2, FAKE_USE_RANDOM_DELAY);
|
|
812
590
|
});
|
|
813
591
|
|
|
814
592
|
it('creates a new meeting when a scheduled meeting exists in the conversation', async () => {
|
|
@@ -904,51 +682,45 @@ describe('plugin-meetings', () => {
|
|
|
904
682
|
});
|
|
905
683
|
describe('#handleLocusEvent', () => {
|
|
906
684
|
describe('there was a meeting', () => {
|
|
685
|
+
let parse;
|
|
686
|
+
|
|
907
687
|
beforeEach(() => {
|
|
688
|
+
parse = sinon.stub().returns(true);
|
|
908
689
|
webex.meetings.meetingCollection.getByKey = sinon.stub().returns({
|
|
909
|
-
locusInfo
|
|
690
|
+
locusInfo: {
|
|
691
|
+
parse,
|
|
692
|
+
},
|
|
910
693
|
});
|
|
911
694
|
});
|
|
912
|
-
it('should parse the meeting info
|
|
913
|
-
sinon.stub(MeetingsUtil, 'isBreakoutLocusDTO').returns(false);
|
|
695
|
+
it('should parse the meeting info', () => {
|
|
914
696
|
webex.meetings.handleLocusEvent({
|
|
915
697
|
locusUrl: url1,
|
|
916
698
|
});
|
|
917
699
|
assert.calledOnce(webex.meetings.meetingCollection.getByKey);
|
|
918
700
|
assert.calledWith(webex.meetings.meetingCollection.getByKey, 'locusUrl', url1);
|
|
919
|
-
assert.calledOnce(
|
|
920
|
-
assert.calledOnce(locusInfo.updateMainSessionLocusCache);
|
|
701
|
+
assert.calledOnce(parse);
|
|
921
702
|
assert.calledWith(
|
|
922
|
-
|
|
703
|
+
parse,
|
|
923
704
|
{
|
|
924
|
-
locusInfo
|
|
705
|
+
locusInfo: {
|
|
706
|
+
parse,
|
|
707
|
+
},
|
|
925
708
|
},
|
|
926
709
|
{
|
|
927
710
|
locusUrl: url1,
|
|
928
711
|
}
|
|
929
712
|
);
|
|
930
713
|
});
|
|
931
|
-
|
|
932
|
-
it('should not update main session locus cache', () => {
|
|
933
|
-
sinon.stub(MeetingsUtil, 'isBreakoutLocusDTO').returns(true);
|
|
934
|
-
webex.meetings.handleLocusEvent({
|
|
935
|
-
locusUrl: url1,
|
|
936
|
-
});
|
|
937
|
-
assert.notCalled(locusInfo.updateMainSessionLocusCache);
|
|
938
|
-
});
|
|
939
714
|
});
|
|
940
715
|
describe('there was not a meeting', () => {
|
|
941
716
|
let initialSetup;
|
|
942
|
-
const webExMeetingId = '123456';
|
|
943
717
|
|
|
944
718
|
beforeEach(() => {
|
|
945
719
|
initialSetup = sinon.stub().returns(true);
|
|
946
720
|
webex.meetings.meetingCollection.getByKey = sinon.stub().returns(undefined);
|
|
947
721
|
webex.meetings.create = sinon.stub().returns(
|
|
948
722
|
Promise.resolve({
|
|
949
|
-
id: 'meeting-id',
|
|
950
723
|
locusInfo: {
|
|
951
|
-
...locusInfo,
|
|
952
724
|
initialSetup,
|
|
953
725
|
},
|
|
954
726
|
})
|
|
@@ -968,20 +740,12 @@ describe('plugin-meetings', () => {
|
|
|
968
740
|
callbackAddress: uri1,
|
|
969
741
|
},
|
|
970
742
|
},
|
|
971
|
-
info: {
|
|
972
|
-
webExMeetingId,
|
|
973
|
-
},
|
|
974
743
|
},
|
|
975
744
|
eventType: 'locus.difference',
|
|
976
745
|
locusUrl: url1,
|
|
977
746
|
});
|
|
978
|
-
assert.callCount(webex.meetings.meetingCollection.getByKey,
|
|
747
|
+
assert.callCount(webex.meetings.meetingCollection.getByKey, 5);
|
|
979
748
|
assert.calledWith(webex.meetings.meetingCollection.getByKey, 'locusUrl', url1);
|
|
980
|
-
assert.calledWith(
|
|
981
|
-
webex.meetings.meetingCollection.getByKey,
|
|
982
|
-
'meetingNumber',
|
|
983
|
-
webExMeetingId
|
|
984
|
-
);
|
|
985
749
|
assert.calledOnce(initialSetup);
|
|
986
750
|
assert.calledWith(initialSetup, {
|
|
987
751
|
id: uuid1,
|
|
@@ -995,9 +759,6 @@ describe('plugin-meetings', () => {
|
|
|
995
759
|
callbackAddress: uri1,
|
|
996
760
|
},
|
|
997
761
|
},
|
|
998
|
-
info: {
|
|
999
|
-
webExMeetingId,
|
|
1000
|
-
},
|
|
1001
762
|
});
|
|
1002
763
|
});
|
|
1003
764
|
it('should setup the meeting by difference event without replaces', async () => {
|
|
@@ -1009,20 +770,12 @@ describe('plugin-meetings', () => {
|
|
|
1009
770
|
callbackAddress: uri1,
|
|
1010
771
|
},
|
|
1011
772
|
},
|
|
1012
|
-
info: {
|
|
1013
|
-
webExMeetingId,
|
|
1014
|
-
},
|
|
1015
773
|
},
|
|
1016
774
|
eventType: 'locus.difference',
|
|
1017
775
|
locusUrl: url1,
|
|
1018
776
|
});
|
|
1019
|
-
assert.callCount(webex.meetings.meetingCollection.getByKey,
|
|
777
|
+
assert.callCount(webex.meetings.meetingCollection.getByKey, 4);
|
|
1020
778
|
assert.calledWith(webex.meetings.meetingCollection.getByKey, 'locusUrl', url1);
|
|
1021
|
-
assert.calledWith(
|
|
1022
|
-
webex.meetings.meetingCollection.getByKey,
|
|
1023
|
-
'meetingNumber',
|
|
1024
|
-
webExMeetingId
|
|
1025
|
-
);
|
|
1026
779
|
assert.calledOnce(initialSetup);
|
|
1027
780
|
assert.calledWith(initialSetup, {
|
|
1028
781
|
id: uuid1,
|
|
@@ -1031,44 +784,8 @@ describe('plugin-meetings', () => {
|
|
|
1031
784
|
callbackAddress: uri1,
|
|
1032
785
|
},
|
|
1033
786
|
},
|
|
1034
|
-
info: {
|
|
1035
|
-
webExMeetingId,
|
|
1036
|
-
},
|
|
1037
|
-
});
|
|
1038
|
-
});
|
|
1039
|
-
|
|
1040
|
-
it('sends client event correctly on finally', async () => {
|
|
1041
|
-
webex.meetings.getMeetingByType = sinon.stub().returns(true);
|
|
1042
|
-
|
|
1043
|
-
await webex.meetings.handleLocusEvent({
|
|
1044
|
-
locus: {
|
|
1045
|
-
id: uuid1,
|
|
1046
|
-
self: {
|
|
1047
|
-
callBackInfo: {
|
|
1048
|
-
callbackAddress: uri1,
|
|
1049
|
-
},
|
|
1050
|
-
},
|
|
1051
|
-
info: {
|
|
1052
|
-
webExMeetingId,
|
|
1053
|
-
},
|
|
1054
|
-
},
|
|
1055
|
-
eventType: 'locus.difference',
|
|
1056
|
-
locusUrl: url1,
|
|
1057
|
-
});
|
|
1058
|
-
|
|
1059
|
-
await testUtils.flushPromises();
|
|
1060
|
-
|
|
1061
|
-
assert.calledWith(webex.internal.newMetrics.submitClientEvent, {
|
|
1062
|
-
name: 'client.call.remote-started',
|
|
1063
|
-
payload: {
|
|
1064
|
-
trigger: 'mercury-event',
|
|
1065
|
-
},
|
|
1066
|
-
options: {
|
|
1067
|
-
meetingId: 'meeting-id',
|
|
1068
|
-
},
|
|
1069
787
|
});
|
|
1070
788
|
});
|
|
1071
|
-
|
|
1072
789
|
it('should setup the meeting by a not difference event', async () => {
|
|
1073
790
|
await webex.meetings.handleLocusEvent({
|
|
1074
791
|
locus: {
|
|
@@ -1078,20 +795,12 @@ describe('plugin-meetings', () => {
|
|
|
1078
795
|
callbackAddress: uri1,
|
|
1079
796
|
},
|
|
1080
797
|
},
|
|
1081
|
-
info: {
|
|
1082
|
-
webExMeetingId,
|
|
1083
|
-
},
|
|
1084
798
|
},
|
|
1085
799
|
eventType: test1,
|
|
1086
800
|
locusUrl: url1,
|
|
1087
801
|
});
|
|
1088
|
-
assert.callCount(webex.meetings.meetingCollection.getByKey,
|
|
802
|
+
assert.callCount(webex.meetings.meetingCollection.getByKey, 4);
|
|
1089
803
|
assert.calledWith(webex.meetings.meetingCollection.getByKey, 'locusUrl', url1);
|
|
1090
|
-
assert.calledWith(
|
|
1091
|
-
webex.meetings.meetingCollection.getByKey,
|
|
1092
|
-
'meetingNumber',
|
|
1093
|
-
webExMeetingId
|
|
1094
|
-
);
|
|
1095
804
|
assert.calledOnce(initialSetup);
|
|
1096
805
|
assert.calledWith(initialSetup, {
|
|
1097
806
|
id: uuid1,
|
|
@@ -1100,9 +809,6 @@ describe('plugin-meetings', () => {
|
|
|
1100
809
|
callbackAddress: uri1,
|
|
1101
810
|
},
|
|
1102
811
|
},
|
|
1103
|
-
info: {
|
|
1104
|
-
webExMeetingId,
|
|
1105
|
-
},
|
|
1106
812
|
});
|
|
1107
813
|
});
|
|
1108
814
|
|
|
@@ -1125,7 +831,7 @@ describe('plugin-meetings', () => {
|
|
|
1125
831
|
|
|
1126
832
|
it('should not try to match USM meetings by conversation url', async () => {
|
|
1127
833
|
await webex.meetings.handleLocusEvent(generateFakeLocusData(true));
|
|
1128
|
-
assert.callCount(webex.meetings.meetingCollection.getByKey,
|
|
834
|
+
assert.callCount(webex.meetings.meetingCollection.getByKey, 3);
|
|
1129
835
|
assert.deepEqual(webex.meetings.meetingCollection.getByKey.getCall(0).args, [
|
|
1130
836
|
'locusUrl',
|
|
1131
837
|
url1,
|
|
@@ -1142,7 +848,7 @@ describe('plugin-meetings', () => {
|
|
|
1142
848
|
});
|
|
1143
849
|
it('should try to match non-USM meetings by conversation url', async () => {
|
|
1144
850
|
await webex.meetings.handleLocusEvent(generateFakeLocusData(false));
|
|
1145
|
-
assert.callCount(webex.meetings.meetingCollection.getByKey,
|
|
851
|
+
assert.callCount(webex.meetings.meetingCollection.getByKey, 4);
|
|
1146
852
|
assert.deepEqual(webex.meetings.meetingCollection.getByKey.getCall(0).args, [
|
|
1147
853
|
'locusUrl',
|
|
1148
854
|
url1,
|
|
@@ -1165,6 +871,7 @@ describe('plugin-meetings', () => {
|
|
|
1165
871
|
});
|
|
1166
872
|
describe('#createMeeting', () => {
|
|
1167
873
|
beforeEach(() => {
|
|
874
|
+
MediaUtil.createPeerConnection = sinon.stub().returns(true);
|
|
1168
875
|
webex.internal.device.userId = uuid1;
|
|
1169
876
|
webex.internal.device.url = url1;
|
|
1170
877
|
MeetingCollection.set = sinon.stub().returns(true);
|
|
@@ -1173,10 +880,6 @@ describe('plugin-meetings', () => {
|
|
|
1173
880
|
});
|
|
1174
881
|
describe('successful MeetingInfo.#fetchMeetingInfo', () => {
|
|
1175
882
|
let clock, setTimeoutSpy, fakeMeetingStartTimeString, FAKE_TIME_TO_START;
|
|
1176
|
-
const FAKE_INFO_EXTRA_PARAMS = {
|
|
1177
|
-
mtid: 'm9fe0afd8c435e892afcce9ea25b97046',
|
|
1178
|
-
joinTXId: 'TSmrX61wNF',
|
|
1179
|
-
};
|
|
1180
883
|
|
|
1181
884
|
beforeEach(() => {
|
|
1182
885
|
clock = sinon.useFakeTimers();
|
|
@@ -1206,37 +909,13 @@ describe('plugin-meetings', () => {
|
|
|
1206
909
|
meeting,
|
|
1207
910
|
destination,
|
|
1208
911
|
type,
|
|
1209
|
-
|
|
1210
|
-
expectedMeetingData = {},
|
|
1211
|
-
sendCAevents = false,
|
|
1212
|
-
injectMeetingInfo = false
|
|
912
|
+
expectedMeetingData = {}
|
|
1213
913
|
) => {
|
|
1214
|
-
|
|
1215
|
-
assert.notCalled(webex.meetings.meetingInfo.fetchMeetingInfo);
|
|
1216
|
-
} else {
|
|
1217
|
-
assert.calledOnce(webex.meetings.meetingInfo.fetchMeetingInfo);
|
|
1218
|
-
}
|
|
1219
|
-
|
|
914
|
+
assert.calledOnce(webex.meetings.meetingInfo.fetchMeetingInfo);
|
|
1220
915
|
assert.calledOnce(MeetingsUtil.getMeetingAddedType);
|
|
1221
916
|
assert.notCalled(setTimeoutSpy);
|
|
1222
|
-
assert.
|
|
1223
|
-
|
|
1224
|
-
if (injectMeetingInfo) {
|
|
1225
|
-
assert.notCalled(webex.meetings.meetingInfo.fetchMeetingInfo);
|
|
1226
|
-
} else {
|
|
1227
|
-
assert.calledWith(
|
|
1228
|
-
webex.meetings.meetingInfo.fetchMeetingInfo,
|
|
1229
|
-
destination,
|
|
1230
|
-
type,
|
|
1231
|
-
null,
|
|
1232
|
-
null,
|
|
1233
|
-
undefined,
|
|
1234
|
-
undefined,
|
|
1235
|
-
extraParams,
|
|
1236
|
-
{meetingId: meeting.id, sendCAevents}
|
|
1237
|
-
);
|
|
1238
|
-
}
|
|
1239
|
-
|
|
917
|
+
assert.calledThrice(TriggerProxy.trigger);
|
|
918
|
+
assert.calledWith(webex.meetings.meetingInfo.fetchMeetingInfo, destination, type);
|
|
1240
919
|
assert.calledWith(MeetingsUtil.getMeetingAddedType, 'test type');
|
|
1241
920
|
|
|
1242
921
|
if (expectedMeetingData.permissionToken) {
|
|
@@ -1245,21 +924,6 @@ describe('plugin-meetings', () => {
|
|
|
1245
924
|
if (expectedMeetingData.meetingJoinUrl) {
|
|
1246
925
|
assert.equal(meeting.meetingJoinUrl, expectedMeetingData.meetingJoinUrl);
|
|
1247
926
|
}
|
|
1248
|
-
if (expectedMeetingData.correlationId) {
|
|
1249
|
-
assert.equal(meeting.correlationId, expectedMeetingData.correlationId);
|
|
1250
|
-
}
|
|
1251
|
-
if (expectedMeetingData.callStateForMetrics) {
|
|
1252
|
-
assert.deepEqual(
|
|
1253
|
-
meeting.callStateForMetrics,
|
|
1254
|
-
expectedMeetingData.callStateForMetrics
|
|
1255
|
-
);
|
|
1256
|
-
}
|
|
1257
|
-
if (expectedMeetingData.meetingLookupUrl) {
|
|
1258
|
-
assert.equal(
|
|
1259
|
-
meeting.meetingInfo.meetingLookupUrl,
|
|
1260
|
-
expectedMeetingData.meetingLookupUrl
|
|
1261
|
-
);
|
|
1262
|
-
}
|
|
1263
927
|
assert.equal(meeting.destination, destination);
|
|
1264
928
|
assert.equal(meeting.destinationType, type);
|
|
1265
929
|
assert.calledWith(
|
|
@@ -1289,207 +953,107 @@ describe('plugin-meetings', () => {
|
|
|
1289
953
|
const expectedMeetingData = {
|
|
1290
954
|
permissionToken: 'PT',
|
|
1291
955
|
meetingJoinUrl: 'meetingJoinUrl',
|
|
1292
|
-
correlationId: meeting.id,
|
|
1293
956
|
};
|
|
1294
957
|
|
|
1295
|
-
checkCreateWithoutDelay(
|
|
1296
|
-
meeting,
|
|
1297
|
-
'test destination',
|
|
1298
|
-
'test type',
|
|
1299
|
-
{},
|
|
1300
|
-
expectedMeetingData
|
|
1301
|
-
);
|
|
958
|
+
checkCreateWithoutDelay(meeting, 'test destination', 'test type', expectedMeetingData);
|
|
1302
959
|
});
|
|
1303
960
|
|
|
1304
|
-
it('
|
|
1305
|
-
const
|
|
961
|
+
it('creates the meeting from a successful meeting info fetch meeting resolve testing', async () => {
|
|
962
|
+
const meeting = await webex.meetings.createMeeting('test destination', 'test type');
|
|
963
|
+
const expectedMeetingData = {
|
|
1306
964
|
permissionToken: 'PT',
|
|
1307
965
|
meetingJoinUrl: 'meetingJoinUrl',
|
|
1308
966
|
};
|
|
1309
967
|
|
|
1310
|
-
|
|
1311
|
-
'test destination',
|
|
1312
|
-
'test type',
|
|
1313
|
-
false,
|
|
1314
|
-
{},
|
|
1315
|
-
undefined,
|
|
1316
|
-
false,
|
|
1317
|
-
meetingInfo
|
|
1318
|
-
);
|
|
1319
|
-
|
|
1320
|
-
const expectedMeetingData = {
|
|
1321
|
-
...meetingInfo,
|
|
1322
|
-
correlationId: meeting.id,
|
|
1323
|
-
};
|
|
1324
|
-
|
|
1325
|
-
checkCreateWithoutDelay(
|
|
968
|
+
assert.instanceOf(
|
|
1326
969
|
meeting,
|
|
1327
|
-
|
|
1328
|
-
'
|
|
1329
|
-
{},
|
|
1330
|
-
expectedMeetingData,
|
|
1331
|
-
false,
|
|
1332
|
-
true
|
|
970
|
+
Meeting,
|
|
971
|
+
'createMeeting should eventually resolve to a Meeting Object'
|
|
1333
972
|
);
|
|
973
|
+
checkCreateWithoutDelay(meeting, 'test destination', 'test type', expectedMeetingData);
|
|
1334
974
|
});
|
|
1335
975
|
|
|
1336
|
-
it('
|
|
1337
|
-
const
|
|
1338
|
-
|
|
1339
|
-
|
|
976
|
+
it('creates the meeting from a successful meeting info fetch with random delay', async () => {
|
|
977
|
+
const FAKE_LOCUS_MEETING = {
|
|
978
|
+
conversationUrl: 'locusConvURL',
|
|
979
|
+
url: 'locusUrl',
|
|
980
|
+
info: {
|
|
981
|
+
webExMeetingId: 'locusMeetingId',
|
|
982
|
+
sipUri: 'locusSipUri',
|
|
983
|
+
owner: 'locusOwner',
|
|
984
|
+
},
|
|
985
|
+
meeting: {
|
|
986
|
+
startTime: fakeMeetingStartTimeString,
|
|
987
|
+
},
|
|
988
|
+
fullState: {
|
|
989
|
+
active: false,
|
|
990
|
+
},
|
|
1340
991
|
};
|
|
1341
992
|
|
|
1342
993
|
const meeting = await webex.meetings.createMeeting(
|
|
1343
|
-
|
|
994
|
+
FAKE_LOCUS_MEETING,
|
|
1344
995
|
'test type',
|
|
1345
|
-
|
|
1346
|
-
{},
|
|
1347
|
-
undefined,
|
|
1348
|
-
false,
|
|
1349
|
-
meetingInfo,
|
|
1350
|
-
'meetingLookupUrl'
|
|
996
|
+
true
|
|
1351
997
|
);
|
|
1352
998
|
|
|
1353
|
-
|
|
1354
|
-
...meetingInfo,
|
|
1355
|
-
meetingLookupUrl: 'meetingLookupUrl',
|
|
1356
|
-
correlationId: meeting.id,
|
|
1357
|
-
};
|
|
1358
|
-
|
|
1359
|
-
checkCreateWithoutDelay(
|
|
999
|
+
assert.instanceOf(
|
|
1360
1000
|
meeting,
|
|
1361
|
-
|
|
1362
|
-
'
|
|
1363
|
-
|
|
1364
|
-
|
|
1365
|
-
|
|
1366
|
-
|
|
1001
|
+
Meeting,
|
|
1002
|
+
'createMeeting should eventually resolve to a Meeting Object'
|
|
1003
|
+
);
|
|
1004
|
+
assert.notCalled(webex.meetings.meetingInfo.fetchMeetingInfo);
|
|
1005
|
+
assert.calledOnce(setTimeoutSpy);
|
|
1006
|
+
|
|
1007
|
+
// Parse meeting info with locus object
|
|
1008
|
+
assert.equal(meeting.conversationUrl, 'locusConvURL');
|
|
1009
|
+
assert.equal(meeting.locusUrl, 'locusUrl');
|
|
1010
|
+
assert.equal(meeting.sipUri, 'locusSipUri');
|
|
1011
|
+
assert.equal(meeting.meetingNumber, 'locusMeetingId');
|
|
1012
|
+
assert.isUndefined(meeting.meetingJoinUrl);
|
|
1013
|
+
assert.equal(meeting.owner, 'locusOwner');
|
|
1014
|
+
assert.isUndefined(meeting.permissionToken);
|
|
1015
|
+
|
|
1016
|
+
// Add meeting and send trigger
|
|
1017
|
+
assert.calledWith(MeetingsUtil.getMeetingAddedType, 'test type');
|
|
1018
|
+
assert.calledTwice(TriggerProxy.trigger);
|
|
1019
|
+
assert.calledWith(
|
|
1020
|
+
TriggerProxy.trigger,
|
|
1021
|
+
sinon.match.instanceOf(Meetings),
|
|
1022
|
+
{
|
|
1023
|
+
file: 'meetings',
|
|
1024
|
+
function: 'createMeeting',
|
|
1025
|
+
},
|
|
1026
|
+
'meeting:added',
|
|
1027
|
+
{
|
|
1028
|
+
meeting: sinon.match.instanceOf(Meeting),
|
|
1029
|
+
type: 'test meeting added type',
|
|
1030
|
+
}
|
|
1367
1031
|
);
|
|
1368
|
-
});
|
|
1369
|
-
|
|
1370
|
-
[undefined, FAKE_INFO_EXTRA_PARAMS].forEach((infoExtraParams) => {
|
|
1371
|
-
const infoExtraParamsProvided = infoExtraParams !== undefined;
|
|
1372
|
-
|
|
1373
|
-
it(`creates the meeting from a successful meeting info fetch meeting resolve testing${
|
|
1374
|
-
infoExtraParamsProvided ? ' with infoExtraParams' : ''
|
|
1375
|
-
}`, async () => {
|
|
1376
|
-
const meeting = await webex.meetings.createMeeting(
|
|
1377
|
-
'test destination',
|
|
1378
|
-
'test type',
|
|
1379
|
-
false,
|
|
1380
|
-
infoExtraParams
|
|
1381
|
-
);
|
|
1382
|
-
const expectedMeetingData = {
|
|
1383
|
-
permissionToken: 'PT',
|
|
1384
|
-
meetingJoinUrl: 'meetingJoinUrl',
|
|
1385
|
-
};
|
|
1386
|
-
|
|
1387
|
-
assert.instanceOf(
|
|
1388
|
-
meeting,
|
|
1389
|
-
Meeting,
|
|
1390
|
-
'createMeeting should eventually resolve to a Meeting Object'
|
|
1391
|
-
);
|
|
1392
|
-
checkCreateWithoutDelay(
|
|
1393
|
-
meeting,
|
|
1394
|
-
'test destination',
|
|
1395
|
-
'test type',
|
|
1396
|
-
infoExtraParamsProvided ? infoExtraParams : {},
|
|
1397
|
-
expectedMeetingData
|
|
1398
|
-
);
|
|
1399
|
-
});
|
|
1400
|
-
|
|
1401
|
-
it(`creates the meeting from a successful meeting info fetch with random delay${
|
|
1402
|
-
infoExtraParamsProvided ? ' with infoExtraParams' : ''
|
|
1403
|
-
}`, async () => {
|
|
1404
|
-
const FAKE_LOCUS_MEETING = {
|
|
1405
|
-
conversationUrl: 'locusConvURL',
|
|
1406
|
-
url: 'locusUrl',
|
|
1407
|
-
info: {
|
|
1408
|
-
webExMeetingId: 'locusMeetingId',
|
|
1409
|
-
sipUri: 'locusSipUri',
|
|
1410
|
-
owner: 'locusOwner',
|
|
1411
|
-
},
|
|
1412
|
-
meeting: {
|
|
1413
|
-
startTime: fakeMeetingStartTimeString,
|
|
1414
|
-
},
|
|
1415
|
-
fullState: {
|
|
1416
|
-
active: false,
|
|
1417
|
-
},
|
|
1418
|
-
};
|
|
1419
|
-
|
|
1420
|
-
const meeting = await webex.meetings.createMeeting(
|
|
1421
|
-
FAKE_LOCUS_MEETING,
|
|
1422
|
-
'test type',
|
|
1423
|
-
true,
|
|
1424
|
-
infoExtraParams
|
|
1425
|
-
);
|
|
1426
|
-
|
|
1427
|
-
assert.instanceOf(
|
|
1428
|
-
meeting,
|
|
1429
|
-
Meeting,
|
|
1430
|
-
'createMeeting should eventually resolve to a Meeting Object'
|
|
1431
|
-
);
|
|
1432
|
-
assert.notCalled(webex.meetings.meetingInfo.fetchMeetingInfo);
|
|
1433
|
-
assert.calledOnce(setTimeoutSpy);
|
|
1434
|
-
|
|
1435
|
-
// Parse meeting info with locus object
|
|
1436
|
-
assert.equal(meeting.conversationUrl, 'locusConvURL');
|
|
1437
|
-
assert.equal(meeting.locusUrl, 'locusUrl');
|
|
1438
|
-
assert.equal(meeting.sipUri, 'locusSipUri');
|
|
1439
|
-
assert.equal(meeting.meetingNumber, 'locusMeetingId');
|
|
1440
|
-
assert.isUndefined(meeting.meetingJoinUrl);
|
|
1441
|
-
assert.equal(meeting.owner, 'locusOwner');
|
|
1442
|
-
assert.isUndefined(meeting.permissionToken);
|
|
1443
|
-
|
|
1444
|
-
// Add meeting and send trigger
|
|
1445
|
-
assert.calledWith(MeetingsUtil.getMeetingAddedType, 'test type');
|
|
1446
|
-
assert.calledTwice(TriggerProxy.trigger);
|
|
1447
|
-
assert.calledWith(
|
|
1448
|
-
TriggerProxy.trigger,
|
|
1449
|
-
sinon.match.instanceOf(Meetings),
|
|
1450
|
-
{
|
|
1451
|
-
file: 'meetings',
|
|
1452
|
-
function: 'createMeeting',
|
|
1453
|
-
},
|
|
1454
|
-
'meeting:added',
|
|
1455
|
-
{
|
|
1456
|
-
meeting: sinon.match.instanceOf(Meeting),
|
|
1457
|
-
type: 'test meeting added type',
|
|
1458
|
-
}
|
|
1459
|
-
);
|
|
1460
|
-
|
|
1461
|
-
// When timer expires
|
|
1462
|
-
clock.tick(FAKE_TIME_TO_START);
|
|
1463
|
-
await testUtils.flushPromises();
|
|
1464
1032
|
|
|
1465
|
-
|
|
1466
|
-
|
|
1467
|
-
|
|
1468
|
-
|
|
1469
|
-
|
|
1470
|
-
|
|
1471
|
-
|
|
1472
|
-
undefined,
|
|
1473
|
-
infoExtraParamsProvided ? infoExtraParams : {}
|
|
1474
|
-
);
|
|
1033
|
+
// When timer expires
|
|
1034
|
+
clock.tick(FAKE_TIME_TO_START);
|
|
1035
|
+
assert.calledWith(
|
|
1036
|
+
webex.meetings.meetingInfo.fetchMeetingInfo,
|
|
1037
|
+
FAKE_LOCUS_MEETING,
|
|
1038
|
+
'test type'
|
|
1039
|
+
);
|
|
1475
1040
|
|
|
1476
|
-
|
|
1477
|
-
|
|
1478
|
-
|
|
1479
|
-
|
|
1480
|
-
|
|
1481
|
-
|
|
1482
|
-
|
|
1483
|
-
|
|
1484
|
-
|
|
1041
|
+
// Parse meeting info is called again with new meeting info
|
|
1042
|
+
await testUtils.flushPromises();
|
|
1043
|
+
assert.equal(meeting.conversationUrl, 'locusConvURL');
|
|
1044
|
+
assert.equal(meeting.locusUrl, 'locusUrl');
|
|
1045
|
+
assert.equal(meeting.sipUri, 'locusSipUri');
|
|
1046
|
+
assert.equal(meeting.meetingNumber, 'locusMeetingId');
|
|
1047
|
+
assert.equal(meeting.meetingJoinUrl, 'meetingJoinUrl');
|
|
1048
|
+
assert.equal(meeting.owner, 'locusOwner');
|
|
1049
|
+
assert.equal(meeting.permissionToken, 'PT');
|
|
1485
1050
|
|
|
1486
|
-
|
|
1487
|
-
|
|
1488
|
-
|
|
1489
|
-
|
|
1490
|
-
|
|
1491
|
-
|
|
1492
|
-
});
|
|
1051
|
+
assert.calledWith(
|
|
1052
|
+
TriggerProxy.trigger,
|
|
1053
|
+
meeting,
|
|
1054
|
+
{file: 'meetings', function: 'fetchMeetingInfo'},
|
|
1055
|
+
'meeting:meetingInfoAvailable'
|
|
1056
|
+
);
|
|
1493
1057
|
});
|
|
1494
1058
|
|
|
1495
1059
|
it('creates the meeting from a successful meeting info fetch that has no random delay because it is active', async () => {
|
|
@@ -1589,61 +1153,6 @@ describe('plugin-meetings', () => {
|
|
|
1589
1153
|
);
|
|
1590
1154
|
checkCreateWithoutDelay(meeting, FAKE_LOCUS_MEETING, 'test type');
|
|
1591
1155
|
});
|
|
1592
|
-
|
|
1593
|
-
it('creates meeting with the correlationId provided', async () => {
|
|
1594
|
-
const meeting = await webex.meetings.createMeeting(
|
|
1595
|
-
'test destination',
|
|
1596
|
-
'test type',
|
|
1597
|
-
false,
|
|
1598
|
-
{},
|
|
1599
|
-
{correlationId: 'my-correlationId'}
|
|
1600
|
-
);
|
|
1601
|
-
|
|
1602
|
-
const expectedMeetingData = {
|
|
1603
|
-
correlationId: 'my-correlationId',
|
|
1604
|
-
};
|
|
1605
|
-
|
|
1606
|
-
checkCreateWithoutDelay(
|
|
1607
|
-
meeting,
|
|
1608
|
-
'test destination',
|
|
1609
|
-
'test type',
|
|
1610
|
-
{},
|
|
1611
|
-
expectedMeetingData,
|
|
1612
|
-
true
|
|
1613
|
-
);
|
|
1614
|
-
});
|
|
1615
|
-
|
|
1616
|
-
it('creates meeting with the callStateForMetrics provided', async () => {
|
|
1617
|
-
const meeting = await webex.meetings.createMeeting(
|
|
1618
|
-
'test destination',
|
|
1619
|
-
'test type',
|
|
1620
|
-
false,
|
|
1621
|
-
{},
|
|
1622
|
-
{
|
|
1623
|
-
correlationId: 'my-correlationId',
|
|
1624
|
-
joinTrigger: 'my-join-trigger',
|
|
1625
|
-
loginType: 'my-login-type',
|
|
1626
|
-
}
|
|
1627
|
-
);
|
|
1628
|
-
|
|
1629
|
-
const expectedMeetingData = {
|
|
1630
|
-
correlationId: 'my-correlationId',
|
|
1631
|
-
callStateForMetrics: {
|
|
1632
|
-
correlationId: 'my-correlationId',
|
|
1633
|
-
joinTrigger: 'my-join-trigger',
|
|
1634
|
-
loginType: 'my-login-type',
|
|
1635
|
-
},
|
|
1636
|
-
};
|
|
1637
|
-
|
|
1638
|
-
checkCreateWithoutDelay(
|
|
1639
|
-
meeting,
|
|
1640
|
-
'test destination',
|
|
1641
|
-
'test type',
|
|
1642
|
-
{},
|
|
1643
|
-
expectedMeetingData,
|
|
1644
|
-
true
|
|
1645
|
-
);
|
|
1646
|
-
});
|
|
1647
1156
|
});
|
|
1648
1157
|
|
|
1649
1158
|
describe('rejected MeetingInfo.#fetchMeetingInfo', () => {
|
|
@@ -1653,136 +1162,45 @@ describe('plugin-meetings', () => {
|
|
|
1653
1162
|
webex.meetings.meetingInfo.fetchMeetingInfo = sinon
|
|
1654
1163
|
.stub()
|
|
1655
1164
|
.returns(Promise.reject(new Error('test')));
|
|
1656
|
-
webex.meetings.destroy = sinon.stub().returns(Promise.resolve());
|
|
1657
|
-
webex.meetings.createMeeting = sinon.spy(webex.meetings.createMeeting);
|
|
1658
1165
|
});
|
|
1659
|
-
|
|
1660
|
-
const checkCreateMeetingWithNoMeetingInfo = async (failOnMissingMeetingInfo, destroy) => {
|
|
1661
|
-
try {
|
|
1662
|
-
const meeting = await webex.meetings.createMeeting(
|
|
1663
|
-
'test destination',
|
|
1664
|
-
'test type',
|
|
1665
|
-
undefined,
|
|
1666
|
-
undefined,
|
|
1667
|
-
undefined,
|
|
1668
|
-
failOnMissingMeetingInfo
|
|
1669
|
-
);
|
|
1670
|
-
|
|
1671
|
-
assert.instanceOf(
|
|
1672
|
-
meeting,
|
|
1673
|
-
Meeting,
|
|
1674
|
-
'createMeeting should eventually resolve to a Meeting Object'
|
|
1675
|
-
);
|
|
1676
|
-
assert.calledOnce(webex.meetings.meetingInfo.fetchMeetingInfo);
|
|
1677
|
-
assert.calledOnce(MeetingsUtil.getMeetingAddedType);
|
|
1678
|
-
assert.calledThrice(TriggerProxy.trigger);
|
|
1679
|
-
assert.calledWith(
|
|
1680
|
-
webex.meetings.meetingInfo.fetchMeetingInfo,
|
|
1681
|
-
'test destination',
|
|
1682
|
-
'test type'
|
|
1683
|
-
);
|
|
1684
|
-
|
|
1685
|
-
if (destroy) {
|
|
1686
|
-
assert.calledWith(
|
|
1687
|
-
webex.meetings.destroy,
|
|
1688
|
-
sinon.match.instanceOf(Meeting),
|
|
1689
|
-
'MISSING_MEETING_INFO'
|
|
1690
|
-
);
|
|
1691
|
-
assert.notCalled(MeetingsUtil.getMeetingAddedType);
|
|
1692
|
-
assert.notCalled(TriggerProxy.trigger);
|
|
1693
|
-
assert.throw(webex.meetings.createMeeting, 'meeting information not found');
|
|
1694
|
-
} else {
|
|
1695
|
-
assert.notCalled(webex.meetings.destroy);
|
|
1696
|
-
assert.calledWith(MeetingsUtil.getMeetingAddedType, 'test type');
|
|
1697
|
-
assert.calledWith(
|
|
1698
|
-
TriggerProxy.trigger,
|
|
1699
|
-
sinon.match.instanceOf(Meetings),
|
|
1700
|
-
{
|
|
1701
|
-
file: 'meetings',
|
|
1702
|
-
function: 'createMeeting',
|
|
1703
|
-
},
|
|
1704
|
-
'meeting:added',
|
|
1705
|
-
{
|
|
1706
|
-
meeting: sinon.match.instanceOf(Meeting),
|
|
1707
|
-
type: 'test meeting added type',
|
|
1708
|
-
}
|
|
1709
|
-
);
|
|
1710
|
-
}
|
|
1711
|
-
} catch (err) {
|
|
1712
|
-
assert.instanceOf(err, NoMeetingInfoError);
|
|
1713
|
-
}
|
|
1714
|
-
};
|
|
1715
|
-
|
|
1716
1166
|
it('creates the meeting from a rejected meeting info fetch', async () => {
|
|
1717
|
-
|
|
1718
|
-
});
|
|
1719
|
-
|
|
1720
|
-
it('creates the meeting from a rejected meeting info fetch and destroys it if failOnMissingMeetingInfo', async () => {
|
|
1721
|
-
checkCreateMeetingWithNoMeetingInfo(true, true);
|
|
1722
|
-
});
|
|
1723
|
-
});
|
|
1167
|
+
const meeting = await webex.meetings.createMeeting('test destination', 'test type');
|
|
1724
1168
|
|
|
1725
|
-
|
|
1726
|
-
|
|
1727
|
-
|
|
1728
|
-
|
|
1729
|
-
|
|
1730
|
-
|
|
1731
|
-
|
|
1732
|
-
|
|
1733
|
-
|
|
1734
|
-
|
|
1735
|
-
|
|
1736
|
-
|
|
1737
|
-
|
|
1169
|
+
assert.instanceOf(
|
|
1170
|
+
meeting,
|
|
1171
|
+
Meeting,
|
|
1172
|
+
'createMeeting should eventually resolve to a Meeting Object'
|
|
1173
|
+
);
|
|
1174
|
+
assert.calledOnce(webex.meetings.meetingInfo.fetchMeetingInfo);
|
|
1175
|
+
assert.calledOnce(MeetingsUtil.getMeetingAddedType);
|
|
1176
|
+
assert.calledTwice(TriggerProxy.trigger);
|
|
1177
|
+
assert.calledWith(
|
|
1178
|
+
webex.meetings.meetingInfo.fetchMeetingInfo,
|
|
1179
|
+
'test destination',
|
|
1180
|
+
'test type'
|
|
1181
|
+
);
|
|
1182
|
+
assert.calledWith(MeetingsUtil.getMeetingAddedType, 'test type');
|
|
1183
|
+
assert.calledWith(
|
|
1184
|
+
TriggerProxy.trigger,
|
|
1185
|
+
sinon.match.instanceOf(Meetings),
|
|
1738
1186
|
{
|
|
1739
|
-
|
|
1740
|
-
|
|
1741
|
-
'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.',
|
|
1187
|
+
file: 'meetings',
|
|
1188
|
+
function: 'createMeeting',
|
|
1742
1189
|
},
|
|
1190
|
+
'meeting:added',
|
|
1743
1191
|
{
|
|
1744
|
-
|
|
1745
|
-
|
|
1746
|
-
|
|
1747
|
-
|
|
1748
|
-
|
|
1749
|
-
],
|
|
1750
|
-
({error, debugLogMessage, infoLogMessage}) => {
|
|
1751
|
-
it('creates the meeting from a rejected meeting info fetch', async () => {
|
|
1752
|
-
webex.meetings.meetingInfo.fetchMeetingInfo = sinon
|
|
1753
|
-
.stub()
|
|
1754
|
-
.returns(Promise.reject(error));
|
|
1755
|
-
|
|
1756
|
-
LoggerProxy.logger.debug = sinon.stub();
|
|
1757
|
-
LoggerProxy.logger.info = sinon.stub();
|
|
1758
|
-
|
|
1759
|
-
const meeting = await webex.meetings.createMeeting('test destination', 'test type');
|
|
1760
|
-
|
|
1761
|
-
assert.instanceOf(
|
|
1762
|
-
meeting,
|
|
1763
|
-
Meeting,
|
|
1764
|
-
'createMeeting should eventually resolve to a Meeting Object'
|
|
1765
|
-
);
|
|
1766
|
-
|
|
1767
|
-
assert.calledWith(LoggerProxy.logger.debug, debugLogMessage);
|
|
1768
|
-
|
|
1769
|
-
if (infoLogMessage) {
|
|
1770
|
-
assert.calledWith(
|
|
1771
|
-
LoggerProxy.logger.info,
|
|
1772
|
-
'Meetings:index#createMeeting --> Info Unable to fetch meeting info for test destination.'
|
|
1773
|
-
);
|
|
1774
|
-
} else {
|
|
1775
|
-
assert.notCalled(LoggerProxy.logger.info);
|
|
1776
|
-
}
|
|
1777
|
-
});
|
|
1778
|
-
}
|
|
1779
|
-
);
|
|
1192
|
+
meeting: sinon.match.instanceOf(Meeting),
|
|
1193
|
+
type: 'test meeting added type',
|
|
1194
|
+
}
|
|
1195
|
+
);
|
|
1196
|
+
});
|
|
1780
1197
|
});
|
|
1781
1198
|
});
|
|
1782
1199
|
});
|
|
1783
1200
|
describe('Public Event Triggers', () => {
|
|
1784
1201
|
describe('#destroy', () => {
|
|
1785
1202
|
beforeEach(() => {
|
|
1203
|
+
MediaUtil.createPeerConnection = sinon.stub().returns(true);
|
|
1786
1204
|
MeetingUtil.cleanUp = sinon.stub();
|
|
1787
1205
|
});
|
|
1788
1206
|
it('should have #destroy', () => {
|
|
@@ -1856,8 +1274,6 @@ describe('plugin-meetings', () => {
|
|
|
1856
1274
|
});
|
|
1857
1275
|
|
|
1858
1276
|
describe('#fetchUserPreferredWebexSite', () => {
|
|
1859
|
-
let loggerProxySpy;
|
|
1860
|
-
|
|
1861
1277
|
it('should call request.getMeetingPreferences to get the preferred webex site ', async () => {
|
|
1862
1278
|
assert.isDefined(webex.meetings.preferredWebexSite);
|
|
1863
1279
|
await webex.meetings.fetchUserPreferredWebexSite();
|
|
@@ -1865,22 +1281,18 @@ describe('plugin-meetings', () => {
|
|
|
1865
1281
|
assert.equal(webex.meetings.preferredWebexSite, 'go.webex.com');
|
|
1866
1282
|
});
|
|
1867
1283
|
|
|
1868
|
-
|
|
1869
|
-
|
|
1870
|
-
|
|
1871
|
-
|
|
1872
|
-
|
|
1873
|
-
|
|
1874
|
-
|
|
1875
|
-
|
|
1876
|
-
|
|
1877
|
-
|
|
1878
|
-
});
|
|
1879
|
-
};
|
|
1284
|
+
it('should not call request.getMeetingPreferences if user is a guest', async () => {
|
|
1285
|
+
Object.assign(webex.people,{
|
|
1286
|
+
_getMe: sinon.stub().returns(Promise.resolve({type: 'appuser'})),
|
|
1287
|
+
})
|
|
1288
|
+
|
|
1289
|
+
await webex.meetings.fetchUserPreferredWebexSite();
|
|
1290
|
+
|
|
1291
|
+
assert.equal(webex.meetings.preferredWebexSite, '');
|
|
1292
|
+
assert.notCalled(webex.internal.services.getMeetingPreferences);
|
|
1293
|
+
});
|
|
1880
1294
|
|
|
1881
1295
|
it('should not fail if UserPreferred info is not fetched ', async () => {
|
|
1882
|
-
setup();
|
|
1883
|
-
|
|
1884
1296
|
Object.assign(webex.internal, {
|
|
1885
1297
|
services: {
|
|
1886
1298
|
getMeetingPreferences: sinon.stub().returns(Promise.resolve({})),
|
|
@@ -1890,115 +1302,7 @@ describe('plugin-meetings', () => {
|
|
|
1890
1302
|
await webex.meetings.fetchUserPreferredWebexSite().then(() => {
|
|
1891
1303
|
assert.equal(webex.meetings.preferredWebexSite, '');
|
|
1892
1304
|
});
|
|
1893
|
-
assert.calledOnceWithExactly(
|
|
1894
|
-
loggerProxySpy,
|
|
1895
|
-
'Failed to fetch preferred site from user - no site will be set'
|
|
1896
|
-
);
|
|
1897
|
-
});
|
|
1898
|
-
|
|
1899
|
-
it('should fall back to fetching the site from the user', async () => {
|
|
1900
|
-
setup({
|
|
1901
|
-
user: {
|
|
1902
|
-
userPreferences: {
|
|
1903
|
-
userPreferencesItems: {
|
|
1904
|
-
preferredWebExSite: 'site.webex.com',
|
|
1905
|
-
},
|
|
1906
|
-
},
|
|
1907
|
-
},
|
|
1908
|
-
});
|
|
1909
|
-
|
|
1910
|
-
await webex.meetings.fetchUserPreferredWebexSite();
|
|
1911
|
-
|
|
1912
|
-
assert.equal(webex.meetings.preferredWebexSite, 'site.webex.com');
|
|
1913
|
-
assert.notCalled(loggerProxySpy);
|
|
1914
|
-
});
|
|
1915
|
-
|
|
1916
|
-
forEach(
|
|
1917
|
-
[
|
|
1918
|
-
{user: undefined},
|
|
1919
|
-
{user: {userPreferences: {}}},
|
|
1920
|
-
{user: {userPreferences: {userPreferencesItems: {}}}},
|
|
1921
|
-
{user: {userPreferences: {userPreferencesItems: {preferredWebExSite: undefined}}}},
|
|
1922
|
-
],
|
|
1923
|
-
({user}) => {
|
|
1924
|
-
it(`should handle invalid user data ${user}`, async () => {
|
|
1925
|
-
setup({user});
|
|
1926
|
-
|
|
1927
|
-
await webex.meetings.fetchUserPreferredWebexSite();
|
|
1928
|
-
|
|
1929
|
-
assert.equal(webex.meetings.preferredWebexSite, '');
|
|
1930
|
-
assert.calledOnceWithExactly(
|
|
1931
|
-
loggerProxySpy,
|
|
1932
|
-
'Failed to fetch preferred site from user - no site will be set'
|
|
1933
|
-
);
|
|
1934
|
-
});
|
|
1935
|
-
}
|
|
1936
|
-
);
|
|
1937
|
-
|
|
1938
|
-
it('should handle a get user failure', async () => {
|
|
1939
|
-
setup();
|
|
1940
|
-
|
|
1941
|
-
webex.internal.user.get.rejects(new Error());
|
|
1942
|
-
|
|
1943
|
-
await webex.meetings.fetchUserPreferredWebexSite();
|
|
1944
|
-
|
|
1945
|
-
assert.equal(webex.meetings.preferredWebexSite, '');
|
|
1946
|
-
assert.calledOnceWithExactly(
|
|
1947
|
-
loggerProxySpy,
|
|
1948
|
-
'Failed to fetch preferred site from user - no site will be set'
|
|
1949
|
-
);
|
|
1950
|
-
});
|
|
1951
|
-
|
|
1952
|
-
it('should fall back to fetching the site from the user', async () => {
|
|
1953
|
-
setup({
|
|
1954
|
-
user: {
|
|
1955
|
-
userPreferences: {
|
|
1956
|
-
userPreferencesItems: {
|
|
1957
|
-
preferredWebExSite: 'site.webex.com',
|
|
1958
|
-
},
|
|
1959
|
-
},
|
|
1960
|
-
},
|
|
1961
|
-
});
|
|
1962
|
-
|
|
1963
|
-
await webex.meetings.fetchUserPreferredWebexSite();
|
|
1964
|
-
|
|
1965
|
-
assert.equal(webex.meetings.preferredWebexSite, 'site.webex.com');
|
|
1966
|
-
assert.notCalled(loggerProxySpy);
|
|
1967
|
-
});
|
|
1968
|
-
|
|
1969
|
-
forEach([
|
|
1970
|
-
{user: undefined},
|
|
1971
|
-
{user: {userPreferences: {}}},
|
|
1972
|
-
{user: {userPreferences: {userPreferencesItems: {}}}},
|
|
1973
|
-
{user: {userPreferences: {userPreferencesItems: {preferredWebExSite: undefined}}}},
|
|
1974
|
-
], ({user}) => {
|
|
1975
|
-
it(`should handle invalid user data ${user}`, async () => {
|
|
1976
|
-
setup({user});
|
|
1977
|
-
|
|
1978
|
-
await webex.meetings.fetchUserPreferredWebexSite();
|
|
1979
|
-
|
|
1980
|
-
assert.equal(webex.meetings.preferredWebexSite, '');
|
|
1981
|
-
assert.calledOnceWithExactly(
|
|
1982
|
-
loggerProxySpy,
|
|
1983
|
-
'Failed to fetch preferred site from user - no site will be set'
|
|
1984
|
-
);
|
|
1985
|
-
});
|
|
1986
|
-
});
|
|
1987
|
-
|
|
1988
|
-
it('should handle a get user failure', async () => {
|
|
1989
|
-
setup();
|
|
1990
|
-
|
|
1991
|
-
webex.internal.user.get.rejects(new Error());
|
|
1992
|
-
|
|
1993
|
-
await webex.meetings.fetchUserPreferredWebexSite();
|
|
1994
|
-
|
|
1995
|
-
assert.equal(webex.meetings.preferredWebexSite, '');
|
|
1996
|
-
assert.calledOnceWithExactly(
|
|
1997
|
-
loggerProxySpy,
|
|
1998
|
-
'Failed to fetch preferred site from user - no site will be set'
|
|
1999
|
-
);
|
|
2000
1305
|
});
|
|
2001
|
-
|
|
2002
1306
|
});
|
|
2003
1307
|
});
|
|
2004
1308
|
|
|
@@ -2006,6 +1310,7 @@ describe('plugin-meetings', () => {
|
|
|
2006
1310
|
let meeting;
|
|
2007
1311
|
|
|
2008
1312
|
beforeEach(async () => {
|
|
1313
|
+
MediaUtil.createPeerConnection = sinon.stub().returns(true);
|
|
2009
1314
|
webex.internal.device.userId = uuid1;
|
|
2010
1315
|
webex.internal.device.url = url1;
|
|
2011
1316
|
MeetingCollection.set = sinon.stub().returns(true);
|
|
@@ -2082,523 +1387,5 @@ describe('plugin-meetings', () => {
|
|
|
2082
1387
|
);
|
|
2083
1388
|
});
|
|
2084
1389
|
});
|
|
2085
|
-
|
|
2086
|
-
describe('#isNeedHandleMainLocus', () => {
|
|
2087
|
-
let meeting;
|
|
2088
|
-
let newLocus;
|
|
2089
|
-
beforeEach(() => {
|
|
2090
|
-
meeting = {
|
|
2091
|
-
controls: {},
|
|
2092
|
-
self: {},
|
|
2093
|
-
};
|
|
2094
|
-
newLocus = {
|
|
2095
|
-
controls: {},
|
|
2096
|
-
self: {},
|
|
2097
|
-
};
|
|
2098
|
-
});
|
|
2099
|
-
afterEach(() => {
|
|
2100
|
-
sinon.restore();
|
|
2101
|
-
});
|
|
2102
|
-
it('check normal case will return true', () => {
|
|
2103
|
-
sinon.stub(webex.meetings.meetingCollection, 'getActiveBreakoutLocus').returns(null);
|
|
2104
|
-
LoggerProxy.logger.log = sinon.stub();
|
|
2105
|
-
const result = webex.meetings.isNeedHandleMainLocus(meeting, newLocus);
|
|
2106
|
-
assert.equal(result, true);
|
|
2107
|
-
assert.calledWith(
|
|
2108
|
-
LoggerProxy.logger.log,
|
|
2109
|
-
'Meetings:index#isNeedHandleMainLocus --> this is a normal main session locusDTO update case'
|
|
2110
|
-
);
|
|
2111
|
-
});
|
|
2112
|
-
|
|
2113
|
-
it('check self joined and joined on this device, return true', () => {
|
|
2114
|
-
sinon.stub(webex.meetings.meetingCollection, 'getActiveBreakoutLocus').returns(null);
|
|
2115
|
-
newLocus.self.state = 'JOINED';
|
|
2116
|
-
sinon.stub(MeetingsUtil, 'joinedOnThisDevice').returns(true);
|
|
2117
|
-
|
|
2118
|
-
LoggerProxy.logger.log = sinon.stub();
|
|
2119
|
-
const result = webex.meetings.isNeedHandleMainLocus(meeting, newLocus);
|
|
2120
|
-
assert.equal(result, true);
|
|
2121
|
-
assert.calledWith(
|
|
2122
|
-
LoggerProxy.logger.log,
|
|
2123
|
-
'Meetings:index#isNeedHandleMainLocus --> self this device shown as JOINED in the main session'
|
|
2124
|
-
);
|
|
2125
|
-
});
|
|
2126
|
-
|
|
2127
|
-
it('if newLocus replaceAt time is expired, then return false', () => {
|
|
2128
|
-
sinon.stub(webex.meetings.meetingCollection, 'getActiveBreakoutLocus').returns({
|
|
2129
|
-
joinedWith: {
|
|
2130
|
-
replaces: [
|
|
2131
|
-
{
|
|
2132
|
-
replaceAt: '2023-03-27T02:17:02.506Z',
|
|
2133
|
-
},
|
|
2134
|
-
],
|
|
2135
|
-
},
|
|
2136
|
-
});
|
|
2137
|
-
newLocus.self.state = 'JOINED';
|
|
2138
|
-
sinon.stub(MeetingsUtil, 'joinedOnThisDevice').returns(true);
|
|
2139
|
-
sinon.stub(MeetingsUtil, 'getThisDevice').returns({
|
|
2140
|
-
replaces: [
|
|
2141
|
-
{
|
|
2142
|
-
replaceAt: '2023-03-27T02:17:01.506Z',
|
|
2143
|
-
},
|
|
2144
|
-
],
|
|
2145
|
-
});
|
|
2146
|
-
|
|
2147
|
-
LoggerProxy.logger.log = sinon.stub();
|
|
2148
|
-
const result = webex.meetings.isNeedHandleMainLocus(meeting, newLocus);
|
|
2149
|
-
assert.equal(result, false);
|
|
2150
|
-
assert.calledWith(
|
|
2151
|
-
LoggerProxy.logger.log,
|
|
2152
|
-
`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`
|
|
2153
|
-
);
|
|
2154
|
-
});
|
|
2155
|
-
|
|
2156
|
-
it('check current is in breakout join with this device, return false', () => {
|
|
2157
|
-
sinon.stub(webex.meetings.meetingCollection, 'getActiveBreakoutLocus').returns({
|
|
2158
|
-
joinedWith: {
|
|
2159
|
-
correlationId: '111',
|
|
2160
|
-
},
|
|
2161
|
-
});
|
|
2162
|
-
newLocus.controls.breakout = {url: 'url'};
|
|
2163
|
-
meeting.correlationId = '111';
|
|
2164
|
-
|
|
2165
|
-
LoggerProxy.logger.log = sinon.stub();
|
|
2166
|
-
const result = webex.meetings.isNeedHandleMainLocus(meeting, newLocus);
|
|
2167
|
-
assert.equal(result, false);
|
|
2168
|
-
assert.calledWith(
|
|
2169
|
-
LoggerProxy.logger.log,
|
|
2170
|
-
`Meetings:index#isNeedHandleMainLocus --> there is active breakout session and joined on this device, and don't need to handle main session: url`
|
|
2171
|
-
);
|
|
2172
|
-
});
|
|
2173
|
-
|
|
2174
|
-
it('check self is moved and removed, return false', () => {
|
|
2175
|
-
webex.meetings.meetingCollection.getActiveBreakoutLocus = sinon.stub().returns(null);
|
|
2176
|
-
newLocus.self.state = 'LEFT';
|
|
2177
|
-
newLocus.self.reason = 'MOVED';
|
|
2178
|
-
newLocus.self.removed = true;
|
|
2179
|
-
LoggerProxy.logger.log = sinon.stub();
|
|
2180
|
-
const result = webex.meetings.isNeedHandleMainLocus(meeting, newLocus);
|
|
2181
|
-
assert.equal(result, false);
|
|
2182
|
-
assert.calledWith(
|
|
2183
|
-
LoggerProxy.logger.log,
|
|
2184
|
-
'Meetings:index#isNeedHandleMainLocus --> self moved main locus with self removed status or with device resource moved, not need to handle'
|
|
2185
|
-
);
|
|
2186
|
-
});
|
|
2187
|
-
|
|
2188
|
-
it('check self is moved and device resource removed, return false', () => {
|
|
2189
|
-
webex.meetings.meetingCollection.getActiveBreakoutLocus = sinon.stub().returns(null);
|
|
2190
|
-
newLocus.self.state = 'LEFT';
|
|
2191
|
-
newLocus.self.reason = 'MOVED';
|
|
2192
|
-
sinon.stub(MeetingsUtil, 'getThisDevice').returns({
|
|
2193
|
-
state: 'LEFT',
|
|
2194
|
-
reason: 'MOVED',
|
|
2195
|
-
});
|
|
2196
|
-
LoggerProxy.logger.log = sinon.stub();
|
|
2197
|
-
const result = webex.meetings.isNeedHandleMainLocus(meeting, newLocus);
|
|
2198
|
-
assert.equal(result, false);
|
|
2199
|
-
assert.calledWith(
|
|
2200
|
-
LoggerProxy.logger.log,
|
|
2201
|
-
'Meetings:index#isNeedHandleMainLocus --> self moved main locus with self removed status or with device resource moved, not need to handle'
|
|
2202
|
-
);
|
|
2203
|
-
});
|
|
2204
|
-
|
|
2205
|
-
it('check self is joined but device resource removed, return false', () => {
|
|
2206
|
-
webex.meetings.meetingCollection.getActiveBreakoutLocus = sinon.stub().returns(null);
|
|
2207
|
-
sinon.stub(MeetingsUtil, 'joinedOnThisDevice').returns(false);
|
|
2208
|
-
newLocus.self.state = 'JOINED';
|
|
2209
|
-
sinon.stub(MeetingsUtil, 'getThisDevice').returns({
|
|
2210
|
-
state: 'LEFT',
|
|
2211
|
-
reason: 'MOVED',
|
|
2212
|
-
});
|
|
2213
|
-
LoggerProxy.logger.log = sinon.stub();
|
|
2214
|
-
const result = webex.meetings.isNeedHandleMainLocus(meeting, newLocus);
|
|
2215
|
-
assert.equal(result, false);
|
|
2216
|
-
assert.calledWith(
|
|
2217
|
-
LoggerProxy.logger.log,
|
|
2218
|
-
'Meetings:index#isNeedHandleMainLocus --> self device left&moved in main locus with self joined status, not need to handle'
|
|
2219
|
-
);
|
|
2220
|
-
});
|
|
2221
|
-
});
|
|
2222
|
-
|
|
2223
|
-
describe('#isNeedHandleLocusDTO', () => {
|
|
2224
|
-
let meeting;
|
|
2225
|
-
let newLocus;
|
|
2226
|
-
beforeEach(() => {
|
|
2227
|
-
meeting = {
|
|
2228
|
-
controls: {},
|
|
2229
|
-
self: {},
|
|
2230
|
-
};
|
|
2231
|
-
newLocus = {
|
|
2232
|
-
controls: {},
|
|
2233
|
-
self: {},
|
|
2234
|
-
};
|
|
2235
|
-
});
|
|
2236
|
-
afterEach(() => {
|
|
2237
|
-
sinon.restore();
|
|
2238
|
-
});
|
|
2239
|
-
it('initial DTO , joined breakout session, return true', () => {
|
|
2240
|
-
newLocus.controls.breakout = {
|
|
2241
|
-
sessionType: 'BREAKOUT',
|
|
2242
|
-
};
|
|
2243
|
-
newLocus.self.state = 'JOINED';
|
|
2244
|
-
newLocus.fullState = {
|
|
2245
|
-
active: true,
|
|
2246
|
-
};
|
|
2247
|
-
LoggerProxy.logger.log = sinon.stub();
|
|
2248
|
-
const result = webex.meetings.isNeedHandleLocusDTO(null, newLocus);
|
|
2249
|
-
assert.equal(result, true);
|
|
2250
|
-
assert.calledWith(
|
|
2251
|
-
LoggerProxy.logger.log,
|
|
2252
|
-
`Meetings:index#isNeedHandleLocusDTO --> the first breakout session locusDTO active status: true`
|
|
2253
|
-
);
|
|
2254
|
-
});
|
|
2255
|
-
it('others go to check isNeedHandleMainLocus', () => {
|
|
2256
|
-
newLocus.controls.breakout = {
|
|
2257
|
-
sessionType: 'MAIN',
|
|
2258
|
-
};
|
|
2259
|
-
newLocus.self.state = 'JOINED';
|
|
2260
|
-
|
|
2261
|
-
LoggerProxy.logger.log = sinon.stub();
|
|
2262
|
-
const result = webex.meetings.isNeedHandleLocusDTO(meeting, newLocus);
|
|
2263
|
-
assert.equal(result, true);
|
|
2264
|
-
assert.calledWith(
|
|
2265
|
-
LoggerProxy.logger.log,
|
|
2266
|
-
'Meetings:index#isNeedHandleMainLocus --> this is a normal main session locusDTO update case'
|
|
2267
|
-
);
|
|
2268
|
-
});
|
|
2269
|
-
it('joined breakout session, self status is moved, return false', () => {
|
|
2270
|
-
newLocus.controls.breakout = {
|
|
2271
|
-
sessionType: 'BREAKOUT',
|
|
2272
|
-
};
|
|
2273
|
-
newLocus.self.state = 'LEFT';
|
|
2274
|
-
newLocus.self.reason = 'MOVED';
|
|
2275
|
-
|
|
2276
|
-
LoggerProxy.logger.log = sinon.stub();
|
|
2277
|
-
const result = webex.meetings.isNeedHandleLocusDTO(meeting, newLocus);
|
|
2278
|
-
assert.equal(result, false);
|
|
2279
|
-
});
|
|
2280
|
-
});
|
|
2281
|
-
|
|
2282
|
-
describe('#getCorrespondingMeetingByLocus', () => {
|
|
2283
|
-
let locus;
|
|
2284
|
-
let mockReturnMeeting = {meeting: 'meeting1'};
|
|
2285
|
-
const mockGetByKey = (keyWillReturnMeeting) => {
|
|
2286
|
-
webex.meetings.meetingCollection.getByKey = sinon.stub().callsFake((key) => {
|
|
2287
|
-
if (key === keyWillReturnMeeting) {
|
|
2288
|
-
return mockReturnMeeting;
|
|
2289
|
-
}
|
|
2290
|
-
return null;
|
|
2291
|
-
});
|
|
2292
|
-
};
|
|
2293
|
-
|
|
2294
|
-
beforeEach(() => {
|
|
2295
|
-
locus = {
|
|
2296
|
-
controls: {},
|
|
2297
|
-
self: {
|
|
2298
|
-
callbackInfo: {
|
|
2299
|
-
callbackAddress: 'address1',
|
|
2300
|
-
},
|
|
2301
|
-
},
|
|
2302
|
-
info: {
|
|
2303
|
-
webExMeetingId: '123456',
|
|
2304
|
-
isUnifiedSpaceMeeting: false,
|
|
2305
|
-
},
|
|
2306
|
-
conversationUrl: 'conversationUrl1',
|
|
2307
|
-
};
|
|
2308
|
-
|
|
2309
|
-
sinon.stub(MeetingsUtil, 'checkForCorrelationId').returns('correlationId1');
|
|
2310
|
-
});
|
|
2311
|
-
afterEach(() => {
|
|
2312
|
-
sinon.restore();
|
|
2313
|
-
});
|
|
2314
|
-
it('check the calls when no meeting found in meetingCollection', () => {
|
|
2315
|
-
mockGetByKey();
|
|
2316
|
-
const result = webex.meetings.getCorrespondingMeetingByLocus({locus, locusUrl: url1});
|
|
2317
|
-
assert.isNull(result);
|
|
2318
|
-
assert.callCount(webex.meetings.meetingCollection.getByKey, 5);
|
|
2319
|
-
assert.calledWith(webex.meetings.meetingCollection.getByKey, 'locusUrl', url1);
|
|
2320
|
-
assert.calledWith(
|
|
2321
|
-
webex.meetings.meetingCollection.getByKey,
|
|
2322
|
-
'correlationId',
|
|
2323
|
-
'correlationId1'
|
|
2324
|
-
);
|
|
2325
|
-
assert.calledWith(webex.meetings.meetingCollection.getByKey, 'sipUri', 'address1');
|
|
2326
|
-
assert.calledWith(
|
|
2327
|
-
webex.meetings.meetingCollection.getByKey,
|
|
2328
|
-
'conversationUrl',
|
|
2329
|
-
'conversationUrl1'
|
|
2330
|
-
);
|
|
2331
|
-
assert.calledWith(webex.meetings.meetingCollection.getByKey, 'meetingNumber', '123456');
|
|
2332
|
-
});
|
|
2333
|
-
|
|
2334
|
-
it('not try getByKey "conversationUrl" when isUnifiedSpaceMeeting is true', () => {
|
|
2335
|
-
mockGetByKey();
|
|
2336
|
-
locus.info.isUnifiedSpaceMeeting = true;
|
|
2337
|
-
const result = webex.meetings.getCorrespondingMeetingByLocus({locus, locusUrl: url1});
|
|
2338
|
-
assert.isNull(result);
|
|
2339
|
-
assert.callCount(webex.meetings.meetingCollection.getByKey, 4);
|
|
2340
|
-
});
|
|
2341
|
-
|
|
2342
|
-
it('check the calls when meeting found by key: locusUrl', () => {
|
|
2343
|
-
mockGetByKey('locusUrl');
|
|
2344
|
-
const result = webex.meetings.getCorrespondingMeetingByLocus({locus, locusUrl: url1});
|
|
2345
|
-
assert.deepEqual(result, mockReturnMeeting);
|
|
2346
|
-
assert.callCount(webex.meetings.meetingCollection.getByKey, 1);
|
|
2347
|
-
assert.calledWith(webex.meetings.meetingCollection.getByKey, 'locusUrl', url1);
|
|
2348
|
-
});
|
|
2349
|
-
|
|
2350
|
-
it('check the calls when meeting found by key: correlationId', () => {
|
|
2351
|
-
mockGetByKey('correlationId');
|
|
2352
|
-
const result = webex.meetings.getCorrespondingMeetingByLocus({locus, locusUrl: url1});
|
|
2353
|
-
assert.deepEqual(result, mockReturnMeeting);
|
|
2354
|
-
assert.callCount(webex.meetings.meetingCollection.getByKey, 2);
|
|
2355
|
-
assert.calledWith(webex.meetings.meetingCollection.getByKey, 'locusUrl', url1);
|
|
2356
|
-
assert.calledWith(
|
|
2357
|
-
webex.meetings.meetingCollection.getByKey,
|
|
2358
|
-
'correlationId',
|
|
2359
|
-
'correlationId1'
|
|
2360
|
-
);
|
|
2361
|
-
});
|
|
2362
|
-
|
|
2363
|
-
it('check the calls when meeting found by key: sipUri', () => {
|
|
2364
|
-
mockGetByKey('sipUri');
|
|
2365
|
-
const result = webex.meetings.getCorrespondingMeetingByLocus({locus, locusUrl: url1});
|
|
2366
|
-
assert.deepEqual(result, mockReturnMeeting);
|
|
2367
|
-
assert.callCount(webex.meetings.meetingCollection.getByKey, 3);
|
|
2368
|
-
assert.calledWith(webex.meetings.meetingCollection.getByKey, 'locusUrl', url1);
|
|
2369
|
-
assert.calledWith(
|
|
2370
|
-
webex.meetings.meetingCollection.getByKey,
|
|
2371
|
-
'correlationId',
|
|
2372
|
-
'correlationId1'
|
|
2373
|
-
);
|
|
2374
|
-
assert.calledWith(webex.meetings.meetingCollection.getByKey, 'sipUri', 'address1');
|
|
2375
|
-
});
|
|
2376
|
-
|
|
2377
|
-
it('check the calls when meeting found by key: conversationUrl', () => {
|
|
2378
|
-
mockGetByKey('conversationUrl');
|
|
2379
|
-
const result = webex.meetings.getCorrespondingMeetingByLocus({locus, locusUrl: url1});
|
|
2380
|
-
assert.deepEqual(result, mockReturnMeeting);
|
|
2381
|
-
assert.callCount(webex.meetings.meetingCollection.getByKey, 4);
|
|
2382
|
-
assert.calledWith(webex.meetings.meetingCollection.getByKey, 'locusUrl', url1);
|
|
2383
|
-
assert.calledWith(
|
|
2384
|
-
webex.meetings.meetingCollection.getByKey,
|
|
2385
|
-
'correlationId',
|
|
2386
|
-
'correlationId1'
|
|
2387
|
-
);
|
|
2388
|
-
assert.calledWith(webex.meetings.meetingCollection.getByKey, 'sipUri', 'address1');
|
|
2389
|
-
assert.calledWith(
|
|
2390
|
-
webex.meetings.meetingCollection.getByKey,
|
|
2391
|
-
'conversationUrl',
|
|
2392
|
-
'conversationUrl1'
|
|
2393
|
-
);
|
|
2394
|
-
});
|
|
2395
|
-
|
|
2396
|
-
it('check the calls when meeting found by key: meetingNumber', () => {
|
|
2397
|
-
mockGetByKey('meetingNumber');
|
|
2398
|
-
const result = webex.meetings.getCorrespondingMeetingByLocus({locus, locusUrl: url1});
|
|
2399
|
-
assert.deepEqual(result, mockReturnMeeting);
|
|
2400
|
-
assert.callCount(webex.meetings.meetingCollection.getByKey, 5);
|
|
2401
|
-
assert.calledWith(webex.meetings.meetingCollection.getByKey, 'locusUrl', url1);
|
|
2402
|
-
assert.calledWith(
|
|
2403
|
-
webex.meetings.meetingCollection.getByKey,
|
|
2404
|
-
'correlationId',
|
|
2405
|
-
'correlationId1'
|
|
2406
|
-
);
|
|
2407
|
-
assert.calledWith(webex.meetings.meetingCollection.getByKey, 'sipUri', 'address1');
|
|
2408
|
-
assert.calledWith(
|
|
2409
|
-
webex.meetings.meetingCollection.getByKey,
|
|
2410
|
-
'conversationUrl',
|
|
2411
|
-
'conversationUrl1'
|
|
2412
|
-
);
|
|
2413
|
-
assert.calledWith(webex.meetings.meetingCollection.getByKey, 'meetingNumber', '123456');
|
|
2414
|
-
});
|
|
2415
|
-
});
|
|
2416
|
-
|
|
2417
|
-
describe('#sortLocusArrayToUpdate', () => {
|
|
2418
|
-
let lociArray;
|
|
2419
|
-
let mainLocus;
|
|
2420
|
-
let breakoutLocus;
|
|
2421
|
-
beforeEach(() => {
|
|
2422
|
-
mainLocus = {
|
|
2423
|
-
url: 'mainUrl1',
|
|
2424
|
-
controls: {
|
|
2425
|
-
breakout: {
|
|
2426
|
-
sessionType: 'MAIN',
|
|
2427
|
-
url: 'breakoutUnifiedUrl1',
|
|
2428
|
-
},
|
|
2429
|
-
},
|
|
2430
|
-
};
|
|
2431
|
-
breakoutLocus = {
|
|
2432
|
-
url: 'breakoutUrl1',
|
|
2433
|
-
controls: {
|
|
2434
|
-
breakout: {
|
|
2435
|
-
sessionType: 'BREAKOUT',
|
|
2436
|
-
url: 'breakoutUnifiedUrl1',
|
|
2437
|
-
},
|
|
2438
|
-
},
|
|
2439
|
-
};
|
|
2440
|
-
lociArray = [mainLocus, breakoutLocus];
|
|
2441
|
-
|
|
2442
|
-
sinon.stub(MeetingsUtil, 'isValidBreakoutLocus').callsFake((locus) => {
|
|
2443
|
-
return locus.url === 'breakoutUrl1';
|
|
2444
|
-
});
|
|
2445
|
-
});
|
|
2446
|
-
afterEach(() => {
|
|
2447
|
-
sinon.restore();
|
|
2448
|
-
});
|
|
2449
|
-
|
|
2450
|
-
it('if both main and breakout locus is in array for non-exist meeting, return main locus to create first', () => {
|
|
2451
|
-
webex.meetings.meetingCollection.getByKey = sinon.stub().returns(undefined);
|
|
2452
|
-
const result = webex.meetings.sortLocusArrayToUpdate(lociArray);
|
|
2453
|
-
assert.deepEqual(result, [mainLocus]);
|
|
2454
|
-
assert.deepEqual(webex.meetings.breakoutLocusForHandleLater, [breakoutLocus]);
|
|
2455
|
-
});
|
|
2456
|
-
|
|
2457
|
-
it('if both main and breakout locus is in array for an exist meeting, return all locus', () => {
|
|
2458
|
-
webex.meetings.meetingCollection.getByKey = sinon.stub().returns({});
|
|
2459
|
-
const result = webex.meetings.sortLocusArrayToUpdate(lociArray);
|
|
2460
|
-
assert.deepEqual(result, [mainLocus, breakoutLocus]);
|
|
2461
|
-
assert.deepEqual(webex.meetings.breakoutLocusForHandleLater, []);
|
|
2462
|
-
});
|
|
2463
|
-
|
|
2464
|
-
it('if the breakout locus has no associated main locus, return all', () => {
|
|
2465
|
-
webex.meetings.meetingCollection.getByKey = sinon.stub().returns({});
|
|
2466
|
-
breakoutLocus.controls.breakout.url = 'testUrl';
|
|
2467
|
-
const result = webex.meetings.sortLocusArrayToUpdate(lociArray);
|
|
2468
|
-
assert.deepEqual(result, [mainLocus, breakoutLocus]);
|
|
2469
|
-
});
|
|
2470
|
-
});
|
|
2471
|
-
|
|
2472
|
-
describe('#checkHandleBreakoutLocus', () => {
|
|
2473
|
-
let breakoutLocus;
|
|
2474
|
-
beforeEach(() => {
|
|
2475
|
-
breakoutLocus = {
|
|
2476
|
-
url: 'breakoutUrl1',
|
|
2477
|
-
controls: {
|
|
2478
|
-
breakout: {
|
|
2479
|
-
sessionType: 'BREAKOUT',
|
|
2480
|
-
url: 'breakoutUnifiedUrl1',
|
|
2481
|
-
},
|
|
2482
|
-
},
|
|
2483
|
-
};
|
|
2484
|
-
|
|
2485
|
-
webex.meetings.handleLocusEvent = sinon.stub();
|
|
2486
|
-
});
|
|
2487
|
-
afterEach(() => {
|
|
2488
|
-
sinon.restore();
|
|
2489
|
-
});
|
|
2490
|
-
it('do nothing if new created locus is null/no cached breakouts for updating', () => {
|
|
2491
|
-
webex.meetings.checkHandleBreakoutLocus(null);
|
|
2492
|
-
webex.meetings.breakoutLocusForHandleLater = null;
|
|
2493
|
-
webex.meetings.checkHandleBreakoutLocus({});
|
|
2494
|
-
webex.meetings.breakoutLocusForHandleLater = [];
|
|
2495
|
-
webex.meetings.checkHandleBreakoutLocus({});
|
|
2496
|
-
assert.notCalled(webex.meetings.handleLocusEvent);
|
|
2497
|
-
});
|
|
2498
|
-
|
|
2499
|
-
it('do nothing if new created locus is breakout locus', () => {
|
|
2500
|
-
webex.meetings.breakoutLocusForHandleLater = [breakoutLocus];
|
|
2501
|
-
webex.meetings.checkHandleBreakoutLocus(breakoutLocus);
|
|
2502
|
-
assert.notCalled(webex.meetings.handleLocusEvent);
|
|
2503
|
-
});
|
|
2504
|
-
|
|
2505
|
-
it('do nothing if no cached locus is associated with the new created locus', () => {
|
|
2506
|
-
webex.meetings.breakoutLocusForHandleLater = [breakoutLocus];
|
|
2507
|
-
webex.meetings.checkHandleBreakoutLocus({
|
|
2508
|
-
controls: {
|
|
2509
|
-
breakout: {
|
|
2510
|
-
sessionType: 'MAIN',
|
|
2511
|
-
url: 'breakoutUnifiedUrl2',
|
|
2512
|
-
},
|
|
2513
|
-
},
|
|
2514
|
-
});
|
|
2515
|
-
assert.notCalled(webex.meetings.handleLocusEvent);
|
|
2516
|
-
});
|
|
2517
|
-
|
|
2518
|
-
it('update the cached breakout locus which associate the new created locus', () => {
|
|
2519
|
-
webex.meetings.breakoutLocusForHandleLater = [breakoutLocus];
|
|
2520
|
-
webex.meetings.checkHandleBreakoutLocus({
|
|
2521
|
-
controls: {
|
|
2522
|
-
breakout: {
|
|
2523
|
-
sessionType: 'MAIN',
|
|
2524
|
-
url: 'breakoutUnifiedUrl1',
|
|
2525
|
-
},
|
|
2526
|
-
},
|
|
2527
|
-
});
|
|
2528
|
-
assert.calledWith(webex.meetings.handleLocusEvent, {
|
|
2529
|
-
locus: breakoutLocus,
|
|
2530
|
-
locusUrl: breakoutLocus.url,
|
|
2531
|
-
});
|
|
2532
|
-
});
|
|
2533
|
-
});
|
|
2534
|
-
|
|
2535
|
-
describe('uploading of logs', () => {
|
|
2536
|
-
let metricsSpy;
|
|
2537
|
-
let meeting;
|
|
2538
|
-
|
|
2539
|
-
beforeEach(async () => {
|
|
2540
|
-
webex.meetings.config.autoUploadLogs = true;
|
|
2541
|
-
webex.meetings.loggerRequest.uploadLogs = sinon.stub().resolves();
|
|
2542
|
-
|
|
2543
|
-
sinon.stub(webex.meetings.meetingInfo, 'fetchInfoOptions').resolves({});
|
|
2544
|
-
sinon.stub(webex.meetings.meetingInfo, 'fetchMeetingInfo').resolves({});
|
|
2545
|
-
|
|
2546
|
-
triggerProxyStub.restore();
|
|
2547
|
-
|
|
2548
|
-
metricsSpy = sinon.stub(Metrics, 'sendBehavioralMetric');
|
|
2549
|
-
|
|
2550
|
-
meeting = await webex.meetings.create('test');
|
|
2551
|
-
|
|
2552
|
-
meeting.locusId = 'locus id';
|
|
2553
|
-
meeting.correlationId = 'correlation id';
|
|
2554
|
-
meeting.locusInfo = {
|
|
2555
|
-
fullState: {lastActive: 'last active', sessionId: 'locus session id'},
|
|
2556
|
-
info: {webExMeetingId: 'meeting id'},
|
|
2557
|
-
};
|
|
2558
|
-
});
|
|
2559
|
-
|
|
2560
|
-
afterEach(() => {
|
|
2561
|
-
sinon.restore();
|
|
2562
|
-
});
|
|
2563
|
-
|
|
2564
|
-
it('sends metrics on success', async () => {
|
|
2565
|
-
await meeting.uploadLogs();
|
|
2566
|
-
|
|
2567
|
-
await testUtils.flushPromises();
|
|
2568
|
-
|
|
2569
|
-
assert.calledOnceWithExactly(metricsSpy, 'js_sdk_upload_logs_success', {
|
|
2570
|
-
callStart: 'last active',
|
|
2571
|
-
correlationId: 'correlation id',
|
|
2572
|
-
feedbackId: 'correlation id',
|
|
2573
|
-
locusId: 'locus id',
|
|
2574
|
-
meetingId: 'meeting id',
|
|
2575
|
-
autoupload: true,
|
|
2576
|
-
locussessionid: 'locus session id',
|
|
2577
|
-
});
|
|
2578
|
-
});
|
|
2579
|
-
|
|
2580
|
-
it('sends metrics on failure', async () => {
|
|
2581
|
-
webex.meetings.loggerRequest.uploadLogs.rejects(new Error('fake error'));
|
|
2582
|
-
|
|
2583
|
-
await meeting.uploadLogs();
|
|
2584
|
-
|
|
2585
|
-
await testUtils.flushPromises();
|
|
2586
|
-
|
|
2587
|
-
assert.calledOnceWithExactly(
|
|
2588
|
-
metricsSpy,
|
|
2589
|
-
'js_sdk_upload_logs_failure',
|
|
2590
|
-
sinon.match({
|
|
2591
|
-
callStart: 'last active',
|
|
2592
|
-
correlationId: 'correlation id',
|
|
2593
|
-
feedbackId: 'correlation id',
|
|
2594
|
-
locusId: 'locus id',
|
|
2595
|
-
meetingId: 'meeting id',
|
|
2596
|
-
reason: 'fake error',
|
|
2597
|
-
autoupload: true,
|
|
2598
|
-
locussessionid: 'locus session id',
|
|
2599
|
-
})
|
|
2600
|
-
);
|
|
2601
|
-
});
|
|
2602
|
-
});
|
|
2603
1390
|
});
|
|
2604
1391
|
});
|