@webex/plugin-meetings 3.7.0 → 3.8.0

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 (351) hide show
  1. package/dist/annotation/annotation.types.d.ts +42 -0
  2. package/dist/annotation/constants.d.ts +31 -0
  3. package/dist/annotation/index.d.ts +117 -0
  4. package/dist/annotation/index.js +17 -0
  5. package/dist/annotation/index.js.map +1 -1
  6. package/dist/breakouts/breakout.d.ts +8 -0
  7. package/dist/breakouts/breakout.js +1 -1
  8. package/dist/breakouts/collection.d.ts +5 -0
  9. package/dist/breakouts/edit-lock-error.d.ts +15 -0
  10. package/dist/breakouts/events.d.ts +8 -0
  11. package/dist/breakouts/index.d.ts +5 -0
  12. package/dist/breakouts/index.js +1 -1
  13. package/dist/breakouts/request.d.ts +22 -0
  14. package/dist/breakouts/utils.d.ts +15 -0
  15. package/dist/common/browser-detection.d.ts +9 -0
  16. package/dist/common/collection.d.ts +48 -0
  17. package/dist/common/config.d.ts +2 -0
  18. package/dist/common/errors/captcha-error.d.ts +15 -0
  19. package/dist/common/errors/intent-to-join.d.ts +16 -0
  20. package/dist/common/errors/join-forbidden-error.js +52 -0
  21. package/dist/common/errors/join-forbidden-error.js.map +1 -0
  22. package/dist/common/errors/join-meeting.d.ts +17 -0
  23. package/dist/common/errors/{webinar-registration-error.js → join-webinar-error.js} +12 -12
  24. package/dist/common/errors/join-webinar-error.js.map +1 -0
  25. package/dist/common/errors/media.d.ts +15 -0
  26. package/dist/common/errors/multistream-not-supported-error.js +53 -0
  27. package/dist/common/errors/multistream-not-supported-error.js.map +1 -0
  28. package/dist/common/errors/no-meeting-info.d.ts +14 -0
  29. package/dist/common/errors/parameter.d.ts +15 -0
  30. package/dist/common/errors/password-error.d.ts +15 -0
  31. package/dist/common/errors/permission.d.ts +14 -0
  32. package/dist/common/errors/reclaim-host-role-error.js +149 -0
  33. package/dist/common/errors/reclaim-host-role-error.js.map +1 -0
  34. package/dist/common/errors/reclaim-host-role-errors.d.ts +60 -0
  35. package/dist/common/errors/reconnection-in-progress.d.ts +9 -0
  36. package/dist/common/errors/reconnection-in-progress.js +33 -0
  37. package/dist/common/errors/reconnection-in-progress.js.map +1 -0
  38. package/dist/common/errors/reconnection.d.ts +15 -0
  39. package/dist/common/errors/stats.d.ts +15 -0
  40. package/dist/common/errors/webex-errors.d.ts +93 -0
  41. package/dist/common/errors/webex-meetings-error.d.ts +20 -0
  42. package/dist/common/events/events-scope.d.ts +17 -0
  43. package/dist/common/events/events.d.ts +12 -0
  44. package/dist/common/events/trigger-proxy.d.ts +2 -0
  45. package/dist/common/events/util.d.ts +2 -0
  46. package/dist/common/logs/logger-config.d.ts +2 -0
  47. package/dist/common/logs/logger-proxy.d.ts +2 -0
  48. package/dist/common/logs/request.d.ts +36 -0
  49. package/dist/common/queue.d.ts +34 -0
  50. package/dist/config.d.ts +72 -0
  51. package/dist/config.js +2 -1
  52. package/dist/config.js.map +1 -1
  53. package/dist/constants.d.ts +1088 -0
  54. package/dist/constants.js +68 -6
  55. package/dist/constants.js.map +1 -1
  56. package/dist/controls-options-manager/constants.d.ts +4 -0
  57. package/dist/controls-options-manager/enums.d.ts +15 -0
  58. package/dist/controls-options-manager/index.d.ts +136 -0
  59. package/dist/controls-options-manager/types.d.ts +43 -0
  60. package/dist/controls-options-manager/util.d.ts +1 -0
  61. package/dist/index.d.ts +7 -0
  62. package/dist/index.js +16 -11
  63. package/dist/index.js.map +1 -1
  64. package/dist/interceptors/index.d.ts +2 -0
  65. package/dist/interceptors/locusRetry.d.ts +27 -0
  66. package/dist/interpretation/collection.d.ts +5 -0
  67. package/dist/interpretation/index.d.ts +5 -0
  68. package/dist/interpretation/index.js +1 -1
  69. package/dist/interpretation/siLanguage.d.ts +5 -0
  70. package/dist/interpretation/siLanguage.js +1 -1
  71. package/dist/locus-info/controlsUtils.d.ts +2 -0
  72. package/dist/locus-info/embeddedAppsUtils.d.ts +2 -0
  73. package/dist/locus-info/fullState.d.ts +2 -0
  74. package/dist/locus-info/hostUtils.d.ts +2 -0
  75. package/dist/locus-info/index.d.ts +322 -0
  76. package/dist/locus-info/index.js +14 -3
  77. package/dist/locus-info/index.js.map +1 -1
  78. package/dist/locus-info/infoUtils.d.ts +2 -0
  79. package/dist/locus-info/mediaSharesUtils.d.ts +2 -0
  80. package/dist/locus-info/parser.d.ts +272 -0
  81. package/dist/locus-info/selfUtils.d.ts +2 -0
  82. package/dist/locus-info/selfUtils.js +35 -17
  83. package/dist/locus-info/selfUtils.js.map +1 -1
  84. package/dist/media/MediaConnectionAwaiter.js +1 -0
  85. package/dist/media/MediaConnectionAwaiter.js.map +1 -1
  86. package/dist/media/index.d.ts +34 -0
  87. package/dist/media/properties.d.ts +93 -0
  88. package/dist/media/properties.js +30 -16
  89. package/dist/media/properties.js.map +1 -1
  90. package/dist/media/util.d.ts +2 -0
  91. package/dist/mediaQualityMetrics/config.d.ts +241 -0
  92. package/dist/mediaQualityMetrics/config.js +502 -0
  93. package/dist/mediaQualityMetrics/config.js.map +1 -0
  94. package/dist/meeting/brbState.js +167 -0
  95. package/dist/meeting/brbState.js.map +1 -0
  96. package/dist/meeting/effectsState.js +260 -0
  97. package/dist/meeting/effectsState.js.map +1 -0
  98. package/dist/meeting/in-meeting-actions.d.ts +167 -0
  99. package/dist/meeting/in-meeting-actions.js +13 -1
  100. package/dist/meeting/in-meeting-actions.js.map +1 -1
  101. package/dist/meeting/index.d.ts +1825 -0
  102. package/dist/meeting/index.js +1331 -1051
  103. package/dist/meeting/index.js.map +1 -1
  104. package/dist/meeting/locusMediaRequest.d.ts +74 -0
  105. package/dist/meeting/locusMediaRequest.js +11 -6
  106. package/dist/meeting/locusMediaRequest.js.map +1 -1
  107. package/dist/meeting/muteState.d.ts +178 -0
  108. package/dist/meeting/muteState.js +1 -6
  109. package/dist/meeting/muteState.js.map +1 -1
  110. package/dist/meeting/request.d.ts +295 -0
  111. package/dist/meeting/request.js +51 -29
  112. package/dist/meeting/request.js.map +1 -1
  113. package/dist/meeting/request.type.d.ts +11 -0
  114. package/dist/meeting/request.type.js.map +1 -1
  115. package/dist/meeting/state.d.ts +9 -0
  116. package/dist/meeting/util.d.ts +119 -0
  117. package/dist/meeting/util.js +103 -67
  118. package/dist/meeting/util.js.map +1 -1
  119. package/dist/meeting/voicea-meeting.d.ts +16 -0
  120. package/dist/meeting-info/collection.d.ts +20 -0
  121. package/dist/meeting-info/index.d.ts +69 -0
  122. package/dist/meeting-info/meeting-info-v2.d.ts +123 -0
  123. package/dist/meeting-info/meeting-info-v2.js +115 -45
  124. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  125. package/dist/meeting-info/request.d.ts +22 -0
  126. package/dist/meeting-info/util.d.ts +2 -0
  127. package/dist/meeting-info/utilv2.d.ts +2 -0
  128. package/dist/meeting-info/utilv2.js +6 -2
  129. package/dist/meeting-info/utilv2.js.map +1 -1
  130. package/dist/meetings/collection.d.ts +40 -0
  131. package/dist/meetings/index.d.ts +390 -0
  132. package/dist/meetings/index.js +107 -55
  133. package/dist/meetings/index.js.map +1 -1
  134. package/dist/meetings/meetings.types.d.ts +4 -0
  135. package/dist/meetings/meetings.types.js +2 -0
  136. package/dist/meetings/meetings.types.js.map +1 -1
  137. package/dist/meetings/request.d.ts +27 -0
  138. package/dist/meetings/util.d.ts +18 -0
  139. package/dist/meetings/util.js +1 -1
  140. package/dist/meetings/util.js.map +1 -1
  141. package/dist/member/index.d.ts +160 -0
  142. package/dist/member/index.js +9 -0
  143. package/dist/member/index.js.map +1 -1
  144. package/dist/member/member.types.js +17 -0
  145. package/dist/member/member.types.js.map +1 -0
  146. package/dist/member/types.d.ts +32 -0
  147. package/dist/member/types.js.map +1 -1
  148. package/dist/member/util.d.ts +2 -0
  149. package/dist/member/util.js +39 -28
  150. package/dist/member/util.js.map +1 -1
  151. package/dist/members/collection.d.ts +29 -0
  152. package/dist/members/index.d.ts +353 -0
  153. package/dist/members/request.d.ts +114 -0
  154. package/dist/members/types.d.ts +25 -0
  155. package/dist/members/util.d.ts +215 -0
  156. package/dist/members/util.js +4 -2
  157. package/dist/members/util.js.map +1 -1
  158. package/dist/metrics/config.js +276 -0
  159. package/dist/metrics/config.js.map +1 -0
  160. package/dist/metrics/constants.d.ts +70 -0
  161. package/dist/metrics/constants.js +6 -1
  162. package/dist/metrics/constants.js.map +1 -1
  163. package/dist/metrics/index.d.ts +45 -0
  164. package/dist/multistream/mediaRequestManager.d.ts +119 -0
  165. package/dist/multistream/receiveSlot.d.ts +68 -0
  166. package/dist/multistream/receiveSlotManager.d.ts +56 -0
  167. package/dist/multistream/remoteMedia.d.ts +72 -0
  168. package/dist/multistream/remoteMedia.js +30 -15
  169. package/dist/multistream/remoteMedia.js.map +1 -1
  170. package/dist/multistream/remoteMediaGroup.d.ts +49 -0
  171. package/dist/multistream/remoteMediaManager.d.ts +300 -0
  172. package/dist/multistream/sendSlotManager.d.ts +69 -0
  173. package/dist/multistream/sendSlotManager.js +24 -0
  174. package/dist/multistream/sendSlotManager.js.map +1 -1
  175. package/dist/networkQualityMonitor/index.d.ts +70 -0
  176. package/dist/networkQualityMonitor/index.js +13 -19
  177. package/dist/networkQualityMonitor/index.js.map +1 -1
  178. package/dist/peer-connection-manager/index.js +671 -0
  179. package/dist/peer-connection-manager/index.js.map +1 -0
  180. package/dist/peer-connection-manager/util.js +109 -0
  181. package/dist/peer-connection-manager/util.js.map +1 -0
  182. package/dist/personal-meeting-room/index.d.ts +47 -0
  183. package/dist/personal-meeting-room/request.d.ts +14 -0
  184. package/dist/personal-meeting-room/util.d.ts +2 -0
  185. package/dist/reachability/clusterReachability.d.ts +109 -0
  186. package/dist/reachability/clusterReachability.js +12 -15
  187. package/dist/reachability/clusterReachability.js.map +1 -1
  188. package/dist/reachability/index.d.ts +105 -0
  189. package/dist/reachability/index.js +461 -136
  190. package/dist/reachability/index.js.map +1 -1
  191. package/dist/reachability/reachability.types.js +7 -0
  192. package/dist/reachability/reachability.types.js.map +1 -0
  193. package/dist/reachability/request.d.ts +39 -0
  194. package/dist/reachability/request.js +21 -8
  195. package/dist/reachability/request.js.map +1 -1
  196. package/dist/reachability/util.d.ts +8 -0
  197. package/dist/reactions/constants.d.ts +3 -0
  198. package/dist/reactions/reactions.d.ts +4 -0
  199. package/dist/reactions/reactions.type.d.ts +52 -0
  200. package/dist/reconnection-manager/index.d.ts +136 -0
  201. package/dist/recording-controller/enums.d.ts +7 -0
  202. package/dist/recording-controller/enums.js +8 -4
  203. package/dist/recording-controller/enums.js.map +1 -1
  204. package/dist/recording-controller/index.d.ts +207 -0
  205. package/dist/recording-controller/index.js +18 -9
  206. package/dist/recording-controller/index.js.map +1 -1
  207. package/dist/recording-controller/util.d.ts +14 -0
  208. package/dist/recording-controller/util.js +13 -9
  209. package/dist/recording-controller/util.js.map +1 -1
  210. package/dist/roap/collection.js +62 -0
  211. package/dist/roap/collection.js.map +1 -0
  212. package/dist/roap/handler.js +275 -0
  213. package/dist/roap/handler.js.map +1 -0
  214. package/dist/roap/index.d.ts +86 -0
  215. package/dist/roap/index.js +15 -15
  216. package/dist/roap/index.js.map +1 -1
  217. package/dist/roap/request.d.ts +39 -0
  218. package/dist/roap/request.js +45 -79
  219. package/dist/roap/request.js.map +1 -1
  220. package/dist/roap/state.js +126 -0
  221. package/dist/roap/state.js.map +1 -0
  222. package/dist/roap/turnDiscovery.d.ts +155 -0
  223. package/dist/roap/turnDiscovery.js +3 -6
  224. package/dist/roap/turnDiscovery.js.map +1 -1
  225. package/dist/roap/util.js +75 -0
  226. package/dist/roap/util.js.map +1 -0
  227. package/dist/rtcMetrics/constants.d.ts +4 -0
  228. package/dist/rtcMetrics/index.d.ts +61 -0
  229. package/dist/statsAnalyzer/global.d.ts +36 -0
  230. package/dist/statsAnalyzer/global.js +126 -0
  231. package/dist/statsAnalyzer/global.js.map +1 -0
  232. package/dist/statsAnalyzer/index.d.ts +217 -0
  233. package/dist/statsAnalyzer/index.js +1013 -0
  234. package/dist/statsAnalyzer/index.js.map +1 -0
  235. package/dist/statsAnalyzer/mqaUtil.d.ts +48 -0
  236. package/dist/statsAnalyzer/mqaUtil.js +179 -0
  237. package/dist/statsAnalyzer/mqaUtil.js.map +1 -0
  238. package/dist/transcription/index.d.ts +64 -0
  239. package/dist/types/annotation/index.d.ts +5 -0
  240. package/dist/types/common/errors/join-forbidden-error.d.ts +15 -0
  241. package/dist/types/common/errors/{webinar-registration-error.d.ts → join-webinar-error.d.ts} +2 -2
  242. package/dist/types/common/errors/multistream-not-supported-error.d.ts +17 -0
  243. package/dist/types/common/errors/reconnection-in-progress.d.ts +9 -0
  244. package/dist/types/config.d.ts +1 -0
  245. package/dist/types/constants.d.ts +53 -1
  246. package/dist/types/index.d.ts +3 -3
  247. package/dist/types/locus-info/index.d.ts +2 -1
  248. package/dist/types/mediaQualityMetrics/config.d.ts +241 -0
  249. package/dist/types/meeting/brbState.d.ts +54 -0
  250. package/dist/types/meeting/in-meeting-actions.d.ts +12 -0
  251. package/dist/types/meeting/index.d.ts +64 -14
  252. package/dist/types/meeting/locusMediaRequest.d.ts +6 -3
  253. package/dist/types/meeting/request.d.ts +14 -3
  254. package/dist/types/meeting/request.type.d.ts +6 -0
  255. package/dist/types/meeting/util.d.ts +3 -3
  256. package/dist/types/meeting-info/meeting-info-v2.d.ts +30 -5
  257. package/dist/types/meetings/index.d.ts +20 -2
  258. package/dist/types/meetings/meetings.types.d.ts +8 -0
  259. package/dist/types/member/index.d.ts +1 -0
  260. package/dist/types/member/types.d.ts +7 -0
  261. package/dist/types/members/util.d.ts +2 -0
  262. package/dist/types/metrics/constants.d.ts +6 -1
  263. package/dist/types/multistream/sendSlotManager.d.ts +8 -1
  264. package/dist/types/reachability/clusterReachability.d.ts +1 -10
  265. package/dist/types/reachability/index.d.ts +83 -36
  266. package/dist/types/reachability/reachability.types.d.ts +64 -0
  267. package/dist/types/reachability/request.d.ts +5 -1
  268. package/dist/types/recording-controller/enums.d.ts +5 -2
  269. package/dist/types/recording-controller/index.d.ts +1 -0
  270. package/dist/types/recording-controller/util.d.ts +2 -1
  271. package/dist/types/roap/request.d.ts +1 -13
  272. package/dist/types/statsAnalyzer/global.d.ts +36 -0
  273. package/dist/types/statsAnalyzer/index.d.ts +217 -0
  274. package/dist/types/statsAnalyzer/mqaUtil.d.ts +48 -0
  275. package/dist/webinar/collection.d.ts +16 -0
  276. package/dist/webinar/index.d.ts +5 -0
  277. package/dist/webinar/index.js +390 -7
  278. package/dist/webinar/index.js.map +1 -1
  279. package/package.json +23 -22
  280. package/src/annotation/index.ts +16 -0
  281. package/src/common/errors/join-forbidden-error.ts +26 -0
  282. package/src/common/errors/join-webinar-error.ts +24 -0
  283. package/src/common/errors/multistream-not-supported-error.ts +30 -0
  284. package/src/config.ts +1 -0
  285. package/src/constants.ts +61 -3
  286. package/src/index.ts +5 -3
  287. package/src/locus-info/index.ts +20 -3
  288. package/src/locus-info/selfUtils.ts +24 -6
  289. package/src/media/MediaConnectionAwaiter.ts +2 -0
  290. package/src/media/properties.ts +34 -13
  291. package/src/meeting/brbState.ts +169 -0
  292. package/src/meeting/in-meeting-actions.ts +25 -0
  293. package/src/meeting/index.ts +443 -87
  294. package/src/meeting/locusMediaRequest.ts +11 -8
  295. package/src/meeting/muteState.ts +1 -6
  296. package/src/meeting/request.ts +30 -12
  297. package/src/meeting/request.type.ts +7 -0
  298. package/src/meeting/util.ts +32 -13
  299. package/src/meeting-info/meeting-info-v2.ts +83 -12
  300. package/src/meeting-info/utilv2.ts +17 -3
  301. package/src/meetings/index.ts +79 -20
  302. package/src/meetings/meetings.types.ts +10 -0
  303. package/src/meetings/util.ts +2 -1
  304. package/src/member/index.ts +9 -0
  305. package/src/member/types.ts +8 -0
  306. package/src/member/util.ts +34 -24
  307. package/src/members/util.ts +1 -0
  308. package/src/metrics/constants.ts +6 -1
  309. package/src/multistream/remoteMedia.ts +28 -15
  310. package/src/multistream/sendSlotManager.ts +31 -0
  311. package/src/reachability/clusterReachability.ts +5 -15
  312. package/src/reachability/index.ts +311 -75
  313. package/src/reachability/reachability.types.ts +85 -0
  314. package/src/reachability/request.ts +55 -31
  315. package/src/recording-controller/enums.ts +5 -2
  316. package/src/recording-controller/index.ts +17 -4
  317. package/src/recording-controller/util.ts +20 -5
  318. package/src/roap/index.ts +14 -13
  319. package/src/roap/request.ts +30 -44
  320. package/src/roap/turnDiscovery.ts +2 -4
  321. package/src/webinar/index.ts +235 -9
  322. package/test/unit/spec/annotation/index.ts +46 -1
  323. package/test/unit/spec/locus-info/index.js +292 -60
  324. package/test/unit/spec/locus-info/selfConstant.js +7 -0
  325. package/test/unit/spec/locus-info/selfUtils.js +101 -1
  326. package/test/unit/spec/media/properties.ts +15 -0
  327. package/test/unit/spec/meeting/brbState.ts +114 -0
  328. package/test/unit/spec/meeting/in-meeting-actions.ts +15 -1
  329. package/test/unit/spec/meeting/index.js +851 -107
  330. package/test/unit/spec/meeting/locusMediaRequest.ts +18 -11
  331. package/test/unit/spec/meeting/muteState.js +0 -24
  332. package/test/unit/spec/meeting/request.js +3 -26
  333. package/test/unit/spec/meeting/utils.js +73 -28
  334. package/test/unit/spec/meeting-info/meetinginfov2.js +46 -4
  335. package/test/unit/spec/meeting-info/utilv2.js +26 -0
  336. package/test/unit/spec/meetings/index.js +159 -18
  337. package/test/unit/spec/meetings/utils.js +10 -0
  338. package/test/unit/spec/member/util.js +52 -11
  339. package/test/unit/spec/members/utils.js +95 -0
  340. package/test/unit/spec/multistream/remoteMedia.ts +11 -7
  341. package/test/unit/spec/reachability/clusterReachability.ts +7 -0
  342. package/test/unit/spec/reachability/index.ts +383 -9
  343. package/test/unit/spec/reachability/request.js +48 -12
  344. package/test/unit/spec/recording-controller/index.js +61 -5
  345. package/test/unit/spec/recording-controller/util.js +39 -3
  346. package/test/unit/spec/roap/index.ts +48 -1
  347. package/test/unit/spec/roap/request.ts +51 -109
  348. package/test/unit/spec/roap/turnDiscovery.ts +202 -147
  349. package/test/unit/spec/webinar/index.ts +504 -0
  350. package/dist/common/errors/webinar-registration-error.js.map +0 -1
  351. package/src/common/errors/webinar-registration-error.ts +0 -27
