@webex/plugin-meetings 3.7.0-next.9 → 3.7.0-wxcc.1

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 (124) 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 +30 -17
  22. package/dist/locus-info/selfUtils.js.map +1 -1
  23. package/dist/meeting/in-meeting-actions.js +2 -0
  24. package/dist/meeting/in-meeting-actions.js.map +1 -1
  25. package/dist/meeting/index.js +960 -832
  26. package/dist/meeting/index.js.map +1 -1
  27. package/dist/meeting/locusMediaRequest.js +9 -0
  28. package/dist/meeting/locusMediaRequest.js.map +1 -1
  29. package/dist/meeting/request.js +30 -0
  30. package/dist/meeting/request.js.map +1 -1
  31. package/dist/meeting/request.type.js.map +1 -1
  32. package/dist/meeting/util.js +16 -16
  33. package/dist/meeting/util.js.map +1 -1
  34. package/dist/meeting-info/meeting-info-v2.js +96 -33
  35. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  36. package/dist/meeting-info/utilv2.js +1 -1
  37. package/dist/meeting-info/utilv2.js.map +1 -1
  38. package/dist/meetings/index.js +103 -54
  39. package/dist/meetings/index.js.map +1 -1
  40. package/dist/meetings/meetings.types.js +2 -0
  41. package/dist/meetings/meetings.types.js.map +1 -1
  42. package/dist/meetings/util.js +1 -1
  43. package/dist/meetings/util.js.map +1 -1
  44. package/dist/member/index.js +9 -0
  45. package/dist/member/index.js.map +1 -1
  46. package/dist/member/types.js.map +1 -1
  47. package/dist/member/util.js +39 -28
  48. package/dist/member/util.js.map +1 -1
  49. package/dist/metrics/constants.js +3 -2
  50. package/dist/metrics/constants.js.map +1 -1
  51. package/dist/multistream/remoteMedia.js +30 -15
  52. package/dist/multistream/remoteMedia.js.map +1 -1
  53. package/dist/multistream/sendSlotManager.js +24 -0
  54. package/dist/multistream/sendSlotManager.js.map +1 -1
  55. package/dist/roap/index.js +10 -8
  56. package/dist/roap/index.js.map +1 -1
  57. package/dist/types/annotation/index.d.ts +5 -0
  58. package/dist/types/common/errors/join-forbidden-error.d.ts +15 -0
  59. package/dist/types/common/errors/{webinar-registration-error.d.ts → join-webinar-error.d.ts} +2 -2
  60. package/dist/types/common/errors/multistream-not-supported-error.d.ts +17 -0
  61. package/dist/types/constants.d.ts +38 -1
  62. package/dist/types/index.d.ts +3 -3
  63. package/dist/types/locus-info/index.d.ts +2 -1
  64. package/dist/types/meeting/in-meeting-actions.d.ts +2 -0
  65. package/dist/types/meeting/index.d.ts +19 -12
  66. package/dist/types/meeting/locusMediaRequest.d.ts +4 -0
  67. package/dist/types/meeting/request.d.ts +12 -1
  68. package/dist/types/meeting/request.type.d.ts +6 -0
  69. package/dist/types/meeting/util.d.ts +1 -1
  70. package/dist/types/meeting-info/meeting-info-v2.d.ts +27 -4
  71. package/dist/types/meetings/index.d.ts +16 -1
  72. package/dist/types/meetings/meetings.types.d.ts +8 -0
  73. package/dist/types/member/index.d.ts +1 -0
  74. package/dist/types/member/types.d.ts +7 -0
  75. package/dist/types/metrics/constants.d.ts +2 -1
  76. package/dist/types/multistream/sendSlotManager.d.ts +8 -1
  77. package/dist/webinar/index.js +354 -3
  78. package/dist/webinar/index.js.map +1 -1
  79. package/package.json +23 -22
  80. package/src/annotation/index.ts +16 -0
  81. package/src/common/errors/join-forbidden-error.ts +26 -0
  82. package/src/common/errors/join-webinar-error.ts +24 -0
  83. package/src/common/errors/multistream-not-supported-error.ts +30 -0
  84. package/src/config.ts +1 -1
  85. package/src/constants.ts +43 -3
  86. package/src/index.ts +5 -3
  87. package/src/locus-info/index.ts +20 -3
  88. package/src/locus-info/selfUtils.ts +19 -6
  89. package/src/meeting/in-meeting-actions.ts +4 -0
  90. package/src/meeting/index.ts +259 -80
  91. package/src/meeting/locusMediaRequest.ts +7 -0
  92. package/src/meeting/request.ts +26 -1
  93. package/src/meeting/request.type.ts +7 -0
  94. package/src/meeting/util.ts +8 -10
  95. package/src/meeting-info/meeting-info-v2.ts +74 -11
  96. package/src/meeting-info/utilv2.ts +3 -1
  97. package/src/meetings/index.ts +73 -20
  98. package/src/meetings/meetings.types.ts +10 -0
  99. package/src/meetings/util.ts +2 -1
  100. package/src/member/index.ts +9 -0
  101. package/src/member/types.ts +8 -0
  102. package/src/member/util.ts +34 -24
  103. package/src/metrics/constants.ts +2 -1
  104. package/src/multistream/remoteMedia.ts +28 -15
  105. package/src/multistream/sendSlotManager.ts +31 -0
  106. package/src/roap/index.ts +10 -8
  107. package/src/webinar/index.ts +197 -3
  108. package/test/unit/spec/annotation/index.ts +46 -1
  109. package/test/unit/spec/locus-info/index.js +292 -60
  110. package/test/unit/spec/locus-info/selfConstant.js +7 -0
  111. package/test/unit/spec/locus-info/selfUtils.js +91 -1
  112. package/test/unit/spec/meeting/in-meeting-actions.ts +2 -0
  113. package/test/unit/spec/meeting/index.js +722 -105
  114. package/test/unit/spec/meeting/utils.js +22 -19
  115. package/test/unit/spec/meeting-info/meetinginfov2.js +46 -4
  116. package/test/unit/spec/meeting-info/utilv2.js +17 -0
  117. package/test/unit/spec/meetings/index.js +150 -13
  118. package/test/unit/spec/meetings/utils.js +10 -0
  119. package/test/unit/spec/member/util.js +52 -11
  120. package/test/unit/spec/multistream/remoteMedia.ts +11 -7
  121. package/test/unit/spec/roap/index.ts +47 -0
  122. package/test/unit/spec/webinar/index.ts +457 -0
  123. package/dist/common/errors/webinar-registration-error.js.map +0 -1
  124. package/src/common/errors/webinar-registration-error.ts +0 -27
