@webex/plugin-meetings 3.0.0-beta.27 → 3.0.0-beta.270
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 +46 -8
- package/dist/annotation/annotation.types.js +7 -0
- package/dist/annotation/annotation.types.js.map +1 -0
- package/dist/annotation/constants.js +49 -0
- package/dist/annotation/constants.js.map +1 -0
- package/dist/annotation/index.js +342 -0
- package/dist/annotation/index.js.map +1 -0
- package/dist/breakouts/breakout.js +114 -14
- package/dist/breakouts/breakout.js.map +1 -1
- package/dist/breakouts/edit-lock-error.js +52 -0
- package/dist/breakouts/edit-lock-error.js.map +1 -0
- package/dist/breakouts/events.js +45 -0
- package/dist/breakouts/events.js.map +1 -0
- package/dist/breakouts/index.js +763 -31
- package/dist/breakouts/index.js.map +1 -1
- package/dist/breakouts/request.js +78 -0
- package/dist/breakouts/request.js.map +1 -0
- package/dist/breakouts/utils.js +67 -0
- package/dist/breakouts/utils.js.map +1 -0
- package/dist/common/errors/no-meeting-info.js +51 -0
- package/dist/common/errors/no-meeting-info.js.map +1 -0
- package/dist/common/errors/webex-errors.js +28 -7
- package/dist/common/errors/webex-errors.js.map +1 -1
- package/dist/common/logs/logger-proxy.js +1 -1
- package/dist/common/logs/logger-proxy.js.map +1 -1
- package/dist/common/queue.js +24 -9
- package/dist/common/queue.js.map +1 -1
- package/dist/config.js +5 -10
- package/dist/config.js.map +1 -1
- package/dist/constants.js +203 -28
- package/dist/constants.js.map +1 -1
- package/dist/controls-options-manager/enums.js +14 -2
- package/dist/controls-options-manager/enums.js.map +1 -1
- package/dist/controls-options-manager/index.js +109 -15
- package/dist/controls-options-manager/index.js.map +1 -1
- package/dist/controls-options-manager/types.js +7 -0
- package/dist/controls-options-manager/types.js.map +1 -0
- package/dist/controls-options-manager/util.js +309 -18
- package/dist/controls-options-manager/util.js.map +1 -1
- package/dist/index.js +112 -1
- package/dist/index.js.map +1 -1
- package/dist/interpretation/collection.js +23 -0
- package/dist/interpretation/collection.js.map +1 -0
- package/dist/interpretation/index.js +366 -0
- package/dist/interpretation/index.js.map +1 -0
- package/dist/interpretation/siLanguage.js +25 -0
- package/dist/interpretation/siLanguage.js.map +1 -0
- package/dist/locus-info/controlsUtils.js +91 -2
- package/dist/locus-info/controlsUtils.js.map +1 -1
- package/dist/locus-info/index.js +381 -62
- package/dist/locus-info/index.js.map +1 -1
- package/dist/locus-info/infoUtils.js +7 -1
- package/dist/locus-info/infoUtils.js.map +1 -1
- package/dist/locus-info/mediaSharesUtils.js +57 -1
- package/dist/locus-info/mediaSharesUtils.js.map +1 -1
- package/dist/locus-info/parser.js +224 -63
- package/dist/locus-info/parser.js.map +1 -1
- package/dist/locus-info/selfUtils.js +89 -14
- package/dist/locus-info/selfUtils.js.map +1 -1
- package/dist/media/index.js +58 -116
- package/dist/media/index.js.map +1 -1
- package/dist/media/properties.js +72 -123
- package/dist/media/properties.js.map +1 -1
- package/dist/meeting/in-meeting-actions.js +82 -2
- package/dist/meeting/in-meeting-actions.js.map +1 -1
- package/dist/meeting/index.js +3096 -2823
- package/dist/meeting/index.js.map +1 -1
- package/dist/meeting/locusMediaRequest.js +292 -0
- package/dist/meeting/locusMediaRequest.js.map +1 -0
- package/dist/meeting/muteState.js +230 -124
- package/dist/meeting/muteState.js.map +1 -1
- package/dist/meeting/request.js +256 -196
- package/dist/meeting/request.js.map +1 -1
- package/dist/meeting/util.js +601 -417
- package/dist/meeting/util.js.map +1 -1
- package/dist/meeting-info/index.js +70 -7
- package/dist/meeting-info/index.js.map +1 -1
- package/dist/meeting-info/meeting-info-v2.js +189 -51
- package/dist/meeting-info/meeting-info-v2.js.map +1 -1
- package/dist/meeting-info/util.js +1 -1
- package/dist/meeting-info/util.js.map +1 -1
- package/dist/meeting-info/utilv2.js +36 -36
- package/dist/meeting-info/utilv2.js.map +1 -1
- package/dist/meetings/collection.js +22 -0
- package/dist/meetings/collection.js.map +1 -1
- package/dist/meetings/index.js +394 -94
- package/dist/meetings/index.js.map +1 -1
- package/dist/meetings/meetings.types.js +7 -0
- package/dist/meetings/meetings.types.js.map +1 -0
- package/dist/meetings/request.js +2 -0
- package/dist/meetings/request.js.map +1 -1
- package/dist/meetings/util.js +71 -1
- package/dist/meetings/util.js.map +1 -1
- package/dist/member/index.js +49 -0
- package/dist/member/index.js.map +1 -1
- package/dist/member/types.js +25 -0
- package/dist/member/types.js.map +1 -0
- package/dist/member/util.js +121 -25
- package/dist/member/util.js.map +1 -1
- package/dist/members/collection.js +10 -0
- package/dist/members/collection.js.map +1 -1
- package/dist/members/index.js +86 -5
- package/dist/members/index.js.map +1 -1
- package/dist/members/request.js +106 -38
- package/dist/members/request.js.map +1 -1
- package/dist/members/types.js +15 -0
- package/dist/members/types.js.map +1 -0
- package/dist/members/util.js +316 -233
- package/dist/members/util.js.map +1 -1
- package/dist/metrics/constants.js +10 -5
- package/dist/metrics/constants.js.map +1 -1
- package/dist/metrics/index.js +1 -468
- package/dist/metrics/index.js.map +1 -1
- package/dist/multistream/mediaRequestManager.js +238 -49
- package/dist/multistream/mediaRequestManager.js.map +1 -1
- package/dist/multistream/receiveSlot.js +49 -16
- package/dist/multistream/receiveSlot.js.map +1 -1
- package/dist/multistream/receiveSlotManager.js +52 -34
- package/dist/multistream/receiveSlotManager.js.map +1 -1
- package/dist/multistream/remoteMedia.js +44 -18
- package/dist/multistream/remoteMedia.js.map +1 -1
- package/dist/multistream/remoteMediaGroup.js +60 -3
- package/dist/multistream/remoteMediaGroup.js.map +1 -1
- package/dist/multistream/remoteMediaManager.js +209 -59
- package/dist/multistream/remoteMediaManager.js.map +1 -1
- package/dist/multistream/sendSlotManager.js +233 -0
- package/dist/multistream/sendSlotManager.js.map +1 -0
- package/dist/reachability/index.js +225 -59
- package/dist/reachability/index.js.map +1 -1
- package/dist/reachability/request.js +17 -8
- package/dist/reachability/request.js.map +1 -1
- package/dist/reconnection-manager/index.js +199 -154
- package/dist/reconnection-manager/index.js.map +1 -1
- package/dist/recording-controller/index.js +21 -2
- package/dist/recording-controller/index.js.map +1 -1
- package/dist/recording-controller/util.js +9 -8
- package/dist/recording-controller/util.js.map +1 -1
- package/dist/roap/index.js +23 -29
- package/dist/roap/index.js.map +1 -1
- package/dist/roap/request.js +112 -97
- package/dist/roap/request.js.map +1 -1
- package/dist/roap/turnDiscovery.js +96 -36
- package/dist/roap/turnDiscovery.js.map +1 -1
- package/dist/rtcMetrics/constants.js +12 -0
- package/dist/rtcMetrics/constants.js.map +1 -0
- package/dist/rtcMetrics/index.js +117 -0
- package/dist/rtcMetrics/index.js.map +1 -0
- package/dist/statsAnalyzer/index.js +51 -34
- package/dist/statsAnalyzer/index.js.map +1 -1
- package/dist/statsAnalyzer/mqaUtil.js +6 -6
- package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
- package/dist/types/annotation/annotation.types.d.ts +42 -0
- package/dist/types/annotation/constants.d.ts +31 -0
- package/dist/types/annotation/index.d.ts +117 -0
- package/dist/types/breakouts/edit-lock-error.d.ts +15 -0
- package/dist/types/breakouts/events.d.ts +8 -0
- package/dist/types/breakouts/request.d.ts +22 -0
- package/dist/types/breakouts/utils.d.ts +15 -0
- package/dist/types/common/errors/no-meeting-info.d.ts +14 -0
- package/dist/types/common/errors/webex-errors.d.ts +13 -1
- package/dist/types/common/queue.d.ts +9 -7
- package/dist/types/config.d.ts +1 -6
- package/dist/types/constants.d.ts +161 -21
- package/dist/types/controls-options-manager/enums.d.ts +11 -1
- package/dist/types/controls-options-manager/index.d.ts +17 -1
- package/dist/types/controls-options-manager/types.d.ts +43 -0
- package/dist/types/controls-options-manager/util.d.ts +1 -7
- package/dist/types/index.d.ts +6 -4
- package/dist/types/interpretation/collection.d.ts +5 -0
- package/dist/types/interpretation/index.d.ts +5 -0
- package/dist/types/interpretation/siLanguage.d.ts +5 -0
- package/dist/types/locus-info/index.d.ts +57 -4
- package/dist/types/locus-info/parser.d.ts +65 -6
- package/dist/types/media/index.d.ts +2 -0
- package/dist/types/media/properties.d.ts +34 -48
- package/dist/types/meeting/in-meeting-actions.d.ts +82 -2
- package/dist/types/meeting/index.d.ts +345 -507
- package/dist/types/meeting/locusMediaRequest.d.ts +74 -0
- package/dist/types/meeting/muteState.d.ts +99 -23
- package/dist/types/meeting/request.d.ts +72 -43
- package/dist/types/meeting/util.d.ts +101 -1
- package/dist/types/meeting-info/index.d.ts +13 -1
- package/dist/types/meeting-info/meeting-info-v2.d.ts +31 -1
- package/dist/types/meetings/collection.d.ts +8 -0
- package/dist/types/meetings/index.d.ts +88 -12
- package/dist/types/meetings/meetings.types.d.ts +4 -0
- package/dist/types/member/index.d.ts +13 -0
- package/dist/types/member/types.d.ts +32 -0
- package/dist/types/members/collection.d.ts +5 -0
- package/dist/types/members/index.d.ts +35 -2
- package/dist/types/members/request.d.ts +73 -9
- package/dist/types/members/types.d.ts +24 -0
- package/dist/types/members/util.d.ts +209 -1
- package/dist/types/metrics/constants.d.ts +9 -4
- package/dist/types/metrics/index.d.ts +4 -119
- package/dist/types/multistream/mediaRequestManager.d.ts +73 -5
- package/dist/types/multistream/receiveSlot.d.ts +16 -12
- package/dist/types/multistream/receiveSlotManager.d.ts +19 -4
- package/dist/types/multistream/remoteMedia.d.ts +8 -29
- package/dist/types/multistream/remoteMediaGroup.d.ts +0 -9
- package/dist/types/multistream/remoteMediaManager.d.ts +46 -2
- package/dist/types/multistream/sendSlotManager.d.ts +61 -0
- package/dist/types/reachability/index.d.ts +61 -7
- package/dist/types/reachability/request.d.ts +7 -3
- package/dist/types/reconnection-manager/index.d.ts +9 -0
- package/dist/types/recording-controller/index.d.ts +15 -1
- package/dist/types/recording-controller/util.d.ts +5 -4
- package/dist/types/roap/request.d.ts +15 -11
- package/dist/types/roap/turnDiscovery.d.ts +18 -1
- package/dist/types/rtcMetrics/constants.d.ts +4 -0
- package/dist/types/rtcMetrics/index.d.ts +47 -0
- package/dist/types/statsAnalyzer/index.d.ts +6 -1
- package/package.json +23 -20
- package/src/annotation/annotation.types.ts +50 -0
- package/src/annotation/constants.ts +36 -0
- package/src/annotation/index.ts +328 -0
- package/src/breakouts/README.md +44 -14
- package/src/breakouts/breakout.ts +87 -9
- package/src/breakouts/edit-lock-error.ts +25 -0
- package/src/breakouts/events.ts +56 -0
- package/src/breakouts/index.ts +646 -18
- package/src/breakouts/request.ts +55 -0
- package/src/breakouts/utils.ts +57 -0
- package/src/common/errors/no-meeting-info.ts +24 -0
- package/src/common/errors/webex-errors.ts +27 -2
- package/src/common/logs/logger-proxy.ts +1 -1
- package/src/common/queue.ts +22 -8
- package/src/config.ts +4 -9
- package/src/constants.ts +184 -18
- package/src/controls-options-manager/enums.ts +12 -0
- package/src/controls-options-manager/index.ts +116 -21
- package/src/controls-options-manager/types.ts +59 -0
- package/src/controls-options-manager/util.ts +294 -14
- package/src/index.ts +40 -0
- package/src/interpretation/README.md +60 -0
- package/src/interpretation/collection.ts +19 -0
- package/src/interpretation/index.ts +332 -0
- package/src/interpretation/siLanguage.ts +18 -0
- package/src/locus-info/controlsUtils.ts +108 -0
- package/src/locus-info/index.ts +412 -59
- package/src/locus-info/infoUtils.ts +10 -2
- package/src/locus-info/mediaSharesUtils.ts +64 -0
- package/src/locus-info/parser.ts +231 -39
- package/src/locus-info/selfUtils.ts +81 -5
- package/src/media/index.ts +100 -122
- package/src/media/properties.ts +85 -108
- package/src/meeting/in-meeting-actions.ts +163 -3
- package/src/meeting/index.ts +2495 -2314
- package/src/meeting/locusMediaRequest.ts +313 -0
- package/src/meeting/muteState.ts +229 -131
- package/src/meeting/request.ts +172 -121
- package/src/meeting/util.ts +588 -394
- package/src/meeting-info/index.ts +79 -8
- package/src/meeting-info/meeting-info-v2.ts +168 -14
- package/src/meeting-info/util.ts +1 -1
- package/src/meeting-info/utilv2.ts +23 -23
- package/src/meetings/collection.ts +20 -0
- package/src/meetings/index.ts +428 -108
- package/src/meetings/meetings.types.ts +12 -0
- package/src/meetings/request.ts +2 -0
- package/src/meetings/util.ts +79 -4
- package/src/member/index.ts +49 -0
- package/src/member/types.ts +38 -0
- package/src/member/util.ts +127 -25
- package/src/members/collection.ts +8 -0
- package/src/members/index.ts +107 -6
- package/src/members/request.ts +97 -17
- package/src/members/types.ts +28 -0
- package/src/members/util.ts +319 -240
- package/src/metrics/constants.ts +9 -4
- package/src/metrics/index.ts +1 -490
- package/src/multistream/mediaRequestManager.ts +289 -79
- package/src/multistream/receiveSlot.ts +55 -18
- package/src/multistream/receiveSlotManager.ts +46 -24
- package/src/multistream/remoteMedia.ts +27 -2
- package/src/multistream/remoteMediaGroup.ts +59 -0
- package/src/multistream/remoteMediaManager.ts +148 -30
- package/src/multistream/sendSlotManager.ts +170 -0
- package/src/reachability/index.ts +228 -37
- package/src/reachability/request.ts +17 -8
- package/src/reconnection-manager/index.ts +81 -54
- package/src/recording-controller/index.ts +20 -3
- package/src/recording-controller/util.ts +26 -9
- package/src/roap/index.ts +23 -30
- package/src/roap/request.ts +100 -104
- package/src/roap/turnDiscovery.ts +51 -25
- package/src/rtcMetrics/constants.ts +3 -0
- package/src/rtcMetrics/index.ts +100 -0
- package/src/statsAnalyzer/index.ts +73 -35
- package/src/statsAnalyzer/mqaUtil.ts +8 -10
- package/test/integration/spec/converged-space-meetings.js +60 -3
- package/test/integration/spec/journey.js +320 -261
- package/test/integration/spec/space-meeting.js +76 -3
- package/test/unit/spec/annotation/index.ts +418 -0
- package/test/unit/spec/breakouts/breakout.ts +142 -24
- package/test/unit/spec/breakouts/edit-lock-error.ts +30 -0
- package/test/unit/spec/breakouts/events.ts +89 -0
- package/test/unit/spec/breakouts/index.ts +1488 -67
- package/test/unit/spec/breakouts/request.ts +104 -0
- package/test/unit/spec/breakouts/utils.js +72 -0
- package/test/unit/spec/common/queue.js +31 -2
- package/test/unit/spec/controls-options-manager/index.js +163 -0
- package/test/unit/spec/controls-options-manager/util.js +576 -60
- package/test/unit/spec/fixture/locus.js +1 -0
- package/test/unit/spec/interpretation/collection.ts +15 -0
- package/test/unit/spec/interpretation/index.ts +589 -0
- package/test/unit/spec/interpretation/siLanguage.ts +28 -0
- package/test/unit/spec/locus-info/controlsUtils.js +316 -43
- package/test/unit/spec/locus-info/index.js +1283 -33
- package/test/unit/spec/locus-info/infoUtils.js +37 -15
- package/test/unit/spec/locus-info/mediaSharesUtils.ts +32 -0
- package/test/unit/spec/locus-info/parser.js +62 -22
- package/test/unit/spec/locus-info/selfConstant.js +27 -4
- package/test/unit/spec/locus-info/selfUtils.js +208 -17
- package/test/unit/spec/media/index.ts +104 -37
- package/test/unit/spec/meeting/in-meeting-actions.ts +81 -3
- package/test/unit/spec/meeting/index.js +4172 -1947
- package/test/unit/spec/meeting/locusMediaRequest.ts +442 -0
- package/test/unit/spec/meeting/muteState.js +408 -208
- package/test/unit/spec/meeting/request.js +440 -45
- package/test/unit/spec/meeting/utils.js +679 -64
- package/test/unit/spec/meeting-info/index.js +293 -0
- package/test/unit/spec/meeting-info/meetinginfov2.js +517 -5
- package/test/unit/spec/meeting-info/utilv2.js +21 -0
- package/test/unit/spec/meetings/collection.js +14 -0
- package/test/unit/spec/meetings/index.js +1007 -177
- package/test/unit/spec/meetings/utils.js +206 -2
- package/test/unit/spec/member/index.js +58 -4
- package/test/unit/spec/member/util.js +479 -35
- package/test/unit/spec/members/index.js +319 -1
- package/test/unit/spec/members/request.js +206 -27
- package/test/unit/spec/members/utils.js +184 -0
- package/test/unit/spec/metrics/index.js +1 -50
- package/test/unit/spec/multistream/mediaRequestManager.ts +803 -162
- package/test/unit/spec/multistream/receiveSlot.ts +72 -13
- package/test/unit/spec/multistream/receiveSlotManager.ts +58 -28
- package/test/unit/spec/multistream/remoteMedia.ts +30 -0
- package/test/unit/spec/multistream/remoteMediaGroup.ts +266 -0
- package/test/unit/spec/multistream/remoteMediaManager.ts +326 -0
- package/test/unit/spec/multistream/sendSlotManager.ts +242 -0
- package/test/unit/spec/reachability/index.ts +549 -9
- package/test/unit/spec/reachability/request.js +68 -0
- package/test/unit/spec/reconnection-manager/index.js +84 -9
- package/test/unit/spec/recording-controller/index.js +294 -218
- package/test/unit/spec/recording-controller/util.js +223 -96
- package/test/unit/spec/roap/index.ts +31 -51
- package/test/unit/spec/roap/request.ts +203 -85
- package/test/unit/spec/roap/turnDiscovery.ts +48 -13
- package/test/unit/spec/rtcMetrics/index.ts +68 -0
- package/test/unit/spec/stats-analyzer/index.js +29 -2
- package/test/utils/integrationTestUtils.js +46 -0
- package/test/utils/testUtils.js +0 -52
- package/dist/meeting/effectsState.js +0 -262
- package/dist/meeting/effectsState.js.map +0 -1
- package/dist/metrics/config.js +0 -299
- package/dist/metrics/config.js.map +0 -1
- package/dist/types/meeting/effectsState.d.ts +0 -42
- package/dist/types/metrics/config.d.ts +0 -178
- package/src/index.js +0 -16
- package/src/meeting/effectsState.ts +0 -211
- package/src/metrics/config.ts +0 -495
- package/test/unit/spec/meeting/effectsState.js +0 -285
package/src/meetings/index.ts
CHANGED
|
@@ -2,14 +2,16 @@
|
|
|
2
2
|
|
|
3
3
|
import '@webex/internal-plugin-mercury';
|
|
4
4
|
import '@webex/internal-plugin-conversation';
|
|
5
|
+
import '@webex/internal-plugin-metrics';
|
|
5
6
|
// @ts-ignore
|
|
6
7
|
import {WebexPlugin} from '@webex/webex-core';
|
|
7
8
|
import {setLogger} from '@webex/internal-media-core';
|
|
8
9
|
|
|
10
|
+
import * as mediaHelpersModule from '@webex/media-helpers';
|
|
11
|
+
|
|
9
12
|
import 'webrtc-adapter';
|
|
10
13
|
|
|
11
14
|
import Metrics from '../metrics';
|
|
12
|
-
import {trigger, eventType} from '../metrics/config';
|
|
13
15
|
import LoggerConfig from '../common/logs/logger-config';
|
|
14
16
|
import StaticConfig from '../common/config';
|
|
15
17
|
import LoggerProxy from '../common/logs/logger-proxy';
|
|
@@ -40,6 +42,9 @@ import {
|
|
|
40
42
|
MEETING_REMOVED_REASON,
|
|
41
43
|
_CONVERSATION_URL_,
|
|
42
44
|
CONVERSATION_URL,
|
|
45
|
+
MEETINGNUMBER,
|
|
46
|
+
_JOINED_,
|
|
47
|
+
_MOVED_,
|
|
43
48
|
} from '../constants';
|
|
44
49
|
import BEHAVIORAL_METRICS from '../metrics/constants';
|
|
45
50
|
import MeetingInfo from '../meeting-info';
|
|
@@ -53,6 +58,10 @@ import CaptchaError from '../common/errors/captcha-error';
|
|
|
53
58
|
|
|
54
59
|
import MeetingCollection from './collection';
|
|
55
60
|
import MeetingsUtil from './util';
|
|
61
|
+
import PermissionError from '../common/errors/permission';
|
|
62
|
+
import {INoiseReductionEffect, IVirtualBackgroundEffect} from './meetings.types';
|
|
63
|
+
import {SpaceIDDeprecatedError} from '../common/errors/webex-errors';
|
|
64
|
+
import NoMeetingInfoError from '../common/errors/no-meeting-info';
|
|
56
65
|
|
|
57
66
|
let mediaLogger;
|
|
58
67
|
|
|
@@ -139,12 +148,13 @@ export default class Meetings extends WebexPlugin {
|
|
|
139
148
|
meetingCollection: any;
|
|
140
149
|
personalMeetingRoom: any;
|
|
141
150
|
preferredWebexSite: any;
|
|
142
|
-
reachability:
|
|
151
|
+
reachability: Reachability;
|
|
143
152
|
registered: any;
|
|
144
153
|
request: any;
|
|
145
154
|
geoHintInfo: any;
|
|
146
155
|
meetingInfo: any;
|
|
147
|
-
|
|
156
|
+
mediaHelpers: any;
|
|
157
|
+
breakoutLocusForHandleLater: any;
|
|
148
158
|
namespace = MEETINGS;
|
|
149
159
|
|
|
150
160
|
/**
|
|
@@ -156,6 +166,17 @@ export default class Meetings extends WebexPlugin {
|
|
|
156
166
|
constructor(...args) {
|
|
157
167
|
super(...args);
|
|
158
168
|
|
|
169
|
+
/**
|
|
170
|
+
* The webrtc-core media helpers. This is a temporary solution required for the SDK sample app
|
|
171
|
+
* to be able to call media helper functions.
|
|
172
|
+
*
|
|
173
|
+
* @instance
|
|
174
|
+
* @type {Object}
|
|
175
|
+
* @private
|
|
176
|
+
* @memberof Meetings
|
|
177
|
+
*/
|
|
178
|
+
this.mediaHelpers = mediaHelpersModule;
|
|
179
|
+
|
|
159
180
|
/**
|
|
160
181
|
* The Meetings request to interact with server
|
|
161
182
|
* @instance
|
|
@@ -183,15 +204,17 @@ export default class Meetings extends WebexPlugin {
|
|
|
183
204
|
* @memberof Meetings
|
|
184
205
|
*/
|
|
185
206
|
this.personalMeetingRoom = null;
|
|
207
|
+
|
|
186
208
|
/**
|
|
187
|
-
* The Reachability object to interact with server
|
|
209
|
+
* The Reachability object to interact with server
|
|
188
210
|
* starts as null
|
|
189
211
|
* @instance
|
|
190
212
|
* @type {Object}
|
|
191
213
|
* @private
|
|
192
214
|
* @memberof Meetings
|
|
193
215
|
*/
|
|
194
|
-
|
|
216
|
+
// @ts-ignore
|
|
217
|
+
this.reachability = new Reachability(this.webex);
|
|
195
218
|
|
|
196
219
|
/**
|
|
197
220
|
* If the meetings plugin has been registered and listening via {@link Meetings#register}
|
|
@@ -221,30 +244,137 @@ export default class Meetings extends WebexPlugin {
|
|
|
221
244
|
*/
|
|
222
245
|
this.media = {
|
|
223
246
|
getUserMedia: Media.getUserMedia,
|
|
224
|
-
getSupportedDevice: Media.getSupportedDevice,
|
|
225
247
|
};
|
|
226
248
|
|
|
227
249
|
this.onReady();
|
|
228
250
|
}
|
|
229
251
|
|
|
230
252
|
/**
|
|
231
|
-
*
|
|
253
|
+
* check whether you need to handle this main session's locus data or not
|
|
254
|
+
* @param {Object} meeting current meeting data
|
|
255
|
+
* @param {Object} newLocus new locus data
|
|
256
|
+
* @returns {boolean}
|
|
257
|
+
* @private
|
|
258
|
+
* @memberof Meetings
|
|
259
|
+
*/
|
|
260
|
+
private isNeedHandleMainLocus(meeting: any, newLocus: any) {
|
|
261
|
+
const breakoutUrl = newLocus.controls?.breakout?.url;
|
|
262
|
+
const breakoutLocus = this.meetingCollection.getActiveBreakoutLocus(breakoutUrl);
|
|
263
|
+
|
|
264
|
+
const isSelfJoined = newLocus?.self?.state === _JOINED_;
|
|
265
|
+
const isSelfMoved = newLocus?.self?.state === _LEFT_ && newLocus?.self?.reason === _MOVED_;
|
|
266
|
+
// @ts-ignore
|
|
267
|
+
const deviceFromNewLocus = MeetingsUtil.getThisDevice(newLocus, this.webex.internal.device.url);
|
|
268
|
+
const isResourceMovedOnThisDevice =
|
|
269
|
+
deviceFromNewLocus?.state === _LEFT_ && deviceFromNewLocus?.reason === _MOVED_;
|
|
270
|
+
|
|
271
|
+
const isNewLocusJoinThisDevice = MeetingsUtil.joinedOnThisDevice(
|
|
272
|
+
meeting,
|
|
273
|
+
newLocus,
|
|
274
|
+
// @ts-ignore
|
|
275
|
+
this.webex.internal.device.url
|
|
276
|
+
);
|
|
277
|
+
const isBreakoutLocusJoinThisDevice =
|
|
278
|
+
breakoutLocus?.joinedWith?.correlationId &&
|
|
279
|
+
breakoutLocus.joinedWith.correlationId === meeting?.correlationId;
|
|
280
|
+
|
|
281
|
+
if (isSelfJoined && isNewLocusJoinThisDevice) {
|
|
282
|
+
LoggerProxy.logger.log(
|
|
283
|
+
'Meetings:index#isNeedHandleMainLocus --> self this device shown as JOINED in the main session'
|
|
284
|
+
);
|
|
285
|
+
if (breakoutLocus?.joinedWith && deviceFromNewLocus) {
|
|
286
|
+
const breakoutReplaceAt =
|
|
287
|
+
breakoutLocus.joinedWith.replaces?.length > 0
|
|
288
|
+
? breakoutLocus.joinedWith.replaces[0].replaceAt
|
|
289
|
+
: '';
|
|
290
|
+
const newLocusReplaceAt =
|
|
291
|
+
deviceFromNewLocus.replaces?.length > 0 ? deviceFromNewLocus.replaces[0].replaceAt : '';
|
|
292
|
+
if (breakoutReplaceAt && newLocusReplaceAt && breakoutReplaceAt > newLocusReplaceAt) {
|
|
293
|
+
LoggerProxy.logger.log(
|
|
294
|
+
`Meetings:index#isNeedHandleMainLocus --> this is expired main joined status locus_dto replacedAt ${newLocusReplaceAt} bo replacedAt ${breakoutReplaceAt}`
|
|
295
|
+
);
|
|
296
|
+
|
|
297
|
+
return false;
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
return true;
|
|
302
|
+
}
|
|
303
|
+
if (isBreakoutLocusJoinThisDevice) {
|
|
304
|
+
LoggerProxy.logger.log(
|
|
305
|
+
`Meetings:index#isNeedHandleMainLocus --> there is active breakout session and joined on this device, and don't need to handle main session: ${breakoutUrl}`
|
|
306
|
+
);
|
|
307
|
+
|
|
308
|
+
return false;
|
|
309
|
+
}
|
|
310
|
+
if (isSelfMoved && (newLocus?.self?.removed || isResourceMovedOnThisDevice)) {
|
|
311
|
+
LoggerProxy.logger.log(
|
|
312
|
+
'Meetings:index#isNeedHandleMainLocus --> self moved main locus with self removed status or with device resource moved, not need to handle'
|
|
313
|
+
);
|
|
314
|
+
|
|
315
|
+
return false;
|
|
316
|
+
}
|
|
317
|
+
if (isSelfJoined && isResourceMovedOnThisDevice) {
|
|
318
|
+
LoggerProxy.logger.log(
|
|
319
|
+
'Meetings:index#isNeedHandleMainLocus --> self device left&moved in main locus with self joined status, not need to handle'
|
|
320
|
+
);
|
|
321
|
+
|
|
322
|
+
return false;
|
|
323
|
+
}
|
|
324
|
+
LoggerProxy.logger.log(
|
|
325
|
+
'Meetings:index#isNeedHandleMainLocus --> this is a normal main session locusDTO update case'
|
|
326
|
+
);
|
|
327
|
+
|
|
328
|
+
return true;
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
/**
|
|
332
|
+
* check whether you need to handle this locus data or not
|
|
333
|
+
* @param {Object} meeting old locus data
|
|
334
|
+
* @param {Object} newLocus new locus data
|
|
335
|
+
* @returns {boolean}
|
|
336
|
+
* @private
|
|
337
|
+
* @memberof Meetings
|
|
338
|
+
*/
|
|
339
|
+
private isNeedHandleLocusDTO(meeting: any, newLocus: any) {
|
|
340
|
+
if (newLocus) {
|
|
341
|
+
const isNewLocusAsBreakout = MeetingsUtil.isBreakoutLocusDTO(newLocus);
|
|
342
|
+
const isSelfMoved = newLocus?.self?.state === _LEFT_ && newLocus?.self?.reason === _MOVED_;
|
|
343
|
+
if (!meeting) {
|
|
344
|
+
if (isNewLocusAsBreakout) {
|
|
345
|
+
LoggerProxy.logger.log(
|
|
346
|
+
`Meetings:index#isNeedHandleLocusDTO --> the first breakout session locusDTO active status: ${newLocus.fullState?.active}`
|
|
347
|
+
);
|
|
348
|
+
|
|
349
|
+
return newLocus.self?.state === _JOINED_;
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
return this.isNeedHandleMainLocus(meeting, newLocus);
|
|
353
|
+
}
|
|
354
|
+
if (!isNewLocusAsBreakout) {
|
|
355
|
+
return this.isNeedHandleMainLocus(meeting, newLocus);
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
return !isSelfMoved;
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
return true;
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
/**
|
|
365
|
+
* get corresponding meeting object by locus data
|
|
232
366
|
* @param {Object} data a locus event
|
|
233
367
|
* @param {String} data.locusUrl
|
|
234
368
|
* @param {Object} data.locus
|
|
235
|
-
* @
|
|
236
|
-
* @param {String} data.eventType
|
|
237
|
-
* @returns {undefined}
|
|
369
|
+
* @returns {Object}
|
|
238
370
|
* @private
|
|
239
371
|
* @memberof Meetings
|
|
240
372
|
*/
|
|
241
|
-
|
|
242
|
-
let meeting = null;
|
|
243
|
-
|
|
373
|
+
getCorrespondingMeetingByLocus(data) {
|
|
244
374
|
// getting meeting by correlationId. This will happen for the new event
|
|
245
375
|
// Either the locus
|
|
246
376
|
// TODO : Add check for the callBack Address
|
|
247
|
-
|
|
377
|
+
return (
|
|
248
378
|
this.meetingCollection.getByKey(LOCUS_URL, data.locusUrl) ||
|
|
249
379
|
// @ts-ignore
|
|
250
380
|
this.meetingCollection.getByKey(
|
|
@@ -260,7 +390,24 @@ export default class Meetings extends WebexPlugin {
|
|
|
260
390
|
) ||
|
|
261
391
|
(data.locus.info?.isUnifiedSpaceMeeting
|
|
262
392
|
? undefined
|
|
263
|
-
: this.meetingCollection.getByKey(CONVERSATION_URL, data.locus.conversationUrl))
|
|
393
|
+
: this.meetingCollection.getByKey(CONVERSATION_URL, data.locus.conversationUrl)) ||
|
|
394
|
+
this.meetingCollection.getByKey(MEETINGNUMBER, data.locus?.info?.webExMeetingId)
|
|
395
|
+
);
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
/**
|
|
399
|
+
* handle locus events and takes meeting actions with them as they come in
|
|
400
|
+
* @param {Object} data a locus event
|
|
401
|
+
* @param {String} data.locusUrl
|
|
402
|
+
* @param {Object} data.locus
|
|
403
|
+
* @param {Boolean} useRandomDelayForInfo whether a random delay should be added to fetching meeting info
|
|
404
|
+
* @param {String} data.eventType
|
|
405
|
+
* @returns {undefined}
|
|
406
|
+
* @private
|
|
407
|
+
* @memberof Meetings
|
|
408
|
+
*/
|
|
409
|
+
private handleLocusEvent(data: {locusUrl: string; locus: any}, useRandomDelayForInfo = false) {
|
|
410
|
+
let meeting = this.getCorrespondingMeetingByLocus(data);
|
|
264
411
|
|
|
265
412
|
// Special case when locus has got replaced, This only happend once if a replace locus exists
|
|
266
413
|
// https://sqbu-github.cisco.com/WebExSquared/locus/wiki/Locus-changing-mid-call
|
|
@@ -273,6 +420,16 @@ export default class Meetings extends WebexPlugin {
|
|
|
273
420
|
);
|
|
274
421
|
}
|
|
275
422
|
|
|
423
|
+
if (meeting && !MeetingsUtil.isBreakoutLocusDTO(data.locus)) {
|
|
424
|
+
meeting.locusInfo.updateMainSessionLocusCache(data.locus);
|
|
425
|
+
}
|
|
426
|
+
if (!this.isNeedHandleLocusDTO(meeting, data.locus)) {
|
|
427
|
+
LoggerProxy.logger.log(
|
|
428
|
+
`Meetings:index#handleLocusEvent --> doesn't need to process locus event`
|
|
429
|
+
);
|
|
430
|
+
|
|
431
|
+
return;
|
|
432
|
+
}
|
|
276
433
|
if (!meeting) {
|
|
277
434
|
// TODO: create meeting when we get a meeting object
|
|
278
435
|
// const checkForEnded = (locus) => {
|
|
@@ -329,6 +486,7 @@ export default class Meetings extends WebexPlugin {
|
|
|
329
486
|
|
|
330
487
|
// It's a new meeting so initialize the locus data
|
|
331
488
|
meeting.locusInfo.initialSetup(data.locus);
|
|
489
|
+
this.checkHandleBreakoutLocus(data.locus);
|
|
332
490
|
})
|
|
333
491
|
.catch((e) => {
|
|
334
492
|
LoggerProxy.logger.error(e);
|
|
@@ -338,10 +496,15 @@ export default class Meetings extends WebexPlugin {
|
|
|
338
496
|
// because the other user left so before sending 'added' event make sure it exists in the collection
|
|
339
497
|
|
|
340
498
|
if (this.getMeetingByType(_ID_, meeting.id)) {
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
499
|
+
// @ts-ignore
|
|
500
|
+
this.webex.internal.newMetrics.submitClientEvent({
|
|
501
|
+
name: 'client.call.remote-started',
|
|
502
|
+
payload: {
|
|
503
|
+
trigger: 'mercury-event',
|
|
504
|
+
},
|
|
505
|
+
options: {
|
|
506
|
+
meetingId: meeting.id,
|
|
507
|
+
},
|
|
345
508
|
});
|
|
346
509
|
Trigger.trigger(
|
|
347
510
|
this,
|
|
@@ -494,7 +657,7 @@ export default class Meetings extends WebexPlugin {
|
|
|
494
657
|
|
|
495
658
|
MeetingsUtil.checkH264Support({disableNotifications: true});
|
|
496
659
|
// @ts-ignore
|
|
497
|
-
Metrics.initialSetup(this.
|
|
660
|
+
Metrics.initialSetup(this.webex);
|
|
498
661
|
});
|
|
499
662
|
}
|
|
500
663
|
|
|
@@ -663,6 +826,36 @@ export default class Meetings extends WebexPlugin {
|
|
|
663
826
|
);
|
|
664
827
|
}
|
|
665
828
|
|
|
829
|
+
/**
|
|
830
|
+
* Creates a noise reduction effect
|
|
831
|
+
*
|
|
832
|
+
* @param {INoiseReductionEffect} options optional custom effect options
|
|
833
|
+
* @returns {Promise<effect>} noise reduction effect.
|
|
834
|
+
* @public
|
|
835
|
+
* @memberof Meetings
|
|
836
|
+
*/
|
|
837
|
+
createNoiseReductionEffect = async (options?: INoiseReductionEffect) => {
|
|
838
|
+
// @ts-ignore
|
|
839
|
+
const authToken = this.webex.credentials.supertoken.access_token;
|
|
840
|
+
|
|
841
|
+
return new mediaHelpersModule.NoiseReductionEffect({authToken, ...options});
|
|
842
|
+
};
|
|
843
|
+
|
|
844
|
+
/**
|
|
845
|
+
* Creates a virtual background effect
|
|
846
|
+
*
|
|
847
|
+
* @param {IVirtualBackgroundEffect} options optional custom effect options
|
|
848
|
+
* @returns {Promise<effect>} virtual background effect.
|
|
849
|
+
* @public
|
|
850
|
+
* @memberof Meetings
|
|
851
|
+
*/
|
|
852
|
+
createVirtualBackgroundEffect = async (options?: IVirtualBackgroundEffect) => {
|
|
853
|
+
// @ts-ignore
|
|
854
|
+
const authToken = this.webex.credentials.supertoken.access_token;
|
|
855
|
+
|
|
856
|
+
return new mediaHelpersModule.VirtualBackgroundEffect({authToken, ...options});
|
|
857
|
+
};
|
|
858
|
+
|
|
666
859
|
/**
|
|
667
860
|
* Uploads logs to the webex services for tracking
|
|
668
861
|
* @param {Object} [options={}]
|
|
@@ -695,6 +888,7 @@ export default class Meetings extends WebexPlugin {
|
|
|
695
888
|
'Meetings:index#uploadLogs --> Upload logs for meeting completed.',
|
|
696
889
|
uploadResult
|
|
697
890
|
);
|
|
891
|
+
Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.UPLOAD_LOGS_SUCCESS, options);
|
|
698
892
|
Trigger.trigger(
|
|
699
893
|
this,
|
|
700
894
|
{
|
|
@@ -729,8 +923,7 @@ export default class Meetings extends WebexPlugin {
|
|
|
729
923
|
);
|
|
730
924
|
|
|
731
925
|
Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.UPLOAD_LOGS_FAILURE, {
|
|
732
|
-
|
|
733
|
-
meetingId: options.meetingsId,
|
|
926
|
+
...options,
|
|
734
927
|
reason: uploadError.message,
|
|
735
928
|
stack: uploadError.stack,
|
|
736
929
|
code: uploadError.code,
|
|
@@ -738,17 +931,6 @@ export default class Meetings extends WebexPlugin {
|
|
|
738
931
|
});
|
|
739
932
|
}
|
|
740
933
|
|
|
741
|
-
/**
|
|
742
|
-
* initializes the reachability instance for Meetings
|
|
743
|
-
* @returns {undefined}
|
|
744
|
-
* @public
|
|
745
|
-
* @memberof Meetings
|
|
746
|
-
*/
|
|
747
|
-
setReachability() {
|
|
748
|
-
// @ts-ignore
|
|
749
|
-
this.reachability = new Reachability(this.webex);
|
|
750
|
-
}
|
|
751
|
-
|
|
752
934
|
/**
|
|
753
935
|
* gets the reachability instance for Meetings
|
|
754
936
|
* @returns {Reachability}
|
|
@@ -766,10 +948,6 @@ export default class Meetings extends WebexPlugin {
|
|
|
766
948
|
* @memberof Meetings
|
|
767
949
|
*/
|
|
768
950
|
startReachability() {
|
|
769
|
-
if (!this.reachability) {
|
|
770
|
-
this.setReachability();
|
|
771
|
-
}
|
|
772
|
-
|
|
773
951
|
return this.getReachability().gatherReachability();
|
|
774
952
|
}
|
|
775
953
|
|
|
@@ -797,6 +975,29 @@ export default class Meetings extends WebexPlugin {
|
|
|
797
975
|
if (res) {
|
|
798
976
|
this.preferredWebexSite = MeetingsUtil.parseDefaultSiteFromMeetingPreferences(res);
|
|
799
977
|
}
|
|
978
|
+
|
|
979
|
+
// fall back to getting the preferred site from the user information
|
|
980
|
+
if (!this.preferredWebexSite) {
|
|
981
|
+
// @ts-ignore
|
|
982
|
+
return this.webex.internal.user
|
|
983
|
+
.get()
|
|
984
|
+
.then((user) => {
|
|
985
|
+
const preferredWebexSite =
|
|
986
|
+
user?.userPreferences?.userPreferencesItems?.preferredWebExSite;
|
|
987
|
+
if (preferredWebexSite) {
|
|
988
|
+
this.preferredWebexSite = preferredWebexSite;
|
|
989
|
+
} else {
|
|
990
|
+
throw new Error('site not found');
|
|
991
|
+
}
|
|
992
|
+
})
|
|
993
|
+
.catch(() => {
|
|
994
|
+
LoggerProxy.logger.error(
|
|
995
|
+
'Failed to fetch preferred site from user - no site will be set'
|
|
996
|
+
);
|
|
997
|
+
});
|
|
998
|
+
}
|
|
999
|
+
|
|
1000
|
+
return Promise.resolve();
|
|
800
1001
|
});
|
|
801
1002
|
}
|
|
802
1003
|
|
|
@@ -838,14 +1039,24 @@ export default class Meetings extends WebexPlugin {
|
|
|
838
1039
|
|
|
839
1040
|
/**
|
|
840
1041
|
* Create a meeting.
|
|
841
|
-
* @param {string} destination - sipURL,
|
|
1042
|
+
* @param {string} destination - sipURL, phonenumber, or locus object}
|
|
842
1043
|
* @param {string} [type] - the optional specified type, such as locusId
|
|
843
1044
|
* @param {Boolean} useRandomDelayForInfo - whether a random delay should be added to fetching meeting info
|
|
1045
|
+
* @param {Object} infoExtraParams extra parameters to be provided when fetching meeting info
|
|
1046
|
+
* @param {string} correlationId - the optional specified correlationId
|
|
1047
|
+
* @param {Boolean} failOnMissingMeetingInfo - whether to throw an error if meeting info fails to fetch (for calls that are not 1:1 or content share)
|
|
844
1048
|
* @returns {Promise<Meeting>} A new Meeting.
|
|
845
1049
|
* @public
|
|
846
1050
|
* @memberof Meetings
|
|
847
1051
|
*/
|
|
848
|
-
public create(
|
|
1052
|
+
public create(
|
|
1053
|
+
destination: string,
|
|
1054
|
+
type: string = null,
|
|
1055
|
+
useRandomDelayForInfo = false,
|
|
1056
|
+
infoExtraParams = {},
|
|
1057
|
+
correlationId: string = undefined,
|
|
1058
|
+
failOnMissingMeetingInfo = false
|
|
1059
|
+
) {
|
|
849
1060
|
// TODO: type should be from a dictionary
|
|
850
1061
|
|
|
851
1062
|
// Validate meeting information based on the provided destination and
|
|
@@ -857,9 +1068,12 @@ export default class Meetings extends WebexPlugin {
|
|
|
857
1068
|
.fetchInfoOptions(destination, type)
|
|
858
1069
|
// Catch a failure to fetch info options.
|
|
859
1070
|
.catch((error) => {
|
|
860
|
-
LoggerProxy.logger.
|
|
861
|
-
`Meetings:index#create -->
|
|
1071
|
+
LoggerProxy.logger.error(
|
|
1072
|
+
`Meetings:index#create --> ERROR, unable to determine info options: ${error.message}`
|
|
862
1073
|
);
|
|
1074
|
+
if (error instanceof SpaceIDDeprecatedError) {
|
|
1075
|
+
throw new SpaceIDDeprecatedError();
|
|
1076
|
+
}
|
|
863
1077
|
})
|
|
864
1078
|
.then((options: any = {}) => {
|
|
865
1079
|
// Normalize the destination.
|
|
@@ -890,48 +1104,53 @@ export default class Meetings extends WebexPlugin {
|
|
|
890
1104
|
// Validate if a meeting was found.
|
|
891
1105
|
if (!meeting) {
|
|
892
1106
|
// Create a meeting based on the normalized destination and type.
|
|
893
|
-
return this.createMeeting(
|
|
894
|
-
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
|
|
898
|
-
|
|
899
|
-
|
|
900
|
-
|
|
901
|
-
|
|
902
|
-
|
|
903
|
-
|
|
904
|
-
|
|
905
|
-
|
|
906
|
-
|
|
907
|
-
|
|
908
|
-
|
|
909
|
-
|
|
910
|
-
|
|
911
|
-
|
|
912
|
-
|
|
913
|
-
|
|
914
|
-
|
|
915
|
-
|
|
916
|
-
|
|
917
|
-
|
|
918
|
-
|
|
919
|
-
|
|
920
|
-
|
|
921
|
-
|
|
922
|
-
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
|
|
926
|
-
|
|
927
|
-
|
|
928
|
-
|
|
929
|
-
|
|
930
|
-
|
|
931
|
-
|
|
932
|
-
|
|
1107
|
+
return this.createMeeting(
|
|
1108
|
+
targetDest,
|
|
1109
|
+
type,
|
|
1110
|
+
useRandomDelayForInfo,
|
|
1111
|
+
infoExtraParams,
|
|
1112
|
+
correlationId,
|
|
1113
|
+
failOnMissingMeetingInfo
|
|
1114
|
+
).then((createdMeeting: any) => {
|
|
1115
|
+
// If the meeting was successfully created.
|
|
1116
|
+
if (createdMeeting && createdMeeting.on) {
|
|
1117
|
+
// Create a destruction event for the meeting.
|
|
1118
|
+
createdMeeting.on(EVENTS.DESTROY_MEETING, (payload) => {
|
|
1119
|
+
// @ts-ignore
|
|
1120
|
+
if (this.config.autoUploadLogs) {
|
|
1121
|
+
this.uploadLogs({
|
|
1122
|
+
callStart: createdMeeting.locusInfo?.fullState?.lastActive,
|
|
1123
|
+
correlationId: createdMeeting.correlationId,
|
|
1124
|
+
feedbackId: createdMeeting.correlationId,
|
|
1125
|
+
locusId: createdMeeting.locusId,
|
|
1126
|
+
meetingId: createdMeeting.locusInfo?.info?.webExMeetingId,
|
|
1127
|
+
}).then(() => this.destroy(createdMeeting, payload.reason));
|
|
1128
|
+
} else {
|
|
1129
|
+
this.destroy(createdMeeting, payload.reason);
|
|
1130
|
+
}
|
|
1131
|
+
});
|
|
1132
|
+
|
|
1133
|
+
createdMeeting.on(EVENTS.REQUEST_UPLOAD_LOGS, (meetingInstance) => {
|
|
1134
|
+
// @ts-ignore
|
|
1135
|
+
if (this.config.autoUploadLogs) {
|
|
1136
|
+
this.uploadLogs({
|
|
1137
|
+
callStart: meetingInstance?.locusInfo?.fullState?.lastActive,
|
|
1138
|
+
correlationId: meetingInstance.correlationId,
|
|
1139
|
+
feedbackId: meetingInstance.correlationId,
|
|
1140
|
+
locusId: meetingInstance.locusId,
|
|
1141
|
+
meetingId: meetingInstance.locusInfo?.info?.webExMeetingId,
|
|
1142
|
+
});
|
|
1143
|
+
}
|
|
1144
|
+
});
|
|
1145
|
+
} else {
|
|
1146
|
+
LoggerProxy.logger.error(
|
|
1147
|
+
`Meetings:index#create --> ERROR, meeting does not have on method, will not be destroyed, meeting cleanup impossible for meeting: ${meeting}`
|
|
1148
|
+
);
|
|
933
1149
|
}
|
|
934
|
-
|
|
1150
|
+
|
|
1151
|
+
// Return the newly created meeting.
|
|
1152
|
+
return Promise.resolve(createdMeeting);
|
|
1153
|
+
});
|
|
935
1154
|
}
|
|
936
1155
|
|
|
937
1156
|
// Return the existing meeting.
|
|
@@ -944,6 +1163,9 @@ export default class Meetings extends WebexPlugin {
|
|
|
944
1163
|
* @param {String} destination see create()
|
|
945
1164
|
* @param {String} type see create()
|
|
946
1165
|
* @param {Boolean} useRandomDelayForInfo whether a random delay should be added to fetching meeting info
|
|
1166
|
+
* @param {Object} infoExtraParams extra parameters to be provided when fetching meeting info
|
|
1167
|
+
* @param {String} correlationId the optional specified correlationId
|
|
1168
|
+
* @param {Boolean} failOnMissingMeetingInfo - whether to throw an error if meeting info fails to fetch (for calls that are not 1:1 or content share)
|
|
947
1169
|
* @returns {Promise} a new meeting instance complete with meeting info and destination
|
|
948
1170
|
* @private
|
|
949
1171
|
* @memberof Meetings
|
|
@@ -951,7 +1173,10 @@ export default class Meetings extends WebexPlugin {
|
|
|
951
1173
|
private async createMeeting(
|
|
952
1174
|
destination: any,
|
|
953
1175
|
type: string = null,
|
|
954
|
-
useRandomDelayForInfo = false
|
|
1176
|
+
useRandomDelayForInfo = false,
|
|
1177
|
+
infoExtraParams = {},
|
|
1178
|
+
correlationId: string = undefined,
|
|
1179
|
+
failOnMissingMeetingInfo = false
|
|
955
1180
|
) {
|
|
956
1181
|
const meeting = new Meeting(
|
|
957
1182
|
{
|
|
@@ -965,6 +1190,7 @@ export default class Meetings extends WebexPlugin {
|
|
|
965
1190
|
meetingInfoProvider: this.meetingInfo,
|
|
966
1191
|
destination,
|
|
967
1192
|
destinationType: type,
|
|
1193
|
+
correlationId,
|
|
968
1194
|
},
|
|
969
1195
|
{
|
|
970
1196
|
// @ts-ignore
|
|
@@ -999,19 +1225,38 @@ export default class Meetings extends WebexPlugin {
|
|
|
999
1225
|
|
|
1000
1226
|
if (enableUnifiedMeetings && !isMeetingActive && useRandomDelayForInfo && waitingTime > 0) {
|
|
1001
1227
|
meeting.fetchMeetingInfoTimeoutId = setTimeout(
|
|
1002
|
-
() =>
|
|
1228
|
+
() =>
|
|
1229
|
+
meeting.fetchMeetingInfo({
|
|
1230
|
+
extraParams: infoExtraParams,
|
|
1231
|
+
sendCAevents: !!correlationId, // if client sends correlation id as argument of public create(), then it means that this meeting creation is part of a pre-join intent from user
|
|
1232
|
+
}),
|
|
1003
1233
|
waitingTime
|
|
1004
1234
|
);
|
|
1005
1235
|
meeting.parseMeetingInfo(undefined, destination);
|
|
1006
1236
|
} else {
|
|
1007
|
-
await meeting.fetchMeetingInfo({
|
|
1237
|
+
await meeting.fetchMeetingInfo({
|
|
1238
|
+
extraParams: infoExtraParams,
|
|
1239
|
+
sendCAevents: !!correlationId, // if client sends correlation id as argument of public create(), then it means that this meeting creation is part of a pre-join intent from user
|
|
1240
|
+
});
|
|
1008
1241
|
}
|
|
1009
1242
|
} catch (err) {
|
|
1010
|
-
if (
|
|
1011
|
-
|
|
1243
|
+
if (
|
|
1244
|
+
!(err instanceof CaptchaError) &&
|
|
1245
|
+
!(err instanceof PasswordError) &&
|
|
1246
|
+
!(err instanceof PermissionError)
|
|
1247
|
+
) {
|
|
1012
1248
|
LoggerProxy.logger.info(
|
|
1013
1249
|
`Meetings:index#createMeeting --> Info Unable to fetch meeting info for ${destination}.`
|
|
1014
1250
|
);
|
|
1251
|
+
if (failOnMissingMeetingInfo) {
|
|
1252
|
+
LoggerProxy.logger.info(
|
|
1253
|
+
`Meetings:index#createMeeting --> Destroying meeting due to missing meeting info.`
|
|
1254
|
+
);
|
|
1255
|
+
// @ts-ignore
|
|
1256
|
+
this.destroy(meeting, MEETING_REMOVED_REASON.MISSING_MEETING_INFO);
|
|
1257
|
+
throw new NoMeetingInfoError();
|
|
1258
|
+
}
|
|
1259
|
+
// if there is no meeting info and no error should be thrown then we assume its a 1:1 call or wireless share
|
|
1015
1260
|
LoggerProxy.logger.info(
|
|
1016
1261
|
'Meetings:index#createMeeting --> Info assuming this destination is a 1:1 or wireless share'
|
|
1017
1262
|
);
|
|
@@ -1064,7 +1309,7 @@ export default class Meetings extends WebexPlugin {
|
|
|
1064
1309
|
//
|
|
1065
1310
|
// Our job is to determine the appropriate one
|
|
1066
1311
|
// and its corresponding service so that developers
|
|
1067
|
-
// need only sipURL
|
|
1312
|
+
// need only sipURL to get a meeting
|
|
1068
1313
|
// and its ID, but have the option to use createWithType()
|
|
1069
1314
|
// and specify those types to get meetingInfo
|
|
1070
1315
|
}
|
|
@@ -1108,33 +1353,108 @@ export default class Meetings extends WebexPlugin {
|
|
|
1108
1353
|
* @memberof Meetings
|
|
1109
1354
|
*/
|
|
1110
1355
|
public syncMeetings() {
|
|
1111
|
-
return this.request
|
|
1112
|
-
|
|
1113
|
-
|
|
1114
|
-
|
|
1115
|
-
|
|
1116
|
-
|
|
1117
|
-
this.
|
|
1118
|
-
|
|
1119
|
-
|
|
1356
|
+
return this.request
|
|
1357
|
+
.getActiveMeetings()
|
|
1358
|
+
.then((locusArray) => {
|
|
1359
|
+
const activeLocusUrl = [];
|
|
1360
|
+
|
|
1361
|
+
if (locusArray?.loci && locusArray.loci.length > 0) {
|
|
1362
|
+
const lociToUpdate = this.sortLocusArrayToUpdate(locusArray.loci);
|
|
1363
|
+
lociToUpdate.forEach((locus) => {
|
|
1364
|
+
activeLocusUrl.push(locus.url);
|
|
1365
|
+
this.handleLocusEvent({
|
|
1366
|
+
locus,
|
|
1367
|
+
locusUrl: locus.url,
|
|
1368
|
+
});
|
|
1120
1369
|
});
|
|
1121
|
-
}
|
|
1122
|
-
|
|
1123
|
-
const meetingsCollection = this.meetingCollection.getAll();
|
|
1370
|
+
}
|
|
1371
|
+
const meetingsCollection = this.meetingCollection.getAll();
|
|
1124
1372
|
|
|
1125
|
-
|
|
1126
|
-
|
|
1127
|
-
|
|
1128
|
-
|
|
1129
|
-
// @ts-ignore
|
|
1130
|
-
if (!activeLocusUrl.includes(meeting.locusUrl)) {
|
|
1131
|
-
// destroy function also uploads logs
|
|
1373
|
+
if (Object.keys(meetingsCollection).length > 0) {
|
|
1374
|
+
// Some time the mercury event is missed after mercury reconnect
|
|
1375
|
+
// if sync returns no locus then clear all the meetings
|
|
1376
|
+
for (const meeting of Object.values(meetingsCollection)) {
|
|
1132
1377
|
// @ts-ignore
|
|
1133
|
-
|
|
1378
|
+
if (!activeLocusUrl.includes(meeting.locusUrl)) {
|
|
1379
|
+
// destroy function also uploads logs
|
|
1380
|
+
// @ts-ignore
|
|
1381
|
+
this.destroy(meeting, MEETING_REMOVED_REASON.NO_MEETINGS_TO_SYNC);
|
|
1382
|
+
}
|
|
1134
1383
|
}
|
|
1135
1384
|
}
|
|
1385
|
+
})
|
|
1386
|
+
.catch((error) => {
|
|
1387
|
+
LoggerProxy.logger.error(
|
|
1388
|
+
`Meetings:index#syncMeetings --> failed to sync meetings, ${error}`
|
|
1389
|
+
);
|
|
1390
|
+
throw new Error(error);
|
|
1391
|
+
});
|
|
1392
|
+
}
|
|
1393
|
+
|
|
1394
|
+
/**
|
|
1395
|
+
* sort out locus array for initial creating
|
|
1396
|
+
* @param {Array} loci original locus array
|
|
1397
|
+
* @returns {undefined}
|
|
1398
|
+
* @public
|
|
1399
|
+
* @memberof Meetings
|
|
1400
|
+
*/
|
|
1401
|
+
sortLocusArrayToUpdate(loci: any[]) {
|
|
1402
|
+
const mainLoci = loci.filter((locus) => !MeetingsUtil.isBreakoutLocusDTO(locus));
|
|
1403
|
+
const breakoutLoci = loci.filter((locus) => MeetingsUtil.isValidBreakoutLocus(locus));
|
|
1404
|
+
this.breakoutLocusForHandleLater = [];
|
|
1405
|
+
const lociToUpdate = [...mainLoci];
|
|
1406
|
+
breakoutLoci.forEach((breakoutLocus) => {
|
|
1407
|
+
const associateMainLocus = mainLoci.find(
|
|
1408
|
+
(mainLocus) => mainLocus.controls?.breakout?.url === breakoutLocus.controls?.breakout?.url
|
|
1409
|
+
);
|
|
1410
|
+
const existCorrespondingMeeting = this.getCorrespondingMeetingByLocus({
|
|
1411
|
+
locus: breakoutLocus,
|
|
1412
|
+
locusUrl: breakoutLocus.url,
|
|
1413
|
+
});
|
|
1414
|
+
|
|
1415
|
+
if (associateMainLocus && !existCorrespondingMeeting) {
|
|
1416
|
+
// if exists both main session and breakout session locus of the same non-exist meeting, handle main locus first,
|
|
1417
|
+
// after meeting create with main locus, then handle the associate breakout locus.
|
|
1418
|
+
// if only handle breakout locus, will miss some date
|
|
1419
|
+
this.breakoutLocusForHandleLater.push(breakoutLocus);
|
|
1420
|
+
} else {
|
|
1421
|
+
lociToUpdate.push(breakoutLocus);
|
|
1136
1422
|
}
|
|
1137
1423
|
});
|
|
1424
|
+
|
|
1425
|
+
return lociToUpdate;
|
|
1426
|
+
}
|
|
1427
|
+
|
|
1428
|
+
/**
|
|
1429
|
+
* check breakout locus which waiting for main locus's meeting to be created, then handle the breakout locus
|
|
1430
|
+
* @param {Object} newCreatedLocus the locus which just create meeting object of it
|
|
1431
|
+
* @returns {undefined}
|
|
1432
|
+
* @public
|
|
1433
|
+
* @memberof Meetings
|
|
1434
|
+
*/
|
|
1435
|
+
checkHandleBreakoutLocus(newCreatedLocus) {
|
|
1436
|
+
if (
|
|
1437
|
+
!newCreatedLocus ||
|
|
1438
|
+
!this.breakoutLocusForHandleLater ||
|
|
1439
|
+
!this.breakoutLocusForHandleLater.length
|
|
1440
|
+
) {
|
|
1441
|
+
return;
|
|
1442
|
+
}
|
|
1443
|
+
if (MeetingsUtil.isBreakoutLocusDTO(newCreatedLocus)) {
|
|
1444
|
+
return;
|
|
1445
|
+
}
|
|
1446
|
+
const existIndex = this.breakoutLocusForHandleLater.findIndex(
|
|
1447
|
+
(breakoutLocus) =>
|
|
1448
|
+
breakoutLocus.controls?.breakout?.url === newCreatedLocus.controls?.breakout?.url
|
|
1449
|
+
);
|
|
1450
|
+
|
|
1451
|
+
if (existIndex < 0) {
|
|
1452
|
+
return;
|
|
1453
|
+
}
|
|
1454
|
+
|
|
1455
|
+
const associateBreakoutLocus = this.breakoutLocusForHandleLater[existIndex];
|
|
1456
|
+
this.handleLocusEvent({locus: associateBreakoutLocus, locusUrl: associateBreakoutLocus.url});
|
|
1457
|
+
this.breakoutLocusForHandleLater.splice(existIndex, 1);
|
|
1138
1458
|
}
|
|
1139
1459
|
|
|
1140
1460
|
/**
|