@webex/plugin-meetings 3.6.0-next.9 → 3.7.0-ipv6-multi-turn-urls.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 (159) hide show
  1. package/README.md +2 -1
  2. package/dist/breakouts/breakout.js +1 -1
  3. package/dist/breakouts/index.js +1 -1
  4. package/dist/common/errors/{webinar-registration-error.js → join-webinar-error.js} +12 -12
  5. package/dist/common/errors/join-webinar-error.js.map +1 -0
  6. package/dist/config.js +3 -1
  7. package/dist/config.js.map +1 -1
  8. package/dist/constants.js +50 -7
  9. package/dist/constants.js.map +1 -1
  10. package/dist/controls-options-manager/enums.js +1 -0
  11. package/dist/controls-options-manager/enums.js.map +1 -1
  12. package/dist/controls-options-manager/index.js +10 -3
  13. package/dist/controls-options-manager/index.js.map +1 -1
  14. package/dist/controls-options-manager/types.js.map +1 -1
  15. package/dist/controls-options-manager/util.js +12 -0
  16. package/dist/controls-options-manager/util.js.map +1 -1
  17. package/dist/index.js +7 -7
  18. package/dist/index.js.map +1 -1
  19. package/dist/interpretation/index.js +1 -1
  20. package/dist/interpretation/siLanguage.js +1 -1
  21. package/dist/locus-info/controlsUtils.js +28 -4
  22. package/dist/locus-info/controlsUtils.js.map +1 -1
  23. package/dist/locus-info/fullState.js +2 -1
  24. package/dist/locus-info/fullState.js.map +1 -1
  25. package/dist/locus-info/index.js +61 -3
  26. package/dist/locus-info/index.js.map +1 -1
  27. package/dist/media/index.js +29 -1
  28. package/dist/media/index.js.map +1 -1
  29. package/dist/meeting/in-meeting-actions.js +29 -1
  30. package/dist/meeting/in-meeting-actions.js.map +1 -1
  31. package/dist/meeting/index.js +692 -472
  32. package/dist/meeting/index.js.map +1 -1
  33. package/dist/meeting/locusMediaRequest.js +2 -6
  34. package/dist/meeting/locusMediaRequest.js.map +1 -1
  35. package/dist/meeting/request.js +21 -29
  36. package/dist/meeting/request.js.map +1 -1
  37. package/dist/meeting/util.js +95 -59
  38. package/dist/meeting/util.js.map +1 -1
  39. package/dist/meeting-info/meeting-info-v2.js +29 -17
  40. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  41. package/dist/meetings/index.js +8 -3
  42. package/dist/meetings/index.js.map +1 -1
  43. package/dist/members/index.js +3 -2
  44. package/dist/members/index.js.map +1 -1
  45. package/dist/members/util.js +13 -7
  46. package/dist/members/util.js.map +1 -1
  47. package/dist/metrics/constants.js +3 -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/reachability/clusterReachability.js +12 -15
  52. package/dist/reachability/clusterReachability.js.map +1 -1
  53. package/dist/reachability/index.js +433 -136
  54. package/dist/reachability/index.js.map +1 -1
  55. package/dist/reachability/reachability.types.js +7 -0
  56. package/dist/reachability/reachability.types.js.map +1 -0
  57. package/dist/reachability/request.js +23 -9
  58. package/dist/reachability/request.js.map +1 -1
  59. package/dist/recording-controller/enums.js +8 -4
  60. package/dist/recording-controller/enums.js.map +1 -1
  61. package/dist/recording-controller/index.js +18 -9
  62. package/dist/recording-controller/index.js.map +1 -1
  63. package/dist/recording-controller/util.js +13 -9
  64. package/dist/recording-controller/util.js.map +1 -1
  65. package/dist/roap/index.js +5 -7
  66. package/dist/roap/index.js.map +1 -1
  67. package/dist/roap/request.js +45 -79
  68. package/dist/roap/request.js.map +1 -1
  69. package/dist/roap/turnDiscovery.js +3 -6
  70. package/dist/roap/turnDiscovery.js.map +1 -1
  71. package/dist/types/common/errors/{webinar-registration-error.d.ts → join-webinar-error.d.ts} +2 -2
  72. package/dist/types/config.d.ts +2 -0
  73. package/dist/types/constants.d.ts +38 -1
  74. package/dist/types/controls-options-manager/enums.d.ts +2 -1
  75. package/dist/types/controls-options-manager/index.d.ts +2 -1
  76. package/dist/types/controls-options-manager/types.d.ts +2 -0
  77. package/dist/types/index.d.ts +2 -2
  78. package/dist/types/locus-info/index.d.ts +9 -0
  79. package/dist/types/meeting/in-meeting-actions.d.ts +28 -0
  80. package/dist/types/meeting/index.d.ts +34 -3
  81. package/dist/types/meeting/locusMediaRequest.d.ts +2 -3
  82. package/dist/types/meeting/request.d.ts +2 -2
  83. package/dist/types/meeting/util.d.ts +2 -2
  84. package/dist/types/meeting-info/meeting-info-v2.d.ts +4 -4
  85. package/dist/types/meetings/index.d.ts +4 -1
  86. package/dist/types/members/index.d.ts +2 -1
  87. package/dist/types/members/util.d.ts +5 -1
  88. package/dist/types/metrics/constants.d.ts +3 -1
  89. package/dist/types/reachability/clusterReachability.d.ts +1 -10
  90. package/dist/types/reachability/index.d.ts +74 -35
  91. package/dist/types/reachability/reachability.types.d.ts +64 -0
  92. package/dist/types/reachability/request.d.ts +5 -1
  93. package/dist/types/recording-controller/enums.d.ts +5 -2
  94. package/dist/types/recording-controller/index.d.ts +1 -0
  95. package/dist/types/recording-controller/util.d.ts +2 -1
  96. package/dist/types/roap/request.d.ts +1 -13
  97. package/dist/webinar/index.js +382 -19
  98. package/dist/webinar/index.js.map +1 -1
  99. package/package.json +22 -22
  100. package/src/common/errors/join-webinar-error.ts +24 -0
  101. package/src/config.ts +2 -0
  102. package/src/constants.ts +49 -3
  103. package/src/controls-options-manager/enums.ts +1 -0
  104. package/src/controls-options-manager/index.ts +19 -2
  105. package/src/controls-options-manager/types.ts +2 -0
  106. package/src/controls-options-manager/util.ts +12 -0
  107. package/src/index.ts +2 -2
  108. package/src/locus-info/controlsUtils.ts +46 -2
  109. package/src/locus-info/fullState.ts +1 -0
  110. package/src/locus-info/index.ts +60 -0
  111. package/src/media/index.ts +15 -0
  112. package/src/meeting/in-meeting-actions.ts +58 -0
  113. package/src/meeting/index.ts +232 -25
  114. package/src/meeting/locusMediaRequest.ts +4 -8
  115. package/src/meeting/request.ts +4 -11
  116. package/src/meeting/util.ts +25 -4
  117. package/src/meeting-info/meeting-info-v2.ts +23 -11
  118. package/src/meetings/index.ts +54 -41
  119. package/src/members/index.ts +4 -2
  120. package/src/members/util.ts +4 -1
  121. package/src/metrics/constants.ts +3 -1
  122. package/src/multistream/remoteMedia.ts +28 -15
  123. package/src/reachability/clusterReachability.ts +5 -15
  124. package/src/reachability/index.ts +285 -77
  125. package/src/reachability/reachability.types.ts +85 -0
  126. package/src/reachability/request.ts +55 -30
  127. package/src/recording-controller/enums.ts +5 -2
  128. package/src/recording-controller/index.ts +17 -4
  129. package/src/recording-controller/util.ts +20 -5
  130. package/src/roap/index.ts +4 -5
  131. package/src/roap/request.ts +30 -44
  132. package/src/roap/turnDiscovery.ts +2 -4
  133. package/src/webinar/index.ts +223 -17
  134. package/test/unit/spec/controls-options-manager/index.js +56 -32
  135. package/test/unit/spec/controls-options-manager/util.js +44 -0
  136. package/test/unit/spec/locus-info/controlsUtils.js +80 -4
  137. package/test/unit/spec/locus-info/index.js +59 -2
  138. package/test/unit/spec/meeting/in-meeting-actions.ts +31 -1
  139. package/test/unit/spec/meeting/index.js +369 -103
  140. package/test/unit/spec/meeting/locusMediaRequest.ts +18 -11
  141. package/test/unit/spec/meeting/request.js +3 -26
  142. package/test/unit/spec/meeting/utils.js +55 -13
  143. package/test/unit/spec/meeting-info/meetinginfov2.js +9 -4
  144. package/test/unit/spec/meetings/index.js +25 -6
  145. package/test/unit/spec/members/index.js +25 -2
  146. package/test/unit/spec/members/request.js +37 -3
  147. package/test/unit/spec/members/utils.js +110 -1
  148. package/test/unit/spec/multistream/remoteMedia.ts +11 -7
  149. package/test/unit/spec/reachability/clusterReachability.ts +7 -0
  150. package/test/unit/spec/reachability/index.ts +265 -1
  151. package/test/unit/spec/reachability/request.js +56 -15
  152. package/test/unit/spec/recording-controller/index.js +61 -5
  153. package/test/unit/spec/recording-controller/util.js +39 -3
  154. package/test/unit/spec/roap/index.ts +1 -1
  155. package/test/unit/spec/roap/request.ts +51 -109
  156. package/test/unit/spec/roap/turnDiscovery.ts +202 -147
  157. package/test/unit/spec/webinar/index.ts +443 -14
  158. package/dist/common/errors/webinar-registration-error.js.map +0 -1
  159. package/src/common/errors/webinar-registration-error.ts +0 -27
