@webex/plugin-meetings 3.8.0-web-workers-keepalive.1 → 3.8.1-next.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 (168) hide show
  1. package/dist/breakouts/breakout.js +1 -1
  2. package/dist/breakouts/index.js +70 -6
  3. package/dist/breakouts/index.js.map +1 -1
  4. package/dist/common/errors/webex-errors.js +12 -2
  5. package/dist/common/errors/webex-errors.js.map +1 -1
  6. package/dist/config.js +4 -1
  7. package/dist/config.js.map +1 -1
  8. package/dist/constants.js +22 -123
  9. package/dist/constants.js.map +1 -1
  10. package/dist/controls-options-manager/enums.js +2 -0
  11. package/dist/controls-options-manager/enums.js.map +1 -1
  12. package/dist/controls-options-manager/types.js.map +1 -1
  13. package/dist/controls-options-manager/util.js +52 -0
  14. package/dist/controls-options-manager/util.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/controlsUtils.js +30 -10
  18. package/dist/locus-info/controlsUtils.js.map +1 -1
  19. package/dist/locus-info/index.js +83 -12
  20. package/dist/locus-info/index.js.map +1 -1
  21. package/dist/locus-info/selfUtils.js +432 -418
  22. package/dist/locus-info/selfUtils.js.map +1 -1
  23. package/dist/media/index.js +17 -17
  24. package/dist/media/index.js.map +1 -1
  25. package/dist/media/properties.js +94 -6
  26. package/dist/media/properties.js.map +1 -1
  27. package/dist/meeting/brbState.js +9 -2
  28. package/dist/meeting/brbState.js.map +1 -1
  29. package/dist/meeting/in-meeting-actions.js +17 -1
  30. package/dist/meeting/in-meeting-actions.js.map +1 -1
  31. package/dist/meeting/index.js +568 -328
  32. package/dist/meeting/index.js.map +1 -1
  33. package/dist/meeting/locusMediaRequest.js +0 -17
  34. package/dist/meeting/locusMediaRequest.js.map +1 -1
  35. package/dist/meeting/muteState.js +4 -4
  36. package/dist/meeting/muteState.js.map +1 -1
  37. package/dist/meeting/request.js +30 -0
  38. package/dist/meeting/request.js.map +1 -1
  39. package/dist/meeting/request.type.js.map +1 -1
  40. package/dist/meeting/util.js +9 -1
  41. package/dist/meeting/util.js.map +1 -1
  42. package/dist/meeting-info/meeting-info-v2.js +19 -13
  43. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  44. package/dist/meeting-info/utilv2.js +5 -1
  45. package/dist/meeting-info/utilv2.js.map +1 -1
  46. package/dist/meetings/index.js +76 -0
  47. package/dist/meetings/index.js.map +1 -1
  48. package/dist/meetings/util.js +14 -0
  49. package/dist/meetings/util.js.map +1 -1
  50. package/dist/member/index.js +45 -9
  51. package/dist/member/index.js.map +1 -1
  52. package/dist/member/types.js +3 -0
  53. package/dist/member/types.js.map +1 -1
  54. package/dist/member/util.js +335 -356
  55. package/dist/member/util.js.map +1 -1
  56. package/dist/members/collection.js.map +1 -1
  57. package/dist/members/index.js +137 -29
  58. package/dist/members/index.js.map +1 -1
  59. package/dist/members/request.js +38 -0
  60. package/dist/members/request.js.map +1 -1
  61. package/dist/members/util.js +36 -1
  62. package/dist/members/util.js.map +1 -1
  63. package/dist/metrics/constants.js +1 -0
  64. package/dist/metrics/constants.js.map +1 -1
  65. package/dist/reachability/clusterReachability.js +23 -31
  66. package/dist/reachability/clusterReachability.js.map +1 -1
  67. package/dist/reachability/index.js +42 -2
  68. package/dist/reachability/index.js.map +1 -1
  69. package/dist/reconnection-manager/index.js +2 -2
  70. package/dist/reconnection-manager/index.js.map +1 -1
  71. package/dist/roap/index.js.map +1 -1
  72. package/dist/roap/turnDiscovery.js +45 -27
  73. package/dist/roap/turnDiscovery.js.map +1 -1
  74. package/dist/roap/types.js +17 -0
  75. package/dist/roap/types.js.map +1 -0
  76. package/dist/types/common/errors/webex-errors.d.ts +7 -1
  77. package/dist/types/config.d.ts +2 -0
  78. package/dist/types/constants.d.ts +15 -85
  79. package/dist/types/controls-options-manager/enums.d.ts +3 -1
  80. package/dist/types/controls-options-manager/types.d.ts +7 -1
  81. package/dist/types/locus-info/index.d.ts +3 -3
  82. package/dist/types/locus-info/selfUtils.d.ts +216 -1
  83. package/dist/types/media/properties.d.ts +15 -0
  84. package/dist/types/meeting/in-meeting-actions.d.ts +16 -0
  85. package/dist/types/meeting/index.d.ts +35 -1
  86. package/dist/types/meeting/muteState.d.ts +0 -1
  87. package/dist/types/meeting/request.d.ts +12 -1
  88. package/dist/types/meeting/request.type.d.ts +6 -0
  89. package/dist/types/meeting/util.d.ts +3 -1
  90. package/dist/types/meeting-info/meeting-info-v2.d.ts +2 -1
  91. package/dist/types/meetings/index.d.ts +28 -0
  92. package/dist/types/member/index.d.ts +20 -6
  93. package/dist/types/member/types.d.ts +73 -14
  94. package/dist/types/member/util.d.ts +156 -1
  95. package/dist/types/members/collection.d.ts +6 -5
  96. package/dist/types/members/index.d.ts +32 -43
  97. package/dist/types/members/request.d.ts +26 -0
  98. package/dist/types/members/util.d.ts +27 -0
  99. package/dist/types/metrics/constants.d.ts +1 -0
  100. package/dist/types/reachability/clusterReachability.d.ts +2 -6
  101. package/dist/types/reachability/index.d.ts +8 -0
  102. package/dist/types/roap/index.d.ts +3 -2
  103. package/dist/types/roap/turnDiscovery.d.ts +5 -17
  104. package/dist/types/roap/types.d.ts +16 -0
  105. package/dist/webinar/index.js +1 -1
  106. package/package.json +24 -23
  107. package/src/breakouts/index.ts +69 -0
  108. package/src/common/errors/webex-errors.ts +8 -1
  109. package/src/config.ts +2 -0
  110. package/src/constants.ts +23 -90
  111. package/src/controls-options-manager/enums.ts +2 -0
  112. package/src/controls-options-manager/types.ts +11 -1
  113. package/src/controls-options-manager/util.ts +62 -0
  114. package/src/locus-info/controlsUtils.ts +48 -12
  115. package/src/locus-info/index.ts +88 -13
  116. package/src/locus-info/selfUtils.ts +496 -442
  117. package/src/media/index.ts +23 -21
  118. package/src/media/properties.ts +96 -0
  119. package/src/meeting/brbState.ts +11 -2
  120. package/src/meeting/in-meeting-actions.ts +32 -0
  121. package/src/meeting/index.ts +356 -87
  122. package/src/meeting/locusMediaRequest.ts +0 -18
  123. package/src/meeting/muteState.ts +4 -4
  124. package/src/meeting/request.ts +36 -1
  125. package/src/meeting/request.type.ts +7 -0
  126. package/src/meeting/util.ts +9 -1
  127. package/src/meeting-info/meeting-info-v2.ts +7 -2
  128. package/src/meeting-info/utilv2.ts +5 -0
  129. package/src/meetings/index.ts +76 -0
  130. package/src/meetings/util.ts +18 -0
  131. package/src/member/index.ts +57 -22
  132. package/src/member/types.ts +82 -16
  133. package/src/member/util.ts +357 -353
  134. package/src/members/collection.ts +4 -3
  135. package/src/members/index.ts +137 -18
  136. package/src/members/request.ts +44 -0
  137. package/src/members/util.ts +43 -1
  138. package/src/metrics/constants.ts +1 -0
  139. package/src/reachability/clusterReachability.ts +26 -25
  140. package/src/reachability/index.ts +55 -1
  141. package/src/reconnection-manager/index.ts +2 -2
  142. package/src/roap/index.ts +3 -7
  143. package/src/roap/turnDiscovery.ts +34 -39
  144. package/src/roap/types.ts +23 -0
  145. package/test/unit/spec/breakouts/index.ts +167 -95
  146. package/test/unit/spec/controls-options-manager/util.js +120 -0
  147. package/test/unit/spec/locus-info/controlsUtils.js +131 -9
  148. package/test/unit/spec/locus-info/index.js +195 -73
  149. package/test/unit/spec/locus-info/selfUtils.js +98 -24
  150. package/test/unit/spec/media/index.ts +150 -18
  151. package/test/unit/spec/media/properties.ts +130 -0
  152. package/test/unit/spec/meeting/brbState.ts +40 -2
  153. package/test/unit/spec/meeting/in-meeting-actions.ts +19 -4
  154. package/test/unit/spec/meeting/index.js +553 -36
  155. package/test/unit/spec/meeting/locusMediaRequest.ts +0 -30
  156. package/test/unit/spec/meeting/muteState.js +73 -2
  157. package/test/unit/spec/meeting/request.js +32 -1
  158. package/test/unit/spec/meeting/utils.js +79 -33
  159. package/test/unit/spec/meeting-info/meetinginfov2.js +41 -0
  160. package/test/unit/spec/meeting-info/utilv2.js +19 -0
  161. package/test/unit/spec/meetings/index.js +68 -1
  162. package/test/unit/spec/members/index.js +304 -78
  163. package/test/unit/spec/members/request.js +68 -22
  164. package/test/unit/spec/members/utils.js +75 -0
  165. package/test/unit/spec/reachability/clusterReachability.ts +41 -55
  166. package/test/unit/spec/reachability/index.ts +89 -0
  167. package/test/unit/spec/reconnection-manager/index.js +4 -4
  168. package/test/unit/spec/roap/turnDiscovery.ts +110 -28
