@webex/plugin-meetings 3.6.0 → 3.7.0-next.2

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 (314) 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 +50 -0
  5. package/dist/common/errors/webinar-registration-error.js.map +1 -0
  6. package/dist/config.js +4 -1
  7. package/dist/config.js.map +1 -1
  8. package/dist/constants.js +31 -2
  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 -0
  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/locus-info/parser.js +5 -1
  28. package/dist/locus-info/parser.js.map +1 -1
  29. package/dist/meeting/in-meeting-actions.js +19 -1
  30. package/dist/meeting/in-meeting-actions.js.map +1 -1
  31. package/dist/meeting/index.js +762 -528
  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/muteState.js +5 -2
  36. package/dist/meeting/muteState.js.map +1 -1
  37. package/dist/meeting/request.js +21 -29
  38. package/dist/meeting/request.js.map +1 -1
  39. package/dist/meeting/util.js +98 -61
  40. package/dist/meeting/util.js.map +1 -1
  41. package/dist/meeting-info/meeting-info-v2.js +68 -17
  42. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  43. package/dist/meetings/index.js +25 -1
  44. package/dist/meetings/index.js.map +1 -1
  45. package/dist/members/index.js +3 -2
  46. package/dist/members/index.js.map +1 -1
  47. package/dist/members/util.js +9 -5
  48. package/dist/members/util.js.map +1 -1
  49. package/dist/metrics/constants.js +2 -1
  50. package/dist/metrics/constants.js.map +1 -1
  51. package/dist/multistream/remoteMedia.js +4 -0
  52. package/dist/multistream/remoteMedia.js.map +1 -1
  53. package/dist/reachability/clusterReachability.js +0 -4
  54. package/dist/reachability/clusterReachability.js.map +1 -1
  55. package/dist/reachability/index.js +433 -136
  56. package/dist/reachability/index.js.map +1 -1
  57. package/dist/{rtcMetrics/constants.js → reachability/reachability.types.js} +1 -5
  58. package/dist/reachability/reachability.types.js.map +1 -0
  59. package/dist/reachability/request.js +23 -9
  60. package/dist/reachability/request.js.map +1 -1
  61. package/dist/roap/index.js +5 -7
  62. package/dist/roap/index.js.map +1 -1
  63. package/dist/roap/request.js +45 -79
  64. package/dist/roap/request.js.map +1 -1
  65. package/dist/roap/turnDiscovery.js +3 -6
  66. package/dist/roap/turnDiscovery.js.map +1 -1
  67. package/dist/{common/errors/parameter.d.ts → types/common/errors/webinar-registration-error.d.ts} +4 -5
  68. package/dist/types/config.d.ts +3 -0
  69. package/dist/types/constants.d.ts +25 -0
  70. package/dist/types/controls-options-manager/enums.d.ts +2 -1
  71. package/dist/types/controls-options-manager/index.d.ts +2 -1
  72. package/dist/types/controls-options-manager/types.d.ts +2 -0
  73. package/dist/types/index.d.ts +2 -1
  74. package/dist/types/locus-info/index.d.ts +9 -0
  75. package/dist/types/meeting/in-meeting-actions.d.ts +18 -0
  76. package/dist/types/meeting/index.d.ts +33 -3
  77. package/dist/types/meeting/locusMediaRequest.d.ts +2 -3
  78. package/dist/types/meeting/muteState.d.ts +2 -1
  79. package/dist/types/meeting/request.d.ts +2 -2
  80. package/dist/types/meeting/util.d.ts +2 -2
  81. package/dist/types/meeting-info/meeting-info-v2.d.ts +23 -0
  82. package/dist/types/meetings/index.d.ts +10 -1
  83. package/dist/types/members/index.d.ts +2 -1
  84. package/dist/types/members/util.d.ts +3 -1
  85. package/dist/types/metrics/constants.d.ts +1 -0
  86. package/dist/types/multistream/remoteMedia.d.ts +1 -0
  87. package/dist/types/reachability/clusterReachability.d.ts +1 -10
  88. package/dist/types/reachability/index.d.ts +74 -35
  89. package/dist/types/reachability/reachability.types.d.ts +64 -0
  90. package/dist/types/reachability/request.d.ts +5 -1
  91. package/dist/types/roap/request.d.ts +1 -13
  92. package/dist/webinar/index.js +32 -19
  93. package/dist/webinar/index.js.map +1 -1
  94. package/package.json +22 -22
  95. package/src/common/errors/webinar-registration-error.ts +27 -0
  96. package/src/config.ts +3 -0
  97. package/src/constants.ts +31 -0
  98. package/src/controls-options-manager/enums.ts +1 -0
  99. package/src/controls-options-manager/index.ts +19 -2
  100. package/src/controls-options-manager/types.ts +2 -0
  101. package/src/controls-options-manager/util.ts +12 -0
  102. package/src/index.ts +2 -0
  103. package/src/locus-info/controlsUtils.ts +46 -2
  104. package/src/locus-info/fullState.ts +1 -0
  105. package/src/locus-info/index.ts +60 -0
  106. package/src/locus-info/parser.ts +8 -1
  107. package/src/meeting/in-meeting-actions.ts +37 -0
  108. package/src/meeting/index.ts +219 -22
  109. package/src/meeting/locusMediaRequest.ts +4 -8
  110. package/src/meeting/muteState.ts +6 -2
  111. package/src/meeting/request.ts +4 -11
  112. package/src/meeting/util.ts +31 -6
  113. package/src/meeting-info/meeting-info-v2.ts +51 -0
  114. package/src/meetings/index.ts +68 -40
  115. package/src/members/index.ts +4 -2
  116. package/src/members/util.ts +3 -1
  117. package/src/metrics/constants.ts +1 -0
  118. package/src/multistream/remoteMedia.ts +5 -0
  119. package/src/reachability/clusterReachability.ts +1 -14
  120. package/src/reachability/index.ts +285 -77
  121. package/src/reachability/reachability.types.ts +85 -0
  122. package/src/reachability/request.ts +55 -30
  123. package/src/roap/index.ts +4 -5
  124. package/src/roap/request.ts +32 -44
  125. package/src/roap/turnDiscovery.ts +2 -4
  126. package/src/webinar/index.ts +31 -17
  127. package/test/unit/spec/controls-options-manager/index.js +56 -32
  128. package/test/unit/spec/controls-options-manager/util.js +44 -0
  129. package/test/unit/spec/locus-info/controlsUtils.js +80 -4
  130. package/test/unit/spec/locus-info/index.js +88 -2
  131. package/test/unit/spec/meeting/in-meeting-actions.ts +18 -0
  132. package/test/unit/spec/meeting/index.js +329 -82
  133. package/test/unit/spec/meeting/locusMediaRequest.ts +18 -11
  134. package/test/unit/spec/meeting/muteState.js +8 -4
  135. package/test/unit/spec/meeting/request.js +3 -26
  136. package/test/unit/spec/meeting/utils.js +71 -14
  137. package/test/unit/spec/meeting-info/meetinginfov2.js +37 -0
  138. package/test/unit/spec/meetings/index.js +32 -1
  139. package/test/unit/spec/members/index.js +25 -2
  140. package/test/unit/spec/members/request.js +37 -3
  141. package/test/unit/spec/members/utils.js +15 -1
  142. package/test/unit/spec/multistream/remoteMedia.ts +16 -2
  143. package/test/unit/spec/reachability/index.ts +265 -1
  144. package/test/unit/spec/reachability/request.js +56 -15
  145. package/test/unit/spec/roap/index.ts +1 -1
  146. package/test/unit/spec/roap/request.ts +51 -109
  147. package/test/unit/spec/roap/turnDiscovery.ts +202 -147
  148. package/test/unit/spec/webinar/index.ts +82 -16
  149. package/dist/annotation/annotation.types.d.ts +0 -42
  150. package/dist/annotation/constants.d.ts +0 -31
  151. package/dist/annotation/index.d.ts +0 -117
  152. package/dist/breakouts/breakout.d.ts +0 -8
  153. package/dist/breakouts/collection.d.ts +0 -5
  154. package/dist/breakouts/edit-lock-error.d.ts +0 -15
  155. package/dist/breakouts/events.d.ts +0 -8
  156. package/dist/breakouts/index.d.ts +0 -5
  157. package/dist/breakouts/request.d.ts +0 -22
  158. package/dist/breakouts/utils.d.ts +0 -15
  159. package/dist/common/browser-detection.d.ts +0 -9
  160. package/dist/common/collection.d.ts +0 -48
  161. package/dist/common/config.d.ts +0 -2
  162. package/dist/common/errors/captcha-error.d.ts +0 -15
  163. package/dist/common/errors/intent-to-join.d.ts +0 -16
  164. package/dist/common/errors/join-meeting.d.ts +0 -17
  165. package/dist/common/errors/media.d.ts +0 -15
  166. package/dist/common/errors/no-meeting-info.d.ts +0 -14
  167. package/dist/common/errors/password-error.d.ts +0 -15
  168. package/dist/common/errors/permission.d.ts +0 -14
  169. package/dist/common/errors/reclaim-host-role-error.js +0 -149
  170. package/dist/common/errors/reclaim-host-role-error.js.map +0 -1
  171. package/dist/common/errors/reclaim-host-role-errors.d.ts +0 -60
  172. package/dist/common/errors/reconnection-in-progress.d.ts +0 -9
  173. package/dist/common/errors/reconnection-in-progress.js +0 -33
  174. package/dist/common/errors/reconnection-in-progress.js.map +0 -1
  175. package/dist/common/errors/reconnection.d.ts +0 -15
  176. package/dist/common/errors/stats.d.ts +0 -15
  177. package/dist/common/errors/webex-errors.d.ts +0 -93
  178. package/dist/common/errors/webex-meetings-error.d.ts +0 -20
  179. package/dist/common/events/events-scope.d.ts +0 -17
  180. package/dist/common/events/events.d.ts +0 -12
  181. package/dist/common/events/trigger-proxy.d.ts +0 -2
  182. package/dist/common/events/util.d.ts +0 -2
  183. package/dist/common/logs/logger-config.d.ts +0 -2
  184. package/dist/common/logs/logger-proxy.d.ts +0 -2
  185. package/dist/common/logs/request.d.ts +0 -36
  186. package/dist/common/queue.d.ts +0 -34
  187. package/dist/config.d.ts +0 -72
  188. package/dist/constants.d.ts +0 -1088
  189. package/dist/controls-options-manager/constants.d.ts +0 -4
  190. package/dist/controls-options-manager/enums.d.ts +0 -15
  191. package/dist/controls-options-manager/index.d.ts +0 -136
  192. package/dist/controls-options-manager/types.d.ts +0 -43
  193. package/dist/controls-options-manager/util.d.ts +0 -1
  194. package/dist/index.d.ts +0 -7
  195. package/dist/interceptors/index.d.ts +0 -2
  196. package/dist/interceptors/locusRetry.d.ts +0 -27
  197. package/dist/interpretation/collection.d.ts +0 -5
  198. package/dist/interpretation/index.d.ts +0 -5
  199. package/dist/interpretation/siLanguage.d.ts +0 -5
  200. package/dist/locus-info/controlsUtils.d.ts +0 -2
  201. package/dist/locus-info/embeddedAppsUtils.d.ts +0 -2
  202. package/dist/locus-info/fullState.d.ts +0 -2
  203. package/dist/locus-info/hostUtils.d.ts +0 -2
  204. package/dist/locus-info/index.d.ts +0 -322
  205. package/dist/locus-info/infoUtils.d.ts +0 -2
  206. package/dist/locus-info/mediaSharesUtils.d.ts +0 -2
  207. package/dist/locus-info/parser.d.ts +0 -272
  208. package/dist/locus-info/selfUtils.d.ts +0 -2
  209. package/dist/media/index.d.ts +0 -34
  210. package/dist/media/properties.d.ts +0 -93
  211. package/dist/media/util.d.ts +0 -2
  212. package/dist/mediaQualityMetrics/config.d.ts +0 -241
  213. package/dist/mediaQualityMetrics/config.js +0 -502
  214. package/dist/mediaQualityMetrics/config.js.map +0 -1
  215. package/dist/meeting/effectsState.js +0 -260
  216. package/dist/meeting/effectsState.js.map +0 -1
  217. package/dist/meeting/in-meeting-actions.d.ts +0 -167
  218. package/dist/meeting/index.d.ts +0 -1825
  219. package/dist/meeting/locusMediaRequest.d.ts +0 -74
  220. package/dist/meeting/muteState.d.ts +0 -178
  221. package/dist/meeting/request.d.ts +0 -295
  222. package/dist/meeting/request.type.d.ts +0 -11
  223. package/dist/meeting/state.d.ts +0 -9
  224. package/dist/meeting/util.d.ts +0 -119
  225. package/dist/meeting/voicea-meeting.d.ts +0 -16
  226. package/dist/meeting-info/collection.d.ts +0 -20
  227. package/dist/meeting-info/index.d.ts +0 -69
  228. package/dist/meeting-info/meeting-info-v2.d.ts +0 -123
  229. package/dist/meeting-info/request.d.ts +0 -22
  230. package/dist/meeting-info/util.d.ts +0 -2
  231. package/dist/meeting-info/utilv2.d.ts +0 -2
  232. package/dist/meetings/collection.d.ts +0 -40
  233. package/dist/meetings/index.d.ts +0 -390
  234. package/dist/meetings/meetings.types.d.ts +0 -4
  235. package/dist/meetings/request.d.ts +0 -27
  236. package/dist/meetings/util.d.ts +0 -18
  237. package/dist/member/index.d.ts +0 -160
  238. package/dist/member/member.types.js +0 -17
  239. package/dist/member/member.types.js.map +0 -1
  240. package/dist/member/types.d.ts +0 -32
  241. package/dist/member/util.d.ts +0 -2
  242. package/dist/members/collection.d.ts +0 -29
  243. package/dist/members/index.d.ts +0 -353
  244. package/dist/members/request.d.ts +0 -114
  245. package/dist/members/types.d.ts +0 -25
  246. package/dist/members/util.d.ts +0 -215
  247. package/dist/metrics/config.js +0 -276
  248. package/dist/metrics/config.js.map +0 -1
  249. package/dist/metrics/constants.d.ts +0 -70
  250. package/dist/metrics/index.d.ts +0 -45
  251. package/dist/multistream/mediaRequestManager.d.ts +0 -119
  252. package/dist/multistream/receiveSlot.d.ts +0 -68
  253. package/dist/multistream/receiveSlotManager.d.ts +0 -56
  254. package/dist/multistream/remoteMedia.d.ts +0 -72
  255. package/dist/multistream/remoteMediaGroup.d.ts +0 -49
  256. package/dist/multistream/remoteMediaManager.d.ts +0 -300
  257. package/dist/multistream/sendSlotManager.d.ts +0 -69
  258. package/dist/networkQualityMonitor/index.d.ts +0 -70
  259. package/dist/networkQualityMonitor/index.js +0 -221
  260. package/dist/networkQualityMonitor/index.js.map +0 -1
  261. package/dist/peer-connection-manager/index.js +0 -671
  262. package/dist/peer-connection-manager/index.js.map +0 -1
  263. package/dist/peer-connection-manager/util.js +0 -109
  264. package/dist/peer-connection-manager/util.js.map +0 -1
  265. package/dist/personal-meeting-room/index.d.ts +0 -47
  266. package/dist/personal-meeting-room/request.d.ts +0 -14
  267. package/dist/personal-meeting-room/util.d.ts +0 -2
  268. package/dist/reachability/clusterReachability.d.ts +0 -109
  269. package/dist/reachability/index.d.ts +0 -105
  270. package/dist/reachability/request.d.ts +0 -39
  271. package/dist/reachability/util.d.ts +0 -8
  272. package/dist/reactions/constants.d.ts +0 -3
  273. package/dist/reactions/reactions.d.ts +0 -4
  274. package/dist/reactions/reactions.type.d.ts +0 -52
  275. package/dist/reconnection-manager/index.d.ts +0 -136
  276. package/dist/recording-controller/enums.d.ts +0 -7
  277. package/dist/recording-controller/index.d.ts +0 -207
  278. package/dist/recording-controller/util.d.ts +0 -14
  279. package/dist/roap/collection.js +0 -62
  280. package/dist/roap/collection.js.map +0 -1
  281. package/dist/roap/handler.js +0 -275
  282. package/dist/roap/handler.js.map +0 -1
  283. package/dist/roap/index.d.ts +0 -86
  284. package/dist/roap/request.d.ts +0 -39
  285. package/dist/roap/state.js +0 -126
  286. package/dist/roap/state.js.map +0 -1
  287. package/dist/roap/turnDiscovery.d.ts +0 -155
  288. package/dist/roap/util.js +0 -75
  289. package/dist/roap/util.js.map +0 -1
  290. package/dist/rtcMetrics/constants.d.ts +0 -4
  291. package/dist/rtcMetrics/constants.js.map +0 -1
  292. package/dist/rtcMetrics/index.d.ts +0 -61
  293. package/dist/rtcMetrics/index.js +0 -197
  294. package/dist/rtcMetrics/index.js.map +0 -1
  295. package/dist/statsAnalyzer/global.d.ts +0 -36
  296. package/dist/statsAnalyzer/global.js +0 -126
  297. package/dist/statsAnalyzer/global.js.map +0 -1
  298. package/dist/statsAnalyzer/index.d.ts +0 -217
  299. package/dist/statsAnalyzer/index.js +0 -1013
  300. package/dist/statsAnalyzer/index.js.map +0 -1
  301. package/dist/statsAnalyzer/mqaUtil.d.ts +0 -48
  302. package/dist/statsAnalyzer/mqaUtil.js +0 -179
  303. package/dist/statsAnalyzer/mqaUtil.js.map +0 -1
  304. package/dist/transcription/index.d.ts +0 -64
  305. package/dist/types/common/errors/reconnection-in-progress.d.ts +0 -9
  306. package/dist/types/mediaQualityMetrics/config.d.ts +0 -241
  307. package/dist/types/networkQualityMonitor/index.d.ts +0 -70
  308. package/dist/types/rtcMetrics/constants.d.ts +0 -4
  309. package/dist/types/rtcMetrics/index.d.ts +0 -71
  310. package/dist/types/statsAnalyzer/global.d.ts +0 -36
  311. package/dist/types/statsAnalyzer/index.d.ts +0 -217
  312. package/dist/types/statsAnalyzer/mqaUtil.d.ts +0 -48
  313. package/dist/webinar/collection.d.ts +0 -16
  314. package/dist/webinar/index.d.ts +0 -5
