@webex/plugin-meetings 3.7.0-next.6 → 3.7.0-next.60
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/dist/annotation/index.js +17 -0
- package/dist/annotation/index.js.map +1 -1
- package/dist/breakouts/breakout.js +1 -1
- package/dist/breakouts/index.js +1 -1
- package/dist/common/errors/join-forbidden-error.js +52 -0
- package/dist/common/errors/join-forbidden-error.js.map +1 -0
- package/dist/common/errors/{webinar-registration-error.js → join-webinar-error.js} +12 -12
- package/dist/common/errors/join-webinar-error.js.map +1 -0
- package/dist/common/errors/multistream-not-supported-error.js +53 -0
- package/dist/common/errors/multistream-not-supported-error.js.map +1 -0
- package/dist/config.js +1 -1
- package/dist/config.js.map +1 -1
- package/dist/constants.js +46 -5
- package/dist/constants.js.map +1 -1
- package/dist/index.js +16 -11
- package/dist/index.js.map +1 -1
- package/dist/interpretation/index.js +1 -1
- package/dist/interpretation/siLanguage.js +1 -1
- package/dist/locus-info/index.js +14 -3
- package/dist/locus-info/index.js.map +1 -1
- package/dist/locus-info/selfUtils.js +35 -17
- package/dist/locus-info/selfUtils.js.map +1 -1
- package/dist/meeting/brbState.js +167 -0
- package/dist/meeting/brbState.js.map +1 -0
- package/dist/meeting/in-meeting-actions.js +2 -0
- package/dist/meeting/in-meeting-actions.js.map +1 -1
- package/dist/meeting/index.js +774 -649
- package/dist/meeting/index.js.map +1 -1
- package/dist/meeting/locusMediaRequest.js +9 -0
- package/dist/meeting/locusMediaRequest.js.map +1 -1
- package/dist/meeting/muteState.js +1 -6
- package/dist/meeting/muteState.js.map +1 -1
- package/dist/meeting/request.js +30 -0
- package/dist/meeting/request.js.map +1 -1
- package/dist/meeting/request.type.js.map +1 -1
- package/dist/meeting/util.js +16 -16
- package/dist/meeting/util.js.map +1 -1
- package/dist/meeting-info/meeting-info-v2.js +96 -33
- package/dist/meeting-info/meeting-info-v2.js.map +1 -1
- package/dist/meeting-info/utilv2.js +1 -1
- package/dist/meeting-info/utilv2.js.map +1 -1
- package/dist/meetings/index.js +107 -55
- package/dist/meetings/index.js.map +1 -1
- package/dist/meetings/meetings.types.js +2 -0
- package/dist/meetings/meetings.types.js.map +1 -1
- package/dist/meetings/util.js +1 -1
- package/dist/meetings/util.js.map +1 -1
- package/dist/member/index.js +9 -0
- package/dist/member/index.js.map +1 -1
- package/dist/member/types.js.map +1 -1
- package/dist/member/util.js +39 -28
- package/dist/member/util.js.map +1 -1
- package/dist/metrics/constants.js +3 -2
- package/dist/metrics/constants.js.map +1 -1
- package/dist/multistream/remoteMedia.js +30 -15
- package/dist/multistream/remoteMedia.js.map +1 -1
- package/dist/multistream/sendSlotManager.js +24 -0
- package/dist/multistream/sendSlotManager.js.map +1 -1
- package/dist/reachability/index.js +31 -3
- package/dist/reachability/index.js.map +1 -1
- package/dist/roap/index.js +10 -8
- package/dist/roap/index.js.map +1 -1
- package/dist/types/annotation/index.d.ts +5 -0
- package/dist/types/common/errors/join-forbidden-error.d.ts +15 -0
- package/dist/types/common/errors/{webinar-registration-error.d.ts → join-webinar-error.d.ts} +2 -2
- package/dist/types/common/errors/multistream-not-supported-error.d.ts +17 -0
- package/dist/types/constants.d.ts +38 -1
- package/dist/types/index.d.ts +3 -3
- package/dist/types/locus-info/index.d.ts +2 -1
- package/dist/types/meeting/brbState.d.ts +54 -0
- package/dist/types/meeting/in-meeting-actions.d.ts +2 -0
- package/dist/types/meeting/index.d.ts +21 -12
- package/dist/types/meeting/locusMediaRequest.d.ts +4 -0
- package/dist/types/meeting/request.d.ts +12 -1
- package/dist/types/meeting/request.type.d.ts +6 -0
- package/dist/types/meeting/util.d.ts +1 -1
- package/dist/types/meeting-info/meeting-info-v2.d.ts +27 -4
- package/dist/types/meetings/index.d.ts +19 -1
- package/dist/types/meetings/meetings.types.d.ts +8 -0
- package/dist/types/member/index.d.ts +1 -0
- package/dist/types/member/types.d.ts +7 -0
- package/dist/types/metrics/constants.d.ts +2 -1
- package/dist/types/multistream/sendSlotManager.d.ts +8 -1
- package/dist/types/reachability/index.d.ts +9 -1
- package/dist/webinar/index.js +354 -3
- package/dist/webinar/index.js.map +1 -1
- package/package.json +23 -22
- package/src/annotation/index.ts +16 -0
- package/src/common/errors/join-forbidden-error.ts +26 -0
- package/src/common/errors/join-webinar-error.ts +24 -0
- package/src/common/errors/multistream-not-supported-error.ts +30 -0
- package/src/config.ts +1 -1
- package/src/constants.ts +43 -3
- package/src/index.ts +5 -3
- package/src/locus-info/index.ts +20 -3
- package/src/locus-info/selfUtils.ts +24 -6
- package/src/meeting/brbState.ts +169 -0
- package/src/meeting/in-meeting-actions.ts +4 -0
- package/src/meeting/index.ts +256 -82
- package/src/meeting/locusMediaRequest.ts +7 -0
- package/src/meeting/muteState.ts +1 -6
- package/src/meeting/request.ts +26 -1
- package/src/meeting/request.type.ts +7 -0
- package/src/meeting/util.ts +8 -10
- package/src/meeting-info/meeting-info-v2.ts +74 -11
- package/src/meeting-info/utilv2.ts +3 -1
- package/src/meetings/index.ts +79 -20
- package/src/meetings/meetings.types.ts +10 -0
- package/src/meetings/util.ts +2 -1
- package/src/member/index.ts +9 -0
- package/src/member/types.ts +8 -0
- package/src/member/util.ts +34 -24
- package/src/metrics/constants.ts +2 -1
- package/src/multistream/remoteMedia.ts +28 -15
- package/src/multistream/sendSlotManager.ts +31 -0
- package/src/reachability/index.ts +29 -1
- package/src/roap/index.ts +10 -8
- package/src/webinar/index.ts +197 -3
- package/test/unit/spec/annotation/index.ts +46 -1
- package/test/unit/spec/locus-info/index.js +292 -60
- package/test/unit/spec/locus-info/selfConstant.js +7 -0
- package/test/unit/spec/locus-info/selfUtils.js +101 -1
- package/test/unit/spec/meeting/brbState.ts +114 -0
- package/test/unit/spec/meeting/in-meeting-actions.ts +2 -0
- package/test/unit/spec/meeting/index.js +733 -106
- package/test/unit/spec/meeting/muteState.js +0 -24
- package/test/unit/spec/meeting/utils.js +22 -19
- package/test/unit/spec/meeting-info/meetinginfov2.js +46 -4
- package/test/unit/spec/meeting-info/utilv2.js +17 -0
- package/test/unit/spec/meetings/index.js +159 -18
- package/test/unit/spec/meetings/utils.js +10 -0
- package/test/unit/spec/member/util.js +52 -11
- package/test/unit/spec/multistream/remoteMedia.ts +11 -7
- package/test/unit/spec/reachability/index.ts +120 -10
- package/test/unit/spec/roap/index.ts +47 -0
- package/test/unit/spec/webinar/index.ts +457 -0
- package/dist/common/errors/webinar-registration-error.js.map +0 -1
- package/src/common/errors/webinar-registration-error.ts +0 -27
package/src/meeting/request.ts
CHANGED
|
@@ -27,7 +27,7 @@ import {
|
|
|
27
27
|
_SLIDES_,
|
|
28
28
|
ANNOTATION,
|
|
29
29
|
} from '../constants';
|
|
30
|
-
import {SendReactionOptions, ToggleReactionsOptions} from './request.type';
|
|
30
|
+
import {SendReactionOptions, BrbOptions, ToggleReactionsOptions} from './request.type';
|
|
31
31
|
import MeetingUtil from './util';
|
|
32
32
|
import {AnnotationInfo} from '../annotation/annotation.types';
|
|
33
33
|
import {ClientMediaPreferences} from '../reachability/reachability.types';
|
|
@@ -909,4 +909,29 @@ export default class MeetingRequest extends StatelessWebexPlugin {
|
|
|
909
909
|
uri: locusUrl,
|
|
910
910
|
});
|
|
911
911
|
}
|
|
912
|
+
|
|
913
|
+
/**
|
|
914
|
+
* Sends a request to set be right back status.
|
|
915
|
+
*
|
|
916
|
+
* @param {Object} options - The options for brb request.
|
|
917
|
+
* @param {boolean} options.enabled - Whether brb status is enabled.
|
|
918
|
+
* @param {string} options.locusUrl - The URL of the locus.
|
|
919
|
+
* @param {string} options.deviceUrl - The URL of the device.
|
|
920
|
+
* @param {string} options.selfId - The ID of the participant.
|
|
921
|
+
* @returns {Promise}
|
|
922
|
+
*/
|
|
923
|
+
setBrb({enabled, locusUrl, deviceUrl, selfId}: BrbOptions) {
|
|
924
|
+
const uri = `${locusUrl}/${PARTICIPANT}/${selfId}/${CONTROLS}`;
|
|
925
|
+
|
|
926
|
+
return this.locusDeltaRequest({
|
|
927
|
+
method: HTTP_VERBS.PATCH,
|
|
928
|
+
uri,
|
|
929
|
+
body: {
|
|
930
|
+
brb: {
|
|
931
|
+
enabled,
|
|
932
|
+
deviceUrl,
|
|
933
|
+
},
|
|
934
|
+
},
|
|
935
|
+
});
|
|
936
|
+
}
|
|
912
937
|
}
|
package/src/meeting/util.ts
CHANGED
|
@@ -140,7 +140,11 @@ const MeetingUtil = {
|
|
|
140
140
|
meeting.isMultistream,
|
|
141
141
|
MeetingUtil.getIpVersion(webex)
|
|
142
142
|
);
|
|
143
|
-
|
|
143
|
+
if (options.roapMessage) {
|
|
144
|
+
// we only need to attach reachability if we are sending a roap message
|
|
145
|
+
// sending reachability on its own will cause Locus to reject our join request
|
|
146
|
+
reachability = await webex.meetings.reachability.getReachabilityReportToAttachToRoap();
|
|
147
|
+
}
|
|
144
148
|
} catch (e) {
|
|
145
149
|
LoggerProxy.logger.error(
|
|
146
150
|
'Meeting:util#joinMeeting --> Error getting reachability or clientMediaPreferences:',
|
|
@@ -441,6 +445,9 @@ const MeetingUtil = {
|
|
|
441
445
|
displayHints.includes(DISPLAY_HINTS.LEAVE_END_MEETING),
|
|
442
446
|
|
|
443
447
|
canManageBreakout: (displayHints) => displayHints.includes(DISPLAY_HINTS.BREAKOUT_MANAGEMENT),
|
|
448
|
+
|
|
449
|
+
canStartBreakout: (displayHints) => !displayHints.includes(DISPLAY_HINTS.DISABLE_BREAKOUT_START),
|
|
450
|
+
|
|
444
451
|
canBroadcastMessageToBreakout: (displayHints, policies = {}) =>
|
|
445
452
|
displayHints.includes(DISPLAY_HINTS.BROADCAST_MESSAGE_TO_BREAKOUT) &&
|
|
446
453
|
!!policies[SELF_POLICY.SUPPORT_BROADCAST_MESSAGE],
|
|
@@ -496,15 +503,6 @@ const MeetingUtil = {
|
|
|
496
503
|
}
|
|
497
504
|
},
|
|
498
505
|
|
|
499
|
-
handleDeviceLogging: (devices = []) => {
|
|
500
|
-
const LOG_HEADER = 'MeetingUtil#handleDeviceLogging -->';
|
|
501
|
-
|
|
502
|
-
devices.forEach((device) => {
|
|
503
|
-
LoggerProxy.logger.log(LOG_HEADER, `deviceId = ${device.deviceId}`);
|
|
504
|
-
LoggerProxy.logger.log(LOG_HEADER, 'settings', JSON.stringify(device));
|
|
505
|
-
});
|
|
506
|
-
},
|
|
507
|
-
|
|
508
506
|
endMeetingForAll: (meeting) => {
|
|
509
507
|
if (meeting.meetingState === FULL_STATE.INACTIVE) {
|
|
510
508
|
return Promise.reject(new MeetingNotActiveError());
|
|
@@ -18,7 +18,20 @@ const ADHOC_MEETING_DEFAULT_ERROR =
|
|
|
18
18
|
'Failed starting the adhoc meeting, Please contact support team ';
|
|
19
19
|
const CAPTCHA_ERROR_REQUIRES_PASSWORD_CODES = [423005, 423006];
|
|
20
20
|
const POLICY_ERROR_CODES = [403049, 403104, 403103, 403048, 403102, 403101];
|
|
21
|
-
const
|
|
21
|
+
const JOIN_FORBIDDEN_CODES = [403003];
|
|
22
|
+
/**
|
|
23
|
+
* 403021 - Meeting registration is required
|
|
24
|
+
* 403022 - Meeting registration is still pending
|
|
25
|
+
* 403024 - Meeting registration have been rejected
|
|
26
|
+
* 403137 - Registration ID verified failure
|
|
27
|
+
* 423007 - Registration ID input too many time,please input captcha code
|
|
28
|
+
* 403026 - Need to join meeting via webcast
|
|
29
|
+
* 403037 - Meeting join required registration ID
|
|
30
|
+
* 403137 - Registration ID verified failure
|
|
31
|
+
*
|
|
32
|
+
*/
|
|
33
|
+
const JOIN_WEBINAR_ERROR_CODES = [403021, 403022, 403024, 403137, 423007, 403026, 403037, 403137];
|
|
34
|
+
|
|
22
35
|
/**
|
|
23
36
|
* Error to indicate that wbxappapi requires a password
|
|
24
37
|
*/
|
|
@@ -126,9 +139,9 @@ export class MeetingInfoV2CaptchaError extends Error {
|
|
|
126
139
|
}
|
|
127
140
|
|
|
128
141
|
/**
|
|
129
|
-
* Error preventing join because of a webinar
|
|
142
|
+
* Error preventing join because of a webinar have some error
|
|
130
143
|
*/
|
|
131
|
-
export class
|
|
144
|
+
export class MeetingInfoV2JoinWebinarError extends Error {
|
|
132
145
|
meetingInfo: any;
|
|
133
146
|
sdkMessage: any;
|
|
134
147
|
wbxAppApiCode: any;
|
|
@@ -142,7 +155,32 @@ export class MeetingInfoV2WebinarRegistrationError extends Error {
|
|
|
142
155
|
*/
|
|
143
156
|
constructor(wbxAppApiErrorCode?: number, meetingInfo?: object, message?: string) {
|
|
144
157
|
super(`${message}, code=${wbxAppApiErrorCode}`);
|
|
145
|
-
this.name = '
|
|
158
|
+
this.name = 'MeetingInfoV2JoinWebinarError';
|
|
159
|
+
this.sdkMessage = message;
|
|
160
|
+
this.stack = new Error().stack;
|
|
161
|
+
this.wbxAppApiCode = wbxAppApiErrorCode;
|
|
162
|
+
this.meetingInfo = meetingInfo;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
/**
|
|
167
|
+
* Error preventing join because of a forbidden error
|
|
168
|
+
*/
|
|
169
|
+
export class MeetingInfoV2JoinForbiddenError extends Error {
|
|
170
|
+
meetingInfo: any;
|
|
171
|
+
sdkMessage: any;
|
|
172
|
+
wbxAppApiCode: any;
|
|
173
|
+
body: any;
|
|
174
|
+
/**
|
|
175
|
+
*
|
|
176
|
+
* @constructor
|
|
177
|
+
* @param {Number} [wbxAppApiErrorCode]
|
|
178
|
+
* @param {Object} [meetingInfo]
|
|
179
|
+
* @param {String} [message]
|
|
180
|
+
*/
|
|
181
|
+
constructor(wbxAppApiErrorCode?: number, meetingInfo?: object, message?: string) {
|
|
182
|
+
super(`${message}, code=${wbxAppApiErrorCode}`);
|
|
183
|
+
this.name = 'MeetingInfoV2JoinForbiddenError';
|
|
146
184
|
this.sdkMessage = message;
|
|
147
185
|
this.stack = new Error().stack;
|
|
148
186
|
this.wbxAppApiCode = wbxAppApiErrorCode;
|
|
@@ -204,21 +242,44 @@ export default class MeetingInfoV2 {
|
|
|
204
242
|
};
|
|
205
243
|
|
|
206
244
|
/**
|
|
207
|
-
* Raises a
|
|
245
|
+
* Raises a handleJoinWebinarError for join webinar error codes
|
|
246
|
+
* @param {any} err the error from the request
|
|
247
|
+
* @returns {void}
|
|
248
|
+
*/
|
|
249
|
+
handleJoinWebinarError = (err) => {
|
|
250
|
+
if (!err.body) {
|
|
251
|
+
return;
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
if (JOIN_WEBINAR_ERROR_CODES.includes(err.body?.code)) {
|
|
255
|
+
Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.JOIN_WEBINAR_ERROR, {
|
|
256
|
+
code: err.body?.code,
|
|
257
|
+
});
|
|
258
|
+
|
|
259
|
+
throw new MeetingInfoV2JoinWebinarError(
|
|
260
|
+
err.body?.code,
|
|
261
|
+
err.body?.data?.meetingInfo,
|
|
262
|
+
err.body?.message
|
|
263
|
+
);
|
|
264
|
+
}
|
|
265
|
+
};
|
|
266
|
+
|
|
267
|
+
/**
|
|
268
|
+
* Raises a handleForbiddenError for join meeting forbidden error
|
|
208
269
|
* @param {any} err the error from the request
|
|
209
270
|
* @returns {void}
|
|
210
271
|
*/
|
|
211
|
-
|
|
272
|
+
handleForbiddenError = (err) => {
|
|
212
273
|
if (!err.body) {
|
|
213
274
|
return;
|
|
214
275
|
}
|
|
215
276
|
|
|
216
|
-
if (
|
|
217
|
-
Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.
|
|
277
|
+
if (JOIN_FORBIDDEN_CODES.includes(err.body?.code)) {
|
|
278
|
+
Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.JOIN_FORBIDDEN_ERROR, {
|
|
218
279
|
code: err.body?.code,
|
|
219
280
|
});
|
|
220
281
|
|
|
221
|
-
throw new
|
|
282
|
+
throw new MeetingInfoV2JoinForbiddenError(
|
|
222
283
|
err.body?.code,
|
|
223
284
|
err.body?.data?.meetingInfo,
|
|
224
285
|
err.body?.message
|
|
@@ -286,7 +347,8 @@ export default class MeetingInfoV2 {
|
|
|
286
347
|
})
|
|
287
348
|
.catch((err) => {
|
|
288
349
|
this.handlePolicyError(err);
|
|
289
|
-
this.
|
|
350
|
+
this.handleJoinWebinarError(err);
|
|
351
|
+
this.handleForbiddenError(err);
|
|
290
352
|
|
|
291
353
|
Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.ADHOC_MEETING_FAILURE, {
|
|
292
354
|
reason: err.message,
|
|
@@ -441,7 +503,8 @@ export default class MeetingInfoV2 {
|
|
|
441
503
|
|
|
442
504
|
if (err?.statusCode === 403) {
|
|
443
505
|
this.handlePolicyError(err);
|
|
444
|
-
this.
|
|
506
|
+
this.handleJoinWebinarError(err);
|
|
507
|
+
this.handleForbiddenError(err);
|
|
445
508
|
|
|
446
509
|
Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.VERIFY_PASSWORD_ERROR, {
|
|
447
510
|
reason: err.message,
|
|
@@ -19,6 +19,7 @@ import {
|
|
|
19
19
|
UUID_REG,
|
|
20
20
|
VALID_EMAIL_ADDRESS,
|
|
21
21
|
DEFAULT_MEETING_INFO_REQUEST_BODY,
|
|
22
|
+
JOIN_LINK_MTID,
|
|
22
23
|
} from '../constants';
|
|
23
24
|
import ParameterError from '../common/errors/parameter';
|
|
24
25
|
import LoggerProxy from '../common/logs/logger-proxy';
|
|
@@ -70,7 +71,8 @@ export default class MeetingInfoUtil {
|
|
|
70
71
|
parsedUrl.pathname.includes(`/${MEET_M}`) ||
|
|
71
72
|
parsedUrl.pathname.includes(`/${MEET_CISCO}`) ||
|
|
72
73
|
parsedUrl.pathname.includes(`/${MEET_CO}`) ||
|
|
73
|
-
parsedUrl.pathname.includes(`/${JOIN}`)
|
|
74
|
+
parsedUrl.pathname.includes(`/${JOIN}`) ||
|
|
75
|
+
(parsedUrl.search && parsedUrl.search.includes(JOIN_LINK_MTID)));
|
|
74
76
|
}
|
|
75
77
|
|
|
76
78
|
return hostNameBool && pathNameBool;
|
package/src/meetings/index.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/* eslint no-shadow: ["error", { "allow": ["eventType"] }] */
|
|
2
|
-
import {cloneDeep} from 'lodash';
|
|
2
|
+
import {cloneDeep, clone} from 'lodash';
|
|
3
3
|
import '@webex/internal-plugin-mercury';
|
|
4
4
|
import '@webex/internal-plugin-conversation';
|
|
5
5
|
import '@webex/internal-plugin-metrics';
|
|
@@ -42,6 +42,7 @@ import {
|
|
|
42
42
|
_ON_HOLD_LOBBY_,
|
|
43
43
|
_WAIT_,
|
|
44
44
|
DESTINATION_TYPE,
|
|
45
|
+
INITIAL_REGISTRATION_STATUS,
|
|
45
46
|
} from '../constants';
|
|
46
47
|
import BEHAVIORAL_METRICS from '../metrics/constants';
|
|
47
48
|
import MeetingInfo from '../meeting-info';
|
|
@@ -53,12 +54,18 @@ import Request from './request';
|
|
|
53
54
|
import PasswordError from '../common/errors/password-error';
|
|
54
55
|
import CaptchaError from '../common/errors/captcha-error';
|
|
55
56
|
import MeetingCollection from './collection';
|
|
56
|
-
import {
|
|
57
|
+
import {
|
|
58
|
+
MEETING_KEY,
|
|
59
|
+
INoiseReductionEffect,
|
|
60
|
+
IVirtualBackgroundEffect,
|
|
61
|
+
MeetingRegistrationStatus,
|
|
62
|
+
} from './meetings.types';
|
|
57
63
|
import MeetingsUtil from './util';
|
|
58
64
|
import PermissionError from '../common/errors/permission';
|
|
59
|
-
import
|
|
65
|
+
import JoinWebinarError from '../common/errors/join-webinar-error';
|
|
60
66
|
import {SpaceIDDeprecatedError} from '../common/errors/webex-errors';
|
|
61
67
|
import NoMeetingInfoError from '../common/errors/no-meeting-info';
|
|
68
|
+
import JoinForbiddenError from '../common/errors/join-forbidden-error';
|
|
62
69
|
|
|
63
70
|
let mediaLogger;
|
|
64
71
|
|
|
@@ -155,6 +162,9 @@ export type BasicMeetingInformation = {
|
|
|
155
162
|
};
|
|
156
163
|
meetingInfo: any;
|
|
157
164
|
sessionCorrelationId: string;
|
|
165
|
+
roles: string[];
|
|
166
|
+
getCurUserType: () => string | null;
|
|
167
|
+
callStateForMetrics: CallStateForMetrics;
|
|
158
168
|
};
|
|
159
169
|
|
|
160
170
|
/**
|
|
@@ -176,6 +186,7 @@ export default class Meetings extends WebexPlugin {
|
|
|
176
186
|
mediaHelpers: any;
|
|
177
187
|
breakoutLocusForHandleLater: any;
|
|
178
188
|
namespace = MEETINGS;
|
|
189
|
+
registrationStatus: MeetingRegistrationStatus;
|
|
179
190
|
|
|
180
191
|
/**
|
|
181
192
|
* Initializes the Meetings Plugin
|
|
@@ -689,6 +700,20 @@ export default class Meetings extends WebexPlugin {
|
|
|
689
700
|
});
|
|
690
701
|
}
|
|
691
702
|
|
|
703
|
+
/**
|
|
704
|
+
* API to change log upload interval. Setting the factor to 0 will disable periodic log uploads.
|
|
705
|
+
*
|
|
706
|
+
* @param {number} factor new factor value
|
|
707
|
+
* @returns {void}
|
|
708
|
+
*/
|
|
709
|
+
private _setLogUploadIntervalMultiplicationFactor(factor: number) {
|
|
710
|
+
if (typeof factor !== 'number') {
|
|
711
|
+
return;
|
|
712
|
+
}
|
|
713
|
+
// @ts-ignore
|
|
714
|
+
this.config.logUploadIntervalMultiplicationFactor = factor;
|
|
715
|
+
}
|
|
716
|
+
|
|
692
717
|
/**
|
|
693
718
|
* API to toggle unified meetings
|
|
694
719
|
* @param {Boolean} changeState
|
|
@@ -782,6 +807,18 @@ export default class Meetings extends WebexPlugin {
|
|
|
782
807
|
}
|
|
783
808
|
}
|
|
784
809
|
|
|
810
|
+
/**
|
|
811
|
+
* Executes a registration step and updates the registration status.
|
|
812
|
+
* @param {Function} step - The registration step to execute.
|
|
813
|
+
* @param {string} stepName - The name of the registration step.
|
|
814
|
+
* @returns {Promise} A promise that resolves when the step is completed.
|
|
815
|
+
*/
|
|
816
|
+
executeRegistrationStep(step: () => Promise<any>, stepName: string) {
|
|
817
|
+
return step().then(() => {
|
|
818
|
+
this.registrationStatus[stepName] = true;
|
|
819
|
+
});
|
|
820
|
+
}
|
|
821
|
+
|
|
785
822
|
/**
|
|
786
823
|
* Explicitly sets up the meetings plugin by registering
|
|
787
824
|
* the device, connecting to mercury, and listening for locus events.
|
|
@@ -792,6 +829,8 @@ export default class Meetings extends WebexPlugin {
|
|
|
792
829
|
* @memberof Meetings
|
|
793
830
|
*/
|
|
794
831
|
public register(deviceRegistrationOptions?: DeviceRegistrationOptions): Promise<any> {
|
|
832
|
+
this.registrationStatus = clone(INITIAL_REGISTRATION_STATUS);
|
|
833
|
+
|
|
795
834
|
// @ts-ignore
|
|
796
835
|
if (!this.webex.canAuthorize) {
|
|
797
836
|
LoggerProxy.logger.error(
|
|
@@ -810,24 +849,39 @@ export default class Meetings extends WebexPlugin {
|
|
|
810
849
|
}
|
|
811
850
|
|
|
812
851
|
return Promise.all([
|
|
813
|
-
this.fetchUserPreferredWebexSite(),
|
|
814
|
-
this.getGeoHint(),
|
|
815
|
-
this.
|
|
816
|
-
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
|
|
852
|
+
this.executeRegistrationStep(() => this.fetchUserPreferredWebexSite(), 'fetchWebexSite'),
|
|
853
|
+
this.executeRegistrationStep(() => this.getGeoHint(), 'getGeoHint'),
|
|
854
|
+
this.executeRegistrationStep(
|
|
855
|
+
() =>
|
|
856
|
+
this.startReachability('registration').catch((error) => {
|
|
857
|
+
LoggerProxy.logger.error(`Meetings:index#register --> GDM error, ${error.message}`);
|
|
858
|
+
}),
|
|
859
|
+
'startReachability'
|
|
860
|
+
),
|
|
861
|
+
this.executeRegistrationStep(
|
|
862
|
+
() =>
|
|
863
|
+
// @ts-ignore
|
|
864
|
+
this.webex.internal.device
|
|
865
|
+
.register(deviceRegistrationOptions)
|
|
824
866
|
// @ts-ignore
|
|
825
|
-
|
|
826
|
-
|
|
867
|
+
.then(() => {
|
|
868
|
+
LoggerProxy.logger.info(
|
|
869
|
+
// @ts-ignore
|
|
870
|
+
`Meetings:index#register --> INFO, Device registered ${this.webex.internal.device.url}`
|
|
871
|
+
);
|
|
872
|
+
}),
|
|
873
|
+
'deviceRegister'
|
|
874
|
+
).then(() =>
|
|
875
|
+
this.executeRegistrationStep(
|
|
876
|
+
// @ts-ignore
|
|
877
|
+
() => this.webex.internal.mercury.connect(),
|
|
878
|
+
'mercuryConnect'
|
|
827
879
|
)
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
|
|
880
|
+
),
|
|
881
|
+
this.executeRegistrationStep(
|
|
882
|
+
() => Promise.resolve(MeetingsUtil.checkH264Support.call(this)),
|
|
883
|
+
'checkH264Support'
|
|
884
|
+
),
|
|
831
885
|
])
|
|
832
886
|
.then(() => {
|
|
833
887
|
this.listenForEvents();
|
|
@@ -891,6 +945,7 @@ export default class Meetings extends WebexPlugin {
|
|
|
891
945
|
EVENT_TRIGGERS.MEETINGS_UNREGISTERED
|
|
892
946
|
);
|
|
893
947
|
this.registered = false;
|
|
948
|
+
this.registrationStatus = clone(INITIAL_REGISTRATION_STATUS);
|
|
894
949
|
})
|
|
895
950
|
);
|
|
896
951
|
}
|
|
@@ -1143,6 +1198,9 @@ export default class Meetings extends WebexPlugin {
|
|
|
1143
1198
|
sessionId: meeting.locusInfo?.fullState?.sessionId,
|
|
1144
1199
|
},
|
|
1145
1200
|
},
|
|
1201
|
+
roles: meeting.roles,
|
|
1202
|
+
callStateForMetrics: meeting.callStateForMetrics,
|
|
1203
|
+
getCurUserType: meeting.getCurUserType,
|
|
1146
1204
|
});
|
|
1147
1205
|
this.meetingCollection.delete(meeting.id);
|
|
1148
1206
|
Trigger.trigger(
|
|
@@ -1406,7 +1464,8 @@ export default class Meetings extends WebexPlugin {
|
|
|
1406
1464
|
!(err instanceof CaptchaError) &&
|
|
1407
1465
|
!(err instanceof PasswordError) &&
|
|
1408
1466
|
!(err instanceof PermissionError) &&
|
|
1409
|
-
!(err instanceof
|
|
1467
|
+
!(err instanceof JoinWebinarError) &&
|
|
1468
|
+
!(err instanceof JoinForbiddenError)
|
|
1410
1469
|
) {
|
|
1411
1470
|
LoggerProxy.logger.info(
|
|
1412
1471
|
`Meetings:index#createMeeting --> Info Unable to fetch meeting info for ${destination}.`
|
|
@@ -21,3 +21,13 @@ export const MEETING_KEY = {
|
|
|
21
21
|
} as const;
|
|
22
22
|
|
|
23
23
|
export type MEETING_KEY = Enum<typeof MEETING_KEY>;
|
|
24
|
+
|
|
25
|
+
// finer grained status for registration steps
|
|
26
|
+
export type MeetingRegistrationStatus = {
|
|
27
|
+
fetchWebexSite: boolean;
|
|
28
|
+
getGeoHint: boolean;
|
|
29
|
+
startReachability: boolean;
|
|
30
|
+
deviceRegister: boolean;
|
|
31
|
+
mercuryConnect: boolean;
|
|
32
|
+
checkH264Support: boolean;
|
|
33
|
+
};
|
package/src/meetings/util.ts
CHANGED
package/src/member/index.ts
CHANGED
|
@@ -28,6 +28,7 @@ export default class Member {
|
|
|
28
28
|
isRecording: any;
|
|
29
29
|
isRemovable: any;
|
|
30
30
|
isSelf: any;
|
|
31
|
+
isBrb: boolean;
|
|
31
32
|
isUser: any;
|
|
32
33
|
isVideoMuted: any;
|
|
33
34
|
roles: IExternalRoles;
|
|
@@ -227,6 +228,13 @@ export default class Member {
|
|
|
227
228
|
* @memberof Member
|
|
228
229
|
*/
|
|
229
230
|
this.isRemovable = null;
|
|
231
|
+
/**
|
|
232
|
+
* @instance
|
|
233
|
+
* @type {Boolean}
|
|
234
|
+
* @public
|
|
235
|
+
* @memberof Member
|
|
236
|
+
*/
|
|
237
|
+
this.isBrb = false;
|
|
230
238
|
/**
|
|
231
239
|
* @instance
|
|
232
240
|
* @type {String}
|
|
@@ -295,6 +303,7 @@ export default class Member {
|
|
|
295
303
|
this.supportsInterpretation = MemberUtil.isInterpretationSupported(participant);
|
|
296
304
|
this.supportLiveAnnotation = MemberUtil.isLiveAnnotationSupported(participant);
|
|
297
305
|
this.isGuest = MemberUtil.isGuest(participant);
|
|
306
|
+
this.isBrb = MemberUtil.isBrb(participant);
|
|
298
307
|
this.isUser = MemberUtil.isUser(participant);
|
|
299
308
|
this.isDevice = MemberUtil.isDevice(participant);
|
|
300
309
|
this.isModerator = MemberUtil.isModerator(participant);
|
package/src/member/types.ts
CHANGED
|
@@ -23,6 +23,14 @@ export type ParticipantWithRoles = {
|
|
|
23
23
|
};
|
|
24
24
|
};
|
|
25
25
|
|
|
26
|
+
export type ParticipantWithBrb = {
|
|
27
|
+
controls: {
|
|
28
|
+
brb?: {
|
|
29
|
+
enabled: boolean;
|
|
30
|
+
};
|
|
31
|
+
};
|
|
32
|
+
};
|
|
33
|
+
|
|
26
34
|
// values are inherited from locus so don't update these
|
|
27
35
|
export enum MediaStatus {
|
|
28
36
|
RECVONLY = 'RECVONLY', // participant only receiving and not sending
|