package/package.json CHANGED
@@ -43,13 +43,13 @@
43
43
  "@webex/eslint-config-legacy": "0.0.0",
44
44
  "@webex/jest-config-legacy": "0.0.0",
45
45
  "@webex/legacy-tools": "0.0.0",
46
- "@webex/plugin-meetings": "3.8.0-web-workers-keepalive.1",
47
- "@webex/plugin-rooms": "3.8.0-web-workers-keepalive.1",
48
- "@webex/test-helper-chai": "3.8.0-web-workers-keepalive.1",
49
- "@webex/test-helper-mocha": "3.8.0-web-workers-keepalive.1",
50
- "@webex/test-helper-mock-webex": "3.8.0-web-workers-keepalive.1",
51
- "@webex/test-helper-retry": "3.8.0-web-workers-keepalive.1",
52
- "@webex/test-helper-test-users": "3.8.0-web-workers-keepalive.1",
46
+ "@webex/plugin-meetings": "3.8.1-next.1",
47
+ "@webex/plugin-rooms": "3.8.0-next.29",
48
+ "@webex/test-helper-chai": "3.8.0-next.24",
49
+ "@webex/test-helper-mocha": "3.8.0-next.24",
50
+ "@webex/test-helper-mock-webex": "3.8.0-next.24",
51
+ "@webex/test-helper-retry": "3.8.0-next.24",
52
+ "@webex/test-helper-test-users": "3.8.0-next.24",
53
53
  "chai": "^4.3.4",