@@ -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({
@@ -346,4 +342,11 @@ export class LocusMediaRequest extends WebexPlugin {
346
342
  public isConfluenceCreated() {
347
343
  return this.confluenceState === 'created';
348
344
  }
345
+
346
+ /**
347
+ * This method needs to be called when we downgrade from multistream to transcoded connection.
348
+ */
349
+ public downgradeFromMultistreamToTranscoded() {
350
+ this.config.preferTranscoding = true;
351
+ }
349
352
  }
@@ -379,12 +379,7 @@ export class MuteState {
379
379
  }
380
380
  if (muted !== undefined) {
381
381
  this.state.server.remoteMute = muted;
382
-
383
- // We never want to unmute the local stream from a server remote mute update.
384
- // Moderated unmute is handled by a different function.
385
- if (muted) {
386
- this.muteLocalStream(meeting, muted, 'remotelyMuted');
387
- }
382
+ this.muteLocalStream(meeting, muted, 'remotelyMuted');
388
383
  }
389
384
  }
390
385
 
@@ -26,11 +26,11 @@ import {
26
26
  SEND_DTMF_ENDPOINT,
27
27
  _SLIDES_,
28
28
  ANNOTATION,
29
- IP_VERSION,
30
29
  } from '../constants';
31
- import {SendReactionOptions, ToggleReactionsOptions} from './request.type';
30
+ import {SendReactionOptions, BrbOptions, 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) {
@@ -916,4 +909,29 @@ export default class MeetingRequest extends StatelessWebexPlugin {
916
909
  uri: locusUrl,
917
910
  });
918
911
  }
