@webex/plugin-meetings 3.0.0-beta.31 → 3.0.0-beta.310

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 (378) hide show
  1. package/README.md +46 -8
  2. package/dist/annotation/annotation.types.js +7 -0
  3. package/dist/annotation/annotation.types.js.map +1 -0
  4. package/dist/annotation/constants.js +49 -0
  5. package/dist/annotation/constants.js.map +1 -0
  6. package/dist/annotation/index.js +342 -0
  7. package/dist/annotation/index.js.map +1 -0
  8. package/dist/breakouts/breakout.js +94 -15
  9. package/dist/breakouts/breakout.js.map +1 -1
  10. package/dist/breakouts/edit-lock-error.js +52 -0
  11. package/dist/breakouts/edit-lock-error.js.map +1 -0
  12. package/dist/breakouts/events.js +45 -0
  13. package/dist/breakouts/events.js.map +1 -0
  14. package/dist/breakouts/index.js +709 -35
  15. package/dist/breakouts/index.js.map +1 -1
  16. package/dist/breakouts/utils.js +45 -1
  17. package/dist/breakouts/utils.js.map +1 -1
  18. package/dist/common/errors/no-meeting-info.js +51 -0
  19. package/dist/common/errors/no-meeting-info.js.map +1 -0
  20. package/dist/common/errors/reclaim-host-role-errors.js +158 -0
  21. package/dist/common/errors/reclaim-host-role-errors.js.map +1 -0
  22. package/dist/common/errors/webex-errors.js +48 -7
  23. package/dist/common/errors/webex-errors.js.map +1 -1
  24. package/dist/common/logs/logger-proxy.js +1 -1
  25. package/dist/common/logs/logger-proxy.js.map +1 -1
  26. package/dist/common/logs/request.js +5 -1
  27. package/dist/common/logs/request.js.map +1 -1
  28. package/dist/common/queue.js +24 -9
  29. package/dist/common/queue.js.map +1 -1
  30. package/dist/config.js +5 -11
  31. package/dist/config.js.map +1 -1
  32. package/dist/constants.js +233 -29
  33. package/dist/constants.js.map +1 -1
  34. package/dist/controls-options-manager/enums.js +14 -2
  35. package/dist/controls-options-manager/enums.js.map +1 -1
  36. package/dist/controls-options-manager/index.js +109 -15
  37. package/dist/controls-options-manager/index.js.map +1 -1
  38. package/dist/controls-options-manager/types.js +7 -0
  39. package/dist/controls-options-manager/types.js.map +1 -0
  40. package/dist/controls-options-manager/util.js +309 -18
  41. package/dist/controls-options-manager/util.js.map +1 -1
  42. package/dist/index.js +112 -1
  43. package/dist/index.js.map +1 -1
  44. package/dist/interpretation/collection.js +23 -0
  45. package/dist/interpretation/collection.js.map +1 -0
  46. package/dist/interpretation/index.js +366 -0
  47. package/dist/interpretation/index.js.map +1 -0
  48. package/dist/interpretation/siLanguage.js +25 -0
  49. package/dist/interpretation/siLanguage.js.map +1 -0
  50. package/dist/locus-info/controlsUtils.js +91 -2
  51. package/dist/locus-info/controlsUtils.js.map +1 -1
  52. package/dist/locus-info/index.js +383 -62
  53. package/dist/locus-info/index.js.map +1 -1
  54. package/dist/locus-info/infoUtils.js +7 -1
  55. package/dist/locus-info/infoUtils.js.map +1 -1
  56. package/dist/locus-info/mediaSharesUtils.js +57 -1
  57. package/dist/locus-info/mediaSharesUtils.js.map +1 -1
  58. package/dist/locus-info/parser.js +249 -72
  59. package/dist/locus-info/parser.js.map +1 -1
  60. package/dist/locus-info/selfUtils.js +89 -14
  61. package/dist/locus-info/selfUtils.js.map +1 -1
  62. package/dist/media/index.js +61 -116
  63. package/dist/media/index.js.map +1 -1
  64. package/dist/media/properties.js +73 -124
  65. package/dist/media/properties.js.map +1 -1
  66. package/dist/meeting/in-meeting-actions.js +82 -2
  67. package/dist/meeting/in-meeting-actions.js.map +1 -1
  68. package/dist/meeting/index.js +3777 -2929
  69. package/dist/meeting/index.js.map +1 -1
  70. package/dist/meeting/locusMediaRequest.js +292 -0
  71. package/dist/meeting/locusMediaRequest.js.map +1 -0
  72. package/dist/meeting/muteState.js +230 -124
  73. package/dist/meeting/muteState.js.map +1 -1
  74. package/dist/meeting/request.js +260 -196
  75. package/dist/meeting/request.js.map +1 -1
  76. package/dist/meeting/util.js +601 -417
  77. package/dist/meeting/util.js.map +1 -1
  78. package/dist/meeting-info/index.js +73 -7
  79. package/dist/meeting-info/index.js.map +1 -1
  80. package/dist/meeting-info/meeting-info-v2.js +192 -51
  81. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  82. package/dist/meeting-info/util.js +1 -1
  83. package/dist/meeting-info/util.js.map +1 -1
  84. package/dist/meeting-info/utilv2.js +36 -36
  85. package/dist/meeting-info/utilv2.js.map +1 -1
  86. package/dist/meetings/collection.js +39 -0
  87. package/dist/meetings/collection.js.map +1 -1
  88. package/dist/meetings/index.js +415 -115
  89. package/dist/meetings/index.js.map +1 -1
  90. package/dist/meetings/meetings.types.js +7 -0
  91. package/dist/meetings/meetings.types.js.map +1 -0
  92. package/dist/meetings/request.js +2 -0
  93. package/dist/meetings/request.js.map +1 -1
  94. package/dist/meetings/util.js +72 -6
  95. package/dist/meetings/util.js.map +1 -1
  96. package/dist/member/index.js +58 -0
  97. package/dist/member/index.js.map +1 -1
  98. package/dist/member/types.js +25 -0
  99. package/dist/member/types.js.map +1 -0
  100. package/dist/member/util.js +132 -25
  101. package/dist/member/util.js.map +1 -1
  102. package/dist/members/collection.js +10 -0
  103. package/dist/members/collection.js.map +1 -1
  104. package/dist/members/index.js +102 -6
  105. package/dist/members/index.js.map +1 -1
  106. package/dist/members/request.js +106 -38
  107. package/dist/members/request.js.map +1 -1
  108. package/dist/members/types.js +15 -0
  109. package/dist/members/types.js.map +1 -0
  110. package/dist/members/util.js +326 -232
  111. package/dist/members/util.js.map +1 -1
  112. package/dist/metrics/constants.js +13 -5
  113. package/dist/metrics/constants.js.map +1 -1
  114. package/dist/metrics/index.js +1 -468
  115. package/dist/metrics/index.js.map +1 -1
  116. package/dist/multistream/mediaRequestManager.js +238 -49
  117. package/dist/multistream/mediaRequestManager.js.map +1 -1
  118. package/dist/multistream/receiveSlot.js +29 -16
  119. package/dist/multistream/receiveSlot.js.map +1 -1
  120. package/dist/multistream/receiveSlotManager.js +39 -36
  121. package/dist/multistream/receiveSlotManager.js.map +1 -1
  122. package/dist/multistream/remoteMedia.js +44 -18
  123. package/dist/multistream/remoteMedia.js.map +1 -1
  124. package/dist/multistream/remoteMediaGroup.js +60 -3
  125. package/dist/multistream/remoteMediaGroup.js.map +1 -1
  126. package/dist/multistream/remoteMediaManager.js +209 -59
  127. package/dist/multistream/remoteMediaManager.js.map +1 -1
  128. package/dist/multistream/sendSlotManager.js +233 -0
  129. package/dist/multistream/sendSlotManager.js.map +1 -0
  130. package/dist/reachability/index.js +225 -59
  131. package/dist/reachability/index.js.map +1 -1
  132. package/dist/reachability/request.js +17 -8
  133. package/dist/reachability/request.js.map +1 -1
  134. package/dist/reconnection-manager/index.js +201 -156
  135. package/dist/reconnection-manager/index.js.map +1 -1
  136. package/dist/recording-controller/index.js +21 -2
  137. package/dist/recording-controller/index.js.map +1 -1
  138. package/dist/recording-controller/util.js +9 -8
  139. package/dist/recording-controller/util.js.map +1 -1
  140. package/dist/roap/index.js +62 -32
  141. package/dist/roap/index.js.map +1 -1
  142. package/dist/roap/request.js +112 -97
  143. package/dist/roap/request.js.map +1 -1
  144. package/dist/roap/turnDiscovery.js +95 -36
  145. package/dist/roap/turnDiscovery.js.map +1 -1
  146. package/dist/rtcMetrics/constants.js +12 -0
  147. package/dist/rtcMetrics/constants.js.map +1 -0
  148. package/dist/rtcMetrics/index.js +117 -0
  149. package/dist/rtcMetrics/index.js.map +1 -0
  150. package/dist/statsAnalyzer/index.js +86 -78
  151. package/dist/statsAnalyzer/index.js.map +1 -1
  152. package/dist/statsAnalyzer/mqaUtil.js +11 -10
  153. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  154. package/dist/types/annotation/annotation.types.d.ts +42 -0
  155. package/dist/types/annotation/constants.d.ts +31 -0
  156. package/dist/types/annotation/index.d.ts +117 -0
  157. package/dist/types/breakouts/edit-lock-error.d.ts +15 -0
  158. package/dist/types/breakouts/events.d.ts +8 -0
  159. package/dist/types/breakouts/utils.d.ts +14 -0
  160. package/dist/types/common/errors/no-meeting-info.d.ts +14 -0
  161. package/dist/types/common/errors/reclaim-host-role-errors.d.ts +60 -0
  162. package/dist/types/common/errors/webex-errors.d.ts +25 -1
  163. package/dist/types/common/logs/request.d.ts +2 -0
  164. package/dist/types/common/queue.d.ts +9 -7
  165. package/dist/types/config.d.ts +1 -7
  166. package/dist/types/constants.d.ts +194 -24
  167. package/dist/types/controls-options-manager/enums.d.ts +11 -1
  168. package/dist/types/controls-options-manager/index.d.ts +17 -1
  169. package/dist/types/controls-options-manager/types.d.ts +43 -0
  170. package/dist/types/controls-options-manager/util.d.ts +1 -7
  171. package/dist/types/index.d.ts +6 -4
  172. package/dist/types/interpretation/collection.d.ts +5 -0
  173. package/dist/types/interpretation/index.d.ts +5 -0
  174. package/dist/types/interpretation/siLanguage.d.ts +5 -0
  175. package/dist/types/locus-info/index.d.ts +57 -4
  176. package/dist/types/locus-info/parser.d.ts +67 -6
  177. package/dist/types/media/index.d.ts +2 -0
  178. package/dist/types/media/properties.d.ts +34 -48
  179. package/dist/types/meeting/in-meeting-actions.d.ts +82 -2
  180. package/dist/types/meeting/index.d.ts +463 -510
  181. package/dist/types/meeting/locusMediaRequest.d.ts +74 -0
  182. package/dist/types/meeting/muteState.d.ts +99 -23
  183. package/dist/types/meeting/request.d.ts +72 -43
  184. package/dist/types/meeting/util.d.ts +101 -1
  185. package/dist/types/meeting-info/index.d.ts +13 -1
  186. package/dist/types/meeting-info/meeting-info-v2.d.ts +31 -1
  187. package/dist/types/meetings/collection.d.ts +17 -0
  188. package/dist/types/meetings/index.d.ts +98 -20
  189. package/dist/types/meetings/meetings.types.d.ts +4 -0
  190. package/dist/types/member/index.d.ts +14 -0
  191. package/dist/types/member/types.d.ts +32 -0
  192. package/dist/types/members/collection.d.ts +5 -0
  193. package/dist/types/members/index.d.ts +35 -2
  194. package/dist/types/members/request.d.ts +73 -9
  195. package/dist/types/members/types.d.ts +25 -0
  196. package/dist/types/members/util.d.ts +214 -1
  197. package/dist/types/metrics/constants.d.ts +12 -4
  198. package/dist/types/metrics/index.d.ts +4 -119
  199. package/dist/types/multistream/mediaRequestManager.d.ts +73 -5
  200. package/dist/types/multistream/receiveSlot.d.ts +13 -11
  201. package/dist/types/multistream/receiveSlotManager.d.ts +14 -4
  202. package/dist/types/multistream/remoteMedia.d.ts +8 -29
  203. package/dist/types/multistream/remoteMediaGroup.d.ts +0 -9
  204. package/dist/types/multistream/remoteMediaManager.d.ts +46 -2
  205. package/dist/types/multistream/sendSlotManager.d.ts +61 -0
  206. package/dist/types/reachability/index.d.ts +61 -7
  207. package/dist/types/reachability/request.d.ts +7 -3
  208. package/dist/types/reconnection-manager/index.d.ts +9 -0
  209. package/dist/types/recording-controller/index.d.ts +15 -1
  210. package/dist/types/recording-controller/util.d.ts +5 -4
  211. package/dist/types/roap/index.d.ts +2 -1
  212. package/dist/types/roap/request.d.ts +15 -11
  213. package/dist/types/roap/turnDiscovery.d.ts +21 -3
  214. package/dist/types/rtcMetrics/constants.d.ts +4 -0
  215. package/dist/types/rtcMetrics/index.d.ts +47 -0
  216. package/dist/types/statsAnalyzer/index.d.ts +7 -1
  217. package/dist/types/webinar/collection.d.ts +16 -0
  218. package/dist/types/webinar/index.d.ts +5 -0
  219. package/dist/webinar/collection.js +44 -0
  220. package/dist/webinar/collection.js.map +1 -0
  221. package/dist/webinar/index.js +69 -0
  222. package/dist/webinar/index.js.map +1 -0
  223. package/package.json +23 -20
  224. package/src/annotation/annotation.types.ts +50 -0
  225. package/src/annotation/constants.ts +36 -0
  226. package/src/annotation/index.ts +328 -0
  227. package/src/breakouts/README.md +42 -12
  228. package/src/breakouts/breakout.ts +67 -9
  229. package/src/breakouts/edit-lock-error.ts +25 -0
  230. package/src/breakouts/events.ts +56 -0
  231. package/src/breakouts/index.ts +592 -20
  232. package/src/breakouts/utils.ts +42 -0
  233. package/src/common/errors/no-meeting-info.ts +24 -0
  234. package/src/common/errors/reclaim-host-role-errors.ts +134 -0
  235. package/src/common/errors/webex-errors.ts +44 -2
  236. package/src/common/logs/logger-proxy.ts +1 -1
  237. package/src/common/logs/request.ts +5 -1
  238. package/src/common/queue.ts +22 -8
  239. package/src/config.ts +4 -10
  240. package/src/constants.ts +221 -19
  241. package/src/controls-options-manager/enums.ts +12 -0
  242. package/src/controls-options-manager/index.ts +116 -21
  243. package/src/controls-options-manager/types.ts +59 -0
  244. package/src/controls-options-manager/util.ts +294 -14
  245. package/src/index.ts +40 -0
  246. package/src/interpretation/README.md +60 -0
  247. package/src/interpretation/collection.ts +19 -0
  248. package/src/interpretation/index.ts +332 -0
  249. package/src/interpretation/siLanguage.ts +18 -0
  250. package/src/locus-info/controlsUtils.ts +108 -0
  251. package/src/locus-info/index.ts +413 -59
  252. package/src/locus-info/infoUtils.ts +10 -2
  253. package/src/locus-info/mediaSharesUtils.ts +64 -0
  254. package/src/locus-info/parser.ts +258 -47
  255. package/src/locus-info/selfUtils.ts +81 -5
  256. package/src/media/index.ts +102 -122
  257. package/src/media/properties.ts +87 -110
  258. package/src/meeting/in-meeting-actions.ts +163 -3
  259. package/src/meeting/index.ts +3132 -2541
  260. package/src/meeting/locusMediaRequest.ts +313 -0
  261. package/src/meeting/muteState.ts +229 -131
  262. package/src/meeting/request.ts +177 -121
  263. package/src/meeting/util.ts +588 -394
  264. package/src/meeting-info/index.ts +81 -8
  265. package/src/meeting-info/meeting-info-v2.ts +170 -14
  266. package/src/meeting-info/util.ts +1 -1
  267. package/src/meeting-info/utilv2.ts +23 -23
  268. package/src/meetings/collection.ts +33 -0
  269. package/src/meetings/index.ts +445 -123
  270. package/src/meetings/meetings.types.ts +12 -0
  271. package/src/meetings/request.ts +2 -0
  272. package/src/meetings/util.ts +80 -11
  273. package/src/member/index.ts +58 -0
  274. package/src/member/types.ts +38 -0
  275. package/src/member/util.ts +141 -25
  276. package/src/members/collection.ts +8 -0
  277. package/src/members/index.ts +134 -8
  278. package/src/members/request.ts +97 -17
  279. package/src/members/types.ts +29 -0
  280. package/src/members/util.ts +333 -240
  281. package/src/metrics/constants.ts +12 -4
  282. package/src/metrics/index.ts +1 -490
  283. package/src/multistream/mediaRequestManager.ts +289 -79
  284. package/src/multistream/receiveSlot.ts +31 -17
  285. package/src/multistream/receiveSlotManager.ts +34 -24
  286. package/src/multistream/remoteMedia.ts +27 -2
  287. package/src/multistream/remoteMediaGroup.ts +59 -0
  288. package/src/multistream/remoteMediaManager.ts +148 -30
  289. package/src/multistream/sendSlotManager.ts +170 -0
  290. package/src/reachability/index.ts +228 -37
  291. package/src/reachability/request.ts +17 -8
  292. package/src/reconnection-manager/index.ts +83 -56
  293. package/src/recording-controller/index.ts +20 -3
  294. package/src/recording-controller/util.ts +26 -9
  295. package/src/roap/index.ts +63 -32
  296. package/src/roap/request.ts +100 -104
  297. package/src/roap/turnDiscovery.ts +48 -26
  298. package/src/rtcMetrics/constants.ts +3 -0
  299. package/src/rtcMetrics/index.ts +100 -0
  300. package/src/statsAnalyzer/index.ts +105 -91
  301. package/src/statsAnalyzer/mqaUtil.ts +13 -14
  302. package/src/webinar/collection.ts +31 -0
  303. package/src/webinar/index.ts +62 -0
  304. package/test/integration/spec/converged-space-meetings.js +60 -3
  305. package/test/integration/spec/journey.js +320 -261
  306. package/test/integration/spec/space-meeting.js +76 -3
  307. package/test/unit/spec/annotation/index.ts +418 -0
  308. package/test/unit/spec/breakouts/breakout.ts +118 -28
  309. package/test/unit/spec/breakouts/edit-lock-error.ts +30 -0
  310. package/test/unit/spec/breakouts/events.ts +89 -0
  311. package/test/unit/spec/breakouts/index.ts +1395 -69
  312. package/test/unit/spec/breakouts/utils.js +52 -1
  313. package/test/unit/spec/common/queue.js +31 -2
  314. package/test/unit/spec/controls-options-manager/index.js +163 -0
  315. package/test/unit/spec/controls-options-manager/util.js +576 -60
  316. package/test/unit/spec/fixture/locus.js +1 -0
  317. package/test/unit/spec/interpretation/collection.ts +15 -0
  318. package/test/unit/spec/interpretation/index.ts +589 -0
  319. package/test/unit/spec/interpretation/siLanguage.ts +28 -0
  320. package/test/unit/spec/locus-info/controlsUtils.js +316 -43
  321. package/test/unit/spec/locus-info/index.js +1304 -33
  322. package/test/unit/spec/locus-info/infoUtils.js +37 -15
  323. package/test/unit/spec/locus-info/lib/SeqCmp.json +16 -0
  324. package/test/unit/spec/locus-info/mediaSharesUtils.ts +32 -0
  325. package/test/unit/spec/locus-info/parser.js +116 -35
  326. package/test/unit/spec/locus-info/selfConstant.js +27 -4
  327. package/test/unit/spec/locus-info/selfUtils.js +208 -17
  328. package/test/unit/spec/media/index.ts +104 -37
  329. package/test/unit/spec/media/properties.ts +2 -2
  330. package/test/unit/spec/meeting/in-meeting-actions.ts +81 -3
  331. package/test/unit/spec/meeting/index.js +5216 -1956
  332. package/test/unit/spec/meeting/locusMediaRequest.ts +442 -0
  333. package/test/unit/spec/meeting/muteState.js +408 -208
  334. package/test/unit/spec/meeting/request.js +483 -49
  335. package/test/unit/spec/meeting/utils.js +679 -64
  336. package/test/unit/spec/meeting-info/index.js +300 -0
  337. package/test/unit/spec/meeting-info/meetinginfov2.js +526 -5
  338. package/test/unit/spec/meeting-info/utilv2.js +21 -0
  339. package/test/unit/spec/meetings/collection.js +26 -0
  340. package/test/unit/spec/meetings/index.js +1011 -205
  341. package/test/unit/spec/meetings/utils.js +202 -2
  342. package/test/unit/spec/member/index.js +61 -6
  343. package/test/unit/spec/member/util.js +510 -34
  344. package/test/unit/spec/members/index.js +432 -1
  345. package/test/unit/spec/members/request.js +206 -27
  346. package/test/unit/spec/members/utils.js +210 -0
  347. package/test/unit/spec/metrics/index.js +1 -50
  348. package/test/unit/spec/multistream/mediaRequestManager.ts +803 -162
  349. package/test/unit/spec/multistream/receiveSlot.ts +28 -20
  350. package/test/unit/spec/multistream/receiveSlotManager.ts +32 -30
  351. package/test/unit/spec/multistream/remoteMedia.ts +30 -0
  352. package/test/unit/spec/multistream/remoteMediaGroup.ts +266 -0
  353. package/test/unit/spec/multistream/remoteMediaManager.ts +326 -0
  354. package/test/unit/spec/multistream/sendSlotManager.ts +242 -0
  355. package/test/unit/spec/reachability/index.ts +549 -9
  356. package/test/unit/spec/reachability/request.js +68 -0
  357. package/test/unit/spec/reconnection-manager/index.js +85 -9
  358. package/test/unit/spec/recording-controller/index.js +294 -218
  359. package/test/unit/spec/recording-controller/util.js +223 -96
  360. package/test/unit/spec/roap/index.ts +178 -64
  361. package/test/unit/spec/roap/request.ts +203 -85
  362. package/test/unit/spec/roap/turnDiscovery.ts +82 -36
  363. package/test/unit/spec/rtcMetrics/index.ts +73 -0
  364. package/test/unit/spec/stats-analyzer/index.js +136 -2
  365. package/test/unit/spec/webinar/collection.ts +13 -0
  366. package/test/unit/spec/webinar/index.ts +60 -0
  367. package/test/utils/integrationTestUtils.js +46 -0
  368. package/test/utils/testUtils.js +0 -52
  369. package/dist/meeting/effectsState.js +0 -262
  370. package/dist/meeting/effectsState.js.map +0 -1
  371. package/dist/metrics/config.js +0 -299
  372. package/dist/metrics/config.js.map +0 -1
  373. package/dist/types/meeting/effectsState.d.ts +0 -42
  374. package/dist/types/metrics/config.d.ts +0 -178
  375. package/src/index.js +0 -16
  376. package/src/meeting/effectsState.ts +0 -211
  377. package/src/metrics/config.ts +0 -495
  378. package/test/unit/spec/meeting/effectsState.js +0 -285
