@webex/plugin-meetings 3.0.0-beta.39 → 3.0.0-beta.391

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 (393) hide show
  1. package/README.md +58 -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/events.js +45 -0
  11. package/dist/breakouts/events.js.map +1 -0
  12. package/dist/breakouts/index.js +671 -81
  13. package/dist/breakouts/index.js.map +1 -1
  14. package/dist/breakouts/utils.js +45 -1
  15. package/dist/breakouts/utils.js.map +1 -1
  16. package/dist/common/errors/no-meeting-info.js +51 -0
  17. package/dist/common/errors/no-meeting-info.js.map +1 -0
  18. package/dist/common/errors/reclaim-host-role-errors.js +158 -0
  19. package/dist/common/errors/reclaim-host-role-errors.js.map +1 -0
  20. package/dist/common/errors/webex-errors.js +48 -7
  21. package/dist/common/errors/webex-errors.js.map +1 -1
  22. package/dist/common/logs/logger-proxy.js +1 -1
  23. package/dist/common/logs/logger-proxy.js.map +1 -1
  24. package/dist/common/logs/request.js +5 -1
  25. package/dist/common/logs/request.js.map +1 -1
  26. package/dist/common/queue.js +24 -9
  27. package/dist/common/queue.js.map +1 -1
  28. package/dist/config.js +5 -10
  29. package/dist/config.js.map +1 -1
  30. package/dist/constants.js +242 -33
  31. package/dist/constants.js.map +1 -1
  32. package/dist/controls-options-manager/enums.js +14 -2
  33. package/dist/controls-options-manager/enums.js.map +1 -1
  34. package/dist/controls-options-manager/index.js +109 -15
  35. package/dist/controls-options-manager/index.js.map +1 -1
  36. package/dist/controls-options-manager/types.js +7 -0
  37. package/dist/controls-options-manager/types.js.map +1 -0
  38. package/dist/controls-options-manager/util.js +309 -18
  39. package/dist/controls-options-manager/util.js.map +1 -1
  40. package/dist/index.js +110 -2
  41. package/dist/index.js.map +1 -1
  42. package/dist/interceptors/index.js +15 -0
  43. package/dist/interceptors/index.js.map +1 -0
  44. package/dist/interceptors/locusRetry.js +93 -0
  45. package/dist/interceptors/locusRetry.js.map +1 -0
  46. package/dist/interpretation/collection.js +23 -0
  47. package/dist/interpretation/collection.js.map +1 -0
  48. package/dist/interpretation/index.js +380 -0
  49. package/dist/interpretation/index.js.map +1 -0
  50. package/dist/interpretation/siLanguage.js +25 -0
  51. package/dist/interpretation/siLanguage.js.map +1 -0
  52. package/dist/locus-info/controlsUtils.js +91 -2
  53. package/dist/locus-info/controlsUtils.js.map +1 -1
  54. package/dist/locus-info/index.js +386 -62
  55. package/dist/locus-info/index.js.map +1 -1
  56. package/dist/locus-info/infoUtils.js +7 -1
  57. package/dist/locus-info/infoUtils.js.map +1 -1
  58. package/dist/locus-info/mediaSharesUtils.js +71 -1
  59. package/dist/locus-info/mediaSharesUtils.js.map +1 -1
  60. package/dist/locus-info/parser.js +249 -72
  61. package/dist/locus-info/parser.js.map +1 -1
  62. package/dist/locus-info/selfUtils.js +89 -14
  63. package/dist/locus-info/selfUtils.js.map +1 -1
  64. package/dist/media/index.js +65 -102
  65. package/dist/media/index.js.map +1 -1
  66. package/dist/media/properties.js +73 -124
  67. package/dist/media/properties.js.map +1 -1
  68. package/dist/mediaQualityMetrics/config.js +135 -330
  69. package/dist/mediaQualityMetrics/config.js.map +1 -1
  70. package/dist/meeting/in-meeting-actions.js +86 -2
  71. package/dist/meeting/in-meeting-actions.js.map +1 -1
  72. package/dist/meeting/index.js +4075 -2827
  73. package/dist/meeting/index.js.map +1 -1
  74. package/dist/meeting/locusMediaRequest.js +292 -0
  75. package/dist/meeting/locusMediaRequest.js.map +1 -0
  76. package/dist/meeting/muteState.js +224 -136
  77. package/dist/meeting/muteState.js.map +1 -1
  78. package/dist/meeting/request.js +177 -152
  79. package/dist/meeting/request.js.map +1 -1
  80. package/dist/meeting/util.js +672 -417
  81. package/dist/meeting/util.js.map +1 -1
  82. package/dist/meeting-info/index.js +73 -7
  83. package/dist/meeting-info/index.js.map +1 -1
  84. package/dist/meeting-info/meeting-info-v2.js +192 -51
  85. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  86. package/dist/meeting-info/util.js +1 -1
  87. package/dist/meeting-info/util.js.map +1 -1
  88. package/dist/meeting-info/utilv2.js +36 -36
  89. package/dist/meeting-info/utilv2.js.map +1 -1
  90. package/dist/meetings/collection.js +39 -0
  91. package/dist/meetings/collection.js.map +1 -1
  92. package/dist/meetings/index.js +484 -119
  93. package/dist/meetings/index.js.map +1 -1
  94. package/dist/meetings/meetings.types.js +7 -0
  95. package/dist/meetings/meetings.types.js.map +1 -0
  96. package/dist/meetings/request.js +2 -0
  97. package/dist/meetings/request.js.map +1 -1
  98. package/dist/meetings/util.js +73 -7
  99. package/dist/meetings/util.js.map +1 -1
  100. package/dist/member/index.js +58 -0
  101. package/dist/member/index.js.map +1 -1
  102. package/dist/member/types.js +25 -0
  103. package/dist/member/types.js.map +1 -0
  104. package/dist/member/util.js +132 -25
  105. package/dist/member/util.js.map +1 -1
  106. package/dist/members/collection.js +10 -0
  107. package/dist/members/collection.js.map +1 -1
  108. package/dist/members/index.js +102 -6
  109. package/dist/members/index.js.map +1 -1
  110. package/dist/members/request.js +106 -38
  111. package/dist/members/request.js.map +1 -1
  112. package/dist/members/types.js +15 -0
  113. package/dist/members/types.js.map +1 -0
  114. package/dist/members/util.js +326 -232
  115. package/dist/members/util.js.map +1 -1
  116. package/dist/metrics/constants.js +18 -1
  117. package/dist/metrics/constants.js.map +1 -1
  118. package/dist/metrics/index.js +1 -446
  119. package/dist/metrics/index.js.map +1 -1
  120. package/dist/multistream/mediaRequestManager.js +223 -32
  121. package/dist/multistream/mediaRequestManager.js.map +1 -1
  122. package/dist/multistream/receiveSlot.js +10 -0
  123. package/dist/multistream/receiveSlot.js.map +1 -1
  124. package/dist/multistream/receiveSlotManager.js +39 -36
  125. package/dist/multistream/receiveSlotManager.js.map +1 -1
  126. package/dist/multistream/remoteMedia.js +3 -1
  127. package/dist/multistream/remoteMedia.js.map +1 -1
  128. package/dist/multistream/remoteMediaGroup.js +76 -5
  129. package/dist/multistream/remoteMediaGroup.js.map +1 -1
  130. package/dist/multistream/remoteMediaManager.js +366 -104
  131. package/dist/multistream/remoteMediaManager.js.map +1 -1
  132. package/dist/multistream/sendSlotManager.js +255 -0
  133. package/dist/multistream/sendSlotManager.js.map +1 -0
  134. package/dist/reachability/clusterReachability.js +356 -0
  135. package/dist/reachability/clusterReachability.js.map +1 -0
  136. package/dist/reachability/index.js +263 -390
  137. package/dist/reachability/index.js.map +1 -1
  138. package/dist/reachability/request.js +6 -4
  139. package/dist/reachability/request.js.map +1 -1
  140. package/dist/reachability/util.js +29 -0
  141. package/dist/reachability/util.js.map +1 -0
  142. package/dist/reconnection-manager/index.js +266 -202
  143. package/dist/reconnection-manager/index.js.map +1 -1
  144. package/dist/recording-controller/index.js +21 -2
  145. package/dist/recording-controller/index.js.map +1 -1
  146. package/dist/recording-controller/util.js +9 -8
  147. package/dist/recording-controller/util.js.map +1 -1
  148. package/dist/roap/index.js +51 -28
  149. package/dist/roap/index.js.map +1 -1
  150. package/dist/roap/request.js +48 -64
  151. package/dist/roap/request.js.map +1 -1
  152. package/dist/roap/turnDiscovery.js +220 -70
  153. package/dist/roap/turnDiscovery.js.map +1 -1
  154. package/dist/rtcMetrics/constants.js +12 -0
  155. package/dist/rtcMetrics/constants.js.map +1 -0
  156. package/dist/rtcMetrics/index.js +179 -0
  157. package/dist/rtcMetrics/index.js.map +1 -0
  158. package/dist/statsAnalyzer/index.js +357 -295
  159. package/dist/statsAnalyzer/index.js.map +1 -1
  160. package/dist/statsAnalyzer/mqaUtil.js +296 -156
  161. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  162. package/dist/types/annotation/annotation.types.d.ts +42 -0
  163. package/dist/types/annotation/constants.d.ts +31 -0
  164. package/dist/types/annotation/index.d.ts +117 -0
  165. package/dist/types/breakouts/events.d.ts +8 -0
  166. package/dist/types/breakouts/utils.d.ts +14 -0
  167. package/dist/types/common/errors/no-meeting-info.d.ts +14 -0
  168. package/dist/types/common/errors/reclaim-host-role-errors.d.ts +60 -0
  169. package/dist/types/common/errors/webex-errors.d.ts +25 -1
  170. package/dist/types/common/logs/request.d.ts +2 -0
  171. package/dist/types/common/queue.d.ts +9 -7
  172. package/dist/types/config.d.ts +2 -7
  173. package/dist/types/constants.d.ts +203 -31
  174. package/dist/types/controls-options-manager/enums.d.ts +11 -1
  175. package/dist/types/controls-options-manager/index.d.ts +17 -1
  176. package/dist/types/controls-options-manager/types.d.ts +43 -0
  177. package/dist/types/controls-options-manager/util.d.ts +1 -7
  178. package/dist/types/index.d.ts +6 -5
  179. package/dist/types/interceptors/index.d.ts +2 -0
  180. package/dist/types/interceptors/locusRetry.d.ts +27 -0
  181. package/dist/types/interpretation/collection.d.ts +5 -0
  182. package/dist/types/interpretation/index.d.ts +5 -0
  183. package/dist/types/interpretation/siLanguage.d.ts +5 -0
  184. package/dist/types/locus-info/index.d.ts +57 -4
  185. package/dist/types/locus-info/parser.d.ts +66 -6
  186. package/dist/types/media/index.d.ts +2 -0
  187. package/dist/types/media/properties.d.ts +34 -49
  188. package/dist/types/mediaQualityMetrics/config.d.ts +99 -223
  189. package/dist/types/meeting/in-meeting-actions.d.ts +86 -2
  190. package/dist/types/meeting/index.d.ts +567 -496
  191. package/dist/types/meeting/locusMediaRequest.d.ts +74 -0
  192. package/dist/types/meeting/muteState.d.ts +93 -25
  193. package/dist/types/meeting/request.d.ts +64 -43
  194. package/dist/types/meeting/util.d.ts +117 -1
  195. package/dist/types/meeting-info/index.d.ts +13 -1
  196. package/dist/types/meeting-info/meeting-info-v2.d.ts +31 -1
  197. package/dist/types/meetings/collection.d.ts +17 -0
  198. package/dist/types/meetings/index.d.ts +113 -21
  199. package/dist/types/meetings/meetings.types.d.ts +4 -0
  200. package/dist/types/member/index.d.ts +14 -0
  201. package/dist/types/member/types.d.ts +32 -0
  202. package/dist/types/members/collection.d.ts +5 -0
  203. package/dist/types/members/index.d.ts +35 -2
  204. package/dist/types/members/request.d.ts +73 -9
  205. package/dist/types/members/types.d.ts +25 -0
  206. package/dist/types/members/util.d.ts +214 -1
  207. package/dist/types/metrics/constants.d.ts +17 -0
  208. package/dist/types/metrics/index.d.ts +4 -111
  209. package/dist/types/multistream/mediaRequestManager.d.ts +72 -3
  210. package/dist/types/multistream/receiveSlot.d.ts +7 -3
  211. package/dist/types/multistream/receiveSlotManager.d.ts +14 -4
  212. package/dist/types/multistream/remoteMedia.d.ts +3 -31
  213. package/dist/types/multistream/remoteMediaGroup.d.ts +2 -9
  214. package/dist/types/multistream/remoteMediaManager.d.ts +62 -2
  215. package/dist/types/multistream/sendSlotManager.d.ts +70 -0
  216. package/dist/types/reachability/clusterReachability.d.ts +109 -0
  217. package/dist/types/reachability/index.d.ts +60 -95
  218. package/dist/types/reachability/request.d.ts +3 -1
  219. package/dist/types/reachability/util.d.ts +8 -0
  220. package/dist/types/reconnection-manager/index.d.ts +19 -0
  221. package/dist/types/recording-controller/index.d.ts +15 -1
  222. package/dist/types/recording-controller/util.d.ts +5 -4
  223. package/dist/types/roap/index.d.ts +2 -1
  224. package/dist/types/roap/request.d.ts +9 -8
  225. package/dist/types/roap/turnDiscovery.d.ts +39 -5
  226. package/dist/types/rtcMetrics/constants.d.ts +4 -0
  227. package/dist/types/rtcMetrics/index.d.ts +61 -0
  228. package/dist/types/statsAnalyzer/index.d.ts +34 -12
  229. package/dist/types/statsAnalyzer/mqaUtil.d.ts +28 -4
  230. package/dist/types/webinar/collection.d.ts +16 -0
  231. package/dist/types/webinar/index.d.ts +5 -0
  232. package/dist/webinar/collection.js +44 -0
  233. package/dist/webinar/collection.js.map +1 -0
  234. package/dist/webinar/index.js +69 -0
  235. package/dist/webinar/index.js.map +1 -0
  236. package/package.json +22 -19
  237. package/src/annotation/annotation.types.ts +50 -0
  238. package/src/annotation/constants.ts +36 -0
  239. package/src/annotation/index.ts +328 -0
  240. package/src/breakouts/README.md +35 -11
  241. package/src/breakouts/breakout.ts +67 -9
  242. package/src/breakouts/events.ts +56 -0
  243. package/src/breakouts/index.ts +558 -59
  244. package/src/breakouts/utils.ts +42 -0
  245. package/src/common/errors/no-meeting-info.ts +24 -0
  246. package/src/common/errors/reclaim-host-role-errors.ts +134 -0
  247. package/src/common/errors/webex-errors.ts +44 -2
  248. package/src/common/logs/logger-proxy.ts +1 -1
  249. package/src/common/logs/request.ts +5 -1
  250. package/src/common/queue.ts +22 -8
  251. package/src/config.ts +4 -9
  252. package/src/constants.ts +229 -21
  253. package/src/controls-options-manager/enums.ts +12 -0
  254. package/src/controls-options-manager/index.ts +116 -21
  255. package/src/controls-options-manager/types.ts +59 -0
  256. package/src/controls-options-manager/util.ts +294 -14
  257. package/src/index.ts +44 -0
  258. package/src/interceptors/index.ts +3 -0
  259. package/src/interceptors/locusRetry.ts +67 -0
  260. package/src/interpretation/README.md +60 -0
  261. package/src/interpretation/collection.ts +19 -0
  262. package/src/interpretation/index.ts +349 -0
  263. package/src/interpretation/siLanguage.ts +18 -0
  264. package/src/locus-info/controlsUtils.ts +108 -0
  265. package/src/locus-info/index.ts +417 -59
  266. package/src/locus-info/infoUtils.ts +10 -2
  267. package/src/locus-info/mediaSharesUtils.ts +80 -0
  268. package/src/locus-info/parser.ts +258 -47
  269. package/src/locus-info/selfUtils.ts +81 -5
  270. package/src/media/index.ts +100 -108
  271. package/src/media/properties.ts +88 -117
  272. package/src/mediaQualityMetrics/config.ts +103 -238
  273. package/src/meeting/in-meeting-actions.ts +171 -3
  274. package/src/meeting/index.ts +3411 -2435
  275. package/src/meeting/locusMediaRequest.ts +313 -0
  276. package/src/meeting/muteState.ts +223 -136
  277. package/src/meeting/request.ts +155 -120
  278. package/src/meeting/util.ts +685 -395
  279. package/src/meeting-info/index.ts +81 -8
  280. package/src/meeting-info/meeting-info-v2.ts +170 -14
  281. package/src/meeting-info/util.ts +1 -1
  282. package/src/meeting-info/utilv2.ts +23 -23
  283. package/src/meetings/collection.ts +33 -0
  284. package/src/meetings/index.ts +507 -127
  285. package/src/meetings/meetings.types.ts +12 -0
  286. package/src/meetings/request.ts +2 -0
  287. package/src/meetings/util.ts +81 -12
  288. package/src/member/index.ts +58 -0
  289. package/src/member/types.ts +38 -0
  290. package/src/member/util.ts +141 -25
  291. package/src/members/collection.ts +8 -0
  292. package/src/members/index.ts +134 -8
  293. package/src/members/request.ts +97 -17
  294. package/src/members/types.ts +29 -0
  295. package/src/members/util.ts +333 -240
  296. package/src/metrics/constants.ts +17 -0
  297. package/src/metrics/index.ts +1 -469
  298. package/src/multistream/mediaRequestManager.ts +271 -56
  299. package/src/multistream/receiveSlot.ts +11 -4
  300. package/src/multistream/receiveSlotManager.ts +34 -24
  301. package/src/multistream/remoteMedia.ts +5 -3
  302. package/src/multistream/remoteMediaGroup.ts +78 -0
  303. package/src/multistream/remoteMediaManager.ts +248 -44
  304. package/src/multistream/sendSlotManager.ts +199 -0
  305. package/src/reachability/clusterReachability.ts +320 -0
  306. package/src/reachability/index.ts +229 -346
  307. package/src/reachability/request.ts +8 -4
  308. package/src/reachability/util.ts +24 -0
  309. package/src/reconnection-manager/index.ts +128 -97
  310. package/src/recording-controller/index.ts +20 -3
  311. package/src/recording-controller/util.ts +26 -9
  312. package/src/roap/index.ts +52 -23
  313. package/src/roap/request.ts +48 -67
  314. package/src/roap/turnDiscovery.ts +147 -49
  315. package/src/rtcMetrics/constants.ts +3 -0
  316. package/src/rtcMetrics/index.ts +166 -0
  317. package/src/statsAnalyzer/index.ts +457 -416
  318. package/src/statsAnalyzer/mqaUtil.ts +317 -170
  319. package/src/webinar/collection.ts +31 -0
  320. package/src/webinar/index.ts +62 -0
  321. package/test/integration/spec/converged-space-meetings.js +60 -3
  322. package/test/integration/spec/journey.js +320 -261
  323. package/test/integration/spec/space-meeting.js +76 -3
  324. package/test/unit/spec/annotation/index.ts +418 -0
  325. package/test/unit/spec/breakouts/breakout.ts +118 -28
  326. package/test/unit/spec/breakouts/events.ts +89 -0
  327. package/test/unit/spec/breakouts/index.ts +1349 -114
  328. package/test/unit/spec/breakouts/utils.js +52 -1
  329. package/test/unit/spec/common/queue.js +31 -2
  330. package/test/unit/spec/controls-options-manager/index.js +163 -0
  331. package/test/unit/spec/controls-options-manager/util.js +576 -60
  332. package/test/unit/spec/fixture/locus.js +1 -0
  333. package/test/unit/spec/interceptors/locusRetry.ts +131 -0
  334. package/test/unit/spec/interpretation/collection.ts +15 -0
  335. package/test/unit/spec/interpretation/index.ts +625 -0
  336. package/test/unit/spec/interpretation/siLanguage.ts +28 -0
  337. package/test/unit/spec/locus-info/controlsUtils.js +316 -43
  338. package/test/unit/spec/locus-info/index.js +1363 -37
  339. package/test/unit/spec/locus-info/infoUtils.js +37 -15
  340. package/test/unit/spec/locus-info/lib/SeqCmp.json +16 -0
  341. package/test/unit/spec/locus-info/mediaSharesUtils.ts +41 -0
  342. package/test/unit/spec/locus-info/parser.js +116 -35
  343. package/test/unit/spec/locus-info/selfConstant.js +27 -4
  344. package/test/unit/spec/locus-info/selfUtils.js +208 -17
  345. package/test/unit/spec/media/index.ts +173 -81
  346. package/test/unit/spec/media/properties.ts +2 -2
  347. package/test/unit/spec/meeting/in-meeting-actions.ts +85 -3
  348. package/test/unit/spec/meeting/index.js +6821 -2172
  349. package/test/unit/spec/meeting/locusMediaRequest.ts +442 -0
  350. package/test/unit/spec/meeting/muteState.js +402 -212
  351. package/test/unit/spec/meeting/request.js +473 -54
  352. package/test/unit/spec/meeting/utils.js +773 -67
  353. package/test/unit/spec/meeting-info/index.js +300 -0
  354. package/test/unit/spec/meeting-info/meetinginfov2.js +526 -5
  355. package/test/unit/spec/meeting-info/utilv2.js +21 -0
  356. package/test/unit/spec/meetings/collection.js +26 -0
  357. package/test/unit/spec/meetings/index.js +1415 -213
  358. package/test/unit/spec/meetings/utils.js +229 -2
  359. package/test/unit/spec/member/index.js +61 -6
  360. package/test/unit/spec/member/util.js +510 -34
  361. package/test/unit/spec/members/index.js +432 -1
  362. package/test/unit/spec/members/request.js +206 -27
  363. package/test/unit/spec/members/utils.js +210 -0
  364. package/test/unit/spec/metrics/index.js +1 -50
  365. package/test/unit/spec/multistream/mediaRequestManager.ts +781 -114
  366. package/test/unit/spec/multistream/receiveSlot.ts +9 -1
  367. package/test/unit/spec/multistream/receiveSlotManager.ts +32 -30
  368. package/test/unit/spec/multistream/remoteMedia.ts +2 -0
  369. package/test/unit/spec/multistream/remoteMediaGroup.ts +345 -0
  370. package/test/unit/spec/multistream/remoteMediaManager.ts +525 -0
  371. package/test/unit/spec/multistream/sendSlotManager.ts +274 -0
  372. package/test/unit/spec/reachability/clusterReachability.ts +279 -0
  373. package/test/unit/spec/reachability/index.ts +551 -14
  374. package/test/unit/spec/reachability/request.js +3 -1
  375. package/test/unit/spec/reachability/util.ts +40 -0
  376. package/test/unit/spec/reconnection-manager/index.js +171 -11
  377. package/test/unit/spec/recording-controller/index.js +294 -218
  378. package/test/unit/spec/recording-controller/util.js +223 -96
  379. package/test/unit/spec/roap/index.ts +180 -83
  380. package/test/unit/spec/roap/request.ts +100 -62
  381. package/test/unit/spec/roap/turnDiscovery.ts +388 -96
  382. package/test/unit/spec/rtcMetrics/index.ts +122 -0
  383. package/test/unit/spec/stats-analyzer/index.js +1252 -12
  384. package/test/unit/spec/webinar/collection.ts +13 -0
  385. package/test/unit/spec/webinar/index.ts +60 -0
  386. package/test/utils/integrationTestUtils.js +46 -0
  387. package/test/utils/testUtils.js +0 -57
  388. package/test/utils/webex-test-users.js +12 -4
  389. package/dist/metrics/config.js +0 -289
  390. package/dist/metrics/config.js.map +0 -1
  391. package/dist/types/metrics/config.d.ts +0 -169
  392. package/src/index.js +0 -18
  393. package/src/metrics/config.ts +0 -485