@@ -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
@@ -64,6 +65,10 @@ interface IInMeetingActions {
64
65
  canUpdateShareControl?: boolean;
65
66
  canEnableViewTheParticipantsList?: boolean;
66
67
  canDisableViewTheParticipantsList?: boolean;
68
+ canEnableViewTheParticipantsListPanelist?: boolean;
69
+ canDisableViewTheParticipantsListPanelist?: boolean;
70
+ canEnableShowAttendeeCount?: boolean;
71
+ canDisableShowAttendeeCount?: boolean;
67
72
  canEnableRaiseHand?: boolean;
68
73
  canDisableRaiseHand?: boolean;
69
74
  canEnableVideo?: boolean;
@@ -83,6 +88,11 @@ interface IInMeetingActions {
83
88
  canShareWhiteBoard?: boolean;
84
89
  enforceVirtualBackground?: boolean;
85
90
  canPollingAndQA?: boolean;
91
+ canStartWebcast?: boolean;
92
+ canStopWebcast?: boolean;
93
+ canShowStageView?: boolean;
94
+ canEnableStageView?: boolean;
95
+ canDisableStageView?: boolean;
86
96
  }
87
97
 
88
98
  /**
@@ -201,6 +211,14 @@ export default class InMeetingActions implements IInMeetingActions {
201
211
 
202
212
  canDisableViewTheParticipantsList = null;
203
213
 
214
+ canEnableViewTheParticipantsListPanelist = null;
215
+
216
+ canDisableViewTheParticipantsListPanelist = null;
217
+
218
+ canEnableShowAttendeeCount = null;
219
+
220
+ canDisableShowAttendeeCount = null;
221
+
204
222
  canEnableRaiseHand = null;
205
223
 
206
224
  canDisableRaiseHand = null;
@@ -238,6 +256,16 @@ export default class InMeetingActions implements IInMeetingActions {
238
256
  canShareWhiteBoard = null;
239
257
 
240
258
  canPollingAndQA = null;
259
+
260
+ canStartWebcast = null;
261
+
262
+ canStopWebcast = null;
263
+
264
+ canShowStageView = null;
265
+
266
+ canEnableStageView = null;
267
+
268
+ canDisableStageView = null;
241
269
  /**
242
270
  * Returns all meeting action options
243
271
  * @returns {Object}
@@ -298,6 +326,10 @@ export default class InMeetingActions implements IInMeetingActions {
298
326
  canUpdateShareControl: this.canUpdateShareControl,
299
327
  canEnableViewTheParticipantsList: this.canEnableViewTheParticipantsList,
300
328
  canDisableViewTheParticipantsList: this.canDisableViewTheParticipantsList,
329
+ canEnableViewTheParticipantsListPanelist: this.canEnableViewTheParticipantsListPanelist,
330
+ canDisableViewTheParticipantsListPanelist: this.canDisableViewTheParticipantsListPanelist,
331
+ canEnableShowAttendeeCount: this.canEnableShowAttendeeCount,
332
+ canDisableShowAttendeeCount: this.canDisableShowAttendeeCount,
301
333
  canEnableRaiseHand: this.canEnableRaiseHand,
302
334
  canDisableRaiseHand: this.canDisableRaiseHand,
303
335
  canEnableVideo: this.canEnableVideo,
@@ -317,6 +349,11 @@ export default class InMeetingActions implements IInMeetingActions {
317
349
  supportHDV: this.supportHDV,
318
350
  canShareWhiteBoard: this.canShareWhiteBoard,
319
351
  canPollingAndQA: this.canPollingAndQA,
352
+ canStartWebcast: this.canStartWebcast,
353
+ canStopWebcast: this.canStopWebcast,
354
+ canShowStageView: this.canShowStageView,
355
+ canEnableStageView: this.canEnableStageView,
356
+ canDisableStageView: this.canDisableStageView,
320
357
  });
321
358
 
322
359
  /**
@@ -5,6 +5,7 @@ import jwtDecode from 'jwt-decode';
5
5
  import {StatelessWebexPlugin} from '@webex/webex-core';
6
6
  // @ts-ignore - Types not available for @webex/common
7
7
  import {Defer} from '@webex/common';
8
+ import {safeSetTimeout, safeSetInterval} from '@webex/common-timers';
8
9
  import {
9
10
  ClientEvent,
10
11
  ClientEventLeaveReason,
@@ -128,6 +129,7 @@ import {
128
129
  MeetingInfoV2PasswordError,
129
130
  MeetingInfoV2CaptchaError,
130
131
  MeetingInfoV2PolicyError,
132
+ MeetingInfoV2WebinarRegistrationError,
131
133
  } from '../meeting-info/meeting-info-v2';
132
134
  import {CSI, ReceiveSlotManager} from '../multistream/receiveSlotManager';
133
135
  import SendSlotManager from '../multistream/sendSlotManager';
@@ -156,6 +158,7 @@ import ControlsOptionsManager from '../controls-options-manager';
156
158
  import PermissionError from '../common/errors/permission';
157
159
  import {LocusMediaRequest} from './locusMediaRequest';
158
160
  import {ConnectionStateHandler, ConnectionStateEvent} from './connectionStateHandler';
161
+ import WebinarRegistrationError from '../common/errors/webinar-registration-error';
159
162
 
160
163
  // default callback so we don't call an undefined function, but in practice it should never be used
161
164
  const DEFAULT_ICE_PHASE_CALLBACK = () => 'JOIN_MEETING_FINAL';
@@ -700,6 +703,8 @@ export default class Meeting extends StatelessWebexPlugin {
700
703
  private iceCandidateErrors: Map<string, number>;
701
704
  private iceCandidatesCount: number;
702
705
  private rtcMetrics?: RtcMetrics;
706
+ private uploadLogsTimer?: ReturnType<typeof setTimeout>;
707
+ private logUploadIntervalIndex: number;
703
708
 
704
709
  /**
705
710
  * @param {Object} attrs
@@ -768,6 +773,8 @@ export default class Meeting extends StatelessWebexPlugin {
768
773
  );
769
774
  this.callStateForMetrics.correlationId = this.id;
770
775
  }
776
+ this.logUploadIntervalIndex = 0;
777
+
771
778
  /**
772
779
  * @instance
773
780
  * @type {String}
@@ -1759,8 +1766,16 @@ export default class Meeting extends StatelessWebexPlugin {
1759
1766
  if (err.meetingInfo) {
1760
1767
  this.meetingInfo = err.meetingInfo;
1761
1768
  }
1762
-
1763
1769
  throw new PermissionError();
1770
+ } else if (err instanceof MeetingInfoV2WebinarRegistrationError) {
1771
+ this.meetingInfoFailureReason = MEETING_INFO_FAILURE_REASON.WEBINAR_REGISTRATION;
1772
+ this.meetingInfoFailureCode = err.wbxAppApiCode;
1773
+
1774
+ if (err.meetingInfo) {
1775
+ this.meetingInfo = err.meetingInfo;
1776
+ }
1777
+
1778
+ throw new WebinarRegistrationError();
1764
1779
  } else if (err instanceof MeetingInfoV2PasswordError) {
1765
1780
  LoggerProxy.logger.info(
1766
1781
  // @ts-ignore
@@ -2004,6 +2019,7 @@ export default class Meeting extends StatelessWebexPlugin {
2004
2019
  this.setUpLocusInfoSelfListener();
2005
2020
  this.setUpLocusInfoMeetingListener();
2006
2021
  this.setUpLocusServicesListener();
2022
+ this.setUpLocusResourcesListener();
2007
2023
  // members update listeners
2008
2024
  this.setUpLocusFullStateListener();
2009
2025
  this.setUpLocusUrlListener();
@@ -2625,6 +2641,42 @@ export default class Meeting extends StatelessWebexPlugin {
2625
2641
  );
2626
2642
  });
2627
2643
 
2644
+ this.locusInfo.on(LOCUSINFO.EVENTS.CONTROLS_WEBCAST_CHANGED, ({state}) => {
2645
+ Trigger.trigger(
2646
+ this,
2647
+ {file: 'meeting/index', function: 'setupLocusControlsListener'},
2648
+ EVENT_TRIGGERS.MEETING_CONTROLS_WEBCAST_UPDATED,
2649
+ {state}
2650
+ );
2651
+ });
2652
+
2653
+ this.locusInfo.on(LOCUSINFO.EVENTS.CONTROLS_MEETING_FULL_CHANGED, ({state}) => {
2654
+ Trigger.trigger(
2655
+ this,
2656
+ {file: 'meeting/index', function: 'setupLocusControlsListener'},
2657
+ EVENT_TRIGGERS.MEETING_CONTROLS_MEETING_FULL_UPDATED,
2658
+ {state}
2659
+ );
2660
+ });
2661
+
2662
+ this.locusInfo.on(LOCUSINFO.EVENTS.CONTROLS_PRACTICE_SESSION_STATUS_UPDATED, ({state}) => {
2663
+ Trigger.trigger(
2664
+ this,
2665
+ {file: 'meeting/index', function: 'setupLocusControlsListener'},
2666
+ EVENT_TRIGGERS.MEETING_CONTROLS_PRACTICE_SESSION_STATUS_UPDATED,
2667
+ {state}
2668
+ );
2669
+ });
2670
+
2671
+ this.locusInfo.on(LOCUSINFO.EVENTS.CONTROLS_STAGE_VIEW_UPDATED, ({state}) => {
2672
+ Trigger.trigger(
2673
+ this,
2674
+ {file: 'meeting/index', function: 'setupLocusControlsListener'},
2675
+ EVENT_TRIGGERS.MEETING_CONTROLS_STAGE_VIEW_UPDATED,
2676
+ {state}
2677
+ );
2678
+ });
2679
+
2628
2680
  this.locusInfo.on(LOCUSINFO.EVENTS.CONTROLS_VIDEO_CHANGED, ({state}) => {
2629
2681
  Trigger.trigger(
2630
2682
  this,
@@ -2739,6 +2791,9 @@ export default class Meeting extends StatelessWebexPlugin {
2739
2791
  newShareStatus = SHARE_STATUS.NO_SHARE;
2740
2792
  }
2741
2793
 
2794
+ LoggerProxy.logger.info(
2795
+ `Meeting:index#setUpLocusInfoMediaInactiveListener --> this.shareStatus=${this.shareStatus} newShareStatus=${newShareStatus}`
2796
+ );
2742
2797
  if (newShareStatus !== this.shareStatus) {
2743
2798
  const oldShareStatus = this.shareStatus;
2744
2799
 
@@ -2983,10 +3038,20 @@ export default class Meeting extends StatelessWebexPlugin {
2983
3038
  this.breakouts.breakoutServiceUrlUpdate(payload?.services?.breakout?.url);
2984
3039
  this.annotation.approvalUrlUpdate(payload?.services?.approval?.url);
2985
3040
  this.simultaneousInterpretation.approvalUrlUpdate(payload?.services?.approval?.url);
2986
- this.webinar.webcastUrlUpdate(payload?.services?.webcast?.url);
2987
- this.webinar.webinarAttendeesSearchingUrlUpdate(
2988
- payload?.services?.webinarAttendeesSearching?.url
2989
- );
3041
+ });
3042
+ }
3043
+
3044
+ /**
3045
+ * Set up the locus info resources link listener
3046
+ * update the locusInfo for webcast instance url
3047
+ * @param {Object} payload - The event payload
3048
+ * @returns {undefined}
3049
+ * @private
3050
+ * @memberof Meeting
3051
+ */
3052
+ private setUpLocusResourcesListener() {
3053
+ this.locusInfo.on(LOCUSINFO.EVENTS.LINKS_RESOURCES, (payload) => {
3054
+ this.webinar.updateWebcastUrl(payload);
2990
3055
  });
2991
3056
  }
2992
3057
 
@@ -3091,7 +3156,7 @@ export default class Meeting extends StatelessWebexPlugin {
3091
3156
  private setUpLocusInfoSelfListener() {
3092
3157
  this.locusInfo.on(LOCUSINFO.EVENTS.LOCAL_UNMUTE_REQUIRED, (payload) => {
3093
3158
  if (this.audio) {
3094
- this.audio.handleServerLocalUnmuteRequired(this);
3159
+ this.audio.handleServerLocalUnmuteRequired(this, payload.unmuteAllowed);
3095
3160
  Trigger.trigger(
3096
3161
  this,
3097
3162
  {
@@ -3298,7 +3363,7 @@ export default class Meeting extends StatelessWebexPlugin {
3298
3363
  this.simultaneousInterpretation.updateCanManageInterpreters(
3299
3364
  payload.newRoles?.includes(SELF_ROLES.MODERATOR)
3300
3365
  );
3301
- this.webinar.updateCanManageWebcast(payload.newRoles?.includes(SELF_ROLES.MODERATOR));
3366
+ this.webinar.updateRoleChanged(payload);
3302
3367
  Trigger.trigger(
3303
3368
  this,
3304
3369
  {
@@ -3792,6 +3857,22 @@ export default class Meeting extends StatelessWebexPlugin {
3792
3857
  requiredHints: [DISPLAY_HINTS.DISABLE_VIEW_THE_PARTICIPANT_LIST],
3793
3858
  displayHints: this.userDisplayHints,
3794
3859
  }),
3860
+ canEnableViewTheParticipantsListPanelist: ControlsOptionsUtil.hasHints({
3861
+ requiredHints: [DISPLAY_HINTS.ENABLE_VIEW_THE_PARTICIPANT_LIST_PANELIST],
3862
+ displayHints: this.userDisplayHints,
3863
+ }),
3864
+ canDisableViewTheParticipantsListPanelist: ControlsOptionsUtil.hasHints({
3865
+ requiredHints: [DISPLAY_HINTS.DISABLE_VIEW_THE_PARTICIPANT_LIST_PANELIST],
3866
+ displayHints: this.userDisplayHints,
3867
+ }),
3868
+ canEnableShowAttendeeCount: ControlsOptionsUtil.hasHints({
3869
+ requiredHints: [DISPLAY_HINTS.ENABLE_SHOW_ATTENDEE_COUNT],
3870
+ displayHints: this.userDisplayHints,
3871
+ }),
3872
+ canDisableShowAttendeeCount: ControlsOptionsUtil.hasHints({
3873
+ requiredHints: [DISPLAY_HINTS.DISABLE_SHOW_ATTENDEE_COUNT],
3874
+ displayHints: this.userDisplayHints,
3875
+ }),
3795
3876
  canEnableRaiseHand: ControlsOptionsUtil.hasHints({
3796
3877
  requiredHints: [DISPLAY_HINTS.ENABLE_RAISE_HAND],
3797
3878
  displayHints: this.userDisplayHints,
@@ -3808,6 +3889,26 @@ export default class Meeting extends StatelessWebexPlugin {
3808
3889
  requiredHints: [DISPLAY_HINTS.DISABLE_VIDEO],
3809
3890
  displayHints: this.userDisplayHints,
3810
3891
  }),
3892
+ canStartWebcast: ControlsOptionsUtil.hasHints({
3893
+ requiredHints: [DISPLAY_HINTS.WEBCAST_CONTROL_START],
3894
+ displayHints: this.userDisplayHints,
3895
+ }),
3896
+ canStopWebcast: ControlsOptionsUtil.hasHints({
3897
+ requiredHints: [DISPLAY_HINTS.WEBCAST_CONTROL_STOP],
3898
+ displayHints: this.userDisplayHints,
3899
+ }),
3900
+ canShowStageView: ControlsOptionsUtil.hasHints({
3901
+ requiredHints: [DISPLAY_HINTS.STAGE_VIEW_ACTIVE],
3902
+ displayHints: this.userDisplayHints,
3903
+ }),
3904
+ canEnableStageView: ControlsOptionsUtil.hasHints({
3905
+ requiredHints: [DISPLAY_HINTS.ENABLE_STAGE_VIEW],
3906
+ displayHints: this.userDisplayHints,
3907
+ }),
3908
+ canDisableStageView: ControlsOptionsUtil.hasHints({
3909
+ requiredHints: [DISPLAY_HINTS.DISABLE_STAGE_VIEW],
3910
+ displayHints: this.userDisplayHints,
3911
+ }),
3811
3912
  canShareFile:
3812
3913
  (ControlsOptionsUtil.hasHints({
3813
3914
  requiredHints: [DISPLAY_HINTS.SHARE_FILE],
@@ -3964,6 +4065,65 @@ export default class Meeting extends StatelessWebexPlugin {
3964
4065
  Trigger.trigger(this, options, EVENTS.REQUEST_UPLOAD_LOGS, this);
3965
4066
  }
3966
4067
 
4068
+ /**
4069
+ * sets the timer for periodic log upload
4070
+ * @returns {void}
4071
+ */
4072
+ private setLogUploadTimer() {
4073
+ // start with short timeouts and increase them later on so in case users have very long multi-hour meetings we don't get too fragmented logs
4074
+ const LOG_UPLOAD_INTERVALS = [0.1, 1, 15, 15, 30, 30, 30, 60];
4075
+
4076
+ const delay =
4077
+ 1000 *
4078
+ // @ts-ignore - config coming from registerPlugin
4079
+ this.config.logUploadIntervalMultiplicationFactor *
4080
+ LOG_UPLOAD_INTERVALS[this.logUploadIntervalIndex];
4081
+
4082
+ if (this.logUploadIntervalIndex < LOG_UPLOAD_INTERVALS.length - 1) {
4083
+ this.logUploadIntervalIndex += 1;
4084
+ }
4085
+
4086
+ this.uploadLogsTimer = safeSetTimeout(() => {
4087
+ this.uploadLogsTimer = undefined;
4088
+
4089
+ this.uploadLogs();
4090
+
4091
+ // just as an extra precaution, to avoid uploading logs forever in case something goes wrong
4092
+ // and the page remains opened, we stop it if there is no media connection
4093
+ if (!this.mediaProperties.webrtcMediaConnection) {
4094
+ return;
4095
+ }
4096
+
4097
+ this.setLogUploadTimer();
4098
+ }, delay);
4099
+ }
4100
+
4101
+ /**
4102
+ * Starts a periodic upload of logs
4103
+ *
4104
+ * @returns {undefined}
4105
+ */
4106
+ public startPeriodicLogUpload() {
4107
+ // @ts-ignore - config coming from registerPlugin
4108
+ if (this.config.logUploadIntervalMultiplicationFactor && !this.uploadLogsTimer) {
4109
+ this.logUploadIntervalIndex = 0;
4110
+
4111
+ this.setLogUploadTimer();
4112
+ }
4113
+ }
4114
+
4115
+ /**
4116
+ * Stops the periodic upload of logs
4117
+ *
4118
+ * @returns {undefined}
4119
+ */
4120
+ public stopPeriodicLogUpload() {
4121
+ if (this.uploadLogsTimer) {
4122
+ clearTimeout(this.uploadLogsTimer);
4123
+ this.uploadLogsTimer = undefined;
4124
+ }
4125
+ }
4126
+
3967
4127
  /**
3968
4128
  * Removes remote audio, video and share streams from class instance's mediaProperties
3969
4129
  * @returns {undefined}
@@ -4675,8 +4835,6 @@ export default class Meeting extends StatelessWebexPlugin {
4675
4835
  if (!joinResponse) {
4676
4836
  // This is the 1st attempt or a retry after join request failed -> we need to do a join with TURN discovery
4677
4837
 
4678
- // @ts-ignore
4679
- joinOptions.reachability = await this.webex.meetings.reachability.getReachabilityResults();
4680
4838
  const turnDiscoveryRequest = await this.roap.generateTurnDiscoveryRequestMessage(
4681
4839
  this,
4682
4840
  true
@@ -4808,6 +4966,8 @@ export default class Meeting extends StatelessWebexPlugin {
4808
4966
  );
4809
4967
  }
4810
4968
 
4969
+ this.cleanUpBeforeReconnection();
4970
+
4811
4971
  return this.reconnectionManager
4812
4972
  .reconnect(options, async () => {
4813
4973
  await this.waitForRemoteSDPAnswer();
@@ -6225,7 +6385,7 @@ export default class Meeting extends StatelessWebexPlugin {
6225
6385
  this.mediaProperties.webrtcMediaConnection.on(
6226
6386
  MediaConnectionEventNames.ICE_CANDIDATE,
6227
6387
  (event) => {
6228
- if (event.candidate) {
6388
+ if (event.candidate && event.candidate.candidate && event.candidate.candidate.length > 0) {
6229
6389
  this.iceCandidatesCount += 1;
6230
6390
  }
6231
6391
  }
@@ -6936,6 +7096,23 @@ export default class Meeting extends StatelessWebexPlugin {
6936
7096
  }
6937
7097
  }
6938
7098
 
7099
+ private async cleanUpBeforeReconnection(): Promise<void> {
7100
+ try {
7101
+ // when media fails, we want to upload a webrtc dump to see whats going on
7102
+ // this function is async, but returns once the stats have been gathered
7103
+ await this.forceSendStatsReport({callFrom: 'cleanUpBeforeReconnection'});
7104
+
7105
+ if (this.statsAnalyzer) {
7106
+ await this.statsAnalyzer.stopAnalyzer();
7107
+ }
7108
+ } catch (error) {
7109
+ LoggerProxy.logger.error(
7110
+ 'Meeting:index#cleanUpBeforeReconnection --> Error during cleanup: ',
7111
+ error
7112
+ );
7113
+ }
7114
+ }
7115
+
6939
7116
  /**
6940
7117
  * Creates an instance of LocusMediaRequest for this meeting - it is needed for doing any calls
6941
7118
  * to Locus /media API (these are used for sending Roap messages and updating audio/video mute status).
@@ -7027,7 +7204,7 @@ export default class Meeting extends StatelessWebexPlugin {
7027
7204
  shareAudioEnabled = true,
7028
7205
  shareVideoEnabled = true,
7029
7206
  remoteMediaManagerConfig,
7030
- bundlePolicy,
7207
+ bundlePolicy = 'max-bundle',
7031
7208
  } = options;
7032
7209
 
7033
7210
  this.allowMediaInLobby = options?.allowMediaInLobby;
@@ -7132,6 +7309,7 @@ export default class Meeting extends StatelessWebexPlugin {
7132
7309
 
7133
7310
  // We can log ReceiveSlot SSRCs only after the SDP exchange, so doing it here:
7134
7311
  this.remoteMediaManager?.logAllReceiveSlots();
7312
+ this.startPeriodicLogUpload();
7135
7313
  } catch (error) {
7136
7314
  LoggerProxy.logger.error(`${LOG_HEADER} failed to establish media connection: `, error);
7137
7315
 
@@ -7914,18 +8092,21 @@ export default class Meeting extends StatelessWebexPlugin {
7914
8092
  * @param {boolean} mutedEnabled
7915
8093
  * @param {boolean} disallowUnmuteEnabled
7916
8094
  * @param {boolean} muteOnEntryEnabled
8095
+ * @param {array} roles
7917
8096
  * @public
7918
8097
  * @memberof Meeting
7919
8098
  */
7920
8099
  public setMuteAll(
7921
8100
  mutedEnabled: boolean,
7922
8101
  disallowUnmuteEnabled: boolean,
7923
- muteOnEntryEnabled: boolean
8102
+ muteOnEntryEnabled: boolean,
8103
+ roles: Array<string>
7924
8104
  ) {
7925
8105
  return this.controlsOptionsManager.setMuteAll(
7926
8106
  mutedEnabled,
7927
8107
  disallowUnmuteEnabled,
7928
- muteOnEntryEnabled
8108
+ muteOnEntryEnabled,
8109
+ roles
7929
8110
  );
7930
8111
  }
7931
8112
 
@@ -8182,6 +8363,9 @@ export default class Meeting extends StatelessWebexPlugin {
8182
8363
  * @returns {undefined}
8183
8364
  */
8184
8365
  private handleShareAudioStreamEnded = async () => {
8366
+ LoggerProxy.logger.info(
8367
+ `Meeting:index#handleShareAudioStreamEnded --> audio share stream ended`
8368
+ );
8185
8369
  // current share audio stream has ended, but there might be an active
8186
8370
  // share video stream. we only leave from wireless share if share has
8187
8371
  // completely ended, which means no share audio or video streams active
@@ -8224,6 +8408,9 @@ export default class Meeting extends StatelessWebexPlugin {
8224
8408
  * @returns {undefined}
8225
8409
  */
8226
8410
  private handleShareVideoStreamEnded = async () => {
8411
+ LoggerProxy.logger.info(
8412
+ `Meeting:index#handleShareVideoStreamEnded --> video share stream ended`
8413
+ );
8227
8414
  // current share video stream has ended, but there might be an active
8228
8415
  // share audio stream. we only leave from wireless share if share has
8229
8416
  // completely ended, which means no share audio or video streams active
@@ -8712,6 +8899,9 @@ export default class Meeting extends StatelessWebexPlugin {
8712
8899
  * @returns {Promise}
8713
8900
  */
8714
8901
  async publishStreams(streams: LocalStreams): Promise<void> {
8902
+ LoggerProxy.logger.info(
8903
+ `Meeting:index#publishStreams --> called with: ${JSON.stringify(streams)}`
8904
+ );
8715
8905
  this.checkMediaConnection();
8716
8906
  if (
8717
8907
  !streams.microphone &&
@@ -8723,15 +8913,19 @@ export default class Meeting extends StatelessWebexPlugin {
8723
8913
  return;
8724
8914
  }
8725
8915
 
8726
- if (
8727
- streams?.microphone?.readyState === 'ended' ||
8728
- streams?.camera?.readyState === 'ended' ||
8729
- streams?.screenShare?.audio?.readyState === 'ended' ||
8730
- streams?.screenShare?.video?.readyState === 'ended'
8731
- ) {
8732
- throw new Error(
8733
- `Attempted to publish stream with ended readyState, correlationId=${this.correlationId}`
8734
- );
8916
+ const streamChecks = [
8917
+ {stream: streams?.microphone, name: 'microphone'},
8918
+ {stream: streams?.camera, name: 'camera'},
8919
+ {stream: streams?.screenShare?.audio, name: 'screenShare audio'},
8920
+ {stream: streams?.screenShare?.video, name: 'screenShare video'},
8921
+ ];
8922
+
8923
+ for (const {stream, name} of streamChecks) {
8924
+ if (stream?.readyState === 'ended') {
8925
+ throw new Error(
8926
+ `Attempted to publish ${name} stream with ended readyState, correlationId=${this.correlationId}`
8927
+ );
8928
+ }
8735
8929
  }
8736
8930
 
8737
8931
  let floorRequestNeeded = false;
@@ -8793,6 +8987,9 @@ export default class Meeting extends StatelessWebexPlugin {
8793
8987
  * @returns {Promise}
8794
8988
  */
8795
8989
  async unpublishStreams(streams: LocalStream[]): Promise<void> {
8990
+ LoggerProxy.logger.info(
8991
+ `Meeting:index#unpublishStreams --> called with: ${JSON.stringify(streams)}`
8992
+ );
8796
8993
  this.checkMediaConnection();
8797
8994
 
8798
8995
  const promises = [];
@@ -2,8 +2,9 @@
2
2
  import {defer} from 'lodash';
3
3
  import {Defer} from '@webex/common';
4
4
  import {WebexPlugin} from '@webex/webex-core';
5
- import {MEDIA, HTTP_VERBS, ROAP, IP_VERSION} from '../constants';
5
+ import {MEDIA, HTTP_VERBS, ROAP} from '../constants';
6
6
  import LoggerProxy from '../common/logs/logger-proxy';
7
+ import {ClientMediaPreferences} from '../reachability/reachability.types';
7
8
 
8
9
  export type MediaRequestType = 'RoapMessage' | 'LocalMute';
9
10
  export type RequestResult = any;
@@ -14,9 +15,8 @@ export type RoapRequest = {
14
15
  mediaId: string;
15
16
  roapMessage: any;
16
17
  reachability: any;
18
+ clientMediaPreferences: ClientMediaPreferences;
17
19
  sequence?: any;
18
- joinCookie: any; // any, because this is opaque to the client, we pass whatever object we got from one backend component (Orpheus) to the other (Locus)
19
- ipVersion?: IP_VERSION;
20
20
  };
21
21
 
22
22
  export type LocalMuteRequest = {
@@ -202,10 +202,6 @@ export class LocusMediaRequest extends WebexPlugin {
202
202
  const body: any = {
203
203
  device: this.config.device,
204
204
  correlationId: this.config.correlationId,
205
- clientMediaPreferences: {
206
- preferTranscoding: this.config.preferTranscoding,
207
- ipver: request.type === 'RoapMessage' ? request.ipVersion : undefined,
208
- },
209
205
  };
210
206
 
211
207
  const localMedias: any = {
@@ -223,7 +219,7 @@ export class LocusMediaRequest extends WebexPlugin {
223
219
  case 'RoapMessage':
224
220
  localMedias.roapMessage = request.roapMessage;
225
221
  localMedias.reachability = request.reachability;
226
- body.clientMediaPreferences.joinCookie = request.joinCookie;
222
+ body.clientMediaPreferences = request.clientMediaPreferences;
227
223
 
228
224
  // @ts-ignore
229
225
  this.webex.internal.newMetrics.submitClientEvent({
@@ -394,21 +394,25 @@ export class MuteState {
394
394
  * @public
395
395
  * @memberof MuteState
396
396
  * @param {Object} [meeting] the meeting object
397
+ * @param {Boolean} [unmuteAllowed] whether the user is allowed to unmute self
397
398
  * @returns {undefined}
398
399
  */
399
- public handleServerLocalUnmuteRequired(meeting?: any) {
400
+ public handleServerLocalUnmuteRequired(meeting: any, unmuteAllowed: boolean) {
400
401
  if (!this.state.client.enabled) {
401
402
  LoggerProxy.logger.warn(
402
403
  `Meeting:muteState#handleServerLocalUnmuteRequired --> ${this.type}: localAudioUnmuteRequired received while ${this.type} is disabled -> local unmute will not result in ${this.type} being sent`
403
404
  );
404
405
  } else {
405
406
  LoggerProxy.logger.info(
406
- `Meeting:muteState#handleServerLocalUnmuteRequired --> ${this.type}: localAudioUnmuteRequired received -> doing local unmute`
407
+ `Meeting:muteState#handleServerLocalUnmuteRequired --> ${this.type}: localAudioUnmuteRequired received -> doing local unmute (unmuteAllowed=${unmuteAllowed})`
407
408
  );
408
409
  }
409
410
 
410
411
  // todo: I'm seeing "you can now unmute yourself " popup when this happens - but same thing happens on web.w.c so we can ignore for now
411
412
  this.state.server.remoteMute = false;
413
+ this.state.server.unmuteAllowed = unmuteAllowed;
414
+
415
+ this.applyUnmuteAllowedToStream(meeting);
412
416
 
413
417
  // change user mute state to false, but keep localMute true if overall mute state is still true
414
418
  this.muteLocalStream(meeting, false, 'localUnmuteRequired');
@@ -26,11 +26,11 @@ import {
26
26
  SEND_DTMF_ENDPOINT,
27
27
  _SLIDES_,
28
28
  ANNOTATION,
29
- IP_VERSION,
30
29
  } from '../constants';
31
30
  import {SendReactionOptions, ToggleReactionsOptions} from './request.type';
32
31
  import MeetingUtil from './util';
33
32
  import {AnnotationInfo} from '../annotation/annotation.types';
33
+ import {ClientMediaPreferences} from '../reachability/reachability.types';
34
34
 
35
35
  /**
36
36
  * @class MeetingRequest
@@ -128,8 +128,8 @@ export default class MeetingRequest extends StatelessWebexPlugin {
128
128
  locale?: string;
129
129
  deviceCapabilities?: Array<string>;
130
130
  liveAnnotationSupported: boolean;
131
- ipVersion?: IP_VERSION;
132
131
  alias?: string;
132
+ clientMediaPreferences: ClientMediaPreferences;
133
133
  }) {
134
134
  const {
135
135
  asResourceOccupant,
@@ -147,12 +147,11 @@ export default class MeetingRequest extends StatelessWebexPlugin {
147
147
  moveToResource,
148
148
  roapMessage,
149
149
  reachability,
150
- preferTranscoding,
151
150
  breakoutsSupported,
152
151
  locale,
153
152
  deviceCapabilities = [],
154
153
  liveAnnotationSupported,
155
- ipVersion,
154
+ clientMediaPreferences,
156
155
  alias,
157
156
  } = options;
158
157
 
@@ -160,8 +159,6 @@ export default class MeetingRequest extends StatelessWebexPlugin {
160
159
 
161
160
  let url = '';
162
161
 
163
- const joinCookie = await this.getJoinCookie();
164
-
165
162
  const body: any = {
166
163
  asResourceOccupant,
167
164
  device: {
@@ -176,11 +173,7 @@ export default class MeetingRequest extends StatelessWebexPlugin {
176
173
  allowMultiDevice: true,
177
174
  ensureConversation: ensureConversation || false,
178
175
  supportsNativeLobby: 1,
179
- clientMediaPreferences: {
180
- preferTranscoding: preferTranscoding ?? true,
181
- joinCookie,
182
- ipver: ipVersion,
183
- },
176
+ clientMediaPreferences,
184
177
  };
185
178
 
186
179
  if (alias) {