@@ -0,0 +1,12 @@
1
+ import type {
2
+ NoiseReductionEffectOptions,
3
+ VirtualBackgroundEffectOptions,
4
+ } from '@webex/media-helpers';
5
+
6
+ type INoiseReductionEffect = Omit<
7
+ NoiseReductionEffectOptions,
8
+ 'authToken' | 'workletProcessorUrl' | 'legacyProcessorUrl'
9
+ >;
10
+ type IVirtualBackgroundEffect = Omit<VirtualBackgroundEffectOptions, 'authToken'>;
11
+
12
+ export type {INoiseReductionEffect, IVirtualBackgroundEffect};
@@ -23,6 +23,7 @@ export default class MeetingRequest extends StatelessWebexPlugin {
23
23
  LoggerProxy.logger.error(
24
24
  `Meetings:request#getActiveMeetings --> failed to get locus details, ${error}`
25
25
  );
26
+ throw new Error(error);
26
27
  });
27
28
  }
28
29
 
@@ -71,6 +72,7 @@ export default class MeetingRequest extends StatelessWebexPlugin {
71
72
  LoggerProxy.logger.error(
72
73
  `Meetings:request#determineRedirections --> failed to get locus details from url: ${url}, reason: ${error}`
73
74
  );
75
+ throw new Error(error);
74
76
  })