@@ -32,9 +32,11 @@ SelfUtils.parse = (self: any, deviceId: string) => {
32
32
  const pstnDevices = self.devices.filter((device) => PSTN_DEVICE_TYPE === device.deviceType);
33
33
 
34
34
  return {
35
+ remoteVideoMuted: SelfUtils.getRemoteVideoMuted(self),
35
36
  remoteMuted: SelfUtils.getRemoteMuted(self),
36
37
  unmuteAllowed: SelfUtils.getUnmuteAllowed(self),
37
38
  localAudioUnmuteRequested: SelfUtils.getLocalAudioUnmuteRequested(self),
39
+ localAudioUnmuteRequestedTimeStamp: SelfUtils.getLocalAudioUnmuteRequestedTimeStamp(self),
38
40
  localAudioUnmuteRequired: SelfUtils.getLocalAudioUnmuteRequired(self),
39
41
  lastModified: SelfUtils.getLastModified(self),
40
42
  modifiedBy: SelfUtils.getModifiedBy(self),
@@ -61,14 +63,18 @@ SelfUtils.parse = (self: any, deviceId: string) => {
61
63
  layout: SelfUtils.getLayout(self),
62
64
  canNotViewTheParticipantList: SelfUtils.canNotViewTheParticipantList(self),
63
65
  isSharingBlocked: SelfUtils.isSharingBlocked(self),
64
- breakoutSessions: SelfUtils.getBreakouts(self),
66
+ breakoutSessions: SelfUtils.getBreakoutSessions(self),
67
+ breakout: SelfUtils.getBreakout(self),
68
+ interpretation: SelfUtils.getInterpretation(self),
65
69
  };
66
70
  }
67
71
 
68
72
  return null;
69
73
  };
