@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.
Files changed (138) hide show
  1. package/dist/annotation/index.js +17 -0
  2. package/dist/annotation/index.js.map +1 -1
  3. package/dist/breakouts/breakout.js +1 -1
  4. package/dist/breakouts/index.js +1 -1
  5. package/dist/common/errors/join-forbidden-error.js +52 -0
  6. package/dist/common/errors/join-forbidden-error.js.map +1 -0
  7. package/dist/common/errors/{webinar-registration-error.js → join-webinar-error.js} +12 -12
  8. package/dist/common/errors/join-webinar-error.js.map +1 -0
  9. package/dist/common/errors/multistream-not-supported-error.js +53 -0
  10. package/dist/common/errors/multistream-not-supported-error.js.map +1 -0
  11. package/dist/config.js +1 -1
  12. package/dist/config.js.map +1 -1
  13. package/dist/constants.js +46 -5
  14. package/dist/constants.js.map +1 -1
  15. package/dist/index.js +16 -11
  16. package/dist/index.js.map +1 -1
  17. package/dist/interpretation/index.js +1 -1
  18. package/dist/interpretation/siLanguage.js +1 -1
  19. package/dist/locus-info/index.js +14 -3
  20. package/dist/locus-info/index.js.map +1 -1
  21. package/dist/locus-info/selfUtils.js +35 -17
  22. package/dist/locus-info/selfUtils.js.map +1 -1
  23. package/dist/meeting/brbState.js +167 -0
  24. package/dist/meeting/brbState.js.map +1 -0
  25. package/dist/meeting/in-meeting-actions.js +2 -0
  26. package/dist/meeting/in-meeting-actions.js.map +1 -1
  27. package/dist/meeting/index.js +774 -649
  28. package/dist/meeting/index.js.map +1 -1
  29. package/dist/meeting/locusMediaRequest.js +9 -0
  30. package/dist/meeting/locusMediaRequest.js.map +1 -1
  31. package/dist/meeting/muteState.js +1 -6
  32. package/dist/meeting/muteState.js.map +1 -1
  33. package/dist/meeting/request.js +30 -0
  34. package/dist/meeting/request.js.map +1 -1
  35. package/dist/meeting/request.type.js.map +1 -1
  36. package/dist/meeting/util.js +16 -16
  37. package/dist/meeting/util.js.map +1 -1
  38. package/dist/meeting-info/meeting-info-v2.js +96 -33
  39. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  40. package/dist/meeting-info/utilv2.js +1 -1
  41. package/dist/meeting-info/utilv2.js.map +1 -1
  42. package/dist/meetings/index.js +107 -55
  43. package/dist/meetings/index.js.map +1 -1
  44. package/dist/meetings/meetings.types.js +2 -0
  45. package/dist/meetings/meetings.types.js.map +1 -1
  46. package/dist/meetings/util.js +1 -1
  47. package/dist/meetings/util.js.map +1 -1
  48. package/dist/member/index.js +9 -0
  49. package/dist/member/index.js.map +1 -1
  50. package/dist/member/types.js.map +1 -1
  51. package/dist/member/util.js +39 -28
  52. package/dist/member/util.js.map +1 -1
  53. package/dist/metrics/constants.js +3 -2
  54. package/dist/metrics/constants.js.map +1 -1
  55. package/dist/multistream/remoteMedia.js +30 -15
  56. package/dist/multistream/remoteMedia.js.map +1 -1
  57. package/dist/multistream/sendSlotManager.js +24 -0
  58. package/dist/multistream/sendSlotManager.js.map +1 -1
  59. package/dist/reachability/index.js +31 -3
  60. package/dist/reachability/index.js.map +1 -1
  61. package/dist/roap/index.js +10 -8
  62. package/dist/roap/index.js.map +1 -1
  63. package/dist/types/annotation/index.d.ts +5 -0
  64. package/dist/types/common/errors/join-forbidden-error.d.ts +15 -0
  65. package/dist/types/common/errors/{webinar-registration-error.d.ts → join-webinar-error.d.ts} +2 -2
  66. package/dist/types/common/errors/multistream-not-supported-error.d.ts +17 -0
  67. package/dist/types/constants.d.ts +38 -1
  68. package/dist/types/index.d.ts +3 -3
  69. package/dist/types/locus-info/index.d.ts +2 -1
  70. package/dist/types/meeting/brbState.d.ts +54 -0
  71. package/dist/types/meeting/in-meeting-actions.d.ts +2 -0
  72. package/dist/types/meeting/index.d.ts +21 -12
  73. package/dist/types/meeting/locusMediaRequest.d.ts +4 -0
  74. package/dist/types/meeting/request.d.ts +12 -1
  75. package/dist/types/meeting/request.type.d.ts +6 -0
  76. package/dist/types/meeting/util.d.ts +1 -1
  77. package/dist/types/meeting-info/meeting-info-v2.d.ts +27 -4
  78. package/dist/types/meetings/index.d.ts +19 -1
  79. package/dist/types/meetings/meetings.types.d.ts +8 -0
  80. package/dist/types/member/index.d.ts +1 -0
  81. package/dist/types/member/types.d.ts +7 -0
  82. package/dist/types/metrics/constants.d.ts +2 -1
  83. package/dist/types/multistream/sendSlotManager.d.ts +8 -1
  84. package/dist/types/reachability/index.d.ts +9 -1
  85. package/dist/webinar/index.js +354 -3
  86. package/dist/webinar/index.js.map +1 -1
  87. package/package.json +23 -22
  88. package/src/annotation/index.ts +16 -0
  89. package/src/common/errors/join-forbidden-error.ts +26 -0
  90. package/src/common/errors/join-webinar-error.ts +24 -0
  91. package/src/common/errors/multistream-not-supported-error.ts +30 -0
  92. package/src/config.ts +1 -1
  93. package/src/constants.ts +43 -3
  94. package/src/index.ts +5 -3
  95. package/src/locus-info/index.ts +20 -3
  96. package/src/locus-info/selfUtils.ts +24 -6
  97. package/src/meeting/brbState.ts +169 -0
  98. package/src/meeting/in-meeting-actions.ts +4 -0
  99. package/src/meeting/index.ts +256 -82
  100. package/src/meeting/locusMediaRequest.ts +7 -0
  101. package/src/meeting/muteState.ts +1 -6
  102. package/src/meeting/request.ts +26 -1
  103. package/src/meeting/request.type.ts +7 -0
  104. package/src/meeting/util.ts +8 -10
  105. package/src/meeting-info/meeting-info-v2.ts +74 -11
  106. package/src/meeting-info/utilv2.ts +3 -1
  107. package/src/meetings/index.ts +79 -20
  108. package/src/meetings/meetings.types.ts +10 -0
  109. package/src/meetings/util.ts +2 -1
  110. package/src/member/index.ts +9 -0
  111. package/src/member/types.ts +8 -0
  112. package/src/member/util.ts +34 -24
  113. package/src/metrics/constants.ts +2 -1
  114. package/src/multistream/remoteMedia.ts +28 -15
  115. package/src/multistream/sendSlotManager.ts +31 -0
  116. package/src/reachability/index.ts +29 -1
  117. package/src/roap/index.ts +10 -8
  118. package/src/webinar/index.ts +197 -3
  119. package/test/unit/spec/annotation/index.ts +46 -1
  120. package/test/unit/spec/locus-info/index.js +292 -60
  121. package/test/unit/spec/locus-info/selfConstant.js +7 -0
  122. package/test/unit/spec/locus-info/selfUtils.js +101 -1
  123. package/test/unit/spec/meeting/brbState.ts +114 -0
  124. package/test/unit/spec/meeting/in-meeting-actions.ts +2 -0
  125. package/test/unit/spec/meeting/index.js +733 -106
  126. package/test/unit/spec/meeting/muteState.js +0 -24
  127. package/test/unit/spec/meeting/utils.js +22 -19
  128. package/test/unit/spec/meeting-info/meetinginfov2.js +46 -4
  129. package/test/unit/spec/meeting-info/utilv2.js +17 -0
  130. package/test/unit/spec/meetings/index.js +159 -18
  131. package/test/unit/spec/meetings/utils.js +10 -0
  132. package/test/unit/spec/member/util.js +52 -11
  133. package/test/unit/spec/multistream/remoteMedia.ts +11 -7
  134. package/test/unit/spec/reachability/index.ts +120 -10
  135. package/test/unit/spec/roap/index.ts +47 -0
  136. package/test/unit/spec/webinar/index.ts +457 -0
  137. package/dist/common/errors/webinar-registration-error.js.map +0 -1
  138. package/src/common/errors/webinar-registration-error.ts +0 -27
