@webex/plugin-meetings 3.0.0-beta.4 → 3.0.0-beta.400

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 (629) hide show
  1. package/README.md +58 -8
  2. package/UPGRADING.md +9 -9
  3. package/browsers.js +19 -24
  4. package/dist/annotation/annotation.types.js +7 -0
  5. package/dist/annotation/annotation.types.js.map +1 -0
  6. package/dist/annotation/constants.js +49 -0
  7. package/dist/annotation/constants.js.map +1 -0
  8. package/dist/annotation/index.js +342 -0
  9. package/dist/annotation/index.js.map +1 -0
  10. package/dist/breakouts/breakout.js +216 -0
  11. package/dist/breakouts/breakout.js.map +1 -0
  12. package/dist/breakouts/collection.js +23 -0
  13. package/dist/breakouts/collection.js.map +1 -0
  14. package/dist/breakouts/edit-lock-error.js +52 -0
  15. package/dist/breakouts/edit-lock-error.js.map +1 -0
  16. package/dist/breakouts/events.js +45 -0
  17. package/dist/breakouts/events.js.map +1 -0
  18. package/dist/breakouts/index.js +1048 -0
  19. package/dist/breakouts/index.js.map +1 -0
  20. package/dist/breakouts/request.js +78 -0
  21. package/dist/breakouts/request.js.map +1 -0
  22. package/dist/breakouts/utils.js +67 -0
  23. package/dist/breakouts/utils.js.map +1 -0
  24. package/dist/common/browser-detection.js +1 -20
  25. package/dist/common/browser-detection.js.map +1 -1
  26. package/dist/common/collection.js +5 -20
  27. package/dist/common/collection.js.map +1 -1
  28. package/dist/common/config.js +0 -7
  29. package/dist/common/config.js.map +1 -1
  30. package/dist/common/errors/captcha-error.js +10 -24
  31. package/dist/common/errors/captcha-error.js.map +1 -1
  32. package/dist/common/errors/intent-to-join.js +11 -24
  33. package/dist/common/errors/intent-to-join.js.map +1 -1
  34. package/dist/common/errors/join-meeting.js +12 -25
  35. package/dist/common/errors/join-meeting.js.map +1 -1
  36. package/dist/common/errors/media.js +10 -24
  37. package/dist/common/errors/media.js.map +1 -1
  38. package/dist/common/errors/no-meeting-info.js +51 -0
  39. package/dist/common/errors/no-meeting-info.js.map +1 -0
  40. package/dist/common/errors/parameter.js +5 -33
  41. package/dist/common/errors/parameter.js.map +1 -1
  42. package/dist/common/errors/password-error.js +10 -24
  43. package/dist/common/errors/password-error.js.map +1 -1
  44. package/dist/common/errors/permission.js +9 -23
  45. package/dist/common/errors/permission.js.map +1 -1
  46. package/dist/common/errors/reclaim-host-role-errors.js +158 -0
  47. package/dist/common/errors/reclaim-host-role-errors.js.map +1 -0
  48. package/dist/common/errors/reconnection-in-progress.js +0 -17
  49. package/dist/common/errors/reconnection-in-progress.js.map +1 -1
  50. package/dist/common/errors/reconnection.js +10 -24
  51. package/dist/common/errors/reconnection.js.map +1 -1
  52. package/dist/common/errors/stats.js +10 -24
  53. package/dist/common/errors/stats.js.map +1 -1
  54. package/dist/common/errors/webex-errors.js +54 -48
  55. package/dist/common/errors/webex-errors.js.map +1 -1
  56. package/dist/common/errors/webex-meetings-error.js +5 -25
  57. package/dist/common/errors/webex-meetings-error.js.map +1 -1
  58. package/dist/common/events/events-scope.js +0 -22
  59. package/dist/common/events/events-scope.js.map +1 -1
  60. package/dist/common/events/events.js +0 -23
  61. package/dist/common/events/events.js.map +1 -1
  62. package/dist/common/events/trigger-proxy.js +0 -12
  63. package/dist/common/events/trigger-proxy.js.map +1 -1
  64. package/dist/common/events/util.js +0 -15
  65. package/dist/common/events/util.js.map +1 -1
  66. package/dist/common/logs/logger-config.js +0 -4
  67. package/dist/common/logs/logger-config.js.map +1 -1
  68. package/dist/common/logs/logger-proxy.js +1 -8
  69. package/dist/common/logs/logger-proxy.js.map +1 -1
  70. package/dist/common/logs/request.js +41 -60
  71. package/dist/common/logs/request.js.map +1 -1
  72. package/dist/common/queue.js +28 -23
  73. package/dist/common/queue.js.map +1 -1
  74. package/dist/config.js +11 -15
  75. package/dist/config.js.map +1 -1
  76. package/dist/constants.js +347 -74
  77. package/dist/constants.js.map +1 -1
  78. package/dist/controls-options-manager/constants.js +14 -0
  79. package/dist/controls-options-manager/constants.js.map +1 -0
  80. package/dist/controls-options-manager/enums.js +27 -0
  81. package/dist/controls-options-manager/enums.js.map +1 -0
  82. package/dist/controls-options-manager/index.js +297 -0
  83. package/dist/controls-options-manager/index.js.map +1 -0
  84. package/dist/controls-options-manager/types.js +7 -0
  85. package/dist/controls-options-manager/types.js.map +1 -0
  86. package/dist/controls-options-manager/util.js +319 -0
  87. package/dist/controls-options-manager/util.js.map +1 -0
  88. package/dist/index.js +125 -18
  89. package/dist/index.js.map +1 -1
  90. package/dist/interceptors/index.js +15 -0
  91. package/dist/interceptors/index.js.map +1 -0
  92. package/dist/interceptors/locusRetry.js +93 -0
  93. package/dist/interceptors/locusRetry.js.map +1 -0
  94. package/dist/interpretation/collection.js +23 -0
  95. package/dist/interpretation/collection.js.map +1 -0
  96. package/dist/interpretation/index.js +380 -0
  97. package/dist/interpretation/index.js.map +1 -0
  98. package/dist/interpretation/siLanguage.js +25 -0
  99. package/dist/interpretation/siLanguage.js.map +1 -0
  100. package/dist/locus-info/controlsUtils.js +101 -29
  101. package/dist/locus-info/controlsUtils.js.map +1 -1
  102. package/dist/locus-info/embeddedAppsUtils.js +3 -26
  103. package/dist/locus-info/embeddedAppsUtils.js.map +1 -1
  104. package/dist/locus-info/fullState.js +0 -15
  105. package/dist/locus-info/fullState.js.map +1 -1
  106. package/dist/locus-info/hostUtils.js +4 -12
  107. package/dist/locus-info/hostUtils.js.map +1 -1
  108. package/dist/locus-info/index.js +564 -246
  109. package/dist/locus-info/index.js.map +1 -1
  110. package/dist/locus-info/infoUtils.js +10 -38
  111. package/dist/locus-info/infoUtils.js.map +1 -1
  112. package/dist/locus-info/mediaSharesUtils.js +82 -38
  113. package/dist/locus-info/mediaSharesUtils.js.map +1 -1
  114. package/dist/locus-info/parser.js +314 -163
  115. package/dist/locus-info/parser.js.map +1 -1
  116. package/dist/locus-info/selfUtils.js +110 -92
  117. package/dist/locus-info/selfUtils.js.map +1 -1
  118. package/dist/media/index.js +107 -231
  119. package/dist/media/index.js.map +1 -1
  120. package/dist/media/properties.js +137 -222
  121. package/dist/media/properties.js.map +1 -1
  122. package/dist/media/util.js +2 -9
  123. package/dist/media/util.js.map +1 -1
  124. package/dist/mediaQualityMetrics/config.js +316 -501
  125. package/dist/mediaQualityMetrics/config.js.map +1 -1
  126. package/dist/meeting/in-meeting-actions.js +97 -14
  127. package/dist/meeting/in-meeting-actions.js.map +1 -1
  128. package/dist/meeting/index.js +5311 -3871
  129. package/dist/meeting/index.js.map +1 -1
  130. package/dist/meeting/locusMediaRequest.js +292 -0
  131. package/dist/meeting/locusMediaRequest.js.map +1 -0
  132. package/dist/meeting/muteState.js +260 -183
  133. package/dist/meeting/muteState.js.map +1 -1
  134. package/dist/meeting/request.js +421 -347
  135. package/dist/meeting/request.js.map +1 -1
  136. package/dist/meeting/request.type.js +7 -0
  137. package/dist/meeting/request.type.js.map +1 -0
  138. package/dist/meeting/state.js +21 -31
  139. package/dist/meeting/state.js.map +1 -1
  140. package/dist/meeting/util.js +672 -585
  141. package/dist/meeting/util.js.map +1 -1
  142. package/dist/meeting/voicea-meeting.js +172 -0
  143. package/dist/meeting/voicea-meeting.js.map +1 -0
  144. package/dist/meeting-info/collection.js +6 -25
  145. package/dist/meeting-info/collection.js.map +1 -1
  146. package/dist/meeting-info/index.js +87 -39
  147. package/dist/meeting-info/index.js.map +1 -1
  148. package/dist/meeting-info/meeting-info-v2.js +352 -283
  149. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  150. package/dist/meeting-info/request.js +3 -15
  151. package/dist/meeting-info/request.js.map +1 -1
  152. package/dist/meeting-info/util.js +99 -183
  153. package/dist/meeting-info/util.js.map +1 -1
  154. package/dist/meeting-info/utilv2.js +147 -234
  155. package/dist/meeting-info/utilv2.js.map +1 -1
  156. package/dist/meetings/collection.js +43 -19
  157. package/dist/meetings/collection.js.map +1 -1
  158. package/dist/meetings/index.js +895 -600
  159. package/dist/meetings/index.js.map +1 -1
  160. package/dist/meetings/meetings.types.js +7 -0
  161. package/dist/meetings/meetings.types.js.map +1 -0
  162. package/dist/meetings/request.js +26 -41
  163. package/dist/meetings/request.js.map +1 -1
  164. package/dist/meetings/util.js +184 -157
  165. package/dist/meetings/util.js.map +1 -1
  166. package/dist/member/index.js +134 -85
  167. package/dist/member/index.js.map +1 -1
  168. package/dist/member/types.js +25 -0
  169. package/dist/member/types.js.map +1 -0
  170. package/dist/member/util.js +158 -88
  171. package/dist/member/util.js.map +1 -1
  172. package/dist/members/collection.js +13 -12
  173. package/dist/members/collection.js.map +1 -1
  174. package/dist/members/index.js +194 -204
  175. package/dist/members/index.js.map +1 -1
  176. package/dist/members/request.js +113 -68
  177. package/dist/members/request.js.map +1 -1
  178. package/dist/members/types.js +15 -0
  179. package/dist/members/types.js.map +1 -0
  180. package/dist/members/util.js +324 -259
  181. package/dist/members/util.js.map +1 -1
  182. package/dist/metrics/constants.js +19 -7
  183. package/dist/metrics/constants.js.map +1 -1
  184. package/dist/metrics/index.js +11 -558
  185. package/dist/metrics/index.js.map +1 -1
  186. package/dist/multistream/mediaRequestManager.js +263 -50
  187. package/dist/multistream/mediaRequestManager.js.map +1 -1
  188. package/dist/multistream/receiveSlot.js +58 -65
  189. package/dist/multistream/receiveSlot.js.map +1 -1
  190. package/dist/multistream/receiveSlotManager.js +76 -95
  191. package/dist/multistream/receiveSlotManager.js.map +1 -1
  192. package/dist/multistream/remoteMedia.js +62 -76
  193. package/dist/multistream/remoteMedia.js.map +1 -1
  194. package/dist/multistream/remoteMediaGroup.js +82 -45
  195. package/dist/multistream/remoteMediaGroup.js.map +1 -1
  196. package/dist/multistream/remoteMediaManager.js +657 -448
  197. package/dist/multistream/remoteMediaManager.js.map +1 -1
  198. package/dist/multistream/sendSlotManager.js +255 -0
  199. package/dist/multistream/sendSlotManager.js.map +1 -0
  200. package/dist/networkQualityMonitor/index.js +40 -59
  201. package/dist/networkQualityMonitor/index.js.map +1 -1
  202. package/dist/personal-meeting-room/index.js +21 -45
  203. package/dist/personal-meeting-room/index.js.map +1 -1
  204. package/dist/personal-meeting-room/request.js +1 -31
  205. package/dist/personal-meeting-room/request.js.map +1 -1
  206. package/dist/personal-meeting-room/util.js +0 -13
  207. package/dist/personal-meeting-room/util.js.map +1 -1
  208. package/dist/reachability/clusterReachability.js +356 -0
  209. package/dist/reachability/clusterReachability.js.map +1 -0
  210. package/dist/reachability/index.js +297 -460
  211. package/dist/reachability/index.js.map +1 -1
  212. package/dist/reachability/request.js +20 -26
  213. package/dist/reachability/request.js.map +1 -1
  214. package/dist/reachability/util.js +29 -0
  215. package/dist/reachability/util.js.map +1 -0
  216. package/dist/reactions/constants.js +13 -0
  217. package/dist/reactions/constants.js.map +1 -0
  218. package/dist/reactions/reactions.js +109 -0
  219. package/dist/reactions/reactions.js.map +1 -0
  220. package/dist/reactions/reactions.type.js +36 -0
  221. package/dist/reactions/reactions.type.js.map +1 -0
  222. package/dist/reconnection-manager/index.js +413 -483
  223. package/dist/reconnection-manager/index.js.map +1 -1
  224. package/dist/recording-controller/enums.js +17 -0
  225. package/dist/recording-controller/enums.js.map +1 -0
  226. package/dist/recording-controller/index.js +362 -0
  227. package/dist/recording-controller/index.js.map +1 -0
  228. package/dist/recording-controller/util.js +64 -0
  229. package/dist/recording-controller/util.js.map +1 -0
  230. package/dist/roap/index.js +102 -86
  231. package/dist/roap/index.js.map +1 -1
  232. package/dist/roap/request.js +131 -135
  233. package/dist/roap/request.js.map +1 -1
  234. package/dist/roap/turnDiscovery.js +437 -116
  235. package/dist/roap/turnDiscovery.js.map +1 -1
  236. package/dist/rtcMetrics/constants.js +12 -0
  237. package/dist/rtcMetrics/constants.js.map +1 -0
  238. package/dist/rtcMetrics/index.js +179 -0
  239. package/dist/rtcMetrics/index.js.map +1 -0
  240. package/dist/statsAnalyzer/global.js +1 -95
  241. package/dist/statsAnalyzer/global.js.map +1 -1
  242. package/dist/statsAnalyzer/index.js +557 -583
  243. package/dist/statsAnalyzer/index.js.map +1 -1
  244. package/dist/statsAnalyzer/mqaUtil.js +326 -130
  245. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  246. package/dist/transcription/index.js +22 -47
  247. package/dist/transcription/index.js.map +1 -1
  248. package/dist/types/annotation/annotation.types.d.ts +42 -0
  249. package/dist/types/annotation/constants.d.ts +31 -0
  250. package/dist/types/annotation/index.d.ts +117 -0
  251. package/dist/types/breakouts/breakout.d.ts +8 -0
  252. package/dist/types/breakouts/collection.d.ts +5 -0
  253. package/dist/types/breakouts/edit-lock-error.d.ts +15 -0
  254. package/dist/types/breakouts/events.d.ts +8 -0
  255. package/dist/types/breakouts/index.d.ts +5 -0
  256. package/dist/types/breakouts/request.d.ts +22 -0
  257. package/dist/types/breakouts/utils.d.ts +15 -0
  258. package/dist/types/common/browser-detection.d.ts +9 -0
  259. package/dist/types/common/collection.d.ts +48 -0
  260. package/dist/types/common/config.d.ts +2 -0
  261. package/dist/types/common/errors/captcha-error.d.ts +15 -0
  262. package/dist/types/common/errors/intent-to-join.d.ts +16 -0
  263. package/dist/types/common/errors/join-meeting.d.ts +17 -0
  264. package/dist/types/common/errors/media.d.ts +15 -0
  265. package/dist/types/common/errors/no-meeting-info.d.ts +14 -0
  266. package/dist/types/common/errors/parameter.d.ts +15 -0
  267. package/dist/types/common/errors/password-error.d.ts +15 -0
  268. package/dist/types/common/errors/permission.d.ts +14 -0
  269. package/dist/types/common/errors/reclaim-host-role-errors.d.ts +60 -0
  270. package/dist/types/common/errors/reconnection-in-progress.d.ts +9 -0
  271. package/dist/types/common/errors/reconnection.d.ts +15 -0
  272. package/dist/types/common/errors/stats.d.ts +15 -0
  273. package/dist/types/common/errors/webex-errors.d.ts +93 -0
  274. package/dist/types/common/errors/webex-meetings-error.d.ts +20 -0
  275. package/dist/types/common/events/events-scope.d.ts +17 -0
  276. package/dist/types/common/events/events.d.ts +12 -0
  277. package/dist/types/common/events/trigger-proxy.d.ts +2 -0
  278. package/dist/types/common/events/util.d.ts +2 -0
  279. package/dist/types/common/logs/logger-config.d.ts +2 -0
  280. package/dist/types/common/logs/logger-proxy.d.ts +2 -0
  281. package/dist/types/common/logs/request.d.ts +36 -0
  282. package/dist/types/common/queue.d.ts +34 -0
  283. package/dist/types/config.d.ts +72 -0
  284. package/dist/types/constants.d.ts +1088 -0
  285. package/dist/types/controls-options-manager/constants.d.ts +4 -0
  286. package/dist/types/controls-options-manager/enums.d.ts +15 -0
  287. package/dist/types/controls-options-manager/index.d.ts +136 -0
  288. package/dist/types/controls-options-manager/types.d.ts +43 -0
  289. package/dist/types/controls-options-manager/util.d.ts +1 -0
  290. package/dist/types/index.d.ts +7 -0
  291. package/dist/types/interceptors/index.d.ts +2 -0
  292. package/dist/types/interceptors/locusRetry.d.ts +27 -0
  293. package/dist/types/interpretation/collection.d.ts +5 -0
  294. package/dist/types/interpretation/index.d.ts +5 -0
  295. package/dist/types/interpretation/siLanguage.d.ts +5 -0
  296. package/dist/types/locus-info/controlsUtils.d.ts +2 -0
  297. package/dist/types/locus-info/embeddedAppsUtils.d.ts +2 -0
  298. package/dist/types/locus-info/fullState.d.ts +2 -0
  299. package/dist/types/locus-info/hostUtils.d.ts +2 -0
  300. package/dist/types/locus-info/index.d.ts +322 -0
  301. package/dist/types/locus-info/infoUtils.d.ts +2 -0
  302. package/dist/types/locus-info/mediaSharesUtils.d.ts +2 -0
  303. package/dist/types/locus-info/parser.d.ts +272 -0
  304. package/dist/types/locus-info/selfUtils.d.ts +2 -0
  305. package/dist/types/media/index.d.ts +34 -0
  306. package/dist/types/media/properties.d.ts +93 -0
  307. package/dist/types/media/util.d.ts +2 -0
  308. package/dist/types/mediaQualityMetrics/config.d.ts +241 -0
  309. package/dist/types/meeting/in-meeting-actions.d.ts +167 -0
  310. package/dist/types/meeting/index.d.ts +1824 -0
  311. package/dist/types/meeting/locusMediaRequest.d.ts +74 -0
  312. package/dist/types/meeting/muteState.d.ts +178 -0
  313. package/dist/types/meeting/request.d.ts +293 -0
  314. package/dist/types/meeting/request.type.d.ts +11 -0
  315. package/dist/types/meeting/state.d.ts +9 -0
  316. package/dist/types/meeting/util.d.ts +118 -0
  317. package/dist/types/meeting/voicea-meeting.d.ts +16 -0
  318. package/dist/types/meeting-info/collection.d.ts +20 -0
  319. package/dist/types/meeting-info/index.d.ts +69 -0
  320. package/dist/types/meeting-info/meeting-info-v2.d.ts +123 -0
  321. package/dist/types/meeting-info/request.d.ts +22 -0
  322. package/dist/types/meeting-info/util.d.ts +2 -0
  323. package/dist/types/meeting-info/utilv2.d.ts +2 -0
  324. package/dist/types/meetings/collection.d.ts +40 -0
  325. package/dist/types/meetings/index.d.ts +389 -0
  326. package/dist/types/meetings/meetings.types.d.ts +4 -0
  327. package/dist/types/meetings/request.d.ts +27 -0
  328. package/dist/types/meetings/util.d.ts +18 -0
  329. package/dist/types/member/index.d.ts +160 -0
  330. package/dist/types/member/types.d.ts +32 -0
  331. package/dist/types/member/util.d.ts +2 -0
  332. package/dist/types/members/collection.d.ts +29 -0
  333. package/dist/types/members/index.d.ts +353 -0
  334. package/dist/types/members/request.d.ts +114 -0
  335. package/dist/types/members/types.d.ts +25 -0
  336. package/dist/types/members/util.d.ts +215 -0
  337. package/dist/types/metrics/constants.d.ts +70 -0
  338. package/dist/types/metrics/index.d.ts +45 -0
  339. package/dist/types/multistream/mediaRequestManager.d.ts +120 -0
  340. package/dist/types/multistream/receiveSlot.d.ts +68 -0
  341. package/dist/types/multistream/receiveSlotManager.d.ts +56 -0
  342. package/dist/types/multistream/remoteMedia.d.ts +72 -0
  343. package/dist/types/multistream/remoteMediaGroup.d.ts +49 -0
  344. package/dist/types/multistream/remoteMediaManager.d.ts +301 -0
  345. package/dist/types/multistream/sendSlotManager.d.ts +70 -0
  346. package/dist/types/networkQualityMonitor/index.d.ts +70 -0
  347. package/dist/types/personal-meeting-room/index.d.ts +47 -0
  348. package/dist/types/personal-meeting-room/request.d.ts +14 -0
  349. package/dist/types/personal-meeting-room/util.d.ts +2 -0
  350. package/dist/types/reachability/clusterReachability.d.ts +109 -0
  351. package/dist/types/reachability/index.d.ts +105 -0
  352. package/dist/types/reachability/request.d.ts +39 -0
  353. package/dist/types/reachability/util.d.ts +8 -0
  354. package/dist/types/reactions/constants.d.ts +3 -0
  355. package/dist/types/reactions/reactions.d.ts +4 -0
  356. package/dist/types/reactions/reactions.type.d.ts +52 -0
  357. package/dist/types/reconnection-manager/index.d.ts +136 -0
  358. package/dist/types/recording-controller/enums.d.ts +7 -0
  359. package/dist/types/recording-controller/index.d.ts +207 -0
  360. package/dist/types/recording-controller/util.d.ts +14 -0
  361. package/dist/types/roap/index.d.ts +86 -0
  362. package/dist/types/roap/request.d.ts +39 -0
  363. package/dist/types/roap/turnDiscovery.d.ts +155 -0
  364. package/dist/types/rtcMetrics/constants.d.ts +4 -0
  365. package/dist/types/rtcMetrics/index.d.ts +61 -0
  366. package/dist/types/statsAnalyzer/global.d.ts +36 -0
  367. package/dist/types/statsAnalyzer/index.d.ts +217 -0
  368. package/dist/types/statsAnalyzer/mqaUtil.d.ts +48 -0
  369. package/dist/types/transcription/index.d.ts +64 -0
  370. package/dist/types/webinar/collection.d.ts +16 -0
  371. package/dist/types/webinar/index.d.ts +5 -0
  372. package/dist/webinar/collection.js +44 -0
  373. package/dist/webinar/collection.js.map +1 -0
  374. package/dist/webinar/index.js +69 -0
  375. package/dist/webinar/index.js.map +1 -0
  376. package/internal-README.md +7 -6
  377. package/package.json +30 -21
  378. package/src/annotation/annotation.types.ts +50 -0
  379. package/src/annotation/constants.ts +36 -0
  380. package/src/annotation/index.ts +328 -0
  381. package/src/breakouts/README.md +220 -0
  382. package/src/breakouts/breakout.ts +188 -0
  383. package/src/breakouts/collection.ts +19 -0
  384. package/src/breakouts/edit-lock-error.ts +25 -0
  385. package/src/breakouts/events.ts +56 -0
  386. package/src/breakouts/index.ts +925 -0
  387. package/src/breakouts/request.ts +55 -0
  388. package/src/breakouts/utils.ts +57 -0
  389. package/src/common/{browser-detection.js → browser-detection.ts} +9 -6
  390. package/src/common/collection.ts +9 -7
  391. package/src/common/{config.js → config.ts} +1 -1
  392. package/src/common/errors/{captcha-error.js → captcha-error.ts} +11 -7
  393. package/src/common/errors/{intent-to-join.js → intent-to-join.ts} +12 -7
  394. package/src/common/errors/{join-meeting.js → join-meeting.ts} +17 -8
  395. package/src/common/errors/{media.js → media.ts} +11 -7
  396. package/src/common/errors/no-meeting-info.ts +24 -0
  397. package/src/common/errors/parameter.ts +11 -7
  398. package/src/common/errors/{password-error.js → password-error.ts} +11 -7
  399. package/src/common/errors/{permission.js → permission.ts} +10 -6
  400. package/src/common/errors/reclaim-host-role-errors.ts +134 -0
  401. package/src/common/errors/{reconnection.js → reconnection.ts} +11 -7
  402. package/src/common/errors/{stats.js → stats.ts} +11 -7
  403. package/src/common/errors/{webex-errors.js → webex-errors.ts} +51 -8
  404. package/src/common/errors/{webex-meetings-error.js → webex-meetings-error.ts} +4 -2
  405. package/src/common/events/{events-scope.js → events-scope.ts} +6 -2
  406. package/src/common/events/{events.js → events.ts} +5 -1
  407. package/src/common/events/{trigger-proxy.js → trigger-proxy.ts} +9 -5
  408. package/src/common/events/{util.js → util.ts} +2 -3
  409. package/src/common/logs/{logger-config.js → logger-config.ts} +1 -2
  410. package/src/common/logs/logger-proxy.ts +44 -0
  411. package/src/common/logs/{request.js → request.ts} +26 -9
  412. package/src/common/queue.ts +22 -9
  413. package/src/{config.js → config.ts} +19 -21
  414. package/src/constants.ts +296 -27
  415. package/src/controls-options-manager/constants.ts +5 -0
  416. package/src/controls-options-manager/enums.ts +18 -0
  417. package/src/controls-options-manager/index.ts +278 -0
  418. package/src/controls-options-manager/types.ts +59 -0
  419. package/src/controls-options-manager/util.ts +300 -0
  420. package/src/index.ts +45 -0
  421. package/src/interceptors/index.ts +3 -0
  422. package/src/interceptors/locusRetry.ts +67 -0
  423. package/src/interpretation/README.md +60 -0
  424. package/src/interpretation/collection.ts +19 -0
  425. package/src/interpretation/index.ts +349 -0
  426. package/src/interpretation/siLanguage.ts +18 -0
  427. package/src/locus-info/controlsUtils.ts +222 -0
  428. package/src/locus-info/{embeddedAppsUtils.js → embeddedAppsUtils.ts} +5 -6
  429. package/src/locus-info/{fullState.js → fullState.ts} +16 -12
  430. package/src/locus-info/{hostUtils.js → hostUtils.ts} +9 -8
  431. package/src/locus-info/{index.js → index.ts} +561 -119
  432. package/src/locus-info/{infoUtils.js → infoUtils.ts} +29 -10
  433. package/src/locus-info/{mediaSharesUtils.js → mediaSharesUtils.ts} +97 -17
  434. package/src/locus-info/{parser.js → parser.ts} +303 -104
  435. package/src/locus-info/{selfUtils.js → selfUtils.ts} +199 -68
  436. package/src/media/index.ts +460 -0
  437. package/src/media/properties.ts +283 -0
  438. package/src/media/{util.js → util.ts} +2 -2
  439. package/src/mediaQualityMetrics/config.ts +249 -0
  440. package/src/meeting/in-meeting-actions.ts +199 -3
  441. package/src/meeting/index.ts +8494 -0
  442. package/src/meeting/locusMediaRequest.ts +313 -0
  443. package/src/meeting/muteState.ts +465 -0
  444. package/src/meeting/request.ts +912 -0
  445. package/src/meeting/request.type.ts +13 -0
  446. package/src/meeting/{state.js → state.ts} +50 -35
  447. package/src/meeting/util.ts +799 -0
  448. package/src/meeting/voicea-meeting.ts +122 -0
  449. package/src/meeting-info/{collection.js → collection.ts} +6 -2
  450. package/src/meeting-info/index.ts +210 -0
  451. package/src/meeting-info/meeting-info-v2.ts +423 -0
  452. package/src/meeting-info/{request.js → request.ts} +14 -4
  453. package/src/meeting-info/{util.js → util.ts} +70 -58
  454. package/src/meeting-info/{utilv2.js → utilv2.ts} +99 -82
  455. package/src/meetings/collection.ts +76 -0
  456. package/src/meetings/index.ts +1539 -0
  457. package/src/meetings/meetings.types.ts +12 -0
  458. package/src/meetings/{request.js → request.ts} +34 -25
  459. package/src/meetings/{util.js → util.ts} +133 -38
  460. package/src/member/{index.js → index.ts} +159 -56
  461. package/src/member/types.ts +38 -0
  462. package/src/member/util.ts +397 -0
  463. package/src/members/{collection.js → collection.ts} +10 -2
  464. package/src/members/{index.js → index.ts} +351 -146
  465. package/src/members/request.ts +255 -0
  466. package/src/members/types.ts +29 -0
  467. package/src/members/util.ts +353 -0
  468. package/src/metrics/{constants.js → constants.ts} +17 -6
  469. package/src/metrics/index.ts +73 -0
  470. package/src/multistream/mediaRequestManager.ts +341 -64
  471. package/src/multistream/receiveSlot.ts +69 -26
  472. package/src/multistream/receiveSlotManager.ts +66 -42
  473. package/src/multistream/remoteMedia.ts +40 -5
  474. package/src/multistream/remoteMediaGroup.ts +82 -3
  475. package/src/multistream/remoteMediaManager.ts +401 -81
  476. package/src/multistream/sendSlotManager.ts +199 -0
  477. package/src/networkQualityMonitor/{index.js → index.ts} +41 -29
  478. package/src/personal-meeting-room/{index.js → index.ts} +28 -19
  479. package/src/personal-meeting-room/{request.js → request.ts} +13 -4
  480. package/src/personal-meeting-room/{util.js → util.ts} +4 -4
  481. package/src/reachability/clusterReachability.ts +320 -0
  482. package/src/reachability/index.ts +371 -0
  483. package/src/reachability/request.ts +50 -35
  484. package/src/reachability/util.ts +24 -0
  485. package/src/reactions/constants.ts +4 -0
  486. package/src/reactions/reactions.ts +104 -0
  487. package/src/reactions/reactions.type.ts +62 -0
  488. package/src/reconnection-manager/index.ts +643 -0
  489. package/src/recording-controller/enums.ts +8 -0
  490. package/src/recording-controller/index.ts +332 -0
  491. package/src/recording-controller/util.ts +75 -0
  492. package/src/roap/index.ts +288 -0
  493. package/src/roap/request.ts +153 -0
  494. package/src/roap/turnDiscovery.ts +374 -70
  495. package/src/rtcMetrics/constants.ts +3 -0
  496. package/src/rtcMetrics/index.ts +166 -0
  497. package/src/statsAnalyzer/global.ts +37 -0
  498. package/src/statsAnalyzer/index.ts +1275 -0
  499. package/src/statsAnalyzer/mqaUtil.ts +440 -0
  500. package/src/transcription/{index.js → index.ts} +46 -39
  501. package/src/webinar/collection.ts +31 -0
  502. package/src/webinar/index.ts +62 -0
  503. package/test/integration/spec/converged-space-meetings.js +233 -0
  504. package/test/integration/spec/journey.js +791 -531
  505. package/test/integration/spec/space-meeting.js +391 -204
  506. package/test/integration/spec/transcription.js +7 -8
  507. package/test/unit/spec/annotation/index.ts +418 -0
  508. package/test/unit/spec/breakouts/breakout.ts +238 -0
  509. package/test/unit/spec/breakouts/collection.ts +15 -0
  510. package/test/unit/spec/breakouts/edit-lock-error.ts +30 -0
  511. package/test/unit/spec/breakouts/events.ts +89 -0
  512. package/test/unit/spec/breakouts/index.ts +1793 -0
  513. package/test/unit/spec/breakouts/request.ts +104 -0
  514. package/test/unit/spec/breakouts/utils.js +72 -0
  515. package/test/unit/spec/common/browser-detection.js +9 -28
  516. package/test/unit/spec/common/queue.js +31 -2
  517. package/test/unit/spec/controls-options-manager/index.js +287 -0
  518. package/test/unit/spec/controls-options-manager/util.js +582 -0
  519. package/test/unit/spec/fixture/locus.js +93 -90
  520. package/test/unit/spec/interceptors/locusRetry.ts +131 -0
  521. package/test/unit/spec/interpretation/collection.ts +15 -0
  522. package/test/unit/spec/interpretation/index.ts +625 -0
  523. package/test/unit/spec/interpretation/siLanguage.ts +28 -0
  524. package/test/unit/spec/locus-info/controlsUtils.js +325 -32
  525. package/test/unit/spec/locus-info/embeddedAppsUtils.js +8 -6
  526. package/test/unit/spec/locus-info/index.js +1458 -21
  527. package/test/unit/spec/locus-info/infoUtils.js +71 -40
  528. package/test/unit/spec/locus-info/lib/BasicSeqCmp.json +88 -430
  529. package/test/unit/spec/locus-info/lib/SeqCmp.json +529 -685
  530. package/test/unit/spec/locus-info/mediaSharesUtils.ts +41 -0
  531. package/test/unit/spec/locus-info/parser.js +119 -44
  532. package/test/unit/spec/locus-info/selfConstant.js +120 -103
  533. package/test/unit/spec/locus-info/selfUtils.js +291 -12
  534. package/test/unit/spec/media/index.ts +194 -111
  535. package/test/unit/spec/media/properties.ts +11 -11
  536. package/test/unit/spec/meeting/in-meeting-actions.ts +96 -3
  537. package/test/unit/spec/meeting/index.js +8616 -1921
  538. package/test/unit/spec/meeting/locusMediaRequest.ts +442 -0
  539. package/test/unit/spec/meeting/muteState.js +568 -207
  540. package/test/unit/spec/meeting/request.js +602 -82
  541. package/test/unit/spec/meeting/utils.js +867 -179
  542. package/test/unit/spec/meeting/voicea-meeting.ts +266 -0
  543. package/test/unit/spec/meeting-info/index.js +300 -0
  544. package/test/unit/spec/meeting-info/meetinginfov2.js +631 -78
  545. package/test/unit/spec/meeting-info/request.js +7 -9
  546. package/test/unit/spec/meeting-info/util.js +11 -12
  547. package/test/unit/spec/meeting-info/utilv2.js +131 -74
  548. package/test/unit/spec/meetings/collection.js +27 -1
  549. package/test/unit/spec/meetings/index.js +1826 -374
  550. package/test/unit/spec/meetings/utils.js +243 -14
  551. package/test/unit/spec/member/index.js +61 -7
  552. package/test/unit/spec/member/util.js +526 -26
  553. package/test/unit/spec/members/index.js +536 -55
  554. package/test/unit/spec/members/request.js +228 -40
  555. package/test/unit/spec/members/utils.js +217 -4
  556. package/test/unit/spec/metrics/index.js +13 -68
  557. package/test/unit/spec/multistream/mediaRequestManager.ts +1032 -110
  558. package/test/unit/spec/multistream/receiveSlot.ts +77 -18
  559. package/test/unit/spec/multistream/receiveSlotManager.ts +69 -39
  560. package/test/unit/spec/multistream/remoteMedia.ts +40 -2
  561. package/test/unit/spec/multistream/remoteMediaGroup.ts +350 -5
  562. package/test/unit/spec/multistream/remoteMediaManager.ts +937 -65
  563. package/test/unit/spec/multistream/sendSlotManager.ts +274 -0
  564. package/test/unit/spec/networkQualityMonitor/index.js +24 -18
  565. package/test/unit/spec/personal-meeting-room/personal-meeting-room.js +2 -7
  566. package/test/unit/spec/reachability/clusterReachability.ts +279 -0
  567. package/test/unit/spec/reachability/index.ts +606 -26
  568. package/test/unit/spec/reachability/request.js +68 -0
  569. package/test/unit/spec/reachability/util.ts +40 -0
  570. package/test/unit/spec/reconnection-manager/index.js +222 -34
  571. package/test/unit/spec/recording-controller/index.js +306 -0
  572. package/test/unit/spec/recording-controller/util.js +229 -0
  573. package/test/unit/spec/roap/index.ts +238 -82
  574. package/test/unit/spec/roap/request.ts +255 -0
  575. package/test/unit/spec/roap/turnDiscovery.ts +707 -110
  576. package/test/unit/spec/rtcMetrics/index.ts +122 -0
  577. package/test/unit/spec/stats-analyzer/index.js +1331 -62
  578. package/test/unit/spec/webinar/collection.ts +13 -0
  579. package/test/unit/spec/webinar/index.ts +60 -0
  580. package/test/utils/cmr.js +44 -42
  581. package/test/utils/constants.js +9 -0
  582. package/test/utils/integrationTestUtils.js +46 -0
  583. package/test/utils/testUtils.js +63 -99
  584. package/test/utils/webex-config.js +22 -18
  585. package/test/utils/webex-test-users.js +65 -50
  586. package/tsconfig.json +6 -0
  587. package/dist/media/internal-media-core-wrapper.js +0 -22
  588. package/dist/media/internal-media-core-wrapper.js.map +0 -1
  589. package/dist/meeting/effectsState.js +0 -327
  590. package/dist/meeting/effectsState.js.map +0 -1
  591. package/dist/metrics/config.js +0 -301
  592. package/dist/metrics/config.js.map +0 -1
  593. package/dist/multistream/multistreamMedia.js +0 -116
  594. package/dist/multistream/multistreamMedia.js.map +0 -1
  595. package/dist/peer-connection-manager/util.js +0 -124
  596. package/dist/peer-connection-manager/util.js.map +0 -1
  597. package/src/common/logs/logger-proxy.js +0 -33
  598. package/src/index.js +0 -15
  599. package/src/locus-info/controlsUtils.js +0 -102
  600. package/src/media/index.js +0 -459
  601. package/src/media/internal-media-core-wrapper.ts +0 -9
  602. package/src/media/properties.js +0 -289
  603. package/src/mediaQualityMetrics/config.js +0 -382
  604. package/src/meeting/effectsState.js +0 -205
  605. package/src/meeting/index.js +0 -6284
  606. package/src/meeting/muteState.js +0 -318
  607. package/src/meeting/request.js +0 -684
  608. package/src/meeting/util.js +0 -506
  609. package/src/meeting-info/index.js +0 -131
  610. package/src/meeting-info/meeting-info-v2.js +0 -255
  611. package/src/meetings/collection.js +0 -40
  612. package/src/meetings/index.js +0 -1015
  613. package/src/member/util.js +0 -254
  614. package/src/members/request.js +0 -131
  615. package/src/members/util.js +0 -258
  616. package/src/metrics/config.js +0 -324
  617. package/src/metrics/index.js +0 -530
  618. package/src/multistream/multistreamMedia.ts +0 -92
  619. package/src/peer-connection-manager/util.ts +0 -117
  620. package/src/reachability/index.js +0 -464
  621. package/src/reconnection-manager/index.js +0 -519
  622. package/src/roap/index.js +0 -220
  623. package/src/roap/request.js +0 -127
  624. package/src/statsAnalyzer/global.js +0 -133
  625. package/src/statsAnalyzer/index.js +0 -1006
  626. package/src/statsAnalyzer/mqaUtil.js +0 -173
  627. package/test/unit/spec/meeting/effectsState.js +0 -291
  628. package/test/unit/spec/peerconnection-manager/utils.test-fixtures.ts +0 -389
  629. /package/src/common/errors/{reconnection-in-progress.js → reconnection-in-progress.ts} +0 -0
