@webex/plugin-meetings 3.6.0 → 3.7.0-ipv6-multi-turn-urls.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 (332) 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/join-webinar-error.js +50 -0
  5. package/dist/common/errors/join-webinar-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 +54 -4
  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/media/index.js +29 -1
  30. package/dist/media/index.js.map +1 -1
  31. package/dist/meeting/in-meeting-actions.js +29 -1
  32. package/dist/meeting/in-meeting-actions.js.map +1 -1
  33. package/dist/meeting/index.js +807 -540
  34. package/dist/meeting/index.js.map +1 -1
  35. package/dist/meeting/locusMediaRequest.js +2 -6
  36. package/dist/meeting/locusMediaRequest.js.map +1 -1
  37. package/dist/meeting/muteState.js +5 -2
  38. package/dist/meeting/muteState.js.map +1 -1
  39. package/dist/meeting/request.js +21 -29
  40. package/dist/meeting/request.js.map +1 -1
  41. package/dist/meeting/util.js +98 -61
  42. package/dist/meeting/util.js.map +1 -1
  43. package/dist/meeting-info/meeting-info-v2.js +80 -17
  44. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  45. package/dist/meetings/index.js +29 -2
  46. package/dist/meetings/index.js.map +1 -1
  47. package/dist/members/index.js +3 -2
  48. package/dist/members/index.js.map +1 -1
  49. package/dist/members/util.js +13 -7
  50. package/dist/members/util.js.map +1 -1
  51. package/dist/metrics/constants.js +4 -1
  52. package/dist/metrics/constants.js.map +1 -1
  53. package/dist/multistream/remoteMedia.js +34 -15
  54. package/dist/multistream/remoteMedia.js.map +1 -1
  55. package/dist/reachability/clusterReachability.js +12 -15
  56. package/dist/reachability/clusterReachability.js.map +1 -1
  57. package/dist/reachability/index.js +433 -136
  58. package/dist/reachability/index.js.map +1 -1
  59. package/dist/{rtcMetrics/constants.js → reachability/reachability.types.js} +1 -5
  60. package/dist/reachability/reachability.types.js.map +1 -0
  61. package/dist/reachability/request.js +23 -9
  62. package/dist/reachability/request.js.map +1 -1
  63. package/dist/recording-controller/enums.js +8 -4
  64. package/dist/recording-controller/enums.js.map +1 -1
  65. package/dist/recording-controller/index.js +18 -9
  66. package/dist/recording-controller/index.js.map +1 -1
  67. package/dist/recording-controller/util.js +13 -9
  68. package/dist/recording-controller/util.js.map +1 -1
  69. package/dist/roap/index.js +5 -7
  70. package/dist/roap/index.js.map +1 -1
  71. package/dist/roap/request.js +45 -79
  72. package/dist/roap/request.js.map +1 -1
  73. package/dist/roap/turnDiscovery.js +3 -6
  74. package/dist/roap/turnDiscovery.js.map +1 -1
  75. package/dist/{common/errors/parameter.d.ts → types/common/errors/join-webinar-error.d.ts} +4 -5
  76. package/dist/types/config.d.ts +3 -0
  77. package/dist/types/constants.d.ts +43 -0
  78. package/dist/types/controls-options-manager/enums.d.ts +2 -1
  79. package/dist/types/controls-options-manager/index.d.ts +2 -1
  80. package/dist/types/controls-options-manager/types.d.ts +2 -0
  81. package/dist/types/index.d.ts +2 -1
  82. package/dist/types/locus-info/index.d.ts +9 -0
  83. package/dist/types/meeting/in-meeting-actions.d.ts +28 -0
  84. package/dist/types/meeting/index.d.ts +34 -3
  85. package/dist/types/meeting/locusMediaRequest.d.ts +2 -3
  86. package/dist/types/meeting/muteState.d.ts +2 -1
  87. package/dist/types/meeting/request.d.ts +2 -2
  88. package/dist/types/meeting/util.d.ts +2 -2
  89. package/dist/types/meeting-info/meeting-info-v2.d.ts +23 -0
  90. package/dist/types/meetings/index.d.ts +13 -1
  91. package/dist/types/members/index.d.ts +2 -1
  92. package/dist/types/members/util.d.ts +5 -1
  93. package/dist/types/metrics/constants.d.ts +3 -0
  94. package/dist/types/multistream/remoteMedia.d.ts +1 -0
  95. package/dist/types/reachability/clusterReachability.d.ts +1 -10
  96. package/dist/types/reachability/index.d.ts +74 -35
  97. package/dist/types/reachability/reachability.types.d.ts +64 -0
  98. package/dist/types/reachability/request.d.ts +5 -1
  99. package/dist/types/recording-controller/enums.d.ts +5 -2
  100. package/dist/types/recording-controller/index.d.ts +1 -0
  101. package/dist/types/recording-controller/util.d.ts +2 -1
  102. package/dist/types/roap/request.d.ts +1 -13
  103. package/dist/webinar/index.js +382 -19
  104. package/dist/webinar/index.js.map +1 -1
  105. package/package.json +22 -22
  106. package/src/common/errors/join-webinar-error.ts +24 -0
  107. package/src/config.ts +3 -0
  108. package/src/constants.ts +52 -0
  109. package/src/controls-options-manager/enums.ts +1 -0
  110. package/src/controls-options-manager/index.ts +19 -2
  111. package/src/controls-options-manager/types.ts +2 -0
  112. package/src/controls-options-manager/util.ts +12 -0
  113. package/src/index.ts +2 -0
  114. package/src/locus-info/controlsUtils.ts +46 -2
  115. package/src/locus-info/fullState.ts +1 -0
  116. package/src/locus-info/index.ts +60 -0
  117. package/src/locus-info/parser.ts +8 -1
  118. package/src/media/index.ts +15 -0
  119. package/src/meeting/in-meeting-actions.ts +58 -0
  120. package/src/meeting/index.ts +268 -32
  121. package/src/meeting/locusMediaRequest.ts +4 -8
  122. package/src/meeting/muteState.ts +6 -2
  123. package/src/meeting/request.ts +4 -11
  124. package/src/meeting/util.ts +31 -6
  125. package/src/meeting-info/meeting-info-v2.ts +63 -0
  126. package/src/meetings/index.ts +74 -40
  127. package/src/members/index.ts +4 -2
  128. package/src/members/util.ts +4 -1
  129. package/src/metrics/constants.ts +3 -0
  130. package/src/multistream/remoteMedia.ts +33 -15
  131. package/src/reachability/clusterReachability.ts +5 -15
  132. package/src/reachability/index.ts +285 -77
  133. package/src/reachability/reachability.types.ts +85 -0
  134. package/src/reachability/request.ts +55 -30
  135. package/src/recording-controller/enums.ts +5 -2
  136. package/src/recording-controller/index.ts +17 -4
  137. package/src/recording-controller/util.ts +20 -5
  138. package/src/roap/index.ts +4 -5
  139. package/src/roap/request.ts +32 -44
  140. package/src/roap/turnDiscovery.ts +2 -4
  141. package/src/webinar/index.ts +223 -17
  142. package/test/unit/spec/controls-options-manager/index.js +56 -32
  143. package/test/unit/spec/controls-options-manager/util.js +44 -0
  144. package/test/unit/spec/locus-info/controlsUtils.js +80 -4
  145. package/test/unit/spec/locus-info/index.js +88 -2
  146. package/test/unit/spec/meeting/in-meeting-actions.ts +31 -1
  147. package/test/unit/spec/meeting/index.js +407 -82
  148. package/test/unit/spec/meeting/locusMediaRequest.ts +18 -11
  149. package/test/unit/spec/meeting/muteState.js +8 -4
  150. package/test/unit/spec/meeting/request.js +3 -26
  151. package/test/unit/spec/meeting/utils.js +71 -14
  152. package/test/unit/spec/meeting-info/meetinginfov2.js +42 -0
  153. package/test/unit/spec/meetings/index.js +41 -6
  154. package/test/unit/spec/members/index.js +25 -2
  155. package/test/unit/spec/members/request.js +37 -3
  156. package/test/unit/spec/members/utils.js +110 -1
  157. package/test/unit/spec/multistream/remoteMedia.ts +27 -9
  158. package/test/unit/spec/reachability/clusterReachability.ts +7 -0
  159. package/test/unit/spec/reachability/index.ts +265 -1
  160. package/test/unit/spec/reachability/request.js +56 -15
  161. package/test/unit/spec/recording-controller/index.js +61 -5
  162. package/test/unit/spec/recording-controller/util.js +39 -3
  163. package/test/unit/spec/roap/index.ts +1 -1
  164. package/test/unit/spec/roap/request.ts +51 -109
  165. package/test/unit/spec/roap/turnDiscovery.ts +202 -147
  166. package/test/unit/spec/webinar/index.ts +443 -14
  167. package/dist/annotation/annotation.types.d.ts +0 -42
  168. package/dist/annotation/constants.d.ts +0 -31
  169. package/dist/annotation/index.d.ts +0 -117
  170. package/dist/breakouts/breakout.d.ts +0 -8
  171. package/dist/breakouts/collection.d.ts +0 -5
  172. package/dist/breakouts/edit-lock-error.d.ts +0 -15
  173. package/dist/breakouts/events.d.ts +0 -8
  174. package/dist/breakouts/index.d.ts +0 -5
  175. package/dist/breakouts/request.d.ts +0 -22
  176. package/dist/breakouts/utils.d.ts +0 -15
  177. package/dist/common/browser-detection.d.ts +0 -9
  178. package/dist/common/collection.d.ts +0 -48
  179. package/dist/common/config.d.ts +0 -2
  180. package/dist/common/errors/captcha-error.d.ts +0 -15
  181. package/dist/common/errors/intent-to-join.d.ts +0 -16
  182. package/dist/common/errors/join-meeting.d.ts +0 -17
  183. package/dist/common/errors/media.d.ts +0 -15
  184. package/dist/common/errors/no-meeting-info.d.ts +0 -14
  185. package/dist/common/errors/password-error.d.ts +0 -15
  186. package/dist/common/errors/permission.d.ts +0 -14
  187. package/dist/common/errors/reclaim-host-role-error.js +0 -149
  188. package/dist/common/errors/reclaim-host-role-error.js.map +0 -1
  189. package/dist/common/errors/reclaim-host-role-errors.d.ts +0 -60
  190. package/dist/common/errors/reconnection-in-progress.d.ts +0 -9
  191. package/dist/common/errors/reconnection-in-progress.js +0 -33
  192. package/dist/common/errors/reconnection-in-progress.js.map +0 -1
  193. package/dist/common/errors/reconnection.d.ts +0 -15
  194. package/dist/common/errors/stats.d.ts +0 -15
  195. package/dist/common/errors/webex-errors.d.ts +0 -93
  196. package/dist/common/errors/webex-meetings-error.d.ts +0 -20
  197. package/dist/common/events/events-scope.d.ts +0 -17
  198. package/dist/common/events/events.d.ts +0 -12
  199. package/dist/common/events/trigger-proxy.d.ts +0 -2
  200. package/dist/common/events/util.d.ts +0 -2
  201. package/dist/common/logs/logger-config.d.ts +0 -2
  202. package/dist/common/logs/logger-proxy.d.ts +0 -2
  203. package/dist/common/logs/request.d.ts +0 -36
  204. package/dist/common/queue.d.ts +0 -34
  205. package/dist/config.d.ts +0 -72
  206. package/dist/constants.d.ts +0 -1088
  207. package/dist/controls-options-manager/constants.d.ts +0 -4
  208. package/dist/controls-options-manager/enums.d.ts +0 -15
  209. package/dist/controls-options-manager/index.d.ts +0 -136
  210. package/dist/controls-options-manager/types.d.ts +0 -43
  211. package/dist/controls-options-manager/util.d.ts +0 -1
  212. package/dist/index.d.ts +0 -7
  213. package/dist/interceptors/index.d.ts +0 -2
  214. package/dist/interceptors/locusRetry.d.ts +0 -27
  215. package/dist/interpretation/collection.d.ts +0 -5
  216. package/dist/interpretation/index.d.ts +0 -5
  217. package/dist/interpretation/siLanguage.d.ts +0 -5
  218. package/dist/locus-info/controlsUtils.d.ts +0 -2
  219. package/dist/locus-info/embeddedAppsUtils.d.ts +0 -2
  220. package/dist/locus-info/fullState.d.ts +0 -2
  221. package/dist/locus-info/hostUtils.d.ts +0 -2
  222. package/dist/locus-info/index.d.ts +0 -322
  223. package/dist/locus-info/infoUtils.d.ts +0 -2
  224. package/dist/locus-info/mediaSharesUtils.d.ts +0 -2
  225. package/dist/locus-info/parser.d.ts +0 -272
  226. package/dist/locus-info/selfUtils.d.ts +0 -2
  227. package/dist/media/index.d.ts +0 -34
  228. package/dist/media/properties.d.ts +0 -93
  229. package/dist/media/util.d.ts +0 -2
  230. package/dist/mediaQualityMetrics/config.d.ts +0 -241
  231. package/dist/mediaQualityMetrics/config.js +0 -502
  232. package/dist/mediaQualityMetrics/config.js.map +0 -1
  233. package/dist/meeting/effectsState.js +0 -260
  234. package/dist/meeting/effectsState.js.map +0 -1
  235. package/dist/meeting/in-meeting-actions.d.ts +0 -167
  236. package/dist/meeting/index.d.ts +0 -1825
  237. package/dist/meeting/locusMediaRequest.d.ts +0 -74
  238. package/dist/meeting/muteState.d.ts +0 -178
  239. package/dist/meeting/request.d.ts +0 -295
  240. package/dist/meeting/request.type.d.ts +0 -11
  241. package/dist/meeting/state.d.ts +0 -9
  242. package/dist/meeting/util.d.ts +0 -119
  243. package/dist/meeting/voicea-meeting.d.ts +0 -16
  244. package/dist/meeting-info/collection.d.ts +0 -20
  245. package/dist/meeting-info/index.d.ts +0 -69
  246. package/dist/meeting-info/meeting-info-v2.d.ts +0 -123
  247. package/dist/meeting-info/request.d.ts +0 -22
  248. package/dist/meeting-info/util.d.ts +0 -2
  249. package/dist/meeting-info/utilv2.d.ts +0 -2
  250. package/dist/meetings/collection.d.ts +0 -40
  251. package/dist/meetings/index.d.ts +0 -390
  252. package/dist/meetings/meetings.types.d.ts +0 -4
  253. package/dist/meetings/request.d.ts +0 -27
  254. package/dist/meetings/util.d.ts +0 -18
  255. package/dist/member/index.d.ts +0 -160
  256. package/dist/member/member.types.js +0 -17
  257. package/dist/member/member.types.js.map +0 -1
  258. package/dist/member/types.d.ts +0 -32
  259. package/dist/member/util.d.ts +0 -2
  260. package/dist/members/collection.d.ts +0 -29
  261. package/dist/members/index.d.ts +0 -353
  262. package/dist/members/request.d.ts +0 -114
  263. package/dist/members/types.d.ts +0 -25
  264. package/dist/members/util.d.ts +0 -215
  265. package/dist/metrics/config.js +0 -276
  266. package/dist/metrics/config.js.map +0 -1
  267. package/dist/metrics/constants.d.ts +0 -70
  268. package/dist/metrics/index.d.ts +0 -45
  269. package/dist/multistream/mediaRequestManager.d.ts +0 -119
  270. package/dist/multistream/receiveSlot.d.ts +0 -68
  271. package/dist/multistream/receiveSlotManager.d.ts +0 -56
  272. package/dist/multistream/remoteMedia.d.ts +0 -72
  273. package/dist/multistream/remoteMediaGroup.d.ts +0 -49
  274. package/dist/multistream/remoteMediaManager.d.ts +0 -300
  275. package/dist/multistream/sendSlotManager.d.ts +0 -69
  276. package/dist/networkQualityMonitor/index.d.ts +0 -70
  277. package/dist/networkQualityMonitor/index.js +0 -221
  278. package/dist/networkQualityMonitor/index.js.map +0 -1
  279. package/dist/peer-connection-manager/index.js +0 -671
  280. package/dist/peer-connection-manager/index.js.map +0 -1
  281. package/dist/peer-connection-manager/util.js +0 -109
  282. package/dist/peer-connection-manager/util.js.map +0 -1
  283. package/dist/personal-meeting-room/index.d.ts +0 -47
  284. package/dist/personal-meeting-room/request.d.ts +0 -14
  285. package/dist/personal-meeting-room/util.d.ts +0 -2
  286. package/dist/reachability/clusterReachability.d.ts +0 -109
  287. package/dist/reachability/index.d.ts +0 -105
  288. package/dist/reachability/request.d.ts +0 -39
  289. package/dist/reachability/util.d.ts +0 -8
  290. package/dist/reactions/constants.d.ts +0 -3
  291. package/dist/reactions/reactions.d.ts +0 -4
  292. package/dist/reactions/reactions.type.d.ts +0 -52
  293. package/dist/reconnection-manager/index.d.ts +0 -136
  294. package/dist/recording-controller/enums.d.ts +0 -7
  295. package/dist/recording-controller/index.d.ts +0 -207
  296. package/dist/recording-controller/util.d.ts +0 -14
  297. package/dist/roap/collection.js +0 -62
  298. package/dist/roap/collection.js.map +0 -1
  299. package/dist/roap/handler.js +0 -275
  300. package/dist/roap/handler.js.map +0 -1
  301. package/dist/roap/index.d.ts +0 -86
  302. package/dist/roap/request.d.ts +0 -39
  303. package/dist/roap/state.js +0 -126
  304. package/dist/roap/state.js.map +0 -1
  305. package/dist/roap/turnDiscovery.d.ts +0 -155
  306. package/dist/roap/util.js +0 -75
  307. package/dist/roap/util.js.map +0 -1
  308. package/dist/rtcMetrics/constants.d.ts +0 -4
  309. package/dist/rtcMetrics/constants.js.map +0 -1
  310. package/dist/rtcMetrics/index.d.ts +0 -61
  311. package/dist/rtcMetrics/index.js +0 -197
  312. package/dist/rtcMetrics/index.js.map +0 -1
  313. package/dist/statsAnalyzer/global.d.ts +0 -36
  314. package/dist/statsAnalyzer/global.js +0 -126
  315. package/dist/statsAnalyzer/global.js.map +0 -1
  316. package/dist/statsAnalyzer/index.d.ts +0 -217
  317. package/dist/statsAnalyzer/index.js +0 -1013
  318. package/dist/statsAnalyzer/index.js.map +0 -1
  319. package/dist/statsAnalyzer/mqaUtil.d.ts +0 -48
  320. package/dist/statsAnalyzer/mqaUtil.js +0 -179
  321. package/dist/statsAnalyzer/mqaUtil.js.map +0 -1
  322. package/dist/transcription/index.d.ts +0 -64
  323. package/dist/types/common/errors/reconnection-in-progress.d.ts +0 -9
  324. package/dist/types/mediaQualityMetrics/config.d.ts +0 -241
  325. package/dist/types/networkQualityMonitor/index.d.ts +0 -70
  326. package/dist/types/rtcMetrics/constants.d.ts +0 -4
  327. package/dist/types/rtcMetrics/index.d.ts +0 -71
  328. package/dist/types/statsAnalyzer/global.d.ts +0 -36
  329. package/dist/types/statsAnalyzer/index.d.ts +0 -217
  330. package/dist/types/statsAnalyzer/mqaUtil.d.ts +0 -48
  331. package/dist/webinar/collection.d.ts +0 -16
  332. package/dist/webinar/index.d.ts +0 -5
