@webex/plugin-meetings 3.0.0-beta.36 → 3.0.0-beta.360

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 (391) 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 +226 -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 +117 -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 +366 -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 +383 -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 +57 -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 +61 -101
  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 +1 -204
  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 +3938 -2803
  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 +166 -152
  79. package/dist/meeting/request.js.map +1 -1
  80. package/dist/meeting/util.js +601 -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 +478 -118
  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 +72 -6
  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 +16 -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 +228 -58
  121. package/dist/multistream/mediaRequestManager.js.map +1 -1
  122. package/dist/multistream/receiveSlot.js +29 -16
  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 +44 -18
  127. package/dist/multistream/remoteMedia.js.map +1 -1
  128. package/dist/multistream/remoteMediaGroup.js +60 -3
  129. package/dist/multistream/remoteMediaGroup.js.map +1 -1
  130. package/dist/multistream/remoteMediaManager.js +209 -59
  131. package/dist/multistream/remoteMediaManager.js.map +1 -1
  132. package/dist/multistream/sendSlotManager.js +233 -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 +269 -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 +217 -170
  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 +95 -38
  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 +142 -0
  157. package/dist/rtcMetrics/index.js.map +1 -0
  158. package/dist/statsAnalyzer/index.js +182 -215
  159. package/dist/statsAnalyzer/index.js.map +1 -1
  160. package/dist/statsAnalyzer/mqaUtil.js +35 -28
  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 +191 -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 -4
  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 +0 -128
  189. package/dist/types/meeting/in-meeting-actions.d.ts +86 -2
  190. package/dist/types/meeting/index.d.ts +557 -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 +62 -43
  194. package/dist/types/meeting/util.d.ts +101 -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 +112 -20
  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 +15 -0
  208. package/dist/types/metrics/index.d.ts +4 -111
  209. package/dist/types/multistream/mediaRequestManager.d.ts +72 -5
  210. package/dist/types/multistream/receiveSlot.d.ts +13 -11
  211. package/dist/types/multistream/receiveSlotManager.d.ts +14 -4
  212. package/dist/types/multistream/remoteMedia.d.ts +8 -29
  213. package/dist/types/multistream/remoteMediaGroup.d.ts +0 -9
  214. package/dist/types/multistream/remoteMediaManager.d.ts +46 -2
  215. package/dist/types/multistream/sendSlotManager.d.ts +61 -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 +21 -3
  226. package/dist/types/rtcMetrics/constants.d.ts +4 -0
  227. package/dist/types/rtcMetrics/index.d.ts +54 -0
  228. package/dist/types/statsAnalyzer/index.d.ts +29 -11
  229. package/dist/types/webinar/collection.d.ts +16 -0
  230. package/dist/types/webinar/index.d.ts +5 -0
  231. package/dist/webinar/collection.js +44 -0
  232. package/dist/webinar/collection.js.map +1 -0
  233. package/dist/webinar/index.js +69 -0
  234. package/dist/webinar/index.js.map +1 -0
  235. package/package.json +22 -19
  236. package/src/annotation/annotation.types.ts +50 -0
  237. package/src/annotation/constants.ts +36 -0
  238. package/src/annotation/index.ts +328 -0
  239. package/src/breakouts/README.md +35 -11
  240. package/src/breakouts/breakout.ts +67 -9
  241. package/src/breakouts/events.ts +56 -0
  242. package/src/breakouts/index.ts +558 -59
  243. package/src/breakouts/utils.ts +42 -0
  244. package/src/common/errors/no-meeting-info.ts +24 -0
  245. package/src/common/errors/reclaim-host-role-errors.ts +134 -0
  246. package/src/common/errors/webex-errors.ts +44 -2
  247. package/src/common/logs/logger-proxy.ts +1 -1
  248. package/src/common/logs/request.ts +5 -1
  249. package/src/common/queue.ts +22 -8
  250. package/src/config.ts +4 -9
  251. package/src/constants.ts +214 -21
  252. package/src/controls-options-manager/enums.ts +12 -0
  253. package/src/controls-options-manager/index.ts +116 -21
  254. package/src/controls-options-manager/types.ts +59 -0
  255. package/src/controls-options-manager/util.ts +294 -14
  256. package/src/index.ts +44 -0
  257. package/src/interceptors/index.ts +3 -0
  258. package/src/interceptors/locusRetry.ts +67 -0
  259. package/src/interpretation/README.md +60 -0
  260. package/src/interpretation/collection.ts +19 -0
  261. package/src/interpretation/index.ts +332 -0
  262. package/src/interpretation/siLanguage.ts +18 -0
  263. package/src/locus-info/controlsUtils.ts +108 -0
  264. package/src/locus-info/index.ts +414 -59
  265. package/src/locus-info/infoUtils.ts +10 -2
  266. package/src/locus-info/mediaSharesUtils.ts +64 -0
  267. package/src/locus-info/parser.ts +258 -47
  268. package/src/locus-info/selfUtils.ts +81 -5
  269. package/src/media/index.ts +97 -107
  270. package/src/media/properties.ts +88 -117
  271. package/src/mediaQualityMetrics/config.ts +0 -135
  272. package/src/meeting/in-meeting-actions.ts +171 -3
  273. package/src/meeting/index.ts +3253 -2408
  274. package/src/meeting/locusMediaRequest.ts +313 -0
  275. package/src/meeting/muteState.ts +223 -136
  276. package/src/meeting/request.ts +142 -120
  277. package/src/meeting/util.ts +588 -395
  278. package/src/meeting-info/index.ts +81 -8
  279. package/src/meeting-info/meeting-info-v2.ts +170 -14
  280. package/src/meeting-info/util.ts +1 -1
  281. package/src/meeting-info/utilv2.ts +23 -23
  282. package/src/meetings/collection.ts +33 -0
  283. package/src/meetings/index.ts +497 -126
  284. package/src/meetings/meetings.types.ts +12 -0
  285. package/src/meetings/request.ts +2 -0
  286. package/src/meetings/util.ts +80 -11
  287. package/src/member/index.ts +58 -0
  288. package/src/member/types.ts +38 -0
  289. package/src/member/util.ts +141 -25
  290. package/src/members/collection.ts +8 -0
  291. package/src/members/index.ts +134 -8
  292. package/src/members/request.ts +97 -17
  293. package/src/members/types.ts +29 -0
  294. package/src/members/util.ts +333 -240
  295. package/src/metrics/constants.ts +15 -0
  296. package/src/metrics/index.ts +1 -469
  297. package/src/multistream/mediaRequestManager.ts +277 -82
  298. package/src/multistream/receiveSlot.ts +31 -17
  299. package/src/multistream/receiveSlotManager.ts +34 -24
  300. package/src/multistream/remoteMedia.ts +27 -2
  301. package/src/multistream/remoteMediaGroup.ts +59 -0
  302. package/src/multistream/remoteMediaManager.ts +148 -30
  303. package/src/multistream/sendSlotManager.ts +170 -0
  304. package/src/reachability/clusterReachability.ts +320 -0
  305. package/src/reachability/index.ts +229 -340
  306. package/src/reachability/request.ts +8 -4
  307. package/src/reachability/util.ts +24 -0
  308. package/src/reconnection-manager/index.ts +128 -106
  309. package/src/recording-controller/index.ts +20 -3
  310. package/src/recording-controller/util.ts +26 -9
  311. package/src/roap/index.ts +52 -23
  312. package/src/roap/request.ts +48 -67
  313. package/src/roap/turnDiscovery.ts +48 -26
  314. package/src/rtcMetrics/constants.ts +3 -0
  315. package/src/rtcMetrics/index.ts +124 -0
  316. package/src/statsAnalyzer/index.ts +220 -291
  317. package/src/statsAnalyzer/mqaUtil.ts +43 -44
  318. package/src/webinar/collection.ts +31 -0
  319. package/src/webinar/index.ts +62 -0
  320. package/test/integration/spec/converged-space-meetings.js +60 -3
  321. package/test/integration/spec/journey.js +320 -261
  322. package/test/integration/spec/space-meeting.js +76 -3
  323. package/test/unit/spec/annotation/index.ts +418 -0
  324. package/test/unit/spec/breakouts/breakout.ts +118 -28
  325. package/test/unit/spec/breakouts/events.ts +89 -0
  326. package/test/unit/spec/breakouts/index.ts +1349 -114
  327. package/test/unit/spec/breakouts/utils.js +52 -1
  328. package/test/unit/spec/common/queue.js +31 -2
  329. package/test/unit/spec/controls-options-manager/index.js +163 -0
  330. package/test/unit/spec/controls-options-manager/util.js +576 -60
  331. package/test/unit/spec/fixture/locus.js +1 -0
  332. package/test/unit/spec/interceptors/locusRetry.ts +131 -0
  333. package/test/unit/spec/interpretation/collection.ts +15 -0
  334. package/test/unit/spec/interpretation/index.ts +589 -0
  335. package/test/unit/spec/interpretation/siLanguage.ts +28 -0
  336. package/test/unit/spec/locus-info/controlsUtils.js +316 -43
  337. package/test/unit/spec/locus-info/index.js +1352 -33
  338. package/test/unit/spec/locus-info/infoUtils.js +37 -15
  339. package/test/unit/spec/locus-info/lib/SeqCmp.json +16 -0
  340. package/test/unit/spec/locus-info/mediaSharesUtils.ts +32 -0
  341. package/test/unit/spec/locus-info/parser.js +116 -35
  342. package/test/unit/spec/locus-info/selfConstant.js +27 -4
  343. package/test/unit/spec/locus-info/selfUtils.js +208 -17
  344. package/test/unit/spec/media/index.ts +118 -37
  345. package/test/unit/spec/media/properties.ts +2 -2
  346. package/test/unit/spec/meeting/in-meeting-actions.ts +85 -3
  347. package/test/unit/spec/meeting/index.js +6686 -2212
  348. package/test/unit/spec/meeting/locusMediaRequest.ts +442 -0
  349. package/test/unit/spec/meeting/muteState.js +402 -212
  350. package/test/unit/spec/meeting/request.js +459 -52
  351. package/test/unit/spec/meeting/utils.js +680 -67
  352. package/test/unit/spec/meeting-info/index.js +300 -0
  353. package/test/unit/spec/meeting-info/meetinginfov2.js +526 -5
  354. package/test/unit/spec/meeting-info/utilv2.js +21 -0
  355. package/test/unit/spec/meetings/collection.js +26 -0
  356. package/test/unit/spec/meetings/index.js +1393 -212
  357. package/test/unit/spec/meetings/utils.js +202 -2
  358. package/test/unit/spec/member/index.js +61 -6
  359. package/test/unit/spec/member/util.js +510 -34
  360. package/test/unit/spec/members/index.js +432 -1
  361. package/test/unit/spec/members/request.js +206 -27
  362. package/test/unit/spec/members/utils.js +210 -0
  363. package/test/unit/spec/metrics/index.js +1 -50
  364. package/test/unit/spec/multistream/mediaRequestManager.ts +776 -162
  365. package/test/unit/spec/multistream/receiveSlot.ts +28 -20
  366. package/test/unit/spec/multistream/receiveSlotManager.ts +32 -30
  367. package/test/unit/spec/multistream/remoteMedia.ts +30 -0
  368. package/test/unit/spec/multistream/remoteMediaGroup.ts +266 -0
  369. package/test/unit/spec/multistream/remoteMediaManager.ts +326 -0
  370. package/test/unit/spec/multistream/sendSlotManager.ts +242 -0
  371. package/test/unit/spec/reachability/clusterReachability.ts +279 -0
  372. package/test/unit/spec/reachability/index.ts +477 -14
  373. package/test/unit/spec/reachability/request.js +3 -1
  374. package/test/unit/spec/reachability/util.ts +40 -0
  375. package/test/unit/spec/reconnection-manager/index.js +118 -11
  376. package/test/unit/spec/recording-controller/index.js +294 -218
  377. package/test/unit/spec/recording-controller/util.js +223 -96
  378. package/test/unit/spec/roap/index.ts +180 -83
  379. package/test/unit/spec/roap/request.ts +100 -62
  380. package/test/unit/spec/roap/turnDiscovery.ts +76 -34
  381. package/test/unit/spec/rtcMetrics/index.ts +93 -0
  382. package/test/unit/spec/stats-analyzer/index.js +621 -12
  383. package/test/unit/spec/webinar/collection.ts +13 -0
  384. package/test/unit/spec/webinar/index.ts +60 -0
  385. package/test/utils/integrationTestUtils.js +46 -0
  386. package/test/utils/testUtils.js +0 -57
  387. package/dist/metrics/config.js +0 -289
  388. package/dist/metrics/config.js.map +0 -1
  389. package/dist/types/metrics/config.d.ts +0 -169
  390. package/src/index.js +0 -16
  391. 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,9 +146,17 @@ 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
 
