@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
@@ -34,12 +34,19 @@ describe('LocusMediaRequest.send()', () => {
34
34
  'wjfkm.wjfkm.*': {udp:{reachable: true}, tcp:{reachable:false}},
35
35
  '1eb65fdf-9643-417f-9974-ad72cae0e10f.59268c12-7a04-4b23-a1a1-4c74be03019a.*': {udp:{reachable: false}, tcp:{reachable:true}},
36
36
  },
37
- joinCookie: {
38
- anycastEntryPoint: 'aws-eu-west-1',
39
- clientIpAddress: 'some ip',
40
- timeShot: '2023-05-23T08:03:49Z',
41
- },
42
- ipVersion: IP_VERSION.only_ipv4,
37
+ clientMediaPreferences: {
38
+ preferTranscoding: false,
39
+ joinCookie: {
40
+ anycastEntryPoint: 'aws-eu-west-1',
41
+ clientIpAddress: 'some ip',
42
+ timeShot: '2023-05-23T08:03:49Z',
43
+ },
44
+ ipver: IP_VERSION.only_ipv4,
45
+ reachability: {
46
+ version: '1',
47
+ result: 'some fake reachability result',
48
+ }
49
+ }
43
50
  };
44
51
 
45
52
  const createExpectedRoapBody = (expectedMessageType, expectedMute:{audioMuted: boolean, videoMuted: boolean}) => {
@@ -53,12 +60,16 @@ describe('LocusMediaRequest.send()', () => {
53
60
  }
54
61
  ],
55
62
  clientMediaPreferences: {
56
- preferTranscoding: true,
63
+ preferTranscoding: false,
57
64
  ipver: 4,
58
65
  joinCookie: {
59
66
  anycastEntryPoint: 'aws-eu-west-1',
60
67
  clientIpAddress: 'some ip',
61
68
  timeShot: '2023-05-23T08:03:49Z'
69
+ },
70
+ reachability: {
71
+ version: '1',
72
+ result: 'some fake reachability result',
62
73
  }
63
74
  }
64
75
  };
@@ -87,10 +98,6 @@ describe('LocusMediaRequest.send()', () => {
87
98
  localSdp: `{"audioMuted":${expectedMute.audioMuted},"videoMuted":${expectedMute.videoMuted}}`,
88
99
  },
89
100
  ],
90
- clientMediaPreferences: {
91
- preferTranscoding: true,
92
- ipver: undefined,
93
- },
94
101
  };
95
102
 