75
77
  )
76
78
  ).then(() => Promise.resolve(responseBody));
@@ -1,16 +1,23 @@
1
1
  /* globals window */
2
2
 
3
3
  import {
4
- _LOCUS_ID_,
5
- _INCOMING_,
6
4
  _CREATED_,
7
- LOCUSEVENT,
5
+ _INCOMING_,
6
+ _JOINED_,
7
+ _LEFT_,
8
+ _LOCUS_ID_,
9
+ _MOVED_,
10
+ BREAKOUTS,
8
11
  CORRELATION_ID,
9
12
  EVENT_TRIGGERS,
13
+ LOCUS,
14
+ LOCUSEVENT,
10
15
  ROAP,
11
16
  } from '../constants';
12
17
  import LoggerProxy from '../common/logs/logger-proxy';
13
18
  import Trigger from '../common/events/trigger-proxy';
19
+ import BEHAVIORAL_METRICS from '../metrics/constants';
20
+ import Metrics from '../metrics';
14
21
 
15
22
  /**
16
23
  * Meetings Media Codec Missing Event
@@ -44,6 +51,14 @@ MeetingsUtil.handleRoapMercury = (envelope, meetingCollection) => {
44
51
  if (meeting) {
45
52
  const {seq, messageType, tieBreaker, errorType, errorCause} = data.message;
46
53
 
54
+ Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.ROAP_MERCURY_EVENT_RECEIVED, {
55
+ correlation_id: data.correlationId,
56
+ seq,
57
+ message_type: messageType,
58
+ error_type: errorType,
59
+ error_cause: errorCause,
60
+ });
61
+
47
62
  if (messageType === ROAP.ROAP_TYPES.TURN_DISCOVERY_RESPONSE) {
48
63
  // turn discovery is not part of normal roap protocol and so we are not handling it
49
64
  // through the usual roap state machine
@@ -58,13 +73,7 @@ MeetingsUtil.handleRoapMercury = (envelope, meetingCollection) => {
58
73
  errorCause,
59
74
  };
60
75
 
61
- const mediaServer = MeetingsUtil.getMediaServer(roapMessage.sdp);
62
-
63
- meeting.mediaProperties.webrtcMediaConnection.roapMessageReceived(roapMessage);
64
-
65
- if (mediaServer) {
66
- meeting.mediaProperties.webrtcMediaConnection.mediaServer = mediaServer;
67
- }
76
+ meeting.roapMessageReceived(roapMessage);
68
77
  }
69
78
  }
70
79
  }
@@ -109,11 +118,13 @@ MeetingsUtil.checkForCorrelationId = (deviceUrl, locus) => {
109
118
  MeetingsUtil.parseDefaultSiteFromMeetingPreferences = (userPreferences) => {
110
119
  let result = '';
111
120
 
112
- if (userPreferences && userPreferences.sites) {
121
+ if (userPreferences?.sites?.length) {
113
122
  const defaultSite = userPreferences.sites.find((site) => site.default);
114
123
 
115
124
  if (defaultSite) {
116
125
  result = defaultSite.siteUrl;
126
+ } else {
127
+ result = userPreferences.sites[0].siteUrl;
117
128
  }
118
129
  }
119
130
 
@@ -220,4 +231,62 @@ MeetingsUtil.checkH264Support = async function checkH264Support(options: {
220
231
  }, delay);
221
232
  };
222
233
 
234
+ /**
235
+ * get device from locus data
236
+ * @param {Object} newLocus new locus data
237
+ * @param {String} deviceUrl current device url
238
+ * @returns {Object}
239
+ */
240
+ MeetingsUtil.getThisDevice = (newLocus: any, deviceUrl: string) => {
241
+ if (newLocus?.self?.devices?.length > 0) {
242
+ return newLocus.self.devices.find((device) => device.url === deviceUrl);
243
+ }
244
+
245
+ return null;
246
+ };
247
+
248
+ /**
249
+ * get self device joined status from locus data
250
+ * @param {Object} meeting current meeting data
251
+ * @param {Object} newLocus new locus data
252
+ * @param {String} deviceUrl current device url
253
+ * @returns {Object}
254
+ */
255
+ MeetingsUtil.joinedOnThisDevice = (meeting: any, newLocus: any, deviceUrl: string) => {
256
+ const thisDevice = MeetingsUtil.getThisDevice(newLocus, deviceUrl);
257
+ if (thisDevice) {
258
+ if (!thisDevice.correlationId || meeting?.correlationId === thisDevice.correlationId) {
259
+ return (
260
+ thisDevice.state === _JOINED_ ||
261
+ (thisDevice.state === _LEFT_ && thisDevice.reason === _MOVED_)
262
+ );
263
+ }
264
+ }
265
+
266
+ return false;
267
+ };
268
+
269
+ /**
270
+ * check the new locus is breakout session's one or not
271
+ * @param {Object} newLocus new locus data
272
+ * @returns {boolean}
273
+ * @private
274
+ */
275
+ MeetingsUtil.isBreakoutLocusDTO = (newLocus: any) => {
276
+ return newLocus?.controls?.breakout?.sessionType === BREAKOUTS.SESSION_TYPES.BREAKOUT;
277
+ };
278
+
279
+ /**
280
+ * check the locus is valid breakout locus or not
281
+ * @param {Object} locus
282
+ * @returns {boolean}
283
+ * @private
284
+ */
285
+ MeetingsUtil.isValidBreakoutLocus = (locus: any) => {
286
+ const inActiveStatus = locus?.fullState?.state === LOCUS.STATE.INACTIVE;
287
+ const isLocusAsBreakout = MeetingsUtil.isBreakoutLocusDTO(locus);
288
+ const selfJoined = locus.self?.state === _JOINED_;
289
+
290
+ return isLocusAsBreakout && !inActiveStatus && selfJoined;
291
+ };
223
292
  export default MeetingsUtil;