@@ -150,11 +169,23 @@ Media.createMediaConnection = (
150
169
  }
151
170
 
152
171
  if (isMultistream) {
172
+ const config: MultistreamConnectionConfig = {
173
+ iceServers,
174
+ };
175
+
176
+ if (bundlePolicy) {
177
+ config.bundlePolicy = bundlePolicy;
178
+ }
179
+
180
+ const rtcMetrics = new RtcMetrics(webex, meetingId, correlationId);
181
+
153
182
  return new MultistreamRoapMediaConnection(
154
- {
155
- iceServers,
156
- },
157
- debugId
183
+ config,
184
+ meetingId,
185
+ /* the rtc metrics objects callbacks */
186
+ (data) => rtcMetrics.addMetrics(data),
187
+ () => rtcMetrics.closeMetrics(),
188
+ () => rtcMetrics.sendMetricsInQueue()
158
189
  );
159
190
  }
160
191
 
@@ -162,7 +193,8 @@ Media.createMediaConnection = (
162
193
  throw new Error('mediaProperties have to be provided for non-multistream media connections');
163
194
  }
164
195
 
165
- const {mediaDirection, audioTrack, videoTrack, shareTrack} = mediaProperties;
196
+ const {mediaDirection, audioStream, videoStream, shareVideoStream, shareAudioStream} =
197
+ mediaProperties;
166
198
 