54
54
  "chai-as-promised": "^7.1.1",
55
55
  "eslint": "^8.24.0",
@@ -61,22 +61,23 @@
61
61
  "typescript": "^4.7.4"
62
62
  },
63
63
  "dependencies": {
64
- "@webex/common": "3.8.0-web-workers-keepalive.1",
65
- "@webex/event-dictionary-ts": "^1.0.1688",
66
- "@webex/internal-media-core": "2.14.7",
67
- "@webex/internal-plugin-conversation": "3.8.0-web-workers-keepalive.1",
68
- "@webex/internal-plugin-device": "3.8.0-web-workers-keepalive.1",
69
- "@webex/internal-plugin-llm": "3.8.0-web-workers-keepalive.1",
70
- "@webex/internal-plugin-mercury": "3.8.0-web-workers-keepalive.1",
71
- "@webex/internal-plugin-metrics": "3.8.0-web-workers-keepalive.1",
72
- "@webex/internal-plugin-support": "3.8.0-web-workers-keepalive.1",
73
- "@webex/internal-plugin-user": "3.8.0-web-workers-keepalive.1",
74
- "@webex/internal-plugin-voicea": "3.8.0-web-workers-keepalive.1",
75
- "@webex/media-helpers": "3.8.0-web-workers-keepalive.1",
76
- "@webex/plugin-people": "3.8.0-web-workers-keepalive.1",
77
- "@webex/plugin-rooms": "3.8.0-web-workers-keepalive.1",
64
+ "@webex/common": "3.8.0-next.24",
65
+ "@webex/event-dictionary-ts": "^1.0.1753",
66
+ "@webex/internal-media-core": "2.17.1",
67
+ "@webex/internal-plugin-conversation": "3.8.0-next.29",
68
+ "@webex/internal-plugin-device": "3.8.0-next.24",
69
+ "@webex/internal-plugin-llm": "3.8.0-next.27",
70
+ "@webex/internal-plugin-mercury": "3.8.0-next.26",
71
+ "@webex/internal-plugin-metrics": "3.8.0-next.24",
72
+ "@webex/internal-plugin-support": "3.8.0-next.29",
73
+ "@webex/internal-plugin-user": "3.8.0-next.24",
74
+ "@webex/internal-plugin-voicea": "3.8.1-next.1",
75
+ "@webex/media-helpers": "3.8.0-next.30",
76
+ "@webex/plugin-people": "3.8.0-next.26",
77
+ "@webex/plugin-rooms": "3.8.0-next.29",
78
+ "@webex/ts-sdp": "^1.8.1",
78
79
  "@webex/web-capabilities": "^1.4.0",
79
- "@webex/webex-core": "3.8.0-web-workers-keepalive.1",
80
+ "@webex/webex-core": "3.8.0-next.24",
80
81
  "ampersand-collection": "^2.0.2",
81
82
  "bowser": "^2.11.0",
82
83
  "btoa": "^1.2.1",
@@ -92,5 +93,5 @@
92
93
  "//": [
93
94
  "TODO: upgrade jwt-decode when moving to node 18"
94
95
  ],
95
- "version": "3.8.0-web-workers-keepalive.1"
96
+ "version": "3.8.1-next.1"
96
97
  }