912
+
913
+ /**
914
+ * Sends a request to set be right back status.
915
+ *
916
+ * @param {Object} options - The options for brb request.
917
+ * @param {boolean} options.enabled - Whether brb status is enabled.
918
+ * @param {string} options.locusUrl - The URL of the locus.
919
+ * @param {string} options.deviceUrl - The URL of the device.
920
+ * @param {string} options.selfId - The ID of the participant.
921
+ * @returns {Promise}
922
+ */
923
+ setBrb({enabled, locusUrl, deviceUrl, selfId}: BrbOptions) {
924
+ const uri = `${locusUrl}/${PARTICIPANT}/${selfId}/${CONTROLS}`;
925
+
926
+ return this.locusDeltaRequest({
927
+ method: HTTP_VERBS.PATCH,
928
+ uri,
929
+ body: {
930
+ brb: {
931
+ enabled,
932
+ deviceUrl,
933
+ },
934
+ },
935
+ });
936
+ }
919
937
  }
@@ -11,3 +11,10 @@ export type ToggleReactionsOptions = {
11
11
  locusUrl: string;
12
12
  requestingParticipantId: string;
13
13
  };
14
+
15
+ export type BrbOptions = {
16
+ enabled: boolean;
17
+ locusUrl: string;
18
+ deviceUrl: string;
19
+ selfId: string;
20
+ };
@@ -115,7 +115,7 @@ const MeetingUtil = {
115
115
  return IP_VERSION.unknown;
116
116
  },