@@ -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,
@@ -121,6 +122,8 @@ import {
121
122
  MEETING_PERMISSION_TOKEN_REFRESH_REASON,
122
123
  ROAP_OFFER_ANSWER_EXCHANGE_TIMEOUT,
123
124
  NAMED_MEDIA_GROUP_TYPE_AUDIO,
125
+ WEBINAR_ERROR_WEBCAST,
126
+ WEBINAR_ERROR_REGISTRATIONID,
124
127
  } from '../constants';
125
128
  import BEHAVIORAL_METRICS from '../metrics/constants';
126
129
  import ParameterError from '../common/errors/parameter';
@@ -128,6 +131,7 @@ import {
128
131
  MeetingInfoV2PasswordError,
129
132
  MeetingInfoV2CaptchaError,
130
133
  MeetingInfoV2PolicyError,
134
+ MeetingInfoV2JoinWebinarError,
131
135
  } from '../meeting-info/meeting-info-v2';
132
136
  import {CSI, ReceiveSlotManager} from '../multistream/receiveSlotManager';
133
137
  import SendSlotManager from '../multistream/sendSlotManager';
@@ -156,6 +160,7 @@ import ControlsOptionsManager from '../controls-options-manager';
156
160
  import PermissionError from '../common/errors/permission';
157
161
  import {LocusMediaRequest} from './locusMediaRequest';