@@ -45,6 +45,8 @@ const Breakouts = WebexPlugin.extend({
45
45
  intervalID: 'number',
46
46
  meetingId: 'string',
47
47
  canManageBreakouts: 'boolean', // appear the ability to manage breakouts
48
+ mainGroupId: 'string', // appears from the moment you enable breakouts
49
+ mainSessionId: 'string', // appears from the moment you enable breakouts
48
50
  },
49
51
  children: {
50
52
  currentBreakoutSession: Breakout,
@@ -544,6 +546,28 @@ const Breakouts = WebexPlugin.extend({
544
546
  }
545
547
  },
546
548
 
549
+ /**
550
+ * set main group id
551
+ * @param {Object} breakoutInfo -- breakout groups
552
+ * @returns {void}
553
+ */
554
+ _setMainGroupId(breakoutInfo) {
555
+ if (breakoutInfo?.body?.mainGroupId) {
556
+ this.set('mainGroupId', breakoutInfo.body.mainGroupId);
557
+ }
558
+ },
559
+
560
+ /**
561
+ * set main session id
562
+ * @param {Object} breakoutInfo -- breakout groups
563
+ * @returns {void}
564
+ */
565
+ _setMainSessionId(breakoutInfo) {
566
+ if (breakoutInfo?.body?.mainSessionId) {
567
+ this.set('mainSessionId', breakoutInfo.body.mainSessionId);
568
+ }
569
+ },
570
+
547
571
  /**
548
572
  * Create new breakout sessions
549
573
  * @param {object} params -- breakout session group
@@ -567,6 +591,8 @@ const Breakouts = WebexPlugin.extend({
567
591
  });
568
592
 
569
593
  this._setManageGroups(breakoutInfo);
594
+ this._setMainGroupId(breakoutInfo);
595
+ this._setMainSessionId(breakoutInfo);
570
596
 
571
597
  // clear edit lock info after save breakout session info
572
598
  this._clearEditLockInfo();
@@ -630,6 +656,8 @@ const Breakouts = WebexPlugin.extend({
630
656
  });
631
657
 
632
658
  this._setManageGroups(breakoutInfo);
659
+ this._setMainGroupId(breakoutInfo);
660
+ this._setMainSessionId(breakoutInfo);
633
661
 
634
662
  return breakoutInfo;
635
663
  },
@@ -665,6 +693,8 @@ const Breakouts = WebexPlugin.extend({
665
693
  });
666
694
 
667
695
  this._setManageGroups(breakoutInfo);
696
+ this._setMainGroupId(breakoutInfo);
697
+ this._setMainSessionId(breakoutInfo);
668
698
 
669
699
  return breakoutInfo;
670
700
  },
@@ -718,6 +748,9 @@ const Breakouts = WebexPlugin.extend({
718
748
  });
719
749
 
720
750
  this._setManageGroups(breakout);
751
+ this._setMainGroupId(breakout);
752
+ this._setMainSessionId(breakout);
753
+
721
754
  if (editlock && breakout.body?.editlock?.token) {
722
755
  this.set('editLock', breakout.body.editlock);
723
756
  this.keepEditLockAlive();
@@ -916,6 +949,42 @@ const Breakouts = WebexPlugin.extend({
916
949
  body,
917
950
  });
918
951
  },
952
+ /**
953
+ * Move participants to main session lobby
954
+ * @param {Array} sessions
955
+ * @param {string} sessions[].participants - Participant IDs to move
956
+ * @returns {void}
957
+ */
958
+ moveToLobby(sessions: Array<{participants: string[]}>) {
959
+ if (!this.mainGroupId || !this.mainSessionId) {
960
+ throw new Error(
961
+ 'Main group ID and session ID must be available to move participants to lobby'
962
+ );
963
+ }
964
+
965
+ const updatedSessions = sessions.map((item) => {
966
+ return {
967
+ id: this.mainSessionId,
968
+ participants: item.participants,
969
+ targetState: 'LOBBY',
970
+ };
971
+ });
972
+
973
+ const body = {
974
+ groups: [
975
+ {
976
+ id: this.mainGroupId,
977
+ sessions: updatedSessions,
978
+ },
979
+ ],
980
+ };
981
+
982
+ return this.request({
983
+ method: HTTP_VERBS.PUT,
984
+ uri: `${this.url}/dynamicAssign`,
985
+ body,
986
+ });
987
+ },
919
988
  /**
920
989
  * trigger ASK_RETURN_TO_MAIN event when main session requested
921
990
  * @param {Object} breakout
@@ -152,12 +152,19 @@ WebExMeetingsErrors[IceGatheringFailed.CODE] = IceGatheringFailed;
152
152
  * @extends WebexMeetingsError
153
153
  * @property {number} code - 30203
154
154
  * @property {string} message - 'Failed to add media'
155
+ * @property {Error} [cause] - The underlying error that caused the failure
155
156
  */
156
157
  class AddMediaFailed extends WebexMeetingsError {
157
158
  static CODE = 30203;
159
+ cause?: Error;
158
160
 
159
- constructor() {
161
+ /**
162
+ * Creates a new AddMediaFailed error
163
+ * @param {Error} [cause] - The underlying error that caused the media addition to fail
164
+ */
165
+ constructor(cause?: Error) {
160
166
  super(AddMediaFailed.CODE, 'Failed to add media');
167
+ this.cause = cause;
161
168
  }
162
169
  }
163
170
  export {AddMediaFailed};
package/src/config.ts CHANGED
@@ -98,5 +98,7 @@ export default {
98
98
  enableReachabilityChecks: true,
99
99
  reachabilityGetClusterTimeout: 5000,
100
100
  logUploadIntervalMultiplicationFactor: 0, // if set to 0 or undefined, logs won't be uploaded periodically, if you want periodic logs, recommended value is 1
101
+ stopIceGatheringAfterFirstRelayCandidate: false,
102
+ enableAudioTwccForMultistream: false,
101
103
  },
102
104
  };
package/src/constants.ts CHANGED
@@ -369,6 +369,9 @@ export const EVENT_TRIGGERS = {
369
369
  MEETING_CONTROLS_MEETING_FULL_UPDATED: 'meeting:controls:meeting-full:updated',
370
370
  MEETING_CONTROLS_PRACTICE_SESSION_STATUS_UPDATED:
371
371
  'meeting:controls:practice-session-status:updated',
372
+ MEETING_CONTROLS_ANNOTATION_UPDATED: 'meeting:controls:annotation:updated',
373
+ MEETING_CONTROLS_REMOTE_DESKTOP_CONTROL_UPDATED:
374
+ 'meeting:controls:remote-desktop-control:updated',
372
375
  // Locus URL changed
373
376
  MEETING_LOCUS_URL_UPDATE: 'meeting:locus:locusUrl:update',
374
377
  MEETING_STREAM_PUBLISH_STATE_CHANGED: 'meeting:streamPublishStateChanged',
@@ -376,8 +379,10 @@ export const EVENT_TRIGGERS = {
376
379
  MEETING_TRANSCRIPTION_CONNECTED: 'meeting:transcription:connected',
377
380
  MEETING_STARTED_RECEIVING_TRANSCRIPTION: 'meeting:receiveTranscription:started',
378
381
  MEETING_STOPPED_RECEIVING_TRANSCRIPTION: 'meeting:receiveTranscription:stopped',
382
+ MEETING_TRANSCRIPTION_SPOKEN_LANGUAGE_UPDATED: 'meeting:transcription:spokenLanguageUpdate',
379
383
  MEETING_MANUAL_CAPTION_UPDATED: 'meeting:manualCaptionControl:updated',
380
384
  MEETING_CAPTION_RECEIVED: 'meeting:caption-received',
385
+ MEETING_PARTICIPANT_REASON_CHANGED: 'meeting:participant-reason-changed',
381
386
  };
382
387
 
383
388
  export const EVENT_TYPES = {
@@ -695,6 +700,8 @@ export const LOCUSINFO = {
695
700
  CONTROLS_MEETING_LAYOUT_UPDATED: 'CONTROLS_MEETING_LAYOUT_UPDATED',
696
701
  CONTROLS_RECORDING_UPDATED: 'CONTROLS_RECORDING_UPDATED',
697
702
  CONTROLS_MEETING_TRANSCRIBE_UPDATED: 'CONTROLS_MEETING_TRANSCRIBE_UPDATED',
703
+ CONTROLS_MEETING_TRANSCRIPTION_SPOKEN_LANGUAGE_UPDATED:
704
+ 'CONTROLS_MEETING_TRANSCRIPTION_SPOKEN_LANGUAGE_UPDATED',
698
705
  CONTROLS_MEETING_MANUAL_CAPTION_UPDATED: 'CONTROLS_MEETING_MANUAL_CAPTION_UPDATED',
699
706
  CONTROLS_MEETING_BREAKOUT_UPDATED: 'CONTROLS_MEETING_BREAKOUT_UPDATED',
700
707
  CONTROLS_MEETING_CONTAINER_UPDATED: 'CONTROLS_MEETING_CONTAINER_UPDATED',
@@ -711,6 +718,8 @@ export const LOCUSINFO = {
711
718
  CONTROLS_PRACTICE_SESSION_STATUS_UPDATED: 'CONTROLS_PRACTICE_SESSION_STATUS_UPDATED',
712
719
  CONTROLS_VIDEO_CHANGED: 'CONTROLS_VIDEO_CHANGED',
713
720
  CONTROLS_STAGE_VIEW_UPDATED: 'CONTROLS_STAGE_VIEW_UPDATED',
721
+ CONTROLS_ANNOTATION_CHANGED: 'CONTROLS_ANNOTATION_CHANGED',
722
+ CONTROLS_REMOTE_DESKTOP_CONTROL_CHANGED: 'CONTROLS_REMOTE_DESKTOP_CONTROL_CHANGED',
714
723
  SELF_UNADMITTED_GUEST: 'SELF_UNADMITTED_GUEST',
715
724
  SELF_ADMITTED_GUEST: 'SELF_ADMITTED_GUEST',
716
725
  SELF_REMOTE_VIDEO_MUTE_STATUS_UPDATED: 'SELF_REMOTE_VIDEO_MUTE_STATUS_UPDATED',
@@ -738,6 +747,7 @@ export const LOCUSINFO = {
738
747
  MEDIA_INACTIVITY: 'MEDIA_INACTIVITY',
739
748
  LINKS_SERVICES: 'LINKS_SERVICES',
740
749
  LINKS_RESOURCES: 'LINKS_RESOURCES',
750
+ PARTICIPANT_REASON_CHANGED: 'PARTICIPANT_REASON_CHANGED',
741
751
  },
742
752
  };
743
753
 
@@ -906,6 +916,7 @@ export enum SELF_POLICY {
906
916
  SUPPORT_NETWORK_BASED_RECORD = 'supportNetworkBasedRecord',
907
917
  SUPPORT_PREMISE_RECORD = 'supportPremiseRecord',
908
918
  SUPPORT_REALTIME_CLOSE_CAPTION = 'supportRealtimeCloseCaption',
919
+ SUPPORT_REALTIME_CLOSE_CAPTION_MANUAL = 'supportRealtimeCloseCaptionManual',
909
920
  SUPPORT_CHAT = 'supportChat',
910
921
  SUPPORT_DESKTOP_SHARE_REMOTE = 'supportDesktopShareRemote',
911
922
  SUPPORT_DESKTOP_SHARE = 'supportDesktopShare',
@@ -973,6 +984,7 @@ export const DISPLAY_HINTS = {
973
984
  PRESENTER_CONTROL: 'PRESENTER_CONTROL',
974
985
  CAN_RENAME_SELF_AND_OBSERVED: 'CAN_RENAME_SELF_AND_OBSERVED',
975
986
  CAN_RENAME_OTHERS: 'CAN_RENAME_OTHERS',
987
+ MOVE_TO_LOBBY: 'MOVE_TO_LOBBY',
976
988
 
977
989
  // breakout session
978
990
  BREAKOUT_MANAGEMENT: 'BREAKOUT_MANAGEMENT',
@@ -1026,6 +1038,17 @@ export const DISPLAY_HINTS = {
1026
1038
  PRACTICE_SESSION_OFF: 'PRACTICE_SESSION_OFF',
1027
1039
  SHOW_PRACTICE_SESSION_START: 'SHOW_PRACTICE_SESSION_START',
1028
1040
  SHOW_PRACTICE_SESSION_STOP: 'SHOW_PRACTICE_SESSION_STOP',
1041
+
1042
+ // Explicit consent for post meeting data
1043
+ SHOW_POST_MEETING_DATA_CONSENT_PROMPT: 'SHOW_POST_MEETING_DATA_CONSENT_PROMPT',
1044
+
1045
+ // Annotations
1046
+ ENABLE_ANNOTATION_MEETING_OPTION: 'ENABLE_ANNOTATION_MEETING_OPTION',
1047
+ DISABLE_ANNOTATION_MEETING_OPTION: 'DISABLE_ANNOTATION_MEETING_OPTION',
1048
+
1049
+ // Remote Desktop Control
1050
+ ENABLE_RDC_MEETING_OPTION: 'ENABLE_RDC_MEETING_OPTION',
1051
+ DISABLE_RDC_MEETING_OPTION: 'DISABLE_RDC_MEETING_OPTION',
1029
1052
  };
1030
1053
 
1031
1054
  export const INTERSTITIAL_DISPLAY_HINTS = [DISPLAY_HINTS.VOIP_IS_ENABLED];
@@ -1150,96 +1173,6 @@ export const NETWORK_STATUS = {
1150
1173
 
1151
1174
  export type NETWORK_STATUS = Enum<typeof NETWORK_STATUS>;
1152
1175
 
1153
- export const NETWORK_TYPE = {
1154
- VPN: 'vpn',
1155
- UNKNOWN: 'unknown',
1156
- WIFI: 'wifi',
1157
- ETHERNET: 'ethernet',
1158
- };
1159
-
1160
- export const STATS = {
1161
- SEND_DIRECTION: 'send',
1162
- RECEIVE_DIRECTION: 'recv',
1163
- REMOTE: 'remote',
1164
- LOCAL: 'local',
1165
- };
1166
-
1167
- export const MQA_STATS = {
1168
- MQA_SIZE: 120, // MQA is done on 60 second intervals by server def, add a buffer for missed events
1169
- CA_TYPE: 'MQA',
1170
- DEFAULT_IP: '0.0.0.0',
1171
- DEFAULT_SHARE_SENDER_STATS: {
1172
- common: {
1173
- common: {
1174
- direction: 'sendrecv', // TODO: parse from SDP and save globally
1175
- isMain: false, // always true for share sender
1176
- mariFecEnabled: false, // unavailable
1177
- mariRtxEnabled: false, // unavailable
1178
- mariLiteEnabled: false, // unavailable
1179
- mariQosEnabled: false, // unavailable
1180
- multistreamEnabled: false, // unavailable
1181
- },
1182
- availableBitrate: 0,
1183
- dtlsBitrate: 0, // unavailable
1184
- dtlsPackets: 0, // unavailable
1185
- fecBitrate: 0, // unavailable
1186
- fecPackets: 0, // unavailable
1187
- maxBitrate: 0, // unavailable
1188
- queueDelay: 0, // unavailable
1189
- remoteJitter: 0, // unavailable
1190
- remoteLossRate: 0,
1191
- roundTripTime: 0,
1192
- rtcpBitrate: 0, // unavailable
1193
- rtcpPackets: 0, // unavailable
1194
- rtpBitrate: 0, // unavailable
1195
- rtpPackets: 0,
1196
- stunBitrate: 0, // unavailable
1197
- stunPackets: 0, // unavailable
1198
- transportType: 'UDP', // TODO: parse the transport type from the SDP and save globally
1199
- },
1200
- streams: [
1201
- {
1202
- common: {
1203
- codec: 'H264', // TODO: parse the codec from the SDP and save globally
1204
- duplicateSsci: 0, // unavailable
1205
- requestedBitrate: 0, // unavailable
1206
- requestedFrames: 0, // unavailable
1207
- rtpPackets: 0,
1208
- ssci: 0, // unavailable
1209
- transmittedBitrate: 0,
1210
- transmittedFrameRate: 0,
1211
- },
1212
- h264CodecProfile: 'BP', // TODO: parse the profile level from h264 in the SDP and save globally
1213
- localConfigurationChanges: 0, // unavailable
1214
- remoteConfigurationChanges: 0, // unavailable
1215
- requestedFrameSize: 0, // unavailable
1216
- requestedKeyFrames: 0, // unavailable
1217
- transmittedFrameSize: 0, // unavailable
1218
- transmittedHeight: 0,
1219
- transmittedKeyFrames: 0,
1220
- transmittedWidth: 0,
1221
- },
1222
- ],
1223
- },
1224
- intervalMetadata: {
1225
- memoryUsage: {
1226
- cpuBitWidth: 0,
1227
- mainProcessMaximumMemoryBytes: 0,
1228
- osBitWidth: 0,
1229
- processAverageMemoryUsage: 0,
1230
- processMaximumMemoryBytes: 0,
1231
- processMaximumMemoryUsage: 0,
1232
- systemAverageMemoryUsage: 0,
1233
- systemMaximumMemoryUsage: 0,
1234
- },
1235
- peerReflexiveIP: 'NULL', // TODO: save after ice trickling completes and use as a global variable
1236
- processAverageCPU: 0,
1237
- processMaximumCPU: 0,
1238
- systemAverageCPU: 0,
1239
- systemMaximumCPU: 0,
1240
- },
1241
- };
1242
-
1243
1176
  // ****** MEDIA QUALITY CONSTANTS ****** //
1244
1177
 
1245
1178
  // these values must match allowed values of RemoteQualityLevel from the @webex/internal-media-core lib
@@ -12,6 +12,8 @@ enum Control {
12
12
  shareControl = 'shareControl',
13
13
  video = 'video',
14
14
  viewTheParticipantList = 'viewTheParticipantList',
15
+ annotation = 'annotation',
16
+ rdc = 'rdc',
15
17
  }
16
18
 
17
19
  export {Control, Setting};
@@ -40,13 +40,23 @@ export interface ViewTheParticipantListProperties {
40
40
  attendeeCount?: boolean;
41
41
  }
42
42
 
43
+ export interface AnnotationProperties {
44
+ enabled?: boolean;
45
+ }
46
+
47
+ export interface RemoteDesktopControlProperties {
48
+ enabled?: boolean;
49
+ }
50
+
43
51
  export type Properties =
44
52
  | AudioProperties
45
53
  | RaiseHandProperties
46
54
  | ReactionsProperties
47
55
  | ShareControlProperties
48
56
  | VideoProperties
49
- | ViewTheParticipantListProperties;
57
+ | ViewTheParticipantListProperties
58
+ | AnnotationProperties
59
+ | RemoteDesktopControlProperties;
50
60
 
51
61
  export interface ControlConfig<Props = Properties> {
52
62
  /**
@@ -7,6 +7,8 @@ import {
7
7
  ReactionsProperties,
8
8
  ViewTheParticipantListProperties,
9
9
  VideoProperties,
10
+ type RemoteDesktopControlProperties,
11
+ type AnnotationProperties,
10
12
  } from './types';
11
13
 
12
14
  /**
@@ -256,6 +258,52 @@ class Utils {
256
258
  return Utils.hasHints({requiredHints, displayHints});
257
259
  }
258
260
 
261
+ /**
262
+ * Validate if a annotation-scoped control is allowed to be sent to the service.
263
+ *
264
+ * @param {ControlConfig<AnnotationProperties>} control - Annotation control config to validate
265
+ * @param {Array<string>} displayHints - All available hints
266
+ * @returns {boolean} - True if all of the actions are allowed.
267
+ */
268
+ public static canUpdateAnnotation(
269
+ control: ControlConfig<AnnotationProperties>,
270
+ displayHints: Array<string>
271
+ ): boolean {
272
+ const requiredHints = [];
273
+
274
+ if (control.properties.enabled === true) {
275
+ requiredHints.push(DISPLAY_HINTS.ENABLE_ANNOTATION_MEETING_OPTION);
276
+ }
277
+ if (control.properties.enabled === false) {
278
+ requiredHints.push(DISPLAY_HINTS.DISABLE_ANNOTATION_MEETING_OPTION);
279
+ }
280
+
281
+ return Utils.hasHints({requiredHints, displayHints});
282
+ }
283
+
284
+ /**
285
+ * Validate if a rdc-scoped control is allowed to be sent to the service.
286
+ *
287
+ * @param {ControlConfig<RemoteDesktopControlProperties>} control - Remote Desktop Control config to validate
288
+ * @param {Array<string>} displayHints - All available hints
289
+ * @returns {boolean} - True if all of the actions are allowed.
290
+ */
291
+ public static canUpdateRemoteDesktopControl(
292
+ control: ControlConfig<RemoteDesktopControlProperties>,
293
+ displayHints: Array<string>
294
+ ): boolean {
295
+ const requiredHints = [];
296
+
297
+ if (control.properties.enabled === true) {
298
+ requiredHints.push(DISPLAY_HINTS.ENABLE_RDC_MEETING_OPTION);
299
+ }
300
+ if (control.properties.enabled === false) {
301
+ requiredHints.push(DISPLAY_HINTS.DISABLE_RDC_MEETING_OPTION);
302
+ }
303
+
304
+ return Utils.hasHints({requiredHints, displayHints});
305
+ }
306
+
259
307
  /**
260
308
  * Validate that a control can be sent to the service based on the provided
261
309
  * display hints.
@@ -301,6 +349,20 @@ class Utils {
301
349
  );
302
350
  break;
303
351
 
352
+ case Control.annotation:
353
+ determinant = Utils.canUpdateAnnotation(
354
+ control as ControlConfig<AnnotationProperties>,
355
+ displayHints
356
+ );
357
+ break;
358
+
359
+ case Control.rdc:
360
+ determinant = Utils.canUpdateRemoteDesktopControl(
361
+ control as ControlConfig<RemoteDesktopControlProperties>,
362
+ displayHints
363
+ );
364
+ break;
365
+
304
366
  default:
305
367
  determinant = false;
306
368
  }
@@ -1,5 +1,5 @@
1
1
  import {isEqual} from 'lodash';
2
- import {BREAKOUTS} from '../constants';
2
+ import {BREAKOUTS, MEETING_STATE} from '../constants';
3
3
 
4
4
  const ControlsUtils: any = {};
5
5
 
@@ -40,6 +40,7 @@ ControlsUtils.parse = (controls: any) => {
40
40
  parsedControls.transcribe = {
41
41
  transcribing: controls.transcribe.transcribing,
42
42
  caption: controls.transcribe.caption,
43
+ spokenLanguage: controls.transcribe.spokenLanguage,
43
44
  };
44
45
  }
45
46
 
@@ -111,6 +112,18 @@ ControlsUtils.parse = (controls: any) => {
111
112
  };
112
113
  }
113
114
 
115
+ if (controls?.annotationControl) {
116
+ parsedControls.annotationControl = {
117
+ enabled: controls.annotationControl.enabled,
118
+ };
119
+ }
120
+
121
+ if (controls?.rdcControl) {
122
+ parsedControls.rdcControl = {
123
+ enabled: controls.rdcControl.enabled,
124
+ };
125
+ }
126
+
114
127
  return parsedControls;
115
128
  };
116
129
 
@@ -174,6 +187,11 @@ ControlsUtils.getControls = (oldControls: any, newControls: any) => {
174
187
  !isEqual(previous?.transcribe?.transcribing, current?.transcribe?.transcribing) && // upon first join, previous?.record?.recording = undefined; thus, never going to be equal and will always return true
175
188
  (previous?.transcribe?.transcribing || current?.transcribe?.transcribing), // therefore, condition added to prevent false firings of #meeting:recording:stopped upon first joining a meeting
176
189
 
190
+ hasTranscribeSpokenLanguageChanged:
191
+ current?.transcribe &&
192
+ !isEqual(previous?.transcribe?.spokenLanguage, current?.transcribe?.spokenLanguage) &&
193
+ !!(previous?.transcribe?.spokenLanguage || current?.transcribe?.spokenLanguage),
194
+
177
195
  hasManualCaptionChanged:
178
196
  current?.manualCaptionControl &&
179
197
  !isEqual(previous?.manualCaptionControl?.enabled, current?.manualCaptionControl?.enabled) &&
@@ -211,6 +229,12 @@ ControlsUtils.getControls = (oldControls: any, newControls: any) => {
211
229
  ),
212
230
 
213
231
  hasStageViewChanged: !isEqual(previous?.videoLayout, current?.videoLayout),
232
+
233
+ hasAnnotationControlChanged:
234
+ current?.annotationControl?.enabled !== previous?.annotationControl?.enabled,
235
+
236
+ hasRemoteDesktopControlChanged:
237
+ current?.rdcControl?.enabled !== previous?.rdcControl?.enabled,
214
238
  },
215
239
  };
216
240
  };
@@ -242,30 +266,42 @@ ControlsUtils.isNeedReplaceMembers = (oldControls: any, controls: any) => {
242
266
  }
243
267
 
244
268
  return (
245
- oldControls.breakout.groupId !== controls.breakout.groupId ||
246
- oldControls.breakout.sessionId !== controls.breakout.sessionId
269
+ oldControls?.breakout?.groupId !== controls?.breakout?.groupId ||
270
+ oldControls?.breakout?.sessionId !== controls?.breakout?.sessionId
247
271
  );
248
272
  };
249
273
 
250
274
  /**
251
275
  * determine the switch status between breakout session and main session.
252
- * @param {LocusControls} oldControls
253
- * @param {LocusControls} controls
276
+ * @param {LocusInfo} oldLocus
277
+ * @param {LocusInfo} newLocus
254
278
  * @returns {Object}
255
279
  */
256
- ControlsUtils.getSessionSwitchStatus = (oldControls: any, controls: any) => {
280
+ ControlsUtils.getSessionSwitchStatus = (oldLocus: any, newLocus: any) => {
257
281
  const status = {isReturnToMain: false, isJoinToBreakout: false};
258
282
  // no breakout case
259
- if (!oldControls?.breakout || !controls?.breakout) {
283
+ if (!oldLocus.controls?.breakout || !newLocus.controls?.breakout) {
260
284
  return status;
261
285
  }
262
286
 
263
- status.isReturnToMain =
264
- oldControls.breakout.sessionType === BREAKOUTS.SESSION_TYPES.BREAKOUT &&
265
- controls.breakout.sessionType === BREAKOUTS.SESSION_TYPES.MAIN;
287
+ // It is used to fix the timing issue triggered when the creator leaves session to ensure that the member list is complete
288
+ const needUseCache = !!(
289
+ oldLocus.self?.isCreator &&
290
+ newLocus.participants?.length === 1 &&
291
+ newLocus.participants?.[0].isCreator &&
292
+ newLocus.participants?.[0].state === MEETING_STATE.STATES.JOINED &&
293
+ newLocus.controls?.breakout?.sessionType === BREAKOUTS.SESSION_TYPES.MAIN &&
294
+ newLocus.controls?.breakout?.groups?.length
295
+ );
296
+
297
+ const isReturnToMain =
298
+ oldLocus.controls.breakout.sessionType === BREAKOUTS.SESSION_TYPES.BREAKOUT &&
299
+ newLocus.controls.breakout.sessionType === BREAKOUTS.SESSION_TYPES.MAIN;
300
+
301
+ status.isReturnToMain = needUseCache || isReturnToMain;
266
302
  status.isJoinToBreakout =
267
- oldControls.breakout.sessionType === BREAKOUTS.SESSION_TYPES.MAIN &&
268
- controls.breakout.sessionType === BREAKOUTS.SESSION_TYPES.BREAKOUT;
303
+ oldLocus.controls.breakout.sessionType === BREAKOUTS.SESSION_TYPES.MAIN &&
304
+ newLocus.controls.breakout.sessionType === BREAKOUTS.SESSION_TYPES.BREAKOUT;
269
305
 
270
306
  return status;
271
307
  };