@webex/plugin-meetings 3.0.0-beta.16 → 3.0.0-beta.161

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 (424) hide show
  1. package/README.md +45 -1
  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 +359 -0
  7. package/dist/annotation/index.js.map +1 -0
  8. package/dist/breakouts/breakout.js +212 -0
  9. package/dist/breakouts/breakout.js.map +1 -0
  10. package/dist/breakouts/collection.js +23 -0
  11. package/dist/breakouts/collection.js.map +1 -0
  12. package/dist/breakouts/edit-lock-error.js +52 -0
  13. package/dist/breakouts/edit-lock-error.js.map +1 -0
  14. package/dist/breakouts/events.js +43 -0
  15. package/dist/breakouts/events.js.map +1 -0
  16. package/dist/breakouts/index.js +1046 -0
  17. package/dist/breakouts/index.js.map +1 -0
  18. package/dist/breakouts/request.js +78 -0
  19. package/dist/breakouts/request.js.map +1 -0
  20. package/dist/breakouts/utils.js +67 -0
  21. package/dist/breakouts/utils.js.map +1 -0
  22. package/dist/common/errors/webex-errors.js +3 -2
  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/config.js +6 -8
  27. package/dist/config.js.map +1 -1
  28. package/dist/constants.js +175 -26
  29. package/dist/constants.js.map +1 -1
  30. package/dist/controls-options-manager/constants.js +14 -0
  31. package/dist/controls-options-manager/constants.js.map +1 -0
  32. package/dist/controls-options-manager/enums.js +27 -0
  33. package/dist/controls-options-manager/enums.js.map +1 -0
  34. package/dist/controls-options-manager/index.js +297 -0
  35. package/dist/controls-options-manager/index.js.map +1 -0
  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 +300 -0
  39. package/dist/controls-options-manager/util.js.map +1 -0
  40. package/dist/index.js +77 -0
  41. package/dist/index.js.map +1 -1
  42. package/dist/interpretation/collection.js +23 -0
  43. package/dist/interpretation/collection.js.map +1 -0
  44. package/dist/interpretation/index.js +214 -0
  45. package/dist/interpretation/index.js.map +1 -0
  46. package/dist/interpretation/siLanguage.js +25 -0
  47. package/dist/interpretation/siLanguage.js.map +1 -0
  48. package/dist/locus-info/controlsUtils.js +92 -2
  49. package/dist/locus-info/controlsUtils.js.map +1 -1
  50. package/dist/locus-info/index.js +317 -24
  51. package/dist/locus-info/index.js.map +1 -1
  52. package/dist/locus-info/mediaSharesUtils.js +43 -1
  53. package/dist/locus-info/mediaSharesUtils.js.map +1 -1
  54. package/dist/locus-info/parser.js +2 -1
  55. package/dist/locus-info/parser.js.map +1 -1
  56. package/dist/locus-info/selfUtils.js +97 -14
  57. package/dist/locus-info/selfUtils.js.map +1 -1
  58. package/dist/media/index.js +39 -134
  59. package/dist/media/index.js.map +1 -1
  60. package/dist/media/properties.js +19 -97
  61. package/dist/media/properties.js.map +1 -1
  62. package/dist/mediaQualityMetrics/config.js +505 -493
  63. package/dist/mediaQualityMetrics/config.js.map +1 -1
  64. package/dist/meeting/in-meeting-actions.js +79 -1
  65. package/dist/meeting/in-meeting-actions.js.map +1 -1
  66. package/dist/meeting/index.js +2349 -2178
  67. package/dist/meeting/index.js.map +1 -1
  68. package/dist/meeting/locusMediaRequest.js +291 -0
  69. package/dist/meeting/locusMediaRequest.js.map +1 -0
  70. package/dist/meeting/muteState.js +229 -124
  71. package/dist/meeting/muteState.js.map +1 -1
  72. package/dist/meeting/request.js +191 -167
  73. package/dist/meeting/request.js.map +1 -1
  74. package/dist/meeting/request.type.js.map +1 -1
  75. package/dist/meeting/util.js +444 -443
  76. package/dist/meeting/util.js.map +1 -1
  77. package/dist/meeting-info/meeting-info-v2.js +157 -49
  78. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  79. package/dist/meeting-info/utilv2.js +20 -5
  80. package/dist/meeting-info/utilv2.js.map +1 -1
  81. package/dist/meetings/collection.js +22 -0
  82. package/dist/meetings/collection.js.map +1 -1
  83. package/dist/meetings/index.js +365 -73
  84. package/dist/meetings/index.js.map +1 -1
  85. package/dist/meetings/meetings.types.js +7 -0
  86. package/dist/meetings/meetings.types.js.map +1 -0
  87. package/dist/meetings/request.js +16 -12
  88. package/dist/meetings/request.js.map +1 -1
  89. package/dist/meetings/util.js +88 -1
  90. package/dist/meetings/util.js.map +1 -1
  91. package/dist/member/index.js +43 -0
  92. package/dist/member/index.js.map +1 -1
  93. package/dist/member/types.js +15 -0
  94. package/dist/member/types.js.map +1 -0
  95. package/dist/member/util.js +97 -3
  96. package/dist/member/util.js.map +1 -1
  97. package/dist/members/collection.js +10 -0
  98. package/dist/members/collection.js.map +1 -1
  99. package/dist/members/index.js +94 -11
  100. package/dist/members/index.js.map +1 -1
  101. package/dist/members/request.js +109 -39
  102. package/dist/members/request.js.map +1 -1
  103. package/dist/members/types.js +15 -0
  104. package/dist/members/types.js.map +1 -0
  105. package/dist/members/util.js +316 -233
  106. package/dist/members/util.js.map +1 -1
  107. package/dist/metrics/config.js +50 -14
  108. package/dist/metrics/config.js.map +1 -1
  109. package/dist/metrics/constants.js +3 -5
  110. package/dist/metrics/constants.js.map +1 -1
  111. package/dist/metrics/index.js +48 -29
  112. package/dist/metrics/index.js.map +1 -1
  113. package/dist/multistream/mediaRequestManager.js +265 -36
  114. package/dist/multistream/mediaRequestManager.js.map +1 -1
  115. package/dist/multistream/receiveSlot.js +52 -19
  116. package/dist/multistream/receiveSlot.js.map +1 -1
  117. package/dist/multistream/receiveSlotManager.js +53 -33
  118. package/dist/multistream/receiveSlotManager.js.map +1 -1
  119. package/dist/multistream/remoteMedia.js +44 -18
  120. package/dist/multistream/remoteMedia.js.map +1 -1
  121. package/dist/multistream/remoteMediaGroup.js +60 -3
  122. package/dist/multistream/remoteMediaGroup.js.map +1 -1
  123. package/dist/multistream/remoteMediaManager.js +322 -103
  124. package/dist/multistream/remoteMediaManager.js.map +1 -1
  125. package/dist/networkQualityMonitor/index.js +4 -2
  126. package/dist/networkQualityMonitor/index.js.map +1 -1
  127. package/dist/reachability/index.js +117 -60
  128. package/dist/reachability/index.js.map +1 -1
  129. package/dist/reachability/request.js +12 -5
  130. package/dist/reachability/request.js.map +1 -1
  131. package/dist/reactions/constants.js +13 -0
  132. package/dist/reactions/constants.js.map +1 -0
  133. package/dist/reactions/reactions.js +2 -2
  134. package/dist/reactions/reactions.js.map +1 -1
  135. package/dist/reactions/reactions.type.js +18 -18
  136. package/dist/reactions/reactions.type.js.map +1 -1
  137. package/dist/reconnection-manager/index.js +190 -145
  138. package/dist/reconnection-manager/index.js.map +1 -1
  139. package/dist/recording-controller/enums.js +17 -0
  140. package/dist/recording-controller/enums.js.map +1 -0
  141. package/dist/recording-controller/index.js +343 -0
  142. package/dist/recording-controller/index.js.map +1 -0
  143. package/dist/recording-controller/util.js +63 -0
  144. package/dist/recording-controller/util.js.map +1 -0
  145. package/dist/roap/index.js +21 -29
  146. package/dist/roap/index.js.map +1 -1
  147. package/dist/roap/request.js +127 -92
  148. package/dist/roap/request.js.map +1 -1
  149. package/dist/roap/turnDiscovery.js +135 -53
  150. package/dist/roap/turnDiscovery.js.map +1 -1
  151. package/dist/statsAnalyzer/global.js +1 -93
  152. package/dist/statsAnalyzer/global.js.map +1 -1
  153. package/dist/statsAnalyzer/index.js +329 -314
  154. package/dist/statsAnalyzer/index.js.map +1 -1
  155. package/dist/statsAnalyzer/mqaUtil.js +103 -54
  156. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  157. package/dist/types/annotation/annotation.types.d.ts +43 -0
  158. package/dist/types/annotation/constants.d.ts +31 -0
  159. package/dist/types/annotation/index.d.ts +124 -0
  160. package/dist/types/breakouts/breakout.d.ts +8 -0
  161. package/dist/types/breakouts/collection.d.ts +5 -0
  162. package/dist/types/breakouts/edit-lock-error.d.ts +15 -0
  163. package/dist/types/breakouts/events.d.ts +2 -0
  164. package/dist/types/breakouts/index.d.ts +5 -0
  165. package/dist/types/breakouts/request.d.ts +22 -0
  166. package/dist/types/breakouts/utils.d.ts +15 -0
  167. package/dist/types/common/browser-detection.d.ts +9 -0
  168. package/dist/types/common/collection.d.ts +48 -0
  169. package/dist/types/common/config.d.ts +2 -0
  170. package/dist/types/common/errors/captcha-error.d.ts +15 -0
  171. package/dist/types/common/errors/intent-to-join.d.ts +16 -0
  172. package/dist/types/common/errors/join-meeting.d.ts +17 -0
  173. package/dist/types/common/errors/media.d.ts +15 -0
  174. package/dist/types/common/errors/parameter.d.ts +15 -0
  175. package/dist/types/common/errors/password-error.d.ts +15 -0
  176. package/dist/types/common/errors/permission.d.ts +14 -0
  177. package/dist/types/common/errors/reconnection-in-progress.d.ts +9 -0
  178. package/dist/types/common/errors/reconnection.d.ts +15 -0
  179. package/dist/types/common/errors/stats.d.ts +15 -0
  180. package/dist/types/common/errors/webex-errors.d.ts +69 -0
  181. package/dist/types/common/errors/webex-meetings-error.d.ts +20 -0
  182. package/dist/types/common/events/events-scope.d.ts +17 -0
  183. package/dist/types/common/events/events.d.ts +12 -0
  184. package/dist/types/common/events/trigger-proxy.d.ts +2 -0
  185. package/dist/types/common/events/util.d.ts +2 -0
  186. package/dist/types/common/logs/logger-config.d.ts +2 -0
  187. package/dist/types/common/logs/logger-proxy.d.ts +2 -0
  188. package/dist/types/common/logs/request.d.ts +34 -0
  189. package/dist/types/common/queue.d.ts +32 -0
  190. package/dist/types/config.d.ts +72 -0
  191. package/dist/types/constants.d.ts +987 -0
  192. package/dist/types/controls-options-manager/constants.d.ts +4 -0
  193. package/dist/types/controls-options-manager/enums.d.ts +15 -0
  194. package/dist/types/controls-options-manager/index.d.ts +136 -0
  195. package/dist/types/controls-options-manager/types.d.ts +43 -0
  196. package/dist/types/controls-options-manager/util.d.ts +1 -0
  197. package/dist/types/index.d.ts +7 -0
  198. package/dist/types/interpretation/collection.d.ts +5 -0
  199. package/dist/types/interpretation/index.d.ts +5 -0
  200. package/dist/types/interpretation/siLanguage.d.ts +5 -0
  201. package/dist/types/locus-info/controlsUtils.d.ts +2 -0
  202. package/dist/types/locus-info/embeddedAppsUtils.d.ts +2 -0
  203. package/dist/types/locus-info/fullState.d.ts +2 -0
  204. package/dist/types/locus-info/hostUtils.d.ts +2 -0
  205. package/dist/types/locus-info/index.d.ts +315 -0
  206. package/dist/types/locus-info/infoUtils.d.ts +2 -0
  207. package/dist/types/locus-info/mediaSharesUtils.d.ts +2 -0
  208. package/dist/types/locus-info/parser.d.ts +212 -0
  209. package/dist/types/locus-info/selfUtils.d.ts +2 -0
  210. package/dist/types/media/index.d.ts +34 -0
  211. package/dist/types/media/properties.d.ts +86 -0
  212. package/dist/types/media/util.d.ts +2 -0
  213. package/dist/types/mediaQualityMetrics/config.d.ts +365 -0
  214. package/dist/types/meeting/in-meeting-actions.d.ts +149 -0
  215. package/dist/types/meeting/index.d.ts +1524 -0
  216. package/dist/types/meeting/locusMediaRequest.d.ts +70 -0
  217. package/dist/types/meeting/muteState.d.ts +184 -0
  218. package/dist/types/meeting/request.d.ts +270 -0
  219. package/dist/types/meeting/request.type.d.ts +11 -0
  220. package/dist/types/meeting/state.d.ts +9 -0
  221. package/dist/types/meeting/util.d.ts +75 -0
  222. package/dist/types/meeting-info/collection.d.ts +20 -0
  223. package/dist/types/meeting-info/index.d.ts +57 -0
  224. package/dist/types/meeting-info/meeting-info-v2.d.ts +122 -0
  225. package/dist/types/meeting-info/request.d.ts +22 -0
  226. package/dist/types/meeting-info/util.d.ts +2 -0
  227. package/dist/types/meeting-info/utilv2.d.ts +2 -0
  228. package/dist/types/meetings/collection.d.ts +31 -0
  229. package/dist/types/meetings/index.d.ts +364 -0
  230. package/dist/types/meetings/meetings.types.d.ts +4 -0
  231. package/dist/types/meetings/request.d.ts +27 -0
  232. package/dist/types/meetings/util.d.ts +18 -0
  233. package/dist/types/member/index.d.ts +158 -0
  234. package/dist/types/member/types.d.ts +21 -0
  235. package/dist/types/member/util.d.ts +2 -0
  236. package/dist/types/members/collection.d.ts +29 -0
  237. package/dist/types/members/index.d.ts +353 -0
  238. package/dist/types/members/request.d.ts +114 -0
  239. package/dist/types/members/types.d.ts +24 -0
  240. package/dist/types/members/util.d.ts +210 -0
  241. package/dist/types/metrics/config.d.ts +195 -0
  242. package/dist/types/metrics/constants.d.ts +55 -0
  243. package/dist/types/metrics/index.d.ts +169 -0
  244. package/dist/types/multistream/mediaRequestManager.d.ts +118 -0
  245. package/dist/types/multistream/receiveSlot.d.ts +68 -0
  246. package/dist/types/multistream/receiveSlotManager.d.ts +56 -0
  247. package/dist/types/multistream/remoteMedia.d.ts +72 -0
  248. package/dist/types/multistream/remoteMediaGroup.d.ts +47 -0
  249. package/dist/types/multistream/remoteMediaManager.d.ts +277 -0
  250. package/dist/types/networkQualityMonitor/index.d.ts +70 -0
  251. package/dist/types/personal-meeting-room/index.d.ts +47 -0
  252. package/dist/types/personal-meeting-room/request.d.ts +14 -0
  253. package/dist/types/personal-meeting-room/util.d.ts +2 -0
  254. package/dist/types/reachability/index.d.ts +152 -0
  255. package/dist/types/reachability/request.d.ts +37 -0
  256. package/dist/types/reactions/constants.d.ts +3 -0
  257. package/dist/types/reactions/reactions.d.ts +4 -0
  258. package/dist/types/reactions/reactions.type.d.ts +52 -0
  259. package/dist/types/reconnection-manager/index.d.ts +126 -0
  260. package/dist/types/recording-controller/enums.d.ts +7 -0
  261. package/dist/types/recording-controller/index.d.ts +193 -0
  262. package/dist/types/recording-controller/util.d.ts +13 -0
  263. package/dist/types/roap/index.d.ts +77 -0
  264. package/dist/types/roap/request.d.ts +36 -0
  265. package/dist/types/roap/turnDiscovery.d.ts +91 -0
  266. package/dist/types/statsAnalyzer/global.d.ts +36 -0
  267. package/dist/types/statsAnalyzer/index.d.ts +200 -0
  268. package/dist/types/statsAnalyzer/mqaUtil.d.ts +24 -0
  269. package/dist/types/transcription/index.d.ts +64 -0
  270. package/package.json +28 -21
  271. package/src/annotation/annotation.types.ts +52 -0
  272. package/src/annotation/constants.ts +36 -0
  273. package/src/annotation/index.ts +343 -0
  274. package/src/breakouts/README.md +220 -0
  275. package/src/breakouts/breakout.ts +180 -0
  276. package/src/breakouts/collection.ts +19 -0
  277. package/src/breakouts/edit-lock-error.ts +25 -0
  278. package/src/breakouts/events.ts +37 -0
  279. package/src/breakouts/index.ts +921 -0
  280. package/src/breakouts/request.ts +55 -0
  281. package/src/breakouts/utils.ts +57 -0
  282. package/src/common/errors/webex-errors.ts +6 -2
  283. package/src/common/logs/logger-proxy.ts +1 -1
  284. package/src/config.ts +5 -7
  285. package/src/constants.ts +165 -20
  286. package/src/controls-options-manager/constants.ts +5 -0
  287. package/src/controls-options-manager/enums.ts +18 -0
  288. package/src/controls-options-manager/index.ts +278 -0
  289. package/src/controls-options-manager/types.ts +59 -0
  290. package/src/controls-options-manager/util.ts +286 -0
  291. package/src/index.ts +34 -0
  292. package/src/interpretation/README.md +51 -0
  293. package/src/interpretation/collection.ts +19 -0
  294. package/src/interpretation/index.ts +182 -0
  295. package/src/interpretation/siLanguage.ts +18 -0
  296. package/src/locus-info/controlsUtils.ts +110 -0
  297. package/src/locus-info/index.ts +339 -21
  298. package/src/locus-info/mediaSharesUtils.ts +48 -0
  299. package/src/locus-info/parser.ts +2 -1
  300. package/src/locus-info/selfUtils.ts +86 -2
  301. package/src/media/index.ts +70 -142
  302. package/src/media/properties.ts +41 -104
  303. package/src/mediaQualityMetrics/config.ts +379 -377
  304. package/src/meeting/in-meeting-actions.ts +156 -0
  305. package/src/meeting/index.ts +1779 -1741
  306. package/src/meeting/locusMediaRequest.ts +309 -0
  307. package/src/meeting/muteState.ts +228 -132
  308. package/src/meeting/request.ts +100 -91
  309. package/src/meeting/request.type.ts +2 -0
  310. package/src/meeting/util.ts +422 -421
  311. package/src/meeting-info/meeting-info-v2.ts +134 -13
  312. package/src/meeting-info/utilv2.ts +13 -3
  313. package/src/meetings/collection.ts +20 -0
  314. package/src/meetings/index.ts +385 -83
  315. package/src/meetings/meetings.types.ts +12 -0
  316. package/src/meetings/request.ts +3 -1
  317. package/src/meetings/util.ts +103 -4
  318. package/src/member/index.ts +42 -0
  319. package/src/member/types.ts +24 -0
  320. package/src/member/util.ts +95 -1
  321. package/src/members/collection.ts +8 -0
  322. package/src/members/index.ts +108 -6
  323. package/src/members/request.ts +98 -17
  324. package/src/members/types.ts +28 -0
  325. package/src/members/util.ts +319 -240
  326. package/src/metrics/config.ts +49 -10
  327. package/src/metrics/constants.ts +2 -4
  328. package/src/metrics/index.ts +43 -27
  329. package/src/multistream/mediaRequestManager.ts +337 -63
  330. package/src/multistream/receiveSlot.ts +68 -26
  331. package/src/multistream/receiveSlotManager.ts +61 -38
  332. package/src/multistream/remoteMedia.ts +29 -3
  333. package/src/multistream/remoteMediaGroup.ts +61 -2
  334. package/src/multistream/remoteMediaManager.ts +260 -66
  335. package/src/networkQualityMonitor/index.ts +6 -6
  336. package/src/reachability/index.ts +75 -25
  337. package/src/reachability/request.ts +10 -5
  338. package/src/reactions/constants.ts +4 -0
  339. package/src/reactions/reactions.ts +4 -4
  340. package/src/reactions/reactions.type.ts +28 -3
  341. package/src/reconnection-manager/index.ts +53 -32
  342. package/src/recording-controller/enums.ts +8 -0
  343. package/src/recording-controller/index.ts +315 -0
  344. package/src/recording-controller/util.ts +58 -0
  345. package/src/roap/index.ts +21 -30
  346. package/src/roap/request.ts +51 -52
  347. package/src/roap/turnDiscovery.ts +51 -27
  348. package/src/statsAnalyzer/global.ts +1 -94
  349. package/src/statsAnalyzer/index.ts +380 -390
  350. package/src/statsAnalyzer/mqaUtil.ts +106 -99
  351. package/test/integration/spec/converged-space-meetings.js +233 -0
  352. package/test/integration/spec/journey.js +331 -254
  353. package/test/integration/spec/space-meeting.js +77 -4
  354. package/test/unit/spec/annotation/index.ts +436 -0
  355. package/test/unit/spec/breakouts/breakout.ts +233 -0
  356. package/test/unit/spec/breakouts/collection.ts +15 -0
  357. package/test/unit/spec/breakouts/edit-lock-error.ts +30 -0
  358. package/test/unit/spec/breakouts/events.ts +77 -0
  359. package/test/unit/spec/breakouts/index.ts +1790 -0
  360. package/test/unit/spec/breakouts/request.ts +104 -0
  361. package/test/unit/spec/breakouts/utils.js +72 -0
  362. package/test/unit/spec/controls-options-manager/index.js +287 -0
  363. package/test/unit/spec/controls-options-manager/util.js +518 -0
  364. package/test/unit/spec/fixture/locus.js +1 -0
  365. package/test/unit/spec/interpretation/collection.ts +15 -0
  366. package/test/unit/spec/interpretation/index.ts +329 -0
  367. package/test/unit/spec/interpretation/siLanguage.ts +26 -0
  368. package/test/unit/spec/locus-info/controlsUtils.js +323 -30
  369. package/test/unit/spec/locus-info/index.js +680 -4
  370. package/test/unit/spec/locus-info/mediaSharesUtils.ts +22 -0
  371. package/test/unit/spec/locus-info/selfConstant.js +48 -0
  372. package/test/unit/spec/locus-info/selfUtils.js +275 -0
  373. package/test/unit/spec/media/index.ts +118 -22
  374. package/test/unit/spec/media/properties.ts +9 -9
  375. package/test/unit/spec/meeting/in-meeting-actions.ts +76 -0
  376. package/test/unit/spec/meeting/index.js +2695 -1513
  377. package/test/unit/spec/meeting/locusMediaRequest.ts +436 -0
  378. package/test/unit/spec/meeting/muteState.js +370 -208
  379. package/test/unit/spec/meeting/request.js +354 -42
  380. package/test/unit/spec/meeting/utils.js +270 -156
  381. package/test/unit/spec/meeting-info/meetinginfov2.js +383 -5
  382. package/test/unit/spec/meeting-info/utilv2.js +21 -0
  383. package/test/unit/spec/meetings/collection.js +14 -0
  384. package/test/unit/spec/meetings/index.js +866 -120
  385. package/test/unit/spec/meetings/utils.js +206 -2
  386. package/test/unit/spec/member/index.js +31 -0
  387. package/test/unit/spec/member/util.js +408 -32
  388. package/test/unit/spec/members/index.js +320 -1
  389. package/test/unit/spec/members/request.js +206 -27
  390. package/test/unit/spec/members/utils.js +184 -0
  391. package/test/unit/spec/metrics/index.js +98 -0
  392. package/test/unit/spec/multistream/mediaRequestManager.ts +1012 -109
  393. package/test/unit/spec/multistream/receiveSlot.ts +77 -18
  394. package/test/unit/spec/multistream/receiveSlotManager.ts +69 -39
  395. package/test/unit/spec/multistream/remoteMedia.ts +32 -2
  396. package/test/unit/spec/multistream/remoteMediaGroup.ts +271 -5
  397. package/test/unit/spec/multistream/remoteMediaManager.ts +672 -65
  398. package/test/unit/spec/networkQualityMonitor/index.js +4 -4
  399. package/test/unit/spec/reachability/index.ts +176 -25
  400. package/test/unit/spec/reachability/request.js +66 -0
  401. package/test/unit/spec/reconnection-manager/index.js +46 -13
  402. package/test/unit/spec/recording-controller/index.js +231 -0
  403. package/test/unit/spec/recording-controller/util.js +102 -0
  404. package/test/unit/spec/roap/index.ts +21 -51
  405. package/test/unit/spec/roap/request.ts +187 -0
  406. package/test/unit/spec/roap/turnDiscovery.ts +73 -34
  407. package/test/unit/spec/stats-analyzer/index.js +94 -43
  408. package/test/utils/constants.js +9 -0
  409. package/test/utils/integrationTestUtils.js +46 -0
  410. package/test/utils/testUtils.js +0 -45
  411. package/test/utils/webex-config.js +4 -0
  412. package/test/utils/webex-test-users.js +7 -3
  413. package/tsconfig.json +6 -0
  414. package/dist/media/internal-media-core-wrapper.js +0 -18
  415. package/dist/media/internal-media-core-wrapper.js.map +0 -1
  416. package/dist/meeting/effectsState.js +0 -262
  417. package/dist/meeting/effectsState.js.map +0 -1
  418. package/dist/multistream/multistreamMedia.js +0 -106
  419. package/dist/multistream/multistreamMedia.js.map +0 -1
  420. package/src/index.js +0 -15
  421. package/src/media/internal-media-core-wrapper.ts +0 -9
  422. package/src/meeting/effectsState.ts +0 -211
  423. package/src/multistream/multistreamMedia.ts +0 -93
  424. package/test/unit/spec/meeting/effectsState.js +0 -281