package/src/constants.ts CHANGED
@@ -36,6 +36,8 @@ export const HOST = 'host';
36
36
 
37
37
  export const JOIN = 'join';
38
38
 
39
+ export const JOIN_LINK_MTID = 'MTID';
40
+
39
41
  export const LEAVE = 'leave';
40
42
  export const LIVE = 'live';
41
43
  export const LOCAL = 'local';
@@ -104,6 +106,7 @@ export const _ON_HOLD_LOBBY_ = 'ON_HOLD_LOBBY';
104
106
  export const _MEETING_LINK_ = 'MEETING_LINK';
105
107
  export const _MEETING_UUID_ = 'MEETING_UUID';
106
108
  export const _MEETING_ = 'MEETING';
109
+ export const _SPACE_SHARE_ = 'SPACE_SHARE';
107
110
  export const _MEETING_CENTER_ = 'MEETING_CENTER';
108
111
  export const _MEETING_ID_ = 'MEETING_ID';
109
112
 
@@ -198,6 +201,9 @@ export const RETRY_TIMEOUT = 3000;
198
201
 
199
202
  export const ICE_AND_DTLS_CONNECTION_TIMEOUT = 20000;
200
203
  export const ROAP_OFFER_ANSWER_EXCHANGE_TIMEOUT = 35000;
204
+ export const WEBINAR_ERROR_WEBCAST = [403026];
205
+ export const WEBINAR_ERROR_REGISTRATIONID = [403037, 403137];
206
+ export const JOIN_BEFORE_HOST = 403003;
201
207
 
202
208
  // ******************** REGEX **********************
203
209
  // Please alphabetize