@@ -0,0 +1,73 @@
1
+ /*!
2
+ * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.
3
+ */
4
+
5
+ /**
6
+ * @description Metrics handles all the call metrics events
7
+ * @export
8
+ * @class Metrics
9
+ */
10
+ class Metrics {
11
+ static instance: Metrics;
12
+ webex: any;
13
+
14
+ /**
15
+ * Create Metrics Object
16
+ * @constructor
17
+ * @public
18
+ * @memberof Meetings
19
+ */
20
+ constructor() {
21
+ if (!Metrics.instance) {
22
+ /**
23
+ * @instance
24
+ * @type {Metrics}
25
+ * @private
26
+ * @memberof Metrics
27
+ */
28
+ Metrics.instance = this;
29
+ }
30
+
31
+ // eslint-disable-next-line no-constructor-return
32
+ return Metrics.instance;
33
+ }
34
+
35
+ /**
36
+ * Initializes the Metrics singleton with a meeting Collection.
37
+ *
38
+ * @param {Object} webex webex SDK object
39
+ *
40
+ * @returns {void}
41
+ */
42
+ initialSetup(webex: object) {
43
+ this.webex = webex;
44
+ }
45
+
46
+ /**
47
+ * Uploads given metric to the Metrics service as an Behavioral metric.
48
+ * Metadata about the environment such as browser, OS, SDK and their versions
49
+ * are automatically added when the metric is sent.
50
+ *
51
+ * The Metrics service will send an Behavioral metric to InfluxDB for
52
+ * aggregation.
53
+ * See https://confluence-eng-gpk2.cisco.com/conf/display/WBXT/Getting+started+with+Metrics+Service.
54
+ *
55
+ * @param {string} metricName Name of the metric (measurement) to send
56
+ * @param {Object} metricFields Key-valye pairs of data or values about this metric
57
+ * @param {Object} metricTags Key-value pairs of metric metadata
58
+ *
59
+ * @returns {void}
60
+ */
61
+ sendBehavioralMetric(metricName: string, metricFields: object = {}, metricTags: object = {}) {
62
+ this.webex.internal.metrics.submitClientMetrics(metricName, {
63
+ type: this.webex.config.metrics.type,
64
+ fields: metricFields,
65
+ tags: metricTags,
66
+ });
67
+ }
68
+ }
69
+
70
+ // Export Metrics singleton ---------------------------------------------------
71
+ const instance = new Metrics();
72
+
73
+ export default instance;
@@ -1,9 +1,21 @@
1
1
  /* eslint-disable require-jsdoc */