@@ -1,5 +1,6 @@
1
1
  /* eslint-disable default-param-last */
2
2
 
3
+ import {isEqual} from 'lodash';
3
4
  import {
4
5
  _IDLE_,
5
6
  _JOINED_,
@@ -31,9 +32,11 @@ SelfUtils.parse = (self: any, deviceId: string) => {
31
32
  const pstnDevices = self.devices.filter((device) => PSTN_DEVICE_TYPE === device.deviceType);
32
33
 
33
34
  return {
35
+ remoteVideoMuted: SelfUtils.getRemoteVideoMuted(self),
34
36
  remoteMuted: SelfUtils.getRemoteMuted(self),
35
37
  unmuteAllowed: SelfUtils.getUnmuteAllowed(self),
36
38
  localAudioUnmuteRequested: SelfUtils.getLocalAudioUnmuteRequested(self),
39
+ localAudioUnmuteRequestedTimeStamp: SelfUtils.getLocalAudioUnmuteRequestedTimeStamp(self),
37
40
  localAudioUnmuteRequired: SelfUtils.getLocalAudioUnmuteRequired(self),
38
41
  lastModified: SelfUtils.getLastModified(self),
39
42
  modifiedBy: SelfUtils.getModifiedBy(self),
@@ -60,12 +63,19 @@ SelfUtils.parse = (self: any, deviceId: string) => {
60
63
  layout: SelfUtils.getLayout(self),
61
64
  canNotViewTheParticipantList: SelfUtils.canNotViewTheParticipantList(self),
62
65
  isSharingBlocked: SelfUtils.isSharingBlocked(self),
66
+ breakoutSessions: SelfUtils.getBreakoutSessions(self),
67
+ breakout: SelfUtils.getBreakout(self),
68
+ interpretation: SelfUtils.getInterpretation(self),
63
69
  };
64
70
  }
65
71
 
66
72
  return null;
67
73
  };
68
74
 
75
+ SelfUtils.getBreakoutSessions = (self) => self?.controls?.breakout?.sessions;
76
+ SelfUtils.getBreakout = (self) => self?.controls?.breakout;
77
+ SelfUtils.getInterpretation = (self) => self?.controls?.interpretation;
78
+
69
79
  SelfUtils.getLayout = (self) =>
70
80
  Array.isArray(self?.controls?.layouts) ? self.controls.layouts[0].type : undefined;
71
81
 
@@ -89,6 +99,7 @@ SelfUtils.getSelves = (oldSelf, newSelf, deviceId) => {
89
99
 
90
100
  updates.isUserUnadmitted = SelfUtils.isUserUnadmitted(current);
91
101
  updates.isUserAdmitted = SelfUtils.isUserAdmitted(previous, current);
102
+ updates.isVideoMutedByOthersChanged = SelfUtils.videoMutedByOthersChanged(previous, current);
92
103
  updates.isMutedByOthersChanged = SelfUtils.mutedByOthersChanged(previous, current);
93
104
  updates.localAudioUnmuteRequestedByServer = SelfUtils.localAudioUnmuteRequestedByServer(
94
105
  previous,
@@ -99,6 +110,7 @@ SelfUtils.getSelves = (oldSelf, newSelf, deviceId) => {
99
110
  current
100
111
  );
101
112
  updates.moderatorChanged = SelfUtils.moderatorChanged(previous, current);
113
+ updates.isRolesChanged = SelfUtils.isRolesChanged(previous, current);
102
114
  updates.isMediaInactiveOrReleased = SelfUtils.wasMediaInactiveOrReleased(previous, current);
103
115
  updates.isUserObserving = SelfUtils.isDeviceObserving(previous, current);
104
116
  updates.layoutChanged = SelfUtils.layoutChanged(previous, current);
@@ -114,6 +126,8 @@ SelfUtils.getSelves = (oldSelf, newSelf, deviceId) => {
114
126
  updates.canNotViewTheParticipantListChanged =
115
127
  previous?.canNotViewTheParticipantList !== current.canNotViewTheParticipantList;
116
128
  updates.isSharingBlockedChanged = previous?.isSharingBlocked !== current.isSharingBlocked;
129
+ updates.breakoutsChanged = SelfUtils.breakoutsChanged(previous, current);
130
+ updates.interpretationChanged = SelfUtils.interpretationChanged(previous, current);
117
131
 
118
132
  return {
119
133
  previous,
@@ -134,11 +148,17 @@ SelfUtils.isJoined = (self: any) => self?.state === _JOINED_;
134
148
  *
135
149
  * @param {Self} previous - Previous self state
136
150
  * @param {Self} current - Current self state [per event]
137
- * @returns {boolean} - If the MEeting Layout Controls Layout has changed.
151
+ * @returns {boolean} - If the Meeting Layout Controls Layout has changed.
138
152
  */
139
153
  SelfUtils.layoutChanged = (previous: any, current: any) =>
140
154
  current?.layout && previous?.layout !== current?.layout;
141
155
 
156
+ SelfUtils.breakoutsChanged = (previous, current) =>
157
+ !isEqual(previous?.breakoutSessions, current?.breakoutSessions) && !!current?.breakout;
158
+
159
+ SelfUtils.interpretationChanged = (previous, current) =>
160
+ !isEqual(previous?.interpretation, current?.interpretation) && !!current?.interpretation;
161
+
142
162
  SelfUtils.isMediaInactive = (previous, current) => {
143
163
  if (
144
164
  previous &&
@@ -228,6 +248,19 @@ SelfUtils.getSelfIdentity = (self: any) => {
228
248
  return self.person.id;
229
249
  };
230
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
+
231
264
  /**
232
265
  * get the "remote mute" property from the self object
233
266
  * @param {Object} self
@@ -243,6 +276,10 @@ SelfUtils.getRemoteMuted = (self: any) => {
243
276
 
244
277
  SelfUtils.getLocalAudioUnmuteRequested = (self) => !!self?.controls?.audio?.requestedToUnmute;
245
278
 
279
+ // requestedToUnmute timestamp
280
+ SelfUtils.getLocalAudioUnmuteRequestedTimeStamp = (self) =>
281
+ Date.parse(self?.controls?.audio?.lastModifiedRequestedToUnmute) || 0;
282
+
246
283
  SelfUtils.getUnmuteAllowed = (self) => {
247
284
  if (!self || !self.controls || !self.controls.audio) {
248
285
  return null;
@@ -267,6 +304,7 @@ SelfUtils.getStatus = (status) => ({
267
304
  SelfUtils.wasMediaInactiveOrReleased = (oldSelf: any = {}, changedSelf: any) =>
268
305
  oldSelf.joinedWith &&
269
306
  oldSelf.joinedWith.state === _JOINED_ &&
307
+ changedSelf.joinedWith &&
270
308
  changedSelf.joinedWith.state === _LEFT_ &&
271
309
  (changedSelf.joinedWith.reason === MEETING_END_REASON.INACTIVE ||
272
310
  changedSelf.joinedWith.reason === MEETING_END_REASON.MEDIA_RELEASED);
@@ -311,6 +349,20 @@ SelfUtils.moderatorChanged = (oldSelf, changedSelf) => {
311
349
  return oldSelf.moderator !== changedSelf.moderator;
312
350
  };
313
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
+ };
314
366
  /**
315
367
  * @param {Object} oldSelf
316
368
  * @param {Object} changedSelf
@@ -343,6 +395,25 @@ SelfUtils.isUserAdmitted = (oldSelf: object, changedSelf: object) => {
343
395
  return SelfUtils.isLocusUserUnadmitted(oldSelf) && SelfUtils.isLocusUserAdmitted(changedSelf);
344
396
  };
345
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
+
346
417
  SelfUtils.mutedByOthersChanged = (oldSelf, changedSelf) => {
347
418
  if (!changedSelf) {
348
419
  throw new ParameterError('New self must be defined to determine if self was muted by others.');
@@ -371,7 +442,10 @@ SelfUtils.localAudioUnmuteRequestedByServer = (oldSelf: any = {}, changedSelf: a
371
442
  );
372
443
  }
373
444
 
374
- return changedSelf.localAudioUnmuteRequested && !oldSelf.localAudioUnmuteRequested;
445
+ return (
446
+ changedSelf.localAudioUnmuteRequested &&
447
+ changedSelf.localAudioUnmuteRequestedTimeStamp > oldSelf.localAudioUnmuteRequestedTimeStamp
448
+ );
375
449
  };
376
450
 
377
451
  SelfUtils.localAudioUnmuteRequiredByServer = (oldSelf: any = {}, changedSelf: any) => {
@@ -424,4 +498,14 @@ SelfUtils.getMediaStatus = (mediaSessions = []) => {
424
498
  return mediaStatus;
425
499
  };
426
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
+ };
427
511
  export default SelfUtils;
@@ -3,17 +3,22 @@
3
3
  */
4
4
  /* globals navigator */
5
5
 
6
+ import {RoapMediaConnection, MultistreamRoapMediaConnection} from '@webex/internal-media-core';
7
+ import {LocalCameraTrack, LocalDisplayTrack, LocalMicrophoneTrack} from '@webex/media-helpers';
6
8
  import LoggerProxy from '../common/logs/logger-proxy';
7
- import {AUDIO_INPUT, VIDEO_INPUT, MEDIA_TRACK_CONSTRAINT} from '../constants';
9
+ import {MEDIA_TRACK_CONSTRAINT} from '../constants';
8
10
  import Config from '../config';
9
11
  import StaticConfig from '../common/config';
10
- import MediaError from '../common/errors/media';
11
12
  import BrowserDetection from '../common/browser-detection';
12
13
 
13
- import {RoapMediaConnection, MultistreamRoapMediaConnection} from './internal-media-core-wrapper';
14
-
15
14
  const {isBrowser} = BrowserDetection();
16
15
 
16
+ type MultistreamConnectionConfig = ConstructorParameters<typeof MultistreamRoapMediaConnection>[0];
17
+
18
+ export type BundlePolicy = ConstructorParameters<
19
+ typeof MultistreamRoapMediaConnection
20
+ >[0]['bundlePolicy'];
21
+
17
22
  /**
18
23
  * MediaDirection
19
24
  * @typedef {Object} MediaDirection
@@ -44,45 +49,6 @@ const {isBrowser} = BrowserDetection();
44
49
  */
45
50
  const Media: any = {};
46
51
 
47
- /**
48
- * @param {boolean} enabled
49
- * @param {MediaStreamTrack} track
50
- * @returns {Boolean}
51
- * @public
52
- */
53
- Media.setLocalTrack = (enabled: boolean, track: MediaStreamTrack) => {
54
- if (track) {
55
- track.enabled = enabled;
56
-
57
- return true;
58
- }
59
-
60
- return false;
61
- };
62
-
63
- /**
64
- * format the media array for send
65
- * @param {String} mediaId
66
- * @param {Boolean} audioMuted
67
- * @param {Boolean} videoMuted
68
- * @returns {Array} medias
69
- */
70
- Media.generateLocalMedias = (mediaId: string, audioMuted: boolean, videoMuted: boolean) => {
71
- if (mediaId) {
72
- return [
73
- {
74
- localSdp: JSON.stringify({
75
- audioMuted,
76
- videoMuted,
77
- }),
78
- mediaId,
79
- },
80
- ];
81
- }
82
-
83
- return [];
84
- };
85
-
86
52
  /**
87
53
  * make a browser call to get the media
88
54
  * @param {SendOptions} options
@@ -110,33 +76,53 @@ Media.getLocalMedia = (options: any, config: object) => {
110
76
  return Promise.resolve(undefined);
111
77
  };
112
78
 
79
+ Media.getDirection = (forceSendRecv: boolean, receive: boolean, send: boolean) => {
80
+ if (!receive && !send) {
81
+ return 'inactive';
82
+ }
83
+
84
+ if (forceSendRecv || (receive && send)) {
85
+ return 'sendrecv';
86
+ }
87
+
88
+ if (receive) {
89
+ return 'recvonly';
90
+ }
91
+
92
+ return 'sendonly';
93
+ };
94
+
113
95
  /**
114
96
  * creates a webrtc media connection with provided tracks and mediaDirection configuration
115
97
  *
116
98
  * @param {boolean} isMultistream
117
99
  * @param {string} debugId string useful for debugging (will appear in media connection logs)
118
100
  * @param {Object} options
119
- * @param {Object} [options.mediaProperties] only applicable to non-multistream connections, contains mediaDirection and local tracks:
101
+ * @param {Object} [options.mediaProperties] contains mediaDirection and local tracks:
120
102
  * audioTrack, videoTrack and shareTrack
121
103
  * @param {string} [options.remoteQualityLevel] LOW|MEDIUM|HIGH applicable only to non-multistream connections
122
104
  * @param {boolean} [options.enableRtx] applicable only to non-multistream connections
123
105
  * @param {boolean} [options.enableExtmap] applicable only to non-multistream connections
124
106
  * @param {Object} [options.turnServerInfo]
125
- * @returns {RoapMediaConnection}
107
+ * @param {BundlePolicy} [options.bundlePolicy]
108
+ * @returns {RoapMediaConnection | MultistreamRoapMediaConnection}
126
109
  */
127
110
  Media.createMediaConnection = (
128
111
  isMultistream: boolean,
129
112
  debugId: string,
130
113
  options: {
131
- mediaProperties?: {
114
+ mediaProperties: {
132
115
  mediaDirection?: {
133
116
  receiveAudio: boolean;
134
117
  receiveVideo: boolean;
135
118
  receiveShare: boolean;
119
+ sendAudio: boolean;
120
+ sendVideo: boolean;
121
+ sendShare: boolean;
136
122
  };
137
- audioTrack?: MediaStreamTrack;
138
- videoTrack?: MediaStreamTrack;
139
- shareTrack?: MediaStreamTrack;
123
+ audioTrack?: LocalMicrophoneTrack;
124
+ videoTrack?: LocalCameraTrack;
125
+ shareTrack?: LocalDisplayTrack;
140
126
  };
141
127
  remoteQualityLevel?: 'LOW' | 'MEDIUM' | 'HIGH';
142
128
  enableRtx?: boolean;
@@ -146,9 +132,17 @@ Media.createMediaConnection = (
146
132
  username: string;
147
133
  password: string;
148
134
  };
135
+ bundlePolicy?: BundlePolicy;
149
136
  }
150
137
  ) => {
151
- const {mediaProperties, remoteQualityLevel, enableRtx, enableExtmap, turnServerInfo} = options;
138
+ const {
139
+ mediaProperties,
140
+ remoteQualityLevel,
141
+ enableRtx,
142
+ enableExtmap,
143
+ turnServerInfo,
144
+ bundlePolicy,
145
+ } = options;
152
146
 
153
147
  const iceServers = [];
154
148
 
@@ -161,12 +155,19 @@ Media.createMediaConnection = (
161
155
  }
162
156
 
163
157
  if (isMultistream) {
164
- return new MultistreamRoapMediaConnection(
165
- {
166
- iceServers,
167
- },
168
- debugId
169
- );
158
+ const config: MultistreamConnectionConfig = {
159
+ iceServers,
160
+ enableMainAudio:
161
+ mediaProperties.mediaDirection?.sendAudio || mediaProperties.mediaDirection?.receiveAudio,
162
+ enableMainVideo:
163
+ mediaProperties.mediaDirection?.sendVideo || mediaProperties.mediaDirection?.receiveVideo,
164
+ };
165
+
166
+ if (bundlePolicy) {
167
+ config.bundlePolicy = bundlePolicy;
168
+ }
169
+
170
+ return new MultistreamRoapMediaConnection(config, debugId);
170
171
  }
171
172
 
172
173
  if (!mediaProperties) {
@@ -194,17 +195,21 @@ Media.createMediaConnection = (
194
195
  },
195
196
  },
196
197
  {
197
- send: {
198
- audio: audioTrack,
199
- video: videoTrack,
200
- screenShareVideo: shareTrack,
198
+ localTracks: {
199
+ audio: audioTrack?.underlyingTrack,
200
+ video: videoTrack?.underlyingTrack,
201
+ screenShareVideo: shareTrack?.underlyingTrack,
201
202
  },
202
- receive: {
203
- audio: mediaDirection.receiveAudio,
204
- video: mediaDirection.receiveVideo,
205
- screenShareVideo: mediaDirection.receiveShare,
206
- remoteQualityLevel,
203
+ direction: {
204
+ audio: Media.getDirection(true, mediaDirection.receiveAudio, mediaDirection.sendAudio),
205
+ video: Media.getDirection(true, mediaDirection.receiveVideo, mediaDirection.sendVideo),
206
+ screenShareVideo: Media.getDirection(
207
+ false,
208
+ mediaDirection.receiveShare,
209
+ mediaDirection.sendShare
210
+ ),
207
211
  },
212
+ remoteQualityLevel,
208
213
  },
209
214
  debugId
210
215
  );
@@ -349,52 +354,6 @@ Media.getMedia = (audio: any | boolean, video: any | boolean, config: any) => {
349
354
  });
350
355
  };
351
356
 
352
- /**
353
- * Checks if the machine has at least one audio or video device (Dont use this for screen share)
354
- * @param {object} [options]
355
- * {
356
- * sendAudio: true/false,
357
- * sendVideo: true/false
358
- * }
359
- * @returns {Object} {
360
- * sendAudio: true/false,
361
- * sendVideo: true/false
362
- *}
363
- */
364
- Media.getSupportedDevice = ({sendAudio, sendVideo}: {sendAudio: boolean; sendVideo: boolean}) =>
365
- Promise.resolve().then(() => {
366
- if (!navigator.mediaDevices || navigator.mediaDevices.enumerateDevices === undefined) {
367
- return {
368
- sendAudio: false,
369
- sendVideo: false,
370
- };
371
- }
372
-
373
- return navigator.mediaDevices.enumerateDevices().then((devices) => {
374
- const supported = {
375
- audio: devices.filter((device) => device.kind === AUDIO_INPUT).length > 0,
376
- video: devices.filter((device) => device.kind === VIDEO_INPUT).length > 0,
377
- };
378
-
379
- return {
380
- sendAudio: supported.audio && sendAudio,
381
- sendVideo: supported.video && sendVideo,
382
- };
383
- });
384
- });
385
-
386
- /**
387
- * proxy to browser navigator.mediaDevices.enumerateDevices()
388
- * @returns {Promise}
389
- */
390
- Media.getDevices = () => {
391
- if (navigator && navigator.mediaDevices && navigator.mediaDevices.enumerateDevices) {
392
- return navigator.mediaDevices.enumerateDevices();
393
- }
394
-
395
- return Promise.reject(new MediaError('enumerateDevices not supported.'));
396
- };
397
-
398
357
  /**
399
358
  *
400
359
  * Toggle a specific stream
@@ -426,37 +385,6 @@ Media.stopTracks = (track: any) => {
426
385
  });
427
386
  };
428
387
 
429
- /**
430
- *
431
- * Stop input stream
432
- * @param {Stream} stream A media stream
433
- * @returns {null}
434
- * @deprecated after v1.89.3
435
- */
436
- Media.stopStream = (stream: any) => {
437
- LoggerProxy.logger.warn(
438
- 'Media:index#stopStream --> [DEPRECATION WARNING]: stopStream has been deprecated after v1.89.3'
439
- );
440
- if (!stream) {
441
- return Promise.resolve();
442
- }
443
-
444
- /*
445
- * To release local media
446
- * 1) Chrome requires all tracks to be stopped (stream.stop got deprecated)
447
- * 2) Firefox requires the stream to be stopped
448
- */
449
- return Promise.resolve().then(() => {
450
- if (stream.getTracks) {
451
- stream.getTracks().forEach((track) => {
452
- track.stop();
453
- });
454
- } else if (stream.stop) {
455
- stream.stop();
456
- }
457
- });
458
- };
459
-
460
388
  /**
461
389
  * generates streams for audio video and share
462
390
  * @param {object} mediaSetting parameter