@@ -303,6 +309,7 @@ export const EVENT_TRIGGERS = {
303
309
  MEETING_SELF_CANNOT_VIEW_PARTICIPANT_LIST: 'meeting:self:cannotViewParticipantList',
304
310
  MEETING_SELF_IS_SHARING_BLOCKED: 'meeting:self:isSharingBlocked',
305
311
  MEETING_SELF_ROLES_CHANGED: 'meeting:self:rolesChanged',
312
+ MEETING_SELF_BRB_UPDATE: 'meeting:self:brbUpdate',
306
313
  MEETING_CONTROLS_LAYOUT_UPDATE: 'meeting:layout:update',
307
314
  MEETING_ENTRY_EXIT_TONE_UPDATE: 'meeting:entryExitTone:update',
308
315
  MEETING_BREAKOUTS_UPDATE: 'meeting:breakouts:update',
@@ -325,6 +332,7 @@ export const EVENT_TRIGGERS = {
325
332
  MEETING_RECONNECTION_FAILURE: 'meeting:reconnectionFailure',
326
333
  MEETING_UNLOCKED: 'meeting:unlocked',
327
334
  MEETING_LOCKED: 'meeting:locked',
335
+ MEETING_RESOURCE_LINKS_UPDATE: 'meeting:resourceLinks:update',
328
336
  MEETING_INFO_AVAILABLE: 'meeting:meetingInfoAvailable',
329
337
  MEETING_INFO_UPDATED: 'meeting:meetingInfoUpdated',
330
338
  MEETING_LOG_UPLOAD_SUCCESS: 'meeting:logUpload:success',
@@ -383,6 +391,13 @@ export const EVENT_TYPES = {
383
391
  ERROR: 'error',
384
392
  };
385
393
 
394
+ export const HEADERS = {
395
+ CONTENT_TYPE: 'Content-Type',
396
+ CONTENT_TYPE_VALUE: {
397
+ APPLICATION_JSON: 'application/json',
398
+ },
399
+ };
400
+
386
401
  // Handles the reason when meeting gets destroyed
387
402
  // host removed you from the meeting
388
403
  // You are the host and you left the meeting
@@ -529,11 +544,21 @@ export const ERROR_DICTIONARY = {
529
544
  'Reconnection was not started, because there is one already in progress or reconnections are disabled in config.',
530
545
  CODE: 15,
531
546
  },
532
- WebinarRegistrationError: {
533
- NAME: 'WebinarRegistrationError',
534
- MESSAGE: 'An error occurred while the webinar required registration.',
547
+ JoinWebinarError: {
548
+ NAME: 'JoinWebinarError',
549
+ MESSAGE: 'An error occurred while the join webinar.',
535
550
  CODE: 16,
536
551
  },
552
+ MULTISTREAM_NOT_SUPPORTED: {
553
+ NAME: 'MultistreamNotSupported',
554
+ MESSAGE: 'Client asked for multistream backend (Homer), but got something else instead',
555
+ CODE: 17,
556
+ },
557
+ JoinForbiddenError: {
558
+ NAME: 'JoinForbiddenError',
559
+ MESSAGE: 'Meeting join forbidden.',
560
+ CODE: 18,
561
+ },
537
562
  };
538
563
 
539
564
  export const FLOOR_ACTION = {
@@ -709,6 +734,7 @@ export const LOCUSINFO = {
709
734
  SELF_IS_SHARING_BLOCKED_CHANGE: 'SELF_IS_SHARING_BLOCKED_CHANGE',
710
735
  SELF_MEETING_BREAKOUTS_CHANGED: 'SELF_MEETING_BREAKOUTS_CHANGED',
711
736
  SELF_MEETING_INTERPRETATION_CHANGED: 'SELF_MEETING_INTERPRETATION_CHANGED',
737
+ SELF_MEETING_BRB_CHANGED: 'SELF_MEETING_BRB_CHANGED',
712
738
  MEDIA_INACTIVITY: 'MEDIA_INACTIVITY',
713
739
  LINKS_SERVICES: 'LINKS_SERVICES',
714
740
  LINKS_RESOURCES: 'LINKS_RESOURCES',
@@ -954,6 +980,7 @@ export const DISPLAY_HINTS = {
954
980
  DISABLE_ASK_FOR_HELP: 'DISABLE_ASK_FOR_HELP',
955
981
  DISABLE_BREAKOUT_PREASSIGNMENTS: 'DISABLE_BREAKOUT_PREASSIGNMENTS',
956
982
  DISABLE_LOBBY_TO_BREAKOUT: 'DISABLE_LOBBY_TO_BREAKOUT',
983
+ DISABLE_BREAKOUT_START: 'DISABLE_BREAKOUT_START',
957
984
 
958
985
  // participants list
959
986
  DISABLE_VIEW_THE_PARTICIPANT_LIST: 'DISABLE_VIEW_THE_PARTICIPANT_LIST',
@@ -1310,6 +1337,10 @@ export const MEETING_INFO_FAILURE_REASON = {
1310
1337
  WRONG_CAPTCHA: 'WRONG_CAPTCHA', // wbxappapi requires a captcha code or a wrong captcha code was provided
1311
1338
  POLICY: 'POLICY', // meeting info request violates some meeting policy
1312
1339
  WEBINAR_REGISTRATION: 'WEBINAR_REGISTRATION', // webinar need registration
1340
+ NEED_JOIN_WITH_WEBCAST: 'NEED_JOIN_WITH_WEBCAST', // webinar need using webcast join
1341
+ WEBINAR_NEED_REGISTRATIONID: 'WEBINAR_NEED_REGISTRATIONID', // webinar need registrationID
1342
+ NOT_REACH_JBH: 'NOT_REACH_JBH', // Meeting is not allow to access since not reach JBH (join before host) time
1343
+ JOIN_FORBIDDEN: 'JOIN_FORBIDDEN', // meeting is not allow join
1313
1344
  OTHER: 'OTHER', // any other error (network, etc)
1314
1345
  };
1315
1346
 
@@ -1369,3 +1400,12 @@ export const DESTINATION_TYPE = {
1369
1400
  } as const;
1370
1401
 
1371
1402
  export type DESTINATION_TYPE = Enum<typeof DESTINATION_TYPE>;
1403
+
1404
+ export const INITIAL_REGISTRATION_STATUS = {
1405
+ fetchWebexSite: false,
1406
+ getGeoHint: false,
1407
+ startReachability: false,
1408
+ deviceRegister: false,
1409
+ mercuryConnect: false,
1410
+ checkH264Support: false,
1411
+ };
package/src/index.ts CHANGED
@@ -8,7 +8,7 @@ import CaptchaError from './common/errors/captcha-error';
8
8
  import IntentToJoinError from './common/errors/intent-to-join';
9
9
  import PasswordError from './common/errors/password-error';
10
10
  import PermissionError from './common/errors/permission';
11
- import WebinarRegistrationError from './common/errors/webinar-registration-error';
11
+ import JoinWebinarError from './common/errors/join-webinar-error';
12
12
  import {
13
13
  ReclaimHostEmptyWrongKeyError,
14
14
  ReclaimHostIsHostAlreadyError,
@@ -27,7 +27,6 @@ registerPlugin('meetings', Meetings, {
27
27
  });
28
28
 
29
29
  export {
30
- getDevices,
31
30
  LocalStream,
32
31
  LocalDisplayStream,
33
32
  LocalSystemAudioStream,
@@ -41,12 +40,15 @@ export {
41
40
  LocalCameraStream,
42
41
  createMicrophoneStream,
43
42
  createCameraStream,
43
+ createCameraAndMicrophoneStreams,
44
44
  createDisplayStream,
45
45
  createDisplayStreamWithAudio,
46
+ createDisplayMedia,
46
47
  FacingMode,
47
48
  DisplaySurface,
48
49
  PresetCameraConstraints,
49
50
  type VideoContentHint,
51
+ type StreamState,
50
52
  } from '@webex/media-helpers';
51
53
 
52
54
  export default Meetings;
@@ -69,7 +71,7 @@ export {
69
71
  ReclaimHostEmptyWrongKeyError,
70
72
  Meeting,
71
73
  MeetingInfoUtil,
72
- WebinarRegistrationError,
74
+ JoinWebinarError,
73
75
  };
74
76
 
75
77
  export {RemoteMedia} from './multistream/remoteMedia';
@@ -10,6 +10,7 @@ import {
10
10
  _SIP_BRIDGE_,
11
11
  MEETING_STATE,
12
12
  _MEETING_,
13
+ _SPACE_SHARE_,
13
14
  LOCUSINFO,
14
15
  LOCUS,
15
16
  _LEFT_,
@@ -489,7 +490,8 @@ export default class LocusInfo extends EventsScope {
489
490
  isMeetingActive() {
490
491
  if (
491
492
  this.parsedLocus.fullState.type === _CALL_ ||
492
- this.parsedLocus.fullState.type === _SIP_BRIDGE_
493
+ this.parsedLocus.fullState.type === _SIP_BRIDGE_ ||
494
+ this.parsedLocus.fullState.type === _SPACE_SHARE_
493
495
  ) {
494
496
  // @ts-ignore
495
497
  const partner = this.getLocusPartner(this.participants, this.self);
@@ -1283,12 +1285,13 @@ export default class LocusInfo extends EventsScope {
1283
1285
  /**
1284
1286
  * handles when the locus.mediaShares is updated
1285
1287
  * @param {Object} mediaShares the locus.mediaShares property
1288
+ * @param {boolean} forceUpdate force to update the mediaShares
1286
1289
  * @returns {undefined}
1287
1290
  * @memberof LocusInfo
1288
1291
  * emits internal event locus_info_update_media_shares
1289
1292
  */
1290
- updateMediaShares(mediaShares: object) {
1291
- if (mediaShares && !isEqual(this.mediaShares, mediaShares)) {
1293
+ updateMediaShares(mediaShares: object, forceUpdate = false) {
1294
+ if (mediaShares && (!isEqual(this.mediaShares, mediaShares) || forceUpdate)) {
1292
1295
  const parsedMediaShares = MediaSharesUtils.getMediaShares(this.mediaShares, mediaShares);
1293
1296
 
1294
1297
  this.updateMeeting(parsedMediaShares.current);
@@ -1303,6 +1306,7 @@ export default class LocusInfo extends EventsScope {
1303
1306
  {
1304
1307
  current: parsedMediaShares.current,
1305
1308
  previous: parsedMediaShares.previous,
1309
+ forceUpdate,
1306
1310
  }
1307
1311
  );
1308
1312
  }
@@ -1393,6 +1397,19 @@ export default class LocusInfo extends EventsScope {
1393
1397
  );
1394
1398
  }
1395
1399
 
1400
+ if (parsedSelves.updates.brbChanged) {
1401
+ this.emitScoped(
1402
+ {
1403
+ file: 'locus-info',
1404
+ function: 'updateSelf',
1405
+ },
1406
+ LOCUSINFO.EVENTS.SELF_MEETING_BRB_CHANGED,
1407
+ {
1408
+ brb: parsedSelves.current.brb,
1409
+ }
1410
+ );
1411
+ }
1412
+
1396
1413
  if (parsedSelves.updates.interpretationChanged) {
1397
1414
  this.emitScoped(
1398
1415
  {
@@ -66,6 +66,7 @@ SelfUtils.parse = (self: any, deviceId: string) => {
66
66
  breakoutSessions: SelfUtils.getBreakoutSessions(self),
67
67
  breakout: SelfUtils.getBreakout(self),
68
68
  interpretation: SelfUtils.getInterpretation(self),
69
+ brb: SelfUtils.getBrb(self),
69
70
  };
70
71
  }
71
72
 
@@ -75,6 +76,7 @@ SelfUtils.parse = (self: any, deviceId: string) => {
75
76
  SelfUtils.getBreakoutSessions = (self) => self?.controls?.breakout?.sessions;
76
77
  SelfUtils.getBreakout = (self) => self?.controls?.breakout;
77
78
  SelfUtils.getInterpretation = (self) => self?.controls?.interpretation;
79
+ SelfUtils.getBrb = (self) => self?.controls?.brb;
78
80
 
79
81
  SelfUtils.getLayout = (self) =>
80
82
  Array.isArray(self?.controls?.layouts) ? self.controls.layouts[0].type : undefined;
@@ -97,7 +99,7 @@ SelfUtils.getSelves = (oldSelf, newSelf, deviceId) => {
97
99
  const current = newSelf && SelfUtils.parse(newSelf, deviceId);
98
100
  const updates: any = {};
99
101
 
100
- updates.isUserUnadmitted = SelfUtils.isUserUnadmitted(current);
102
+ updates.isUserUnadmitted = SelfUtils.isUserUnadmitted(previous, current);
101
103
  updates.isUserAdmitted = SelfUtils.isUserAdmitted(previous, current);
102
104
  updates.isVideoMutedByOthersChanged = SelfUtils.videoMutedByOthersChanged(previous, current);
103
105
  updates.isMutedByOthersChanged = SelfUtils.mutedByOthersChanged(previous, current);
@@ -128,6 +130,7 @@ SelfUtils.getSelves = (oldSelf, newSelf, deviceId) => {
128
130
  updates.isSharingBlockedChanged = previous?.isSharingBlocked !== current.isSharingBlocked;
129
131
  updates.breakoutsChanged = SelfUtils.breakoutsChanged(previous, current);
130
132
  updates.interpretationChanged = SelfUtils.interpretationChanged(previous, current);
133
+ updates.brbChanged = SelfUtils.brbChanged(previous, current);
131
134
 
132
135
  return {
133
136
  previous,
@@ -159,6 +162,9 @@ SelfUtils.breakoutsChanged = (previous, current) =>
159
162
  SelfUtils.interpretationChanged = (previous, current) =>
160
163
  !isEqual(previous?.interpretation, current?.interpretation) && !!current?.interpretation;
161
164
 
165
+ SelfUtils.brbChanged = (previous, current) =>
166
+ !isEqual(previous?.brb, current?.brb) && current?.brb !== undefined;
167
+
162
168
  SelfUtils.isMediaInactive = (previous, current) => {
163
169
  if (
164
170
  previous &&
@@ -324,16 +330,23 @@ SelfUtils.isLocusUserAdmitted = (check: any) =>
324
330
  check && check.joinedWith?.intent?.type !== _WAIT_ && check.state === _JOINED_;
325
331
 
326
332
  /**
327
- * @param {Object} self
333
+ * @param {Object} oldSelf
334
+ * @param {Object} changedSelf
328
335
  * @returns {Boolean}
329
336
  * @throws {Error} when self is undefined
330
337
  */
331
- SelfUtils.isUserUnadmitted = (self: object) => {
332
- if (!self) {
333
- throw new ParameterError('self must be defined to determine if self is unadmitted as guest.');
338
+ SelfUtils.isUserUnadmitted = (oldSelf: object, changedSelf: object) => {
339
+ if (!changedSelf) {
340
+ throw new ParameterError(
341
+ 'changedSelf must be defined to determine if self is unadmitted as guest.'
342
+ );
343
+ }
344
+
345
+ if (SelfUtils.isLocusUserUnadmitted(oldSelf)) {
346
+ return false;
334
347
  }
335
348
 
336
- return SelfUtils.isLocusUserUnadmitted(self);
349
+ return SelfUtils.isLocusUserUnadmitted(changedSelf);
337
350
  };
338
351
 
339
352
  SelfUtils.moderatorChanged = (oldSelf, changedSelf) => {
@@ -47,6 +47,7 @@ interface IInMeetingActions {
47
47
  waitingForOthersToJoin?: boolean;
48
48
  canSendReactions?: boolean;
49
49
  canManageBreakout?: boolean;
50
+ canStartBreakout?: boolean;
50
51
  canBroadcastMessageToBreakout?: boolean;
51
52
  canAdmitLobbyToBreakout?: boolean;
52
53
  isBreakoutPreassignmentsEnabled?: boolean;
@@ -180,6 +181,8 @@ export default class InMeetingActions implements IInMeetingActions {
180
181
 
181
182
  canManageBreakout = null;
182
183
 
184
+ canStartBreakout = null;
185
+
183
186
  canBroadcastMessageToBreakout = null;
184
187
 
185
188
  canAdmitLobbyToBreakout = null;
@@ -324,6 +327,7 @@ export default class InMeetingActions implements IInMeetingActions {
324
327
  waitingForOthersToJoin: this.waitingForOthersToJoin,
325
328
  canSendReactions: this.canSendReactions,
326
329
  canManageBreakout: this.canManageBreakout,
330
+ canStartBreakout: this.canStartBreakout,
327
331
  canBroadcastMessageToBreakout: this.canBroadcastMessageToBreakout,
328
332
  canAdmitLobbyToBreakout: this.canAdmitLobbyToBreakout,
329
333
  isBreakoutPreassignmentsEnabled: this.isBreakoutPreassignmentsEnabled,