@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.
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
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,8 @@ 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];
201
206
 
202
207
  // ******************** REGEX **********************
203
208
  // Please alphabetize
@@ -303,6 +308,7 @@ export const EVENT_TRIGGERS = {
303
308
  MEETING_SELF_CANNOT_VIEW_PARTICIPANT_LIST: 'meeting:self:cannotViewParticipantList',
304
309
  MEETING_SELF_IS_SHARING_BLOCKED: 'meeting:self:isSharingBlocked',
305
310
  MEETING_SELF_ROLES_CHANGED: 'meeting:self:rolesChanged',
311
+ MEETING_SELF_BRB_UPDATE: 'meeting:self:brbUpdate',
306
312
  MEETING_CONTROLS_LAYOUT_UPDATE: 'meeting:layout:update',
307
313
  MEETING_ENTRY_EXIT_TONE_UPDATE: 'meeting:entryExitTone:update',
308
314
  MEETING_BREAKOUTS_UPDATE: 'meeting:breakouts:update',
@@ -325,6 +331,7 @@ export const EVENT_TRIGGERS = {
325
331
  MEETING_RECONNECTION_FAILURE: 'meeting:reconnectionFailure',
326
332
  MEETING_UNLOCKED: 'meeting:unlocked',
327
333
  MEETING_LOCKED: 'meeting:locked',
334
+ MEETING_RESOURCE_LINKS_UPDATE: 'meeting:resourceLinks:update',
328
335
  MEETING_INFO_AVAILABLE: 'meeting:meetingInfoAvailable',
329
336
  MEETING_INFO_UPDATED: 'meeting:meetingInfoUpdated',
330
337
  MEETING_LOG_UPLOAD_SUCCESS: 'meeting:logUpload:success',
@@ -383,6 +390,13 @@ export const EVENT_TYPES = {
383
390
  ERROR: 'error',
384
391
  };
385
392
 
393
+ export const HEADERS = {
394
+ CONTENT_TYPE: 'Content-Type',
395
+ CONTENT_TYPE_VALUE: {
396
+ APPLICATION_JSON: 'application/json',
397
+ },
398
+ };
399
+
386
400
  // Handles the reason when meeting gets destroyed
387
401
  // host removed you from the meeting
388
402
  // You are the host and you left the meeting
@@ -529,11 +543,16 @@ export const ERROR_DICTIONARY = {
529
543
  'Reconnection was not started, because there is one already in progress or reconnections are disabled in config.',
530
544
  CODE: 15,
531
545
  },
532
- WebinarRegistrationError: {
533
- NAME: 'WebinarRegistrationError',
534
- MESSAGE: 'An error occurred while the webinar required registration.',
546
+ JoinWebinarError: {
547
+ NAME: 'JoinWebinarError',
548
+ MESSAGE: 'An error occurred while the join webinar.',
535
549
  CODE: 16,
536
550
  },
551
+ MULTISTREAM_NOT_SUPPORTED: {
552
+ NAME: 'MultistreamNotSupported',
553
+ MESSAGE: 'Client asked for multistream backend (Homer), but got something else instead',
554
+ CODE: 17,
555
+ },
537
556
  };
538
557
 
539
558
  export const FLOOR_ACTION = {
@@ -709,6 +728,7 @@ export const LOCUSINFO = {
709
728
  SELF_IS_SHARING_BLOCKED_CHANGE: 'SELF_IS_SHARING_BLOCKED_CHANGE',
710
729
  SELF_MEETING_BREAKOUTS_CHANGED: 'SELF_MEETING_BREAKOUTS_CHANGED',
711
730
  SELF_MEETING_INTERPRETATION_CHANGED: 'SELF_MEETING_INTERPRETATION_CHANGED',
731
+ SELF_MEETING_BRB_CHANGED: 'SELF_MEETING_BRB_CHANGED',
712
732
  MEDIA_INACTIVITY: 'MEDIA_INACTIVITY',
713
733
  LINKS_SERVICES: 'LINKS_SERVICES',
714
734
  LINKS_RESOURCES: 'LINKS_RESOURCES',
@@ -904,6 +924,10 @@ export const DISPLAY_HINTS = {
904
924
  RECORDING_CONTROL_PAUSE: 'RECORDING_CONTROL_PAUSE',
905
925
  RECORDING_CONTROL_STOP: 'RECORDING_CONTROL_STOP',
906
926
  RECORDING_CONTROL_RESUME: 'RECORDING_CONTROL_RESUME',
927
+ PREMISE_RECORDING_CONTROL_START: 'PREMISE_RECORDING_CONTROL_START',
928
+ PREMISE_RECORDING_CONTROL_PAUSE: 'PREMISE_RECORDING_CONTROL_PAUSE',
929
+ PREMISE_RECORDING_CONTROL_STOP: 'PREMISE_RECORDING_CONTROL_STOP',
930
+ PREMISE_RECORDING_CONTROL_RESUME: 'PREMISE_RECORDING_CONTROL_RESUME',
907
931
  LOCK_CONTROL_UNLOCK: 'LOCK_CONTROL_UNLOCK',
908
932
  LOCK_CONTROL_LOCK: 'LOCK_CONTROL_LOCK',
909
933
  LOCK_STATUS_LOCKED: 'LOCK_STATUS_LOCKED',
@@ -950,6 +974,7 @@ export const DISPLAY_HINTS = {
950
974
  DISABLE_ASK_FOR_HELP: 'DISABLE_ASK_FOR_HELP',
951
975
  DISABLE_BREAKOUT_PREASSIGNMENTS: 'DISABLE_BREAKOUT_PREASSIGNMENTS',
952
976
  DISABLE_LOBBY_TO_BREAKOUT: 'DISABLE_LOBBY_TO_BREAKOUT',
977
+ DISABLE_BREAKOUT_START: 'DISABLE_BREAKOUT_START',
953
978
 
954
979
  // participants list
955
980
  DISABLE_VIEW_THE_PARTICIPANT_LIST: 'DISABLE_VIEW_THE_PARTICIPANT_LIST',
@@ -1306,6 +1331,8 @@ export const MEETING_INFO_FAILURE_REASON = {
1306
1331
  WRONG_CAPTCHA: 'WRONG_CAPTCHA', // wbxappapi requires a captcha code or a wrong captcha code was provided
1307
1332
  POLICY: 'POLICY', // meeting info request violates some meeting policy
1308
1333
  WEBINAR_REGISTRATION: 'WEBINAR_REGISTRATION', // webinar need registration
1334
+ NEED_JOIN_WITH_WEBCAST: 'NEED_JOIN_WITH_WEBCAST', // webinar need using webcast join
1335
+ WEBINAR_NEED_REGISTRATIONID: 'WEBINAR_NEED_REGISTRATIONID', // webinar need registrationID
1309
1336
  OTHER: 'OTHER', // any other error (network, etc)
1310
1337
  };
1311
1338
 
@@ -1365,3 +1392,12 @@ export const DESTINATION_TYPE = {
1365
1392
  } as const;
1366
1393
 
1367
1394
  export type DESTINATION_TYPE = Enum<typeof DESTINATION_TYPE>;
1395
+
1396
+ export const INITIAL_REGISTRATION_STATUS = {
1397
+ fetchWebexSite: false,
1398
+ getGeoHint: false,
1399
+ startReachability: false,
1400
+ deviceRegister: false,
1401
+ mercuryConnect: false,
1402
+ checkH264Support: false,
1403
+ };
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) => {
@@ -26,6 +26,7 @@ interface IInMeetingActions {
26
26
  canStartRecording?: boolean;
27
27
  canPauseRecording?: boolean;
28
28
  canResumeRecording?: boolean;
29
+ isPremiseRecordingEnabled?: boolean;
29
30
  canStopRecording?: boolean;
30
31
  canRaiseHand?: boolean;
31
32
  canLowerAllHands?: boolean;
@@ -46,6 +47,7 @@ interface IInMeetingActions {
46
47
  waitingForOthersToJoin?: boolean;
47
48
  canSendReactions?: boolean;
48
49
  canManageBreakout?: boolean;
50
+ canStartBreakout?: boolean;
49
51
  canBroadcastMessageToBreakout?: boolean;
50
52
  canAdmitLobbyToBreakout?: boolean;
51
53
  isBreakoutPreassignmentsEnabled?: boolean;
@@ -121,6 +123,8 @@ export default class InMeetingActions implements IInMeetingActions {
121
123
 
122
124
  canResumeRecording = null;
123
125
 
126
+ isPremiseRecordingEnabled = null;
127
+
124
128
  canStopRecording = null;
125
129
 
126
130
  canSetMuteOnEntry = null;
@@ -177,6 +181,8 @@ export default class InMeetingActions implements IInMeetingActions {
177
181
 
178
182
  canManageBreakout = null;
179
183
 
184
+ canStartBreakout = null;
185
+
180
186
  canBroadcastMessageToBreakout = null;
181
187
 
182
188
  canAdmitLobbyToBreakout = null;
@@ -301,6 +307,7 @@ export default class InMeetingActions implements IInMeetingActions {
301
307
  canPauseRecording: this.canPauseRecording,
302
308
  canResumeRecording: this.canResumeRecording,
303
309
  canStopRecording: this.canStopRecording,
310
+ isPremiseRecordingEnabled: this.isPremiseRecordingEnabled,
304
311
  canRaiseHand: this.canRaiseHand,
305
312
  canLowerAllHands: this.canLowerAllHands,
306
313
  canLowerSomeoneElsesHand: this.canLowerSomeoneElsesHand,
@@ -320,6 +327,7 @@ export default class InMeetingActions implements IInMeetingActions {
320
327
  waitingForOthersToJoin: this.waitingForOthersToJoin,
321
328
  canSendReactions: this.canSendReactions,
322
329
  canManageBreakout: this.canManageBreakout,
330
+ canStartBreakout: this.canStartBreakout,
323
331
  canBroadcastMessageToBreakout: this.canBroadcastMessageToBreakout,
324
332
  canAdmitLobbyToBreakout: this.canAdmitLobbyToBreakout,
325
333
  isBreakoutPreassignmentsEnabled: this.isBreakoutPreassignmentsEnabled,