@webex/plugin-meetings 3.7.0-next.5 → 3.7.0-next.51
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/{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 +40 -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 +30 -17
- package/dist/locus-info/selfUtils.js.map +1 -1
- package/dist/meeting/in-meeting-actions.js +4 -0
- package/dist/meeting/in-meeting-actions.js.map +1 -1
- package/dist/meeting/index.js +944 -832
- 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/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 +29 -17
- 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 +106 -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 +1 -1
- 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/recording-controller/enums.js +8 -4
- package/dist/recording-controller/enums.js.map +1 -1
- package/dist/recording-controller/index.js +18 -9
- package/dist/recording-controller/index.js.map +1 -1
- package/dist/recording-controller/util.js +13 -9
- package/dist/recording-controller/util.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/{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 +34 -1
- package/dist/types/index.d.ts +3 -3
- package/dist/types/locus-info/index.d.ts +2 -1
- package/dist/types/meeting/in-meeting-actions.d.ts +4 -0
- package/dist/types/meeting/index.d.ts +19 -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 +4 -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 +1 -1
- package/dist/types/multistream/sendSlotManager.d.ts +8 -1
- package/dist/types/recording-controller/enums.d.ts +5 -2
- package/dist/types/recording-controller/index.d.ts +1 -0
- package/dist/types/recording-controller/util.d.ts +2 -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-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 +39 -3
- package/src/index.ts +5 -3
- package/src/locus-info/index.ts +20 -3
- package/src/locus-info/selfUtils.ts +19 -6
- package/src/meeting/in-meeting-actions.ts +8 -0
- package/src/meeting/index.ts +246 -80
- package/src/meeting/locusMediaRequest.ts +7 -0
- 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 +23 -11
- package/src/meeting-info/utilv2.ts +3 -1
- package/src/meetings/index.ts +77 -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 +1 -1
- package/src/multistream/remoteMedia.ts +28 -15
- package/src/multistream/sendSlotManager.ts +31 -0
- package/src/recording-controller/enums.ts +5 -2
- package/src/recording-controller/index.ts +17 -4
- package/src/recording-controller/util.ts +20 -5
- 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 +91 -1
- package/test/unit/spec/meeting/in-meeting-actions.ts +4 -0
- package/test/unit/spec/meeting/index.js +689 -105
- package/test/unit/spec/meeting/utils.js +22 -19
- package/test/unit/spec/meeting-info/meetinginfov2.js +9 -4
- package/test/unit/spec/meeting-info/utilv2.js +17 -0
- package/test/unit/spec/meetings/index.js +153 -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/recording-controller/index.js +61 -5
- package/test/unit/spec/recording-controller/util.js +39 -3
- 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/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,19 @@ 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
|
-
|
|
21
|
+
/**
|
|
22
|
+
* 403021 - Meeting registration is required
|
|
23
|
+
* 403022 - Meeting registration is still pending
|
|
24
|
+
* 403024 - Meeting registration have been rejected
|
|
25
|
+
* 403137 - Registration ID verified failure
|
|
26
|
+
* 423007 - Registration ID input too many time,please input captcha code
|
|
27
|
+
* 403026 - Need to join meeting via webcast
|
|
28
|
+
* 403037 - Meeting join required registration ID
|
|
29
|
+
* 403137 - Registration ID verified failure
|
|
30
|
+
*
|
|
31
|
+
*/
|
|
32
|
+
const JOIN_WEBINAR_ERROR_CODES = [403021, 403022, 403024, 403137, 423007, 403026, 403037, 403137];
|
|
33
|
+
|
|
22
34
|
/**
|
|
23
35
|
* Error to indicate that wbxappapi requires a password
|
|
24
36
|
*/
|
|
@@ -126,9 +138,9 @@ export class MeetingInfoV2CaptchaError extends Error {
|
|
|
126
138
|
}
|
|
127
139
|
|
|
128
140
|
/**
|
|
129
|
-
* Error preventing join because of a webinar
|
|
141
|
+
* Error preventing join because of a webinar have some error
|
|
130
142
|
*/
|
|
131
|
-
export class
|
|
143
|
+
export class MeetingInfoV2JoinWebinarError extends Error {
|
|
132
144
|
meetingInfo: any;
|
|
133
145
|
sdkMessage: any;
|
|
134
146
|
wbxAppApiCode: any;
|
|
@@ -142,7 +154,7 @@ export class MeetingInfoV2WebinarRegistrationError extends Error {
|
|
|
142
154
|
*/
|
|
143
155
|
constructor(wbxAppApiErrorCode?: number, meetingInfo?: object, message?: string) {
|
|
144
156
|
super(`${message}, code=${wbxAppApiErrorCode}`);
|
|
145
|
-
this.name = '
|
|
157
|
+
this.name = 'MeetingInfoV2JoinWebinarError';
|
|
146
158
|
this.sdkMessage = message;
|
|
147
159
|
this.stack = new Error().stack;
|
|
148
160
|
this.wbxAppApiCode = wbxAppApiErrorCode;
|
|
@@ -204,21 +216,21 @@ export default class MeetingInfoV2 {
|
|
|
204
216
|
};
|
|
205
217
|
|
|
206
218
|
/**
|
|
207
|
-
* Raises a
|
|
219
|
+
* Raises a handleJoinWebinarError for join webinar error codes
|
|
208
220
|
* @param {any} err the error from the request
|
|
209
221
|
* @returns {void}
|
|
210
222
|
*/
|
|
211
|
-
|
|
223
|
+
handleJoinWebinarError = (err) => {
|
|
212
224
|
if (!err.body) {
|
|
213
225
|
return;
|
|
214
226
|
}
|
|
215
227
|
|
|
216
|
-
if (
|
|
217
|
-
Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.
|
|
228
|
+
if (JOIN_WEBINAR_ERROR_CODES.includes(err.body?.code)) {
|
|
229
|
+
Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.JOIN_WEBINAR_ERROR, {
|
|
218
230
|
code: err.body?.code,
|
|
219
231
|
});
|
|
220
232
|
|
|
221
|
-
throw new
|
|
233
|
+
throw new MeetingInfoV2JoinWebinarError(
|
|
222
234
|
err.body?.code,
|
|
223
235
|
err.body?.data?.meetingInfo,
|
|
224
236
|
err.body?.message
|
|
@@ -286,7 +298,7 @@ export default class MeetingInfoV2 {
|
|
|
286
298
|
})
|
|
287
299
|
.catch((err) => {
|
|
288
300
|
this.handlePolicyError(err);
|
|
289
|
-
this.
|
|
301
|
+
this.handleJoinWebinarError(err);
|
|
290
302
|
|
|
291
303
|
Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.ADHOC_MEETING_FAILURE, {
|
|
292
304
|
reason: err.message,
|
|
@@ -441,7 +453,7 @@ export default class MeetingInfoV2 {
|
|
|
441
453
|
|
|
442
454
|
if (err?.statusCode === 403) {
|
|
443
455
|
this.handlePolicyError(err);
|
|
444
|
-
this.
|
|
456
|
+
this.handleJoinWebinarError(err);
|
|
445
457
|
|
|
446
458
|
Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.VERIFY_PASSWORD_ERROR, {
|
|
447
459
|
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,10 +54,15 @@ 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';
|
|
62
68
|
|
|
@@ -155,6 +161,9 @@ export type BasicMeetingInformation = {
|
|
|
155
161
|
};
|
|
156
162
|
meetingInfo: any;
|
|
157
163
|
sessionCorrelationId: string;
|
|
164
|
+
roles: string[];
|
|
165
|
+
getCurUserType: () => string | null;
|
|
166
|
+
callStateForMetrics: CallStateForMetrics;
|
|
158
167
|
};
|
|
159
168
|
|
|
160
169
|
/**
|
|
@@ -176,6 +185,7 @@ export default class Meetings extends WebexPlugin {
|
|
|
176
185
|
mediaHelpers: any;
|
|
177
186
|
breakoutLocusForHandleLater: any;
|
|
178
187
|
namespace = MEETINGS;
|
|
188
|
+
registrationStatus: MeetingRegistrationStatus;
|
|
179
189
|
|
|
180
190
|
/**
|
|
181
191
|
* Initializes the Meetings Plugin
|
|
@@ -689,6 +699,20 @@ export default class Meetings extends WebexPlugin {
|
|
|
689
699
|
});
|
|
690
700
|
}
|
|
691
701
|
|
|
702
|
+
/**
|
|
703
|
+
* API to change log upload interval. Setting the factor to 0 will disable periodic log uploads.
|
|
704
|
+
*
|
|
705
|
+
* @param {number} factor new factor value
|
|
706
|
+
* @returns {void}
|
|
707
|
+
*/
|
|
708
|
+
private _setLogUploadIntervalMultiplicationFactor(factor: number) {
|
|
709
|
+
if (typeof factor !== 'number') {
|
|
710
|
+
return;
|
|
711
|
+
}
|
|
712
|
+
// @ts-ignore
|
|
713
|
+
this.config.logUploadIntervalMultiplicationFactor = factor;
|
|
714
|
+
}
|
|
715
|
+
|
|
692
716
|
/**
|
|
693
717
|
* API to toggle unified meetings
|
|
694
718
|
* @param {Boolean} changeState
|
|
@@ -782,6 +806,18 @@ export default class Meetings extends WebexPlugin {
|
|
|
782
806
|
}
|
|
783
807
|
}
|
|
784
808
|
|
|
809
|
+
/**
|
|
810
|
+
* Executes a registration step and updates the registration status.
|
|
811
|
+
* @param {Function} step - The registration step to execute.
|
|
812
|
+
* @param {string} stepName - The name of the registration step.
|
|
813
|
+
* @returns {Promise} A promise that resolves when the step is completed.
|
|
814
|
+
*/
|
|
815
|
+
executeRegistrationStep(step: () => Promise<any>, stepName: string) {
|
|
816
|
+
return step().then(() => {
|
|
817
|
+
this.registrationStatus[stepName] = true;
|
|
818
|
+
});
|
|
819
|
+
}
|
|
820
|
+
|
|
785
821
|
/**
|
|
786
822
|
* Explicitly sets up the meetings plugin by registering
|
|
787
823
|
* the device, connecting to mercury, and listening for locus events.
|
|
@@ -792,6 +828,8 @@ export default class Meetings extends WebexPlugin {
|
|
|
792
828
|
* @memberof Meetings
|
|
793
829
|
*/
|
|
794
830
|
public register(deviceRegistrationOptions?: DeviceRegistrationOptions): Promise<any> {
|
|
831
|
+
this.registrationStatus = clone(INITIAL_REGISTRATION_STATUS);
|
|
832
|
+
|
|
795
833
|
// @ts-ignore
|
|
796
834
|
if (!this.webex.canAuthorize) {
|
|
797
835
|
LoggerProxy.logger.error(
|
|
@@ -810,24 +848,39 @@ export default class Meetings extends WebexPlugin {
|
|
|
810
848
|
}
|
|
811
849
|
|
|
812
850
|
return Promise.all([
|
|
813
|
-
this.fetchUserPreferredWebexSite(),
|
|
814
|
-
this.getGeoHint(),
|
|
815
|
-
this.
|
|
816
|
-
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
|
|
851
|
+
this.executeRegistrationStep(() => this.fetchUserPreferredWebexSite(), 'fetchWebexSite'),
|
|
852
|
+
this.executeRegistrationStep(() => this.getGeoHint(), 'getGeoHint'),
|
|
853
|
+
this.executeRegistrationStep(
|
|
854
|
+
() =>
|
|
855
|
+
this.startReachability('registration').catch((error) => {
|
|
856
|
+
LoggerProxy.logger.error(`Meetings:index#register --> GDM error, ${error.message}`);
|
|
857
|
+
}),
|
|
858
|
+
'startReachability'
|
|
859
|
+
),
|
|
860
|
+
this.executeRegistrationStep(
|
|
861
|
+
() =>
|
|
862
|
+
// @ts-ignore
|
|
863
|
+
this.webex.internal.device
|
|
864
|
+
.register(deviceRegistrationOptions)
|
|
824
865
|
// @ts-ignore
|
|
825
|
-
|
|
826
|
-
|
|
866
|
+
.then(() => {
|
|
867
|
+
LoggerProxy.logger.info(
|
|
868
|
+
// @ts-ignore
|
|
869
|
+
`Meetings:index#register --> INFO, Device registered ${this.webex.internal.device.url}`
|
|
870
|
+
);
|
|
871
|
+
}),
|
|
872
|
+
'deviceRegister'
|
|
873
|
+
).then(() =>
|
|
874
|
+
this.executeRegistrationStep(
|
|
875
|
+
// @ts-ignore
|
|
876
|
+
() => this.webex.internal.mercury.connect(),
|
|
877
|
+
'mercuryConnect'
|
|
827
878
|
)
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
|
|
879
|
+
),
|
|
880
|
+
this.executeRegistrationStep(
|
|
881
|
+
() => Promise.resolve(MeetingsUtil.checkH264Support.call(this)),
|
|
882
|
+
'checkH264Support'
|
|
883
|
+
),
|
|
831
884
|
])
|
|
832
885
|
.then(() => {
|
|
833
886
|
this.listenForEvents();
|
|
@@ -891,6 +944,7 @@ export default class Meetings extends WebexPlugin {
|
|
|
891
944
|
EVENT_TRIGGERS.MEETINGS_UNREGISTERED
|
|
892
945
|
);
|
|
893
946
|
this.registered = false;
|
|
947
|
+
this.registrationStatus = clone(INITIAL_REGISTRATION_STATUS);
|
|
894
948
|
})
|
|
895
949
|
);
|
|
896
950
|
}
|
|
@@ -1143,6 +1197,9 @@ export default class Meetings extends WebexPlugin {
|
|
|
1143
1197
|
sessionId: meeting.locusInfo?.fullState?.sessionId,
|
|
1144
1198
|
},
|
|
1145
1199
|
},
|
|
1200
|
+
roles: meeting.roles,
|
|
1201
|
+
callStateForMetrics: meeting.callStateForMetrics,
|
|
1202
|
+
getCurUserType: meeting.getCurUserType,
|
|
1146
1203
|
});
|
|
1147
1204
|
this.meetingCollection.delete(meeting.id);
|
|
1148
1205
|
Trigger.trigger(
|
|
@@ -1406,7 +1463,7 @@ export default class Meetings extends WebexPlugin {
|
|
|
1406
1463
|
!(err instanceof CaptchaError) &&
|
|
1407
1464
|
!(err instanceof PasswordError) &&
|
|
1408
1465
|
!(err instanceof PermissionError) &&
|
|
1409
|
-
!(err instanceof
|
|
1466
|
+
!(err instanceof JoinWebinarError)
|
|
1410
1467
|
) {
|
|
1411
1468
|
LoggerProxy.logger.info(
|
|
1412
1469
|
`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
|
package/src/member/util.ts
CHANGED
|
@@ -4,6 +4,7 @@ import {
|
|
|
4
4
|
ServerRoles,
|
|
5
5
|
ServerRoleShape,
|
|
6
6
|
IMediaStatus,
|
|
7
|
+
ParticipantWithBrb,
|
|
7
8
|
} from './types';
|
|
8
9
|
import {
|
|
9
10
|
_USER_,
|
|
@@ -29,7 +30,7 @@ import ParameterError from '../common/errors/parameter';
|
|
|
29
30
|
const MemberUtil: any = {};
|
|
30
31
|
|
|
31
32
|
/**
|
|
32
|
-
* @param {Object} participant
|
|
33
|
+
* @param {Object} participant - The locus participant object.
|
|
33
34
|
* @returns {Boolean}
|
|
34
35
|
*/
|
|
35
36
|
MemberUtil.canReclaimHost = (participant) => {
|
|
@@ -43,14 +44,23 @@ MemberUtil.canReclaimHost = (participant) => {
|
|
|
43
44
|
};
|
|
44
45
|
|
|
45
46
|
/**
|
|
46
|
-
* @param {Object} participant
|
|
47
|
+
* @param {Object} participant - The locus participant object.
|
|
47
48
|
* @returns {[ServerRoleShape]}
|
|
48
49
|
*/
|
|
49
50
|
MemberUtil.getControlsRoles = (participant: ParticipantWithRoles): Array<ServerRoleShape> =>
|
|
50
51
|
participant?.controls?.role?.roles;
|
|
51
52
|
|
|
52
53
|
/**
|
|
53
|
-
*
|
|
54
|
+
* Checks if the participant has the brb status enabled.
|
|
55
|
+
*
|
|
56
|
+
* @param {ParticipantWithBrb} participant - The locus participant object.
|
|
57
|
+
* @returns {boolean} - True if the participant has brb enabled, false otherwise.
|
|
58
|
+
*/
|
|
59
|
+
MemberUtil.isBrb = (participant: ParticipantWithBrb): boolean =>
|
|
60
|
+
participant.controls?.brb?.enabled || false;
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* @param {Object} participant - The locus participant object.
|
|
54
64
|
* @param {ServerRoles} controlRole the search role
|
|
55
65
|
* @returns {Boolean}
|
|
56
66
|
*/
|
|
@@ -60,28 +70,28 @@ MemberUtil.hasRole = (participant: any, controlRole: ServerRoles): boolean =>
|
|
|
60
70
|
);
|
|
61
71
|
|
|
62
72
|
/**
|
|
63
|
-
* @param {Object} participant
|
|
73
|
+
* @param {Object} participant - The locus participant object.
|
|
64
74
|
* @returns {Boolean}
|
|
65
75
|
*/
|
|
66
76
|
MemberUtil.hasCohost = (participant: ParticipantWithRoles): boolean =>
|
|
67
77
|
MemberUtil.hasRole(participant, ServerRoles.Cohost) || false;
|
|
68
78
|
|
|
69
79
|
/**
|
|
70
|
-
* @param {Object} participant
|
|
80
|
+
* @param {Object} participant - The locus participant object.
|
|
71
81
|
* @returns {Boolean}
|
|
72
82
|
*/
|
|
73
83
|
MemberUtil.hasModerator = (participant: ParticipantWithRoles): boolean =>
|
|
74
84
|
MemberUtil.hasRole(participant, ServerRoles.Moderator) || false;
|
|
75
85
|
|
|
76
86
|
/**
|
|
77
|
-
* @param {Object} participant
|
|
87
|
+
* @param {Object} participant - The locus participant object.
|
|
78
88
|
* @returns {Boolean}
|
|
79
89
|
*/
|
|
80
90
|
MemberUtil.hasPresenter = (participant: ParticipantWithRoles): boolean =>
|
|
81
91
|
MemberUtil.hasRole(participant, ServerRoles.Presenter) || false;
|
|
82
92
|
|
|
83
93
|
/**
|
|
84
|
-
* @param {Object} participant
|
|
94
|
+
* @param {Object} participant - The locus participant object.
|
|
85
95
|
* @returns {IExternalRoles}
|
|
86
96
|
*/
|
|
87
97
|
MemberUtil.extractControlRoles = (participant: ParticipantWithRoles): IExternalRoles => {
|
|
@@ -95,7 +105,7 @@ MemberUtil.extractControlRoles = (participant: ParticipantWithRoles): IExternalR
|
|
|
95
105
|
};
|
|
96
106
|
|
|
97
107
|
/**
|
|
98
|
-
* @param {Object} participant
|
|
108
|
+
* @param {Object} participant - The locus participant object.
|
|
99
109
|
* @returns {Boolean}
|
|
100
110
|
*/
|
|
101
111
|
MemberUtil.isUser = (participant: any) => participant && participant.type === _USER_;
|
|
@@ -103,13 +113,13 @@ MemberUtil.isUser = (participant: any) => participant && participant.type === _U
|
|
|
103
113
|
MemberUtil.isModerator = (participant) => participant && participant.moderator;
|
|
104
114
|
|
|
105
115
|
/**
|
|
106
|
-
* @param {Object} participant
|
|
116
|
+
* @param {Object} participant - The locus participant object.
|
|
107
117
|
* @returns {Boolean}
|
|
108
118
|
*/
|
|
109
119
|
MemberUtil.isGuest = (participant: any) => participant && participant.guest;
|
|
110
120
|
|
|
111
121
|
/**
|
|
112
|
-
* @param {Object} participant
|
|
122
|
+
* @param {Object} participant - The locus participant object.
|
|
113
123
|
* @returns {Boolean}
|
|
114
124
|
*/
|
|
115
125
|
MemberUtil.isDevice = (participant: any) => participant && participant.type === _RESOURCE_ROOM_;
|
|
@@ -120,7 +130,7 @@ MemberUtil.isModeratorAssignmentProhibited = (participant) =>
|
|
|
120
130
|
/**
|
|
121
131
|
* checks to see if the participant id is the same as the passed id
|
|
122
132
|
* there are multiple ids that can be used
|
|
123
|
-
* @param {Object} participant
|
|
133
|
+
* @param {Object} participant - The locus participant object.
|
|
124
134
|
* @param {String} id
|
|
125
135
|
* @returns {Boolean}
|
|
126
136
|
*/
|
|
@@ -130,7 +140,7 @@ MemberUtil.isSame = (participant: any, id: string) =>
|
|
|
130
140
|
/**
|
|
131
141
|
* checks to see if the participant id is the same as the passed id for associated devices
|
|
132
142
|
* there are multiple ids that can be used
|
|
133
|
-
* @param {Object} participant
|
|
143
|
+
* @param {Object} participant - The locus participant object.
|
|
134
144
|
* @param {String} id
|
|
135
145
|
* @returns {Boolean}
|
|
136
146
|
*/
|
|
@@ -142,7 +152,7 @@ MemberUtil.isAssociatedSame = (participant: any, id: string) =>
|
|
|
142
152
|
);
|
|
143
153
|
|
|
144
154
|
/**
|
|
145
|
-
* @param {Object} participant
|
|
155
|
+
* @param {Object} participant - The locus participant object.
|
|
146
156
|
* @param {Boolean} isGuest
|
|
147
157
|
* @param {String} status
|
|
148
158
|
* @returns {Boolean}
|
|
@@ -161,7 +171,7 @@ MemberUtil.isNotAdmitted = (participant: any, isGuest: boolean, status: string):
|
|
|
161
171
|
!status === _IN_MEETING_);
|
|
162
172
|
|
|
163
173
|
/**
|
|
164
|
-
* @param {Object} participant
|
|
174
|
+
* @param {Object} participant - The locus participant object.
|
|
165
175
|
* @returns {Boolean}
|
|
166
176
|
*/
|
|
167
177
|
MemberUtil.isAudioMuted = (participant: any) => {
|
|
@@ -173,7 +183,7 @@ MemberUtil.isAudioMuted = (participant: any) => {
|
|
|
173
183
|
};
|
|
174
184
|
|
|
175
185
|
/**
|
|
176
|
-
* @param {Object} participant
|
|
186
|
+
* @param {Object} participant - The locus participant object.
|
|
177
187
|
* @returns {Boolean}
|
|
178
188
|
*/
|
|
179
189
|
MemberUtil.isVideoMuted = (participant: any): boolean => {
|
|
@@ -185,7 +195,7 @@ MemberUtil.isVideoMuted = (participant: any): boolean => {
|
|
|
185
195
|
};
|
|
186
196
|
|
|
187
197
|
/**
|
|
188
|
-
* @param {Object} participant
|
|
198
|
+
* @param {Object} participant - The locus participant object.
|
|
189
199
|
* @returns {Boolean}
|
|
190
200
|
*/
|
|
191
201
|
MemberUtil.isHandRaised = (participant: any) => {
|
|
@@ -197,7 +207,7 @@ MemberUtil.isHandRaised = (participant: any) => {
|
|
|
197
207
|
};
|
|
198
208
|
|
|
199
209
|
/**
|
|
200
|
-
* @param {Object} participant
|
|
210
|
+
* @param {Object} participant - The locus participant object.
|
|
201
211
|
* @returns {Boolean}
|
|
202
212
|
*/
|
|
203
213
|
MemberUtil.isBreakoutsSupported = (participant) => {
|
|
@@ -209,7 +219,7 @@ MemberUtil.isBreakoutsSupported = (participant) => {
|
|
|
209
219
|
};
|
|
210
220
|
|
|
211
221
|
/**
|
|
212
|
-
* @param {Object} participant
|
|
222
|
+
* @param {Object} participant - The locus participant object.
|
|
213
223
|
* @returns {Boolean}
|
|
214
224
|
*/
|
|
215
225
|
MemberUtil.isInterpretationSupported = (participant) => {
|
|
@@ -223,7 +233,7 @@ MemberUtil.isInterpretationSupported = (participant) => {
|
|
|
223
233
|
};
|
|
224
234
|
|
|
225
235
|
/**
|
|
226
|
-
* @param {Object} participant
|
|
236
|
+
* @param {Object} participant - The locus participant object.
|
|
227
237
|
* @returns {Boolean}
|
|
228
238
|
*/
|
|
229
239
|
MemberUtil.isLiveAnnotationSupported = (participant) => {
|
|
@@ -279,7 +289,7 @@ MemberUtil.getRecordingMember = (controls: any) => {
|
|
|
279
289
|
};
|
|
280
290
|
|
|
281
291
|
/**
|
|
282
|
-
* @param {Object} participant
|
|
292
|
+
* @param {Object} participant - The locus participant object.
|
|
283
293
|
* @returns {Boolean}
|
|
284
294
|
*/
|
|
285
295
|
MemberUtil.isRecording = (participant: any) => {
|
|
@@ -325,7 +335,7 @@ MemberUtil.isMutable = (isSelf, isDevice, isInMeeting, isMuted, type) => {
|
|
|
325
335
|
};
|
|
326
336
|
|
|
327
337
|
/**
|
|
328
|
-
* @param {Object} participant
|
|
338
|
+
* @param {Object} participant - The locus participant object.
|
|
329
339
|
* @returns {String}
|
|
330
340
|
*/
|
|
331
341
|
MemberUtil.extractStatus = (participant: any) => {
|
|
@@ -355,7 +365,7 @@ MemberUtil.extractStatus = (participant: any) => {
|
|
|
355
365
|
};
|
|
356
366
|
|
|
357
367
|
/**
|
|
358
|
-
* @param {Object} participant
|
|
368
|
+
* @param {Object} participant - The locus participant object.
|
|
359
369
|
* @returns {String}
|
|
360
370
|
*/
|
|
361
371
|
MemberUtil.extractId = (participant: any) => {
|
|
@@ -368,7 +378,7 @@ MemberUtil.extractId = (participant: any) => {
|
|
|
368
378
|
|
|
369
379
|
/**
|
|
370
380
|
* extracts the media status from nested participant object
|
|
371
|
-
* @param {Object} participant
|
|
381
|
+
* @param {Object} participant - The locus participant object.
|
|
372
382
|
* @returns {Object}
|
|
373
383
|
*/
|
|
374
384
|
MemberUtil.extractMediaStatus = (participant: any): IMediaStatus => {
|
|
@@ -383,7 +393,7 @@ MemberUtil.extractMediaStatus = (participant: any): IMediaStatus => {
|
|
|
383
393
|
};
|
|
384
394
|
|
|
385
395
|
/**
|
|
386
|
-
* @param {Object} participant
|
|
396
|
+
* @param {Object} participant - The locus participant object.
|
|
387
397
|
* @returns {String}
|
|
388
398
|
*/
|
|
389
399
|
MemberUtil.extractName = (participant: any) => {
|
package/src/metrics/constants.ts
CHANGED
|
@@ -70,7 +70,7 @@ const BEHAVIORAL_METRICS = {
|
|
|
70
70
|
ROAP_HTTP_RESPONSE_MISSING: 'js_sdk_roap_http_response_missing',
|
|
71
71
|
TURN_DISCOVERY_REQUIRES_OK: 'js_sdk_turn_discovery_requires_ok',
|
|
72
72
|
REACHABILITY_COMPLETED: 'js_sdk_reachability_completed',
|
|
73
|
-
|
|
73
|
+
JOIN_WEBINAR_ERROR: 'js_sdk_join_webinar_error',
|
|
74
74
|
GUEST_ENTERED_LOBBY: 'js_sdk_guest_entered_lobby',
|
|
75
75
|
GUEST_EXITED_LOBBY: 'js_sdk_guest_exited_lobby',
|
|
76
76
|
};
|