package/src/constants.ts CHANGED
@@ -198,6 +198,8 @@ export const RETRY_TIMEOUT = 3000;
198
198
 
199
199
  export const ICE_AND_DTLS_CONNECTION_TIMEOUT = 20000;
200
200
  export const ROAP_OFFER_ANSWER_EXCHANGE_TIMEOUT = 35000;
201
+ export const WEBINAR_ERROR_WEBCAST = [403026];
202
+ export const WEBINAR_ERROR_REGISTRATIONID = [403037, 403137];
201
203
 
202
204
  // ******************** REGEX **********************
203
205
  // Please alphabetize
@@ -356,6 +358,11 @@ export const EVENT_TRIGGERS = {
356
358
  'meeting:controls:view-the-participants-list:updated',
357
359
  MEETING_CONTROLS_RAISE_HAND_UPDATED: 'meeting:controls:raise-hand:updated',
358
360
  MEETING_CONTROLS_VIDEO_UPDATED: 'meeting:controls:video:updated',
361
+ MEETING_CONTROLS_STAGE_VIEW_UPDATED: 'meeting:controls:stage-view:updated',
362
+ MEETING_CONTROLS_WEBCAST_UPDATED: 'meeting:controls:webcast:updated',
363
+ MEETING_CONTROLS_MEETING_FULL_UPDATED: 'meeting:controls:meeting-full:updated',
364
+ MEETING_CONTROLS_PRACTICE_SESSION_STATUS_UPDATED:
365
+ 'meeting:controls:practice-session-status:updated',
359
366
  // Locus URL changed
360
367
  MEETING_LOCUS_URL_UPDATE: 'meeting:locus:locusUrl:update',
361
368
  MEETING_STREAM_PUBLISH_STATE_CHANGED: 'meeting:streamPublishStateChanged',
@@ -378,6 +385,13 @@ export const EVENT_TYPES = {
378
385
  ERROR: 'error',
379
386
  };
380
387
 
388
+ export const HEADERS = {
389
+ CONTENT_TYPE: 'Content-Type',
390
+ CONTENT_TYPE_VALUE: {
391
+ APPLICATION_JSON: 'application/json',
392
+ },
393
+ };
394
+
381
395
  // Handles the reason when meeting gets destroyed
382
396
  // host removed you from the meeting
383
397
  // You are the host and you left the meeting
@@ -524,9 +538,9 @@ export const ERROR_DICTIONARY = {
524
538
  'Reconnection was not started, because there is one already in progress or reconnections are disabled in config.',
525
539
  CODE: 15,
526
540
  },
527
- WebinarRegistrationError: {
528
- NAME: 'WebinarRegistrationError',
529
- MESSAGE: 'An error occurred while the webinar required registration.',
541
+ JoinWebinarError: {
542
+ NAME: 'JoinWebinarError',
543
+ MESSAGE: 'An error occurred while the join webinar.',
530
544
  CODE: 16,
531
545
  },
532
546
  };
@@ -676,7 +690,11 @@ export const LOCUSINFO = {
676
690
  CONTROLS_REACTIONS_CHANGED: 'CONTROLS_REACTIONS_CHANGED',
677
691
  CONTROLS_VIEW_THE_PARTICIPANTS_LIST_CHANGED: 'CONTROLS_VIEW_THE_PARTICIPANTS_LIST_CHANGED',
678
692
  CONTROLS_RAISE_HAND_CHANGED: 'CONTROLS_RAISE_HAND_CHANGED',
693
+ CONTROLS_WEBCAST_CHANGED: 'CONTROLS_WEBCAST_CHANGED',
694
+ CONTROLS_MEETING_FULL_CHANGED: 'CONTROLS_MEETING_FULL_CHANGED',
695
+ CONTROLS_PRACTICE_SESSION_STATUS_UPDATED: 'CONTROLS_PRACTICE_SESSION_STATUS_UPDATED',
679
696
  CONTROLS_VIDEO_CHANGED: 'CONTROLS_VIDEO_CHANGED',
697
+ CONTROLS_STAGE_VIEW_UPDATED: 'CONTROLS_STAGE_VIEW_UPDATED',
680
698
  SELF_UNADMITTED_GUEST: 'SELF_UNADMITTED_GUEST',
681
699
  SELF_ADMITTED_GUEST: 'SELF_ADMITTED_GUEST',
682
700
  SELF_REMOTE_VIDEO_MUTE_STATUS_UPDATED: 'SELF_REMOTE_VIDEO_MUTE_STATUS_UPDATED',
@@ -702,6 +720,7 @@ export const LOCUSINFO = {
702
720
  SELF_MEETING_INTERPRETATION_CHANGED: 'SELF_MEETING_INTERPRETATION_CHANGED',
703
721
  MEDIA_INACTIVITY: 'MEDIA_INACTIVITY',
704
722
  LINKS_SERVICES: 'LINKS_SERVICES',
723
+ LINKS_RESOURCES: 'LINKS_RESOURCES',
705
724
  },
706
725
  };
707
726
 
@@ -894,6 +913,10 @@ export const DISPLAY_HINTS = {
894
913
  RECORDING_CONTROL_PAUSE: 'RECORDING_CONTROL_PAUSE',
895
914
  RECORDING_CONTROL_STOP: 'RECORDING_CONTROL_STOP',
896
915
  RECORDING_CONTROL_RESUME: 'RECORDING_CONTROL_RESUME',
916
+ PREMISE_RECORDING_CONTROL_START: 'PREMISE_RECORDING_CONTROL_START',
917
+ PREMISE_RECORDING_CONTROL_PAUSE: 'PREMISE_RECORDING_CONTROL_PAUSE',
918
+ PREMISE_RECORDING_CONTROL_STOP: 'PREMISE_RECORDING_CONTROL_STOP',
919
+ PREMISE_RECORDING_CONTROL_RESUME: 'PREMISE_RECORDING_CONTROL_RESUME',
897
920
  LOCK_CONTROL_UNLOCK: 'LOCK_CONTROL_UNLOCK',
898
921
  LOCK_CONTROL_LOCK: 'LOCK_CONTROL_LOCK',
899
922
  LOCK_STATUS_LOCKED: 'LOCK_STATUS_LOCKED',
@@ -944,6 +967,11 @@ export const DISPLAY_HINTS = {
944
967
  // participants list
945
968
  DISABLE_VIEW_THE_PARTICIPANT_LIST: 'DISABLE_VIEW_THE_PARTICIPANT_LIST',
946
969
  ENABLE_VIEW_THE_PARTICIPANT_LIST: 'ENABLE_VIEW_THE_PARTICIPANT_LIST',
970
+ // for webinar participants list
971
+ DISABLE_VIEW_THE_PARTICIPANT_LIST_PANELIST: 'DISABLE_VIEW_THE_PARTICIPANT_LIST_PANELIST',
972
+ ENABLE_VIEW_THE_PARTICIPANT_LIST_PANELIST: 'ENABLE_VIEW_THE_PARTICIPANT_LIST_PANELIST',
973
+ DISABLE_SHOW_ATTENDEE_COUNT: 'DISABLE_SHOW_ATTENDEE_COUNT',
974
+ ENABLE_SHOW_ATTENDEE_COUNT: 'ENABLE_SHOW_ATTENDEE_COUNT',
947
975
 
948
976
  // raise hand
949
977
  DISABLE_RAISE_HAND: 'DISABLE_RAISE_HAND',
@@ -963,6 +991,22 @@ export const DISPLAY_HINTS = {
963
991
 
964
992
  // Voip (audio/video)
965
993
  VOIP_IS_ENABLED: 'VOIP_IS_ENABLED',
994
+
995
+ // Webcast
996
+ WEBCAST_CONTROL_START: 'WEBCAST_CONTROL_START',
997
+ WEBCAST_CONTROL_STOP: 'WEBCAST_CONTROL_STOP',
998
+
999
+ // Stage View
1000
+ STAGE_VIEW_ACTIVE: 'STAGE_VIEW_ACTIVE',
1001
+ STAGE_VIEW_INACTIVE: 'STAGE_VIEW_INACTIVE',
1002
+ ENABLE_STAGE_VIEW: 'ENABLE_STAGE_VIEW',
1003
+ DISABLE_STAGE_VIEW: 'DISABLE_STAGE_VIEW',
1004
+
1005
+ // Practice Session
1006
+ PRACTICE_SESSION_ON: 'PRACTICE_SESSION_ON',
1007
+ PRACTICE_SESSION_OFF: 'PRACTICE_SESSION_OFF',
1008
+ SHOW_PRACTICE_SESSION_START: 'SHOW_PRACTICE_SESSION_START',
1009
+ SHOW_PRACTICE_SESSION_STOP: 'SHOW_PRACTICE_SESSION_STOP',
966
1010
  };
967
1011
 
968
1012
  export const INTERSTITIAL_DISPLAY_HINTS = [DISPLAY_HINTS.VOIP_IS_ENABLED];
@@ -1275,6 +1319,8 @@ export const MEETING_INFO_FAILURE_REASON = {
1275
1319
  WRONG_CAPTCHA: 'WRONG_CAPTCHA', // wbxappapi requires a captcha code or a wrong captcha code was provided
1276
1320
  POLICY: 'POLICY', // meeting info request violates some meeting policy
1277
1321
  WEBINAR_REGISTRATION: 'WEBINAR_REGISTRATION', // webinar need registration
1322
+ NEED_JOIN_WITH_WEBCAST: 'NEED_JOIN_WITH_WEBCAST', // webinar need using webcast join
1323
+ WEBINAR_NEED_REGISTRATIONID: 'WEBINAR_NEED_REGISTRATIONID', // webinar need registrationID
1278
1324
  OTHER: 'OTHER', // any other error (network, etc)
1279
1325
  };
1280
1326
 
@@ -2,6 +2,7 @@ enum Setting {
2
2
  disallowUnmute = 'DisallowUnmute',
3
3
  muteOnEntry = 'MuteOnEntry',
4
4
  muted = 'Muted',
5
+ roles = 'Roles',
5
6
  }
6
7
 
7
8
  enum Control {
@@ -177,7 +177,12 @@ export default class ControlsOptionsManager {
177
177
  * @memberof ControlsOptionsManager
178
178
  * @returns {Promise}
179
179
  */
180
- private setControls(setting: {[key in Setting]?: boolean}): Promise<any> {
180
+ private setControls(setting: {
181
+ [Setting.muted]?: boolean;
182
+ [Setting.disallowUnmute]?: boolean;
183
+ [Setting.muteOnEntry]?: boolean;
184
+ [Setting.roles]?: Array<string>;
185
+ }): Promise<any> {
181
186
  LoggerProxy.logger.log(
182
187
  `ControlsOptionsManager:index#setControls --> ${JSON.stringify(setting)}`
183
188
  );
@@ -190,6 +195,7 @@ export default class ControlsOptionsManager {
190
195
  Object.entries(setting).forEach(([key, value]) => {
191
196
  if (
192
197
  !shouldSkipCheckToMergeBody &&
198
+ value !== undefined &&
193
199
  !Util?.[`${value ? CAN_SET : CAN_UNSET}${key}`](this.displayHints)
194
200
  ) {
195
201
  error = new PermissionError(`${key} [${value}] not allowed, due to moderator property.`);
@@ -219,6 +225,14 @@ export default class ControlsOptionsManager {
219
225
  }
220
226
  break;
221
227
 
228
+ case Setting.roles:
229
+ if (Array.isArray(value)) {
230
+ body.audio = body.audio
231
+ ? {...body.audio, [camelCase(key)]: value}
232
+ : {[camelCase(key)]: value};
233
+ }
234
+ break;
235
+
222
236
  default:
223
237
  error = new PermissionError(`${key} [${value}] not allowed, due to moderator property.`);
224
238
  }
@@ -261,18 +275,21 @@ export default class ControlsOptionsManager {
261
275
  * @param {boolean} mutedEnabled
262
276
  * @param {boolean} disallowUnmuteEnabled
263
277
  * @param {boolean} muteOnEntryEnabled
278
+ * @param {array} roles which should be muted
264
279
  * @memberof ControlsOptionsManager
265
280
  * @returns {Promise}
266
281
  */
267
282
  public setMuteAll(
268
283
  mutedEnabled: boolean,
269
284
  disallowUnmuteEnabled: boolean,
270
- muteOnEntryEnabled: boolean
285
+ muteOnEntryEnabled: boolean,
286
+ roles: Array<string>
271
287
  ): Promise<any> {
272
288
  return this.setControls({
273
289
  [Setting.muted]: mutedEnabled,
274
290
  [Setting.disallowUnmute]: disallowUnmuteEnabled,
275
291
  [Setting.muteOnEntry]: muteOnEntryEnabled,
292
+ [Setting.roles]: roles,
276
293
  });
277
294
  }
278
295
  }
@@ -36,6 +36,8 @@ export interface VideoProperties {
36
36
 
37
37
  export interface ViewTheParticipantListProperties {
38
38
  enabled?: boolean;
39
+ panelistEnabled?: boolean;
40
+ attendeeCount?: boolean;
39
41
  }
40
42
 
41
43
  export type Properties =
@@ -217,6 +217,18 @@ class Utils {
217
217
  if (control.properties.enabled === false) {
218
218
  requiredHints.push(DISPLAY_HINTS.DISABLE_VIEW_THE_PARTICIPANT_LIST);
219
219
  }
220
+ if (control.properties.panelistEnabled === true) {
221
+ requiredHints.push(DISPLAY_HINTS.ENABLE_VIEW_THE_PARTICIPANT_LIST_PANELIST);
222
+ }
223
+ if (control.properties.panelistEnabled === false) {
224
+ requiredHints.push(DISPLAY_HINTS.DISABLE_VIEW_THE_PARTICIPANT_LIST_PANELIST);
225
+ }
226
+ if (control.properties.attendeeCount === true) {
227
+ requiredHints.push(DISPLAY_HINTS.ENABLE_SHOW_ATTENDEE_COUNT);
228
+ }
229
+ if (control.properties.attendeeCount === false) {
230
+ requiredHints.push(DISPLAY_HINTS.DISABLE_SHOW_ATTENDEE_COUNT);
231
+ }
220
232
 
221
233
  return Utils.hasHints({requiredHints, displayHints});
222
234
  }
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,
@@ -69,7 +69,7 @@ export {
69
69
  ReclaimHostEmptyWrongKeyError,
70
70
  Meeting,
71
71
  MeetingInfoUtil,
72
- WebinarRegistrationError,
72
+ JoinWebinarError,
73
73
  };
74
74
 
75
75
  export {RemoteMedia} from './multistream/remoteMedia';
@@ -79,7 +79,11 @@ ControlsUtils.parse = (controls: any) => {
79
79
  }
80
80
 
81
81
  if (controls?.viewTheParticipantList) {
82
- parsedControls.viewTheParticipantList = {enabled: controls.viewTheParticipantList.enabled};
82
+ parsedControls.viewTheParticipantList = {
83
+ enabled: controls.viewTheParticipantList?.enabled ?? false,
84
+ panelistEnabled: controls.viewTheParticipantList?.panelistEnabled ?? false,
85
+ attendeeCount: controls.viewTheParticipantList?.attendeeCount ?? 0,
86
+ };
83
87
  }
84
88
 
85
89
  if (controls?.raiseHand) {
@@ -90,6 +94,23 @@ ControlsUtils.parse = (controls: any) => {
90
94
  parsedControls.video = {enabled: controls.video.enabled};
91
95
  }
92
96
 
97
+ if (controls?.webcastControl) {
98
+ parsedControls.webcastControl = {streaming: controls.webcastControl.streaming};
99
+ }
100
+
101
+ if (controls?.meetingFull) {
102
+ parsedControls.meetingFull = {
103
+ meetingFull: controls.meetingFull?.meetingFull ?? false,
104
+ meetingPanelistFull: controls.meetingFull?.meetingPanelistFull ?? false,
105
+ };
106
+ }
107
+
108
+ if (controls?.practiceSession) {
109
+ parsedControls.practiceSession = {
110
+ enabled: controls.practiceSession.enabled,
111
+ };
112
+ }
113
+
93
114
  return parsedControls;
94
115
  };
95
116
 
@@ -121,7 +142,11 @@ ControlsUtils.getControls = (oldControls: any, newControls: any) => {
121
142
  previous?.reactions?.showDisplayNameWithReactions,
122
143
 
123
144
  hasViewTheParticipantListChanged:
124
- current?.viewTheParticipantList?.enabled !== previous?.viewTheParticipantList?.enabled,
145
+ current?.viewTheParticipantList?.enabled !== previous?.viewTheParticipantList?.enabled ||
146
+ current?.viewTheParticipantList?.panelistEnabled !==
147
+ previous?.viewTheParticipantList?.panelistEnabled ||
148
+ current?.viewTheParticipantList?.attendeeCount !==
149
+ previous?.viewTheParticipantList?.attendeeCount,
125
150
 
126
151
  hasRaiseHandChanged: current?.raiseHand?.enabled !== previous?.raiseHand?.enabled,
127
152
 
@@ -167,6 +192,25 @@ ControlsUtils.getControls = (oldControls: any, newControls: any) => {
167
192
  hasVideoEnabledChanged:
168
193
  newControls.video?.enabled !== undefined &&
169
194
  !isEqual(previous?.videoEnabled, current?.videoEnabled),
195
+
196
+ hasWebcastChanged: !isEqual(
197
+ previous?.webcastControl?.streaming,
198
+ current?.webcastControl?.streaming
199
+ ),
200
+
201
+ hasMeetingFullChanged:
202
+ !isEqual(previous?.meetingFull?.meetingFull, current?.meetingFull?.meetingFull) ||
203
+ !isEqual(
204
+ previous?.meetingFull?.meetingPanelistFull,
205
+ current?.meetingFull?.meetingPanelistFull
206
+ ),
207
+
208
+ hasPracticeSessionEnabledChanged: !isEqual(
209
+ previous?.practiceSession?.enabled,
210
+ current?.practiceSession?.enabled
211
+ ),
212
+
213
+ hasStageViewChanged: !isEqual(previous?.videoLayout, current?.videoLayout),
170
214
  },
171
215
  };
172
216
  };
@@ -6,6 +6,7 @@ FullState.parse = (fullState) => ({
6
6
  type: fullState.type || FULL_STATE.UNKNOWN,
7
7
  meetingState: fullState.state,
8
8
  locked: fullState.locked,
9
+ attendeeCount: typeof fullState.attendeeCount === 'number' ? fullState.attendeeCount : 0,
9
10
  });
10
11
 
11
12
  FullState.getFullState = (oldFullState, newFullState) => {
@@ -64,6 +64,7 @@ export default class LocusInfo extends EventsScope {
64
64
  replace: any;
65
65
  url: any;
66
66
  services: any;
67
+ resources: any;
67
68
  mainSessionLocusCache: any;
68
69
  /**
69
70
  * Constructor
@@ -263,6 +264,7 @@ export default class LocusInfo extends EventsScope {
263
264
  this.updateHostInfo(locus.host);
264
265
  this.updateMediaShares(locus.mediaShares);
265
266
  this.updateServices(locus.links?.services);
267
+ this.updateResources(locus.links?.resources);
266
268
  }
267
269
 
268
270
  /**
@@ -452,6 +454,7 @@ export default class LocusInfo extends EventsScope {
452
454
  this.updateIdentifiers(locus.identities);
453
455
  this.updateEmbeddedApps(locus.embeddedApps);
454
456
  this.updateServices(locus.links?.services);
457
+ this.updateResources(locus.links?.resources);
455
458
  this.compareAndUpdate();
456
459
  // update which required to compare different objects from locus
457
460
  }
@@ -805,6 +808,10 @@ export default class LocusInfo extends EventsScope {
805
808
  hasRaiseHandChanged,
806
809
  hasVideoChanged,
807
810
  hasInterpretationChanged,
811
+ hasWebcastChanged,
812
+ hasMeetingFullChanged,
813
+ hasPracticeSessionEnabledChanged,
814
+ hasStageViewChanged,
808
815
  },
809
816
  current,
810
817
  } = ControlsUtils.getControls(this.controls, controls);
@@ -1008,6 +1015,38 @@ export default class LocusInfo extends EventsScope {
1008
1015
  );
1009
1016
  }
1010
1017
 
1018
+ if (hasWebcastChanged) {
1019
+ this.emitScoped(
1020
+ {file: 'locus-info', function: 'updateControls'},
1021
+ LOCUSINFO.EVENTS.CONTROLS_WEBCAST_CHANGED,
1022
+ {state: current.webcastControl}
1023
+ );
1024
+ }
1025
+
1026
+ if (hasMeetingFullChanged) {
1027
+ this.emitScoped(
1028
+ {file: 'locus-info', function: 'updateControls'},
1029
+ LOCUSINFO.EVENTS.CONTROLS_MEETING_FULL_CHANGED,
1030
+ {state: current.meetingFull}
1031
+ );
1032
+ }
1033
+
1034
+ if (hasPracticeSessionEnabledChanged) {
1035
+ this.emitScoped(
1036
+ {file: 'locus-info', function: 'updateControls'},
1037
+ LOCUSINFO.EVENTS.CONTROLS_PRACTICE_SESSION_STATUS_UPDATED,
1038
+ {state: current.practiceSession}
1039
+ );
1040
+ }
1041
+
1042
+ if (hasStageViewChanged) {
1043
+ this.emitScoped(
1044
+ {file: 'locus-info', function: 'updateControls'},
1045
+ LOCUSINFO.EVENTS.CONTROLS_STAGE_VIEW_UPDATED,
1046
+ {state: current.videoLayout}
1047
+ );
1048
+ }
1049
+
1011
1050
  this.controls = controls;
1012
1051
  }
1013
1052
  }
@@ -1064,6 +1103,27 @@ export default class LocusInfo extends EventsScope {
1064
1103
  }
1065
1104
  }
1066
1105
 
1106
+ /**
1107
+ * @param {Object} resources
1108
+ * @returns {undefined}
1109
+ * @memberof LocusInfo
1110
+ */
1111
+ updateResources(resources: Record<'webcastInstance', {url: string}>) {
1112
+ if (resources && !isEqual(this.resources, resources)) {
1113
+ this.resources = resources;
1114
+ this.emitScoped(
1115
+ {
1116
+ file: 'locus-info',
1117
+ function: 'updateResources',
1118
+ },
1119
+ LOCUSINFO.EVENTS.LINKS_RESOURCES,
1120
+ {
1121
+ resources,
1122
+ }
1123
+ );
1124
+ }
1125
+ }
1126
+
1067
1127
  /**
1068
1128
  * @param {Object} fullState
1069
1129
  * @returns {undefined}
@@ -183,6 +183,21 @@ Media.createMediaConnection = (
183
183
  });
184
184
  }
185
185
 
186
+ const devTurnServers = (window as any).webexTurnServers;
187
+
188
+ if (devTurnServers) {
189
+ console.log('adding webexTurnServers:', devTurnServers);
190
+
191
+ for (const devTurnServer of devTurnServers) {
192
+ iceServers.push({
193
+ urls: devTurnServer.url || turnServerInfo.url.replace('.public', '.ds.public'),
194
+ username: devTurnServer.username || turnServerInfo?.username || '',
195
+ credential: devTurnServer.password || turnServerInfo?.password || '',
196
+ });
197
+ }
198
+ }
199
+ console.log('iceServers:', iceServers);
200
+
186
201
  if (isMultistream) {
187
202
  const config: MultistreamConnectionConfig = {
188
203
  iceServers,
@@ -3,6 +3,7 @@
3
3
  */
4
4
 
5
5
  import {MEETINGS} from '../constants';
6
+ import ControlsOptionsUtil from '../controls-options-manager/util';
6
7
 
7
8
  /**
8
9
  * IInMeetingActions
@@ -25,6 +26,7 @@ interface IInMeetingActions {
25
26
  canStartRecording?: boolean;
26
27
  canPauseRecording?: boolean;
27
28
  canResumeRecording?: boolean;
29
+ isPremiseRecordingEnabled?: boolean;
28
30
  canStopRecording?: boolean;
29
31
  canRaiseHand?: boolean;
30
32
  canLowerAllHands?: boolean;
@@ -64,6 +66,10 @@ interface IInMeetingActions {
64
66
  canUpdateShareControl?: boolean;
65
67
  canEnableViewTheParticipantsList?: boolean;
66
68
  canDisableViewTheParticipantsList?: boolean;
69
+ canEnableViewTheParticipantsListPanelist?: boolean;
70
+ canDisableViewTheParticipantsListPanelist?: boolean;
71
+ canEnableShowAttendeeCount?: boolean;
72
+ canDisableShowAttendeeCount?: boolean;
67
73
  canEnableRaiseHand?: boolean;
68
74
  canDisableRaiseHand?: boolean;
69
75
  canEnableVideo?: boolean;
@@ -83,6 +89,15 @@ interface IInMeetingActions {
83
89
  canShareWhiteBoard?: boolean;
84
90
  enforceVirtualBackground?: boolean;
85
91
  canPollingAndQA?: boolean;
92
+ canStartWebcast?: boolean;
93
+ canStopWebcast?: boolean;
94
+ canShowStageView?: boolean;
95
+ canEnableStageView?: boolean;
96
+ canDisableStageView?: boolean;
97
+ isPracticeSessionOn?: boolean;
98
+ isPracticeSessionOff?: boolean;
99
+ canStartPracticeSession?: boolean;
100
+ canStopPracticeSession?: boolean;
86
101
  }
87
102
 
88
103
  /**
@@ -107,6 +122,8 @@ export default class InMeetingActions implements IInMeetingActions {
107
122
 
108
123
  canResumeRecording = null;
109
124
 
125
+ isPremiseRecordingEnabled = null;
126
+
110
127
  canStopRecording = null;
111
128
 
112
129
  canSetMuteOnEntry = null;
@@ -201,6 +218,14 @@ export default class InMeetingActions implements IInMeetingActions {
201
218
 
202
219
  canDisableViewTheParticipantsList = null;
203
220
 
221
+ canEnableViewTheParticipantsListPanelist = null;
222
+
223
+ canDisableViewTheParticipantsListPanelist = null;
224
+
225
+ canEnableShowAttendeeCount = null;
226
+
227
+ canDisableShowAttendeeCount = null;
228
+
204
229
  canEnableRaiseHand = null;
205
230
 
206
231
  canDisableRaiseHand = null;
@@ -238,6 +263,25 @@ export default class InMeetingActions implements IInMeetingActions {
238
263
  canShareWhiteBoard = null;
239
264
 
240
265
  canPollingAndQA = null;
266
+
267
+ canStartWebcast = null;
268
+
269
+ canStopWebcast = null;
270
+
271
+ canShowStageView = null;
272
+
273
+ canEnableStageView = null;
274
+
275
+ canDisableStageView = null;
276
+
277
+ isPracticeSessionOn = null;
278
+
279
+ isPracticeSessionOff = null;
280
+
281
+ canStartPracticeSession = null;
282
+
283
+ canStopPracticeSession = null;
284
+
241
285
  /**
242
286
  * Returns all meeting action options
243
287
  * @returns {Object}
@@ -260,6 +304,7 @@ export default class InMeetingActions implements IInMeetingActions {
260
304
  canPauseRecording: this.canPauseRecording,
261
305
  canResumeRecording: this.canResumeRecording,
262
306
  canStopRecording: this.canStopRecording,
307
+ isPremiseRecordingEnabled: this.isPremiseRecordingEnabled,
263
308
  canRaiseHand: this.canRaiseHand,
264
309
  canLowerAllHands: this.canLowerAllHands,
265
310
  canLowerSomeoneElsesHand: this.canLowerSomeoneElsesHand,
@@ -298,6 +343,10 @@ export default class InMeetingActions implements IInMeetingActions {
298
343
  canUpdateShareControl: this.canUpdateShareControl,
299
344
  canEnableViewTheParticipantsList: this.canEnableViewTheParticipantsList,
300
345
  canDisableViewTheParticipantsList: this.canDisableViewTheParticipantsList,
346
+ canEnableViewTheParticipantsListPanelist: this.canEnableViewTheParticipantsListPanelist,
347
+ canDisableViewTheParticipantsListPanelist: this.canDisableViewTheParticipantsListPanelist,
348
+ canEnableShowAttendeeCount: this.canEnableShowAttendeeCount,
349
+ canDisableShowAttendeeCount: this.canDisableShowAttendeeCount,
301
350
  canEnableRaiseHand: this.canEnableRaiseHand,
302
351
  canDisableRaiseHand: this.canDisableRaiseHand,
303
352
  canEnableVideo: this.canEnableVideo,
@@ -317,6 +366,15 @@ export default class InMeetingActions implements IInMeetingActions {
317
366
  supportHDV: this.supportHDV,
318
367
  canShareWhiteBoard: this.canShareWhiteBoard,
319
368
  canPollingAndQA: this.canPollingAndQA,
369
+ canStartWebcast: this.canStartWebcast,
370
+ canStopWebcast: this.canStopWebcast,
371
+ canShowStageView: this.canShowStageView,
372
+ canEnableStageView: this.canEnableStageView,
373
+ canDisableStageView: this.canDisableStageView,
374
+ isPracticeSessionOn: this.isPracticeSessionOn,
375
+ isPracticeSessionOff: this.isPracticeSessionOff,
376
+ canStartPracticeSession: this.canStartPracticeSession,
377
+ canStopPracticeSession: this.canStopPracticeSession,
320
378
  });
321
379
 
322
380
  /**