158
162
  import {ConnectionStateHandler, ConnectionStateEvent} from './connectionStateHandler';
163
+ import JoinWebinarError from '../common/errors/join-webinar-error';
159
164
 
160
165
  // default callback so we don't call an undefined function, but in practice it should never be used
161
166
  const DEFAULT_ICE_PHASE_CALLBACK = () => 'JOIN_MEETING_FINAL';
@@ -700,6 +705,8 @@ export default class Meeting extends StatelessWebexPlugin {
700
705
  private iceCandidateErrors: Map<string, number>;
701
706
  private iceCandidatesCount: number;
702
707
  private rtcMetrics?: RtcMetrics;
708
+ private uploadLogsTimer?: ReturnType<typeof setTimeout>;
709
+ private logUploadIntervalIndex: number;
703
710
 
704
711
  /**
705
712
  * @param {Object} attrs
@@ -768,6 +775,8 @@ export default class Meeting extends StatelessWebexPlugin {
768
775
  );
769
776
  this.callStateForMetrics.correlationId = this.id;
770
777
  }
778
+ this.logUploadIntervalIndex = 0;
779
+
771
780
  /**
772
781
  * @instance
773
782
  * @type {String}
@@ -1759,8 +1768,21 @@ export default class Meeting extends StatelessWebexPlugin {
1759
1768
  if (err.meetingInfo) {
1760
1769
  this.meetingInfo = err.meetingInfo;
1761
1770
  }
1762
-
1763
1771
  throw new PermissionError();
1772
+ } else if (err instanceof MeetingInfoV2JoinWebinarError) {
1773
+ this.meetingInfoFailureReason = MEETING_INFO_FAILURE_REASON.WEBINAR_REGISTRATION;
1774
+ if (WEBINAR_ERROR_WEBCAST.includes(err.wbxAppApiCode)) {
1775
+ this.meetingInfoFailureReason = MEETING_INFO_FAILURE_REASON.NEED_JOIN_WITH_WEBCAST;
1776
+ } else if (WEBINAR_ERROR_REGISTRATIONID.includes(err.wbxAppApiCode)) {
1777
+ this.meetingInfoFailureReason = MEETING_INFO_FAILURE_REASON.WEBINAR_NEED_REGISTRATIONID;
1778
+ }
1779
+ this.meetingInfoFailureCode = err.wbxAppApiCode;
1780
+
1781
+ if (err.meetingInfo) {
1782
+ this.meetingInfo = err.meetingInfo;
1783
+ }
1784
+
1785
+ throw new JoinWebinarError();
1764
1786
  } else if (err instanceof MeetingInfoV2PasswordError) {
1765
1787
  LoggerProxy.logger.info(
1766
1788
  // @ts-ignore
@@ -2004,6 +2026,7 @@ export default class Meeting extends StatelessWebexPlugin {
2004
2026
  this.setUpLocusInfoSelfListener();
2005
2027
  this.setUpLocusInfoMeetingListener();
2006
2028
  this.setUpLocusServicesListener();
2029
+ this.setUpLocusResourcesListener();
2007
2030
  // members update listeners
2008
2031
  this.setUpLocusFullStateListener();
2009
2032
  this.setUpLocusUrlListener();
@@ -2625,6 +2648,43 @@ export default class Meeting extends StatelessWebexPlugin {
2625
2648
  );
2626
2649
  });
2627
2650
 
2651
+ this.locusInfo.on(LOCUSINFO.EVENTS.CONTROLS_WEBCAST_CHANGED, ({state}) => {
2652
+ Trigger.trigger(
2653
+ this,
2654
+ {file: 'meeting/index', function: 'setupLocusControlsListener'},
2655
+ EVENT_TRIGGERS.MEETING_CONTROLS_WEBCAST_UPDATED,
2656
+ {state}
2657
+ );
2658
+ });
2659
+
2660
+ this.locusInfo.on(LOCUSINFO.EVENTS.CONTROLS_MEETING_FULL_CHANGED, ({state}) => {
2661
+ Trigger.trigger(
2662
+ this,
2663
+ {file: 'meeting/index', function: 'setupLocusControlsListener'},
2664
+ EVENT_TRIGGERS.MEETING_CONTROLS_MEETING_FULL_UPDATED,
2665
+ {state}
2666
+ );
2667
+ });
2668
+
2669
+ this.locusInfo.on(LOCUSINFO.EVENTS.CONTROLS_PRACTICE_SESSION_STATUS_UPDATED, ({state}) => {
2670
+ this.webinar.updatePracticeSessionStatus(state);
2671
+ Trigger.trigger(
2672
+ this,
2673
+ {file: 'meeting/index', function: 'setupLocusControlsListener'},
2674
+ EVENT_TRIGGERS.MEETING_CONTROLS_PRACTICE_SESSION_STATUS_UPDATED,
2675
+ {state}
2676
+ );
2677
+ });
2678
+
2679
+ this.locusInfo.on(LOCUSINFO.EVENTS.CONTROLS_STAGE_VIEW_UPDATED, ({state}) => {
2680
+ Trigger.trigger(
2681
+ this,
2682
+ {file: 'meeting/index', function: 'setupLocusControlsListener'},
2683
+ EVENT_TRIGGERS.MEETING_CONTROLS_STAGE_VIEW_UPDATED,
2684
+ {state}
2685
+ );
2686
+ });
2687
+
2628
2688
  this.locusInfo.on(LOCUSINFO.EVENTS.CONTROLS_VIDEO_CHANGED, ({state}) => {
2629
2689
  Trigger.trigger(
2630
2690
  this,
@@ -2739,6 +2799,9 @@ export default class Meeting extends StatelessWebexPlugin {
2739
2799
  newShareStatus = SHARE_STATUS.NO_SHARE;
2740
2800
  }
2741
2801
 
2802
+ LoggerProxy.logger.info(
2803
+ `Meeting:index#setUpLocusInfoMediaInactiveListener --> this.shareStatus=${this.shareStatus} newShareStatus=${newShareStatus}`
2804
+ );
2742
2805
  if (newShareStatus !== this.shareStatus) {
2743
2806
  const oldShareStatus = this.shareStatus;
2744
2807
 
@@ -2983,10 +3046,20 @@ export default class Meeting extends StatelessWebexPlugin {
2983
3046
  this.breakouts.breakoutServiceUrlUpdate(payload?.services?.breakout?.url);
2984
3047
  this.annotation.approvalUrlUpdate(payload?.services?.approval?.url);
2985
3048
  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
- );
3049
+ });
3050
+ }
3051
+
3052
+ /**
3053
+ * Set up the locus info resources link listener
3054
+ * update the locusInfo for webcast instance url
3055
+ * @param {Object} payload - The event payload
3056
+ * @returns {undefined}
3057
+ * @private
3058
+ * @memberof Meeting
3059
+ */
3060
+ private setUpLocusResourcesListener() {
3061
+ this.locusInfo.on(LOCUSINFO.EVENTS.LINKS_RESOURCES, (payload) => {
3062
+ this.webinar.updateWebcastUrl(payload);
2990
3063
  });
2991
3064
  }
2992
3065
 
@@ -3091,7 +3164,7 @@ export default class Meeting extends StatelessWebexPlugin {
3091
3164
  private setUpLocusInfoSelfListener() {
3092
3165
  this.locusInfo.on(LOCUSINFO.EVENTS.LOCAL_UNMUTE_REQUIRED, (payload) => {
3093
3166
  if (this.audio) {
3094
- this.audio.handleServerLocalUnmuteRequired(this);
3167
+ this.audio.handleServerLocalUnmuteRequired(this, payload.unmuteAllowed);
3095
3168
  Trigger.trigger(
3096
3169
  this,
3097
3170
  {
@@ -3189,6 +3262,9 @@ export default class Meeting extends StatelessWebexPlugin {
3189
3262
  options: {meetingId: this.id},
3190
3263
  });
3191
3264
  }
3265
+ Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.GUEST_ENTERED_LOBBY, {
3266
+ correlation_id: this.correlationId,
3267
+ });
3192
3268
  this.updateLLMConnection();
3193
3269
  });
3194
3270
  this.locusInfo.on(LOCUSINFO.EVENTS.SELF_ADMITTED_GUEST, async (payload) => {
@@ -3212,6 +3288,9 @@ export default class Meeting extends StatelessWebexPlugin {
3212
3288
  name: 'client.lobby.exited',
3213
3289
  options: {meetingId: this.id},
3214
3290
  });
3291
+ Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.GUEST_EXITED_LOBBY, {
3292
+ correlation_id: this.correlationId,
3293
+ });
3215
3294
  }
3216
3295
  this.rtcMetrics?.sendNextMetrics();
3217
3296
  this.updateLLMConnection();
@@ -3298,7 +3377,7 @@ export default class Meeting extends StatelessWebexPlugin {
3298
3377
  this.simultaneousInterpretation.updateCanManageInterpreters(
3299
3378
  payload.newRoles?.includes(SELF_ROLES.MODERATOR)
3300
3379
  );
3301
- this.webinar.updateCanManageWebcast(payload.newRoles?.includes(SELF_ROLES.MODERATOR));
3380
+ this.webinar.updateRoleChanged(payload);
3302
3381
  Trigger.trigger(
3303
3382
  this,
3304
3383
  {
@@ -3445,6 +3524,7 @@ export default class Meeting extends StatelessWebexPlugin {
3445
3524
  emailAddress: string;
3446
3525
  email: string;
3447
3526
  phoneNumber: string;
3527
+ roles: Array<string>;
3448
3528
  },
3449
3529
  alertIfActive = true
3450
3530
  ) {
@@ -3701,6 +3781,10 @@ export default class Meeting extends StatelessWebexPlugin {
3701
3781
  this.userDisplayHints,
3702
3782
  this.selfUserPolicies
3703
3783
  ),
3784
+ isPremiseRecordingEnabled: RecordingUtil.isPremiseRecordingEnabled(
3785
+ this.userDisplayHints,
3786
+ this.selfUserPolicies
3787
+ ),
3704
3788
  canRaiseHand: MeetingUtil.canUserRaiseHand(this.userDisplayHints),
3705
3789
  canLowerAllHands: MeetingUtil.canUserLowerAllHands(this.userDisplayHints),
3706
3790
  canLowerSomeoneElsesHand: MeetingUtil.canUserLowerSomeoneElsesHand(this.userDisplayHints),
@@ -3792,6 +3876,22 @@ export default class Meeting extends StatelessWebexPlugin {
3792
3876
  requiredHints: [DISPLAY_HINTS.DISABLE_VIEW_THE_PARTICIPANT_LIST],
3793
3877
  displayHints: this.userDisplayHints,
3794
3878
  }),
3879
+ canEnableViewTheParticipantsListPanelist: ControlsOptionsUtil.hasHints({
3880
+ requiredHints: [DISPLAY_HINTS.ENABLE_VIEW_THE_PARTICIPANT_LIST_PANELIST],
3881
+ displayHints: this.userDisplayHints,
3882
+ }),
3883
+ canDisableViewTheParticipantsListPanelist: ControlsOptionsUtil.hasHints({
3884
+ requiredHints: [DISPLAY_HINTS.DISABLE_VIEW_THE_PARTICIPANT_LIST_PANELIST],
3885
+ displayHints: this.userDisplayHints,
3886
+ }),
3887
+ canEnableShowAttendeeCount: ControlsOptionsUtil.hasHints({
3888
+ requiredHints: [DISPLAY_HINTS.ENABLE_SHOW_ATTENDEE_COUNT],
3889
+ displayHints: this.userDisplayHints,
3890
+ }),
3891
+ canDisableShowAttendeeCount: ControlsOptionsUtil.hasHints({
3892
+ requiredHints: [DISPLAY_HINTS.DISABLE_SHOW_ATTENDEE_COUNT],
3893
+ displayHints: this.userDisplayHints,
3894
+ }),
3795
3895
  canEnableRaiseHand: ControlsOptionsUtil.hasHints({
3796
3896
  requiredHints: [DISPLAY_HINTS.ENABLE_RAISE_HAND],
3797
3897
  displayHints: this.userDisplayHints,
@@ -3808,6 +3908,42 @@ export default class Meeting extends StatelessWebexPlugin {
3808
3908
  requiredHints: [DISPLAY_HINTS.DISABLE_VIDEO],
3809
3909
  displayHints: this.userDisplayHints,
3810
3910
  }),
3911
+ canStartWebcast: ControlsOptionsUtil.hasHints({
3912
+ requiredHints: [DISPLAY_HINTS.WEBCAST_CONTROL_START],
3913
+ displayHints: this.userDisplayHints,
3914
+ }),
3915
+ canStopWebcast: ControlsOptionsUtil.hasHints({
3916
+ requiredHints: [DISPLAY_HINTS.WEBCAST_CONTROL_STOP],
3917
+ displayHints: this.userDisplayHints,
3918
+ }),
3919
+ canShowStageView: ControlsOptionsUtil.hasHints({
3920
+ requiredHints: [DISPLAY_HINTS.STAGE_VIEW_ACTIVE],
3921
+ displayHints: this.userDisplayHints,
3922
+ }),
3923
+ canEnableStageView: ControlsOptionsUtil.hasHints({
3924
+ requiredHints: [DISPLAY_HINTS.ENABLE_STAGE_VIEW],
3925
+ displayHints: this.userDisplayHints,
3926
+ }),
3927
+ canDisableStageView: ControlsOptionsUtil.hasHints({
3928
+ requiredHints: [DISPLAY_HINTS.DISABLE_STAGE_VIEW],
3929
+ displayHints: this.userDisplayHints,
3930
+ }),
3931
+ isPracticeSessionOn: ControlsOptionsUtil.hasHints({
3932
+ requiredHints: [DISPLAY_HINTS.PRACTICE_SESSION_ON],
3933
+ displayHints: this.userDisplayHints,
3934
+ }),
3935
+ isPracticeSessionOff: ControlsOptionsUtil.hasHints({
3936
+ requiredHints: [DISPLAY_HINTS.PRACTICE_SESSION_OFF],
3937
+ displayHints: this.userDisplayHints,
3938
+ }),
3939
+ canStartPracticeSession: ControlsOptionsUtil.hasHints({
3940
+ requiredHints: [DISPLAY_HINTS.SHOW_PRACTICE_SESSION_START],
3941
+ displayHints: this.userDisplayHints,
3942
+ }),
3943
+ canStopPracticeSession: ControlsOptionsUtil.hasHints({
3944
+ requiredHints: [DISPLAY_HINTS.SHOW_PRACTICE_SESSION_STOP],
3945
+ displayHints: this.userDisplayHints,
3946
+ }),
3811
3947
  canShareFile:
3812
3948
  (ControlsOptionsUtil.hasHints({
3813
3949
  requiredHints: [DISPLAY_HINTS.SHARE_FILE],
@@ -3964,6 +4100,66 @@ export default class Meeting extends StatelessWebexPlugin {
3964
4100
  Trigger.trigger(this, options, EVENTS.REQUEST_UPLOAD_LOGS, this);
3965
4101
  }
3966
4102
 
4103
+ /**
4104
+ * sets the timer for periodic log upload
4105
+ * @returns {void}
4106
+ */
4107
+ private setLogUploadTimer() {
4108
+ // 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
4109
+ const LOG_UPLOAD_INTERVALS = [0.1, 15, 30, 60]; // in minutes
4110
+
4111
+ const delay =
4112
+ 1000 *
4113
+ 60 *
4114
+ // @ts-ignore - config coming from registerPlugin
4115
+ this.config.logUploadIntervalMultiplicationFactor *
4116
+ LOG_UPLOAD_INTERVALS[this.logUploadIntervalIndex];
4117
+
4118
+ if (this.logUploadIntervalIndex < LOG_UPLOAD_INTERVALS.length - 1) {
4119
+ this.logUploadIntervalIndex += 1;
4120
+ }
4121
+
4122
+ this.uploadLogsTimer = safeSetTimeout(() => {
4123
+ this.uploadLogsTimer = undefined;
4124
+
4125
+ this.uploadLogs();
4126
+
4127
+ // just as an extra precaution, to avoid uploading logs forever in case something goes wrong
4128
+ // and the page remains opened, we stop it if there is no media connection
4129
+ if (!this.mediaProperties.webrtcMediaConnection) {
4130
+ return;
4131
+ }
4132
+
4133
+ this.setLogUploadTimer();
4134
+ }, delay);
4135
+ }
4136
+
4137
+ /**
4138
+ * Starts a periodic upload of logs
4139
+ *
4140
+ * @returns {undefined}
4141
+ */
4142
+ public startPeriodicLogUpload() {
4143
+ // @ts-ignore - config coming from registerPlugin
4144
+ if (this.config.logUploadIntervalMultiplicationFactor && !this.uploadLogsTimer) {
4145
+ this.logUploadIntervalIndex = 0;
4146
+
4147
+ this.setLogUploadTimer();
4148
+ }
4149
+ }
4150
+
4151
+ /**
4152
+ * Stops the periodic upload of logs
4153
+ *
4154
+ * @returns {undefined}
4155
+ */
4156
+ public stopPeriodicLogUpload() {
4157
+ if (this.uploadLogsTimer) {
4158
+ clearTimeout(this.uploadLogsTimer);
4159
+ this.uploadLogsTimer = undefined;
4160
+ }
4161
+ }
4162
+
3967
4163
  /**
3968
4164
  * Removes remote audio, video and share streams from class instance's mediaProperties
3969
4165
  * @returns {undefined}
@@ -4675,8 +4871,6 @@ export default class Meeting extends StatelessWebexPlugin {
4675
4871
  if (!joinResponse) {
4676
4872
  // This is the 1st attempt or a retry after join request failed -> we need to do a join with TURN discovery
4677
4873
 
4678
- // @ts-ignore
4679
- joinOptions.reachability = await this.webex.meetings.reachability.getReachabilityResults();
4680
4874
  const turnDiscoveryRequest = await this.roap.generateTurnDiscoveryRequestMessage(
4681
4875
  this,
4682
4876
  true
@@ -4808,6 +5002,8 @@ export default class Meeting extends StatelessWebexPlugin {
4808
5002
  );
4809
5003
  }
4810
5004
 
5005
+ this.cleanUpBeforeReconnection();
5006
+
4811
5007
  return this.reconnectionManager
4812
5008
  .reconnect(options, async () => {
4813
5009
  await this.waitForRemoteSDPAnswer();
@@ -5185,16 +5381,19 @@ export default class Meeting extends StatelessWebexPlugin {
5185
5381
  this.meetingFiniteStateMachine.reset();
5186
5382
  }
5187
5383
 
5188
- // @ts-ignore
5189
- this.webex.internal.newMetrics.submitClientEvent({
5190
- name: 'client.call.initiated',
5191
- payload: {
5192
- trigger: this.callStateForMetrics.joinTrigger || 'user-interaction',
5193
- isRoapCallEnabled: true,
5194
- pstnAudioType: options?.pstnAudioType,
5195
- },
5196
- options: {meetingId: this.id},
5197
- });
5384
+ // send client.call.initiated unless told not to
5385
+ if (options.sendCallInitiated !== false) {
5386
+ // @ts-ignore
5387
+ this.webex.internal.newMetrics.submitClientEvent({
5388
+ name: 'client.call.initiated',
5389
+ payload: {
5390
+ trigger: this.callStateForMetrics.joinTrigger || 'user-interaction',
5391
+ isRoapCallEnabled: true,
5392
+ pstnAudioType: options?.pstnAudioType,
5393
+ },
5394
+ options: {meetingId: this.id},
5395
+ });
5396
+ }
5198
5397
 
5199
5398
  LoggerProxy.logger.log('Meeting:index#join --> Joining a meeting');
5200
5399
 
@@ -6225,7 +6424,7 @@ export default class Meeting extends StatelessWebexPlugin {
6225
6424
  this.mediaProperties.webrtcMediaConnection.on(
6226
6425
  MediaConnectionEventNames.ICE_CANDIDATE,
6227
6426
  (event) => {
6228
- if (event.candidate) {
6427
+ if (event.candidate && event.candidate.candidate && event.candidate.candidate.length > 0) {
6229
6428
  this.iceCandidatesCount += 1;
6230
6429
  }
6231
6430
  }
@@ -6936,6 +7135,23 @@ export default class Meeting extends StatelessWebexPlugin {
6936
7135
  }
6937
7136
  }
6938
7137
 
7138
+ private async cleanUpBeforeReconnection(): Promise<void> {
7139
+ try {
7140
+ // when media fails, we want to upload a webrtc dump to see whats going on
7141
+ // this function is async, but returns once the stats have been gathered
7142
+ await this.forceSendStatsReport({callFrom: 'cleanUpBeforeReconnection'});
7143
+
7144
+ if (this.statsAnalyzer) {
7145
+ await this.statsAnalyzer.stopAnalyzer();
7146
+ }
7147
+ } catch (error) {
7148
+ LoggerProxy.logger.error(
7149
+ 'Meeting:index#cleanUpBeforeReconnection --> Error during cleanup: ',
7150
+ error
7151
+ );
7152
+ }
7153
+ }
7154
+
6939
7155
  /**
6940
7156
  * Creates an instance of LocusMediaRequest for this meeting - it is needed for doing any calls
6941
7157
  * to Locus /media API (these are used for sending Roap messages and updating audio/video mute status).
@@ -7027,7 +7243,7 @@ export default class Meeting extends StatelessWebexPlugin {
7027
7243
  shareAudioEnabled = true,
7028
7244
  shareVideoEnabled = true,
7029
7245
  remoteMediaManagerConfig,
7030
- bundlePolicy,
7246
+ bundlePolicy = 'max-bundle',
7031
7247
  } = options;
7032
7248
 
7033
7249
  this.allowMediaInLobby = options?.allowMediaInLobby;
@@ -7132,6 +7348,7 @@ export default class Meeting extends StatelessWebexPlugin {
7132
7348
 
7133
7349
  // We can log ReceiveSlot SSRCs only after the SDP exchange, so doing it here:
7134
7350
  this.remoteMediaManager?.logAllReceiveSlots();
7351
+ this.startPeriodicLogUpload();
7135
7352
  } catch (error) {
7136
7353
  LoggerProxy.logger.error(`${LOG_HEADER} failed to establish media connection: `, error);
7137
7354
 
@@ -7914,18 +8131,21 @@ export default class Meeting extends StatelessWebexPlugin {
7914
8131
  * @param {boolean} mutedEnabled
7915
8132
  * @param {boolean} disallowUnmuteEnabled
7916
8133
  * @param {boolean} muteOnEntryEnabled
8134
+ * @param {array} roles
7917
8135
  * @public
7918
8136
  * @memberof Meeting
7919
8137
  */
7920
8138
  public setMuteAll(
7921
8139
  mutedEnabled: boolean,
7922
8140
  disallowUnmuteEnabled: boolean,
7923
- muteOnEntryEnabled: boolean
8141
+ muteOnEntryEnabled: boolean,
8142
+ roles: Array<string>
7924
8143
  ) {
7925
8144
  return this.controlsOptionsManager.setMuteAll(
7926
8145
  mutedEnabled,
7927
8146
  disallowUnmuteEnabled,
7928
- muteOnEntryEnabled
8147
+ muteOnEntryEnabled,
8148
+ roles
7929
8149
  );
7930
8150
  }
7931
8151
 
@@ -8182,6 +8402,9 @@ export default class Meeting extends StatelessWebexPlugin {
8182
8402
  * @returns {undefined}
8183
8403
  */
8184
8404
  private handleShareAudioStreamEnded = async () => {
8405
+ LoggerProxy.logger.info(
8406
+ `Meeting:index#handleShareAudioStreamEnded --> audio share stream ended`
8407
+ );
8185
8408
  // current share audio stream has ended, but there might be an active
8186
8409
  // share video stream. we only leave from wireless share if share has
8187
8410
  // completely ended, which means no share audio or video streams active
@@ -8224,6 +8447,9 @@ export default class Meeting extends StatelessWebexPlugin {
8224
8447
  * @returns {undefined}
8225
8448
  */
8226
8449
  private handleShareVideoStreamEnded = async () => {
8450
+ LoggerProxy.logger.info(
8451
+ `Meeting:index#handleShareVideoStreamEnded --> video share stream ended`
8452
+ );
8227
8453
  // current share video stream has ended, but there might be an active
8228
8454
  // share audio stream. we only leave from wireless share if share has
8229
8455
  // completely ended, which means no share audio or video streams active
@@ -8712,6 +8938,9 @@ export default class Meeting extends StatelessWebexPlugin {
8712
8938
  * @returns {Promise}
8713
8939
  */
8714
8940
  async publishStreams(streams: LocalStreams): Promise<void> {
8941
+ LoggerProxy.logger.info(
8942
+ `Meeting:index#publishStreams --> called with: ${JSON.stringify(streams)}`
8943
+ );
8715
8944
  this.checkMediaConnection();
8716
8945
  if (
8717
8946
  !streams.microphone &&
@@ -8723,15 +8952,19 @@ export default class Meeting extends StatelessWebexPlugin {
8723
8952
  return;
8724
8953
  }
8725
8954
 
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
- );
8955
+ const streamChecks = [
8956
+ {stream: streams?.microphone, name: 'microphone'},
8957
+ {stream: streams?.camera, name: 'camera'},
8958
+ {stream: streams?.screenShare?.audio, name: 'screenShare audio'},
8959
+ {stream: streams?.screenShare?.video, name: 'screenShare video'},
8960
+ ];
8961
+
8962
+ for (const {stream, name} of streamChecks) {
8963
+ if (stream?.readyState === 'ended') {
8964
+ throw new Error(
8965
+ `Attempted to publish ${name} stream with ended readyState, correlationId=${this.correlationId}`
8966
+ );
8967
+ }
8735
8968
  }
8736
8969
 
8737
8970
  let floorRequestNeeded = false;
@@ -8793,6 +9026,9 @@ export default class Meeting extends StatelessWebexPlugin {
8793
9026
  * @returns {Promise}
8794
9027
  */
8795
9028
  async unpublishStreams(streams: LocalStream[]): Promise<void> {
9029
+ LoggerProxy.logger.info(
9030
+ `Meeting:index#unpublishStreams --> called with: ${JSON.stringify(streams)}`
9031
+ );
8796
9032
  this.checkMediaConnection();
8797
9033
 
8798
9034
  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) {