117
117
 
118
- joinMeeting: (meeting, options) => {
118
+ joinMeeting: async (meeting, options) => {
119
119
  if (!meeting) {
120
120
  return Promise.reject(new ParameterError('You need a meeting object.'));
121
121
  }
@@ -127,6 +127,31 @@ const MeetingUtil = {
127
127
  options: {meetingId: meeting.id},
128
128
  });
129
129
 
130
+ let reachability;
131
+ let clientMediaPreferences = {
132
+ // bare minimum fallback value that should allow us to join
133
+ ipver: IP_VERSION.unknown,
134
+ joinCookie: undefined,
135
+ preferTranscoding: !meeting.isMultistream,
136
+ };
137
+
138
+ try {
139
+ clientMediaPreferences = await webex.meetings.reachability.getClientMediaPreferences(
140
+ meeting.isMultistream,
141
+ MeetingUtil.getIpVersion(webex)
142
+ );
143
+ if (options.roapMessage) {
144
+ // we only need to attach reachability if we are sending a roap message
145
+ // sending reachability on its own will cause Locus to reject our join request
146
+ reachability = await webex.meetings.reachability.getReachabilityReportToAttachToRoap();
147
+ }
148
+ } catch (e) {
149
+ LoggerProxy.logger.error(
150
+ 'Meeting:util#joinMeeting --> Error getting reachability or clientMediaPreferences:',
151
+ e
152
+ );
153
+ }
154
+
130
155
  // eslint-disable-next-line no-warning-comments
131
156
  // TODO: check if the meeting is in JOINING state
132
157
  // if Joining state termintate the request as user might click multiple times
@@ -138,20 +163,19 @@ const MeetingUtil = {
138
163
  locusUrl: meeting.locusUrl,
139
164
  locusClusterUrl: meeting.meetingInfo?.locusClusterUrl,
140
165
  correlationId: meeting.correlationId,
141
- reachability: options.reachability,
166
+ reachability,
142
167
  roapMessage: options.roapMessage,
143
168
  permissionToken: meeting.permissionToken,
144
169
  resourceId: options.resourceId || null,
145
170
  moderator: options.moderator,
146
171
  pin: options.pin,
147
172
  moveToResource: options.moveToResource,
148
- preferTranscoding: !meeting.isMultistream,
149
173
  asResourceOccupant: options.asResourceOccupant,
150
174
  breakoutsSupported: options.breakoutsSupported,
151
175
  locale: options.locale,
152
176
  deviceCapabilities: options.deviceCapabilities,
153
177
  liveAnnotationSupported: options.liveAnnotationSupported,
154
- ipVersion: MeetingUtil.getIpVersion(meeting.getWebexObject()),
178
+ clientMediaPreferences,
155
179
  })