@@ -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
  }
@@ -11,3 +11,10 @@ export type ToggleReactionsOptions = {
11
11
  locusUrl: string;
12
12
  requestingParticipantId: string;
13
13
  };
14
+
15
+ export type BrbOptions = {
16
+ enabled: boolean;
17
+ locusUrl: string;
18
+ deviceUrl: string;
19
+ selfId: string;
20
+ };
@@ -140,7 +140,11 @@ const MeetingUtil = {
140
140
  meeting.isMultistream,
141
141
  MeetingUtil.getIpVersion(webex)
142
142
  );
143
- reachability = await webex.meetings.reachability.getReachabilityReportToAttachToRoap();
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 WEBINAR_REGISTRATION_ERROR_CODES = [403021, 403022, 403024];
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 registration error
142
+ * Error preventing join because of a webinar have some error
130
143
  */
131
- export class MeetingInfoV2WebinarRegistrationError extends Error {
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 = 'MeetingInfoV2WebinarRegistrationError';
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 handleWebinarRegistrationError for webinar registration error codes
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
- handleWebinarRegistrationError = (err) => {
272
+ handleForbiddenError = (err) => {
212
273
  if (!err.body) {
213
274
  return;
214
275
  }
215
276
 
216
- if (WEBINAR_REGISTRATION_ERROR_CODES.includes(err.body?.code)) {
217
- Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.WEBINAR_REGISTRATION_ERROR, {
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 MeetingInfoV2WebinarRegistrationError(
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.handleWebinarRegistrationError(err);
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.handleWebinarRegistrationError(err);
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;
@@ -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 {MEETING_KEY, INoiseReductionEffect, IVirtualBackgroundEffect} from './meetings.types';
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 WebinarRegistrationError from '../common/errors/webinar-registration-error';
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.startReachability('registration').catch((error) => {
816
- LoggerProxy.logger.error(`Meetings:index#register --> GDM error, ${error.message}`);
817
- }),
818
- // @ts-ignore
819
- this.webex.internal.device
820
- .register(deviceRegistrationOptions)
821
- // @ts-ignore
822
- .then(() =>
823
- LoggerProxy.logger.info(
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
- `Meetings:index#register --> INFO, Device registered ${this.webex.internal.device.url}`
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
- // @ts-ignore
829
- .then(() => this.webex.internal.mercury.connect()),
830
- MeetingsUtil.checkH264Support.call(this),
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 WebinarRegistrationError)
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
+ };
@@ -90,7 +90,8 @@ MeetingsUtil.getMediaServer = (sdp) => {
90
90
  .find((line) => line.startsWith('o='))
91
91
  .split(' ')
92
92
  .shift()
93
- .replace('o=', '');
93
+ .replace('o=', '')
94
+ .toLowerCase();
94
95
  } catch {
95
96
  mediaServer = undefined;
96
97
  }
@@ -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);
@@ -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