@webex/plugin-meetings 3.0.0-beta.13 → 3.0.0-beta.15
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/UPGRADING.md +9 -9
- package/browsers.js +19 -24
- package/dist/common/browser-detection.js +1 -0
- package/dist/common/browser-detection.js.map +1 -1
- package/dist/common/collection.js.map +1 -1
- package/dist/common/errors/captcha-error.js +5 -5
- package/dist/common/errors/captcha-error.js.map +1 -1
- package/dist/common/errors/intent-to-join.js +5 -5
- package/dist/common/errors/intent-to-join.js.map +1 -1
- package/dist/common/errors/join-meeting.js +6 -6
- package/dist/common/errors/join-meeting.js.map +1 -1
- package/dist/common/errors/media.js +5 -5
- package/dist/common/errors/media.js.map +1 -1
- package/dist/common/errors/parameter.js +5 -5
- package/dist/common/errors/parameter.js.map +1 -1
- package/dist/common/errors/password-error.js +5 -5
- package/dist/common/errors/password-error.js.map +1 -1
- package/dist/common/errors/permission.js +4 -4
- package/dist/common/errors/permission.js.map +1 -1
- package/dist/common/errors/reconnection.js +5 -5
- package/dist/common/errors/reconnection.js.map +1 -1
- package/dist/common/errors/stats.js +5 -5
- package/dist/common/errors/stats.js.map +1 -1
- package/dist/common/errors/webex-errors.js.map +1 -1
- package/dist/common/errors/webex-meetings-error.js.map +1 -1
- package/dist/common/events/events-scope.js.map +1 -1
- package/dist/common/events/events.js.map +1 -1
- package/dist/common/events/trigger-proxy.js.map +1 -1
- package/dist/common/events/util.js.map +1 -1
- package/dist/common/logs/logger-proxy.js.map +1 -1
- package/dist/common/logs/request.js.map +1 -1
- package/dist/config.js.map +1 -1
- package/dist/constants.js.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/locus-info/controlsUtils.js.map +1 -1
- package/dist/locus-info/fullState.js.map +1 -1
- package/dist/locus-info/hostUtils.js.map +1 -1
- package/dist/locus-info/index.js +11 -8
- package/dist/locus-info/index.js.map +1 -1
- package/dist/locus-info/infoUtils.js.map +1 -1
- package/dist/locus-info/mediaSharesUtils.js.map +1 -1
- package/dist/locus-info/parser.js +2 -1
- package/dist/locus-info/parser.js.map +1 -1
- package/dist/locus-info/selfUtils.js +2 -1
- package/dist/locus-info/selfUtils.js.map +1 -1
- package/dist/media/index.js.map +1 -1
- package/dist/media/internal-media-core-wrapper.js.map +1 -1
- package/dist/media/properties.js.map +1 -1
- package/dist/media/util.js +1 -1
- package/dist/media/util.js.map +1 -1
- package/dist/mediaQualityMetrics/config.js.map +1 -1
- package/dist/meeting/effectsState.js +1 -1
- package/dist/meeting/effectsState.js.map +1 -1
- package/dist/meeting/in-meeting-actions.js.map +1 -1
- package/dist/meeting/index.js +118 -89
- package/dist/meeting/index.js.map +1 -1
- package/dist/meeting/muteState.js +1 -1
- package/dist/meeting/muteState.js.map +1 -1
- package/dist/meeting/request.js +25 -0
- package/dist/meeting/request.js.map +1 -1
- package/dist/meeting/request.type.js +8 -0
- package/dist/meeting/request.type.js.map +1 -0
- package/dist/meeting/state.js +5 -5
- package/dist/meeting/state.js.map +1 -1
- package/dist/meeting/util.js.map +1 -1
- package/dist/meeting-info/collection.js.map +1 -1
- package/dist/meeting-info/index.js +2 -2
- package/dist/meeting-info/index.js.map +1 -1
- package/dist/meeting-info/meeting-info-v2.js +48 -48
- package/dist/meeting-info/meeting-info-v2.js.map +1 -1
- package/dist/meeting-info/request.js.map +1 -1
- package/dist/meeting-info/util.js.map +1 -1
- package/dist/meeting-info/utilv2.js +1 -1
- package/dist/meeting-info/utilv2.js.map +1 -1
- package/dist/meetings/collection.js.map +1 -1
- package/dist/meetings/index.js +251 -250
- package/dist/meetings/index.js.map +1 -1
- package/dist/meetings/request.js +2 -2
- package/dist/meetings/request.js.map +1 -1
- package/dist/meetings/util.js +14 -14
- package/dist/meetings/util.js.map +1 -1
- package/dist/member/index.js +31 -31
- package/dist/member/index.js.map +1 -1
- package/dist/member/util.js.map +1 -1
- package/dist/members/collection.js.map +1 -1
- package/dist/members/index.js +43 -43
- package/dist/members/index.js.map +1 -1
- package/dist/members/request.js.map +1 -1
- package/dist/members/util.js.map +1 -1
- package/dist/metrics/config.js.map +1 -1
- package/dist/metrics/constants.js.map +1 -1
- package/dist/metrics/index.js +23 -20
- package/dist/metrics/index.js.map +1 -1
- package/dist/multistream/multistreamMedia.js +2 -1
- package/dist/multistream/multistreamMedia.js.map +1 -1
- package/dist/multistream/receiveSlot.js.map +1 -1
- package/dist/multistream/receiveSlotManager.js +2 -0
- package/dist/multistream/receiveSlotManager.js.map +1 -1
- package/dist/multistream/remoteMedia.js.map +1 -1
- package/dist/multistream/remoteMediaGroup.js.map +1 -1
- package/dist/multistream/remoteMediaManager.js.map +1 -1
- package/dist/networkQualityMonitor/index.js +8 -8
- package/dist/networkQualityMonitor/index.js.map +1 -1
- package/dist/personal-meeting-room/index.js +7 -7
- package/dist/personal-meeting-room/index.js.map +1 -1
- package/dist/personal-meeting-room/request.js.map +1 -1
- package/dist/personal-meeting-room/util.js.map +1 -1
- package/dist/reachability/index.js.map +1 -1
- package/dist/reachability/request.js.map +1 -1
- package/dist/reactions/reactions.js.map +1 -1
- package/dist/reactions/reactions.type.js +3 -1
- package/dist/reactions/reactions.type.js.map +1 -1
- package/dist/reconnection-manager/index.js +4 -4
- package/dist/reconnection-manager/index.js.map +1 -1
- package/dist/roap/index.js +5 -5
- package/dist/roap/index.js.map +1 -1
- package/dist/roap/request.js.map +1 -1
- package/dist/roap/turnDiscovery.js.map +1 -1
- package/dist/statsAnalyzer/global.js.map +1 -1
- package/dist/statsAnalyzer/index.js.map +1 -1
- package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
- package/dist/transcription/index.js +4 -1
- package/dist/transcription/index.js.map +1 -1
- package/internal-README.md +7 -6
- package/package.json +18 -18
- package/src/common/browser-detection.ts +9 -6
- package/src/common/collection.ts +3 -1
- package/src/common/errors/captcha-error.ts +6 -6
- package/src/common/errors/intent-to-join.ts +6 -6
- package/src/common/errors/join-meeting.ts +12 -8
- package/src/common/errors/media.ts +6 -6
- package/src/common/errors/parameter.ts +9 -6
- package/src/common/errors/password-error.ts +6 -6
- package/src/common/errors/permission.ts +5 -5
- package/src/common/errors/reconnection.ts +6 -6
- package/src/common/errors/stats.ts +6 -6
- package/src/common/errors/webex-errors.ts +7 -5
- package/src/common/errors/webex-meetings-error.ts +1 -1
- package/src/common/events/events-scope.ts +5 -1
- package/src/common/events/events.ts +5 -1
- package/src/common/events/trigger-proxy.ts +8 -3
- package/src/common/events/util.ts +1 -2
- package/src/common/logs/logger-proxy.ts +21 -10
- package/src/common/logs/request.ts +11 -8
- package/src/config.ts +11 -11
- package/src/constants.ts +1 -1
- package/src/index.js +1 -1
- package/src/locus-info/controlsUtils.ts +34 -24
- package/src/locus-info/fullState.ts +15 -11
- package/src/locus-info/hostUtils.ts +4 -3
- package/src/locus-info/index.ts +25 -34
- package/src/locus-info/infoUtils.ts +12 -4
- package/src/locus-info/mediaSharesUtils.ts +4 -4
- package/src/locus-info/parser.ts +45 -68
- package/src/locus-info/selfUtils.ts +106 -57
- package/src/media/index.ts +123 -135
- package/src/media/internal-media-core-wrapper.ts +2 -2
- package/src/media/properties.ts +30 -20
- package/src/media/util.ts +1 -1
- package/src/mediaQualityMetrics/config.ts +46 -46
- package/src/meeting/effectsState.ts +35 -35
- package/src/meeting/in-meeting-actions.ts +7 -3
- package/src/meeting/index.ts +1576 -1291
- package/src/meeting/muteState.ts +62 -31
- package/src/meeting/request.ts +174 -113
- package/src/meeting/request.type.ts +11 -0
- package/src/meeting/state.ts +45 -30
- package/src/meeting/util.ts +101 -70
- package/src/meeting-info/collection.ts +2 -1
- package/src/meeting-info/index.ts +32 -30
- package/src/meeting-info/meeting-info-v2.ts +106 -108
- package/src/meeting-info/request.ts +9 -3
- package/src/meeting-info/util.ts +54 -46
- package/src/meeting-info/utilv2.ts +59 -53
- package/src/meetings/collection.ts +1 -1
- package/src/meetings/index.ts +512 -440
- package/src/meetings/request.ts +26 -24
- package/src/meetings/util.ts +29 -29
- package/src/member/index.ts +55 -49
- package/src/member/util.ts +26 -13
- package/src/members/collection.ts +0 -1
- package/src/members/index.ts +182 -126
- package/src/members/request.ts +46 -14
- package/src/members/util.ts +44 -42
- package/src/metrics/config.ts +254 -81
- package/src/metrics/constants.ts +0 -2
- package/src/metrics/index.ts +84 -71
- package/src/multistream/multistreamMedia.ts +1 -0
- package/src/multistream/receiveSlot.ts +1 -0
- package/src/multistream/receiveSlotManager.ts +1 -0
- package/src/multistream/remoteMedia.ts +1 -1
- package/src/multistream/remoteMediaGroup.ts +2 -1
- package/src/multistream/remoteMediaManager.ts +3 -0
- package/src/networkQualityMonitor/index.ts +20 -23
- package/src/personal-meeting-room/index.ts +12 -16
- package/src/personal-meeting-room/request.ts +10 -3
- package/src/personal-meeting-room/util.ts +3 -3
- package/src/reachability/index.ts +61 -59
- package/src/reachability/request.ts +36 -32
- package/src/reactions/reactions.ts +4 -4
- package/src/reactions/reactions.type.ts +4 -3
- package/src/reconnection-manager/index.ts +139 -84
- package/src/roap/index.ts +46 -38
- package/src/roap/request.ts +44 -31
- package/src/roap/turnDiscovery.ts +59 -30
- package/src/statsAnalyzer/global.ts +30 -33
- package/src/statsAnalyzer/index.ts +432 -175
- package/src/statsAnalyzer/mqaUtil.ts +178 -72
- package/src/transcription/index.ts +34 -32
- package/test/integration/spec/journey.js +663 -462
- package/test/integration/spec/space-meeting.js +318 -203
- package/test/integration/spec/transcription.js +6 -7
- package/test/unit/spec/common/browser-detection.js +9 -28
- package/test/unit/spec/fixture/locus.js +92 -90
- package/test/unit/spec/locus-info/controlsUtils.js +5 -5
- package/test/unit/spec/locus-info/embeddedAppsUtils.js +8 -6
- package/test/unit/spec/locus-info/index.js +1 -2
- package/test/unit/spec/locus-info/infoUtils.js +26 -33
- package/test/unit/spec/locus-info/lib/BasicSeqCmp.json +88 -430
- package/test/unit/spec/locus-info/lib/SeqCmp.json +513 -685
- package/test/unit/spec/locus-info/parser.js +3 -9
- package/test/unit/spec/locus-info/selfConstant.js +72 -103
- package/test/unit/spec/locus-info/selfUtils.js +21 -12
- package/test/unit/spec/meeting/effectsState.js +36 -46
- package/test/unit/spec/meeting/in-meeting-actions.ts +2 -3
- package/test/unit/spec/meeting/index.js +1342 -684
- package/test/unit/spec/meeting/muteState.js +42 -33
- package/test/unit/spec/meeting/request.js +75 -45
- package/test/unit/spec/meeting/utils.js +78 -53
- package/test/unit/spec/meeting-info/meetinginfov2.js +100 -73
- package/test/unit/spec/meeting-info/request.js +7 -9
- package/test/unit/spec/meeting-info/util.js +11 -12
- package/test/unit/spec/meeting-info/utilv2.js +110 -74
- package/test/unit/spec/meetings/collection.js +1 -1
- package/test/unit/spec/meetings/index.js +438 -257
- package/test/unit/spec/meetings/utils.js +14 -12
- package/test/unit/spec/member/index.js +0 -1
- package/test/unit/spec/member/util.js +5 -6
- package/test/unit/spec/members/index.js +104 -54
- package/test/unit/spec/members/request.js +29 -20
- package/test/unit/spec/members/utils.js +8 -5
- package/test/unit/spec/metrics/index.js +16 -21
- package/test/unit/spec/networkQualityMonitor/index.js +21 -15
- package/test/unit/spec/personal-meeting-room/personal-meeting-room.js +2 -7
- package/test/unit/spec/reachability/index.ts +9 -11
- package/test/unit/spec/reconnection-manager/index.js +16 -18
- package/test/unit/spec/roap/turnDiscovery.ts +22 -19
- package/test/unit/spec/stats-analyzer/index.js +25 -20
- package/test/utils/cmr.js +44 -42
- package/test/utils/testUtils.js +83 -74
- package/test/utils/webex-config.js +18 -18
- package/test/utils/webex-test-users.js +53 -50
|
@@ -1,12 +1,15 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {HTTP_VERBS, _CONVERSATION_URL_, WBXAPPAPI_SERVICE} from '../constants';
|
|
2
2
|
import Metrics from '../metrics';
|
|
3
3
|
import BEHAVIORAL_METRICS from '../metrics/constants';
|
|
4
4
|
|
|
5
5
|
import MeetingInfoUtil from './utilv2';
|
|
6
6
|
|
|
7
|
-
const PASSWORD_ERROR_DEFAULT_MESSAGE =
|
|
8
|
-
|
|
9
|
-
const
|
|
7
|
+
const PASSWORD_ERROR_DEFAULT_MESSAGE =
|
|
8
|
+
'Password required. Call fetchMeetingInfo() with password argument';
|
|
9
|
+
const CAPTCHA_ERROR_DEFAULT_MESSAGE =
|
|
10
|
+
'Captcha required. Call fetchMeetingInfo() with captchaInfo argument';
|
|
11
|
+
const ADHOC_MEETING_DEFAULT_ERROR =
|
|
12
|
+
'Failed starting the adhoc meeting, Please contact support team ';
|
|
10
13
|
const CAPTCHA_ERROR_REQUIRES_PASSWORD_CODES = [423005, 423006];
|
|
11
14
|
|
|
12
15
|
/**
|
|
@@ -18,17 +21,21 @@ export class MeetingInfoV2PasswordError extends Error {
|
|
|
18
21
|
wbxAppApiCode: any;
|
|
19
22
|
|
|
20
23
|
/**
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
constructor(
|
|
24
|
+
*
|
|
25
|
+
* @constructor
|
|
26
|
+
* @param {Number} [wbxAppApiErrorCode]
|
|
27
|
+
* @param {Object} [meetingInfo]
|
|
28
|
+
* @param {String} [message]
|
|
29
|
+
*/
|
|
30
|
+
constructor(
|
|
31
|
+
wbxAppApiErrorCode?: number,
|
|
32
|
+
meetingInfo?: object,
|
|
33
|
+
message: string = PASSWORD_ERROR_DEFAULT_MESSAGE
|
|
34
|
+
) {
|
|
28
35
|
super(`${message}, code=${wbxAppApiErrorCode}`);
|
|
29
36
|
this.name = 'MeetingInfoV2PasswordError';
|
|
30
37
|
this.sdkMessage = message;
|
|
31
|
-
this.stack =
|
|
38
|
+
this.stack = new Error().stack;
|
|
32
39
|
this.wbxAppApiCode = wbxAppApiErrorCode;
|
|
33
40
|
this.meetingInfo = meetingInfo;
|
|
34
41
|
}
|
|
@@ -41,40 +48,44 @@ export class MeetingInfoV2AdhocMeetingError extends Error {
|
|
|
41
48
|
sdkMessage: any;
|
|
42
49
|
wbxAppApiCode: any;
|
|
43
50
|
/**
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
51
|
+
*
|
|
52
|
+
* @constructor
|
|
53
|
+
* @param {Number} [wbxAppApiErrorCode]
|
|
54
|
+
* @param {String} [message]
|
|
55
|
+
*/
|
|
49
56
|
constructor(wbxAppApiErrorCode?: number, message: string = ADHOC_MEETING_DEFAULT_ERROR) {
|
|
50
57
|
super(`${message}, code=${wbxAppApiErrorCode}`);
|
|
51
58
|
this.name = 'MeetingInfoV2AdhocMeetingError';
|
|
52
59
|
this.sdkMessage = message;
|
|
53
|
-
this.stack =
|
|
60
|
+
this.stack = new Error().stack;
|
|
54
61
|
this.wbxAppApiCode = wbxAppApiErrorCode;
|
|
55
62
|
}
|
|
56
63
|
}
|
|
57
64
|
|
|
58
65
|
/**
|
|
59
|
-
|
|
60
|
-
|
|
66
|
+
* Error to indicate that preferred webex site not present to start adhoc meeting
|
|
67
|
+
*/
|
|
61
68
|
export class MeetingInfoV2CaptchaError extends Error {
|
|
62
69
|
captchaInfo: any;
|
|
63
70
|
isPasswordRequired: any;
|
|
64
71
|
sdkMessage: any;
|
|
65
72
|
wbxAppApiCode: any;
|
|
66
73
|
/**
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
constructor(
|
|
74
|
+
*
|
|
75
|
+
* @constructor
|
|
76
|
+
* @param {Number} [wbxAppApiErrorCode]
|
|
77
|
+
* @param {Object} [captchaInfo]
|
|
78
|
+
* @param {String} [message]
|
|
79
|
+
*/
|
|
80
|
+
constructor(
|
|
81
|
+
wbxAppApiErrorCode?: number,
|
|
82
|
+
captchaInfo?: object,
|
|
83
|
+
message: string = CAPTCHA_ERROR_DEFAULT_MESSAGE
|
|
84
|
+
) {
|
|
74
85
|
super(`${message}, code=${wbxAppApiErrorCode}`);
|
|
75
86
|
this.name = 'MeetingInfoV2PasswordError';
|
|
76
87
|
this.sdkMessage = message;
|
|
77
|
-
this.stack =
|
|
88
|
+
this.stack = new Error().stack;
|
|
78
89
|
this.wbxAppApiCode = wbxAppApiErrorCode;
|
|
79
90
|
this.isPasswordRequired = CAPTCHA_ERROR_REQUIRES_PASSWORD_CODES.includes(wbxAppApiErrorCode);
|
|
80
91
|
this.captchaInfo = captchaInfo;
|
|
@@ -82,42 +93,42 @@ export class MeetingInfoV2CaptchaError extends Error {
|
|
|
82
93
|
}
|
|
83
94
|
|
|
84
95
|
/**
|
|
85
|
-
|
|
86
|
-
|
|
96
|
+
* @class MeetingInfo
|
|
97
|
+
*/
|
|
87
98
|
export default class MeetingInfoV2 {
|
|
88
99
|
webex: any;
|
|
89
100
|
|
|
90
101
|
/**
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
102
|
+
*
|
|
103
|
+
* @param {WebexSDK} webex
|
|
104
|
+
*/
|
|
94
105
|
constructor(webex) {
|
|
95
106
|
this.webex = webex;
|
|
96
107
|
}
|
|
97
108
|
|
|
98
109
|
/**
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
110
|
+
* converts hydra id into conversation url and persons Id
|
|
111
|
+
* @param {String} destination one of many different types of destinations to look up info for
|
|
112
|
+
* @param {String} [type] to match up with the destination value
|
|
113
|
+
* @returns {Promise} destination and type
|
|
114
|
+
* @public
|
|
115
|
+
* @memberof MeetingInfo
|
|
116
|
+
*/
|
|
106
117
|
fetchInfoOptions(destination: string, type: string = null) {
|
|
107
118
|
return MeetingInfoUtil.getDestinationType({
|
|
108
119
|
destination,
|
|
109
120
|
type,
|
|
110
|
-
webex: this.webex
|
|
121
|
+
webex: this.webex,
|
|
111
122
|
});
|
|
112
123
|
}
|
|
113
124
|
|
|
114
125
|
/**
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
126
|
+
* Creates adhoc space meetings for a space by fetching the conversation infomation
|
|
127
|
+
* @param {String} conversationUrl conversationUrl to start adhoc meeting on
|
|
128
|
+
* @returns {Promise} returns a meeting info object
|
|
129
|
+
* @public
|
|
130
|
+
* @memberof MeetingInfo
|
|
131
|
+
*/
|
|
121
132
|
async createAdhocSpaceMeeting(conversationUrl: string) {
|
|
122
133
|
if (!this.webex.meetings.preferredWebexSite) {
|
|
123
134
|
throw Error('No preferred webex site found');
|
|
@@ -129,7 +140,7 @@ export default class MeetingInfoV2 {
|
|
|
129
140
|
particpants.forEach((participant) => {
|
|
130
141
|
invitees.push({
|
|
131
142
|
email: participant.emailAddress,
|
|
132
|
-
ciUserUuid: participant.entryUUID
|
|
143
|
+
ciUserUuid: participant.entryUUID,
|
|
133
144
|
});
|
|
134
145
|
});
|
|
135
146
|
}
|
|
@@ -137,56 +148,50 @@ export default class MeetingInfoV2 {
|
|
|
137
148
|
return invitees;
|
|
138
149
|
};
|
|
139
150
|
|
|
140
|
-
return this.webex.internal.conversation
|
|
141
|
-
{url: conversationUrl},
|
|
142
|
-
{includeParticipants: true, disableTransform: true}
|
|
143
|
-
)
|
|
151
|
+
return this.webex.internal.conversation
|
|
152
|
+
.get({url: conversationUrl}, {includeParticipants: true, disableTransform: true})
|
|
144
153
|
.then((conversation) => {
|
|
145
154
|
const body = {
|
|
146
155
|
title: conversation.displayName,
|
|
147
156
|
spaceUrl: conversation.url,
|
|
148
157
|
keyUrl: conversation.encryptionKeyUrl,
|
|
149
158
|
kroUrl: conversation.kmsResourceObjectUrl,
|
|
150
|
-
invitees: getInvitees(conversation.participants?.items)
|
|
159
|
+
invitees: getInvitees(conversation.participants?.items),
|
|
151
160
|
};
|
|
152
161
|
|
|
153
|
-
const uri = this.webex.meetings.preferredWebexSite
|
|
154
|
-
`https://${this.webex.meetings.preferredWebexSite}/wbxappapi/v2/meetings/spaceInstant`
|
|
162
|
+
const uri = this.webex.meetings.preferredWebexSite
|
|
163
|
+
? `https://${this.webex.meetings.preferredWebexSite}/wbxappapi/v2/meetings/spaceInstant`
|
|
164
|
+
: '';
|
|
155
165
|
|
|
156
|
-
Metrics.sendBehavioralMetric(
|
|
157
|
-
BEHAVIORAL_METRICS.ADHOC_MEETING_SUCCESS
|
|
158
|
-
);
|
|
166
|
+
Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.ADHOC_MEETING_SUCCESS);
|
|
159
167
|
|
|
160
168
|
return this.webex.request({
|
|
161
169
|
method: HTTP_VERBS.POST,
|
|
162
170
|
uri,
|
|
163
|
-
body
|
|
171
|
+
body,
|
|
164
172
|
});
|
|
165
173
|
})
|
|
166
174
|
.catch((err) => {
|
|
167
|
-
Metrics.sendBehavioralMetric(
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
stack: err.stack
|
|
172
|
-
}
|
|
173
|
-
);
|
|
175
|
+
Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.ADHOC_MEETING_FAILURE, {
|
|
176
|
+
reason: err.message,
|
|
177
|
+
stack: err.stack,
|
|
178
|
+
});
|
|
174
179
|
throw new MeetingInfoV2AdhocMeetingError(err.body?.code, err.body?.message);
|
|
175
180
|
});
|
|
176
181
|
}
|
|
177
182
|
|
|
178
183
|
/**
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
184
|
+
* Fetches meeting info from the server
|
|
185
|
+
* @param {String} destination one of many different types of destinations to look up info for
|
|
186
|
+
* @param {String} [type] to match up with the destination value
|
|
187
|
+
* @param {String} password
|
|
188
|
+
* @param {Object} captchaInfo
|
|
189
|
+
* @param {String} captchaInfo.code
|
|
190
|
+
* @param {String} captchaInfo.id
|
|
191
|
+
* @returns {Promise} returns a meeting info object
|
|
192
|
+
* @public
|
|
193
|
+
* @memberof MeetingInfo
|
|
194
|
+
*/
|
|
190
195
|
async fetchMeetingInfo(
|
|
191
196
|
destination: string,
|
|
192
197
|
type: string = null,
|
|
@@ -199,10 +204,14 @@ export default class MeetingInfoV2 {
|
|
|
199
204
|
const destinationType = await MeetingInfoUtil.getDestinationType({
|
|
200
205
|
destination,
|
|
201
206
|
type,
|
|
202
|
-
webex: this.webex
|
|
207
|
+
webex: this.webex,
|
|
203
208
|
});
|
|
204
209
|
|
|
205
|
-
if (
|
|
210
|
+
if (
|
|
211
|
+
destinationType.type === _CONVERSATION_URL_ &&
|
|
212
|
+
this.webex.config.meetings.experimental.enableAdhocMeetings &&
|
|
213
|
+
this.webex.meetings.preferredWebexSite
|
|
214
|
+
) {
|
|
206
215
|
return this.createAdhocSpaceMeeting(destinationType.destination);
|
|
207
216
|
}
|
|
208
217
|
|
|
@@ -210,63 +219,52 @@ export default class MeetingInfoV2 {
|
|
|
210
219
|
|
|
211
220
|
const options: any = {
|
|
212
221
|
method: HTTP_VERBS.POST,
|
|
213
|
-
body
|
|
222
|
+
body,
|
|
214
223
|
};
|
|
215
224
|
|
|
216
225
|
const directURI = await MeetingInfoUtil.getDirectMeetingInfoURI(destinationType);
|
|
217
226
|
|
|
218
227
|
if (directURI) {
|
|
219
228
|
options.uri = directURI;
|
|
220
|
-
}
|
|
221
|
-
else {
|
|
229
|
+
} else {
|
|
222
230
|
options.service = WBXAPPAPI_SERVICE;
|
|
223
231
|
options.resource = 'meetingInfo';
|
|
224
232
|
}
|
|
225
233
|
|
|
226
|
-
return this.webex
|
|
234
|
+
return this.webex
|
|
235
|
+
.request(options)
|
|
227
236
|
.then((response) => {
|
|
228
|
-
Metrics.sendBehavioralMetric(
|
|
229
|
-
BEHAVIORAL_METRICS.FETCH_MEETING_INFO_V1_SUCCESS
|
|
230
|
-
);
|
|
237
|
+
Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.FETCH_MEETING_INFO_V1_SUCCESS);
|
|
231
238
|
|
|
232
239
|
return response;
|
|
233
240
|
})
|
|
234
241
|
.catch((err) => {
|
|
235
242
|
if (err?.statusCode === 403) {
|
|
236
|
-
Metrics.sendBehavioralMetric(
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
stack: err.stack
|
|
241
|
-
}
|
|
242
|
-
);
|
|
243
|
+
Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.VERIFY_PASSWORD_ERROR, {
|
|
244
|
+
reason: err.message,
|
|
245
|
+
stack: err.stack,
|
|
246
|
+
});
|
|
243
247
|
|
|
244
248
|
throw new MeetingInfoV2PasswordError(err.body?.code, err.body?.data?.meetingInfo);
|
|
245
249
|
}
|
|
246
250
|
if (err?.statusCode === 423) {
|
|
247
|
-
Metrics.sendBehavioralMetric(
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
stack: err.stack
|
|
252
|
-
}
|
|
253
|
-
);
|
|
251
|
+
Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.VERIFY_CAPTCHA_ERROR, {
|
|
252
|
+
reason: err.message,
|
|
253
|
+
stack: err.stack,
|
|
254
|
+
});
|
|
254
255
|
|
|
255
256
|
throw new MeetingInfoV2CaptchaError(err.body?.code, {
|
|
256
257
|
captchaId: err.body.captchaID,
|
|
257
258
|
verificationImageURL: err.body.verificationImageURL,
|
|
258
259
|
verificationAudioURL: err.body.verificationAudioURL,
|
|
259
|
-
refreshURL: err.body.refreshURL
|
|
260
|
+
refreshURL: err.body.refreshURL,
|
|
260
261
|
});
|
|
261
262
|
}
|
|
262
263
|
|
|
263
|
-
Metrics.sendBehavioralMetric(
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
stack: err.stack
|
|
268
|
-
}
|
|
269
|
-
);
|
|
264
|
+
Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.FETCH_MEETING_INFO_V1_FAILURE, {
|
|
265
|
+
reason: err.message,
|
|
266
|
+
stack: err.stack,
|
|
267
|
+
});
|
|
270
268
|
throw err;
|
|
271
269
|
});
|
|
272
270
|
}
|
|
@@ -3,7 +3,6 @@ import ParameterError from '../common/errors/parameter';
|
|
|
3
3
|
|
|
4
4
|
import MeetingInfoUtil from './util';
|
|
5
5
|
|
|
6
|
-
|
|
7
6
|
/**
|
|
8
7
|
* @class MeetingInfoRequest
|
|
9
8
|
*/
|
|
@@ -30,10 +29,17 @@ export default class MeetingInfoRequest {
|
|
|
30
29
|
*/
|
|
31
30
|
fetchMeetingInfo(options: any) {
|
|
32
31
|
if (!options || !options.type || !options.destination) {
|
|
33
|
-
throw new ParameterError(
|
|
32
|
+
throw new ParameterError(
|
|
33
|
+
'MeetingInfo should be fetched with a type and destination specified, see list of valid types and their corresponding values in constants'
|
|
34
|
+
);
|
|
34
35
|
}
|
|
35
36
|
const resourceUrl = MeetingInfoUtil.getResourceUrl(options.type, options.destination);
|
|
36
|
-
const requestParams = MeetingInfoUtil.getRequestParams(
|
|
37
|
+
const requestParams = MeetingInfoUtil.getRequestParams(
|
|
38
|
+
resourceUrl,
|
|
39
|
+
options.type,
|
|
40
|
+
options.destination,
|
|
41
|
+
API.LOCUS
|
|
42
|
+
);
|
|
37
43
|
|
|
38
44
|
return this.webex.request(requestParams);
|
|
39
45
|
}
|
package/src/meeting-info/util.ts
CHANGED
|
@@ -3,7 +3,7 @@ import url from 'url';
|
|
|
3
3
|
import btoa from 'btoa';
|
|
4
4
|
import {
|
|
5
5
|
// @ts-ignore
|
|
6
|
-
deconstructHydraId
|
|
6
|
+
deconstructHydraId,
|
|
7
7
|
} from '@webex/common';
|
|
8
8
|
|
|
9
9
|
import ParameterError from '../common/errors/parameter';
|
|
@@ -31,7 +31,7 @@ import {
|
|
|
31
31
|
MEET,
|
|
32
32
|
MEET_M,
|
|
33
33
|
HTTPS_PROTOCOL,
|
|
34
|
-
UUID_REG
|
|
34
|
+
UUID_REG,
|
|
35
35
|
} from '../constants';
|
|
36
36
|
|
|
37
37
|
const MeetingInfoUtil: any = {};
|
|
@@ -62,9 +62,10 @@ MeetingInfoUtil.getParsedUrl = (link) => {
|
|
|
62
62
|
}
|
|
63
63
|
|
|
64
64
|
return parsedUrl;
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
|
|
65
|
+
} catch (error) {
|
|
66
|
+
LoggerProxy.logger.warn(
|
|
67
|
+
`Meeting-info:util#getParsedUrl --> unable to parse the URL, error: ${error}`
|
|
68
|
+
);
|
|
68
69
|
|
|
69
70
|
return null;
|
|
70
71
|
}
|
|
@@ -78,7 +79,11 @@ MeetingInfoUtil.getParsedUrl = (link) => {
|
|
|
78
79
|
MeetingInfoUtil.isMeetingLink = (value: string) => {
|
|
79
80
|
const parsedUrl = MeetingInfoUtil.getParsedUrl(value);
|
|
80
81
|
const hostNameBool = parsedUrl.hostname && parsedUrl.hostname.includes(WEBEX_DOT_COM);
|
|
81
|
-
const pathNameBool =
|
|
82
|
+
const pathNameBool =
|
|
83
|
+
parsedUrl.pathname &&
|
|
84
|
+
(parsedUrl.pathname.includes(`/${MEET}`) ||
|
|
85
|
+
parsedUrl.pathname.includes(`/${MEET_M}`) ||
|
|
86
|
+
parsedUrl.pathname.includes(`/${JOIN}`));
|
|
82
87
|
|
|
83
88
|
return hostNameBool && pathNameBool;
|
|
84
89
|
};
|
|
@@ -123,7 +128,6 @@ MeetingInfoUtil.convertLinkToSip = (value) => {
|
|
|
123
128
|
return `${user}@${company}.${WEBEX_DOT_COM}`;
|
|
124
129
|
};
|
|
125
130
|
|
|
126
|
-
|
|
127
131
|
MeetingInfoUtil.isSipUri = (sipString) => {
|
|
128
132
|
// TODO: lets remove regex from this equation and user URI matchers and such
|
|
129
133
|
// have not found a great sip uri parser library as of now
|
|
@@ -155,15 +159,21 @@ MeetingInfoUtil.getHydraId = (destination) => {
|
|
|
155
159
|
return {};
|
|
156
160
|
};
|
|
157
161
|
|
|
158
|
-
MeetingInfoUtil.getSipUriFromHydraPersonId = (destination, webex) =>
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
})
|
|
162
|
+
MeetingInfoUtil.getSipUriFromHydraPersonId = (destination, webex) =>
|
|
163
|
+
webex.people
|
|
164
|
+
.get(destination)
|
|
165
|
+
.then((res) => {
|
|
166
|
+
if (res.emails && res.emails.length) {
|
|
167
|
+
return res.emails[0];
|
|
168
|
+
}
|
|
169
|
+
throw new ParameterError('Hydra Id Lookup was an invalid hydra person id.');
|
|
170
|
+
})
|
|
171
|
+
.catch((err) => {
|
|
172
|
+
LoggerProxy.logger.error(
|
|
173
|
+
`Meeting-info:util#MeetingInfoUtil.getSipUriFromHydraPersonId --> getSipUriFromHydraPersonId ${err} `
|
|
174
|
+
);
|
|
175
|
+
throw err;
|
|
176
|
+
});
|
|
167
177
|
|
|
168
178
|
MeetingInfoUtil.generateOptions = async (from) => {
|
|
169
179
|
const {destination, type, webex} = from;
|
|
@@ -171,31 +181,29 @@ MeetingInfoUtil.generateOptions = async (from) => {
|
|
|
171
181
|
if (type) {
|
|
172
182
|
return {
|
|
173
183
|
destination,
|
|
174
|
-
type
|
|
184
|
+
type,
|
|
175
185
|
};
|
|
176
186
|
}
|
|
177
187
|
const options: any = {};
|
|
178
188
|
const hydraId = MeetingInfoUtil.getHydraId(destination);
|
|
179
189
|
|
|
180
190
|
if (MeetingInfoUtil.isMeetingLink(destination)) {
|
|
181
|
-
LoggerProxy.logger.warn(
|
|
191
|
+
LoggerProxy.logger.warn(
|
|
192
|
+
'Meeting-info:util#generateOptions --> WARN, use of Meeting Link is deprecated, please use a SIP URI instead'
|
|
193
|
+
);
|
|
182
194
|
|
|
183
195
|
options.type = _MEETING_LINK_;
|
|
184
196
|
options.destination = destination;
|
|
185
|
-
}
|
|
186
|
-
else if (MeetingInfoUtil.isSipUri(destination)) {
|
|
197
|
+
} else if (MeetingInfoUtil.isSipUri(destination)) {
|
|
187
198
|
options.type = _SIP_URI_;
|
|
188
199
|
options.destination = destination;
|
|
189
|
-
}
|
|
190
|
-
else if (MeetingInfoUtil.isPhoneNumber(destination)) {
|
|
200
|
+
} else if (MeetingInfoUtil.isPhoneNumber(destination)) {
|
|
191
201
|
options.type = _SIP_URI_;
|
|
192
202
|
options.destination = destination;
|
|
193
|
-
}
|
|
194
|
-
else if (MeetingInfoUtil.isConversationUrl(destination, webex)) {
|
|
203
|
+
} else if (MeetingInfoUtil.isConversationUrl(destination, webex)) {
|
|
195
204
|
options.type = _CONVERSATION_URL_;
|
|
196
205
|
options.destination = destination;
|
|
197
|
-
}
|
|
198
|
-
else if (hydraId.people) {
|
|
206
|
+
} else if (hydraId.people) {
|
|
199
207
|
options.type = _SIP_URI_;
|
|
200
208
|
|
|
201
209
|
return MeetingInfoUtil.getSipUriFromHydraPersonId(hydraId.destination, webex).then((res) => {
|
|
@@ -208,26 +216,25 @@ MeetingInfoUtil.generateOptions = async (from) => {
|
|
|
208
216
|
|
|
209
217
|
return Promise.resolve(options);
|
|
210
218
|
});
|
|
211
|
-
}
|
|
212
|
-
else if (hydraId.room) {
|
|
219
|
+
} else if (hydraId.room) {
|
|
213
220
|
options.type = _CONVERSATION_URL_;
|
|
214
221
|
try {
|
|
215
222
|
await webex.internal.services.waitForCatalog('postauth');
|
|
216
223
|
|
|
217
224
|
const conversationUrl = webex.internal.conversation.getUrlFromClusterId({
|
|
218
225
|
cluster: hydraId.cluster,
|
|
219
|
-
id: hydraId.destination
|
|
226
|
+
id: hydraId.destination,
|
|
220
227
|
});
|
|
221
228
|
|
|
222
229
|
options.destination = conversationUrl;
|
|
223
|
-
}
|
|
224
|
-
catch (e) {
|
|
230
|
+
} catch (e) {
|
|
225
231
|
LoggerProxy.logger.error(`Meeting-info:util#generateOptions --> ${e}`);
|
|
226
|
-
throw
|
|
232
|
+
throw e;
|
|
227
233
|
}
|
|
228
|
-
}
|
|
229
|
-
|
|
230
|
-
|
|
234
|
+
} else {
|
|
235
|
+
throw new ParameterError(
|
|
236
|
+
'MeetingInfo is fetched with meeting link, sip uri, phone number, hydra room id, hydra people id, or a conversation url.'
|
|
237
|
+
);
|
|
231
238
|
}
|
|
232
239
|
|
|
233
240
|
return Promise.resolve(options);
|
|
@@ -248,7 +255,9 @@ MeetingInfoUtil.getResourceUrl = (type: string, value: any) => {
|
|
|
248
255
|
case _SIP_URI_:
|
|
249
256
|
case _PERSONAL_ROOM_:
|
|
250
257
|
case _MEETING_ID_:
|
|
251
|
-
resource = `/${LOCI}/${MEETINGINFO}/${encodeURIComponent(
|
|
258
|
+
resource = `/${LOCI}/${MEETINGINFO}/${encodeURIComponent(
|
|
259
|
+
value
|
|
260
|
+
)}?${TYPE}=${type}&${USE_URI_LOOKUP_FALSE}`;
|
|
252
261
|
break;
|
|
253
262
|
case _CONVERSATION_URL_:
|
|
254
263
|
method = HTTP_VERBS.PUT;
|
|
@@ -258,7 +267,9 @@ MeetingInfoUtil.getResourceUrl = (type: string, value: any) => {
|
|
|
258
267
|
method = HTTP_VERBS.PUT;
|
|
259
268
|
break;
|
|
260
269
|
case _MEETING_LINK_:
|
|
261
|
-
resource = `$/${LOCI}/${MEETINGINFO}/${btoa(
|
|
270
|
+
resource = `$/${LOCI}/${MEETINGINFO}/${btoa(
|
|
271
|
+
value
|
|
272
|
+
)}?${TYPE}=${_MEETING_LINK_}&${USE_URI_LOOKUP_FALSE}`;
|
|
262
273
|
break;
|
|
263
274
|
default:
|
|
264
275
|
}
|
|
@@ -266,7 +277,7 @@ MeetingInfoUtil.getResourceUrl = (type: string, value: any) => {
|
|
|
266
277
|
return {
|
|
267
278
|
uri,
|
|
268
279
|
resource,
|
|
269
|
-
method
|
|
280
|
+
method,
|
|
270
281
|
};
|
|
271
282
|
};
|
|
272
283
|
|
|
@@ -274,26 +285,23 @@ MeetingInfoUtil.getRequestParams = (resourceOptions, type, value, api) => {
|
|
|
274
285
|
let requestParams: any = {
|
|
275
286
|
method: resourceOptions.method,
|
|
276
287
|
api,
|
|
277
|
-
resource: resourceOptions.resource
|
|
288
|
+
resource: resourceOptions.resource,
|
|
278
289
|
};
|
|
279
290
|
|
|
280
291
|
if (resourceOptions.method === HTTP_VERBS.GET) {
|
|
281
292
|
// for handling URL redirections
|
|
282
293
|
requestParams.resource = requestParams.resource.concat(`&${ALTERNATE_REDIRECT_TRUE}`);
|
|
283
|
-
}
|
|
284
|
-
else
|
|
285
|
-
if (type !== _LOCUS_ID_) {
|
|
294
|
+
} else if (type !== _LOCUS_ID_) {
|
|
286
295
|
// locus id check is a PUT not sure why
|
|
287
296
|
requestParams.resource = requestParams.resource.concat(`?${ALTERNATE_REDIRECT_TRUE}`);
|
|
288
297
|
requestParams.body = {
|
|
289
298
|
value,
|
|
290
|
-
lookupType: type
|
|
299
|
+
lookupType: type,
|
|
291
300
|
};
|
|
292
|
-
}
|
|
293
|
-
else if (type === _LOCUS_ID_) {
|
|
301
|
+
} else if (type === _LOCUS_ID_) {
|
|
294
302
|
requestParams = {
|
|
295
303
|
method: resourceOptions.method,
|
|
296
|
-
uri: resourceOptions.uri
|
|
304
|
+
uri: resourceOptions.uri,
|
|
297
305
|
};
|
|
298
306
|
}
|
|
299
307
|
|