@@ -2,6 +2,7 @@
2
2
  * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.
3
3
  */
4
4
  import {MEETINGS, _IN_LOBBY_, _NOT_IN_MEETING_, _IN_MEETING_} from '../constants';
5
+ import {IExternalRoles, IMediaStatus, ParticipantWithRoles} from './types';
5
6
 
6
7
  import MemberUtil from './util';
7
8
 
@@ -10,6 +11,7 @@ import MemberUtil from './util';
10
11
  */
11
12
  export default class Member {
12
13
  associatedUser: any;
14
+ canReclaimHost: boolean;
13
15
  id: any;
14
16
  isAudioMuted: any;
15
17
  isContentSharing: any;
@@ -28,10 +30,14 @@ export default class Member {
28
30
  isSelf: any;
29
31
  isUser: any;
30
32
  isVideoMuted: any;
33
+ roles: IExternalRoles;
34
+ mediaStatus: IMediaStatus;
31
35
  name: any;
32
36
  participant: any;
33
37
  status: any;
34
38
  supportsBreakouts: boolean;
39
+ supportsInterpretation: boolean;
40
+ supportLiveAnnotation: boolean;
35
41
  type: any;
36
42
  namespace = MEETINGS;
37
43
 
@@ -56,6 +62,13 @@ export default class Member {
56
62
  }
57
63
  | any = {}
58
64
  ) {
65
+ /**
66
+ * @instance
67
+ * @type {Boolean}
68
+ * @public
69
+ * @memberof Member
70
+ */
71
+ this.canReclaimHost = false;
59
72
  /**
60
73
  * The server participant object
61
74
  * @instance
@@ -108,6 +121,13 @@ export default class Member {
108
121
  * @memberof Member
109
122
  */
110
123
  this.supportsBreakouts = null;
124
+ /**
125
+ * @instance
126
+ * @type {Boolean}
127
+ * @public
128
+ * @memberof Member
129
+ */
130
+ this.supportLiveAnnotation = null;
111
131
  /**
112
132
  * @instance
113
133
  * @type {Boolean}
@@ -228,6 +248,27 @@ export default class Member {
228
248
  * @memberof Member
229
249
  */
230
250
  this.isModeratorAssignmentProhibited = null;
251
+
252
+ /**
253
+ * @instance
254
+ * @type {IExternalRoles}
255
+ * @public
256
+ * @memberof Member
257
+ */
258
+ this.roles = null;
259
+
260
+ /**
261
+ * @instance
262
+ * @type {IMediaStatus}
263
+ * @public
264
+ * @memberof Member
265
+ * @example {audio: MediaStatus.RECVONLY, video: MediaStatus.SENDRECV}
266
+ */
267
+ this.mediaStatus = {
268
+ audio: null,
269
+ video: null,
270
+ };
271
+
231
272
  // TODO: more participant types
232
273
  // such as native client, web client, is a device, what type of phone, etc
233
274
  this.processParticipant(participant);
@@ -245,12 +286,15 @@ export default class Member {
245
286
  private processParticipant(participant: object) {
246
287
  this.participant = participant;
247
288
  if (participant) {
289
+ this.canReclaimHost = MemberUtil.canReclaimHost(participant);
248
290
  this.id = MemberUtil.extractId(participant);
249
291
  this.name = MemberUtil.extractName(participant);
250
292
  this.isAudioMuted = MemberUtil.isAudioMuted(participant);
251
293
  this.isVideoMuted = MemberUtil.isVideoMuted(participant);
252
294
  this.isHandRaised = MemberUtil.isHandRaised(participant);
253
295
  this.supportsBreakouts = MemberUtil.isBreakoutsSupported(participant);
296
+ this.supportsInterpretation = MemberUtil.isInterpretationSupported(participant);
297
+ this.supportLiveAnnotation = MemberUtil.isLiveAnnotationSupported(participant);
254
298
  this.isGuest = MemberUtil.isGuest(participant);
255
299
  this.isUser = MemberUtil.isUser(participant);
256
300
  this.isDevice = MemberUtil.isDevice(participant);
@@ -258,6 +302,7 @@ export default class Member {
258
302
  this.isModeratorAssignmentProhibited =
259
303
  MemberUtil.isModeratorAssignmentProhibited(participant);
260
304
  this.processStatus(participant);
305
+ this.processRoles(participant as ParticipantWithRoles);
261
306
  // must be done last
262
307
  this.isNotAdmitted = MemberUtil.isNotAdmitted(participant, this.isGuest, this.status);
263
308
  }
@@ -303,6 +348,8 @@ export default class Member {
303
348
  this.isAudioMuted,
304
349
  this.type
305
350
  );
351
+
352
+ this.mediaStatus = MemberUtil.extractMediaStatus(this.participant);
306
353
  }
307
354
 
308
355
  /**
@@ -427,6 +474,17 @@ export default class Member {
427
474
  }
428
475
  }
429
476
 
477
+ /**
478
+ * process the roles that have been applied to this member
479
+ * @param {Object} participant
480
+ * @returns {undefined}
481
+ * @private
482
+ * @memberof Member
483
+ */
484
+ private processRoles(participant: ParticipantWithRoles) {
485
+ this.roles = MemberUtil.extractControlRoles(participant);
486
+ }
487
+
430
488
  /**
431
489
  * set the type for the member, could be MEETING or CALL
432
490
  * @param {String} type
@@ -0,0 +1,38 @@
1
+ export interface IExternalRoles {
2
+ cohost: boolean;
3
+ moderator: boolean;
4
+ presenter: boolean;
5
+ }
6
+
7
+ export enum ServerRoles {
8
+ Cohost = 'COHOST',
9
+ Moderator = 'MODERATOR',
10
+ Presenter = 'PRESENTER',
11
+ }
12
+
13
+ export type ServerRoleShape = {
14
+ type: ServerRoles;
15
+ hasRole: boolean;
16
+ };
17
+
18
+ export type ParticipantWithRoles = {
19
+ controls: {
20
+ role: {
21
+ roles: Array<ServerRoleShape>;
22
+ };
23
+ };
24
+ };
25
+
26
+ // values are inherited from locus so don't update these
27
+ export enum MediaStatus {
28
+ RECVONLY = 'RECVONLY', // participant only receiving and not sending
29
+ SENDONLY = 'SENDONLY', // participant only sending and not receiving
30
+ SENDRECV = 'SENDRECV', // participant both sending and receiving
31
+ INACTIVE = 'INACTIVE', // participant is not connected to media source
32
+ UNKNOWN = 'UNKNOWN', // participant has not added media in the meeting
33
+ }
34
+
35
+ export interface IMediaStatus {
36
+ audio: MediaStatus;
37
+ video: MediaStatus;
38
+ }
@@ -1,3 +1,10 @@
1
+ import {
2
+ IExternalRoles,
3
+ ParticipantWithRoles,
4
+ ServerRoles,
5
+ ServerRoleShape,
6
+ IMediaStatus,
7
+ } from './types';
1
8
  import {
2
9
  _USER_,
3
10
  _RESOURCE_ROOM_,
@@ -14,11 +21,79 @@ import {
14
21
  _SEND_RECEIVE_,
15
22
  _RECEIVE_ONLY_,
16
23
  _CALL_,
24
+ VIDEO,
25
+ AUDIO,
17
26
  } from '../constants';
18
27
  import ParameterError from '../common/errors/parameter';
19
28
 
20
29
  const MemberUtil: any = {};
21
30
 
31
+ /**
32
+ * @param {Object} participant the locus participant
33
+ * @returns {Boolean}
34
+ */
35
+ MemberUtil.canReclaimHost = (participant) => {
36
+ if (!participant) {
37
+ throw new ParameterError(
38
+ 'canReclaimHostRole could not be processed, participant is undefined.'
39
+ );
40
+ }
41
+
42
+ return participant.canReclaimHostRole || false;
43
+ };
44
+
45
+ /**
46
+ * @param {Object} participant the locus participant
47
+ * @returns {[ServerRoleShape]}
48
+ */
49
+ MemberUtil.getControlsRoles = (participant: ParticipantWithRoles): Array<ServerRoleShape> =>
50
+ participant?.controls?.role?.roles;
51
+
52
+ /**
53
+ * @param {Object} participant the locus participant
54
+ * @param {ServerRoles} controlRole the search role
55
+ * @returns {Boolean}
56
+ */
57
+ MemberUtil.hasRole = (participant: any, controlRole: ServerRoles): boolean =>
58
+ MemberUtil.getControlsRoles(participant)?.some(
59
+ (role) => role.type === controlRole && role.hasRole
60
+ );
61
+
62
+ /**
63
+ * @param {Object} participant the locus participant
64
+ * @returns {Boolean}
65
+ */
66
+ MemberUtil.hasCohost = (participant: ParticipantWithRoles): boolean =>
67
+ MemberUtil.hasRole(participant, ServerRoles.Cohost) || false;
68
+
69
+ /**
70
+ * @param {Object} participant the locus participant
71
+ * @returns {Boolean}
72
+ */
73
+ MemberUtil.hasModerator = (participant: ParticipantWithRoles): boolean =>
74
+ MemberUtil.hasRole(participant, ServerRoles.Moderator) || false;
75
+
76
+ /**
77
+ * @param {Object} participant the locus participant
78
+ * @returns {Boolean}
79
+ */
80
+ MemberUtil.hasPresenter = (participant: ParticipantWithRoles): boolean =>
81
+ MemberUtil.hasRole(participant, ServerRoles.Presenter) || false;
82
+
83
+ /**
84
+ * @param {Object} participant the locus participant
85
+ * @returns {IExternalRoles}
86
+ */
87
+ MemberUtil.extractControlRoles = (participant: ParticipantWithRoles): IExternalRoles => {
88
+ const roles = {
89
+ cohost: MemberUtil.hasCohost(participant),
90
+ moderator: MemberUtil.hasModerator(participant),
91
+ presenter: MemberUtil.hasPresenter(participant),
92
+ };
93
+
94
+ return roles;
95
+ };
96
+
22
97
  /**
23
98
  * @param {Object} participant the locus participant
24
99
  * @returns {Boolean}
@@ -93,30 +168,20 @@ MemberUtil.isAudioMuted = (participant: any) => {
93
168
  if (!participant) {
94
169
  throw new ParameterError('Audio could not be processed, participant is undefined.');
95
170
  }
96
- const mutedStatus = MemberUtil.isMuted(participant.status, AUDIO_STATUS);
97
-
98
- if (participant.controls && participant.controls.audio) {
99
- if (participant.controls.audio.muted) {
100
- return true;
101
- }
102
- if (mutedStatus) {
103
- return true;
104
- }
105
- }
106
171
 
107
- return false;
172
+ return MemberUtil.isMuted(participant, AUDIO_STATUS, AUDIO);
108
173
  };
109
174
 
110
175
  /**
111
176
  * @param {Object} participant the locus participant
112
177
  * @returns {Boolean}
113
178
  */
114
- MemberUtil.isVideoMuted = (participant: any) => {
179
+ MemberUtil.isVideoMuted = (participant: any): boolean => {
115
180
  if (!participant) {
116
181
  throw new ParameterError('Video could not be processed, participant is undefined.');
117
182
  }
118
183
 
119
- return MemberUtil.isMuted(participant.status, VIDEO_STATUS);
184
+ return MemberUtil.isMuted(participant, VIDEO_STATUS, VIDEO);
120
185
  };
121
186
 
122
187
  /**
@@ -144,22 +209,57 @@ MemberUtil.isBreakoutsSupported = (participant) => {
144
209
  };
145
210
 
146
211
  /**
147
- * utility method for audio/video muted status
148
- * @param {String} status
149
- * @param {String} accessor
212
+ * @param {Object} participant the locus participant
150
213
  * @returns {Boolean}
151
214
  */
152
- MemberUtil.isMuted = (status: string, accessor: string) => {
153
- if (status) {
154
- if (status[accessor] === _RECEIVE_ONLY_) {
155
- return true;
156
- }
157
- if (status[accessor] === _SEND_RECEIVE_) {
158
- return false;
159
- }
215
+ MemberUtil.isInterpretationSupported = (participant) => {
216
+ if (!participant) {
217
+ throw new ParameterError(
218
+ 'Interpretation support could not be processed, participant is undefined.'
219
+ );
160
220
  }
161
221
 
162
- return null;
222
+ return !participant.doesNotSupportSiInterpreter;
223
+ };
224
+
225
+ /**
226
+ * @param {Object} participant the locus participant
227
+ * @returns {Boolean}
228
+ */
229
+ MemberUtil.isLiveAnnotationSupported = (participant) => {
230
+ if (!participant) {
231
+ throw new ParameterError(
232
+ 'LiveAnnotation support could not be processed, participant is undefined.'
233
+ );
234
+ }
235
+
236
+ return !participant.annotatorAssignmentNotAllowed;
237
+ };
238
+
239
+ /**
240
+ * utility method for audio/video muted status
241
+ * @param {any} participant
242
+ * @param {String} statusAccessor
243
+ * @param {String} controlsAccessor
244
+ * @returns {Boolean | undefined}
245
+ */
246
+ MemberUtil.isMuted = (participant: any, statusAccessor: string, controlsAccessor: string) => {
247
+ // check remote mute
248
+ const remoteMute = participant?.controls?.[controlsAccessor]?.muted;
249
+ if (remoteMute === true) {
250
+ return true;
251
+ }
252
+
253
+ // check local mute
254
+ const localStatus = participant?.status?.[statusAccessor];
255
+ if (localStatus === _RECEIVE_ONLY_) {
256
+ return true;
257
+ }
258
+ if (localStatus === _SEND_RECEIVE_) {
259
+ return false;
260
+ }
261
+
262
+ return remoteMute;
163
263
  };
164
264
 
165
265
  /**
@@ -266,6 +366,22 @@ MemberUtil.extractId = (participant: any) => {
266
366
  return null;
267
367
  };
268
368
 
369
+ /**
370
+ * extracts the media status from nested participant object
371
+ * @param {Object} participant the locus participant
372
+ * @returns {Object}
373
+ */
374
+ MemberUtil.extractMediaStatus = (participant: any): IMediaStatus => {
375
+ if (!participant) {
376
+ throw new ParameterError('Media status could not be extracted, participant is undefined.');
377
+ }
378
+
379
+ return {
380
+ audio: participant.status?.audioStatus,
381
+ video: participant.status?.videoStatus,
382
+ };
383
+ };
384
+
269
385
  /**
270
386
  * @param {Object} participant the locus participant
271
387
  * @returns {String}
@@ -37,4 +37,12 @@ export default class MembersCollection {
37
37
  getAll() {
38
38
  return this.members;
39
39
  }
40
+
41
+ /**
42
+ * @returns {void}
43
+ * reset members
44
+ */
45
+ reset() {
46
+ this.members = {};
47
+ }
40
48
  }