167
199
  return new RoapMediaConnection(
168
200
  {
@@ -183,17 +215,23 @@ Media.createMediaConnection = (
183
215
  },
184
216
  },
185
217
  {
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,
218
+ // TODO: RoapMediaConnection is not ready to use stream classes yet, so we pass the raw MediaStreamTrack for now SPARK-460530
219
+ localTracks: {
220
+ audio: audioStream?.outputStream?.getTracks()[0],
221
+ video: videoStream?.outputStream?.getTracks()[0],
222
+ screenShareVideo: shareVideoStream?.outputStream?.getTracks()[0],
223
+ screenShareAudio: shareAudioStream?.outputStream?.getTracks()[0], // TODO: add type for screenShareAudio in internal-media-core SPARK-446923
224
+ } as unknown,
225
+ direction: {
226
+ audio: Media.getDirection(true, mediaDirection.receiveAudio, mediaDirection.sendAudio),
227
+ video: Media.getDirection(true, mediaDirection.receiveVideo, mediaDirection.sendVideo),
228
+ screenShareVideo: Media.getDirection(
229
+ false,
230
+ mediaDirection.receiveShare,
231
+ mediaDirection.sendShare
232
+ ),
196
233
  },
234
+ remoteQualityLevel,
197
235
  },
198
236
  debugId
199
237
  );
@@ -338,52 +376,6 @@ Media.getMedia = (audio: any | boolean, video: any | boolean, config: any) => {
338
376
  });
339
377
  };
340
378
 
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
379
  /**
388
380
  *
389
381
  * Toggle a specific stream
@@ -394,23 +386,21 @@ Media.toggleStream = () => {};
394
386
 
395
387
  /**
396
388
  * Stop input stream
397
- * @param {MediaTrack} track A media stream
389
+ * @param {LocalStream} stream A local stream
398
390
  * @returns {null}
399
391
  */
400
- Media.stopTracks = (track: any) => {
401
- if (!track) {
392
+ Media.stopStream = (stream: LocalStream) => {
393
+ if (!stream) {
402
394
  return Promise.resolve();
403
395
  }
404
396
 
405
397
  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
- }
398
+ try {
399
+ stream.stop();
400
+ } catch (e) {
401
+ LoggerProxy.logger.error(
402
+ `Media:index#stopStream --> Unable to stop the stream with ready state => ${stream.readyState}, error: ${e}`
403
+ );
414
404
  }
415
405
  });
416
406
  };