2
- import {MediaConnection as MC} from '@webex/internal-media-core';
3
-
2
+ import {
3
+ StreamRequest,
4
+ Policy,
5
+ ActiveSpeakerInfo,
6
+ ReceiverSelectedInfo,
7
+ CodecInfo as WcmeCodecInfo,
8
+ H264Codec,
9
+ getRecommendedMaxBitrateForFrameSize,
10
+ RecommendedOpusBitrates,
11
+ } from '@webex/internal-media-core';
12
+ import {cloneDeepWith, debounce, isEmpty} from 'lodash';
13
+
14
+ import {NamedMediaGroup} from '@webex/json-multistream';
4
15
  import LoggerProxy from '../common/logs/logger-proxy';
5
16
 
6
- import {ReceiveSlot, ReceiveSlotId} from './receiveSlot';
17
+ import {ReceiveSlot, ReceiveSlotEvents} from './receiveSlot';
18
+ import {getMaxFs} from './remoteMedia';
7
19
 
8
20
  export interface ActiveSpeakerPolicyInfo {
9
21
  policy: 'active-speaker';
@@ -11,6 +23,7 @@ export interface ActiveSpeakerPolicyInfo {
11
23
  crossPriorityDuplication: boolean;
12
24
  crossPolicyDuplication: boolean;
13
25
  preferLiveVideo: boolean;
26
+ namedMediaGroups?: NamedMediaGroup[];
14
27
  }
15
28
 
16
29
  export interface ReceiverSelectedPolicyInfo {
@@ -35,6 +48,8 @@ export interface MediaRequest {
35
48
  policyInfo: PolicyInfo;
36
49
  receiveSlots: Array<ReceiveSlot>;
37
50
  codecInfo?: CodecInfo;
51
+ preferredMaxFs?: number;
52
+ handleMaxFs?: ({maxFs}: {maxFs: number}) => void;
38
53
  }
39
54
 
40
55
  export type MediaRequestId = string;
@@ -47,91 +62,327 @@ const CODEC_DEFAULTS = {
47
62
  },
48
63
  };
49
64
 
50
- type SendMediaRequestsCallback = (mediaRequests: MC.MediaRequest[]) => void;
65
+ const DEBOUNCED_SOURCE_UPDATE_TIME = 1000;
66
+
67
+ type DegradationPreferences = {
68
+ maxMacroblocksLimit: number;
69
+ };
70
+
71
+ type SendMediaRequestsCallback = (streamRequests: StreamRequest[]) => void;
72
+ type Kind = 'audio' | 'video';
73
+
74
+ type Options = {
75
+ degradationPreferences: DegradationPreferences;
76
+ kind: Kind;
77
+ trimRequestsToNumOfSources: boolean; // if enabled, AS speaker requests will be trimmed based on the calls to setNumCurrentSources()
78
+ };
79
+
80
+ type ClientRequestsMap = {[key: MediaRequestId]: MediaRequest};
51
81
 
52
82
  export class MediaRequestManager {
53
83
  private sendMediaRequestsCallback: SendMediaRequestsCallback;
54
84
 
55
- private counter;
85
+ private kind: Kind;
86
+
87
+ private counter: number;
56
88
 
57
- private clientRequests: {[key: MediaRequestId]: MediaRequest};
89
+ private clientRequests: ClientRequestsMap;
58
90
 
59
- private slotsActiveInLastMediaRequest: {[key: ReceiveSlotId]: ReceiveSlot};
91
+ private degradationPreferences: DegradationPreferences;
60
92
 
61
- constructor(sendMediaRequestsCallback: SendMediaRequestsCallback) {
93
+ private sourceUpdateListener: () => void;
94
+
95
+ private debouncedSourceUpdateListener: () => void;
96
+
97
+ private previousStreamRequests: Array<StreamRequest> = [];
98
+
99
+ private trimRequestsToNumOfSources: boolean;
100
+ private numTotalSources: number;
101
+ private numLiveSources: number;
102
+
103
+ constructor(sendMediaRequestsCallback: SendMediaRequestsCallback, options: Options) {
62
104
  this.sendMediaRequestsCallback = sendMediaRequestsCallback;
63
105
  this.counter = 0;
106
+ this.numLiveSources = 0;
107
+ this.numTotalSources = 0;
64
108
  this.clientRequests = {};
65
- this.slotsActiveInLastMediaRequest = {};
109
+ this.degradationPreferences = options.degradationPreferences;
110
+ this.kind = options.kind;
111
+ this.trimRequestsToNumOfSources = options.trimRequestsToNumOfSources;
112
+ this.sourceUpdateListener = this.commit.bind(this);
113
+ this.debouncedSourceUpdateListener = debounce(
114
+ this.sourceUpdateListener,
115
+ DEBOUNCED_SOURCE_UPDATE_TIME
116
+ );
66
117
  }
67
118
 
68
- private resetInactiveReceiveSlots() {
69
- const activeSlots: {[key: ReceiveSlotId]: ReceiveSlot} = {};
70
-
71
- // create a map of all currently used slot ids
72
- Object.values(this.clientRequests).forEach((request) =>
73
- request.receiveSlots.forEach((slot) => {
74
- activeSlots[slot.id] = slot;
75
- })
76
- );
119
+ public setDegradationPreferences(degradationPreferences: DegradationPreferences) {
120
+ this.degradationPreferences = degradationPreferences;
121
+ this.sendRequests(); // re-send requests after preferences are set
122
+ }
77
123
 
78
- // when we stop using some receive slots and they are not included in the new media request,
79
- // we will never get a 'no source' notification for them, so we reset their state,
80
- // so that the client doesn't try to display their video anymore
81
- for (const [slotId, slot] of Object.entries(this.slotsActiveInLastMediaRequest)) {
82
- if (!(slotId in activeSlots)) {
83
- LoggerProxy.logger.info(
84
- `multistream:mediaRequestManager --> resetting sourceState to "no source" for slot ${slot.id}`
124
+ private getDegradedClientRequests(clientRequests: ClientRequestsMap) {
125
+ const maxFsLimits = [
126
+ getMaxFs('best'),
127
+ getMaxFs('large'),
128
+ getMaxFs('medium'),
129
+ getMaxFs('small'),
130
+ getMaxFs('very small'),
131
+ getMaxFs('thumbnail'),
132
+ ];
133
+
134
+ // reduce max-fs until total macroblocks is below limit
135
+ for (let i = 0; i < maxFsLimits.length; i += 1) {
136
+ let totalMacroblocksRequested = 0;
137
+ Object.values(clientRequests).forEach((mr) => {
138
+ if (mr.codecInfo) {
139
+ mr.codecInfo.maxFs = Math.min(
140
+ mr.preferredMaxFs || CODEC_DEFAULTS.h264.maxFs,
141
+ mr.codecInfo.maxFs || CODEC_DEFAULTS.h264.maxFs,
142
+ maxFsLimits[i]
143
+ );
144
+ // we only consider sources with "live" state
145
+ const slotsWithLiveSource = mr.receiveSlots.filter((rs) => rs.sourceState === 'live');
146
+ totalMacroblocksRequested += mr.codecInfo.maxFs * slotsWithLiveSource.length;
147
+ }
148
+ });
149
+ if (totalMacroblocksRequested <= this.degradationPreferences.maxMacroblocksLimit) {
150
+ if (i !== 0) {
151
+ LoggerProxy.logger.warn(
152
+ `multistream:mediaRequestManager --> too many streams with high max-fs, frame size will be limited to ${maxFsLimits[i]}`
153
+ );
154
+ }
155
+ break;
156
+ } else if (i === maxFsLimits.length - 1) {
157
+ LoggerProxy.logger.warn(
158
+ `multistream:mediaRequestManager --> even with frame size limited to ${maxFsLimits[i]} you are still requesting too many streams, consider reducing the number of requests`
85
159
  );
86
- slot.resetSourceState();
87
160
  }
88
161
  }
162
+ }
89
163
 
90
- this.slotsActiveInLastMediaRequest = activeSlots;
164
+ /**
165
+ * Returns true if two stream requests are the same, false otherwise.
166
+ *
167
+ * @param {StreamRequest} streamRequestA - Stream request A for comparison.
168
+ * @param {StreamRequest} streamRequestB - Stream request B for comparison.
169
+ * @returns {boolean} - Whether they are equal.
170
+ */
171
+ // eslint-disable-next-line class-methods-use-this
172
+ public isEqual(streamRequestA: StreamRequest, streamRequestB: StreamRequest) {
173
+ return (
174
+ JSON.stringify(streamRequestA._toJmpStreamRequest()) ===
175
+ JSON.stringify(streamRequestB._toJmpStreamRequest())
176
+ );
91
177
  }
92
178
 
93
- private sendRequests() {
94
- const wcmeMediaRequests: MC.MediaRequest[] = [];
179
+ /**
180
+ * Compares new stream requests to previous ones and determines
181
+ * if they are the same.
182
+ *
183
+ * @param {StreamRequest[]} newRequests - Array with new requests.
184
+ * @returns {boolean} - True if they are equal, false otherwise.
185
+ */
186
+ private checkIsNewRequestsEqualToPrev(newRequests: StreamRequest[]) {
187
+ return (
188
+ !isEmpty(this.previousStreamRequests) &&
189
+ this.previousStreamRequests.length === newRequests.length &&
190
+ this.previousStreamRequests.every((req, idx) => this.isEqual(req, newRequests[idx]))
191
+ );
192
+ }
193
+
194
+ /**
195
+ * Returns the maxPayloadBitsPerSecond per Stream
196
+ *
197
+ * If MediaRequestManager kind is "audio", a constant bitrate will be returned.
198
+ * If MediaRequestManager kind is "video", the bitrate will be calculated based
199
+ * on maxFs (default h264 maxFs as fallback if maxFs is not defined)
200
+ *
201
+ * @param {MediaRequest} mediaRequest - mediaRequest to take data from
202
+ * @returns {number} maxPayloadBitsPerSecond
203
+ */
204
+ private getMaxPayloadBitsPerSecond(mediaRequest: MediaRequest): number {
205
+ if (this.kind === 'audio') {
206
+ // return mono_music bitrate default if the kind of mediarequest manager is audio:
207
+ return RecommendedOpusBitrates.FB_MONO_MUSIC;
208
+ }
209
+
210
+ return getRecommendedMaxBitrateForFrameSize(
211
+ mediaRequest.codecInfo.maxFs || CODEC_DEFAULTS.h264.maxFs
212
+ );
213
+ }
214
+
215
+ /**
216
+ * Returns the max Macro Blocks per second (maxMbps) per H264 Stream
217
+ *
218
+ * The maxMbps will be calculated based on maxFs and maxFps
219
+ * (default h264 maxFps as fallback if maxFps is not defined)
220
+ *
221
+ * @param {MediaRequest} mediaRequest - mediaRequest to take data from
222
+ * @returns {number} maxMbps
223
+ */
224
+ // eslint-disable-next-line class-methods-use-this
225
+ private getH264MaxMbps(mediaRequest: MediaRequest): number {
226
+ // fallback for maxFps (not needed for maxFs, since there is a fallback already in getDegradedClientRequests)
227
+ const maxFps = mediaRequest.codecInfo.maxFps || CODEC_DEFAULTS.h264.maxFps;
228
+
229
+ // divided by 100 since maxFps is 3000 (for 30 frames per seconds)
230
+ return (mediaRequest.codecInfo.maxFs * maxFps) / 100;
231
+ }
232
+
233
+ /**
234
+ * Clears the previous stream requests.
235
+ *
236
+ * @returns {void}
237
+ */
238
+ public clearPreviousRequests(): void {
239
+ this.previousStreamRequests = [];
240
+ }
95
241
 
96
- // todo: check how many streams we're asking for and what resolution and introduce some limits (spark-377701)
97
- const maxPayloadBitsPerSecond = 10 * 1000 * 1000;
242
+ /** Modifies the passed in clientRequests and makes sure that in total they don't ask
243
+ * for more streams than there are available.
244
+ *
245
+ * @param {Object} clientRequests
246
+ * @returns {void}
247
+ */
248
+ private trimRequests(clientRequests: ClientRequestsMap) {
249
+ const preferLiveVideo = this.getPreferLiveVideo();
250
+
251
+ if (!this.trimRequestsToNumOfSources) {
252
+ return;
253
+ }
254
+
255
+ // preferLiveVideo being undefined means that there are no active-speaker requests so we don't need to do any trimming
256
+ if (preferLiveVideo === undefined) {
257
+ return;
258
+ }
259
+
260
+ let numStreamsAvailable = preferLiveVideo ? this.numLiveSources : this.numTotalSources;
261
+
262
+ Object.values(clientRequests)
263
+ .sort((a, b) => {
264
+ // we have to count how many streams we're asking for
265
+ // and should not ask for more than numStreamsAvailable in total,
266
+ // so we might need to trim active-speaker requests and first ones to trim should be
267
+ // the ones with lowest priority
268
+
269
+ // receiver-selected requests have priority over active-speakers
270
+ if (a.policyInfo.policy === 'receiver-selected') {
271
+ return -1;
272
+ }
273
+ if (b.policyInfo.policy === 'receiver-selected') {
274
+ return 1;
275
+ }
276
+
277
+ // and active-speakers are sorted by descending priority
278
+ return b.policyInfo.priority - a.policyInfo.priority;
279
+ })
280
+ .forEach((request) => {
281
+ // we only trim active-speaker requests
282
+ if (request.policyInfo.policy === 'active-speaker') {
283
+ const trimmedCount = Math.min(numStreamsAvailable, request.receiveSlots.length);
284
+
285
+ request.receiveSlots.length = trimmedCount;
286
+
287
+ numStreamsAvailable -= trimmedCount;
288
+ } else {
289
+ numStreamsAvailable -= request.receiveSlots.length;
290
+ }
291
+
292
+ if (numStreamsAvailable < 0) {
293
+ numStreamsAvailable = 0;
294
+ }
295
+ });
296
+ }
297
+
298
+ private getPreferLiveVideo(): boolean | undefined {
299
+ let preferLiveVideo;
98
300
 
99
- // map all the client media requests to wcme media requests
100
301
  Object.values(this.clientRequests).forEach((mr) => {
101
- wcmeMediaRequests.push(
102
- new MC.MediaRequest(
103
- mr.policyInfo.policy === 'active-speaker'
104
- ? MC.Policy.ActiveSpeaker
105
- : MC.Policy.ReceiverSelected,
106
- mr.policyInfo.policy === 'active-speaker'
107
- ? new MC.ActiveSpeakerInfo(
108
- mr.policyInfo.priority,
109
- mr.policyInfo.crossPriorityDuplication,
110
- mr.policyInfo.crossPolicyDuplication,
111
- mr.policyInfo.preferLiveVideo
112
- )
113
- : new MC.ReceiverSelectedInfo(mr.policyInfo.csi),
114
- mr.receiveSlots.map((receiveSlot) => receiveSlot.wcmeReceiveSlot),
115
- maxPayloadBitsPerSecond,
116
- mr.codecInfo && [
117
- new MC.CodecInfo(
118
- 0x80,
119
- new MC.H264Codec(
120
- mr.codecInfo.maxFs || CODEC_DEFAULTS.h264.maxFs,
121
- mr.codecInfo.maxFps || CODEC_DEFAULTS.h264.maxFps,
122
- mr.codecInfo.maxMbps || CODEC_DEFAULTS.h264.maxMbps,
123
- mr.codecInfo.maxWidth,
124
- mr.codecInfo.maxHeight
125
- )
126
- ),
127
- ]
128
- )
129
- );
302
+ if (mr.policyInfo.policy === 'active-speaker') {
303
+ // take the value from first encountered active speaker request
304
+ if (preferLiveVideo === undefined) {
305
+ preferLiveVideo = mr.policyInfo.preferLiveVideo;
306
+ }
307
+
308
+ if (mr.policyInfo.preferLiveVideo !== preferLiveVideo) {
309
+ throw new Error(
310
+ 'a mix of active-speaker groups with different values for preferLiveVideo is not supported'
311
+ );
312
+ }
313
+ }
130
314
  });
131
315
 
132
- this.sendMediaRequestsCallback(wcmeMediaRequests);
316
+ return preferLiveVideo;
317
+ }
318
+
319
+ private cloneClientRequests(): ClientRequestsMap {
320
+ // we clone the client requests but without cloning the ReceiveSlots that they reference
321
+ return cloneDeepWith(this.clientRequests, (value, key) => {
322
+ if (key === 'receiveSlots') {
323
+ return [...value];
324
+ }
133
325
 
134
- this.resetInactiveReceiveSlots();
326
+ return undefined;
327
+ });
328
+ }
329
+
330
+ private sendRequests() {
331
+ const streamRequests: StreamRequest[] = [];
332
+
333
+ // clone the requests so that any modifications we do to them don't affect the original ones
334
+ const clientRequests = this.cloneClientRequests();
335
+
336
+ this.trimRequests(clientRequests);
337
+ this.getDegradedClientRequests(clientRequests);
338
+
339
+ // map all the client media requests to wcme stream requests
340
+ Object.values(clientRequests).forEach((mr) => {
341
+ if (mr.receiveSlots.length > 0) {
342
+ streamRequests.push(
343
+ new StreamRequest(
344
+ mr.policyInfo.policy === 'active-speaker'
345
+ ? Policy.ActiveSpeaker
346
+ : Policy.ReceiverSelected,
347
+ mr.policyInfo.policy === 'active-speaker'
348
+ ? new ActiveSpeakerInfo(
349
+ mr.policyInfo.priority,
350
+ mr.policyInfo.crossPriorityDuplication,
351
+ mr.policyInfo.crossPolicyDuplication,
352
+ mr.policyInfo.preferLiveVideo,
353
+ mr.policyInfo.namedMediaGroups
354
+ )
355
+ : new ReceiverSelectedInfo(mr.policyInfo.csi),
356
+ mr.receiveSlots.map((receiveSlot) => receiveSlot.wcmeReceiveSlot),
357
+ this.getMaxPayloadBitsPerSecond(mr),
358
+ mr.codecInfo && [
359
+ new WcmeCodecInfo(
360
+ 0x80,
361
+ new H264Codec(
362
+ mr.codecInfo.maxFs,
363
+ mr.codecInfo.maxFps || CODEC_DEFAULTS.h264.maxFps,
364
+ this.getH264MaxMbps(mr),
365
+ mr.codecInfo.maxWidth,
366
+ mr.codecInfo.maxHeight
367
+ )
368
+ ),
369
+ ]
370
+ )
371
+ );
372
+ }
373
+ });
374
+
375
+ //! IMPORTANT: this is only a temporary fix. This will soon be done in the jmp layer (@webex/json-multistream)
376
+ // https://jira-eng-gpk2.cisco.com/jira/browse/WEBEX-326713
377
+ if (!this.checkIsNewRequestsEqualToPrev(streamRequests)) {
378
+ this.sendMediaRequestsCallback(streamRequests);
379
+ this.previousStreamRequests = streamRequests;
380
+ LoggerProxy.logger.info(`multistream:sendRequests --> media requests sent. `);
381
+ } else {
382
+ LoggerProxy.logger.info(
383
+ `multistream:sendRequests --> detected duplicate WCME requests, skipping them... `
384
+ );
385
+ }
135
386
  }
136
387
 
137
388
  public addRequest(mediaRequest: MediaRequest, commit = true): MediaRequestId {
@@ -140,6 +391,17 @@ export class MediaRequestManager {
140
391
 
141
392
  this.clientRequests[newId] = mediaRequest;
142
393
 
394
+ const eventHandler = ({maxFs}) => {
395
+ mediaRequest.preferredMaxFs = maxFs;
396
+ this.debouncedSourceUpdateListener();
397
+ };
398
+ mediaRequest.handleMaxFs = eventHandler;
399
+
400
+ mediaRequest.receiveSlots.forEach((rs) => {
401
+ rs.on(ReceiveSlotEvents.SourceUpdate, this.sourceUpdateListener);
402
+ rs.on(ReceiveSlotEvents.MaxFsUpdate, mediaRequest.handleMaxFs);
403
+ });
404
+
143
405
  if (commit) {
144
406
  this.commit();
145
407
  }
@@ -148,6 +410,13 @@ export class MediaRequestManager {
148
410
  }
149
411
 
150
412
  public cancelRequest(requestId: MediaRequestId, commit = true) {
413
+ const mediaRequest = this.clientRequests[requestId];
414
+
415
+ mediaRequest?.receiveSlots.forEach((rs) => {
416
+ rs.off(ReceiveSlotEvents.SourceUpdate, this.sourceUpdateListener);
417
+ rs.off(ReceiveSlotEvents.MaxFsUpdate, mediaRequest.handleMaxFs);
418
+ });
419
+
151
420
  delete this.clientRequests[requestId];
152
421
 
153
422
  if (commit) {
@@ -161,6 +430,14 @@ export class MediaRequestManager {
161
430
 
162
431
  public reset() {
163
432
  this.clientRequests = {};
164
- this.slotsActiveInLastMediaRequest = {};
433
+ this.numTotalSources = 0;
434
+ this.numLiveSources = 0;
435
+ }
436
+
437
+ public setNumCurrentSources(numTotalSources: number, numLiveSources: number) {
438
+ this.numTotalSources = numTotalSources;
439
+ this.numLiveSources = numLiveSources;
440
+
441
+ this.sendRequests();
165
442
  }
166
443
  }