156
180
  .then((res) => {
157
181
  const parsed = MeetingUtil.parseLocusJoin(res);
@@ -177,6 +201,7 @@ const MeetingUtil = {
177
201
 
178
202
  cleanUp: (meeting) => {
179
203
  meeting.getWebexObject().internal.device.meetingEnded();
204
+ meeting.stopPeriodicLogUpload();
180
205
 
181
206
  meeting.breakouts.cleanUp();
182
207
  meeting.simultaneousInterpretation.cleanUp();
@@ -420,6 +445,9 @@ const MeetingUtil = {
420
445
  displayHints.includes(DISPLAY_HINTS.LEAVE_END_MEETING),
421
446
 
422
447
  canManageBreakout: (displayHints) => displayHints.includes(DISPLAY_HINTS.BREAKOUT_MANAGEMENT),
448
+
449
+ canStartBreakout: (displayHints) => !displayHints.includes(DISPLAY_HINTS.DISABLE_BREAKOUT_START),
450
+
423
451
  canBroadcastMessageToBreakout: (displayHints, policies = {}) =>
424
452
  displayHints.includes(DISPLAY_HINTS.BROADCAST_MESSAGE_TO_BREAKOUT) &&
425
453
  !!policies[SELF_POLICY.SUPPORT_BROADCAST_MESSAGE],
@@ -475,15 +503,6 @@ const MeetingUtil = {
475
503
  }
476
504
  },
477
505
 
478
- handleDeviceLogging: (devices = []) => {
479
- const LOG_HEADER = 'MeetingUtil#handleDeviceLogging -->';
480
-
481
- devices.forEach((device) => {
482
- LoggerProxy.logger.log(LOG_HEADER, `deviceId = ${device.deviceId}`);
483
- LoggerProxy.logger.log(LOG_HEADER, 'settings', JSON.stringify(device));
484
- });
485
- },
486
-
487
506
  endMeetingForAll: (meeting) => {
488
507
  if (meeting.meetingState === FULL_STATE.INACTIVE) {
489
508
  return Promise.reject(new MeetingNotActiveError());
@@ -17,8 +17,23 @@ const CAPTCHA_ERROR_DEFAULT_MESSAGE =
17
17
  const ADHOC_MEETING_DEFAULT_ERROR =
18
18
  'Failed starting the adhoc meeting, Please contact support team ';
19
19
  const CAPTCHA_ERROR_REQUIRES_PASSWORD_CODES = [423005, 423006];
20
+ const CAPTCHA_ERROR_REQUIRES_REGISTRATION_ID_CODES = [423007];
21
+
20
22
  const POLICY_ERROR_CODES = [403049, 403104, 403103, 403048, 403102, 403101];
21
- const WEBINAR_REGISTRATION_ERROR_CODES = [403021, 403022, 403024];
23
+ const JOIN_FORBIDDEN_CODES = [403003];
24
+ /**
25
+ * 403021 - Meeting registration is required
26
+ * 403022 - Meeting registration is still pending
27
+ * 403024 - Meeting registration have been rejected
28
+ * 403137 - Registration ID verified failure
29
+ * 423007 - Registration ID input too many time,please input captcha code
30
+ * 403026 - Need to join meeting via webcast
31
+ * 403037 - Meeting join required registration ID
32
+ * 403137 - Registration ID verified failure
33
+ *
34
+ */
35
+ const JOIN_WEBINAR_ERROR_CODES = [403021, 403022, 403024, 403137, 423007, 403026, 403037, 403137];
36
+
22
37
  /**
23
38
  * Error to indicate that wbxappapi requires a password
24
39
  */
@@ -100,6 +115,7 @@ export class MeetingInfoV2PolicyError extends Error {
100
115
  export class MeetingInfoV2CaptchaError extends Error {
101
116
  captchaInfo: any;
102
117
  isPasswordRequired: any;
118
+ isRegistrationIdRequired: any;
103
119
  sdkMessage: any;
104
120
  wbxAppApiCode: any;
105
121
  body: any;
@@ -121,14 +137,41 @@ export class MeetingInfoV2CaptchaError extends Error {
121
137
  this.stack = new Error().stack;
122
138
  this.wbxAppApiCode = wbxAppApiErrorCode;
123
139
  this.isPasswordRequired = CAPTCHA_ERROR_REQUIRES_PASSWORD_CODES.includes(wbxAppApiErrorCode);
140
+ this.isRegistrationIdRequired =
141
+ CAPTCHA_ERROR_REQUIRES_REGISTRATION_ID_CODES.includes(wbxAppApiErrorCode);
124
142
  this.captchaInfo = captchaInfo;
125
143
  }
126
144
  }
127
145
 
128
146
  /**
129
- * Error preventing join because of a webinar registration error
147
+ * Error preventing join because of a webinar have some error
148
+ */
149
+ export class MeetingInfoV2JoinWebinarError extends Error {
150
+ meetingInfo: any;
151
+ sdkMessage: any;
152
+ wbxAppApiCode: any;
153
+ body: any;
154
+ /**
155
+ *
156
+ * @constructor
157
+ * @param {Number} [wbxAppApiErrorCode]
158
+ * @param {Object} [meetingInfo]
159
+ * @param {String} [message]
160
+ */
161
+ constructor(wbxAppApiErrorCode?: number, meetingInfo?: object, message?: string) {
162
+ super(`${message}, code=${wbxAppApiErrorCode}`);
163
+ this.name = 'MeetingInfoV2JoinWebinarError';
164
+ this.sdkMessage = message;
165
+ this.stack = new Error().stack;
166
+ this.wbxAppApiCode = wbxAppApiErrorCode;
167
+ this.meetingInfo = meetingInfo;
168
+ }
169
+ }
170
+
171
+ /**
172
+ * Error preventing join because of a forbidden error
130
173
  */
131
- export class MeetingInfoV2WebinarRegistrationError extends Error {
174
+ export class MeetingInfoV2JoinForbiddenError extends Error {
132
175
  meetingInfo: any;
133
176
  sdkMessage: any;
134
177
  wbxAppApiCode: any;
@@ -142,7 +185,7 @@ export class MeetingInfoV2WebinarRegistrationError extends Error {
142
185
  */
143
186
  constructor(wbxAppApiErrorCode?: number, meetingInfo?: object, message?: string) {
144
187
  super(`${message}, code=${wbxAppApiErrorCode}`);
145
- this.name = 'MeetingInfoV2WebinarRegistrationError';
188
+ this.name = 'MeetingInfoV2JoinForbiddenError';
146
189
  this.sdkMessage = message;
147
190
  this.stack = new Error().stack;
148
191
  this.wbxAppApiCode = wbxAppApiErrorCode;
@@ -204,21 +247,44 @@ export default class MeetingInfoV2 {
204
247
  };
205
248
 
206
249
  /**
207
- * Raises a handleWebinarRegistrationError for webinar registration error codes
250
+ * Raises a handleJoinWebinarError for join webinar error codes
251
+ * @param {any} err the error from the request
252
+ * @returns {void}
253
+ */
254
+ handleJoinWebinarError = (err) => {
255
+ if (!err.body) {
256
+ return;
257
+ }
258
+
259
+ if (JOIN_WEBINAR_ERROR_CODES.includes(err.body?.code)) {
260
+ Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.JOIN_WEBINAR_ERROR, {
261
+ code: err.body?.code,
262
+ });
263
+
264
+ throw new MeetingInfoV2JoinWebinarError(
265
+ err.body?.code,
266
+ err.body?.data?.meetingInfo,
267
+ err.body?.message
268
+ );
269
+ }
270
+ };
271
+
272
+ /**
273
+ * Raises a handleForbiddenError for join meeting forbidden error
208
274
  * @param {any} err the error from the request
209
275
  * @returns {void}
210
276
  */
211
- handleWebinarRegistrationError = (err) => {
277
+ handleForbiddenError = (err) => {
212
278
  if (!err.body) {
213
279
  return;
214
280
  }
215
281
 
216
- if (WEBINAR_REGISTRATION_ERROR_CODES.includes(err.body?.code)) {
217
- Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.WEBINAR_REGISTRATION_ERROR, {
282
+ if (JOIN_FORBIDDEN_CODES.includes(err.body?.code)) {
283
+ Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.JOIN_FORBIDDEN_ERROR, {
218
284
  code: err.body?.code,
219
285
  });
220
286
 
221
- throw new MeetingInfoV2WebinarRegistrationError(
287
+ throw new MeetingInfoV2JoinForbiddenError(
222
288
  err.body?.code,
223
289
  err.body?.data?.meetingInfo,
224
290
  err.body?.message
@@ -286,7 +352,8 @@ export default class MeetingInfoV2 {
286
352
  })
287
353
  .catch((err) => {
288
354
  this.handlePolicyError(err);
289
- this.handleWebinarRegistrationError(err);
355
+ this.handleJoinWebinarError(err);
356
+ this.handleForbiddenError(err);
290
357
 
291
358
  Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.ADHOC_MEETING_FAILURE, {
292
359
  reason: err.message,
@@ -308,6 +375,7 @@ export default class MeetingInfoV2 {
308
375
  * @param {String} locusId
309
376
  * @param {Object} extraParams
310
377
  * @param {Object} options
378
+ * @param {String} registrationId
311
379
  * @returns {Promise} returns a meeting info object
312
380
  * @public
313
381
  * @memberof MeetingInfo
@@ -323,7 +391,8 @@ export default class MeetingInfoV2 {
323
391
  installedOrgID = null,
324
392
  locusId = null,
325
393
  extraParams: object = {},
326
- options: {meetingId?: string; sendCAevents?: boolean} = {}
394
+ options: {meetingId?: string; sendCAevents?: boolean} = {},
395
+ registrationId: string = null
327
396
  ) {
328
397
  const {meetingId, sendCAevents} = options;
329
398
 
@@ -348,6 +417,7 @@ export default class MeetingInfoV2 {
348
417
  installedOrgID,
349
418
  locusId,
350
419
  extraParams,
420
+ registrationId,
351
421
  });
352
422
 
353
423
  // If the body only contains the default properties, we don't have enough to
@@ -441,7 +511,8 @@ export default class MeetingInfoV2 {
441
511
 
442
512
  if (err?.statusCode === 403) {
443
513
  this.handlePolicyError(err);
444
- this.handleWebinarRegistrationError(err);
514
+ this.handleJoinWebinarError(err);
515
+ this.handleForbiddenError(err);
445
516
 
446
517
  Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.VERIFY_PASSWORD_ERROR, {
447
518
  reason: err.message,
@@ -19,6 +19,7 @@ import {
19
19
  UUID_REG,
20
20
  VALID_EMAIL_ADDRESS,
21
21
  DEFAULT_MEETING_INFO_REQUEST_BODY,
22
+ JOIN_LINK_MTID,
22
23
  } from '../constants';
23
24
  import ParameterError from '../common/errors/parameter';
24
25
  import LoggerProxy from '../common/logs/logger-proxy';
@@ -70,7 +71,8 @@ export default class MeetingInfoUtil {
70
71
  parsedUrl.pathname.includes(`/${MEET_M}`) ||
71
72
  parsedUrl.pathname.includes(`/${MEET_CISCO}`) ||
72
73
  parsedUrl.pathname.includes(`/${MEET_CO}`) ||
73
- parsedUrl.pathname.includes(`/${JOIN}`));
74
+ parsedUrl.pathname.includes(`/${JOIN}`) ||
75
+ (parsedUrl.search && parsedUrl.search.includes(JOIN_LINK_MTID)));
74
76
  }
75
77
 
76
78
  return hostNameBool && pathNameBool;
@@ -226,8 +228,16 @@ export default class MeetingInfoUtil {
226
228
  * @returns {Object} returns an object with {resource, method}
227
229
  */
228
230
  static getRequestBody(options: {type: DESTINATION_TYPE; destination: object} | any) {
229
- const {type, destination, password, captchaInfo, installedOrgID, locusId, extraParams} =
230
- options;
231
+ const {
232
+ type,
233
+ destination,
234
+ password,
235
+ captchaInfo,
236
+ installedOrgID,
237
+ locusId,
238
+ extraParams,
239
+ registrationId,
240
+ } = options;
231
241
  const body: any = {
232
242
  ...DEFAULT_MEETING_INFO_REQUEST_BODY,
233
243
  ...extraParams,
@@ -269,6 +279,10 @@ export default class MeetingInfoUtil {
269
279
  body.password = password;
270
280
  }
271
281
 
282
+ if (registrationId) {
283
+ body.registrationId = registrationId;
284
+ }
285
+
272
286
  if (captchaInfo) {
273
287
  body.captchaID = captchaInfo.id;
274
288
  body.captchaVerifyCode = captchaInfo.code;
@@ -1,5 +1,5 @@
1
1
  /* eslint no-shadow: ["error", { "allow": ["eventType"] }] */
2
- import {cloneDeep} from 'lodash';
2
+ import {cloneDeep, clone} from 'lodash';
3
3
  import '@webex/internal-plugin-mercury';
4
4
  import '@webex/internal-plugin-conversation';
5
5
  import '@webex/internal-plugin-metrics';
@@ -42,6 +42,7 @@ import {
42
42
  _ON_HOLD_LOBBY_,
43
43
  _WAIT_,
44
44
  DESTINATION_TYPE,
45
+ INITIAL_REGISTRATION_STATUS,
45
46
  } from '../constants';
46
47
  import BEHAVIORAL_METRICS from '../metrics/constants';
47
48
  import MeetingInfo from '../meeting-info';
@@ -53,12 +54,18 @@ import Request from './request';
53
54
  import PasswordError from '../common/errors/password-error';
54
55
  import CaptchaError from '../common/errors/captcha-error';
55
56
  import MeetingCollection from './collection';
56
- import {MEETING_KEY, INoiseReductionEffect, IVirtualBackgroundEffect} from './meetings.types';
57
+ import {
58
+ MEETING_KEY,
59
+ INoiseReductionEffect,
60
+ IVirtualBackgroundEffect,
61
+ MeetingRegistrationStatus,
62
+ } from './meetings.types';
57
63
  import MeetingsUtil from './util';
58
64
  import PermissionError from '../common/errors/permission';
59
- import WebinarRegistrationError from '../common/errors/webinar-registration-error';
65
+ import JoinWebinarError from '../common/errors/join-webinar-error';
60
66
  import {SpaceIDDeprecatedError} from '../common/errors/webex-errors';
61
67
  import NoMeetingInfoError from '../common/errors/no-meeting-info';
68
+ import JoinForbiddenError from '../common/errors/join-forbidden-error';
62
69
 
63
70
  let mediaLogger;
64
71
 
@@ -155,6 +162,9 @@ export type BasicMeetingInformation = {
155
162
  };
156
163
  meetingInfo: any;
157
164
  sessionCorrelationId: string;
165
+ roles: string[];
166
+ getCurUserType: () => string | null;
167
+ callStateForMetrics: CallStateForMetrics;
158
168
  };
159
169
 
160
170
  /**
@@ -176,6 +186,7 @@ export default class Meetings extends WebexPlugin {
176
186
  mediaHelpers: any;
177
187
  breakoutLocusForHandleLater: any;
178
188
  namespace = MEETINGS;
189
+ registrationStatus: MeetingRegistrationStatus;
179
190
 
180
191
  /**
181
192
  * Initializes the Meetings Plugin
@@ -689,6 +700,20 @@ export default class Meetings extends WebexPlugin {
689
700
  });
690
701
  }
691
702
 
703
+ /**
704
+ * API to change log upload interval. Setting the factor to 0 will disable periodic log uploads.
705
+ *
706
+ * @param {number} factor new factor value
707
+ * @returns {void}
708
+ */
709
+ private _setLogUploadIntervalMultiplicationFactor(factor: number) {
710
+ if (typeof factor !== 'number') {
711
+ return;
712
+ }
713
+ // @ts-ignore
714
+ this.config.logUploadIntervalMultiplicationFactor = factor;
715
+ }
716
+
692
717
  /**
693
718
  * API to toggle unified meetings
694
719
  * @param {Boolean} changeState
@@ -782,6 +807,18 @@ export default class Meetings extends WebexPlugin {
782
807
  }
783
808
  }
784
809
 
810
+ /**
811
+ * Executes a registration step and updates the registration status.
812
+ * @param {Function} step - The registration step to execute.
813
+ * @param {string} stepName - The name of the registration step.
814
+ * @returns {Promise} A promise that resolves when the step is completed.
815
+ */
816
+ executeRegistrationStep(step: () => Promise<any>, stepName: string) {
817
+ return step().then(() => {
818
+ this.registrationStatus[stepName] = true;
819
+ });
820
+ }
821
+
785
822
  /**
786
823
  * Explicitly sets up the meetings plugin by registering
787
824
  * the device, connecting to mercury, and listening for locus events.
@@ -792,6 +829,8 @@ export default class Meetings extends WebexPlugin {
792
829
  * @memberof Meetings
793
830
  */
794
831
  public register(deviceRegistrationOptions?: DeviceRegistrationOptions): Promise<any> {
832
+ this.registrationStatus = clone(INITIAL_REGISTRATION_STATUS);
833
+
795
834
  // @ts-ignore
796
835
  if (!this.webex.canAuthorize) {
797
836
  LoggerProxy.logger.error(
@@ -810,24 +849,39 @@ export default class Meetings extends WebexPlugin {
810
849
  }
811
850
 
812
851
  return Promise.all([
813
- this.fetchUserPreferredWebexSite(),
814
- this.getGeoHint(),
815
- this.startReachability('registration').catch((error) => {
816
- LoggerProxy.logger.error(`Meetings:index#register --> GDM error, ${error.message}`);
817
- }),
818
- // @ts-ignore
819
- this.webex.internal.device
820
- .register(deviceRegistrationOptions)
821
- // @ts-ignore
822
- .then(() =>
823
- LoggerProxy.logger.info(
852
+ this.executeRegistrationStep(() => this.fetchUserPreferredWebexSite(), 'fetchWebexSite'),
853
+ this.executeRegistrationStep(() => this.getGeoHint(), 'getGeoHint'),
854
+ this.executeRegistrationStep(
855
+ () =>
856
+ this.startReachability('registration').catch((error) => {
857
+ LoggerProxy.logger.error(`Meetings:index#register --> GDM error, ${error.message}`);
858
+ }),
859
+ 'startReachability'
860
+ ),
861
+ this.executeRegistrationStep(
862
+ () =>
863
+ // @ts-ignore
864
+ this.webex.internal.device
865
+ .register(deviceRegistrationOptions)
824
866
  // @ts-ignore
825
- `Meetings:index#register --> INFO, Device registered ${this.webex.internal.device.url}`
826
- )
867
+ .then(() => {
868
+ LoggerProxy.logger.info(
869
+ // @ts-ignore
870
+ `Meetings:index#register --> INFO, Device registered ${this.webex.internal.device.url}`
871
+ );
872
+ }),
873
+ 'deviceRegister'
874
+ ).then(() =>
875
+ this.executeRegistrationStep(
876
+ // @ts-ignore
877
+ () => this.webex.internal.mercury.connect(),
878
+ 'mercuryConnect'
827
879
  )
828
- // @ts-ignore
829
- .then(() => this.webex.internal.mercury.connect()),
830
- MeetingsUtil.checkH264Support.call(this),
880
+ ),
881
+ this.executeRegistrationStep(
882
+ () => Promise.resolve(MeetingsUtil.checkH264Support.call(this)),
883
+ 'checkH264Support'
884
+ ),
831
885
  ])
832
886
  .then(() => {
833
887
  this.listenForEvents();
@@ -891,6 +945,7 @@ export default class Meetings extends WebexPlugin {
891
945
  EVENT_TRIGGERS.MEETINGS_UNREGISTERED
892
946
  );
893
947
  this.registered = false;
948
+ this.registrationStatus = clone(INITIAL_REGISTRATION_STATUS);
894
949
  })
895
950
  );
896
951
  }
@@ -1143,6 +1198,9 @@ export default class Meetings extends WebexPlugin {
1143
1198
  sessionId: meeting.locusInfo?.fullState?.sessionId,
1144
1199
  },
1145
1200
  },
1201
+ roles: meeting.roles,
1202
+ callStateForMetrics: meeting.callStateForMetrics,
1203
+ getCurUserType: meeting.getCurUserType,
1146
1204
  });
1147
1205
  this.meetingCollection.delete(meeting.id);
1148
1206
  Trigger.trigger(
@@ -1406,7 +1464,8 @@ export default class Meetings extends WebexPlugin {
1406
1464
  !(err instanceof CaptchaError) &&
1407
1465
  !(err instanceof PasswordError) &&
1408
1466
  !(err instanceof PermissionError) &&
1409
- !(err instanceof WebinarRegistrationError)
1467
+ !(err instanceof JoinWebinarError) &&
1468
+ !(err instanceof JoinForbiddenError)
1410
1469
  ) {
1411
1470
  LoggerProxy.logger.info(
1412
1471
  `Meetings:index#createMeeting --> Info Unable to fetch meeting info for ${destination}.`
@@ -21,3 +21,13 @@ export const MEETING_KEY = {
21
21
  } as const;
22
22
 
23
23
  export type MEETING_KEY = Enum<typeof MEETING_KEY>;
24
+
25
+ // finer grained status for registration steps
26
+ export type MeetingRegistrationStatus = {
27
+ fetchWebexSite: boolean;
28
+ getGeoHint: boolean;
29
+ startReachability: boolean;
30
+ deviceRegister: boolean;
31
+ mercuryConnect: boolean;
32
+ checkH264Support: boolean;
33
+ };