@webex/plugin-meetings 3.7.0-next.5 → 3.7.0-next.50

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 (134) 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/{webinar-registration-error.js → join-webinar-error.js} +12 -12
  6. package/dist/common/errors/join-webinar-error.js.map +1 -0
  7. package/dist/common/errors/multistream-not-supported-error.js +53 -0
  8. package/dist/common/errors/multistream-not-supported-error.js.map +1 -0
  9. package/dist/config.js +1 -1
  10. package/dist/config.js.map +1 -1
  11. package/dist/constants.js +40 -5
  12. package/dist/constants.js.map +1 -1
  13. package/dist/index.js +16 -11
  14. package/dist/index.js.map +1 -1
  15. package/dist/interpretation/index.js +1 -1
  16. package/dist/interpretation/siLanguage.js +1 -1
  17. package/dist/locus-info/index.js +14 -3
  18. package/dist/locus-info/index.js.map +1 -1
  19. package/dist/locus-info/selfUtils.js +30 -17
  20. package/dist/locus-info/selfUtils.js.map +1 -1
  21. package/dist/meeting/in-meeting-actions.js +4 -0
  22. package/dist/meeting/in-meeting-actions.js.map +1 -1
  23. package/dist/meeting/index.js +944 -832
  24. package/dist/meeting/index.js.map +1 -1
  25. package/dist/meeting/locusMediaRequest.js +9 -0
  26. package/dist/meeting/locusMediaRequest.js.map +1 -1
  27. package/dist/meeting/request.js +30 -0
  28. package/dist/meeting/request.js.map +1 -1
  29. package/dist/meeting/request.type.js.map +1 -1
  30. package/dist/meeting/util.js +16 -16
  31. package/dist/meeting/util.js.map +1 -1
  32. package/dist/meeting-info/meeting-info-v2.js +29 -17
  33. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  34. package/dist/meeting-info/utilv2.js +1 -1
  35. package/dist/meeting-info/utilv2.js.map +1 -1
  36. package/dist/meetings/index.js +106 -55
  37. package/dist/meetings/index.js.map +1 -1
  38. package/dist/meetings/meetings.types.js +2 -0
  39. package/dist/meetings/meetings.types.js.map +1 -1
  40. package/dist/meetings/util.js +1 -1
  41. package/dist/meetings/util.js.map +1 -1
  42. package/dist/member/index.js +9 -0
  43. package/dist/member/index.js.map +1 -1
  44. package/dist/member/types.js.map +1 -1
  45. package/dist/member/util.js +39 -28
  46. package/dist/member/util.js.map +1 -1
  47. package/dist/metrics/constants.js +1 -1
  48. package/dist/metrics/constants.js.map +1 -1
  49. package/dist/multistream/remoteMedia.js +30 -15
  50. package/dist/multistream/remoteMedia.js.map +1 -1
  51. package/dist/multistream/sendSlotManager.js +24 -0
  52. package/dist/multistream/sendSlotManager.js.map +1 -1
  53. package/dist/recording-controller/enums.js +8 -4
  54. package/dist/recording-controller/enums.js.map +1 -1
  55. package/dist/recording-controller/index.js +18 -9
  56. package/dist/recording-controller/index.js.map +1 -1
  57. package/dist/recording-controller/util.js +13 -9
  58. package/dist/recording-controller/util.js.map +1 -1
  59. package/dist/roap/index.js +10 -8
  60. package/dist/roap/index.js.map +1 -1
  61. package/dist/types/annotation/index.d.ts +5 -0
  62. package/dist/types/common/errors/{webinar-registration-error.d.ts → join-webinar-error.d.ts} +2 -2
  63. package/dist/types/common/errors/multistream-not-supported-error.d.ts +17 -0
  64. package/dist/types/constants.d.ts +34 -1
  65. package/dist/types/index.d.ts +3 -3
  66. package/dist/types/locus-info/index.d.ts +2 -1
  67. package/dist/types/meeting/in-meeting-actions.d.ts +4 -0
  68. package/dist/types/meeting/index.d.ts +19 -12
  69. package/dist/types/meeting/locusMediaRequest.d.ts +4 -0
  70. package/dist/types/meeting/request.d.ts +12 -1
  71. package/dist/types/meeting/request.type.d.ts +6 -0
  72. package/dist/types/meeting/util.d.ts +1 -1
  73. package/dist/types/meeting-info/meeting-info-v2.d.ts +4 -4
  74. package/dist/types/meetings/index.d.ts +19 -1
  75. package/dist/types/meetings/meetings.types.d.ts +8 -0
  76. package/dist/types/member/index.d.ts +1 -0
  77. package/dist/types/member/types.d.ts +7 -0
  78. package/dist/types/metrics/constants.d.ts +1 -1
  79. package/dist/types/multistream/sendSlotManager.d.ts +8 -1
  80. package/dist/types/recording-controller/enums.d.ts +5 -2
  81. package/dist/types/recording-controller/index.d.ts +1 -0
  82. package/dist/types/recording-controller/util.d.ts +2 -1
  83. package/dist/webinar/index.js +354 -3
  84. package/dist/webinar/index.js.map +1 -1
  85. package/package.json +23 -22
  86. package/src/annotation/index.ts +16 -0
  87. package/src/common/errors/join-webinar-error.ts +24 -0
  88. package/src/common/errors/multistream-not-supported-error.ts +30 -0
  89. package/src/config.ts +1 -1
  90. package/src/constants.ts +39 -3
  91. package/src/index.ts +5 -3
  92. package/src/locus-info/index.ts +20 -3
  93. package/src/locus-info/selfUtils.ts +19 -6
  94. package/src/meeting/in-meeting-actions.ts +8 -0
  95. package/src/meeting/index.ts +246 -80
  96. package/src/meeting/locusMediaRequest.ts +7 -0
  97. package/src/meeting/request.ts +26 -1
  98. package/src/meeting/request.type.ts +7 -0
  99. package/src/meeting/util.ts +8 -10
  100. package/src/meeting-info/meeting-info-v2.ts +23 -11
  101. package/src/meeting-info/utilv2.ts +3 -1
  102. package/src/meetings/index.ts +77 -20
  103. package/src/meetings/meetings.types.ts +10 -0
  104. package/src/meetings/util.ts +2 -1
  105. package/src/member/index.ts +9 -0
  106. package/src/member/types.ts +8 -0
  107. package/src/member/util.ts +34 -24
  108. package/src/metrics/constants.ts +1 -1
  109. package/src/multistream/remoteMedia.ts +28 -15
  110. package/src/multistream/sendSlotManager.ts +31 -0
  111. package/src/recording-controller/enums.ts +5 -2
  112. package/src/recording-controller/index.ts +17 -4
  113. package/src/recording-controller/util.ts +20 -5
  114. package/src/roap/index.ts +10 -8
  115. package/src/webinar/index.ts +197 -3
  116. package/test/unit/spec/annotation/index.ts +46 -1
  117. package/test/unit/spec/locus-info/index.js +292 -60
  118. package/test/unit/spec/locus-info/selfConstant.js +7 -0
  119. package/test/unit/spec/locus-info/selfUtils.js +91 -1
  120. package/test/unit/spec/meeting/in-meeting-actions.ts +4 -0
  121. package/test/unit/spec/meeting/index.js +689 -105
  122. package/test/unit/spec/meeting/utils.js +22 -19
  123. package/test/unit/spec/meeting-info/meetinginfov2.js +9 -4
  124. package/test/unit/spec/meeting-info/utilv2.js +17 -0
  125. package/test/unit/spec/meetings/index.js +153 -18
  126. package/test/unit/spec/meetings/utils.js +10 -0
  127. package/test/unit/spec/member/util.js +52 -11
  128. package/test/unit/spec/multistream/remoteMedia.ts +11 -7
  129. package/test/unit/spec/recording-controller/index.js +61 -5
  130. package/test/unit/spec/recording-controller/util.js +39 -3
  131. package/test/unit/spec/roap/index.ts +47 -0
  132. package/test/unit/spec/webinar/index.ts +457 -0
  133. package/dist/common/errors/webinar-registration-error.js.map +0 -1
  134. package/src/common/errors/webinar-registration-error.ts +0 -27