70
74
 
71
- SelfUtils.getBreakouts = (self) => self?.controls?.breakout?.sessions;
75
+ SelfUtils.getBreakoutSessions = (self) => self?.controls?.breakout?.sessions;
76
+ SelfUtils.getBreakout = (self) => self?.controls?.breakout;
77
+ SelfUtils.getInterpretation = (self) => self?.controls?.interpretation;
72
78
 
73
79
  SelfUtils.getLayout = (self) =>
74
80
  Array.isArray(self?.controls?.layouts) ? self.controls.layouts[0].type : undefined;
@@ -93,6 +99,7 @@ SelfUtils.getSelves = (oldSelf, newSelf, deviceId) => {
93
99
 
94
100
  updates.isUserUnadmitted = SelfUtils.isUserUnadmitted(current);
95
101
  updates.isUserAdmitted = SelfUtils.isUserAdmitted(previous, current);
102
+ updates.isVideoMutedByOthersChanged = SelfUtils.videoMutedByOthersChanged(previous, current);
96
103
  updates.isMutedByOthersChanged = SelfUtils.mutedByOthersChanged(previous, current);
97
104
  updates.localAudioUnmuteRequestedByServer = SelfUtils.localAudioUnmuteRequestedByServer(
98
105
  previous,
@@ -103,6 +110,7 @@ SelfUtils.getSelves = (oldSelf, newSelf, deviceId) => {
103
110
  current
104
111
  );
105
112
  updates.moderatorChanged = SelfUtils.moderatorChanged(previous, current);
113
+ updates.isRolesChanged = SelfUtils.isRolesChanged(previous, current);
106
114
  updates.isMediaInactiveOrReleased = SelfUtils.wasMediaInactiveOrReleased(previous, current);
107
115
  updates.isUserObserving = SelfUtils.isDeviceObserving(previous, current);
108
116
  updates.layoutChanged = SelfUtils.layoutChanged(previous, current);
@@ -119,6 +127,7 @@ SelfUtils.getSelves = (oldSelf, newSelf, deviceId) => {
119
127
  previous?.canNotViewTheParticipantList !== current.canNotViewTheParticipantList;
120
128
  updates.isSharingBlockedChanged = previous?.isSharingBlocked !== current.isSharingBlocked;
121
129
  updates.breakoutsChanged = SelfUtils.breakoutsChanged(previous, current);
130
+ updates.interpretationChanged = SelfUtils.interpretationChanged(previous, current);
122
131
 
123
132
  return {
124
133
  previous,
@@ -139,13 +148,16 @@ SelfUtils.isJoined = (self: any) => self?.state === _JOINED_;
139
148
  *
140
149
  * @param {Self} previous - Previous self state
141
150
  * @param {Self} current - Current self state [per event]
142
- * @returns {boolean} - If the MEeting Layout Controls Layout has changed.
151
+ * @returns {boolean} - If the Meeting Layout Controls Layout has changed.
143
152
  */
144
153
  SelfUtils.layoutChanged = (previous: any, current: any) =>
145
154
  current?.layout && previous?.layout !== current?.layout;
146
155
 
147
156
  SelfUtils.breakoutsChanged = (previous, current) =>
148
- !isEqual(previous?.breakoutSessions, current?.breakoutSessions);
157
+ !isEqual(previous?.breakoutSessions, current?.breakoutSessions) && !!current?.breakout;
158
+
159
+ SelfUtils.interpretationChanged = (previous, current) =>
160
+ !isEqual(previous?.interpretation, current?.interpretation) && !!current?.interpretation;
149
161
 
150
162
  SelfUtils.isMediaInactive = (previous, current) => {
151
163
  if (
@@ -236,6 +248,19 @@ SelfUtils.getSelfIdentity = (self: any) => {
236
248
  return self.person.id;
237
249
  };
238
250
 
251
+ /**
252
+ * get the "remote video mute" property from the self object
253
+ * @param {Object} self
254
+ * @returns {Boolean}
255
+ */
256
+ SelfUtils.getRemoteVideoMuted = (self: any) => {
257
+ if (!self || !self.controls || !self.controls.video) {
258
+ return null;
259
+ }
260
+
261
+ return self.controls.video.muted;
262
+ };
263
+
239
264
  /**
240
265
  * get the "remote mute" property from the self object
241
266
  * @param {Object} self
@@ -251,6 +276,10 @@ SelfUtils.getRemoteMuted = (self: any) => {
251
276
 
252
277
  SelfUtils.getLocalAudioUnmuteRequested = (self) => !!self?.controls?.audio?.requestedToUnmute;
253
278
 
279
+ // requestedToUnmute timestamp
280
+ SelfUtils.getLocalAudioUnmuteRequestedTimeStamp = (self) =>
281
+ Date.parse(self?.controls?.audio?.lastModifiedRequestedToUnmute) || 0;
282
+
254
283
  SelfUtils.getUnmuteAllowed = (self) => {
255
284
  if (!self || !self.controls || !self.controls.audio) {
256
285
  return null;
@@ -275,6 +304,7 @@ SelfUtils.getStatus = (status) => ({
275
304
  SelfUtils.wasMediaInactiveOrReleased = (oldSelf: any = {}, changedSelf: any) =>
276
305
  oldSelf.joinedWith &&
277
306
  oldSelf.joinedWith.state === _JOINED_ &&
307
+ changedSelf.joinedWith &&
278
308
  changedSelf.joinedWith.state === _LEFT_ &&
279
309
  (changedSelf.joinedWith.reason === MEETING_END_REASON.INACTIVE ||
280
310
  changedSelf.joinedWith.reason === MEETING_END_REASON.MEDIA_RELEASED);
@@ -319,6 +349,20 @@ SelfUtils.moderatorChanged = (oldSelf, changedSelf) => {
319
349
  return oldSelf.moderator !== changedSelf.moderator;
320
350
  };
321
351
 
352
+ /**
353
+ * determine whether the roles of self is changed or not
354
+ * @param {Object} oldSelf
355
+ * @param {Object} changedSelf
356
+ * @returns {Boolean}
357
+ */
358
+ SelfUtils.isRolesChanged = (oldSelf, changedSelf) => {
359
+ if (!changedSelf) {
360
+ // no new self means no change
361
+ return false;
362
+ }
363
+
364
+ return !isEqual(oldSelf?.roles, changedSelf?.roles);
365
+ };
322
366
  /**
323
367
  * @param {Object} oldSelf
324
368
  * @param {Object} changedSelf
@@ -351,6 +395,25 @@ SelfUtils.isUserAdmitted = (oldSelf: object, changedSelf: object) => {
351
395
  return SelfUtils.isLocusUserUnadmitted(oldSelf) && SelfUtils.isLocusUserAdmitted(changedSelf);
352
396
  };
353
397
 
398
+ SelfUtils.videoMutedByOthersChanged = (oldSelf, changedSelf) => {
399
+ if (!changedSelf) {
400
+ throw new ParameterError(
401
+ 'New self must be defined to determine if self was video muted by others.'
402
+ );
403
+ }
404
+
405
+ if (!oldSelf || oldSelf.remoteVideoMuted === null) {
406
+ if (changedSelf.remoteVideoMuted) {
407
+ return true; // this happens when host disables "Allow start video"
408
+ }
409
+
410
+ // we don't want to be sending the 'meeting:self:videoUnmutedByOthers' notification on meeting join
411
+ return false;
412
+ }
413
+
414
+ return oldSelf.remoteVideoMuted !== changedSelf.remoteVideoMuted;
415
+ };
416
+
354
417
  SelfUtils.mutedByOthersChanged = (oldSelf, changedSelf) => {
355
418
  if (!changedSelf) {
356
419
  throw new ParameterError('New self must be defined to determine if self was muted by others.');
@@ -379,7 +442,10 @@ SelfUtils.localAudioUnmuteRequestedByServer = (oldSelf: any = {}, changedSelf: a
379
442
  );
380
443
  }
381
444
 
382
- return changedSelf.localAudioUnmuteRequested && !oldSelf.localAudioUnmuteRequested;
445
+ return (
446
+ changedSelf.localAudioUnmuteRequested &&
447
+ changedSelf.localAudioUnmuteRequestedTimeStamp > oldSelf.localAudioUnmuteRequestedTimeStamp
448
+ );
383
449
  };
384
450
 
385
451
  SelfUtils.localAudioUnmuteRequiredByServer = (oldSelf: any = {}, changedSelf: any) => {
@@ -432,4 +498,14 @@ SelfUtils.getMediaStatus = (mediaSessions = []) => {
432
498
  return mediaStatus;
433
499
  };
434
500
 
501
+ SelfUtils.getReplacedBreakoutMoveId = (self: any, deviceId: string) => {
502
+ if (self && Array.isArray(self.devices)) {
503
+ const joinedDevice = self.devices.find((device) => deviceId === device.url);
504
+ if (Array.isArray(joinedDevice?.replaces)) {
505
+ return joinedDevice.replaces[0]?.breakoutMoveId;
506
+ }
507
+ }
508
+
509
+ return null;
510
+ };
435
511
  export default SelfUtils;
@@ -4,21 +4,28 @@
4
4
  /* globals navigator */
5
5
 
6
6
  import {
7
- LocalCameraTrack,
8
- LocalDisplayTrack,
9
- LocalMicrophoneTrack,
10
7
  RoapMediaConnection,
11
8
  MultistreamRoapMediaConnection,
9
+ type MultistreamConnectionConfig,
12
10
  } from '@webex/internal-media-core';
11
+ import {
12
+ LocalStream,
13
+ LocalCameraStream,
14
+ LocalDisplayStream,
15
+ LocalSystemAudioStream,
16
+ LocalMicrophoneStream,
17
+ } from '@webex/media-helpers';
13
18
  import LoggerProxy from '../common/logs/logger-proxy';
14
- import {AUDIO_INPUT, VIDEO_INPUT, MEDIA_TRACK_CONSTRAINT} from '../constants';
19
+ import {MEDIA_TRACK_CONSTRAINT} from '../constants';
15
20
  import Config from '../config';
16
21
  import StaticConfig from '../common/config';
17
- import MediaError from '../common/errors/media';
18
22
  import BrowserDetection from '../common/browser-detection';
23
+ import RtcMetrics from '../rtcMetrics';
19
24
 
20
25
  const {isBrowser} = BrowserDetection();
21
26
 
27
+ export type BundlePolicy = MultistreamConnectionConfig['bundlePolicy'];
28
+
22
29
  /**
23
30
  * MediaDirection
24
31
  * @typedef {Object} MediaDirection
@@ -49,29 +56,6 @@ const {isBrowser} = BrowserDetection();
49
56
  */
50
57
  const Media: any = {};
51
58
 
52
- /**
53
- * format the media array for send
54
- * @param {String} mediaId
55
- * @param {Boolean} audioMuted
56
- * @param {Boolean} videoMuted
57
- * @returns {Array} medias
58
- */
59
- Media.generateLocalMedias = (mediaId: string, audioMuted: boolean, videoMuted: boolean) => {
60
- if (mediaId) {
61
- return [
62
- {
63
- localSdp: JSON.stringify({
64
- audioMuted,
65
- videoMuted,
66
- }),
67
- mediaId,
68
- },
69
- ];
70
- }
71
-
72
- return [];
73
- };
74
-
75
59
  /**
76
60
  * make a browser call to get the media
77
61
  * @param {SendOptions} options
@@ -99,33 +83,60 @@ Media.getLocalMedia = (options: any, config: object) => {
99
83
  return Promise.resolve(undefined);
100
84
  };
101
85
 
86
+ Media.getDirection = (forceSendRecv: boolean, receive: boolean, send: boolean) => {
87
+ if (!receive && !send) {
88
+ return 'inactive';
89
+ }
90
+
91
+ if (forceSendRecv || (receive && send)) {
92
+ return 'sendrecv';
93
+ }
94
+
95
+ if (receive) {
96
+ return 'recvonly';
97
+ }
98
+
99
+ return 'sendonly';
100
+ };
101
+
102
102
  /**
103
103
  * creates a webrtc media connection with provided tracks and mediaDirection configuration
104
104
  *
105
105
  * @param {boolean} isMultistream
106
106
  * @param {string} debugId string useful for debugging (will appear in media connection logs)
107
+ * @param {object} webex main `webex` object.
108
+ * @param {string} meetingId id for the meeting using this connection
109
+ * @param {string} correlationId id used in requests to correlate to this session
107
110
  * @param {Object} options
108
- * @param {Object} [options.mediaProperties] only applicable to non-multistream connections, contains mediaDirection and local tracks:
109
- * audioTrack, videoTrack and shareTrack
111
+ * @param {Object} [options.mediaProperties] contains mediaDirection and local tracks:
112
+ * audioTrack, videoTrack, shareVideoTrack, and shareAudioTrack
110
113
  * @param {string} [options.remoteQualityLevel] LOW|MEDIUM|HIGH applicable only to non-multistream connections
111
114
  * @param {boolean} [options.enableRtx] applicable only to non-multistream connections
112
115
  * @param {boolean} [options.enableExtmap] applicable only to non-multistream connections
113
116
  * @param {Object} [options.turnServerInfo]
117
+ * @param {BundlePolicy} [options.bundlePolicy]
114
118
  * @returns {RoapMediaConnection | MultistreamRoapMediaConnection}
115
119
  */
116
120
  Media.createMediaConnection = (
117
121
  isMultistream: boolean,
118
122
  debugId: string,
123
+ webex: object,
124
+ meetingId: string,
125
+ correlationId: string,
119
126
  options: {
120
- mediaProperties?: {
127
+ mediaProperties: {
121
128
  mediaDirection?: {
122
129
  receiveAudio: boolean;
123
130
  receiveVideo: boolean;
124
131
  receiveShare: boolean;
132
+ sendAudio: boolean;
133
+ sendVideo: boolean;
134
+ sendShare: boolean;
125
135
  };
126
- audioTrack?: LocalMicrophoneTrack;
127
- videoTrack?: LocalCameraTrack;
128
- shareTrack?: LocalDisplayTrack;
136
+ audioStream?: LocalMicrophoneStream;
137
+ videoStream?: LocalCameraStream;
138
+ shareVideoStream?: LocalDisplayStream;
139
+ shareAudioStream?: LocalSystemAudioStream;
129
140
  };
130
141
  remoteQualityLevel?: 'LOW' | 'MEDIUM' | 'HIGH';
131
142
  enableRtx?: boolean;
@@ -135,13 +146,23 @@ Media.createMediaConnection = (
135
146
  username: string;
136
147
  password: string;
137
148
  };
149
+ bundlePolicy?: BundlePolicy;
138
150
  }
139
151
  ) => {
140
- const {mediaProperties, remoteQualityLevel, enableRtx, enableExtmap, turnServerInfo} = options;
152
+ const {
153
+ mediaProperties,
154
+ remoteQualityLevel,
155
+ enableRtx,
156
+ enableExtmap,
157
+ turnServerInfo,
158
+ bundlePolicy,
159
+ } = options;
141
160
 
142
161
  const iceServers = [];
143
162
 
144
- if (turnServerInfo) {
163
+ // we might not have any TURN server if TURN discovery failed or wasn't done or
164
+ // we might get an empty TURN url if we land on a video mesh node
165
+ if (turnServerInfo?.url) {
145
166
  iceServers.push({
146
167
  urls: turnServerInfo.url,
147
168
  username: turnServerInfo.username || '',
@@ -150,11 +171,23 @@ Media.createMediaConnection = (
150
171
  }
151
172
 
152
173
  if (isMultistream) {
174
+ const config: MultistreamConnectionConfig = {
175
+ iceServers,
176
+ };
177
+
178
+ if (bundlePolicy) {
179
+ config.bundlePolicy = bundlePolicy;
180
+ }
181
+
182
+ const rtcMetrics = new RtcMetrics(webex, meetingId, correlationId);
183
+
153
184
  return new MultistreamRoapMediaConnection(
154
- {
155
- iceServers,
156
- },
157
- debugId
185
+ config,
186
+ meetingId,
187
+ /* the rtc metrics objects callbacks */
188
+ (data) => rtcMetrics.addMetrics(data),
189
+ () => rtcMetrics.closeMetrics(),
190
+ () => rtcMetrics.sendMetricsInQueue()
158
191
  );
159
192
  }
160
193
 
@@ -162,7 +195,8 @@ Media.createMediaConnection = (
162
195
  throw new Error('mediaProperties have to be provided for non-multistream media connections');
163
196
  }
164
197
 
165
- const {mediaDirection, audioTrack, videoTrack, shareTrack} = mediaProperties;
198
+ const {mediaDirection, audioStream, videoStream, shareVideoStream, shareAudioStream} =
199
+ mediaProperties;
166
200
 
167
201
  return new RoapMediaConnection(
168
202
  {
@@ -183,17 +217,23 @@ Media.createMediaConnection = (
183
217
  },
184
218
  },
185
219
  {
186
- send: {
187
- audio: audioTrack?.underlyingTrack,
188
- video: videoTrack?.underlyingTrack,
189
- screenShareVideo: shareTrack?.underlyingTrack,
190
- },
191
- receive: {
192
- audio: mediaDirection.receiveAudio,
193
- video: mediaDirection.receiveVideo,
194
- screenShareVideo: mediaDirection.receiveShare,
195
- remoteQualityLevel,
220
+ // TODO: RoapMediaConnection is not ready to use stream classes yet, so we pass the raw MediaStreamTrack for now SPARK-460530
221
+ localTracks: {
222
+ audio: audioStream?.outputStream?.getTracks()[0],
223
+ video: videoStream?.outputStream?.getTracks()[0],
224
+ screenShareVideo: shareVideoStream?.outputStream?.getTracks()[0],
225
+ screenShareAudio: shareAudioStream?.outputStream?.getTracks()[0], // TODO: add type for screenShareAudio in internal-media-core SPARK-446923
226
+ } as unknown,
227
+ direction: {
228
+ audio: Media.getDirection(true, mediaDirection.receiveAudio, mediaDirection.sendAudio),
229
+ video: Media.getDirection(true, mediaDirection.receiveVideo, mediaDirection.sendVideo),
230
+ screenShareVideo: Media.getDirection(
231
+ false,
232
+ mediaDirection.receiveShare,
233
+ mediaDirection.sendShare
234
+ ),
196
235
  },
236
+ remoteQualityLevel,
197
237
  },
198
238
  debugId
199
239
  );
@@ -338,52 +378,6 @@ Media.getMedia = (audio: any | boolean, video: any | boolean, config: any) => {
338
378
  });
339
379
  };
340
380
 
341
- /**
342
- * Checks if the machine has at least one audio or video device (Dont use this for screen share)
343
- * @param {object} [options]
344
- * {
345
- * sendAudio: true/false,
346
- * sendVideo: true/false
347
- * }
348
- * @returns {Object} {
349
- * sendAudio: true/false,
350
- * sendVideo: true/false
351
- *}
352
- */
353
- Media.getSupportedDevice = ({sendAudio, sendVideo}: {sendAudio: boolean; sendVideo: boolean}) =>
354
- Promise.resolve().then(() => {
355
- if (!navigator.mediaDevices || navigator.mediaDevices.enumerateDevices === undefined) {
356
- return {
357
- sendAudio: false,
358
- sendVideo: false,
359
- };
360
- }
361
-
362
- return navigator.mediaDevices.enumerateDevices().then((devices) => {
363
- const supported = {
364
- audio: devices.filter((device) => device.kind === AUDIO_INPUT).length > 0,
365
- video: devices.filter((device) => device.kind === VIDEO_INPUT).length > 0,
366
- };
367
-
368
- return {
369
- sendAudio: supported.audio && sendAudio,
370
- sendVideo: supported.video && sendVideo,
371
- };
372
- });
373
- });
374
-
375
- /**
376
- * proxy to browser navigator.mediaDevices.enumerateDevices()
377
- * @returns {Promise}
378
- */
379
- Media.getDevices = () => {
380
- if (navigator && navigator.mediaDevices && navigator.mediaDevices.enumerateDevices) {
381
- return navigator.mediaDevices.enumerateDevices();
382
- }
383
-
384
- return Promise.reject(new MediaError('enumerateDevices not supported.'));
385
- };
386
-
387
381
  /**
388
382
  *
389
383
  * Toggle a specific stream
@@ -394,23 +388,21 @@ Media.toggleStream = () => {};
394
388
 
395
389
  /**
396
390
  * Stop input stream
397
- * @param {MediaTrack} track A media stream
391
+ * @param {LocalStream} stream A local stream
398
392
  * @returns {null}
399
393
  */
400
- Media.stopTracks = (track: any) => {
401
- if (!track) {
394
+ Media.stopStream = (stream: LocalStream) => {
395
+ if (!stream) {
402
396
  return Promise.resolve();
403
397
  }
404
398
 
405
399
  return Promise.resolve().then(() => {
406
- if (track && track.stop) {
407
- try {
408
- track.stop();
409
- } catch (e) {
410
- LoggerProxy.logger.error(
411
- `Media:index#stopTracks --> Unable to stop the track with state ${track.readyState}, error: ${e}`
412
- );
413
- }
400
+ try {
401
+ stream.stop();
402
+ } catch (e) {
403
+ LoggerProxy.logger.error(
404
+ `Media:index#stopStream --> Unable to stop the stream with ready state => ${stream.readyState}, error: ${e}`
405
+ );
414
406
  }
415
407
  });
416
408
  };