96
103
  if (sequence) {
@@ -113,30 +113,6 @@ describe('plugin-meetings', () => {
113
113
  assert.isTrue(audio.isRemotelyMuted());
114
114
  });
115
115
 
116
- it('does not locally unmute on a server unmute', async () => {
117
- const setServerMutedSpy = meeting.mediaProperties.audioStream.setServerMuted;
118
-
119
- // simulate remote mute
120
- audio.handleServerRemoteMuteUpdate(meeting, true, true);
121
-
122
- assert.isTrue(audio.isRemotelyMuted());
123
- assert.isTrue(audio.isLocallyMuted());
124
-
125
- // mutes local
126
- assert.calledOnceWithExactly(setServerMutedSpy, true, 'remotelyMuted');
127
-
128
- setServerMutedSpy.resetHistory();
129
-
130
- // simulate remote unmute
131
- audio.handleServerRemoteMuteUpdate(meeting, false, true);
132
-
133
- assert.isFalse(audio.isRemotelyMuted());
134
- assert.isTrue(audio.isLocallyMuted());
135
-
136
- // does not unmute local
137
- assert.notCalled(setServerMutedSpy);
138
- });
139
-
140
116
  it('does local audio unmute if localAudioUnmuteRequired is received', async () => {
141
117
  // first we need to have the local stream user muted
142
118
  meeting.mediaProperties.audioStream.userMuted = true;
@@ -196,6 +196,7 @@ describe('plugin-meetings', () => {
196
196
  const permissionToken = 'permission-token';
197
197
  const installationId = 'installationId';
198
198
  const reachability = 'reachability';
199
+ const clientMediaPreferences = 'clientMediaPreferences';
199
200
 
200
201
  await meetingsRequest.joinMeeting({
201
202
  locusUrl,
@@ -204,6 +205,7 @@ describe('plugin-meetings', () => {
204
205
  roapMessage,
205
206
  reachability,
206
207
  permissionToken,
208
+ clientMediaPreferences
207
209
  });
208
210
  const requestParams = meetingsRequest.request.getCall(0).args[0];
209
211
 
@@ -214,6 +216,7 @@ describe('plugin-meetings', () => {
214
216
  assert.equal(requestParams.body.device.countryCode, 'US');
215
217
  assert.equal(requestParams.body.permissionToken, 'permission-token');
216
218
  assert.equal(requestParams.body.device.regionCode, 'WEST-COAST');
219
+ assert.equal(requestParams.body.clientMediaPreferences, 'clientMediaPreferences');
217
220
  assert.include(requestParams.body.device.localIp, '127.0.0');
218
221
  assert.deepEqual(requestParams.body.localMedias, [
219
222
  {localSdp: '{"roapMessage":"roap-message","reachability":"reachability"}'},
@@ -386,32 +389,6 @@ describe('plugin-meetings', () => {
386
389
 
387
390
  assert.deepEqual(requestParams.body.alias, undefined);
388
391
  });
389
-
390
- it('includes joinCookie and ipver correctly', async () => {
391
- const locusUrl = 'locusURL';
392
- const deviceUrl = 'deviceUrl';
393
- const correlationId = 'random-uuid';
394
- const roapMessage = 'roap-message';
395
- const permissionToken = 'permission-token';
396
-
397
- await meetingsRequest.joinMeeting({
398
- locusUrl,
399
- deviceUrl,
400
- correlationId,
401
- roapMessage,
402
- permissionToken,
403
- ipVersion: IP_VERSION.ipv4_and_ipv6,
404
- });
405
- const requestParams = meetingsRequest.request.getCall(0).args[0];
406
-
407
- assert.equal(requestParams.method, 'POST');
408
- assert.equal(requestParams.uri, `${locusUrl}/participant?alternateRedirect=true`);
409
- assert.deepEqual(requestParams.body.clientMediaPreferences, {
410
- joinCookie: {anycastEntryPoint: 'aws-eu-west-1'},
411
- preferTranscoding: true,
412
- ipver: 1,
413
- });
414
- });
415
392
  });
416
393
 
417
394
  describe('#pstn', () => {
@@ -22,6 +22,12 @@ describe('plugin-meetings', () => {
22
22
  meetings: Meetings,
23
23
  },
24
24
  });
25
+
26
+ webex.meetings.reachability = {
27
+ getReachabilityReportToAttachToRoap: sinon.stub().resolves({}),
28
+ getClientMediaPreferences: sinon.stub().resolves({}),
29
+ };
30
+
25
31
  const logger = {
26
32
  info: sandbox.stub(),
27
33
  log: sandbox.stub(),
@@ -39,6 +45,7 @@ describe('plugin-meetings', () => {
39
45
  meeting.cleanupLocalStreams = sinon.stub().returns(Promise.resolve());
40
46
  meeting.closeRemoteStreams = sinon.stub().returns(Promise.resolve());
41
47
  meeting.closePeerConnections = sinon.stub().returns(Promise.resolve());
48
+ meeting.stopPeriodicLogUpload = sinon.stub();
42
49
 
43
50
  meeting.unsetRemoteStreams = sinon.stub();
44
51
  meeting.unsetPeerConnections = sinon.stub();
@@ -64,6 +71,7 @@ describe('plugin-meetings', () => {
64
71
  assert.calledOnce(meeting.cleanupLocalStreams);
65
72
  assert.calledOnce(meeting.closeRemoteStreams);
66
73
  assert.calledOnce(meeting.closePeerConnections);
74
+ assert.calledOnce(meeting.stopPeriodicLogUpload);
67
75
 
68
76
  assert.calledOnce(meeting.unsetRemoteStreams);
69
77
  assert.calledOnce(meeting.unsetPeerConnections);
@@ -157,21 +165,6 @@ describe('plugin-meetings', () => {
157
165
  assert(LoggerProxy.logger.log.called, 'log called');
158
166
  });
159
167
  });
160
-
161
- describe('#handleDeviceLogging', () => {
162
- it('should not log if called without devices', () => {
163
- MeetingUtil.handleDeviceLogging();
164
- assert(!LoggerProxy.logger.log.called, 'log not called');
165
- });
166
-
167
- it('should log device settings', () => {
168
- const mockDevices = [{deviceId: 'device-1'}, {deviceId: 'device-2'}];
169
-
170
- assert(MeetingUtil.handleDeviceLogging, 'is defined');
171
- MeetingUtil.handleDeviceLogging(mockDevices);
172
- assert(LoggerProxy.logger.log.called, 'log called');
173
- });
174
- });
175
168
  });
176
169
 
177
170
  describe('addSequence', () => {
@@ -408,17 +401,39 @@ describe('plugin-meetings', () => {
408
401
  });
409
402
 
410
403
  it('#Should call `meetingRequest.joinMeeting', async () => {
404
+ meeting.isMultistream = true;
405
+
406
+ const FAKE_REACHABILITY_REPORT = {
407
+ id: 'fake reachability report',
408
+ };
409
+ const FAKE_CLIENT_MEDIA_PREFERENCES = {
410
+ id: 'fake client media preferences',
411
+ };
412
+
413
+ webex.meetings.reachability.getReachabilityReportToAttachToRoap.resolves(FAKE_REACHABILITY_REPORT);
414
+ webex.meetings.reachability.getClientMediaPreferences.resolves(FAKE_CLIENT_MEDIA_PREFERENCES);
415
+
416
+ sinon
417
+ .stub(webex.internal.device.ipNetworkDetector, 'supportsIpV4')
418
+ .get(() => true);
419
+ sinon
420
+ .stub(webex.internal.device.ipNetworkDetector, 'supportsIpV6')
421
+ .get(() => true);
422
+
411
423
  await MeetingUtil.joinMeeting(meeting, {
412
424
  reachability: 'reachability',
413
425
  roapMessage: 'roapMessage',
414
426
  });
415
427
 
428
+ assert.calledOnceWithExactly(webex.meetings.reachability.getReachabilityReportToAttachToRoap);
429
+ assert.calledOnceWithExactly(webex.meetings.reachability.getClientMediaPreferences, meeting.isMultistream, IP_VERSION.ipv4_and_ipv6);
430
+
416
431
  assert.calledOnce(meeting.meetingRequest.joinMeeting);
417
432
  const parameter = meeting.meetingRequest.joinMeeting.getCall(0).args[0];
418
433
 
419
434
  assert.equal(parameter.inviteeAddress, 'meetingJoinUrl');
420
- assert.equal(parameter.preferTranscoding, true);
421
- assert.equal(parameter.reachability, 'reachability');
435
+ assert.equal(parameter.reachability, FAKE_REACHABILITY_REPORT);
436
+ assert.equal(parameter.clientMediaPreferences, FAKE_CLIENT_MEDIA_PREFERENCES);
422
437
  assert.equal(parameter.roapMessage, 'roapMessage');
423
438
 
424
439
  assert.calledOnce(meeting.setLocus)
@@ -445,6 +460,40 @@ describe('plugin-meetings', () => {
445
460
  });
446
461
  });
447
462
 
463
+ it('should handle failed reachability report retrieval', async () => {
464
+ webex.meetings.reachability.getReachabilityReportToAttachToRoap.rejects(
465
+ new Error('fake error')
466
+ );
467
+ await MeetingUtil.joinMeeting(meeting, {});
468
+ // Verify meeting join still proceeds
469
+ assert.calledOnce(meeting.meetingRequest.joinMeeting);
470
+ });
471
+
472
+ it('should not attach reachability if there is no roap message', async () => {
473
+ await MeetingUtil.joinMeeting(meeting, {});
474
+
475
+ assert.notCalled(webex.meetings.reachability.getReachabilityReportToAttachToRoap);
476
+ assert.calledOnce(meeting.meetingRequest.joinMeeting);
477
+
478
+ const parameter = meeting.meetingRequest.joinMeeting.getCall(0).args[0];
479
+ assert.isUndefined(parameter.reachability);
480
+ assert.isUndefined(parameter.roapMessage);
481
+ });
482
+
483
+ it('should handle failed clientMediaPreferences retrieval', async () => {
484
+ webex.meetings.reachability.getClientMediaPreferences.rejects(new Error('fake error'));
485
+ meeting.isMultistream = true;
486
+ await MeetingUtil.joinMeeting(meeting, {});
487
+ // Verify meeting join still proceeds
488
+ assert.calledOnce(meeting.meetingRequest.joinMeeting);
489
+ const parameter = meeting.meetingRequest.joinMeeting.getCall(0).args[0];
490
+ assert.deepEqual(parameter.clientMediaPreferences, {
491
+ preferTranscoding: false,
492
+ ipver: 0,
493
+ joinCookie: undefined,
494
+ });
495
+ });
496
+
448
497
  it('#Should call meetingRequest.joinMeeting with breakoutsSupported=true when passed in as true', async () => {
449
498
  await MeetingUtil.joinMeeting(meeting, {
450
499
  breakoutsSupported: true,
@@ -480,17 +529,6 @@ describe('plugin-meetings', () => {
480
529
  assert.deepEqual(parameter.deviceCapabilities, ['TEST']);
481
530
  });
482
531
 
483
- it('#Should call meetingRequest.joinMeeting with preferTranscoding=false when multistream is enabled', async () => {
484
- meeting.isMultistream = true;
485
- await MeetingUtil.joinMeeting(meeting, {});
486
-
487
- assert.calledOnce(meeting.meetingRequest.joinMeeting);
488
- const parameter = meeting.meetingRequest.joinMeeting.getCall(0).args[0];
489
-
490
- assert.equal(parameter.inviteeAddress, 'meetingJoinUrl');
491
- assert.equal(parameter.preferTranscoding, false);
492
- });
493
-
494
532
  it('#Should fallback sipUrl if meetingJoinUrl does not exists', async () => {
495
533
  meeting.meetingJoinUrl = undefined;
496
534
  meeting.sipUri = 'sipUri';
@@ -733,6 +771,13 @@ describe('plugin-meetings', () => {
733
771
  });
734
772
  });
735
773
 
774
+ describe('canStartBreakout', () => {
775
+ it('works as expected', () => {
776
+ assert.deepEqual(MeetingUtil.canStartBreakout(['DISABLE_BREAKOUT_START']), false);
777
+ assert.deepEqual(MeetingUtil.canStartBreakout([]), true);
778
+ });
779
+ });
780
+
736
781
  describe('canBroadcastMessageToBreakout', () => {
737
782
  it('works as expected', () => {
738
783
  assert.deepEqual(
@@ -18,7 +18,8 @@ import MeetingInfo, {
18
18
  MeetingInfoV2CaptchaError,
19
19
  MeetingInfoV2AdhocMeetingError,
20
20
  MeetingInfoV2PolicyError,
21
- MeetingInfoV2WebinarRegistrationError,
21
+ MeetingInfoV2JoinWebinarError,
22
+ MeetingInfoV2JoinForbiddenError,
22
23
  } from '@webex/plugin-meetings/src/meeting-info/meeting-info-v2';
23
24
  import MeetingInfoUtil from '@webex/plugin-meetings/src/meeting-info/utilv2';
24
25
  import Metrics from '@webex/plugin-meetings/src/metrics';
@@ -895,9 +896,14 @@ describe('plugin-meetings', () => {
895
896
  {errorCode: 403021},
896
897
  {errorCode: 403022},
897
898
  {errorCode: 403024},
899
+ {errorCode: 403137},
900
+ {errorCode: 423007},
901
+ {errorCode: 403026},
902
+ {errorCode: 403037},
903
+ {errorCode: 403137},
898
904
  ],
899
905
  ({errorCode}) => {
900
- it(`should throw a MeetingInfoV2WebinarRegistrationError for error code ${errorCode}`, async () => {
906
+ it(`should throw a MeetingInfoV2JoinWebinarError for error code ${errorCode}`, async () => {
901
907
  const message = 'a message';
902
908
  const meetingInfoData = {meetingInfo: {registrationUrl: 'registrationUrl'}};
903
909
 
@@ -909,7 +915,7 @@ describe('plugin-meetings', () => {
909
915
  await meetingInfo.createAdhocSpaceMeeting(conversationUrl, installedOrgID);
910
916
  assert.fail('createAdhocSpaceMeeting should have thrown, but has not done that');
911
917
  } catch (err) {
912
- assert.instanceOf(err, MeetingInfoV2WebinarRegistrationError);
918
+ assert.instanceOf(err, MeetingInfoV2JoinWebinarError);
913
919
  assert.deepEqual(err.message, `${message}, code=${errorCode}`);
914
920
  assert.equal(err.wbxAppApiCode, errorCode);
915
921
  assert.deepEqual(err.meetingInfo, meetingInfoData);
@@ -917,7 +923,43 @@ describe('plugin-meetings', () => {
917
923
  assert(Metrics.sendBehavioralMetric.calledOnce);
918
924
  assert.calledWith(
919
925
  Metrics.sendBehavioralMetric,
920
- BEHAVIORAL_METRICS.WEBINAR_REGISTRATION_ERROR,
926
+ BEHAVIORAL_METRICS.JOIN_WEBINAR_ERROR,
927
+ {code: errorCode}
928
+ );
929
+
930
+ }
931
+ });
932
+ }
933
+ );
934
+
935
+ forEach(
936
+ [
937
+ {errorCode: 403003},
938
+ ],
939
+ ({errorCode}) => {
940
+ it(`should throw a MeetingInfoV2JoinForbiddenError for error code ${errorCode}`, async () => {
941
+ const message = 'a message';
942
+ const meetingInfoData = 'meeting info';
943
+
944
+ webex.request = sinon.stub().rejects({
945
+ statusCode: 403,
946
+ body: {message, code: errorCode, data: {meetingInfo: meetingInfoData}},
947
+ });
948
+ try {
949
+ await meetingInfo.fetchMeetingInfo('1234323', DESTINATION_TYPE.MEETING_ID, 'abc', {
950
+ id: '999',
951
+ code: 'aabbcc11',
952
+ });
953
+ } catch (err) {
954
+ assert.instanceOf(err, MeetingInfoV2JoinForbiddenError);
955
+ assert.deepEqual(err.message, `${message}, code=${errorCode}`);
956
+ assert.equal(err.wbxAppApiCode, errorCode);
957
+ assert.deepEqual(err.meetingInfo, meetingInfoData);
958
+
959
+ assert(Metrics.sendBehavioralMetric.calledOnce);
960
+ assert.calledWith(
961
+ Metrics.sendBehavioralMetric,
962
+ BEHAVIORAL_METRICS.JOIN_FORBIDDEN_ERROR,
921
963
  {code: errorCode}
922
964
  );
923
965
 
@@ -192,6 +192,15 @@ describe('plugin-meetings', () => {
192
192
  assert.equal(res.meetingUUID, 'xsddsdsdsdssdsdsdsdsd');
193
193
  });
194
194
 
195
+ it('for registrationId', () => {
196
+ const res = MeetingInfoUtil.getRequestBody({
197
+ type: DESTINATION_TYPE.MEETING_UUID,
198
+ registrationId: 'registrationId',
199
+ });
200
+
201
+ assert.equal(res.registrationId, 'registrationId');
202
+ });
203
+
195
204
  it('for DESTINATION_TYPE.LOCUS_ID', () => {
196
205
  const res = MeetingInfoUtil.getRequestBody({
197
206
  type: DESTINATION_TYPE.LOCUS_ID,
@@ -345,5 +354,22 @@ describe('plugin-meetings', () => {
345
354
  );
346
355
  });
347
356
  });
357
+
358
+ describe('#isMeetingLink', () => {
359
+ it('should return true for valid join meeting link with MTID', () => {
360
+ const result = MeetingInfoUtil.isMeetingLink('https://cisco.webex.com/cisco/j.php?MTID=m9fe0afd8c435e892afcce9ea25b97046');
361
+ expect(result).to.be.true;
362
+ });
363
+
364
+ it('should return true for valid join meeting link without cisco domain', () => {
365
+ const result = MeetingInfoUtil.isMeetingLink('https://test.webex.com/test/j.php?MTID=m9fe0afd8c435e892afcce9ea25b97046');
366
+ expect(result).to.be.true;
367
+ });
368
+
369
+ it('should return false for an invalid meeting link', () => {
370
+ const result = MeetingInfoUtil.isMeetingLink('https://test.webex.com/test/j.php?MiD=m9fe0afd8c435e892afcce9ea25b97046');
371
+ expect(result).to.be.false;
372
+ });
373
+ });
348
374
  });
349
375
  });