@@ -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,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
- const WEBINAR_REGISTRATION_ERROR_CODES = [403021, 403022, 403024];
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 registration error
141
+ * Error preventing join because of a webinar have some error
130
142
  */
131
- export class MeetingInfoV2WebinarRegistrationError extends Error {
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 = 'MeetingInfoV2WebinarRegistrationError';
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 handleWebinarRegistrationError for webinar registration error codes
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
- handleWebinarRegistrationError = (err) => {
223
+ handleJoinWebinarError = (err) => {
212
224
  if (!err.body) {
213
225
  return;
214
226
  }
215
227
 
216
- if (WEBINAR_REGISTRATION_ERROR_CODES.includes(err.body?.code)) {
217
- Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.WEBINAR_REGISTRATION_ERROR, {
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 MeetingInfoV2WebinarRegistrationError(
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.handleWebinarRegistrationError(err);
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.handleWebinarRegistrationError(err);
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;
@@ -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 {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';
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.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(
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
- `Meetings:index#register --> INFO, Device registered ${this.webex.internal.device.url}`
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
- // @ts-ignore
829
- .then(() => this.webex.internal.mercury.connect()),
830
- MeetingsUtil.checkH264Support.call(this),
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 WebinarRegistrationError)
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
+ };
@@ -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
@@ -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 the locus 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 the locus 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
- * @param {Object} participant the locus participant
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 the locus 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 the locus 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 the locus 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 the locus 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 the locus 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 the locus 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 the locus 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 the locus 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 the locus 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 the locus 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 the locus 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 the locus 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 the locus 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 the locus 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 the locus 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 the locus 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 the locus 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 the locus 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 the locus 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 the locus 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 the locus participant
396
+ * @param {Object} participant - The locus participant object.
387
397
  * @returns {String}
388
398
  */
389
399
  MemberUtil.extractName = (participant: any) => {
@@ -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
- WEBINAR_REGISTRATION_ERROR: 'js_sdk_webinar_registration_error',
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
  };